diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/NextAlarmManager.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/NextAlarmManager.kt
index 67e9e8dc0..e36e43c47 100644
--- a/app/src/main/java/io/homeassistant/companion/android/sensors/NextAlarmManager.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/sensors/NextAlarmManager.kt
@@ -4,6 +4,8 @@ import android.app.AlarmManager
import android.content.Context
import android.util.Log
import io.homeassistant.companion.android.R
+import io.homeassistant.companion.android.database.AppDatabase
+import io.homeassistant.companion.android.database.sensor.Setting
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
@@ -13,6 +15,7 @@ import java.util.TimeZone
class NextAlarmManager : SensorManager {
companion object {
private const val TAG = "NextAlarm"
+ private const val ALLOW_LIST = "Allow List"
val nextAlarm = SensorManager.BasicSensor(
"next_alarm",
@@ -51,6 +54,10 @@ class NextAlarmManager : SensorManager {
var utc = "unavailable"
var pendingIntent = ""
+ val sensorDao = AppDatabase.getInstance(context).sensorDao()
+ val sensorSetting = sensorDao.getSettings(nextAlarm.id)
+ val allowPackageList = sensorSetting?.firstOrNull { it.name == ALLOW_LIST }?.value ?: ""
+
try {
val alarmManager: AlarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
@@ -58,6 +65,15 @@ class NextAlarmManager : SensorManager {
val alarmClockInfo = alarmManager.nextAlarmClock
if (alarmClockInfo != null) {
+ pendingIntent = alarmClockInfo.showIntent?.creatorPackage ?: "Unknown"
+
+ if (allowPackageList != "") {
+ val allowPackageListing = allowPackageList.split(", ")
+ if (pendingIntent !in allowPackageListing)
+ return
+ } else {
+ sensorDao.add(Setting(nextAlarm.id, ALLOW_LIST, allowPackageList, "list-apps"))
+ }
triggerTime = alarmClockInfo.triggerTime
val cal: Calendar = GregorianCalendar()
@@ -68,8 +84,6 @@ class NextAlarmManager : SensorManager {
val sdf = SimpleDateFormat(dateFormat)
sdf.timeZone = TimeZone.getTimeZone("UTC")
utc = sdf.format(Date(triggerTime))
-
- pendingIntent = alarmClockInfo.showIntent?.creatorPackage ?: "Unknown"
}
} catch (e: Exception) {
Log.e(TAG, "Error getting the next alarm info", e)
diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt
index 9dd8ca43f..f3d9480f6 100644
--- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt
+++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt
@@ -5,6 +5,7 @@ import android.os.Bundle
import android.os.Handler
import android.text.InputType
import androidx.preference.EditTextPreference
+import androidx.preference.MultiSelectListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat
@@ -177,8 +178,10 @@ class SensorDetailFragment(
pref.dialogTitle = setting.name
if (pref.text != null)
pref.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
- else
+ else {
pref.summary = setting.value
+ pref.text = setting.value
+ }
pref.isIconSpaceReserved = false
pref.setOnBindEditTextListener { fieldType ->
@@ -186,19 +189,53 @@ class SensorDetailFragment(
fieldType.inputType = InputType.TYPE_CLASS_NUMBER
}
- if (pref.text != null)
+ pref.setOnPreferenceChangeListener { _, newValue ->
sensorDao.add(
Setting(
basicSensor.id,
setting.name,
- pref.text,
+ newValue as String,
setting.valueType
)
)
- else
- pref.text = setting.value
+ return@setOnPreferenceChangeListener true
+ }
if (!it.contains(pref))
it.addPreference(pref)
+ } else if (setting.valueType == "list-apps") {
+ val packageManager: PackageManager? = context?.packageManager
+ val packages = packageManager?.getInstalledApplications(PackageManager.GET_META_DATA)
+ val packageName: MutableList = ArrayList()
+ if (packages != null) {
+ for (packageItem in packages) {
+ packageName.add(packageItem.packageName)
+ }
+ packageName.sort()
+ }
+ val pref = findPreference(key) ?: MultiSelectListPreference(requireContext())
+ pref.key = key
+ pref.title = setting.name
+ pref.entries = packageName.toTypedArray()
+ pref.entryValues = packageName.toTypedArray()
+ pref.dialogTitle = setting.name
+ pref.isIconSpaceReserved = false
+ pref.setOnPreferenceChangeListener { _, newValue ->
+ sensorDao.add(
+ Setting(
+ basicSensor.id,
+ setting.name,
+ newValue.toString().replace("[", "").replace("]", ""),
+ "list-apps"
+ )
+ )
+ return@setOnPreferenceChangeListener true
+ }
+ if (pref.values != null)
+ pref.summary = pref.values.toString()
+ else
+ pref.summary = setting.value
+ if (!it.contains(pref))
+ it.addPreference(pref)
}
}
it.isVisible = true
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b6bf4abed..ee3dd4d4e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -202,7 +202,7 @@ like to connect to:
Import existing Home Assistant zones as geofences for zone based tracking. The Minimum Accuracy setting will allow you to decide how accurate the device location (in meters) has to be in order to send to Home Assistant.
Whether or not the microphone is muted on the device
Whether or not music is actively playing on the device
- The date and time of the next scheduled alarm, any app or manufacturer can override the default behavior. The package attribute will tell you which app set the next scheduled alarm.
+ The date and time of the next scheduled alarm, any app or manufacturer can override the default behavior. The package attribute will tell you which app set the next scheduled alarm. The setting below will create an Allow List so you can specify what packages you want the alarm event from. This will ignore alarm events for packages not selected and the state will not update until the next scheduled alarm matches one of the selected packages.
No description
Whether or not the phone is ringing or in a call, no other caller information is stored
Whether or not the device is in Power Save mode