Update filter in Manage Sensors to all/enabled/disabled (#2950)

* Update filter in Manage Sensors to all/enabled/disabled

* Cleanup when (enums are exhaustive)
This commit is contained in:
Joris Pelgröm 2022-10-19 20:47:23 +02:00 committed by GitHub
parent dd800d00ea
commit 0ea8821193
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 27 deletions

View file

@ -51,9 +51,13 @@ class SensorSettingsFragment : Fragment() {
viewModel.setSensorsSearchQuery(null) viewModel.setSensorsSearchQuery(null)
} }
if (viewModel.showOnlyEnabledSensors.value) { when (viewModel.sensorFilter) {
val checkable = menu.findItem(R.id.action_show_only_enabled_sensors) SensorSettingsViewModel.SensorFilter.ALL ->
checkable?.isChecked = true 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 { menu.findItem(R.id.get_help)?.let {
@ -64,9 +68,15 @@ class SensorSettingsFragment : Fragment() {
override fun onOptionsItemSelected(item: MenuItem): Boolean { override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.action_show_only_enabled_sensors -> { R.id.action_show_sensors_all, R.id.action_show_sensors_enabled, R.id.action_show_sensors_disabled -> {
item.isChecked = !item.isChecked item.isChecked = true
viewModel.setShowOnlyEnabledSensors(item.isChecked) 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 return true
} }
} }

View file

@ -1,8 +1,10 @@
package io.homeassistant.companion.android.settings.sensor package io.homeassistant.companion.android.settings.sensor
import android.app.Application import android.app.Application
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
@ -19,16 +21,21 @@ class SensorSettingsViewModel @Inject constructor(
) : ) :
AndroidViewModel(application) { AndroidViewModel(application) {
enum class SensorFilter {
ALL,
ENABLED,
DISABLED
}
private var sensorsList = emptyList<Sensor>() private var sensorsList = emptyList<Sensor>()
var sensors = mutableStateListOf<Sensor>() var sensors = mutableStateListOf<Sensor>()
var searchQuery: String? = null var searchQuery: String? = null
var showOnlyEnabledSensors = mutableStateOf(false) var sensorFilter by mutableStateOf(SensorFilter.ALL)
private set private set
init { init {
viewModelScope.launch { viewModelScope.launch {
// TODO: For some reason we can't inject the sensor dao into this view model.
sensorDao.getAllFlow().collect { sensorDao.getAllFlow().collect {
sensorsList = it sensorsList = it
filterSensorsList() filterSensorsList()
@ -41,8 +48,8 @@ class SensorSettingsViewModel @Inject constructor(
filterSensorsList() filterSensorsList()
} }
fun setShowOnlyEnabledSensors(onlyEnabled: Boolean) { fun setSensorFilterChoice(filter: SensorFilter) {
showOnlyEnabledSensors.value = onlyEnabled sensorFilter = filter
filterSensorsList() filterSensorsList()
} }
@ -61,7 +68,11 @@ class SensorSettingsViewModel @Inject constructor(
app.getString(manager.name).contains(searchQuery!!, true) 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 } } .mapNotNull { sensor -> sensorsList.firstOrNull { it.id == sensor.id } }
) )

View file

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:autoMirrored="true"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0"
android:width="24dp">
<path android:fillColor="@color/colorIcon"
android:fillType="evenOdd"
android:pathData="M20,3H4C2.9,3 2,3.9 2,5v14c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V5C22,3.9 21.1,3 20,3zM10,17H5v-2h5V17zM10,13H5v-2h5V13zM10,9H5V7h5V9zM14.82,15L12,12.16l1.41,-1.41l1.41,1.42L17.99,9l1.42,1.42L14.82,15z"/>
</vector>

View file

@ -23,10 +23,15 @@
android:id="@+id/filter_toolbar_group" android:id="@+id/filter_toolbar_group"
android:checkableBehavior="single"> android:checkableBehavior="single">
<item <item
android:id="@+id/action_show_only_enabled_sensors" android:id="@+id/action_show_sensors_all"
android:checkable="true" android:title="@string/filter_sensors_all"
android:icon="@drawable/ic_fact_check_toolbar_filter" android:checked="true" />
android:title="@string/filter_show_only_enabled_sensors" /> <item
android:id="@+id/action_show_sensors_enabled"
android:title="@string/filter_sensors_enabled" />
<item
android:id="@+id/action_show_sensors_disabled"
android:title="@string/filter_sensors_disabled" />
</group> </group>
</menu> </menu>
</item> </item>

View file

@ -222,7 +222,9 @@
<string name="feedback_settings">Feedback Settings</string> <string name="feedback_settings">Feedback Settings</string>
<string name="filter_notifications">Filter Notifications</string> <string name="filter_notifications">Filter Notifications</string>
<string name="filter_sensors">Filter sensors</string> <string name="filter_sensors">Filter sensors</string>
<string name="filter_show_only_enabled_sensors">Only enabled sensors</string> <string name="filter_sensors_all">All sensors</string>
<string name="filter_sensors_enabled">Enabled sensors</string>
<string name="filter_sensors_disabled">Disabled sensors</string>
<string name="finish">Finish</string> <string name="finish">Finish</string>
<string name="firebase_error_message">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</string> <string name="firebase_error_message">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</string>
<string name="firebase_error_title">Firebase Error</string> <string name="firebase_error_title">Firebase Error</string>