From 7934851bf65787d21266e9c1743f6a705ec3e740 Mon Sep 17 00:00:00 2001 From: jungsomyeong Date: Fri, 4 Mar 2022 17:46:56 +0900 Subject: [PATCH] Eliminate warnings and fix bug --- app/build.gradle | 4 + app/libs/eopatch_core.aar | Bin 122017 -> 91070 bytes app/src/main/res/values/arrays.xml | 1 + .../plugins/pump/common/defs/PumpType.kt | 1 + eopatch/build.gradle | 14 +- eopatch/libs/eopatch_core.aar | Bin 122017 -> 91070 bytes eopatch/src/main/AndroidManifest.xml | 1 - .../plugins/pump/eopatch/AppConstant.kt | 86 ++------ .../plugins/pump/eopatch/CommonUtils.kt | 121 ++-------- .../plugins/pump/eopatch/EopatchPumpPlugin.kt | 137 ++++++------ .../plugins/pump/eopatch/FloatFormatters.kt | 18 +- .../plugins/pump/eopatch/OsAlarmService.java | 4 - .../plugins/pump/eopatch/RxAction.kt | 74 +------ .../plugins/pump/eopatch/alarm/AlarmCode.kt | 83 +++---- .../pump/eopatch/alarm/AlarmManager.kt | 47 ++-- .../pump/eopatch/alarm/AlarmProcess.kt | 28 +-- .../pump/eopatch/alarm/AlarmRegistry.kt | 40 ++-- .../bindingadapters/OnSafeClickListener.kt | 2 +- .../pump/eopatch/ble/IPatchManager.java | 12 +- .../pump/eopatch/ble/PatchManager.java | 85 +++---- .../pump/eopatch/ble/PatchManagerImpl.java | 167 +++++--------- .../pump/eopatch/ble/PatchStateManager.java | 5 +- .../pump/eopatch/ble/PreferenceManager.kt | 15 +- .../pump/eopatch/ble/task/ActivateTask.java | 11 +- .../pump/eopatch/ble/task/BolusTask.java | 48 ++-- .../pump/eopatch/ble/task/DeactivateTask.java | 32 +-- .../pump/eopatch/ble/task/FetchAlarmTask.java | 14 +- .../eopatch/ble/task/GetPatchInfoTask.java | 31 ++- .../eopatch/ble/task/InfoReminderTask.java | 8 +- .../ble/task/InternalSuspendedTask.java | 95 ++------ .../eopatch/ble/task/NeedleSensingTask.java | 6 +- .../pump/eopatch/ble/task/PauseBasalTask.java | 104 ++------- .../pump/eopatch/ble/task/PrimingTask.java | 15 +- .../ble/task/ReadBolusFinishTimeTask.java | 5 +- .../ble/task/ReadTempBasalFinishTimeTask.java | 5 +- .../eopatch/ble/task/ResumeBasalTask.java | 25 +-- .../pump/eopatch/ble/task/SelfTestTask.java | 31 +-- .../eopatch/ble/task/SetGlobalTimeTask.java | 12 +- .../eopatch/ble/task/SetLowReservoirTask.java | 8 +- .../pump/eopatch/ble/task/StartBondTask.java | 7 +- .../eopatch/ble/task/StartCalcBolusTask.java | 32 +-- .../ble/task/StartNormalBasalTask.java | 19 +- .../eopatch/ble/task/StartQuickBolusTask.java | 9 +- .../eopatch/ble/task/StartTempBasalTask.java | 9 +- .../pump/eopatch/ble/task/StopBasalTask.java | 16 +- .../eopatch/ble/task/StopComboBolusTask.java | 5 +- .../eopatch/ble/task/StopExtBolusTask.java | 6 +- .../eopatch/ble/task/StopNowBolusTask.java | 6 +- .../eopatch/ble/task/StopTempBasalTask.java | 5 +- .../ble/task/SyncBasalHistoryTask.java | 24 +- .../pump/eopatch/ble/task/TaskQueue.java | 16 +- .../ble/task/UpdateConnectionTask.java | 6 +- .../pump/eopatch/code/AlarmCategory.kt | 47 +--- .../plugins/pump/eopatch/code/AlarmSource.kt | 66 ------ .../plugins/pump/eopatch/code/BasalStatus.kt | 9 - .../plugins/pump/eopatch/code/BgUnit.kt | 37 ---- .../pump/eopatch/code/BolusExDuration.kt | 27 +-- .../pump/eopatch/code/DeactivationStatus.kt | 14 +- .../plugins/pump/eopatch/code/Dummy.kt | 5 - .../plugins/pump/eopatch/code/EventType.kt | 11 +- .../pump/eopatch/code/PatchExpireAlertTime.kt | 26 +-- .../pump/eopatch/code/PatchLifecycle.kt | 13 +- .../plugins/pump/eopatch/code/PatchStep.kt | 3 - .../plugins/pump/eopatch/code/SettingKeys.kt | 2 +- .../pump/eopatch/code/UnitOrPercent.kt | 50 +---- .../eopatch/dagger/EopatchInjectHelpers.kt | 5 - .../pump/eopatch/dagger/EopatchModule.kt | 1 - .../pump/eopatch/dagger/EopatchPrefModule.kt | 10 +- .../pump/eopatch/event/EoPatchEvents.kt | 2 +- .../extension/AppCompatActivityExtension.kt | 43 ---- .../pump/eopatch/extension/FloatExtension.kt | 10 +- .../pump/eopatch/extension/LongExtension.kt | 27 --- .../pump/eopatch/extension/SingleExtension.kt | 2 - .../pump/eopatch/extension/StringExtension.kt | 26 --- .../eopatch/extension/TextViewExtension.kt | 20 -- .../pump/eopatch/ui/AlarmHelperActivity.kt | 10 +- .../pump/eopatch/ui/DialogHelperActivity.kt | 4 - .../plugins/pump/eopatch/ui/EoBaseActivity.kt | 43 +--- .../plugins/pump/eopatch/ui/EoBaseFragment.kt | 8 - .../pump/eopatch/ui/EoBaseNavigator.kt | 7 - .../pump/eopatch/ui/EopatchActivity.kt | 172 ++++++++------- .../eopatch/ui/EopatchConnectNewFragment.kt | 14 +- .../eopatch/ui/EopatchOverviewFragment.kt | 116 +++++----- .../eopatch/ui/EopatchRotateKnobFragment.kt | 6 +- .../eopatch/ui/EopatchSafetyCheckFragment.kt | 8 +- .../ui/dialogs/ActivationNotCompleteDialog.kt | 2 - .../pump/eopatch/ui/dialogs/AlarmDialog.kt | 9 +- .../pump/eopatch/ui/dialogs/CommonDialog.kt | 4 +- .../ui/dialogs/ProgressDialogHelper.kt | 61 +++++ .../pump/eopatch/ui/event/SingleLiveEvent.kt | 5 +- .../ui/receiver/RxBroadcastReceiver.kt | 4 +- .../eopatch/ui/viewmodel/EoBaseViewModel.kt | 7 - .../ui/viewmodel/EopatchOverviewViewModel.kt | 23 +- .../eopatch/ui/viewmodel/EopatchViewModel.kt | 73 ++---- .../eopatch/ui/viewmodel/ViewModelFactory.kt | 1 + .../pump/eopatch/vo/ActivityResultEvent.kt | 9 - .../plugins/pump/eopatch/vo/Alarms.kt | 61 +++-- .../plugins/pump/eopatch/vo/BasalSegment.kt | 8 +- .../plugins/pump/eopatch/vo/BolusCurrent.kt | 13 -- .../plugins/pump/eopatch/vo/IPreference.kt | 4 +- .../plugins/pump/eopatch/vo/NormalBasal.kt | 69 ++---- .../pump/eopatch/vo/NormalBasalManager.kt | 40 ++-- .../plugins/pump/eopatch/vo/PatchConfig.kt | 18 +- .../pump/eopatch/vo/PatchLifecycleEvent.kt | 14 +- .../plugins/pump/eopatch/vo/PatchState.kt | 208 +++--------------- .../plugins/pump/eopatch/vo/Segment.kt | 30 --- .../plugins/pump/eopatch/vo/SegmentEntity.kt | 50 +---- .../plugins/pump/eopatch/vo/SegmentsEntity.kt | 195 +--------------- .../plugins/pump/eopatch/vo/TempBasal.kt | 39 +--- .../pump/eopatch/vo/TempBasalManager.kt | 40 +--- .../src/main/res/layout/activity_eopatch.xml | 19 +- .../fragment_eopatch_basal_schedule.xml | 8 +- .../layout/fragment_eopatch_connect_new.xml | 11 +- .../res/layout/fragment_eopatch_overview.xml | 8 +- .../res/layout/fragment_eopatch_remove.xml | 3 +- .../fragment_eopatch_remove_needle_cap.xml | 31 +-- ...ragment_eopatch_remove_protection_tape.xml | 16 +- .../layout/fragment_eopatch_rotate_knob.xml | 39 +--- .../fragment_eopatch_safe_deativation.xml | 20 +- .../layout/fragment_eopatch_safety_check.xml | 14 +- .../fragment_eopatch_turning_off_alarm.xml | 17 +- .../res/layout/fragment_eopatch_wake_up.xml | 40 +--- eopatch/src/main/res/values-ko/strings.xml | 6 +- eopatch/src/main/res/values/arrays.xml | 4 +- eopatch/src/main/res/values/strings.xml | 6 +- eopatch/src/main/res/xml/pref_eopatch.xml | 6 +- 126 files changed, 969 insertions(+), 2665 deletions(-) delete mode 100644 eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmSource.kt delete mode 100644 eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BgUnit.kt delete mode 100644 eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/Dummy.kt delete mode 100644 eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/TextViewExtension.kt create mode 100644 eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ProgressDialogHelper.kt delete mode 100644 eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/ActivityResultEvent.kt diff --git a/app/build.gradle b/app/build.gradle index 928faf6625..f8b150939a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -163,6 +163,10 @@ android { } useLibrary "org.apache.http.legacy" + + dataBinding { //Deleting it causes a binding error + enabled = true + } } allprojects { diff --git a/app/libs/eopatch_core.aar b/app/libs/eopatch_core.aar index 1a8aafe38ff2b48d61af97bb393395ce9ebea2d9..837d402724ff2a0eb66e7b9cf97368417d63fb71 100644 GIT binary patch literal 91070 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

D>#bDg&dMdBYhbeqj%?kOijo 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 z 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 literal 122017 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ⅇ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 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 0453fe87bb..2c80dd65f7 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -105,6 +105,7 @@ DanaRv2 DanaI Diaconn G8 + Eoflow Eopatch2 Medtronic 512/712 Medtronic 515/715 Medtronic 522/722 diff --git a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.kt b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.kt index 3c90148a1a..fd24cf070d 100644 --- a/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.kt +++ b/core/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.kt @@ -330,6 +330,7 @@ enum class PumpType { baseBasalStep = 0.05, baseBasalSpecialSteps = null, pumpCapability = PumpCapability.EopatchCapabilities, + isPatchPump = true, source = Sources.EOPatch2); val description: String diff --git a/eopatch/build.gradle b/eopatch/build.gradle index 2dd1ac5ed3..b60889cbcd 100644 --- a/eopatch/build.gradle +++ b/eopatch/build.gradle @@ -26,20 +26,12 @@ allprojects { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation (name: 'eopatch_core', ext: 'aar') +// implementation (files("libs/eopatch_core.aar")) implementation project(':core') implementation project(':shared') implementation project(':database') - implementation 'androidx.core:core-ktx:1.6.0' - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'androidx.legacy:legacy-support-v4:1.0.0' - - // RxJava - implementation "io.reactivex.rxjava2:rxjava:$rxjava_version" - implementation "io.reactivex.rxjava2:rxkotlin:$rxkotlin_version" - implementation "io.reactivex.rxjava2:rxandroid:$rxandroid_version" - //RxAndroidBle - implementation "com.polidea.rxandroidble2:rxandroidble:$rxandroidble_version" - implementation "com.jakewharton.rx2:replaying-share:$replayshare_version" + implementation "com.polidea.rxandroidble2:rxandroidble:1.12.1" + implementation "com.jakewharton.rx2:replaying-share:2.2.0" } \ No newline at end of file diff --git a/eopatch/libs/eopatch_core.aar b/eopatch/libs/eopatch_core.aar index 1a8aafe38ff2b48d61af97bb393395ce9ebea2d9..837d402724ff2a0eb66e7b9cf97368417d63fb71 100644 GIT binary patch literal 91070 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

D>#bDg&dMdBYhbeqj%?kOijo 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 z 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 literal 122017 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ⅇ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 diff --git a/eopatch/src/main/AndroidManifest.xml b/eopatch/src/main/AndroidManifest.xml index bd032c2f01..b41d2247be 100644 --- a/eopatch/src/main/AndroidManifest.xml +++ b/eopatch/src/main/AndroidManifest.xml @@ -3,7 +3,6 @@ package="info.nightscout.androidaps.plugins.pump.eopatch"> - diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/AppConstant.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/AppConstant.kt index c12f177563..81087620ef 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/AppConstant.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/AppConstant.kt @@ -1,87 +1,29 @@ package info.nightscout.androidaps.plugins.pump.eopatch -import java.util.concurrent.TimeUnit - interface AppConstant { companion object { + const val BASAL_MIN_AMOUNT = 0.05f - val BASAL_MIN_AMOUNT = 0.05f - val CLICK_THROTTLE = 600L + const val INSULIN_UNIT_P = 0.05f - /** - * Bluetooth Connection State - */ - val BT_STATE_NOT_CONNECT = 1 - val BT_STATE_CONNECTED = 2 + const val INSULIN_UNIT_STEP_U = INSULIN_UNIT_P + const val OFF = 0 + const val ON = 1 - val INSULIN_DECIMAL_PLACE_VAR = 100f // 10.f; 소수점자리수 계산상수 (100.f 는 두자리) + const val PUMP_DURATION_MILLI = 4 * 1000L - // 패치 1P = 1 cycle = 0.1U - const val INSULIN_UNIT_P = 0.05f // 최소 주입 단위 + const val BASAL_RATE_PER_HOUR_MIN = BASAL_MIN_AMOUNT - val INSULIN_UNIT_MIN_U = 0f - val INSULIN_UNIT_STEP_U = INSULIN_UNIT_P + const val SEGMENT_MAX_SIZE_48 = 48 + const val SEGMENT_COUNT_MAX = SEGMENT_MAX_SIZE_48 - /** - * On/Off - */ - val OFF = 0 - val ON = 1 + const val BOLUS_ACTIVE_EXTENDED_WAIT = 0x2 - /** - * Pump Duration, Interval - */ - val PUMP_DURATION_MILLI = TimeUnit.SECONDS.toMillis(4) // 15; - val PUMP_RESOLUTION = INSULIN_UNIT_P - - /** - * Basal - */ - val BASAL_RATE_PER_HOUR_MIN = BASAL_MIN_AMOUNT - val BASAL_RATE_PER_HOUR_STEP = INSULIN_UNIT_STEP_U - val BASAL_RATE_PER_HOUR_MAX = 15.0f // 30.0f; 30.00U/hr - - val SEGMENT_MAX_SIZE_48 = 48 - val SEGMENT_MAX_SIZE = SEGMENT_MAX_SIZE_48 - - val SEGMENT_COUNT_MAX = SEGMENT_MAX_SIZE_48 - - /** - * Bolus - */ - val BOLUS_NORMAL_ID = 0x1 - val BOLUS_EXTENDED_ID = 0x2 - - val BOLUS_ACTIVE_OFF = OFF - val BOLUS_ACTIVE_NORMAL = 0x01 - val BOLUS_ACTIVE_EXTENDED_WAIT = 0x2 - val BOLUS_ACTIVE_EXTENDED = 0x04 - val BOLUS_ACTIVE_DISCONNECTED = 0x08 - - val BOLUS_UNIT_MIN = BASAL_MIN_AMOUNT - val BOLUS_UNIT_STEP = INSULIN_UNIT_STEP_U - val BOLUS_UNIT_MAX = 25.0f // 30.0f; - val BOLUS_DELIVER_MIN = 0.0f - - - - /* Wizard */ - val WIZARD_STEP_MAX = 24 - - val INFO_REMINDER_DEFAULT_VALUE = 1 - - - val DAY_START_MINUTE = 0 * 60 - val DAY_END_MINUTE = 24 * 60 - - - val SNOOZE_INTERVAL_STEP = 5 - - /* Insulin Duration */ - val INSULIN_DURATION_MIN = 2.0f - val INSULIN_DURATION_MAX = 8.0f - val INSULIN_DURATION_STEP = 0.5f + const val BOLUS_UNIT_STEP = INSULIN_UNIT_STEP_U + const val DAY_START_MINUTE = 0 * 60 + const val DAY_END_MINUTE = 24 * 60 + const val INSULIN_DURATION_MIN = 2.0f } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/CommonUtils.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/CommonUtils.kt index f2d9c2fb5b..2780825ed7 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/CommonUtils.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/CommonUtils.kt @@ -1,37 +1,23 @@ package info.nightscout.androidaps.plugins.pump.eopatch - -import android.content.Context -import info.nightscout.androidaps.plugins.pump.common.utils.DateTimeUtil import io.reactivex.disposables.Disposable import java.util.* -import java.util.function.Function +import kotlin.math.abs +import kotlin.math.min object CommonUtils { - val TO_INT = Function { it.toInt() } - val TO_FLOAT = Function { it.toFloat() } - val TO_STRING = Function { it.toString() } - val TO_CLOCK = Function{ num -> String.format(Locale.US, "%d:%02d", num.toInt() / 60, num.toInt() % 60) } - - @JvmStatic fun dispose(vararg disposable: Disposable?) { + fun dispose(vararg disposable: Disposable?) { for (d in disposable){ d?.let { - if (!it.isDisposed()) { + if (!it.isDisposed) { it.dispose() } } } } - @JvmStatic fun nullSafe(ch: CharSequence?): String { - if (ch == null) - return "" - val str = ch.toString() - return str - } - - @JvmStatic fun hasText(str: CharSequence?): Boolean { - if (str == null || str.length == 0) { + fun hasText(str: CharSequence?): Boolean { + if (str == null || str.isEmpty()) { return false } val strLen = str.length @@ -43,12 +29,12 @@ object CommonUtils { return false } - @JvmStatic fun hasText(str: String?): Boolean { + fun hasText(str: String?): Boolean { return str?.let{hasText(it as CharSequence)}?:false } - @JvmStatic fun isStringEmpty(cs: CharSequence?): Boolean { - return cs == null || cs.length == 0 + fun isStringEmpty(cs: CharSequence?): Boolean { + return cs == null || cs.isEmpty() } @JvmStatic fun dateString(millis: Long): String { @@ -69,109 +55,42 @@ object CommonUtils { c.get(Calendar.SECOND)) } - fun getTimeString(millis: Long): String { - val c = Calendar.getInstance() - c.timeInMillis = millis - return getTimeString(c) - } - - fun getTimeString(c: Calendar): String { - return String.format(Locale.US, "%02d:%02d", - c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE)) - } - - fun bytesToStringArray(byteArray: ByteArray?): String { - if (byteArray == null || byteArray.size == 0) { - return "null" - } - - val sb = StringBuilder() - for (b in byteArray) { - if (sb.length > 0) { - sb.append(String.format(" %02x", b)) - } else { - sb.append(String.format("0x%02x", b)) - } - } - return sb.toString() - } - - fun insulinFormat(): String { - if (AppConstant.INSULIN_UNIT_STEP_U == 0.1f) { - return "%.1f" - } - return if (AppConstant.INSULIN_UNIT_STEP_U == 0.05f) { - "%.2f" - } else "%.2f 인슐린출력형식추가하셈" - - } - - fun convertInsulinFormat(context: Context, strResId: Int): String { - if (AppConstant.INSULIN_UNIT_STEP_U == 0.1f) { - return context.getString(strResId).replace(".2f", ".1f") - } - if (AppConstant.INSULIN_UNIT_STEP_U == 0.05f) { - return context.getString(strResId) - } - - return context.getString(strResId).replace(".2f", ".2f 인슐린출력형식추가하셈") - - } - fun getRemainHourMin(timeMillis: Long): Pair { val diffHours: Long var diffMinutes: Long if (timeMillis >= 0) { - diffMinutes = Math.abs(timeMillis / (60 * 1000) % 60) + 1 + diffMinutes = abs(timeMillis / (60 * 1000) % 60) + 1 if (diffMinutes == 60L) { diffMinutes = 0 - diffHours = Math.abs(timeMillis / (60 * 60 * 1000)) + 1 + diffHours = abs(timeMillis / (60 * 60 * 1000)) + 1 } else { - diffHours = Math.abs(timeMillis / (60 * 60 * 1000)) + diffHours = abs(timeMillis / (60 * 60 * 1000)) } } else { - diffMinutes = Math.abs(timeMillis / (60 * 1000) % 60) - diffHours = Math.abs(timeMillis / (60 * 60 * 1000)) + diffMinutes = abs(timeMillis / (60 * 1000) % 60) + diffHours = abs(timeMillis / (60 * 60 * 1000)) } return Pair(diffHours, diffMinutes) } - fun getTimeString(minutes: Int): String { - return String.format("%d:%02d", minutes / 60, minutes % 60) - } - - fun getTimeString_hhmm(minutes: Int): String { - return String.format("%02d:%02d", minutes / 60, minutes % 60) - } - - @JvmStatic - fun generatePumpId(date: Long, typeCode: Long = 0): Long { - return DateTimeUtil.toATechDate(date) * 100L + typeCode - } - - @JvmStatic fun nearlyEqual(a: Float, b: Float, epsilon: Float): Boolean { - val absA = Math.abs(a) - val absB = Math.abs(b) - val diff = Math.abs(a - b) - return if (a == b) { // shortcut, handles infinities + val absA = abs(a) + val absB = abs(b) + val diff = abs(a - b) + return if (a == b) { true } else if (a == 0f || b == 0f || absA + absB < java.lang.Float.MIN_NORMAL) { - // a or b is zero or both are extremely close to it - // relative error is less meaningful here diff < epsilon * java.lang.Float.MIN_NORMAL - } else { // use relative error - diff / Math.min(absA + absB, Float.MAX_VALUE) < epsilon + } else { + diff / min(absA + absB, Float.MAX_VALUE) < epsilon } } - @JvmStatic fun nearlyNotEqual(a: Float, b: Float, epsilon: Float): Boolean { return !nearlyEqual(a, b, epsilon) } - @JvmStatic fun clone(src: T): T { return GsonHelper.sharedGson().fromJson(GsonHelper.sharedGson().toJson(src), src.javaClass) } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/EopatchPumpPlugin.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/EopatchPumpPlugin.kt index 630ed9e534..18852d29c1 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/EopatchPumpPlugin.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/EopatchPumpPlugin.kt @@ -1,6 +1,5 @@ package info.nightscout.androidaps.plugins.pump.eopatch -import android.content.Context import android.os.SystemClock import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -34,7 +33,6 @@ import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.TimeChangeType import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers -import info.nightscout.shared.sharedPreferences.SP import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.functions.Consumer @@ -57,12 +55,12 @@ class EopatchPumpPlugin @Inject constructor( private val fabricPrivacy: FabricPrivacy, private val dateUtil: DateUtil, private val pumpSync: PumpSync, - private val patchmanager: IPatchManager, + private val patchManager: IPatchManager, private val alarmManager: IAlarmManager, private val preferenceManager: IPreferenceManager ):PumpPluginBase(PluginDescription() .mainType(PluginType.PUMP) - .fragmentClass(EopatchOverviewFragment::class.java.getName()) + .fragmentClass(EopatchOverviewFragment::class.java.name) .pluginIcon(R.drawable.ic_eopatch2_128) .pluginName(R.string.eopatch) .shortName(R.string.eopatch_shortname) @@ -72,8 +70,7 @@ class EopatchPumpPlugin @Inject constructor( private val mDisposables = CompositeDisposable() - var mPumpType: PumpType = PumpType.EOFLOW_EOPATCH2 - private set + private var mPumpType: PumpType = PumpType.EOFLOW_EOPATCH2 private var mLastDataTime: Long = 0 private val mPumpDescription = PumpDescription(mPumpType) @@ -83,10 +80,10 @@ class EopatchPumpPlugin @Inject constructor( .toObservable(EventPreferenceChange::class.java) .observeOn(Schedulers.io()) .subscribe({ event: EventPreferenceChange -> - if (event.isChanged(rh, SettingKeys.LOW_RESERVIOR_REMINDERS) || event.isChanged(rh, SettingKeys.EXPIRATION_REMINDERS)) { - patchmanager.changeReminderSetting() + if (event.isChanged(rh, SettingKeys.LOW_RESERVOIR_REMINDERS) || event.isChanged(rh, SettingKeys.EXPIRATION_REMINDERS)) { + patchManager.changeReminderSetting() } else if (event.isChanged(rh, SettingKeys.BUZZER_REMINDERS)) { - patchmanager.changeBuzzerSetting() + patchManager.changeBuzzerSetting() } }) { throwable: Throwable -> fabricPrivacy.logException(throwable) } ) @@ -94,10 +91,10 @@ class EopatchPumpPlugin @Inject constructor( mDisposables.add(rxBus .toObservable(EventAppInitialized::class.java) .observeOn(Schedulers.io()) - .subscribe({ event: EventAppInitialized? -> + .subscribe({ aapsLogger.debug(LTag.PUMP,"EventAppInitialized") preferenceManager.init() - patchmanager.init() + patchManager.init() alarmManager.init() }) { throwable: Throwable -> fabricPrivacy.logException(throwable) } ) @@ -106,7 +103,7 @@ class EopatchPumpPlugin @Inject constructor( override fun specialEnableCondition(): Boolean { //BG -> FG 시 패치 활성화 재진행 및 미처리 알람 발생 if(preferenceManager.isInitDone()) { - patchmanager.checkActivationProcess() + patchManager.checkActivationProcess() alarmManager.restartAll() } return super.specialEnableCondition() @@ -142,12 +139,11 @@ class EopatchPumpPlugin @Inject constructor( } override fun isInitialized(): Boolean { - val isInit = isConnected() && patchmanager.isActivated() - return isInit + return isConnected() && patchManager.isActivated } override fun isSuspended(): Boolean { - return patchmanager.patchState.isNormalBasalPaused + return patchManager.patchState.isNormalBasalPaused } override fun isBusy(): Boolean { @@ -155,11 +151,11 @@ class EopatchPumpPlugin @Inject constructor( } override fun isConnected(): Boolean { - return patchmanager.patchConnectionState.isConnected + return patchManager.patchConnectionState.isConnected } override fun isConnecting(): Boolean { - return patchmanager.patchConnectionState.isConnecting + return patchManager.patchConnectionState.isConnecting } override fun isHandshakeInProgress(): Boolean { @@ -182,22 +178,24 @@ class EopatchPumpPlugin @Inject constructor( } override fun getPumpStatus(reason: String) { - if (patchmanager.isActivated()) { + if (patchManager.isActivated) { if ("SMS" == reason) { aapsLogger.debug("Acknowledged AAPS getPumpStatus request it was requested through an SMS") }else{ aapsLogger.debug("Acknowledged AAPS getPumpStatus request") } - patchmanager.updateConnection().subscribe(Consumer { - mLastDataTime = System.currentTimeMillis() - }) + mDisposables.add(patchManager.updateConnection() + .subscribe(Consumer { + mLastDataTime = System.currentTimeMillis() + }) + ) } } override fun setNewBasalProfile(profile: Profile): PumpEnactResult { mLastDataTime = System.currentTimeMillis() - if(patchmanager.isActivated){ - if(patchmanager.patchState.isTempBasalActive || patchmanager.patchState.isBolusActive){ + if(patchManager.isActivated){ + if(patchManager.patchState.isTempBasalActive || patchManager.patchState.isBolusActive){ return PumpEnactResult(injector) }else{ var isSuccess: Boolean? = null @@ -208,24 +206,21 @@ class EopatchPumpPlugin @Inject constructor( } val nb = preferenceManager.getNormalBasalManager().convertProfileToNormalBasal(profile) - patchmanager.startBasal(nb) + mDisposables.add(patchManager.startBasal(nb) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ response -> - if (response.isSuccess) { - preferenceManager.getNormalBasalManager().normalBasal = nb - preferenceManager.flushNormalBasalManager() - } result.onNext(response.isSuccess) - }, { throwable -> + }, { result.onNext(false) }) + ) do{ SystemClock.sleep(100) }while(isSuccess == null) disposable.dispose() - aapsLogger.info(LTag.PUMP, "Basal Profile was set: ${isSuccess?:false}"); + aapsLogger.info(LTag.PUMP, "Basal Profile was set: ${isSuccess?:false}") return PumpEnactResult(injector).apply{ success = isSuccess?:false } } }else{ @@ -236,12 +231,12 @@ class EopatchPumpPlugin @Inject constructor( } override fun isThisProfileSet(profile: Profile): Boolean { - if (!patchmanager.isActivated()) { + if (!patchManager.isActivated) { return true } val ret = preferenceManager.getNormalBasalManager().isEqual(profile) - aapsLogger.info(LTag.PUMP, "Is this profile set? ${ret}"); + aapsLogger.info(LTag.PUMP, "Is this profile set? $ret") return ret } @@ -251,7 +246,7 @@ class EopatchPumpPlugin @Inject constructor( override val baseBasalRate: Double get() { - if (!patchmanager.isActivated || patchmanager.patchState.isNormalBasalPaused) { + if (!patchManager.isActivated || patchManager.patchState.isNormalBasalPaused) { return 0.0 } @@ -260,20 +255,20 @@ class EopatchPumpPlugin @Inject constructor( override val reservoirLevel: Double get() { - if (!patchmanager.isActivated) { + if (!patchManager.isActivated) { return 0.0 } - val reserviorLevel = patchmanager.patchState.remainedInsulin.toDouble() + val reservoirLevel = patchManager.patchState.remainedInsulin.toDouble() - return (reserviorLevel > 50.0).takeOne(50.0, reserviorLevel) + return (reservoirLevel > 50.0).takeOne(50.0, reservoirLevel) } override val batteryLevel: Int get() { - if(patchmanager.isActivated) { - return patchmanager.patchState.batteryLevel() + return if(patchManager.isActivated) { + patchManager.patchState.batteryLevel() }else{ - return 0 + 0 } } @@ -292,7 +287,7 @@ class EopatchPumpPlugin @Inject constructor( isSuccess = it } - patchmanager.startCalculatorBolus(detailedBolusInfo) + mDisposables.add(patchManager.startCalculatorBolus(detailedBolusInfo) .doOnSuccess { mLastDataTime = System.currentTimeMillis() }.subscribe({ @@ -300,25 +295,26 @@ class EopatchPumpPlugin @Inject constructor( }, { result.onNext(false) }) + ) do{ SystemClock.sleep(100) - if(patchmanager.patchConnectionState.isConnected) { - var delivering = patchmanager.bolusCurrent.nowBolus.injected + if(patchManager.patchConnectionState.isConnected) { + val delivering = patchManager.bolusCurrent.nowBolus.injected rxBus.send(EventOverviewBolusProgress.apply { status = rh.gs(R.string.bolusdelivering, delivering) percent = min((delivering / detailedBolusInfo.insulin * 100).toInt(), 100) }) } - }while(!patchmanager.bolusCurrent.nowBolus.endTimeSynced && isSuccess) + }while(!patchManager.bolusCurrent.nowBolus.endTimeSynced && isSuccess) rxBus.send(EventOverviewBolusProgress.apply { status = rh.gs(R.string.bolusdelivered, detailedBolusInfo.insulin) percent = 100 }) - detailedBolusInfo.insulin = patchmanager.bolusCurrent.nowBolus.injected.toDouble() - patchmanager.addBolusToHistory(detailedBolusInfo) + detailedBolusInfo.insulin = patchManager.bolusCurrent.nowBolus.injected.toDouble() + patchManager.addBolusToHistory(detailedBolusInfo) disposable.dispose() @@ -329,37 +325,34 @@ class EopatchPumpPlugin @Inject constructor( } else { // no bolus required, carb only treatment - patchmanager.addBolusToHistory(detailedBolusInfo); + patchManager.addBolusToHistory(detailedBolusInfo) return PumpEnactResult(injector).success(true).enacted(true).bolusDelivered(0.0) - .carbsDelivered(detailedBolusInfo.carbs).comment(rh.gs(info.nightscout.androidaps.core.R.string.ok)); + .carbsDelivered(detailedBolusInfo.carbs).comment(rh.gs(info.nightscout.androidaps.core.R.string.ok)) } } override fun stopBolusDelivering() { - patchmanager.stopNowBolus() - .subscribeOn(aapsSchedulers.io) - .observeOn(aapsSchedulers.main) + mDisposables.add(patchManager.stopNowBolus() .subscribeOn(aapsSchedulers.io) .observeOn(aapsSchedulers.main) .subscribe { it -> rxBus.send(EventOverviewBolusProgress.apply { - status = rh.gs(R.string.bolusdelivered, (it.injectedBolusAmount * 0.05f)) //todo stoped 메세지로 변경 필요 + status = rh.gs(R.string.bolusdelivered, (it.injectedBolusAmount * 0.05f)) }) } + ) } override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult { aapsLogger.info(LTag.PUMP, "setTempBasalAbsolute - absoluteRate: ${absoluteRate.toFloat()}, durationInMinutes: ${durationInMinutes.toLong()}, enforceNew: $enforceNew") - if(patchmanager.patchState.isNormalBasalAct){ + if(patchManager.patchState.isNormalBasalAct){ mLastDataTime = System.currentTimeMillis() val tb = TempBasal.createAbsolute(durationInMinutes.toLong(), absoluteRate.toFloat()) - return patchmanager.startTempBasal(tb) + return patchManager.startTempBasal(tb) .subscribeOn(aapsSchedulers.io) .observeOn(aapsSchedulers.main) .doOnSuccess { - preferenceManager.getTempBasalManager().startedBasal = tb - preferenceManager.getTempBasalManager().startedBasal?.startTimestamp = System.currentTimeMillis() pumpSync.syncTemporaryBasalWithPumpId( timestamp = dateUtil.now(), rate = absoluteRate, @@ -372,7 +365,7 @@ class EopatchPumpPlugin @Inject constructor( ) aapsLogger.info(LTag.PUMP,"setTempBasalAbsolute - tbrCurrent:${readTBR()}") } - .map { it -> PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(absoluteRate).isPercent(false).isTempCancel(false) } + .map { PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).absolute(absoluteRate).isPercent(false).isTempCancel(false) } .onErrorReturnItem(PumpEnactResult(injector).success(false).enacted(false) .comment("Internal error")) .blockingGet() @@ -384,15 +377,13 @@ class EopatchPumpPlugin @Inject constructor( override fun setTempBasalPercent(percent: Int, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult { aapsLogger.info(LTag.PUMP,"setTempBasalPercent - percent: $percent, durationInMinutes: $durationInMinutes, enforceNew: $enforceNew") - if(patchmanager.patchState.isNormalBasalAct && percent != 0){ + if(patchManager.patchState.isNormalBasalAct && percent != 0){ mLastDataTime = System.currentTimeMillis() val tb = TempBasal.createPercent(durationInMinutes.toLong(), percent) - return patchmanager.startTempBasal(tb) + return patchManager.startTempBasal(tb) .subscribeOn(aapsSchedulers.io) .observeOn(aapsSchedulers.main) .doOnSuccess { - preferenceManager.getTempBasalManager().startedBasal = tb - preferenceManager.getTempBasalManager().startedBasal?.startTimestamp = System.currentTimeMillis() pumpSync.syncTemporaryBasalWithPumpId( timestamp = dateUtil.now(), rate = percent.toDouble(), @@ -405,7 +396,7 @@ class EopatchPumpPlugin @Inject constructor( ) aapsLogger.info(LTag.PUMP,"setTempBasalPercent - tbrCurrent:${readTBR()}") } - .map { it -> PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).percent(percent).isPercent(true).isTempCancel(false) } + .map { PumpEnactResult(injector).success(true).enacted(true).duration(durationInMinutes).percent(percent).isPercent(true).isTempCancel(false) } .onErrorReturnItem(PumpEnactResult(injector).success(false).enacted(false) .comment("Internal error")) .blockingGet() @@ -418,7 +409,7 @@ class EopatchPumpPlugin @Inject constructor( override fun setExtendedBolus(insulin: Double, durationInMinutes: Int): PumpEnactResult { aapsLogger.info(LTag.PUMP,"setExtendedBolus - insulin: $insulin, durationInMinutes: $durationInMinutes") - return patchmanager.startQuickBolus(0f, insulin.toFloat(), BolusExDuration.ofRaw(durationInMinutes)) + return patchManager.startQuickBolus(0f, insulin.toFloat(), BolusExDuration.ofRaw(durationInMinutes)) .doOnSuccess { mLastDataTime = System.currentTimeMillis() pumpSync.syncExtendedBolusWithPumpId( @@ -431,7 +422,7 @@ class EopatchPumpPlugin @Inject constructor( pumpSerial = serialNumber() ) } - .map { it -> PumpEnactResult(injector).success(true).enacted(true)} + .map { PumpEnactResult(injector).success(true).enacted(true)} .onErrorReturnItem(PumpEnactResult(injector).success(false).enacted(false).bolusDelivered(0.0) .comment(rh.gs(info.nightscout.androidaps.core.R.string.error))) .blockingGet() @@ -445,14 +436,14 @@ class EopatchPumpPlugin @Inject constructor( return PumpEnactResult(injector).success(true).enacted(false) } - if (!patchmanager.patchState.isTempBasalActive) { + if (!patchManager.patchState.isTempBasalActive) { return if (pumpSync.expectedPumpState().temporaryBasal != null) { PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true) }else PumpEnactResult(injector).success(true).isTempCancel(true) } - return patchmanager.stopTempBasal() + return patchManager.stopTempBasal() .doOnSuccess { mLastDataTime = System.currentTimeMillis() aapsLogger.debug(LTag.PUMP,"cancelTempBasal - $it") @@ -466,15 +457,15 @@ class EopatchPumpPlugin @Inject constructor( .doOnError{ aapsLogger.error(LTag.PUMP,"cancelTempBasal() - $it") } - .map { it -> PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true)} + .map { PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true)} .onErrorReturnItem(PumpEnactResult(injector).success(false).enacted(false) .comment(rh.gs(info.nightscout.androidaps.core.R.string.error))) .blockingGet() } override fun cancelExtendedBolus(): PumpEnactResult { - if(patchmanager.patchState.isExtBolusActive){ - return patchmanager.stopExtBolus() + if(patchManager.patchState.isExtBolusActive){ + return patchManager.stopExtBolus() .doOnSuccess { aapsLogger.debug(LTag.PUMP,"cancelExtendedBolus - success") mLastDataTime = System.currentTimeMillis() @@ -485,7 +476,7 @@ class EopatchPumpPlugin @Inject constructor( pumpSerial = serialNumber() ) } - .map { it -> PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true)} + .map { PumpEnactResult(injector).success(true).enacted(true).isTempCancel(true)} .onErrorReturnItem(PumpEnactResult(injector).success(false).enacted(false) .comment(rh.gs(info.nightscout.androidaps.core.R.string.error))) .blockingGet() @@ -517,14 +508,14 @@ class EopatchPumpPlugin @Inject constructor( } override fun serialNumber(): String { - return patchmanager.patchConfig.patchSerialNumber + return patchManager.patchConfig.patchSerialNumber } override val pumpDescription: PumpDescription get() = mPumpDescription override fun shortStatus(veryShort: Boolean): String { - if(patchmanager.isActivated) { + if(patchManager.isActivated) { var ret = "" val activeTemp = pumpSync.expectedPumpState().temporaryBasal if (activeTemp != null) @@ -534,7 +525,7 @@ class EopatchPumpPlugin @Inject constructor( if (activeExtendedBolus != null) ret += "Extended: ${activeExtendedBolus.amount} U\n" - val reservoirStr = patchmanager.patchState.remainedInsulin.let { + val reservoirStr = patchManager.patchState.remainedInsulin.let { when { it > 50f -> "50+ U" it < 1f -> "0 U" @@ -543,7 +534,7 @@ class EopatchPumpPlugin @Inject constructor( } ret += "Reservoir: $reservoirStr" - ret += "Batt: ${patchmanager.patchState.batteryLevel()}" + ret += "Battery: ${patchManager.patchState.batteryLevel()}" return ret }else{ return "EOPatch is not enabled." diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/FloatFormatters.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/FloatFormatters.kt index badd141124..f90514ab22 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/FloatFormatters.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/FloatFormatters.kt @@ -4,7 +4,7 @@ import java.util.* import java.util.function.Function object FloatFormatters { - val INSULIN = Function{ value -> String.format(Locale.US, CommonUtils.insulinFormat(), value.toFloat()) } + val INSULIN = Function{ value -> String.format(Locale.US, "%.2f", value.toFloat()) } val FAT = Function{ value -> String.format(Locale.US, "%.1f", value.toFloat()) } val DURATION = Function{ value -> String.format(Locale.US, "%.1f", value.toFloat()) } @@ -16,19 +16,7 @@ object FloatFormatters { return if (CommonUtils.isStringEmpty(suffix)) { INSULIN.apply(value) } else { - INSULIN.apply(value).toString() +" "+ suffix!! - } - } - - fun fat(value: Float): String { - return FAT.apply(value) - } - - fun fat(value: Float, suffix: String?): String { - return if (CommonUtils.isStringEmpty(suffix)) { - FAT.apply(value) - } else { - FAT.apply(value).toString() + suffix!! + INSULIN.apply(value) +" "+ suffix!! } } @@ -40,7 +28,7 @@ object FloatFormatters { return if (CommonUtils.isStringEmpty(suffix)) { DURATION.apply(value) } else { - DURATION.apply(value).toString() +" " + suffix!! + DURATION.apply(value) +" " + suffix!! } } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/OsAlarmService.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/OsAlarmService.java index 141031e8cf..a1671f619a 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/OsAlarmService.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/OsAlarmService.java @@ -51,10 +51,6 @@ public class OsAlarmService extends Service { public synchronized void startForeground() { if (!foreground) { -//// CommonUtils.dispose(mNotificationDisposable); -// Notification builder = getNotification(this); -// startForeground(FOREGROUND_NOTIFICATION_ID, builder); -// startExerciseOrSleepMode(this); foreground = true; } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/RxAction.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/RxAction.kt index 4a4784eb78..2565d41e64 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/RxAction.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/RxAction.kt @@ -6,8 +6,6 @@ import android.os.SystemClock import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger import io.reactivex.* -import io.reactivex.disposables.Disposable -import org.reactivestreams.Subscription import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton @@ -17,21 +15,10 @@ class RxAction @Inject constructor( private val aapsSchedulers: AapsSchedulers, private val aapsLogger: AAPSLogger ) { - enum class RxVoid { INSTANCE } - class SilentObserver(private val aapsLogger: AAPSLogger) : MaybeObserver, SingleObserver, Observer, FlowableSubscriber { - - override fun onSubscribe(d: Disposable) {} - override fun onSuccess(t: T) {} - override fun onError(e: Throwable) = aapsLogger.error("SilentObserver.onError() ignore", e) - override fun onComplete() {} - override fun onNext(t: T) {} - override fun onSubscribe(s: Subscription) {} - } - private fun sleep(millis: Long) { if (millis <= 0) return @@ -56,63 +43,14 @@ class RxAction @Inject constructor( } } - private fun safeSingle(action: Runnable, delayMs: Long, scheduler: Scheduler): Single<*> { - return single(action, delayMs, scheduler) - } - - @JvmOverloads - fun runOnComputationThread(action: Runnable, delayMs: Long = 0) { - single(action, delayMs, aapsSchedulers.cpu).subscribe(SilentObserver(aapsLogger)) - } - - @JvmOverloads - fun runOnIoThread(action: Runnable, delayMs: Long = 0) { - single(action, delayMs, aapsSchedulers.io).subscribe(SilentObserver(aapsLogger)) - } - - @JvmOverloads - fun runOnNewThread(action: Runnable, delayMs: Long = 0) { - single(action, delayMs, aapsSchedulers.newThread).subscribe(SilentObserver(aapsLogger)) - } - @JvmOverloads fun runOnMainThread(action: Runnable, delayMs: Long = 0) { - single(action, delayMs, aapsSchedulers.main).subscribe(SilentObserver(aapsLogger)) - } + single(action, delayMs, aapsSchedulers.main) + .subscribe({ - @JvmOverloads - fun safeRunOnComputationThread(action: Runnable, delayMs: Long = 0) { - safeSingle(action, delayMs, aapsSchedulers.cpu).subscribe(SilentObserver(aapsLogger)) - } - - @JvmOverloads - fun safeRunOnIoThread(action: Runnable, delayMs: Long = 0) { - safeSingle(action, delayMs, aapsSchedulers.io).subscribe(SilentObserver(aapsLogger)) - } - - @JvmOverloads - fun safeRunOnNewThread(action: Runnable, delayMs: Long = 0) { - safeSingle(action, delayMs, aapsSchedulers.newThread).subscribe(SilentObserver(aapsLogger)) - } - - @JvmOverloads - fun safeRunOnMainThread(action: Runnable, delayMs: Long = 0) { - safeSingle(action, delayMs, aapsSchedulers.main).subscribe(SilentObserver(aapsLogger)) - } - - fun singleOnMainThread(action: Runnable, delayMs: Long): Single<*> { - return single(action, delayMs, aapsSchedulers.main) - } - - fun singleOnComputationThread(action: Runnable, delayMs: Long): Single<*> { - return single(action, delayMs, aapsSchedulers.cpu) - } - - fun singleOnIoThread(action: Runnable, delayMs: Long): Single<*> { - return single(action, delayMs, aapsSchedulers.io) - } - - fun singleOnNewThread(action: Runnable, delayMs: Long): Single<*> { - return single(action, delayMs, aapsSchedulers.newThread) + }, + { e -> + aapsLogger.error("SilentObserver.onError() ignore", e) + }) } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmCode.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmCode.kt index cb410327bd..1fc2754f06 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmCode.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmCode.kt @@ -9,45 +9,47 @@ import java.util.function.Function import java.util.stream.Collectors import java.util.stream.Stream -enum class AlarmCode(defaultName: String, messageResId: Int) { - A002("Empty reservoir", R.string.string_a002), - A003("Patch expired", R.string.string_a003), - A004("Occlusion", R.string.string_a004), - A005("Power on self test failure", R.string.string_a005), - A007("Inappropriate temperature", R.string.string_a007), - A016("Needle insertion Error", R.string.string_a016), - A018("Patch battery Error", R.string.string_a018), - A019("Patch battery Error", R.string.string_a019), - A020("Patch activation Error", R.string.string_a020), - A022("Patch Error", R.string.string_a022), - A023("Patch Error", R.string.string_a023), - A034("Patch Error", R.string.string_a034), - A041("Patch Error", R.string.string_a041), - A042("Patch Error", R.string.string_a042), - A043("Patch Error", R.string.string_a043), - A044("Patch Error", R.string.string_a044), - A106("Patch Error", R.string.string_a106), - A107("Patch Error", R.string.string_a107), - A108("Patch Error", R.string.string_a108), - A116("Patch Error", R.string.string_a116), - A117("Patch Error", R.string.string_a117), - A118("Patch Error", R.string.string_a118), - B001("End of insulin suspend", R.string.string_b001), - B003("Low reservoir", R.string.string_b003), - B005("Patch operating life expired", R.string.string_b005), - B006("Patch will expire soon", R.string.string_b006), - B012("Incomplete Patch activation", R.string.string_b012), - B018("Patch battery low", R.string.string_b018); +enum class AlarmCode(messageResId: Int) { + A002(R.string.string_a002), //"Empty reservoir" + A003(R.string.string_a003), //"Patch expired" + A004(R.string.string_a004), //"Occlusion" + A005(R.string.string_a005), //"Power on self test failure" + A007(R.string.string_a007), //"Inappropriate temperature" + A016(R.string.string_a016), //"Needle insertion Error" + A018(R.string.string_a018), //"Patch battery Error" + A019(R.string.string_a019), //"Patch battery Error" + A020(R.string.string_a020), //"Patch activation Error" + A022(R.string.string_a022), //"Patch Error" + A023(R.string.string_a023), //"Patch Error" + A034(R.string.string_a034), //"Patch Error" + A041(R.string.string_a041), //"Patch Error" + A042(R.string.string_a042), //"Patch Error" + A043(R.string.string_a043), //"Patch Error" + A044(R.string.string_a044), //"Patch Error" + A106(R.string.string_a106), //"Patch Error" + A107(R.string.string_a107), //"Patch Error" + A108(R.string.string_a108), //"Patch Error" + A116(R.string.string_a116), //"Patch Error" + A117(R.string.string_a117), //"Patch Error" + A118(R.string.string_a118), //"Patch Error" + B001(R.string.string_b001), //"End of insulin suspend" + B003(R.string.string_b003), //"Low reservoir" + B005(R.string.string_b005), //"Patch operating life expired" + B006(R.string.string_b006), //"Patch will expire soon" + B012(R.string.string_b012), //"Incomplete Patch activation" + B018(R.string.string_b018); //"Patch battery low" + + val type: Char = name[0] + val code: Int = name.substring(1).toInt() + val resId: Int = messageResId - val type: Char - val code: Int - val resId: Int val alarmCategory: AlarmCategory get() = when (type) { TYPE_ALARM -> AlarmCategory.ALARM TYPE_ALERT -> AlarmCategory.ALERT else -> AlarmCategory.NONE } + val aeCode: Int get() { when (type) { @@ -57,13 +59,6 @@ enum class AlarmCode(defaultName: String, messageResId: Int) { return -1 } - val osAlarmId: Int - get() = (when (type) { - TYPE_ALARM -> 10000 - TYPE_ALERT -> 20000 - else -> 0 - } + code ) * 1000 + 1 - val isPatchOccurrenceAlert: Boolean get() = this == B003 || this == B005 || this == B006 || this == B018 @@ -72,12 +67,6 @@ enum class AlarmCode(defaultName: String, messageResId: Int) { || this == A023 || this == A034 || this == A041 || this == A042 || this == A043 || this == A044 || this == A106 || this == A107 || this == A108 || this == A116 || this == A117 || this == A118 - init { - type = name[0] - this.code = name.substring(1).toInt() - resId = messageResId - } - companion object { const val TYPE_ALARM = 'A' const val TYPE_ALERT = 'B' @@ -103,10 +92,10 @@ enum class AlarmCode(defaultName: String, messageResId: Int) { fun getUri(alarmCode: AlarmCode): Uri { return Uri.Builder() .scheme(SCHEME) - .authority("com.eoflow.eomapp") + .authority("info.nightscout.androidaps") .path(ALARM_KEY_PATH) .appendQueryParameter(QUERY_CODE, alarmCode.name) - .build(); + .build() } @JvmStatic diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmManager.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmManager.kt index 3929625d1c..b00b8067d4 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmManager.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmManager.kt @@ -26,10 +26,12 @@ import io.reactivex.Observable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable +import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Singleton +import kotlin.math.max interface IAlarmManager { fun init() @@ -54,6 +56,7 @@ class AlarmManager @Inject constructor() : IAlarmManager { private lateinit var mAlarmProcess: AlarmProcess private var compositeDisposable: CompositeDisposable = CompositeDisposable() + private var alarmDisposable: Disposable? = null @Inject fun onInit() { @@ -61,27 +64,27 @@ class AlarmManager @Inject constructor() : IAlarmManager { } override fun init(){ - EoPatchRxBus.listen(EventEoPatchAlarm::class.java) - .map { it -> it.alarmCodes } + alarmDisposable = EoPatchRxBus.listen(EventEoPatchAlarm::class.java) + .map { it.alarmCodes } .doOnNext { aapsLogger.info(LTag.PUMP,"EventEoPatchAlarm Received") } .concatMap { Observable.fromArray(it) .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .doOnNext { alarmCodes -> - alarmCodes.forEach { - aapsLogger.info(LTag.PUMP,"alarmCode: ${it.name}") - val valid = isValid(it) + alarmCodes.forEach { alarmCode -> + aapsLogger.info(LTag.PUMP,"alarmCode: ${alarmCode.name}") + val valid = isValid(alarmCode) if (valid) { - if (it.alarmCategory == AlarmCategory.ALARM || it == B012) { - showAlarmDialog(it) + if (alarmCode.alarmCategory == AlarmCategory.ALARM || alarmCode == B012) { + showAlarmDialog(alarmCode) } else { - showNotification(it) + showNotification(alarmCode) } - updateState(it, AlarmState.FIRED) + updateState(alarmCode, AlarmState.FIRED) }else{ - updateState(it, AlarmState.HANDLE) + updateState(alarmCode, AlarmState.HANDLE) } } } @@ -92,17 +95,19 @@ class AlarmManager @Inject constructor() : IAlarmManager { override fun restartAll() { val now = System.currentTimeMillis() - val occuredAlarm = pm.getAlarms().occured.clone() as HashMap + @Suppress("UNCHECKED_CAST") + val occurredAlarm= pm.getAlarms().occurred.clone() as HashMap + @Suppress("UNCHECKED_CAST") val registeredAlarm = pm.getAlarms().registered.clone() as HashMap compositeDisposable.clear() - if(occuredAlarm.isNotEmpty()){ - EoPatchRxBus.publish(EventEoPatchAlarm(occuredAlarm.keys)) + if(occurredAlarm.isNotEmpty()){ + EoPatchRxBus.publish(EventEoPatchAlarm(occurredAlarm.keys)) } if(registeredAlarm.isNotEmpty()){ registeredAlarm.forEach { raEntry -> compositeDisposable.add( - mAlarmRegistry.add(raEntry.key, Math.max(OS_REGISTER_GAP, raEntry.value.triggerTimeMilli - now)) + mAlarmRegistry.add(raEntry.key, max(OS_REGISTER_GAP, raEntry.value.triggerTimeMilli - now)) .subscribe() ) } @@ -112,11 +117,11 @@ class AlarmManager @Inject constructor() : IAlarmManager { private fun isValid(code: AlarmCode): Boolean{ return when(code){ A005, A016, A020, B012 -> { - aapsLogger.info(LTag.PUMP,"Is ${code} valid? ${pm.getPatchConfig().hasMacAddress() && pm.getPatchConfig().lifecycleEvent.isSubStepRunning}") + aapsLogger.info(LTag.PUMP,"Is $code valid? ${pm.getPatchConfig().hasMacAddress() && pm.getPatchConfig().lifecycleEvent.isSubStepRunning}") pm.getPatchConfig().hasMacAddress() && pm.getPatchConfig().lifecycleEvent.isSubStepRunning } else -> { - aapsLogger.info(LTag.PUMP,"Is ${code} valid? ${pm.getPatchConfig().isActivated}") + aapsLogger.info(LTag.PUMP,"Is $code valid? ${pm.getPatchConfig().isActivated}") pm.getPatchConfig().isActivated } } @@ -133,11 +138,11 @@ class AlarmManager @Inject constructor() : IAlarmManager { } private fun showNotification(alarmCode: AlarmCode, timeOffset: Long = 0L){ - var occurredTimestamp: Long = pm.getPatchConfig().patchWakeupTimestamp + TimeUnit.SECONDS.toMillis(timeOffset) val notification = EONotification(Notification.EOELOW_PATCH_ALERTS + (alarmCode.aeCode + 10000), resourceHelper.gs(alarmCode.resId), Notification.URGENT) notification.action(R.string.confirm) { - Single.just(isValid(alarmCode)) + compositeDisposable.add( + Single.just(isValid(alarmCode)) .flatMap { isValid -> return@flatMap if(isValid) mAlarmProcess.doAction(context, alarmCode) else Single.just(IAlarmProcess.ALARM_HANDLED) @@ -148,17 +153,17 @@ class AlarmManager @Inject constructor() : IAlarmManager { }else{ rxBus.send(EventNewNotification(notification)) } - } + }) } notification.soundId = R.raw.error - notification.date = occurredTimestamp + notification.date = pm.getPatchConfig().patchWakeupTimestamp + TimeUnit.SECONDS.toMillis(timeOffset) rxBus.send(EventNewNotification(notification)) } private fun updateState(alarmCode: AlarmCode, state: AlarmState){ when(state){ AlarmState.REGISTER -> pm.getAlarms().register(alarmCode, 0) - AlarmState.FIRED -> pm.getAlarms().occured(alarmCode) + AlarmState.FIRED -> pm.getAlarms().occurred(alarmCode) AlarmState.HANDLE -> pm.getAlarms().handle(alarmCode) } pm.flushAlarms() diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmProcess.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmProcess.kt index 7f440d6527..cc686f9540 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmProcess.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmProcess.kt @@ -4,8 +4,7 @@ import android.content.Context import android.content.DialogInterface import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity.Companion.createIntentForCheckConnection import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity.Companion.createIntentForDiscarded -import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity.Companion.createIntentForChangePatch -import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity.Companion.createIntentForCanularInsertionError +import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity.Companion.createIntentForCannulaInsertionError import info.nightscout.androidaps.plugins.pump.eopatch.ble.IPatchManager import info.nightscout.androidaps.plugins.pump.eopatch.alarm.AlarmCode.* import android.content.Intent @@ -13,7 +12,6 @@ import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.pump.eopatch.R import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity import info.nightscout.androidaps.plugins.pump.eopatch.core.response.BaseResponse -import info.nightscout.androidaps.plugins.pump.eopatch.code.DeactivationStatus import info.nightscout.androidaps.plugins.pump.eopatch.core.response.TemperatureResponse import info.nightscout.androidaps.plugins.pump.eopatch.event.EventDialog import info.nightscout.androidaps.plugins.pump.eopatch.event.EventProgressDialog @@ -40,13 +38,12 @@ class AlarmProcess(val patchManager: IPatchManager, val rxBus: RxBus) : IAlarmPr A002, A003, A004, A005, A018, A019, A020, A022, A023, A034, A041, A042, A043, A044, A106, A107, A108, A116, - A117, A118 -> patchDeactivationAction(context, true) + A117, A118 -> patchDeactivationAction(context) A007 -> inappropriateTemperatureAction(context) A016 -> needleInsertionErrorAction(context) B003, B018 -> Single.just(IAlarmProcess.ALARM_HANDLED) B005, B006 -> Single.just(IAlarmProcess.ALARM_HANDLED) B012 -> Single.just(IAlarmProcess.ALARM_HANDLED) - else -> Single.just(IAlarmProcess.ALARM_HANDLED) } } @@ -56,11 +53,11 @@ class AlarmProcess(val patchManager: IPatchManager, val rxBus: RxBus) : IAlarmPr } private fun showCommunicationFailedDialog(onConfirmed: Runnable) { - var dialog = CommonDialog().apply { + val dialog = CommonDialog().apply { title = R.string.patch_communication_failed message = R.string.patch_communication_check_helper_1 positiveBtn = R.string.string_communication_check - positiveListener = DialogInterface.OnClickListener { dialog, which -> + positiveListener = DialogInterface.OnClickListener { _, _ -> onConfirmed.run() dismiss() } @@ -80,7 +77,7 @@ class AlarmProcess(val patchManager: IPatchManager, val rxBus: RxBus) : IAlarmPr Single.fromCallable { showCommunicationFailedDialog { startActivityWithSingleTop(context, - createIntentForCheckConnection(context, true, true)) + createIntentForCheckConnection(context, goHomeAfterDiscard = true, forceDiscard = true)) } IAlarmProcess.ALARM_PAUSE } @@ -95,28 +92,21 @@ class AlarmProcess(val patchManager: IPatchManager, val rxBus: RxBus) : IAlarmPr } } - private fun patchDeactivationAction(context: Context, goHome: Boolean): Single { + private fun patchDeactivationAction(context: Context): Single { return actionWithPatchCheckConnection(context) { rxBus.send(EventProgressDialog(true, R.string.string_in_progress)) patchManager.deactivate(6000, true) .doFinally { rxBus.send(EventProgressDialog(false, R.string.string_in_progress)) - startActivityWithSingleTop(context, createIntentForDiscarded(context, goHome)) + startActivityWithSingleTop(context, createIntentForDiscarded(context)) } - .flatMap { ok: DeactivationStatus? -> Single.just(IAlarmProcess.ALARM_HANDLED) } - } - } - - private fun changPatchAction(context: Context): Single { - return Single.fromCallable { - startActivityWithSingleTop(context, createIntentForChangePatch(context)) - IAlarmProcess.ALARM_HANDLED + .flatMap { Single.just(IAlarmProcess.ALARM_HANDLED) } } } private fun needleInsertionErrorAction(context: Context): Single { return Single.fromCallable { - startActivityWithSingleTop(context, createIntentForCanularInsertionError(context)) + startActivityWithSingleTop(context, createIntentForCannulaInsertionError(context)) IAlarmProcess.ALARM_HANDLED } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmRegistry.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmRegistry.kt index 7d8c6ad1a6..157fea2d95 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmRegistry.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/alarm/AlarmRegistry.kt @@ -29,7 +29,7 @@ import javax.inject.Singleton interface IAlarmRegistry { fun add(alarmCode: AlarmCode, triggerAfter: Long, isFirst: Boolean = false): Maybe fun add(patchAeCodes: Set) - fun remove(alarmKey: AlarmCode): Maybe + fun remove(alarmCode: AlarmCode): Maybe } @Singleton @@ -60,29 +60,30 @@ class AlarmRegistry @Inject constructor() : IAlarmRegistry { PatchLifecycle.SHUTDOWN -> { val sources = ArrayList>() sources.add(Maybe.just(true)) - pm.getAlarms().occured.let{ - if(it.isNotEmpty()){ - it.keys.forEach { + pm.getAlarms().occurred.let{ occurredAlarms -> + if(occurredAlarms.isNotEmpty()){ + occurredAlarms.keys.forEach { alarmCode -> sources.add( - Maybe.just(it) + Maybe.just(alarmCode) .observeOn(aapsSchedulers.main) - .doOnSuccess { rxBus.send(EventDismissNotification(Notification.EOELOW_PATCH_ALERTS + (it.aeCode + 10000))) } + .doOnSuccess { rxBus.send(EventDismissNotification(Notification.EOELOW_PATCH_ALERTS + (alarmCode.aeCode + 10000))) } ) } } } - pm.getAlarms().registered.let{ - if(it.isNotEmpty()){ - it.keys.forEach { - sources.add(remove(it)) + pm.getAlarms().registered.let{ registeredAlarms -> + if(registeredAlarms.isNotEmpty()){ + registeredAlarms.keys.forEach { alarmCode -> + sources.add(remove(alarmCode)) } } } - Maybe.concat(sources) + compositeDisposable.add(Maybe.concat(sources) .subscribe { pm.getAlarms().clear() pm.flushAlarms() } + ) } else -> Unit @@ -91,7 +92,7 @@ class AlarmRegistry @Inject constructor() : IAlarmRegistry { } override fun add(alarmCode: AlarmCode, triggerAfter: Long, isFirst: Boolean): Maybe { - if(pm.getAlarms().occured.containsKey(alarmCode)){ + if(pm.getAlarms().occurred.containsKey(alarmCode)){ return Maybe.just(alarmCode) }else { val triggerTimeMilli = System.currentTimeMillis() + triggerAfter @@ -110,7 +111,7 @@ class AlarmRegistry @Inject constructor() : IAlarmRegistry { Observable.fromIterable(patchAeCodes) .filter{patchAeCodeItem -> AlarmCode.findByPatchAeCode(patchAeCodeItem.getAeValue()) != null} .observeOn(AndroidSchedulers.mainThread()) - .filter { patchAeCodes -> AlarmCode.findByPatchAeCode(patchAeCodes.getAeValue()) != null } + .filter { aeCodes -> AlarmCode.findByPatchAeCode(aeCodes.getAeValue()) != null } .flatMapMaybe{aeCodeResponse -> add(AlarmCode.findByPatchAeCode(aeCodeResponse.getAeValue())!!,0L, true)} .subscribe() ) @@ -120,22 +121,21 @@ class AlarmRegistry @Inject constructor() : IAlarmRegistry { return Maybe.fromCallable { cancelOsAlarmInternal(alarmCode) val pendingIntent = createPendingIntent(alarmCode, 0) - val now = System.currentTimeMillis() mOsAlarmManager.setAlarmClock(AlarmClockInfo(triggerTime, pendingIntent), pendingIntent) alarmCode } } override fun remove(alarmCode: AlarmCode): Maybe { - if(pm.getAlarms().registered.containsKey(alarmCode)) { - return cancelOsAlarms(alarmCode) + return if(pm.getAlarms().registered.containsKey(alarmCode)) { + cancelOsAlarms(alarmCode) .doOnSuccess { pm.getAlarms().unregister(alarmCode) pm.flushAlarms() } - .map { integer: Int? -> alarmCode } + .map { alarmCode } }else{ - return Maybe.just(alarmCode) + Maybe.just(alarmCode) } } @@ -158,8 +158,8 @@ class AlarmRegistry @Inject constructor() : IAlarmRegistry { } } - private fun createPendingIntent(alarmCode: AlarmCode, flag: Int): PendingIntent { + private fun createPendingIntent(alarmCode: AlarmCode, flag: Int): PendingIntent? { val intent = Intent(mContext, OsAlarmReceiver::class.java).setData(getUri(alarmCode)) - return PendingIntent.getBroadcast(mContext, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT) + return PendingIntent.getBroadcast(mContext, 1, intent, flag) } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/bindingadapters/OnSafeClickListener.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/bindingadapters/OnSafeClickListener.kt index 236f5a5d65..c157f6fc2f 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/bindingadapters/OnSafeClickListener.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/bindingadapters/OnSafeClickListener.kt @@ -21,6 +21,6 @@ class OnSafeClickListener( } companion object { // 중복 클릭 방지 시간 설정 - private val MIN_CLICK_INTERVAL: Long = 1000 + private const val MIN_CLICK_INTERVAL: Long = 1000 } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/IPatchManager.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/IPatchManager.java index 7a6ead66b7..26f1f800b1 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/IPatchManager.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/IPatchManager.java @@ -27,13 +27,6 @@ import io.reactivex.Observable; import io.reactivex.Single; public interface IPatchManager { - - /* - @Deprecated - static IPatchManager shared() { - return BaseApplication.instance.getDataComponent().getPatchManager(); - } - */ void init(); IPreferenceManager getPreferenceManager(); @@ -74,8 +67,7 @@ public interface IPatchManager { Single stopComboBolus(); - Single startQuickBolus(float nowDoseU, float exDoseU, - BolusExDuration exDuration); + Single startQuickBolus(float nowDoseU, float exDoseU, BolusExDuration exDuration); Single startCalculatorBolus(DetailedBolusInfo detailedBolusInfo); @@ -116,8 +108,6 @@ public interface IPatchManager { Single getTemperature(); - void initBasalSchedule(); - void addBolusToHistory(DetailedBolusInfo originalDetailedBolusInfo); void changeBuzzerSetting(); diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManager.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManager.java index e782da471f..4922551756 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManager.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManager.java @@ -3,8 +3,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ble; import android.content.Context; import android.content.Intent; -import com.polidea.rxandroidble2.exceptions.BleException; - import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -51,16 +49,12 @@ import info.nightscout.androidaps.plugins.pump.eopatch.vo.TempBasal; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.resources.ResourceHelper; import info.nightscout.shared.logging.AAPSLogger; -import info.nightscout.shared.logging.LTag; import info.nightscout.shared.sharedPreferences.SP; import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.exceptions.OnErrorNotImplementedException; -import io.reactivex.exceptions.UndeliverableException; -import io.reactivex.plugins.RxJavaPlugins; import io.reactivex.schedulers.Schedulers; @Singleton @@ -81,29 +75,11 @@ public class PatchManager implements IPatchManager { @Inject RxAction rxAction; private IPatchScanner patchScanner; - private CompositeDisposable mCompositeDisposable = new CompositeDisposable(); + private final CompositeDisposable mCompositeDisposable = new CompositeDisposable(); private Disposable mConnectingDisposable = null; @Inject - public PatchManager() { - setupRxAndroidBle(); - } - - private void setupRxAndroidBle() { - RxJavaPlugins.setErrorHandler(throwable -> { - if (throwable instanceof UndeliverableException) { - if (throwable.getCause() instanceof BleException) { - return; - } - aapsLogger.error(LTag.PUMPBTCOMM, "rx UndeliverableException Error Handler"); - return; - } else if (throwable instanceof OnErrorNotImplementedException) { - aapsLogger.error(LTag.PUMPBTCOMM, "rx exception Error Handler"); - return; - } - throw new RuntimeException("Unexpected Throwable in RxJavaPlugins error handler", throwable); - }); - } + public PatchManager() {} @Inject void onInit() { @@ -155,7 +131,6 @@ public class PatchManager implements IPatchManager { @Override public void init() { - initBasalSchedule(); setConnection(); } @@ -272,7 +247,27 @@ public class PatchManager implements IPatchManager { } public Single patchActivation(long timeout) { - return patchManager.patchActivation(timeout); + return patchManager.patchActivation(timeout) + .doOnSuccess(success -> { + if (success) { + pumpSync.insertTherapyEventIfNewWithTimestamp( + getPatchConfig().getPatchWakeupTimestamp(), + DetailedBolusInfo.EventType.CANNULA_CHANGE, + null, + null, + PumpType.EOFLOW_EOPATCH2, + getPatchConfig().getPatchSerialNumber() + ); + pumpSync.insertTherapyEventIfNewWithTimestamp( + getPatchConfig().getPatchWakeupTimestamp(), + DetailedBolusInfo.EventType.INSULIN_CHANGE, + null, + null, + PumpType.EOFLOW_EOPATCH2, + getPatchConfig().getPatchSerialNumber() + ); + } + }); } public Single startBasal(NormalBasal basal) { @@ -305,8 +300,8 @@ public class PatchManager implements IPatchManager { } - public Single startQuickBolus(float nowDoseU, - float exDoseU, BolusExDuration exDuration) { + public Single startQuickBolus(float nowDoseU, float exDoseU, + BolusExDuration exDuration) { return patchManager.startQuickBolus(nowDoseU, exDoseU, exDuration); } @@ -334,10 +329,6 @@ public class PatchManager implements IPatchManager { return patchManager.deactivate(timeout, force); } - public Single stopBuzz() { - return patchManager.stopBuzz(); - } - public Single infoReminderSet(boolean infoReminder) { return patchManager.infoReminderSet(infoReminder); } @@ -361,14 +352,6 @@ public class PatchManager implements IPatchManager { return patchScanner.scan(timeout); } - @Override - public void initBasalSchedule() { - if(pm.getNormalBasalManager().getNormalBasal() == null){ - pm.getNormalBasalManager().setNormalBasal(profileFunction.getProfile()); - pm.flushNormalBasalManager(); - } - } - @Override public void addBolusToHistory(DetailedBolusInfo originalDetailedBolusInfo) { DetailedBolusInfo detailedBolusInfo = originalDetailedBolusInfo.copy(); @@ -399,12 +382,12 @@ public class PatchManager implements IPatchManager { boolean buzzer = sp.getBoolean(SettingKeys.Companion.getBUZZER_REMINDERS(), false); if(pm.getPatchConfig().getInfoReminder() != buzzer) { if (isActivated()) { - infoReminderSet(buzzer) + mCompositeDisposable.add(infoReminderSet(buzzer) .observeOn(AndroidSchedulers.mainThread()) .subscribe(patchBooleanResponse -> { pm.getPatchConfig().setInfoReminder(buzzer); pm.flushPatchConfig(); - }); + })); } else { pm.getPatchConfig().setInfoReminder(buzzer); pm.flushPatchConfig(); @@ -414,18 +397,18 @@ public class PatchManager implements IPatchManager { @Override public void changeReminderSetting() { - int doseUnit = sp.getInt(SettingKeys.Companion.getLOW_RESERVIOR_REMINDERS(), 0); + int doseUnit = sp.getInt(SettingKeys.Companion.getLOW_RESERVOIR_REMINDERS(), 0); int hours = sp.getInt(SettingKeys.Companion.getEXPIRATION_REMINDERS(), 0); PatchConfig pc = pm.getPatchConfig(); if(pc.getLowReservoirAlertAmount() != doseUnit || pc.getPatchExpireAlertTime() != hours) { if (isActivated()) { - setLowReservoir(doseUnit, hours) + mCompositeDisposable.add(setLowReservoir(doseUnit, hours) .observeOn(AndroidSchedulers.mainThread()) .subscribe(patchBooleanResponse -> { pc.setLowReservoirAlertAmount(doseUnit); pc.setPatchExpireAlertTime(hours); pm.flushPatchConfig(); - }); + })); } else { pc.setLowReservoirAlertAmount(doseUnit); pc.setPatchExpireAlertTime(hours); @@ -437,11 +420,9 @@ public class PatchManager implements IPatchManager { @Override public void checkActivationProcess(){ if(getPatchConfig().getLifecycleEvent().isSubStepRunning() - && !pm.getAlarms().isOccuring(AlarmCode.A005) - && !pm.getAlarms().isOccuring(AlarmCode.A020)) { - rxAction.runOnMainThread(() -> { - rxBus.send(new EventPatchActivationNotComplete()); - }); + && !pm.getAlarms().isOccurring(AlarmCode.A005) + && !pm.getAlarms().isOccurring(AlarmCode.A020)) { + rxAction.runOnMainThread(() -> rxBus.send(new EventPatchActivationNotComplete())); } } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManagerImpl.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManagerImpl.java index f77da843b8..c308950433 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManagerImpl.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchManagerImpl.java @@ -42,7 +42,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.core.scan.BleConnectionSt import info.nightscout.androidaps.plugins.pump.eopatch.core.scan.IBleDevice; import info.nightscout.androidaps.plugins.pump.eopatch.core.Patch; import info.nightscout.androidaps.plugins.pump.eopatch.core.scan.PatchSelfTestResult; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BasalStop; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BuzzerStop; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.GetTemperature; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.PublicKeySend; @@ -59,7 +58,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.code.DeactivationStatus; import java.math.BigInteger; import java.security.AlgorithmParameters; -import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.KeyPair; @@ -74,17 +72,13 @@ import java.security.spec.ECPoint; import java.security.spec.ECPublicKeySpec; import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidParameterSpecException; -import java.sql.SQLException; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.concurrent.TimeUnit; import javax.crypto.KeyAgreement; import javax.inject.Inject; import javax.inject.Singleton; -import info.nightscout.androidaps.plugins.pump.eopatch.core.util.HexString; import info.nightscout.androidaps.plugins.pump.eopatch.code.SettingKeys; import info.nightscout.androidaps.plugins.pump.eopatch.event.EventEoPatchAlarm; import info.nightscout.androidaps.plugins.pump.eopatch.ui.receiver.RxBroadcastReceiver; @@ -102,7 +96,7 @@ import io.reactivex.functions.Consumer; import io.reactivex.schedulers.Schedulers; @Singleton -public class PatchManagerImpl/* implements IPatchConstant*/ { +public class PatchManagerImpl{ @Inject IPreferenceManager pm; @Inject Context context; @Inject SP sp; @@ -115,29 +109,23 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { @Inject NeedleSensingTask START_NEEDLE_CHECK; IBleDevice patch; - HexString hexString; - private CompositeDisposable compositeDisposable; - - private Observable dateTimeChanged; + private final CompositeDisposable compositeDisposable; private static final long DEFAULT_API_TIME_OUT = 10; // SECONDS - private BuzzerStop BUZZER_STOP; - private GetTemperature TEMPERATURE_GET; - private BasalStop BASAL_STOP; - private StopAeBeep ALARM_ALERT_ERROR_BEEP_STOP; - private PublicKeySend PUBLIC_KEY_SET; - private SequenceGet SEQUENCE_GET; + private final BuzzerStop BUZZER_STOP; + private final GetTemperature TEMPERATURE_GET; + private final StopAeBeep ALARM_ALERT_ERROR_BEEP_STOP; + private final PublicKeySend PUBLIC_KEY_SET; + private final SequenceGet SEQUENCE_GET; @Inject public PatchManagerImpl() { compositeDisposable = new CompositeDisposable(); - hexString = new HexString(); BUZZER_STOP = new BuzzerStop(); TEMPERATURE_GET = new GetTemperature(); - BASAL_STOP = new BasalStop(); ALARM_ALERT_ERROR_BEEP_STOP = new StopAeBeep(); PUBLIC_KEY_SET = new PublicKeySend(); SEQUENCE_GET = new SequenceGet(); @@ -153,7 +141,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { filter.addAction(ACTION_DATE_CHANGED); filter.addAction(ACTION_TIMEZONE_CHANGED); - dateTimeChanged = RxBroadcastReceiver.Companion.create(context, filter); + Observable dateTimeChanged = RxBroadcastReceiver.Companion.create(context, filter); compositeDisposable.add( Observable.combineLatest(patch.observeConnected(), pm.observePatchLifeCycle(), @@ -178,7 +166,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { compositeDisposable.add( patch.observeConnected() - .doOnNext(it -> onPatchConnected(it)) + .doOnNext(this::onPatchConnected) .subscribe()); compositeDisposable.add( @@ -190,22 +178,22 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { compositeDisposable.add( EoPatchRxBus.INSTANCE.listen(EventEoPatchAlarm.class) - .filter(it -> it.isFirst()) + .filter(EventEoPatchAlarm::isFirst) .filter(it -> !pm.getPatchConfig().isDeactivated()) .filter(it -> patch.getConnectionState().isConnected()) - .concatMapIterable(it -> it.getAlarmCodes()) - .filter(it -> it.isPatchOccurrenceAlert()) + .concatMapIterable(EventEoPatchAlarm::getAlarmCodes) + .filter(AlarmCode::isPatchOccurrenceAlert) .flatMap(it -> stopAeBeep(it.getAeCode()).toObservable()) .subscribe() ); compositeDisposable.add( EoPatchRxBus.INSTANCE.listen(EventEoPatchAlarm.class) - .filter(it -> it.isFirst()) + .filter(EventEoPatchAlarm::isFirst) .filter(it -> !pm.getPatchConfig().isDeactivated()) .filter(it -> patch.getConnectionState().isConnected()) - .concatMapIterable(it -> it.getAlarmCodes()) - .filter(it -> it.isPatchOccurrenceAlarm()) + .concatMapIterable(EventEoPatchAlarm::getAlarmCodes) + .filter(AlarmCode::isPatchOccurrenceAlarm) .flatMap(it -> pauseBasalImpl(0.0f, System.currentTimeMillis(), it).toObservable()) .subscribe() ); @@ -218,7 +206,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { private void onPatchConnected(boolean connected) { boolean activated = pm.getPatchConfig().isActivated(); boolean useEncryption = pm.getPatchConfig().getSharedKey() != null; - int doseUnit = sp.getInt(SettingKeys.Companion.getLOW_RESERVIOR_REMINDERS(), 0); + int doseUnit = sp.getInt(SettingKeys.Companion.getLOW_RESERVOIR_REMINDERS(), 0); int hours = sp.getInt(SettingKeys.Companion.getEXPIRATION_REMINDERS(), 0); boolean buzzer = sp.getBoolean(SettingKeys.Companion.getBUZZER_REMINDERS(), false); PatchConfig pc = pm.getPatchConfig(); @@ -256,7 +244,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { .subscribe()); } - if(connected == false && activated == true){ + if(!connected && activated){ pm.getPatchConfig().updatetDisconnectedTime(); } } @@ -266,13 +254,15 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { patch.observeAlarmNotification() .subscribe( this::onAlarmNotification, - throwable -> aapsLogger.error(LTag.PUMP, throwable.getMessage()) + throwable -> aapsLogger.error(LTag.PUMP, throwable.getMessage() != null ? + throwable.getMessage() : "AlarmNotification observation error") ), patch.observeInfoNotification() .filter(state -> pm.getPatchConfig().isActivated()) .subscribe( this::onInfoNotification, - throwable -> aapsLogger.error(LTag.PUMP, throwable.getMessage()) + throwable -> aapsLogger.error(LTag.PUMP, throwable.getMessage() != null ? + throwable.getMessage() : "InfoNotification observation error") ) ); } @@ -294,8 +284,6 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { consumer.accept(pm.getPatchConfig()); if (needSave) { pm.flushPatchConfig(); - } else { - pm.flushPatchConfig(); } } } @@ -304,11 +292,8 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { NormalBasal normalBasal = pm.getNormalBasalManager().getNormalBasal(); - if (normalBasal != null) { - // 아래 코드를 실행하면 isDoseUChanged 가 false 가 된다. - if(normalBasal.updateNormalBasalIndex()) { - pm.flushNormalBasalManager(); - } + if(normalBasal.updateNormalBasalIndex()) { + pm.flushNormalBasalManager(); } } @@ -363,7 +348,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { * Activation Process task #4 NEEDLE SENSING * Fragment: fragment_patch_rotate_knob */ - public Single checkNeedleSensing(long timeout) { //TODO: Timeout 추가? + public Single checkNeedleSensing(long timeout) { return START_NEEDLE_CHECK.start() .timeout(timeout, TimeUnit.MILLISECONDS); } @@ -398,7 +383,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { public Single startBasal(NormalBasal basal) { - return startNormalBasalTask.start(basal, false) + return startNormalBasalTask.start(basal) .timeout(DEFAULT_API_TIME_OUT, TimeUnit.SECONDS); } @@ -427,22 +412,6 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { return pauseBasalTask.pause(pauseDurationHour, alarmOccurredTime, alarmCode); } - private Single stopBasal() { - return BASAL_STOP.stop(); - } - - private void insertBasalStart() throws SQLException { - insertBasalStart(System.currentTimeMillis()); - } - - private void insertBasalStart(long timestamp) throws SQLException { - NormalBasal startedBasal = pm.getNormalBasalManager().getNormalBasal(); - if (startedBasal != null) { - startedBasal.updateNormalBasalIndex(); - pm.flushNormalBasalManager(); - } - } - //============================================================================================== // IPatchManager interface [TEMP BASAL] //============================================================================================== @@ -504,34 +473,34 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { return stopComboBolusTask.stop().timeout(DEFAULT_API_TIME_OUT, TimeUnit.SECONDS); } - private Single stopNowAndExtBolus() { - - boolean nowActive = pm.getPatchState().isNowBolusActive(); - boolean extActive = pm.getPatchState().isExtBolusActive(); - - if (nowActive && extActive) { - return stopComboBolus(); - } else if (nowActive) { - return stopNowBolus(); - } else if (extActive) { - return stopExtBolus(); - } - - return Single.just(new PatchBooleanResponse(true)); - } +// private Single stopNowAndExtBolus() { +// +// boolean nowActive = pm.getPatchState().isNowBolusActive(); +// boolean extActive = pm.getPatchState().isExtBolusActive(); +// +// if (nowActive && extActive) { +// return stopComboBolus(); +// } else if (nowActive) { +// return stopNowBolus(); +// } else if (extActive) { +// return stopExtBolus(); +// } +// +// return Single.just(new PatchBooleanResponse(true)); +// } //============================================================================================== // IPatchManager implementation [BOLUS] //============================================================================================== - public void readBolusStatusFromNotification(InfoNotification noti) { - if (noti.isBolusRegAct()) { + public void readBolusStatusFromNotification(InfoNotification infoNotification) { + if (infoNotification.isBolusRegAct()) { BolusCurrent bolusCurrent = pm.getBolusCurrent(); Arrays.asList(BolusType.NOW, BolusType.EXT).forEach(type -> { - if (noti.isBolusRegAct(type)) { // 완료되었어도 업데이트 필요. - int injectedPumpCount = noti.getInjected(type); - int remainPumpCount = noti.getRemain(type); + if (infoNotification.isBolusRegAct(type)) { // 완료되었어도 업데이트 필요. + int injectedPumpCount = infoNotification.getInjected(type); + int remainPumpCount = infoNotification.getRemain(type); bolusCurrent.updateBolusFromPatch(type, injectedPumpCount, remainPumpCount); } }); @@ -547,29 +516,6 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { return deactivateTask.run(force, timeout); } - public Single stopAll(){ - List> sources = new ArrayList<>(); - - // 노멀볼루스 또는 확장볼루스가 동작중이면 정지 - - if (pm.getPatchState().isNowBolusActive() || pm.getPatchState().isExtBolusActive()) { - sources.add(stopNowAndExtBolus()); - } - - // 템프베이젤이 동작중이면 중지 - if (pm.getPatchState().isTempBasalActive()) { - sources.add(stopTempBasal()); - } - - sources.add(stopBasal()); - - return Single.concat(sources).lastOrError(); - } - - public Single stopBuzz() { - return BUZZER_STOP.stop(); - } - @Inject InfoReminderTask infoReminderTask; @@ -677,8 +623,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { ECGenParameterSpec ecSpec_named = new ECGenParameterSpec(SECP256R1); KeyPairGenerator kpg = KeyPairGenerator.getInstance(EC); kpg.initialize(ecSpec_named); - KeyPair pair = kpg.generateKeyPair(); - return pair; + return kpg.generateKeyPair(); }); } @@ -729,8 +674,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { } public static ECPublicKey rawToEncodedECPublicKey(String curveName, byte[] rawBytes) throws - NoSuchAlgorithmException, InvalidKeySpecException, InvalidParameterSpecException, - InvalidAlgorithmParameterException { + NoSuchAlgorithmException, InvalidKeySpecException, InvalidParameterSpecException { KeyFactory kf = KeyFactory.getInstance(EC); int mid = rawBytes.length / 2; byte[] x = Arrays.copyOfRange(rawBytes, 0, mid); @@ -740,7 +684,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { } public static ECParameterSpec ecParameterSpecForCurve(String curveName) throws - NoSuchAlgorithmException, InvalidParameterSpecException, InvalidAlgorithmParameterException { + NoSuchAlgorithmException, InvalidParameterSpecException { AlgorithmParameters params = AlgorithmParameters.getInstance(EC); params.init(new ECGenParameterSpec(curveName)); return params.getParameterSpec(ECParameterSpec.class); @@ -755,7 +699,6 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { return keyAgreement.generateSecret(); } catch (InvalidKeyException | NoSuchAlgorithmException e) { - // TODO Auto-generated catch block e.printStackTrace(); return null; } @@ -768,8 +711,7 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { private static final Scheduler SS = Schedulers.single(); public BleConnectionState getPatchConnectionState() { - BleConnectionState result = patch.getConnectionState(); - return result; + return patch.getConnectionState(); } public Observable observePatchConnectionState() { @@ -780,14 +722,3 @@ public class PatchManagerImpl/* implements IPatchConstant*/ { patch.updateMacAddress(mac, b); } } - -class AlarmFiredEventInfo -{ - public AlarmCode code; - public long createTimestamp; - - public AlarmFiredEventInfo(AlarmCode code, long createTimestamp) { - this.code = code; - this.createTimestamp = createTimestamp; - } -} diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchStateManager.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchStateManager.java index 0efaa50521..974c7ac061 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchStateManager.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PatchStateManager.java @@ -52,7 +52,7 @@ public class PatchStateManager { final PatchState oldState = pm.getPatchState(); int diff = newState.currentTime() - oldState.currentTime(); - if (0 <= diff && diff < 10) { // TODO 상수로 변경. + if (0 <= diff && diff < 10) { /* 10초 안에 같은 PatchState update 시 skip */ if (oldState.equalState(newState)) { return; @@ -267,8 +267,7 @@ public class PatchStateManager { public synchronized void onBasalStarted(NormalBasal basal, long timestamp) { if (basal != null) { pm.getNormalBasalManager().updateBasalStarted(); - - basal.updateNormalBasalIndex(); //normal basal index를 업데이트하여 basal change 이력이 또 발생하는것을 방지(df_356) + basal.updateNormalBasalIndex(); } pm.getPatchConfig().updateNormalBasalStarted(); // updateNormalBasalStarted 도 동일함... diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PreferenceManager.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PreferenceManager.kt index 97164f6c81..244814a109 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PreferenceManager.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/PreferenceManager.kt @@ -148,12 +148,12 @@ class PreferenceManager @Inject constructor(): IPreferenceManager { aapsLogger.error(LTag.PUMP, ex.message?:"Alarms load error") } - aapsLogger.info(LTag.PUMP,"Load from PatchConfig preference: ${mPatchConfig}") - aapsLogger.info(LTag.PUMP,"Load from PatchState preference: ${mPatchState}") - aapsLogger.info(LTag.PUMP,"Load from BolusCurrent preference: ${mBolusCurrent}") - aapsLogger.info(LTag.PUMP,"Load from NormalBasal preference: ${mNormalBasalMgr}") - aapsLogger.info(LTag.PUMP,"Load from TempBasal preference: ${mTempBasalMgr}") - aapsLogger.info(LTag.PUMP,"Load from Alarms preference: ${mAlarms}") + aapsLogger.info(LTag.PUMP,"Load from PatchConfig preference: $mPatchConfig") + aapsLogger.info(LTag.PUMP,"Load from PatchState preference: $mPatchState") + aapsLogger.info(LTag.PUMP,"Load from BolusCurrent preference: $mBolusCurrent") + aapsLogger.info(LTag.PUMP,"Load from NormalBasal preference: $mNormalBasalMgr") + aapsLogger.info(LTag.PUMP,"Load from TempBasal preference: $mTempBasalMgr") + aapsLogger.info(LTag.PUMP,"Load from Alarms preference: $mAlarms") initialized = true } @@ -179,9 +179,8 @@ class PreferenceManager @Inject constructor(): IPreferenceManager { flushBolusCurrent() mTempBasalMgr.clear() flushTempBasalManager() - // mAlarms.clear() - // flushAlarms() } + else -> Unit } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ActivateTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ActivateTask.java index 8e2c3710f1..888444e186 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ActivateTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ActivateTask.java @@ -1,7 +1,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ble.task; import info.nightscout.shared.logging.LTag; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BasalScheduleSetBig; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.SetKey; import info.nightscout.androidaps.plugins.pump.eopatch.core.response.BaseResponse; @@ -17,15 +16,11 @@ import io.reactivex.schedulers.Schedulers; public class ActivateTask extends TaskBase { @Inject StartNormalBasalTask startBasalTask; - private SetKey SET_KEY; - private BasalScheduleSetBig BASAL_SCHEDULE_SET_BIG; - + private final SetKey SET_KEY = new SetKey(); @Inject public ActivateTask() { super(TaskFunc.ACTIVATE); - SET_KEY = new SetKey(); - BASAL_SCHEDULE_SET_BIG = new BasalScheduleSetBig(); } public Single start() { @@ -35,9 +30,9 @@ public class ActivateTask extends TaskBase { .doOnNext(this::checkResponse) .firstOrError() .observeOn(Schedulers.io()).doOnSuccess(this::onActivated) - .flatMap(v -> startBasalTask.start(enabled, false)) + .flatMap(v -> startBasalTask.start(enabled)) .map(BaseResponse::isSuccess) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "ActivateTask error")); } private void onActivated(BaseResponse response) { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/BolusTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/BolusTask.java index 016ea308a6..2896e250aa 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/BolusTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/BolusTask.java @@ -4,6 +4,7 @@ import info.nightscout.androidaps.plugins.pump.eopatch.code.BolusExDuration; import info.nightscout.androidaps.plugins.pump.eopatch.AppConstant; import info.nightscout.androidaps.plugins.pump.eopatch.core.code.BolusType; +import info.nightscout.androidaps.plugins.pump.eopatch.core.util.FloatAdjusters; import info.nightscout.androidaps.plugins.pump.eopatch.vo.BolusCurrent; abstract class BolusTask extends TaskBase { @@ -16,17 +17,17 @@ abstract class BolusTask extends TaskBase { boolean now = (nowDoseU > 0); boolean ext = (exDoseU > 0); - long startTimestamp = now ? System.currentTimeMillis() : 0; // dm_1720 + long startTimestamp = now ? System.currentTimeMillis() : 0; long endTimestamp = startTimestamp + getPumpDuration(nowDoseU); long nowHistoryID = 1L; //record no - long exStartTimestamp = 0; + long exStartTimestamp; if (now) { pm.getBolusCurrent().startNowBolus(nowHistoryID, nowDoseU, startTimestamp, endTimestamp); } if (ext) { - long estimatedExStartTimestamp = 0; + long estimatedExStartTimestamp; if (now) { exStartTimestamp = 0; @@ -46,12 +47,8 @@ abstract class BolusTask extends TaskBase { } - public void onCalcBolusStarted(float nowDoseU, float correctionBolus, float exDoseU, - BolusExDuration exDuration) { - + public void onCalcBolusStarted(float nowDoseU) { boolean now = (nowDoseU > 0); - boolean ext = (exDoseU > 0); - long startTimestamp = now ? System.currentTimeMillis() : 0; // dm_1720 long endTimestamp = startTimestamp + getPumpDuration(nowDoseU); @@ -62,24 +59,6 @@ abstract class BolusTask extends TaskBase { pm.getBolusCurrent().startNowBolus(nowHistoryID, nowDoseU, startTimestamp, endTimestamp); } - long exStartTimestamp = 0; - - if (ext) { - long estimatedExStartTimestamp = 0; - - if (now) { - exStartTimestamp = 0; - } - else { - estimatedExStartTimestamp = System.currentTimeMillis(); - exStartTimestamp = estimatedExStartTimestamp; - } - long exEndTimestamp = exStartTimestamp + exDuration.milli(); - long extHistoryID = 2L; //record no - pm.getBolusCurrent().startExtBolus(extHistoryID, exDoseU, exStartTimestamp, - exEndTimestamp, exDuration.milli()); - } - pm.flushBolusCurrent(); } @@ -88,12 +67,13 @@ abstract class BolusTask extends TaskBase { } public void updateNowBolusStopped(int injected, long suspendedTimestamp) { - BolusCurrent bolusCurrent = pm.getBolusCurrent(); long nowID = bolusCurrent.historyId(BolusType.NOW); if (nowID > 0 && !bolusCurrent.endTimeSynced(BolusType.NOW)) { -// long stopTime = (suspendedTimestamp > 0) ? suspendedTimestamp : System.currentTimeMillis(); -// float injectedDoseU = FloatAdjusters.INSTANCE.getFLOOR2_BOLUS().apply(injected * AppConstant.INSULIN_UNIT_P); + long stopTime = (suspendedTimestamp > 0) ? suspendedTimestamp : System.currentTimeMillis(); + float injectedDoseU = FloatAdjusters.FLOOR2_BOLUS.apply(injected * AppConstant.INSULIN_UNIT_P); + bolusCurrent.getNowBolus().setInjected(injectedDoseU); + bolusCurrent.getNowBolus().setEndTimestamp(stopTime); bolusCurrent.setEndTimeSynced(BolusType.NOW, true); pm.flushBolusCurrent(); } @@ -107,8 +87,10 @@ abstract class BolusTask extends TaskBase { BolusCurrent bolusCurrent = pm.getBolusCurrent(); long extID = bolusCurrent.historyId(BolusType.EXT); if (extID > 0 && !bolusCurrent.endTimeSynced(BolusType.EXT)) { -// long stopTime = (suspendedTimestamp > 0) ? suspendedTimestamp : System.currentTimeMillis(); -// float injectedDoseU = FloatAdjusters.INSTANCE.getFLOOR2_BOLUS().apply(injected * AppConstant.INSULIN_UNIT_P); + long stopTime = (suspendedTimestamp > 0) ? suspendedTimestamp : System.currentTimeMillis(); + float injectedDoseU = FloatAdjusters.FLOOR2_BOLUS.apply(injected * AppConstant.INSULIN_UNIT_P); + bolusCurrent.getExtBolus().setInjected(injectedDoseU); + bolusCurrent.getExtBolus().setEndTimestamp(stopTime); bolusCurrent.setEndTimeSynced(BolusType.EXT, true); pm.flushBolusCurrent(); } @@ -116,8 +98,8 @@ abstract class BolusTask extends TaskBase { private long getPumpDuration(float doseU) { if (doseU > 0) { - long pumpDuration = pm.getPatchConfig().getPumpDurationSmallMilli(); //todo - return (long) ((doseU / AppConstant.Companion.getBOLUS_UNIT_STEP()) * pumpDuration); + long pumpDuration = pm.getPatchConfig().getPumpDurationSmallMilli(); + return (long) ((doseU / AppConstant.BOLUS_UNIT_STEP) * pumpDuration); } return 0L; } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/DeactivateTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/DeactivateTask.java index 1299a99a6b..3a403a4fe2 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/DeactivateTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/DeactivateTask.java @@ -5,7 +5,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.ble.IPreferenceManager; import info.nightscout.androidaps.plugins.pump.eopatch.core.code.BolusType; import info.nightscout.androidaps.plugins.pump.eopatch.code.DeactivationStatus; -import java.sql.SQLException; import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -14,7 +13,6 @@ import javax.inject.Singleton; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.DeActivation; import info.nightscout.androidaps.plugins.pump.eopatch.vo.BolusCurrent; import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchLifecycleEvent; -import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchState; import info.nightscout.androidaps.plugins.pump.eopatch.vo.TempBasal; import io.reactivex.Observable; import io.reactivex.Single; @@ -22,14 +20,10 @@ import io.reactivex.schedulers.Schedulers; @Singleton public class DeactivateTask extends TaskBase { + @Inject StopBasalTask stopBasalTask; + @Inject IPreferenceManager pm; - @Inject - StopBasalTask stopBasalTask; - - @Inject - IPreferenceManager pm; - - private DeActivation DEACTIVATION; + private final DeActivation DEACTIVATION; @Inject public DeactivateTask() { @@ -44,16 +38,16 @@ public class DeactivateTask extends TaskBase { DEACTIVATION.start() .doOnSuccess(this::checkResponse) .observeOn(Schedulers.io()) - .doOnSuccess(response -> onDeactivated(false))) + .doOnSuccess(response -> onDeactivated())) .map(response -> DeactivationStatus.of(response.isSuccess(), forced)) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())) + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "DeactivateTask error")) .onErrorResumeNext(e -> { if (forced) { try { - onDeactivated(true); + onDeactivated(); } catch (Exception t) { - aapsLogger.error(LTag.PUMPCOMM, e.getMessage()); + aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "DeactivateTask error"); } } @@ -73,31 +67,27 @@ public class DeactivateTask extends TaskBase { return isReady(); } - /* Schedulers.io() */ - private void onDeactivated(boolean forced) throws SQLException { + private void onDeactivated() { synchronized (lock) { patch.updateMacAddress(null, false); if (pm.getPatchConfig().getLifecycleEvent().isShutdown()) { return; } - cleanUpRepository(); - pm.getNormalBasalManager().updateForDeactivation(); - pm.updatePatchLifeCycle(PatchLifecycleEvent.createShutdown()); } } - private void cleanUpRepository() throws SQLException { + private void cleanUpRepository() { updateNowBolusStopped(); updateExtBolusStopped(); updateTempBasalStopped(); } - private void updateTempBasalStopped() throws SQLException { + private void updateTempBasalStopped() { TempBasal tempBasal = pm.getTempBasalManager().getStartedBasal(); if (tempBasal != null) { @@ -106,7 +96,6 @@ public class DeactivateTask extends TaskBase { } } - /* copied from BolusTask. */ private void updateNowBolusStopped() { BolusCurrent bolusCurrent = pm.getBolusCurrent(); long nowID = bolusCurrent.historyId(BolusType.NOW); @@ -117,7 +106,6 @@ public class DeactivateTask extends TaskBase { } } - /* copied from BolusTask. */ private void updateExtBolusStopped() { BolusCurrent bolusCurrent = pm.getBolusCurrent(); long extID = bolusCurrent.historyId(BolusType.EXT); diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/FetchAlarmTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/FetchAlarmTask.java index 13a9326480..84276d013e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/FetchAlarmTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/FetchAlarmTask.java @@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ble.task; import info.nightscout.shared.logging.LTag; import info.nightscout.androidaps.plugins.bus.RxBus; -import info.nightscout.androidaps.plugins.pump.eopatch.alarm.AlarmCode; import info.nightscout.androidaps.plugins.pump.eopatch.alarm.IAlarmRegistry; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.GetErrorCodes; @@ -13,18 +12,13 @@ import javax.inject.Singleton; import info.nightscout.androidaps.plugins.pump.eopatch.core.response.AeCodeResponse; import io.reactivex.Single; -import io.reactivex.android.schedulers.AndroidSchedulers; @Singleton public class FetchAlarmTask extends TaskBase { + @Inject RxBus rxBus; + @Inject IAlarmRegistry alarmRegistry; - @Inject - RxBus rxBus; - - @Inject - IAlarmRegistry alarmRegistry; - - private GetErrorCodes ALARM_ALERT_ERROR_CODE_GET; + private final GetErrorCodes ALARM_ALERT_ERROR_CODE_GET; @Inject public FetchAlarmTask() { @@ -38,7 +32,7 @@ public class FetchAlarmTask extends TaskBase { .doOnNext(this::checkResponse) .firstOrError() .doOnSuccess(aeCodeResponse -> alarmRegistry.add(aeCodeResponse.getAlarmCodes())) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "FetchAlarmTask error")); } public synchronized void enqueue() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/GetPatchInfoTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/GetPatchInfoTask.java index e84f9d649f..d297086148 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/GetPatchInfoTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/GetPatchInfoTask.java @@ -26,17 +26,15 @@ import io.reactivex.schedulers.Schedulers; @Singleton public class GetPatchInfoTask extends TaskBase { + @Inject UpdateConnectionTask updateConnectionTask; - @Inject - UpdateConnectionTask updateConnectionTask; - - private SetGlobalTime SET_GLOBAL_TIME; - private GetSerialNumber SERIAL_NUMBER_GET; - private GetLOT LOT_NUMBER_GET; - private GetFirmwareVersion FIRMWARE_VERSION_GET; - private GetWakeUpTime WAKE_UP_TIME_GET; - private GetPumpDuration PUMP_DURATION_GET; - private GetModelName GET_MODEL_NAME; + private final SetGlobalTime SET_GLOBAL_TIME; + private final GetSerialNumber SERIAL_NUMBER_GET; + private final GetLOT LOT_NUMBER_GET; + private final GetFirmwareVersion FIRMWARE_VERSION_GET; + private final GetWakeUpTime WAKE_UP_TIME_GET; + private final GetPumpDuration PUMP_DURATION_GET; + private final GetModelName GET_MODEL_NAME; @Inject public GetPatchInfoTask() { @@ -61,17 +59,16 @@ public class GetPatchInfoTask extends TaskBase { PUMP_DURATION_GET.get().doOnSuccess(this::onPumpDurationResponse), GET_MODEL_NAME.get().doOnSuccess(this::onModelNameResponse))) .map(BaseResponse::isSuccess) - .filter(v -> !v) // fail 시 false 가 아래로 내려간다. + .filter(v -> !v) .first(true); return isReady() .concatMapSingle(it -> tasks) .firstOrError() -// .flatMap(v -> updateConnectionTask.update()).map(v -> true) .observeOn(Schedulers.io()) .doOnSuccess(this::onPatchWakeupSuccess) .doOnError(this::onPatchWakeupFailed) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "GetPatchInfoTask error")); } private void onSerialNumberResponse(SerialNumberResponse v) { @@ -91,23 +88,21 @@ public class GetPatchInfoTask extends TaskBase { } private void onPumpDurationResponse(PumpDurationResponse v) { - pm.getPatchConfig().setPumpDurationLargeMilli(v.getDurationL() * 100); // 0.1 초 단위 - pm.getPatchConfig().setPumpDurationMediumMilli(v.getDurationM() * 100); - pm.getPatchConfig().setPumpDurationSmallMilli(v.getDurationS() * 100); + pm.getPatchConfig().setPumpDurationLargeMilli(v.getDurationL() * 100L); + pm.getPatchConfig().setPumpDurationMediumMilli(v.getDurationM() * 100L); + pm.getPatchConfig().setPumpDurationSmallMilli(v.getDurationS() * 100L); } private void onModelNameResponse(ModelNameResponse modelNameResponse) { pm.getPatchConfig().setPatchModelName(modelNameResponse.getModelName()); } - /* Schedulers.io() */ private void onPatchWakeupSuccess(Boolean result) { synchronized (lock) { pm.flushPatchConfig(); } } - /* Schedulers.io() */ private void onPatchWakeupFailed(Throwable e) { patch.setSeq(-1); pm.getPatchConfig().updateDeactivated(); diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InfoReminderTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InfoReminderTask.java index f2a32536e8..367016ffb1 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InfoReminderTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InfoReminderTask.java @@ -14,11 +14,9 @@ import io.reactivex.Single; @Singleton public class InfoReminderTask extends TaskBase { + @Inject IPreferenceManager pm; - @Inject - IPreferenceManager pm; - - private InfoReminderSet INFO_REMINDER_SET; + private final InfoReminderSet INFO_REMINDER_SET; @Inject public InfoReminderTask() { @@ -32,7 +30,7 @@ public class InfoReminderTask extends TaskBase { .concatMapSingle(v -> INFO_REMINDER_SET.set(infoReminder)) .doOnNext(this::checkResponse) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "InfoReminderTask error")); } public synchronized void enqueue() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InternalSuspendedTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InternalSuspendedTask.java index 9e73ead46e..facd2c38c8 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InternalSuspendedTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/InternalSuspendedTask.java @@ -6,8 +6,6 @@ import info.nightscout.androidaps.interfaces.PumpSync; import info.nightscout.androidaps.logging.UserEntryLogger; import info.nightscout.androidaps.utils.userEntry.UserEntryMapper; import info.nightscout.shared.logging.LTag; -import info.nightscout.androidaps.plugins.pump.eopatch.core.define.IPatchConstant; - import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -15,11 +13,8 @@ import javax.inject.Singleton; import info.nightscout.androidaps.interfaces.CommandQueue; import info.nightscout.shared.logging.AAPSLogger; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BolusStop; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.GetInternalSuspendTime; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.TempBasalScheduleStop; import info.nightscout.androidaps.plugins.pump.eopatch.core.response.PatchInternalSuspendTimeResponse; -import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchState; import info.nightscout.androidaps.queue.Callback; import info.nightscout.androidaps.queue.commands.Command; @@ -29,47 +24,44 @@ import io.reactivex.subjects.BehaviorSubject; @Singleton public class InternalSuspendedTask extends BolusTask { - @Inject CommandQueue commandQueue; @Inject AAPSLogger aapsLogger; @Inject PumpSync pumpSync; @Inject UserEntryLogger uel; - private GetInternalSuspendTime INTERNAL_SUSPEND_TIME_GET; - private BolusStop BOLUS_STOP; - private TempBasalScheduleStop TEMP_BASAL_SCHEDULE_STOP; - private BehaviorSubject bolusCheckSubject = BehaviorSubject.create(); - private BehaviorSubject exbolusCheckSubject = BehaviorSubject.create(); - private BehaviorSubject basalCheckSubject = BehaviorSubject.create(); + private final GetInternalSuspendTime INTERNAL_SUSPEND_TIME_GET; + private final BehaviorSubject bolusCheckSubject = BehaviorSubject.create(); + private final BehaviorSubject extendedBolusCheckSubject = BehaviorSubject.create(); + private final BehaviorSubject basalCheckSubject = BehaviorSubject.create(); @Inject public InternalSuspendedTask() { super(TaskFunc.INTERNAL_SUSPEND); INTERNAL_SUSPEND_TIME_GET = new GetInternalSuspendTime(); - BOLUS_STOP = new BolusStop(); - TEMP_BASAL_SCHEDULE_STOP = new TempBasalScheduleStop(); } - private Observable getBolusSebject(){ + private Observable getBolusSubject(){ return bolusCheckSubject.hide(); } - private Observable getExbolusSebject(){ - return exbolusCheckSubject.hide(); + private Observable getExtendedBolusSubject(){ + return extendedBolusCheckSubject.hide(); } - private Observable getBasalSebject(){ + private Observable getBasalSubject(){ return basalCheckSubject.hide(); } public Single start(boolean isNowBolusActive, boolean isExtBolusActive, boolean isTempBasalActive) { - PatchState patchState = pm.getPatchState(); - if (isNowBolusActive || isExtBolusActive) { enqueue(TaskFunc.READ_BOLUS_FINISH_TIME); } + if (isTempBasalActive) { + enqueue(TaskFunc.READ_TEMP_BASAL_FINISH_TIME); + } + if (commandQueue.isRunning(Command.CommandType.BOLUS)) { uel.log(UserEntryMapper.Action.CANCEL_BOLUS, UserEntryMapper.Sources.EOPatch2); commandQueue.cancelAllBoluses(); @@ -82,11 +74,11 @@ public class InternalSuspendedTask extends BolusTask { commandQueue.cancelExtended(new Callback() { @Override public void run() { - exbolusCheckSubject.onNext(true); + extendedBolusCheckSubject.onNext(true); } }); }else{ - exbolusCheckSubject.onNext(true); + extendedBolusCheckSubject.onNext(true); } if (pumpSync.expectedPumpState().getTemporaryBasal() != null) { @@ -101,14 +93,13 @@ public class InternalSuspendedTask extends BolusTask { basalCheckSubject.onNext(true); } - return Observable.zip(getBolusSebject(), getExbolusSebject(), getBasalSebject(), (bolusReady, exbolusReady, basalReady) -> { - return (bolusReady && exbolusReady && basalReady); - }) + return Observable.zip(getBolusSubject(), getExtendedBolusSubject(), getBasalSubject(), + (bolusReady, extendedBolusReady, basalReady) -> (bolusReady && extendedBolusReady && basalReady)) .filter(ready -> ready) .flatMap(v -> isReady()) .concatMapSingle(v -> getInternalSuspendTime()) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "InternalSuspendedTask error")); } private Single getInternalSuspendTime() { @@ -117,56 +108,6 @@ public class InternalSuspendedTask extends BolusTask { .map(PatchInternalSuspendTimeResponse::getTotalSeconds); } - private Single stopNowBolus(long suspendTime, boolean isNowBolusActive) { - if (isNowBolusActive) { - long suspendedTimestamp = pm.getPatchConfig().getPatchWakeupTimestamp() + suspendTime; - - return BOLUS_STOP.stop(IPatchConstant.NOW_BOLUS_ID) - .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onNowBolusStopped(v.getInjectedBolusAmount(), suspendedTimestamp)) - .map(v -> suspendTime); - } - - return Single.just(suspendTime); - } - - private Single stopExtBolus(long suspendTime, boolean isExtBolusActive) { - if (isExtBolusActive) { - long suspendedTimestamp = pm.getPatchConfig().getPatchWakeupTimestamp() + suspendTime; - - return BOLUS_STOP.stop(IPatchConstant.EXT_BOLUS_ID) - .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onExtBolusStopped(v.getInjectedBolusAmount(), suspendedTimestamp)) - .map(v -> suspendTime); - } - - return Single.just(suspendTime); - } - - private Single stopTempBasal(long suspendTime, boolean isTempBasalActive) { - if (isTempBasalActive) { - return TEMP_BASAL_SCHEDULE_STOP.stop() - .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onTempBasalCanceled()) - .map(v -> suspendTime); - } - - return Single.just(suspendTime); - } - - private void onNowBolusStopped(int injectedBolusAmount, long suspendedTimestamp) { - updateNowBolusStopped(injectedBolusAmount, suspendedTimestamp); - } - - private void onExtBolusStopped(int injectedBolusAmount, long suspendedTimestamp) { - updateExtBolusStopped(injectedBolusAmount, suspendedTimestamp); - } - - private void onTempBasalCanceled() { - pm.getTempBasalManager().updateBasalStopped(); - pm.flushTempBasalManager(); - } - public synchronized void enqueue(boolean isNowBolusActive, boolean isExtBolusActive, boolean isTempBasalActive) { boolean ready = (disposable == null || disposable.isDisposed()); @@ -175,7 +116,7 @@ public class InternalSuspendedTask extends BolusTask { .timeout(TASK_ENQUEUE_TIME_OUT, TimeUnit.SECONDS) .subscribe(v -> { bolusCheckSubject.onNext(false); - exbolusCheckSubject.onNext(false); + extendedBolusCheckSubject.onNext(false); basalCheckSubject.onNext(false); }); } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/NeedleSensingTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/NeedleSensingTask.java index d924bc3659..c39f8d740b 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/NeedleSensingTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/NeedleSensingTask.java @@ -13,9 +13,7 @@ import io.reactivex.Single; @Singleton public class NeedleSensingTask extends TaskBase { - - @Inject - IAlarmRegistry alarmRegistry; + @Inject IAlarmRegistry alarmRegistry; StartNeedleCheck START_NEEDLE_CHECK; UpdateConnection UPDATE_CONNECTION; @@ -38,7 +36,7 @@ public class NeedleSensingTask extends TaskBase { .doOnNext(this::onResponse) .map(patchState -> !patchState.isNeedNeedleSensing()) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "NeedleSensingTask error")); } private void onResponse(PatchState v) { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PauseBasalTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PauseBasalTask.java index ebd32d3aec..9b0dca6015 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PauseBasalTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PauseBasalTask.java @@ -18,13 +18,9 @@ import info.nightscout.shared.logging.LTag; import info.nightscout.androidaps.plugins.pump.eopatch.alarm.AlarmCode; import info.nightscout.androidaps.plugins.pump.eopatch.alarm.IAlarmRegistry; import info.nightscout.androidaps.plugins.pump.eopatch.ble.IPreferenceManager; -import info.nightscout.androidaps.plugins.pump.eopatch.core.define.IPatchConstant; import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchState; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BasalPause; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BolusStop; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.TempBasalScheduleStop; import info.nightscout.androidaps.plugins.pump.eopatch.core.response.PatchBooleanResponse; -import info.nightscout.androidaps.plugins.pump.eopatch.vo.TempBasal; import info.nightscout.androidaps.queue.Callback; import info.nightscout.androidaps.queue.commands.Command; import io.reactivex.Observable; @@ -40,33 +36,28 @@ public class PauseBasalTask extends BolusTask { @Inject PumpSync pumpSync; @Inject UserEntryLogger uel; - private BasalPause BASAL_PAUSE; - private BolusStop BOLUS_STOP; - private TempBasalScheduleStop TEMP_BASAL_SCHEDULE_STOP; - - private BehaviorSubject bolusCheckSubject = BehaviorSubject.create(); - private BehaviorSubject exbolusCheckSubject = BehaviorSubject.create(); - private BehaviorSubject basalCheckSubject = BehaviorSubject.create(); + private final BasalPause BASAL_PAUSE; + private final BehaviorSubject bolusCheckSubject = BehaviorSubject.create(); + private final BehaviorSubject extendedBolusCheckSubject = BehaviorSubject.create(); + private final BehaviorSubject basalCheckSubject = BehaviorSubject.create(); @Inject public PauseBasalTask() { super(TaskFunc.PAUSE_BASAL); BASAL_PAUSE = new BasalPause(); - BOLUS_STOP = new BolusStop(); - TEMP_BASAL_SCHEDULE_STOP = new TempBasalScheduleStop(); } - private Observable getBolusSebject(){ + private Observable getBolusSubject(){ return bolusCheckSubject.hide(); } - private Observable getExbolusSebject(){ - return exbolusCheckSubject.hide(); + private Observable getExtendedBolusSubject(){ + return extendedBolusCheckSubject.hide(); } - private Observable getBasalSebject(){ + private Observable getBasalSubject(){ return basalCheckSubject.hide(); } @@ -90,11 +81,11 @@ public class PauseBasalTask extends BolusTask { commandQueue.cancelExtended(new Callback() { @Override public void run() { - exbolusCheckSubject.onNext(true); + extendedBolusCheckSubject.onNext(true); } }); }else{ - exbolusCheckSubject.onNext(true); + extendedBolusCheckSubject.onNext(true); } if (pumpSync.expectedPumpState().getTemporaryBasal() != null) { @@ -109,71 +100,35 @@ public class PauseBasalTask extends BolusTask { basalCheckSubject.onNext(true); } - return Observable.zip(getBolusSebject(), getExbolusSebject(), getBasalSebject(), (bolusReady, exbolusReady, basalReady) -> { - return (bolusReady && exbolusReady && basalReady); - }) + return Observable.zip(getBolusSubject(), getExtendedBolusSubject(), getBasalSubject(), + (bolusReady, extendedBolusReady, basalReady) -> (bolusReady && extendedBolusReady && basalReady)) .filter(ready -> ready) .flatMap(v -> isReady()) - .concatMapSingle(v -> getSuspendedTime(pausedTimestamp, alarmCode)) - .concatMapSingle(suspendedTimestamp -> pauseBasal(pauseDurationHour, suspendedTimestamp, alarmCode)) + .concatMapSingle(v -> getSuspendedTime(pausedTimestamp)) + .concatMapSingle(suspendedTimestamp -> pauseBasal(pauseDurationHour, alarmCode)) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "PauseBasalTask error")); } - private Single getSuspendedTime(long pausedTimestamp, @Nullable AlarmCode alarmCode) { + private Single getSuspendedTime(long pausedTimestamp) { return Single.just(pausedTimestamp); } - private Single stopNowBolus(long pausedTimestamp, boolean isNowBolusActive) { - if (isNowBolusActive) { - return BOLUS_STOP.stop(IPatchConstant.NOW_BOLUS_ID) - .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onNowBolusStopped(v.getInjectedBolusAmount(), pausedTimestamp)) - .map(v -> pausedTimestamp); - } - - return Single.just(pausedTimestamp); - } - - private Single stopExtBolus(long pausedTimestamp, boolean isExtBolusActive) { - if (isExtBolusActive) { - return BOLUS_STOP.stop(IPatchConstant.EXT_BOLUS_ID) - .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onExtBolusStopped(v.getInjectedBolusAmount(), pausedTimestamp)) - .map(v -> pausedTimestamp); - } - - return Single.just(pausedTimestamp); - } - - private Single stopTempBasal(long pausedTimestamp, boolean isTempBasalActive) { - if (isTempBasalActive) { - return TEMP_BASAL_SCHEDULE_STOP.stop() - .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onTempBasalCanceled(pausedTimestamp)) - .map(v -> pausedTimestamp); - } - - return Single.just(pausedTimestamp); - } - - private Single pauseBasal(float pauseDurationHour, long suspendedTimestamp, @Nullable AlarmCode alarmCode) { + private Single pauseBasal(float pauseDurationHour, @Nullable AlarmCode alarmCode) { if(alarmCode == null) { return BASAL_PAUSE.pause(pauseDurationHour) .doOnSuccess(this::checkResponse) - .doOnSuccess(v -> onBasalPaused(pauseDurationHour, suspendedTimestamp, null)); + .doOnSuccess(v -> onBasalPaused(pauseDurationHour, null)); } // 정지 알람 발생 시 basal pause 커맨드 전달하지 않음 - 주입 정지 이력만 생성 - onBasalPaused(pauseDurationHour, suspendedTimestamp, alarmCode); + onBasalPaused(pauseDurationHour, alarmCode); return Single.just(new PatchBooleanResponse(true)); } - private void onBasalPaused(float pauseDurationHour, long suspendedTimestamp, @Nullable AlarmCode alarmCode) { + private void onBasalPaused(float pauseDurationHour, @Nullable AlarmCode alarmCode) { if (!pm.getNormalBasalManager().isSuspended()) { - String strCode = (alarmCode != null) ? alarmCode.name() : null; - if (alarmCode != null) { pm.getPatchConfig().updateNormalBasalPausedSilently(); } @@ -192,23 +147,6 @@ public class PauseBasalTask extends BolusTask { enqueue(TaskFunc.UPDATE_CONNECTION); } - private void onNowBolusStopped(int injectedBolusAmount, long suspendedTimestamp) { - updateNowBolusStopped(injectedBolusAmount, suspendedTimestamp); - } - - private void onExtBolusStopped(int injectedBolusAmount, long suspendedTimestamp) { - updateExtBolusStopped(injectedBolusAmount, suspendedTimestamp); - } - - private void onTempBasalCanceled(long suspendedTimestamp) { - TempBasal tempBasal = pm.getTempBasalManager().getStartedBasal(); - - if (tempBasal != null) { - pm.getTempBasalManager().updateBasalStopped(); - pm.flushTempBasalManager(); - } - } - public synchronized void enqueue(float pauseDurationHour, long pausedTime, @Nullable AlarmCode alarmCode) { boolean ready = (disposable == null || disposable.isDisposed()); @@ -217,7 +155,7 @@ public class PauseBasalTask extends BolusTask { .timeout(TASK_ENQUEUE_TIME_OUT, TimeUnit.SECONDS) .subscribe(v -> { bolusCheckSubject.onNext(false); - exbolusCheckSubject.onNext(false); + extendedBolusCheckSubject.onNext(false); basalCheckSubject.onNext(false); }); } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PrimingTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PrimingTask.java index 57d318ac67..ed65a8430e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PrimingTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/PrimingTask.java @@ -14,9 +14,8 @@ import io.reactivex.Observable; @Singleton public class PrimingTask extends TaskBase { - - private UpdateConnection UPDATE_CONNECTION; - private StartPriming START_PRIMING; + private final UpdateConnection UPDATE_CONNECTION; + private final StartPriming START_PRIMING; @Inject public PrimingTask() { @@ -31,25 +30,25 @@ public class PrimingTask extends TaskBase { .doOnNext(this::checkResponse) .flatMap(v -> observePrimingSuccess(count)) .takeUntil(value -> (value == count)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "PrimingTask error")); } private Observable observePrimingSuccess(long count) { return Observable.merge( Observable.interval(1, TimeUnit.SECONDS).take(count + 10) - .map(v -> v * 3) // 현재 20초 니깐 60 정도에서 꽉 채워짐. *4 도 괜찮을 듯. + .map(v -> v * 3) .doOnNext(v -> { if (v >= count) { throw new Exception("Priming failed"); } - }), // 프로그래스바 용. + }), Observable.interval(3, TimeUnit.SECONDS) .concatMapSingle(v -> UPDATE_CONNECTION.get()) .map(response -> PatchState.Companion.create(response.getPatchState(), System.currentTimeMillis())) - .filter(patchState -> patchState.isPrimingSuccess()) - .map(result -> count) // 프라이밍 체크 용 성공시 count 값 리턴 + .filter(PatchState::isPrimingSuccess) + .map(result -> count) ); } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadBolusFinishTimeTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadBolusFinishTimeTask.java index 6f9d1a212a..971d8cd0be 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadBolusFinishTimeTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadBolusFinishTimeTask.java @@ -15,8 +15,7 @@ import io.reactivex.Single; @Singleton public class ReadBolusFinishTimeTask extends BolusTask { - - private BolusFinishTimeGet BOLUS_FINISH_TIME_GET; + private final BolusFinishTimeGet BOLUS_FINISH_TIME_GET; @Inject public ReadBolusFinishTimeTask() { @@ -30,7 +29,7 @@ public class ReadBolusFinishTimeTask extends BolusTask { .firstOrError() .doOnSuccess(this::checkResponse) .doOnSuccess(this::onResponse) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "ReadBolusFinishTimeTask error")); } void onResponse(BolusFinishTimeResponse response) { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadTempBasalFinishTimeTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadTempBasalFinishTimeTask.java index 0d42506fa0..3b858a3e0b 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadTempBasalFinishTimeTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ReadTempBasalFinishTimeTask.java @@ -13,8 +13,7 @@ import io.reactivex.Single; @Singleton public class ReadTempBasalFinishTimeTask extends TaskBase { - - private TempBasalFinishTimeGet TEMP_BASAL_FINISH_TIME_GET; + private final TempBasalFinishTimeGet TEMP_BASAL_FINISH_TIME_GET; @Inject public ReadTempBasalFinishTimeTask() { @@ -28,7 +27,7 @@ public class ReadTempBasalFinishTimeTask extends TaskBase { .firstOrError() .doOnSuccess(this::checkResponse) .doOnSuccess(this::onResponse) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "ReadTempBasalFinishTimeTask error")); } private void onResponse(TempBasalFinishTimeResponse response) { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ResumeBasalTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ResumeBasalTask.java index a25febb404..2927b4665a 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ResumeBasalTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/ResumeBasalTask.java @@ -1,6 +1,7 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ble.task; -import info.nightscout.shared.logging.AAPSLogger; +import info.nightscout.androidaps.plugins.pump.eopatch.alarm.AlarmCode; +import info.nightscout.androidaps.plugins.pump.eopatch.alarm.IAlarmRegistry; import info.nightscout.shared.logging.LTag; import info.nightscout.androidaps.plugins.pump.eopatch.ble.PatchStateManager; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BasalResume; @@ -17,13 +18,11 @@ import io.reactivex.Single; @Singleton public class ResumeBasalTask extends TaskBase { - @Inject - StartNormalBasalTask startNormalBasalTask; + @Inject IAlarmRegistry alarmRegistry; + @Inject StartNormalBasalTask startNormalBasalTask; + @Inject PatchStateManager patchStateManager; - @Inject - PatchStateManager patchStateManager; - - private BasalResume BASAL_RESUME; + private final BasalResume BASAL_RESUME; @Inject public ResumeBasalTask() { @@ -32,25 +31,21 @@ public class ResumeBasalTask extends TaskBase { } public synchronized Single resume() { - if (pm.getPatchConfig().getNeedSetBasalSchedule()) { - NormalBasal normalBasal = pm.getNormalBasalManager().getNormalBasal(); - - if (normalBasal != null) { - return startNormalBasalTask.start(normalBasal, true); - } + return startNormalBasalTask.start(pm.getNormalBasalManager().getNormalBasal()); } return isReady().concatMapSingle(v -> BASAL_RESUME.resume()) .doOnNext(this::checkResponse) .firstOrError() .doOnSuccess(v -> onResumeResponse(v)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "ResumeBasalTask error")); } - private void onResumeResponse(PatchBooleanResponse v) throws SQLException { + private void onResumeResponse(PatchBooleanResponse v) { if (v.isSuccess()) { patchStateManager.onBasalResumed(v.getTimestamp() + 1000); + alarmRegistry.remove(AlarmCode.B001).subscribe(); } enqueue(TaskFunc.UPDATE_CONNECTION); } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SelfTestTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SelfTestTask.java index cafe9e1911..c39e89b256 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SelfTestTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SelfTestTask.java @@ -18,10 +18,9 @@ import io.reactivex.Single; @Singleton public class SelfTestTask extends TaskBase { - - private GetTemperature TEMPERATURE_GET; - private GetVoltageLevelB4Priming BATTERY_LEVEL_GET_BEFORE_PRIMING; - private GetGlobalTime GET_GLOBAL_TIME; + private final GetTemperature TEMPERATURE_GET; + private final GetVoltageLevelB4Priming BATTERY_LEVEL_GET_BEFORE_PRIMING; + private final GetGlobalTime GET_GLOBAL_TIME; @Inject public SelfTestTask() { @@ -35,33 +34,17 @@ public class SelfTestTask extends TaskBase { public Single start() { Single tasks = Single.concat(Arrays.asList( TEMPERATURE_GET.get() - .map(TemperatureResponse::getResult) - .doOnSuccess(this::onTemperatureResult), + .map(TemperatureResponse::getResult), BATTERY_LEVEL_GET_BEFORE_PRIMING.get() - .map(BatteryVoltageLevelPairingResponse::getResult) - .doOnSuccess(this::onBatteryResult), + .map(BatteryVoltageLevelPairingResponse::getResult), GET_GLOBAL_TIME.get(false) - .map(GlobalTimeResponse::getResult) - .doOnSuccess(this::onTimeResult))) + .map(GlobalTimeResponse::getResult))) .filter(result -> result != PatchSelfTestResult.TEST_SUCCESS) .first(PatchSelfTestResult.TEST_SUCCESS); return isReady() .concatMapSingle(v -> tasks) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); - } - - private void onTemperatureResult(PatchSelfTestResult patchSelfTestResult) { - if (patchSelfTestResult != PatchSelfTestResult.TEST_SUCCESS) { - } - } - - private void onBatteryResult(PatchSelfTestResult patchSelfTestResult) { - if (patchSelfTestResult != PatchSelfTestResult.TEST_SUCCESS) { - } - } - - private void onTimeResult(PatchSelfTestResult patchSelfTestResult) { + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "SelfTestTask error")); } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetGlobalTimeTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetGlobalTimeTask.java index 0626764c8c..3fb3da115e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetGlobalTimeTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetGlobalTimeTask.java @@ -16,9 +16,8 @@ import io.reactivex.Single; @Singleton public class SetGlobalTimeTask extends TaskBase { - - private SetGlobalTime SET_GLOBAL_TIME; - private GetGlobalTime GET_GLOBAL_TIME; + private final SetGlobalTime SET_GLOBAL_TIME; + private final GetGlobalTime GET_GLOBAL_TIME; @Inject public SetGlobalTimeTask() { @@ -37,24 +36,23 @@ public class SetGlobalTimeTask extends TaskBase { .doOnNext(this::checkResponse) .firstOrError() .doOnSuccess(v -> onSuccess()) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "SetGlobalTimeTask error")); } - private boolean checkPatchTime(GlobalTimeResponse response) throws Exception { + private void checkPatchTime(GlobalTimeResponse response) throws Exception { long newMilli = System.currentTimeMillis(); long oldMilli = response.getGlobalTimeInMilli(); long oldOffset = response.getTimeZoneOffset(); int offset = TimeZone.getDefault().getOffset(newMilli); int minutes = (int) TimeUnit.MILLISECONDS.toMinutes(offset); - // TimeZoneOffset (8bit / signed): 타임존 offset 15분 단위을 1로 환산, Korea 의 경우 36값(+9:00) int newOffset = minutes / 15; long diff = Math.abs(oldMilli - newMilli); if (diff > 60000 || oldOffset != newOffset) { aapsLogger.debug(LTag.PUMPCOMM, String.format("checkPatchTime %s %s %s", diff, oldOffset, newOffset)); - return true; + return; } throw new Exception("No time set required"); diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetLowReservoirTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetLowReservoirTask.java index 14fd2510bb..fbb5a41ad3 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetLowReservoirTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SetLowReservoirTask.java @@ -14,11 +14,9 @@ import io.reactivex.Single; @Singleton public class SetLowReservoirTask extends TaskBase { + @Inject IPreferenceManager pm; - @Inject - IPreferenceManager pm; - - private SetLowReservoirLevelAndExpireAlert SET_LOW_RESERVOIR_N_EXPIRE_ALERT; + private final SetLowReservoirLevelAndExpireAlert SET_LOW_RESERVOIR_N_EXPIRE_ALERT; @Inject public SetLowReservoirTask() { @@ -33,7 +31,7 @@ public class SetLowReservoirTask extends TaskBase { hours)) .doOnNext(this::checkResponse) .firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "SetLowReservoirTask error")); } public synchronized void enqueue() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartBondTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartBondTask.java index 4b4e9e02ef..d3a6d43066 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartBondTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartBondTask.java @@ -14,12 +14,9 @@ import io.reactivex.Single; import static info.nightscout.androidaps.plugins.pump.eopatch.core.api.StartBonding.OPTION_NUMERIC; -/** - * (주의) API 호출 후 본딩을 위해서 밑단 연결이 끊어짐. - */ @Singleton public class StartBondTask extends TaskBase { - private StartBonding START_BOND; + private final StartBonding START_BOND; @Inject public StartBondTask() { @@ -44,7 +41,7 @@ public class StartBondTask extends TaskBase { .doOnNext(v -> prefSetMacAddress(mac)) .doOnError(e -> { prefSetMacAddress(""); - aapsLogger.error(LTag.PUMPCOMM, e.getMessage()); + aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StartBondTask error"); }) .firstOrError(); } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartCalcBolusTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartCalcBolusTask.java index 6cdbb99329..de0a3e7920 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartCalcBolusTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartCalcBolusTask.java @@ -2,11 +2,8 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ble.task; import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.shared.logging.LTag; -import info.nightscout.androidaps.plugins.pump.eopatch.code.BolusExDuration; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BolusStart; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.ComboBolusStart; -import info.nightscout.androidaps.plugins.pump.eopatch.core.api.ExtBolusStart; import javax.inject.Inject; import javax.inject.Singleton; @@ -16,47 +13,34 @@ import io.reactivex.Single; @Singleton public class StartCalcBolusTask extends BolusTask { - - private BolusStart NOW_BOLUS_START; - private ExtBolusStart EXT_BOLUS_START; - private ComboBolusStart COMBO_BOLUS_START; + private final BolusStart NOW_BOLUS_START; @Inject public StartCalcBolusTask() { super(TaskFunc.START_CALC_BOLUS); NOW_BOLUS_START = new BolusStart(); - EXT_BOLUS_START = new ExtBolusStart(); - COMBO_BOLUS_START = new ComboBolusStart(); } public Single start(DetailedBolusInfo detailedBolusInfo) { - return isReady().concatMapSingle(v -> startBolusImpl((float)detailedBolusInfo.insulin, 0f, BolusExDuration.OFF)) + return isReady().concatMapSingle(v -> startBolusImpl((float)detailedBolusInfo.insulin)) .doOnNext(this::checkResponse) .firstOrError() - .doOnSuccess(v -> onSuccess((float)detailedBolusInfo.insulin, (float)detailedBolusInfo.insulin, 0f, BolusExDuration.OFF)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnSuccess(v -> onSuccess((float)detailedBolusInfo.insulin)) + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StartCalcBolusTask error")); } - private Single startBolusImpl(float nowDoseU, float exDoseU, - BolusExDuration exDuration) { - if (nowDoseU > 0 && exDoseU > 0) { - return COMBO_BOLUS_START.start(nowDoseU, exDoseU, exDuration.getMinute()); - } else if (exDoseU > 0) { - return EXT_BOLUS_START.start(exDoseU, exDuration.getMinute()); - } else { - return NOW_BOLUS_START.start(nowDoseU); - } + private Single startBolusImpl(float nowDoseU) { + return NOW_BOLUS_START.start(nowDoseU); } - private void onSuccess(float nowDoseU, float correctionBolus, float exDoseU, BolusExDuration exDuration) { - onCalcBolusStarted(nowDoseU, correctionBolus, exDoseU, exDuration); + private void onSuccess(float nowDoseU) { + onCalcBolusStarted(nowDoseU); enqueue(TaskFunc.UPDATE_CONNECTION); } @Override protected void preCondition() throws Exception { - //checkPatchActivated(); checkPatchConnected(); } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartNormalBasalTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartNormalBasalTask.java index d7a232e14b..8f170eb4ab 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartNormalBasalTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartNormalBasalTask.java @@ -16,8 +16,7 @@ import io.reactivex.schedulers.Schedulers; @Singleton public class StartNormalBasalTask extends TaskBase { - - private BasalScheduleSetBig BASAL_SCHEDULE_SET_BIG; + private final BasalScheduleSetBig BASAL_SCHEDULE_SET_BIG; @Inject PatchStateManager patchStateManager; @@ -28,23 +27,25 @@ public class StartNormalBasalTask extends TaskBase { BASAL_SCHEDULE_SET_BIG = new BasalScheduleSetBig(); } - public Single start(NormalBasal basal, boolean resume) { - return isReady().concatMapSingle(v -> startJob(basal, resume)).firstOrError(); + public Single start(NormalBasal basal) { + return isReady().concatMapSingle(v -> startJob(basal)).firstOrError(); } - public Single startJob(NormalBasal basal, boolean resume) { + public Single startJob(NormalBasal basal) { return BASAL_SCHEDULE_SET_BIG.set(basal.getDoseUnitPerSegmentArray()) .doOnSuccess(this::checkResponse) .observeOn(Schedulers.io()) - .doOnSuccess(v -> onStartNormalBasalResponse(v, basal, resume)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnSuccess(v -> onStartNormalBasalResponse(v, basal)) + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StartNormalBasalTask error")); } - private void onStartNormalBasalResponse(BasalScheduleSetResponse response, - NormalBasal basal, boolean resume) throws SQLException { + private void onStartNormalBasalResponse(BasalScheduleSetResponse response, NormalBasal basal) { long timeStamp = response.getTimestamp(); patchStateManager.onBasalStarted(basal, timeStamp+1000); + + pm.getNormalBasalManager().setNormalBasal(basal); + pm.flushNormalBasalManager(); enqueue(TaskFunc.UPDATE_CONNECTION); } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartQuickBolusTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartQuickBolusTask.java index 87967f8da2..483f510c71 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartQuickBolusTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartQuickBolusTask.java @@ -15,10 +15,9 @@ import io.reactivex.Single; @Singleton public class StartQuickBolusTask extends BolusTask { - - private BolusStart NOW_BOLUS_START; - private ExtBolusStart EXT_BOLUS_START; - private ComboBolusStart COMBO_BOLUS_START; + private final BolusStart NOW_BOLUS_START; + private final ExtBolusStart EXT_BOLUS_START; + private final ComboBolusStart COMBO_BOLUS_START; @Inject public StartQuickBolusTask() { @@ -35,7 +34,7 @@ public class StartQuickBolusTask extends BolusTask { .doOnNext(this::checkResponse) .firstOrError() .doOnSuccess(v -> onSuccess(nowDoseU, exDoseU, exDuration)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StartQuickBolusTask error")); } private Single startBolusImpl(float nowDoseU, float exDoseU, diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartTempBasalTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartTempBasalTask.java index e3d6a4fb72..c3476f7df7 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartTempBasalTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StartTempBasalTask.java @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ble.task; +import info.nightscout.androidaps.plugins.pump.eopatch.ble.IPreferenceManager; import info.nightscout.shared.logging.LTag; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.TempBasalScheduleStart; @@ -13,8 +14,8 @@ import io.reactivex.schedulers.Schedulers; @Singleton public class StartTempBasalTask extends TaskBase { - - private TempBasalScheduleStart TEMP_BASAL_SCHEDULE_START; + @Inject IPreferenceManager pm; + private final TempBasalScheduleStart TEMP_BASAL_SCHEDULE_START; @Inject public StartTempBasalTask() { @@ -30,10 +31,12 @@ public class StartTempBasalTask extends TaskBase { .firstOrError() .observeOn(Schedulers.io()) .doOnSuccess(v -> onTempBasalStarted(tempBasal)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StartTempBasalTask error")); } private void onTempBasalStarted(TempBasal tempBasal) { + pm.getTempBasalManager().updateBasalRunning(tempBasal); + pm.flushTempBasalManager(); enqueue(TaskFunc.UPDATE_CONNECTION); } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopBasalTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopBasalTask.java index ff8fa8996f..77c5544349 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopBasalTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopBasalTask.java @@ -25,17 +25,16 @@ import io.reactivex.subjects.BehaviorSubject; @Singleton public class StopBasalTask extends TaskBase { - @Inject IPreferenceManager pm; @Inject CommandQueue commandQueue; @Inject AAPSLogger aapsLogger; @Inject PumpSync pumpSync; @Inject UserEntryLogger uel; - private BasalStop BASAL_STOP; - private BehaviorSubject bolusCheckSubject = BehaviorSubject.create(); - private BehaviorSubject exbolusCheckSubject = BehaviorSubject.create(); - private BehaviorSubject basalCheckSubject = BehaviorSubject.create(); + private final BasalStop BASAL_STOP; + private final BehaviorSubject bolusCheckSubject = BehaviorSubject.create(); + private final BehaviorSubject exbolusCheckSubject = BehaviorSubject.create(); + private final BehaviorSubject basalCheckSubject = BehaviorSubject.create(); @Inject public StopBasalTask() { @@ -89,16 +88,15 @@ public class StopBasalTask extends TaskBase { basalCheckSubject.onNext(true); } - return Observable.zip(getBolusSebject(), getExbolusSebject(), getBasalSebject(), (bolusReady, exbolusReady, basalReady) -> { - return (bolusReady && exbolusReady && basalReady); - }) + return Observable.zip(getBolusSebject(), getExbolusSebject(), getBasalSebject(), (bolusReady, exbolusReady, basalReady) + -> (bolusReady && exbolusReady && basalReady)) .filter(ready -> ready) .flatMap(v -> isReady()) .concatMapSingle(v -> BASAL_STOP.stop()) .doOnNext(this::checkResponse) .firstOrError() .doOnSuccess(this::onBasalStopped) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StopBasalTask error")); } private void onBasalStopped(BasalStopResponse response) { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopComboBolusTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopComboBolusTask.java index fec4f7ba8c..0746ae5e18 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopComboBolusTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopComboBolusTask.java @@ -16,8 +16,7 @@ import io.reactivex.Single; @Singleton public class StopComboBolusTask extends BolusTask { - - private BolusStop BOLUS_STOP; + private final BolusStop BOLUS_STOP; @Inject public StopComboBolusTask() { @@ -31,7 +30,7 @@ public class StopComboBolusTask extends BolusTask { .firstOrError() .doOnSuccess(this::checkResponse) .doOnSuccess(this::onComboBolusStopped) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StopComboBolusTask error")); } public Single stopJob() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopExtBolusTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopExtBolusTask.java index f7a44ed3d8..b0ecf5265a 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopExtBolusTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopExtBolusTask.java @@ -14,19 +14,17 @@ import io.reactivex.Single; @Singleton public class StopExtBolusTask extends BolusTask { - - private BolusStop BOLUS_STOP; + private final BolusStop BOLUS_STOP; @Inject public StopExtBolusTask() { super(TaskFunc.STOP_EXT_BOLUS); - BOLUS_STOP = new BolusStop(); } public Single stop() { return isReady().concatMapSingle(v -> stopJob()).firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StopExtBolusTask error")); } public Single stopJob() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopNowBolusTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopNowBolusTask.java index 28c7e5ad95..b66244b9e6 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopNowBolusTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopNowBolusTask.java @@ -15,13 +15,11 @@ import io.reactivex.android.schedulers.AndroidSchedulers; @Singleton public class StopNowBolusTask extends BolusTask { - - private BolusStop BOLUS_STOP; + private final BolusStop BOLUS_STOP; @Inject public StopNowBolusTask() { super(TaskFunc.STOP_NOW_BOLUS); - BOLUS_STOP = new BolusStop(); } @@ -29,7 +27,7 @@ public class StopNowBolusTask extends BolusTask { return isReady() .observeOn(AndroidSchedulers.mainThread()) .concatMapSingle(v -> stopJob()).firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StopNowBolusTask error")); } public Single stopJob() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopTempBasalTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopTempBasalTask.java index 691c7f27c1..8ee052c05e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopTempBasalTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/StopTempBasalTask.java @@ -13,8 +13,7 @@ import io.reactivex.Single; @Singleton public class StopTempBasalTask extends TaskBase { - - private TempBasalScheduleStop TEMP_BASAL_SCHEDULE_STOP; + private final TempBasalScheduleStop TEMP_BASAL_SCHEDULE_STOP; @Inject public StopTempBasalTask() { @@ -25,7 +24,7 @@ public class StopTempBasalTask extends TaskBase { public Single stop() { return isReady().concatMapSingle(v -> stopJob()).firstOrError() - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "StopTempBasalTask error")); } public Single stopJob() { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SyncBasalHistoryTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SyncBasalHistoryTask.java index d66ea87d82..966b913b6f 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SyncBasalHistoryTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/SyncBasalHistoryTask.java @@ -5,7 +5,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BasalHistoryGetE import info.nightscout.androidaps.plugins.pump.eopatch.core.api.BasalHistoryIndexGet; import info.nightscout.androidaps.plugins.pump.eopatch.core.api.TempBasalHistoryGetExBig; -import java.sql.SQLException; import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -19,13 +18,11 @@ import static info.nightscout.androidaps.plugins.pump.eopatch.core.define.IPatch @Singleton public class SyncBasalHistoryTask extends TaskBase { + @Inject IPreferenceManager pm; - @Inject - IPreferenceManager pm; - - private BasalHistoryIndexGet BASAL_HISTORY_INDEX_GET; - private BasalHistoryGetExBig BASAL_HISTORY_GET_EX_BIG; - private TempBasalHistoryGetExBig TEMP_BASAL_HISTORY_GET_EX_BIG; + private final BasalHistoryIndexGet BASAL_HISTORY_INDEX_GET; + private final BasalHistoryGetExBig BASAL_HISTORY_GET_EX_BIG; + private final TempBasalHistoryGetExBig TEMP_BASAL_HISTORY_GET_EX_BIG; @Inject public SyncBasalHistoryTask() { @@ -38,19 +35,10 @@ public class SyncBasalHistoryTask extends TaskBase { public Single sync(int end) { return Single.just(1); // 베이젤 싱크 사용 안함 -// return isReady() -// .concatMapSingle(v -> syncBoth(pm.getPatchConfig().getLastIndex(), end)) -// .firstOrError() -// .doOnSuccess(this::updatePatchLastIndex); } public Single sync() { return Single.just(1); // 베이젤 싱크 사용 안함 -// return isReady() -// .concatMapSingle(v -> getLastIndex()) -// .concatMapSingle(end -> syncBoth(pm.getPatchConfig().getLastIndex(), end)) -// .firstOrError() -// .doOnSuccess(this::updatePatchLastIndex); } private Single getLastIndex() { @@ -94,7 +82,7 @@ public class SyncBasalHistoryTask extends TaskBase { } private int onBasalHistoryResponse(BasalHistoryResponse n, BasalHistoryResponse t, - int startRequested, int end) throws SQLException { + int startRequested, int end) { if (!n.isSuccess() || !t.isSuccess() || n.getSeq() != t.getSeq()) { return -1; @@ -112,7 +100,7 @@ public class SyncBasalHistoryTask extends TaskBase { return updateInjected(normal, temp, start, end); } - public synchronized int updateInjected(float[] normal, float[] temp, int start, int end) throws SQLException { + public synchronized int updateInjected(float[] normal, float[] temp, int start, int end) { if (pm.getPatchState().isPatchInternalSuspended() && pm.getPatchConfig().isInBasalPausedTime() == false) { return -1; } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/TaskQueue.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/TaskQueue.java index 8b9ef9e8ab..88895ff90c 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/TaskQueue.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/TaskQueue.java @@ -33,11 +33,9 @@ public class TaskQueue { protected synchronized Observable isReady(final TaskFunc function) { return Observable.fromCallable(() -> publishTicket(function)) - .concatMap(v -> { - return ticketSubject - .takeUntil(it -> it.number > v) - .filter(it -> it.number == v); - }) + .concatMap(v -> ticketSubject + .takeUntil(it -> it.number > v) + .filter(it -> it.number == v)) .doOnNext(v -> aapsLogger.debug(LTag.PUMPCOMM, String.format("Task #:%s started func:%s", v.number, v.func.name()))) .observeOn(Schedulers.io()) .map(it -> it.func) @@ -86,13 +84,13 @@ public class TaskQueue { public synchronized boolean has(TaskFunc func) { if (queue.size() > 1) { - Iterator itor = queue.iterator(); + Iterator iterator = queue.iterator(); /* remove 1st queue */ - itor.next(); + iterator.next(); - while (itor.hasNext()) { - PatchTask item = itor.next(); + while (iterator.hasNext()) { + PatchTask item = iterator.next(); if (item.func == func) { return true; } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/UpdateConnectionTask.java b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/UpdateConnectionTask.java index 729bbb4651..cc80416365 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/UpdateConnectionTask.java +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ble/task/UpdateConnectionTask.java @@ -15,9 +15,7 @@ import io.reactivex.Single; @Singleton public class UpdateConnectionTask extends TaskBase { - - @Inject - PatchStateManager patchStateManager; + @Inject PatchStateManager patchStateManager; private UpdateConnection UPDATE_CONNECTION; @@ -38,7 +36,7 @@ public class UpdateConnectionTask extends TaskBase { .map(UpdateConnectionResponse::getPatchState) .map(bytes -> PatchState.Companion.create(bytes, System.currentTimeMillis())) .doOnSuccess(state -> onUpdateConnection(state)) - .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, e.getMessage())); + .doOnError(e -> aapsLogger.error(LTag.PUMPCOMM, (e.getMessage() != null) ? e.getMessage() : "UpdateConnectionTask error")); } private void onUpdateConnection(PatchState patchState) { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmCategory.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmCategory.kt index 10d3115a01..93f00b95ee 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmCategory.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmCategory.kt @@ -1,46 +1,7 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code -import com.google.android.gms.common.internal.Preconditions - -enum class AlarmCategory private constructor(val rawValue: Int) { - NONE(0), - ALARM(1), - ALERT(2); - - companion object { - - - /** - * rawValue로 값을 찾기, 못찾으면 null을 리턴 - */ - fun ofRaw(rawValue: Int?): AlarmCategory? { - if (rawValue == null) { - return null - } - - for (t in AlarmCategory.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return null - } - - /** - * rawValue로 값을 찾기, 못찾으면 defaultValue을 리턴 - */ - fun ofRaw(rawValue: Int?, defaultValue: AlarmCategory): AlarmCategory { - Preconditions.checkNotNull(defaultValue) - if (rawValue == null) { - return defaultValue - } - - for (t in AlarmCategory.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return defaultValue - } - } +enum class AlarmCategory{ + NONE, + ALARM, + ALERT; } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmSource.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmSource.kt deleted file mode 100644 index c433488b7b..0000000000 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/AlarmSource.kt +++ /dev/null @@ -1,66 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.code - - -import com.google.android.gms.common.internal.Preconditions -import com.google.gson.annotations.SerializedName - -enum class AlarmSource private constructor(val rawValue: Int) { - @SerializedName("0") - NONE(0), - @SerializedName("1") - PATCH(1), - @SerializedName("2") - ADM(2), - @SerializedName("3") - CGM(3), - @SerializedName("9") - TEST(9); - - val isTest: Boolean - get() = this == TEST - - val isCgm: Boolean - get() = this == CGM - - companion object { - - /** - * rawValue로 값을 찾기, 못찾으면 null을 리턴 - */ - @JvmStatic - fun ofRaw(rawValue: Int?): AlarmSource { - if (rawValue == null) { - return NONE - } - - for (t in AlarmSource.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return NONE - } - - @JvmStatic - fun toRaw(source: AlarmSource?): Int { - return if (source != null) source.rawValue else NONE.rawValue - } - - /** - * rawValue로 값을 찾기, 못찾으면 defaultValue을 리턴 - */ - fun ofRaw(rawValue: Int?, defaultValue: AlarmSource): AlarmSource { - Preconditions.checkNotNull(defaultValue) - if (rawValue == null) { - return defaultValue - } - - for (t in AlarmSource.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return defaultValue - } - } -} diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BasalStatus.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BasalStatus.kt index 4225e0e523..6758b29836 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BasalStatus.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BasalStatus.kt @@ -10,21 +10,12 @@ enum class BasalStatus constructor(val rawValue: Int) { val isStarted: Boolean get() = this == STARTED - val isPaused: Boolean - get() = this == PAUSED - val isSuspended: Boolean get() = this == SUSPENDED val isStopped: Boolean get() = this == STOPPED - val isSelected: Boolean - get() = this == SELECTED - - val isSelectedGroup: Boolean - get() = isStarted || isPaused || isSuspended || isSelected - companion object { @JvmStatic fun ofRaw(rawValue: Int?): BasalStatus { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BgUnit.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BgUnit.kt deleted file mode 100644 index b1bd632d51..0000000000 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BgUnit.kt +++ /dev/null @@ -1,37 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.code - -enum class BgUnit private constructor(val rawValue: Int, val unitStr: String) { - GRAM(1, "mg/dL"), - MMOL(2, "mmol/L"); - - fun isGram() = GRAM == this - fun isMmol() = MMOL == this - - fun getUnit() = unitStr - - companion object { - /** - * rawValue로 값을 찾기, 못찾으면 null을 리턴 - */ - fun ofRaw(rawValue: Int?): BgUnit { - for (t in BgUnit.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return GRAM - } - - /** - * rawValue로 값을 찾기, 못찾으면 defaultValue을 리턴 - */ - fun ofRaw(rawValue: Int, defaultValue: BgUnit): BgUnit { - for (t in BgUnit.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return defaultValue - } - } -} diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BolusExDuration.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BolusExDuration.kt index 30c0ae7116..fbb1a87e37 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BolusExDuration.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/BolusExDuration.kt @@ -1,10 +1,5 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code -import android.content.Context -import androidx.collection.SparseArrayCompat -import info.nightscout.androidaps.plugins.pump.eopatch.CommonUtils -import info.nightscout.androidaps.plugins.pump.eopatch.R -import java.util.* import java.util.concurrent.TimeUnit enum class BolusExDuration constructor(val index: Int, val minute: Int, val hour: Float) { @@ -26,34 +21,14 @@ enum class BolusExDuration constructor(val index: Int, val minute: Int, val hour MINUTE_450(15, 450, 7.5f), MINUTE_480(16, 480, 8.0f); - val isOff: Boolean - get() = this == OFF - - val isNotOff: Boolean - get() = this != OFF - fun milli(): Long { return TimeUnit.MINUTES.toMillis(this.minute.toLong()) } companion object { - @JvmStatic - fun getItemFromIndex(index: Int): BolusExDuration { - var reverseIndices = SparseArrayCompat() - for (duration in values()) { - reverseIndices.put(duration.index, duration) - } - val result = reverseIndices.get(index) - return result ?: OFF - } - @JvmStatic fun ofRaw(rawValue: Int): BolusExDuration { - if (rawValue == null) { - return OFF - } - - for (t in BolusExDuration.values()) { + for (t in values()) { if (t.minute == rawValue) { return t } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/DeactivationStatus.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/DeactivationStatus.kt index 8373e828df..829b865865 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/DeactivationStatus.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/DeactivationStatus.kt @@ -1,20 +1,14 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code -enum class DeactivationStatus constructor(val rawValue: Int) { - DEACTIVATION_FAILED(0), - NORMAL_DEACTIVATED(1), - FORCE_DEACTIVATED(2); +enum class DeactivationStatus { + DEACTIVATION_FAILED, + NORMAL_DEACTIVATED, + FORCE_DEACTIVATED; val isDeactivated: Boolean get() = this == NORMAL_DEACTIVATED || this == FORCE_DEACTIVATED - val isNormalSuccess: Boolean - get() = this == NORMAL_DEACTIVATED - - val isNormalFailed: Boolean - get() = this == DEACTIVATION_FAILED || this == FORCE_DEACTIVATED - companion object { @JvmStatic fun of(isSuccess: Boolean, forced: Boolean): DeactivationStatus { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/Dummy.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/Dummy.kt deleted file mode 100644 index f81dff583e..0000000000 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/Dummy.kt +++ /dev/null @@ -1,5 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.code - -enum class Dummy { - INSTANCE -} diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/EventType.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/EventType.kt index be02c5fd07..efc8207243 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/EventType.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/EventType.kt @@ -1,8 +1,8 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code enum class EventType { - ACTIVTION_CLICKED, - DEACTIVTION_CLICKED, + ACTIVATION_CLICKED, + DEACTIVATION_CLICKED, SUSPEND_CLICKED, RESUME_CLICKED, INVALID_BASAL_RATE, @@ -12,14 +12,9 @@ enum class EventType { SHOW_PATCH_COMM_ERROR_DIALOG, SHOW_BONDED_DIALOG, SHOW_CHANGE_PATCH_DIALOG, - SHOW_PROGRESS_DIALOG, - DISMISS_PROGRESS_DIALOG, FINISH_ACTIVITY, SHOW_DISCARD_DIALOG, PAUSE_BASAL_FAILED, - RESUME_BASAL_FAILED, - CALCULATED_BOLUS_CLICKED, - EXTENDED_BOLUS_SETTINGS_CLICKED, - SAVE_CLICKED + RESUME_BASAL_FAILED ; } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchExpireAlertTime.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchExpireAlertTime.kt index 9c3a685294..d34c568c04 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchExpireAlertTime.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchExpireAlertTime.kt @@ -1,9 +1,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code -import android.content.Context -import info.nightscout.androidaps.plugins.pump.eopatch.R - -enum class PatchExpireAlertTime private constructor(val index: Int, val hour: Int) { +enum class PatchExpireAlertTime constructor(val index: Int, val hour: Int) { HOUR_1(0, 1), HOUR_2(1, 2), HOUR_3(2, 3), @@ -28,25 +25,4 @@ enum class PatchExpireAlertTime private constructor(val index: Int, val hour: In HOUR_22(21, 22), HOUR_23(22, 23), HOUR_24(23, 24); - - companion object { - - fun atIndex(index: Int): PatchExpireAlertTime { - for (i in values()) { - if (i.index == index) { - return i - } - } - return HOUR_1 - } - - fun atHour(hour: Int): PatchExpireAlertTime { - for (i in values()) { - if (i.hour == hour) { - return i - } - } - return HOUR_1 - } - } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchLifecycle.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchLifecycle.kt index 99c8d287c0..db153c6130 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchLifecycle.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchLifecycle.kt @@ -1,6 +1,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code -enum class PatchLifecycle private constructor(val rawValue: Int) { +enum class PatchLifecycle constructor(val rawValue: Int) { SHUTDOWN(1), BONDED(2), SAFETY_CHECK(3), @@ -16,15 +16,4 @@ enum class PatchLifecycle private constructor(val rawValue: Int) { val isActivated: Boolean get() = this == ACTIVATED - companion object { - @JvmStatic - fun ofRaw(rawValue: Int): PatchLifecycle { - for (type in values()) { - if (type.rawValue == rawValue) { - return type - } - } - return SHUTDOWN - } - } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchStep.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchStep.kt index eed465a75a..02ca419279 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchStep.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/PatchStep.kt @@ -21,9 +21,6 @@ enum class PatchStep { BACK_TO_HOME, FINISH; - val isConnectNew: Boolean - get() = this == CONNECT_NEW - val isSafeDeactivation: Boolean get() = this == SAFE_DEACTIVATION diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/SettingKeys.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/SettingKeys.kt index 13f6a5474f..23eb459cb8 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/SettingKeys.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/SettingKeys.kt @@ -4,7 +4,7 @@ import info.nightscout.androidaps.plugins.pump.eopatch.R class SettingKeys { companion object{ - val LOW_RESERVIOR_REMINDERS: Int = R.string.key_eopatch_low_reservior_reminders + val LOW_RESERVOIR_REMINDERS: Int = R.string.key_eopatch_low_reservoir_reminders val EXPIRATION_REMINDERS: Int = R.string.key_eopatch_expiration_reminders val BUZZER_REMINDERS: Int = R.string.key_eopatch_patch_buzzer_reminders diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/UnitOrPercent.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/UnitOrPercent.kt index 56e27148bb..1c7aa5795d 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/UnitOrPercent.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/code/UnitOrPercent.kt @@ -1,52 +1,8 @@ package info.nightscout.androidaps.plugins.pump.eopatch.code -import com.google.android.gms.common.internal.Preconditions - -enum class UnitOrPercent private constructor(val rawValue: Int, val symbol: String) { - P(0, "%"), - U(1, "U"); - +enum class UnitOrPercent { + P, + U; fun isPercentage() = this == P - fun isU() = this == U - - companion object { - - val U_PER_HOUR = "U/hr" - val U_PER_DAY = "U/day" - - - /** - * rawValue로 값을 찾기, 못찾으면 null을 리턴 - */ - fun ofRaw(rawValue: Int?): UnitOrPercent? { - if (rawValue == null) { - return null - } - - for (t in UnitOrPercent.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return null - } - - /** - * rawValue로 값을 찾기, 못찾으면 defaultValue을 리턴 - */ - fun ofRaw(rawValue: Int?, defaultValue: UnitOrPercent): UnitOrPercent { - Preconditions.checkNotNull(defaultValue) - if (rawValue == null) { - return defaultValue - } - - for (t in UnitOrPercent.values()) { - if (t.rawValue == rawValue) { - return t - } - } - return defaultValue - } - } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchInjectHelpers.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchInjectHelpers.kt index ca9592d836..d749761e66 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchInjectHelpers.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchInjectHelpers.kt @@ -6,11 +6,6 @@ import javax.inject.Scope @Qualifier annotation class EopatchPluginQualifier -@MustBeDocumented -@Scope -@Retention(AnnotationRetention.RUNTIME) -annotation class ActivityScope - @MustBeDocumented @Scope @Retention(AnnotationRetention.RUNTIME) diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchModule.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchModule.kt index e971078b5d..e148cf76ae 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchModule.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchModule.kt @@ -39,7 +39,6 @@ abstract class EopatchModule { } - @Binds @Singleton abstract fun bindPatchManager(patchManager: PatchManager): IPatchManager diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchPrefModule.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchPrefModule.kt index 94b63103d4..03cd624009 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchPrefModule.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/dagger/EopatchPrefModule.kt @@ -1,17 +1,11 @@ package info.nightscout.androidaps.plugins.pump.eopatch.dagger -import android.app.Application -import android.content.Context -import dagger.Binds import dagger.Module import dagger.Provides -import info.nightscout.androidaps.plugins.pump.eopatch.ble.* import info.nightscout.androidaps.plugins.pump.eopatch.vo.Alarms import info.nightscout.androidaps.plugins.pump.eopatch.vo.NormalBasalManager import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchConfig -import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchState import info.nightscout.androidaps.plugins.pump.eopatch.vo.TempBasalManager -import info.nightscout.shared.sharedPreferences.SP import javax.inject.Singleton @Module @@ -24,13 +18,13 @@ class EopatchPrefModule { @Provides @Singleton - internal fun provideNormalBasalManager(sp: SP): NormalBasalManager { + internal fun provideNormalBasalManager(): NormalBasalManager { return NormalBasalManager() } @Provides @Singleton - internal fun provideTempBasalManager(sp: SP): TempBasalManager { + internal fun provideTempBasalManager(): TempBasalManager { return TempBasalManager() } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/event/EoPatchEvents.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/event/EoPatchEvents.kt index cd8656fc77..409a4e6561 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/event/EoPatchEvents.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/event/EoPatchEvents.kt @@ -8,4 +8,4 @@ import info.nightscout.androidaps.plugins.pump.eopatch.alarm.AlarmCode class EventEoPatchAlarm(var alarmCodes: Set, var isFirst: Boolean = false) : Event() class EventDialog(val dialog: DialogFragment, val show: Boolean) : Event() class EventProgressDialog(val show: Boolean, @StringRes val resId: Int = 0) : Event() -class EventPatchActivationNotComplete() : Event() \ No newline at end of file +class EventPatchActivationNotComplete : Event() \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/AppCompatActivityExtension.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/AppCompatActivityExtension.kt index 46cb3c2cd5..e6ad855b07 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/AppCompatActivityExtension.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/AppCompatActivityExtension.kt @@ -1,13 +1,9 @@ package info.nightscout.androidaps.plugins.pump.eopatch.extension -import android.content.Intent -import android.os.Bundle -import android.os.Parcelable import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentTransaction -import java.io.Serializable fun AppCompatActivity.replaceFragmentInActivity(fragment: Fragment, frameId: Int, addToBackStack: Boolean = false) { supportFragmentManager.transact { @@ -20,43 +16,4 @@ private inline fun FragmentManager.transact(action: FragmentTransaction.() -> Un beginTransaction().apply { action() }.commit() -} - -fun Intent.fillExtras(params: Array>){ - fillIntentArguments(this, params) -} - -private fun fillIntentArguments(intent: Intent, params: Array>) { - params.forEach { - when (val value = it.second) { - null -> intent.putExtra(it.first, null as Serializable?) - is Int -> intent.putExtra(it.first, value) - is Long -> intent.putExtra(it.first, value) - is CharSequence -> intent.putExtra(it.first, value) - is String -> intent.putExtra(it.first, value) - is Float -> intent.putExtra(it.first, value) - is Double -> intent.putExtra(it.first, value) - is Char -> intent.putExtra(it.first, value) - is Short -> intent.putExtra(it.first, value) - is Boolean -> intent.putExtra(it.first, value) - is Serializable -> intent.putExtra(it.first, value) - is Bundle -> intent.putExtra(it.first, value) - is Parcelable -> intent.putExtra(it.first, value) - is Array<*> -> when { - value.isArrayOf() -> intent.putExtra(it.first, value) - value.isArrayOf() -> intent.putExtra(it.first, value) - value.isArrayOf() -> intent.putExtra(it.first, value) - else -> throw Exception("Intent extra ${it.first} has wrong type ${value.javaClass.name}") - } - is IntArray -> intent.putExtra(it.first, value) - is LongArray -> intent.putExtra(it.first, value) - is FloatArray -> intent.putExtra(it.first, value) - is DoubleArray -> intent.putExtra(it.first, value) - is CharArray -> intent.putExtra(it.first, value) - is ShortArray -> intent.putExtra(it.first, value) - is BooleanArray -> intent.putExtra(it.first, value) - else -> throw Exception("Intent extra ${it.first} has wrong type ${value.javaClass.name}") - } - return@forEach - } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/FloatExtension.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/FloatExtension.kt index e8341c7273..08692f540a 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/FloatExtension.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/FloatExtension.kt @@ -1,15 +1,17 @@ package info.nightscout.androidaps.plugins.pump.eopatch.extension +import kotlin.math.abs + fun Float.nearlyEqual(b: Float, epsilon: Float): Boolean { - val absA = Math.abs(this) - val absB = Math.abs(b) - val diff = Math.abs(this - b) + val absA = abs(this) + val absB = abs(b) + val diff = abs(this - b) return if (this == b) { true } else if (this == 0f || b == 0f || absA + absB < java.lang.Float.MIN_NORMAL) { diff < epsilon * java.lang.Float.MIN_NORMAL } else { - diff / Math.min(absA + absB, Float.MAX_VALUE) < epsilon + diff / (absA + absB).coerceAtMost(Float.MAX_VALUE) < epsilon } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/LongExtension.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/LongExtension.kt index c3de482c8c..7fef444e07 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/LongExtension.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/LongExtension.kt @@ -6,29 +6,6 @@ import java.util.concurrent.TimeUnit internal val Long.date: Date get() = Calendar.getInstance().also { it.timeInMillis = this }.time -fun Long.getDiffTime(isRelative: Boolean = false): Triple { - val inputTimeMillis = this - val currentTimeMillis = System.currentTimeMillis() - val diffTimeMillis = if (inputTimeMillis > currentTimeMillis) inputTimeMillis - currentTimeMillis else isRelative.takeOne(currentTimeMillis - inputTimeMillis, 0) - - val hours = TimeUnit.MILLISECONDS.toHours(diffTimeMillis) - val minutes = TimeUnit.MILLISECONDS.toMinutes(diffTimeMillis - TimeUnit.HOURS.toMillis(hours)) - val seconds = TimeUnit.MILLISECONDS.toSeconds(diffTimeMillis - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes)) - - return Triple(hours, minutes, seconds) -} - -fun Long.getDiffTime(startTimeMillis: Long): Triple { - val inputTimeMillis = this - val diffTimeMillis = if (inputTimeMillis > startTimeMillis) inputTimeMillis - startTimeMillis else 0 - - val hours = TimeUnit.MILLISECONDS.toHours(diffTimeMillis) - val minutes = TimeUnit.MILLISECONDS.toMinutes(diffTimeMillis - TimeUnit.HOURS.toMillis(hours)) - val seconds = TimeUnit.MILLISECONDS.toSeconds(diffTimeMillis - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes)) - - return Triple(hours, minutes, seconds) -} - fun Long.getDiffDays(isRelative: Boolean = false): Long { val inputTimeMillis = this val currentTimeMillis = System.currentTimeMillis() @@ -36,7 +13,3 @@ fun Long.getDiffDays(isRelative: Boolean = false): Long { return TimeUnit.MILLISECONDS.toDays(diffTimeMillis) } - -fun Long.getSeconds() : Long { - return (this/1000)*1000 -} diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/SingleExtension.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/SingleExtension.kt index ba453140f2..cd89deeb51 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/SingleExtension.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/SingleExtension.kt @@ -7,8 +7,6 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers -fun Single.observeOnMainThread(): Single = observeOn(AndroidSchedulers.mainThread()) - fun Single.subscribeDefault(aapsLogger: AAPSLogger, onSuccess: (T) -> Unit): Disposable = subscribe(onSuccess, { aapsLogger.error(LTag.PUMP, "onError", it) }) diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/StringExtension.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/StringExtension.kt index ad8a1b9b07..55fc573532 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/StringExtension.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/StringExtension.kt @@ -20,29 +20,3 @@ fun String.fromHtml(): CharSequence = Html.fromHtml(this, Html.FROM_HTML_MODE_CO fun String.isEmpty(): Boolean{ return this.length == 0 } - -fun String.getSeparatorForLog(): String { - return StringBuilder().let { - for (i in 0 until length) { - it.append("=") - } - it.toString() - } -} - -fun String.convertUtcToLocalDate(): Date { - val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault()) - val convertDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) - val timeZone = TimeZone.getDefault() - - var parseDate = format.parse(this) - - val convertedDate = convertDateFormat.format(parseDate) - parseDate = convertDateFormat.parse(convertedDate) - - val locTime = convertDateFormat.format(parseDate.time + timeZone.getOffset(parseDate.time)).replace("+0000", "") - - val retDate = convertDateFormat.parse(locTime) - - return retDate -} \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/TextViewExtension.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/TextViewExtension.kt deleted file mode 100644 index 1292fe116e..0000000000 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/extension/TextViewExtension.kt +++ /dev/null @@ -1,20 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.extension - -import android.text.InputFilter -import android.widget.EditText - -internal fun EditText.setRange(min: Int, max: Int) { - filters = arrayOf(InputFilter { source, _, _, dest, _, _ -> - try { - val input = Integer.parseInt(dest.toString() + source.toString()) - - if (input in min..max) { - return@InputFilter null - } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - - return@InputFilter "" - }) -} diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/AlarmHelperActivity.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/AlarmHelperActivity.kt index d166a3d6e5..47706da849 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/AlarmHelperActivity.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/AlarmHelperActivity.kt @@ -1,8 +1,7 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui -import android.app.AlertDialog -import android.app.ProgressDialog import android.os.Bundle +import androidx.appcompat.app.AlertDialog import info.nightscout.androidaps.activities.DialogAppCompatActivity import info.nightscout.androidaps.core.R import info.nightscout.androidaps.plugins.bus.RxBus @@ -10,6 +9,7 @@ import info.nightscout.androidaps.plugins.pump.eopatch.alarm.AlarmCode import info.nightscout.androidaps.plugins.pump.eopatch.event.EventDialog import info.nightscout.androidaps.plugins.pump.eopatch.event.EventProgressDialog import info.nightscout.androidaps.plugins.pump.eopatch.ui.dialogs.AlarmDialog +import info.nightscout.androidaps.plugins.pump.eopatch.ui.dialogs.ProgressDialogHelper import info.nightscout.shared.sharedPreferences.SP import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable @@ -20,7 +20,7 @@ class AlarmHelperActivity : DialogAppCompatActivity() { @Inject lateinit var rxBus: RxBus private var disposable: CompositeDisposable = CompositeDisposable() - private var mProgressDialog: ProgressDialog? = null + private var mProgressDialog: AlertDialog? = null @Override override fun onCreate(savedInstanceState: Bundle?) { @@ -64,10 +64,8 @@ class AlarmHelperActivity : DialogAppCompatActivity() { private fun showProgressDialog(resId: Int){ if (mProgressDialog == null && resId != 0) { - mProgressDialog = ProgressDialog(this).apply { - setMessage(getString(resId)) + mProgressDialog = ProgressDialogHelper.get(this, getString(resId)).apply { setCancelable(false) - setProgressStyle(android.R.style.Widget_ProgressBar_Horizontal) } mProgressDialog?.show() } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/DialogHelperActivity.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/DialogHelperActivity.kt index cc30cfd3b4..5751066837 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/DialogHelperActivity.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/DialogHelperActivity.kt @@ -18,8 +18,4 @@ class DialogHelperActivity : DialogAppCompatActivity() { dialog.message = intent.getStringExtra("message")?:"" dialog.show(supportFragmentManager, "Dialog") } - - override fun onDestroy() { - super.onDestroy() - } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseActivity.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseActivity.kt index 5c4ddd609b..b3dafab128 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseActivity.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseActivity.kt @@ -1,23 +1,17 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui -import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.View import android.widget.Toast +import androidx.activity.result.ActivityResultLauncher import androidx.annotation.LayoutRes import androidx.annotation.StringRes -import androidx.appcompat.app.AppCompatDelegate import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModelProvider import info.nightscout.androidaps.activities.NoSplashAppCompatActivity import info.nightscout.androidaps.core.R -import info.nightscout.androidaps.plugins.pump.eopatch.EoPatchRxBus import info.nightscout.androidaps.plugins.pump.eopatch.dagger.EopatchPluginQualifier -import info.nightscout.androidaps.plugins.pump.eopatch.extension.fillExtras -import info.nightscout.androidaps.plugins.pump.eopatch.extension.subscribeDefault -import info.nightscout.androidaps.plugins.pump.eopatch.vo.ActivityResultEvent import info.nightscout.androidaps.utils.rx.AapsSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable @@ -35,6 +29,8 @@ abstract class EoBaseActivity : NoSplashAppCompatActivity() private val compositeDisposable = CompositeDisposable() + protected lateinit var getResult: ActivityResultLauncher + @LayoutRes abstract fun getLayoutId(): Int @@ -47,18 +43,6 @@ abstract class EoBaseActivity : NoSplashAppCompatActivity() } - override fun onStart() { - super.onStart() - window.decorView.systemUiVisibility = if(AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_NO) - View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - else - View.SYSTEM_UI_FLAG_VISIBLE - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - } - override fun toast(message: String) { Toast.makeText(this@EoBaseActivity, message, Toast.LENGTH_SHORT).show() } @@ -83,26 +67,5 @@ abstract class EoBaseActivity : NoSplashAppCompatActivity() } } - override fun startActivityForResult(action: Context.() -> Intent, requestCode: Int, vararg params: Pair) { - val intent = action(this) - if(params.isNotEmpty()) intent.fillExtras(params) - startActivityForResult(intent, requestCode) - } - - override fun checkCommunication(onSuccess: () -> Unit, onCancel: (() -> Unit)?, onDiscard: (() -> Unit)?, goHomeAfterDiscard: Boolean) { - EoPatchRxBus.listen(ActivityResultEvent::class.java) - .doOnSubscribe { startActivityForResult({ EopatchActivity.createIntentForCheckConnection(this, goHomeAfterDiscard) }, 10001) } - .observeOn(aapsSchedulers.main) - .subscribeDefault(aapsLogger) { - if (it.requestCode == 10001) { - when (it.resultCode) { - RESULT_OK -> onSuccess.invoke() - RESULT_CANCELED -> onCancel?.invoke() - EopatchActivity.RESULT_DISCARDED -> onDiscard?.invoke() - } - } - }.addTo() - } - fun Disposable.addTo() = addTo(compositeDisposable) } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseFragment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseFragment.kt index 14887253fc..bba0632a3e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseFragment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseFragment.kt @@ -1,7 +1,6 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui import android.content.Context -import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -74,13 +73,6 @@ abstract class EoBaseFragment : DaggerFragment(), EoBaseNav override fun finish(finishAffinity: Boolean) { baseActivity?.finish(finishAffinity) } - override fun startActivityForResult(action: Context.() -> Intent, requestCode: Int, vararg params: Pair) { - baseActivity?.startActivityForResult(action, requestCode, *params) - } - - override fun checkCommunication(onSuccess: () -> Unit, onCancel: (() -> Unit)?, onDiscard: (() -> Unit)?, goHomeAfterDiscard: Boolean) { - baseActivity?.checkCommunication(onSuccess, onCancel, onDiscard, goHomeAfterDiscard) - } fun Disposable.addTo() = addTo(compositeDisposable) diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseNavigator.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseNavigator.kt index 33e85f15e4..2f98ff9cfb 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseNavigator.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EoBaseNavigator.kt @@ -1,8 +1,5 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui -import android.app.Activity -import android.content.Context -import android.content.Intent import androidx.annotation.StringRes interface EoBaseNavigator { @@ -13,8 +10,4 @@ interface EoBaseNavigator { fun back() fun finish(finishAffinity: Boolean = false) - - fun startActivityForResult(action: Context.() -> Intent, requestCode: Int, vararg params: Pair) - - fun checkCommunication(onSuccess: () -> Unit, onCancel: (() -> Unit)? = null, onDiscard: (() -> Unit)? = null, goHomeAfterDiscard: Boolean = true) } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt index da62afe986..933bf5f645 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchActivity.kt @@ -1,14 +1,13 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui import android.app.Dialog -import android.app.ProgressDialog import android.content.Context import android.content.Intent import android.media.MediaPlayer import android.media.RingtoneManager import android.os.Bundle import android.view.MotionEvent -import androidx.lifecycle.Observer +import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider import info.nightscout.androidaps.plugins.pump.eopatch.R import info.nightscout.androidaps.plugins.pump.eopatch.code.PatchLifecycle @@ -17,6 +16,7 @@ import info.nightscout.androidaps.plugins.pump.eopatch.code.EventType import info.nightscout.androidaps.plugins.pump.eopatch.databinding.ActivityEopatchBinding import info.nightscout.androidaps.plugins.pump.eopatch.extension.replaceFragmentInActivity import info.nightscout.androidaps.plugins.pump.eopatch.extension.takeOne +import info.nightscout.androidaps.plugins.pump.eopatch.ui.dialogs.ProgressDialogHelper import info.nightscout.androidaps.plugins.pump.eopatch.ui.viewmodel.EopatchViewModel import info.nightscout.androidaps.utils.alertDialogs.AlertDialogHelper @@ -24,7 +24,7 @@ class EopatchActivity : EoBaseActivity() { private var mediaPlayer: MediaPlayer? = null private var mPatchCommCheckDialog: Dialog? = null - private var mProgressDialog: ProgressDialog? = null + private var mProgressDialog: AlertDialog? = null override fun getLayoutId(): Int = R.layout.activity_eopatch @@ -44,59 +44,65 @@ class EopatchActivity : EoBaseActivity() { viewModel?.apply { processIntent(intent) - patchStep.observe(this@EopatchActivity, { + patchStep.observe(this@EopatchActivity) { when (it) { - PatchStep.SAFE_DEACTIVATION -> { - if(isActivated.value?:false){ + PatchStep.SAFE_DEACTIVATION -> { + if (isActivated.value == true) { setupViewFragment(EopatchSafeDeactivationFragment.newInstance()) - }else{ + } else { this@EopatchActivity.finish() } } + PatchStep.MANUALLY_TURNING_OFF_ALARM -> setupViewFragment(EopatchTurningOffAlarmFragment.newInstance()) PatchStep.DISCARDED_FOR_CHANGE, PatchStep.DISCARDED_FROM_ALARM, - PatchStep.DISCARDED -> setupViewFragment(EopatchRemoveFragment.newInstance()) - PatchStep.WAKE_UP -> setupViewFragment(EopatchWakeUpFragment.newInstance()) - PatchStep.CONNECT_NEW -> setupViewFragment(EopatchConnectNewFragment.newInstance()) - PatchStep.REMOVE_NEEDLE_CAP -> setupViewFragment(EopatchRemoveNeedleCapFragment.newInstance()) - PatchStep.REMOVE_PROTECTION_TAPE -> setupViewFragment(EopatchRemoveProtectionTapeFragment.newInstance()) - PatchStep.SAFETY_CHECK -> setupViewFragment(EopatchSafetyCheckFragment.newInstance()) + PatchStep.DISCARDED -> setupViewFragment(EopatchRemoveFragment.newInstance()) + PatchStep.WAKE_UP -> setupViewFragment(EopatchWakeUpFragment.newInstance()) + PatchStep.CONNECT_NEW -> setupViewFragment(EopatchConnectNewFragment.newInstance()) + PatchStep.REMOVE_NEEDLE_CAP -> setupViewFragment(EopatchRemoveNeedleCapFragment.newInstance()) + PatchStep.REMOVE_PROTECTION_TAPE -> setupViewFragment(EopatchRemoveProtectionTapeFragment.newInstance()) + PatchStep.SAFETY_CHECK -> setupViewFragment(EopatchSafetyCheckFragment.newInstance()) PatchStep.ROTATE_KNOB_NEEDLE_INSERTION_ERROR, - PatchStep.ROTATE_KNOB -> setupViewFragment(EopatchRotateKnobFragment.newInstance()) - PatchStep.BASAL_SCHEDULE -> setupViewFragment(EopatchBasalScheduleFragment.newInstance()) + PatchStep.ROTATE_KNOB -> setupViewFragment(EopatchRotateKnobFragment.newInstance()) + PatchStep.BASAL_SCHEDULE -> setupViewFragment(EopatchBasalScheduleFragment.newInstance()) // PatchStep.SETTING_REMINDER_TIME -> setupViewFragment(PatchExpirationReminderSettingFragment.newInstance()) - PatchStep.CHECK_CONNECTION -> { - checkCommunication({ - setResult(RESULT_OK) - this@EopatchActivity.finish() - }, { - setResult(RESULT_CANCELED) - this@EopatchActivity.finish() - }, { - setResult(RESULT_DISCARDED) + PatchStep.CHECK_CONNECTION -> { + checkCommunication( + { + setResult(RESULT_OK) + this@EopatchActivity.finish() + }, { + setResult(RESULT_CANCELED) + this@EopatchActivity.finish() + }, { + setResult(RESULT_DISCARDED) - if (intent.getBooleanExtra(EXTRA_GO_HOME, true)) { - backToHome(false) - } else { - this@EopatchActivity.finish() - } - }, doIntercept = true) + if (intent.getBooleanExtra(EXTRA_GO_HOME, true)) { + backToHome(false) + } else { + this@EopatchActivity.finish() + } + }) } - PatchStep.COMPLETE -> backToHome(true) - PatchStep.FINISH -> { + + PatchStep.COMPLETE -> backToHome(true) + + PatchStep.FINISH -> { if (!intent.getBooleanExtra(EXTRA_START_FROM_MENU, false) - || intent.getBooleanExtra(EXTRA_GO_HOME, true)) { + || intent.getBooleanExtra(EXTRA_GO_HOME, true) + ) { backToHome(false) } else { this@EopatchActivity.finish() } } - PatchStep.BACK_TO_HOME -> backToHome(false) - PatchStep.CANCEL -> this@EopatchActivity.finish() - else -> Unit + + PatchStep.BACK_TO_HOME -> backToHome(false) + PatchStep.CANCEL -> this@EopatchActivity.finish() + else -> Unit } - }) + } } } } @@ -129,14 +135,12 @@ class EopatchActivity : EoBaseActivity() { } } - UIEventTypeHandler.observe(this@EopatchActivity, Observer { evt -> + eventHandler.observe(this@EopatchActivity) { evt -> when (evt.peekContent()) { EventType.SHOW_PATCH_COMM_DIALOG -> { if (mProgressDialog == null) { - mProgressDialog = ProgressDialog(this@EopatchActivity).apply { - setMessage(getString(evt.value as Int)) + mProgressDialog = ProgressDialogHelper.get(this@EopatchActivity, getString(evt.value as Int)).apply { setCancelable(false) - setProgressStyle(android.R.style.Widget_ProgressBar_Horizontal) } mProgressDialog?.show() } @@ -149,33 +153,33 @@ class EopatchActivity : EoBaseActivity() { EventType.SHOW_PATCH_COMM_ERROR_DIALOG -> { dismissRetryDialog() - if (patchStep.value?.isSafeDeactivation?:false || connectionTryCnt >= 2) { - val cancelLabel = commCheckCancelLabel.value?:getString(R.string.cancel) + if (patchStep.value?.isSafeDeactivation == true || connectionTryCnt >= 2) { + val cancelLabel = commCheckCancelLabel.value ?: getString(R.string.cancel) val message = "${getString(R.string.patch_comm_error_during_discard_desc_2)}\n${getString(R.string.patch_communication_check_helper_2)}" mPatchCommCheckDialog = AlertDialogHelper.Builder(this@EopatchActivity) .setTitle(R.string.patch_communication_failed) .setMessage(message) .setCancelable(false) - .setPositiveButton(R.string.discard, { dialog, which -> + .setPositiveButton(R.string.discard) { _, _ -> discardPatch() - }) - .setNegativeButton(cancelLabel, { dialog, which -> + } + .setNegativeButton(cancelLabel) { _, _ -> cancelPatchCommCheck() - }) + } .show() - }else{ - val cancelLabel = commCheckCancelLabel.value?:getString(R.string.cancel) + } else { + val cancelLabel = commCheckCancelLabel.value ?: getString(R.string.cancel) val message = "${getString(R.string.patch_communication_check_helper_1)}\n${getString(R.string.patch_communication_check_helper_2)}" mPatchCommCheckDialog = AlertDialogHelper.Builder(this@EopatchActivity) .setTitle(R.string.patch_communication_failed) .setMessage(message) .setCancelable(false) - .setPositiveButton(R.string.retry, { dialog, which -> + .setPositiveButton(R.string.retry) { _, _ -> retryCheckCommunication() - }) - .setNegativeButton(cancelLabel, { dialog, which -> + } + .setNegativeButton(cancelLabel) { _, _ -> cancelPatchCommCheck() - }) + } .show() } } @@ -185,31 +189,34 @@ class EopatchActivity : EoBaseActivity() { AlertDialogHelper.Builder(this@EopatchActivity) .setTitle(R.string.patch_communication_succeed) .setMessage(R.string.patch_communication_succeed_message) - .setPositiveButton(R.string.confirm, { dialog, which -> + .setPositiveButton(R.string.confirm) { _, _ -> dismissPatchCommCheckDialogInternal(true) - }).show() + }.show() } EventType.SHOW_CHANGE_PATCH_DIALOG -> { AlertDialogHelper.Builder(this@EopatchActivity).apply { setTitle(R.string.string_discard_patch) - setMessage(when { - patchState.isBolusActive && patchState.isTempBasalActive -> { - R.string.patch_change_confirm_bolus_and_temp_basal_are_active_desc - } - patchState.isBolusActive -> R.string.patch_change_confirm_bolus_is_active_desc - patchState.isTempBasalActive -> R.string.patch_change_confirm_temp_basal_is_active_desc - else -> R.string.patch_change_confirm_desc - }) - setPositiveButton(R.string.string_discard_patch, { dialog, which -> - deactivatePatch() - }) - setNegativeButton(R.string.cancel, { dialog, which -> + setMessage( + when { + patchState.isBolusActive && patchState.isTempBasalActive -> { + R.string.patch_change_confirm_bolus_and_temp_basal_are_active_desc + } - }) + patchState.isBolusActive -> R.string.patch_change_confirm_bolus_is_active_desc + patchState.isTempBasalActive -> R.string.patch_change_confirm_temp_basal_is_active_desc + else -> R.string.patch_change_confirm_desc + } + ) + setPositiveButton(R.string.string_discard_patch) { _, _ -> + deactivatePatch() + } + setNegativeButton(R.string.cancel) { _, _ -> + + } }.show() } - EventType.SHOW_BONDED_DIALOG -> this@EopatchActivity.finish() + // EventType.SHOW_BONDED_DIALOG -> this@EopatchActivity.finish() EventType.SHOW_DISCARD_DIALOG -> { AlertDialogHelper.Builder(this@EopatchActivity).apply { setTitle(R.string.string_discard_patch) @@ -218,7 +225,7 @@ class EopatchActivity : EoBaseActivity() { } else { setMessage(R.string.string_are_you_sure_to_discard_current_patch) } - setPositiveButton(R.string.discard, { dialog, which -> + setPositiveButton(R.string.discard) { _, _ -> deactivate(true) { dismissPatchCommCheckDialogInternal() @@ -228,17 +235,18 @@ class EopatchActivity : EoBaseActivity() { this@EopatchActivity.finish() } } - }) - setNegativeButton(R.string.cancel, { dialog, which -> + } + setNegativeButton(R.string.cancel) { _, _ -> dismissProgressDialog() updateIncompletePatchActivationReminder() - }) + } }.show() } - else -> Unit + + else -> Unit } - }) + } } } @@ -302,9 +310,8 @@ class EopatchActivity : EoBaseActivity() { const val EXTRA_START_WITH_COMM_CHECK = "EXTRA_START_WITH_COMM_CHECK" const val EXTRA_GO_HOME = "EXTRA_GO_HOME" const val EXTRA_FORCE_DISCARD = "EXTRA_FORCE_DISCARD" - @JvmField val PATCH_INITIAL_VOLTAGE_MIN = 2700 - @JvmField val NORMAL_TEMPERATURE_MIN = 4 - @JvmField val NORMAL_TEMPERATURE_MAX = 45 + const val NORMAL_TEMPERATURE_MIN = 4 + const val NORMAL_TEMPERATURE_MAX = 45 @JvmStatic @JvmOverloads @@ -316,11 +323,6 @@ class EopatchActivity : EoBaseActivity() { } } - @JvmStatic - fun createIntentForActivatePatch(context: Context): Intent { - return createIntent(context, PatchStep.WAKE_UP, false) - } - @JvmStatic fun createIntentForChangePatch(context: Context): Intent { return createIntent(context, PatchStep.SAFE_DEACTIVATION, false) @@ -335,7 +337,7 @@ class EopatchActivity : EoBaseActivity() { } @JvmStatic - fun createIntentForCanularInsertionError(context: Context): Intent { + fun createIntentForCannulaInsertionError(context: Context): Intent { return createIntent(context, PatchStep.ROTATE_KNOB_NEEDLE_INSERTION_ERROR, false) } @@ -383,7 +385,7 @@ class EopatchActivity : EoBaseActivity() { } } - fun setupViewFragment(baseFragment: EoBaseFragment<*>) { + private fun setupViewFragment(baseFragment: EoBaseFragment<*>) { replaceFragmentInActivity(baseFragment, R.id.framelayout_fragment, false) } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchConnectNewFragment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchConnectNewFragment.kt index 42c58e22ee..35115640d5 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchConnectNewFragment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchConnectNewFragment.kt @@ -23,16 +23,16 @@ class EopatchConnectNewFragment : EoBaseFragment checkCommunication ({ retryScan() }, { moveStep(PatchStep.WAKE_UP) }) - GET_PATCH_INFO_FAILED -> checkCommunication ({ getPatchInfo() }, { moveStep(PatchStep.WAKE_UP) }) - SELF_TEST_FAILED -> checkCommunication ({ selfTest() }, { moveStep(PatchStep.WAKE_UP) }) - ACTIVATION_FAILED -> Toast.makeText(requireContext(), "Activation failed!", Toast.LENGTH_LONG).show() - else -> Unit + BONDING_FAILED -> checkCommunication({ retryScan() }, { moveStep(PatchStep.WAKE_UP) }) + GET_PATCH_INFO_FAILED -> checkCommunication({ getPatchInfo() }, { moveStep(PatchStep.WAKE_UP) }) + SELF_TEST_FAILED -> checkCommunication({ selfTest() }, { moveStep(PatchStep.WAKE_UP) }) + ACTIVATION_FAILED -> Toast.makeText(requireContext(), "Activation failed!", Toast.LENGTH_LONG).show() + else -> Unit } - }) + } startScan() } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchOverviewFragment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchOverviewFragment.kt index 6ce1ba6f71..2346f206be 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchOverviewFragment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchOverviewFragment.kt @@ -1,28 +1,23 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui import android.app.AlertDialog -import android.app.ProgressDialog -import android.content.Context -import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.view.View import android.widget.Toast -import androidx.lifecycle.Observer +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.StringRes import androidx.lifecycle.ViewModelProvider import dagger.android.support.DaggerAppCompatActivity import info.nightscout.androidaps.plugins.bus.RxBus import info.nightscout.androidaps.plugins.pump.eopatch.R -import info.nightscout.androidaps.plugins.pump.eopatch.EoPatchRxBus import info.nightscout.androidaps.plugins.pump.eopatch.core.code.BolusType import info.nightscout.androidaps.plugins.pump.eopatch.code.PatchStep import info.nightscout.androidaps.plugins.pump.eopatch.code.EventType import info.nightscout.androidaps.plugins.pump.eopatch.databinding.FragmentEopatchOverviewBinding -import info.nightscout.androidaps.plugins.pump.eopatch.extension.fillExtras -import info.nightscout.androidaps.plugins.pump.eopatch.extension.subscribeDefault import info.nightscout.androidaps.plugins.pump.eopatch.extension.takeOne import info.nightscout.androidaps.plugins.pump.eopatch.ui.viewmodel.EopatchOverviewViewModel -import info.nightscout.androidaps.plugins.pump.eopatch.vo.ActivityResultEvent import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger import io.reactivex.disposables.CompositeDisposable @@ -32,8 +27,11 @@ class EopatchOverviewFragment: EoBaseFragment() @Inject lateinit var rxBus: RxBus @Inject lateinit var aapsSchedulers: AapsSchedulers @Inject lateinit var aapsLogger: AAPSLogger + private lateinit var resultLauncherForResume: ActivityResultLauncher + private lateinit var resultLauncherForPause: ActivityResultLauncher private var disposable: CompositeDisposable = CompositeDisposable() + private var pauseDuration = 0.5f override fun getLayoutId(): Int = R.layout.fragment_eopatch_overview @@ -48,21 +46,42 @@ class EopatchOverviewFragment: EoBaseFragment() binding.apply { viewmodel = ViewModelProvider(this@EopatchOverviewFragment, viewModelFactory).get(EopatchOverviewViewModel::class.java) viewmodel?.apply { - UIEventTypeHandler.observe(viewLifecycleOwner, Observer { evt -> - when(evt.peekContent()){ - EventType.ACTIVTION_CLICKED -> requireContext().let { startActivity(EopatchActivity.createIntentFromMenu(it, PatchStep.WAKE_UP)) } - EventType.DEACTIVTION_CLICKED -> requireContext().let { startActivity(EopatchActivity.createIntentForChangePatch(it)) } - EventType.SUSPEND_CLICKED -> suspend() + eventHandler.observe(viewLifecycleOwner) { evt -> + when (evt.peekContent()) { + EventType.ACTIVATION_CLICKED -> requireContext().apply { startActivity(EopatchActivity.createIntentFromMenu(this, PatchStep.WAKE_UP)) } + EventType.DEACTIVATION_CLICKED -> requireContext().apply { startActivity(EopatchActivity.createIntentForChangePatch(this)) } + EventType.SUSPEND_CLICKED -> suspend() EventType.RESUME_CLICKED -> resume() - EventType.INVALID_BASAL_RATE -> Toast.makeText(activity, R.string.unsupported_basal_rate, Toast.LENGTH_SHORT).show() - EventType.PROFILE_NOT_SET -> Toast.makeText(activity, R.string.no_profile_selected, Toast.LENGTH_SHORT).show() + EventType.INVALID_BASAL_RATE -> showToast(R.string.unsupported_basal_rate) + EventType.PROFILE_NOT_SET -> showToast(R.string.no_profile_selected) + EventType.PAUSE_BASAL_FAILED -> showToast(R.string.string_pause_failed) + EventType.RESUME_BASAL_FAILED -> showToast(R.string.string_resume_failed) else -> Unit } - }) + } + + resultLauncherForResume = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ + when (it.resultCode) { + DaggerAppCompatActivity.RESULT_OK -> resumeBasal() + DaggerAppCompatActivity.RESULT_CANCELED -> showToast(R.string.string_resume_failed) + } + } + + resultLauncherForPause = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ + when (it.resultCode) { + DaggerAppCompatActivity.RESULT_OK -> { + pauseBasal(pauseDuration) + pauseDuration = 0.5f + } + DaggerAppCompatActivity.RESULT_CANCELED -> showToast(R.string.string_pause_failed) + } + } } } + } - + private fun showToast(@StringRes strId: Int){ + Toast.makeText(requireContext(), strId, Toast.LENGTH_SHORT).show() } private fun suspend() { @@ -73,12 +92,12 @@ class EopatchOverviewFragment: EoBaseFragment() val dialog = builder.setTitle(R.string.string_suspend) .setMessage(msg) - .setPositiveButton(R.string.confirm, DialogInterface.OnClickListener { dialog, which -> + .setPositiveButton(R.string.confirm) { _, _ -> openPauseTimePicker() - }) - .setNegativeButton(R.string.cancel, DialogInterface.OnClickListener { dialog, which -> + } + .setNegativeButton(R.string.cancel) { _, _ -> - }).create() + }.create() dialog.show() } } @@ -90,18 +109,16 @@ class EopatchOverviewFragment: EoBaseFragment() val builder = AlertDialog.Builder(it) val dialog = builder.setTitle(R.string.string_resume_insulin_delivery_title) .setMessage(R.string.string_resume_insulin_delivery_message) - .setPositiveButton(R.string.confirm, DialogInterface.OnClickListener { dialog, which -> - if(isPatchConnected) { + .setPositiveButton(R.string.confirm) { _, _ -> + if (isPatchConnected) { resumeBasal() - }else{ - checkCommunication({ - resumeBasal() - }) + } else { + resultLauncherForResume.launch(EopatchActivity.createIntentForCheckConnection(requireContext(), true)) } - }) - .setNegativeButton(R.string.cancel, DialogInterface.OnClickListener { dialog, which -> + } + .setNegativeButton(R.string.cancel) { _, _ -> - }).create() + }.create() dialog.show() } } @@ -114,21 +131,20 @@ class EopatchOverviewFragment: EoBaseFragment() val listArr = requireContext().resources.getStringArray(R.array.suspend_duration_array) var select = 0 val dialog = builder.setTitle(R.string.string_suspend_time_insulin_delivery_title) - .setSingleChoiceItems(listArr, 0, DialogInterface.OnClickListener { dialog, which -> + .setSingleChoiceItems(listArr, 0) { _, which -> select = which - }) - .setPositiveButton(R.string.confirm, DialogInterface.OnClickListener { dialog, which -> + } + .setPositiveButton(R.string.confirm) { _, _ -> if (isPatchConnected) { pauseBasal((select + 1) * 0.5f) } else { - checkCommunication({ - pauseBasal((select + 1) * 0.5f) - }) + pauseDuration = (select + 1) * 0.5f + resultLauncherForPause.launch(EopatchActivity.createIntentForCheckConnection(requireContext(), true)) } - }) - .setNegativeButton(R.string.cancel, DialogInterface.OnClickListener { dialog, which -> + } + .setNegativeButton(R.string.cancel) { _, _ -> - }).create() + }.create() dialog.show() } } @@ -158,26 +174,4 @@ class EopatchOverviewFragment: EoBaseFragment() } return "" } - - override fun startActivityForResult(action: Context.() -> Intent, requestCode: Int, vararg params: Pair) { - val intent = action(requireContext()) - if(params.isNotEmpty()) intent.fillExtras(params) - startActivityForResult(intent, requestCode) - } - - override fun checkCommunication(onSuccess: () -> Unit, onCancel: (() -> Unit)?, onDiscard: (() -> Unit)?, goHomeAfterDiscard: Boolean) { - EoPatchRxBus.listen(ActivityResultEvent::class.java) - .doOnSubscribe { startActivityForResult({ EopatchActivity.createIntentForCheckConnection(this, goHomeAfterDiscard) }, 10001) } - .observeOn(aapsSchedulers.main) - .subscribeDefault(aapsLogger) { - if (it.requestCode == 10001) { - when (it.resultCode) { - DaggerAppCompatActivity.RESULT_OK -> onSuccess.invoke() - DaggerAppCompatActivity.RESULT_CANCELED -> onCancel?.invoke() - EopatchActivity.RESULT_DISCARDED -> onDiscard?.invoke() - } - } - }.addTo() - } - } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchRotateKnobFragment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchRotateKnobFragment.kt index cbeb1bc935..e1e4d7ee21 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchRotateKnobFragment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchRotateKnobFragment.kt @@ -39,14 +39,14 @@ class EopatchRotateKnobFragment : EoBaseFragment { checkCommunication({ startNeedleSensing() }) } - else -> Unit + else -> Unit } - }) + } } } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchSafetyCheckFragment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchSafetyCheckFragment.kt index c4858f90af..6ac1d9246e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchSafetyCheckFragment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/EopatchSafetyCheckFragment.kt @@ -24,12 +24,12 @@ class EopatchSafetyCheckFragment : EoBaseFragment checkCommunication ({ retrySafetyCheck() }, { moveStep(PatchStep.SAFETY_CHECK) }) - else -> Unit + SAFETY_CHECK_FAILED -> checkCommunication({ retrySafetyCheck() }, { moveStep(PatchStep.SAFETY_CHECK) }) + else -> Unit } - }) + } startSafetyCheck() } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ActivationNotCompleteDialog.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ActivationNotCompleteDialog.kt index e0c4bd0223..78b70ccd4c 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ActivationNotCompleteDialog.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ActivationNotCompleteDialog.kt @@ -10,7 +10,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.ble.IPatchManager import info.nightscout.androidaps.plugins.pump.eopatch.databinding.DialogCommonBinding import info.nightscout.androidaps.plugins.pump.eopatch.ui.DialogHelperActivity import info.nightscout.androidaps.plugins.pump.eopatch.ui.EopatchActivity -import io.reactivex.disposables.Disposable import javax.inject.Inject class ActivationNotCompleteDialog : DaggerDialogFragment() { @@ -24,7 +23,6 @@ class ActivationNotCompleteDialog : DaggerDialogFragment() { var title: String = "" private var _binding: DialogCommonBinding? = null - private var disposable: Disposable? = null private val binding get() = _binding!! override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/AlarmDialog.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/AlarmDialog.kt index 3507ed48b6..23e431fd5e 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/AlarmDialog.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/AlarmDialog.kt @@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui.dialogs import android.os.Build import android.os.Bundle import android.os.Handler +import android.os.HandlerThread import android.view.* import dagger.android.support.DaggerDialogFragment import info.nightscout.androidaps.core.R @@ -32,13 +33,13 @@ class AlarmDialog : DaggerDialogFragment() { var helperActivity: AlarmHelperActivity? = null var alarmCode: AlarmCode? = null - var code: String = "" + var code: String? = null var status: String = "" var title: String = "" var sound: Int = 0 private lateinit var mAlarmProcess: IAlarmProcess - private var loopHandler = Handler() + private var handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) private var _binding: DialogAlarmBinding? = null private var disposable: Disposable? = null @@ -107,7 +108,7 @@ class AlarmDialog : DaggerDialogFragment() { aapsLogger.debug("USER ENTRY: Error dialog mute 5 min button pressed") stopAlarm() isMute = true - loopHandler.postDelayed(this::startAlarm, T.mins(5).msecs()) + handler.postDelayed(this::startAlarm, T.mins(5).msecs()) } startAlarm() @@ -150,7 +151,7 @@ class AlarmDialog : DaggerDialogFragment() { override fun dismiss() { super.dismissAllowingStateLoss() - loopHandler.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) helperActivity?.finish() } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/CommonDialog.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/CommonDialog.kt index 5becbcf5f2..5e0ab3d1d2 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/CommonDialog.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/CommonDialog.kt @@ -28,12 +28,12 @@ class CommonDialog : DaggerDialogFragment() { if(title != 0) setTitle(title) if(message != 0) setMessage(message) setPositiveButton(positiveBtn, - positiveListener?:DialogInterface.OnClickListener { dialog, which -> + positiveListener?:DialogInterface.OnClickListener { _, _ -> dismiss() }) if(negativeBtn != 0) { setNegativeButton(negativeBtn, - negativeListener ?: DialogInterface.OnClickListener { dialog, which -> + negativeListener ?: DialogInterface.OnClickListener { _, _ -> dismiss() }) } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ProgressDialogHelper.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ProgressDialogHelper.kt new file mode 100644 index 0000000000..c79d450a0b --- /dev/null +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/dialogs/ProgressDialogHelper.kt @@ -0,0 +1,61 @@ +package info.nightscout.androidaps.plugins.pump.eopatch.ui.dialogs + +import android.content.Context +import android.graphics.Color +import android.view.Gravity +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.appcompat.app.AlertDialog + +class ProgressDialogHelper { + companion object { + fun get(context:Context, message:String): AlertDialog { + val llPadding = 30 + val linearLayout = LinearLayout(context) + linearLayout.orientation = LinearLayout.HORIZONTAL + linearLayout.setPadding(llPadding, llPadding, llPadding, llPadding) + linearLayout.gravity = Gravity.CENTER + var llParam = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT) + llParam.gravity = Gravity.CENTER + linearLayout.layoutParams = llParam + + val progressBar = ProgressBar(context) + progressBar.isIndeterminate = true + progressBar.setPadding(0, 0, llPadding, 0) + progressBar.layoutParams = llParam + + llParam = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT) + llParam.gravity = Gravity.CENTER + val tvText = TextView(context) + tvText.text = message + // tvText.setTextColor(Color.parseColor("#000000")) + tvText.textSize = 20.toFloat() + tvText.layoutParams = llParam + + linearLayout.addView(progressBar) + linearLayout.addView(tvText) + + val builder = AlertDialog.Builder(context) + builder.setCancelable(true) + builder.setView(linearLayout) + + val dialog = builder.create() + val window = dialog.window + if (window != null) { + val layoutParams = WindowManager.LayoutParams() + layoutParams.copyFrom(dialog.window?.attributes) + layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT + layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT + dialog.window?.attributes = layoutParams + } + return dialog + } + } +} \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/event/SingleLiveEvent.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/event/SingleLiveEvent.kt index 17a1d965f3..499cc34305 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/event/SingleLiveEvent.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/event/SingleLiveEvent.kt @@ -4,17 +4,16 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import androidx.annotation.MainThread -import android.util.Log import java.util.concurrent.atomic.AtomicBoolean open class SingleLiveEvent : MutableLiveData() { private val mPending = AtomicBoolean(false) override fun observe(owner: LifecycleOwner, observer: Observer) { - super.observe(owner, Observer { t -> + super.observe(owner) { t -> if (mPending.compareAndSet(true, false)) { observer.onChanged(t) } - }) + } } @MainThread diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/receiver/RxBroadcastReceiver.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/receiver/RxBroadcastReceiver.kt index 5b6733ed4c..680e1c0483 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/receiver/RxBroadcastReceiver.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/receiver/RxBroadcastReceiver.kt @@ -6,10 +6,8 @@ import android.content.Intent import android.content.IntentFilter import androidx.annotation.CheckResult import io.reactivex.android.MainThreadDisposable -import info.nightscout.androidaps.plugins.pump.eopatch.ui.receiver.RxBroadcastReceiver.BroadcastReceiverObservable import io.reactivex.Observable import io.reactivex.Observer -import java.lang.AssertionError class RxBroadcastReceiver private constructor() { internal class BroadcastReceiverObservable : Observable { @@ -31,7 +29,7 @@ class RxBroadcastReceiver private constructor() { } override fun subscribeActual(observer: Observer) { - val listener: Listener = Listener(context, observer) + val listener = Listener(context, observer) observer.onSubscribe(listener) context.registerReceiver(listener.receiver, intentFilter) } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EoBaseViewModel.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EoBaseViewModel.kt index ff417e8b02..223e9ebbe5 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EoBaseViewModel.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EoBaseViewModel.kt @@ -1,8 +1,5 @@ package info.nightscout.androidaps.plugins.pump.eopatch.ui.viewmodel -import android.view.MotionEvent -import android.view.View -import androidx.annotation.Keep import androidx.lifecycle.ViewModel import info.nightscout.androidaps.plugins.pump.eopatch.ui.EoBaseNavigator import io.reactivex.disposables.CompositeDisposable @@ -26,10 +23,6 @@ abstract class EoBaseViewModel : ViewModel() { super.onCleared() } - fun blockTouchEvent(view: View, motionEvent: MotionEvent): Boolean { - return true - } - fun back() = navigator?.back() fun finish() = navigator?.finish() diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchOverviewViewModel.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchOverviewViewModel.kt index 7dd6d2be6a..c7252158fb 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchOverviewViewModel.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchOverviewViewModel.kt @@ -21,6 +21,7 @@ import io.reactivex.Observable import io.reactivex.disposables.Disposable import java.util.concurrent.TimeUnit import javax.inject.Inject +import kotlin.math.max import kotlin.math.roundToInt class EopatchOverviewViewModel @Inject constructor( @@ -31,7 +32,7 @@ class EopatchOverviewViewModel @Inject constructor( private val aapsSchedulers: AapsSchedulers ) : EoBaseViewModel() { private val _eventHandler = SingleLiveEvent>() - val UIEventTypeHandler : LiveData> + val eventHandler : LiveData> get() = _eventHandler private val _patchConfig = SingleLiveEvent() @@ -58,6 +59,10 @@ class EopatchOverviewViewModel @Inject constructor( val status : LiveData get() = _status + private val _pauseBtnStr = SingleLiveEvent() + val pauseBtnStr : LiveData + get() = _pauseBtnStr + private val _alarms = SingleLiveEvent() val alarms : LiveData get() = _alarms @@ -128,18 +133,18 @@ class EopatchOverviewViewModel @Inject constructor( private fun updatePatchStatus(){ if(patchManager.isActivated){ - var finishTimeMillis = patchConfig.value?.basalPauseFinishTimestamp?:System.currentTimeMillis() - var remainTimeMillis = Math.max(finishTimeMillis - System.currentTimeMillis(), 0L) + val finishTimeMillis = patchConfig.value?.basalPauseFinishTimestamp?:System.currentTimeMillis() + val remainTimeMillis = max(finishTimeMillis - System.currentTimeMillis(), 0L) val h = TimeUnit.MILLISECONDS.toHours(remainTimeMillis) val m = TimeUnit.MILLISECONDS.toMinutes(remainTimeMillis - TimeUnit.HOURS.toMillis(h)) _status.value = if(patchManager.patchState.isNormalBasalPaused) - "${rh.gs(R.string.string_suspended)}\n" + - "${rh.gs(R.string.string_temp_basal_remained_hhmm, h.toString(), m.toString())}" + "${rh.gs(R.string.string_suspended)}\n${rh.gs(R.string.string_temp_basal_remained_hhmm, h.toString(), m.toString())}" else rh.gs(R.string.string_running) }else{ _status.value = "" } + _pauseBtnStr.value = if(patchManager.patchState.isNormalBasalPaused) rh.gs(R.string.string_resume) else rh.gs(R.string.string_suspend) } private fun updateBasalInfo(){ @@ -166,7 +171,7 @@ class EopatchOverviewViewModel @Inject constructor( patchManager.preferenceManager.getNormalBasalManager().setNormalBasal(profile) patchManager.preferenceManager.flushNormalBasalManager() - _eventHandler.postValue(UIEvent(EventType.ACTIVTION_CLICKED)) + _eventHandler.postValue(UIEvent(EventType.ACTIVATION_CLICKED)) }else if(profile != null && profile.getBasal() < 0.05){ _eventHandler.postValue(UIEvent(EventType.INVALID_BASAL_RATE)) }else{ @@ -175,7 +180,7 @@ class EopatchOverviewViewModel @Inject constructor( } fun onClickDeactivation(){ - _eventHandler.postValue(UIEvent(EventType.DEACTIVTION_CLICKED)) + _eventHandler.postValue(UIEvent(EventType.DEACTIVATION_CLICKED)) } fun onClickSuspendOrResume(){ @@ -190,8 +195,8 @@ class EopatchOverviewViewModel @Inject constructor( patchManager.pauseBasal(pauseDurationHour) .subscribeOn(aapsSchedulers.io) .observeOn(aapsSchedulers.main) - .subscribe({ - if (it.isSuccess) { + .subscribe({ response -> + if (response.isSuccess) { navigator?.toast(R.string.string_suspended_insulin_delivery_message) startPeriodicallyUpdate() } else { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchViewModel.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchViewModel.kt index fc49c90f6a..fb70d95f57 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchViewModel.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/EopatchViewModel.kt @@ -25,7 +25,9 @@ import info.nightscout.androidaps.plugins.pump.eopatch.ui.EoBaseNavigator import info.nightscout.androidaps.plugins.pump.eopatch.ui.event.SingleLiveEvent import info.nightscout.androidaps.plugins.pump.eopatch.ui.event.UIEvent import info.nightscout.androidaps.plugins.pump.eopatch.ui.viewmodel.EopatchViewModel.SetupStep.* +import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchConfig import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchLifecycleEvent +import info.nightscout.androidaps.plugins.pump.eopatch.vo.PatchState import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.rx.AapsSchedulers import info.nightscout.shared.logging.AAPSLogger @@ -55,24 +57,19 @@ class EopatchViewModel @Inject constructor( var forceDiscard = false var connectionTryCnt = 0 - val patchConfig = patchManager.patchConfig - - val patchState = patchManager.patchState + val patchConfig: PatchConfig = patchManager.patchConfig + val patchState: PatchState = patchManager.patchState private val _isActivated = MutableLiveData(patchConfig.isActivated) private val _eventHandler = SingleLiveEvent>() - val UIEventTypeHandler : LiveData> + val eventHandler : LiveData> get() = _eventHandler - fun onClickActivation(){ - _eventHandler.postValue(UIEvent(EventType.ACTIVTION_CLICKED)) - } - val patchStep = MutableLiveData() - val isActivated = MutableLiveData(patchManager.isActivated) - val isBolusActive = patchManager.getPatchState().isBolusActive + val isActivated = MutableLiveData(patchManager.isActivated) + val isBolusActive = patchManager.patchState.isBolusActive val isConnected = patchManager.patchConnectionState.isConnected val patchRemainedInsulin: LiveData @@ -86,7 +83,7 @@ class EopatchViewModel @Inject constructor( }, 0) } - private val _patchExpirationTimestamp = MutableLiveData(patchManager.patchExpiredTime) + private val _patchExpirationTimestamp = MutableLiveData(patchManager.patchExpiredTime) val patchRemainedDays: LiveData get() = Transformations.map(_patchExpirationTimestamp) { @@ -106,19 +103,11 @@ class EopatchViewModel @Inject constructor( val safetyCheckProgress: LiveData get() = _safetyCheckProgress - private val _patchExpirationReminderTime = MutableLiveData() - val patchExpirationReminderTime: LiveData - get() = _patchExpirationReminderTime - - private val _patchExpirationTime = MutableLiveData() - val patchExpirationTime: LiveData - get() = _patchExpirationTime - private val _isCommCheckFailed = MutableLiveData(false) - val isCommCheckFailed: LiveData + private val isCommCheckFailed: LiveData get() = _isCommCheckFailed - val isBonded: Boolean + private val isBonded: Boolean get() = !patchConfig.lifecycleEvent.isShutdown val commCheckCancelLabel: LiveData @@ -129,15 +118,11 @@ class EopatchViewModel @Inject constructor( } PatchStep.SAFE_DEACTIVATION -> R.string.patch_forced_discard else -> R.string.cancel - }) ?: "" + }) } val programEnabledMessage: String - // get() = """'기초1' program has been enabled.""" - get() = rh.gs(R.string.patch_basal_schedule_desc_1,"기초1") ?: "" - - val patchStepIsSafeDeactivation: Boolean - get() = patchStep.value?.isSafeDeactivation ?: false + get() = rh.gs(R.string.patch_basal_schedule_desc_1,"기초1") private val _isDiscardedWithNotConn = MutableLiveData(false) val isDiscardedWithNotConn: LiveData @@ -152,8 +137,6 @@ class EopatchViewModel @Inject constructor( private val initPatchStepIsCheckConnection: Boolean get() = mInitPatchStep?.isCheckConnection ?: false - // private var mProgressDialog: PatchProgressDialog? = null - private var mCommCheckDisposable: Disposable? = null private var mOnCommCheckSuccessListener: (() -> Unit)? = null @@ -174,8 +157,6 @@ class EopatchViewModel @Inject constructor( private val mB012UpdateSubject = PublishSubject.create() - // private var mCurrentTextDialog: TextDialog? = null - init { mB012UpdateDisposable = mB012UpdateSubject.hide() .throttleFirst(500, TimeUnit.MILLISECONDS) @@ -222,20 +203,7 @@ class EopatchViewModel @Inject constructor( @Synchronized fun checkCommunication(onSuccessListener: () -> Unit, onCancelListener: (() -> Unit)? = null, - onDiscardListener: (() -> Unit)? = null, doPreCheck: Boolean = false, doIntercept: Boolean = false) { - // mPatchCommCheckDialog?.let { - // if (doIntercept) { - // mOnCommCheckSuccessListener = onSuccessListener - // mOnCommCheckCancelListener = onCancelListener - // mOnCommCheckDiscardListener = onDiscardListener - // - // if (_isCommCheckFailed.value == true) { - // retryCheckCommunication() - // } - // } - // - // } - + onDiscardListener: (() -> Unit)? = null, doPreCheck: Boolean = false) { if (doPreCheck && patchManager.patchConnectionState.isConnected) { onSuccessListener.invoke() return @@ -286,7 +254,7 @@ class EopatchViewModel @Inject constructor( } } - fun showPatchCommCheckDialog(defaultFailedCondition: Boolean = false, @StringRes title: Int = R.string.string_connecting) { + private fun showPatchCommCheckDialog(defaultFailedCondition: Boolean = false, @StringRes title: Int = R.string.string_connecting) { _isCommCheckFailed.postValue(defaultFailedCondition) _eventHandler.postValue(UIEvent(EventType.SHOW_PATCH_COMM_DIALOG).apply { value = title @@ -307,7 +275,7 @@ class EopatchViewModel @Inject constructor( } private fun dismissPatchCommCheckDialog() { - if (_isCommCheckFailed.value == false) { + if (isCommCheckFailed.value == false) { if (isBonded) { _eventHandler.postValue(UIEvent(EventType.SHOW_BONDED_DIALOG)) } else { @@ -554,7 +522,7 @@ class EopatchViewModel @Inject constructor( } } - fun convertToPatchStep(lifecycle: PatchLifecycle) = when (lifecycle) { + private fun convertToPatchStep(lifecycle: PatchLifecycle) = when (lifecycle) { PatchLifecycle.SHUTDOWN -> patchConfig.isDeactivated.takeOne( PatchStep.WAKE_UP, PatchStep.SAFE_DEACTIVATION) PatchLifecycle.BONDED -> PatchStep.CONNECT_NEW @@ -567,13 +535,6 @@ class EopatchViewModel @Inject constructor( } private fun onClear() { - // _patchExpirationTime.value = null - // _rotateKnobRawRes.value = null - // _patchExpirationReminderTime.value = null - // _title.value = null - // mProgressDialog = null - // mPatchCommCheckDialog = null - // mCurrentTextDialog = null mOnCommCheckSuccessListener = null mOnCommCheckCancelListener = null mOnCommCheckDiscardListener = null @@ -691,7 +652,7 @@ class EopatchViewModel @Inject constructor( .doOnSubscribe { updateSetupStep(BONDING_STARTED) } .filter { result -> result } .toSingle() // 실패시 에러 반환. - .doOnSuccess { patchManager.updatePatchLifeCycle(PatchLifecycleEvent.createbonded()) } + .doOnSuccess { patchManager.updatePatchLifeCycle(PatchLifecycleEvent.createBonded()) } .doOnError { if (it is TimeoutException) { moveStep(PatchStep.WAKE_UP) diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/ViewModelFactory.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/ViewModelFactory.kt index eb155e423a..0a351591e1 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/ViewModelFactory.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/ui/viewmodel/ViewModelFactory.kt @@ -30,6 +30,7 @@ class ViewModelFactory @Inject constructor(private val creators: Map { +class Alarms: IPreference { @Transient private val subject: BehaviorSubject = BehaviorSubject.create() @@ -24,7 +24,7 @@ class Alarms(): IPreference { var registered = HashMap() - var occured = HashMap() + var occurred = HashMap() init { initObject() @@ -35,52 +35,52 @@ class Alarms(): IPreference { fun clear(){ registered.clear() - occured.clear() + occurred.clear() } fun update(other: Alarms) { registered = other.registered - occured = other.occured + occurred = other.occurred } - fun register(alarmcode: AlarmCode, triggerAfter: Long) { + fun register(alarmCode: AlarmCode, triggerAfter: Long) { val item = AlarmItem().apply { - alarmCode = alarmcode + this.alarmCode = alarmCode createTimestamp = System.currentTimeMillis() triggerTimeMilli = createTimestamp + triggerAfter } - if (isRegistered(alarmcode)){ - registered.remove(alarmcode) + if (isRegistered(alarmCode)){ + registered.remove(alarmCode) } - registered.put(alarmcode, item) + registered.put(alarmCode, item) } - fun unregister(alarmcode: AlarmCode) { - if (isRegistered(alarmcode)){ - registered.remove(alarmcode) + fun unregister(alarmCode: AlarmCode) { + if (isRegistered(alarmCode)){ + registered.remove(alarmCode) } } - fun occured(alarmcode: AlarmCode) { - val item: AlarmItem? = registered.get(alarmcode) - if (!isOccuring(alarmcode) && item != null) - occured.put(alarmcode, item) - if (isRegistered(alarmcode)) - registered.remove(alarmcode) + fun occurred(alarmCode: AlarmCode) { + val item: AlarmItem? = registered.get(alarmCode) + if (!isOccurring(alarmCode) && item != null) + occurred.put(alarmCode, item) + if (isRegistered(alarmCode)) + registered.remove(alarmCode) } - fun handle(alarmcode: AlarmCode) { - if (isOccuring(alarmcode)) - occured.remove(alarmcode) + fun handle(alarmCode: AlarmCode) { + if (isOccurring(alarmCode)) + occurred.remove(alarmCode) } - fun isRegistered(alarmcode: AlarmCode): Boolean{ - return registered.containsKey(alarmcode) + private fun isRegistered(alarmCode: AlarmCode): Boolean{ + return registered.containsKey(alarmCode) } - fun isOccuring(alarmcode: AlarmCode): Boolean{ - return occured.containsKey(alarmcode) + fun isOccurring(alarmCode: AlarmCode): Boolean{ + return occurred.containsKey(alarmCode) } override fun observe(): Observable { @@ -94,15 +94,6 @@ class Alarms(): IPreference { } override fun toString(): String { - return "Alarms(subject=$subject, registered=${registered.keys}, occured=${occured.keys}" + return "Alarms(subject=$subject, registered=${registered.keys}, occurred=${occurred.keys}" } - - companion object { - const val NAME = "ALARMS" - @JvmStatic - fun createEmpty(): Alarms { - return Alarms() - } - } - } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BasalSegment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BasalSegment.kt index e0571ecc7a..b7125d06af 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BasalSegment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BasalSegment.kt @@ -17,11 +17,11 @@ data class BasalSegment (var start: Long, var end: Long, var doseUnitPerHour: Fl this.endMinute = end } - internal override fun duplicate(startMinute: Long, endMinute: Long): BasalSegment { + override fun duplicate(startMinute: Long, endMinute: Long): BasalSegment { return BasalSegment(startMinute, endMinute, doseUnitPerHour) } - internal override fun deep(): BasalSegment { + override fun deep(): BasalSegment { return BasalSegment(startMinute, endMinute, doseUnitPerHour) } @@ -29,8 +29,8 @@ data class BasalSegment (var start: Long, var end: Long, var doseUnitPerHour: Fl segment.doseUnitPerHour = doseUnitPerHour } - internal override fun equalValue(segment: BasalSegment): Boolean { - return segment != null && doseUnitPerHour == segment.doseUnitPerHour + override fun equalValue(segment: BasalSegment): Boolean { + return doseUnitPerHour == segment.doseUnitPerHour } companion object { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BolusCurrent.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BolusCurrent.kt index 3ddb1b66f3..905673835a 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BolusCurrent.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/BolusCurrent.kt @@ -1,6 +1,5 @@ package info.nightscout.androidaps.plugins.pump.eopatch.vo -import android.content.Context import info.nightscout.androidaps.plugins.pump.eopatch.AppConstant import info.nightscout.androidaps.plugins.pump.eopatch.GsonHelper import info.nightscout.androidaps.plugins.pump.eopatch.core.code.BolusType @@ -179,16 +178,4 @@ class BolusCurrent(): IPreference { override fun toString(): String { return "BolusCurrent(nowBolus=$nowBolus, extBolus=$extBolus)" } - - companion object { - - const val NAME = "BOLUS_CURRENT" - - @JvmStatic - fun createEmpty(): BolusCurrent { - return BolusCurrent() - } - - } - } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/IPreference.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/IPreference.kt index 225da1a390..e92fc7e5c6 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/IPreference.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/IPreference.kt @@ -4,6 +4,6 @@ import info.nightscout.shared.sharedPreferences.SP import io.reactivex.Observable interface IPreference{ - open fun flush(sp: SP) - open fun observe(): Observable + fun flush(sp: SP) + fun observe(): Observable } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasal.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasal.kt index 016e98776c..17a8f9d426 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasal.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasal.kt @@ -1,12 +1,11 @@ package info.nightscout.androidaps.plugins.pump.eopatch.vo -import android.util.MutableFloat import info.nightscout.androidaps.plugins.pump.eopatch.AppConstant import info.nightscout.androidaps.plugins.pump.eopatch.core.util.FloatAdjusters import info.nightscout.androidaps.plugins.pump.eopatch.code.BasalStatus import java.util.* import java.util.concurrent.TimeUnit -import java.util.function.BiFunction +import kotlin.math.max class NormalBasal : SegmentsEntity() { var status: BasalStatus = BasalStatus.SELECTED @@ -18,11 +17,11 @@ class NormalBasal : SegmentsEntity() { } } - var segmentIndex = SEGMENT_INDEX_DEFAULT + private var segmentIndex = SEGMENT_INDEX_DEFAULT val maxDoseUnitPerHour: Float get() { - val max = list.stream().map({ it.doseUnitPerHour }).mapToDouble({ it.toDouble() }).max().orElse(0.0).toFloat() + val max = list.stream().map { it.doseUnitPerHour }.mapToDouble { it.toDouble() }.max().orElse(0.0).toFloat() return FloatAdjusters.ROUND2_INSULIN.apply(max) } @@ -30,7 +29,7 @@ class NormalBasal : SegmentsEntity() { get() { val doseArray = FloatArray(AppConstant.SEGMENT_COUNT_MAX) - eachSegmentItem(BiFunction { index, segment -> + eachSegmentItem { index, segment -> val dose = segment.doseUnitPerHour / 2 if (index % 2 == 0) { doseArray[index] = FloatAdjusters.CEIL2_BASAL_RATE.apply(dose) @@ -38,43 +37,40 @@ class NormalBasal : SegmentsEntity() { doseArray[index] = FloatAdjusters.FLOOR2_BASAL_RATE.apply(dose) } true - }) + } return doseArray } - val doseUnitPerSegmentArrayForGraph: FloatArray + private val doseUnitPerSegmentArrayForGraph: FloatArray get() { val doseArray = FloatArray(AppConstant.SEGMENT_COUNT_MAX) - eachSegmentItem(BiFunction { index, segment -> + eachSegmentItem { index, segment -> doseArray[index] = FloatAdjusters.CEIL2_BASAL_RATE.apply(segment.doseUnitPerHour) true - }) + } return doseArray } val doseUnitPerDay: Float get() { - val total = MutableFloat(0f) - eachSegmentItem(BiFunction { index, segment -> + var total = 0f + eachSegmentItem { index, segment -> val dose = segment.doseUnitPerHour / 2 - if (index % 2 == 0) { - total.value += FloatAdjusters.CEIL2_BASAL_RATE.apply(dose) + total += if (index % 2 == 0) { + FloatAdjusters.CEIL2_BASAL_RATE.apply(dose) } else { - total.value += FloatAdjusters.FLOOR2_BASAL_RATE.apply(dose) + FloatAdjusters.FLOOR2_BASAL_RATE.apply(dose) } true - }) - return total.value + } + return total } val currentSegmentDoseUnitPerHour: Float get() = FloatAdjusters.ROUND2_INSULIN.apply(getSegmentDoseUnitPerHourByIndex(currentSegmentIndex)) - val firstSegmentDoseUnitPerHour: Float - get() = FloatAdjusters.ROUND2_INSULIN.apply(getSegmentDoseUnitPerHourByIndex(0)) - - val currentSegmentIndex: Int + private val currentSegmentIndex: Int get() { val cal = Calendar.getInstance() var idx = cal.get(Calendar.HOUR_OF_DAY) * 2 @@ -84,19 +80,6 @@ class NormalBasal : SegmentsEntity() { return idx } - val isDoseUChanged: Boolean - get() { - val currentSegmentIndex = currentSegmentIndex - if (segmentIndex != SEGMENT_INDEX_DEFAULT && segmentIndex != currentSegmentIndex) { - val beforeDoesU = getSegmentDoseUnitPerHourByIndex(segmentIndex) - val currentDoseU = getSegmentDoseUnitPerHourByIndex(currentSegmentIndex) - if (beforeDoesU != currentDoseU) { - return true - } - } - return false - } - val startTime: Long get() = getStartTime(currentSegmentIndex) @@ -113,7 +96,7 @@ class NormalBasal : SegmentsEntity() { return FloatAdjusters.ROUND2_INSULIN.apply(getSegmentDoseUnitPerHourByIndex(getSegmentIndex(time))) } - fun getSegmentDoseUnitPerHourByIndex(idx: Int): Float { + private fun getSegmentDoseUnitPerHourByIndex(idx: Int): Float { val defaultValue = 0f for (seg in list) { val startIndex = seg.startIndex @@ -142,31 +125,27 @@ class NormalBasal : SegmentsEntity() { var minutes = calendar.get(Calendar.MINUTE) var startIndex = hours * 2 + minutes / 30 - startIndex = startIndex % AppConstant.SEGMENT_COUNT_MAX + startIndex %= AppConstant.SEGMENT_COUNT_MAX hours = (hours + durationMinutes / 60).toInt() minutes = (minutes + durationMinutes % 60).toInt() var endIndex = hours * 2 + minutes / 30 - endIndex = endIndex % AppConstant.SEGMENT_COUNT_MAX + endIndex %= AppConstant.SEGMENT_COUNT_MAX val segments = doseUnitPerSegmentArrayForGraph var maxBasal = segments[startIndex] var i = startIndex while (i != endIndex + 1) { if (i >= AppConstant.SEGMENT_COUNT_MAX) { - i = i % AppConstant.SEGMENT_COUNT_MAX + i %= AppConstant.SEGMENT_COUNT_MAX } - maxBasal = Math.max(maxBasal, segments[i]) + maxBasal = max(maxBasal, segments[i]) i++ } return maxBasal } - fun isIndexChanged(): Boolean { - return (segmentIndex != SEGMENT_INDEX_DEFAULT && segmentIndex != currentSegmentIndex) - } - @Synchronized fun updateNormalBasalIndex(): Boolean { val currentSegmentIndex = currentSegmentIndex @@ -182,7 +161,7 @@ class NormalBasal : SegmentsEntity() { return false } - fun getStartTime(segmentIndex: Int): Long { + private fun getStartTime(segmentIndex: Int): Long { val curIndexTime: Long val calendar = Calendar.getInstance() calendar.set(Calendar.HOUR_OF_DAY, 0) @@ -199,9 +178,7 @@ class NormalBasal : SegmentsEntity() { } companion object { - - private val HALF_HOUR = 0.5f - private val SEGMENT_INDEX_DEFAULT = -1 + private const val SEGMENT_INDEX_DEFAULT = -1 fun create(firstSegmentDoseUnitPerHour: Float): NormalBasal { val b = NormalBasal() diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasalManager.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasalManager.kt index a562e50d38..6f52a70436 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasalManager.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/NormalBasalManager.kt @@ -10,7 +10,7 @@ import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject import java.util.concurrent.TimeUnit -class NormalBasalManager() : IPreference { +class NormalBasalManager : IPreference { @Transient private val subject: BehaviorSubject = BehaviorSubject.create() @@ -29,16 +29,15 @@ class NormalBasalManager() : IPreference { } fun isEqual(profile: Profile?): Boolean{ - if(profile == null) false + return profile?.let{ + if(it.getBasalValues().size != normalBasal.list.size) + return false - if(profile?.getBasalValues()?.size?:0 != normalBasal.list.size) false - - return profile?.let{prof -> - for(i in prof.getBasalValues().indices){ - if(TimeUnit.SECONDS.toMinutes(prof.getBasalValues()[i].timeAsSeconds.toLong()) != normalBasal.list.get(i).start){ + for(i in it.getBasalValues().indices){ + if(TimeUnit.SECONDS.toMinutes(it.getBasalValues()[i].timeAsSeconds.toLong()) != normalBasal.list.get(i).start){ return false } - if(CommonUtils.nearlyNotEqual(prof.getBasalValues()[i].value.toFloat(), normalBasal.list.get(i).doseUnitPerHour, 0.0000001f)){ + if(CommonUtils.nearlyNotEqual(it.getBasalValues()[i].value.toFloat(), normalBasal.list.get(i).doseUnitPerHour, 0.0000001f)){ return false } } @@ -52,11 +51,11 @@ class NormalBasalManager() : IPreference { val size = profile.getBasalValues().size for(idx in profile.getBasalValues().indices){ - val next_idx = if(idx == (size - 1)) 0 else idx + 1 - val st_mins = TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[idx].timeAsSeconds.toLong()) - val et_mins = if(next_idx == 0) 1440 else TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[next_idx].timeAsSeconds.toLong()) + val nextIdx = if(idx == (size - 1)) 0 else idx + 1 + val startTimeMinutes = TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[idx].timeAsSeconds.toLong()) + val endTimeMinutes = if(nextIdx == 0) 1440 else TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[nextIdx].timeAsSeconds.toLong()) - tmpNormalBasal.list.add(BasalSegment(st_mins, et_mins, profile.getBasalValues()[idx].value.toFloat())) + tmpNormalBasal.list.add(BasalSegment(startTimeMinutes, endTimeMinutes, profile.getBasalValues()[idx].value.toFloat())) } return tmpNormalBasal @@ -67,11 +66,11 @@ class NormalBasalManager() : IPreference { val size = profile.getBasalValues().size for(idx in profile.getBasalValues().indices){ - val next_idx = if(idx == (size - 1)) 0 else idx + 1 - val st_mins = TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[idx].timeAsSeconds.toLong()) - val et_mins = if(next_idx == 0) 1440 else TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[next_idx].timeAsSeconds.toLong()) + val nextIdx = if(idx == (size - 1)) 0 else idx + 1 + val startTimeMinutes = TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[idx].timeAsSeconds.toLong()) + val endTimeMinutes = if(nextIdx == 0) 1440 else TimeUnit.SECONDS.toMinutes(profile.getBasalValues()[nextIdx].timeAsSeconds.toLong()) - normalBasal.list.add(BasalSegment(st_mins, et_mins, profile.getBasalValues()[idx].value.toFloat())) + normalBasal.list.add(BasalSegment(startTimeMinutes, endTimeMinutes, profile.getBasalValues()[idx].value.toFloat())) } } @@ -96,18 +95,13 @@ class NormalBasalManager() : IPreference { } @Synchronized - fun updateBasalSelecteded(index: Int) { - normalBasal.status = BasalStatus.SELECTED - } - - @Synchronized - fun updateBasalSelecteded() { + fun updateBasalSelected() { normalBasal.status = BasalStatus.SELECTED } fun updateForDeactivation() { // deactivation 할때는 SELECTED 상태로 변경 - updateBasalSelecteded() + updateBasalSelected() } fun update(other: NormalBasalManager){ diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchConfig.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchConfig.kt index c9389e7273..27efffe120 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchConfig.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchConfig.kt @@ -54,7 +54,7 @@ class PatchConfig: IPreference { /* 패치와 API 통신으로 업데이트 값을 여기에 기록 중복 API 호출이 생기면 안되는 경우 여기에 */ // SET_LOW_RESERVOIR_TASK - var LowReservoirAlertAmount = 10 + var lowReservoirAlertAmount = 10 var patchExpireAlertTime = 4 var infoReminder = false @@ -93,7 +93,7 @@ class PatchConfig: IPreference { get() = this.lifecycleEvent.isBasalSetting val isDeactivated: Boolean - get() = hasMacAddress() == false + get() = !hasMacAddress() val isInBasalPausedTime: Boolean get() = this.basalPauseFinishTimestamp > 0 && basalPauseFinishTimestamp > System.currentTimeMillis() @@ -144,7 +144,7 @@ class PatchConfig: IPreference { this.standardBolusInjectCount = 0 this.extendedBolusInjectCount = 0 this.basalInjectCount = 0 - this.LowReservoirAlertAmount = 10 + this.lowReservoirAlertAmount = 10 this.patchExpireAlertTime = 4 this.remainedInsulin = 0f } @@ -152,7 +152,7 @@ class PatchConfig: IPreference { fun patchFirmwareVersionString(): String? { patchFirmwareVersion?.let { var count = 0 - var i: Int = 0 + var i = 0 while (i < it.length) { if (it[i] == '.') { count++ @@ -225,8 +225,6 @@ class PatchConfig: IPreference { this.lastIndex = 0 this.needSetBasalSchedule = false } - else -> { - } } } @@ -293,7 +291,7 @@ class PatchConfig: IPreference { standardBolusInjectCount = other.standardBolusInjectCount extendedBolusInjectCount = other.extendedBolusInjectCount basalInjectCount = other.basalInjectCount - LowReservoirAlertAmount = other.LowReservoirAlertAmount + lowReservoirAlertAmount = other.lowReservoirAlertAmount patchExpireAlertTime = other.patchExpireAlertTime remainedInsulin = other.remainedInsulin @@ -313,7 +311,7 @@ class PatchConfig: IPreference { override fun toString(): String { - return "PatchConfig(securityValue=${securityValue.contentToString()}, macAddress=$macAddress, lifecycleEvent=$lifecycleEvent, bolusNormalStartTimestamp=$bolusNormalStartTimestamp, bolusNormalEndTimestamp=$bolusNormalEndTimestamp, bolusNormalDoseU=$bolusNormalDoseU, bolusExStartTimestamp=$bolusExStartTimestamp, bolusExEndTimestamp=$bolusExEndTimestamp, bolusExDoseU=$bolusExDoseU, injectCount=$injectCount, bgReminderMinute=$bgReminderMinute, lastIndex=$lastIndex, lastDisconnectedTimestamp=$lastDisconnectedTimestamp, standardBolusInjectCount=$standardBolusInjectCount, extendedBolusInjectCount=$extendedBolusInjectCount, basalInjectCount=$basalInjectCount, patchFirmwareVersion=$patchFirmwareVersion, patchSerialNumber='$patchSerialNumber', patchLotNumber=$patchLotNumber, patchModelName=$patchModelName, patchWakeupTimestamp=$patchWakeupTimestamp, activatedTimestamp=$activatedTimestamp, expireDurationMilli=$expireDurationMilli, basalPauseFinishTimestamp=$basalPauseFinishTimestamp, needleInsertionTryCount=$needleInsertionTryCount, LowReservoirAlertAmount=$LowReservoirAlertAmount, patchExpireAlertTime=$patchExpireAlertTime, isEnterPrimaryScreen=$isEnterPrimaryScreen, needSetBasalSchedule=$needSetBasalSchedule, sharedKey=${sharedKey?.contentToString()}, seq15=$seq15, rotateKnobNeedleSensingError=$rotateKnobNeedleSensingError, remainedInsulin=$remainedInsulin)" + return "PatchConfig(securityValue=${securityValue.contentToString()}, macAddress=$macAddress, lifecycleEvent=$lifecycleEvent, bolusNormalStartTimestamp=$bolusNormalStartTimestamp, bolusNormalEndTimestamp=$bolusNormalEndTimestamp, bolusNormalDoseU=$bolusNormalDoseU, bolusExStartTimestamp=$bolusExStartTimestamp, bolusExEndTimestamp=$bolusExEndTimestamp, bolusExDoseU=$bolusExDoseU, injectCount=$injectCount, bgReminderMinute=$bgReminderMinute, lastIndex=$lastIndex, lastDisconnectedTimestamp=$lastDisconnectedTimestamp, standardBolusInjectCount=$standardBolusInjectCount, extendedBolusInjectCount=$extendedBolusInjectCount, basalInjectCount=$basalInjectCount, patchFirmwareVersion=$patchFirmwareVersion, patchSerialNumber='$patchSerialNumber', patchLotNumber=$patchLotNumber, patchModelName=$patchModelName, patchWakeupTimestamp=$patchWakeupTimestamp, activatedTimestamp=$activatedTimestamp, expireDurationMilli=$expireDurationMilli, basalPauseFinishTimestamp=$basalPauseFinishTimestamp, needleInsertionTryCount=$needleInsertionTryCount, LowReservoirAlertAmount=$lowReservoirAlertAmount, patchExpireAlertTime=$patchExpireAlertTime, isEnterPrimaryScreen=$isEnterPrimaryScreen, needSetBasalSchedule=$needSetBasalSchedule, sharedKey=${sharedKey?.contentToString()}, seq15=$seq15, rotateKnobNeedleSensingError=$rotateKnobNeedleSensingError, remainedInsulin=$remainedInsulin)" } override fun equals(other: Any?): Boolean { @@ -347,7 +345,7 @@ class PatchConfig: IPreference { if (expireDurationMilli != other.expireDurationMilli) return false if (basalPauseFinishTimestamp != other.basalPauseFinishTimestamp) return false if (needleInsertionTryCount != other.needleInsertionTryCount) return false - if (LowReservoirAlertAmount != other.LowReservoirAlertAmount) return false + if (lowReservoirAlertAmount != other.lowReservoirAlertAmount) return false if (patchExpireAlertTime != other.patchExpireAlertTime) return false if (isEnterPrimaryScreen != other.isEnterPrimaryScreen) return false if (needSetBasalSchedule != other.needSetBasalSchedule) return false @@ -388,7 +386,7 @@ class PatchConfig: IPreference { result = 31 * result + expireDurationMilli.hashCode() result = 31 * result + basalPauseFinishTimestamp.hashCode() result = 31 * result + needleInsertionTryCount - result = 31 * result + LowReservoirAlertAmount + result = 31 * result + lowReservoirAlertAmount result = 31 * result + patchExpireAlertTime result = 31 * result + isEnterPrimaryScreen.hashCode() result = 31 * result + needSetBasalSchedule.hashCode() diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchLifecycleEvent.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchLifecycleEvent.kt index ad095fcc61..eb0f0be6eb 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchLifecycleEvent.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchLifecycleEvent.kt @@ -1,13 +1,8 @@ package info.nightscout.androidaps.plugins.pump.eopatch.vo -import android.os.Parcel -import android.os.Parcelable import info.nightscout.androidaps.plugins.pump.eopatch.code.PatchLifecycle import com.google.android.gms.common.internal.Preconditions -/** - * 이 객체는 Immutable객체로 사용할 것 - */ class PatchLifecycleEvent { var lifeCycle: PatchLifecycle = PatchLifecycle.SHUTDOWN @@ -64,7 +59,7 @@ class PatchLifecycleEvent { } @JvmStatic - fun createbonded(): PatchLifecycleEvent { + fun createBonded(): PatchLifecycleEvent { return PatchLifecycleEvent(PatchLifecycle.BONDED) } @@ -97,12 +92,5 @@ class PatchLifecycleEvent { fun createActivated(): PatchLifecycleEvent { return PatchLifecycleEvent(PatchLifecycle.ACTIVATED) } - - // @JvmField val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - // override fun createFromParcel(source: Parcel) = TREntityUtils.createFromBundle(source.readBundle(javaClass.classLoader), PatchLifecycleEvent::class.java) - // override fun newArray(size: Int): Array = arrayOfNulls(size) - // } } - - } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchState.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchState.kt index e80dfb4f3d..b1789cdd3c 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchState.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/PatchState.kt @@ -1,8 +1,5 @@ package info.nightscout.androidaps.plugins.pump.eopatch.vo -import android.os.Build -import android.util.Base64 -import com.google.gson.stream.JsonWriter import info.nightscout.androidaps.plugins.pump.eopatch.AppConstant import info.nightscout.androidaps.plugins.pump.eopatch.GsonHelper import info.nightscout.androidaps.plugins.pump.eopatch.core.code.BolusType @@ -11,7 +8,6 @@ import info.nightscout.androidaps.plugins.pump.eopatch.code.SettingKeys import info.nightscout.shared.sharedPreferences.SP import io.reactivex.Observable import io.reactivex.subjects.BehaviorSubject -import java.io.IOException import java.io.Serializable import java.text.SimpleDateFormat import java.util.* @@ -24,7 +20,7 @@ class PatchState: IPreference { @Transient private val subject: BehaviorSubject = BehaviorSubject.create() - val stateBytes: ByteArray + private val stateBytes: ByteArray var updatedTimestamp: Long = 0 constructor(): this(ByteArray(SIZE), 0) { @@ -76,32 +72,15 @@ class PatchState: IPreference { return bitwiseAnd(stateBytes[index], bit) != 0 } - /** - * 참고표 - * 0 = 0x01 - * 1 = 0x02 - * 2 = 0x04 - * 3 = 0x08 - * 4 = 0x10 - * 5 = 0x20 - * 6 = 0x40 - * 7 = 0x80 - */ private fun bitwiseAnd(value: Byte, bit: Int): Int { return value.toInt() and (1 shl bit) } - val isNeedSyncTime: Boolean - get() = getBoolean(D3, 0) val isNeedPriming: Boolean get() = getBoolean(D3, 1) val isNeedNeedleSensing: Boolean get() = getBoolean(D3, 2) - fun useEncryption(): Boolean { - return getBoolean(D3, 3) - } - val isPrimingSuccess: Boolean get() = getBoolean(D3, 6) @@ -122,7 +101,7 @@ class PatchState: IPreference { val isTempBasalAct: Boolean get() = getBoolean(D4, 5) - fun _isExtBolusInjecting(): Boolean { + fun isExtBolusInjecting(): Boolean { return getBoolean(D4, 6) } @@ -155,14 +134,6 @@ class PatchState: IPreference { return ((get(D7) + 145 - 210) * 100.0 / 90).roundToInt() } - fun bootCount(): Int { - return get(D8) - } - - fun aeCount(): Int { - return get(D11) - } - //============================================================================================== // PUMP COUNT //============================================================================================== @@ -210,21 +181,12 @@ class PatchState: IPreference { val isNormalBasalRunning: Boolean get() = isNormalBasalReg && isNormalBasalAct - /* - 템프베이젤 Active(동작) 상태 - - tempBasalReg:1, tempBasalAct:1, tempBasalDone:0 - 템프베이젤 No Active (정지) 상태 - - tempBasalReg:0, tempBasalAct:0, tempBasalDone:0 - - tempBasalReg:1, tempBasalAct:0, tempBasalDone:1 - */ val isTempBasalActive: Boolean get() = isTempBasalReg && isTempBasalAct && !isTempBasalDone /* Bolus */ - private val isRecentPatchState: Boolean - private get() = System.currentTimeMillis() - updatedTimestamp < UPDATE_CONNECTION_INTERVAL_MILLI val isBolusActive: Boolean get() = isNowBolusActive || isExtBolusActive val isNowBolusActive: Boolean @@ -254,24 +216,10 @@ class PatchState: IPreference { } } - val isExtBolusInjectionWaiting: Boolean - get() = isExtBolusActive && !_isExtBolusInjecting() - val isExtBolusInjecting: Boolean - get() = isExtBolusActive && _isExtBolusInjecting() - val isBolusNotActive: Boolean - get() = !isBolusActive - - // 0 이면 reset - val isResetAutoOffTime: Boolean - get() = stateBytes[D3].toInt() and 0x80 == 0 - private fun b(value: Boolean): String { return if (value) ON else " " } - /** - * toString 심플 버전. - */ fun t(): String { return "PatchState{" + convertHumanTimeWithStandard(currentTime()) + "}" } @@ -290,98 +238,32 @@ class PatchState: IPreference { IntStream.of(D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D18) .forEach { i: Int -> sb.append(String.format(" %02X ", stateBytes[i])) } if (isPatchInternalSuspended) { - Arrays.asList(indent, "isPatchInternalSuspended:", ON).forEach(Consumer { str: String? -> sb.append(str) }) + listOf(indent, "isPatchInternalSuspended:", ON).forEach(Consumer { str: String? -> sb.append(str) }) } if (isNeedPriming) { - Arrays.asList(indent, "NeedPriming:", ON).forEach(Consumer { str: String? -> sb.append(str) }) + listOf(indent, "NeedPriming:", ON).forEach(Consumer { str: String? -> sb.append(str) }) } if (isNeedNeedleSensing) { - Arrays.asList(indent, "NeedNeedleSensing:", ON).forEach(Consumer { str: String? -> sb.append(str) }) + listOf(indent, "NeedNeedleSensing:", ON).forEach(Consumer { str: String? -> sb.append(str) }) } if (isNowBolusRegAct || isNowBolusDone) { - Arrays.asList( - indent, "[NowBolus] RegAct:", b(isNowBolusRegAct), " Done:", b(isNowBolusDone)) + listOf(indent, "[NowBolus] RegAct:", b(isNowBolusRegAct), " Done:", b(isNowBolusDone)) .forEach(Consumer { str: String? -> sb.append(str) }) } - if (isExtBolusRegAct || isExtBolusDone || isExtBolusTime || _isExtBolusInjecting()) { - Arrays.asList( - indent, "[ExtBolus] RegAct:", b(isExtBolusRegAct), " Done:", b(isExtBolusDone), " Time:", b(isExtBolusTime), " Injecting:", b(_isExtBolusInjecting())) + if (isExtBolusRegAct || isExtBolusDone || isExtBolusTime || isExtBolusInjecting()) { + listOf(indent, "[ExtBolus] RegAct:", b(isExtBolusRegAct), " Done:", b(isExtBolusDone), " Time:", b(isExtBolusTime), " Injecting:", b(isExtBolusInjecting())) .forEach(Consumer { str: String? -> sb.append(str) }) } if (isTempBasalReg || isTempBasalAct || isTempBasalDone) { - Arrays.asList( - indent, "[TempBasal] Reg:", b(isTempBasalReg), " Act:", b(isTempBasalAct), " Done:", b(isTempBasalDone)) + listOf(indent, "[TempBasal] Reg:", b(isTempBasalReg), " Act:", b(isTempBasalAct), " Done:", b(isTempBasalDone)) .forEach(Consumer { str: String? -> sb.append(str) }) } - Arrays.asList( - indent, "[NormalBasal] Reg:", b(isNormalBasalReg), " Act:", b(isNormalBasalAct), " Paused:", b(isNormalBasalPaused), + listOf(indent, "[NormalBasal] Reg:", b(isNormalBasalReg), " Act:", b(isNormalBasalAct), " Paused:", b(isNormalBasalPaused), indent, "remainedInsulin:", remainedInsulin(), " remainedPumpCycle:", remainedPumpCycle(), "(", remainedInsulin, ")", " battery:", battery()) .forEach(Consumer { obj: Serializable? -> sb.append(obj) }) return sb.toString() } - fun info(): String { - val sb = StringBuilder() - val format = SimpleDateFormat("yyyy/MM/dd HH:mm:ss") - sb.append("\n업데이트 된 시간\n(패치 시간 아니에요)") - sb.append(""" - - ${format.format(updatedTimestamp)} - - """.trimIndent()) - if (isCriticalAlarm || isNewAlertAlarm) { - sb.append(String.format("%nAlarm: %s %s", - if (isCriticalAlarm) "Critical" else "", - if (isNewAlertAlarm) "Alert" else "")) - } - sb.append(""" - - GlobalTime: ${convertHumanTimeWithStandard(currentTime())} - """.trimIndent()) - sb.append("\nNeedPriming: $isNeedPriming") - sb.append("\nNeedNeedleSensing: $isNeedNeedleSensing") - sb.append("\nPrimingSuccess: $isPrimingSuccess") - sb.append("\nBasalReg: $isNormalBasalReg") - sb.append("\nTempBasalReg: $isTempBasalReg") - sb.append("\nBasalAct: $isNormalBasalAct") - sb.append("\nisNowBolusRegAct: $isNowBolusRegAct") - sb.append("\nisNowBolusDone: $isNowBolusDone") - sb.append("\nisExtBolusRegAct: $isExtBolusRegAct") - sb.append("\nisExtBolusDone: $isExtBolusDone") - sb.append("\nisNormalBasalReg: $isNormalBasalReg") - sb.append("\nisNormalBasalAct: $isNormalBasalAct") - sb.append("\nisNormalBasalPaused: $isNormalBasalPaused") - sb.append("\nisTempBasalReg: $isTempBasalReg") - sb.append("\nisTempBasalAct: $isTempBasalAct") - sb.append("\nisTempBasalDone: $isTempBasalDone") - sb.append("\nExBolusTime: $isExtBolusTime") - sb.append("\nPumpAct: $isPumpAct") - sb.append(""" - - remainedInsulin: ${remainedInsulin()} - """.trimIndent()) - sb.append(""" - - remainedPumpCycle:${remainedPumpCycle()}($remainedInsulin) - """.trimIndent()) - sb.append(""" - - boot count :${bootCount()} - """.trimIndent()) - sb.append(""" - - aeCount : ${aeCount()} - """.trimIndent()) - sb.append(""" - - runningTime : ${runningTime()}hr - """.trimIndent()) - sb.append("\nisPumpInternalSuspended : $isPatchInternalSuspended") - sb.append("\nisResetAutoOffTime : $isResetAutoOffTime") - sb.append("\n\n\n") - return sb.toString() - } - fun convertHumanTimeWithStandard(timeSec: Int): String { val calendar = Calendar.getInstance() val dateFormat = SimpleDateFormat("yyyy/MM/dd HH:mm:ss") @@ -389,26 +271,20 @@ class PatchState: IPreference { return dateFormat.format(calendar.time) } - /** - * 다른 PatchState 와 비교해서 같은 값인지 확인. - * API 키[0-1], FUNC[2], 시간[14-17] 은 비교하지 않음. - * @param other 비교할 PatchState - * @return 같으면 true 다르면 false. - */ fun equalState(other: PatchState): Boolean { return IntStream.of(D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D18, D19) .allMatch { i: Int -> other.stateBytes[i] == stateBytes[i] } } - override fun equals(o: Any?): Boolean { - if (this === o) { + override fun equals(other: Any?): Boolean { + if (this === other) { return true } - if (o == null || javaClass != o.javaClass) { + if (other == null || javaClass != other.javaClass) { return false } - val that = o as PatchState - return Arrays.equals(stateBytes, that.stateBytes) + val that = other as PatchState + return stateBytes.contentEquals(that.stateBytes) } override fun observe(): Observable { @@ -422,28 +298,10 @@ class PatchState: IPreference { } override fun hashCode(): Int { - return Arrays.hashCode(stateBytes) - } - - @Throws(IOException::class) fun writeJson(out: JsonWriter) { - out.beginObject() - out.name(NAME) - out.beginObject() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - out.name("stateBytes").value(java.util.Base64.getEncoder().encodeToString(stateBytes)) - } else { - out.name("stateBytes").value(Arrays.toString(Base64.encode(stateBytes, - Base64.DEFAULT))) - } - out.name("updateTimestamp").value(updatedTimestamp) - out.endObject() - out.endObject() + return stateBytes.contentHashCode() } companion object { - - val UPDATE_CONNECTION_INTERVAL_MILLI = TimeUnit.SECONDS.toMillis(10) - const val NAME = "PATCH_STATE" const val SIZE = 20 @JvmStatic fun create(bytes: ByteArray?, updatedTimestamp: Long): PatchState { var stateBytes = bytes @@ -462,22 +320,22 @@ class PatchState: IPreference { return bs[startPos + 0].toInt() and 0xFF shl 24 or (bs[startPos + 1].toInt() and 0xFF shl 16) or (bs[startPos + 2].toInt() and 0xFF shl 8) or (bs[startPos + 3].toInt() and 0xFF) } - private const val D0 = 0 // DUMMY - private const val D1 = 1 // DUMMY - private const val D2 = 2 // FUNCTION CODE 0x22 - private const val D3 = 3 // SETUP - private const val D4 = D3 + 1 // BOLUS - private const val D5 = D3 + 2 // ALERT - private const val D6 = D3 + 3 // INSULIN - private const val D7 = D3 + 4 // BATTERY - private const val D8 = D3 + 5 // BOOT - private const val D9 = D3 + 6 // APS - private const val D10 = D3 + 7 // APS - private const val D11 = D3 + 8 // New Alarm Count - private const val D12 = D3 + 9 // Remain Pump Count - private const val D13 = D3 + 10 // Remain Pump Count - private const val D14 = D3 + 11 // Current Time - private const val D18 = D3 + 15 // Remained Insulin - private const val D19 = D3 + 16 // Running Time + private const val D0 = 0 + private const val D1 = 1 + private const val D2 = 2 + private const val D3 = 3 + private const val D4 = D3 + 1 + private const val D5 = D3 + 2 + private const val D6 = D3 + 3 + private const val D7 = D3 + 4 + private const val D8 = D3 + 5 + private const val D9 = D3 + 6 + private const val D10 = D3 + 7 + private const val D11 = D3 + 8 + private const val D12 = D3 + 9 + private const val D13 = D3 + 10 + private const val D14 = D3 + 11 + private const val D18 = D3 + 15 + private const val D19 = D3 + 16 } } \ No newline at end of file diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/Segment.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/Segment.kt index 0db5e513d3..804f3266f1 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/Segment.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/Segment.kt @@ -16,33 +16,3 @@ internal class JoinedSegment(var index: Int) { endMinute = startMinute + SegmentEntity.TIME_BASE } } - -internal class JoinedSegments { - var activeBasal: String - var mList: Array - - init { - activeBasal = "" - mList = Array(DEF_COUNT, { i -> JoinedSegment(i)}) - } - - - fun apply(segments: SegmentsEntity>) { - var i = 0 - var no = 0 - - for (item in segments.list) { - while (i < DEF_COUNT && item.includes(mList[i])) { // i> { - var startMinute = 0L var endMinute = 0L @@ -16,9 +15,7 @@ abstract class SegmentEntity> { fun getDuration(): Long { return endMinute - startMinute } - /** - * Empty Segment 여부 돌려주기 - */ + internal abstract val isEmpty: Boolean internal fun isMinuteIncluding(minute: Long): Boolean { @@ -33,42 +30,23 @@ abstract class SegmentEntity> { return startMinute == target.startMinute || target.endMinute == endMinute } - /** - * 타겟을 완전히 포함? - */ internal fun canCover(target: SegmentEntity<*>): Boolean { return startMinute <= target.startMinute && target.endMinute <= endMinute } - /** - * 타겟에 완전히 덮임. - */ internal fun isCoveredBy(target: SegmentEntity<*>): Boolean { return target.canCover(this) } - /** - * 타겟과 걸침? 주의 canCover 또는 isCoveredBy 이 true 이면 이것도 true 임. - * 즉 canCover 와 isCoveredBy 가 미리 확인된 이후에 호출 할 것. - */ internal fun isOverlapped(target: SegmentEntity<*>): Boolean { return startMinute < target.endMinute && target.startMinute < endMinute } - /** - * 타겟을 완전히 포함하고 있지 않고 걸침. - */ internal fun isPartiallyNotFullyIncluding(target: SegmentEntity<*>): Boolean { return isOverlapped(target) && !canCover(target) && !isCoveredBy(target) } - /** - * target segment 를 뺸다. target 은 한방향으로만 걸쳐야 함. - * 즉 isPartiallyNotFullyIncluding(target) 이 false 여야 한다. - * 양 끝단 중 한 쪽이 같은 경우가 발생하는데 그 경우는 splitBy 에서 한쪽만 생성되므로 OK! - */ internal fun subtract(target: SegmentEntity<*>, validCheck: Boolean) { - if (validCheck) { if (!isPartiallyNotFullyIncluding(target)) { return @@ -82,11 +60,7 @@ abstract class SegmentEntity> { } } - /** - * target segment 에 의해서 쪼개져서 생성되는 segment list 를 돌려준다. - */ internal fun splitBy(target: T, validCheck: Boolean): List? { - if (validCheck) { if (!canCover(target)) { return null @@ -102,39 +76,19 @@ abstract class SegmentEntity> { if (target.endMinute < endMinute) { result.add(duplicate(target.endMinute, endMinute)) } - return result } - /** - * JoinedSegment 를 포함하는가? - */ internal fun includes(segment: JoinedSegment): Boolean { return startMinute <= segment.startMinute && segment.endMinute <= endMinute } - /** - * 같은 값을 가지는 주어진 시간으로 새로운 세그먼트 생성. - */ internal abstract fun duplicate(startMinute: Long, endMinute: Long): T - - /** - * copy constructor - */ internal abstract fun deep(): T - - /** - * 값이 같은가? - */ internal abstract fun equalValue(segment: T): Boolean - - /** - * 이 세그먼트의 값을 JoinedSegment 에 적용한다. - */ internal abstract fun apply(segment: JoinedSegment) companion object { - - internal val TIME_BASE = 30 + const val TIME_BASE = 30 } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/SegmentsEntity.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/SegmentsEntity.kt index 26ff1b5393..64775d316f 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/SegmentsEntity.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/SegmentsEntity.kt @@ -5,21 +5,14 @@ import java.util.* import java.util.function.BiFunction abstract class SegmentsEntity> { - - var list: ArrayList + var list: ArrayList = ArrayList() val segmentCount: Int get() = list.size - /** - * shallow copied list - */ val copiedSegmentList: ArrayList get() = ArrayList(list) - /** - * deep copied list - */ val deepCopiedSegmentList: ArrayList get() { val copied = ArrayList() @@ -42,10 +35,6 @@ abstract class SegmentsEntity> { return (segmentIndex * 30).toLong() } - init { - list = ArrayList() - } - fun hasSegments(): Boolean { return list.isNotEmpty() } @@ -70,59 +59,15 @@ abstract class SegmentsEntity> { } } - // 중복은 체크할 필요 없음, 세그먼트 추가할 때 중복체크함 -// var lastIndex = -1 for (seg in list) { if (seg.isEmpty) { return false } - -// val startIndex = seg.startIndex -// val endIndex = seg.endIndex -//// lastIndex += 1 -// if (lastIndex != startIndex) { -// return false -// } -// lastIndex = endIndex } return true } - private fun isTimeOverlapped(target: T): Boolean { - for (seg in list) { - if (seg.isOverlapped(target)) { - return true - } - } - return false - } - - // private fun millsToLocalDateTime(millis: Long): LocalDateTime { - // val instant = Instant.ofEpochMilli(millis) - // return instant.atZone(ZoneId.systemDefault()).toLocalDateTime() - // } - - // fun getCurrentSegmentRemainMinute(timeStamp: Long): Long { - // val localDateTime = millsToLocalDateTime(timeStamp) - // val minute = localDateTime.minute - // - // getSegment(minute.toLong())?.let { - // val hourMinutes = TimeUnit.HOURS.toMinutes(localDateTime.hour.toLong()) - // val totalMinutes = hourMinutes + minute - // val remain = it.endMinute - totalMinutes - // - // return it.endMinute - totalMinutes - // } - // - // return 0 - // } - - // fun getSegmentByTimeStamp(timeStamp: Long): T? { - // val minute = millsToLocalDateTime(timeStamp).minute.toLong() - // return getSegment(minute) - // } - - fun getSegment(minute: Long): T? { + private fun getSegment(minute: Long): T? { for (seg in list) { if (seg.isMinuteIncluding(minute)) { return seg @@ -136,127 +81,9 @@ abstract class SegmentsEntity> { return getSegment(timeMinute) } - fun addSegment(seg: T) { - if (isTimeOverlapped(seg)) { - throw Exception() - } - list.add(seg) - Collections.sort(list) { t1, t2 -> java.lang.Long.compare(t1.startMinute, t2.startMinute) } - } - - - /** - * 세그먼트가 한개인 경우 삭제 불가, 첫 번째 세그먼트는 삭제 불가이므로 - * 항상 mSegmentList.size() >= 2이고 idx는 0이 될 수 없음 - * @param segment - */ - fun removeSegment(segment: T): Int { - return _remove(segment, list) - } - - /** - * 기존 세그먼트 리스트에 덮으면서 추가함. 호환성을 위한 wrapper 함수. - * @param segment - */ - - fun addSegmentWithTimeOverlapped(segment: T) { - _union(segment, list) - } - - fun addSegmentWithTimeOverlapped(segment: T, oldSegment: T?) { - if(oldSegment != null) { // 편집인 경우는 기존 세그먼트 제거 - list.remove(oldSegment) - } - _union(segment, list) - } - - /** - * 삭제 - * @param target - */ - @Synchronized - private fun _remove(target: T, list: ArrayList): Int { - val idx = list.indexOf(target) - - // idx는 최소 1 - if (idx > 0) { -// list[idx - 1].endMinute = target.endMinute - list.remove(target) - _arrange(list) - return idx - } else { - return -1 - } - } - - /** - * 기존 세그먼트 리스트에 덮으면서 추가함. - * @param target - */ - @Synchronized - private fun _union(target: T, list: ArrayList) { - - val toBeAdded = ArrayList() - - val iterator = list.iterator() - - while (iterator.hasNext()) { - val item = iterator.next() - - if (target.canCover(item)) { - iterator.remove() - } else if (target.isCoveredBy(item)) { - toBeAdded.addAll(item.splitBy(target, false)!!) - iterator.remove() - } else if (target.isOverlapped(item)) { - item.subtract(target, false) - } - } - - list.addAll(toBeAdded) - list.add(target) - - _arrange(list) - } - - /** - * 동일 세그먼트 합치기 - */ - - @Synchronized - private fun _arrange(list: ArrayList) { - val size = list.size - - if (size < 2) { - return - } - - val resultList = ArrayList() - - Collections.sort(list) { t1, t2 -> java.lang.Long.compare(t1.startMinute, t2.startMinute) } - - // ADM df_385. 연속된 세그먼트에 동일한 값 설정 가능하도록 합치는 작업 하지 않음 - EOMAPP은 합친다 - var left = list[0] - - for (i in 1 until size) { - val right = list[i] - if((left.endMinute == right.startMinute) && left.equalValue(right)) { - left.endMinute = right.endMinute - }else { - resultList.add(left) - left = right - } - } - - resultList.add(left) - - list.clear() - list.addAll(resultList) - } - fun isFullSegment(): Boolean { var start = 0L - var end = 1440L + val end = 1440L for(seg in list){ if(seg.startMinute == start){ start = seg.endMinute @@ -287,20 +114,4 @@ abstract class SegmentsEntity> { return Pair(list[list.size-1].endIndex, 48) } - - fun isChangeSegmentByNewSegment(newSegment: T, oldSegment: T?): Boolean { - list.forEach loop@{ - if(it == oldSegment) { - return@loop - } - if(newSegment.canCover(it)) { - return true - }else if(newSegment.isCoveredBy(it)) { - return true - }else if(newSegment.isOverlapped(it)) { - return true - } - } - return false - } } diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasal.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasal.kt index ed1ce2add4..d1b2ab3b50 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasal.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasal.kt @@ -11,22 +11,14 @@ class TempBasal { var durationMinutes: Long = 0L var doseUnitPerHour: Float = -1f var percent: Int = 0 - var unitDefinition: UnitOrPercent? = null // percenr or U - set(_unitDefinition: UnitOrPercent?) { - field = _unitDefinition - } + var unitDefinition: UnitOrPercent? = null - - var running =false - - // val isGreaterThanMaxBasal: Boolean - // get() = isGreaterThan(25f) //todo + var running =false val percentUs: FloatArray get() { - val doseUs: FloatArray - doseUs = FloatArray((this.durationMinutes / 30).toInt()) + val doseUs = FloatArray((this.durationMinutes / 30).toInt()) for (i in doseUs.indices) { doseUs[i] = this.percent.toFloat() } @@ -34,23 +26,9 @@ class TempBasal { return doseUs } - val doseUnitPerHourArray: FloatArray - get() { - val doseUs: FloatArray - - doseUs = FloatArray((this.durationMinutes / 30).toInt()) - - val value = FloatAdjusters.ROUND2_INSULIN.apply(doseUnitPerHour) - for (i in doseUs.indices) { - doseUs[i] = value - } - return doseUs - } - val endTimestamp: Long get() = if (this.startTimestamp == 0L) 0 else this.startTimestamp + TimeUnit.MINUTES.toMillis(this.durationMinutes) - val doseUnitText: String get() = String.format("%s U/hr", FloatFormatters.insulin(doseUnitPerHour)) @@ -83,15 +61,10 @@ class TempBasal { if (this.unitDefinition == UnitOrPercent.U) { maxTempBasal = this.doseUnitPerHour } else if (this.unitDefinition == UnitOrPercent.P) { - val normalBasal = normalBasalManager.normalBasal - if (normalBasal != null) { - val maxNormalBasal = normalBasal.getMaxBasal(durationMinutes) - maxTempBasal = FloatAdjusters.ROUND2_TEMP_BASAL_PROGRAM_RATE.apply(maxNormalBasal + getDoseUnitPerHourWithPercent(maxNormalBasal)) - } + val maxNormalBasal = normalBasalManager.normalBasal.getMaxBasal(durationMinutes) + maxTempBasal = FloatAdjusters.ROUND2_TEMP_BASAL_PROGRAM_RATE.apply(maxNormalBasal + getDoseUnitPerHourWithPercent(maxNormalBasal)) } - return if (maxTempBasal > maxBasal) { - true - } else false + return maxTempBasal > maxBasal } override fun toString(): String { diff --git a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasalManager.kt b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasalManager.kt index 4ebafb2204..0de79a36f5 100644 --- a/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasalManager.kt +++ b/eopatch/src/main/java/info/nightscout/androidaps/plugins/pump/eopatch/vo/TempBasalManager.kt @@ -21,11 +21,6 @@ class TempBasalManager : IPreference{ var unit = UnitOrPercent.P - init { - - } - - fun clear(){ startedBasal = null startTimestamp = 0L @@ -37,38 +32,14 @@ class TempBasalManager : IPreference{ this.startedBasal = CommonUtils.clone(tempBasal) this.startedBasal?.running = true + this.startTimestamp = System.currentTimeMillis() } - - /** - * 특정 베이젤의 인덱스 찾기 - * - * @param basal - * @return - */ - - fun updateBasalStopped() { - // 모두 정지 this.startedBasal?.running = false this.startedBasal?.startTimestamp = 0 - // subject.onNext(this) } - fun updateForDeactivation() { - // deactivation할때는 모두 정지 - updateBasalStopped() - // subject.onNext(this) - } - - - - fun updateDeactivation() { - updateBasalStopped() - } - - - fun update(other: TempBasalManager){ this.startedBasal = other.startedBasal startTimestamp = other.startTimestamp @@ -89,13 +60,4 @@ class TempBasalManager : IPreference{ override fun toString(): String { return "TempBasalManager(startedBasal=$startedBasal, startTimestamp=$startTimestamp, endTimestamp=$endTimestamp, unit=$unit)" } - - companion object { - - const val NAME = "TEMP_BASAL_MANAGER" - - val MAX_BASAL_SEQ = 20 - val MANUAL_BASAL_SEQ = MAX_BASAL_SEQ + 1 - } - } diff --git a/eopatch/src/main/res/layout/activity_eopatch.xml b/eopatch/src/main/res/layout/activity_eopatch.xml index f01206f3ff..178ff6982d 100644 --- a/eopatch/src/main/res/layout/activity_eopatch.xml +++ b/eopatch/src/main/res/layout/activity_eopatch.xml @@ -4,19 +4,16 @@ xmlns:tools="http://schemas.android.com/tools"> - - - @@ -25,24 +22,12 @@ android:layout_width="match_parent" android:layout_height="60dp"> - - - - @@ -42,7 +40,7 @@ android:layout_marginEnd="5dp" android:gravity="center" android:text="@{viewModel.programEnabledMessage}" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_basal_schedule" @@ -60,7 +58,7 @@ android:paddingStart="20dp" android:paddingEnd="20dp" android:text="@string/patch_basal_schedule_desc_2" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_basal_schedule_desc_1" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_connect_new.xml b/eopatch/src/main/res/layout/fragment_eopatch_connect_new.xml index ea291edec1..fffbe9079f 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_connect_new.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_connect_new.xml @@ -4,13 +4,10 @@ xmlns:tools="http://schemas.android.com/tools"> - - - @@ -40,7 +35,7 @@ android:layout_marginTop="7dp" android:gravity="center" android:text="@string/patch_connect_new_step" - android:textSize="12dp" + android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_connect_new" /> @@ -51,7 +46,7 @@ android:layout_height="wrap_content" android:layout_marginTop="42dp" android:text="@string/patch_connect_new_desc" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_connect_new_progress" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_overview.xml b/eopatch/src/main/res/layout/fragment_eopatch_overview.xml index 265f9ab564..c05e793ac2 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_overview.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_overview.xml @@ -99,7 +99,6 @@ android:layout_marginBottom="5dp" android:background="@color/list_delimiter" /> - - - - diff --git a/eopatch/src/main/res/layout/fragment_eopatch_remove.xml b/eopatch/src/main/res/layout/fragment_eopatch_remove.xml index 30b96ff449..f1df4bb411 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_remove.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_remove.xml @@ -5,7 +5,6 @@ - @@ -34,7 +33,7 @@ android:layout_marginTop="5dp" android:layout_marginStart="9dp" android:text="@string/patch_discard_complete_desc" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintLeft_toRightOf="@+id/image_patch_remove" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_remove_needle_cap.xml b/eopatch/src/main/res/layout/fragment_eopatch_remove_needle_cap.xml index 50de6f164e..006b034906 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_remove_needle_cap.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_remove_needle_cap.xml @@ -5,7 +5,6 @@ - @@ -29,10 +28,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:text="@string/patch_remove_needle_cap" - - android:textSize="24dp" + android:textSize="24sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -44,8 +41,7 @@ android:layout_marginTop="7dp" android:gravity="center" android:text="@string/patch_remove_needle_cap_step" - - android:textSize="12dp" + android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_remove_needle_cap" /> @@ -55,28 +51,12 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="42dp" - android:text="@string/patch_remove_needle_cap_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_remove_needle_cap_progress" /> - - @@ -114,7 +94,7 @@ android:layout_marginStart="7dp" android:layout_marginTop="5dp" android:text="@string/patch_remove_needle_cap_desc_3" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toEndOf="@+id/image_patch_remove_needle_cap" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_remove_needle_cap_desc_2" /> @@ -170,7 +150,6 @@ app:layout_constraintStart_toEndOf="@id/guideline_button" app:layout_constraintTop_toTopOf="parent" app:onSafeClick="@{() -> viewModel.moveStep(PatchStep.REMOVE_PROTECTION_TAPE)}" /> - diff --git a/eopatch/src/main/res/layout/fragment_eopatch_remove_protection_tape.xml b/eopatch/src/main/res/layout/fragment_eopatch_remove_protection_tape.xml index fb985e0d70..f12ba9996f 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_remove_protection_tape.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_remove_protection_tape.xml @@ -5,7 +5,6 @@ - @@ -23,10 +22,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:text="@string/patch_remove_protection_tape" - - android:textSize="24dp" + android:textSize="24sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -38,8 +35,7 @@ android:layout_marginTop="7dp" android:gravity="center" android:text="@string/patch_remove_protection_tape_step" - - android:textSize="12dp" + android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_remove_protection_tape" /> @@ -49,10 +45,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="42dp" - android:text="@string/patch_remove_protection_tape_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_remove_protection_tape_progress" /> @@ -72,10 +66,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/patch_remove_protection_tape_desc_2" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/img_patch_act_03" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_rotate_knob.xml b/eopatch/src/main/res/layout/fragment_eopatch_rotate_knob.xml index f21d685ee6..5da32f5bcc 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_rotate_knob.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_rotate_knob.xml @@ -5,7 +5,6 @@ - @@ -29,10 +28,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:text="@string/patch_rotate_knob" - - android:textSize="24dp" + android:textSize="24sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -44,8 +41,7 @@ android:layout_marginTop="7dp" android:gravity="center" android:text="@string/patch_rotate_knob_step" - - android:textSize="12dp" + android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_rotate_knob" /> @@ -84,7 +80,7 @@ android:layout_height="wrap_content" android:layout_marginStart="9dp" android:text="@string/needle_insertion_error_1" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintLeft_toRightOf="@+id/image_point_read01" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -105,7 +101,7 @@ android:layout_marginTop="5dp" android:layout_marginStart="9dp" android:text="@string/needle_insertion_error_2" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintLeft_toRightOf="@+id/image_point_read02" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_needle_insertion_error_1" /> @@ -127,7 +123,7 @@ android:layout_marginStart="9dp" android:paddingBottom="12dp" android:text="@string/needle_insertion_error_3" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintLeft_toRightOf="@+id/image_point_read02" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_needle_insertion_error_2" /> @@ -138,29 +134,14 @@ android:id="@+id/text_patch_rotate_knob_desc" android:layout_width="0dp" android:layout_height="wrap_content" - android:text="@string/patch_rotate_knob_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/layout_needle_insertion_error" /> - - @@ -33,7 +32,7 @@ android:layout_marginStart="9dp" android:layout_marginTop="5dp" android:text="@string/patch_safe_deactivation_desc" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toEndOf="@+id/image_patch_safe_deactivation" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -51,7 +50,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/patch_remaining_insulin" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/text_patch_safe_deactivation_remaining_usage_period" app:layout_constraintStart_toStartOf="parent" /> @@ -61,8 +60,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="26dp" android:text="@string/patch_remaining_usage_period" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/text_patch_safe_deactivation_next" app:layout_constraintStart_toStartOf="parent" /> @@ -70,7 +68,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{Integer.toString(viewModel.patchRemainedInsulin > 50 ? 50 : (viewModel.patchRemainedInsulin < 1 ? 1 : viewModel.patchRemainedInsulin))}" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/layout_patch_safe_deactivation_remaining_usage_period_value" app:layout_constraintEnd_toStartOf="@+id/text_patch_dose_unit" tools:text="50" /> @@ -80,7 +78,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/all_dose_unit" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintBottom_toTopOf="@+id/layout_patch_safe_deactivation_remaining_usage_period_value" app:layout_constraintEnd_toStartOf="@+id/text_patch_dose_plus" /> @@ -89,7 +87,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{viewModel.patchRemainedInsulin > 1 ? @string/symbol_plus : @string/symbol_minus}" - android:textSize="16dp" + android:textSize="16sp" app:visibleOrGone="@{(viewModel.patchRemainedInsulin <= 0 || viewModel.patchRemainedInsulin >= 51)}" app:layout_constraintBottom_toTopOf="@+id/layout_patch_safe_deactivation_remaining_usage_period_value" app:layout_constraintEnd_toEndOf="parent" @@ -109,7 +107,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{viewModel.patchRemainedDays.toString()}" - android:textSize="16dp" + android:textSize="16sp" app:visibleOrGone="@{viewModel.patchRemainedDays > 0}" tools:text="N"/> @@ -118,7 +116,7 @@ android:layout_height="wrap_content" android:text="@{viewModel.patchRemainedDays > 1 ? @string/symbol_days : @string/symbol_day}" app:visibleOrGone="@{viewModel.patchRemainedDays > 0}" - android:textSize="16dp" + android:textSize="16sp" tools:text="@string/symbol_days" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_safety_check.xml b/eopatch/src/main/res/layout/fragment_eopatch_safety_check.xml index 36bb6af01d..3655262ccd 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_safety_check.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_safety_check.xml @@ -5,7 +5,6 @@ - @@ -23,10 +22,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:text="@string/patch_safety_check" - - android:textSize="24dp" + android:textSize="24sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -38,8 +35,7 @@ android:layout_marginTop="7dp" android:gravity="center" android:text="@string/patch_safety_check_step" - - android:textSize="12dp" + android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_safety_check" /> @@ -49,10 +45,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="42dp" - android:text="@string/patch_safety_check_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_safety_check_progress" /> @@ -84,7 +78,7 @@ android:layout_marginStart="9dp" android:layout_marginTop="27dp" android:text="@string/patch_safety_check_desc_2" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@+id/image_patch_safety_check_desc_2" app:layout_constraintTop_toBottomOf="@+id/progressbar_patch_safety_check" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_turning_off_alarm.xml b/eopatch/src/main/res/layout/fragment_eopatch_turning_off_alarm.xml index 52f20f755e..de56050263 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_turning_off_alarm.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_turning_off_alarm.xml @@ -5,7 +5,6 @@ - @@ -23,10 +22,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/patch_manually_turning_off_alarm_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -35,10 +32,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/patch_manually_turning_off_alarm_desc_2" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_patch_manually_turning_off_alarm_desc_1" /> @@ -47,10 +42,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/patch_manually_turning_off_alarm_step_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_patch_manually_turning_off_alarm_desc_2" /> @@ -59,10 +52,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:text="@string/patch_manually_turning_off_alarm_step_2" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_patch_manually_turning_off_alarm_step_1" /> diff --git a/eopatch/src/main/res/layout/fragment_eopatch_wake_up.xml b/eopatch/src/main/res/layout/fragment_eopatch_wake_up.xml index d80bdfe5ef..e659bb02b7 100644 --- a/eopatch/src/main/res/layout/fragment_eopatch_wake_up.xml +++ b/eopatch/src/main/res/layout/fragment_eopatch_wake_up.xml @@ -29,10 +29,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:text="@string/patch_wake_up" - - android:textSize="24dp" + android:textSize="24sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -45,7 +43,7 @@ android:gravity="center" android:text="@string/patch_wake_up_step" - android:textSize="12dp" + android:textSize="12sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_wake_up" /> @@ -54,10 +52,8 @@ android:id="@+id/text_patch_wake_up_desc_num_1" android:layout_width="25dp" android:layout_height="wrap_content" - android:text="@string/patch_step_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/text_patch_wake_up_desc_1" /> @@ -66,10 +62,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="43dp" - android:text="@string/patch_wake_up_desc_1" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toEndOf="@+id/text_patch_wake_up_desc_num_1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_wake_up_progress" /> @@ -78,10 +72,8 @@ android:id="@+id/text_patch_wake_up_desc_num_2" android:layout_width="25dp" android:layout_height="wrap_content" - android:text="@string/patch_step_desc_2" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/text_patch_wake_up_desc_2" /> @@ -90,10 +82,8 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="5dp" - android:text="@string/patch_wake_up_desc_2" - - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toEndOf="@+id/text_patch_wake_up_desc_num_2" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_wake_up_desc_1" /> @@ -114,27 +104,11 @@ android:layout_marginStart="9dp" android:layout_marginTop="12dp" android:text="@string/string_caution_not_remove_needle_cap" - android:textSize="16dp" + android:textSize="16sp" app:layout_constraintStart_toEndOf="@+id/image_point_red" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_patch_wake_up_desc_2" /> - - 패치 적용 알림 패치 적용이 완료되지 않았습니다.\n패치 적용을 시작합니다. 패치 통신 점검 - 패치 통신 점검 중입니다... + 패치 통신 점검 중입니다… 스마트 기기를 패치에 가까이 가져가세요. 다른 장소로 이동 후 재시도하세요. 패치 통신 오류 @@ -133,5 +133,7 @@ 완료 %1$s시간 %2$s분 남음 다음 - + 패치 통신 점검 후 다시 시도하세요. + 주입 정지가 실패하였습니다. + 주입 재개가 실패하였습니다. diff --git a/eopatch/src/main/res/values/arrays.xml b/eopatch/src/main/res/values/arrays.xml index e763eb285d..cdc341d68d 100644 --- a/eopatch/src/main/res/values/arrays.xml +++ b/eopatch/src/main/res/values/arrays.xml @@ -1,6 +1,6 @@ - + 10 U 15 U 20 U @@ -12,7 +12,7 @@ 50 U - + 10 15 20 diff --git a/eopatch/src/main/res/values/strings.xml b/eopatch/src/main/res/values/strings.xml index 5ad11bbd42..3cc1e8810e 100644 --- a/eopatch/src/main/res/values/strings.xml +++ b/eopatch/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - eopatch_low_reservior_reminders + eopatch_low_reservoir_reminders eopatch_expiration_reminders eopatch_patch_buzzer_reminders eopatch_patch_config @@ -144,5 +144,7 @@ Finish remaining time: %1$s:%2$s Next - + Retry after Patch communication check. + Suspension failed. + Resume failed. \ No newline at end of file diff --git a/eopatch/src/main/res/xml/pref_eopatch.xml b/eopatch/src/main/res/xml/pref_eopatch.xml index 4e9e6f545b..609c5f179b 100644 --- a/eopatch/src/main/res/xml/pref_eopatch.xml +++ b/eopatch/src/main/res/xml/pref_eopatch.xml @@ -4,9 +4,9 @@