From e8efa495d1c3a83d0592940161901f084accca4a Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Mon, 5 Oct 2020 05:43:14 -0700 Subject: [PATCH] Allow all sensors to be enabled or disabled at once (#1006) * Allow all sensors to be enabled or disabled at once * Review comments --- .../sensors/SensorsSettingsFragment.kt | 77 +++++++++++++++++++ app/src/main/res/values/strings.xml | 7 ++ app/src/main/res/xml/sensors.xml | 10 ++- 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt index 17f9fbb61..80fdd8714 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt @@ -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(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("enable_disable_category")?.let { + it.summary = getString(R.string.manage_all_sensors_summary, (totalDisabledSensors + totalEnabledSensors)) + } + + findPreference("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("enable_disable_sensors")?.let { + + var permArray: Array = 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, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + findPreference("enable_disable_sensors")?.run { + permissionsAllGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } + this.isChecked = permissionsAllGranted + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 594690afc..771a64891 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,6 +86,13 @@ to your home internet. Documentation Enable Location Tracking 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. + Enable All Sensors + Enable %1$d Sensors + All required permissions will be requested upon enabling + Manage All Sensors + This device has %1$d available sensors to utilize. + Disable All %1$d Sensors + The following sensors offer custom settings: %1$s When enabled values will be sent to Home Assistant Enabled Append Attribute Value diff --git a/app/src/main/res/xml/sensors.xml b/app/src/main/res/xml/sensors.xml index 8bee18257..9ff85feef 100644 --- a/app/src/main/res/xml/sensors.xml +++ b/app/src/main/res/xml/sensors.xml @@ -1,5 +1,13 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + \ No newline at end of file