From 0ea882119358667011144c411ceec2b377205cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Wed, 19 Oct 2022 20:47:23 +0200 Subject: [PATCH] Update filter in Manage Sensors to all/enabled/disabled (#2950) * Update filter in Manage Sensors to all/enabled/disabled * Cleanup when (enums are exhaustive) --- .../settings/sensor/SensorSettingsFragment.kt | 22 ++++++++++++++----- .../sensor/SensorSettingsViewModel.kt | 21 +++++++++++++----- .../drawable/ic_fact_check_toolbar_filter.xml | 11 ---------- .../main/res/menu/menu_activity_settings.xml | 13 +++++++---- common/src/main/res/values/strings.xml | 4 +++- 5 files changed, 44 insertions(+), 27 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_fact_check_toolbar_filter.xml diff --git a/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsFragment.kt b/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsFragment.kt index 1ac133da4..08dd83376 100644 --- a/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsFragment.kt @@ -51,9 +51,13 @@ class SensorSettingsFragment : Fragment() { viewModel.setSensorsSearchQuery(null) } - if (viewModel.showOnlyEnabledSensors.value) { - val checkable = menu.findItem(R.id.action_show_only_enabled_sensors) - checkable?.isChecked = true + when (viewModel.sensorFilter) { + SensorSettingsViewModel.SensorFilter.ALL -> + menu.findItem(R.id.action_show_sensors_all)?.isChecked = true + SensorSettingsViewModel.SensorFilter.ENABLED -> + menu.findItem(R.id.action_show_sensors_enabled)?.isChecked = true + SensorSettingsViewModel.SensorFilter.DISABLED -> + menu.findItem(R.id.action_show_sensors_disabled)?.isChecked = true } menu.findItem(R.id.get_help)?.let { @@ -64,9 +68,15 @@ class SensorSettingsFragment : Fragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.action_show_only_enabled_sensors -> { - item.isChecked = !item.isChecked - viewModel.setShowOnlyEnabledSensors(item.isChecked) + R.id.action_show_sensors_all, R.id.action_show_sensors_enabled, R.id.action_show_sensors_disabled -> { + item.isChecked = true + viewModel.setSensorFilterChoice( + when (item.itemId) { + R.id.action_show_sensors_enabled -> SensorSettingsViewModel.SensorFilter.ENABLED + R.id.action_show_sensors_disabled -> SensorSettingsViewModel.SensorFilter.DISABLED + else -> SensorSettingsViewModel.SensorFilter.ALL + } + ) return true } } diff --git a/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsViewModel.kt b/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsViewModel.kt index 5f563e45d..d0ad7de7a 100644 --- a/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsViewModel.kt +++ b/app/src/main/java/io/homeassistant/companion/android/settings/sensor/SensorSettingsViewModel.kt @@ -1,8 +1,10 @@ package io.homeassistant.companion.android.settings.sensor import android.app.Application +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -19,16 +21,21 @@ class SensorSettingsViewModel @Inject constructor( ) : AndroidViewModel(application) { + enum class SensorFilter { + ALL, + ENABLED, + DISABLED + } + private var sensorsList = emptyList() var sensors = mutableStateListOf() var searchQuery: String? = null - var showOnlyEnabledSensors = mutableStateOf(false) + var sensorFilter by mutableStateOf(SensorFilter.ALL) private set init { viewModelScope.launch { - // TODO: For some reason we can't inject the sensor dao into this view model. sensorDao.getAllFlow().collect { sensorsList = it filterSensorsList() @@ -41,8 +48,8 @@ class SensorSettingsViewModel @Inject constructor( filterSensorsList() } - fun setShowOnlyEnabledSensors(onlyEnabled: Boolean) { - showOnlyEnabledSensors.value = onlyEnabled + fun setSensorFilterChoice(filter: SensorFilter) { + sensorFilter = filter filterSensorsList() } @@ -61,7 +68,11 @@ class SensorSettingsViewModel @Inject constructor( app.getString(manager.name).contains(searchQuery!!, true) ) ) && - (!showOnlyEnabledSensors.value || manager.isEnabled(app.applicationContext, sensor.id)) + ( + sensorFilter == SensorFilter.ALL || + (sensorFilter == SensorFilter.ENABLED && manager.isEnabled(app.applicationContext, sensor.id)) || + (sensorFilter == SensorFilter.DISABLED && !manager.isEnabled(app.applicationContext, sensor.id)) + ) } .mapNotNull { sensor -> sensorsList.firstOrNull { it.id == sensor.id } } ) diff --git a/app/src/main/res/drawable/ic_fact_check_toolbar_filter.xml b/app/src/main/res/drawable/ic_fact_check_toolbar_filter.xml deleted file mode 100644 index 8d661bef2..000000000 --- a/app/src/main/res/drawable/ic_fact_check_toolbar_filter.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/app/src/main/res/menu/menu_activity_settings.xml b/app/src/main/res/menu/menu_activity_settings.xml index cf46c39f7..12ab8add2 100644 --- a/app/src/main/res/menu/menu_activity_settings.xml +++ b/app/src/main/res/menu/menu_activity_settings.xml @@ -23,10 +23,15 @@ android:id="@+id/filter_toolbar_group" android:checkableBehavior="single"> + android:id="@+id/action_show_sensors_all" + android:title="@string/filter_sensors_all" + android:checked="true" /> + + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 6b036da3f..266401ad2 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -222,7 +222,9 @@ Feedback Settings Filter Notifications Filter sensors - Only enabled sensors + All sensors + Enabled sensors + Disabled sensors Finish This means you will be unable to receive cloud notifications.\n\nLocal notifications will still be available via persistent connection settings in companion app settings Firebase Error