:core:graph

This commit is contained in:
Milos Kozak 2022-11-22 21:39:19 +01:00
parent cb9ea1d06b
commit fda8498c8e
168 changed files with 799 additions and 568 deletions

View file

@ -188,6 +188,7 @@ dependencies {
implementation project(':app-wear-shared:shared')
implementation project(':app-wear-shared:shared-impl')
implementation project(':core:core-main')
implementation project(':core:graph')
implementation project(':core:utils')
implementation project(':core:ui')
implementation project(':interfaces')

View file

@ -17,11 +17,11 @@ import info.nightscout.androidaps.plugins.general.overview.OverviewMenus
import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewGraph
import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.events.EventAutosensCalculationFinished
import info.nightscout.rx.events.EventCustomCalculationFinished

View file

@ -1,13 +1,14 @@
package info.nightscout.androidaps.activities
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.database.impl.AppRepository
import info.nightscout.implementation.overview.OverviewDataImpl
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
@ -41,7 +42,7 @@ class HistoryBrowserData @Inject constructor(
init {
// We don't want to use injected singletons but own instance working on top of different data
overviewData =
OverviewData(
OverviewDataImpl(
aapsLogger,
rh,
dateUtil,

View file

@ -31,7 +31,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.EopatchPumpPlugin
import info.nightscout.androidaps.plugins.pump.insight.LocalInsightPlugin
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin
import info.nightscout.automation.AutomationPlugin
import info.nightscout.core.profile.toCurrentUnits
import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.plugin.PluginBase

View file

@ -15,9 +15,9 @@ import info.nightscout.androidaps.diaconn.database.DiaconnHistoryDatabase
import info.nightscout.androidaps.insight.database.InsightDatabase
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.general.maintenance.activities.LogSettingActivity
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.pump.omnipod.dash.history.database.DashHistoryDatabase
import info.nightscout.androidaps.plugins.pump.omnipod.eros.history.database.ErosHistoryDatabase
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.database.entities.UserEntry.Action

View file

@ -42,12 +42,9 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOve
import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.automation.AutomationPlugin
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.iob.displayText
import info.nightscout.core.profile.toSignedUnitsString
import info.nightscout.core.profile.toTargetRangeString
import info.nightscout.core.profile.toUnits
import info.nightscout.core.ui.UIRunnable
import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.core.ui.elements.SingleClickButton
@ -67,6 +64,7 @@ import info.nightscout.interfaces.constraints.Constraints
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.protection.ProtectionCheck
@ -555,7 +553,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
binding.buttonsLayout.quickWizardButton.visibility = View.VISIBLE
val wizard = quickWizardEntry.doCalc(profile, profileName, lastBG, false)
binding.buttonsLayout.quickWizardButton.text = quickWizardEntry.buttonText() + "\n" + rh.gs(R.string.format_carbs, quickWizardEntry.carbs()) +
" " + rh.gs(R.string.formatinsulinunits, wizard.calculatedTotalInsulin)
" " + rh.gs(R.string.format_insulin_units, wizard.calculatedTotalInsulin)
if (wizard.calculatedTotalInsulin <= 0) binding.buttonsLayout.quickWizardButton.visibility = View.GONE
} else binding.buttonsLayout.quickWizardButton.visibility = View.GONE
}

View file

@ -16,6 +16,7 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNo
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.androidaps.plugins.general.overview.events.EventUpdateOverviewCalcProgress
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.interfaces.Config

View file

@ -9,16 +9,14 @@ import com.jjoe64.graphview.series.LineGraphSeries
import com.jjoe64.graphview.series.Series
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.AreaGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.BolusDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DoubleDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.EffectiveProfileSwitchDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.GlucoseValueDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.TimeAsXAxisLabelFormatter
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.BolusDataPoint
import info.nightscout.core.graph.data.EffectiveProfileSwitchDataPoint
import info.nightscout.core.graph.data.GlucoseValueDataPoint
import info.nightscout.core.graph.data.TimeAsXAxisLabelFormatter
import info.nightscout.core.ui.toast.ToastUtils
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.Round
import info.nightscout.rx.logging.AAPSLogger
@ -66,10 +64,10 @@ class GraphData(
fun addInRangeArea(fromTime: Long, toTime: Long, lowLine: Double, highLine: Double) {
val inRangeAreaDataPoints = arrayOf(
DoubleDataPoint(fromTime.toDouble(), lowLine, highLine),
DoubleDataPoint(toTime.toDouble(), lowLine, highLine)
info.nightscout.core.graph.data.DoubleDataPoint(fromTime.toDouble(), lowLine, highLine),
info.nightscout.core.graph.data.DoubleDataPoint(toTime.toDouble(), lowLine, highLine)
)
addSeries(AreaGraphSeries(inRangeAreaDataPoints).also {
addSeries(info.nightscout.core.graph.data.AreaGraphSeries(inRangeAreaDataPoints).also {
it.color = 0
it.isDrawBackground = true
it.backgroundColor = rh.gac(graph.context, R.attr.inRangeBackground)

View file

@ -11,10 +11,8 @@ import info.nightscout.androidaps.R
import info.nightscout.androidaps.extensions.toStringShort
import info.nightscout.androidaps.extensions.valueToUnitsString
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.core.iob.generateCOBString
import info.nightscout.core.iob.round
import info.nightscout.core.profile.toSignedUnitsString
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.NotificationHolder
@ -26,6 +24,7 @@ import info.nightscout.interfaces.plugin.PluginType
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.ui.IconsProvider
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.EventAutosensCalculationFinished

View file

@ -10,19 +10,14 @@ import info.nightscout.androidaps.extensions.total
import info.nightscout.androidaps.extensions.valueToUnits
import info.nightscout.androidaps.extensions.valueToUnitsString
import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.GlucoseValueDataPoint
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
import info.nightscout.core.utils.receivers.ReceiverStatusStore
import info.nightscout.androidaps.services.AlarmSoundServiceHelper
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.graph.data.GlucoseValueDataPoint
import info.nightscout.core.iob.generateCOBString
import info.nightscout.core.iob.round
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.core.profile.toMgdl
import info.nightscout.core.profile.toTargetRangeString
import info.nightscout.core.ui.toast.ToastUtils
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.core.utils.receivers.ReceiverStatusStore
import info.nightscout.core.wizard.BolusWizard
import info.nightscout.core.wizard.QuickWizard
import info.nightscout.core.wizard.QuickWizardEntry
@ -47,11 +42,13 @@ import info.nightscout.interfaces.constraints.Constraints
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.plugin.PluginBase
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.pump.DetailedBolusInfo
import info.nightscout.interfaces.queue.Callback
import info.nightscout.interfaces.queue.CommandQueue
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.HardLimits
import info.nightscout.interfaces.utils.TrendCalculator
import info.nightscout.plugins.sync.nsclient.data.ProcessedDeviceStatusData

View file

@ -18,14 +18,14 @@ import dagger.android.AndroidInjection
import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.general.wear.WearPlugin
import info.nightscout.androidaps.plugins.general.wear.events.EventWearUpdateGui
import info.nightscout.core.utils.receivers.ReceiverStatusStore
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.core.utils.receivers.ReceiverStatusStore
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.aps.Loop
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus

View file

@ -10,9 +10,8 @@ import info.nightscout.androidaps.events.EventNewHistoryData
import info.nightscout.androidaps.extensions.convertedToAbsolute
import info.nightscout.androidaps.extensions.iobCalc
import info.nightscout.androidaps.extensions.toTemporaryBasal
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.iob.combine
import info.nightscout.core.iob.copy
import info.nightscout.core.iob.determineBasalJson
@ -40,6 +39,7 @@ import info.nightscout.interfaces.plugin.PluginDescription
import info.nightscout.interfaces.plugin.PluginType
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.MidnightTime
import info.nightscout.rx.AapsSchedulers
import info.nightscout.rx.bus.RxBus

View file

@ -11,7 +11,6 @@ import info.nightscout.androidaps.extensions.target
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensDataObject
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.core.utils.receivers.DataWorkerStorage
@ -26,6 +25,7 @@ import info.nightscout.interfaces.notifications.Notification
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.profiling.Profiler
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.Event
import info.nightscout.rx.events.EventAutosensCalculationFinished

View file

@ -10,7 +10,6 @@ import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensDataObject
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.workflow.CalculationWorkflow
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.core.utils.receivers.DataWorkerStorage
@ -24,6 +23,7 @@ import info.nightscout.interfaces.notifications.Notification
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.profiling.Profiler
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.Event
import info.nightscout.rx.events.EventAutosensCalculationFinished

View file

@ -11,10 +11,10 @@ import androidx.work.WorkManager
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.events.EventNewHistoryData
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobOref1Worker
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobOrefWorker
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.interfaces.iob.IobCobCalculator

View file

@ -9,9 +9,9 @@ import androidx.work.workDataOf
import com.jjoe64.graphview.series.LineGraphSeries
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.ScaledDataPoint
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.ScaledDataPoint
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.profile.ProfileFunction
@ -28,7 +28,7 @@ class PrepareBasalDataWorker(
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var rh: ResourceHelper
@Inject lateinit var rxBus: RxBus
var ctx: Context
private var ctx: Context
init {
(context.applicationContext as HasAndroidInjector).androidInjector().inject(this)
ctx = rh.getThemedCtx(context)

View file

@ -5,16 +5,15 @@ import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.GlucoseValueDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.GlucoseValueDataPoint
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.Round

View file

@ -5,10 +5,10 @@ import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.InMemoryGlucoseValueDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.InMemoryGlucoseValueDataPoint
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.profile.ProfileFunction

View file

@ -10,19 +10,19 @@ import com.jjoe64.graphview.series.BarGraphSeries
import com.jjoe64.graphview.series.LineGraphSeries
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.OverviewMenus
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DeviationDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.FixedLineGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.ScaledDataPoint
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensDataObject
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.DeviationDataPoint
import info.nightscout.core.graph.data.FixedLineGraphSeries
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.graph.data.Scale
import info.nightscout.core.graph.data.ScaledDataPoint
import info.nightscout.core.iob.combine
import info.nightscout.core.iob.copy
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.database.impl.AppRepository
import info.nightscout.database.impl.ValueWrapper
import info.nightscout.interfaces.aps.AutosensResult
@ -30,6 +30,7 @@ import info.nightscout.interfaces.aps.SMBDefaults
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.iob.IobTotal
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag
@ -53,7 +54,7 @@ class PrepareIobAutosensGraphDataWorker(
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var repository: AppRepository
@Inject lateinit var rxBus: RxBus
var ctx: Context
private var ctx: Context
init {
(context.applicationContext as HasAndroidInjector).androidInjector().inject(this)
@ -96,6 +97,25 @@ class PrepareIobAutosensGraphDataWorker(
}
}
class AutosensDataPoint(
private val ad: AutosensDataObject,
private val scale: Scale,
private val chartTime: Long,
private val rh: ResourceHelper
) : DataPointWithLabelInterface {
override fun getX(): Double = chartTime.toDouble()
override fun getY(): Double = scale.transform(ad.cob)
override fun setY(y: Double) {}
override val label: String = ""
override val duration = 0L
override val shape = PointsWithLabelGraphSeries.Shape.COB_FAIL_OVER
override val size = 0.5f
override fun color(context: Context?): Int {
return rh.gac(context, R.attr.cobColor)
}
}
override fun doWork(): Result {
val data = dataWorkerStorage.pickupObject(inputData.getLong(DataWorkerStorage.STORE_KEY, -1)) as PrepareIobAutosensData?
?: return Result.failure(workDataOf("Error" to "missing input data"))
@ -171,9 +191,7 @@ class PrepareIobAutosensGraphDataWorker(
lastCob = cob
}
if (autosensData.failOverToMinAbsorptionRate) {
autosensData.scale = data.overviewData.cobScale
autosensData.chartTime = time
minFailOverActiveList.add(autosensData)
minFailOverActiveList.add(AutosensDataPoint(autosensData, data.overviewData.cobScale, time, rh))
}
}

View file

@ -5,16 +5,16 @@ import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.OverviewMenus
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.GlucoseValueDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.GlucoseValueDataPoint
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.aps.Loop
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.plugins.sync.nsclient.data.ProcessedDeviceStatusData
import info.nightscout.rx.bus.RxBus

View file

@ -9,10 +9,9 @@ import com.jjoe64.graphview.series.LineGraphSeries
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.extensions.target
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.database.impl.AppRepository
import info.nightscout.database.impl.ValueWrapper
import info.nightscout.interfaces.aps.Loop

View file

@ -5,24 +5,23 @@ import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.work.workDataOf
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.plugins.general.overview.OverviewData
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.BolusDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.CarbsDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.EffectiveProfileSwitchDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.ExtendedBolusDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.TherapyEventDataPoint
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.BolusDataPoint
import info.nightscout.core.graph.data.CarbsDataPoint
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.EffectiveProfileSwitchDataPoint
import info.nightscout.core.graph.data.ExtendedBolusDataPoint
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.graph.data.TherapyEventDataPoint
import info.nightscout.core.utils.receivers.DataWorkerStorage
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.Translator
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.database.entities.Bolus
import info.nightscout.database.entities.TherapyEvent
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.Translator
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.Round

View file

@ -8,7 +8,6 @@ import info.nightscout.androidaps.extensions.shiftTargetBlock
import info.nightscout.androidaps.extensions.targetBlockValueBySeconds
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification
import info.nightscout.core.main.R
import info.nightscout.core.profile.toMgdl
import info.nightscout.core.utils.MidnightUtils
import info.nightscout.database.entities.EffectiveProfileSwitch
import info.nightscout.database.entities.ProfileSwitch

View file

@ -2,7 +2,6 @@ package info.nightscout.androidaps.extensions
import com.google.gson.Gson
import com.google.gson.JsonSyntaxException
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.database.entities.BolusCalculatorResult
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps.extensions
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.database.entities.Bolus
import info.nightscout.database.entities.ExtendedBolus
import info.nightscout.database.entities.TemporaryBasal
@ -9,6 +8,7 @@ import info.nightscout.interfaces.aps.AutosensResult
import info.nightscout.interfaces.insulin.Insulin
import info.nightscout.interfaces.iob.IobTotal
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T
import kotlin.math.ceil
@ -30,8 +30,6 @@ fun ExtendedBolus.toStringFull(dateUtil: DateUtil): String =
fun ExtendedBolus.toStringMedium(dateUtil: DateUtil): String =
DecimalFormatter.to2Decimal(rate) + "U/h " + getPassedDurationToTimeInMinutes(dateUtil.now()) + "/" + T.msecs(duration).mins() + "'"
fun ExtendedBolus.toStringTotal(): String = "${DecimalFormatter.to2Decimal(amount)}U ( ${DecimalFormatter.to2Decimal(rate)} U/h )"
fun ExtendedBolus.getPassedDurationToTimeInMinutes(time: Long): Int =
((min(time, end) - timestamp) / 60.0 / 1000).roundToInt()

View file

@ -1,10 +1,10 @@
package info.nightscout.androidaps.extensions
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.database.entities.GlucoseValue
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.utils.DateUtil
import org.json.JSONObject

View file

@ -1,11 +1,11 @@
package info.nightscout.androidaps.extensions
import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.database.entities.ProfileSwitch
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.PureProfile
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.JsonHelper
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps.extensions
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.database.entities.Bolus
import info.nightscout.database.entities.TemporaryBasal
import info.nightscout.database.entities.interfaces.end
@ -8,6 +7,7 @@ import info.nightscout.interfaces.aps.AutosensResult
import info.nightscout.interfaces.insulin.Insulin
import info.nightscout.interfaces.iob.IobTotal
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T
import kotlin.math.ceil

View file

@ -1,12 +1,11 @@
package info.nightscout.androidaps.extensions
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.core.main.R
import info.nightscout.core.profile.toTargetRangeString
import info.nightscout.database.entities.TemporaryTarget
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.utils.DateUtil
import java.util.concurrent.TimeUnit

View file

@ -37,9 +37,9 @@ fun TotalDailyDose.toTableRow(context: Context, rh: ResourceHelper, dateUtil: Da
row.layoutParams = TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT)
row.gravity = Gravity.CENTER_HORIZONTAL
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 0 }; text = dateUtil.dateStringShort(timestamp) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 1 }; text = rh.gs(R.string.formatinsulinunits1, total) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 2 }; text = rh.gs(R.string.formatinsulinunits1, bolusAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 3 }; text = rh.gs(R.string.formatinsulinunits1, basalAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 1 }; text = rh.gs(R.string.format_insulin_units1, total) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 2 }; text = rh.gs(R.string.format_insulin_units1, bolusAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 3 }; text = rh.gs(R.string.format_insulin_units1, basalAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 4 }; text = rh.gs(R.string.formatPercent, basalPct) })
if (includeCarbs)
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 5 }; text = rh.gs(R.string.format_carbs, carbs.toInt()) })
@ -54,9 +54,9 @@ fun TotalDailyDose.toTableRow(context: Context, rh: ResourceHelper, days: Int, i
row.layoutParams = TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT)
row.gravity = Gravity.CENTER_HORIZONTAL
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 0 }; text = "%02d".format(days) + " " + rh.gs(R.string.days) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 1 }; text = rh.gs(R.string.formatinsulinunits1, total) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 2 }; text = rh.gs(R.string.formatinsulinunits1, bolusAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 3 }; text = rh.gs(R.string.formatinsulinunits1, basalAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 1 }; text = rh.gs(R.string.format_insulin_units1, total) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 2 }; text = rh.gs(R.string.format_insulin_units1, bolusAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 3 }; text = rh.gs(R.string.format_insulin_units1, basalAmount) })
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 4 }; text = rh.gs(R.string.formatPercent, basalPct) })
if (includeCarbs)
row.addView(TextView(context).apply { gravity = Gravity.CENTER_HORIZONTAL; layoutParams = lp.apply { column = 5 }; text = rh.gs(R.string.format_carbs, carbs.toInt()) })

