system carb timer
This commit is contained in:
parent
a18fbfc7cf
commit
2de2d4f4f0
3 changed files with 97 additions and 63 deletions
|
@ -25,6 +25,7 @@
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-permission android:name="com.dexcom.cgm.EXTERNAL_PERMISSION" />
|
<uses-permission android:name="com.dexcom.cgm.EXTERNAL_PERMISSION" />
|
||||||
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||||
|
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
|
||||||
|
|
||||||
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
package info.nightscout.androidaps.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.provider.AlarmClock
|
||||||
|
import dagger.android.HasAndroidInjector
|
||||||
|
import info.nightscout.androidaps.Constants
|
||||||
|
import info.nightscout.androidaps.R
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.AutomationEvent
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.actions.ActionAlarm
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.elements.InputDelta
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerBg
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerDelta
|
||||||
|
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTime
|
||||||
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
|
import java.text.DecimalFormat
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class CarbTimer @Inject constructor(
|
||||||
|
private val sp: SP,
|
||||||
|
private val context: Context,
|
||||||
|
private val injector: HasAndroidInjector,
|
||||||
|
private val resourceHelper: ResourceHelper,
|
||||||
|
private val automationPlugin: AutomationPlugin
|
||||||
|
) {
|
||||||
|
|
||||||
|
fun scheduleReminder(time: Long) {
|
||||||
|
if (sp.getBoolean(R.string.key_raise_notifications_as_android_notifications, true)) {
|
||||||
|
Intent(AlarmClock.ACTION_SET_TIMER).apply {
|
||||||
|
val length: Int = ((time - DateUtil.now()) / 1000).toInt()
|
||||||
|
flags = flags or Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
putExtra(AlarmClock.EXTRA_LENGTH, length)
|
||||||
|
putExtra(AlarmClock.EXTRA_SKIP_UI, true)
|
||||||
|
putExtra(AlarmClock.EXTRA_MESSAGE, resourceHelper.gs(R.string.timetoeat))
|
||||||
|
context.startActivity(this)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AutomationEvent(injector).apply {
|
||||||
|
title = resourceHelper.gs(R.string.timetoeat)
|
||||||
|
readOnly = true
|
||||||
|
systemAction = true
|
||||||
|
autoRemove = true
|
||||||
|
trigger = TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
||||||
|
list.add(TriggerTime(injector, time))
|
||||||
|
}
|
||||||
|
actions.add(ActionAlarm(injector, resourceHelper.gs(R.string.timetoeat)))
|
||||||
|
automationPlugin.addIfNotExists(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun scheduleEatReminder() {
|
||||||
|
val event = AutomationEvent(injector).apply {
|
||||||
|
title = resourceHelper.gs(R.string.bolusadvisor)
|
||||||
|
readOnly = true
|
||||||
|
systemAction = true
|
||||||
|
autoRemove = true
|
||||||
|
trigger = TriggerConnector(injector, TriggerConnector.Type.OR).apply {
|
||||||
|
|
||||||
|
// Bg under 180 mgdl and dropping by 15 mgdl
|
||||||
|
list.add(TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
||||||
|
list.add(TriggerBg(injector, 180.0, Constants.MGDL, Comparator.Compare.IS_LESSER))
|
||||||
|
list.add(TriggerDelta(injector, InputDelta(injector, -15.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.DELTA), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
||||||
|
list.add(TriggerDelta(injector, InputDelta(injector, -8.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.SHORT_AVERAGE), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
||||||
|
})
|
||||||
|
// Bg under 160 mgdl and dropping by 9 mgdl
|
||||||
|
list.add(TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
||||||
|
list.add(TriggerBg(injector, 160.0, Constants.MGDL, Comparator.Compare.IS_LESSER))
|
||||||
|
list.add(TriggerDelta(injector, InputDelta(injector, -9.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.DELTA), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
||||||
|
list.add(TriggerDelta(injector, InputDelta(injector, -5.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.SHORT_AVERAGE), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
||||||
|
})
|
||||||
|
// Bg under 145 mgdl and dropping
|
||||||
|
list.add(TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
||||||
|
list.add(TriggerBg(injector, 145.0, Constants.MGDL, Comparator.Compare.IS_LESSER))
|
||||||
|
list.add(TriggerDelta(injector, InputDelta(injector, 0.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.DELTA), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
||||||
|
list.add(TriggerDelta(injector, InputDelta(injector, 0.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.SHORT_AVERAGE), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
actions.add(ActionAlarm(injector, resourceHelper.gs(R.string.time_to_eat)))
|
||||||
|
}
|
||||||
|
|
||||||
|
automationPlugin.addIfNotExists(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -6,7 +6,6 @@ import android.text.Spanned
|
||||||
import com.google.common.base.Joiner
|
import com.google.common.base.Joiner
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.Config
|
import info.nightscout.androidaps.Config
|
||||||
import info.nightscout.androidaps.Constants
|
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
import info.nightscout.androidaps.activities.ErrorHelperActivity
|
import info.nightscout.androidaps.activities.ErrorHelperActivity
|
||||||
import info.nightscout.androidaps.data.DetailedBolusInfo
|
import info.nightscout.androidaps.data.DetailedBolusInfo
|
||||||
|
@ -22,18 +21,10 @@ import info.nightscout.androidaps.logging.UserEntryLogger
|
||||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.automation.AutomationEvent
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.actions.ActionAlarm
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.Comparator
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.elements.InputDelta
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerBg
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerDelta
|
|
||||||
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTime
|
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
|
||||||
import info.nightscout.androidaps.queue.Callback
|
import info.nightscout.androidaps.queue.Callback
|
||||||
|
import info.nightscout.androidaps.utils.CarbTimer
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.HtmlHelper
|
import info.nightscout.androidaps.utils.HtmlHelper
|
||||||
import info.nightscout.androidaps.utils.Round
|
import info.nightscout.androidaps.utils.Round
|
||||||
|
@ -44,7 +35,6 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||||
import org.json.JSONException
|
import org.json.JSONException
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.text.DecimalFormat
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
@ -63,10 +53,10 @@ class BolusWizard @Inject constructor(
|
||||||
@Inject lateinit var commandQueue: CommandQueueProvider
|
@Inject lateinit var commandQueue: CommandQueueProvider
|
||||||
@Inject lateinit var loopPlugin: LoopPlugin
|
@Inject lateinit var loopPlugin: LoopPlugin
|
||||||
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
|
||||||
@Inject lateinit var automationPlugin: AutomationPlugin
|
|
||||||
@Inject lateinit var dateUtil: DateUtil
|
@Inject lateinit var dateUtil: DateUtil
|
||||||
@Inject lateinit var config: Config
|
@Inject lateinit var config: Config
|
||||||
@Inject lateinit var uel: UserEntryLogger
|
@Inject lateinit var uel: UserEntryLogger
|
||||||
|
@Inject lateinit var carbTimer: CarbTimer
|
||||||
|
|
||||||
init {
|
init {
|
||||||
injector.androidInjector().inject(this)
|
injector.androidInjector().inject(this)
|
||||||
|
@ -368,7 +358,7 @@ class BolusWizard @Inject constructor(
|
||||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
ctx.startActivity(i)
|
ctx.startActivity(i)
|
||||||
} else
|
} else
|
||||||
scheduleEatReminder()
|
carbTimer.scheduleEatReminder()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -449,57 +439,9 @@ class BolusWizard @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (useAlarm && carbs > 0 && carbTime > 0) {
|
if (useAlarm && carbs > 0 && carbTime > 0) {
|
||||||
scheduleReminder(dateUtil._now() + T.mins(carbTime.toLong()).msecs())
|
carbTimer.scheduleReminder(dateUtil._now() + T.mins(carbTime.toLong()).msecs())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun scheduleEatReminder() {
|
|
||||||
val event = AutomationEvent(injector).apply {
|
|
||||||
title = resourceHelper.gs(R.string.bolusadvisor)
|
|
||||||
readOnly = true
|
|
||||||
systemAction = true
|
|
||||||
autoRemove = true
|
|
||||||
trigger = TriggerConnector(injector, TriggerConnector.Type.OR).apply {
|
|
||||||
|
|
||||||
// Bg under 180 mgdl and dropping by 15 mgdl
|
|
||||||
list.add(TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
|
||||||
list.add(TriggerBg(injector, 180.0, Constants.MGDL, Comparator.Compare.IS_LESSER))
|
|
||||||
list.add(TriggerDelta(injector, InputDelta(injector, -15.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.DELTA), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
|
||||||
list.add(TriggerDelta(injector, InputDelta(injector, -8.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.SHORT_AVERAGE), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
|
||||||
})
|
|
||||||
// Bg under 160 mgdl and dropping by 9 mgdl
|
|
||||||
list.add(TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
|
||||||
list.add(TriggerBg(injector, 160.0, Constants.MGDL, Comparator.Compare.IS_LESSER))
|
|
||||||
list.add(TriggerDelta(injector, InputDelta(injector, -9.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.DELTA), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
|
||||||
list.add(TriggerDelta(injector, InputDelta(injector, -5.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.SHORT_AVERAGE), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
|
||||||
})
|
|
||||||
// Bg under 145 mgdl and dropping
|
|
||||||
list.add(TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
|
||||||
list.add(TriggerBg(injector, 145.0, Constants.MGDL, Comparator.Compare.IS_LESSER))
|
|
||||||
list.add(TriggerDelta(injector, InputDelta(injector, 0.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.DELTA), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
|
||||||
list.add(TriggerDelta(injector, InputDelta(injector, 0.0, -360.0, 360.0, 1.0, DecimalFormat("0"), InputDelta.DeltaType.SHORT_AVERAGE), Constants.MGDL, Comparator.Compare.IS_EQUAL_OR_LESSER))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
actions.add(ActionAlarm(injector, resourceHelper.gs(R.string.time_to_eat)))
|
|
||||||
}
|
|
||||||
|
|
||||||
automationPlugin.addIfNotExists(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun scheduleReminder(time: Long) {
|
|
||||||
val event = AutomationEvent(injector).apply {
|
|
||||||
title = resourceHelper.gs(R.string.timetoeat)
|
|
||||||
readOnly = true
|
|
||||||
systemAction = true
|
|
||||||
autoRemove = true
|
|
||||||
trigger = TriggerConnector(injector, TriggerConnector.Type.AND).apply {
|
|
||||||
list.add(TriggerTime(injector, time))
|
|
||||||
}
|
|
||||||
actions.add(ActionAlarm(injector, resourceHelper.gs(R.string.timetoeat)))
|
|
||||||
}
|
|
||||||
|
|
||||||
automationPlugin.addIfNotExists(event)
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue