move more calculations to io thread
This commit is contained in:
parent
8fd91a0713
commit
43cec5bf62
1 changed files with 305 additions and 274 deletions
|
@ -224,7 +224,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
disposable += activePlugin.activeOverview.overviewBus
|
disposable += activePlugin.activeOverview.overviewBus
|
||||||
.toObservable(EventUpdateOverviewIobCob::class.java)
|
.toObservable(EventUpdateOverviewIobCob::class.java)
|
||||||
.debounce(1L, TimeUnit.SECONDS)
|
.debounce(1L, TimeUnit.SECONDS)
|
||||||
.observeOn(aapsSchedulers.main)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ updateIobCob() }, fabricPrivacy::logException)
|
.subscribe({ updateIobCob() }, fabricPrivacy::logException)
|
||||||
disposable += activePlugin.activeOverview.overviewBus
|
disposable += activePlugin.activeOverview.overviewBus
|
||||||
.toObservable(EventUpdateOverviewSensitivity::class.java)
|
.toObservable(EventUpdateOverviewSensitivity::class.java)
|
||||||
|
@ -256,7 +256,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
disposable += rxBus
|
disposable += rxBus
|
||||||
.toObservable(EventNewBG::class.java)
|
.toObservable(EventNewBG::class.java)
|
||||||
.debounce(1L, TimeUnit.SECONDS)
|
.debounce(1L, TimeUnit.SECONDS)
|
||||||
.observeOn(aapsSchedulers.main)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ updateBg() }, fabricPrivacy::logException)
|
.subscribe({ updateBg() }, fabricPrivacy::logException)
|
||||||
disposable += rxBus
|
disposable += rxBus
|
||||||
.toObservable(EventRefreshOverview::class.java)
|
.toObservable(EventRefreshOverview::class.java)
|
||||||
|
@ -287,19 +287,19 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
}, fabricPrivacy::logException)
|
}, fabricPrivacy::logException)
|
||||||
disposable += rxBus
|
disposable += rxBus
|
||||||
.toObservable(EventEffectiveProfileSwitchChanged::class.java)
|
.toObservable(EventEffectiveProfileSwitchChanged::class.java)
|
||||||
.observeOn(aapsSchedulers.main)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ updateProfile() }, fabricPrivacy::logException)
|
.subscribe({ updateProfile() }, fabricPrivacy::logException)
|
||||||
disposable += rxBus
|
disposable += rxBus
|
||||||
.toObservable(EventTempTargetChange::class.java)
|
.toObservable(EventTempTargetChange::class.java)
|
||||||
.observeOn(aapsSchedulers.main)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ updateTemporaryTarget() }, fabricPrivacy::logException)
|
.subscribe({ updateTemporaryTarget() }, fabricPrivacy::logException)
|
||||||
disposable += rxBus
|
disposable += rxBus
|
||||||
.toObservable(EventExtendedBolusChange::class.java)
|
.toObservable(EventExtendedBolusChange::class.java)
|
||||||
.observeOn(aapsSchedulers.main)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ updateExtendedBolus() }, fabricPrivacy::logException)
|
.subscribe({ updateExtendedBolus() }, fabricPrivacy::logException)
|
||||||
disposable += rxBus
|
disposable += rxBus
|
||||||
.toObservable(EventTempBasalChange::class.java)
|
.toObservable(EventTempBasalChange::class.java)
|
||||||
.observeOn(aapsSchedulers.main)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ updateTemporaryBasal() }, fabricPrivacy::logException)
|
.subscribe({ updateTemporaryBasal() }, fabricPrivacy::logException)
|
||||||
|
|
||||||
refreshLoop = Runnable {
|
refreshLoop = Runnable {
|
||||||
|
@ -316,17 +316,19 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
fun refreshAll() {
|
fun refreshAll() {
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
_binding ?: return@runOnUiThread
|
_binding ?: return@runOnUiThread
|
||||||
updateBg()
|
|
||||||
updateTime()
|
updateTime()
|
||||||
updateProfile()
|
|
||||||
updateTemporaryBasal()
|
|
||||||
updateExtendedBolus()
|
|
||||||
updateTemporaryTarget()
|
|
||||||
updateIobCob()
|
|
||||||
updateSensitivity()
|
updateSensitivity()
|
||||||
updateGraph()
|
updateGraph()
|
||||||
updateNotification()
|
updateNotification()
|
||||||
}
|
}
|
||||||
|
updateBg()
|
||||||
|
updateTemporaryBasal()
|
||||||
|
updateExtendedBolus()
|
||||||
|
updateIobCob()
|
||||||
|
processButtonsVisibility()
|
||||||
|
processAps()
|
||||||
|
updateProfile()
|
||||||
|
updateTemporaryTarget()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
|
@ -513,13 +515,16 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
|
|
||||||
// QuickWizard button
|
// QuickWizard button
|
||||||
val quickWizardEntry = quickWizard.getActive()
|
val quickWizardEntry = quickWizard.getActive()
|
||||||
if (quickWizardEntry != null && lastBG != null && profile != null && pump.isInitialized() && !pump.isSuspended() && !loop.isDisconnected) {
|
runOnUiThread {
|
||||||
binding.buttonsLayout.quickWizardButton.visibility = View.VISIBLE
|
_binding ?: return@runOnUiThread
|
||||||
val wizard = quickWizardEntry.doCalc(profile, profileName, lastBG, false)
|
if (quickWizardEntry != null && lastBG != null && profile != null && pump.isInitialized() && !pump.isSuspended() && !loop.isDisconnected) {
|
||||||
binding.buttonsLayout.quickWizardButton.text = quickWizardEntry.buttonText() + "\n" + rh.gs(R.string.format_carbs, quickWizardEntry.carbs()) +
|
binding.buttonsLayout.quickWizardButton.visibility = View.VISIBLE
|
||||||
" " + rh.gs(R.string.formatinsulinunits, wizard.calculatedTotalInsulin)
|
val wizard = quickWizardEntry.doCalc(profile, profileName, lastBG, false)
|
||||||
if (wizard.calculatedTotalInsulin <= 0) binding.buttonsLayout.quickWizardButton.visibility = View.GONE
|
binding.buttonsLayout.quickWizardButton.text = quickWizardEntry.buttonText() + "\n" + rh.gs(R.string.format_carbs, quickWizardEntry.carbs()) +
|
||||||
} else binding.buttonsLayout.quickWizardButton.visibility = View.GONE
|
" " + rh.gs(R.string.formatinsulinunits, wizard.calculatedTotalInsulin)
|
||||||
|
if (wizard.calculatedTotalInsulin <= 0) binding.buttonsLayout.quickWizardButton.visibility = View.GONE
|
||||||
|
} else binding.buttonsLayout.quickWizardButton.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
// **** Temp button ****
|
// **** Temp button ****
|
||||||
val lastRun = loop.lastRun
|
val lastRun = loop.lastRun
|
||||||
|
@ -530,72 +535,76 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
(lastRun.lastOpenModeAccept == 0L || lastRun.lastOpenModeAccept < lastRun.lastAPSRun) &&// never accepted or before last result
|
(lastRun.lastOpenModeAccept == 0L || lastRun.lastOpenModeAccept < lastRun.lastAPSRun) &&// never accepted or before last result
|
||||||
lastRun.constraintsProcessed?.isChangeRequested == true // change is requested
|
lastRun.constraintsProcessed?.isChangeRequested == true // change is requested
|
||||||
|
|
||||||
if (showAcceptButton && pump.isInitialized() && !pump.isSuspended() && (loop as PluginBase).isEnabled()) {
|
runOnUiThread {
|
||||||
binding.buttonsLayout.acceptTempButton.visibility = View.VISIBLE
|
_binding ?: return@runOnUiThread
|
||||||
binding.buttonsLayout.acceptTempButton.text = "${rh.gs(R.string.setbasalquestion)}\n${lastRun!!.constraintsProcessed}"
|
if (showAcceptButton && pump.isInitialized() && !pump.isSuspended() && (loop as PluginBase).isEnabled()) {
|
||||||
} else {
|
binding.buttonsLayout.acceptTempButton.visibility = View.VISIBLE
|
||||||
binding.buttonsLayout.acceptTempButton.visibility = View.GONE
|
binding.buttonsLayout.acceptTempButton.text = "${rh.gs(R.string.setbasalquestion)}\n${lastRun!!.constraintsProcessed}"
|
||||||
}
|
} else {
|
||||||
|
binding.buttonsLayout.acceptTempButton.visibility = View.GONE
|
||||||
// **** Various treatment buttons ****
|
|
||||||
binding.buttonsLayout.carbsButton.visibility =
|
|
||||||
((!activePlugin.activePump.pumpDescription.storesCarbInfo || pump.isInitialized() && !pump.isSuspended()) && profile != null
|
|
||||||
&& sp.getBoolean(R.string.key_show_carbs_button, true)).toVisibility()
|
|
||||||
binding.buttonsLayout.treatmentButton.visibility = (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null
|
|
||||||
&& sp.getBoolean(R.string.key_show_treatment_button, false)).toVisibility()
|
|
||||||
binding.buttonsLayout.wizardButton.visibility = (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null
|
|
||||||
&& sp.getBoolean(R.string.key_show_wizard_button, true)).toVisibility()
|
|
||||||
binding.buttonsLayout.insulinButton.visibility = (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null
|
|
||||||
&& sp.getBoolean(R.string.key_show_insulin_button, true)).toVisibility()
|
|
||||||
|
|
||||||
// **** Calibration & CGM buttons ****
|
|
||||||
val xDripIsBgSource = xdripPlugin.isEnabled()
|
|
||||||
val dexcomIsSource = dexcomPlugin.isEnabled()
|
|
||||||
binding.buttonsLayout.calibrationButton.visibility = (xDripIsBgSource && actualBG != null && sp.getBoolean(R.string.key_show_calibration_button, true)).toVisibility()
|
|
||||||
if (dexcomIsSource) {
|
|
||||||
binding.buttonsLayout.cgmButton.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(R.drawable.ic_byoda), null, null)
|
|
||||||
for (drawable in binding.buttonsLayout.cgmButton.compoundDrawables) {
|
|
||||||
drawable?.mutate()
|
|
||||||
drawable?.colorFilter = PorterDuffColorFilter(rh.gac(context, R.attr.cgmDexColor), PorterDuff.Mode.SRC_IN)
|
|
||||||
}
|
}
|
||||||
binding.buttonsLayout.cgmButton.setTextColor(rh.gac(context, R.attr.cgmDexColor))
|
|
||||||
} else if (xDripIsBgSource) {
|
// **** Various treatment buttons ****
|
||||||
binding.buttonsLayout.cgmButton.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(R.drawable.ic_xdrip), null, null)
|
binding.buttonsLayout.carbsButton.visibility =
|
||||||
for (drawable in binding.buttonsLayout.cgmButton.compoundDrawables) {
|
((!activePlugin.activePump.pumpDescription.storesCarbInfo || pump.isInitialized() && !pump.isSuspended()) && profile != null
|
||||||
drawable?.mutate()
|
&& sp.getBoolean(R.string.key_show_carbs_button, true)).toVisibility()
|
||||||
drawable?.colorFilter = PorterDuffColorFilter(rh.gac(context, R.attr.cgmXdripColor), PorterDuff.Mode.SRC_IN)
|
binding.buttonsLayout.treatmentButton.visibility = (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null
|
||||||
|
&& sp.getBoolean(R.string.key_show_treatment_button, false)).toVisibility()
|
||||||
|
binding.buttonsLayout.wizardButton.visibility = (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null
|
||||||
|
&& sp.getBoolean(R.string.key_show_wizard_button, true)).toVisibility()
|
||||||
|
binding.buttonsLayout.insulinButton.visibility = (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null
|
||||||
|
&& sp.getBoolean(R.string.key_show_insulin_button, true)).toVisibility()
|
||||||
|
|
||||||
|
// **** Calibration & CGM buttons ****
|
||||||
|
val xDripIsBgSource = xdripPlugin.isEnabled()
|
||||||
|
val dexcomIsSource = dexcomPlugin.isEnabled()
|
||||||
|
binding.buttonsLayout.calibrationButton.visibility = (xDripIsBgSource && actualBG != null && sp.getBoolean(R.string.key_show_calibration_button, true)).toVisibility()
|
||||||
|
if (dexcomIsSource) {
|
||||||
|
binding.buttonsLayout.cgmButton.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(R.drawable.ic_byoda), null, null)
|
||||||
|
for (drawable in binding.buttonsLayout.cgmButton.compoundDrawables) {
|
||||||
|
drawable?.mutate()
|
||||||
|
drawable?.colorFilter = PorterDuffColorFilter(rh.gac(context, R.attr.cgmDexColor), PorterDuff.Mode.SRC_IN)
|
||||||
|
}
|
||||||
|
binding.buttonsLayout.cgmButton.setTextColor(rh.gac(context, R.attr.cgmDexColor))
|
||||||
|
} else if (xDripIsBgSource) {
|
||||||
|
binding.buttonsLayout.cgmButton.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(R.drawable.ic_xdrip), null, null)
|
||||||
|
for (drawable in binding.buttonsLayout.cgmButton.compoundDrawables) {
|
||||||
|
drawable?.mutate()
|
||||||
|
drawable?.colorFilter = PorterDuffColorFilter(rh.gac(context, R.attr.cgmXdripColor), PorterDuff.Mode.SRC_IN)
|
||||||
|
}
|
||||||
|
binding.buttonsLayout.cgmButton.setTextColor(rh.gac(context, R.attr.cgmXdripColor))
|
||||||
}
|
}
|
||||||
binding.buttonsLayout.cgmButton.setTextColor(rh.gac(context, R.attr.cgmXdripColor))
|
binding.buttonsLayout.cgmButton.visibility = (sp.getBoolean(R.string.key_show_cgm_button, false) && (xDripIsBgSource || dexcomIsSource)).toVisibility()
|
||||||
}
|
|
||||||
binding.buttonsLayout.cgmButton.visibility = (sp.getBoolean(R.string.key_show_cgm_button, false) && (xDripIsBgSource || dexcomIsSource)).toVisibility()
|
|
||||||
|
|
||||||
// Automation buttons
|
// Automation buttons
|
||||||
binding.buttonsLayout.userButtonsLayout.removeAllViews()
|
binding.buttonsLayout.userButtonsLayout.removeAllViews()
|
||||||
val events = automationPlugin.userEvents()
|
val events = automationPlugin.userEvents()
|
||||||
if (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null)
|
if (!loop.isDisconnected && pump.isInitialized() && !pump.isSuspended() && profile != null)
|
||||||
for (event in events)
|
for (event in events)
|
||||||
if (event.isEnabled && event.trigger.shouldRun())
|
if (event.isEnabled && event.trigger.shouldRun())
|
||||||
context?.let { context ->
|
context?.let { context ->
|
||||||
SingleClickButton(context).also {
|
SingleClickButton(context).also {
|
||||||
it.setTextColor(rh.gac(context, R.attr.treatmentButton))
|
it.setTextColor(rh.gac(context, R.attr.treatmentButton))
|
||||||
it.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f)
|
it.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f)
|
||||||
it.layoutParams = LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 0.5f).also { l ->
|
it.layoutParams = LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 0.5f).also { l ->
|
||||||
l.setMargins(0, 0, rh.dpToPx(-4), 0)
|
l.setMargins(0, 0, rh.dpToPx(-4), 0)
|
||||||
}
|
}
|
||||||
it.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(R.drawable.ic_danar_useropt), null, null)
|
it.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(R.drawable.ic_danar_useropt), null, null)
|
||||||
it.text = event.title
|
it.text = event.title
|
||||||
|
|
||||||
it.setOnClickListener {
|
it.setOnClickListener {
|
||||||
OKDialog.showConfirmation(context, rh.gs(R.string.run_question, event.title), { handler.post { automationPlugin.processEvent(event) } })
|
OKDialog.showConfirmation(context, rh.gs(R.string.run_question, event.title), { handler.post { automationPlugin.processEvent(event) } })
|
||||||
|
}
|
||||||
|
binding.buttonsLayout.userButtonsLayout.addView(it)
|
||||||
}
|
}
|
||||||
binding.buttonsLayout.userButtonsLayout.addView(it)
|
|
||||||
}
|
}
|
||||||
}
|
binding.buttonsLayout.userButtonsLayout.visibility = events.isNotEmpty().toVisibility()
|
||||||
binding.buttonsLayout.userButtonsLayout.visibility = events.isNotEmpty().toVisibility()
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun processAps() {
|
private fun processAps() {
|
||||||
val pump = activePlugin.activePump
|
val pump = activePlugin.activePump
|
||||||
|
val profile = profileFunction.getProfile()
|
||||||
|
|
||||||
// aps mode
|
// aps mode
|
||||||
val closedLoopEnabled = constraintChecker.isClosedLoopAllowed()
|
val closedLoopEnabled = constraintChecker.isClosedLoopAllowed()
|
||||||
|
@ -608,103 +617,106 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config.APS && pump.pumpDescription.isTempBasalCapable) {
|
runOnUiThread {
|
||||||
binding.infoLayout.apsMode.visibility = View.VISIBLE
|
_binding ?: return@runOnUiThread
|
||||||
binding.infoLayout.timeLayout.visibility = View.GONE
|
if (config.APS && pump.pumpDescription.isTempBasalCapable) {
|
||||||
when {
|
binding.infoLayout.apsMode.visibility = View.VISIBLE
|
||||||
(loop as PluginBase).isEnabled() && loop.isSuperBolus -> {
|
binding.infoLayout.timeLayout.visibility = View.GONE
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_superbolus)
|
when {
|
||||||
apsModeSetA11yLabel(R.string.superbolus)
|
(loop as PluginBase).isEnabled() && loop.isSuperBolus -> {
|
||||||
binding.infoLayout.apsModeText.text = dateUtil.age(loop.minutesToEndOfSuspend() * 60000L, true, rh)
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_superbolus)
|
||||||
binding.infoLayout.apsModeText.visibility = View.VISIBLE
|
apsModeSetA11yLabel(R.string.superbolus)
|
||||||
}
|
binding.infoLayout.apsModeText.text = dateUtil.age(loop.minutesToEndOfSuspend() * 60000L, true, rh)
|
||||||
|
binding.infoLayout.apsModeText.visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
|
||||||
loop.isDisconnected -> {
|
loop.isDisconnected -> {
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_disconnected)
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_disconnected)
|
||||||
apsModeSetA11yLabel(R.string.disconnected)
|
apsModeSetA11yLabel(R.string.disconnected)
|
||||||
binding.infoLayout.apsModeText.text = dateUtil.age(loop.minutesToEndOfSuspend() * 60000L, true, rh)
|
binding.infoLayout.apsModeText.text = dateUtil.age(loop.minutesToEndOfSuspend() * 60000L, true, rh)
|
||||||
binding.infoLayout.apsModeText.visibility = View.VISIBLE
|
binding.infoLayout.apsModeText.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
(loop as PluginBase).isEnabled() && loop.isSuspended -> {
|
(loop as PluginBase).isEnabled() && loop.isSuspended -> {
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_paused)
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_paused)
|
||||||
apsModeSetA11yLabel(R.string.suspendloop_label)
|
apsModeSetA11yLabel(R.string.suspendloop_label)
|
||||||
binding.infoLayout.apsModeText.text = dateUtil.age(loop.minutesToEndOfSuspend() * 60000L, true, rh)
|
binding.infoLayout.apsModeText.text = dateUtil.age(loop.minutesToEndOfSuspend() * 60000L, true, rh)
|
||||||
binding.infoLayout.apsModeText.visibility = View.VISIBLE
|
binding.infoLayout.apsModeText.visibility = View.VISIBLE
|
||||||
}
|
}
|
||||||
|
|
||||||
pump.isSuspended() -> {
|
pump.isSuspended() -> {
|
||||||
binding.infoLayout.apsMode.setImageResource(
|
binding.infoLayout.apsMode.setImageResource(
|
||||||
if (pump.model() == PumpType.OMNIPOD_EROS || pump.model() == PumpType.OMNIPOD_DASH) {
|
if (pump.model() == PumpType.OMNIPOD_EROS || pump.model() == PumpType.OMNIPOD_DASH) {
|
||||||
// For Omnipod, indicate the pump as disconnected when it's suspended.
|
// For Omnipod, indicate the pump as disconnected when it's suspended.
|
||||||
// The only way to 'reconnect' it, is through the Omnipod tab
|
// The only way to 'reconnect' it, is through the Omnipod tab
|
||||||
apsModeSetA11yLabel(R.string.disconnected)
|
apsModeSetA11yLabel(R.string.disconnected)
|
||||||
R.drawable.ic_loop_disconnected
|
R.drawable.ic_loop_disconnected
|
||||||
} else {
|
} else {
|
||||||
apsModeSetA11yLabel(R.string.pump_paused)
|
apsModeSetA11yLabel(R.string.pump_paused)
|
||||||
R.drawable.ic_loop_paused
|
R.drawable.ic_loop_paused
|
||||||
}
|
}
|
||||||
)
|
|
||||||
binding.infoLayout.apsModeText.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
(loop as PluginBase).isEnabled() && closedLoopEnabled.value() && loop.isLGS -> {
|
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_lgs)
|
|
||||||
apsModeSetA11yLabel(R.string.uel_lgs_loop_mode)
|
|
||||||
binding.infoLayout.apsModeText.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
(loop as PluginBase).isEnabled() && closedLoopEnabled.value() -> {
|
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_closed)
|
|
||||||
apsModeSetA11yLabel(R.string.closedloop)
|
|
||||||
binding.infoLayout.apsModeText.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
(loop as PluginBase).isEnabled() && !closedLoopEnabled.value() -> {
|
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_open)
|
|
||||||
apsModeSetA11yLabel(R.string.openloop)
|
|
||||||
binding.infoLayout.apsModeText.visibility = View.GONE
|
|
||||||
}
|
|
||||||
|
|
||||||
else -> {
|
|
||||||
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_disabled)
|
|
||||||
apsModeSetA11yLabel(R.string.disabledloop)
|
|
||||||
binding.infoLayout.apsModeText.visibility = View.GONE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Show variable sensitivity
|
|
||||||
val request = loop.lastRun?.request
|
|
||||||
if (request is DetermineBasalResultSMB) {
|
|
||||||
val isfMgdl = profileFunction.getProfile()?.getIsfMgdl()
|
|
||||||
val variableSens = request.variableSens
|
|
||||||
if (variableSens != isfMgdl && variableSens != null && isfMgdl != null) {
|
|
||||||
binding.infoLayout.variableSensitivity.text =
|
|
||||||
String.format(
|
|
||||||
Locale.getDefault(), "%1$.1f→%2$.1f",
|
|
||||||
Profile.toUnits(isfMgdl, isfMgdl * Constants.MGDL_TO_MMOLL, profileFunction.getUnits()),
|
|
||||||
Profile.toUnits(variableSens, variableSens * Constants.MGDL_TO_MMOLL, profileFunction.getUnits())
|
|
||||||
)
|
)
|
||||||
binding.infoLayout.variableSensitivity.visibility = View.VISIBLE
|
binding.infoLayout.apsModeText.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
(loop as PluginBase).isEnabled() && closedLoopEnabled.value() && loop.isLGS -> {
|
||||||
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_lgs)
|
||||||
|
apsModeSetA11yLabel(R.string.uel_lgs_loop_mode)
|
||||||
|
binding.infoLayout.apsModeText.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
(loop as PluginBase).isEnabled() && closedLoopEnabled.value() -> {
|
||||||
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_closed)
|
||||||
|
apsModeSetA11yLabel(R.string.closedloop)
|
||||||
|
binding.infoLayout.apsModeText.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
(loop as PluginBase).isEnabled() && !closedLoopEnabled.value() -> {
|
||||||
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_open)
|
||||||
|
apsModeSetA11yLabel(R.string.openloop)
|
||||||
|
binding.infoLayout.apsModeText.visibility = View.GONE
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
binding.infoLayout.apsMode.setImageResource(R.drawable.ic_loop_disabled)
|
||||||
|
apsModeSetA11yLabel(R.string.disabledloop)
|
||||||
|
binding.infoLayout.apsModeText.visibility = View.GONE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Show variable sensitivity
|
||||||
|
val request = loop.lastRun?.request
|
||||||
|
if (request is DetermineBasalResultSMB) {
|
||||||
|
val isfMgdl = profile?.getIsfMgdl()
|
||||||
|
val variableSens = request.variableSens
|
||||||
|
if (variableSens != isfMgdl && variableSens != null && isfMgdl != null) {
|
||||||
|
binding.infoLayout.variableSensitivity.text =
|
||||||
|
String.format(
|
||||||
|
Locale.getDefault(), "%1$.1f→%2$.1f",
|
||||||
|
Profile.toUnits(isfMgdl, isfMgdl * Constants.MGDL_TO_MMOLL, profileFunction.getUnits()),
|
||||||
|
Profile.toUnits(variableSens, variableSens * Constants.MGDL_TO_MMOLL, profileFunction.getUnits())
|
||||||
|
)
|
||||||
|
binding.infoLayout.variableSensitivity.visibility = View.VISIBLE
|
||||||
|
} else binding.infoLayout.variableSensitivity.visibility = View.GONE
|
||||||
} else binding.infoLayout.variableSensitivity.visibility = View.GONE
|
} else binding.infoLayout.variableSensitivity.visibility = View.GONE
|
||||||
} else binding.infoLayout.variableSensitivity.visibility = View.GONE
|
} else {
|
||||||
} else {
|
//nsclient
|
||||||
//nsclient
|
binding.infoLayout.apsMode.visibility = View.GONE
|
||||||
binding.infoLayout.apsMode.visibility = View.GONE
|
binding.infoLayout.apsModeText.visibility = View.GONE
|
||||||
binding.infoLayout.apsModeText.visibility = View.GONE
|
binding.infoLayout.timeLayout.visibility = View.VISIBLE
|
||||||
binding.infoLayout.timeLayout.visibility = View.VISIBLE
|
}
|
||||||
|
|
||||||
|
// pump status from ns
|
||||||
|
binding.pump.text = nsDeviceStatus.pumpStatus
|
||||||
|
binding.pump.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.pump), nsDeviceStatus.extendedPumpStatus) } }
|
||||||
|
|
||||||
|
// OpenAPS status from ns
|
||||||
|
binding.openaps.text = nsDeviceStatus.openApsStatus
|
||||||
|
binding.openaps.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.openaps), nsDeviceStatus.extendedOpenApsStatus) } }
|
||||||
|
|
||||||
|
// Uploader status from ns
|
||||||
|
binding.uploader.text = nsDeviceStatus.uploaderStatusSpanned
|
||||||
|
binding.uploader.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.uploader), nsDeviceStatus.extendedUploaderStatus) } }
|
||||||
}
|
}
|
||||||
|
|
||||||
// pump status from ns
|
|
||||||
binding.pump.text = nsDeviceStatus.pumpStatus
|
|
||||||
binding.pump.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.pump), nsDeviceStatus.extendedPumpStatus) } }
|
|
||||||
|
|
||||||
// OpenAPS status from ns
|
|
||||||
binding.openaps.text = nsDeviceStatus.openApsStatus
|
|
||||||
binding.openaps.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.openaps), nsDeviceStatus.extendedOpenApsStatus) } }
|
|
||||||
|
|
||||||
// Uploader status from ns
|
|
||||||
binding.uploader.text = nsDeviceStatus.uploaderStatusSpanned
|
|
||||||
binding.uploader.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.uploader), nsDeviceStatus.extendedUploaderStatus) } }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun prepareGraphsIfNeeded(numOfGraphs: Int) {
|
private fun prepareGraphsIfNeeded(numOfGraphs: Int) {
|
||||||
|
@ -760,59 +772,67 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
fun updateBg() {
|
fun updateBg() {
|
||||||
_binding ?: return
|
|
||||||
val units = profileFunction.getUnits()
|
val units = profileFunction.getUnits()
|
||||||
binding.infoLayout.bg.text = overviewData.lastBg?.valueToUnitsString(units)
|
val lastBg = overviewData.lastBg
|
||||||
?: rh.gs(R.string.notavailable)
|
val lastBgColor = overviewData.lastBgColor(context)
|
||||||
binding.infoLayout.bg.setTextColor(overviewData.lastBgColor(context))
|
val isActualBg = overviewData.isActualBg
|
||||||
binding.infoLayout.arrow.setImageResource(trendCalculator.getTrendArrow(overviewData.lastBg).directionToIcon())
|
|
||||||
binding.infoLayout.arrow.setColorFilter(overviewData.lastBgColor(context))
|
|
||||||
binding.infoLayout.arrow.contentDescription = overviewData.lastBgDescription + " " + rh.gs(R.string.and) + " " + trendCalculator.getTrendDescription(overviewData.lastBg)
|
|
||||||
|
|
||||||
val glucoseStatus = glucoseStatusProvider.glucoseStatusData
|
val glucoseStatus = glucoseStatusProvider.glucoseStatusData
|
||||||
if (glucoseStatus != null) {
|
val trendDescription = trendCalculator.getTrendDescription(lastBg)
|
||||||
binding.infoLayout.deltaLarge.text = Profile.toSignedUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units)
|
val trendArrow = trendCalculator.getTrendArrow(lastBg)
|
||||||
binding.infoLayout.deltaLarge.setTextColor(overviewData.lastBgColor(context))
|
val lastBgDescription = overviewData.lastBgDescription
|
||||||
binding.infoLayout.delta.text = Profile.toSignedUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units)
|
runOnUiThread {
|
||||||
binding.infoLayout.avgDelta.text = Profile.toSignedUnitsString(glucoseStatus.shortAvgDelta, glucoseStatus.shortAvgDelta * Constants.MGDL_TO_MMOLL, units)
|
_binding ?: return@runOnUiThread
|
||||||
binding.infoLayout.longAvgDelta.text = Profile.toSignedUnitsString(glucoseStatus.longAvgDelta, glucoseStatus.longAvgDelta * Constants.MGDL_TO_MMOLL, units)
|
binding.infoLayout.bg.text = lastBg?.valueToUnitsString(units)
|
||||||
} else {
|
?: rh.gs(R.string.notavailable)
|
||||||
binding.infoLayout.deltaLarge.text = ""
|
binding.infoLayout.bg.setTextColor(lastBgColor)
|
||||||
binding.infoLayout.delta.text = "Δ " + rh.gs(R.string.notavailable)
|
binding.infoLayout.arrow.setImageResource(trendArrow.directionToIcon())
|
||||||
binding.infoLayout.avgDelta.text = ""
|
binding.infoLayout.arrow.setColorFilter(lastBgColor)
|
||||||
binding.infoLayout.longAvgDelta.text = ""
|
binding.infoLayout.arrow.contentDescription = lastBgDescription + " " + rh.gs(R.string.and) + " " + trendDescription
|
||||||
}
|
|
||||||
|
|
||||||
// strike through if BG is old
|
if (glucoseStatus != null) {
|
||||||
binding.infoLayout.bg.paintFlags =
|
binding.infoLayout.deltaLarge.text = Profile.toSignedUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units)
|
||||||
if (!overviewData.isActualBg) binding.infoLayout.bg.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
|
binding.infoLayout.deltaLarge.setTextColor(lastBgColor)
|
||||||
else binding.infoLayout.bg.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
|
binding.infoLayout.delta.text = Profile.toSignedUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units)
|
||||||
|
binding.infoLayout.avgDelta.text = Profile.toSignedUnitsString(glucoseStatus.shortAvgDelta, glucoseStatus.shortAvgDelta * Constants.MGDL_TO_MMOLL, units)
|
||||||
val outDate = (if (!overviewData.isActualBg) rh.gs(R.string.a11y_bg_outdated) else "")
|
binding.infoLayout.longAvgDelta.text = Profile.toSignedUnitsString(glucoseStatus.longAvgDelta, glucoseStatus.longAvgDelta * Constants.MGDL_TO_MMOLL, units)
|
||||||
binding.infoLayout.bg.contentDescription =
|
} else {
|
||||||
rh.gs(R.string.a11y_blood_glucose) + " " + binding.infoLayout.bg.text.toString() + " " + overviewData.lastBgDescription + " " + outDate
|
binding.infoLayout.deltaLarge.text = ""
|
||||||
|
binding.infoLayout.delta.text = "Δ " + rh.gs(R.string.notavailable)
|
||||||
binding.infoLayout.timeAgo.text = dateUtil.minAgo(rh, overviewData.lastBg?.timestamp)
|
binding.infoLayout.avgDelta.text = ""
|
||||||
binding.infoLayout.timeAgo.contentDescription = dateUtil.minAgoLong(rh, overviewData.lastBg?.timestamp)
|
binding.infoLayout.longAvgDelta.text = ""
|
||||||
binding.infoLayout.timeAgoShort.text = "(" + dateUtil.minAgoShort(overviewData.lastBg?.timestamp) + ")"
|
}
|
||||||
|
|
||||||
val qualityIcon = bgQualityCheckPlugin.icon()
|
// strike through if BG is old
|
||||||
if (qualityIcon != 0) {
|
binding.infoLayout.bg.paintFlags =
|
||||||
binding.infoLayout.bgQuality.visibility = View.VISIBLE
|
if (!isActualBg) binding.infoLayout.bg.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
|
||||||
binding.infoLayout.bgQuality.setImageResource(qualityIcon)
|
else binding.infoLayout.bg.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
|
||||||
binding.infoLayout.bgQuality.contentDescription = rh.gs(R.string.a11y_bg_quality) + " " + bgQualityCheckPlugin.stateDescription()
|
|
||||||
binding.infoLayout.bgQuality.setOnClickListener {
|
val outDate = (if (!isActualBg) rh.gs(R.string.a11y_bg_outdated) else "")
|
||||||
context?.let { context -> OKDialog.show(context, rh.gs(R.string.data_status), bgQualityCheckPlugin.message) }
|
binding.infoLayout.bg.contentDescription = rh.gs(R.string.a11y_blood_glucose) + " " + binding.infoLayout.bg.text.toString() + " " + lastBgDescription + " " + outDate
|
||||||
|
|
||||||
|
binding.infoLayout.timeAgo.text = dateUtil.minAgo(rh, lastBg?.timestamp)
|
||||||
|
binding.infoLayout.timeAgo.contentDescription = dateUtil.minAgoLong(rh, lastBg?.timestamp)
|
||||||
|
binding.infoLayout.timeAgoShort.text = "(" + dateUtil.minAgoShort(lastBg?.timestamp) + ")"
|
||||||
|
|
||||||
|
val qualityIcon = bgQualityCheckPlugin.icon()
|
||||||
|
if (qualityIcon != 0) {
|
||||||
|
binding.infoLayout.bgQuality.visibility = View.VISIBLE
|
||||||
|
binding.infoLayout.bgQuality.setImageResource(qualityIcon)
|
||||||
|
binding.infoLayout.bgQuality.contentDescription = rh.gs(R.string.a11y_bg_quality) + " " + bgQualityCheckPlugin.stateDescription()
|
||||||
|
binding.infoLayout.bgQuality.setOnClickListener {
|
||||||
|
context?.let { context -> OKDialog.show(context, rh.gs(R.string.data_status), bgQualityCheckPlugin.message) }
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
binding.infoLayout.bgQuality.visibility = View.GONE
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
binding.infoLayout.bgQuality.visibility = View.GONE
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateProfile() {
|
fun updateProfile() {
|
||||||
_binding ?: return
|
val profile = profileFunction.getProfile()
|
||||||
val profileBackgroundColor =
|
runOnUiThread {
|
||||||
profileFunction.getProfile()?.let {
|
_binding ?: return@runOnUiThread
|
||||||
|
val profileBackgroundColor = profile?.let {
|
||||||
if (it is ProfileSealed.EPS) {
|
if (it is ProfileSealed.EPS) {
|
||||||
if (it.value.originalPercentage != 100 || it.value.originalTimeshift != 0L || it.value.originalDuration != 0L)
|
if (it.value.originalPercentage != 100 || it.value.originalTimeshift != 0L || it.value.originalDuration != 0L)
|
||||||
R.attr.ribbonWarningColor
|
R.attr.ribbonWarningColor
|
||||||
|
@ -824,8 +844,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
}
|
}
|
||||||
} ?: R.attr.ribbonCriticalColor
|
} ?: R.attr.ribbonCriticalColor
|
||||||
|
|
||||||
val profileTextColor =
|
val profileTextColor = profile?.let {
|
||||||
profileFunction.getProfile()?.let {
|
|
||||||
if (it is ProfileSealed.EPS) {
|
if (it is ProfileSealed.EPS) {
|
||||||
if (it.value.originalPercentage != 100 || it.value.originalTimeshift != 0L || it.value.originalDuration != 0L)
|
if (it.value.originalPercentage != 100 || it.value.originalTimeshift != 0L || it.value.originalDuration != 0L)
|
||||||
R.attr.ribbonTextWarningColor
|
R.attr.ribbonTextWarningColor
|
||||||
|
@ -836,27 +855,35 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
R.attr.ribbonTextDefaultColor
|
R.attr.ribbonTextDefaultColor
|
||||||
}
|
}
|
||||||
} ?: R.attr.ribbonTextDefaultColor
|
} ?: R.attr.ribbonTextDefaultColor
|
||||||
setRibbon(binding.activeProfile, profileTextColor, profileBackgroundColor, profileFunction.getProfileNameWithRemainingTime())
|
setRibbon(binding.activeProfile, profileTextColor, profileBackgroundColor, profileFunction.getProfileNameWithRemainingTime())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateTemporaryBasal() {
|
private fun updateTemporaryBasal() {
|
||||||
_binding ?: return
|
val temporaryBasalText = overviewData.temporaryBasalText(iobCobCalculator)
|
||||||
binding.infoLayout.baseBasal.text = overviewData.temporaryBasalText(iobCobCalculator)
|
val temporaryBasalColor = overviewData.temporaryBasalColor(context, iobCobCalculator)
|
||||||
binding.infoLayout.baseBasal.setTextColor(overviewData.temporaryBasalColor(context, iobCobCalculator))
|
val temporaryBasalIcon = overviewData.temporaryBasalIcon(iobCobCalculator)
|
||||||
binding.infoLayout.baseBasalIcon.setImageResource(overviewData.temporaryBasalIcon(iobCobCalculator))
|
val temporaryBasalDialogText = overviewData.temporaryBasalDialogText(iobCobCalculator)
|
||||||
binding.infoLayout.basalLayout.setOnClickListener {
|
runOnUiThread {
|
||||||
activity?.let { OKDialog.show(it, rh.gs(R.string.basal), overviewData.temporaryBasalDialogText(iobCobCalculator)) }
|
_binding ?: return@runOnUiThread
|
||||||
|
binding.infoLayout.baseBasal.text = temporaryBasalText
|
||||||
|
binding.infoLayout.baseBasal.setTextColor(temporaryBasalColor)
|
||||||
|
binding.infoLayout.baseBasalIcon.setImageResource(temporaryBasalIcon)
|
||||||
|
binding.infoLayout.basalLayout.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.basal), temporaryBasalDialogText) } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateExtendedBolus() {
|
private fun updateExtendedBolus() {
|
||||||
_binding ?: return
|
|
||||||
val pump = activePlugin.activePump
|
val pump = activePlugin.activePump
|
||||||
binding.infoLayout.extendedBolus.text = overviewData.extendedBolusText(iobCobCalculator)
|
val extendedBolus = iobCobCalculator.getExtendedBolus(dateUtil.now())
|
||||||
binding.infoLayout.extendedLayout.setOnClickListener {
|
val extendedBolusText = overviewData.extendedBolusText(iobCobCalculator)
|
||||||
activity?.let { OKDialog.show(it, rh.gs(R.string.extended_bolus), overviewData.extendedBolusDialogText(iobCobCalculator)) }
|
val extendedBolusDialogText = overviewData.extendedBolusDialogText(iobCobCalculator)
|
||||||
|
runOnUiThread {
|
||||||
|
_binding ?: return@runOnUiThread
|
||||||
|
binding.infoLayout.extendedBolus.text = extendedBolusText
|
||||||
|
binding.infoLayout.extendedLayout.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.extended_bolus), extendedBolusDialogText) } }
|
||||||
|
binding.infoLayout.extendedLayout.visibility = (extendedBolus != null && !pump.isFakingTempsByExtendedBoluses).toVisibility()
|
||||||
}
|
}
|
||||||
binding.infoLayout.extendedLayout.visibility = (iobCobCalculator.getExtendedBolus(dateUtil.now()) != null && !pump.isFakingTempsByExtendedBoluses).toVisibility()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateTime() {
|
fun updateTime() {
|
||||||
|
@ -887,69 +914,73 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
binding.statusLightsLayout.pbAge,
|
binding.statusLightsLayout.pbAge,
|
||||||
binding.statusLightsLayout.batteryLevel
|
binding.statusLightsLayout.batteryLevel
|
||||||
)
|
)
|
||||||
processButtonsVisibility()
|
|
||||||
processAps()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun updateIobCob() {
|
fun updateIobCob() {
|
||||||
_binding ?: return
|
val iobText = overviewData.iobText(iobCobCalculator)
|
||||||
binding.infoLayout.iob.text = overviewData.iobText(iobCobCalculator)
|
val iobDialogText = overviewData.iobDialogText(iobCobCalculator)
|
||||||
binding.infoLayout.iobLayout.setOnClickListener {
|
val displayText = overviewData.cobInfo(iobCobCalculator).displayText(rh, dateUtil, buildHelper.isEngineeringMode())
|
||||||
activity?.let { OKDialog.show(it, rh.gs(R.string.iob), overviewData.iobDialogText(iobCobCalculator)) }
|
val lastCarbsTime = overviewData.lastCarbsTime
|
||||||
}
|
runOnUiThread {
|
||||||
// cob
|
_binding ?: return@runOnUiThread
|
||||||
var cobText = overviewData.cobInfo(iobCobCalculator).displayText(rh, dateUtil, buildHelper.isEngineeringMode()) ?: rh.gs(R.string.value_unavailable_short)
|
binding.infoLayout.iob.text = iobText
|
||||||
|
binding.infoLayout.iobLayout.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(R.string.iob), iobDialogText) } }
|
||||||
|
// cob
|
||||||
|
var cobText = displayText ?: rh.gs(R.string.value_unavailable_short)
|
||||||
|
|
||||||
val constraintsProcessed = loop.lastRun?.constraintsProcessed
|
val constraintsProcessed = loop.lastRun?.constraintsProcessed
|
||||||
val lastRun = loop.lastRun
|
val lastRun = loop.lastRun
|
||||||
if (config.APS && constraintsProcessed != null && lastRun != null) {
|
if (config.APS && constraintsProcessed != null && lastRun != null) {
|
||||||
if (constraintsProcessed.carbsReq > 0) {
|
if (constraintsProcessed.carbsReq > 0) {
|
||||||
//only display carbsreq when carbs have not been entered recently
|
//only display carbsreq when carbs have not been entered recently
|
||||||
if (overviewData.lastCarbsTime < lastRun.lastAPSRun) {
|
if (lastCarbsTime < lastRun.lastAPSRun) {
|
||||||
cobText += " | " + constraintsProcessed.carbsReq + " " + rh.gs(R.string.required)
|
cobText += " | " + constraintsProcessed.carbsReq + " " + rh.gs(R.string.required)
|
||||||
|
}
|
||||||
|
if (carbAnimation?.isRunning == false)
|
||||||
|
carbAnimation?.start()
|
||||||
|
} else {
|
||||||
|
carbAnimation?.stop()
|
||||||
|
carbAnimation?.selectDrawable(0)
|
||||||
}
|
}
|
||||||
if (carbAnimation?.isRunning == false)
|
|
||||||
carbAnimation?.start()
|
|
||||||
} else {
|
|
||||||
carbAnimation?.stop()
|
|
||||||
carbAnimation?.selectDrawable(0)
|
|
||||||
}
|
}
|
||||||
|
binding.infoLayout.cob.text = cobText
|
||||||
}
|
}
|
||||||
binding.infoLayout.cob.text = cobText
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
fun updateTemporaryTarget() {
|
fun updateTemporaryTarget() {
|
||||||
_binding ?: return
|
|
||||||
val units = profileFunction.getUnits()
|
val units = profileFunction.getUnits()
|
||||||
val tempTarget = overviewData.temporaryTarget
|
val tempTarget = overviewData.temporaryTarget
|
||||||
if (tempTarget != null) {
|
runOnUiThread {
|
||||||
setRibbon(
|
_binding ?: return@runOnUiThread
|
||||||
binding.tempTarget,
|
if (tempTarget != null) {
|
||||||
R.attr.ribbonTextWarningColor,
|
setRibbon(
|
||||||
R.attr.ribbonWarningColor,
|
binding.tempTarget,
|
||||||
Profile.toTargetRangeString(tempTarget.lowTarget, tempTarget.highTarget, GlucoseUnit.MGDL, units) + " " + dateUtil.untilString(tempTarget.end, rh)
|
R.attr.ribbonTextWarningColor,
|
||||||
)
|
R.attr.ribbonWarningColor,
|
||||||
} else {
|
Profile.toTargetRangeString(tempTarget.lowTarget, tempTarget.highTarget, GlucoseUnit.MGDL, units) + " " + dateUtil.untilString(tempTarget.end, rh)
|
||||||
// If the target is not the same as set in the profile then oref has overridden it
|
)
|
||||||
profileFunction.getProfile()?.let { profile ->
|
} else {
|
||||||
val targetUsed = loop.lastRun?.constraintsProcessed?.targetBG ?: 0.0
|
// If the target is not the same as set in the profile then oref has overridden it
|
||||||
|
profileFunction.getProfile()?.let { profile ->
|
||||||
|
val targetUsed = loop.lastRun?.constraintsProcessed?.targetBG ?: 0.0
|
||||||
|
|
||||||
if (targetUsed != 0.0 && abs(profile.getTargetMgdl() - targetUsed) > 0.01) {
|
if (targetUsed != 0.0 && abs(profile.getTargetMgdl() - targetUsed) > 0.01) {
|
||||||
aapsLogger.debug("Adjusted target. Profile: ${profile.getTargetMgdl()} APS: $targetUsed")
|
aapsLogger.debug("Adjusted target. Profile: ${profile.getTargetMgdl()} APS: $targetUsed")
|
||||||
setRibbon(
|
setRibbon(
|
||||||
binding.tempTarget,
|
binding.tempTarget,
|
||||||
R.attr.ribbonTextWarningColor,
|
R.attr.ribbonTextWarningColor,
|
||||||
R.attr.tempTargetBackgroundColor,
|
R.attr.tempTargetBackgroundColor,
|
||||||
Profile.toTargetRangeString(targetUsed, targetUsed, GlucoseUnit.MGDL, units)
|
Profile.toTargetRangeString(targetUsed, targetUsed, GlucoseUnit.MGDL, units)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
setRibbon(
|
setRibbon(
|
||||||
binding.tempTarget,
|
binding.tempTarget,
|
||||||
R.attr.ribbonTextDefaultColor,
|
R.attr.ribbonTextDefaultColor,
|
||||||
R.attr.ribbonDefaultColor,
|
R.attr.ribbonDefaultColor,
|
||||||
Profile.toTargetRangeString(profile.getTargetLowMgdl(), profile.getTargetHighMgdl(), GlucoseUnit.MGDL, units)
|
Profile.toTargetRangeString(profile.getTargetLowMgdl(), profile.getTargetHighMgdl(), GlucoseUnit.MGDL, units)
|
||||||
)
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue