Initial commit of next alarm sensor (#726)

* Initial commit of next alarm sensor

* Lint

* Review comments

* Remove extra spacing
This commit is contained in:
Daniel Shokouhi 2020-08-10 20:57:29 -07:00 committed by GitHub
parent e7e4a25e38
commit 4354e817c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 139 additions and 2 deletions

View file

@ -13,7 +13,8 @@ class AllSensorsUpdaterImpl(
override suspend fun getManagers(): List<SensorManager> {
val sensorManagers = mutableListOf(
BatterySensorManager(),
NetworkSensorManager()
NetworkSensorManager(),
NextAlarmManager()
)
if (integrationUseCase.isBackgroundTrackingEnabled() && PermissionManager.checkLocationPermission(appContext)) {

View file

@ -88,6 +88,13 @@
</intent-filter>
</receiver>
<receiver android:name=".sensors.NextAlarmReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.app.action.NEXT_ALARM_CLOCK_CHANGED" />
</intent-filter>
</receiver>
<activity android:name=".launch.LaunchActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View file

@ -0,0 +1,86 @@
package io.homeassistant.companion.android.sensors
import android.app.AlarmManager
import android.content.Context
import android.util.Log
import io.homeassistant.companion.android.domain.integration.Sensor
import io.homeassistant.companion.android.domain.integration.SensorRegistration
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.GregorianCalendar
import java.util.TimeZone
class NextAlarmManager : SensorManager {
companion object {
private const val TAG = "NextAlarm"
}
override fun getSensorRegistrations(context: Context): List<SensorRegistration<Any>> {
val sensorRegistrations = mutableListOf<SensorRegistration<Any>>()
getNextAlarm(context)?.let {
sensorRegistrations.add(
SensorRegistration(
it,
"Next Alarm",
"timestamp"
)
)
}
return sensorRegistrations
}
override fun getSensors(context: Context): List<Sensor<Any>> {
val sensors = mutableListOf<Sensor<Any>>()
getNextAlarm(context)?.let {
sensors.add(it)
}
return sensors
}
private fun getNextAlarm(context: Context): Sensor<Any>? {
var triggerTime = 0L
var local = ""
var utc = "unavailable"
try {
val alarmManager: AlarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val alarmClockInfo = alarmManager.nextAlarmClock
if (alarmClockInfo != null) {
triggerTime = alarmClockInfo.triggerTime
val cal: Calendar = GregorianCalendar()
cal.timeInMillis = triggerTime
local = cal.time.toString()
val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
val sdf = SimpleDateFormat(dateFormat)
sdf.timeZone = TimeZone.getTimeZone("UTC")
utc = sdf.format(Date(triggerTime))
}
} catch (e: Exception) {
Log.e(TAG, "Error getting the next alarm info", e)
}
val icon = "mdi:alarm"
return Sensor(
"next_alarm",
utc,
"sensor",
icon,
mapOf(
"Local Time" to local,
"Time in Milliseconds" to triggerTime
)
)
}
}

View file

@ -0,0 +1,40 @@
package io.homeassistant.companion.android.sensors
import android.app.AlarmManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import io.homeassistant.companion.android.common.dagger.GraphComponentAccessor
import io.homeassistant.companion.android.domain.integration.IntegrationUseCase
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
class NextAlarmReceiver() : BroadcastReceiver() {
@Inject
lateinit var integrationUseCase: IntegrationUseCase
private val ioScope = CoroutineScope(Dispatchers.IO)
var updateJob: Job? = null
override fun onReceive(context: Context, intent: Intent) {
val isBootIntent = Intent.ACTION_BOOT_COMPLETED.equals(intent.action, ignoreCase = true)
val isNextAlarmIntent =
AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(intent.action, ignoreCase = true)
if (!isBootIntent && !isNextAlarmIntent) {
return
}
DaggerSensorComponent
.builder()
.appComponent((context.applicationContext as GraphComponentAccessor).appComponent)
.build()
.inject(this)
updateJob?.cancel()
updateJob = ioScope.launch {
AllSensorsUpdaterImpl(integrationUseCase, context).updateSensors()
}
}
}

View file

@ -8,4 +8,6 @@ import io.homeassistant.companion.android.common.dagger.AppComponent
interface SensorComponent {
fun inject(worker: SensorWorker)
fun inject(receiver: NextAlarmReceiver)
}

View file

@ -11,7 +11,8 @@ class AllSensorsUpdaterImpl(
override suspend fun getManagers(): List<SensorManager> {
val sensorManagers = mutableListOf(
BatterySensorManager(),
NetworkSensorManager()
NetworkSensorManager(),
NextAlarmManager()
)
return sensorManagers