From 890eec441935791a94efbee9c0b43728354dfd08 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Fri, 20 Jan 2023 19:12:52 +0100 Subject: [PATCH] FilterFragment: add button to reset current settings --- .../vonforst/evmap/fragment/FilterFragment.kt | 6 ++ .../vonforst/evmap/storage/FilterValueDao.kt | 59 +++++++++++++++---- .../evmap/viewmodel/FilterViewModel.kt | 4 ++ app/src/main/res/drawable/ic_filter_no.xml | 10 ++++ app/src/main/res/menu/filter.xml | 6 ++ app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 7 files changed, 76 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/ic_filter_no.xml diff --git a/app/src/main/java/net/vonforst/evmap/fragment/FilterFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/FilterFragment.kt index 813eb7f1..32ec3a6d 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/FilterFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/FilterFragment.kt @@ -98,6 +98,12 @@ class FilterFragment : Fragment(), MenuProvider { saveProfile() true } + R.id.menu_reset -> { + lifecycleScope.launch { + vm.resetValues() + } + true + } else -> false } } diff --git a/app/src/main/java/net/vonforst/evmap/storage/FilterValueDao.kt b/app/src/main/java/net/vonforst/evmap/storage/FilterValueDao.kt index 7202d553..02456bea 100644 --- a/app/src/main/java/net/vonforst/evmap/storage/FilterValueDao.kt +++ b/app/src/main/java/net/vonforst/evmap/storage/FilterValueDao.kt @@ -1,29 +1,49 @@ package net.vonforst.evmap.storage -import androidx.lifecycle.liveData +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData +import androidx.lifecycle.MutableLiveData import androidx.room.* import net.vonforst.evmap.model.* @Dao abstract class FilterValueDao { @Query("SELECT * FROM booleanfiltervalue WHERE profile = :profile AND dataSource = :dataSource") - protected abstract suspend fun getBooleanFilterValues( + protected abstract suspend fun getBooleanFilterValuesAsync( profile: Long, dataSource: String ): List @Query("SELECT * FROM multiplechoicefiltervalue WHERE profile = :profile AND dataSource = :dataSource") - protected abstract suspend fun getMultipleChoiceFilterValues( + protected abstract suspend fun getMultipleChoiceFilterValuesAsync( profile: Long, dataSource: String ): List @Query("SELECT * FROM sliderfiltervalue WHERE profile = :profile AND dataSource = :dataSource") - protected abstract suspend fun getSliderFilterValues( + protected abstract suspend fun getSliderFilterValuesAsync( profile: Long, dataSource: String ): List + @Query("SELECT * FROM booleanfiltervalue WHERE profile = :profile AND dataSource = :dataSource") + protected abstract fun getBooleanFilterValues( + profile: Long, + dataSource: String + ): LiveData> + + @Query("SELECT * FROM multiplechoicefiltervalue WHERE profile = :profile AND dataSource = :dataSource") + protected abstract fun getMultipleChoiceFilterValues( + profile: Long, + dataSource: String + ): LiveData> + + @Query("SELECT * FROM sliderfiltervalue WHERE profile = :profile AND dataSource = :dataSource") + protected abstract fun getSliderFilterValues( + profile: Long, + dataSource: String + ): LiveData> + @Insert(onConflict = OnConflictStrategy.REPLACE) protected abstract suspend fun insert(vararg values: BooleanFilterValue) @@ -58,15 +78,32 @@ abstract class FilterValueDao { if (filterStatus == FILTERS_DISABLED || filterStatus == FILTERS_FAVORITES) { emptyList() } else { - getBooleanFilterValues(filterStatus, dataSource) + - getMultipleChoiceFilterValues(filterStatus, dataSource) + - getSliderFilterValues(filterStatus, dataSource) + getBooleanFilterValuesAsync(filterStatus, dataSource) + + getMultipleChoiceFilterValuesAsync(filterStatus, dataSource) + + getSliderFilterValuesAsync(filterStatus, dataSource) } - open fun getFilterValues(filterStatus: Long, dataSource: String) = liveData { - emit(null) - emit(getFilterValuesAsync(filterStatus, dataSource)) - } + open fun getFilterValues(filterStatus: Long, dataSource: String): LiveData?> = + if (filterStatus == FILTERS_DISABLED || filterStatus == FILTERS_FAVORITES) { + MutableLiveData(emptyList()) + } else { + MediatorLiveData?>().apply { + value = null + val sources = listOf( + getBooleanFilterValues(filterStatus, dataSource), + getMultipleChoiceFilterValues(filterStatus, dataSource), + getSliderFilterValues(filterStatus, dataSource) + ) + for (source in sources) { + addSource(source) { + val values = sources.map { it.value } + if (values.all { it != null }) { + value = values.filterNotNull().flatten() + } + } + } + } + } @Transaction open suspend fun insert(vararg values: FilterValue) { diff --git a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt index 05b5fc96..1e5c1a89 100644 --- a/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt +++ b/app/src/main/java/net/vonforst/evmap/viewmodel/FilterViewModel.kt @@ -92,4 +92,8 @@ class FilterViewModel(application: Application) : AndroidViewModel(application) prefs.filterStatus = FILTERS_DISABLED } } + + suspend fun resetValues() { + db.filterValueDao().deleteFilterValuesForProfile(FILTERS_CUSTOM, prefs.dataSource) + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_filter_no.xml b/app/src/main/res/drawable/ic_filter_no.xml new file mode 100644 index 00000000..0d690be1 --- /dev/null +++ b/app/src/main/res/drawable/ic_filter_no.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/filter.xml b/app/src/main/res/menu/filter.xml index 58c63cae..435323bf 100644 --- a/app/src/main/res/menu/filter.xml +++ b/app/src/main/res/menu/filter.xml @@ -1,6 +1,12 @@ + + Wohnmobilstellplatz Filter anwenden Als Profil speichern + Filter zurücksetzen Keine Filter Verändertes Filterprofil Favoriten diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b612f552..d4399aca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -142,6 +142,7 @@ Caravan site Apply filters Save as profile + Reset filter settings No filters Modified filter Favorites