Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 2 commits into from Oct 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -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() {
Expand All @@ -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()
}
Expand All @@ -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)
dshokouhi marked this conversation as resolved.
Show resolved Hide resolved
return@setOnPreferenceChangeListener true
}
}

SensorReceiver.MANAGERS.sortedBy { it.name }.filter { it.hasSensor(requireContext()) }.forEach { manager ->
val prefCategory = PreferenceCategory(preferenceScreen.context)
prefCategory.title = getString(manager.name)
Expand Down Expand Up @@ -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
}
}
}
7 changes: 7 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -80,6 +80,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>
Expand Down
10 changes: 9 additions & 1 deletion app/src/main/res/xml/sensors.xml
@@ -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>