mirror of
https://github.com/home-assistant/android
synced 2024-09-18 23:52:51 +00:00
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:
parent
b5d9714524
commit
e8efa495d1
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue