Merge branch 'dev' of https://github.com/nightscout/AndroidAPS into dash
This commit is contained in:
commit
09675de3f1
60 changed files with 327 additions and 210 deletions
|
@ -2,6 +2,7 @@
|
|||
<dictionary name="project-dictionary">
|
||||
<words>
|
||||
<w>aaps</w>
|
||||
<w>abcdef</w>
|
||||
<w>acked</w>
|
||||
<w>actionstring</w>
|
||||
<w>allowednumbers</w>
|
||||
|
@ -14,8 +15,10 @@
|
|||
<w>basals</w>
|
||||
<w>bgcheck</w>
|
||||
<w>bgsource</w>
|
||||
<w>boluscalc</w>
|
||||
<w>bolusing</w>
|
||||
<w>carb</w>
|
||||
<w>carbratio</w>
|
||||
<w>carbs</w>
|
||||
<w>carbsreq</w>
|
||||
<w>careportal</w>
|
||||
|
@ -46,6 +49,7 @@
|
|||
<w>medtronic</w>
|
||||
<w>mgdl</w>
|
||||
<w>mmol</w>
|
||||
<w>motol</w>
|
||||
<w>multiwave</w>
|
||||
<w>netinsulin</w>
|
||||
<w>netratio</w>
|
||||
|
@ -55,9 +59,14 @@
|
|||
<w>okcancel</w>
|
||||
<w>omnipod</w>
|
||||
<w>openaps</w>
|
||||
<w>openhumans</w>
|
||||
<w>oref</w>
|
||||
<w>otpauth</w>
|
||||
<w>passcode</w>
|
||||
<w>pdus</w>
|
||||
<w>philoul</w>
|
||||
<w>poctech</w>
|
||||
<w>pred</w>
|
||||
<w>profileswitch</w>
|
||||
<w>pumpbtcomm</w>
|
||||
<w>quickwizard</w>
|
||||
|
@ -66,14 +75,18 @@
|
|||
<w>refresheventsfromnightscout</w>
|
||||
<w>rileylink</w>
|
||||
<w>roboelectric</w>
|
||||
<w>sgvs</w>
|
||||
<w>sitechange</w>
|
||||
<w>smscommunicator</w>
|
||||
<w>sntp</w>
|
||||
<w>sooil</w>
|
||||
<w>soundid</w>
|
||||
<w>splitted</w>
|
||||
<w>ssid</w>
|
||||
<w>superbolus</w>
|
||||
<w>targethigh</w>
|
||||
<w>targetlow</w>
|
||||
<w>tbrs</w>
|
||||
<w>tdds</w>
|
||||
<w>tempbasal</w>
|
||||
<w>tempbasals</w>
|
||||
|
@ -82,9 +95,11 @@
|
|||
<w>tidepool</w>
|
||||
<w>timeshift</w>
|
||||
<w>tirs</w>
|
||||
<w>totp</w>
|
||||
<w>uart</w>
|
||||
<w>wizzardpage</w>
|
||||
<w>xdrip</w>
|
||||
<w>xstream</w>
|
||||
<w>ypso</w>
|
||||
<w>ypsomed</w>
|
||||
<w>ypsopump</w>
|
||||
|
|
|
@ -109,7 +109,7 @@ android {
|
|||
defaultConfig {
|
||||
multiDexEnabled true
|
||||
versionCode 1500
|
||||
version "2.8.2.2-dev"
|
||||
version "2.8.2.3-dev"
|
||||
buildConfigField "String", "VERSION", '"' + version + '"'
|
||||
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
|
||||
buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"'
|
||||
|
|
|
@ -32,6 +32,7 @@ import info.nightscout.androidaps.receivers.TimeDateOrTZChangeReceiver
|
|||
import info.nightscout.androidaps.utils.ActivityMonitor
|
||||
import info.nightscout.androidaps.utils.DateUtil
|
||||
import info.nightscout.androidaps.utils.locale.LocaleHelper.update
|
||||
import info.nightscout.androidaps.utils.protection.PasswordCheck
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||
import io.reactivex.disposables.CompositeDisposable
|
||||
import io.reactivex.rxkotlin.plusAssign
|
||||
|
@ -56,6 +57,7 @@ class MainApp : DaggerApplication() {
|
|||
@Inject lateinit var dateUtil: DateUtil
|
||||
@Inject lateinit var staticInjector: StaticInjector// TODO avoid , here fake only to initialize
|
||||
@Inject lateinit var uel: UserEntryLogger
|
||||
@Inject lateinit var passwordCheck: PasswordCheck
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
@ -87,6 +89,7 @@ class MainApp : DaggerApplication() {
|
|||
keepAliveManager.setAlarm(this)
|
||||
doMigrations()
|
||||
uel.log(UserEntry.Action.START_AAPS, UserEntry.Sources.Aaps)
|
||||
passwordCheck.passwordResetCheck(this)
|
||||
}
|
||||
|
||||
private fun doMigrations() {
|
||||
|
|
|
@ -17,7 +17,6 @@ abstract class ObjectivesModule {
|
|||
@ContributesAndroidInjector abstract fun objective5Injector(): Objective5
|
||||
@ContributesAndroidInjector abstract fun objective6Injector(): Objective6
|
||||
@ContributesAndroidInjector abstract fun objective7Injector(): Objective7
|
||||
@ContributesAndroidInjector abstract fun objective8Injector(): Objective8
|
||||
@ContributesAndroidInjector abstract fun objective9Injector(): Objective9
|
||||
@ContributesAndroidInjector abstract fun objective10Injector(): Objective10
|
||||
|
||||
|
|
|
@ -78,7 +78,6 @@ class ObjectivesPlugin @Inject constructor(
|
|||
objectives.add(Objective5(injector))
|
||||
objectives.add(Objective6(injector))
|
||||
objectives.add(Objective7(injector))
|
||||
objectives.add(Objective8(injector))
|
||||
objectives.add(Objective9(injector))
|
||||
objectives.add(Objective10(injector))
|
||||
}
|
||||
|
|
|
@ -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()))
|
||||
}
|
||||
}
|
|
@ -16,8 +16,8 @@ class NSAddAck(
|
|||
) : Event(), Ack {
|
||||
|
||||
var id: String? = null
|
||||
@JvmField var nsClientID: String? = null
|
||||
@JvmField var json: JSONObject? = null
|
||||
var nsClientID: String? = null
|
||||
var json: JSONObject? = null
|
||||
override fun call(vararg args: Any) {
|
||||
// Regular response
|
||||
try {
|
||||
|
|
|
@ -680,14 +680,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
|||
activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.iob), overviewData.iobDialogText) }
|
||||
}
|
||||
// cob
|
||||
var cobText: String = 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
|
||||
var cobText = overviewData.cobInfo?.displayText(resourceHelper, dateUtil, buildHelper.isDev()) ?: resourceHelper.gs(R.string.value_unavailable_short)
|
||||
|
||||
val constraintsProcessed = loopPlugin.lastRun?.constraintsProcessed
|
||||
val lastRun = loopPlugin.lastRun
|
||||
|
@ -695,7 +688,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
|||
if (constraintsProcessed.carbsReq > 0) {
|
||||
//only display carbsreq when carbs have not been entered recently
|
||||
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)
|
||||
carbAnimation?.start()
|
||||
|
@ -704,6 +697,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
|
|||
carbAnimation?.selectDrawable(0)
|
||||
}
|
||||
}
|
||||
binding.infoLayout.cob.text = cobText
|
||||
}
|
||||
|
||||
OverviewData.Property.TEMPORARY_TARGET -> {
|
||||
|
|
|
@ -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.utils.DateUtil
|
||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||
import info.nightscout.androidaps.utils.Translator
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||
import info.nightscout.androidaps.utils.rx.AapsSchedulers
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||
|
@ -45,8 +44,6 @@ class OverviewPlugin @Inject constructor(
|
|||
resourceHelper: ResourceHelper,
|
||||
private val config: Config,
|
||||
private val dateUtil: DateUtil,
|
||||
private val translator: Translator,
|
||||
// private val profiler: Profiler,
|
||||
private val profileFunction: ProfileFunction,
|
||||
private val iobCobCalculator: IobCobCalculator,
|
||||
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.TEMPORARY_BASAL))
|
||||
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.SENSITIVITY))
|
||||
loadAsData(from)
|
||||
|
@ -244,6 +240,7 @@ class OverviewPlugin @Inject constructor(
|
|||
overviewData.prepareTreatmentsData(from)
|
||||
overviewData.prepareIobAutosensData(from)
|
||||
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.GRAPH))
|
||||
overviewBus.send(EventUpdateOverview(from, OverviewData.Property.IOB_COB))
|
||||
aapsLogger.debug(LTag.UI, "refreshLoop finished")
|
||||
runningRefresh = false
|
||||
}
|
||||
|
@ -305,7 +302,7 @@ class OverviewPlugin @Inject constructor(
|
|||
private fun loadIobCobResults(from: String) {
|
||||
overviewData.bolusIob = iobCobCalculator.calculateIobFromBolus().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()
|
||||
overviewData.lastCarbsTime = if (lastCarbs is ValueWrapper.Existing) lastCarbs.value.timestamp else 0L
|
||||
|
||||
|
|
|
@ -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) {
|
||||
val warn = sp.getDouble(warnSettings, defaultWarnThreshold)
|
||||
val urgent = sp.getDouble(urgentSettings, defaultUrgentThreshold)
|
||||
val therapyEvent = repository.getLastTherapyRecord(type).blockingGet()
|
||||
val therapyEvent = repository.getLastTherapyRecordUpToNow(type).blockingGet()
|
||||
if (therapyEvent is ValueWrapper.Existing) {
|
||||
warnColors.setColorByAge(view, therapyEvent.value, warn, urgent)
|
||||
view?.text = therapyEvent.value.age(resourceHelper.shortTextMode(), resourceHelper, dateUtil)
|
||||
|
|
|
@ -270,18 +270,19 @@ class IobCobCalculatorPlugin @Inject constructor(
|
|||
var displayCob: Double? = null
|
||||
var futureCarbs = 0.0
|
||||
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) {
|
||||
displayCob = autosensData.cob
|
||||
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
|
||||
}
|
||||
}
|
||||
timestamp = autosensData.time
|
||||
}
|
||||
// Future carbs
|
||||
carbs.forEach { carb -> if (carb.timestamp > now) futureCarbs += carb.amount }
|
||||
return CobInfo(displayCob, futureCarbs)
|
||||
return CobInfo(timestamp, displayCob, futureCarbs)
|
||||
}
|
||||
|
||||
override fun getMealDataWithWaitingForCalculationFinish(): MealData {
|
||||
|
@ -579,7 +580,7 @@ class IobCobCalculatorPlugin @Inject constructor(
|
|||
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 pumpInterface = activePlugin.activePump
|
||||
val now = dateUtil.now()
|
||||
|
|
|
@ -72,7 +72,7 @@ class LocalProfileFragment : DaggerFragment() {
|
|||
}
|
||||
|
||||
private fun sumLabel(): String {
|
||||
val profile = localProfilePlugin.profile?.getDefaultProfile()
|
||||
val profile = localProfilePlugin.getEditProfile()
|
||||
val sum = profile?.let { ProfileSealed.Pure(profile).baseBasalSum() } ?: 0.0
|
||||
return " ∑" + DecimalFormatter.to2Decimal(sum) + resourceHelper.gs(R.string.insulin_unit_shortname)
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import info.nightscout.androidaps.data.ProfileSealed
|
|||
import info.nightscout.androidaps.data.PureProfile
|
||||
import info.nightscout.androidaps.events.EventProfileStoreChanged
|
||||
import info.nightscout.androidaps.extensions.blockFromJsonArray
|
||||
import info.nightscout.androidaps.extensions.pureProfileFromJson
|
||||
import info.nightscout.androidaps.interfaces.*
|
||||
import info.nightscout.androidaps.logging.AAPSLogger
|
||||
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.DecimalFormatter
|
||||
import info.nightscout.androidaps.utils.HardLimits
|
||||
import info.nightscout.androidaps.utils.JsonHelper
|
||||
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
|
||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||
|
@ -97,7 +99,7 @@ class LocalProfilePlugin @Inject constructor(
|
|||
var numOfProfiles = 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
|
||||
fun isValidEditState(): Boolean {
|
||||
|
@ -123,6 +125,23 @@ class LocalProfilePlugin @Inject constructor(
|
|||
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
|
||||
fun storeSettings(activity: FragmentActivity? = null) {
|
||||
for (i in 0 until numOfProfiles) {
|
||||
|
|
|
@ -109,5 +109,6 @@ class VirtualPumpFragment : DaggerFragment() {
|
|||
|
||||
binding.type.text = pumpType?.description
|
||||
binding.typeDef.text = pumpType?.getFullDescription(resourceHelper.gs(R.string.virtualpump_pump_def), pumpType.hasExtendedBasals(), resourceHelper)
|
||||
binding.serialNumber.text = virtualPumpPlugin.serialNumber()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -127,7 +127,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
|
|||
override fun updateButtons() {
|
||||
runOnUiThread {
|
||||
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)) {
|
||||
findViewById<View>(R.id.finish_button).visibility = View.VISIBLE
|
||||
findViewById<View>(R.id.next_button).visibility = View.GONE
|
||||
|
@ -184,7 +184,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
|
|||
private fun nextPage(view: View?): Int {
|
||||
var page = currentWizardPage + 1
|
||||
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++
|
||||
}
|
||||
return min(currentWizardPage, screens.size - 1)
|
||||
|
@ -194,7 +194,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() {
|
|||
private fun previousPage(view: View?): Int {
|
||||
var page = currentWizardPage - 1
|
||||
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--
|
||||
}
|
||||
return max(currentWizardPage, 0)
|
||||
|
|
|
@ -5,11 +5,13 @@ import android.text.Editable
|
|||
import android.text.InputType
|
||||
import android.text.TextWatcher
|
||||
import android.view.View
|
||||
import android.widget.Button
|
||||
import android.widget.EditText
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.androidaps.extensions.toVisibility
|
||||
import info.nightscout.androidaps.setupwizard.SWTextValidator
|
||||
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 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) {
|
||||
val context = layout.context
|
||||
val l = TextView(context)
|
||||
l.id = View.generateViewId()
|
||||
label?.let { l.setText(it) }
|
||||
l.setTypeface(l.typeface, Typeface.BOLD)
|
||||
val isPasswordSet = sp.contains(R.string.key_master_password) && sp.getString(R.string.key_master_password, "") != ""
|
||||
|
||||
button = Button(context)
|
||||
button?.setText(R.string.unlock_settings)
|
||||
button?.setOnClickListener {
|
||||
scanForActivity(context)?.let { activity ->
|
||||
passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, {
|
||||
button?.visibility = View.GONE
|
||||
editText?.visibility = View.VISIBLE
|
||||
editText2?.visibility = View.VISIBLE
|
||||
l?.visibility = View.VISIBLE
|
||||
c?.visibility = View.VISIBLE
|
||||
c2?.visibility = View.VISIBLE
|
||||
})
|
||||
}
|
||||
}
|
||||
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)
|
||||
val c = TextView(context)
|
||||
c.id = View.generateViewId()
|
||||
comment?.let { c.setText(it) }
|
||||
c.setTypeface(c.typeface, Typeface.ITALIC)
|
||||
}
|
||||
|
||||
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)
|
||||
val 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 = 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)
|
||||
|
||||
val c2 = TextView(context)
|
||||
c2.id = View.generateViewId()
|
||||
c2.setText(R.string.confirm)
|
||||
c2 = TextView(context)
|
||||
c2?.id = View.generateViewId()
|
||||
c2?.setText(R.string.confirm)
|
||||
c2?.visibility = isPasswordSet.not().toVisibility()
|
||||
layout.addView(c2)
|
||||
|
||||
val editText2 = EditText(context)
|
||||
editText2.id = View.generateViewId()
|
||||
editText2.inputType = InputType.TYPE_CLASS_TEXT
|
||||
editText2.maxLines = 1
|
||||
editText2.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
|
||||
editText2 = EditText(context)
|
||||
editText2?.id = View.generateViewId()
|
||||
editText2?.inputType = InputType.TYPE_CLASS_TEXT
|
||||
editText2?.maxLines = 1
|
||||
editText2?.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
|
||||
editText2?.visibility = isPasswordSet.not().toVisibility()
|
||||
layout.addView(editText2)
|
||||
|
||||
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) {
|
||||
sp.remove(preferenceId)
|
||||
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)
|
||||
}
|
||||
|
||||
override fun afterTextChanged(s: Editable) {}
|
||||
}
|
||||
editText.addTextChangedListener(watcher)
|
||||
editText2.addTextChangedListener(watcher)
|
||||
editText?.addTextChangedListener(watcher)
|
||||
editText2?.addTextChangedListener(watcher)
|
||||
}
|
||||
|
||||
fun preferenceId(preferenceId: Int): SWEditEncryptedPassword {
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
package info.nightscout.androidaps.setupwizard.elements
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.view.View
|
||||
import android.widget.LinearLayout
|
||||
import androidx.annotation.StringRes
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import dagger.android.HasAndroidInjector
|
||||
import info.nightscout.androidaps.events.EventPreferenceChange
|
||||
import info.nightscout.androidaps.logging.AAPSLogger
|
||||
import info.nightscout.androidaps.logging.LTag
|
||||
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
|
||||
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.sharedPreferences.SP
|
||||
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 resourceHelper: ResourceHelper
|
||||
@Inject lateinit var sp: SP
|
||||
@Inject lateinit var passwordCheck: PasswordCheck
|
||||
|
||||
private val eventWorker = Executors.newSingleThreadScheduledExecutor()
|
||||
private var scheduledEventPost: ScheduledFuture<*>? = null
|
||||
|
@ -33,6 +38,7 @@ open class SWItem(val injector: HasAndroidInjector, var type: Type) {
|
|||
|
||||
@Suppress("unused")
|
||||
enum class Type {
|
||||
|
||||
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()
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -133,7 +133,6 @@ class BolusWizard @Inject constructor(
|
|||
private var carbTime: Int = 0
|
||||
private var quickWizard: Boolean = true
|
||||
|
||||
@JvmOverloads
|
||||
fun doCalc(profile: Profile,
|
||||
profileName: String,
|
||||
tempTarget: TemporaryTarget?,
|
||||
|
|
|
@ -84,11 +84,9 @@ class QuickWizardEntry @Inject constructor(private val injector: HasAndroidInjec
|
|||
bg = lastBG.valueToUnits(profileFunction.getUnits())
|
||||
}
|
||||
// COB
|
||||
var cob = 0.0
|
||||
if (useCOB() == YES) {
|
||||
val cobInfo = iobCobCalculator.getCobInfo(_synchronized, "QuickWizard COB")
|
||||
if (cobInfo.displayCob != null) cob = cobInfo.displayCob!!
|
||||
}
|
||||
val cob =
|
||||
if (useCOB() == YES) iobCobCalculator.getCobInfo(_synchronized, "QuickWizard COB").displayCob ?: 0.0
|
||||
else 0.0
|
||||
// Bolus IOB
|
||||
var bolusIOB = false
|
||||
if (useBolusIOB() == YES) {
|
||||
|
@ -121,7 +119,7 @@ class QuickWizardEntry @Inject constructor(private val injector: HasAndroidInjec
|
|||
trend = true
|
||||
}
|
||||
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", "")
|
||||
|
|
|
@ -234,6 +234,51 @@
|
|||
|
||||
</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 -->
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
|
@ -279,7 +324,7 @@
|
|||
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Pump Type -->
|
||||
<!-- Pump Definition -->
|
||||
<View
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dip"
|
||||
|
|
|
@ -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_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_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_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>
|
||||
|
|
|
@ -98,7 +98,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
|
|||
val bgList: MutableList<GlucoseValue> = ArrayList()
|
||||
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`(autosensDataStore.lastBg()).thenReturn(reading)
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ abstract class Trigger(val injector: HasAndroidInjector) {
|
|||
@Inject lateinit var dateUtil: DateUtil
|
||||
|
||||
init {
|
||||
@Suppress("LeakingThis")
|
||||
injector.androidInjector().inject(this)
|
||||
}
|
||||
|
||||
|
@ -55,10 +56,7 @@ abstract class Trigger(val injector: HasAndroidInjector) {
|
|||
abstract fun icon(): Optional<Int?>
|
||||
abstract fun duplicate(): Trigger
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmStatic
|
||||
fun scanForActivity(cont: Context?): AppCompatActivity? {
|
||||
private fun scanForActivity(cont: Context?): AppCompatActivity? {
|
||||
return when (cont) {
|
||||
null -> null
|
||||
is AppCompatActivity -> cont
|
||||
|
@ -66,7 +64,6 @@ abstract class Trigger(val injector: HasAndroidInjector) {
|
|||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open fun generateDialog(root: LinearLayout) {
|
||||
val title = TextView(root.context)
|
||||
|
@ -80,26 +77,34 @@ abstract class Trigger(val injector: HasAndroidInjector) {
|
|||
.put("data", dataJSON())
|
||||
.toString()
|
||||
|
||||
fun instantiate(obj: JSONObject): Trigger? {
|
||||
fun instantiate(obj: JSONObject): Trigger {
|
||||
val type = obj.getString("type")
|
||||
val data = obj.getJSONObject("data")
|
||||
//val clazz = Class.forName(type).kotlin
|
||||
//return (clazz.primaryConstructor?.call(injector) as Trigger).fromJSON(data?.toString() ?: "")
|
||||
return when (type) {
|
||||
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.simpleName -> TriggerBg(injector).fromJSON(data.toString())
|
||||
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.simpleName -> TriggerBTDevice(injector).fromJSON(data.toString())
|
||||
TriggerBTDevice::class.java.simpleName -> TriggerBTDevice(injector).fromJSON(
|
||||
data.toString()
|
||||
)
|
||||
TriggerIob::class.java.name,
|
||||
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString())
|
||||
TriggerCOB::class.java.name,
|
||||
TriggerCOB::class.java.simpleName -> TriggerCOB(injector).fromJSON(data.toString())
|
||||
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.simpleName -> TriggerDelta(injector).fromJSON(data.toString())
|
||||
TriggerDummy::class.java.name,
|
||||
|
@ -107,21 +112,35 @@ abstract class Trigger(val injector: HasAndroidInjector) {
|
|||
TriggerIob::class.java.name,
|
||||
TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString())
|
||||
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.simpleName -> TriggerProfilePercent(injector).fromJSON(data.toString())
|
||||
TriggerProfilePercent::class.java.simpleName -> TriggerProfilePercent(injector).fromJSON(
|
||||
data.toString()
|
||||
)
|
||||
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.simpleName -> TriggerRecurringTime(injector).fromJSON(data.toString())
|
||||
TriggerRecurringTime::class.java.simpleName -> TriggerRecurringTime(injector).fromJSON(
|
||||
data.toString()
|
||||
)
|
||||
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.simpleName -> TriggerTime(injector).fromJSON(data.toString())
|
||||
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.simpleName -> TriggerWifiSsid(injector).fromJSON(data.toString())
|
||||
TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(
|
||||
data.toString()
|
||||
)
|
||||
else -> throw ClassNotFoundException(type)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ class TriggerCOBTest : TriggerTestBase() {
|
|||
|
||||
@Test fun shouldRunTest() {
|
||||
// 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)
|
||||
Assert.assertFalse(t.shouldRun())
|
||||
t = TriggerCOB(injector).setValue(6.0).comparator(Comparator.Compare.IS_EQUAL)
|
||||
|
@ -72,6 +72,6 @@ class TriggerCOBTest : TriggerTestBase() {
|
|||
}
|
||||
|
||||
fun generateCobInfo(): CobInfo {
|
||||
return CobInfo(6.0, 0.0)
|
||||
return CobInfo(0, 6.0, 0.0)
|
||||
}
|
||||
}
|
|
@ -768,7 +768,7 @@ public class ComboPlugin extends PumpPluginBase implements Pump, Constraints {
|
|||
pumpSync.syncTemporaryBasalWithPumpId(
|
||||
state.timestamp,
|
||||
state.tbrPercent,
|
||||
T.mins(state.tbrRemainingDuration).msecs(),
|
||||
T.Companion.mins(state.tbrRemainingDuration).msecs(),
|
||||
false,
|
||||
tbrType,
|
||||
// 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(
|
||||
now,
|
||||
0.0,
|
||||
T.mins(15).msecs(),
|
||||
T.Companion.mins(15).msecs(),
|
||||
false,
|
||||
PumpSync.TemporaryBasalType.PUMP_SUSPEND,
|
||||
// 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(
|
||||
now,
|
||||
state.tbrPercent,
|
||||
T.mins(state.tbrRemainingDuration).msecs(),
|
||||
T.Companion.mins(state.tbrRemainingDuration).msecs(),
|
||||
false,
|
||||
PumpSync.TemporaryBasalType.NORMAL,
|
||||
tbrId,
|
||||
|
@ -1140,7 +1140,7 @@ public class ComboPlugin extends PumpPluginBase implements Pump, Constraints {
|
|||
pumpSync.syncTemporaryBasalWithPumpId(
|
||||
now,
|
||||
state.tbrPercent,
|
||||
T.mins(state.tbrRemainingDuration).msecs(),
|
||||
T.Companion.mins(state.tbrRemainingDuration).msecs(),
|
||||
false,
|
||||
PumpSync.TemporaryBasalType.NORMAL,
|
||||
tbrId,
|
||||
|
|
|
@ -23,9 +23,6 @@ public class Constants {
|
|||
|
||||
public static final Integer notificationID = 556677;
|
||||
|
||||
public static final int hoursToKeepInDatabase = 72;
|
||||
public static final int daysToKeepHistoryInDatabase = 30;
|
||||
|
||||
// SMS COMMUNICATOR
|
||||
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;
|
||||
|
||||
//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]
|
||||
public static final long MINIMUM_FREE_SPACE = 200;
|
||||
|
@ -106,7 +103,7 @@ public class Constants {
|
|||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
public static final int OTP_ACCEPT_OLD_TOKENS_COUNT = 1;
|
||||
|
|
|
@ -20,8 +20,8 @@ class DetailedBolusInfo {
|
|||
|
||||
// Additional requesting parameters
|
||||
@JvmField var timestamp = System.currentTimeMillis()
|
||||
@JvmField var lastKnownBolusTime: Long = 0 // for SMB check
|
||||
@JvmField var deliverAtTheLatest: Long = 0 // SMB should be delivered within 1 min from this time
|
||||
var lastKnownBolusTime: Long = 0 // for SMB check
|
||||
var deliverAtTheLatest: Long = 0 // SMB should be delivered within 1 min from this time
|
||||
@Transient var context: Context? = null // context for progress dialog
|
||||
|
||||
// Prefilled info for storing to db
|
||||
|
|
|
@ -2,7 +2,7 @@ package info.nightscout.androidaps.data
|
|||
|
||||
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)
|
||||
// var generated : value doesn't correspond to real value with timestamp close to real BG
|
||||
|
|
|
@ -40,11 +40,7 @@ class BolusProgressDialog : DaggerDialogFragment() {
|
|||
private val disposable = CompositeDisposable()
|
||||
|
||||
companion object {
|
||||
|
||||
@JvmField
|
||||
var bolusEnded = false
|
||||
|
||||
@JvmField
|
||||
var stopPressed = false
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
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.resources.ResourceHelper
|
||||
|
||||
/** 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 {
|
||||
var cobStringResult = "--g"
|
||||
|
@ -15,4 +18,13 @@ class CobInfo(val displayCob: Double?, val futureCarbs: Double) {
|
|||
}
|
||||
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
|
||||
}
|
|
@ -58,10 +58,9 @@ class DateUtil @Inject constructor(private val context: Context) {
|
|||
* @param tz - tz to set to, if not specified uses local timezone
|
||||
* @return the iso-formatted date string
|
||||
*/
|
||||
@JvmOverloads
|
||||
fun toISOString(date: Long, format: String = FORMAT_DATE_ISO_OUT, tz: TimeZone = TimeZone.getTimeZone("UTC")): String {
|
||||
val f: DateFormat = SimpleDateFormat(format, Locale.getDefault())
|
||||
f.timeZone = tz
|
||||
fun toISOString(date: Long): String {
|
||||
val f: DateFormat = SimpleDateFormat(FORMAT_DATE_ISO_OUT, Locale.getDefault())
|
||||
f.timeZone = TimeZone.getTimeZone("UTC")
|
||||
return f.format(date)
|
||||
}
|
||||
|
||||
|
@ -119,7 +118,7 @@ class DateUtil @Inject constructor(private val context: Context) {
|
|||
return DateTime(mills).toString(DateTimeFormat.forPattern(format))
|
||||
}
|
||||
|
||||
private fun timeStringWithSeconds(mills: Long): String {
|
||||
fun timeStringWithSeconds(mills: Long): String {
|
||||
var format = "hh:mm:ssa"
|
||||
if (android.text.format.DateFormat.is24HourFormat(context)) {
|
||||
format = "HH:mm:ss"
|
||||
|
|
|
@ -27,7 +27,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun safeGetString(json: JSONObject?, fieldName: String): String? {
|
||||
var result: String? = null
|
||||
if (json != null && json.has(fieldName)) {
|
||||
|
@ -39,7 +38,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun safeGetString(json: JSONObject?, fieldName: String, defaultValue: String): String {
|
||||
var result = defaultValue
|
||||
if (json != null && json.has(fieldName)) {
|
||||
|
@ -51,7 +49,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun safeGetStringAllowNull(json: JSONObject?, fieldName: String, defaultValue: String?): String? {
|
||||
var result = defaultValue
|
||||
if (json != null && json.has(fieldName)) {
|
||||
|
@ -63,7 +60,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun safeGetDouble(json: JSONObject?, fieldName: String): Double {
|
||||
var result = 0.0
|
||||
if (json != null && json.has(fieldName)) {
|
||||
|
@ -97,7 +93,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun safeGetInt(json: JSONObject?, fieldName: String): Int =
|
||||
safeGetInt(json, fieldName, 0)
|
||||
|
||||
|
@ -123,7 +118,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun safeGetLong(json: JSONObject?, fieldName: String): Long {
|
||||
var result: Long = 0
|
||||
if (json != null && json.has(fieldName)) {
|
||||
|
@ -146,8 +140,6 @@ object JsonHelper {
|
|||
return result
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
fun safeGetBoolean(json: JSONObject?, fieldName: String, defaultValue: Boolean = false): Boolean {
|
||||
var result = defaultValue
|
||||
if (json != null && json.has(fieldName)) {
|
||||
|
|
|
@ -14,12 +14,12 @@ class T(val time: Long = 0L) {
|
|||
|
||||
companion object {
|
||||
|
||||
@JvmStatic fun now(): T = T(System.currentTimeMillis())
|
||||
@JvmStatic fun msecs(msec: Long): T = T(msec)
|
||||
@JvmStatic fun secs(sec: Long): T = T(sec * 1000L)
|
||||
@JvmStatic fun mins(min: Long): T = T(min * 60 * 1000L)
|
||||
@JvmStatic fun hours(hour: Long): T = T(hour * 60 * 60 * 1000L)
|
||||
@JvmStatic 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 now(): T = T(System.currentTimeMillis())
|
||||
fun msecs(msec: Long): T = T(msec)
|
||||
fun secs(sec: Long): T = T(sec * 1000L)
|
||||
fun mins(min: Long): T = T(min * 60 * 1000L)
|
||||
fun hours(hour: Long): T = T(hour * 60 * 60 * 1000L)
|
||||
fun days(day: Long): T = T(day * 24 * 60 * 60 * 1000L)
|
||||
fun months(month: Long): T = T(month * 31 * 24 * 60 * 60 * 1000L)
|
||||
}
|
||||
}
|
|
@ -55,12 +55,10 @@ object OKDialog {
|
|||
.setCanceledOnTouchOutside(false)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun showConfirmation(activity: FragmentActivity, message: String, ok: Runnable?) {
|
||||
showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun showConfirmation(activity: FragmentActivity, message: Spanned, ok: Runnable?) {
|
||||
showConfirmation(activity, activity.getString(R.string.confirmation), message, ok, null)
|
||||
}
|
||||
|
@ -153,15 +151,11 @@ object OKDialog {
|
|||
.setCanceledOnTouchOutside(false)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
fun showConfirmation(context: Context, message: String, ok: Runnable?, cancel: Runnable? = null) {
|
||||
showConfirmation(context, context.getString(R.string.confirmation), message, ok, cancel)
|
||||
}
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
fun showConfirmation(context: Context, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) {
|
||||
var okClicked = false
|
||||
AlertDialogHelper.Builder(context)
|
||||
|
@ -190,8 +184,6 @@ object OKDialog {
|
|||
}
|
||||
|
||||
@SuppressLint("InflateParams")
|
||||
@JvmStatic
|
||||
@JvmOverloads
|
||||
fun showConfirmation(context: Context, title: String, message: String, ok: DialogInterface.OnClickListener?, cancel: DialogInterface.OnClickListener? = null) {
|
||||
var okClicked = false
|
||||
AlertDialogHelper.Builder(context)
|
||||
|
|
|
@ -8,10 +8,13 @@ import android.widget.EditText
|
|||
import android.widget.TextView
|
||||
import androidx.annotation.StringRes
|
||||
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.ToastUtils
|
||||
import info.nightscout.androidaps.utils.alertDialogs.AlertDialogHelper
|
||||
import info.nightscout.androidaps.utils.sharedPreferences.SP
|
||||
import java.io.File
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
|
@ -20,8 +23,10 @@ const val AUTOFILL_HINT_NEW_PASSWORD = "newPassword"
|
|||
|
||||
@Singleton
|
||||
class PasswordCheck @Inject constructor(
|
||||
val sp: SP,
|
||||
private val cryptoUtil: CryptoUtil
|
||||
private val sp: SP,
|
||||
private val cryptoUtil: CryptoUtil,
|
||||
private val fileListProvider: PrefFileListProvider,
|
||||
private val activePlugin: ActivePlugin
|
||||
) {
|
||||
|
||||
/**
|
||||
|
@ -159,4 +164,18 @@ class PasswordCheck @Inject constructor(
|
|||
|
||||
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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -49,7 +49,6 @@ class ProtectionCheck @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
fun queryProtection(activity: FragmentActivity, protection: Protection,
|
||||
ok: Runnable?, cancel: Runnable? = null, fail: Runnable? = null) {
|
||||
when (ProtectionType.values()[sp.getInt(protectionTypeResourceIDs[protection.ordinal], ProtectionType.NONE.ordinal)]) {
|
||||
|
|
|
@ -144,7 +144,6 @@
|
|||
<string name="extended_bolus">Extended bolus</string>
|
||||
<string name="pump_time_updated">Pump time updated</string>
|
||||
<string name="exit">Exit</string>
|
||||
<string name="serial_number">Serial number</string>
|
||||
<string name="removerecord">Remove record</string>
|
||||
<string name="loopisdisabled">Loop is disabled</string>
|
||||
<string name="alarm">Alarm</string>
|
||||
|
|
|
@ -184,7 +184,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
|
|||
if (Math.abs(timeDiff) > 10) {
|
||||
waitForWholeMinute(); // Dana can set only whole minute
|
||||
// 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));
|
||||
timeDiff = (danaPump.getPumpTime() - System.currentTimeMillis()) / 1000L;
|
||||
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) {
|
||||
if (!isConnected()) return false;
|
||||
if (BolusProgressDialog.stopPressed) return false;
|
||||
if (BolusProgressDialog.Companion.getStopPressed()) return false;
|
||||
|
||||
danaPump.setBolusingTreatment(t);
|
||||
danaPump.setBolusDone(false);
|
||||
|
|
|
@ -181,7 +181,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
|
|||
double carbs = detailedBolusInfo.carbs;
|
||||
detailedBolusInfo.carbs = 0;
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
aapsLogger.debug(LTag.PUMP, "setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " minutes (doLowTemp || doHighTemp)");
|
||||
if (percentRate == 0 && durationInMinutes > 30) {
|
||||
|
@ -298,7 +298,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
|
|||
aapsLogger.debug(LTag.PUMP, "setTempBasalPercent: Correct value already set");
|
||||
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;
|
||||
if (durationInMinutes == 15 || durationInMinutes == 30) {
|
||||
connectionOK = sExecutionService.tempBasalShortDuration(percent, durationInMinutes);
|
||||
|
|
|
@ -203,7 +203,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
|
|||
} else {
|
||||
waitForWholeMinute(); // Dana can set only whole minute
|
||||
// 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));
|
||||
timeDiff = (danaPump.getPumpTime() - System.currentTimeMillis()) / 1000L;
|
||||
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) {
|
||||
if (!isConnected()) return false;
|
||||
if (BolusProgressDialog.stopPressed) return false;
|
||||
if (BolusProgressDialog.Companion.getStopPressed()) return false;
|
||||
|
||||
rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.startingbolus)));
|
||||
danaPump.setBolusingTreatment(t);
|
||||
|
@ -346,7 +346,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
|
|||
mSerialIOThread.sendMessage(msg);
|
||||
MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(injector, DanaPump.CARBS, carbtime, carbs, 0);
|
||||
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();
|
||||
|
@ -415,7 +415,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
|
|||
mSerialIOThread.sendMessage(msg);
|
||||
MsgSetHistoryEntry_v2 msgSetHistoryEntry_v2 = new MsgSetHistoryEntry_v2(injector, DanaPump.CARBS, time, amount, 0);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -439,7 +439,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
|
|||
}
|
||||
SystemClock.sleep(200);
|
||||
if (danaRv2Plugin.lastEventTimeLoaded != 0)
|
||||
danaPump.lastHistoryFetched = danaRv2Plugin.lastEventTimeLoaded - T.mins(1).msecs();
|
||||
danaPump.lastHistoryFetched = danaRv2Plugin.lastEventTimeLoaded - T.Companion.mins(1).msecs();
|
||||
else
|
||||
danaPump.lastHistoryFetched = 0;
|
||||
danaPump.setLastConnection(System.currentTimeMillis());
|
||||
|
|
|
@ -264,7 +264,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService {
|
|||
|
||||
public boolean bolus(double amount, int carbs, long carbTimeStamp, final EventOverviewBolusProgress.Treatment t) {
|
||||
if (!isConnected()) return false;
|
||||
if (BolusProgressDialog.stopPressed) return false;
|
||||
if (BolusProgressDialog.Companion.getStopPressed()) return false;
|
||||
|
||||
danaPump.setBolusingTreatment(t);
|
||||
danaPump.setBolusDone(false);
|
||||
|
|
|
@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector
|
|||
import info.nightscout.androidaps.logging.LTag
|
||||
import info.nightscout.androidaps.danars.encryption.BleEncryption
|
||||
|
||||
class DanaRSPacketHistoryBasal @JvmOverloads constructor(
|
||||
class DanaRSPacketHistoryBasal constructor(
|
||||
injector: HasAndroidInjector,
|
||||
from: Long = 0
|
||||
) : DanaRSPacketHistory(injector, from) {
|
||||
|
|
|
@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector
|
|||
import info.nightscout.androidaps.logging.LTag
|
||||
import info.nightscout.androidaps.danars.encryption.BleEncryption
|
||||
|
||||
class DanaRSPacketHistoryPrime @JvmOverloads constructor(
|
||||
class DanaRSPacketHistoryPrime constructor(
|
||||
injector: HasAndroidInjector,
|
||||
from: Long = 0
|
||||
) : DanaRSPacketHistory(injector, from) {
|
||||
|
|
|
@ -342,8 +342,8 @@ open class AppRepository @Inject internal constructor(
|
|||
fun deleteAllTherapyEventsEntries() =
|
||||
database.therapyEventDao.deleteAllEntries()
|
||||
|
||||
fun getLastTherapyRecord(type: TherapyEvent.Type): Single<ValueWrapper<TherapyEvent>> =
|
||||
database.therapyEventDao.getLastTherapyRecord(type).toWrappedSingle()
|
||||
fun getLastTherapyRecordUpToNow(type: TherapyEvent.Type): Single<ValueWrapper<TherapyEvent>> =
|
||||
database.therapyEventDao.getLastTherapyRecord(type, System.currentTimeMillis()).toWrappedSingle()
|
||||
.subscribeOn(Schedulers.io())
|
||||
|
||||
fun getTherapyEventByTimestamp(type: TherapyEvent.Type, timestamp: Long): TherapyEvent? =
|
||||
|
|
|
@ -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")
|
||||
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")
|
||||
fun getLastTherapyRecord(type: TherapyEvent.Type): Maybe<TherapyEvent>
|
||||
@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, now: Long): Maybe<TherapyEvent>
|
||||
|
||||
@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>>
|
||||
|
|
|
@ -11,5 +11,4 @@ var DBEntryWithTimeAndDuration.end
|
|||
require(duration > 0)
|
||||
}
|
||||
|
||||
@JvmOverloads
|
||||
fun DBEntryWithTimeAndDuration.getRemainingDuration(current: Long = System.currentTimeMillis()) = min(0L, end - current)
|
|
@ -590,7 +590,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
bolusingEvent.setPercent(0);
|
||||
rxBus.send(bolusingEvent);
|
||||
int trials = 0;
|
||||
Long now = dateUtil.now();
|
||||
long now = dateUtil.now();
|
||||
String serial = serialNumber();
|
||||
insightDbHelper.createOrUpdate( new InsightBolusID(
|
||||
now,
|
||||
|
@ -1183,8 +1183,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
for (InsightPumpID pumpID : pumpStartedEvents) {
|
||||
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
|
||||
InsightPumpID pauseEvent = insightDbHelper.getPumpStoppedEvent(pumpID.getPumpSerial(), stoppedEvent.getTimestamp() - T.mins(1).msecs());
|
||||
if (pauseEvent != null && pauseEvent.getEventType().equals(EventType.PumpPaused) && (stoppedEvent.getTimestamp() - pauseEvent.getTimestamp() < T.mins(16).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.Companion.mins(16).msecs())) {
|
||||
stoppedEvent = pauseEvent;
|
||||
stoppedEvent.setEventType(EventType.PumpStopped);
|
||||
}
|
||||
|
@ -1343,7 +1343,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
event.getEventPosition()));
|
||||
temporaryBasals.add(new TemporaryBasal(
|
||||
timestamp,
|
||||
T.mins(event.getDuration()).msecs(),
|
||||
T.Companion.mins(event.getDuration()).msecs(),
|
||||
event.getAmount(),
|
||||
false,
|
||||
PumpSync.TemporaryBasalType.NORMAL,
|
||||
|
@ -1406,7 +1406,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements Pump, Constrai
|
|||
pumpSync.syncExtendedBolusWithPumpId(
|
||||
bolusID.getTimestamp(),
|
||||
event.getExtendedAmount(),
|
||||
T.mins(event.getDuration()).msecs(),
|
||||
T.Companion.mins(event.getDuration()).msecs(),
|
||||
isFakingTempsByExtendedBoluses(),
|
||||
bolusID.getId(),
|
||||
PumpType.ACCU_CHEK_INSIGHT,
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:textColor="#FFFFFF"
|
||||
android:textSize="16sp"
|
||||
android:text="@string/serial_number" />
|
||||
android:text="@string/serialnumber" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/serial_number"
|
||||
|
|
|
@ -27,7 +27,6 @@ enum class CGMSHistoryEntryType(val code: Int, val description: String, val head
|
|||
|
||||
private val opCodeMap: MutableMap<Int, CGMSHistoryEntryType> = mutableMapOf()
|
||||
|
||||
@JvmStatic
|
||||
fun getByCode(opCode: Int): CGMSHistoryEntryType {
|
||||
return if (opCodeMap.containsKey(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 dateType: DateType
|
||||
|
||||
|
|
|
@ -300,7 +300,6 @@ class BasalProfile {
|
|||
return if (b < 0) b + 256 else b.toInt()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getProfilesByHourToString(data: DoubleArray): String {
|
||||
val stringBuilder = StringBuilder()
|
||||
for (value in data) {
|
||||
|
@ -310,7 +309,6 @@ class BasalProfile {
|
|||
return stringBuilder.toString()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun isBasalProfileByHourUndefined(basalByHour: DoubleArray): Boolean {
|
||||
for (i in 0..23) {
|
||||
if (basalByHour[i] > 0.0) {
|
||||
|
|
|
@ -148,7 +148,6 @@ enum class MedtronicCommandType(
|
|||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getSettings(medtronicPumpModel: MedtronicDeviceType): MedtronicCommandType {
|
||||
return if (isSameDevice(medtronicPumpModel, MedtronicDeviceType.Medtronic_512_712))
|
||||
Settings_512
|
||||
|
|
|
@ -39,7 +39,6 @@ enum class MedtronicDeviceType {
|
|||
companion object {
|
||||
var mapByDescription: MutableMap<String, MedtronicDeviceType> = mutableMapOf()
|
||||
|
||||
@JvmStatic
|
||||
fun isSameDevice(deviceWeCheck: MedtronicDeviceType, deviceSources: MedtronicDeviceType): Boolean {
|
||||
if (deviceSources.isFamily) {
|
||||
for (mdt in deviceSources.familyMembers!!) {
|
||||
|
|
|
@ -10,14 +10,14 @@ object MedtronicConst {
|
|||
const val Prefix = "AAPS.Medtronic."
|
||||
|
||||
object Prefs {
|
||||
@JvmField val PumpSerial = R.string.key_medtronic_serial
|
||||
@JvmField val PumpType = R.string.key_medtronic_pump_type
|
||||
@JvmField val PumpFrequency = R.string.key_medtronic_frequency
|
||||
@JvmField val MaxBolus = R.string.key_medtronic_max_bolus
|
||||
@JvmField val MaxBasal = R.string.key_medtronic_max_basal
|
||||
@JvmField val BolusDelay = R.string.key_medtronic_bolus_delay
|
||||
@JvmField val Encoding = R.string.key_medtronic_encoding
|
||||
@JvmField val BatteryType = R.string.key_medtronic_battery_type
|
||||
val PumpSerial = R.string.key_medtronic_serial
|
||||
val PumpType = R.string.key_medtronic_pump_type
|
||||
val PumpFrequency = R.string.key_medtronic_frequency
|
||||
val MaxBolus = R.string.key_medtronic_max_bolus
|
||||
val MaxBasal = R.string.key_medtronic_max_basal
|
||||
val BolusDelay = R.string.key_medtronic_bolus_delay
|
||||
val Encoding = R.string.key_medtronic_encoding
|
||||
val BatteryType = R.string.key_medtronic_battery_type
|
||||
val BolusDebugEnabled = R.string.key_medtronic_bolus_debug
|
||||
}
|
||||
|
||||
|
|
|
@ -257,7 +257,6 @@ class MedtronicUtil @Inject constructor(
|
|||
return b2 and 0xff shl 8 or b1 and 0xff
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getByteArrayFromUnsignedShort(shortValue: Int, returnFixedSize: Boolean): ByteArray {
|
||||
val highByte = (shortValue shr 8 and 0xFF).toByte()
|
||||
val lowByte = (shortValue and 0xFF).toByte()
|
||||
|
@ -272,7 +271,6 @@ class MedtronicUtil @Inject constructor(
|
|||
return data
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun createByteArray(data: List<Byte>): ByteArray {
|
||||
val array = ByteArray(data.size)
|
||||
for (i in data.indices) {
|
||||
|
@ -304,7 +302,6 @@ class MedtronicUtil @Inject constructor(
|
|||
return strokes
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun isSame(d1: Double, d2: Double): Boolean {
|
||||
val diff = d1 - d2
|
||||
return Math.abs(diff) <= 0.000001
|
||||
|
|
|
@ -678,7 +678,7 @@ public class OmnipodErosPumpPlugin extends PumpPluginBase implements Pump, Riley
|
|||
|
||||
if (tbrCurrent != null) {
|
||||
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) {
|
||||
|
|
|
@ -93,7 +93,6 @@ public class AapsOmnipodErosManager {
|
|||
private final RxBusWrapper rxBus;
|
||||
private final ResourceHelper resourceHelper;
|
||||
private final HasAndroidInjector injector;
|
||||
private final ActivePlugin activePlugin;
|
||||
private final SP sp;
|
||||
private final OmnipodManager delegate;
|
||||
private final OmnipodAlertUtil omnipodAlertUtil;
|
||||
|
@ -125,7 +124,6 @@ public class AapsOmnipodErosManager {
|
|||
SP sp,
|
||||
ResourceHelper resourceHelper,
|
||||
HasAndroidInjector injector,
|
||||
ActivePlugin activePlugin,
|
||||
OmnipodAlertUtil omnipodAlertUtil,
|
||||
Context context,
|
||||
PumpSync pumpSync) {
|
||||
|
@ -137,7 +135,6 @@ public class AapsOmnipodErosManager {
|
|||
this.sp = sp;
|
||||
this.resourceHelper = resourceHelper;
|
||||
this.injector = injector;
|
||||
this.activePlugin = activePlugin;
|
||||
this.omnipodAlertUtil = omnipodAlertUtil;
|
||||
this.context = context;
|
||||
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 :
|
||||
(estimatedUnitsDelivered, percentage) -> {
|
||||
EventOverviewBolusProgress progressUpdateEvent = EventOverviewBolusProgress.INSTANCE;
|
||||
progressUpdateEvent.setStatus(getStringResource(R.string.bolusdelivering, detailedBolusInfo.insulin));
|
||||
progressUpdateEvent.setStatus(getStringResource(R.string.goingtodeliver, detailedBolusInfo.insulin));
|
||||
progressUpdateEvent.setPercent(percentage);
|
||||
sendEvent(progressUpdateEvent);
|
||||
}));
|
||||
|
@ -779,7 +776,6 @@ public class AapsOmnipodErosManager {
|
|||
|
||||
// Cancels current TBR and adds a new TBR for the remaining duration
|
||||
private void splitActiveTbr() {
|
||||
PumpSync.PumpState pumpState = pumpSync.expectedPumpState();
|
||||
PumpSync.PumpState.TemporaryBasal previouslyRunningTempBasal = pumpSync.expectedPumpState().getTemporaryBasal();
|
||||
if (previouslyRunningTempBasal != null) {
|
||||
// Cancel the previously running TBR and start a NEW TBR here for the remaining duration,
|
||||
|
@ -810,7 +806,7 @@ public class AapsOmnipodErosManager {
|
|||
pumpSync.syncTemporaryBasalWithPumpId(
|
||||
time,
|
||||
tempBasalPair.getInsulinRate(),
|
||||
T.mins(tempBasalPair.getDurationMinutes()).msecs(),
|
||||
T.Companion.mins(tempBasalPair.getDurationMinutes()).msecs(),
|
||||
true,
|
||||
PumpSync.TemporaryBasalType.NORMAL,
|
||||
pumpId,
|
||||
|
|
|
@ -146,7 +146,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
|
|||
|
||||
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);
|
||||
historyTypeSpinner.setAdapter(spinnerAdapter);
|
||||
|
@ -306,7 +306,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
|
|||
|
||||
try {
|
||||
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) {
|
||||
aapsLogger.error(LTag.PUMP, "Problem parsing Profile json. Ex: {}, Data:\n{}", e.getMessage(), data);
|
||||
valueView.setText("");
|
||||
|
@ -321,7 +321,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
|
|||
|
||||
|
||||
@Override
|
||||
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
|
||||
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
|
||||
super.onAttachedToRecyclerView(recyclerView);
|
||||
}
|
||||
|
||||
|
|
|
@ -63,10 +63,10 @@ abstract class PumpPluginAbstract protected constructor(
|
|||
final override var pumpDescription = PumpDescription()
|
||||
//protected set
|
||||
|
||||
@JvmField protected var serviceConnection: ServiceConnection? = null
|
||||
@JvmField protected var serviceRunning = false
|
||||
@JvmField protected var pumpState = PumpDriverState.NotInitialized
|
||||
@JvmField protected var displayConnectionMessages = false
|
||||
protected var serviceConnection: ServiceConnection? = null
|
||||
protected var serviceRunning = false
|
||||
protected var pumpState = PumpDriverState.NotInitialized
|
||||
protected var displayConnectionMessages = false
|
||||
|
||||
var pumpType: PumpType = PumpType.GENERIC_AAPS
|
||||
get() = field
|
||||
|
|
|
@ -43,7 +43,6 @@ enum class PumpHistoryEntryGroup(val resourceId: Int) {
|
|||
}
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getTranslatedList(resourceHelper: ResourceHelper): List<PumpHistoryEntryGroup> {
|
||||
if (translatedList == null) doTranslation(resourceHelper)
|
||||
return translatedList!!
|
||||
|
|
|
@ -19,7 +19,6 @@ object ProfileUtil {
|
|||
return if (stringBuilder.length > 3) stringBuilder.substring(0, stringBuilder.length - 2) else stringBuilder.toString()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getBasalProfilesDisplayable(profiles: Array<ProfileValue>, pumpType: PumpType): String {
|
||||
val stringBuilder = StringBuilder()
|
||||
for (basalValue in profiles) {
|
||||
|
@ -32,7 +31,6 @@ object ProfileUtil {
|
|||
return if (stringBuilder.length > 3) stringBuilder.substring(0, stringBuilder.length - 2) else stringBuilder.toString()
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun getBasalProfilesDisplayableAsStringOfArray(profile: Profile, pumpType: PumpType): String? {
|
||||
val stringBuilder = java.lang.StringBuilder()
|
||||
// for (basalValue in profiles) {
|
||||
|
|
Loading…
Reference in a new issue