AndroidAPS/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt

146 lines
6.8 KiB
Kotlin
Raw Normal View History

2019-12-24 16:07:17 +01:00
package info.nightscout.androidaps.receivers
import android.app.AlarmManager
import android.app.PendingIntent
import android.app.PendingIntent.CanceledException
import android.content.Context
import android.content.Intent
import android.os.PowerManager
import android.os.SystemClock
2019-12-30 00:53:44 +01:00
import dagger.android.DaggerBroadcastReceiver
2020-05-09 10:52:20 +02:00
import info.nightscout.androidaps.BuildConfig
2020-01-03 21:02:36 +01:00
import info.nightscout.androidaps.Config
2019-12-24 16:07:17 +01:00
import info.nightscout.androidaps.events.EventProfileNeedsUpdate
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.CommandQueueProvider
2020-05-09 10:52:20 +02:00
import info.nightscout.androidaps.interfaces.ProfileFunction
2019-12-30 00:53:44 +01:00
import info.nightscout.androidaps.logging.AAPSLogger
2020-01-06 15:22:28 +01:00
import info.nightscout.androidaps.logging.LTag
2020-01-03 01:45:26 +01:00
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
2019-12-30 00:53:44 +01:00
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
2019-12-24 16:07:17 +01:00
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
2020-01-10 23:14:58 +01:00
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
2019-12-24 16:07:17 +01:00
import info.nightscout.androidaps.queue.commands.Command
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.LocalAlertUtils
import info.nightscout.androidaps.utils.T
2019-12-30 00:53:44 +01:00
import javax.inject.Inject
2019-12-24 16:07:17 +01:00
import kotlin.math.abs
2019-12-30 00:53:44 +01:00
class KeepAliveReceiver : DaggerBroadcastReceiver() {
2019-12-30 00:53:44 +01:00
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var rxBus: RxBusWrapper
2020-01-10 23:14:58 +01:00
@Inject lateinit var activePlugin: ActivePluginProvider
@Inject lateinit var commandQueue: CommandQueueProvider
2019-12-30 00:53:44 +01:00
@Inject lateinit var profileFunction: ProfileFunction
2020-01-03 01:45:26 +01:00
@Inject lateinit var loopPlugin: LoopPlugin
2020-01-10 23:14:58 +01:00
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
@Inject lateinit var localAlertUtils: LocalAlertUtils
2020-03-21 15:09:14 +01:00
@Inject lateinit var fabricPrivacy: FabricPrivacy
2020-04-25 22:59:22 +02:00
@Inject lateinit var receiverStatusStore: ReceiverStatusStore
2020-05-07 09:54:36 +02:00
@Inject lateinit var config: Config
2020-05-09 10:52:20 +02:00
@Inject lateinit var nsUpload: NSUpload
2020-05-07 23:40:59 +02:00
@Inject lateinit var dateUtil: DateUtil
2019-12-24 16:07:17 +01:00
companion object {
2019-12-24 16:07:17 +01:00
private val KEEP_ALIVE_MILLISECONDS = T.mins(5).msecs()
private val STATUS_UPDATE_FREQUENCY = T.mins(15).msecs()
2020-07-24 07:47:54 +02:00
private val IOB_UPDATE_FREQUENCY_IN_MINS = 5L
2019-12-24 16:07:17 +01:00
2020-03-17 17:58:50 +01:00
private var lastReadStatus: Long = 0
private var lastRun: Long = 0
private var lastIobUpload: Long = 0
2020-03-17 18:47:43 +01:00
}
2019-12-24 16:07:17 +01:00
2019-12-30 00:53:44 +01:00
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
2020-01-10 23:14:58 +01:00
aapsLogger.debug(LTag.CORE, "KeepAlive received")
2019-12-24 16:07:17 +01:00
val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
val wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidAPS:KeepAliveReceiver")
wl.acquire(T.mins(2).msecs())
2020-01-10 23:14:58 +01:00
localAlertUtils.shortenSnoozeInterval()
localAlertUtils.checkStaleBGAlert()
2019-12-24 16:07:17 +01:00
checkPump()
checkAPS()
wl.release()
}
2020-01-10 23:14:58 +01:00
class KeepAliveManager @Inject constructor(
private val aapsLogger: AAPSLogger,
private val localAlertUtils: LocalAlertUtils
) {
2019-12-24 16:07:17 +01:00
//called by MainApp at first app start
fun setAlarm(context: Context) {
2020-01-06 15:22:28 +01:00
aapsLogger.debug(LTag.CORE, "KeepAlive scheduled")
2019-12-24 16:07:17 +01:00
SystemClock.sleep(5000) // wait for app initialization
2020-01-10 23:14:58 +01:00
localAlertUtils.shortenSnoozeInterval()
2020-12-25 12:06:54 +01:00
localAlertUtils.preSnoozeAlarms()
2019-12-24 16:07:17 +01:00
val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val i = Intent(context, KeepAliveReceiver::class.java)
val pi = PendingIntent.getBroadcast(context, 0, i, 0)
try {
pi.send()
} catch (e: CanceledException) {
}
am.cancel(pi)
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), KEEP_ALIVE_MILLISECONDS, pi)
}
fun cancelAlarm(context: Context) {
2020-01-06 15:22:28 +01:00
aapsLogger.debug(LTag.CORE, "KeepAlive canceled")
2019-12-24 16:07:17 +01:00
val intent = Intent(context, KeepAliveReceiver::class.java)
val sender = PendingIntent.getBroadcast(context, 0, intent, 0)
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.cancel(sender)
}
}
2020-01-10 23:14:58 +01:00
// Usually deviceStatus is uploaded through LoopPlugin after every loop cycle.
2020-01-03 21:02:36 +01:00
// if there is no BG available, we have to upload anyway to have correct
// IOB displayed in NS
2019-12-24 16:07:17 +01:00
private fun checkAPS() {
var shouldUploadStatus = false
2020-05-07 09:54:36 +02:00
if (config.NSCLIENT) return
if (config.PUMPCONTROL) shouldUploadStatus = true
2020-04-03 12:09:57 +02:00
else if (!loopPlugin.isEnabled() || iobCobCalculatorPlugin.actualBg() == null)
2020-01-03 21:02:36 +01:00
shouldUploadStatus = true
2020-04-03 12:09:57 +02:00
else if (DateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true
2020-07-24 07:47:54 +02:00
if (DateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINS) && shouldUploadStatus) {
2019-12-24 16:07:17 +01:00
lastIobUpload = DateUtil.now()
2020-05-09 10:52:20 +02:00
nsUpload.uploadDeviceStatus(loopPlugin, iobCobCalculatorPlugin, profileFunction, activePlugin.activePump, receiverStatusStore, BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION)
2019-12-24 16:07:17 +01:00
}
}
private fun checkPump() {
2020-03-16 21:40:29 +01:00
val pump = activePlugin.activePump
2019-12-30 00:53:44 +01:00
val profile = profileFunction.getProfile() ?: return
val lastConnection = pump.lastDataTime()
val isStatusOutdated = lastConnection + STATUS_UPDATE_FREQUENCY < System.currentTimeMillis()
val isBasalOutdated = abs(profile.basal - pump.baseBasalRate) > pump.pumpDescription.basalStep
2020-05-07 23:40:59 +02:00
aapsLogger.debug(LTag.CORE, "Last connection: " + dateUtil.dateAndTimeString(lastConnection))
2019-12-30 00:53:44 +01:00
// sometimes keep alive broadcast stops
// as as workaround test if readStatus was requested before an alarm is generated
if (lastReadStatus != 0L && lastReadStatus > System.currentTimeMillis() - T.mins(5).msecs()) {
2020-01-10 23:14:58 +01:00
localAlertUtils.checkPumpUnreachableAlarm(lastConnection, isStatusOutdated, loopPlugin.isDisconnected)
2019-12-30 00:53:44 +01:00
}
2020-01-10 23:14:58 +01:00
if (!pump.isThisProfileSet(profile) && !commandQueue.isRunning(Command.CommandType.BASAL_PROFILE)) {
2019-12-30 00:53:44 +01:00
rxBus.send(EventProfileNeedsUpdate())
} else if (isStatusOutdated && !pump.isBusy()) {
2019-12-30 00:53:44 +01:00
lastReadStatus = System.currentTimeMillis()
2020-01-10 23:14:58 +01:00
commandQueue.readStatus("KeepAlive. Status outdated.", null)
} else if (isBasalOutdated && !pump.isBusy()) {
2019-12-30 00:53:44 +01:00
lastReadStatus = System.currentTimeMillis()
2020-01-10 23:14:58 +01:00
commandQueue.readStatus("KeepAlive. Basal outdated.", null)
2019-12-24 16:07:17 +01:00
}
if (lastRun != 0L && System.currentTimeMillis() - lastRun > T.mins(10).msecs()) {
2020-01-06 15:22:28 +01:00
aapsLogger.error(LTag.CORE, "KeepAlive fail")
2020-03-21 15:09:14 +01:00
fabricPrivacy.logCustom("KeepAliveFail")
2019-12-24 16:07:17 +01:00
}
lastRun = System.currentTimeMillis()
}
}