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