View file

@ -4,7 +4,6 @@ import android.text.Spanned
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.extensions.convertedToAbsolute
import info.nightscout.androidaps.extensions.convertedToPercent
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.core.main.R
import info.nightscout.database.entities.GlucoseValue
import info.nightscout.interfaces.aps.APSResult
@ -15,6 +14,7 @@ import info.nightscout.interfaces.iob.IobTotal
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.pump.defs.PumpDescription
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.HtmlHelper.fromHtml
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.rx.logging.LTag

View file

@ -1,10 +1,6 @@
package info.nightscout.androidaps.plugins.iob.iobCobCalculator.data
import android.content.Context
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.Scale
import info.nightscout.core.main.R
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.aps.AutosensData
@ -19,7 +15,7 @@ import java.util.Locale
import javax.inject.Inject
import kotlin.math.min
class AutosensDataObject(injector: HasAndroidInjector) : DataPointWithLabelInterface, AutosensData {
class AutosensDataObject(injector: HasAndroidInjector) : AutosensData {
@Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var sp: SP
@ -29,7 +25,6 @@ class AutosensDataObject(injector: HasAndroidInjector) : DataPointWithLabelInter
override var time = 0L
override var bg = 0.0 // mgdl
var chartTime: Long = 0
override var pastSensitivity = ""
override var deviation = 0.0
override var validDeviation = false
@ -121,22 +116,6 @@ class AutosensDataObject(injector: HasAndroidInjector) : DataPointWithLabelInter
i++
}
}
// ------- DataPointWithLabelInterface ------
var scale: Scale? = null
override fun getX(): Double = chartTime.toDouble()
override fun getY(): Double = scale!!.transform(cob)
override fun setY(y: Double) {}
override val label: String = ""
override val duration = 0L
override val shape = PointsWithLabelGraphSeries.Shape.COB_FAIL_OVER
override val size = 0.5f
override fun color(context: Context?): Int {
return rh.gac(context,R.attr.cobColor)
}
init {
injector.androidInjector().inject(this)
}

View file

@ -35,7 +35,6 @@ import info.nightscout.androidaps.utils.textValidator.validators.RegexpValidator
import info.nightscout.androidaps.utils.textValidator.validators.Validator
import info.nightscout.androidaps.utils.textValidator.validators.WebUrlValidator
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import javax.inject.Inject

View file

@ -6,8 +6,6 @@ import androidx.preference.EditTextPreference
import androidx.preference.PreferenceViewHolder
import dagger.android.HasAndroidInjector
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.core.profile.toMgdl
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.shared.SafeParse

View file

@ -1,7 +1,6 @@
package info.nightscout.androidaps.utils.textValidator.validators
import android.widget.EditText
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction

View file

@ -2,10 +2,7 @@ package info.nightscout.androidaps.utils.userEntry
import android.text.Spanned
import dagger.Reusable
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.Translator
import info.nightscout.core.main.R
import info.nightscout.core.profile.toUnitsString
import info.nightscout.database.entities.UserEntry
import info.nightscout.database.entities.UserEntry.Action
import info.nightscout.database.entities.UserEntry.ColorGroup
@ -13,8 +10,10 @@ import info.nightscout.database.entities.UserEntry.Sources
import info.nightscout.database.entities.ValueWithUnit
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.Translator
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.HtmlHelper
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.utils.DateUtil

View file

@ -1,8 +1,8 @@
package info.nightscout.core.iob
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.core.main.R
import info.nightscout.interfaces.iob.CobInfo
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.utils.DateUtil

View file

@ -1,7 +1,7 @@
package info.nightscout.core.iob
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.interfaces.iob.GlucoseStatus
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.interfaces.utils.Round
fun GlucoseStatus.log(): String = "Glucose: " + DecimalFormatter.to0Decimal(glucose) + " mg/dl " +

View file

@ -1,63 +0,0 @@
package info.nightscout.core.profile
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
/*
* Units conversion
*/
fun Profile.Companion.fromMgdlToUnits(value: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MGDL) value else value * Constants.MGDL_TO_MMOLL
fun Profile.Companion.fromMmolToUnits(value: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MMOL) value else value * Constants.MMOLL_TO_MGDL
fun Profile.Companion.toUnits(valueInMgdl: Double, valueInMmol: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MGDL) valueInMgdl else valueInMmol
fun Profile.Companion.toUnitsString(valueInMgdl: Double, valueInMmol: Double, units: GlucoseUnit): String =
if (units == GlucoseUnit.MGDL) DecimalFormatter.to0Decimal(valueInMgdl) else DecimalFormatter.to1Decimal(valueInMmol)
fun Profile.Companion.toSignedUnitsString(valueInMgdl: Double, valueInMmol: Double, units: GlucoseUnit): String =
if (units == GlucoseUnit.MGDL) (if (valueInMgdl > 0) "+" else "") + DecimalFormatter.to0Decimal(valueInMgdl)
else (if (valueInMmol > 0) "+" else "") + DecimalFormatter.to1Decimal(valueInMmol)
fun Profile.Companion.isMgdl(anyBg: Double) = anyBg >= 39
fun Profile.Companion.isMmol(anyBg: Double) = anyBg < 39
fun Profile.Companion.unit(anyBg: Double) = if (isMgdl(anyBg)) GlucoseUnit.MGDL else GlucoseUnit.MMOL
fun Profile.Companion.toCurrentUnits(profileFunction: ProfileFunction, anyBg: Double): Double =
if (isMmol(anyBg)) fromMmolToUnits(anyBg, profileFunction.getUnits())
else fromMgdlToUnits(anyBg, profileFunction.getUnits())
fun Profile.Companion.toCurrentUnits(units: GlucoseUnit, anyBg: Double): Double =
if (isMmol(anyBg)) fromMmolToUnits(anyBg, units)
else fromMgdlToUnits(anyBg, units)
fun Profile.Companion.toCurrentUnitsString(profileFunction: ProfileFunction, anyBg: Double): String =
if (isMmol(anyBg)) toUnitsString(anyBg * Constants.MMOLL_TO_MGDL, anyBg, profileFunction.getUnits())
else toUnitsString(anyBg, anyBg * Constants.MGDL_TO_MMOLL, profileFunction.getUnits())
fun Profile.Companion.toMgdl(value: Double): Double =
if (isMgdl(value)) value else value * Constants.MMOLL_TO_MGDL
fun Profile.Companion.toMgdl(value: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MGDL) value else value * Constants.MMOLL_TO_MGDL
fun Profile.Companion.toMmol(value: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MGDL) value * Constants.MGDL_TO_MMOLL else value
// targets are stored in mg/dl but profile vary
fun Profile.Companion.toTargetRangeString(low: Double, high: Double, sourceUnits: GlucoseUnit, units: GlucoseUnit): String {
val lowMgdl = toMgdl(low, sourceUnits)
val highMgdl = toMgdl(high, sourceUnits)
val lowMmol = toMmol(low, sourceUnits)
val highMmol = toMmol(high, sourceUnits)
return if (low == high) toUnitsString(lowMgdl, lowMmol, units)
else toUnitsString(lowMgdl, lowMmol, units) + " - " + toUnitsString(highMgdl, highMmol, units)
}

View file

@ -1,7 +1,7 @@
package info.nightscout.core.pump
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.interfaces.pump.PumpEnactResult
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.interfaces.ResourceHelper
fun PumpEnactResult.toHtml(rh: ResourceHelper): String {

View file

@ -1,8 +1,8 @@
package info.nightscout.core.pump
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.pump.PumpSync
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.utils.DateUtil
import info.nightscout.shared.utils.T
import kotlin.math.ceil

View file

@ -10,8 +10,6 @@ import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider
import info.nightscout.core.iob.round
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.core.profile.toMgdl
import info.nightscout.core.ui.dialogs.OKDialog
import info.nightscout.core.utils.extensions.formatColor
import info.nightscout.database.entities.BolusCalculatorResult
@ -327,7 +325,7 @@ class BolusWizard @Inject constructor(
val actions: LinkedList<String> = LinkedList()
if (insulinAfterConstraints > 0) {
val pct = if (percentageCorrection != 100) " ($percentageCorrection%)" else ""
actions.add(rh.gs(R.string.bolus) + ": " + rh.gs(R.string.formatinsulinunits, insulinAfterConstraints).formatColor(context, rh, R.attr.bolusColor) + pct)
actions.add(rh.gs(R.string.bolus) + ": " + rh.gs(R.string.format_insulin_units, insulinAfterConstraints).formatColor(context, rh, R.attr.bolusColor) + pct)
}
if (carbs > 0 && !advisor) {
var timeShift = ""

View file

@ -15,8 +15,6 @@
<string name="connecting">Connecting</string>
<string name="disconnected">Disconnected</string>
<string name="androidaps_start">AAPS started</string>
<string name="formatinsulinunits1">%1$.1f U</string>
<string name="formatinsulinunits">%1$.2f U</string>
<string name="formatsignedinsulinunits">%1$+.2f U</string>
<string name="format_carbs">%1$d g</string>
<string name="reservoirvalue">%1$.0f / %2$d U</string>
@ -26,7 +24,6 @@
<string name="pumpbusy">Pump is busy</string>
<string name="connectionerror">Pump connection error</string>
<string name="objectives">Objectives</string>
<string name="close">Close</string>
<string name="please_wait">Please wait…</string>
<string name="mute">Mute</string>
<string name="reload">Reload</string>

View file

@ -5,11 +5,11 @@ import dagger.android.AndroidInjector
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.extensions.pureProfileFromJson
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.profile.ProfileStoreObject
import info.nightscout.database.impl.AppRepository
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.profile.ProfileStore

View file

@ -7,12 +7,6 @@ import info.nightscout.androidaps.TestBase
import info.nightscout.androidaps.TestPumpPlugin
import info.nightscout.androidaps.extensions.pureProfileFromJson
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.core.profile.toMgdl
import info.nightscout.core.profile.toMmol
import info.nightscout.core.profile.toTargetRangeString
import info.nightscout.core.profile.toUnits
import info.nightscout.core.profile.toUnitsString
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.plugin.ActivePlugin

View file

@ -1,5 +1,6 @@
package info.nightscout.androidaps.utils
import info.nightscout.interfaces.utils.DecimalFormatter
import org.junit.Assert
import org.junit.Test

1
core/graph/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

28
core/graph/build.gradle Normal file
View file

@ -0,0 +1,28 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
id 'kotlin-kapt'
id 'kotlin-parcelize'
id 'kotlin-allopen'
id 'com.hiya.jacoco-android'
}
apply from: "${project.rootDir}/core/core-main/android_dependencies.gradle"
apply from: "${project.rootDir}/core/core-main/android_module_dependencies.gradle"
apply from: "${project.rootDir}/core/core-main/allopen_dependencies.gradle"
apply from: "${project.rootDir}/core/core-main/test_dependencies.gradle"
apply from: "${project.rootDir}/core/core-main/jacoco_global.gradle"
dependencies {
implementation project(':graphview')
implementation project(':app-wear-shared:shared')
implementation project(':database:entities')
implementation project(':interfaces')
implementation project(':core:ui')
api "com.google.android.material:material:$material_version"
}
android {
namespace 'info.nightscout.core.graph'
}

View file

21
core/graph/proguard-rules.pro vendored Normal file
View file

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
</manifest>

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.utils.ui
package info.nightscout.core.graph
import android.content.Context
import android.util.AttributeSet
@ -6,7 +6,6 @@ import com.jjoe64.graphview.DefaultLabelFormatter
import com.jjoe64.graphview.GraphView
import com.jjoe64.graphview.series.DataPoint
import com.jjoe64.graphview.series.LineGraphSeries
import info.nightscout.core.main.R
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.Round
import java.text.NumberFormat

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.utils.ui
package info.nightscout.core.graph
import android.content.Context
import android.util.AttributeSet
@ -6,7 +6,6 @@ import com.jjoe64.graphview.DefaultLabelFormatter
import com.jjoe64.graphview.GraphView
import com.jjoe64.graphview.series.DataPoint
import com.jjoe64.graphview.series.LineGraphSeries
import info.nightscout.core.main.R
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.Round
import java.text.NumberFormat

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.utils.ui
package info.nightscout.core.graph
import android.content.Context
import android.util.AttributeSet
@ -6,8 +6,8 @@ import com.jjoe64.graphview.DefaultLabelFormatter
import com.jjoe64.graphview.GraphView
import com.jjoe64.graphview.series.DataPoint
import com.jjoe64.graphview.series.LineGraphSeries
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.Round
import java.text.NumberFormat
@ -19,13 +19,16 @@ class IsfProfileGraph : GraphView {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
private fun fromMgdlToUnits(value: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MGDL) value else value * Constants.MGDL_TO_MMOLL
fun show(profile: Profile) {
removeAllSeries()
val isfArray: MutableList<DataPoint> = ArrayList()
var maxIsf = 0.0
val units = profile.units
for (hour in 0..23) {
val isf = Profile.fromMgdlToUnits(profile.getIsfMgdlTimeFromMidnight(hour * 60 * 60), units)
val isf = fromMgdlToUnits(profile.getIsfMgdlTimeFromMidnight(hour * 60 * 60), units)
maxIsf = max(maxIsf, isf)
isfArray.add(DataPoint(hour.toDouble(), isf))
isfArray.add(DataPoint((hour + 1).toDouble(), isf))
@ -59,7 +62,7 @@ class IsfProfileGraph : GraphView {
// isf 1
val isfArray1: MutableList<DataPoint> = ArrayList()
for (hour in 0..23) {
val isf = Profile.fromMgdlToUnits(profile1.getIsfMgdlTimeFromMidnight(hour * 60 * 60), units)
val isf = fromMgdlToUnits(profile1.getIsfMgdlTimeFromMidnight(hour * 60 * 60), units)
minIsf = min(minIsf, isf)
maxIsf = max(maxIsf, isf)
isfArray1.add(DataPoint(hour.toDouble(), isf))
@ -73,7 +76,7 @@ class IsfProfileGraph : GraphView {
// isf 2
val isfArray2: MutableList<DataPoint> = ArrayList()
for (hour in 0..23) {
val isf = Profile.fromMgdlToUnits(profile2.getIsfMgdlTimeFromMidnight(hour * 60 * 60), units)
val isf = fromMgdlToUnits(profile2.getIsfMgdlTimeFromMidnight(hour * 60 * 60), units)
minIsf = min(minIsf, isf)
maxIsf = max(maxIsf, isf)
isfArray2.add(DataPoint(hour.toDouble(), isf))

View file

@ -0,0 +1,151 @@
package info.nightscout.core.graph
import android.content.Context
import androidx.annotation.AttrRes
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import com.jjoe64.graphview.series.BarGraphSeries
import com.jjoe64.graphview.series.DataPoint
import com.jjoe64.graphview.series.LineGraphSeries
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.DeviationDataPoint
import info.nightscout.core.graph.data.FixedLineGraphSeries
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.graph.data.Scale
import info.nightscout.core.graph.data.ScaledDataPoint
import info.nightscout.database.entities.GlucoseValue
import info.nightscout.database.entities.TemporaryTarget
import info.nightscout.interfaces.aps.AutosensData
import info.nightscout.interfaces.iob.CobInfo
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.iob.IobTotal
interface OverviewData {
var rangeToDisplay: Int // for graph
var toTime: Long
var fromTime: Long
var endTime: Long
fun reset()
fun initRange()
/*
* PUMP STATUS
*/
var pumpStatus: String
/*
* CALC PROGRESS
*/
var calcProgressPct: Int
/*
* BG
*/
val lastBg: GlucoseValue?
val isLow: Boolean
val isHigh: Boolean
@ColorInt fun lastBgColor(context: Context?): Int
val lastBgDescription: String
val isActualBg: Boolean
/*
* TEMPORARY BASAL
*/
fun temporaryBasalText(iobCobCalculator: IobCobCalculator): String
fun temporaryBasalDialogText(iobCobCalculator: IobCobCalculator): String
@DrawableRes fun temporaryBasalIcon(iobCobCalculator: IobCobCalculator): Int
@AttrRes fun temporaryBasalColor(context: Context?, iobCobCalculator: IobCobCalculator): Int
/*
* EXTENDED BOLUS
*/
fun extendedBolusText(iobCobCalculator: IobCobCalculator): String
fun extendedBolusDialogText(iobCobCalculator: IobCobCalculator): String
/*
* IOB, COB
*/
fun bolusIob(iobCobCalculator: IobCobCalculator): IobTotal
fun basalIob(iobCobCalculator: IobCobCalculator): IobTotal
fun cobInfo(iobCobCalculator: IobCobCalculator): CobInfo
val lastCarbsTime: Long
fun iobText(iobCobCalculator: IobCobCalculator): String
fun iobDialogText(iobCobCalculator: IobCobCalculator): String
/*
* TEMP TARGET
*/
val temporaryTarget: TemporaryTarget?
/*
* SENSITIVITY
*/
fun lastAutosensData(iobCobCalculator: IobCobCalculator): AutosensData?
/*
* Graphs
*/
var bgReadingsArray: List<GlucoseValue>
var maxBgValue: Double
var bucketedGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var bgReadingGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var predictionsGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
val basalScale: Scale
var baseBasalGraphSeries: LineGraphSeries<ScaledDataPoint>
var tempBasalGraphSeries: LineGraphSeries<ScaledDataPoint>
var basalLineGraphSeries: LineGraphSeries<ScaledDataPoint>
var absoluteBasalGraphSeries: LineGraphSeries<ScaledDataPoint>
var temporaryTargetSeries: LineGraphSeries<DataPoint>
var maxIAValue: Double
val actScale: Scale
var activitySeries: FixedLineGraphSeries<ScaledDataPoint>
var activityPredictionSeries: FixedLineGraphSeries<ScaledDataPoint>
var maxEpsValue: Double
val epsScale: Scale
var epsSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var maxTreatmentsValue: Double
var treatmentsSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var maxTherapyEventValue: Double
var therapyEventSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var maxIobValueFound: Double
val iobScale: Scale
var iobSeries: FixedLineGraphSeries<ScaledDataPoint>
var absIobSeries: FixedLineGraphSeries<ScaledDataPoint>
var iobPredictions1Series: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var maxBGIValue: Double
val bgiScale: Scale
var minusBgiSeries: FixedLineGraphSeries<ScaledDataPoint>
var minusBgiHistSeries: FixedLineGraphSeries<ScaledDataPoint>
var maxCobValueFound: Double
val cobScale: Scale
var cobSeries: FixedLineGraphSeries<ScaledDataPoint>
var cobMinFailOverSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface>
var maxDevValueFound: Double
val devScale: Scale
var deviationsSeries: BarGraphSeries<DeviationDataPoint>
var maxRatioValueFound: Double //even if sens data equals 0 for all the period, minimum scale is between 95% and 105%
var minRatioValueFound: Double
val ratioScale: Scale
var ratioSeries: LineGraphSeries<ScaledDataPoint>
var maxFromMaxValueFound: Double
var maxFromMinValueFound: Double
val dsMaxScale: Scale
val dsMinScale: Scale
var dsMaxSeries: LineGraphSeries<ScaledDataPoint>
var dsMinSeries: LineGraphSeries<ScaledDataPoint>
}

View file

@ -1,13 +1,12 @@
package info.nightscout.androidaps.utils.ui
package info.nightscout.core.graph
import android.content.Context
import android.util.AttributeSet
import com.jjoe64.graphview.DefaultLabelFormatter
import com.jjoe64.graphview.GraphView
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.AreaGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DoubleDataPoint
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.core.graph.data.AreaGraphSeries
import info.nightscout.core.graph.data.DoubleDataPoint
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.utils.Round
@ -20,6 +19,9 @@ class TargetBgProfileGraph : GraphView {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
private fun fromMgdlToUnits(value: Double, units: GlucoseUnit): Double =
if (units == GlucoseUnit.MGDL) value else value * Constants.MGDL_TO_MMOLL
fun show(profile: Profile) {
removeAllSeries()
@ -27,8 +29,8 @@ class TargetBgProfileGraph : GraphView {
var maxValue = 0.0
val units = profile.units
for (hour in 0..23) {
val valueLow = Profile.fromMgdlToUnits(profile.getTargetLowMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueHigh = Profile.fromMgdlToUnits(profile.getTargetHighMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueLow = fromMgdlToUnits(profile.getTargetLowMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueHigh = fromMgdlToUnits(profile.getTargetHighMgdlTimeFromMidnight(hour * 60 * 60), units)
maxValue = max(maxValue, valueHigh)
targetArray.add(DoubleDataPoint(hour.toDouble(), valueLow, valueHigh))
targetArray.add(DoubleDataPoint((hour + 1).toDouble(), valueLow, valueHigh))
@ -60,8 +62,8 @@ class TargetBgProfileGraph : GraphView {
var maxValue = 0.0
val units = profile1.units
for (hour in 0..23) {
val valueLow = Profile.fromMgdlToUnits(profile1.getTargetLowMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueHigh = Profile.fromMgdlToUnits(profile1.getTargetHighMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueLow = fromMgdlToUnits(profile1.getTargetLowMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueHigh = fromMgdlToUnits(profile1.getTargetHighMgdlTimeFromMidnight(hour * 60 * 60), units)
minValue = min(minValue, valueLow)
maxValue = max(maxValue, valueHigh)
targetArray1.add(DoubleDataPoint(hour.toDouble(), valueLow, valueHigh))
@ -74,8 +76,8 @@ class TargetBgProfileGraph : GraphView {
val targetArray2: MutableList<DoubleDataPoint> = ArrayList()
for (hour in 0..23) {
val valueLow = Profile.fromMgdlToUnits(profile2.getTargetLowMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueHigh = Profile.fromMgdlToUnits(profile2.getTargetHighMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueLow = fromMgdlToUnits(profile2.getTargetLowMgdlTimeFromMidnight(hour * 60 * 60), units)
val valueHigh = fromMgdlToUnits(profile2.getTargetHighMgdlTimeFromMidnight(hour * 60 * 60), units)
minValue = min(minValue, valueLow)
maxValue = max(maxValue, valueHigh)
targetArray2.add(DoubleDataPoint(hour.toDouble(), valueLow, valueHigh))

View file

@ -17,7 +17,7 @@
* with the "Linking Exception" along with this program; if not,
* write to the author Jonas Gehring <g.jjoe64@gmail.com>.
*/
package info.nightscout.androidaps.plugins.general.overview.graphExtensions;
package info.nightscout.core.graph.data;
import android.graphics.Canvas;
import android.graphics.Color;

View file

@ -1,11 +1,11 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.main.R
import info.nightscout.core.graph.R
import info.nightscout.database.entities.Bolus
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.interfaces.ResourceHelper
class BolusDataPoint(

View file

@ -1,7 +1,7 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.core.main.R
import info.nightscout.core.graph.R
import info.nightscout.database.entities.Carbs
import info.nightscout.shared.interfaces.ResourceHelper

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import com.jjoe64.graphview.series.DataPointInterface

View file

@ -1,3 +1,3 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
class DeviationDataPoint(x: Double, y: Double, var color: Int, scale: Scale) : ScaledDataPoint(x, y, scale)

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import com.jjoe64.graphview.series.DataPointInterface

View file

@ -1,7 +1,7 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.core.main.R
import info.nightscout.core.graph.R
import info.nightscout.database.entities.EffectiveProfileSwitch
import info.nightscout.shared.interfaces.ResourceHelper
import info.nightscout.shared.utils.T

View file

@ -1,9 +1,9 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.androidaps.extensions.toStringTotal
import info.nightscout.core.main.R
import info.nightscout.core.graph.R
import info.nightscout.database.entities.ExtendedBolus
import info.nightscout.interfaces.utils.DecimalFormatter
import info.nightscout.shared.interfaces.ResourceHelper
class ExtendedBolusDataPoint(
@ -26,4 +26,6 @@ class ExtendedBolusDataPoint(
override fun setY(y: Double) {
yValue = y
}
private fun ExtendedBolus.toStringTotal(): String = "${DecimalFormatter.to2Decimal(amount)}U ( ${DecimalFormatter.to2Decimal(rate)} U/h )"
}

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions;
package info.nightscout.core.graph.data;
import android.graphics.Canvas;
import android.graphics.Color;

View file

@ -1,12 +1,11 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.main.R
import info.nightscout.core.profile.toCurrentUnitsString
import info.nightscout.core.graph.R
import info.nightscout.database.entities.GlucoseValue
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.shared.interfaces.ResourceHelper

View file

@ -1,7 +1,7 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.core.main.R
import info.nightscout.core.graph.R
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.iob.InMemoryGlucoseValue

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions;
package info.nightscout.core.graph.data;
import android.graphics.Canvas;
import android.graphics.Color;
@ -17,7 +17,7 @@ import com.jjoe64.graphview.series.BaseSeries;
import java.util.Iterator;
import info.nightscout.core.main.R;
import info.nightscout.core.graph.R;
/**
* Series that plots the data as points.
@ -96,7 +96,6 @@ public class PointsWithLabelGraphSeries<E extends DataPointWithLabelInterface> e
* @param isSecondScale whether it is the second scale
*/
@Override
@SuppressWarnings({"deprecation"})
public void draw(GraphView graphView, Canvas canvas, boolean isSecondScale) {
// Convert the sp to pixels
float scaledTextSize = spSize * graphView.getContext().getResources().getDisplayMetrics().scaledDensity;

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
class Scale(var shift: Double = 0.0, var multiplier: Double = 1.0) {

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import com.jjoe64.graphview.series.DataPointInterface

View file

@ -1,12 +1,10 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions
package info.nightscout.core.graph.data
import android.content.Context
import info.nightscout.androidaps.utils.Translator
import info.nightscout.core.main.R
import info.nightscout.core.profile.fromMgdlToUnits
import info.nightscout.core.profile.toUnits
import info.nightscout.core.graph.R
import info.nightscout.database.entities.TherapyEvent
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.Translator
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.shared.interfaces.ResourceHelper

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview.graphExtensions;
package info.nightscout.core.graph.data;
import com.jjoe64.graphview.DefaultLabelFormatter;
@ -29,10 +29,11 @@ public class TimeAsXAxisLabelFormatter extends DefaultLabelFormatter {
// Fatal Exception: java.lang.NullPointerException
// Attempt to invoke virtual method 'double com.jjoe64.graphview.Viewport.getMaxY(boolean)' on a null object reference
// com.jjoe64.graphview.DefaultLabelFormatter.formatLabel (DefaultLabelFormatter.java:89)
// info.nightscout.androidaps.plugins.general.overview.graphExtensions.TimeAsXAxisLabelFormatter.formatLabel (TimeAsXAxisLabelFormatter.java:26)
// info.nightscout.core.graph.data.TimeAsXAxisLabelFormatter.formatLabel (TimeAsXAxisLabelFormatter.java:26)
// com.jjoe64.graphview.GridLabelRenderer.drawVerticalSteps (GridLabelRenderer.java:1057)
// com.jjoe64.graphview.GridLabelRenderer.draw (GridLabelRenderer.java:866)
// com.jjoe64.graphview.GraphView.onDraw (GraphView.java:296)
//noinspection ConstantConditions
return super.formatLabel(value, isValueX);
} catch (Exception ignored) {
return "";

View file

@ -5,5 +5,5 @@
android:viewportHeight="24">
<path
android:pathData="M20.132,10.032c-0.141,-0.437 -0.519,-0.756 -0.975,-0.822L14.96,8.6l-1.878,-3.803c-0.406,-0.825 -1.758,-0.825 -2.164,0L9.04,8.6L4.842,9.21C4.388,9.276 4.01,9.594 3.868,10.032c-0.142,0.437 -0.024,0.917 0.305,1.237l3.038,2.96L6.495,18.41c-0.078,0.454 0.108,0.912 0.48,1.181c0.21,0.153 0.459,0.231 0.709,0.231c0.192,0 0.385,-0.047 0.561,-0.14L12,17.71l3.755,1.973c0.409,0.213 0.898,0.181 1.273,-0.091c0.371,-0.269 0.557,-0.729 0.479,-1.181l-0.717,-4.182l3.037,-2.96C20.155,10.948 20.275,10.468 20.132,10.032zM18.689,10.686l-3.16,3.081l0.746,4.35c0.014,0.087 -0.021,0.174 -0.092,0.225c-0.04,0.03 -0.087,0.044 -0.135,0.044c-0.036,0 -0.073,-0.008 -0.108,-0.027l-3.907,-2.053L8.126,18.36c-0.075,0.044 -0.17,0.036 -0.242,-0.017c-0.07,-0.051 -0.106,-0.138 -0.091,-0.225l0.746,-4.35l-3.162,-3.081c-0.063,-0.061 -0.085,-0.153 -0.058,-0.236c0.027,-0.083 0.099,-0.143 0.185,-0.156L9.874,9.66l1.954,-3.959c0.078,-0.158 0.334,-0.158 0.412,0l1.953,3.959l4.369,0.634c0.087,0.013 0.158,0.073 0.185,0.156S18.753,10.625 18.689,10.686z"
android:fillColor="?attr/profileColor"/>
android:fillColor="?attr/profileColor" />
</vector>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="format_carbs">%1$d g</string>
</resources>

View file

@ -1,23 +0,0 @@
package info.nightscout.core.ui
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.*
import org.junit.Test
import org.junit.runner.RunWith
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("info.nightscout.core.ui.test", appContext.packageName)
}
}

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="PrivateResource"
android:insetLeft="16dp"
android:insetTop="16dp"
android:insetRight="16dp"
android:insetBottom="16dp">
<shape android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="@color/background_floating_material_dark" />
<stroke
android:color="@color/errorAlertBackground"
android:width="3dp" />
</shape>
</inset>

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="PrivateResource"
android:insetLeft="16dp"
android:insetTop="16dp"
android:insetRight="16dp"
android:insetBottom="16dp">
<shape android:shape="rectangle">
<corners android:radius="2dp" />
<solid android:color="@color/background_floating_material_dark" />
<stroke
android:color="@color/warningAlertBackground"
android:width="3dp" />
</shape>
</inset>

View file

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -8,6 +8,7 @@
<string name="dismiss">DISMISS</string>
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="close">Close</string>
<!-- TwoMessagesDialog -->
<string name="password_preferences_decrypt_prompt">You will be asked for master password, which is needed to decrypt imported preferences.</string>

View file

@ -1,17 +0,0 @@
package info.nightscout.core.ui
import org.junit.Assert.*
import org.junit.Test
/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

View file

@ -29,6 +29,8 @@ files:
translation: /core/utils/src/main/res/values-%android_code%/strings.xml
- source: /core/ui/src/main/res/values/strings.xml
translation: /core/ui/src/main/res/values-%android_code%/strings.xml
- source: /core/graph/src/main/res/values/strings.xml
translation: /core/graph/src/main/res/values-%android_code%/strings.xml
- source: /app-wear-shared/shared/src/main/res/values/strings.xml
translation: /app-wear-shared/shared/src/main/res/values-%android_code%/strings.xml
- source: /app-wear-shared/rx/src/main/res/values/strings.xml

View file

@ -18,16 +18,17 @@ android {
dependencies {
implementation project(':app-wear-shared:rx')
implementation project(':app-wear-shared:shared')
implementation project(path: ':graphview')
implementation project(':database:entities')
implementation project(':database:impl')
implementation project(':plugins:automation')
implementation project(':interfaces')
implementation project(':core:core-main')
implementation project(':core:utils')
implementation project(':core:graph')
implementation project(':core:ui')
implementation project(':core:utils')
implementation project(':ui')
// Protection
api 'androidx.biometric:biometric:1.1.0'
}

View file

@ -1,10 +1,10 @@
package info.nightscout.androidaps.utils
package info.nightscout.implementation
import info.nightscout.androidaps.annotations.OpenForTesting
import info.nightscout.core.main.R
import info.nightscout.core.profile.toCurrentUnits
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.GlucoseUnit
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.Profile
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.shared.sharedPreferences.SP
@ -13,10 +13,10 @@ import javax.inject.Singleton
@OpenForTesting
@Singleton
class DefaultValueHelper @Inject constructor(
class DefaultValueHelperImpl @Inject constructor(
private val sp: SP,
private val profileFunction: ProfileFunction
) {
) : DefaultValueHelper {
/**
* returns the corresponding EatingSoon TempTarget based on the given units (MMOL / MGDL)
@ -53,14 +53,14 @@ class DefaultValueHelper @Inject constructor(
*
* @return
*/
fun determineEatingSoonTT(): Double {
override fun determineEatingSoonTT(): Double {
val units = profileFunction.getUnits()
var value = sp.getDouble(R.string.key_eatingsoon_target, getDefaultEatingSoonTT(units))
value = Profile.toCurrentUnits(profileFunction, value)
return if (value > 0) value else getDefaultEatingSoonTT(units)
}
fun determineEatingSoonTTDuration(): Int {
override fun determineEatingSoonTTDuration(): Int {
val value = sp.getInt(R.string.key_eatingsoon_duration, Constants.defaultEatingSoonTTDuration)
return if (value > 0) value else Constants.defaultEatingSoonTTDuration
}
@ -70,14 +70,14 @@ class DefaultValueHelper @Inject constructor(
*
* @return
*/
fun determineActivityTT(): Double {
override fun determineActivityTT(): Double {
val units = profileFunction.getUnits()
var value = sp.getDouble(R.string.key_activity_target, getDefaultActivityTT(units))
value = Profile.toCurrentUnits(profileFunction, value)
return if (value > 0) value else getDefaultActivityTT(units)
}
fun determineActivityTTDuration(): Int {
override fun determineActivityTTDuration(): Int {
val value = sp.getInt(R.string.key_activity_duration, Constants.defaultActivityTTDuration)
return if (value > 0) value else Constants.defaultActivityTTDuration
}
@ -87,29 +87,29 @@ class DefaultValueHelper @Inject constructor(
*
* @return
*/
fun determineHypoTT(): Double {
override fun determineHypoTT(): Double {
val units = profileFunction.getUnits()
var value = sp.getDouble(R.string.key_hypo_target, getDefaultHypoTT(units))
value = Profile.toCurrentUnits(profileFunction, value)
return if (value > 0) value else getDefaultHypoTT(units)
}
fun determineHypoTTDuration(): Int {
override fun determineHypoTTDuration(): Int {
val value = sp.getInt(R.string.key_hypo_duration, Constants.defaultHypoTTDuration)
return if (value > 0) value else Constants.defaultHypoTTDuration
}
var bgTargetLow = 80.0
var bgTargetHigh = 180.0
override var bgTargetLow = 80.0
override var bgTargetHigh = 180.0
fun determineHighLine(): Double {
override fun determineHighLine(): Double {
var highLineSetting = sp.getDouble(R.string.key_high_mark, bgTargetHigh)
if (highLineSetting < 1) highLineSetting = Constants.HIGH_MARK
highLineSetting = Profile.toCurrentUnits(profileFunction, highLineSetting)
return highLineSetting
}
fun determineLowLine(): Double {
override fun determineLowLine(): Double {
var lowLineSetting = sp.getDouble(R.string.key_low_mark, bgTargetLow)
if (lowLineSetting < 1) lowLineSetting = Constants.LOW_MARK
lowLineSetting = Profile.toCurrentUnits(profileFunction, lowLineSetting)

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.utils
package info.nightscout.implementation
import info.nightscout.core.main.R
import info.nightscout.database.entities.OfflineEvent
@ -7,16 +7,17 @@ import info.nightscout.database.entities.TherapyEvent
import info.nightscout.database.entities.UserEntry.Action
import info.nightscout.database.entities.UserEntry.Sources
import info.nightscout.database.entities.ValueWithUnit
import info.nightscout.interfaces.Translator
import info.nightscout.shared.interfaces.ResourceHelper
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class Translator @Inject internal constructor(
class TranslatorImpl @Inject internal constructor(
private val rh: ResourceHelper
) {
) : Translator {
fun translate(action: Action): String = when (action) {
override fun translate(action: Action): String = when (action) {
Action.BOLUS -> rh.gs(R.string.uel_bolus)
Action.BOLUS_CALCULATOR_RESULT -> rh.gs(R.string.uel_bolus_calculator)
Action.BOLUS_CALCULATOR_RESULT_REMOVED -> rh.gs(R.string.uel_bolus_calculator)
@ -105,7 +106,7 @@ class Translator @Inject internal constructor(
Action.UNKNOWN -> rh.gs(R.string.unknown)
}
fun translate(units: ValueWithUnit?): String = when (units) {
override fun translate(units: ValueWithUnit?): String = when (units) {
is ValueWithUnit.Gram -> rh.gs(R.string.shortgram)
is ValueWithUnit.Hour -> rh.gs(R.string.shorthour)
is ValueWithUnit.Insulin -> rh.gs(R.string.insulin_unit_shortname)
@ -117,7 +118,7 @@ class Translator @Inject internal constructor(
else -> ""
}
fun translate(meterType: TherapyEvent.MeterType?): String = when (meterType) {
override fun translate(meterType: TherapyEvent.MeterType?): String = when (meterType) {
TherapyEvent.MeterType.FINGER -> rh.gs(R.string.glucosetype_finger)
TherapyEvent.MeterType.SENSOR -> rh.gs(R.string.glucosetype_sensor)
TherapyEvent.MeterType.MANUAL -> rh.gs(R.string.manual)
@ -125,7 +126,7 @@ class Translator @Inject internal constructor(
else -> rh.gs(R.string.unknown)
}
fun translate(type: TherapyEvent.Type?): String = when (type) {
override fun translate(type: TherapyEvent.Type?): String = when (type) {
TherapyEvent.Type.FINGER_STICK_BG_VALUE -> rh.gs(R.string.careportal_bgcheck)
TherapyEvent.Type.SNACK_BOLUS -> rh.gs(R.string.careportal_snackbolus)
TherapyEvent.Type.MEAL_BOLUS -> rh.gs(R.string.careportal_mealbolus)
@ -176,7 +177,7 @@ class Translator @Inject internal constructor(
else -> rh.gs(R.string.unknown)
}
fun translate(reason: TemporaryTarget.Reason?): String = when (reason) {
override fun translate(reason: TemporaryTarget.Reason?): String = when (reason) {
TemporaryTarget.Reason.CUSTOM -> rh.gs(R.string.custom)
TemporaryTarget.Reason.HYPOGLYCEMIA -> rh.gs(R.string.hypo)
TemporaryTarget.Reason.EATING_SOON -> rh.gs(R.string.eatingsoon)
@ -187,7 +188,7 @@ class Translator @Inject internal constructor(
else -> rh.gs(R.string.unknown)
}
fun translate(reason: OfflineEvent.Reason?): String = when (reason) {
override fun translate(reason: OfflineEvent.Reason?): String = when (reason) {
OfflineEvent.Reason.SUSPEND -> rh.gs(R.string.uel_suspend)
OfflineEvent.Reason.DISABLE_LOOP -> rh.gs(R.string.disableloop)
OfflineEvent.Reason.DISCONNECT_PUMP -> rh.gs(R.string.uel_disconnect)
@ -196,7 +197,7 @@ class Translator @Inject internal constructor(
else -> rh.gs(R.string.unknown)
}
fun translate(source: Sources): String = when (source) {
override fun translate(source: Sources): String = when (source) {
/*
Sources.TreatmentDialog -> TODO()
Sources.InsulinDialog -> TODO()

View file

@ -6,20 +6,28 @@ import dagger.Module
import dagger.Provides
import info.nightscout.androidaps.plugins.constraints.versionChecker.VersionCheckerUtils
import info.nightscout.androidaps.plugins.general.maintenance.formats.EncryptedPrefsFormat
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.utils.CryptoUtil
import info.nightscout.core.utils.fabric.FabricPrivacy
import info.nightscout.database.impl.AppRepository
import info.nightscout.implementation.DefaultValueHelperImpl
import info.nightscout.implementation.HardLimitsImpl
import info.nightscout.implementation.TranslatorImpl
import info.nightscout.implementation.logging.LoggerUtilsImpl
import info.nightscout.implementation.maintenance.PrefFileListProviderImpl
import info.nightscout.implementation.overview.OverviewDataImpl
import info.nightscout.implementation.profiling.ProfilerImpl
import info.nightscout.implementation.protection.PasswordCheckImpl
import info.nightscout.implementation.protection.ProtectionCheckImpl
import info.nightscout.implementation.pump.WarnColorsImpl
import info.nightscout.implementation.resources.ResourceHelperImpl
import info.nightscout.interfaces.Config
import info.nightscout.interfaces.Translator
import info.nightscout.interfaces.logging.LoggerUtils
import info.nightscout.interfaces.maintenance.PrefFileListProvider
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.interfaces.profiling.Profiler
import info.nightscout.interfaces.protection.PasswordCheck
import info.nightscout.interfaces.protection.ProtectionCheck
@ -72,6 +80,27 @@ open class ImplementationModule {
@Singleton
fun provideProtectionCheck(sp: SP, passwordCheck: PasswordCheck, dateUtil: DateUtil): ProtectionCheck = ProtectionCheckImpl(sp, passwordCheck, dateUtil)
@Provides
@Singleton
fun provideDefaultValueHelper(sp: SP, profileFunction: ProfileFunction): DefaultValueHelper = DefaultValueHelperImpl(sp, profileFunction)
@Provides
@Singleton
fun provideTranslator(rh: ResourceHelper): Translator = TranslatorImpl(rh)
@Provides
@Singleton
fun provideOverviewData(
aapsLogger: AAPSLogger,
rh: ResourceHelper,
dateUtil: DateUtil,
sp: SP,
activePlugin: ActivePlugin,
defaultValueHelper: DefaultValueHelper,
profileFunction: ProfileFunction,
repository: AppRepository
): OverviewData = OverviewDataImpl(aapsLogger, rh, dateUtil, sp, activePlugin, defaultValueHelper, profileFunction, repository)
@Provides
@Singleton
fun providePrefFileListProvider(

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.general.overview
package info.nightscout.implementation.overview
import android.content.Context
import androidx.annotation.AttrRes
@ -12,13 +12,13 @@ import info.nightscout.androidaps.extensions.isInProgress
import info.nightscout.androidaps.extensions.toStringFull
import info.nightscout.androidaps.extensions.toStringShort
import info.nightscout.androidaps.extensions.valueToUnits
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DeviationDataPoint
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.FixedLineGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.Scale
import info.nightscout.androidaps.plugins.general.overview.graphExtensions.ScaledDataPoint
import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.core.graph.OverviewData
import info.nightscout.core.graph.data.DataPointWithLabelInterface
import info.nightscout.core.graph.data.DeviationDataPoint
import info.nightscout.core.graph.data.FixedLineGraphSeries
import info.nightscout.core.graph.data.PointsWithLabelGraphSeries
import info.nightscout.core.graph.data.Scale
import info.nightscout.core.graph.data.ScaledDataPoint
import info.nightscout.core.iob.round
import info.nightscout.core.main.R
import info.nightscout.database.entities.GlucoseValue
@ -30,6 +30,7 @@ import info.nightscout.interfaces.iob.CobInfo
import info.nightscout.interfaces.iob.IobCobCalculator
import info.nightscout.interfaces.iob.IobTotal
import info.nightscout.interfaces.plugin.ActivePlugin
import info.nightscout.interfaces.profile.DefaultValueHelper
import info.nightscout.interfaces.profile.ProfileFunction
import info.nightscout.rx.logging.AAPSLogger
import info.nightscout.shared.interfaces.ResourceHelper
@ -41,7 +42,7 @@ import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class OverviewData @Inject constructor(
class OverviewDataImpl @Inject constructor(
private val aapsLogger: AAPSLogger,
private val rh: ResourceHelper,
private val dateUtil: DateUtil,
@ -50,14 +51,14 @@ class OverviewData @Inject constructor(
private val defaultValueHelper: DefaultValueHelper,
private val profileFunction: ProfileFunction,
private val repository: AppRepository
) {
) : OverviewData {
var rangeToDisplay = 6 // for graph
var toTime: Long = 0
var fromTime: Long = 0
var endTime: Long = 0
override var rangeToDisplay = 6 // for graph
override var toTime: Long = 0
override var fromTime: Long = 0
override var endTime: Long = 0
fun reset() {
override fun reset() {
pumpStatus = ""
calcProgressPct = 100
bgReadingsArray = ArrayList()
@ -86,7 +87,7 @@ class OverviewData @Inject constructor(
epsSeries = PointsWithLabelGraphSeries()
}
fun initRange() {
override fun initRange() {
rangeToDisplay = sp.getInt(R.string.key_rangetodisplay, 6)
val calendar = Calendar.getInstance().also {
@ -106,51 +107,51 @@ class OverviewData @Inject constructor(
* PUMP STATUS
*/
var pumpStatus: String = ""
override var pumpStatus: String = ""
/*
* CALC PROGRESS
*/
var calcProgressPct: Int = 100
override var calcProgressPct: Int = 100
/*
* BG
*/
val lastBg: GlucoseValue?
override val lastBg: GlucoseValue?
get() =
repository.getLastGlucoseValueWrapped().blockingGet().let { gvWrapped ->
if (gvWrapped is ValueWrapper.Existing) gvWrapped.value
else null
}
val isLow: Boolean
override val isLow: Boolean
get() = lastBg?.let { lastBg ->
lastBg.valueToUnits(profileFunction.getUnits()) < defaultValueHelper.determineLowLine()
} ?: false
val isHigh: Boolean
override val isHigh: Boolean
get() = lastBg?.let { lastBg ->
lastBg.valueToUnits(profileFunction.getUnits()) > defaultValueHelper.determineHighLine()
} ?: false
@ColorInt
fun lastBgColor(context: Context?): Int =
override fun lastBgColor(context: Context?): Int =
when {
isLow -> rh.gac(context, R.attr.bgLow)
isHigh -> rh.gac(context, R.attr.highColor)
else -> rh.gac(context, R.attr.bgInRange)
}
val lastBgDescription: String
override val lastBgDescription: String
get() = when {
isLow -> rh.gs(R.string.a11y_low)
isHigh -> rh.gs(R.string.a11y_high)
else -> rh.gs(R.string.a11y_inrange)
}
val isActualBg: Boolean
override val isActualBg: Boolean
get() =
lastBg?.let { lastBg ->
lastBg.timestamp > dateUtil.now() - T.mins(9).msecs()
@ -160,7 +161,7 @@ class OverviewData @Inject constructor(
* TEMPORARY BASAL
*/
fun temporaryBasalText(iobCobCalculator: IobCobCalculator): String =
override fun temporaryBasalText(iobCobCalculator: IobCobCalculator): String =
profileFunction.getProfile()?.let { profile ->
var temporaryBasal = iobCobCalculator.getTempBasalIncludingConvertedExtended(dateUtil.now())
if (temporaryBasal?.isInProgress == false) temporaryBasal = null
@ -168,7 +169,7 @@ class OverviewData @Inject constructor(
?: rh.gs(R.string.pump_basebasalrate, profile.getBasal())
} ?: rh.gs(R.string.value_unavailable_short)
fun temporaryBasalDialogText(iobCobCalculator: IobCobCalculator): String =
override fun temporaryBasalDialogText(iobCobCalculator: IobCobCalculator): String =
profileFunction.getProfile()?.let { profile ->
iobCobCalculator.getTempBasalIncludingConvertedExtended(dateUtil.now())?.let { temporaryBasal ->
"${rh.gs(R.string.base_basal_rate_label)}: ${rh.gs(R.string.pump_basebasalrate, profile.getBasal())}" +
@ -177,7 +178,7 @@ class OverviewData @Inject constructor(
?: "${rh.gs(R.string.base_basal_rate_label)}: ${rh.gs(R.string.pump_basebasalrate, profile.getBasal())}"
} ?: rh.gs(R.string.value_unavailable_short)
@DrawableRes fun temporaryBasalIcon(iobCobCalculator: IobCobCalculator): Int =
@DrawableRes override fun temporaryBasalIcon(iobCobCalculator: IobCobCalculator): Int =
profileFunction.getProfile()?.let { profile ->
iobCobCalculator.getTempBasalIncludingConvertedExtended(dateUtil.now())?.let { temporaryBasal ->
val percentRate = temporaryBasal.convertedToPercent(dateUtil.now(), profile)
@ -189,50 +190,54 @@ class OverviewData @Inject constructor(
}
} ?: R.drawable.ic_cp_basal_no_tbr
@AttrRes fun temporaryBasalColor(context: Context?, iobCobCalculator: IobCobCalculator): Int = iobCobCalculator.getTempBasalIncludingConvertedExtended(dateUtil.now())?.let { rh.gac(context, R
.attr.basal) }
?: rh.gac(context, R.attr.defaultTextColor)
@AttrRes override fun temporaryBasalColor(context: Context?, iobCobCalculator: IobCobCalculator): Int = iobCobCalculator.getTempBasalIncludingConvertedExtended(dateUtil.now())?.let {
rh.gac(
context, R
.attr.basal
)
}
?: rh.gac(context, R.attr.defaultTextColor)
/*
* EXTENDED BOLUS
*/
fun extendedBolusText(iobCobCalculator: IobCobCalculator): String =
override fun extendedBolusText(iobCobCalculator: IobCobCalculator): String =
iobCobCalculator.getExtendedBolus(dateUtil.now())?.let { extendedBolus ->
if (!extendedBolus.isInProgress(dateUtil)) ""
else if (!activePlugin.activePump.isFakingTempsByExtendedBoluses) rh.gs(R.string.pump_basebasalrate, extendedBolus.rate)
else ""
} ?: ""
fun extendedBolusDialogText(iobCobCalculator: IobCobCalculator): String =
override fun extendedBolusDialogText(iobCobCalculator: IobCobCalculator): String =
iobCobCalculator.getExtendedBolus(dateUtil.now())?.toStringFull(dateUtil) ?: ""
/*
* IOB, COB
*/
fun bolusIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromBolus().round()
fun basalIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round()
fun cobInfo(iobCobCalculator: IobCobCalculator): CobInfo = iobCobCalculator.getCobInfo(true, "Overview COB")
override fun bolusIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromBolus().round()
override fun basalIob(iobCobCalculator: IobCobCalculator): IobTotal = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round()
override fun cobInfo(iobCobCalculator: IobCobCalculator): CobInfo = iobCobCalculator.getCobInfo(true, "Overview COB")
val lastCarbsTime: Long
override val lastCarbsTime: Long
get() = repository.getLastCarbsRecordWrapped().blockingGet().let { lastCarbs ->
if (lastCarbs is ValueWrapper.Existing) lastCarbs.value.timestamp else 0L
}
fun iobText(iobCobCalculator: IobCobCalculator): String =
rh.gs(R.string.formatinsulinunits, bolusIob(iobCobCalculator).iob + basalIob(iobCobCalculator).basaliob)
override fun iobText(iobCobCalculator: IobCobCalculator): String =
rh.gs(R.string.format_insulin_units, bolusIob(iobCobCalculator).iob + basalIob(iobCobCalculator).basaliob)
fun iobDialogText(iobCobCalculator: IobCobCalculator): String =
rh.gs(R.string.formatinsulinunits, bolusIob(iobCobCalculator).iob + basalIob(iobCobCalculator).basaliob) + "\n" +
rh.gs(R.string.bolus) + ": " + rh.gs(R.string.formatinsulinunits, bolusIob(iobCobCalculator).iob) + "\n" +
rh.gs(R.string.basal) + ": " + rh.gs(R.string.formatinsulinunits, basalIob(iobCobCalculator).basaliob)
override fun iobDialogText(iobCobCalculator: IobCobCalculator): String =
rh.gs(R.string.format_insulin_units, bolusIob(iobCobCalculator).iob + basalIob(iobCobCalculator).basaliob) + "\n" +
rh.gs(R.string.bolus) + ": " + rh.gs(R.string.format_insulin_units, bolusIob(iobCobCalculator).iob) + "\n" +
rh.gs(R.string.basal) + ": " + rh.gs(R.string.format_insulin_units, basalIob(iobCobCalculator).basaliob)
/*
* TEMP TARGET
*/
val temporaryTarget: TemporaryTarget?
override val temporaryTarget: TemporaryTarget?
get() =
repository.getTemporaryTargetActiveAt(dateUtil.now()).blockingGet().let { tempTarget ->
if (tempTarget is ValueWrapper.Existing) tempTarget.value
@ -243,69 +248,77 @@ class OverviewData @Inject constructor(
* SENSITIVITY
*/
fun lastAutosensData(iobCobCalculator: IobCobCalculator) : AutosensData? = iobCobCalculator.ads.getLastAutosensData("Overview", aapsLogger, dateUtil)
override fun lastAutosensData(iobCobCalculator: IobCobCalculator): AutosensData? = iobCobCalculator.ads.getLastAutosensData("Overview", aapsLogger, dateUtil)
/*
* Graphs
*/
var bgReadingsArray: List<GlucoseValue> = ArrayList()
var maxBgValue = Double.MIN_VALUE
var bucketedGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
var bgReadingGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
var predictionsGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
override var bgReadingsArray: List<GlucoseValue> = ArrayList()
override var maxBgValue = Double.MIN_VALUE
override var bucketedGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
override var bgReadingGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
override var predictionsGraphSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
val basalScale = Scale()
var baseBasalGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
var tempBasalGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
var basalLineGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
var absoluteBasalGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override val basalScale = Scale()
override var baseBasalGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override var tempBasalGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override var basalLineGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override var absoluteBasalGraphSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
var temporaryTargetSeries: LineGraphSeries<DataPoint> = LineGraphSeries()
override var temporaryTargetSeries: LineGraphSeries<DataPoint> = LineGraphSeries()
var maxIAValue = 0.0
val actScale = Scale()
var activitySeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var activityPredictionSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var maxIAValue = 0.0
override val actScale = Scale()
override var activitySeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var activityPredictionSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var maxEpsValue = 0.0
val epsScale = Scale()
var epsSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
var maxTreatmentsValue = 0.0
var treatmentsSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
var maxTherapyEventValue = 0.0
var therapyEventSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
override var maxEpsValue = 0.0
override val epsScale = Scale()
override var epsSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
override var maxTreatmentsValue = 0.0
override var treatmentsSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
override var maxTherapyEventValue = 0.0
override var therapyEventSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
var maxIobValueFound = Double.MIN_VALUE
val iobScale = Scale()
var iobSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var absIobSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var iobPredictions1Series: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
override var maxIobValueFound = Double.MIN_VALUE
override val iobScale = Scale()
override var iobSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var absIobSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var iobPredictions1Series: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
//var iobPredictions2Series: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
var maxBGIValue = Double.MIN_VALUE
val bgiScale = Scale()
var minusBgiSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var minusBgiHistSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var maxBGIValue = Double.MIN_VALUE
override val bgiScale = Scale()
override var minusBgiSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var minusBgiHistSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var maxCobValueFound = Double.MIN_VALUE
val cobScale = Scale()
var cobSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
var cobMinFailOverSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> = PointsWithLabelGraphSeries()
override var maxCobValueFound = Double.MIN_VALUE
override val cobScale = Scale()
override var cobSeries: FixedLineGraphSeries<ScaledDataPoint> = FixedLineGraphSeries()
override var cobMinFailOverSeries: PointsWithLabelGraphSeries<DataPointWithLabelInterface> =
PointsWithLabelGraphSeries()
var maxDevValueFound = Double.MIN_VALUE
val devScale = Scale()
var deviationsSeries: BarGraphSeries<DeviationDataPoint> = BarGraphSeries()
override var maxDevValueFound = Double.MIN_VALUE
override val devScale = Scale()
override var deviationsSeries: BarGraphSeries<DeviationDataPoint> = BarGraphSeries()
var maxRatioValueFound = 5.0 //even if sens data equals 0 for all the period, minimum scale is between 95% and 105%
var minRatioValueFound = -maxRatioValueFound
val ratioScale = Scale()
var ratioSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override var maxRatioValueFound = 5.0 //even if sens data equals 0 for all the period, minimum scale is between 95% and 105%
override var minRatioValueFound = -maxRatioValueFound
override val ratioScale = Scale()
override var ratioSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
var maxFromMaxValueFound = Double.MIN_VALUE
var maxFromMinValueFound = Double.MIN_VALUE
val dsMaxScale = Scale()
val dsMinScale = Scale()
var dsMaxSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
var dsMinSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override var maxFromMaxValueFound = Double.MIN_VALUE
override var maxFromMinValueFound = Double.MIN_VALUE
override val dsMaxScale = Scale()
override val dsMinScale = Scale()
override var dsMaxSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
override var dsMinSeries: LineGraphSeries<ScaledDataPoint> = LineGraphSeries()
}

View file

@ -39,7 +39,7 @@ class CommandBolus(
}
override fun log(): String {
return (if (detailedBolusInfo.insulin > 0) "BOLUS " + rh.gs(R.string.formatinsulinunits, detailedBolusInfo.insulin) else "") +
return (if (detailedBolusInfo.insulin > 0) "BOLUS " + rh.gs(R.string.format_insulin_units, detailedBolusInfo.insulin) else "") +
if (detailedBolusInfo.carbs > 0) "CARBS " + rh.gs(R.string.format_carbs, detailedBolusInfo.carbs.toInt()) else ""
}

View file

@ -42,7 +42,7 @@ class CommandSMBBolus(
override fun status(): String = rh.gs(R.string.smb_bolus_u, detailedBolusInfo.insulin)
override fun log(): String = "SMB BOLUS ${rh.gs(R.string.formatinsulinunits, detailedBolusInfo.insulin)}"
override fun log(): String = "SMB BOLUS ${rh.gs(R.string.format_insulin_units, detailedBolusInfo.insulin)}"
override fun cancel() {
aapsLogger.debug(LTag.PUMPQUEUE, "Result cancel")
callback?.result(PumpEnactResult(injector).success(false).comment(info.nightscout.core.main.R.string.connectiontimedout))?.run()

View file

@ -6,8 +6,6 @@ import android.graphics.Typeface
import android.view.Gravity
import android.widget.TableRow
import android.widget.TextView
import info.nightscout.core.profile.toCurrentUnitsString
import info.nightscout.core.profile.toUnitsString
import info.nightscout.implementation.R
import info.nightscout.interfaces.Constants
import info.nightscout.interfaces.profile.Profile

View file

@ -8,7 +8,6 @@ import android.view.Gravity
import android.view.ViewGroup
import android.widget.TableLayout
import android.widget.TextView
import info.nightscout.core.profile.toCurrentUnitsString
import info.nightscout.database.impl.AppRepository
import info.nightscout.implementation.R
import info.nightscout.interfaces.Constants

View file

@ -149,7 +149,7 @@ class CommandQueueImplementationTest : TestBaseWithProfile() {
val percentageConstraint = Constraint(0)
`when`(constraintChecker.applyBasalPercentConstraints(anyObject(), anyObject())).thenReturn(percentageConstraint)
`when`(rh.gs(R.string.connectiontimedout)).thenReturn("Connection timed out")
`when`(rh.gs(R.string.formatinsulinunits)).thenReturn("%1\$.2f U")
`when`(rh.gs(R.string.format_insulin_units)).thenReturn("%1\$.2f U")
`when`(rh.gs(R.string.goingtodeliver)).thenReturn("Going to deliver %1\$.2f U")
}

View file

@ -29,10 +29,10 @@ import info.nightscout.androidaps.plugins.pump.insight.descriptors.CartridgeStat
import info.nightscout.androidaps.plugins.pump.insight.descriptors.InsightState;
import info.nightscout.androidaps.plugins.pump.insight.descriptors.TotalDailyDose;
import info.nightscout.androidaps.plugins.pump.insight.events.EventLocalInsightUpdateGUI;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.core.utils.fabric.FabricPrivacy;
import info.nightscout.interfaces.queue.Callback;
import info.nightscout.interfaces.queue.CommandQueue;
import info.nightscout.interfaces.utils.DecimalFormatter;
import info.nightscout.rx.AapsSchedulers;
import info.nightscout.rx.bus.RxBus;
import info.nightscout.shared.interfaces.ResourceHelper;

View file

@ -0,0 +1,18 @@
package info.nightscout.interfaces
import info.nightscout.database.entities.OfflineEvent
import info.nightscout.database.entities.TemporaryTarget
import info.nightscout.database.entities.TherapyEvent
import info.nightscout.database.entities.UserEntry
import info.nightscout.database.entities.ValueWithUnit
interface Translator {
fun translate(action: UserEntry.Action): String
fun translate(units: ValueWithUnit?): String
fun translate(meterType: TherapyEvent.MeterType?): String
fun translate(type: TherapyEvent.Type?): String
fun translate(reason: TemporaryTarget.Reason?): String
fun translate(reason: OfflineEvent.Reason?): String
fun translate(source: UserEntry.Sources): String
}

View file

@ -0,0 +1,34 @@
package info.nightscout.interfaces.profile
interface DefaultValueHelper {
/**
* returns the configured EatingSoon TempTarget, if this is set to 0, the Default-Value is returned.
*
* @return
*/
fun determineEatingSoonTT(): Double
fun determineEatingSoonTTDuration(): Int
/**
* returns the configured Activity TempTarget, if this is set to 0, the Default-Value is returned.
*
* @return
*/
fun determineActivityTT(): Double
fun determineActivityTTDuration(): Int
/**
* returns the configured Hypo TempTarget, if this is set to 0, the Default-Value is returned.
*
* @return
*/
fun determineHypoTT(): Double
fun determineHypoTTDuration(): Int
var bgTargetLow: Double
var bgTargetHigh: Double
fun determineHighLine(): Double
fun determineLowLine(): Double
}

Some files were not shown because too many files have changed in this diff Show more