A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

add icons search

razeeman (Feb 10, 2024, 6:06 PM +0300) 56095fd9 448dc248

+244 -21
+1
core/src/main/res/values-ar/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">اﻷيقونة</string> 129 129 <string name="change_record_type_icon_text_hint">نص</string> 130 130 <string name="change_record_type_icon_emoji_hint">إيموجي</string> 131 + <string name="change_record_type_icon_search_hint">بحث (باللغة الإنجليزية)</string> 131 132 <string name="change_record_type_save">حفظ</string> 132 133 <string name="change_record_message_choose_name">اختيار اسم</string> 133 134 <string name="change_record_type_categories_empty">لا توجد تصنيفات مضافة</string>
+1
core/src/main/res/values-ca/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Icona</string> 129 129 <string name="change_record_type_icon_text_hint">Text</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoticona</string> 131 + <string name="change_record_type_icon_search_hint">Cerca (en anglès)</string> 131 132 <string name="change_record_type_save">Desa</string> 132 133 <string name="change_record_message_choose_name">Trieu un nom</string> 133 134 <string name="change_record_type_categories_empty">No s\'han afegit categories</string>
+1
core/src/main/res/values-de/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Symbol</string> 129 129 <string name="change_record_type_icon_text_hint">Text</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Suche (auf Englisch)</string> 131 132 <string name="change_record_type_save">Speichern</string> 132 133 <string name="change_record_message_choose_name">Einen Namen wählen</string> 133 134 <string name="change_record_type_categories_empty">Keine Kategorien hinzugefügt</string>
+1
core/src/main/res/values-es/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Icono</string> 129 129 <string name="change_record_type_icon_text_hint">Texto</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Buscar (en inglés)</string> 131 132 <string name="change_record_type_save">Guardar</string> 132 133 <string name="change_record_message_choose_name">Escoja un nombre</string> 133 134 <string name="change_record_type_categories_empty">No se añadieron categorías</string>
+1
core/src/main/res/values-fa/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">آیکون</string> 129 129 <string name="change_record_type_icon_text_hint">متن</string> 130 130 <string name="change_record_type_icon_emoji_hint">ایموجی</string> 131 + <string name="change_record_type_icon_search_hint">جستجو (به انگلیسی)</string> 131 132 <string name="change_record_type_save">ذخیره</string> 132 133 <string name="change_record_message_choose_name">نامی انتخاب کنید</string> 133 134 <string name="change_record_type_categories_empty">دسته بندی ای اضافه نشد</string>
+1
core/src/main/res/values-fr/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Icône</string> 129 129 <string name="change_record_type_icon_text_hint">Texte</string> 130 130 <string name="change_record_type_icon_emoji_hint">Émoji</string> 131 + <string name="change_record_type_icon_search_hint">Rechercher (en anglais)</string> 131 132 <string name="change_record_type_save">Sauvegarder</string> 132 133 <string name="change_record_message_choose_name">Choisissez un nom</string> 133 134 <string name="change_record_type_categories_empty">Aucune catégorie ajoutée</string>
+1
core/src/main/res/values-hi/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">चित्र</string> 129 129 <string name="change_record_type_icon_text_hint">मूलपाठ</string> 130 130 <string name="change_record_type_icon_emoji_hint">इमोजी</string> 131 + <string name="change_record_type_icon_search_hint">खोजें (अंग्रेजी में)</string> 131 132 <string name="change_record_type_save">बचाना</string> 132 133 <string name="change_record_message_choose_name">एक नाम चुनो</string> 133 134 <string name="change_record_type_categories_empty">कोई श्रेणियां नहीं जोड़ी</string>
+1
core/src/main/res/values-in/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Ikon</string> 129 129 <string name="change_record_type_icon_text_hint">Teks</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Pencarian (dalam bahasa Inggris)</string> 131 132 <string name="change_record_type_save">Simpan</string> 132 133 <string name="change_record_message_choose_name">Pilih sebuah nama</string> 133 134 <string name="change_record_type_categories_empty">Tidak ada kategori yang ditambahkan</string>
+1
core/src/main/res/values-it/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Icona</string> 129 129 <string name="change_record_type_icon_text_hint">Testo</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Cerca (in inglese)</string> 131 132 <string name="change_record_type_save">Salva</string> 132 133 <string name="change_record_message_choose_name">Scegli un nome</string> 133 134 <string name="change_record_type_categories_empty">Nessuna categoria aggiunta</string>
+1
core/src/main/res/values-ja/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">アイコン</string> 129 129 <string name="change_record_type_icon_text_hint">文章</string> 130 130 <string name="change_record_type_icon_emoji_hint">絵文字</string> 131 + <string name="change_record_type_icon_search_hint">検索(英語)</string> 131 132 <string name="change_record_type_save">保存</string> 132 133 <string name="change_record_message_choose_name">名称を入力してください</string> 133 134 <string name="change_record_type_categories_empty">カテゴリが追加されていません</string>
+1
core/src/main/res/values-ko/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">아이콘</string> 129 129 <string name="change_record_type_icon_text_hint">텍스트</string> 130 130 <string name="change_record_type_icon_emoji_hint">이모지</string> 131 + <string name="change_record_type_icon_search_hint">검색(영문)</string> 131 132 <string name="change_record_type_save">저장</string> 132 133 <string name="change_record_message_choose_name">이름을 입력하세요</string> 133 134 <string name="change_record_type_categories_empty">카테고리 추가되지 않음</string>
+1
core/src/main/res/values-nl/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Icoon</string> 129 129 <string name="change_record_type_icon_text_hint">Tekst</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Zoeken (in het Engels)</string> 131 132 <string name="change_record_type_save">Opslaan</string> 132 133 <string name="change_record_message_choose_name">Kies een naam</string> 133 134 <string name="change_record_type_categories_empty">Geen categorieën toegevoegd</string>
+1
core/src/main/res/values-pt/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Ícone</string> 129 129 <string name="change_record_type_icon_text_hint">Texto</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Pesquisa (em inglês)</string> 131 132 <string name="change_record_type_save">Salvar</string> 132 133 <string name="change_record_message_choose_name">Escolha um nome</string> 133 134 <string name="change_record_type_categories_empty">Nenhuma categoria adicionada</string>
+1
core/src/main/res/values-ru/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Иконка</string> 129 129 <string name="change_record_type_icon_text_hint">Текст</string> 130 130 <string name="change_record_type_icon_emoji_hint">Эмодзи</string> 131 + <string name="change_record_type_icon_search_hint">Поиск (на английском)</string> 131 132 <string name="change_record_type_save">Сохранить</string> 132 133 <string name="change_record_message_choose_name">Выберите имя</string> 133 134 <string name="change_record_type_categories_empty">Категории не добавлены</string>
+1
core/src/main/res/values-sv/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Ikon</string> 129 129 <string name="change_record_type_icon_text_hint">Text</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Sök (på engelska)</string> 131 132 <string name="change_record_type_save">Spara</string> 132 133 <string name="change_record_message_choose_name">Ange ett namn</string> 133 134 <string name="change_record_type_categories_empty">Inga kategorier har lagts till</string>
+1
core/src/main/res/values-tr/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Simge</string> 129 129 <string name="change_record_type_icon_text_hint">Metin</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Arama (İngilizce)</string> 131 132 <string name="change_record_type_save">Kaydet</string> 132 133 <string name="change_record_message_choose_name">İsim seçin</string> 133 134 <string name="change_record_type_categories_empty">Kategori eklenmedi</string>
+1
core/src/main/res/values-uk/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Іконка</string> 129 129 <string name="change_record_type_icon_text_hint">Текст</string> 130 130 <string name="change_record_type_icon_emoji_hint">Смайл</string> 131 + <string name="change_record_type_icon_search_hint">Пошук (англійською)</string> 131 132 <string name="change_record_type_save">Зберегти</string> 132 133 <string name="change_record_message_choose_name">Оберіть ім\'я</string> 133 134 <string name="change_record_type_categories_empty">Категорії не додано</string>
+1
core/src/main/res/values-vi/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Biểu tượng</string> 129 129 <string name="change_record_type_icon_text_hint">Văn bản</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Tìm kiếm (bằng tiếng Anh)</string> 131 132 <string name="change_record_type_save">Lưu</string> 132 133 <string name="change_record_message_choose_name">Chọn một tên</string> 133 134 <string name="change_record_type_categories_empty">Chưa thêm danh mục nào</string>
+1
core/src/main/res/values-zh-rTW/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">圖示</string> 129 129 <string name="change_record_type_icon_text_hint">文字</string> 130 130 <string name="change_record_type_icon_emoji_hint">表情符號</string> 131 + <string name="change_record_type_icon_search_hint">搜尋(英文)</string> 131 132 <string name="change_record_type_save">儲存</string> 132 133 <string name="change_record_message_choose_name">選擇名稱</string> 133 134 <string name="change_record_type_categories_empty">沒有新增分類</string>
+1
core/src/main/res/values-zh/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">图标</string> 129 129 <string name="change_record_type_icon_text_hint">文本</string> 130 130 <string name="change_record_type_icon_emoji_hint">表情符号</string> 131 + <string name="change_record_type_icon_search_hint">搜索(英文)</string> 131 132 <string name="change_record_type_save">保存</string> 132 133 <string name="change_record_message_choose_name">请填写名称</string> 133 134 <string name="change_record_type_categories_empty">未添加任何类别</string>
+1
core/src/main/res/values/strings.xml
··· 128 128 <string name="change_record_type_icon_image_hint">Icon</string> 129 129 <string name="change_record_type_icon_text_hint">Text</string> 130 130 <string name="change_record_type_icon_emoji_hint">Emoji</string> 131 + <string name="change_record_type_icon_search_hint">Search (in English)</string> 131 132 <string name="change_record_type_save">Save</string> 132 133 <string name="change_record_message_choose_name">Choose a name</string> 133 134 <string name="change_record_type_categories_empty">No categories added</string>
+1 -1
features/feature_change_record/src/main/res/layout/change_record_core_layout.xml
··· 441 441 android:visibility="gone" 442 442 app:layout_constraintBottom_toTopOf="@id/btnChangeRecordSave" 443 443 app:layout_constraintTop_toBottomOf="@id/barrierChangeRecord" 444 - tools:visibility="visible"> 444 + tools:visibility="gone"> 445 445 446 446 <androidx.appcompat.widget.LinearLayoutCompat 447 447 android:layout_width="match_parent"
+5 -1
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/interactor/ChangeRecordTypeViewDataInteractor.kt
··· 10 10 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 11 11 import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerViewData 12 12 import com.example.util.simpletimetracker.feature_change_record_type.mapper.ChangeRecordTypeMapper 13 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData.IconImageState 13 14 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconStateViewData 14 15 import kotlinx.coroutines.Dispatchers 15 16 import kotlinx.coroutines.withContext ··· 77 78 suspend fun getIconsViewData( 78 79 newColor: AppColor, 79 80 iconType: IconType, 81 + iconImageState: IconImageState, 82 + iconSearch: String, 80 83 ): ChangeRecordTypeIconStateViewData = withContext(Dispatchers.IO) { 81 84 val isDarkTheme = prefsInteractor.getDarkMode() 82 85 83 86 when (iconType) { 84 87 IconType.IMAGE -> { 88 + val search = if (iconImageState == IconImageState.Search) iconSearch else "" 85 89 ChangeRecordTypeIconStateViewData.Icons( 86 - mapper.mapIconImageData(newColor, isDarkTheme) 90 + mapper.mapIconImageData(newColor, search, isDarkTheme) 87 91 ) 88 92 } 89 93 IconType.TEXT -> {
+42 -8
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/mapper/ChangeRecordTypeMapper.kt
··· 11 11 import com.example.util.simpletimetracker.feature_change_record_type.R 12 12 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData 13 13 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryViewData 14 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData 15 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData.IconImageState 14 16 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconSwitchViewData 15 17 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconTypeViewData 16 18 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconViewData ··· 26 28 27 29 fun mapIconImageData( 28 30 newColor: AppColor, 31 + search: String, 29 32 isDarkTheme: Boolean, 30 33 ): List<ViewHolderType> { 31 34 val iconCategories = iconImageMapper.getAvailableImages() 32 35 return iconCategories.toList().mapIndexed { index, (category, images) -> 33 - listOf( 34 - ChangeRecordTypeIconCategoryInfoViewData( 35 - type = ChangeRecordTypeIconTypeViewData.Image(category.type, index.toLong()), 36 - text = category.name, 37 - isLast = index == iconCategories.size - 1, 38 - ), 39 - ) + images.map { (iconName, iconResId) -> 40 - mapImageViewData(iconName, iconResId, newColor, isDarkTheme) 36 + val categoryViewData = ChangeRecordTypeIconCategoryInfoViewData( 37 + type = ChangeRecordTypeIconTypeViewData.Image(category.type, index.toLong()), 38 + text = category.name, 39 + isLast = index == iconCategories.size - 1, 40 + ) 41 + .let(::listOf) 42 + .takeIf { search.isEmpty() } // Don't show category on search. 43 + .orEmpty() 44 + 45 + val iconsViewData = images.mapNotNull { (iconName, iconResId) -> 46 + if (search.isNotEmpty() && !iconName.contains(search)) { 47 + return@mapNotNull null 48 + } 49 + 50 + mapImageViewData( 51 + iconName = iconName, 52 + iconResId = iconResId, 53 + newColor = newColor, 54 + isDarkTheme = isDarkTheme, 55 + ) 41 56 } 57 + 58 + categoryViewData + iconsViewData 42 59 }.flatten() 43 60 } 44 61 ··· 96 113 isSelected = it == iconType, 97 114 ) 98 115 } 116 + } 117 + 118 + fun mapToIconImageStateViewData( 119 + iconImageState: IconImageState, 120 + iconType: IconType, 121 + isDarkTheme: Boolean, 122 + ): ChangeRecordTypeIconImageStateViewData { 123 + val theme = if (isDarkTheme) R.style.AppThemeDark else R.style.AppTheme 124 + 125 + return ChangeRecordTypeIconImageStateViewData( 126 + state = if (iconType != IconType.IMAGE) IconImageState.Chooser else iconImageState, 127 + searchButtonIsVisible = iconType == IconType.IMAGE, 128 + searchButtonColor = when (iconImageState) { 129 + is IconImageState.Chooser -> R.attr.appInactiveColor 130 + is IconImageState.Search -> R.attr.colorSecondary 131 + }.let { resourceRepo.getThemedAttr(it, theme) }, 132 + ) 99 133 } 100 134 101 135 fun mapEmojiSelectionParams(
+16 -1
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_record_type.view 2 2 3 + import android.content.res.ColorStateList 3 4 import android.os.Bundle 4 5 import android.view.LayoutInflater 5 6 import android.view.ViewGroup ··· 48 49 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState.State.Icon 49 50 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeGoalsViewData 50 51 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData 52 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData 53 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData.IconImageState 51 54 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconStateViewData 52 55 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconSwitchViewData 53 56 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeScrollViewData ··· 194 197 updateIconContainerScroll(it) 195 198 viewModel.onIconTypeClick(it) 196 199 } 200 + etChangeRecordTypeIconSearch.doAfterTextChanged { viewModel.onIconImageSearch(it.toString()) } 201 + btnChangeRecordTypeIconSearch.setOnClick(viewModel::onIconImageSearchClicked) 197 202 GoalsViewDelegate.initGoalUx( 198 203 viewModel = viewModel, 199 204 layout = layoutChangeRecordTypeGoals, ··· 222 227 icons.observe(::updateIconsState) 223 228 iconCategories.observe(iconCategoriesAdapter::replace) 224 229 iconsTypeViewData.observe(btnChangeRecordTypeIconSwitch.adapter::replace) 230 + iconImageStateViewData.observe(::updateIconImageStateViewData) 225 231 categories.observe(categoriesAdapter::replace) 226 232 goalsViewData.observe(::updateGoalsState) 227 233 notificationsHintVisible.observe( 228 - layoutChangeRecordTypeGoals.containerChangeRecordTypeGoalNotificationsHint::visible::set 234 + layoutChangeRecordTypeGoals.containerChangeRecordTypeGoalNotificationsHint::visible::set, 229 235 ) 230 236 chooserState.observe(::updateChooserState) 231 237 keyboardVisibility.observe { visible -> ··· 394 400 395 401 (btnChangeRecordTypeIconSwitch.layoutParams as? AppBarLayout.LayoutParams) 396 402 ?.scrollFlags = scrollFlags 403 + } 404 + 405 + private fun updateIconImageStateViewData( 406 + data: ChangeRecordTypeIconImageStateViewData, 407 + ) = with(binding) { 408 + btnChangeRecordTypeIconSearch.isVisible = data.searchButtonIsVisible 409 + ivChangeRecordTypeIconSearch.backgroundTintList = ColorStateList.valueOf(data.searchButtonColor) 410 + rvChangeRecordTypeIconCategory.isVisible = data.state is IconImageState.Chooser 411 + inputChangeRecordTypeIconSearch.isVisible = data.state is IconImageState.Search 397 412 } 398 413 399 414 companion object {
+15
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeIconImageStateViewData.kt
··· 1 + package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 + 3 + import androidx.annotation.ColorInt 4 + 5 + data class ChangeRecordTypeIconImageStateViewData( 6 + val state: IconImageState, 7 + val searchButtonIsVisible: Boolean, 8 + @ColorInt val searchButtonColor: Int, 9 + ) { 10 + 11 + sealed interface IconImageState { 12 + object Chooser : IconImageState 13 + object Search : IconImageState 14 + } 15 + }
+66 -1
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt
··· 38 38 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeChooserState 39 39 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryInfoViewData 40 40 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconCategoryViewData 41 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData 42 + import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconImageStateViewData.IconImageState 41 43 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconStateViewData 42 44 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconSwitchViewData 43 45 import com.example.util.simpletimetracker.feature_change_record_type.viewData.ChangeRecordTypeIconViewData ··· 48 50 import com.example.util.simpletimetracker.navigation.params.screen.ChangeTagData 49 51 import com.example.util.simpletimetracker.navigation.params.screen.ColorSelectionDialogParams 50 52 import dagger.hilt.android.lifecycle.HiltViewModel 53 + import kotlinx.coroutines.Job 54 + import kotlinx.coroutines.delay 51 55 import kotlinx.coroutines.launch 52 56 import javax.inject.Inject 53 57 import com.example.util.simpletimetracker.core.R as coreR ··· 105 109 val iconsTypeViewData: LiveData<List<ViewHolderType>> by lazy { 106 110 return@lazy MutableLiveData(loadIconsTypeViewData()) 107 111 } 112 + val iconImageStateViewData: LiveData<ChangeRecordTypeIconImageStateViewData> by lazy { 113 + return@lazy MutableLiveData<ChangeRecordTypeIconImageStateViewData>().let { initial -> 114 + viewModelScope.launch { initial.value = loadIconImageStateViewData() } 115 + initial 116 + } 117 + } 108 118 val categories: LiveData<List<ViewHolderType>> by lazy { 109 119 return@lazy MutableLiveData<List<ViewHolderType>>().let { initial -> 110 120 viewModelScope.launch { ··· 129 139 130 140 private val recordTypeId: Long get() = (extra as? ChangeRecordTypeParams.Change)?.id.orZero() 131 141 private var iconType: IconType = IconType.IMAGE 142 + private var iconImageState: IconImageState = IconImageState.Chooser 143 + private var iconSearch: String = "" 144 + private var iconSearchJob: Job? = null 132 145 private var initialCategories: Set<Long> = emptySet() 133 146 private var newName: String = "" 134 147 private var newIconName: String = "" ··· 209 222 if (viewData.iconType == iconType) return 210 223 viewModelScope.launch { 211 224 if (viewData.iconType != IconType.TEXT) { 225 + keyboardVisibility.set(false) 212 226 icons.set(ChangeRecordTypeIconStateViewData.Icons(emptyList())) 213 227 } 214 228 iconType = viewData.iconType 215 229 updateIconsTypeViewData() 216 230 updateIconCategories(selectedIndex = 0) 231 + updateIconImageStateViewData() 217 232 updateIcons() 218 233 } 219 234 } ··· 260 275 ?.let { updateIconCategories(it.getUniqueId()) } 261 276 } 262 277 278 + fun onIconImageSearchClicked() { 279 + val newState = when (iconImageState) { 280 + is IconImageState.Chooser -> IconImageState.Search 281 + is IconImageState.Search -> IconImageState.Chooser 282 + } 283 + iconImageState = newState 284 + 285 + if (iconImageState is IconImageState.Chooser) { 286 + keyboardVisibility.set(false) 287 + expandIconTypeSwitch.set(Unit) 288 + icons.set(ChangeRecordTypeIconStateViewData.Icons(emptyList())) 289 + } 290 + viewModelScope.launch { 291 + updateIconImageStateViewData() 292 + updateIcons() 293 + } 294 + } 295 + 296 + fun onIconImageSearch(search: String) { 297 + if (iconType != IconType.IMAGE) return 298 + 299 + if (search != iconSearch) { 300 + iconSearchJob?.cancel() 301 + iconSearchJob = viewModelScope.launch { 302 + iconSearch = search 303 + delay(500) 304 + updateIconImageStateViewData() 305 + updateIcons() 306 + } 307 + } 308 + } 309 + 263 310 fun onEmojiClick(item: EmojiViewData) { 264 311 if (iconEmojiMapper.hasSkinToneVariations(item.emojiCodes)) { 265 312 openEmojiSelectionDialog(item) ··· 461 508 } 462 509 463 510 private suspend fun loadIconsViewData(): ChangeRecordTypeIconStateViewData { 464 - return viewDataInteractor.getIconsViewData(newColor, iconType) 511 + return viewDataInteractor.getIconsViewData( 512 + newColor = newColor, 513 + iconType = iconType, 514 + iconImageState = iconImageState, 515 + iconSearch = iconSearch, 516 + ) 465 517 } 466 518 467 519 private fun updateIconCategories(selectedIndex: Long) { ··· 483 535 484 536 private fun loadIconsTypeViewData(): List<ViewHolderType> { 485 537 return changeRecordTypeMapper.mapToIconSwitchViewData(iconType) 538 + } 539 + 540 + private suspend fun updateIconImageStateViewData() { 541 + val data = loadIconImageStateViewData() 542 + iconImageStateViewData.set(data) 543 + } 544 + 545 + private suspend fun loadIconImageStateViewData(): ChangeRecordTypeIconImageStateViewData { 546 + return changeRecordTypeMapper.mapToIconImageStateViewData( 547 + iconImageState = iconImageState, 548 + iconType = iconType, 549 + isDarkTheme = prefsInteractor.getDarkMode(), 550 + ) 486 551 } 487 552 488 553 private suspend fun updateCategoriesViewData() {
+78 -9
features/feature_change_record_type/src/main/res/layout/change_record_type_fragment.xml
··· 279 279 android:layout_height="wrap_content" 280 280 app:layout_scrollFlags="scroll|snap" /> 281 281 282 - <androidx.recyclerview.widget.RecyclerView 283 - android:id="@+id/rvChangeRecordTypeIconCategory" 282 + <androidx.constraintlayout.widget.ConstraintLayout 284 283 android:layout_width="match_parent" 285 284 android:layout_height="wrap_content" 286 - android:layout_marginStart="8dp" 287 - android:layout_marginEnd="8dp" 288 - android:overScrollMode="never" 289 - app:layout_scrollFlags="scroll|enterAlways|snap" 290 - tools:itemCount="1" 291 - tools:listitem="@layout/change_record_type_item_icon_category_layout" /> 285 + app:layout_scrollFlags="scroll|enterAlways|snap"> 286 + 287 + <androidx.recyclerview.widget.RecyclerView 288 + android:id="@+id/rvChangeRecordTypeIconCategory" 289 + android:layout_width="0dp" 290 + android:layout_height="wrap_content" 291 + android:layout_marginStart="8dp" 292 + android:layout_marginEnd="0dp" 293 + android:overScrollMode="never" 294 + android:visibility="visible" 295 + app:layout_constraintBottom_toBottomOf="parent" 296 + app:layout_constraintEnd_toStartOf="@id/btnChangeRecordTypeIconSearch" 297 + app:layout_constraintStart_toStartOf="parent" 298 + app:layout_constraintTop_toTopOf="parent" 299 + app:layout_goneMarginEnd="8dp" 300 + tools:itemCount="1" 301 + tools:listitem="@layout/change_record_type_item_icon_category_layout" 302 + tools:visibility="visible" /> 303 + 304 + <com.google.android.material.textfield.TextInputLayout 305 + android:id="@+id/inputChangeRecordTypeIconSearch" 306 + style="@style/ChangeItemInputField" 307 + android:layout_width="0dp" 308 + android:layout_height="wrap_content" 309 + android:layout_marginStart="8dp" 310 + android:layout_marginEnd="0dp" 311 + android:layout_marginBottom="4dp" 312 + android:visibility="gone" 313 + app:layout_constraintBottom_toBottomOf="parent" 314 + app:layout_constraintEnd_toStartOf="@id/btnChangeRecordTypeIconSearch" 315 + app:layout_constraintStart_toStartOf="parent" 316 + app:layout_constraintTop_toTopOf="parent" 317 + app:layout_goneMarginEnd="8dp" 318 + tools:visibility="visible"> 319 + 320 + <com.google.android.material.textfield.TextInputEditText 321 + android:id="@+id/etChangeRecordTypeIconSearch" 322 + style="@style/EditTextMultiLine" 323 + android:layout_width="match_parent" 324 + android:layout_height="wrap_content" 325 + android:hint="@string/change_record_type_icon_search_hint" /> 326 + 327 + </com.google.android.material.textfield.TextInputLayout> 328 + 329 + <androidx.cardview.widget.CardView 330 + android:id="@+id/btnChangeRecordTypeIconSearch" 331 + style="@style/InputFieldCard" 332 + android:layout_width="36dp" 333 + android:layout_height="0dp" 334 + android:layout_marginEnd="6dp" 335 + android:visibility="gone" 336 + app:layout_constraintBottom_toBottomOf="parent" 337 + app:layout_constraintEnd_toEndOf="parent" 338 + app:layout_constraintHeight_min="36dp" 339 + app:layout_constraintTop_toTopOf="parent" 340 + tools:visibility="visible"> 341 + 342 + <androidx.appcompat.widget.AppCompatTextView 343 + style="@style/ButtonTimeAdjust" 344 + android:layout_width="match_parent" 345 + android:layout_height="match_parent" 346 + android:text="" /> 347 + 348 + <androidx.appcompat.widget.AppCompatImageView 349 + android:id="@+id/ivChangeRecordTypeIconSearch" 350 + android:layout_width="wrap_content" 351 + android:layout_height="wrap_content" 352 + android:layout_gravity="center" 353 + android:layout_margin="4dp" 354 + android:background="@drawable/search" 355 + tools:backgroundTint="?appInactiveColor" 356 + android:scaleType="center" /> 357 + 358 + </androidx.cardview.widget.CardView> 359 + 360 + </androidx.constraintlayout.widget.ConstraintLayout> 292 361 293 362 </com.google.android.material.appbar.AppBarLayout> 294 363 ··· 350 419 android:visibility="gone" 351 420 app:layout_constraintBottom_toTopOf="@id/btnChangeRecordTypeSave" 352 421 app:layout_constraintTop_toBottomOf="@id/containerChangeRecordTypeMain" 353 - tools:visibility="visible"> 422 + tools:visibility="gone"> 354 423 355 424 <include 356 425 android:id="@+id/layoutChangeRecordTypeGoals"