Merge pull request #123 from 0pen-dash/avereha/merge-dev-6

Avereha/merge dev 6
This commit is contained in:
Andrei Vereha 2021-09-21 21:35:57 +02:00 committed by GitHub
commit 3f8ec1c10f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
70 changed files with 409 additions and 350 deletions

View file

@ -2,6 +2,7 @@
<dictionary name="project-dictionary"> <dictionary name="project-dictionary">
<words> <words>
<w>aaps</w> <w>aaps</w>
<w>abcdef</w>
<w>acked</w> <w>acked</w>
<w>actionstring</w> <w>actionstring</w>
<w>allowednumbers</w> <w>allowednumbers</w>
@ -14,8 +15,10 @@
<w>basals</w> <w>basals</w>
<w>bgcheck</w> <w>bgcheck</w>
<w>bgsource</w> <w>bgsource</w>
<w>boluscalc</w>
<w>bolusing</w> <w>bolusing</w>
<w>carb</w> <w>carb</w>
<w>carbratio</w>
<w>carbs</w> <w>carbs</w>
<w>carbsreq</w> <w>carbsreq</w>
<w>careportal</w> <w>careportal</w>
@ -46,6 +49,7 @@
<w>medtronic</w> <w>medtronic</w>
<w>mgdl</w> <w>mgdl</w>
<w>mmol</w> <w>mmol</w>
<w>motol</w>
<w>multiwave</w> <w>multiwave</w>
<w>netinsulin</w> <w>netinsulin</w>
<w>netratio</w> <w>netratio</w>
@ -55,9 +59,14 @@
<w>okcancel</w> <w>okcancel</w>
<w>omnipod</w> <w>omnipod</w>
<w>openaps</w> <w>openaps</w>
<w>openhumans</w>
<w>oref</w> <w>oref</w>
<w>otpauth</w>
<w>passcode</w> <w>passcode</w>
<w>pdus</w>
<w>philoul</w>
<w>poctech</w> <w>poctech</w>
<w>pred</w>
<w>profileswitch</w> <w>profileswitch</w>
<w>pumpbtcomm</w> <w>pumpbtcomm</w>
<w>quickwizard</w> <w>quickwizard</w>
@ -66,14 +75,18 @@
<w>refresheventsfromnightscout</w> <w>refresheventsfromnightscout</w>
<w>rileylink</w> <w>rileylink</w>
<w>roboelectric</w> <w>roboelectric</w>
<w>sgvs</w>
<w>sitechange</w> <w>sitechange</w>
<w>smscommunicator</w> <w>smscommunicator</w>
<w>sntp</w>
<w>sooil</w> <w>sooil</w>
<w>soundid</w> <w>soundid</w>
<w>splitted</w> <w>splitted</w>
<w>ssid</w>
<w>superbolus</w> <w>superbolus</w>
<w>targethigh</w> <w>targethigh</w>
<w>targetlow</w> <w>targetlow</w>
<w>tbrs</w>
<w>tdds</w> <w>tdds</w>
<w>tempbasal</w> <w>tempbasal</w>
<w>tempbasals</w> <w>tempbasals</w>
@ -82,9 +95,11 @@
<w>tidepool</w> <w>tidepool</w>
<w>timeshift</w> <w>timeshift</w>
<w>tirs</w> <w>tirs</w>
<w>totp</w>
<w>uart</w> <w>uart</w>
<w>wizzardpage</w> <w>wizzardpage</w>
<w>xdrip</w> <w>xdrip</w>
<w>xstream</w>
<w>ypso</w> <w>ypso</w>
<w>ypsomed</w> <w>ypsomed</w>
<w>ypsopump</w> <w>ypsopump</w>

View file

@ -109,7 +109,7 @@ android {
defaultConfig { defaultConfig {
multiDexEnabled true multiDexEnabled true
versionCode 1500 versionCode 1500
version "2.8.2.2-dev" version "2.8.2.3-dev"
buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"' buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'

View file

@ -32,6 +32,7 @@ import info.nightscout.androidaps.receivers.TimeDateOrTZChangeReceiver
import info.nightscout.androidaps.utils.ActivityMonitor import info.nightscout.androidaps.utils.ActivityMonitor
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.locale.LocaleHelper.update import info.nightscout.androidaps.utils.locale.LocaleHelper.update
import info.nightscout.androidaps.utils.protection.PasswordCheck
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.plusAssign
@ -56,6 +57,7 @@ class MainApp : DaggerApplication() {
@Inject lateinit var dateUtil: DateUtil @Inject lateinit var dateUtil: DateUtil
@Inject lateinit var staticInjector: StaticInjector// TODO avoid , here fake only to initialize @Inject lateinit var staticInjector: StaticInjector// TODO avoid , here fake only to initialize
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var passwordCheck: PasswordCheck
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
@ -87,6 +89,7 @@ class MainApp : DaggerApplication() {
keepAliveManager.setAlarm(this) keepAliveManager.setAlarm(this)
doMigrations() doMigrations()
uel.log(UserEntry.Action.START_AAPS, UserEntry.Sources.Aaps) uel.log(UserEntry.Action.START_AAPS, UserEntry.Sources.Aaps)
passwordCheck.passwordResetCheck(this)
} }
private fun doMigrations() { private fun doMigrations() {

View file

@ -17,7 +17,6 @@ abstract class ObjectivesModule {
@ContributesAndroidInjector abstract fun objective5Injector(): Objective5 @ContributesAndroidInjector abstract fun objective5Injector(): Objective5
@ContributesAndroidInjector abstract fun objective6Injector(): Objective6 @ContributesAndroidInjector abstract fun objective6Injector(): Objective6
@ContributesAndroidInjector abstract fun objective7Injector(): Objective7 @ContributesAndroidInjector abstract fun objective7Injector(): Objective7
@ContributesAndroidInjector abstract fun objective8Injector(): Objective8
@ContributesAndroidInjector abstract fun objective9Injector(): Objective9 @ContributesAndroidInjector abstract fun objective9Injector(): Objective9
@ContributesAndroidInjector abstract fun objective10Injector(): Objective10 @ContributesAndroidInjector abstract fun objective10Injector(): Objective10

View file

@ -54,9 +54,8 @@ class ObjectivesPlugin @Inject constructor(
const val MAXIOB_ZERO_CL_OBJECTIVE = 5 const val MAXIOB_ZERO_CL_OBJECTIVE = 5
@Suppress("unused") const val MAXIOB_OBJECTIVE = 6 @Suppress("unused") const val MAXIOB_OBJECTIVE = 6
const val AUTOSENS_OBJECTIVE = 7 const val AUTOSENS_OBJECTIVE = 7
const val AMA_OBJECTIVE = 8 const val SMB_OBJECTIVE = 8
const val SMB_OBJECTIVE = 9 const val AUTO_OBJECTIVE = 9
const val AUTO_OBJECTIVE = 10
} }
public override fun onStart() { public override fun onStart() {
@ -64,9 +63,8 @@ class ObjectivesPlugin @Inject constructor(
setupObjectives() setupObjectives()
} }
override fun specialEnableCondition(): Boolean { override fun specialEnableCondition(): Boolean =
return activePlugin.activePump.pumpDescription.isTempBasalCapable activePlugin.activePump.pumpDescription.isTempBasalCapable
}
private fun setupObjectives() { private fun setupObjectives() {
objectives.clear() objectives.clear()
@ -78,9 +76,9 @@ class ObjectivesPlugin @Inject constructor(
objectives.add(Objective5(injector)) objectives.add(Objective5(injector))
objectives.add(Objective6(injector)) objectives.add(Objective6(injector))
objectives.add(Objective7(injector)) objectives.add(Objective7(injector))
objectives.add(Objective8(injector))
objectives.add(Objective9(injector)) objectives.add(Objective9(injector))
objectives.add(Objective10(injector)) objectives.add(Objective10(injector))
// edit companion object if you remove/add Objective
} }
fun reset() { fun reset() {
@ -116,8 +114,6 @@ class ObjectivesPlugin @Inject constructor(
sp.putLong("Objectives_" + "maxiob" + "_accomplished", dateUtil.now()) sp.putLong("Objectives_" + "maxiob" + "_accomplished", dateUtil.now())
sp.putLong("Objectives_" + "autosens" + "_started", dateUtil.now()) sp.putLong("Objectives_" + "autosens" + "_started", dateUtil.now())
sp.putLong("Objectives_" + "autosens" + "_accomplished", dateUtil.now()) sp.putLong("Objectives_" + "autosens" + "_accomplished", dateUtil.now())
sp.putLong("Objectives_" + "ama" + "_started", dateUtil.now())
sp.putLong("Objectives_" + "ama" + "_accomplished", dateUtil.now())
sp.putLong("Objectives_" + "smb" + "_started", dateUtil.now()) sp.putLong("Objectives_" + "smb" + "_started", dateUtil.now())
sp.putLong("Objectives_" + "smb" + "_accomplished", dateUtil.now()) sp.putLong("Objectives_" + "smb" + "_accomplished", dateUtil.now())
sp.putLong("Objectives_" + "auto" + "_started", dateUtil.now()) sp.putLong("Objectives_" + "auto" + "_started", dateUtil.now())
@ -143,49 +139,43 @@ class ObjectivesPlugin @Inject constructor(
*/ */
override fun isLoopInvocationAllowed(value: Constraint<Boolean>): Constraint<Boolean> { override fun isLoopInvocationAllowed(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[FIRST_OBJECTIVE].isStarted) if (!objectives[FIRST_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), FIRST_OBJECTIVE + 1), this) value.set(aapsLogger, false, resourceHelper.gs(R.string.objectivenotstarted, FIRST_OBJECTIVE + 1), this)
return value return value
} }
override fun isLgsAllowed(value: Constraint<Boolean>): Constraint<Boolean> { override fun isLgsAllowed(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[MAXBASAL_OBJECTIVE].isStarted) if (!objectives[MAXBASAL_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), MAXBASAL_OBJECTIVE + 1), this) value.set(aapsLogger, false, resourceHelper.gs(R.string.objectivenotstarted, MAXBASAL_OBJECTIVE + 1), this)
return value return value
} }
override fun isClosedLoopAllowed(value: Constraint<Boolean>): Constraint<Boolean> { override fun isClosedLoopAllowed(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[MAXIOB_ZERO_CL_OBJECTIVE].isStarted) if (!objectives[MAXIOB_ZERO_CL_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), MAXIOB_ZERO_CL_OBJECTIVE + 1), this) value.set(aapsLogger, false, resourceHelper.gs(R.string.objectivenotstarted, MAXIOB_ZERO_CL_OBJECTIVE + 1), this)
return value return value
} }
override fun isAutosensModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> { override fun isAutosensModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[AUTOSENS_OBJECTIVE].isStarted) if (!objectives[AUTOSENS_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), AUTOSENS_OBJECTIVE + 1), this) value.set(aapsLogger, false, resourceHelper.gs(R.string.objectivenotstarted, AUTOSENS_OBJECTIVE + 1), this)
return value
}
override fun isAMAModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[AMA_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), AMA_OBJECTIVE + 1), this)
return value return value
} }
override fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> { override fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[SMB_OBJECTIVE].isStarted) if (!objectives[SMB_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), SMB_OBJECTIVE + 1), this) value.set(aapsLogger, false, resourceHelper.gs(R.string.objectivenotstarted, SMB_OBJECTIVE + 1), this)
return value return value
} }
override fun applyMaxIOBConstraints(maxIob: Constraint<Double>): Constraint<Double> { override fun applyMaxIOBConstraints(maxIob: Constraint<Double>): Constraint<Double> {
if (objectives[MAXIOB_ZERO_CL_OBJECTIVE].isStarted && !objectives[MAXIOB_ZERO_CL_OBJECTIVE].isAccomplished) if (objectives[MAXIOB_ZERO_CL_OBJECTIVE].isStarted && !objectives[MAXIOB_ZERO_CL_OBJECTIVE].isAccomplished)
maxIob.set(aapsLogger, 0.0, String.format(resourceHelper.gs(R.string.objectivenotfinished), MAXIOB_ZERO_CL_OBJECTIVE + 1), this) maxIob.set(aapsLogger, 0.0, resourceHelper.gs(R.string.objectivenotfinished, MAXIOB_ZERO_CL_OBJECTIVE + 1), this)
return maxIob return maxIob
} }
override fun isAutomationEnabled(value: Constraint<Boolean>): Constraint<Boolean> { override fun isAutomationEnabled(value: Constraint<Boolean>): Constraint<Boolean> {
if (!objectives[AUTO_OBJECTIVE].isStarted) if (!objectives[AUTO_OBJECTIVE].isStarted)
value.set(aapsLogger, false, String.format(resourceHelper.gs(R.string.objectivenotstarted), AUTO_OBJECTIVE + 1), this) value.set(aapsLogger, false, resourceHelper.gs(R.string.objectivenotstarted, AUTO_OBJECTIVE + 1), this)
return value return value
} }
} }

View file

@ -1,12 +0,0 @@
package info.nightscout.androidaps.plugins.constraints.objectives.objectives
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R
import info.nightscout.androidaps.utils.T
class Objective8(injector: HasAndroidInjector) : Objective(injector, "ama", R.string.objectives_ama_objective, 0) {
init {
tasks.add(MinimumDurationTask(this, T.days(28).msecs()))
}
}

View file

