Allow all sensors to be enabled or disabled at once (#1006)

* Allow all sensors to be enabled or disabled at once

* Review comments
This commit is contained in:
Daniel Shokouhi 2020-10-05 05:43:14 -07:00 committed by GitHub
parent b5d9714524
commit e8efa495d1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 93 additions and 1 deletions

View file

@ -1,14 +1,17 @@
package io.homeassistant.companion.android.sensors
import android.content.pm.PackageManager
import android.os.Bundle
import android.os.Handler
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import io.homeassistant.companion.android.R
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
import io.homeassistant.companion.android.database.AppDatabase
import io.homeassistant.companion.android.database.sensor.Sensor
import javax.inject.Inject
class SensorsSettingsFragment : PreferenceFragmentCompat() {
@ -20,28 +23,59 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() {
private val refresh = object : Runnable {
override fun run() {
SensorWorker.start(requireContext())
totalDisabledSensors = 0
totalEnabledSensors = 0
val sensorDao = AppDatabase.getInstance(requireContext()).sensorDao()
SensorReceiver.MANAGERS.forEach { managers ->
managers.availableSensors.forEach { basicSensor ->
findPreference<Preference>(basicSensor.id)?.let {
val sensorEntity = sensorDao.get(basicSensor.id)
if (sensorEntity?.enabled == true) {
totalEnabledSensors += 1
if (basicSensor.unitOfMeasurement.isNullOrBlank())
it.summary = sensorEntity.state
else
it.summary = sensorEntity.state + " " + basicSensor.unitOfMeasurement
// TODO: Add the icon from mdi:icon?
} else {
totalDisabledSensors += 1
it.summary = "Disabled"
}
}
}
}
findPreference<PreferenceCategory>("enable_disable_category")?.let {
it.summary = getString(R.string.manage_all_sensors_summary, (totalDisabledSensors + totalEnabledSensors))
}
findPreference<SwitchPreference>("enable_disable_sensors")?.let {
if (totalDisabledSensors == 0) {
it.title = getString(R.string.disable_all_sensors, totalEnabledSensors)
it.summary = ""
it.isChecked = permissionsAllGranted
} else {
if (totalEnabledSensors == 0)
it.title = getString(R.string.enable_all_sensors)
else
it.title = getString(R.string.enable_remaining_sensors, totalDisabledSensors)
it.summary = getString(R.string.enable_all_sensors_summary)
it.isChecked = false
}
if (!permissionsAllGranted) {
it.title = getString(R.string.enable_all_sensors)
it.summary = getString(R.string.enable_all_sensors_summary)
}
}
handler.postDelayed(this, 10000)
}
}
companion object {
private var totalEnabledSensors = 0
private var totalDisabledSensors = 0
private var permissionsAllGranted = true
fun newInstance(): SensorsSettingsFragment {
return SensorsSettingsFragment()
}
@ -56,6 +90,36 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() {
setPreferencesFromResource(R.xml.sensors, rootKey)
findPreference<SwitchPreference>("enable_disable_sensors")?.let {
var permArray: Array<String> = arrayOf()
it.setOnPreferenceChangeListener { _, newState ->
val enabledAll = newState as Boolean
val sensorDao = AppDatabase.getInstance(requireContext()).sensorDao()
SensorReceiver.MANAGERS.forEach { managers ->
managers.availableSensors.forEach { basicSensor ->
var sensorEntity = sensorDao.get(basicSensor.id)
if (!managers.checkPermission(requireContext(), basicSensor.id))
permArray += managers.requiredPermissions(basicSensor.id).asList()
if (sensorEntity != null) {
sensorEntity.enabled = enabledAll
sensorEntity.lastSentState = ""
sensorDao.update(sensorEntity)
} else {
sensorEntity = Sensor(basicSensor.id, enabledAll, false, "")
sensorDao.add(sensorEntity)
}
}
}
if (!permArray.isNullOrEmpty())
requestPermissions(permArray, 0)
return@setOnPreferenceChangeListener true
}
}
SensorReceiver.MANAGERS.sortedBy { it.name }.filter { it.hasSensor(requireContext()) }.forEach { manager ->
val prefCategory = PreferenceCategory(preferenceScreen.context)
prefCategory.title = getString(manager.name)
@ -96,4 +160,17 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() {
super.onPause()
handler.removeCallbacks(refresh)
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
findPreference<SwitchPreference>("enable_disable_sensors")?.run {
permissionsAllGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
this.isChecked = permissionsAllGranted
}
}
}

View file

@ -86,6 +86,13 @@ to your home internet.</string>
<string name="documentation">Documentation</string>
<string name="enable_location_tracking">Enable Location Tracking</string>
<string name="enable_location_tracking_description">Enabling this sensor will allow the Home Assistant application to track you location and report it back to your instance of Home Assistant. Ensure that you enable background access to location, otherwise we cannot enable location tracking.</string>
<string name="enable_all_sensors">Enable All Sensors</string>
<string name="enable_remaining_sensors">Enable %1$d Sensors</string>
<string name="enable_all_sensors_summary">All required permissions will be requested upon enabling</string>
<string name="manage_all_sensors">Manage All Sensors</string>
<string name="manage_all_sensors_summary">This device has %1$d available sensors to utilize.</string>
<string name="disable_all_sensors">Disable All %1$d Sensors</string>
<string name="sensors_with_settings">The following sensors offer custom settings: %1$s</string>
<string name="enabled_summary">When enabled values will be sent to Home Assistant</string>
<string name="enabled_title">Enabled</string>
<string name="entity_attribute_checkbox">Append Attribute Value</string>

View file

@ -1,5 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.preference.PreferenceCategory
app:key="enable_disable_category"
app:title="@string/manage_all_sensors">
<androidx.preference.SwitchPreference
app:key="enable_disable_sensors"/>
</androidx.preference.PreferenceCategory>
</androidx.preference.PreferenceScreen>