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