@ -156,7 +156,7 @@ class ActionsFragment : DaggerFragment() {
pbLevelLabel = view.findViewById(R.id.pb_level_label) pbLevelLabel = view.findViewById(R.id.pb_level_label)
profileSwitch?.setOnClickListener { profileSwitch?.setOnClickListener {
ProfileSwitchDialog().show(childFragmentManager, "Actions") ProfileSwitchDialog().show(childFragmentManager, "ProfileSwitchDialog")
} }
tempTarget?.setOnClickListener { tempTarget?.setOnClickListener {
TempTargetDialog().show(childFragmentManager, "Actions") TempTargetDialog().show(childFragmentManager, "Actions")

View file

@ -16,8 +16,8 @@ class NSAddAck(
) : Event(), Ack { ) : Event(), Ack {
var id: String? = null var id: String? = null
@JvmField var nsClientID: String? = null var nsClientID: String? = null
@JvmField var json: JSONObject? = null var json: JSONObject? = null
override fun call(vararg args: Any) { override fun call(vararg args: Any) {
// Regular response // Regular response
try { try {

View file

@ -377,7 +377,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
} }
R.id.temp_target -> v.performClick() R.id.temp_target -> v.performClick()
R.id.active_profile -> activity?.let { activity -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { ProfileSwitchDialog().show(childFragmentManager, "Overview") }) } R.id.active_profile -> activity?.let { activity -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { ProfileSwitchDialog().show(childFragmentManager, "ProfileSwitchDialog") }) }
} }
return false return false
@ -680,14 +680,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.iob), overviewData.iobDialogText) } activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.iob), overviewData.iobDialogText) }
} }
// cob // cob
var cobText: String = resourceHelper.gs(R.string.value_unavailable_short) var cobText = overviewData.cobInfo?.displayText(resourceHelper, dateUtil, buildHelper.isDev()) ?: resourceHelper.gs(R.string.value_unavailable_short)
overviewData.cobInfo?.let { cobInfo ->
if (cobInfo.displayCob != null) {
cobText = resourceHelper.gs(R.string.format_carbs, cobInfo.displayCob!!.toInt())
if (cobInfo.futureCarbs > 0) cobText += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"
}
}
binding.infoLayout.cob.text = cobText
val constraintsProcessed = loopPlugin.lastRun?.constraintsProcessed val constraintsProcessed = loopPlugin.lastRun?.constraintsProcessed
val lastRun = loopPlugin.lastRun val lastRun = loopPlugin.lastRun
@ -695,7 +688,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
if (constraintsProcessed.carbsReq > 0) { if (constraintsProcessed.carbsReq > 0) {
//only display carbsreq when carbs have not been entered recently //only display carbsreq when carbs have not been entered recently
if (overviewData.lastCarbsTime < lastRun.lastAPSRun) { if (overviewData.lastCarbsTime < lastRun.lastAPSRun) {
cobText = cobText + " | " + constraintsProcessed.carbsReq + " " + resourceHelper.gs(R.string.required) cobText += " | " + constraintsProcessed.carbsReq + " " + resourceHelper.gs(R.string.required)
} }
if (carbAnimation?.isRunning == false) if (carbAnimation?.isRunning == false)
carbAnimation?.start() carbAnimation?.start()
@ -704,6 +697,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
carbAnimation?.selectDrawable(0) carbAnimation?.selectDrawable(0)
} }
} }
binding.infoLayout.cob.text = cobText
} }
OverviewData.Property.TEMPORARY_TARGET -> { OverviewData.Property.TEMPORARY_TARGET -> {

View file

@ -23,7 +23,6 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventBucke
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.Translator
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.androidaps.utils.rx.AapsSchedulers
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
@ -45,8 +44,6 @@ class OverviewPlugin @Inject constructor(
resourceHelper: ResourceHelper, resourceHelper: ResourceHelper,
private val config: Config, private val config: Config,
private val dateUtil: DateUtil, private val dateUtil: DateUtil,
private val translator: Translator,
// private val profiler: Profiler,
private val profileFunction: ProfileFunction, private val profileFunction: ProfileFunction,
private val iobCobCalculator: IobCobCalculator, private val iobCobCalculator: IobCobCalculator,
private val repository: AppRepository, private val repository: AppRepository,
@ -234,7 +231,6 @@ class OverviewPlugin @Inject constructor(
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TIME)) overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TIME))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TEMPORARY_BASAL)) overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TEMPORARY_BASAL))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.EXTENDED_BOLUS)) overviewBus.send(EventUpdateOverview(from, OverviewData.Property.EXTENDED_BOLUS))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.IOB_COB))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TEMPORARY_TARGET)) overviewBus.send(EventUpdateOverview(from, OverviewData.Property.TEMPORARY_TARGET))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.SENSITIVITY)) overviewBus.send(EventUpdateOverview(from, OverviewData.Property.SENSITIVITY))
loadAsData(from) loadAsData(from)
@ -244,6 +240,7 @@ class OverviewPlugin @Inject constructor(
overviewData.prepareTreatmentsData(from) overviewData.prepareTreatmentsData(from)
overviewData.prepareIobAutosensData(from) overviewData.prepareIobAutosensData(from)
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.GRAPH)) overviewBus.send(EventUpdateOverview(from, OverviewData.Property.GRAPH))
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.IOB_COB))
aapsLogger.debug(LTag.UI, "refreshLoop finished") aapsLogger.debug(LTag.UI, "refreshLoop finished")
runningRefresh = false runningRefresh = false
} }
@ -305,7 +302,7 @@ class OverviewPlugin @Inject constructor(
private fun loadIobCobResults(from: String) { private fun loadIobCobResults(from: String) {
overviewData.bolusIob = iobCobCalculator.calculateIobFromBolus().round() overviewData.bolusIob = iobCobCalculator.calculateIobFromBolus().round()
overviewData.basalIob = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round() overviewData.basalIob = iobCobCalculator.calculateIobFromTempBasalsIncludingConvertedExtended().round()
overviewData.cobInfo = iobCobCalculator.getCobInfo(false, "Overview COB") overviewData.cobInfo = iobCobCalculator.getCobInfo(true, "Overview COB")
val lastCarbs = repository.getLastCarbsRecordWrapped().blockingGet() val lastCarbs = repository.getLastCarbsRecordWrapped().blockingGet()
overviewData.lastCarbsTime = if (lastCarbs is ValueWrapper.Existing) lastCarbs.value.timestamp else 0L overviewData.lastCarbsTime = if (lastCarbs is ValueWrapper.Existing) lastCarbs.value.timestamp else 0L

View file

@ -74,7 +74,7 @@ class StatusLightHandler @Inject constructor(
private fun handleAge(view: TextView?, type: TherapyEvent.Type, @StringRes warnSettings: Int, defaultWarnThreshold: Double, @StringRes urgentSettings: Int, defaultUrgentThreshold: Double) { private fun handleAge(view: TextView?, type: TherapyEvent.Type, @StringRes warnSettings: Int, defaultWarnThreshold: Double, @StringRes urgentSettings: Int, defaultUrgentThreshold: Double) {
val warn = sp.getDouble(warnSettings, defaultWarnThreshold) val warn = sp.getDouble(warnSettings, defaultWarnThreshold)
val urgent = sp.getDouble(urgentSettings, defaultUrgentThreshold) val urgent = sp.getDouble(urgentSettings, defaultUrgentThreshold)
val therapyEvent = repository.getLastTherapyRecord(type).blockingGet() val therapyEvent = repository.getLastTherapyRecordUpToNow(type).blockingGet()
if (therapyEvent is ValueWrapper.Existing) { if (therapyEvent is ValueWrapper.Existing) {
warnColors.setColorByAge(view, therapyEvent.value, warn, urgent) warnColors.setColorByAge(view, therapyEvent.value, warn, urgent)
view?.text = therapyEvent.value.age(resourceHelper.shortTextMode(), resourceHelper, dateUtil) view?.text = therapyEvent.value.age(resourceHelper.shortTextMode(), resourceHelper, dateUtil)

View file

@ -29,12 +29,9 @@ import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.android.AndroidInjection; import dagger.android.AndroidInjection;
import info.nightscout.androidaps.interfaces.Config;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.R; import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.interfaces.GlucoseUnit;
import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.database.AppRepository; import info.nightscout.androidaps.database.AppRepository;
import info.nightscout.androidaps.database.entities.Bolus; import info.nightscout.androidaps.database.entities.Bolus;
import info.nightscout.androidaps.database.entities.GlucoseValue; import info.nightscout.androidaps.database.entities.GlucoseValue;
@ -42,8 +39,11 @@ import info.nightscout.androidaps.database.entities.TemporaryBasal;
import info.nightscout.androidaps.extensions.GlucoseValueExtensionKt; import info.nightscout.androidaps.extensions.GlucoseValueExtensionKt;
import info.nightscout.androidaps.extensions.TemporaryBasalExtensionKt; import info.nightscout.androidaps.extensions.TemporaryBasalExtensionKt;
import info.nightscout.androidaps.interfaces.ActivePlugin; import info.nightscout.androidaps.interfaces.ActivePlugin;
import info.nightscout.androidaps.interfaces.Config;
import info.nightscout.androidaps.interfaces.GlucoseUnit;
import info.nightscout.androidaps.interfaces.IobCobCalculator; import info.nightscout.androidaps.interfaces.IobCobCalculator;
import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.Profile;
import info.nightscout.androidaps.interfaces.ProfileFunction; import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.logging.LTag;
@ -59,7 +59,7 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProv
import info.nightscout.androidaps.receivers.ReceiverStatusStore; import info.nightscout.androidaps.receivers.ReceiverStatusStore;
import info.nightscout.androidaps.utils.DecimalFormatter; import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.DefaultValueHelper; import info.nightscout.androidaps.utils.DefaultValueHelper;
import info.nightscout.androidaps.utils.ToastUtils; import info.nightscout.androidaps.utils.TrendCalculator;
import info.nightscout.androidaps.utils.resources.ResourceHelper; import info.nightscout.androidaps.utils.resources.ResourceHelper;
import info.nightscout.androidaps.utils.sharedPreferences.SP; import info.nightscout.androidaps.utils.sharedPreferences.SP;
@ -79,6 +79,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
@Inject public AppRepository repository; @Inject public AppRepository repository;
@Inject ReceiverStatusStore receiverStatusStore; @Inject ReceiverStatusStore receiverStatusStore;
@Inject Config config; @Inject Config config;
@Inject public TrendCalculator trendCalculator;
public static final String ACTION_RESEND = WatchUpdaterService.class.getName().concat(".Resend"); public static final String ACTION_RESEND = WatchUpdaterService.class.getName().concat(".Resend");
public static final String ACTION_OPEN_SETTINGS = WatchUpdaterService.class.getName().concat(".OpenSettings"); public static final String ACTION_OPEN_SETTINGS = WatchUpdaterService.class.getName().concat(".OpenSettings");
@ -322,7 +323,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
dataMap.putString("delta", "--"); dataMap.putString("delta", "--");
dataMap.putString("avgDelta", "--"); dataMap.putString("avgDelta", "--");
} else { } else {
dataMap.putString("slopeArrow", slopeArrow(glucoseStatus.getDelta())); dataMap.putString("slopeArrow", trendCalculator.getTrendArrow(lastBG).getSymbol());
dataMap.putString("delta", deltastring(glucoseStatus.getDelta(), glucoseStatus.getDelta() * Constants.MGDL_TO_MMOLL, units)); dataMap.putString("delta", deltastring(glucoseStatus.getDelta(), glucoseStatus.getDelta() * Constants.MGDL_TO_MMOLL, units));
dataMap.putString("avgDelta", deltastring(glucoseStatus.getShortAvgDelta(), glucoseStatus.getShortAvgDelta() * Constants.MGDL_TO_MMOLL, units)); dataMap.putString("avgDelta", deltastring(glucoseStatus.getShortAvgDelta(), glucoseStatus.getShortAvgDelta() * Constants.MGDL_TO_MMOLL, units));
} }
@ -358,25 +359,6 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
return deltastring; return deltastring;
} }
private String slopeArrow(double delta) {
if (delta <= (-3.5 * 5)) {
return "\u21ca";
} else if (delta <= (-2 * 5)) {
return "\u2193";
} else if (delta <= (-1 * 5)) {
return "\u2198";
} else if (delta <= (1 * 5)) {
return "\u2192";
} else if (delta <= (2 * 5)) {
return "\u2197";
} else if (delta <= (3.5 * 5)) {
return "\u2191";
} else {
return "\u21c8";
}
}
private void resendData() { private void resendData() {
if (googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { if (googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) {
googleApiConnect(); googleApiConnect();
@ -391,16 +373,10 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
if (!graph_bgs.isEmpty()) { if (!graph_bgs.isEmpty()) {
DataMap entries = dataMapSingleBG(last_bg, glucoseStatus); DataMap entries = dataMapSingleBG(last_bg, glucoseStatus);
if (entries == null) {
ToastUtils.showToastInUiThread(this, resourceHelper.gs(R.string.noprofile));
return;
}
final ArrayList<DataMap> dataMaps = new ArrayList<>(graph_bgs.size()); final ArrayList<DataMap> dataMaps = new ArrayList<>(graph_bgs.size());
for (GlucoseValue bg : graph_bgs) { for (GlucoseValue bg : graph_bgs) {
DataMap dataMap = dataMapSingleBG(bg, glucoseStatus); DataMap dataMap = dataMapSingleBG(bg, glucoseStatus);
if (dataMap != null) { dataMaps.add(dataMap);
dataMaps.add(dataMap);
}
} }
entries.putDataMapArrayList("entries", dataMaps); entries.putDataMapArrayList("entries", dataMaps);
(new SendToDataLayerThread(WEARABLE_DATA_PATH, googleApiClient)).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, entries); (new SendToDataLayerThread(WEARABLE_DATA_PATH, googleApiClient)).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, entries);
@ -505,7 +481,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
tb2 = iobCobCalculator.getTempBasalIncludingConvertedExtended(now); //use "now" to express current situation tb2 = iobCobCalculator.getTempBasalIncludingConvertedExtended(now); //use "now" to express current situation
if (tb2 == null) { if (tb2 == null) {
//express the cancelled temp by painting it down one minute early //express the cancelled temp by painting it down one minute early
temps.add(tempDatamap(tb_start, tb_before, now - 1 * 60 * 1000, endBasalValue, tb_amount)); temps.add(tempDatamap(tb_start, tb_before, now - 60 * 1000, endBasalValue, tb_amount));
} else { } else {
//express currently running temp by painting it a bit into the future //express currently running temp by painting it a bit into the future
Profile profileNow = profileFunction.getProfile(now); Profile profileNow = profileFunction.getProfile(now);
@ -523,7 +499,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog
//onset at the end //onset at the end
Profile profileTB = profileFunction.getProfile(runningTime); Profile profileTB = profileFunction.getProfile(runningTime);
double currentAmount = TemporaryBasalExtensionKt.convertedToAbsolute(tb2, runningTime, profileTB); double currentAmount = TemporaryBasalExtensionKt.convertedToAbsolute(tb2, runningTime, profileTB);
temps.add(tempDatamap(now - 1 * 60 * 1000, endBasalValue, runningTime + 5 * 60 * 1000, currentAmount, currentAmount)); temps.add(tempDatamap(now - 60 * 1000, endBasalValue, runningTime + 5 * 60 * 1000, currentAmount, currentAmount));
} }
} }

View file

@ -270,18 +270,19 @@ class IobCobCalculatorPlugin @Inject constructor(
var displayCob: Double? = null var displayCob: Double? = null
var futureCarbs = 0.0 var futureCarbs = 0.0
val now = dateUtil.now() val now = dateUtil.now()
val carbs = repository.getCarbsDataFromTimeExpanded(now, true).blockingGet() var timestamp = now
val carbs = repository.getCarbsDataFromTimeExpanded(autosensData?.time ?: now, true).blockingGet()
if (autosensData != null) { if (autosensData != null) {
displayCob = autosensData.cob displayCob = autosensData.cob
carbs.forEach { carb -> carbs.forEach { carb ->
if (ads.roundUpTime(carb.timestamp) > ads.roundUpTime(autosensData.time) && carb.timestamp <= now) { if (carb.timestamp > autosensData.time && carb.timestamp <= now)
displayCob += carb.amount displayCob += carb.amount
}
} }
timestamp = autosensData.time
} }
// Future carbs // Future carbs
carbs.forEach { carb -> if (carb.timestamp > now) futureCarbs += carb.amount } carbs.forEach { carb -> if (carb.timestamp > now) futureCarbs += carb.amount }
return CobInfo(displayCob, futureCarbs) return CobInfo(timestamp, displayCob, futureCarbs)
} }
override fun getMealDataWithWaitingForCalculationFinish(): MealData { override fun getMealDataWithWaitingForCalculationFinish(): MealData {
@ -579,7 +580,7 @@ class IobCobCalculatorPlugin @Inject constructor(
return total return total
} }
open fun getCalculationToTimeTempBasals(toTime: Long, lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): IobTotal { fun getCalculationToTimeTempBasals(toTime: Long, lastAutosensResult: AutosensResult, exercise_mode: Boolean, half_basal_exercise_target: Int, isTempTarget: Boolean): IobTotal {
val total = IobTotal(toTime) val total = IobTotal(toTime)
val pumpInterface = activePlugin.activePump val pumpInterface = activePlugin.activePump
val now = dateUtil.now() val now = dateUtil.now()

View file

@ -72,7 +72,7 @@ class LocalProfileFragment : DaggerFragment() {
} }
private fun sumLabel(): String { private fun sumLabel(): String {
val profile = localProfilePlugin.profile?.getDefaultProfile() val profile = localProfilePlugin.getEditProfile()
val sum = profile?.let { ProfileSealed.Pure(profile).baseBasalSum() } ?: 0.0 val sum = profile?.let { ProfileSealed.Pure(profile).baseBasalSum() } ?: 0.0
return "" + DecimalFormatter.to2Decimal(sum) + resourceHelper.gs(R.string.insulin_unit_shortname) return "" + DecimalFormatter.to2Decimal(sum) + resourceHelper.gs(R.string.insulin_unit_shortname)
} }
@ -212,7 +212,7 @@ class LocalProfileFragment : DaggerFragment() {
binding.profileswitch.setOnClickListener { binding.profileswitch.setOnClickListener {
ProfileSwitchDialog() ProfileSwitchDialog()
.also { it.arguments = Bundle().also { bundle -> bundle.putInt("profileIndex", localProfilePlugin.currentProfileIndex) } } .also { it.arguments = Bundle().also { bundle -> bundle.putInt("profileIndex", localProfilePlugin.currentProfileIndex) } }
.show(childFragmentManager, "NewNSTreatmentDialog") .show(childFragmentManager, "ProfileSwitchDialog")
} }
binding.reset.setOnClickListener { binding.reset.setOnClickListener {
@ -259,7 +259,7 @@ class LocalProfileFragment : DaggerFragment() {
updateGUI() updateGUI()
} }
fun updateGUI() { private fun updateGUI() {
if (_binding == null) return if (_binding == null) return
val isValid = localProfilePlugin.isValidEditState() val isValid = localProfilePlugin.isValidEditState()
val isEdited = localProfilePlugin.isEdited val isEdited = localProfilePlugin.isEdited

View file

@ -12,6 +12,7 @@ import info.nightscout.androidaps.data.ProfileSealed
import info.nightscout.androidaps.data.PureProfile import info.nightscout.androidaps.data.PureProfile
import info.nightscout.androidaps.events.EventProfileStoreChanged import info.nightscout.androidaps.events.EventProfileStoreChanged
import info.nightscout.androidaps.extensions.blockFromJsonArray import info.nightscout.androidaps.extensions.blockFromJsonArray
import info.nightscout.androidaps.extensions.pureProfileFromJson
import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
@ -21,6 +22,7 @@ import info.nightscout.androidaps.receivers.DataWorker
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DecimalFormatter import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.HardLimits import info.nightscout.androidaps.utils.HardLimits
import info.nightscout.androidaps.utils.JsonHelper
import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
@ -97,7 +99,7 @@ class LocalProfilePlugin @Inject constructor(
var numOfProfiles = 0 var numOfProfiles = 0
internal var currentProfileIndex = 0 internal var currentProfileIndex = 0
fun currentProfile(): SingleProfile? = if (numOfProfiles > 0) profiles[currentProfileIndex] else null fun currentProfile(): SingleProfile? = if (numOfProfiles > 0 && currentProfileIndex < numOfProfiles) profiles[currentProfileIndex] else null
@Synchronized @Synchronized
fun isValidEditState(): Boolean { fun isValidEditState(): Boolean {
@ -123,6 +125,23 @@ class LocalProfilePlugin @Inject constructor(
return true return true
} }
@Synchronized
fun getEditProfile(): PureProfile? {
val profile = JSONObject()
with(profiles[currentProfileIndex]) {
profile.put("dia", dia)
profile.put("carbratio", ic)
profile.put("sens", isf)
profile.put("basal", basal)
profile.put("target_low", targetLow)
profile.put("target_high", targetHigh)
profile.put("units", if (mgdl) Constants.MGDL else Constants.MMOL)
profile.put("timezone", TimeZone.getDefault().id)
}
val defaultUnits = JsonHelper.safeGetStringAllowNull(profile, "units", null)
return pureProfileFromJson(profile, dateUtil, defaultUnits)
}
@Synchronized @Synchronized
fun storeSettings(activity: FragmentActivity? = null) { fun storeSettings(activity: FragmentActivity? = null) {
for (i in 0 until numOfProfiles) { for (i in 0 until numOfProfiles) {

View file

@ -109,5 +109,6 @@ class VirtualPumpFragment : DaggerFragment() {
binding.type.text = pumpType?.description binding.type.text = pumpType?.description
binding.typeDef.text = pumpType?.getFullDescription(resourceHelper.gs(R.string.virtualpump_pump_def), pumpType.hasExtendedBasals(), resourceHelper) binding.typeDef.text = pumpType?.getFullDescription(resourceHelper.gs(R.string.virtualpump_pump_def), pumpType.hasExtendedBasals(), resourceHelper)
binding.serialNumber.text = virtualPumpPlugin.serialNumber()
} }
} }

View file

@ -267,7 +267,7 @@ class SWDefinition @Inject constructor(
.label(R.string.profileswitch_ismissing)) .label(R.string.profileswitch_ismissing))
.add(SWButton(injector) .add(SWButton(injector)
.text(R.string.doprofileswitch) .text(R.string.doprofileswitch)
.action { ProfileSwitchDialog().show(activity.supportFragmentManager, "SetupWizard") }) .action { ProfileSwitchDialog().show(activity.supportFragmentManager, "ProfileSwitchDialog") })
.validator { profileFunction.getProfile() != null } .validator { profileFunction.getProfile() != null }
.visibility { profileFunction.getProfile() == null } .visibility { profileFunction.getProfile() == null }
private val screenPump = SWScreen(injector, R.string.configbuilder_pump) private val screenPump = SWScreen(injector, R.string.configbuilder_pump)

View file

@ -127,7 +127,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
override fun updateButtons() { override fun updateButtons() {
runOnUiThread { runOnUiThread {
val currentScreen = screens[currentWizardPage] val currentScreen = screens[currentWizardPage]
if (currentScreen.validator == null || currentScreen.validator!!.isValid || currentScreen.skippable) { if (currentScreen.validator == null || currentScreen.validator?.isValid == true || currentScreen.skippable) {
if (currentWizardPage == nextPage(null)) { if (currentWizardPage == nextPage(null)) {
findViewById<View>(R.id.finish_button).visibility = View.VISIBLE findViewById<View>(R.id.finish_button).visibility = View.VISIBLE
findViewById<View>(R.id.next_button).visibility = View.GONE findViewById<View>(R.id.next_button).visibility = View.GONE
@ -184,7 +184,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
private fun nextPage(view: View?): Int { private fun nextPage(view: View?): Int {
var page = currentWizardPage + 1 var page = currentWizardPage + 1
while (page < screens.size) { while (page < screens.size) {
if (screens[page].visibility == null || screens[page].visibility!!.isValid) return page if (screens[page].visibility == null || screens[page].visibility?.isValid == true) return page
page++ page++
} }
return min(currentWizardPage, screens.size - 1) return min(currentWizardPage, screens.size - 1)
@ -194,7 +194,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
private fun previousPage(view: View?): Int { private fun previousPage(view: View?): Int {
var page = currentWizardPage - 1 var page = currentWizardPage - 1
while (page >= 0) { while (page >= 0) {
if (screens[page].visibility == null || screens[page].visibility!!.isValid) return page if (screens[page].visibility == null || screens[page].visibility?.isValid == true) return page
page-- page--
} }
return max(currentWizardPage, 0) return max(currentWizardPage, 0)

View file

@ -5,11 +5,13 @@ import android.text.Editable
import android.text.InputType import android.text.InputType
import android.text.TextWatcher import android.text.TextWatcher
import android.view.View import android.view.View
import android.widget.Button
import android.widget.EditText import android.widget.EditText
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.R import info.nightscout.androidaps.R
import info.nightscout.androidaps.extensions.toVisibility
import info.nightscout.androidaps.setupwizard.SWTextValidator import info.nightscout.androidaps.setupwizard.SWTextValidator
import info.nightscout.androidaps.utils.CryptoUtil import info.nightscout.androidaps.utils.CryptoUtil
@ -17,36 +19,71 @@ class SWEditEncryptedPassword(injector: HasAndroidInjector, private val cryptoUt
private var validator: SWTextValidator = SWTextValidator(String::isNotEmpty) private var validator: SWTextValidator = SWTextValidator(String::isNotEmpty)
private var updateDelay = 0L private var updateDelay = 0L
private var button: Button? = null
private var editText: EditText? = null
private var editText2: EditText? = null
private var l: TextView? = null
private var c: TextView? = null
private var c2: TextView? = null
override fun generateDialog(layout: LinearLayout) { override fun generateDialog(layout: LinearLayout) {
val context = layout.context val context = layout.context
val l = TextView(context) val isPasswordSet = sp.contains(R.string.key_master_password) && sp.getString(R.string.key_master_password, "") != ""
l.id = View.generateViewId()
label?.let { l.setText(it) } button = Button(context)
l.setTypeface(l.typeface, Typeface.BOLD) button?.setText(R.string.unlock_settings)
layout.addView(l) button?.setOnClickListener {
val c = TextView(context) scanForActivity(context)?.let { activity ->
c.id = View.generateViewId() passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, {
comment?.let { c.setText(it) } button?.visibility = View.GONE
c.setTypeface(c.typeface, Typeface.ITALIC) editText?.visibility = View.VISIBLE
layout.addView(c) editText2?.visibility = View.VISIBLE
val editText = EditText(context) l?.visibility = View.VISIBLE
editText.id = View.generateViewId() c?.visibility = View.VISIBLE
editText.inputType = InputType.TYPE_CLASS_TEXT c2?.visibility = View.VISIBLE
editText.maxLines = 1 })
editText.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD }
}
button?.visibility = isPasswordSet.toVisibility()
layout.addView(button)
label?.let {
l = TextView(context)
l?.id = View.generateViewId()
l?.setText(it)
l?.setTypeface(l?.typeface, Typeface.BOLD)
layout.addView(l)
}
comment?.let {
c = TextView(context)
c?.id = View.generateViewId()
c?.setText(it)
c?.setTypeface(c?.typeface, Typeface.ITALIC)
c?.visibility = isPasswordSet.not().toVisibility()
layout.addView(c)
}
editText = EditText(context)
editText?.id = View.generateViewId()
editText?.inputType = InputType.TYPE_CLASS_TEXT
editText?.maxLines = 1
editText?.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
editText?.visibility = isPasswordSet.not().toVisibility()
layout.addView(editText) layout.addView(editText)
val c2 = TextView(context) c2 = TextView(context)
c2.id = View.generateViewId() c2?.id = View.generateViewId()
c2.setText(R.string.confirm) c2?.setText(R.string.confirm)
c2?.visibility = isPasswordSet.not().toVisibility()
layout.addView(c2) layout.addView(c2)
val editText2 = EditText(context) editText2 = EditText(context)
editText2.id = View.generateViewId() editText2?.id = View.generateViewId()
editText2.inputType = InputType.TYPE_CLASS_TEXT editText2?.inputType = InputType.TYPE_CLASS_TEXT
editText2.maxLines = 1 editText2?.maxLines = 1
editText2.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD editText2?.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
editText2?.visibility = isPasswordSet.not().toVisibility()
layout.addView(editText2) layout.addView(editText2)
super.generateDialog(layout) super.generateDialog(layout)
@ -55,14 +92,14 @@ class SWEditEncryptedPassword(injector: HasAndroidInjector, private val cryptoUt
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
sp.remove(preferenceId) sp.remove(preferenceId)
scheduleChange(updateDelay) scheduleChange(updateDelay)
if (validator.isValid(editText.text.toString()) && validator.isValid(editText2.text.toString()) && editText.text.toString() == editText2.text.toString()) if (validator.isValid(editText?.text.toString()) && validator.isValid(editText2?.text.toString()) && editText?.text.toString() == editText2?.text.toString())
save(s.toString(), updateDelay) save(s.toString(), updateDelay)
} }
override fun afterTextChanged(s: Editable) {} override fun afterTextChanged(s: Editable) {}
} }
editText.addTextChangedListener(watcher) editText?.addTextChangedListener(watcher)
editText2.addTextChangedListener(watcher) editText2?.addTextChangedListener(watcher)
} }
fun preferenceId(preferenceId: Int): SWEditEncryptedPassword { fun preferenceId(preferenceId: Int): SWEditEncryptedPassword {

View file

@ -1,14 +1,18 @@
package info.nightscout.androidaps.setupwizard.elements package info.nightscout.androidaps.setupwizard.elements
import android.content.Context
import android.content.ContextWrapper
import android.view.View import android.view.View
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import dagger.android.HasAndroidInjector import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.events.EventPreferenceChange import info.nightscout.androidaps.events.EventPreferenceChange
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate import info.nightscout.androidaps.setupwizard.events.EventSWUpdate
import info.nightscout.androidaps.utils.protection.PasswordCheck
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
import java.util.concurrent.Executors import java.util.concurrent.Executors
@ -22,6 +26,7 @@ open class SWItem(val injector: HasAndroidInjector, var type: Type) {
@Inject lateinit var rxBus: RxBusWrapper @Inject lateinit var rxBus: RxBusWrapper
@Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var sp: SP @Inject lateinit var sp: SP
@Inject lateinit var passwordCheck: PasswordCheck
private val eventWorker = Executors.newSingleThreadScheduledExecutor() private val eventWorker = Executors.newSingleThreadScheduledExecutor()
private var scheduledEventPost: ScheduledFuture<*>? = null private var scheduledEventPost: ScheduledFuture<*>? = null
@ -33,6 +38,7 @@ open class SWItem(val injector: HasAndroidInjector, var type: Type) {
@Suppress("unused") @Suppress("unused")
enum class Type { enum class Type {
NONE, TEXT, HTML_LINK, BREAK, LISTENER, URL, STRING, NUMBER, DECIMAL_NUMBER, RADIOBUTTON, PLUGIN, BUTTON, FRAGMENT, UNIT_NUMBER, PREFERENCE NONE, TEXT, HTML_LINK, BREAK, LISTENER, URL, STRING, NUMBER, DECIMAL_NUMBER, RADIOBUTTON, PLUGIN, BUTTON, FRAGMENT, UNIT_NUMBER, PREFERENCE
} }
@ -79,4 +85,13 @@ open class SWItem(val injector: HasAndroidInjector, var type: Type) {
val task: Runnable = PostRunnable() val task: Runnable = PostRunnable()
scheduledEventPost = eventWorker.schedule(task, updateDelay, TimeUnit.SECONDS) scheduledEventPost = eventWorker.schedule(task, updateDelay, TimeUnit.SECONDS)
} }
fun scanForActivity(cont: Context?): AppCompatActivity? {
return when (cont) {
null -> null
is AppCompatActivity -> cont
is ContextWrapper -> scanForActivity(cont.baseContext)
else -> null
}
}
} }

View file

@ -133,7 +133,6 @@ class BolusWizard @Inject constructor(
private var carbTime: Int = 0 private var carbTime: Int = 0
private var quickWizard: Boolean = true private var quickWizard: Boolean = true
@JvmOverloads
fun doCalc(profile: Profile, fun doCalc(profile: Profile,
profileName: String, profileName: String,
tempTarget: TemporaryTarget?, tempTarget: TemporaryTarget?,

View file

@ -84,11 +84,9 @@ class QuickWizardEntry @Inject constructor(private val injector: HasAndroidInjec
bg = lastBG.valueToUnits(profileFunction.getUnits()) bg = lastBG.valueToUnits(profileFunction.getUnits())
} }
// COB // COB
var cob = 0.0 val cob =
if (useCOB() == YES) { if (useCOB() == YES) iobCobCalculator.getCobInfo(_synchronized, "QuickWizard COB").displayCob ?: 0.0
val cobInfo = iobCobCalculator.getCobInfo(_synchronized, "QuickWizard COB") else 0.0
if (cobInfo.displayCob != null) cob = cobInfo.displayCob!!
}
// Bolus IOB // Bolus IOB
var bolusIOB = false var bolusIOB = false
if (useBolusIOB() == YES) { if (useBolusIOB() == YES) {
@ -121,7 +119,7 @@ class QuickWizardEntry @Inject constructor(private val injector: HasAndroidInjec
trend = true trend = true
} }
val percentage = sp.getInt(R.string.key_boluswizard_percentage, 100) val percentage = sp.getInt(R.string.key_boluswizard_percentage, 100)
return BolusWizard(injector).doCalc(profile, profileName, tempTarget, carbs(), cob, bg, 0.0, percentage, true, useCOB() == YES, bolusIOB, basalIOB, superBolus, useTempTarget() == YES, trend, false, buttonText(), quickWizard = true) //tbc, ok if only quickwizard, but if other sources elsewhere use Sources.QuickWiard return BolusWizard(injector).doCalc(profile, profileName, tempTarget, carbs(), cob, bg, 0.0, percentage, true, useCOB() == YES, bolusIOB, basalIOB, superBolus, useTempTarget() == YES, trend, false, buttonText(), quickWizard = true) //tbc, ok if only quickwizard, but if other sources elsewhere use Sources.QuickWizard
} }
fun buttonText(): String = safeGetString(storage, "buttonText", "") fun buttonText(): String = safeGetString(storage, "buttonText", "")

View file

@ -234,6 +234,51 @@
</LinearLayout> </LinearLayout>
<!-- Pump Serial -->
<View
android:layout_width="fill_parent"
android:layout_height="2dip"
android:layout_marginBottom="5dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="5dp"
android:background="@color/list_delimiter" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:paddingRight="5dp"
android:text="@string/serialnumber"
android:textSize="14sp" />
<TextView
android:layout_width="5dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:gravity="center_horizontal"
android:paddingEnd="2dp"
android:paddingStart="2dp"
android:text=":"
android:textSize="14sp" />
<TextView
android:id="@+id/serial_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:paddingLeft="5dp"
android:textSize="14sp" />
</LinearLayout>
<!-- Pump Type --> <!-- Pump Type -->
<View <View
android:layout_width="fill_parent" android:layout_width="fill_parent"
@ -279,7 +324,7 @@
</LinearLayout> </LinearLayout>
<!-- Pump Type --> <!-- Pump Definition -->
<View <View
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="2dip" android:layout_height="2dip"

View file

@ -29,7 +29,6 @@
<string name="objectives_maxiob_gate">Run for a few days, and at least one night with no low BG alarms, before dropping BG</string> <string name="objectives_maxiob_gate">Run for a few days, and at least one night with no low BG alarms, before dropping BG</string>
<string name="objectives_autosens_objective">Adjust basals and ratios if needed, and then enable auto-sens</string> <string name="objectives_autosens_objective">Adjust basals and ratios if needed, and then enable auto-sens</string>
<string name="objectives_autosens_gate">1 week successful daytime looping with regular carb entry</string> <string name="objectives_autosens_gate">1 week successful daytime looping with regular carb entry</string>
<string name="objectives_ama_objective">Enabling additional features for daytime use, such as advanced meal assist</string>
<string name="objectives_smb_objective">Enabling additional features for daytime use, such as SMB</string> <string name="objectives_smb_objective">Enabling additional features for daytime use, such as SMB</string>
<string name="objectives_auto_objective">Enabling automation</string> <string name="objectives_auto_objective">Enabling automation</string>
<string name="objectives_smb_gate">You must read the wiki and rise maxIOB to get SMBs working fine! A good start is maxIOB=average mealbolus + 3 x max daily basal</string> <string name="objectives_smb_gate">You must read the wiki and rise maxIOB to get SMBs working fine! A good start is maxIOB=average mealbolus + 3 x max daily basal</string>

View file

@ -198,16 +198,6 @@ class ConstraintsCheckerTest : TestBaseWithProfile() {
Assert.assertEquals(java.lang.Boolean.FALSE, c.value()) Assert.assertEquals(java.lang.Boolean.FALSE, c.value())
} }
// Objectives
@Test
fun isAMAModeEnabledTest() {
objectivesPlugin.objectives[ObjectivesPlugin.AMA_OBJECTIVE].startedOn = 0
val c = constraintChecker.isAMAModeEnabled()
Assert.assertEquals(true, c.reasonList.size == 1) // Objectives
Assert.assertEquals(true, c.mostLimitedReasonList.size == 1) // Objectives
Assert.assertEquals(java.lang.Boolean.FALSE, c.value())
}
// Safety // Safety
@Test @Test
fun isAdvancedFilteringEnabledTest() { fun isAdvancedFilteringEnabledTest() {

View file

@ -74,14 +74,6 @@ class ObjectivesPluginTest : TestBase() {
Assert.assertEquals(false, c.value()) Assert.assertEquals(false, c.value())
} }
@Test fun notStartedObjective9ShouldLimitAMAMode() {
objectivesPlugin.objectives[ObjectivesPlugin.AMA_OBJECTIVE].startedOn = 0
var c = Constraint(true)
c = objectivesPlugin.isAMAModeEnabled(c)
Assert.assertEquals(true, c.getReasons(aapsLogger).contains("Objective 9 not started"))
Assert.assertEquals(false, c.value())
}
@Test fun notStartedObjective10ShouldLimitSMBMode() { @Test fun notStartedObjective10ShouldLimitSMBMode() {
objectivesPlugin.objectives[ObjectivesPlugin.SMB_OBJECTIVE].startedOn = 0 objectivesPlugin.objectives[ObjectivesPlugin.SMB_OBJECTIVE].startedOn = 0
var c = Constraint(true) var c = Constraint(true)

View file

@ -98,7 +98,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
val bgList: MutableList<GlucoseValue> = ArrayList() val bgList: MutableList<GlucoseValue> = ArrayList()
bgList.add(reading) bgList.add(reading)
`when`(iobCobCalculator.getCobInfo(false, "SMS COB")).thenReturn(CobInfo(10.0, 2.0)) `when`(iobCobCalculator.getCobInfo(false, "SMS COB")).thenReturn(CobInfo(0, 10.0, 2.0))
`when`(iobCobCalculator.ads).thenReturn(autosensDataStore) `when`(iobCobCalculator.ads).thenReturn(autosensDataStore)
`when`(autosensDataStore.lastBg()).thenReturn(reading) `when`(autosensDataStore.lastBg()).thenReturn(reading)

View file

@ -72,7 +72,6 @@ class AutomationEvent(private val injector: HasAndroidInjector) {
readOnly = d.optBoolean("readOnly", false) readOnly = d.optBoolean("readOnly", false)
autoRemove = d.optBoolean("autoRemove", false) autoRemove = d.optBoolean("autoRemove", false)
trigger = TriggerDummy(injector).instantiate(JSONObject(d.getString("trigger"))) trigger = TriggerDummy(injector).instantiate(JSONObject(d.getString("trigger")))
?: TriggerConnector(injector)
val array = d.getJSONArray("actions") val array = d.getJSONArray("actions")
actions.clear() actions.clear()
for (i in 0 until array.length()) { for (i in 0 until array.length()) {

View file

@ -43,6 +43,7 @@ abstract class Trigger(val injector: HasAndroidInjector) {
@Inject lateinit var dateUtil: DateUtil @Inject lateinit var dateUtil: DateUtil
init { init {
@Suppress("LeakingThis")
injector.androidInjector().inject(this) injector.androidInjector().inject(this)
} }
@ -55,16 +56,12 @@ abstract class Trigger(val injector: HasAndroidInjector) {
abstract fun icon(): Optional<Int?> abstract fun icon(): Optional<Int?>
abstract fun duplicate(): Trigger abstract fun duplicate(): Trigger
companion object { private fun scanForActivity(cont: Context?): AppCompatActivity? {
return when (cont) {
@JvmStatic null -> null
fun scanForActivity(cont: Context?): AppCompatActivity? { is AppCompatActivity -> cont
return when (cont) { is ContextWrapper -> scanForActivity(cont.baseContext)
null -> null else -> null
is AppCompatActivity -> cont
is ContextWrapper -> scanForActivity(cont.baseContext)
else -> null
}
} }
} }
@ -80,26 +77,34 @@ abstract class Trigger(val injector: HasAndroidInjector) {
.put("data", dataJSON()) .put("data", dataJSON())
.toString() .toString()
fun instantiate(obj: JSONObject): Trigger? { fun instantiate(obj: JSONObject): Trigger {
val type = obj.getString("type") val type = obj.getString("type")
val data = obj.getJSONObject("data") val data = obj.getJSONObject("data")
//val clazz = Class.forName(type).kotlin //val clazz = Class.forName(type).kotlin
//return (clazz.primaryConstructor?.call(injector) as Trigger).fromJSON(data?.toString() ?: "") //return (clazz.primaryConstructor?.call(injector) as Trigger).fromJSON(data?.toString() ?: "")
return when (type) { return when (type) {
TriggerAutosensValue::class.java.name, // backward compatibility TriggerAutosensValue::class.java.name, // backward compatibility
TriggerAutosensValue::class.java.simpleName -> TriggerAutosensValue(injector).fromJSON(data.toString()) TriggerAutosensValue::class.java.simpleName -> TriggerAutosensValue(injector).fromJSON(
data.toString()
)
TriggerBg::class.java.name, TriggerBg::class.java.name,
TriggerBg::class.java.simpleName -> TriggerBg(injector).fromJSON(data.toString()) TriggerBg::class.java.simpleName -> TriggerBg(injector).fromJSON(data.toString())
TriggerBolusAgo::class.java.name, TriggerBolusAgo::class.java.name,
TriggerBolusAgo::class.java.simpleName -> TriggerBolusAgo(injector).fromJSON(data.toString()) TriggerBolusAgo::class.java.simpleName -> TriggerBolusAgo(injector).fromJSON(
data.toString()
)
TriggerBTDevice::class.java.name, TriggerBTDevice::class.java.name,
TriggerBTDevice::class.java.simpleName -> TriggerBTDevice(injector).fromJSON(data.toString()) TriggerBTDevice::class.java.simpleName -> TriggerBTDevice(injector).fromJSON(
data.toString()
)
TriggerIob::class.java.name, TriggerIob::class.java.name,
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString()) TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString())
TriggerCOB::class.java.name, TriggerCOB::class.java.name,
TriggerCOB::class.java.simpleName -> TriggerCOB(injector).fromJSON(data.toString()) TriggerCOB::class.java.simpleName -> TriggerCOB(injector).fromJSON(data.toString())
TriggerConnector::class.java.name, TriggerConnector::class.java.name,
TriggerConnector::class.java.simpleName -> TriggerConnector(injector).fromJSON(data.toString()) TriggerConnector::class.java.simpleName -> TriggerConnector(injector).fromJSON(
data.toString()
)
TriggerDelta::class.java.name, TriggerDelta::class.java.name,
TriggerDelta::class.java.simpleName -> TriggerDelta(injector).fromJSON(data.toString()) TriggerDelta::class.java.simpleName -> TriggerDelta(injector).fromJSON(data.toString())
TriggerDummy::class.java.name, TriggerDummy::class.java.name,
@ -107,21 +112,35 @@ abstract class Trigger(val injector: HasAndroidInjector) {
TriggerIob::class.java.name, TriggerIob::class.java.name,
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString()) TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString())
TriggerLocation::class.java.name, TriggerLocation::class.java.name,
TriggerLocation::class.java.simpleName -> TriggerLocation(injector).fromJSON(data.toString()) TriggerLocation::class.java.simpleName -> TriggerLocation(injector).fromJSON(
data.toString()
)
TriggerProfilePercent::class.java.name, TriggerProfilePercent::class.java.name,
TriggerProfilePercent::class.java.simpleName -> TriggerProfilePercent(injector).fromJSON(data.toString()) TriggerProfilePercent::class.java.simpleName -> TriggerProfilePercent(injector).fromJSON(
data.toString()
)
TriggerPumpLastConnection::class.java.name, TriggerPumpLastConnection::class.java.name,
TriggerPumpLastConnection::class.java.simpleName -> TriggerPumpLastConnection(injector).fromJSON(data.toString()) TriggerPumpLastConnection::class.java.simpleName -> TriggerPumpLastConnection(injector).fromJSON(
data.toString()
)
TriggerRecurringTime::class.java.name, TriggerRecurringTime::class.java.name,
TriggerRecurringTime::class.java.simpleName -> TriggerRecurringTime(injector).fromJSON(data.toString()) TriggerRecurringTime::class.java.simpleName -> TriggerRecurringTime(injector).fromJSON(
data.toString()
)
TriggerTempTarget::class.java.name, TriggerTempTarget::class.java.name,
TriggerTempTarget::class.java.simpleName -> TriggerTempTarget(injector).fromJSON(data.toString()) TriggerTempTarget::class.java.simpleName -> TriggerTempTarget(injector).fromJSON(
data.toString()
)
TriggerTime::class.java.name, TriggerTime::class.java.name,
TriggerTime::class.java.simpleName -> TriggerTime(injector).fromJSON(data.toString()) TriggerTime::class.java.simpleName -> TriggerTime(injector).fromJSON(data.toString())
TriggerTimeRange::class.java.name, TriggerTimeRange::class.java.name,
TriggerTimeRange::class.java.simpleName -> TriggerTimeRange(injector).fromJSON(data.toString()) TriggerTimeRange::class.java.simpleName -> TriggerTimeRange(injector).fromJSON(
data.toString()
)
TriggerWifiSsid::class.java.name, TriggerWifiSsid::class.java.name,
TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(data.toString()) TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(
data.toString()
)
else -> throw ClassNotFoundException(type) else -> throw ClassNotFoundException(type)
} }
} }

View file

@ -95,7 +95,7 @@ class TriggerConnector(injector: HasAndroidInjector) : Trigger(injector) {
val array = d.getJSONArray("triggerList") val array = d.getJSONArray("triggerList")
list.clear() list.clear()
for (i in 0 until array.length()) { for (i in 0 until array.length()) {
instantiate(JSONObject(array.getString(i)))?.let { instantiate(JSONObject(array.getString(i))).let {
list.add(it) list.add(it)
} }
} }

View file

@ -28,7 +28,7 @@ class TriggerCOBTest : TriggerTestBase() {
@Test fun shouldRunTest() { @Test fun shouldRunTest() {
// COB value is 6 // COB value is 6
PowerMockito.`when`(iobCobCalculator.getCobInfo(false, "AutomationTriggerCOB")).thenReturn(CobInfo(6.0, 2.0)) PowerMockito.`when`(iobCobCalculator.getCobInfo(false, "AutomationTriggerCOB")).thenReturn(CobInfo(0, 6.0, 2.0))
var t: TriggerCOB = TriggerCOB(injector).setValue(1.0).comparator(Comparator.Compare.IS_EQUAL) var t: TriggerCOB = TriggerCOB(injector).setValue(1.0).comparator(Comparator.Compare.IS_EQUAL)
Assert.assertFalse(t.shouldRun()) Assert.assertFalse(t.shouldRun())
t = TriggerCOB(injector).setValue(6.0).comparator(Comparator.Compare.IS_EQUAL) t = TriggerCOB(injector).setValue(6.0).comparator(Comparator.Compare.IS_EQUAL)
@ -72,6 +72,6 @@ class TriggerCOBTest : TriggerTestBase() {
} }
fun generateCobInfo(): CobInfo { fun generateCobInfo(): CobInfo {
return CobInfo(6.0, 0.0) return CobInfo(0, 6.0, 0.0)
} }
} }

View file

@ -768,7 +768,7 @@ public class ComboPlugin extends PumpPluginBase implements Pump, Constraints {
pumpSync.syncTemporaryBasalWithPumpId( pumpSync.syncTemporaryBasalWithPumpId(
state.timestamp, state.timestamp,
state.tbrPercent, state.tbrPercent,
T.mins(state.tbrRemainingDuration).msecs(), T.Companion.mins(state.tbrRemainingDuration).msecs(),
false, false,
tbrType, tbrType,
// There are no IDs for TBRs on the pump and none is calculated (in contrast to boluses). // There are no IDs for TBRs on the pump and none is calculated (in contrast to boluses).
@ -974,7 +974,7 @@ public class ComboPlugin extends PumpPluginBase implements Pump, Constraints {
pumpSync.syncTemporaryBasalWithPumpId( pumpSync.syncTemporaryBasalWithPumpId(
now, now,
0.0, 0.0,
T.mins(15).msecs(), T.Companion.mins(15).msecs(),
false, false,
PumpSync.TemporaryBasalType.PUMP_SUSPEND, PumpSync.TemporaryBasalType.PUMP_SUSPEND,
// Combo doesn't have nor uses IDs for TBRs, see note in #setTempBasalPercent // Combo doesn't have nor uses IDs for TBRs, see note in #setTempBasalPercent
@ -1107,7 +1107,7 @@ public class ComboPlugin extends PumpPluginBase implements Pump, Constraints {
pumpSync.syncTemporaryBasalWithPumpId( pumpSync.syncTemporaryBasalWithPumpId(
now, now,
state.tbrPercent, state.tbrPercent,
T.mins(state.tbrRemainingDuration).msecs(), T.Companion.mins(state.tbrRemainingDuration).msecs(),
false, false,
PumpSync.TemporaryBasalType.NORMAL, PumpSync.TemporaryBasalType.NORMAL,
tbrId, tbrId,
@ -1140,7 +1140,7 @@ public class ComboPlugin extends PumpPluginBase implements Pump, Constraints {
pumpSync.syncTemporaryBasalWithPumpId( pumpSync.syncTemporaryBasalWithPumpId(
now, now,
state.tbrPercent, state.tbrPercent,
T.mins(state.tbrRemainingDuration).msecs(), T.Companion.mins(state.tbrRemainingDuration).msecs(),
false, false,
PumpSync.TemporaryBasalType.NORMAL, PumpSync.TemporaryBasalType.NORMAL,
tbrId, tbrId,

View file

@ -23,9 +23,6 @@ public class Constants {
public static final Integer notificationID = 556677; public static final Integer notificationID = 556677;
public static final int hoursToKeepInDatabase = 72;
public static final int daysToKeepHistoryInDatabase = 30;
// SMS COMMUNICATOR // SMS COMMUNICATOR
public static final long remoteBolusMinDistance = 15 * 60 * 1000L; public static final long remoteBolusMinDistance = 15 * 60 * 1000L;
@ -72,7 +69,7 @@ public class Constants {
public static final int MIN_WATCHDOG_INTERVAL_IN_SECONDS = 12 * 60; public static final int MIN_WATCHDOG_INTERVAL_IN_SECONDS = 12 * 60;
//SMS Communicator //SMS Communicator
public static final long SMS_CONFIRM_TIMEOUT = T.mins(5L).msecs(); public static final long SMS_CONFIRM_TIMEOUT = T.Companion.mins(5L).msecs();
//Storage [MB] //Storage [MB]
public static final long MINIMUM_FREE_SPACE = 200; public static final long MINIMUM_FREE_SPACE = 200;
@ -106,7 +103,7 @@ public class Constants {
/** /**
* How many old TOTP tokens still accept. * How many old TOTP tokens still accept.
* Each token is 30s valid, but copying and SMS transmision of it can take additional seconds, * Each token is 30s valid, but copying and SMS transmission of it can take additional seconds,
* so we add leeway to still accept given amount of older tokens * so we add leeway to still accept given amount of older tokens
*/ */
public static final int OTP_ACCEPT_OLD_TOKENS_COUNT = 1; public static final int OTP_ACCEPT_OLD_TOKENS_COUNT = 1;

View file

@ -20,8 +20,8 @@ class DetailedBolusInfo {
// Additional requesting parameters // Additional requesting parameters
@JvmField var timestamp = System.currentTimeMillis() @JvmField var timestamp = System.currentTimeMillis()
@JvmField var lastKnownBolusTime: Long = 0 // for SMB check var lastKnownBolusTime: Long = 0 // for SMB check
@JvmField var deliverAtTheLatest: Long = 0 // SMB should be delivered within 1 min from this time var deliverAtTheLatest: Long = 0 // SMB should be delivered within 1 min from this time
@Transient var context: Context? = null // context for progress dialog @Transient var context: Context? = null // context for progress dialog
// Prefilled info for storing to db // Prefilled info for storing to db

View file

@ -2,7 +2,7 @@ package info.nightscout.androidaps.data
import info.nightscout.androidaps.database.entities.GlucoseValue import info.nightscout.androidaps.database.entities.GlucoseValue
class InMemoryGlucoseValue @JvmOverloads constructor(var timestamp: Long = 0L, var value: Double = 0.0, var interpolated: Boolean = false) { class InMemoryGlucoseValue constructor(var timestamp: Long = 0L, var value: Double = 0.0, var interpolated: Boolean = false) {
constructor(gv: GlucoseValue) : this(gv.timestamp, gv.value) constructor(gv: GlucoseValue) : this(gv.timestamp, gv.value)
// var generated : value doesn't correspond to real value with timestamp close to real BG // var generated : value doesn't correspond to real value with timestamp close to real BG

View file

@ -40,11 +40,7 @@ class BolusProgressDialog : DaggerDialogFragment() {
private val disposable = CompositeDisposable() private val disposable = CompositeDisposable()
companion object { companion object {
@JvmField
var bolusEnded = false var bolusEnded = false
@JvmField
var stopPressed = false var stopPressed = false
} }

View file

@ -17,7 +17,6 @@ interface Constraints {
fun isClosedLoopAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value fun isClosedLoopAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isLgsAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value fun isLgsAllowed(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isAutosensModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value fun isAutosensModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isAMAModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isUAMEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value fun isUAMEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value
fun isAdvancedFilteringEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value fun isAdvancedFilteringEnabled(value: Constraint<Boolean>): Constraint<Boolean> = value

View file

@ -24,9 +24,6 @@ class ConstraintChecker @Inject constructor(private val activePlugin: ActivePlug
fun isAutosensModeEnabled(): Constraint<Boolean> = fun isAutosensModeEnabled(): Constraint<Boolean> =
isAutosensModeEnabled(Constraint(true)) isAutosensModeEnabled(Constraint(true))
fun isAMAModeEnabled(): Constraint<Boolean> =
isAMAModeEnabled(Constraint(true))
fun isSMBModeEnabled(): Constraint<Boolean> = fun isSMBModeEnabled(): Constraint<Boolean> =
isSMBModeEnabled(Constraint(true)) isSMBModeEnabled(Constraint(true))
@ -100,16 +97,6 @@ class ConstraintChecker @Inject constructor(private val activePlugin: ActivePlug
return value return value
} }
override fun isAMAModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> {
val constraintsPlugins = activePlugin.getSpecificPluginsListByInterface(Constraints::class.java)
for (p in constraintsPlugins) {
val constrain = p as Constraints
if (!p.isEnabled(PluginType.CONSTRAINTS)) continue
constrain.isAMAModeEnabled(value)
}
return value
}
override fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> { override fun isSMBModeEnabled(value: Constraint<Boolean>): Constraint<Boolean> {
val constraintsPlugins = activePlugin.getSpecificPluginsListByInterface(Constraints::class.java) val constraintsPlugins = activePlugin.getSpecificPluginsListByInterface(Constraints::class.java)
for (p in constraintsPlugins) { for (p in constraintsPlugins) {

View file

@ -1,9 +1,12 @@
package info.nightscout.androidaps.plugins.iob.iobCobCalculator package info.nightscout.androidaps.plugins.iob.iobCobCalculator
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DecimalFormatter import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.resources.ResourceHelper
/** All COB up to now, including carbs not yet processed by IobCob calculation. */ /** All COB up to now, including carbs not yet processed by IobCob calculation. */
class CobInfo(val displayCob: Double?, val futureCarbs: Double) { class CobInfo(val timestamp: Long, val displayCob: Double?, val futureCarbs: Double) {
fun generateCOBString(): String { fun generateCOBString(): String {
var cobStringResult = "--g" var cobStringResult = "--g"
@ -15,4 +18,13 @@ class CobInfo(val displayCob: Double?, val futureCarbs: Double) {
} }
return cobStringResult return cobStringResult
} }
fun displayText(resourceHelper: ResourceHelper, dateUtil: DateUtil, isDev: Boolean): String? =
if (displayCob != null) {
var cobText = resourceHelper.gs(R.string.format_carbs, displayCob.toInt())
if (futureCarbs > 0) cobText += "(" + DecimalFormatter.to0Decimal(futureCarbs) + ")"
// This is only temporary for debugging
if (isDev) cobText += "\n" + dateUtil.timeStringWithSeconds(timestamp)
cobText
} else null
} }

View file

@ -58,10 +58,9 @@ class DateUtil @Inject constructor(private val context: Context) {
* @param tz - tz to set to, if not specified uses local timezone * @param tz - tz to set to, if not specified uses local timezone
* @return the iso-formatted date string * @return the iso-formatted date string
*/ */
@JvmOverloads fun toISOString(date: Long): String {
fun toISOString(date: Long, format: String = FORMAT_DATE_ISO_OUT, tz: TimeZone = TimeZone.getTimeZone("UTC")): String { val f: DateFormat = SimpleDateFormat(FORMAT_DATE_ISO_OUT, Locale.getDefault())
val f: DateFormat = SimpleDateFormat(format, Locale.getDefault()) f.timeZone = TimeZone.getTimeZone("UTC")
f.timeZone = tz
return f.format(date) return f.format(date)
} }
@ -119,7 +118,7 @@ class DateUtil @Inject constructor(private val context: Context) {
return DateTime(mills).toString(DateTimeFormat.forPattern(format)) return DateTime(mills).toString(DateTimeFormat.forPattern(format))
} }
private fun timeStringWithSeconds(mills: Long): String { fun timeStringWithSeconds(mills: Long): String {
var format = "hh:mm:ssa" var format = "hh:mm:ssa"
if (android.text.format.DateFormat.is24HourFormat(context)) { if (android.text.format.DateFormat.is24HourFormat(context)) {
format = "HH:mm:ss" format = "HH:mm:ss"

View file

@ -27,7 +27,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
fun safeGetString(json: JSONObject?, fieldName: String): String? { fun safeGetString(json: JSONObject?, fieldName: String): String? {
var result: String? = null var result: String? = null
if (json != null && json.has(fieldName)) { if (json != null && json.has(fieldName)) {
@ -39,7 +38,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
fun safeGetString(json: JSONObject?, fieldName: String, defaultValue: String): String { fun safeGetString(json: JSONObject?, fieldName: String, defaultValue: String): String {
var result = defaultValue var result = defaultValue
if (json != null && json.has(fieldName)) { if (json != null && json.has(fieldName)) {
@ -51,7 +49,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
fun safeGetStringAllowNull(json: JSONObject?, fieldName: String, defaultValue: String?): String? { fun safeGetStringAllowNull(json: JSONObject?, fieldName: String, defaultValue: String?): String? {
var result = defaultValue var result = defaultValue
if (json != null && json.has(fieldName)) { if (json != null && json.has(fieldName)) {
@ -63,7 +60,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
fun safeGetDouble(json: JSONObject?, fieldName: String): Double { fun safeGetDouble(json: JSONObject?, fieldName: String): Double {
var result = 0.0 var result = 0.0
if (json != null && json.has(fieldName)) { if (json != null && json.has(fieldName)) {
@ -97,7 +93,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
fun safeGetInt(json: JSONObject?, fieldName: String): Int = fun safeGetInt(json: JSONObject?, fieldName: String): Int =
safeGetInt(json, fieldName, 0) safeGetInt(json, fieldName, 0)
@ -123,7 +118,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
fun safeGetLong(json: JSONObject?, fieldName: String): Long { fun safeGetLong(json: JSONObject?, fieldName: String): Long {
var result: Long = 0 var result: Long = 0
if (json != null && json.has(fieldName)) { if (json != null && json.has(fieldName)) {
@ -146,8 +140,6 @@ object JsonHelper {
return result return result
} }
@JvmStatic
@JvmOverloads
fun safeGetBoolean(json: JSONObject?, fieldName: String, defaultValue: Boolean = false): Boolean { fun safeGetBoolean(json: JSONObject?, fieldName: String, defaultValue: Boolean = false): Boolean {
var result = defaultValue var result = defaultValue
if (json != null && json.has(fieldName)) { if (json != null && json.has(fieldName)) {

View file

@ -14,12 +14,12 @@ class T(val time: Long = 0L) {
companion object { companion object {
@JvmStatic fun now(): T = T(System.currentTimeMillis()) fun now(): T = T(System.currentTimeMillis())
@JvmStatic fun msecs(msec: Long): T = T(msec) fun msecs(msec: Long): T = T(msec)
@JvmStatic fun secs(sec: Long): T = T(sec * 1000L) fun secs(sec: Long): T = T(sec * 1000L)
@JvmStatic fun mins(min: Long): T = T(min * 60 * 1000L) fun mins(min: Long): T = T(min * 60 * 1000L)
@JvmStatic fun hours(hour: Long): T = T(hour * 60 * 60 * 1000L) fun hours(hour: Long): T = T(hour * 60 * 60 * 1000L)
@JvmStatic fun days(day: Long): T = T(day * 24 * 60 * 60 * 1000L) fun days(day: Long): T = T(day * 24 * 60 * 60 * 1000L)
@JvmStatic fun months(month: Long): T = T(month * 31 * 24 * 60 * 60 * 1000L) fun months(month: Long): T = T(month * 31 * 24 * 60 * 60 * 1000L)
} }
} }

View file

@ -55,12 +55,10 @@ object OKDialog {
.setCanceledOnTouchOutside(false) .setCanceledOnTouchOutside(false)
} }
@JvmStatic
fun showConfirmation(activity: FragmentActivity, message: String, ok: Runnable?) { fun showConfirmation(activity: FragmentActivity, message: String, ok: Runnable?) {
showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null) showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null)
} }
@JvmStatic
fun showConfirmation(activity: FragmentActivity, message: Spanned, ok: Runnable?) { fun showConfirmation(activity: FragmentActivity, message: Spanned, ok: Runnable?) {
showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null) showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null)
} }
@ -153,15 +151,11 @@ object OKDialog {
.setCanceledOnTouchOutside(false) .setCanceledOnTouchOutside(false)
} }
@JvmStatic
@JvmOverloads
fun showConfirmation(context: Context, message: String, ok: Runnable?, cancel: Runnable? = null) { fun showConfirmation(context: Context, message: String, ok: Runnable?, cancel: Runnable? = null) {
showConfirmation(context, context.getString(R.string.confirmation), message, ok, cancel) showConfirmation(context, context.getString(R.string.confirmation), message, ok, cancel)
} }
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
@JvmStatic
@JvmOverloads
fun showConfirmation(context: Context, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) { fun showConfirmation(context: Context, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) {
var okClicked = false var okClicked = false
AlertDialogHelper.Builder(context) AlertDialogHelper.Builder(context)
@ -190,8 +184,6 @@ object OKDialog {
} }
@SuppressLint("InflateParams") @SuppressLint("InflateParams")
@JvmStatic
@JvmOverloads
fun showConfirmation(context: Context, title: String, message: String, ok: DialogInterface.OnClickListener?, cancel: DialogInterface.OnClickListener? = null) { fun showConfirmation(context: Context, title: String, message: String, ok: DialogInterface.OnClickListener?, cancel: DialogInterface.OnClickListener? = null) {
var okClicked = false var okClicked = false
AlertDialogHelper.Builder(context) AlertDialogHelper.Builder(context)

View file

@ -8,10 +8,13 @@ import android.widget.EditText
import android.widget.TextView import android.widget.TextView
import androidx.annotation.StringRes import androidx.annotation.StringRes
import info.nightscout.androidaps.core.R import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.interfaces.ActivePlugin
import info.nightscout.androidaps.plugins.general.maintenance.PrefFileListProvider
import info.nightscout.androidaps.utils.CryptoUtil import info.nightscout.androidaps.utils.CryptoUtil
import info.nightscout.androidaps.utils.ToastUtils import info.nightscout.androidaps.utils.ToastUtils
import info.nightscout.androidaps.utils.alertDialogs.AlertDialogHelper import info.nightscout.androidaps.utils.alertDialogs.AlertDialogHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.sharedPreferences.SP
import java.io.File
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -20,8 +23,10 @@ const val AUTOFILL_HINT_NEW_PASSWORD = "newPassword"
@Singleton @Singleton
class PasswordCheck @Inject constructor( class PasswordCheck @Inject constructor(
val sp: SP, private val sp: SP,
private val cryptoUtil: CryptoUtil private val cryptoUtil: CryptoUtil,
private val fileListProvider: PrefFileListProvider,
private val activePlugin: ActivePlugin
) { ) {
/** /**
@ -159,4 +164,18 @@ class PasswordCheck @Inject constructor(
alertDialogBuilder.create().show() alertDialogBuilder.create().show()
} }
/**
* Check for existing PasswordReset file and
* reset password to SN of active pump if file exists
*/
fun passwordResetCheck(context: Context) {
val passwordReset = File(fileListProvider.ensureExtraDirExists(), "PasswordReset")
if (passwordReset.exists()) {
val sn = activePlugin.activePump.serialNumber()
sp.putString(R.string.key_master_password, cryptoUtil.hashPassword(sn))
passwordReset.delete()
ToastUtils.okToast(context, context.getString(R.string.password_set))
}
}
} }

View file

@ -49,7 +49,6 @@ class ProtectionCheck @Inject constructor(
} }
} }
@JvmOverloads
fun queryProtection(activity: FragmentActivity, protection: Protection, fun queryProtection(activity: FragmentActivity, protection: Protection,
ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) { ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) {
when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) { when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) {

View file

@ -144,7 +144,6 @@
<string name="extended_bolus">Extended bolus</string> <string name="extended_bolus">Extended bolus</string>
<string name="pump_time_updated">Pump time updated</string> <string name="pump_time_updated">Pump time updated</string>
<string name="exit">Exit</string> <string name="exit">Exit</string>
<string name="serial_number">Serial number</string>
<string name="removerecord">Remove record</string> <string name="removerecord">Remove record</string>
<string name="loopisdisabled">Loop is disabled</string> <string name="loopisdisabled">Loop is disabled</string>
<string name="alarm">Alarm</string> <string name="alarm">Alarm</string>

View file

@ -184,7 +184,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
if (Math.abs(timeDiff) > 10) { if (Math.abs(timeDiff) > 10) {
waitForWholeMinute(); // Dana can set only whole minute waitForWholeMinute(); // Dana can set only whole minute
// add 10sec to be sure we are over minute (will be cut off anyway) // add 10sec to be sure we are over minute (will be cut off anyway)
mSerialIOThread.sendMessage(new MsgSetTime(injector, dateUtil.now() + T.secs(10).msecs())); mSerialIOThread.sendMessage(new MsgSetTime(injector, dateUtil.now() + T.Companion.secs(10).msecs()));
mSerialIOThread.sendMessage(new MsgSettingPumpTime(injector)); mSerialIOThread.sendMessage(new MsgSettingPumpTime(injector));
timeDiff = (danaPump.getPumpTime() - System.currentTimeMillis()) / 1000L; timeDiff = (danaPump.getPumpTime() - System.currentTimeMillis()) / 1000L;
aapsLogger.debug(LTag.PUMP, "Pump time difference: " + timeDiff + " seconds"); aapsLogger.debug(LTag.PUMP, "Pump time difference: " + timeDiff + " seconds");
@ -258,7 +258,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
public boolean bolus(double amount, int carbs, long carbTimeStamp, final EventOverviewBolusProgress.Treatment t) { public boolean bolus(double amount, int carbs, long carbTimeStamp, final EventOverviewBolusProgress.Treatment t) {
if (!isConnected()) return false; if (!isConnected()) return false;
if (BolusProgressDialog.stopPressed) return false; if (BolusProgressDialog.Companion.getStopPressed()) return false;
danaPump.setBolusingTreatment(t); danaPump.setBolusingTreatment(t);
danaPump.setBolusDone(false); danaPump.setBolusDone(false);

View file

@ -181,7 +181,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
double carbs = detailedBolusInfo.carbs; double carbs = detailedBolusInfo.carbs;
detailedBolusInfo.carbs = 0; detailedBolusInfo.carbs = 0;
long carbTimeStamp = detailedBolusInfo.getCarbsTimestamp() != null ? detailedBolusInfo.getCarbsTimestamp() : detailedBolusInfo.timestamp; long carbTimeStamp = detailedBolusInfo.getCarbsTimestamp() != null ? detailedBolusInfo.getCarbsTimestamp() : detailedBolusInfo.timestamp;
if (carbTimeStamp == detailedBolusInfo.timestamp) carbTimeStamp -= T.mins(1).msecs(); // better set 1 min back to prevents clash with insulin if (carbTimeStamp == detailedBolusInfo.timestamp) carbTimeStamp -= T.Companion.mins(1).msecs(); // better set 1 min back to prevents clash with insulin
detailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history detailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
@ -259,7 +259,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
} }
} }
} }
temporaryBasalStorage.add(new PumpSync.PumpState.TemporaryBasal(dateUtil.now(), T.mins(durationInMinutes).msecs(), percentRate, false, tbrType, 0L, 0L)); temporaryBasalStorage.add(new PumpSync.PumpState.TemporaryBasal(dateUtil.now(), T.Companion.mins(durationInMinutes).msecs(), percentRate, false, tbrType, 0L, 0L));
// Convert duration from minutes to hours // Convert duration from minutes to hours
aapsLogger.debug(LTag.PUMP, "setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " minutes (doLowTemp || doHighTemp)"); aapsLogger.debug(LTag.PUMP, "setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " minutes (doLowTemp || doHighTemp)");
if (percentRate == 0 && durationInMinutes > 30) { if (percentRate == 0 && durationInMinutes > 30) {
@ -298,7 +298,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
aapsLogger.debug(LTag.PUMP, "setTempBasalPercent: Correct value already set"); aapsLogger.debug(LTag.PUMP, "setTempBasalPercent: Correct value already set");
return result; return result;
} }
temporaryBasalStorage.add(new PumpSync.PumpState.TemporaryBasal(dateUtil.now(), T.mins(durationInMinutes).msecs(), percent, false, tbrType, 0L, 0L)); temporaryBasalStorage.add(new PumpSync.PumpState.TemporaryBasal(dateUtil.now(), T.Companion.mins(durationInMinutes).msecs(), percent, false, tbrType, 0L, 0L));
boolean connectionOK; boolean connectionOK;
if (durationInMinutes == 15 || durationInMinutes == 30) { if (durationInMinutes == 15 || durationInMinutes == 30) {
connectionOK = sExecutionService.tempBasalShortDuration(percent, durationInMinutes); connectionOK = sExecutionService.tempBasalShortDuration(percent, durationInMinutes);

View file

@ -203,7 +203,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
} else { } else {
waitForWholeMinute(); // Dana can set only whole minute waitForWholeMinute(); // Dana can set only whole minute
// add 10sec to be sure we are over minute (will be cutted off anyway) // add 10sec to be sure we are over minute (will be cutted off anyway)
mSerialIOThread.sendMessage(new MsgSetTime(injector, dateUtil.now() + T.secs(10).msecs())); mSerialIOThread.sendMessage(new MsgSetTime(injector, dateUtil.now() + T.Companion.secs(10).msecs()));
mSerialIOThread.sendMessage(new MsgSettingPumpTime(injector)); mSerialIOThread.sendMessage(new MsgSettingPumpTime(injector));
timeDiff = (danaPump.getPumpTime() - System.currentTimeMillis()) / 1000L; timeDiff = (danaPump.getPumpTime() - System.currentTimeMillis()) / 1000L;
aapsLogger.debug(LTag.PUMP, "Pump time difference: " + timeDiff + " seconds"); aapsLogger.debug(LTag.PUMP, "Pump time difference: " + timeDiff + " seconds");
@ -327,7 +327,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
public boolean bolus(final double amount, int carbs, long carbtime, final EventOverviewBolusProgress.Treatment t) { public boolean bolus(final double amount, int carbs, long carbtime, final EventOverviewBolusProgress.Treatment t) {
if (!isConnected()) return false; if (!isConnected()) return false;
if (BolusProgressDialog.stopPressed) return false; if (BolusProgressDialog.Companion.getStopPressed()) return false;
rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.startingbolus))); rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.startingbolus)));
danaPump.setBolusingTreatment(t); danaPump.setBolusingTreatment(t);
@ -346,7 +346,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
mSerialIOThread.sendMessage(msg); mSerialIOThread.sendMessage(msg);
MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(injector, DanaPump.CARBS, carbtime, carbs, 0); MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(injector, DanaPump.CARBS, carbtime, carbs, 0);
mSerialIOThread.sendMessage(msgSetHistoryEntry_v2); mSerialIOThread.sendMessage(msgSetHistoryEntry_v2);
danaPump.lastHistoryFetched = Math.min(danaPump.lastHistoryFetched, carbtime - T.mins(1).msecs()); danaPump.lastHistoryFetched = Math.min(danaPump.lastHistoryFetched, carbtime - T.Companion.mins(1).msecs());
} }
final long bolusStart = System.currentTimeMillis(); final long bolusStart = System.currentTimeMillis();
@ -415,7 +415,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
mSerialIOThread.sendMessage(msg); mSerialIOThread.sendMessage(msg);
MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(injector, DanaPump.CARBS, time, amount, 0); MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(injector, DanaPump.CARBS, time, amount, 0);
mSerialIOThread.sendMessage(msgSetHistoryEntry_v2); mSerialIOThread.sendMessage(msgSetHistoryEntry_v2);
danaPump.lastHistoryFetched = Math.min(danaPump.lastHistoryFetched, time - T.mins(1).msecs()); danaPump.lastHistoryFetched = Math.min(danaPump.lastHistoryFetched, time - T.Companion.mins(1).msecs());
return true; return true;
} }
@ -439,7 +439,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
} }
SystemClock.sleep(200); SystemClock.sleep(200);
if (danaRv2Plugin.lastEventTimeLoaded != 0) if (danaRv2Plugin.lastEventTimeLoaded != 0)
danaPump.lastHistoryFetched = danaRv2Plugin.lastEventTimeLoaded - T.mins(1).msecs(); danaPump.lastHistoryFetched = danaRv2Plugin.lastEventTimeLoaded - T.Companion.mins(1).msecs();
else else
danaPump.lastHistoryFetched = 0; danaPump.lastHistoryFetched = 0;
danaPump.setLastConnection(System.currentTimeMillis()); danaPump.setLastConnection(System.currentTimeMillis());

View file

@ -264,7 +264,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService {
public boolean bolus(double amount, int carbs, long carbTimeStamp, final EventOverviewBolusProgress.Treatment t) { public boolean bolus(double amount, int carbs, long carbTimeStamp, final EventOverviewBolusProgress.Treatment t) {
if (!isConnected()) return false; if (!isConnected()) return false;
if (BolusProgressDialog.stopPressed) return false; if (BolusProgressDialog.Companion.getStopPressed()) return false;
danaPump.setBolusingTreatment(t); danaPump.setBolusingTreatment(t);
danaPump.setBolusDone(false); danaPump.setBolusDone(false);

View file

@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.danars.encryption.BleEncryption import info.nightscout.androidaps.danars.encryption.BleEncryption
class DanaRSPacketHistoryBasal @JvmOverloads constructor( class DanaRSPacketHistoryBasal constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
from: Long = 0 from: Long = 0
) : DanaRSPacketHistory(injector, from) { ) : DanaRSPacketHistory(injector, from) {

View file

@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.danars.encryption.BleEncryption import info.nightscout.androidaps.danars.encryption.BleEncryption
class DanaRSPacketHistoryPrime @JvmOverloads constructor( class DanaRSPacketHistoryPrime constructor(
injector: HasAndroidInjector, injector: HasAndroidInjector,
from: Long = 0 from: Long = 0
) : DanaRSPacketHistory(injector, from) { ) : DanaRSPacketHistory(injector, from) {

View file

@ -342,8 +342,8 @@ open class AppRepository @Inject internal constructor(
fun deleteAllTherapyEventsEntries() = fun deleteAllTherapyEventsEntries() =
database.therapyEventDao.deleteAllEntries() database.therapyEventDao.deleteAllEntries()
fun getLastTherapyRecord(type: TherapyEvent.Type): Single<ValueWrapper<TherapyEvent>> = fun getLastTherapyRecordUpToNow(type: TherapyEvent.Type): Single<ValueWrapper<TherapyEvent>> =
database.therapyEventDao.getLastTherapyRecord(type).toWrappedSingle() database.therapyEventDao.getLastTherapyRecord(type, System.currentTimeMillis()).toWrappedSingle()
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getTherapyEventByTimestamp(type: TherapyEvent.Type, timestamp: Long): TherapyEvent? = fun getTherapyEventByTimestamp(type: TherapyEvent.Type, timestamp: Long): TherapyEvent? =

View file

@ -39,8 +39,8 @@ internal interface TherapyEventDao : TraceableDao<TherapyEvent> {
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC")
fun getTherapyEventDataIncludingInvalidFromTime(timestamp: Long): Single<List<TherapyEvent>> fun getTherapyEventDataIncludingInvalidFromTime(timestamp: Long): Single<List<TherapyEvent>>
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE type = :type AND isValid = 1 ORDER BY id DESC LIMIT 1") @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE type = :type AND isValid = 1 AND timestamp <= :now ORDER BY id DESC LIMIT 1")
fun getLastTherapyRecord(type: TherapyEvent.Type): Maybe<TherapyEvent> fun getLastTherapyRecord(type: TherapyEvent.Type, now: Long): Maybe<TherapyEvent>
@Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC")
fun compatGetTherapyEventDataFromTime(timestamp: Long): Single<List<TherapyEvent>> fun compatGetTherapyEventDataFromTime(timestamp: Long): Single<List<TherapyEvent>>

View file

@ -1,25 +1,31 @@
package info.nightscout.androidaps.database.entities package info.nightscout.androidaps.database.entities
import com.google.gson.annotations.SerializedName import androidx.room.Embedded
import androidx.room.* import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
import info.nightscout.androidaps.database.TABLE_GLUCOSE_VALUES import info.nightscout.androidaps.database.TABLE_GLUCOSE_VALUES
import info.nightscout.androidaps.database.embedments.InterfaceIDs import info.nightscout.androidaps.database.embedments.InterfaceIDs
import info.nightscout.androidaps.database.interfaces.DBEntryWithTime import info.nightscout.androidaps.database.interfaces.DBEntryWithTime
import info.nightscout.androidaps.database.interfaces.TraceableDBEntry import info.nightscout.androidaps.database.interfaces.TraceableDBEntry
import java.util.TimeZone import java.util.*
@Entity(tableName = TABLE_GLUCOSE_VALUES, @Entity(
tableName = TABLE_GLUCOSE_VALUES,
foreignKeys = [ForeignKey( foreignKeys = [ForeignKey(
entity = GlucoseValue::class, entity = GlucoseValue::class,
parentColumns = ["id"], parentColumns = ["id"],
childColumns = ["referenceId"])], childColumns = ["referenceId"]
)],
indices = [ indices = [
Index("id"), Index("id"),
Index("nightscoutId"), Index("nightscoutId"),
Index("sourceSensor"), Index("sourceSensor"),
Index("referenceId"), Index("referenceId"),
Index("timestamp") Index("timestamp")
]) ]
)
data class GlucoseValue( data class GlucoseValue(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
override var id: Long = 0, override var id: Long = 0,
@ -51,53 +57,55 @@ data class GlucoseValue(
fun isRecordDeleted(other: GlucoseValue): Boolean = fun isRecordDeleted(other: GlucoseValue): Boolean =
isValid && !other.isValid isValid && !other.isValid
enum class TrendArrow (val text:String, val symbol:String){ enum class TrendArrow(val text: String, val symbol: String) {
@SerializedName("NONE") NONE("NONE", "??"), NONE("NONE", "??"),
@SerializedName("TripleUp")TRIPLE_UP("TripleUp", "X"), TRIPLE_UP("TripleUp", "X"),
@SerializedName("DoubleUp")DOUBLE_UP("DoubleUp", "\u21c8"), DOUBLE_UP("DoubleUp", "\u21c8"),
@SerializedName("SingleUp")SINGLE_UP("SingleUp", "\u2191"), SINGLE_UP("SingleUp", "\u2191"),
@SerializedName("FortyFiveUp")FORTY_FIVE_UP("FortyFiveUp", "\u2197"), FORTY_FIVE_UP("FortyFiveUp", "\u2197"),
@SerializedName("Flat")FLAT("Flat", "\u2192"), FLAT("Flat", "\u2192"),
@SerializedName("FortyFiveDown")FORTY_FIVE_DOWN("FortyFiveDown", "\u2198"), FORTY_FIVE_DOWN("FortyFiveDown", "\u2198"),
@SerializedName("SingleDown")SINGLE_DOWN("SingleDown", "\u2193"), SINGLE_DOWN("SingleDown", "\u2193"),
@SerializedName("DoubleDown")DOUBLE_DOWN("DoubleDown", "\u21ca"), DOUBLE_DOWN("DoubleDown", "\u21ca"),
@SerializedName("TripleDown")TRIPLE_DOWN("TripleDown", "X") TRIPLE_DOWN("TripleDown", "X")
; ;
companion object { companion object {
fun fromString(direction : String?) = values().firstOrNull {it.text == direction} ?: NONE
fun fromString(direction: String?) =
values().firstOrNull { it.text == direction } ?: NONE
} }
} }
enum class SourceSensor(val text : String) { enum class SourceSensor(val text: String) {
@SerializedName("AndroidAPS-Dexcom") DEXCOM_NATIVE_UNKNOWN("AndroidAPS-Dexcom"), DEXCOM_NATIVE_UNKNOWN("AndroidAPS-Dexcom"),
@SerializedName("AndroidAPS-DexcomG6") DEXCOM_G6_NATIVE("AndroidAPS-DexcomG6"), DEXCOM_G6_NATIVE("AndroidAPS-DexcomG6"),
@SerializedName("AndroidAPS-DexcomG5") DEXCOM_G5_NATIVE("AndroidAPS-DexcomG5"), DEXCOM_G5_NATIVE("AndroidAPS-DexcomG5"),
@SerializedName("Bluetooth Wixel") DEXCOM_G4_WIXEL("Bluetooth Wixel"), DEXCOM_G4_WIXEL("Bluetooth Wixel"),
@SerializedName("xBridge Wixel") DEXCOM_G4_XBRIDGE("xBridge Wixel"), DEXCOM_G4_XBRIDGE("xBridge Wixel"),
@SerializedName("G4 Share Receiver") DEXCOM_G4_NATIVE("G4 Share Receiver"), DEXCOM_G4_NATIVE("G4 Share Receiver"),
@SerializedName("Medtrum A6") MEDTRUM_A6("Medtrum A6"), MEDTRUM_A6("Medtrum A6"),
@SerializedName("Network G4") DEXCOM_G4_NET("Network G4"), DEXCOM_G4_NET("Network G4"),
@SerializedName("Network G4 and xBridge") DEXCOM_G4_NET_XBRIDGE("Network G4 and xBridge"), DEXCOM_G4_NET_XBRIDGE("Network G4 and xBridge"),
@SerializedName("Network G4 and Classic xDrip") DEXCOM_G4_NET_CLASSIC("Network G4 and Classic xDrip"), DEXCOM_G4_NET_CLASSIC("Network G4 and Classic xDrip"),
@SerializedName("DexcomG5") DEXCOM_G5_XDRIP("DexcomG5"), DEXCOM_G5_XDRIP("DexcomG5"),
@SerializedName("G6 Native") DEXCOM_G6_NATIVE_XDRIP("G6 Native"), DEXCOM_G6_NATIVE_XDRIP("G6 Native"),
@SerializedName("G5 Native") DEXCOM_G5_NATIVE_XDRIP("G5 Native"), DEXCOM_G5_NATIVE_XDRIP("G5 Native"),
@SerializedName("G6 Native / G5 Native") DEXCOM_G6_G5_NATIVE_XDRIP("G6 Native / G5 Native"), DEXCOM_G6_G5_NATIVE_XDRIP("G6 Native / G5 Native"),
@SerializedName("Network libre") LIBRE_1_NET("Network libre"), LIBRE_1_NET("Network libre"),
@SerializedName("BlueReader") LIBRE_1_BLUE("BlueReader"), LIBRE_1_BLUE("BlueReader"),
@SerializedName("Transmiter PL") LIBRE_1_PL("Transmiter PL"), LIBRE_1_PL("Transmiter PL"),
@SerializedName("Blucon") LIBRE_1_BLUCON("Blucon"), LIBRE_1_BLUCON("Blucon"),
@SerializedName("Tomato") LIBRE_1_TOMATO("Tomato"), LIBRE_1_TOMATO("Tomato"),
@SerializedName("Rfduino") LIBRE_1_RF("Rfduino"), LIBRE_1_RF("Rfduino"),
@SerializedName("LimiTTer") LIBRE_1_LIMITTER("LimiTTer"), LIBRE_1_LIMITTER("LimiTTer"),
@SerializedName("Glimp") GLIMP("Glimp"), GLIMP("Glimp"),
@SerializedName("Libre2") LIBRE_2_NATIVE("Libre2"), LIBRE_2_NATIVE("Libre2"),
@SerializedName("Poctech") POCTECH_NATIVE("Poctech"), POCTECH_NATIVE("Poctech"),
@SerializedName("MM600Series") MM_600_SERIES("MM600Series"), MM_600_SERIES("MM600Series"),
@SerializedName("Eversense") EVERSENSE("Eversense"), EVERSENSE("Eversense"),
@SerializedName("Random") RANDOM("Random"), RANDOM("Random"),
@SerializedName("Unknown") UNKNOWN("Unknown"), UNKNOWN("Unknown"),
IOB_PREDICTION("IOBPrediction"), IOB_PREDICTION("IOBPrediction"),
A_COB_PREDICTION("aCOBPrediction"), A_COB_PREDICTION("aCOBPrediction"),

View file

@ -11,5 +11,4 @@ var DBEntryWithTimeAndDuration.end
require(duration > 0) require(duration > 0)
} }
@JvmOverloads
fun DBEntryWithTimeAndDuration.getRemainingDuration(current: Long = System.currentTimeMillis()) = min(0L, end - current) fun DBEntryWithTimeAndDuration.getRemainingDuration(current: Long = System.currentTimeMillis()) = min(0L, end - current)

View file

@ -590,7 +590,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
bolusingEvent.setPercent(0); bolusingEvent.setPercent(0);
rxBus.send(bolusingEvent); rxBus.send(bolusingEvent);
int trials = 0; int trials = 0;
Long now = dateUtil.now(); long now = dateUtil.now();
String serial = serialNumber(); String serial = serialNumber();
insightDbHelper.createOrUpdate( new InsightBolusID( insightDbHelper.createOrUpdate( new InsightBolusID(
now, now,
@ -1183,8 +1183,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
for (InsightPumpID pumpID : pumpStartedEvents) { for (InsightPumpID pumpID : pumpStartedEvents) {
InsightPumpID stoppedEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), pumpID.getTimestamp()); InsightPumpID stoppedEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), pumpID.getTimestamp());
if (stoppedEvent != null && stoppedEvent.getEventType().equals(EventType.PumpStopped)) { // Search if Stop event is after 15min of Pause if (stoppedEvent != null && stoppedEvent.getEventType().equals(EventType.PumpStopped)) { // Search if Stop event is after 15min of Pause
InsightPumpID pauseEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), stoppedEvent.getTimestamp() - T.mins(1).msecs()); InsightPumpID pauseEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), stoppedEvent.getTimestamp() - T.Companion.mins(1).msecs());
if (pauseEvent != null && pauseEvent.getEventType().equals(EventType.PumpPaused) && (stoppedEvent.getTimestamp() - pauseEvent.getTimestamp() < T.mins(16).msecs())) { if (pauseEvent != null && pauseEvent.getEventType().equals(EventType.PumpPaused) && (stoppedEvent.getTimestamp() - pauseEvent.getTimestamp() < T.Companion.mins(16).msecs())) {
stoppedEvent = pauseEvent; stoppedEvent = pauseEvent;
stoppedEvent.setEventType(EventType.PumpStopped); stoppedEvent.setEventType(EventType.PumpStopped);
} }
@ -1343,7 +1343,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
event.getEventPosition())); event.getEventPosition()));
temporaryBasals.add(new TemporaryBasal( temporaryBasals.add(new TemporaryBasal(
timestamp, timestamp,
T.mins(event.getDuration()).msecs(), T.Companion.mins(event.getDuration()).msecs(),
event.getAmount(), event.getAmount(),
false, false,
PumpSync.TemporaryBasalType.NORMAL, PumpSync.TemporaryBasalType.NORMAL,
@ -1406,7 +1406,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
pumpSync.syncExtendedBolusWithPumpId( pumpSync.syncExtendedBolusWithPumpId(
bolusID.getTimestamp(), bolusID.getTimestamp(),
event.getExtendedAmount(), event.getExtendedAmount(),
T.mins(event.getDuration()).msecs(), T.Companion.mins(event.getDuration()).msecs(),
isFakingTempsByExtendedBoluses(), isFakingTempsByExtendedBoluses(),
bolusID.getId(), bolusID.getId(),
PumpType.ACCU_CHEK_INSIGHT, PumpType.ACCU_CHEK_INSIGHT,

View file

@ -14,7 +14,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="#FFFFFF" android:textColor="#FFFFFF"
android:textSize="16sp" android:textSize="16sp"
android:text="@string/serial_number" /> android:text="@string/serialnumber" />
<TextView <TextView
android:id="@+id/serial_number" android:id="@+id/serial_number"

View file

@ -27,7 +27,6 @@ enum class CGMSHistoryEntryType(val code: Int, val description: String, val head
private val opCodeMap: MutableMap<Int, CGMSHistoryEntryType> = mutableMapOf() private val opCodeMap: MutableMap<Int, CGMSHistoryEntryType> = mutableMapOf()
@JvmStatic
fun getByCode(opCode: Int): CGMSHistoryEntryType { fun getByCode(opCode: Int): CGMSHistoryEntryType {
return if (opCodeMap.containsKey(opCode)) return if (opCodeMap.containsKey(opCode))
opCodeMap[opCode]!! opCodeMap[opCode]!!
@ -42,7 +41,7 @@ enum class CGMSHistoryEntryType(val code: Int, val description: String, val head
} }
} }
@JvmField var schemaSet: Boolean var schemaSet: Boolean
val totalLength: Int val totalLength: Int
val dateType: DateType val dateType: DateType

View file

@ -300,7 +300,6 @@ class BasalProfile {
return if (b < 0) b + 256 else b.toInt() return if (b < 0) b + 256 else b.toInt()
} }
@JvmStatic
fun getProfilesByHourToString(data: DoubleArray): String { fun getProfilesByHourToString(data: DoubleArray): String {
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()
for (value in data) { for (value in data) {
@ -310,7 +309,6 @@ class BasalProfile {
return stringBuilder.toString() return stringBuilder.toString()
} }
@JvmStatic
fun isBasalProfileByHourUndefined(basalByHour: DoubleArray): Boolean { fun isBasalProfileByHourUndefined(basalByHour: DoubleArray): Boolean {
for (i in 0..23) { for (i in 0..23) {
if (basalByHour[i] > 0.0) { if (basalByHour[i] > 0.0) {

View file

@ -148,7 +148,6 @@ enum class MedtronicCommandType(
} }
} }
@JvmStatic
fun getSettings(medtronicPumpModel: MedtronicDeviceType): MedtronicCommandType { fun getSettings(medtronicPumpModel: MedtronicDeviceType): MedtronicCommandType {
return if (isSameDevice(medtronicPumpModel, MedtronicDeviceType.Medtronic_512_712)) return if (isSameDevice(medtronicPumpModel, MedtronicDeviceType.Medtronic_512_712))
Settings_512 Settings_512

View file

@ -39,7 +39,6 @@ enum class MedtronicDeviceType {
companion object { companion object {
var mapByDescription: MutableMap<String, MedtronicDeviceType> = mutableMapOf() var mapByDescription: MutableMap<String, MedtronicDeviceType> = mutableMapOf()
@JvmStatic
fun isSameDevice(deviceWeCheck: MedtronicDeviceType, deviceSources: MedtronicDeviceType): Boolean { fun isSameDevice(deviceWeCheck: MedtronicDeviceType, deviceSources: MedtronicDeviceType): Boolean {
if (deviceSources.isFamily) { if (deviceSources.isFamily) {
for (mdt in deviceSources.familyMembers!!) { for (mdt in deviceSources.familyMembers!!) {

View file

@ -10,14 +10,14 @@ object MedtronicConst {
const val Prefix = "AAPS.Medtronic." const val Prefix = "AAPS.Medtronic."
object Prefs { object Prefs {
@JvmField val PumpSerial = R.string.key_medtronic_serial val PumpSerial = R.string.key_medtronic_serial
@JvmField val PumpType = R.string.key_medtronic_pump_type val PumpType = R.string.key_medtronic_pump_type
@JvmField val PumpFrequency = R.string.key_medtronic_frequency val PumpFrequency = R.string.key_medtronic_frequency
@JvmField val MaxBolus = R.string.key_medtronic_max_bolus val MaxBolus = R.string.key_medtronic_max_bolus
@JvmField val MaxBasal = R.string.key_medtronic_max_basal val MaxBasal = R.string.key_medtronic_max_basal
@JvmField val BolusDelay = R.string.key_medtronic_bolus_delay val BolusDelay = R.string.key_medtronic_bolus_delay
@JvmField val Encoding = R.string.key_medtronic_encoding val Encoding = R.string.key_medtronic_encoding
@JvmField val BatteryType = R.string.key_medtronic_battery_type val BatteryType = R.string.key_medtronic_battery_type
val BolusDebugEnabled = R.string.key_medtronic_bolus_debug val BolusDebugEnabled = R.string.key_medtronic_bolus_debug
} }

View file

@ -257,7 +257,6 @@ class MedtronicUtil @Inject constructor(
return b2 and 0xff shl 8 or b1 and 0xff return b2 and 0xff shl 8 or b1 and 0xff
} }
@JvmStatic
fun getByteArrayFromUnsignedShort(shortValue: Int, returnFixedSize: Boolean): ByteArray { fun getByteArrayFromUnsignedShort(shortValue: Int, returnFixedSize: Boolean): ByteArray {
val highByte = (shortValue shr 8 and 0xFF).toByte() val highByte = (shortValue shr 8 and 0xFF).toByte()
val lowByte = (shortValue and 0xFF).toByte() val lowByte = (shortValue and 0xFF).toByte()
@ -272,7 +271,6 @@ class MedtronicUtil @Inject constructor(
return data return data
} }
@JvmStatic
fun createByteArray(data: List<Byte>): ByteArray { fun createByteArray(data: List<Byte>): ByteArray {
val array = ByteArray(data.size) val array = ByteArray(data.size)
for (i in data.indices) { for (i in data.indices) {
@ -304,7 +302,6 @@ class MedtronicUtil @Inject constructor(
return strokes return strokes
} }
@JvmStatic
fun isSame(d1: Double, d2: Double): Boolean { fun isSame(d1: Double, d2: Double): Boolean {
val diff = d1 - d2 val diff = d1 - d2
return Math.abs(diff) <= 0.000001 return Math.abs(diff) <= 0.000001

View file

@ -678,7 +678,7 @@ public class OmnipodErosPumpPlugin extends PumpPluginBase implements Pump, Riley
if (tbrCurrent != null) { if (tbrCurrent != null) {
aapsLogger.info(LTag.PUMP, "setTempBasalAbsolute: Current Basal: duration: {} min, rate={}", aapsLogger.info(LTag.PUMP, "setTempBasalAbsolute: Current Basal: duration: {} min, rate={}",
T.msecs(tbrCurrent.getDuration()).mins(), tbrCurrent.getRate()); T.Companion.msecs(tbrCurrent.getDuration()).mins(), tbrCurrent.getRate());
} }
if (tbrCurrent != null && !enforceNew) { if (tbrCurrent != null && !enforceNew) {

View file

@ -93,7 +93,6 @@ public class AapsOmnipodErosManager {
private final RxBusWrapper rxBus; private final RxBusWrapper rxBus;
private final ResourceHelper resourceHelper; private final ResourceHelper resourceHelper;
private final HasAndroidInjector injector; private final HasAndroidInjector injector;
private final ActivePlugin activePlugin;
private final SP sp; private final SP sp;
private final OmnipodManager delegate; private final OmnipodManager delegate;
private final OmnipodAlertUtil omnipodAlertUtil; private final OmnipodAlertUtil omnipodAlertUtil;
@ -125,7 +124,6 @@ public class AapsOmnipodErosManager {
SP sp, SP sp,
ResourceHelper resourceHelper, ResourceHelper resourceHelper,
HasAndroidInjector injector, HasAndroidInjector injector,
ActivePlugin activePlugin,
OmnipodAlertUtil omnipodAlertUtil, OmnipodAlertUtil omnipodAlertUtil,
Context context, Context context,
PumpSync pumpSync) { PumpSync pumpSync) {
@ -137,7 +135,6 @@ public class AapsOmnipodErosManager {
this.sp = sp; this.sp = sp;
this.resourceHelper = resourceHelper; this.resourceHelper = resourceHelper;
this.injector = injector; this.injector = injector;
this.activePlugin = activePlugin;
this.omnipodAlertUtil = omnipodAlertUtil; this.omnipodAlertUtil = omnipodAlertUtil;
this.context = context; this.context = context;
this.pumpSync = pumpSync; this.pumpSync = pumpSync;
@ -366,7 +363,7 @@ public class AapsOmnipodErosManager {
bolusCommandResult = executeCommand(() -> delegate.bolus(PumpType.OMNIPOD_EROS.determineCorrectBolusSize(detailedBolusInfo.insulin), beepsEnabled, beepsEnabled, detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB ? null : bolusCommandResult = executeCommand(() -> delegate.bolus(PumpType.OMNIPOD_EROS.determineCorrectBolusSize(detailedBolusInfo.insulin), beepsEnabled, beepsEnabled, detailedBolusInfo.getBolusType() == DetailedBolusInfo.BolusType.SMB ? null :
(estimatedUnitsDelivered, percentage) -> { (estimatedUnitsDelivered, percentage) -> {
EventOverviewBolusProgress progressUpdateEvent = EventOverviewBolusProgress.INSTANCE; EventOverviewBolusProgress progressUpdateEvent = EventOverviewBolusProgress.INSTANCE;
progressUpdateEvent.setStatus(getStringResource(R.string.bolusdelivering, detailedBolusInfo.insulin)); progressUpdateEvent.setStatus(getStringResource(R.string.goingtodeliver, detailedBolusInfo.insulin));
progressUpdateEvent.setPercent(percentage); progressUpdateEvent.setPercent(percentage);
sendEvent(progressUpdateEvent); sendEvent(progressUpdateEvent);
})); }));
@ -779,7 +776,6 @@ public class AapsOmnipodErosManager {
// Cancels current TBR and adds a new TBR for the remaining duration // Cancels current TBR and adds a new TBR for the remaining duration
private void splitActiveTbr() { private void splitActiveTbr() {
PumpSync.PumpState pumpState = pumpSync.expectedPumpState();
PumpSync.PumpState.TemporaryBasal previouslyRunningTempBasal = pumpSync.expectedPumpState().getTemporaryBasal(); PumpSync.PumpState.TemporaryBasal previouslyRunningTempBasal = pumpSync.expectedPumpState().getTemporaryBasal();
if (previouslyRunningTempBasal != null) { if (previouslyRunningTempBasal != null) {
// Cancel the previously running TBR and start a NEW TBR here for the remaining duration, // Cancel the previously running TBR and start a NEW TBR here for the remaining duration,
@ -810,7 +806,7 @@ public class AapsOmnipodErosManager {
pumpSync.syncTemporaryBasalWithPumpId( pumpSync.syncTemporaryBasalWithPumpId(
time, time,
tempBasalPair.getInsulinRate(), tempBasalPair.getInsulinRate(),
T.mins(tempBasalPair.getDurationMinutes()).msecs(), T.Companion.mins(tempBasalPair.getDurationMinutes()).msecs(),
true, true,
PumpSync.TemporaryBasalType.NORMAL, PumpSync.TemporaryBasalType.NORMAL,
pumpId, pumpId,

View file

@ -146,7 +146,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
statusView.setVisibility(View.GONE); statusView.setVisibility(View.GONE);
typeListFull = getTypeList(PumpHistoryEntryGroup.getTranslatedList(resourceHelper)); typeListFull = getTypeList(PumpHistoryEntryGroup.Companion.getTranslatedList(resourceHelper));
ArrayAdapter<TypeList> spinnerAdapter = new ArrayAdapter<>(this, R.layout.spinner_centered, typeListFull); ArrayAdapter<TypeList> spinnerAdapter = new ArrayAdapter<>(this, R.layout.spinner_centered, typeListFull);
historyTypeSpinner.setAdapter(spinnerAdapter); historyTypeSpinner.setAdapter(spinnerAdapter);
@ -306,7 +306,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
try { try {
Profile.ProfileValue[] profileValuesArray = aapsOmnipodUtil.getGsonInstance().fromJson(data, Profile.ProfileValue[].class); Profile.ProfileValue[] profileValuesArray = aapsOmnipodUtil.getGsonInstance().fromJson(data, Profile.ProfileValue[].class);
valueView.setText(ProfileUtil.getBasalProfilesDisplayable(profileValuesArray, PumpType.OMNIPOD_EROS)); valueView.setText(ProfileUtil.INSTANCE.getBasalProfilesDisplayable(profileValuesArray, PumpType.OMNIPOD_EROS));
} catch (Exception e) { } catch (Exception e) {
aapsLogger.error(LTag.PUMP, "Problem parsing Profile json. Ex: {}, Data:\n{}", e.getMessage(), data); aapsLogger.error(LTag.PUMP, "Problem parsing Profile json. Ex: {}, Data:\n{}", e.getMessage(), data);
valueView.setText(""); valueView.setText("");
@ -321,7 +321,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
@Override @Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) { public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView); super.onAttachedToRecyclerView(recyclerView);
} }

View file

@ -63,10 +63,10 @@ abstract class PumpPluginAbstract protected constructor(
final override var pumpDescription = PumpDescription() final override var pumpDescription = PumpDescription()
//protected set //protected set
@JvmField protected var serviceConnection: ServiceConnection? = null protected var serviceConnection: ServiceConnection? = null
@JvmField protected var serviceRunning = false protected var serviceRunning = false
@JvmField protected var pumpState = PumpDriverState.NotInitialized protected var pumpState = PumpDriverState.NotInitialized
@JvmField protected var displayConnectionMessages = false protected var displayConnectionMessages = false
var pumpType: PumpType = PumpType.GENERIC_AAPS var pumpType: PumpType = PumpType.GENERIC_AAPS
get() = field get() = field

View file

@ -43,7 +43,6 @@ enum class PumpHistoryEntryGroup(val resourceId: Int) {
} }
} }
@JvmStatic
fun getTranslatedList(resourceHelper: ResourceHelper): List<PumpHistoryEntryGroup> { fun getTranslatedList(resourceHelper: ResourceHelper): List<PumpHistoryEntryGroup> {
if (translatedList == null) doTranslation(resourceHelper) if (translatedList == null) doTranslation(resourceHelper)
return translatedList!! return translatedList!!

View file

@ -19,7 +19,6 @@ object ProfileUtil {
return if (stringBuilder.length > 3) stringBuilder.substring(0, stringBuilder.length - 2) else stringBuilder.toString() return if (stringBuilder.length > 3) stringBuilder.substring(0, stringBuilder.length - 2) else stringBuilder.toString()
} }
@JvmStatic
fun getBasalProfilesDisplayable(profiles: Array<ProfileValue>, pumpType: PumpType): String { fun getBasalProfilesDisplayable(profiles: Array<ProfileValue>, pumpType: PumpType): String {
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()
for (basalValue in profiles) { for (basalValue in profiles) {
@ -32,7 +31,6 @@ object ProfileUtil {
return if (stringBuilder.length > 3) stringBuilder.substring(0, stringBuilder.length - 2) else stringBuilder.toString() return if (stringBuilder.length > 3) stringBuilder.substring(0, stringBuilder.length - 2) else stringBuilder.toString()
} }
@JvmStatic
fun getBasalProfilesDisplayableAsStringOfArray(profile: Profile, pumpType: PumpType): String? { fun getBasalProfilesDisplayableAsStringOfArray(profile: Profile, pumpType: PumpType): String? {
val stringBuilder = java.lang.StringBuilder() val stringBuilder = java.lang.StringBuilder()
// for (basalValue in profiles) { // for (basalValue in profiles) {