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.

update default types selection ui to be more logical

razeeman (Nov 26, 2023, 6:09 PM +0300) 4c8a5aa9 7fb6d258

+86 -15
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/extension/BottomSheetDialogExtensions.kt
··· 31 31 } 32 32 } 33 33 34 - // Disable sheet swipe on content scroll to avoid accidentally closing payment sheet when scrolling items. 34 + // Disable sheet swipe on content scroll to avoid accidentally closing the sheet when scrolling items. 35 35 fun BottomSheetDialogFragment.blockContentScroll(recyclerView: RecyclerView) { 36 36 recyclerView.addOnScrollListenerAdapter( 37 37 onScrolled = { _, _, dy ->
+2
core/src/main/res/values-ar/strings.xml
··· 15 15 <string name="record_tag_hint_short">الوسوم</string> 16 16 <string name="nothing_selected">لم يحدد شيء</string> 17 17 <string name="something_selected">المحدد:</string> 18 + <string name="select_all">اختر الكل</string> 19 + <string name="select_nothing">لا تختار شيئا</string> 18 20 <string name="no_data">لايوجد بيانات</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-ca/strings.xml
··· 15 15 <string name="record_tag_hint_short">Etiquetes</string> 16 16 <string name="nothing_selected">Res seleccionat</string> 17 17 <string name="something_selected">Seleccionat:</string> 18 + <string name="select_all">Seleccionar tot</string> 19 + <string name="select_nothing">No seleccioneu res</string> 18 20 <string name="no_data">No hi ha dades</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-de/strings.xml
··· 15 15 <string name="record_tag_hint_short">Tags</string> 16 16 <string name="nothing_selected">Nichts ausgewählt</string> 17 17 <string name="something_selected">Ausgewählt:</string> 18 + <string name="select_all">Wählen Sie Alle</string> 19 + <string name="select_nothing">Nichts auswählen</string> 18 20 <string name="no_data">Keine Daten</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-es/strings.xml
··· 15 15 <string name="record_tag_hint_short">Etiquetas</string> 16 16 <string name="nothing_selected">Nada seleccionado</string> 17 17 <string name="something_selected">Seleccionada:</string> 18 + <string name="select_all">Seleccionar todo</string> 19 + <string name="select_nothing">No seleccionar nada</string> 18 20 <string name="no_data">Sin datos</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-fa/strings.xml
··· 15 15 <string name="record_tag_hint_short">برچسب ها</string> 16 16 <string name="nothing_selected">موردی انتخاب نشده</string> 17 17 <string name="something_selected">انتخاب شده:</string> 18 + <string name="select_all">انتخاب همه</string> 19 + <string name="select_nothing">چیزی را انتخاب نکنید</string> 18 20 <string name="no_data">اطلاعاتی وجود ندارد</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-fr/strings.xml
··· 15 15 <string name="record_tag_hint_short">Étiquettes</string> 16 16 <string name="nothing_selected">Rien de sélectionné</string> 17 17 <string name="something_selected">Sélection :</string> 18 + <string name="select_all">Tout sélectionner</string> 19 + <string name="select_nothing">Ne rien sélectionner</string> 18 20 <string name="no_data">Pas de données</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-hi/strings.xml
··· 15 15 <string name="record_tag_hint_short">टैग</string> 16 16 <string name="nothing_selected">कुछ भी चयनित नहीं</string> 17 17 <string name="something_selected">चयनित:</string> 18 + <string name="select_all">सबका चयन करें</string> 19 + <string name="select_nothing">कुछ भी नहीं चुनें</string> 18 20 <string name="no_data">कोई डेटा नहीं</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-in/strings.xml
··· 15 15 <string name="record_tag_hint_short">Label</string> 16 16 <string name="nothing_selected">Tidak ada yang dipilih</string> 17 17 <string name="something_selected">Terpilih:</string> 18 + <string name="select_all">Pilih Semua</string> 19 + <string name="select_nothing">Pilih apa pun</string> 18 20 <string name="no_data">Tidak ada data</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-it/strings.xml
··· 15 15 <string name="record_tag_hint_short">Etichette</string> 16 16 <string name="nothing_selected">Niente selezionato</string> 17 17 <string name="something_selected">Selezionata:</string> 18 + <string name="select_all">Seleziona tutto</string> 19 + <string name="select_nothing">Non selezionare nulla</string> 18 20 <string name="no_data">Nessun dato</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-ja/strings.xml
··· 15 15 <string name="record_tag_hint_short">タグ</string> 16 16 <string name="nothing_selected">何も選択されていません</string> 17 17 <string name="something_selected">選択済み:</string> 18 + <string name="select_all">すべて選択</string> 19 + <string name="select_nothing">何も選択しない</string> 18 20 <string name="no_data">データなし</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-ko/strings.xml
··· 15 15 <string name="record_tag_hint_short">태그</string> 16 16 <string name="nothing_selected">아무것도 선택되어있지 않습니다</string> 17 17 <string name="something_selected">선택됨:</string> 18 + <string name="select_all">모두 선택</string> 19 + <string name="select_nothing">아무것도 선택하지 마세요</string> 18 20 <string name="no_data">데이터 없음</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-nl/strings.xml
··· 15 15 <string name="record_tag_hint_short">Labels</string> 16 16 <string name="nothing_selected">Niets geselecteerd</string> 17 17 <string name="something_selected">Geselecteerd:</string> 18 + <string name="select_all">Selecteer alles</string> 19 + <string name="select_nothing">Selecteer niets</string> 18 20 <string name="no_data">Geen gegevens</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-pt/strings.xml
··· 15 15 <string name="record_tag_hint_short">Tags</string> 16 16 <string name="nothing_selected">Nada selecionado</string> 17 17 <string name="something_selected">Selecionada:</string> 18 + <string name="select_all">Selecionar tudo</string> 19 + <string name="select_nothing">Não selecione nada</string> 18 20 <string name="no_data">Sem dados</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-ru/strings.xml
··· 15 15 <string name="record_tag_hint_short">Теги</string> 16 16 <string name="nothing_selected">Ничего не выбрано</string> 17 17 <string name="something_selected">Выбрано:</string> 18 + <string name="select_all">Выбрать все</string> 19 + <string name="select_nothing">Ничего не выбирать</string> 18 20 <string name="no_data">Нет данных</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-sv/strings.xml
··· 15 15 <string name="record_tag_hint_short">Taggar</string> 16 16 <string name="nothing_selected">Inget valt</string> 17 17 <string name="something_selected">Vald:</string> 18 + <string name="select_all">Välj alla</string> 19 + <string name="select_nothing">Välj ingenting</string> 18 20 <string name="no_data">Inga data</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-tr/strings.xml
··· 15 15 <string name="record_tag_hint_short">Etiketler</string> 16 16 <string name="nothing_selected">Hiçbir şey seçilmedi</string> 17 17 <string name="something_selected">Seçildi:</string> 18 + <string name="select_all">Hepsini seç</string> 19 + <string name="select_nothing">Hiçbir şey seçme</string> 18 20 <string name="no_data">Veri yok</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-uk/strings.xml
··· 15 15 <string name="record_tag_hint_short">Теги</string> 16 16 <string name="nothing_selected">Нічого не вибрано</string> 17 17 <string name="something_selected">Вибрано:</string> 18 + <string name="select_all">Вибрати все</string> 19 + <string name="select_nothing">Нічого не вибирайте</string> 18 20 <string name="no_data">Немає даних</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-zh-rTW/strings.xml
··· 15 15 <string name="record_tag_hint_short">標籤</string> 16 16 <string name="nothing_selected">未選取</string> 17 17 <string name="something_selected">已選取:</string> 18 + <string name="select_all">全選</string> 19 + <string name="select_nothing">不選擇任何內容</string> 18 20 <string name="no_data">沒有數據</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values-zh/strings.xml
··· 15 15 <string name="record_tag_hint_short">标签</string> 16 16 <string name="nothing_selected">未选择任何内容</string> 17 17 <string name="something_selected">已选择:</string> 18 + <string name="select_all">全选</string> 19 + <string name="select_nothing">不选择任何内容</string> 18 20 <string name="no_data">没有数据</string> 19 21 20 22 <!-- Range selection -->
+2
core/src/main/res/values/strings.xml
··· 15 15 <string name="record_tag_hint_short">Tags</string> 16 16 <string name="nothing_selected">Nothing selected</string> 17 17 <string name="something_selected">Selected:</string> 18 + <string name="select_all">Select all</string> 19 + <string name="select_nothing">Select nothing</string> 18 20 <string name="no_data">No data</string> 19 21 20 22 <!-- Range selection -->
+4
features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/view/DefaultTypesSelectionDialogFragment.kt
··· 10 10 import com.example.util.simpletimetracker.core.extension.setFullScreen 11 11 import com.example.util.simpletimetracker.core.extension.setSkipCollapsed 12 12 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 13 + import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate 14 + import com.example.util.simpletimetracker.feature_base_adapter.info.createInfoAdapterDelegate 13 15 import com.example.util.simpletimetracker.feature_base_adapter.loader.createLoaderAdapterDelegate 14 16 import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate 15 17 import com.example.util.simpletimetracker.feature_dialogs.defaultTypesSelection.viewModel.DefaultTypesSelectionViewModel ··· 32 34 BaseRecyclerAdapter( 33 35 createRecordTypeAdapterDelegate(viewModel::onRecordTypeClick), 34 36 createLoaderAdapterDelegate(), 37 + createDividerAdapterDelegate(), 38 + createInfoAdapterDelegate(), 35 39 ) 36 40 } 37 41
+38 -12
features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/viewModel/DefaultTypesSelectionViewModel.kt
··· 7 7 import com.example.util.simpletimetracker.core.extension.addOrRemove 8 8 import com.example.util.simpletimetracker.core.extension.set 9 9 import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper 10 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 10 11 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 11 12 import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor 12 13 import com.example.util.simpletimetracker.domain.model.CardOrder 13 14 import com.example.util.simpletimetracker.domain.model.RecordType 14 15 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 16 + import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerViewData 17 + import com.example.util.simpletimetracker.feature_base_adapter.info.InfoViewData 15 18 import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData 16 19 import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData 20 + import com.example.util.simpletimetracker.feature_dialogs.R 17 21 import com.example.util.simpletimetracker.feature_dialogs.defaultTypesSelection.interactor.GetDefaultRecordTypesInteractor 18 22 import dagger.hilt.android.lifecycle.HiltViewModel 19 23 import kotlinx.coroutines.launch ··· 25 29 private val prefsInteractor: PrefsInteractor, 26 30 private val recordTypeViewDataMapper: RecordTypeViewDataMapper, 27 31 private val getDefaultRecordTypesInteractor: GetDefaultRecordTypesInteractor, 32 + private val resourceRepo: ResourceRepo, 28 33 ) : ViewModel() { 29 34 30 35 val types: LiveData<List<ViewHolderType>> by lazy { ··· 37 42 } 38 43 } 39 44 val close: LiveData<Unit> = MutableLiveData() 40 - val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(true) 45 + val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(false) 41 46 42 47 private var recordTypes: List<RecordType> = emptyList() 43 - private var typeIdsFiltered: MutableList<Long> = mutableListOf() 48 + private var typeIdsSelected: MutableList<Long> = mutableListOf() 44 49 45 50 fun onRecordTypeClick(item: RecordTypeViewData) { 46 - typeIdsFiltered.addOrRemove(item.id) 51 + typeIdsSelected.addOrRemove(item.id) 47 52 updateSaveButtonEnabled() 48 53 updateRecordTypesViewData() 49 54 } 50 55 51 56 fun onShowAllClick() { 52 - typeIdsFiltered.clear() 57 + typeIdsSelected.addAll(recordTypes.map { it.id }) 53 58 updateSaveButtonEnabled() 54 59 updateRecordTypesViewData() 55 60 } 56 61 57 62 fun onHideAllClick() { 58 - typeIdsFiltered.addAll(recordTypes.map { it.id }) 63 + typeIdsSelected.clear() 59 64 updateSaveButtonEnabled() 60 65 updateRecordTypesViewData() 61 66 } 62 67 63 68 fun onSaveClick() { 64 - if (typeIdsFiltered.size == recordTypes.size) return 69 + if (typeIdsSelected.size == 0) return 65 70 66 71 saveButtonEnabled.set(false) 67 72 viewModelScope.launch { 68 - recordTypes.filter { it.id !in typeIdsFiltered }.forEach { 73 + recordTypes.filter { it.id in typeIdsSelected }.forEach { 69 74 // Remove ids for correct adding in database. 70 75 recordTypeInteractor.add(it.copy(id = 0)) 71 76 } ··· 75 80 } 76 81 77 82 private fun updateSaveButtonEnabled() { 78 - saveButtonEnabled.set(typeIdsFiltered.size != recordTypes.size) 83 + saveButtonEnabled.set(typeIdsSelected.size != 0) 79 84 } 80 85 81 86 private fun updateRecordTypesViewData() = viewModelScope.launch { ··· 89 94 90 95 if (recordTypes.isEmpty()) recordTypes = loadRecordTypes() 91 96 92 - return recordTypes.map { recordType -> 93 - recordTypeViewDataMapper.mapFiltered( 94 - recordType = recordType, 97 + fun map(type: RecordType): ViewHolderType { 98 + return recordTypeViewDataMapper.map( 99 + recordType = type, 95 100 numberOfCards = numberOfCards, 96 101 isDarkTheme = isDarkTheme, 97 - isFiltered = recordType.id in typeIdsFiltered, 98 102 isChecked = null, 99 103 ) 100 104 } 105 + 106 + val selected = recordTypes 107 + .filter { it.id in typeIdsSelected } 108 + .map(::map) 109 + val available = recordTypes 110 + .filter { it.id !in typeIdsSelected } 111 + .map(::map) 112 + 113 + val result = mutableListOf<ViewHolderType>() 114 + 115 + if (selected.isNotEmpty()) { 116 + result += InfoViewData(resourceRepo.getString(R.string.something_selected)) 117 + result += selected 118 + } else { 119 + result += InfoViewData(resourceRepo.getString(R.string.nothing_selected)) 120 + } 121 + if (available.isNotEmpty()) { 122 + result += DividerViewData(0) 123 + } 124 + result += available 125 + 126 + return result 101 127 } 102 128 103 129 private suspend fun loadRecordTypes(): List<RecordType> {
+3 -2
features/feature_dialogs/src/main/res/layout/default_types_selection_dialog_fragment.xml
··· 31 31 android:layout_height="0dp" 32 32 android:layout_marginBottom="8dp" 33 33 android:layout_weight="1" 34 + android:overScrollMode="never" 34 35 tools:listitem="@layout/item_record_type_layout" /> 35 36 36 37 <androidx.constraintlayout.widget.ConstraintLayout ··· 46 47 android:ellipsize="marquee" 47 48 android:paddingHorizontal="0dp" 48 49 android:singleLine="true" 49 - android:text="@string/types_filter_show_all" 50 + android:text="@string/select_all" 50 51 app:layout_constraintBottom_toTopOf="@id/btnDefaultTypesSelectionSave" 51 52 app:layout_constraintEnd_toStartOf="@id/btnDefaultTypesSelectionHideAll" 52 53 app:layout_constraintStart_toStartOf="parent" /> ··· 60 61 android:ellipsize="marquee" 61 62 android:paddingHorizontal="0dp" 62 63 android:singleLine="true" 63 - android:text="@string/types_filter_hide_all" 64 + android:text="@string/select_nothing" 64 65 app:layout_constraintBottom_toTopOf="@id/btnDefaultTypesSelectionSave" 65 66 app:layout_constraintEnd_toEndOf="parent" 66 67 app:layout_constraintStart_toEndOf="@id/btnDefaultTypesSelectionShowAll" />