mirror of
https://github.com/home-assistant/android
synced 2024-10-15 12:32:54 +00:00
Initial commit of next alarm sensor (#726)
* Initial commit of next alarm sensor * Lint * Review comments * Remove extra spacing
This commit is contained in:
parent
e7e4a25e38
commit
4354e817c6
|
@ -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)) {
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,4 +8,6 @@ import io.homeassistant.companion.android.common.dagger.AppComponent
|
|||
interface SensorComponent {
|
||||
|
||||
fun inject(worker: SensorWorker)
|
||||
|
||||
fun inject(receiver: NextAlarmReceiver)
|
||||
}
|
||||
|
|
|
@ -11,7 +11,8 @@ class AllSensorsUpdaterImpl(
|
|||
override suspend fun getManagers(): List<SensorManager> {
|
||||
val sensorManagers = mutableListOf(
|
||||
BatterySensorManager(),
|
||||
NetworkSensorManager()
|
||||
NetworkSensorManager(),
|
||||
NextAlarmManager()
|
||||
)
|
||||
|
||||
return sensorManagers
|
||||
|
|
Loading…
Reference in a new issue