TBR as live
This commit is contained in:
parent
1af0cc5aeb
commit
3040be317c
4 changed files with 136 additions and 37 deletions
|
@ -0,0 +1,65 @@
|
||||||
|
package info.nightscout.androidaps.plugins.general.overview
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.R
|
||||||
|
import info.nightscout.androidaps.database.entities.TemporaryBasal
|
||||||
|
import info.nightscout.androidaps.extensions.convertedToPercent
|
||||||
|
import info.nightscout.androidaps.extensions.toStringFull
|
||||||
|
import info.nightscout.androidaps.extensions.toStringShort
|
||||||
|
import info.nightscout.androidaps.interfaces.Profile
|
||||||
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
class OverviewData @Inject constructor(
|
||||||
|
private val resourceHelper: ResourceHelper,
|
||||||
|
private val dateUtil: DateUtil
|
||||||
|
) {
|
||||||
|
|
||||||
|
enum class Property {
|
||||||
|
PROFILE,
|
||||||
|
TEMPORARY_BASAL
|
||||||
|
}
|
||||||
|
|
||||||
|
@get:Synchronized @set:Synchronized
|
||||||
|
var profile: Profile? = null
|
||||||
|
|
||||||
|
@get:Synchronized @set:Synchronized
|
||||||
|
var profileName: String? = null
|
||||||
|
|
||||||
|
var temporaryBasal: TemporaryBasal? = null
|
||||||
|
|
||||||
|
val temporaryBasalText: String
|
||||||
|
get() =
|
||||||
|
profile?.let { profile ->
|
||||||
|
temporaryBasal?.let { "T:" + it.toStringShort() }
|
||||||
|
?: resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())
|
||||||
|
} ?: resourceHelper.gs(R.string.notavailable)
|
||||||
|
|
||||||
|
val temporaryBasalDialogText: String
|
||||||
|
get() = profile?.let { profile ->
|
||||||
|
temporaryBasal?.let { temporaryBasal ->
|
||||||
|
"${resourceHelper.gs(R.string.basebasalrate_label)}: ${resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())}" +
|
||||||
|
"\n" + resourceHelper.gs(R.string.tempbasal_label) + ": " + temporaryBasal.toStringFull(profile, dateUtil)
|
||||||
|
}
|
||||||
|
?: "${resourceHelper.gs(R.string.basebasalrate_label)}: ${resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())}"
|
||||||
|
} ?: resourceHelper.gs(R.string.notavailable)
|
||||||
|
|
||||||
|
val temporaryBasalIcon: Int
|
||||||
|
get() =
|
||||||
|
profile?.let { profile ->
|
||||||
|
temporaryBasal?.let { temporaryBasal ->
|
||||||
|
val percentRate = temporaryBasal.convertedToPercent(dateUtil.now(), profile)
|
||||||
|
when {
|
||||||
|
percentRate > 100 -> R.drawable.ic_cp_basal_tbr_high
|
||||||
|
percentRate < 100 -> R.drawable.ic_cp_basal_tbr_low
|
||||||
|
else -> R.drawable.ic_cp_basal_no_tbr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ?: R.drawable.ic_cp_basal_no_tbr
|
||||||
|
|
||||||
|
val temporaryBasalColor: Int
|
||||||
|
get() = temporaryBasal?.let { resourceHelper.gc(R.color.basal) }
|
||||||
|
?: resourceHelper.gc(R.color.defaulttextcolor)
|
||||||
|
}
|
|
@ -46,6 +46,7 @@ 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.nsclient.data.NSDeviceStatus
|
import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus
|
||||||
import info.nightscout.androidaps.plugins.general.overview.activities.QuickWizardListActivity
|
import info.nightscout.androidaps.plugins.general.overview.activities.QuickWizardListActivity
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverview
|
||||||
import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData
|
import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData
|
||||||
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.GlucoseValueDataPoint
|
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.GlucoseValueDataPoint
|
||||||
import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationStore
|
import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationStore
|
||||||
|
@ -115,6 +116,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
@Inject lateinit var uel: UserEntryLogger
|
@Inject lateinit var uel: UserEntryLogger
|
||||||
@Inject lateinit var repository: AppRepository
|
@Inject lateinit var repository: AppRepository
|
||||||
@Inject lateinit var glucoseStatusProvider: GlucoseStatusProvider
|
@Inject lateinit var glucoseStatusProvider: GlucoseStatusProvider
|
||||||
|
@Inject lateinit var overviewData: OverviewData
|
||||||
|
|
||||||
private val disposable = CompositeDisposable()
|
private val disposable = CompositeDisposable()
|
||||||
|
|
||||||
|
@ -223,14 +225,14 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
if (it.now) updateGUI(it.from)
|
if (it.now) updateGUI(it.from)
|
||||||
else scheduleUpdateGUI(it.from)
|
else scheduleUpdateGUI(it.from)
|
||||||
}, fabricPrivacy::logException))
|
}, fabricPrivacy::logException))
|
||||||
|
disposable.add(rxBus
|
||||||
|
.toObservable(EventUpdateOverview::class.java)
|
||||||
|
.observeOn(aapsSchedulers.main)
|
||||||
|
.subscribe({ updateGUI(it.what) }, fabricPrivacy::logException))
|
||||||
disposable.add(rxBus
|
disposable.add(rxBus
|
||||||
.toObservable(EventExtendedBolusChange::class.java)
|
.toObservable(EventExtendedBolusChange::class.java)
|
||||||
.observeOn(aapsSchedulers.io)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ scheduleUpdateGUI("EventExtendedBolusChange") }, fabricPrivacy::logException))
|
.subscribe({ scheduleUpdateGUI("EventExtendedBolusChange") }, fabricPrivacy::logException))
|
||||||
disposable.add(rxBus
|
|
||||||
.toObservable(EventTempBasalChange::class.java)
|
|
||||||
.observeOn(aapsSchedulers.io)
|
|
||||||
.subscribe({ scheduleUpdateGUI("EventTempBasalChange") }, fabricPrivacy::logException))
|
|
||||||
disposable.add(rxBus
|
disposable.add(rxBus
|
||||||
.toObservable(EventTreatmentChange::class.java)
|
.toObservable(EventTreatmentChange::class.java)
|
||||||
.observeOn(aapsSchedulers.io)
|
.observeOn(aapsSchedulers.io)
|
||||||
|
@ -255,10 +257,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
.toObservable(EventAutosensCalculationFinished::class.java)
|
.toObservable(EventAutosensCalculationFinished::class.java)
|
||||||
.observeOn(aapsSchedulers.io)
|
.observeOn(aapsSchedulers.io)
|
||||||
.subscribe({ scheduleUpdateGUI("EventAutosensCalculationFinished") }, fabricPrivacy::logException))
|
.subscribe({ scheduleUpdateGUI("EventAutosensCalculationFinished") }, fabricPrivacy::logException))
|
||||||
disposable.add(rxBus
|
|
||||||
.toObservable(EventProfileSwitchChanged::class.java)
|
|
||||||
.observeOn(aapsSchedulers.io)
|
|
||||||
.subscribe({ scheduleUpdateGUI("EventProfileNeedsUpdate") }, fabricPrivacy::logException))
|
|
||||||
disposable.add(rxBus
|
disposable.add(rxBus
|
||||||
.toObservable(EventPreferenceChange::class.java)
|
.toObservable(EventPreferenceChange::class.java)
|
||||||
.observeOn(aapsSchedulers.io)
|
.observeOn(aapsSchedulers.io)
|
||||||
|
@ -544,6 +542,22 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
view?.postDelayed(task, 500)
|
view?.postDelayed(task, 500)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun updateGUI(what: OverviewData.Property) {
|
||||||
|
when (what) {
|
||||||
|
OverviewData.Property.PROFILE -> TODO()
|
||||||
|
|
||||||
|
OverviewData.Property.TEMPORARY_BASAL -> {
|
||||||
|
// Basal, TBR
|
||||||
|
binding.infoLayout.baseBasal.text = overviewData.temporaryBasalText
|
||||||
|
binding.infoLayout.baseBasal.setTextColor(overviewData.temporaryBasalColor)
|
||||||
|
binding.infoLayout.baseBasalIcon.setImageResource(overviewData.temporaryBasalIcon)
|
||||||
|
binding.infoLayout.basalLayout.setOnClickListener {
|
||||||
|
activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.basal), overviewData.temporaryBasalDialogText) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
fun updateGUI(from: String) {
|
fun updateGUI(from: String) {
|
||||||
if (_binding == null) return
|
if (_binding == null) return
|
||||||
|
@ -551,7 +565,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
|
|
||||||
binding.infoLayout.time.text = dateUtil.timeString(dateUtil.now())
|
binding.infoLayout.time.text = dateUtil.timeString(dateUtil.now())
|
||||||
|
|
||||||
if (!profileFunction.isProfileValid("Overview")) {
|
if (overviewData.profile == null) {
|
||||||
binding.loopPumpStatusLayout.pumpStatus.setText(R.string.noprofileset)
|
binding.loopPumpStatusLayout.pumpStatus.setText(R.string.noprofileset)
|
||||||
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.VISIBLE
|
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.VISIBLE
|
||||||
binding.loopPumpStatusLayout.loopLayout.visibility = View.GONE
|
binding.loopPumpStatusLayout.loopLayout.visibility = View.GONE
|
||||||
|
@ -561,7 +575,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.GONE
|
binding.loopPumpStatusLayout.pumpStatusLayout.visibility = View.GONE
|
||||||
binding.loopPumpStatusLayout.loopLayout.visibility = View.VISIBLE
|
binding.loopPumpStatusLayout.loopLayout.visibility = View.VISIBLE
|
||||||
|
|
||||||
val profile = profileFunction.getProfile() ?: return
|
val profile = overviewData.profile ?: return
|
||||||
val actualBG = iobCobCalculator.ads.actualBg()
|
val actualBG = iobCobCalculator.ads.actualBg()
|
||||||
val lastBG = iobCobCalculator.ads.lastBg()
|
val lastBG = iobCobCalculator.ads.lastBg()
|
||||||
val pump = activePlugin.activePump
|
val pump = activePlugin.activePump
|
||||||
|
@ -701,27 +715,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Basal, TBR
|
|
||||||
val activeTemp = iobCobCalculator.getTempBasalIncludingConvertedExtended(System.currentTimeMillis())
|
|
||||||
binding.infoLayout.baseBasal.text = activeTemp?.let { "T:" + activeTemp.toStringShort() }
|
|
||||||
?: resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())
|
|
||||||
binding.infoLayout.basalLayout.setOnClickListener {
|
|
||||||
var fullText = "${resourceHelper.gs(R.string.basebasalrate_label)}: ${resourceHelper.gs(R.string.pump_basebasalrate, profile.getBasal())}"
|
|
||||||
if (activeTemp != null)
|
|
||||||
fullText += "\n" + resourceHelper.gs(R.string.tempbasal_label) + ": " + activeTemp.toStringFull(profile, dateUtil)
|
|
||||||
activity?.let {
|
|
||||||
OKDialog.show(it, resourceHelper.gs(R.string.basal), fullText)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
binding.infoLayout.baseBasal.setTextColor(activeTemp?.let { resourceHelper.gc(R.color.basal) }
|
|
||||||
?: resourceHelper.gc(R.color.defaulttextcolor))
|
|
||||||
|
|
||||||
binding.infoLayout.baseBasalIcon.setImageResource(R.drawable.ic_cp_basal_no_tbr)
|
|
||||||
val percentRate = activeTemp?.convertedToPercent(System.currentTimeMillis(), profile)
|
|
||||||
?: 100
|
|
||||||
if (percentRate > 100) binding.infoLayout.baseBasalIcon.setImageResource(R.drawable.ic_cp_basal_tbr_high)
|
|
||||||
if (percentRate < 100) binding.infoLayout.baseBasalIcon.setImageResource(R.drawable.ic_cp_basal_tbr_low)
|
|
||||||
|
|
||||||
// Extended bolus
|
// Extended bolus
|
||||||
val extendedBolus = repository.getExtendedBolusActiveAt(dateUtil.now()).blockingGet()
|
val extendedBolus = repository.getExtendedBolusActiveAt(dateUtil.now()).blockingGet()
|
||||||
binding.infoLayout.extendedBolus.text =
|
binding.infoLayout.extendedBolus.text =
|
||||||
|
|
|
@ -3,19 +3,20 @@ package info.nightscout.androidaps.plugins.general.overview
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.SwitchPreference
|
import androidx.preference.SwitchPreference
|
||||||
import dagger.android.HasAndroidInjector
|
import dagger.android.HasAndroidInjector
|
||||||
import info.nightscout.androidaps.interfaces.Config
|
|
||||||
import info.nightscout.androidaps.R
|
import info.nightscout.androidaps.R
|
||||||
|
import info.nightscout.androidaps.events.EventAppInitialized
|
||||||
|
import info.nightscout.androidaps.events.EventProfileSwitchChanged
|
||||||
import info.nightscout.androidaps.events.EventRefreshOverview
|
import info.nightscout.androidaps.events.EventRefreshOverview
|
||||||
|
import info.nightscout.androidaps.events.EventTempBasalChange
|
||||||
import info.nightscout.androidaps.extensions.*
|
import info.nightscout.androidaps.extensions.*
|
||||||
import info.nightscout.androidaps.interfaces.Overview
|
import info.nightscout.androidaps.interfaces.*
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginDescription
|
|
||||||
import info.nightscout.androidaps.interfaces.PluginType
|
|
||||||
import info.nightscout.androidaps.logging.AAPSLogger
|
import info.nightscout.androidaps.logging.AAPSLogger
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification
|
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
|
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverview
|
||||||
import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationStore
|
import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationStore
|
||||||
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
import info.nightscout.androidaps.utils.rx.AapsSchedulers
|
import info.nightscout.androidaps.utils.rx.AapsSchedulers
|
||||||
|
@ -36,7 +37,11 @@ class OverviewPlugin @Inject constructor(
|
||||||
aapsLogger: AAPSLogger,
|
aapsLogger: AAPSLogger,
|
||||||
private val aapsSchedulers: AapsSchedulers,
|
private val aapsSchedulers: AapsSchedulers,
|
||||||
resourceHelper: ResourceHelper,
|
resourceHelper: ResourceHelper,
|
||||||
private val config: Config
|
private val config: Config,
|
||||||
|
private val dateUtil: DateUtil,
|
||||||
|
private val profileFunction: ProfileFunction,
|
||||||
|
private val iobCobCalculator: IobCobCalculator,
|
||||||
|
private val overviewData: OverviewData
|
||||||
) : PluginBase(PluginDescription()
|
) : PluginBase(PluginDescription()
|
||||||
.mainType(PluginType.GENERAL)
|
.mainType(PluginType.GENERAL)
|
||||||
.fragmentClass(OverviewFragment::class.qualifiedName)
|
.fragmentClass(OverviewFragment::class.qualifiedName)
|
||||||
|
@ -69,6 +74,18 @@ class OverviewPlugin @Inject constructor(
|
||||||
if (notificationStore.remove(n.id))
|
if (notificationStore.remove(n.id))
|
||||||
rxBus.send(EventRefreshOverview("EventDismissNotification"))
|
rxBus.send(EventRefreshOverview("EventDismissNotification"))
|
||||||
}, fabricPrivacy::logException)
|
}, fabricPrivacy::logException)
|
||||||
|
disposable += rxBus
|
||||||
|
.toObservable(EventAppInitialized::class.java)
|
||||||
|
.observeOn(aapsSchedulers.io)
|
||||||
|
.subscribe( { loadAll() }, fabricPrivacy::logException)
|
||||||
|
disposable += rxBus
|
||||||
|
.toObservable(EventTempBasalChange::class.java)
|
||||||
|
.observeOn(aapsSchedulers.io)
|
||||||
|
.subscribe( { loadTemporaryBasal() }, fabricPrivacy::logException)
|
||||||
|
disposable.add(rxBus
|
||||||
|
.toObservable(EventProfileSwitchChanged::class.java)
|
||||||
|
.observeOn(aapsSchedulers.io)
|
||||||
|
.subscribe({ loadProfile() }, fabricPrivacy::logException))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
|
@ -142,4 +159,22 @@ class OverviewPlugin @Inject constructor(
|
||||||
.storeDouble(R.string.key_statuslights_bat_warning, sp, resourceHelper)
|
.storeDouble(R.string.key_statuslights_bat_warning, sp, resourceHelper)
|
||||||
.storeDouble(R.string.key_statuslights_bat_critical, sp, resourceHelper)
|
.storeDouble(R.string.key_statuslights_bat_critical, sp, resourceHelper)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun loadAll() {
|
||||||
|
loadProfile()
|
||||||
|
loadTemporaryBasal()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun loadProfile() {
|
||||||
|
overviewData.profile = profileFunction.getProfile()
|
||||||
|
overviewData.profileName = profileFunction.getProfileName()
|
||||||
|
rxBus.send(EventUpdateOverview(OverviewData.Property.PROFILE))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Synchronized
|
||||||
|
private fun loadTemporaryBasal() {
|
||||||
|
overviewData.temporaryBasal = iobCobCalculator.getTempBasalIncludingConvertedExtended(dateUtil.now())
|
||||||
|
rxBus.send(EventUpdateOverview(OverviewData.Property.TEMPORARY_BASAL))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
package info.nightscout.androidaps.plugins.general.overview.events
|
||||||
|
|
||||||
|
import info.nightscout.androidaps.events.Event
|
||||||
|
import info.nightscout.androidaps.plugins.general.overview.OverviewData
|
||||||
|
|
||||||
|
class EventUpdateOverview(val what: OverviewData.Property) : Event()
|
Loading…
Reference in a new issue