From b5d9714524fa5b80b6adec61e3f01baf6ba56ae2 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sun, 4 Oct 2020 17:01:13 -0700 Subject: [PATCH] Add keyguard sensors (#1004) --- .../android/sensors/KeyguardSensorManager.kt | 133 ++++++++++++++++++ .../android/sensors/SensorReceiver.kt | 1 + app/src/main/res/values/strings.xml | 9 ++ 3 files changed, 143 insertions(+) create mode 100644 app/src/main/java/io/homeassistant/companion/android/sensors/KeyguardSensorManager.kt diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/KeyguardSensorManager.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/KeyguardSensorManager.kt new file mode 100644 index 000000000..d4f92da09 --- /dev/null +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/KeyguardSensorManager.kt @@ -0,0 +1,133 @@ +package io.homeassistant.companion.android.sensors + +import android.app.KeyguardManager +import android.content.Context +import android.os.Build +import androidx.annotation.RequiresApi +import io.homeassistant.companion.android.R + +class KeyguardSensorManager : SensorManager { + companion object { + private const val TAG = "KeyguardManager" + + val deviceLocked = SensorManager.BasicSensor( + "device_locked", + "binary_sensor", + R.string.basic_sensor_name_device_locked, + R.string.sensor_description_device_locked + ) + val deviceSecure = SensorManager.BasicSensor( + "device_secure", + "binary_sensor", + R.string.basic_sensor_name_device_secure, + R.string.sensor_description_device_secure + ) + val keyguardLocked = SensorManager.BasicSensor( + "keyguard_locked", + "binary_sensor", + R.string.basic_sensor_name_keyguard_locked, + R.string.sensor_description_keyguard_locked + ) + val keyguardSecure = SensorManager.BasicSensor( + "keyguard_secure", + "binary_sensor", + R.string.basic_sensor_name_keyguard_secure, + R.string.sensor_description_keyguard_secure + ) + } + + override val enabledByDefault: Boolean + get() = false + override val name: Int + get() = R.string.sensor_name_keyguard + + override val availableSensors: List + get() = when { + (Build.VERSION.SDK_INT >= 23) -> listOf(deviceLocked, deviceSecure, keyguardLocked, keyguardSecure) + (Build.VERSION.SDK_INT >= 22) -> listOf(deviceLocked, keyguardLocked, keyguardSecure) + else -> listOf(keyguardLocked, keyguardSecure) + } + + override fun requiredPermissions(sensorId: String): Array { + return emptyArray() + } + + override fun requestSensorUpdate( + context: Context + ) { + val km = context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) + updateDeviceLocked(context, km) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) + updateDeviceSecure(context, km) + + updateKeyguardLocked(context, km) + updateKeyguardSecure(context, km) + } + + @RequiresApi(Build.VERSION_CODES.LOLLIPOP_MR1) + private fun updateDeviceLocked(context: Context, km: KeyguardManager) { + + if (!isEnabled(context, deviceLocked.id)) + return + + val isLocked = km.isDeviceLocked + val icon = if (isLocked) "mdi:cellphone-lock" else "mdi:cellphone" + + onSensorUpdated(context, + deviceLocked, + isLocked, + icon, + mapOf() + ) + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun updateDeviceSecure(context: Context, km: KeyguardManager) { + + if (!isEnabled(context, deviceSecure.id)) + return + + val isSecure = km.isDeviceSecure + val icon = if (isSecure) "mdi:cellphone-key" else "mdi:cellphone" + + onSensorUpdated(context, + deviceSecure, + isSecure, + icon, + mapOf() + ) + } + + private fun updateKeyguardLocked(context: Context, km: KeyguardManager) { + + if (!isEnabled(context, keyguardLocked.id)) + return + + val isLocked = km.isKeyguardLocked + val icon = if (isLocked) "mdi:cellphone-lock" else "mdi:cellphone" + + onSensorUpdated(context, + keyguardLocked, + isLocked, + icon, + mapOf() + ) + } + + private fun updateKeyguardSecure(context: Context, km: KeyguardManager) { + + if (!isEnabled(context, keyguardSecure.id)) + return + + val isSecure = km.isKeyguardSecure + val icon = if (isSecure) "mdi:cellphone-key" else "mdi:cellphone" + + onSensorUpdated(context, + keyguardSecure, + isSecure, + icon, + mapOf() + ) + } +} diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt index 902dfc72d..927196891 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorReceiver.kt @@ -28,6 +28,7 @@ class SensorReceiver : BroadcastReceiver() { BluetoothSensorManager(), DNDSensorManager(), GeocodeSensorManager(), + KeyguardSensorManager(), LastRebootSensorManager(), LightSensorManager(), LocationSensorManager(), diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 726051c67..594690afc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,6 +21,10 @@ Authentication Error The \'Username\' and \'Password\' fields must be completed Authentication Requested + Device Locked + Device Secure + Keyguard Locked + Keyguard Secure Detected Activity Next Alarm Battery Health @@ -181,6 +185,10 @@ for Home Assistant like to connect to: Sensor Description + Whether the device is currently locked and requires a PIN, pattern or password to unlock. + Whether the device is secured with a PIN, pattern or password. + Whether the keyguard is currently locked. + Whether the keyguard is secured by a PIN, pattern or password or a SIM card is currently locked. The state of the devices audio mode The state of the devices ringer mode The health of the battery @@ -234,6 +242,7 @@ like to connect to: The signal strength of the device to the WiFi network Whether or not WiFi is enabled on the device Activity Sensors + Keyguard Sensors Alarm Sensor Audio Sensors Audio Mode