This commit is contained in:
Andrei Vereha 2021-09-20 18:32:52 +02:00
commit 09675de3f1
60 changed files with 327 additions and 210 deletions

View file

@ -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>

View file

@ -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() + '"'

View file

@ -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() {

View file

@ -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

View file

@ -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))
}

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

@ -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 {

View file

@ -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 -> {

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.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

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) {
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)

View file

@ -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()

View file

@ -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)
}

View file

@ -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) {

View file

@ -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()
}
}

View file

@ -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)

View file

@ -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)
layout.addView(l)
val c = TextView(context)
c.id = View.generateViewId()
comment?.let { c.setText(it) }
c.setTypeface(c.typeface, Typeface.ITALIC)
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
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)
}
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)
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 {

View file

@ -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
}
}
}

View file

@ -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?,

View file

@ -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", "")

View file

@ -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"

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_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>

View file

@ -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)

View file

@ -43,6 +43,7 @@ abstract class Trigger(val injector: HasAndroidInjector) {
@Inject lateinit var dateUtil: DateUtil
init {
@Suppress("LeakingThis")
injector.androidInjector().inject(this)
}
@ -55,16 +56,12 @@ abstract class Trigger(val injector: HasAndroidInjector) {
abstract fun icon(): Optional<Int?>
abstract fun duplicate(): Trigger
companion object {
@JvmStatic
fun scanForActivity(cont: Context?): AppCompatActivity? {
return when (cont) {
null -> null
is AppCompatActivity -> cont
is ContextWrapper -> scanForActivity(cont.baseContext)
else -> null
}
private fun scanForActivity(cont: Context?): AppCompatActivity? {
return when (cont) {
null -> null
is AppCompatActivity -> cont
is ContextWrapper -> scanForActivity(cont.baseContext)
else -> null
}
}
@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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,

View file

@ -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;

View file

@ -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

View file

@ -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

View file

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

View file

@ -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
}

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
* @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"

View file

@ -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)) {

View file

@ -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)
}
}

View file

@ -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)

View file

@ -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))
}
}
}

View file

@ -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)]) {

View file

@ -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>

View file

@ -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);

View file

@ -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);

View file

@ -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());

View file

@ -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);

View file

@ -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) {

View file

@ -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) {

View file

@ -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? =

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")
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>>

View file

@ -11,5 +11,4 @@ var DBEntryWithTimeAndDuration.end
require(duration > 0)
}
@JvmOverloads
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);
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,

View file

@ -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"

View file

@ -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

View file

@ -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) {

View file

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

View file

@ -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!!) {

View file

@ -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
}

View file

@ -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

View file

@ -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) {

View file

@ -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,

View file

@ -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);
}

View file

@ -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

View file

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

View file

@ -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) {