diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/extension/BottomSheetDialogExtensions.kt b/core/src/main/java/com/example/util/simpletimetracker/core/extension/BottomSheetDialogExtensions.kt index af66b8b9..316894b3 100644 --- a/core/src/main/java/com/example/util/simpletimetracker/core/extension/BottomSheetDialogExtensions.kt +++ b/core/src/main/java/com/example/util/simpletimetracker/core/extension/BottomSheetDialogExtensions.kt @@ -31,7 +31,7 @@ fun BottomSheetDialogFragment.setFullScreen() { } } -// Disable sheet swipe on content scroll to avoid accidentally closing payment sheet when scrolling items. +// Disable sheet swipe on content scroll to avoid accidentally closing the sheet when scrolling items. fun BottomSheetDialogFragment.blockContentScroll(recyclerView: RecyclerView) { recyclerView.addOnScrollListenerAdapter( onScrolled = { _, _, dy -> diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml index 9a95e3c2..a786158b 100644 --- a/core/src/main/res/values-ar/strings.xml +++ b/core/src/main/res/values-ar/strings.xml @@ -15,6 +15,8 @@ الوسوم لم يحدد شيء المحدد: + اختر الكل + لا تختار شيئا لايوجد بيانات diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml index 4919d540..45ff2f20 100644 --- a/core/src/main/res/values-ca/strings.xml +++ b/core/src/main/res/values-ca/strings.xml @@ -15,6 +15,8 @@ Etiquetes Res seleccionat Seleccionat: + Seleccionar tot + No seleccioneu res No hi ha dades diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml index c861848f..f1ac0e56 100644 --- a/core/src/main/res/values-de/strings.xml +++ b/core/src/main/res/values-de/strings.xml @@ -15,6 +15,8 @@ Tags Nichts ausgewählt Ausgewählt: + Wählen Sie Alle + Nichts auswählen Keine Daten diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml index e16788b5..fff44803 100644 --- a/core/src/main/res/values-es/strings.xml +++ b/core/src/main/res/values-es/strings.xml @@ -15,6 +15,8 @@ Etiquetas Nada seleccionado Seleccionada: + Seleccionar todo + No seleccionar nada Sin datos diff --git a/core/src/main/res/values-fa/strings.xml b/core/src/main/res/values-fa/strings.xml index 8d85d6c1..23458fd7 100644 --- a/core/src/main/res/values-fa/strings.xml +++ b/core/src/main/res/values-fa/strings.xml @@ -15,6 +15,8 @@ برچسب ها موردی انتخاب نشده انتخاب شده: + انتخاب همه + چیزی را انتخاب نکنید اطلاعاتی وجود ندارد diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml index 56c23b5b..2939d914 100644 --- a/core/src/main/res/values-fr/strings.xml +++ b/core/src/main/res/values-fr/strings.xml @@ -15,6 +15,8 @@ Étiquettes Rien de sélectionné Sélection : + Tout sélectionner + Ne rien sélectionner Pas de données diff --git a/core/src/main/res/values-hi/strings.xml b/core/src/main/res/values-hi/strings.xml index 172d1b1f..0934b44c 100644 --- a/core/src/main/res/values-hi/strings.xml +++ b/core/src/main/res/values-hi/strings.xml @@ -15,6 +15,8 @@ टैग कुछ भी चयनित नहीं चयनित: + सबका चयन करें + कुछ भी नहीं चुनें कोई डेटा नहीं diff --git a/core/src/main/res/values-in/strings.xml b/core/src/main/res/values-in/strings.xml index 15d45461..1dd8cdf6 100644 --- a/core/src/main/res/values-in/strings.xml +++ b/core/src/main/res/values-in/strings.xml @@ -15,6 +15,8 @@ Label Tidak ada yang dipilih Terpilih: + Pilih Semua + Pilih apa pun Tidak ada data diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml index cebfbca2..0724e88f 100644 --- a/core/src/main/res/values-it/strings.xml +++ b/core/src/main/res/values-it/strings.xml @@ -15,6 +15,8 @@ Etichette Niente selezionato Selezionata: + Seleziona tutto + Non selezionare nulla Nessun dato diff --git a/core/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml index d68b2423..6c7e7c2e 100644 --- a/core/src/main/res/values-ja/strings.xml +++ b/core/src/main/res/values-ja/strings.xml @@ -15,6 +15,8 @@ タグ 何も選択されていません 選択済み: + すべて選択 + 何も選択しない データなし diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml index ad8642b5..3da1852e 100644 --- a/core/src/main/res/values-ko/strings.xml +++ b/core/src/main/res/values-ko/strings.xml @@ -15,6 +15,8 @@ 태그 아무것도 선택되어있지 않습니다 선택됨: + 모두 선택 + 아무것도 선택하지 마세요 데이터 없음 diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml index ff827607..73dcc478 100644 --- a/core/src/main/res/values-nl/strings.xml +++ b/core/src/main/res/values-nl/strings.xml @@ -15,6 +15,8 @@ Labels Niets geselecteerd Geselecteerd: + Selecteer alles + Selecteer niets Geen gegevens diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml index ce21aed5..c0fea9de 100644 --- a/core/src/main/res/values-pt/strings.xml +++ b/core/src/main/res/values-pt/strings.xml @@ -15,6 +15,8 @@ Tags Nada selecionado Selecionada: + Selecionar tudo + Não selecione nada Sem dados diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml index 78024521..8de185bd 100644 --- a/core/src/main/res/values-ru/strings.xml +++ b/core/src/main/res/values-ru/strings.xml @@ -15,6 +15,8 @@ Теги Ничего не выбрано Выбрано: + Выбрать все + Ничего не выбирать Нет данных diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml index b77a3136..5a4e3f26 100644 --- a/core/src/main/res/values-sv/strings.xml +++ b/core/src/main/res/values-sv/strings.xml @@ -15,6 +15,8 @@ Taggar Inget valt Vald: + Välj alla + Välj ingenting Inga data diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml index bf67ce1a..b28868bd 100644 --- a/core/src/main/res/values-tr/strings.xml +++ b/core/src/main/res/values-tr/strings.xml @@ -15,6 +15,8 @@ Etiketler Hiçbir şey seçilmedi Seçildi: + Hepsini seç + Hiçbir şey seçme Veri yok diff --git a/core/src/main/res/values-uk/strings.xml b/core/src/main/res/values-uk/strings.xml index 8bd8322e..5a2c3683 100644 --- a/core/src/main/res/values-uk/strings.xml +++ b/core/src/main/res/values-uk/strings.xml @@ -15,6 +15,8 @@ Теги Нічого не вибрано Вибрано: + Вибрати все + Нічого не вибирайте Немає даних diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml index 02c80da3..5b5281e2 100644 --- a/core/src/main/res/values-zh-rTW/strings.xml +++ b/core/src/main/res/values-zh-rTW/strings.xml @@ -15,6 +15,8 @@ 標籤 未選取 已選取: + 全選 + 不選擇任何內容 沒有數據 diff --git a/core/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml index ef33feb7..7bf9a870 100644 --- a/core/src/main/res/values-zh/strings.xml +++ b/core/src/main/res/values-zh/strings.xml @@ -15,6 +15,8 @@ 标签 未选择任何内容 已选择: + 全选 + 不选择任何内容 没有数据 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index ad60d69a..c873e107 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -15,6 +15,8 @@ Tags Nothing selected Selected: + Select all + Select nothing No data diff --git a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/view/DefaultTypesSelectionDialogFragment.kt b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/view/DefaultTypesSelectionDialogFragment.kt index 72d7cc65..eb700368 100644 --- a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/view/DefaultTypesSelectionDialogFragment.kt +++ b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/view/DefaultTypesSelectionDialogFragment.kt @@ -10,6 +10,8 @@ import com.example.util.simpletimetracker.core.extension.observeOnce import com.example.util.simpletimetracker.core.extension.setFullScreen import com.example.util.simpletimetracker.core.extension.setSkipCollapsed import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter +import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.info.createInfoAdapterDelegate import com.example.util.simpletimetracker.feature_base_adapter.loader.createLoaderAdapterDelegate import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate import com.example.util.simpletimetracker.feature_dialogs.defaultTypesSelection.viewModel.DefaultTypesSelectionViewModel @@ -32,6 +34,8 @@ class DefaultTypesSelectionDialogFragment : BaseBottomSheetFragment() { BaseRecyclerAdapter( createRecordTypeAdapterDelegate(viewModel::onRecordTypeClick), createLoaderAdapterDelegate(), + createDividerAdapterDelegate(), + createInfoAdapterDelegate(), ) } diff --git a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/viewModel/DefaultTypesSelectionViewModel.kt b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/viewModel/DefaultTypesSelectionViewModel.kt index 6cbbf5f6..ab1f0a58 100644 --- a/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/viewModel/DefaultTypesSelectionViewModel.kt +++ b/features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/defaultTypesSelection/viewModel/DefaultTypesSelectionViewModel.kt @@ -7,13 +7,17 @@ import androidx.lifecycle.viewModelScope import com.example.util.simpletimetracker.core.extension.addOrRemove import com.example.util.simpletimetracker.core.extension.set import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper +import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor import com.example.util.simpletimetracker.domain.model.CardOrder import com.example.util.simpletimetracker.domain.model.RecordType import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType +import com.example.util.simpletimetracker.feature_base_adapter.divider.DividerViewData +import com.example.util.simpletimetracker.feature_base_adapter.info.InfoViewData import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData +import com.example.util.simpletimetracker.feature_dialogs.R import com.example.util.simpletimetracker.feature_dialogs.defaultTypesSelection.interactor.GetDefaultRecordTypesInteractor import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -25,6 +29,7 @@ class DefaultTypesSelectionViewModel @Inject constructor( private val prefsInteractor: PrefsInteractor, private val recordTypeViewDataMapper: RecordTypeViewDataMapper, private val getDefaultRecordTypesInteractor: GetDefaultRecordTypesInteractor, + private val resourceRepo: ResourceRepo, ) : ViewModel() { val types: LiveData> by lazy { @@ -37,35 +42,35 @@ class DefaultTypesSelectionViewModel @Inject constructor( } } val close: LiveData = MutableLiveData() - val saveButtonEnabled: LiveData = MutableLiveData(true) + val saveButtonEnabled: LiveData = MutableLiveData(false) private var recordTypes: List = emptyList() - private var typeIdsFiltered: MutableList = mutableListOf() + private var typeIdsSelected: MutableList = mutableListOf() fun onRecordTypeClick(item: RecordTypeViewData) { - typeIdsFiltered.addOrRemove(item.id) + typeIdsSelected.addOrRemove(item.id) updateSaveButtonEnabled() updateRecordTypesViewData() } fun onShowAllClick() { - typeIdsFiltered.clear() + typeIdsSelected.addAll(recordTypes.map { it.id }) updateSaveButtonEnabled() updateRecordTypesViewData() } fun onHideAllClick() { - typeIdsFiltered.addAll(recordTypes.map { it.id }) + typeIdsSelected.clear() updateSaveButtonEnabled() updateRecordTypesViewData() } fun onSaveClick() { - if (typeIdsFiltered.size == recordTypes.size) return + if (typeIdsSelected.size == 0) return saveButtonEnabled.set(false) viewModelScope.launch { - recordTypes.filter { it.id !in typeIdsFiltered }.forEach { + recordTypes.filter { it.id in typeIdsSelected }.forEach { // Remove ids for correct adding in database. recordTypeInteractor.add(it.copy(id = 0)) } @@ -75,7 +80,7 @@ class DefaultTypesSelectionViewModel @Inject constructor( } private fun updateSaveButtonEnabled() { - saveButtonEnabled.set(typeIdsFiltered.size != recordTypes.size) + saveButtonEnabled.set(typeIdsSelected.size != 0) } private fun updateRecordTypesViewData() = viewModelScope.launch { @@ -89,15 +94,36 @@ class DefaultTypesSelectionViewModel @Inject constructor( if (recordTypes.isEmpty()) recordTypes = loadRecordTypes() - return recordTypes.map { recordType -> - recordTypeViewDataMapper.mapFiltered( - recordType = recordType, + fun map(type: RecordType): ViewHolderType { + return recordTypeViewDataMapper.map( + recordType = type, numberOfCards = numberOfCards, isDarkTheme = isDarkTheme, - isFiltered = recordType.id in typeIdsFiltered, isChecked = null, ) } + + val selected = recordTypes + .filter { it.id in typeIdsSelected } + .map(::map) + val available = recordTypes + .filter { it.id !in typeIdsSelected } + .map(::map) + + val result = mutableListOf() + + if (selected.isNotEmpty()) { + result += InfoViewData(resourceRepo.getString(R.string.something_selected)) + result += selected + } else { + result += InfoViewData(resourceRepo.getString(R.string.nothing_selected)) + } + if (available.isNotEmpty()) { + result += DividerViewData(0) + } + result += available + + return result } private suspend fun loadRecordTypes(): List { diff --git a/features/feature_dialogs/src/main/res/layout/default_types_selection_dialog_fragment.xml b/features/feature_dialogs/src/main/res/layout/default_types_selection_dialog_fragment.xml index b52dcea8..cc2933bf 100644 --- a/features/feature_dialogs/src/main/res/layout/default_types_selection_dialog_fragment.xml +++ b/features/feature_dialogs/src/main/res/layout/default_types_selection_dialog_fragment.xml @@ -31,6 +31,7 @@ android:layout_height="0dp" android:layout_marginBottom="8dp" android:layout_weight="1" + android:overScrollMode="never" tools:listitem="@layout/item_record_type_layout" /> @@ -60,7 +61,7 @@ android:ellipsize="marquee" android:paddingHorizontal="0dp" android:singleLine="true" - android:text="@string/types_filter_hide_all" + android:text="@string/select_nothing" app:layout_constraintBottom_toTopOf="@id/btnDefaultTypesSelectionSave" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/btnDefaultTypesSelectionShowAll" />