mirror of
https://github.com/home-assistant/android
synced 2024-09-19 08:01:31 +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
|
package io.homeassistant.companion.android.sensors
|
||||||
|
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceCategory
|
import androidx.preference.PreferenceCategory
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import androidx.preference.SwitchPreference
|
||||||
import io.homeassistant.companion.android.R
|
import io.homeassistant.companion.android.R
|
||||||
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
|
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
|
||||||
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
|
import io.homeassistant.companion.android.common.data.integration.IntegrationRepository
|
||||||
import io.homeassistant.companion.android.database.AppDatabase
|
import io.homeassistant.companion.android.database.AppDatabase
|
||||||
|
import io.homeassistant.companion.android.database.sensor.Sensor
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class SensorsSettingsFragment : PreferenceFragmentCompat() {
|
class SensorsSettingsFragment : PreferenceFragmentCompat() {
|
||||||
|
@ -20,28 +23,59 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() {
|
||||||
private val refresh = object : Runnable {
|
private val refresh = object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
SensorWorker.start(requireContext())
|
SensorWorker.start(requireContext())
|
||||||
|
totalDisabledSensors = 0
|
||||||
|
totalEnabledSensors = 0
|
||||||
val sensorDao = AppDatabase.getInstance(requireContext()).sensorDao()
|
val sensorDao = AppDatabase.getInstance(requireContext()).sensorDao()
|
||||||
SensorReceiver.MANAGERS.forEach { managers ->
|
SensorReceiver.MANAGERS.forEach { managers ->
|
||||||
managers.availableSensors.forEach { basicSensor ->
|
managers.availableSensors.forEach { basicSensor ->
|
||||||
findPreference<Preference>(basicSensor.id)?.let {
|
findPreference<Preference>(basicSensor.id)?.let {
|
||||||
val sensorEntity = sensorDao.get(basicSensor.id)
|
val sensorEntity = sensorDao.get(basicSensor.id)
|
||||||
if (sensorEntity?.enabled == true) {
|
if (sensorEntity?.enabled == true) {
|
||||||
|
totalEnabledSensors += 1
|
||||||
if (basicSensor.unitOfMeasurement.isNullOrBlank())
|
if (basicSensor.unitOfMeasurement.isNullOrBlank())
|
||||||
it.summary = sensorEntity.state
|
it.summary = sensorEntity.state
|
||||||
else
|
else
|
||||||
it.summary = sensorEntity.state + " " + basicSensor.unitOfMeasurement
|
it.summary = sensorEntity.state + " " + basicSensor.unitOfMeasurement
|
||||||
// TODO: Add the icon from mdi:icon?
|
// TODO: Add the icon from mdi:icon?
|
||||||
} else {
|
} else {
|
||||||
|
totalDisabledSensors += 1
|
||||||
it.summary = "Disabled"
|
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)
|
handler.postDelayed(this, 10000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
private var totalEnabledSensors = 0
|
||||||
|
private var totalDisabledSensors = 0
|
||||||
|
private var permissionsAllGranted = true
|
||||||
fun newInstance(): SensorsSettingsFragment {
|
fun newInstance(): SensorsSettingsFragment {
|
||||||
return SensorsSettingsFragment()
|
return SensorsSettingsFragment()
|
||||||
}
|
}
|
||||||
|
@ -56,6 +90,36 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() {
|
||||||
|
|
||||||
setPreferencesFromResource(R.xml.sensors, rootKey)
|
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 ->
|
SensorReceiver.MANAGERS.sortedBy { it.name }.filter { it.hasSensor(requireContext()) }.forEach { manager ->
|
||||||
val prefCategory = PreferenceCategory(preferenceScreen.context)
|
val prefCategory = PreferenceCategory(preferenceScreen.context)
|
||||||
prefCategory.title = getString(manager.name)
|
prefCategory.title = getString(manager.name)
|
||||||
|
@ -96,4 +160,17 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
handler.removeCallbacks(refresh)
|
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="documentation">Documentation</string>
|
||||||
<string name="enable_location_tracking">Enable Location Tracking</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_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_summary">When enabled values will be sent to Home Assistant</string>
|
||||||
<string name="enabled_title">Enabled</string>
|
<string name="enabled_title">Enabled</string>
|
||||||
<string name="entity_attribute_checkbox">Append Attribute Value</string>
|
<string name="entity_attribute_checkbox">Append Attribute Value</string>
|
||||||
|
|
|
@ -1,5 +1,13 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.preference.PreferenceScreen
|
<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>
|
</androidx.preference.PreferenceScreen>
|
Loading…
Reference in a new issue