From f797d47dfca51c70b10d5a899d30292fe4a03ef4 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sun, 4 Oct 2020 12:39:50 -0700 Subject: [PATCH 1/2] Allow all sensors to be enabled or disabled at once --- .../sensors/SensorsSettingsFragment.kt | 82 ++++++++++++++++++- app/src/main/res/values/strings.xml | 7 ++ app/src/main/res/xml/sensors.xml | 14 +++- 3 files changed, 100 insertions(+), 3 deletions(-) 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 17f9fbb6187..53f4c3b84e8 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 @@ -5,10 +5,12 @@ 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 +22,73 @@ 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 -> + SensorReceiver.MANAGERS.sortedBy { it.name }.filter { it.hasSensor(requireContext()) }.forEach { managers -> + managers.availableSensors.sortedBy { it.name }.forEach { basicSensor -> findPreference(basicSensor.id)?.let { val sensorEntity = sensorDao.get(basicSensor.id) + val sensorSettings = sensorDao.getSettings(basicSensor.id) + if (!sensorSettings.isNullOrEmpty()) { + sensorSettings.forEach { setting -> + if (!setting.name.isNullOrBlank()) + if (getString(basicSensor.name) !in sensorsWithSettings) { + sensorsWithSettings += getString(basicSensor.name) + sensorsWithSettings.sort() + } + } + } 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 = true + } else { + if ((totalDisabledSensors + totalEnabledSensors) == totalDisabledSensors) + 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 + } + } + + findPreference("sensors_with_settings")?.let { + it.summary = getString( + R.string.sensors_with_settings, + sensorsWithSettings.asList().toString().replace("[", "").replace("]", "") + ) + it.isVisible = !sensorsWithSettings.isNullOrEmpty() + } + handler.postDelayed(this, 10000) } } companion object { + private var totalEnabledSensors = 0 + private var totalDisabledSensors = 0 + private var sensorsWithSettings: Array = arrayOf() fun newInstance(): SensorsSettingsFragment { return SensorsSettingsFragment() } @@ -56,6 +103,37 @@ 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) + handler.postDelayed(refresh, 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) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 94eb6ffb4f5..4e45f2eed59 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,6 +80,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 8bee1825703..ea439c0b63a 100644 --- a/app/src/main/res/xml/sensors.xml +++ b/app/src/main/res/xml/sensors.xml @@ -1,5 +1,17 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + \ No newline at end of file From 1b2660fceae6071659888116158184761c2bf5c5 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sun, 4 Oct 2020 21:25:30 -0700 Subject: [PATCH 2/2] Review comments --- .../sensors/SensorsSettingsFragment.kt | 47 +++++++++---------- app/src/main/res/xml/sensors.xml | 4 -- 2 files changed, 23 insertions(+), 28 deletions(-) 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 53f4c3b84e8..80fdd871435 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,5 +1,6 @@ package io.homeassistant.companion.android.sensors +import android.content.pm.PackageManager import android.os.Bundle import android.os.Handler import androidx.preference.Preference @@ -25,20 +26,10 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() { totalDisabledSensors = 0 totalEnabledSensors = 0 val sensorDao = AppDatabase.getInstance(requireContext()).sensorDao() - SensorReceiver.MANAGERS.sortedBy { it.name }.filter { it.hasSensor(requireContext()) }.forEach { managers -> - managers.availableSensors.sortedBy { it.name }.forEach { basicSensor -> + SensorReceiver.MANAGERS.forEach { managers -> + managers.availableSensors.forEach { basicSensor -> findPreference(basicSensor.id)?.let { val sensorEntity = sensorDao.get(basicSensor.id) - val sensorSettings = sensorDao.getSettings(basicSensor.id) - if (!sensorSettings.isNullOrEmpty()) { - sensorSettings.forEach { setting -> - if (!setting.name.isNullOrBlank()) - if (getString(basicSensor.name) !in sensorsWithSettings) { - sensorsWithSettings += getString(basicSensor.name) - sensorsWithSettings.sort() - } - } - } if (sensorEntity?.enabled == true) { totalEnabledSensors += 1 if (basicSensor.unitOfMeasurement.isNullOrBlank()) @@ -62,23 +53,19 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() { if (totalDisabledSensors == 0) { it.title = getString(R.string.disable_all_sensors, totalEnabledSensors) it.summary = "" - it.isChecked = true + it.isChecked = permissionsAllGranted } else { - if ((totalDisabledSensors + totalEnabledSensors) == totalDisabledSensors) + 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 } - } - - findPreference("sensors_with_settings")?.let { - it.summary = getString( - R.string.sensors_with_settings, - sensorsWithSettings.asList().toString().replace("[", "").replace("]", "") - ) - it.isVisible = !sensorsWithSettings.isNullOrEmpty() + if (!permissionsAllGranted) { + it.title = getString(R.string.enable_all_sensors) + it.summary = getString(R.string.enable_all_sensors_summary) + } } handler.postDelayed(this, 10000) @@ -88,7 +75,7 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() { companion object { private var totalEnabledSensors = 0 private var totalDisabledSensors = 0 - private var sensorsWithSettings: Array = arrayOf() + private var permissionsAllGranted = true fun newInstance(): SensorsSettingsFragment { return SensorsSettingsFragment() } @@ -129,7 +116,6 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() { } if (!permArray.isNullOrEmpty()) requestPermissions(permArray, 0) - handler.postDelayed(refresh, 0) return@setOnPreferenceChangeListener true } } @@ -174,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/xml/sensors.xml b/app/src/main/res/xml/sensors.xml index ea439c0b63a..9ff85feef95 100644 --- a/app/src/main/res/xml/sensors.xml +++ b/app/src/main/res/xml/sensors.xml @@ -6,10 +6,6 @@ -