diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b6ef688..0d6a9dac 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -73,6 +73,7 @@ dependencies { implementation(project(":feature_categories")) implementation(project(":feature_change_category")) implementation(project(":feature_change_record_tag")) + implementation(project(":feature_change_activity_filter")) implementation(project(":feature_archive")) implementation(project(":feature_tag_selection")) diff --git a/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt b/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt index 8370ca24..04212c0e 100644 --- a/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt +++ b/app/src/main/java/com/example/util/simpletimetracker/di/NavigationScreenMapModule.kt @@ -1,6 +1,7 @@ package com.example.util.simpletimetracker.di import com.example.util.simpletimetracker.R +import com.example.util.simpletimetracker.feature_change_activity_filter.view.ChangeActivityFilterFragment import com.example.util.simpletimetracker.feature_change_category.view.ChangeCategoryFragment import com.example.util.simpletimetracker.feature_change_record.view.ChangeRecordFragment import com.example.util.simpletimetracker.feature_change_record_tag.view.ChangeRecordTagFragment @@ -13,6 +14,7 @@ import com.example.util.simpletimetracker.navigation.bundleCreator.BundleCreator import com.example.util.simpletimetracker.navigation.bundleCreator.bundleCreatorDelegate import com.example.util.simpletimetracker.navigation.params.screen.ArchiveParams import com.example.util.simpletimetracker.navigation.params.screen.CategoriesParams +import com.example.util.simpletimetracker.navigation.params.screen.ChangeActivityFilterParams import com.example.util.simpletimetracker.navigation.params.screen.ChangeActivityTagFromChangeActivityParams import com.example.util.simpletimetracker.navigation.params.screen.ChangeActivityTagFromTagsParams import com.example.util.simpletimetracker.navigation.params.screen.ChangeRecordFromMainParams @@ -173,4 +175,24 @@ class NavigationScreenMapModule { bundleCreatorDelegate(ChangeRecordTagFragment::createBundle) ) } + + @IntoMap + @Provides + @ScreenKey(ChangeActivityFilterParams.Change::class) + fun changeActivityFilterChange(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_changeActivityFilterFragment, + bundleCreatorDelegate(ChangeActivityFilterFragment::createBundle) + ) + } + + @IntoMap + @Provides + @ScreenKey(ChangeActivityFilterParams.New::class) + fun changeActivityFilterNew(): NavigationData { + return NavigationData( + R.id.action_mainFragment_to_changeActivityFilterFragment, + bundleCreatorDelegate(ChangeActivityFilterFragment::createBundle) + ) + } } \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 941a9baf..d95cf50d 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -19,6 +19,9 @@ + @@ -170,4 +173,9 @@ android:name="com.example.util.simpletimetracker.feature_archive.view.ArchiveFragment" android:label="ArchiveFragment" tools:layout="@layout/archive_fragment" /> + \ No newline at end of file diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ActivityFilterViewDataMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ActivityFilterViewDataMapper.kt new file mode 100644 index 00000000..946c54b5 --- /dev/null +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/ActivityFilterViewDataMapper.kt @@ -0,0 +1,32 @@ +package com.example.util.simpletimetracker.core.mapper + +import com.example.util.simpletimetracker.domain.model.ActivityFilter +import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData +import javax.inject.Inject + +class ActivityFilterViewDataMapper @Inject constructor( + private val colorMapper: ColorMapper, +) { + + fun map( + filter: ActivityFilter, + isDarkTheme: Boolean, + ): ActivityFilterViewData { + val selected = filter.selected + return ActivityFilterViewData( + id = filter.id, + name = filter.name, + iconColor = if (selected) { + colorMapper.toIconColor(isDarkTheme) + } else { + colorMapper.toFilteredIconColor(isDarkTheme) + }, + color = if (selected) { + colorMapper.mapToColorInt(filter.color, isDarkTheme) + } else { + colorMapper.toFilteredColor(isDarkTheme) + }, + selected = selected, + ) + } +} \ No newline at end of file diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml index d993dbf7..bd19e671 100644 --- a/core/src/main/res/values-de/strings.xml +++ b/core/src/main/res/values-de/strings.xml @@ -111,6 +111,10 @@ Zielzeit Benachrichtigung nach der angegebenen Zeit der Erfassung dieser Aktivität anzeigen. + + Speichern + Filter Typ + Datum Zeit @@ -151,6 +155,7 @@ Klicke auf Aktivität, um die Erfassung zu starten Zum Bearbeiten lange klicken Hinz. + Filter hinzufügen Bildschirmeinstellungen diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml index a9656255..bdff01b0 100644 --- a/core/src/main/res/values-es/strings.xml +++ b/core/src/main/res/values-es/strings.xml @@ -111,6 +111,10 @@ Objetivo Mostrar notificación después del tiempo de segimiento especificado de esta actividad. + + Guardar + Tipo de filtro + Fecha Hora @@ -151,6 +155,7 @@ Haga clic en una actividad para iniciar el temporizador Mantenga pulsado para editar Añadir + Añadir filtro Configuración de pantalla diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml index e3674c4a..9838eefa 100644 --- a/core/src/main/res/values-fr/strings.xml +++ b/core/src/main/res/values-fr/strings.xml @@ -111,6 +111,10 @@ Objectif de durée Afficher une notification dès que la durée spécifiée de suivi de cette activité est dépassée. + + Sauvegarder + Type de filtre + Date Heure @@ -151,6 +155,7 @@ Cliquez longuement pour éditer Cliquez longuement pour éditer Ajouter + Ajouter un filtre Paramètres d\'affichage diff --git a/core/src/main/res/values-in/strings.xml b/core/src/main/res/values-in/strings.xml index c00ce870..0d8ad4a4 100644 --- a/core/src/main/res/values-in/strings.xml +++ b/core/src/main/res/values-in/strings.xml @@ -111,6 +111,10 @@ Waktu tujuan Tampilkan notifikasi setelah waktu yang ditentukan dalam melacak kegiatan ini. + + Simpan + Jenis filter + Tanggal Waktu @@ -151,6 +155,7 @@ Ketuk pada kegiatan untuk mulai melacak Ketuk lama untuk menyunting Tambah + Tambahkan filter Pengaturan tampilan diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml index 1e4303ac..bb82ec2a 100644 --- a/core/src/main/res/values-it/strings.xml +++ b/core/src/main/res/values-it/strings.xml @@ -111,6 +111,10 @@ Obiettivo temporale Mostra notifiche dopo il tempo di tracciamento specificato per questa attività. + + Salva + Tipo di filtro + Data Ora @@ -151,6 +155,7 @@ Clicca sull\'attività per iniziare il tracciamento Tieni premuto per modificare Aggiungi + Aggiungi filtro Impostazioni di visualizzazione diff --git a/core/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml index 1ba582a4..aeaade4c 100644 --- a/core/src/main/res/values-ja/strings.xml +++ b/core/src/main/res/values-ja/strings.xml @@ -111,6 +111,10 @@ 目標時間 このアクティビティを追跡して指定時間後に通知を表示します。 + + 保存 + フィルターの種類 + 日 時間 @@ -151,6 +155,7 @@ 計測を開始するアクティビティをタップ 長押しで編集 追加 + フィルタを追加 設定を表示 diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml index 9a552471..cef1f272 100644 --- a/core/src/main/res/values-nl/strings.xml +++ b/core/src/main/res/values-nl/strings.xml @@ -111,6 +111,10 @@ Doeltijd Melding weergeven na het opgegeven tijdstip waarop deze activiteit is gevolgd. + + Opslaan + Filtertype + Datum Tijd @@ -151,6 +155,7 @@ Klik op activiteit om het volgen te starten Lang klikken om te bewerken Toevoegen + Filter toevoegen Scherminstellingen diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml index 6fe88b93..9d1d4670 100644 --- a/core/src/main/res/values-pt/strings.xml +++ b/core/src/main/res/values-pt/strings.xml @@ -111,6 +111,10 @@ Meta Mostrar notificação após atingir o tempo determinado para monitorar esta atividade. + + Salvar + Tipo de filtro + Data Hora @@ -151,6 +155,7 @@ Clique na atividade para começar a monitorar Clique e segure para editar Adicionar + Adicionar filtro Configurações do visor diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml index 70602e1c..48ba67c1 100644 --- a/core/src/main/res/values-ru/strings.xml +++ b/core/src/main/res/values-ru/strings.xml @@ -111,6 +111,10 @@ Время цели Показывать уведомление после указанного времени отслеживания этой активности. + + Сохранить + Тип фильтра + Дата Время @@ -151,6 +155,7 @@ Нажмите на активность, чтобы начать отслеживание Нажмите и удерживайте для редактирования Добав. + Добавить фильтр Настройки отображения diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml index cd87845e..3fe6da67 100644 --- a/core/src/main/res/values-sv/strings.xml +++ b/core/src/main/res/values-sv/strings.xml @@ -111,6 +111,10 @@ Tidsmål Visa notis efter att aktivitet uppnått sitt tidsmål. + + Spara + Filtertyp + Datum Tid @@ -151,6 +155,7 @@ Tryck på en aktivitet för att påbörja tidtagning Håll intryckt för att redigera Lägg till + Lägg till filter Bildskärmsinställningar diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml index d4ab834c..5fc8c010 100644 --- a/core/src/main/res/values-tr/strings.xml +++ b/core/src/main/res/values-tr/strings.xml @@ -111,6 +111,10 @@ Hedef süre Bu aktivite belirtilen süre kadar takip edildiğinde bildirim göster. + + Kaydet + Filtre tipi + Tarih Zaman @@ -151,6 +155,7 @@ Takip etmeye başlamak için bir aktiviteye tıklayın Düzenlemek için uzun dokunun Ekle + Filtre ekle Görüntü ayarları diff --git a/core/src/main/res/values-uk/strings.xml b/core/src/main/res/values-uk/strings.xml index 3b720e02..b3184d84 100644 --- a/core/src/main/res/values-uk/strings.xml +++ b/core/src/main/res/values-uk/strings.xml @@ -111,6 +111,10 @@ Час цілі Показувати сповіщення після вказаного часу відстеження цієї дії. + + Зберегти + Тип фільтра + Дата Час @@ -151,6 +155,7 @@ Натисніть на активність, щоб почати відстеження Натисність та утримуйте для редагування Додати + Додайте фільтр Налаштування дисплея diff --git a/core/src/main/res/values-zh/strings.xml b/core/src/main/res/values-zh/strings.xml index cd52b077..6a1b41af 100644 --- a/core/src/main/res/values-zh/strings.xml +++ b/core/src/main/res/values-zh/strings.xml @@ -111,6 +111,10 @@ 目标时间 追踪此活动经过指定时间后显示通知。 + + 保存 + 过滤器类型 + 日期 时间 @@ -151,6 +155,7 @@ 单击“活动”开始追踪 长按以编辑 添加 + 添加过滤器 显示设置 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 73e21e8b..ae9148a0 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -111,6 +111,10 @@ Goal time Show notification after specified time of tracking this activity. + + Save + Filter type + Date Time @@ -151,6 +155,7 @@ Click on activity to start tracking Long click to edit Add + Add filter Display settings diff --git a/features/feature_change_activity_filter/.gitignore b/features/feature_change_activity_filter/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/features/feature_change_activity_filter/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/features/feature_change_activity_filter/build.gradle.kts b/features/feature_change_activity_filter/build.gradle.kts new file mode 100644 index 00000000..cafb8f14 --- /dev/null +++ b/features/feature_change_activity_filter/build.gradle.kts @@ -0,0 +1,34 @@ +import com.example.util.simpletimetracker.Base +import com.example.util.simpletimetracker.Deps + +plugins { + id("com.android.library") + id("kotlin-android") + id("kotlin-kapt") + id("dagger.hilt.android.plugin") +} + +android { + compileSdkVersion(Base.currentSDK) + + defaultConfig { + minSdkVersion(Base.minSDK) + targetSdkVersion(Base.currentSDK) + versionCode = Base.versionCode + versionName = Base.versionName + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + buildFeatures { + viewBinding = true + } +} + +dependencies { + implementation(project(":core")) + implementation(Deps.Google.dagger) + kapt(Deps.Kapt.dagger) +} diff --git a/features/feature_change_activity_filter/src/main/AndroidManifest.xml b/features/feature_change_activity_filter/src/main/AndroidManifest.xml new file mode 100644 index 00000000..3b966c9f --- /dev/null +++ b/features/feature_change_activity_filter/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/interactor/ChangeActivityFilterViewDataInteractor.kt b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/interactor/ChangeActivityFilterViewDataInteractor.kt new file mode 100644 index 00000000..497d8cd9 --- /dev/null +++ b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/interactor/ChangeActivityFilterViewDataInteractor.kt @@ -0,0 +1,93 @@ +package com.example.util.simpletimetracker.feature_change_activity_filter.interactor + +import com.example.util.simpletimetracker.core.mapper.CategoryViewDataMapper +import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper +import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.interactor.CategoryInteractor +import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor +import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor +import com.example.util.simpletimetracker.domain.model.ActivityFilter +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 javax.inject.Inject + +class ChangeActivityFilterViewDataInteractor @Inject constructor( + private val prefsInteractor: PrefsInteractor, + private val recordTypeInteractor: RecordTypeInteractor, + private val categoryInteractor: CategoryInteractor, + private val recordTypeViewDataMapper: RecordTypeViewDataMapper, + private val categoryViewDataMapper: CategoryViewDataMapper, + private val resourceRepo: ResourceRepo, +) { + + suspend fun getTypesViewData( + type: ActivityFilter.Type, + selectedIds: List, + ): List { + val numberOfCards = prefsInteractor.getNumberOfCards() + val isDarkTheme = prefsInteractor.getDarkMode() + + return when (type) { + is ActivityFilter.Type.Activity -> { + recordTypeInteractor.getAll() + .filter { !it.hidden } + .map { + it.id to recordTypeViewDataMapper.map( + recordType = it, + numberOfCards = numberOfCards, + isDarkTheme = isDarkTheme + ) + } + } + is ActivityFilter.Type.ActivityTag -> { + categoryInteractor.getAll() + .map { + it.id to categoryViewDataMapper.mapActivityTag( + category = it, + isDarkTheme = isDarkTheme + ) + } + } + } + .takeUnless { it.isEmpty() } + ?.let { + val selected = it.filter { it.first in selectedIds }.map { it.second } + val available = it.filter { it.first !in selectedIds }.map { it.second } + selected to available + } + ?.let { (selected, available) -> + val viewData = mutableListOf() + mapSelectedTypesHint( + isEmpty = selected.isEmpty() + ).let(viewData::add) + selected.let(viewData::addAll) + DividerViewData(1) + .takeUnless { available.isEmpty() } + ?.let(viewData::add) + available.let(viewData::addAll) + viewData + } + ?: run { + when (type) { + is ActivityFilter.Type.Activity -> { + recordTypeViewDataMapper.mapToEmpty() + } + is ActivityFilter.Type.ActivityTag -> { + listOf(categoryViewDataMapper.mapToActivityTagsEmpty()) + } + } + } + } +} + +private fun mapSelectedTypesHint(isEmpty: Boolean): ViewHolderType { + return InfoViewData( + text = if (isEmpty) { + "Nothing selected" // TODO add translations + } else { + "Selected:" + } +// .let(resourceRepo::getString) + ) +} \ No newline at end of file diff --git a/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/mapper/ChangeActivityFilterMapper.kt b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/mapper/ChangeActivityFilterMapper.kt new file mode 100644 index 00000000..6b84f26a --- /dev/null +++ b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/mapper/ChangeActivityFilterMapper.kt @@ -0,0 +1,33 @@ +package com.example.util.simpletimetracker.feature_change_activity_filter.mapper + +import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.domain.model.ActivityFilter +import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType +import com.example.util.simpletimetracker.feature_change_activity_filter.R +import com.example.util.simpletimetracker.feature_change_activity_filter.viewData.ChangeActivityFilterTypeSwitchViewData +import javax.inject.Inject + +class ChangeActivityFilterMapper @Inject constructor( + private val resourceRepo: ResourceRepo, +) { + + fun mapToTypeSwitchViewData(type: ActivityFilter.Type): List { + return listOf( + ActivityFilter.Type.Activity, + ActivityFilter.Type.ActivityTag, + ).map { + ChangeActivityFilterTypeSwitchViewData( + type = it, + name = mapToTagTypeName(it), + isSelected = it == type + ) + } + } + + private fun mapToTagTypeName(type: ActivityFilter.Type): String { + return when (type) { + ActivityFilter.Type.Activity -> R.string.activity_hint + ActivityFilter.Type.ActivityTag -> R.string.activity_tag_hint + }.let(resourceRepo::getString) + } +} \ No newline at end of file diff --git a/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/view/ChangeActivityFilterFragment.kt b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/view/ChangeActivityFilterFragment.kt new file mode 100644 index 00000000..5ffd70d9 --- /dev/null +++ b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/view/ChangeActivityFilterFragment.kt @@ -0,0 +1,171 @@ +package com.example.util.simpletimetracker.feature_change_activity_filter.view + +import com.example.util.simpletimetracker.feature_change_activity_filter.databinding.ChangeActivityFilterFragmentBinding as Binding +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.widget.doAfterTextChanged +import androidx.fragment.app.viewModels +import com.example.util.simpletimetracker.core.base.BaseFragment +import com.example.util.simpletimetracker.core.di.BaseViewModelFactory +import com.example.util.simpletimetracker.core.dialog.ColorSelectionDialogListener +import com.example.util.simpletimetracker.core.extension.hideKeyboard +import com.example.util.simpletimetracker.core.extension.observeOnce +import com.example.util.simpletimetracker.core.extension.setSharedTransitions +import com.example.util.simpletimetracker.core.extension.showKeyboard +import com.example.util.simpletimetracker.core.utils.fragmentArgumentDelegate +import com.example.util.simpletimetracker.core.utils.setChooserColor +import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter +import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData +import com.example.util.simpletimetracker.feature_base_adapter.category.createCategoryAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.color.createColorAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.color.createColorPaletteAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmptyAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.info.createInfoAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.recordType.createRecordTypeAdapterDelegate +import com.example.util.simpletimetracker.feature_change_activity_filter.viewModel.ChangeActivityFilterViewModel +import com.example.util.simpletimetracker.feature_views.extension.rotateDown +import com.example.util.simpletimetracker.feature_views.extension.rotateUp +import com.example.util.simpletimetracker.feature_views.extension.setOnClick +import com.example.util.simpletimetracker.feature_views.extension.visible +import com.example.util.simpletimetracker.navigation.params.screen.ChangeActivityFilterParams +import com.google.android.flexbox.FlexDirection +import com.google.android.flexbox.FlexWrap +import com.google.android.flexbox.FlexboxLayoutManager +import com.google.android.flexbox.JustifyContent +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class ChangeActivityFilterFragment : + BaseFragment(), + ColorSelectionDialogListener { + + override val inflater: (LayoutInflater, ViewGroup?, Boolean) -> Binding = Binding::inflate + + @Inject + lateinit var viewModelFactory: BaseViewModelFactory + + private val viewModel: ChangeActivityFilterViewModel by viewModels( + factoryProducer = { viewModelFactory } + ) + private val colorsAdapter: BaseRecyclerAdapter by lazy { + BaseRecyclerAdapter( + createColorAdapterDelegate(viewModel::onColorClick), + createColorPaletteAdapterDelegate(viewModel::onColorPaletteClick), + ) + } + private val typesAdapter: BaseRecyclerAdapter by lazy { + BaseRecyclerAdapter( + createRecordTypeAdapterDelegate(viewModel::onTypeClick), + createCategoryAdapterDelegate(viewModel::onCategoryClick), + createDividerAdapterDelegate(), + createInfoAdapterDelegate(), + createEmptyAdapterDelegate() + ) + } + + private val params: ChangeActivityFilterParams by fragmentArgumentDelegate( + key = ARGS_PARAMS, default = ChangeActivityFilterParams.New + ) + + override fun initUi(): Unit = with(binding) { + setPreview() + + setSharedTransitions( + additionalCondition = { params !is ChangeActivityFilterParams.New }, + transitionName = (params as? ChangeActivityFilterParams.Change)?.transitionName.orEmpty(), + sharedView = previewChangeActivityFilter + ) + + rvChangeActivityFilterColor.apply { + layoutManager = FlexboxLayoutManager(requireContext()).apply { + flexDirection = FlexDirection.ROW + justifyContent = JustifyContent.CENTER + flexWrap = FlexWrap.WRAP + } + adapter = colorsAdapter + } + + rvChangeActivityFilterType.apply { + layoutManager = FlexboxLayoutManager(requireContext()).apply { + flexDirection = FlexDirection.ROW + justifyContent = JustifyContent.CENTER + flexWrap = FlexWrap.WRAP + } + adapter = typesAdapter + } + } + + override fun initUx() = with(binding) { + etChangeActivityFilterName.doAfterTextChanged { viewModel.onNameChange(it.toString()) } + fieldChangeActivityFilterColor.setOnClick(viewModel::onColorChooserClick) + fieldChangeActivityFilterType.setOnClick(viewModel::onTypeChooserClick) + btnChangeActivityFilterSave.setOnClick(viewModel::onSaveClick) + btnChangeActivityFilterDelete.setOnClick(viewModel::onDeleteClick) + buttonsChangeActivityFilterType.listener = viewModel::onFilterTypeClick + } + + override fun initViewModel(): Unit = with(binding) { + with(viewModel) { + extra = params + deleteIconVisibility.observeOnce(viewLifecycleOwner, btnChangeActivityFilterDelete::visible::set) + saveButtonEnabled.observe(btnChangeActivityFilterSave::setEnabled) + deleteButtonEnabled.observe(btnChangeActivityFilterDelete::setEnabled) + filterPreview.observeOnce(viewLifecycleOwner, ::updateUi) + filterPreview.observe(::updatePreview) + colors.observe(colorsAdapter::replace) + filterTypeViewData.observe(buttonsChangeActivityFilterType.adapter::replace) + types.observe(typesAdapter::replace) + flipColorChooser.observe { opened -> + rvChangeActivityFilterColor.visible = opened + fieldChangeActivityFilterColor.setChooserColor(opened) + arrowChangeActivityFilterColor.apply { + if (opened) rotateDown() else rotateUp() + } + } + flipTypesChooser.observe { opened -> + containerChangeActivityFilterActivities.visible = opened + fieldChangeActivityFilterType.setChooserColor(opened) + arrowChangeActivityFilterType.apply { + if (opened) rotateDown() else rotateUp() + } + } + keyboardVisibility.observe { visible -> + if (visible) showKeyboard(etChangeActivityFilterName) else hideKeyboard() + } + } + } + + override fun onColorSelected(colorInt: Int) { + viewModel.onCustomColorSelected(colorInt) + } + + private fun updateUi(item: ActivityFilterViewData) = with(binding) { + etChangeActivityFilterName.setText(item.name) + etChangeActivityFilterName.setSelection(item.name.length) + } + + private fun setPreview() = (params as? ChangeActivityFilterParams.Change)?.preview?.run { + with(binding.previewChangeActivityFilter) { + itemName = name + itemColor = color + } + } + + private fun updatePreview(item: ActivityFilterViewData) { + with(binding.previewChangeActivityFilter) { + itemName = item.name + itemColor = item.color + } + } + + companion object { + private const val ARGS_PARAMS = "args_params" + + fun createBundle(data: ChangeActivityFilterParams): Bundle = Bundle().apply { + putParcelable(ARGS_PARAMS, data) + } + } +} \ No newline at end of file diff --git a/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/viewData/ChangeActivityFilterTypeSwitchViewData.kt b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/viewData/ChangeActivityFilterTypeSwitchViewData.kt new file mode 100644 index 00000000..2705cd7a --- /dev/null +++ b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/viewData/ChangeActivityFilterTypeSwitchViewData.kt @@ -0,0 +1,13 @@ +package com.example.util.simpletimetracker.feature_change_activity_filter.viewData + +import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData +import com.example.util.simpletimetracker.domain.model.ActivityFilter + +data class ChangeActivityFilterTypeSwitchViewData( + val type: ActivityFilter.Type, + override val name: String, + override val isSelected: Boolean, +) : ButtonsRowViewData() { + + override val id: Long = name.hashCode().toLong() +} \ No newline at end of file diff --git a/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/viewModel/ChangeActivityFilterViewModel.kt b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/viewModel/ChangeActivityFilterViewModel.kt new file mode 100644 index 00000000..70b5bf75 --- /dev/null +++ b/features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/viewModel/ChangeActivityFilterViewModel.kt @@ -0,0 +1,288 @@ +package com.example.util.simpletimetracker.feature_change_activity_filter.viewModel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +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.interactor.ColorViewDataInteractor +import com.example.util.simpletimetracker.core.mapper.ActivityFilterViewDataMapper +import com.example.util.simpletimetracker.core.mapper.ColorMapper +import com.example.util.simpletimetracker.core.repo.ResourceRepo +import com.example.util.simpletimetracker.core.view.buttonsRowView.ButtonsRowViewData +import com.example.util.simpletimetracker.domain.extension.flip +import com.example.util.simpletimetracker.domain.extension.orTrue +import com.example.util.simpletimetracker.domain.extension.orZero +import com.example.util.simpletimetracker.domain.interactor.ActivityFilterInteractor +import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor +import com.example.util.simpletimetracker.domain.model.ActivityFilter +import com.example.util.simpletimetracker.domain.model.AppColor +import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType +import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData +import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData +import com.example.util.simpletimetracker.feature_base_adapter.color.ColorViewData +import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData +import com.example.util.simpletimetracker.feature_change_activity_filter.R +import com.example.util.simpletimetracker.feature_change_activity_filter.interactor.ChangeActivityFilterViewDataInteractor +import com.example.util.simpletimetracker.feature_change_activity_filter.mapper.ChangeActivityFilterMapper +import com.example.util.simpletimetracker.feature_change_activity_filter.viewData.ChangeActivityFilterTypeSwitchViewData +import com.example.util.simpletimetracker.navigation.Router +import com.example.util.simpletimetracker.navigation.params.notification.ToastParams +import com.example.util.simpletimetracker.navigation.params.screen.ChangeActivityFilterParams +import com.example.util.simpletimetracker.navigation.params.screen.ColorSelectionDialogParams +import kotlinx.coroutines.launch +import javax.inject.Inject + +class ChangeActivityFilterViewModel @Inject constructor( + private val router: Router, + private val changeActivityFilterViewDataInteractor: ChangeActivityFilterViewDataInteractor, + private val activityFilterInteractor: ActivityFilterInteractor, + private val colorViewDataInteractor: ColorViewDataInteractor, + private val prefsInteractor: PrefsInteractor, + private val activityFilterViewDataMapper: ActivityFilterViewDataMapper, + private val changeActivityFilterMapper: ChangeActivityFilterMapper, + private val resourceRepo: ResourceRepo, + private val colorMapper: ColorMapper, +) : ViewModel() { + + lateinit var extra: ChangeActivityFilterParams + + val filterPreview: LiveData by lazy { + return@lazy MutableLiveData().let { initial -> + viewModelScope.launch { + initializePreview() + initial.value = loadActivityFilterPreviewViewData() + } + initial + } + } + val colors: LiveData> by lazy { + return@lazy MutableLiveData>().let { initial -> + viewModelScope.launch { initial.value = loadColorsViewData() } + initial + } + } + val filterTypeViewData: LiveData> by lazy { + return@lazy MutableLiveData>().let { initial -> + viewModelScope.launch { + initializeSelectedTypes() + initial.value = loadTagTypeViewData() + } + initial + } + } + val types: LiveData> by lazy { + return@lazy MutableLiveData>().let { initial -> + viewModelScope.launch { + initializeSelectedTypes() + initial.value = loadTypesViewData() + } + initial + } + } + val flipColorChooser: LiveData = MutableLiveData() + val flipTypesChooser: LiveData = MutableLiveData() + val deleteButtonEnabled: LiveData = MutableLiveData(true) + val saveButtonEnabled: LiveData = MutableLiveData(true) + val deleteIconVisibility: LiveData by lazy { MutableLiveData(filterId != 0L) } + val keyboardVisibility: LiveData by lazy { MutableLiveData(filterId == 0L) } + + private val filterId: Long get() = (extra as? ChangeActivityFilterParams.Change)?.id.orZero() + private var newSelectedIds: MutableList = mutableListOf() + private var newType: ActivityFilter.Type = ActivityFilter.Type.Activity + private var newName: String = "" + private var newColor: AppColor = AppColor(colorId = (0..ColorMapper.colorsNumber).random(), colorInt = "") + private var wasSelected: Boolean = true + + fun onNameChange(name: String) { + viewModelScope.launch { + if (name != newName) { + newName = name + updateActivityFilterPreview() + } + } + } + + fun onColorChooserClick() { + (keyboardVisibility as MutableLiveData).value = false + (flipColorChooser as MutableLiveData).value = flipColorChooser.value + ?.flip().orTrue() + + if (flipTypesChooser.value == true) { + (flipTypesChooser as MutableLiveData).value = false + } + } + + fun onTypeChooserClick() { + (keyboardVisibility as MutableLiveData).value = false + (flipTypesChooser as MutableLiveData).value = flipTypesChooser.value + ?.flip().orTrue() + + if (flipColorChooser.value == true) { + (flipColorChooser as MutableLiveData).value = false + } + } + + fun onColorClick(item: ColorViewData) { + viewModelScope.launch { + if (item.colorId != newColor.colorId || newColor.colorInt.isNotEmpty()) { + newColor = AppColor(colorId = item.colorId, colorInt = "") + updateActivityFilterPreview() + updateColors() + } + } + } + + fun onColorPaletteClick() { + ColorSelectionDialogParams( + preselectedColor = colorMapper.mapToColorInt( + color = newColor, + isDarkTheme = false // Pass original, not darkened color. + ) + ).let(router::navigate) + } + + fun onCustomColorSelected(colorInt: Int) { + viewModelScope.launch { + if (colorInt.toString() != newColor.colorInt) { + newColor = AppColor(colorId = 0, colorInt = colorInt.toString()) + updateActivityFilterPreview() + updateColors() + } + } + } + + fun onFilterTypeClick(viewData: ButtonsRowViewData) { + if (viewData !is ChangeActivityFilterTypeSwitchViewData) return + viewModelScope.launch { + newType = viewData.type + newSelectedIds.clear() + updateTagTypeViewData() + updateTypesViewData() + } + } + + fun onTypeClick(item: RecordTypeViewData) { + viewModelScope.launch { + if (newType !is ActivityFilter.Type.Activity) { + newType = ActivityFilter.Type.Activity + newSelectedIds.clear() + } + newSelectedIds.addOrRemove(item.id) + updateTypesViewData() + } + } + + fun onCategoryClick(item: CategoryViewData) { + viewModelScope.launch { + if (newType !is ActivityFilter.Type.ActivityTag) { + newType = ActivityFilter.Type.ActivityTag + newSelectedIds.clear() + } + newSelectedIds.addOrRemove(item.id) + updateTypesViewData() + } + } + + fun onDeleteClick() { + (deleteButtonEnabled as MutableLiveData).value = false + viewModelScope.launch { + if (filterId != 0L) { + activityFilterInteractor.remove(filterId) + showMessage(R.string.change_category_removed) + (keyboardVisibility as MutableLiveData).value = false + router.back() + } + } + } + + fun onSaveClick() { + if (newName.isEmpty()) { + showMessage(R.string.change_category_message_choose_name) + return + } + (saveButtonEnabled as MutableLiveData).value = false + viewModelScope.launch { + ActivityFilter( + id = filterId, + selectedIds = newSelectedIds, + type = newType, + name = newName, + color = newColor, + selected = wasSelected, + ).let { + activityFilterInteractor.add(it) + (keyboardVisibility as MutableLiveData).value = false + router.back() + } + } + } + + private suspend fun initializePreview() { + if (extra is ChangeActivityFilterParams.Change) { + activityFilterInteractor.get(filterId)?.let { + newName = it.name + newColor = it.color + wasSelected = it.selected + updateColors() + } + } + } + + private suspend fun initializeSelectedTypes() { + if (extra is ChangeActivityFilterParams.Change) { + activityFilterInteractor.get(filterId)?.let { + newSelectedIds = it.selectedIds.toMutableList() + newType = it.type + } + } + } + + private fun updateActivityFilterPreview() = viewModelScope.launch { + (filterPreview as MutableLiveData).value = loadActivityFilterPreviewViewData() + } + + private suspend fun loadActivityFilterPreviewViewData(): ActivityFilterViewData { + val isDarkTheme = prefsInteractor.getDarkMode() + + return ActivityFilter( + selectedIds = newSelectedIds, + type = newType, + name = newName, + color = newColor, + selected = true, + ).let { activityFilterViewDataMapper.map(it, isDarkTheme) } + } + + private fun updateColors() = viewModelScope.launch { + val data = loadColorsViewData() + colors.set(data) + } + + private suspend fun loadColorsViewData(): List { + return colorViewDataInteractor.getColorsViewData(newColor) + } + + private fun updateTagTypeViewData() { + filterTypeViewData.set(loadTagTypeViewData()) + } + + private fun loadTagTypeViewData(): List { + return changeActivityFilterMapper.mapToTypeSwitchViewData(newType) + } + + private fun updateTypesViewData() = viewModelScope.launch { + val data = loadTypesViewData() + (types as MutableLiveData).value = data + } + + private suspend fun loadTypesViewData(): List { + return changeActivityFilterViewDataInteractor.getTypesViewData(newType, newSelectedIds) + } + + private fun showMessage(stringResId: Int) { + val params = ToastParams(message = resourceRepo.getString(stringResId)) + router.show(params) + } +} diff --git a/features/feature_change_activity_filter/src/main/res/layout/change_activity_filter_fragment.xml b/features/feature_change_activity_filter/src/main/res/layout/change_activity_filter_fragment.xml new file mode 100644 index 00000000..2a42ea67 --- /dev/null +++ b/features/feature_change_activity_filter/src/main/res/layout/change_activity_filter_fragment.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/interactor/RunningRecordsViewDataInteractor.kt b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/interactor/RunningRecordsViewDataInteractor.kt index 72d3874c..2fdf132a 100644 --- a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/interactor/RunningRecordsViewDataInteractor.kt +++ b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/interactor/RunningRecordsViewDataInteractor.kt @@ -1,5 +1,6 @@ package com.example.util.simpletimetracker.feature_running_records.interactor +import com.example.util.simpletimetracker.core.mapper.ActivityFilterViewDataMapper import com.example.util.simpletimetracker.domain.interactor.ActivityFilterInteractor import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor @@ -21,6 +22,7 @@ class RunningRecordsViewDataInteractor @Inject constructor( private val activityFilterInteractor: ActivityFilterInteractor, private val recordTypeCategoryInteractor: RecordTypeCategoryInteractor, private val mapper: RunningRecordViewDataMapper, + private val activityFilterViewDataMapper: ActivityFilterViewDataMapper, ) { suspend fun getViewData(): List { @@ -57,7 +59,7 @@ class RunningRecordsViewDataInteractor @Inject constructor( val filtersViewData = activityFilters .map { - mapper.map( + activityFilterViewDataMapper.map( filter = it, isDarkTheme = isDarkTheme, ) diff --git a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt index 47fe0179..aa86cb29 100644 --- a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt +++ b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordViewDataMapper.kt @@ -7,13 +7,11 @@ import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper import com.example.util.simpletimetracker.core.mapper.TimeMapper import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.domain.extension.getFullName -import com.example.util.simpletimetracker.domain.model.ActivityFilter import com.example.util.simpletimetracker.domain.model.RecordTag import com.example.util.simpletimetracker.domain.model.RecordType import com.example.util.simpletimetracker.domain.model.RunningRecord import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterAddViewData -import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData import com.example.util.simpletimetracker.feature_base_adapter.empty.EmptyViewData import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData import com.example.util.simpletimetracker.feature_running_records.R @@ -74,28 +72,6 @@ class RunningRecordViewDataMapper @Inject constructor( ) } - fun map( - filter: ActivityFilter, - isDarkTheme: Boolean, - ): ActivityFilterViewData { - val selected = filter.selected - return ActivityFilterViewData( - id = filter.id, - name = filter.name, - iconColor = if (selected) { - colorMapper.toIconColor(isDarkTheme) - } else { - colorMapper.toFilteredIconColor(isDarkTheme) - }, - color = if (selected) { - colorMapper.mapToColorInt(filter.color, isDarkTheme) - } else { - colorMapper.toFilteredColor(isDarkTheme) - }, - selected = selected, - ) - } - fun mapToTypesEmpty(): ViewHolderType { return EmptyViewData( message = R.string.running_records_types_empty.let(resourceRepo::getString) @@ -127,7 +103,7 @@ class RunningRecordViewDataMapper @Inject constructor( isDarkTheme: Boolean, ): ActivityFilterAddViewData { return ActivityFilterAddViewData( - name = "Add filter", + name = resourceRepo.getString(R.string.running_records_add_filter), color = colorMapper.toInactiveColor(isDarkTheme) ) } diff --git a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewModel/RunningRecordsViewModel.kt b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewModel/RunningRecordsViewModel.kt index d9e06231..3f5851b5 100644 --- a/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewModel/RunningRecordsViewModel.kt +++ b/features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewModel/RunningRecordsViewModel.kt @@ -8,10 +8,7 @@ import com.example.util.simpletimetracker.core.extension.toParams import com.example.util.simpletimetracker.core.interactor.AddRunningRecordMediator import com.example.util.simpletimetracker.core.interactor.RemoveRunningRecordMediator import com.example.util.simpletimetracker.domain.interactor.ActivityFilterInteractor -import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor -import com.example.util.simpletimetracker.domain.model.ActivityFilter -import com.example.util.simpletimetracker.domain.model.AppColor import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.ActivityFilterViewData import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData @@ -21,6 +18,7 @@ import com.example.util.simpletimetracker.feature_running_records.viewData.Runni import com.example.util.simpletimetracker.feature_running_records.viewData.RunningRecordViewData import com.example.util.simpletimetracker.feature_views.TransitionNames import com.example.util.simpletimetracker.navigation.Router +import com.example.util.simpletimetracker.navigation.params.screen.ChangeActivityFilterParams import com.example.util.simpletimetracker.navigation.params.screen.ChangeRecordTypeParams import com.example.util.simpletimetracker.navigation.params.screen.ChangeRunningRecordParams import com.example.util.simpletimetracker.navigation.params.screen.RecordTagSelectionParams @@ -37,7 +35,6 @@ class RunningRecordsViewModel @Inject constructor( private val removeRunningRecordMediator: RemoveRunningRecordMediator, private val runningRecordInteractor: RunningRecordInteractor, private val runningRecordsViewDataInteractor: RunningRecordsViewDataInteractor, - private val recordTypeInteractor: RecordTypeInteractor, private val activityFilterInteractor: ActivityFilterInteractor, ) : ViewModel() { @@ -122,28 +119,23 @@ class RunningRecordsViewModel @Inject constructor( } fun onActivityFilterLongClick(item: ActivityFilterViewData, sharedElements: Pair) { - // TODO navigate - viewModelScope.launch { - activityFilterInteractor.remove(item.id) - updateRunningRecords() - } + router.navigate( + data = ChangeActivityFilterParams.Change( + transitionName = sharedElements.second, + id = item.id, + preview = ChangeActivityFilterParams.Change.Preview( + name = item.name, + color = item.color + ) + ), + sharedElements = sharedElements.let(::mapOf) + ) } fun onAddActivityFilterClick() = viewModelScope.launch { - // TODO navigate - activityFilterInteractor.add( - ActivityFilter( - selectedIds = recordTypeInteractor.getAll().map { it.id }.shuffled().take(3), - type = ActivityFilter.Type.Activity, - name = "Test ${(1..100).random()}", - color = AppColor( - colorId = 2, - colorInt = "", - ), - selected = true, - ) + router.navigate( + data = ChangeActivityFilterParams.New, ) - updateRunningRecords() } fun onVisible() { diff --git a/features/feature_views/src/main/res/layout/activity_filter_view_layout.xml b/features/feature_views/src/main/res/layout/activity_filter_view_layout.xml index 35dee102..3bbe0fb3 100644 --- a/features/feature_views/src/main/res/layout/activity_filter_view_layout.xml +++ b/features/feature_views/src/main/res/layout/activity_filter_view_layout.xml @@ -22,6 +22,7 @@ android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" + android:gravity="center" android:paddingVertical="6dp" android:textColor="?appLightTextColor" android:textSize="12sp" diff --git a/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ChangeActivityFilterParams.kt b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ChangeActivityFilterParams.kt new file mode 100644 index 00000000..50f86f07 --- /dev/null +++ b/navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/screen/ChangeActivityFilterParams.kt @@ -0,0 +1,25 @@ +package com.example.util.simpletimetracker.navigation.params.screen + +import android.os.Parcelable +import androidx.annotation.ColorInt +import kotlinx.parcelize.Parcelize + +sealed interface ChangeActivityFilterParams : ScreenParams, Parcelable { + + @Parcelize + data class Change( + val transitionName: String, + val id: Long, + val preview: Preview? = null, + ) : ChangeActivityFilterParams { + + @Parcelize + data class Preview( + val name: String, + @ColorInt val color: Int, + ) : Parcelable + } + + @Parcelize + object New : ChangeActivityFilterParams +} \ No newline at end of file