diff --git a/app/build.gradle b/app/build.gradle index 291f5bd615..04e6925025 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -129,7 +129,7 @@ android { targetSdkVersion 28 multiDexEnabled true versionCode 1500 - version "2.7-omnipod-0.4-SNAPSHOT" + version "2.7-omnipod-0.4-dagger-SNAPSHOT" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "REMOTE", '"' + generateGitRemote() + '"' @@ -139,8 +139,8 @@ android { // OMNIPOD: Keep track of what commit from the main repository we're on, these fields aren't actually used anywhere buildConfigField "String", "DEV_VERSION", '"2.6.5-dev"' - buildConfigField "String", "DEV_VERSION_COMMIT", '"1481755bc8e63a741f05507579846340dbd49cd6"' - buildConfigField "String", "DEV_VERSION_COMMIT_DATE", '"21.4.2020"' // 21st April + buildConfigField "String", "DEV_VERSION_COMMIT", '"b87155ead499167b3d42a73e3daf808494f10a2d"' + buildConfigField "String", "DEV_VERSION_COMMIT_DATE", '"24.4.2020"' // 24th April ndk { moduleName "BleCommandUtil" @@ -320,11 +320,6 @@ dependencies { } testImplementation "org.skyscreamer:jsonassert:1.5.0" testImplementation "org.hamcrest:hamcrest-all:1.3" -/* - testImplementation("uk.org.lidalia:slf4j-test:1.2.0") { - exclude group: "com.google.guava", module: "guava" - } -*/ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" diff --git a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt index a7c8e7b1fe..d9112ddc09 100644 --- a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt @@ -28,6 +28,7 @@ import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin import info.nightscout.androidaps.plugins.general.careportal.CareportalPlugin import info.nightscout.androidaps.plugins.general.maintenance.MaintenancePlugin import info.nightscout.androidaps.plugins.general.nsclient.NSClientPlugin +import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin import info.nightscout.androidaps.plugins.general.tidepool.TidepoolPlugin import info.nightscout.androidaps.plugins.general.wear.WearPlugin @@ -50,8 +51,8 @@ import info.nightscout.androidaps.plugins.source.EversensePlugin import info.nightscout.androidaps.plugins.source.GlimpPlugin import info.nightscout.androidaps.plugins.source.PoctechPlugin import info.nightscout.androidaps.plugins.source.TomatoPlugin -import info.nightscout.androidaps.utils.alertDialogs.OKDialog.show import info.nightscout.androidaps.utils.SafeParse +import info.nightscout.androidaps.utils.alertDialogs.OKDialog.show import info.nightscout.androidaps.utils.protection.PasswordCheck import info.nightscout.androidaps.utils.protection.ProtectionCheck import info.nightscout.androidaps.utils.resources.ResourceHelper @@ -99,6 +100,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang @Inject lateinit var maintenancePlugin: MaintenancePlugin @Inject lateinit var passwordCheck: PasswordCheck + @Inject lateinit var nsSettingStatus: NSSettingsStatus @Inject lateinit var androidInjector: DispatchingAndroidInjector @@ -342,8 +344,13 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang passwordCheck.setPassword(context, R.string.application_password, R.string.key_application_password) return true } + // NSClient copy settings + if (preference.key == resourceHelper.gs(R.string.key_statuslights_copy_ns)) { + nsSettingStatus.copyStatusLightsNsSettings(context) + return true + } } } return super.onPreferenceTreeClick(preference) } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index bb412703f4..db05730aea 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -8,7 +8,6 @@ import com.j256.ormlite.table.DatabaseTable; import org.apache.commons.lang3.StringUtils; import org.json.JSONException; import org.json.JSONObject; -import org.slf4j.Logger; import java.util.ArrayList; import java.util.Collections; @@ -18,25 +17,31 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import javax.inject.Inject; + +import dagger.android.HasAndroidInjector; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.interfaces.Interval; +import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.L; -import info.nightscout.androidaps.logging.StacktraceLoggerWrapper; -import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction; import info.nightscout.androidaps.plugins.general.nsclient.data.NSMbg; -import info.nightscout.androidaps.plugins.general.overview.OverviewFragment; import info.nightscout.androidaps.plugins.general.overview.graphExtensions.DataPointWithLabelInterface; import info.nightscout.androidaps.plugins.general.overview.graphExtensions.PointsWithLabelGraphSeries; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.T; import info.nightscout.androidaps.utils.Translator; +import info.nightscout.androidaps.utils.resources.ResourceHelper; @DatabaseTable(tableName = DatabaseHelper.DATABASE_CAREPORTALEVENTS) public class CareportalEvent implements DataPointWithLabelInterface, Interval { - private static Logger log = StacktraceLoggerWrapper.getLogger(L.DATABASE); + + @Inject ProfileFunction profileFunction; + @Inject ResourceHelper resourceHelper; + @Inject AAPSLogger aapsLogger; @DatabaseField(id = true) public long date; @@ -76,7 +81,13 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { public static final String MBG = "Mbg"; // comming from entries + @Deprecated public CareportalEvent() { + MainApp.instance().androidInjector().inject(this); + } + + public CareportalEvent(HasAndroidInjector injector) { + injector.androidInjector().inject(this); } public CareportalEvent(NSMbg mbg) { @@ -89,19 +100,19 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { return System.currentTimeMillis() - date; } - public double getHoursFromStart() { + private double getHoursFromStart() { return (System.currentTimeMillis() - date) / (60 * 60 * 1000.0); } - public String age(boolean useShortText) { + public String age(boolean useShortText, ResourceHelper resourceHelper) { Map diff = computeDiff(date, System.currentTimeMillis()); - String days = " " + MainApp.gs(R.string.days) + " "; - String hours = " " + MainApp.gs(R.string.hours) + " "; + String days = " " + resourceHelper.gs(R.string.days) + " "; + String hours = " " + resourceHelper.gs(R.string.hours) + " "; if (useShortText) { - days = MainApp.gs(R.string.shortday); - hours = MainApp.gs(R.string.shorthour); + days = resourceHelper.gs(R.string.shortday); + hours = resourceHelper.gs(R.string.shorthour); } return diff.get(TimeUnit.DAYS) + days + diff.get(TimeUnit.HOURS) + hours; @@ -124,11 +135,11 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { } //Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0} - public static Map computeDiff(long date1, long date2) { + private static Map computeDiff(long date1, long date2) { long diffInMillies = date2 - date1; - List units = new ArrayList(EnumSet.allOf(TimeUnit.class)); + List units = new ArrayList<>(EnumSet.allOf(TimeUnit.class)); Collections.reverse(units); - Map result = new LinkedHashMap(); + Map result = new LinkedHashMap<>(); long milliesRest = diffInMillies; for (TimeUnit unit : units) { long diff = unit.convert(milliesRest, TimeUnit.MILLISECONDS); @@ -140,12 +151,12 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { } - public static boolean isEvent5minBack(List list, long time) { + public boolean isEvent5minBack(List list, long time) { for (int i = 0; i < list.size(); i++) { CareportalEvent event = list.get(i); if (event.date <= time && event.date > (time - T.mins(5).msecs())) { if (L.isEnabled(L.DATABASE)) - log.debug("Found event for time: " + DateUtil.dateAndTimeString(time) + " " + event.toString()); + aapsLogger.debug("Found event for time: " + DateUtil.dateAndTimeString(time) + " " + event.toString()); return true; } } @@ -159,18 +170,18 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { return date; } - double yValue = 0; + private double yValue = 0; @Override public double getY() { - String units = ConfigBuilderPlugin.getPlugin().getProfileFunction().getUnits(); + String units = profileFunction.getUnits(); if (eventType.equals(MBG)) { double mbg = 0d; try { JSONObject object = new JSONObject(json); mbg = object.getDouble("mgdl"); } catch (JSONException e) { - log.error("Unhandled exception", e); + aapsLogger.error("Unhandled exception", e); } return Profile.fromMgdlToUnits(mbg, units); } @@ -183,7 +194,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { units = object.getString("units"); } } catch (JSONException e) { - log.error("Unhandled exception", e); + aapsLogger.error("Unhandled exception", e); } if (glucose != 0d) { double mmol = 0d; @@ -214,7 +225,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { if (object.has("notes")) return StringUtils.abbreviate(object.getString("notes"), 40); } catch (JSONException e) { - log.error("Unhandled exception", e); + aapsLogger.error("Unhandled exception", e); } return Translator.translate(eventType); } @@ -225,7 +236,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { if (object.has("notes")) return object.getString("notes"); } catch (JSONException e) { - log.error("Unhandled exception", e); + aapsLogger.error("Unhandled exception", e); } return ""; } @@ -256,14 +267,14 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { @Override public float getSize() { - boolean isTablet = MainApp.resources().getBoolean(R.bool.isTablet); + boolean isTablet = resourceHelper.gb(R.bool.isTablet); return isTablet ? 12 : 10; } @Override public int getColor() { if (eventType.equals(ANNOUNCEMENT)) - return MainApp.gc(R.color.notificationAnnouncement); + return resourceHelper.gc(R.color.notificationAnnouncement); if (eventType.equals(MBG)) return Color.RED; if (eventType.equals(BGCHECK)) @@ -276,7 +287,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { } // Interval interface - Long cuttedEnd = null; + private Long cuttedEnd = null; @Override public long durationInMsec() { @@ -285,7 +296,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { if (object.has("duration")) return object.getInt("duration") * 60 * 1000L; } catch (JSONException e) { - log.error("Unhandled exception", e); + aapsLogger.error("Unhandled exception", e); } return 0; } diff --git a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java index 84aecfb5e5..3e5eb5a553 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java @@ -7,6 +7,10 @@ import org.slf4j.Logger; import java.util.Objects; +import javax.inject.Inject; + +import dagger.android.HasAndroidInjector; +import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.data.IobTotal; @@ -15,8 +19,8 @@ import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.interfaces.Interval; import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.logging.StacktraceLoggerWrapper; -import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.configBuilder.PluginStore; +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensResult; import info.nightscout.androidaps.plugins.treatments.Treatment; import info.nightscout.androidaps.utils.DateUtil; @@ -31,6 +35,9 @@ import info.nightscout.androidaps.utils.SP; public class TemporaryBasal implements Interval, DbObjectBase { private static Logger log = StacktraceLoggerWrapper.getLogger(L.DATABASE); + @Inject public ProfileFunction profileFunction; + private HasAndroidInjector injector; + @DatabaseField(id = true) public long date; @@ -59,7 +66,15 @@ public class TemporaryBasal implements Interval, DbObjectBase { public double netExtendedRate = 0d; + @Deprecated public TemporaryBasal() { + injector = MainApp.instance(); + injector.androidInjector().inject(this); + } + + public TemporaryBasal(HasAndroidInjector injector) { + this.injector = injector; + injector.androidInjector().inject(this); } public TemporaryBasal date(long date) { @@ -95,7 +110,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { } public TemporaryBasal(ExtendedBolus extendedBolus) { - double basal = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(extendedBolus.date).getBasal(extendedBolus.date); + double basal = profileFunction.getProfile(extendedBolus.date).getBasal(extendedBolus.date); this.date = extendedBolus.date; this.isValid = extendedBolus.isValid; this.source = extendedBolus.source; @@ -109,7 +124,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { } public TemporaryBasal clone() { - TemporaryBasal t = new TemporaryBasal(); + TemporaryBasal t = new TemporaryBasal(injector); t.date = date; t.isValid = isValid; t.source = source; @@ -404,7 +419,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { public String toStringFull() { if (isFakeExtended) { - Profile profile = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(); + Profile profile = profileFunction.getProfile(); if (profile == null) return "null"; Double currentBasalRate = profile.getBasal(); @@ -428,7 +443,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { double rate; if (isFakeExtended) { - Profile profile = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(); + Profile profile = profileFunction.getProfile(); if (profile == null) return "null"; double currentBasalRate = profile.getBasal(); @@ -438,7 +453,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { } if (SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)) { - Profile profile = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(); + Profile profile = profileFunction.getProfile(); if (profile != null) { double basal = profile.getBasal(); if (basal != 0) { @@ -453,7 +468,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { } private String getCalcuatedPercentageIfNeeded() { - Profile profile = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(); + Profile profile = profileFunction.getProfile(); if (profile == null) return "null"; @@ -479,7 +494,7 @@ public class TemporaryBasal implements Interval, DbObjectBase { } public String toStringVeryShort() { - Profile profile = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(); + Profile profile = profileFunction.getProfile(); if (profile == null) return "null"; diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt index 008ad75057..d84dc898f1 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppComponent.kt @@ -9,10 +9,12 @@ import info.nightscout.androidaps.data.Profile import info.nightscout.androidaps.data.ProfileStore import info.nightscout.androidaps.data.PumpEnactResult import info.nightscout.androidaps.db.BgReading +import info.nightscout.androidaps.db.CareportalEvent import info.nightscout.androidaps.db.ProfileSwitch +import info.nightscout.androidaps.db.TemporaryBasal +import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback import info.nightscout.androidaps.plugins.aps.loop.APSResult import info.nightscout.androidaps.plugins.aps.openAPSAMA.DetermineBasalResultAMA -import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalAdapterSMBJS import info.nightscout.androidaps.plugins.aps.openAPSSMB.DetermineBasalResultSMB import info.nightscout.androidaps.plugins.constraints.objectives.objectives.* @@ -152,6 +154,8 @@ interface AppComponent : AndroidInjector { fun injectTreatment(treatment: Treatment) fun injectBgReading(bgReading: BgReading) fun injectProfileSwitch(profileSwitch: ProfileSwitch) + fun injectTemporaryBasal(temporaryBasal: TemporaryBasal) + fun injectCareportalEvent(careportalEvent: CareportalEvent) fun injectNotification(notificationWithAction: NotificationWithAction) @@ -189,4 +193,4 @@ interface AppComponent : AndroidInjector { fun build(): AppComponent } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt index 3e342bb038..1dd34b8100 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AppModule.kt @@ -14,7 +14,9 @@ import info.nightscout.androidaps.data.Profile import info.nightscout.androidaps.data.ProfileStore import info.nightscout.androidaps.data.PumpEnactResult import info.nightscout.androidaps.db.BgReading +import info.nightscout.androidaps.db.CareportalEvent import info.nightscout.androidaps.db.ProfileSwitch +import info.nightscout.androidaps.db.TemporaryBasal import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider import info.nightscout.androidaps.interfaces.PluginBase @@ -37,6 +39,7 @@ import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData import info.nightscout.androidaps.plugins.general.maintenance.ImportExportPrefs import info.nightscout.androidaps.plugins.general.maintenance.formats.ClassicPrefsFormat import info.nightscout.androidaps.plugins.general.maintenance.formats.EncryptedPrefsFormat +import info.nightscout.androidaps.plugins.general.nsclient.NSUpload import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationWithAction import info.nightscout.androidaps.plugins.general.smsCommunicator.AuthRequest import info.nightscout.androidaps.plugins.iob.iobCobCalculator.AutosensData @@ -98,11 +101,14 @@ open class AppModule { fun providesPlugins(@PluginsModule.AllConfigs allConfigs: Map<@JvmSuppressWildcards Int, @JvmSuppressWildcards PluginBase>, @PluginsModule.PumpDriver pumpDrivers: Lazy>, @PluginsModule.NotNSClient notNsClient: Lazy>, - @PluginsModule.APS aps: Lazy>): List<@JvmSuppressWildcards PluginBase> { + @PluginsModule.NSClient nsClient: Lazy>, + @PluginsModule.APS aps: Lazy>) + : List<@JvmSuppressWildcards PluginBase> { val plugins = allConfigs.toMutableMap() if (Config.PUMPDRIVERS) plugins += pumpDrivers.get() if (Config.APS) plugins += aps.get() if (!Config.NSCLIENT) plugins += notNsClient.get() + if (Config.NSCLIENT) plugins += nsClient.get() return plugins.toList().sortedBy { it.first }.map { it.second } } @@ -233,6 +239,8 @@ open class AppModule { @ContributesAndroidInjector fun bgReadingInjector(): BgReading @ContributesAndroidInjector fun treatmentInjector(): Treatment @ContributesAndroidInjector fun profileSwitchInjector(): ProfileSwitch + @ContributesAndroidInjector fun temporaryBasalInjector(): TemporaryBasal + @ContributesAndroidInjector fun careportalEventInjector(): CareportalEvent @ContributesAndroidInjector fun notificationWithActionInjector(): NotificationWithAction diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt index 6918e2d9e3..00bf3ebd9e 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/PluginsModule.kt @@ -165,7 +165,7 @@ abstract class PluginsModule { abstract fun bindVirtualPumpPlugin(plugin: VirtualPumpPlugin): PluginBase @Binds - @NotNSClient + @NSClient @IntoMap @IntKey(180) abstract fun bindCareportalPlugin(plugin: CareportalPlugin): PluginBase @@ -213,7 +213,7 @@ abstract class PluginsModule { abstract fun bindTreatmentsPlugin(plugin: TreatmentsPlugin): PluginBase @Binds - @NotNSClient + @AllConfigs @IntoSet abstract fun bindSafetyPlugin(plugin: SafetyPlugin): PluginBase @@ -359,7 +359,10 @@ abstract class PluginsModule { @Qualifier annotation class NotNSClient + @Qualifier + annotation class NSClient + @Qualifier annotation class APS -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt index c8b2bc4539..3ca03ead97 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CareDialog.kt @@ -183,7 +183,7 @@ class CareDialog : DialogFragmentWithDate() { activity?.let { activity -> OKDialog.showConfirmation(activity, resourceHelper.gs(event), HtmlHelper.fromHtml(Joiner.on("
").join(actions)), Runnable { - val careportalEvent = CareportalEvent() + val careportalEvent = CareportalEvent(injector) careportalEvent.date = eventTime careportalEvent.source = Source.USER careportalEvent.eventType = when (options) { diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt index df1664b68a..135eeb0e09 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/FillDialog.kt @@ -7,6 +7,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.google.common.base.Joiner +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.activities.ErrorHelperActivity @@ -40,6 +41,7 @@ class FillDialog : DialogFragmentWithDate() { @Inject lateinit var ctx: Context @Inject lateinit var commandQueue: CommandQueueProvider @Inject lateinit var activePlugin: ActivePluginProvider + @Inject lateinit var injector: HasAndroidInjector override fun onSaveInstanceState(savedInstanceState: Bundle) { super.onSaveInstanceState(savedInstanceState) @@ -161,7 +163,7 @@ class FillDialog : DialogFragmentWithDate() { } private fun generateCareportalEvent(eventType: String, time: Long, notes: String) { - val careportalEvent = CareportalEvent() + val careportalEvent = CareportalEvent(injector) careportalEvent.source = Source.USER careportalEvent.date = time careportalEvent.json = generateJson(eventType, time, notes).toString() diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventBTChange.kt b/app/src/main/java/info/nightscout/androidaps/events/EventBTChange.kt index 0531a4d00d..6b545f570c 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventBTChange.kt +++ b/app/src/main/java/info/nightscout/androidaps/events/EventBTChange.kt @@ -1,8 +1,9 @@ package info.nightscout.androidaps.events -class EventBTChange constructor(val state: Change, val deviceName: String) : Event() { +class EventBTChange(val state: Change, val deviceName: String?, val deviceAddress: String? = null) : Event() { + enum class Change { CONNECT, DISCONNECT } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.java b/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.java deleted file mode 100644 index 4ed1c3b8b7..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.java +++ /dev/null @@ -1,378 +0,0 @@ -package info.nightscout.androidaps.historyBrowser; - -import android.os.Bundle; -import android.os.SystemClock; -import android.text.SpannableString; -import android.text.style.ForegroundColorSpan; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.SeekBar; -import android.widget.TextView; - -import androidx.appcompat.widget.PopupMenu; -import androidx.core.content.res.ResourcesCompat; - -import com.jjoe64.graphview.GraphView; -import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; - -import java.util.Calendar; -import java.util.Date; - -import javax.inject.Inject; - -import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.activities.NoSplashAppCompatActivity; -import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.events.EventCustomCalculationFinished; -import info.nightscout.androidaps.events.EventRefreshOverview; -import info.nightscout.androidaps.interfaces.ActivePluginProvider; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.logging.AAPSLogger; -import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction; -import info.nightscout.androidaps.plugins.general.overview.OverviewFragment; -import info.nightscout.androidaps.plugins.general.overview.OverviewMenus; -import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished; -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress; -import info.nightscout.androidaps.utils.DateUtil; -import info.nightscout.androidaps.utils.DefaultValueHelper; -import info.nightscout.androidaps.utils.FabricPrivacy; -import info.nightscout.androidaps.utils.T; -import info.nightscout.androidaps.utils.buildHelper.BuildHelper; -import info.nightscout.androidaps.utils.resources.ResourceHelper; -import info.nightscout.androidaps.utils.sharedPreferences.SP; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.CompositeDisposable; - -public class HistoryBrowseActivity extends NoSplashAppCompatActivity { - @Inject HasAndroidInjector injector; - @Inject AAPSLogger aapsLogger; - @Inject RxBusWrapper rxBus; - @Inject SP sp; - @Inject ResourceHelper resourceHelper; - @Inject ProfileFunction profileFunction; - @Inject DefaultValueHelper defaultValueHelper; - @Inject IobCobStaticCalculatorPlugin iobCobStaticCalculatorPlugin; - @Inject ActivePluginProvider activePlugin; - @Inject BuildHelper buildHelper; - @Inject FabricPrivacy fabricPrivacy; - @Inject OverviewMenus overviewMenus; - - private CompositeDisposable disposable = new CompositeDisposable(); - - ImageButton chartButton; - - boolean showBasal = true; - boolean showIob, showCob, showDev, showRat, showActPrim, showActSec, showDevslope; - - - Button buttonDate; - Button buttonZoom; - GraphView bgGraph; - GraphView iobGraph; - SeekBar seekBar; - TextView noProfile; - TextView iobCalculationProgressView; - - private int rangeToDisplay = 24; // for graph - private long start = 0; - - - EventCustomCalculationFinished eventCustomCalculationFinished = new EventCustomCalculationFinished(); - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_historybrowse); - - buttonDate = findViewById(R.id.historybrowse_date); - buttonZoom = findViewById(R.id.historybrowse_zoom); - bgGraph = findViewById(R.id.historyybrowse_bggraph); - iobGraph = findViewById(R.id.historybrowse_iobgraph); - seekBar = findViewById(R.id.historybrowse_seekBar); - noProfile = findViewById(R.id.historybrowse_noprofile); - iobCalculationProgressView = findViewById(R.id.overview_iobcalculationprogess); - - findViewById(R.id.historybrowse_left).setOnClickListener(v -> { - start -= T.hours(rangeToDisplay).msecs(); - updateGUI("onClickLeft"); - runCalculation("onClickLeft"); - }); - - findViewById(R.id.historybrowse_right).setOnClickListener(v -> { - start += T.hours(rangeToDisplay).msecs(); - updateGUI("onClickRight"); - runCalculation("onClickRight"); - }); - - findViewById(R.id.historybrowse_end).setOnClickListener(v -> { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis()); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - start = calendar.getTimeInMillis(); - updateGUI("onClickEnd"); - runCalculation("onClickEnd"); - }); - - findViewById(R.id.historybrowse_zoom).setOnClickListener(v -> { - rangeToDisplay += 6; - rangeToDisplay = rangeToDisplay > 24 ? 6 : rangeToDisplay; - updateGUI("rangeChange"); - }); - - findViewById(R.id.historybrowse_zoom).setOnLongClickListener(v -> { - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(start); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - start = calendar.getTimeInMillis(); - updateGUI("resetToMidnight"); - runCalculation("onLongClickZoom"); - return true; - }); - - findViewById(R.id.historybrowse_date).setOnClickListener(v -> { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(new Date(start)); - DatePickerDialog dpd = DatePickerDialog.newInstance( - (view, year, monthOfYear, dayOfMonth) -> { - Date date = new Date(0); - date.setYear(year - 1900); - date.setMonth(monthOfYear); - date.setDate(dayOfMonth); - date.setHours(0); - start = date.getTime(); - updateGUI("onClickDate"); - runCalculation("onClickDate"); - }, - calendar.get(Calendar.YEAR), - calendar.get(Calendar.MONTH), - calendar.get(Calendar.DAY_OF_MONTH) - ); - dpd.setThemeDark(true); - dpd.dismissOnPause(true); - dpd.show(getSupportFragmentManager(), "Datepickerdialog"); - }); - - bgGraph.getGridLabelRenderer().setGridColor(resourceHelper.gc(R.color.graphgrid)); - bgGraph.getGridLabelRenderer().reloadStyles(); - iobGraph.getGridLabelRenderer().setGridColor(resourceHelper.gc(R.color.graphgrid)); - iobGraph.getGridLabelRenderer().reloadStyles(); - iobGraph.getGridLabelRenderer().setHorizontalLabelsVisible(false); - bgGraph.getGridLabelRenderer().setLabelVerticalWidth(50); - iobGraph.getGridLabelRenderer().setLabelVerticalWidth(50); - iobGraph.getGridLabelRenderer().setNumVerticalLabels(5); - - overviewMenus.setupChartMenu(findViewById(R.id.overview_chartMenuButton)); - } - - @Override - public void onPause() { - super.onPause(); - disposable.clear(); - iobCobStaticCalculatorPlugin.stopCalculation("onPause"); - } - - @Override - public void onResume() { - super.onResume(); - disposable.add(rxBus - .toObservable(EventAutosensCalculationFinished.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> { - if (event.getCause() == eventCustomCalculationFinished) { - aapsLogger.debug(LTag.AUTOSENS, "EventAutosensCalculationFinished"); - synchronized (HistoryBrowseActivity.this) { - updateGUI("EventAutosensCalculationFinished"); - } - } - }, fabricPrivacy::logException) - ); - disposable.add(rxBus - .toObservable(EventIobCalculationProgress.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> { - if (iobCalculationProgressView != null) - iobCalculationProgressView.setText(event.getProgress()); - }, exception -> fabricPrivacy.logException(exception)) - ); - disposable.add(rxBus - .toObservable(EventRefreshOverview.class) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(event -> updateGUI("EventRefreshOverview") , fabricPrivacy::logException) - ); - // set start of current day - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis()); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.HOUR_OF_DAY, 0); - start = calendar.getTimeInMillis(); - runCalculation("onResume"); - SystemClock.sleep(1000); - updateGUI("onResume"); - } - - private void runCalculation(String from) { - long end = start + T.hours(rangeToDisplay).msecs(); - iobCobStaticCalculatorPlugin.stopCalculation(from); - iobCobStaticCalculatorPlugin.clearCache(); - iobCobStaticCalculatorPlugin.runCalculation(from, end, true, false, eventCustomCalculationFinished); - } - - void updateGUI(String from) { - aapsLogger.debug(LTag.UI, "updateGUI from: " + from); - - if (noProfile == null || buttonDate == null || buttonZoom == null || bgGraph == null || iobGraph == null || seekBar == null) - return; - - final PumpInterface pump = activePlugin.getActivePump(); - final Profile profile = profileFunction.getProfile(); - - if (profile == null) { - noProfile.setVisibility(View.VISIBLE); - return; - } else { - noProfile.setVisibility(View.GONE); - } - - final double lowLine = defaultValueHelper.determineLowLine(); - final double highLine = defaultValueHelper.determineHighLine(); - - buttonDate.setText(DateUtil.dateAndTimeString(start)); - buttonZoom.setText(String.valueOf(rangeToDisplay)); - - final boolean showPrediction = false; - - showBasal = sp.getBoolean("hist_showbasals", true); - showIob = sp.getBoolean("hist_showiob", true); - showCob = sp.getBoolean("hist_showcob", true); - showDev = sp.getBoolean("hist_showdeviations", false); - showRat = sp.getBoolean("hist_showratios", false); - showActPrim = sp.getBoolean("hist_showactivityprimary", false); - showActSec = sp.getBoolean("hist_showactivitysecondary", false); - showDevslope = sp.getBoolean("hist_showdevslope", false); - - //int hoursToFetch; - final long toTime; - final long fromTime; - //if (showPrediction) { - //int predHours = (int) (Math.ceil(((DetermineBasalResultAMA) finalLastRun.constraintsProcessed).getLatestPredictionsTime() - System.currentTimeMillis()) / (60 * 60 * 1000)); - //predHours = Math.min(2, predHours); - //predHours = Math.max(0, predHours); - //hoursToFetch = rangeToDisplay - predHours; - //toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific - //fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; - //endTime = toTime + predHours * 60 * 60 * 1000L; - //} else { - fromTime = start + T.secs(100).msecs(); - toTime = start + T.hours(rangeToDisplay).msecs(); - //} - - aapsLogger.debug(LTag.UI, "Period: " + DateUtil.dateAndTimeString(fromTime) + " - " + DateUtil.dateAndTimeString(toTime)); - - final long pointer = System.currentTimeMillis(); - - // ------------------ 1st graph - - final GraphData graphData = new GraphData(injector, bgGraph, iobCobStaticCalculatorPlugin); - - // **** In range Area **** - graphData.addInRangeArea(fromTime, toTime, lowLine, highLine); - - // **** BG **** - if (showPrediction) -//graphData.addBgReadings(fromTime, toTime, lowLine, highLine, (DetermineBasalResultAMA) finalLastRun.constraintsProcessed); - ; - else - graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null); - - // set manual x bounds to have nice steps - graphData.formatAxis(fromTime, toTime); - - if (showActPrim) { - graphData.addActivity(fromTime, toTime, false, 1d); - } - - // Treatments - graphData.addTreatments(fromTime, toTime); - - // add basal data - if (pump.getPumpDescription().isTempBasalCapable && showBasal) { - graphData.addBasals(fromTime, toTime, lowLine / graphData.getMaxY() / 1.2d); - } - - // **** NOW line **** - graphData.addNowLine(pointer); - - // ------------------ 2nd graph - - new Thread(() -> { - final GraphData secondGraphData = new GraphData(injector, iobGraph, iobCobStaticCalculatorPlugin); - - boolean useIobForScale = false; - boolean useCobForScale = false; - boolean useDevForScale = false; - boolean useRatioForScale = false; - boolean useIAForScale = false; - boolean useDSForScale = false; - - if (showIob) { - useIobForScale = true; - } else if (showCob) { - useCobForScale = true; - } else if (showDev) { - useDevForScale = true; - } else if (showRat) { - useRatioForScale = true; - } else if (showActSec) { - useIAForScale = true; - } else if (showDevslope) { - useDSForScale = true; - } - - if (showIob) - secondGraphData.addIob(fromTime, toTime, useIobForScale, 1d, showPrediction); - if (showCob) - secondGraphData.addCob(fromTime, toTime, useCobForScale, useCobForScale ? 1d : 0.5d); - if (showDev) - secondGraphData.addDeviations(fromTime, toTime, useDevForScale, 1d); - if (showRat) - secondGraphData.addRatio(fromTime, toTime, useRatioForScale, 1d); - if (showActSec) - secondGraphData.addActivity(fromTime, toTime, useIAForScale, useIAForScale ? 2d : 1d); - if (showDevslope) - secondGraphData.addDeviationSlope(fromTime, toTime, useDSForScale, 1d); - - // **** NOW line **** - // set manual x bounds to have nice steps - secondGraphData.formatAxis(fromTime, toTime); - secondGraphData.addNowLine(pointer); - - // do GUI update - runOnUiThread(() -> { - if (showIob || showCob || showDev || showRat || showActSec || showDevslope) { - iobGraph.setVisibility(View.VISIBLE); - } else { - iobGraph.setVisibility(View.GONE); - } - // finally enforce drawing of graphs - graphData.performUpdate(); - if (showIob || showCob || showDev || showRat || showActSec || showDevslope) - secondGraphData.performUpdate(); - }); - }).start(); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt b/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt new file mode 100644 index 0000000000..0b260e9470 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/historyBrowser/HistoryBrowseActivity.kt @@ -0,0 +1,330 @@ +package info.nightscout.androidaps.historyBrowser + +import android.app.DatePickerDialog +import android.graphics.Color +import android.os.Bundle +import android.os.SystemClock +import android.util.DisplayMetrics +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import com.jjoe64.graphview.GraphView +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.activities.NoSplashAppCompatActivity +import info.nightscout.androidaps.events.EventCustomCalculationFinished +import info.nightscout.androidaps.events.EventRefreshOverview +import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction +import info.nightscout.androidaps.plugins.general.overview.OverviewMenus +import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished +import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress +import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.utils.DefaultValueHelper +import info.nightscout.androidaps.utils.FabricPrivacy +import info.nightscout.androidaps.utils.T +import info.nightscout.androidaps.utils.buildHelper.BuildHelper +import info.nightscout.androidaps.utils.extensions.toVisibility +import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.CompositeDisposable +import kotlinx.android.synthetic.main.activity_historybrowse.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.util.* +import javax.inject.Inject + +class HistoryBrowseActivity : NoSplashAppCompatActivity() { + @Inject lateinit var injector: HasAndroidInjector + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rxBus: RxBusWrapper + @Inject lateinit var sp: SP + @Inject lateinit var resourceHelper: ResourceHelper + @Inject lateinit var profileFunction: ProfileFunction + @Inject lateinit var defaultValueHelper: DefaultValueHelper + @Inject lateinit var iobCobStaticCalculatorPlugin: IobCobStaticCalculatorPlugin + @Inject lateinit var activePlugin: ActivePluginProvider + @Inject lateinit var buildHelper: BuildHelper + @Inject lateinit var fabricPrivacy: FabricPrivacy + @Inject lateinit var overviewMenus: OverviewMenus + + private val disposable = CompositeDisposable() + + private val secondaryGraphs = ArrayList() + private val secondaryGraphsLabel = ArrayList() + + private var axisWidth: Int = 0 + private var rangeToDisplay = 24 // for graph + private var start: Long = 0 + + private var eventCustomCalculationFinished = EventCustomCalculationFinished() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_historybrowse) + + historybrowse_left.setOnClickListener { + start -= T.hours(rangeToDisplay.toLong()).msecs() + updateGUI("onClickLeft") + runCalculation("onClickLeft") + } + historybrowse_right.setOnClickListener { + start += T.hours(rangeToDisplay.toLong()).msecs() + updateGUI("onClickRight") + runCalculation("onClickRight") + } + historybrowse_end.setOnClickListener { + val calendar = Calendar.getInstance() + calendar.timeInMillis = System.currentTimeMillis() + calendar[Calendar.MILLISECOND] = 0 + calendar[Calendar.SECOND] = 0 + calendar[Calendar.MINUTE] = 0 + calendar[Calendar.HOUR_OF_DAY] = 0 + start = calendar.timeInMillis + updateGUI("onClickEnd") + runCalculation("onClickEnd") + } + historybrowse_zoom.setOnClickListener { + rangeToDisplay += 6 + rangeToDisplay = if (rangeToDisplay > 24) 6 else rangeToDisplay + updateGUI("rangeChange") + } + historybrowse_zoom.setOnLongClickListener { + val calendar = Calendar.getInstance() + calendar.timeInMillis = start + calendar[Calendar.MILLISECOND] = 0 + calendar[Calendar.SECOND] = 0 + calendar[Calendar.MINUTE] = 0 + calendar[Calendar.HOUR_OF_DAY] = 0 + start = calendar.timeInMillis + updateGUI("resetToMidnight") + runCalculation("onLongClickZoom") + true + } + + // create an OnDateSetListener + val dateSetListener = DatePickerDialog.OnDateSetListener { _, year, monthOfYear, dayOfMonth -> + val cal = Calendar.getInstance() + cal.timeInMillis = start + cal.set(Calendar.YEAR, year) + cal.set(Calendar.MONTH, monthOfYear) + cal.set(Calendar.DAY_OF_MONTH, dayOfMonth) + start = cal.timeInMillis + historybrowse_date?.text = DateUtil.dateAndTimeString(start) + updateGUI("onClickDate") + runCalculation("onClickDate") + } + + historybrowse_date.setOnClickListener { + val cal = Calendar.getInstance() + cal.timeInMillis = start + DatePickerDialog(this, dateSetListener, + cal.get(Calendar.YEAR), + cal.get(Calendar.MONTH), + cal.get(Calendar.DAY_OF_MONTH) + ).show() + } + + val dm = DisplayMetrics() + windowManager?.defaultDisplay?.getMetrics(dm) + + axisWidth = if (dm.densityDpi <= 120) 3 else if (dm.densityDpi <= 160) 10 else if (dm.densityDpi <= 320) 35 else if (dm.densityDpi <= 420) 50 else if (dm.densityDpi <= 560) 70 else 80 + historybrowse_bggraph?.gridLabelRenderer?.gridColor = resourceHelper.gc(R.color.graphgrid) + historybrowse_bggraph?.gridLabelRenderer?.reloadStyles() + historybrowse_bggraph?.gridLabelRenderer?.labelVerticalWidth = axisWidth + + overviewMenus.setupChartMenu(overview_chartMenuButton) + prepareGraphs() + } + + public override fun onPause() { + super.onPause() + disposable.clear() + iobCobStaticCalculatorPlugin.stopCalculation("onPause") + } + + public override fun onResume() { + super.onResume() + disposable.add(rxBus + .toObservable(EventAutosensCalculationFinished::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ event: EventAutosensCalculationFinished -> + // catch only events from iobCobStaticCalculatorPlugin + if (event.cause === eventCustomCalculationFinished) { + aapsLogger.debug(LTag.AUTOSENS, "EventAutosensCalculationFinished") + updateGUI("EventAutosensCalculationFinished") + } + }) { fabricPrivacy::logException } + ) + disposable.add(rxBus + .toObservable(EventIobCalculationProgress::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ overview_iobcalculationprogess?.text = it.progress }) { fabricPrivacy::logException } + ) + disposable.add(rxBus + .toObservable(EventRefreshOverview::class.java) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + prepareGraphs() + updateGUI("EventRefreshOverview") + }) { fabricPrivacy::logException } + ) + // set start of current day + val calendar = Calendar.getInstance() + calendar.timeInMillis = System.currentTimeMillis() + calendar[Calendar.MILLISECOND] = 0 + calendar[Calendar.SECOND] = 0 + calendar[Calendar.MINUTE] = 0 + calendar[Calendar.HOUR_OF_DAY] = 0 + start = calendar.timeInMillis + runCalculation("onResume") + SystemClock.sleep(1000) + updateGUI("onResume") + } + + private fun prepareGraphs() { + val numOfGraphs = overviewMenus.setting.size + + if (numOfGraphs != secondaryGraphs.size - 1) { + //aapsLogger.debug("New secondary graph count ${numOfGraphs-1}") + // rebuild needed + secondaryGraphs.clear() + secondaryGraphsLabel.clear() + history_iobgraph.removeAllViews() + for (i in 1 until numOfGraphs) { + val label = TextView(this) + label.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).also { it.setMargins(100, 0, 0, -50) } + history_iobgraph.addView(label) + secondaryGraphsLabel.add(label) + val graph = GraphView(this) + graph.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, resourceHelper.dpToPx(100)).also { it.setMargins(0, 0, 0, resourceHelper.dpToPx(10)) } + graph.gridLabelRenderer?.gridColor = resourceHelper.gc(R.color.graphgrid) + graph.gridLabelRenderer?.reloadStyles() + graph.gridLabelRenderer?.isHorizontalLabelsVisible = false + graph.gridLabelRenderer?.labelVerticalWidth = axisWidth + graph.gridLabelRenderer?.numVerticalLabels = 3 + graph.viewport.backgroundColor = Color.argb(20, 255, 255, 255) // 8% of gray + history_iobgraph.addView(graph) + secondaryGraphs.add(graph) + } + } + + } + + private fun runCalculation(from: String) { + val end = start + T.hours(rangeToDisplay.toLong()).msecs() + iobCobStaticCalculatorPlugin.stopCalculation(from) + iobCobStaticCalculatorPlugin.clearCache() + iobCobStaticCalculatorPlugin.runCalculation(from, end, true, false, eventCustomCalculationFinished) + } + + @Synchronized + fun updateGUI(from: String) { + aapsLogger.debug(LTag.UI, "updateGUI from: $from") + val pump = activePlugin.activePump + val profile = profileFunction.getProfile() + + historybrowse_noprofile?.visibility = (profile == null).toVisibility() + profile ?: return + + val lowLine = defaultValueHelper.determineLowLine() + val highLine = defaultValueHelper.determineHighLine() + historybrowse_date?.text = DateUtil.dateAndTimeString(start) + historybrowse_zoom?.text = rangeToDisplay.toString() + + GlobalScope.launch(Dispatchers.Main) { + historybrowse_bggraph ?: return@launch + val graphData = GraphData(injector, historybrowse_bggraph, iobCobStaticCalculatorPlugin) + val secondaryGraphsData: ArrayList = ArrayList() + + // do preparation in different thread + withContext(Dispatchers.Default) { + val fromTime: Long = start + T.secs(100).msecs() + val toTime: Long = start + T.hours(rangeToDisplay.toLong()).msecs() + aapsLogger.debug(LTag.UI, "Period: " + DateUtil.dateAndTimeString(fromTime) + " - " + DateUtil.dateAndTimeString(toTime)) + val pointer = System.currentTimeMillis() + + // **** In range Area **** + graphData.addInRangeArea(fromTime, toTime, lowLine, highLine) + + // **** BG **** + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null) + + // set manual x bounds to have nice steps + graphData.formatAxis(fromTime, toTime) + + // Treatments + graphData.addTreatments(fromTime, toTime) + if (overviewMenus.setting[0][OverviewMenus.CharType.ACT.ordinal]) + graphData.addActivity(fromTime, toTime, false, 0.8) + + // add basal data + if (pump.pumpDescription.isTempBasalCapable && overviewMenus.setting[0][OverviewMenus.CharType.BAS.ordinal]) { + graphData.addBasals(fromTime, toTime, lowLine / graphData.maxY / 1.2) + } + + // add target line + graphData.addTargetLine(fromTime, toTime, profile, null) + + // **** NOW line **** + graphData.addNowLine(pointer) + + // ------------------ 2nd graph + for (g in 0 until secondaryGraphs.size) { + val secondGraphData = GraphData(injector, secondaryGraphs[g], iobCobStaticCalculatorPlugin) + var useIobForScale = false + var useCobForScale = false + var useDevForScale = false + var useRatioForScale = false + var useDSForScale = false + var useIAForScale = false + var useABSForScale = false + when { + overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal] -> useIobForScale = true + overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal] -> useCobForScale = true + overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal] -> useDevForScale = true + overviewMenus.setting[g + 1][OverviewMenus.CharType.SEN.ordinal] -> useRatioForScale = true + overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal] -> useIAForScale = true + overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] -> useABSForScale = true + overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] -> useDSForScale = true + } + + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal]) secondGraphData.addIob(fromTime, toTime, useIobForScale, 1.0, overviewMenus.setting[g + 1][OverviewMenus.CharType.PRE.ordinal]) + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal]) secondGraphData.addCob(fromTime, toTime, useCobForScale, if (useCobForScale) 1.0 else 0.5) + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal]) secondGraphData.addDeviations(fromTime, toTime, useDevForScale, 1.0) + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.SEN.ordinal]) secondGraphData.addRatio(fromTime, toTime, useRatioForScale, 1.0) + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal]) secondGraphData.addActivity(fromTime, toTime, useIAForScale, 0.8) + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal]) secondGraphData.addAbsIob(fromTime, toTime, useABSForScale, 1.0) + if (overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] && buildHelper.isDev()) secondGraphData.addDeviationSlope(fromTime, toTime, useDSForScale, 1.0) + + // set manual x bounds to have nice steps + secondGraphData.formatAxis(fromTime, toTime) + secondGraphData.addNowLine(pointer) + secondaryGraphsData.add(secondGraphData) + } + } + // finally enforce drawing of graphs in UI thread + graphData.performUpdate() + for (g in 0 until secondaryGraphs.size) { + secondaryGraphsLabel[g].text = overviewMenus.enabledTypes(g + 1) + secondaryGraphs[g].visibility = ( + overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal] || + overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal] || + overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal] || + overviewMenus.setting[g + 1][OverviewMenus.CharType.SEN.ordinal] || + overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal] || + overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] || + overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] + ).toVisibility() + secondaryGraphsData[g].performUpdate() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java index cd99fb2c56..24e86220c2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java @@ -744,7 +744,7 @@ public class LoopPlugin extends PluginBase { } catch (JSONException e) { getAapsLogger().error("Unhandled exception", e); } - CareportalEvent event = new CareportalEvent(); + CareportalEvent event = new CareportalEvent(getInjector()); event.date = DateUtil.now(); event.source = Source.USER; event.eventType = CareportalEvent.OPENAPSOFFLINE; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.java deleted file mode 100644 index e908dfa968..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.java +++ /dev/null @@ -1,344 +0,0 @@ -package info.nightscout.androidaps.plugins.configBuilder; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.FragmentActivity; - -import java.util.ArrayList; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.events.EventAppInitialized; -import info.nightscout.androidaps.events.EventConfigBuilderChange; -import info.nightscout.androidaps.events.EventRebuildTabs; -import info.nightscout.androidaps.interfaces.APSInterface; -import info.nightscout.androidaps.interfaces.ActivePluginProvider; -import info.nightscout.androidaps.interfaces.BgSourceInterface; -import info.nightscout.androidaps.interfaces.InsulinInterface; -import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PluginDescription; -import info.nightscout.androidaps.interfaces.PluginType; -import info.nightscout.androidaps.interfaces.ProfileInterface; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.interfaces.SensitivityInterface; -import info.nightscout.androidaps.interfaces.TreatmentsInterface; -import info.nightscout.androidaps.logging.AAPSLogger; -import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.plugins.configBuilder.events.EventConfigBuilderUpdateGui; -import info.nightscout.androidaps.utils.alertDialogs.OKDialog; -import info.nightscout.androidaps.utils.resources.ResourceHelper; -import info.nightscout.androidaps.utils.sharedPreferences.SP; - -/** - * Created by mike on 05.08.2016. - */ -@Singleton -public class ConfigBuilderPlugin extends PluginBase { - private static ConfigBuilderPlugin configBuilderPlugin; - - private final ActivePluginProvider activePlugin; - private final SP sp; - private final AAPSLogger aapsLogger; - private final RxBusWrapper rxBus; - private final ResourceHelper resourceHelper; - private final ProfileFunction profileFunction; - - /** - * @deprecated Use dagger to get an instance - */ - - @Deprecated - public ProfileFunction getProfileFunction() { - if (profileFunction == null) - throw new IllegalStateException("Accessing profileFunction before first instantiation"); - return profileFunction; - } - - @Deprecated - static public ConfigBuilderPlugin getPlugin() { - if (configBuilderPlugin == null) - throw new IllegalStateException("Accessing ConfigBuilder before first instantiation"); - return configBuilderPlugin; - } - - /* - * Written by Adrian: - * The ConfigBuilderPlugin.getPlugin() method is used at 333 places throughout the app. - * In order to make the transition to DI, while legacy code is still calling `getPlugin()`, - * I'd instantiate this plugin very very early on (first injected dependency in MainApp) and use - * Lazy dependencies in this constructor. - * */ - @Inject - public ConfigBuilderPlugin( - ActivePluginProvider activePlugin, - HasAndroidInjector injector, - SP sp, - RxBusWrapper rxBus, - AAPSLogger aapsLogger, - ResourceHelper resourceHelper, - ProfileFunction profileFunction - ) { - super(new PluginDescription() - .mainType(PluginType.GENERAL) - .fragmentClass(ConfigBuilderFragment.class.getName()) - .showInList(true) - .alwaysEnabled(true) - .alwaysVisible(false) - .pluginName(R.string.configbuilder) - .shortName(R.string.configbuilder_shortname) - .description(R.string.description_config_builder), - aapsLogger, resourceHelper, injector - ); - this.activePlugin = activePlugin; - this.sp = sp; - this.rxBus = rxBus; - this.aapsLogger = aapsLogger; - this.resourceHelper = resourceHelper; - this.profileFunction = profileFunction; - configBuilderPlugin = this; // TODO: only while transitioning to Dagger - } - - public void initialize() { - upgradeSettings(); - ((PluginStore) activePlugin).loadDefaults(); - loadSettings(); - setAlwaysEnabledPluginsEnabled(); - rxBus.send(new EventAppInitialized()); - } - - private void setAlwaysEnabledPluginsEnabled() { - for (PluginBase plugin : activePlugin.getPluginsList()) { - if (plugin.getPluginDescription().alwaysEnabled) - plugin.setPluginEnabled(plugin.getType(), true); - } - storeSettings("setAlwaysEnabledPluginsEnabled"); - } - - public void storeSettings(String from) { - activePlugin.getPluginsList(); - getAapsLogger().debug(LTag.CONFIGBUILDER, "Storing settings from: " + from); - - activePlugin.verifySelectionInCategories(); - - for (PluginBase p : activePlugin.getPluginsList()) { - PluginType type = p.getType(); - if (p.getPluginDescription().alwaysEnabled && p.getPluginDescription().alwaysVisible) - continue; - if (p.getPluginDescription().alwaysEnabled && p.getPluginDescription().neverVisible) - continue; - savePref(p, type, true); - if (type == PluginType.PUMP) { - if (p instanceof ProfileInterface) { // Store state of optional Profile interface - savePref(p, PluginType.PROFILE, false); - } - } - } - } - - private void savePref(PluginBase p, PluginType type, boolean storeVisible) { - String settingEnabled = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Enabled"; - sp.putBoolean(settingEnabled, p.isEnabled(type)); - getAapsLogger().debug(LTag.CONFIGBUILDER, "Storing: " + settingEnabled + ":" + p.isEnabled(type)); - if (storeVisible) { - String settingVisible = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Visible"; - sp.putBoolean(settingVisible, p.isFragmentVisible()); - getAapsLogger().debug(LTag.CONFIGBUILDER, "Storing: " + settingVisible + ":" + p.isFragmentVisible()); - } - } - - private void loadSettings() { - getAapsLogger().debug(LTag.CONFIGBUILDER, "Loading stored settings"); - for (PluginBase p : activePlugin.getPluginsList()) { - PluginType type = p.getType(); - loadPref(p, type, true); - if (p.getType() == PluginType.PUMP) { - if (p instanceof ProfileInterface) { - loadPref(p, PluginType.PROFILE, false); - } - } - } - activePlugin.verifySelectionInCategories(); - } - - private void loadPref(PluginBase p, PluginType type, boolean loadVisible) { - String settingEnabled = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Enabled"; - if (sp.contains(settingEnabled)) - p.setPluginEnabled(type, sp.getBoolean(settingEnabled, false)); - else if (p.getType() == type && (p.getPluginDescription().enableByDefault || p.getPluginDescription().alwaysEnabled)) { - p.setPluginEnabled(type, true); - } - getAapsLogger().debug(LTag.CONFIGBUILDER, "Loaded: " + settingEnabled + ":" + p.isEnabled(type)); - if (loadVisible) { - String settingVisible = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Visible"; - if (sp.contains(settingVisible)) - p.setFragmentVisible(type, sp.getBoolean(settingVisible, false) && sp.getBoolean(settingEnabled, false)); - else if (p.getType() == type && p.getPluginDescription().visibleByDefault) { - p.setFragmentVisible(type, true); - } - getAapsLogger().debug(LTag.CONFIGBUILDER, "Loaded: " + settingVisible + ":" + p.isFragmentVisible()); - } - } - - // Detect settings prior 1.60 - private void upgradeSettings() { - if (!sp.contains("ConfigBuilder_1_NSProfilePlugin_Enabled")) - return; - getAapsLogger().debug(LTag.CONFIGBUILDER, "Upgrading stored settings"); - for (PluginBase p : activePlugin.getPluginsList()) { - getAapsLogger().debug(LTag.CONFIGBUILDER, "Processing " + p.getName()); - for (int type = 1; type < 11; type++) { - PluginType newType; - switch (type) { - case 1: - newType = PluginType.GENERAL; - break; - case 2: - newType = PluginType.TREATMENT; - break; - case 3: - newType = PluginType.SENSITIVITY; - break; - case 4: - newType = PluginType.PROFILE; - break; - case 5: - newType = PluginType.APS; - break; - case 6: - newType = PluginType.PUMP; - break; - case 7: - newType = PluginType.CONSTRAINTS; - break; - case 8: - newType = PluginType.LOOP; - break; - case 9: - newType = PluginType.BGSOURCE; - break; - case 10: - newType = PluginType.INSULIN; - break; - default: - newType = PluginType.GENERAL; - break; - } - String settingEnabled = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Enabled"; - String settingVisible = "ConfigBuilder_" + type + "_" + p.getClass().getSimpleName() + "_Visible"; - if (sp.contains(settingEnabled)) - p.setPluginEnabled(newType, sp.getBoolean(settingEnabled, false)); - if (sp.contains(settingVisible)) - p.setFragmentVisible(newType, sp.getBoolean(settingVisible, false) && sp.getBoolean(settingEnabled, false)); - sp.remove(settingEnabled); - sp.remove(settingVisible); - if (newType == p.getType()) { - savePref(p, newType, true); - } - } - } - } - - public void logPluginStatus() { - for (PluginBase p : activePlugin.getPluginsList()) { - getAapsLogger().debug(LTag.CONFIGBUILDER, p.getName() + ":" + - (p.isEnabled(PluginType.GENERAL) ? " GENERAL" : "") + - (p.isEnabled(PluginType.TREATMENT) ? " TREATMENT" : "") + - (p.isEnabled(PluginType.SENSITIVITY) ? " SENSITIVITY" : "") + - (p.isEnabled(PluginType.PROFILE) ? " PROFILE" : "") + - (p.isEnabled(PluginType.APS) ? " APS" : "") + - (p.isEnabled(PluginType.PUMP) ? " PUMP" : "") + - (p.isEnabled(PluginType.CONSTRAINTS) ? " CONSTRAINTS" : "") + - (p.isEnabled(PluginType.LOOP) ? " LOOP" : "") + - (p.isEnabled(PluginType.BGSOURCE) ? " BGSOURCE" : "") + - (p.isEnabled(PluginType.INSULIN) ? " INSULIN" : "") - ); - } - } - - // Ask when switching to physical pump plugin - public void switchAllowed(@NonNull PluginBase changedPlugin, boolean newState, @Nullable FragmentActivity activity, @NonNull PluginType type) { - if (changedPlugin.getType() == PluginType.PUMP && !changedPlugin.getName().equals(resourceHelper.gs(R.string.virtualpump))) - confirmPumpPluginActivation(changedPlugin, newState, activity, type); - else - performPluginSwitch(changedPlugin, newState, type); - } - - private void confirmPumpPluginActivation(@NonNull PluginBase changedPlugin, boolean newState, @Nullable FragmentActivity activity, @NonNull PluginType type) { - boolean allowHardwarePump = sp.getBoolean("allow_hardware_pump", false); - if (allowHardwarePump || activity == null) { - performPluginSwitch(changedPlugin, newState, type); - } else { - OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.allow_hardware_pump_text), () -> { - performPluginSwitch(changedPlugin, newState, type); - sp.putBoolean("allow_hardware_pump", true); - aapsLogger.debug(LTag.PUMP, "First time HW pump allowed!"); - }, () -> { - rxBus.send(new EventConfigBuilderUpdateGui()); - aapsLogger.debug(LTag.PUMP, "User does not allow switching to HW pump!"); - }); - } - } - - public void performPluginSwitch(PluginBase changedPlugin, boolean enabled, @NonNull PluginType type) { - changedPlugin.setPluginEnabled(type, enabled); - changedPlugin.setFragmentVisible(type, enabled); - processOnEnabledCategoryChanged(changedPlugin, type); - storeSettings("CheckedCheckboxEnabled"); - rxBus.send(new EventRebuildTabs()); - rxBus.send(new EventConfigBuilderChange()); - rxBus.send(new EventConfigBuilderUpdateGui()); - logPluginStatus(); - } - - public void processOnEnabledCategoryChanged(PluginBase changedPlugin, PluginType type) { - ArrayList pluginsInCategory = null; - switch (type) { - // Multiple selection allowed - case GENERAL: - case CONSTRAINTS: - case LOOP: - break; - // Single selection allowed - case INSULIN: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(InsulinInterface.class); - break; - case SENSITIVITY: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(SensitivityInterface.class); - break; - case APS: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(APSInterface.class); - break; - case PROFILE: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(ProfileInterface.class); - break; - case BGSOURCE: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(BgSourceInterface.class); - break; - case TREATMENT: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(TreatmentsInterface.class); - break; - case PUMP: - pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(PumpInterface.class); - break; - } - if (pluginsInCategory != null) { - boolean newSelection = changedPlugin.isEnabled(type); - if (newSelection) { // new plugin selected -> disable others - for (PluginBase p : pluginsInCategory) { - if (p.getName().equals(changedPlugin.getName())) { - // this is new selected - } else { - p.setPluginEnabled(type, false); - p.setFragmentVisible(type, false); - } - } - } else { // enable first plugin in list - pluginsInCategory.get(0).setPluginEnabled(type, true); - } - } - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt new file mode 100644 index 0000000000..5d274d933b --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPlugin.kt @@ -0,0 +1,191 @@ +package info.nightscout.androidaps.plugins.configBuilder + +import androidx.fragment.app.FragmentActivity +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.events.EventAppInitialized +import info.nightscout.androidaps.events.EventConfigBuilderChange +import info.nightscout.androidaps.events.EventRebuildTabs +import info.nightscout.androidaps.interfaces.* +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.configBuilder.events.EventConfigBuilderUpdateGui +import info.nightscout.androidaps.utils.alertDialogs.OKDialog.showConfirmation +import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP +import java.util.* +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ConfigBuilderPlugin @Inject constructor( + injector: HasAndroidInjector, + aapsLogger: AAPSLogger, + resourceHelper: ResourceHelper, + private val sp: SP, + private val rxBus: RxBusWrapper, + private val activePlugin: ActivePluginProvider +) : PluginBase(PluginDescription() + .mainType(PluginType.GENERAL) + .fragmentClass(ConfigBuilderFragment::class.java.name) + .showInList(true) + .alwaysEnabled(true) + .alwaysVisible(false) + .pluginName(R.string.configbuilder) + .shortName(R.string.configbuilder_shortname) + .description(R.string.description_config_builder), + aapsLogger, resourceHelper, injector +) { + + fun initialize() { + (activePlugin as PluginStore).loadDefaults() + loadSettings() + setAlwaysEnabledPluginsEnabled() + rxBus.send(EventAppInitialized()) + } + + private fun setAlwaysEnabledPluginsEnabled() { + for (plugin in activePlugin.pluginsList) { + if (plugin.pluginDescription.alwaysEnabled) plugin.setPluginEnabled(plugin.getType(), true) + } + storeSettings("setAlwaysEnabledPluginsEnabled") + } + + fun storeSettings(from: String) { + activePlugin.pluginsList + aapsLogger.debug(LTag.CONFIGBUILDER, "Storing settings from: $from") + activePlugin.verifySelectionInCategories() + for (p in activePlugin.pluginsList) { + val type = p.getType() + if (p.pluginDescription.alwaysEnabled && p.pluginDescription.alwaysVisible) continue + if (p.pluginDescription.alwaysEnabled && p.pluginDescription.neverVisible) continue + savePref(p, type, true) + if (type == PluginType.PUMP) { + if (p is ProfileInterface) { // Store state of optional Profile interface + savePref(p, PluginType.PROFILE, false) + } + } + } + } + + private fun savePref(p: PluginBase, type: PluginType, storeVisible: Boolean) { + val settingEnabled = "ConfigBuilder_" + type.name + "_" + p.javaClass.simpleName + "_Enabled" + sp.putBoolean(settingEnabled, p.isEnabled(type)) + aapsLogger.debug(LTag.CONFIGBUILDER, "Storing: " + settingEnabled + ":" + p.isEnabled(type)) + if (storeVisible) { + val settingVisible = "ConfigBuilder_" + type.name + "_" + p.javaClass.simpleName + "_Visible" + sp.putBoolean(settingVisible, p.isFragmentVisible()) + aapsLogger.debug(LTag.CONFIGBUILDER, "Storing: " + settingVisible + ":" + p.isFragmentVisible()) + } + } + + private fun loadSettings() { + aapsLogger.debug(LTag.CONFIGBUILDER, "Loading stored settings") + for (p in activePlugin.pluginsList) { + val type = p.getType() + loadPref(p, type, true) + if (p.getType() == PluginType.PUMP) { + if (p is ProfileInterface) { + loadPref(p, PluginType.PROFILE, false) + } + } + } + activePlugin.verifySelectionInCategories() + } + + private fun loadPref(p: PluginBase, type: PluginType, loadVisible: Boolean) { + val settingEnabled = "ConfigBuilder_" + type.name + "_" + p.javaClass.simpleName + "_Enabled" + if (sp.contains(settingEnabled)) p.setPluginEnabled(type, sp.getBoolean(settingEnabled, false)) else if (p.getType() == type && (p.pluginDescription.enableByDefault || p.pluginDescription.alwaysEnabled)) { + p.setPluginEnabled(type, true) + } + aapsLogger.debug(LTag.CONFIGBUILDER, "Loaded: " + settingEnabled + ":" + p.isEnabled(type)) + if (loadVisible) { + val settingVisible = "ConfigBuilder_" + type.name + "_" + p.javaClass.simpleName + "_Visible" + if (sp.contains(settingVisible)) p.setFragmentVisible(type, sp.getBoolean(settingVisible, false) && sp.getBoolean(settingEnabled, false)) else if (p.getType() == type && p.pluginDescription.visibleByDefault) { + p.setFragmentVisible(type, true) + } + aapsLogger.debug(LTag.CONFIGBUILDER, "Loaded: " + settingVisible + ":" + p.isFragmentVisible()) + } + } + + fun logPluginStatus() { + for (p in activePlugin.pluginsList) { + aapsLogger.debug(LTag.CONFIGBUILDER, p.name + ":" + + (if (p.isEnabled(PluginType.GENERAL)) " GENERAL" else "") + + (if (p.isEnabled(PluginType.TREATMENT)) " TREATMENT" else "") + + (if (p.isEnabled(PluginType.SENSITIVITY)) " SENSITIVITY" else "") + + (if (p.isEnabled(PluginType.PROFILE)) " PROFILE" else "") + + (if (p.isEnabled(PluginType.APS)) " APS" else "") + + (if (p.isEnabled(PluginType.PUMP)) " PUMP" else "") + + (if (p.isEnabled(PluginType.CONSTRAINTS)) " CONSTRAINTS" else "") + + (if (p.isEnabled(PluginType.LOOP)) " LOOP" else "") + + (if (p.isEnabled(PluginType.BGSOURCE)) " BGSOURCE" else "") + + if (p.isEnabled(PluginType.INSULIN)) " INSULIN" else "" + ) + } + } + + // Ask when switching to physical pump plugin + fun switchAllowed(changedPlugin: PluginBase, newState: Boolean, activity: FragmentActivity?, type: PluginType) { + if (changedPlugin.getType() == PluginType.PUMP && changedPlugin.name != resourceHelper.gs(R.string.virtualpump)) confirmPumpPluginActivation(changedPlugin, newState, activity, type) else performPluginSwitch(changedPlugin, newState, type) + } + + private fun confirmPumpPluginActivation(changedPlugin: PluginBase, newState: Boolean, activity: FragmentActivity?, type: PluginType) { + val allowHardwarePump = sp.getBoolean("allow_hardware_pump", false) + if (allowHardwarePump || activity == null) { + performPluginSwitch(changedPlugin, newState, type) + } else { + showConfirmation(activity, resourceHelper.gs(R.string.allow_hardware_pump_text), Runnable { + performPluginSwitch(changedPlugin, newState, type) + sp.putBoolean("allow_hardware_pump", true) + aapsLogger.debug(LTag.PUMP, "First time HW pump allowed!") + }, Runnable { + rxBus.send(EventConfigBuilderUpdateGui()) + aapsLogger.debug(LTag.PUMP, "User does not allow switching to HW pump!") + }) + } + } + + fun performPluginSwitch(changedPlugin: PluginBase, enabled: Boolean, type: PluginType) { + changedPlugin.setPluginEnabled(type, enabled) + changedPlugin.setFragmentVisible(type, enabled) + processOnEnabledCategoryChanged(changedPlugin, type) + storeSettings("CheckedCheckboxEnabled") + rxBus.send(EventRebuildTabs()) + rxBus.send(EventConfigBuilderChange()) + rxBus.send(EventConfigBuilderUpdateGui()) + logPluginStatus() + } + + fun processOnEnabledCategoryChanged(changedPlugin: PluginBase, type: PluginType?) { + var pluginsInCategory: ArrayList? = null + when (type) { + PluginType.INSULIN -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(InsulinInterface::class.java) + PluginType.SENSITIVITY -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(SensitivityInterface::class.java) + PluginType.APS -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(APSInterface::class.java) + PluginType.PROFILE -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(ProfileInterface::class.java) + PluginType.BGSOURCE -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(BgSourceInterface::class.java) + PluginType.TREATMENT -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(TreatmentsInterface::class.java) + PluginType.PUMP -> pluginsInCategory = activePlugin.getSpecificPluginsListByInterface(PumpInterface::class.java) + + else -> { + } + } + if (pluginsInCategory != null) { + val newSelection = changedPlugin.isEnabled(type!!) + if (newSelection) { // new plugin selected -> disable others + for (p in pluginsInCategory) { + if (p.name == changedPlugin.name) { + // this is new selected + } else { + p.setPluginEnabled(type, false) + p.setFragmentVisible(type, false) + } + } + } else { // enable first plugin in list + pluginsInCategory[0].setPluginEnabled(type, true) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt index 80947013d5..3479a1f91d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/configBuilder/ProfileFunctionImplementation.kt @@ -86,10 +86,10 @@ class ProfileFunctionImplementation @Inject constructor( } if (activeTreatments.profileSwitchesFromHistory.size() > 0) { val bundle = Bundle() - bundle.putString(FirebaseAnalytics.Param.ITEM_ID, "CatchedError") + bundle.putString(FirebaseAnalytics.Param.ITEM_LIST_ID, "CatchedError") bundle.putString(FirebaseAnalytics.Param.ITEM_CATEGORY, BuildConfig.BUILDVERSION) bundle.putString(FirebaseAnalytics.Param.START_DATE, time.toString()) - bundle.putString(FirebaseAnalytics.Param.VALUE, activeTreatments.profileSwitchesFromHistory.toString()) + bundle.putString(FirebaseAnalytics.Param.ITEM_LIST_NAME, activeTreatments.profileSwitchesFromHistory.toString()) fabricPrivacy.logCustom(bundle) } aapsLogger.error("getProfile at the end: returning null") @@ -113,4 +113,4 @@ class ProfileFunctionImplementation @Inject constructor( profileSwitch.percentage = percentage return profileSwitch } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt index 6c4432c0a8..e2c3025f6c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/actions/ActionsFragment.kt @@ -240,7 +240,7 @@ class ActionsFragment : DaggerFragment() { actions_temptarget?.visibility = Config.APS.toVisibility() actions_tddstats?.visibility = pump.pumpDescription.supportsTDDs.toVisibility() - statusLightHandler.updateAge(careportal_sensorage, careportal_insulinage, careportal_canulaage, careportal_pbage) + statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, null, careportal_sensorage, careportal_pbage, null) checkPumpCustomActions() } @@ -280,4 +280,4 @@ class ActionsFragment : DaggerFragment() { for (customButton in pumpCustomButtons) action_buttons_layout?.removeView(customButton) pumpCustomButtons.clear() } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.kt index 876a067ac4..c21c12c895 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/careportal/CareportalFragment.kt @@ -10,7 +10,6 @@ import info.nightscout.androidaps.events.EventCareportalEventChange import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.general.careportal.Dialogs.NewNSTreatmentDialog -import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus import info.nightscout.androidaps.plugins.general.overview.StatusLightHandler import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.resources.ResourceHelper @@ -23,7 +22,6 @@ import javax.inject.Inject class CareportalFragment : DaggerFragment(), View.OnClickListener { @Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var rxBus: RxBusWrapper - @Inject lateinit var nsSettingsStatus: NSSettingsStatus @Inject lateinit var statusLightHandler: StatusLightHandler @Inject lateinit var fabricPrivacy: FabricPrivacy @Inject lateinit var activePlugin: ActivePluginProvider @@ -133,6 +131,6 @@ class CareportalFragment : DaggerFragment(), View.OnClickListener { } private fun updateGUI() { - statusLightHandler.updateAge(careportal_sensorage, careportal_insulinage, careportal_canulaage, careportal_pbage) + statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, null, careportal_sensorage, careportal_pbage, null) } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java index 8c6480ea86..51f394860a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java @@ -185,15 +185,7 @@ public class NSClientPlugin extends PluginBase { super.preprocessPreferences(preferenceFragment); if (Config.NSCLIENT) { - PreferenceScreen scrnAdvancedSettings = preferenceFragment.findPreference(resourceHelper.gs(R.string.key_advancedsettings)); - if (scrnAdvancedSettings != null) { - scrnAdvancedSettings.removePreference(preferenceFragment.findPreference(resourceHelper.gs(R.string.key_statuslights_res_warning))); - scrnAdvancedSettings.removePreference(preferenceFragment.findPreference(resourceHelper.gs(R.string.key_statuslights_res_critical))); - scrnAdvancedSettings.removePreference(preferenceFragment.findPreference(resourceHelper.gs(R.string.key_statuslights_bat_warning))); - scrnAdvancedSettings.removePreference(preferenceFragment.findPreference(resourceHelper.gs(R.string.key_statuslights_bat_critical))); - scrnAdvancedSettings.removePreference(preferenceFragment.findPreference(resourceHelper.gs(R.string.key_show_statuslights))); - scrnAdvancedSettings.removePreference(preferenceFragment.findPreference(resourceHelper.gs(R.string.key_show_statuslights_extended))); - } + preferenceFragment.findPreference(resourceHelper.gs(R.string.key_statuslights_overview_advanced)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java index 6f070d8245..44ec38041f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSUpload.java @@ -73,11 +73,10 @@ public class NSUpload { } } - public static void uploadTempBasalStartPercent(TemporaryBasal temporaryBasal) { + public static void uploadTempBasalStartPercent(TemporaryBasal temporaryBasal, Profile profile) { try { SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); boolean useAbsolute = SP.getBoolean("ns_sync_use_absolute", false); - Profile profile = ConfigBuilderPlugin.getPlugin().getProfileFunction().getProfile(temporaryBasal.date); double absoluteRate = 0; if (profile != null) { absoluteRate = profile.getBasal(temporaryBasal.date) * temporaryBasal.percentRate / 100d; @@ -264,16 +263,16 @@ public class NSUpload { } } - public static void uploadTempTarget(TempTarget tempTarget) { + public static void uploadTempTarget(TempTarget tempTarget, ProfileFunction profileFunction) { try { JSONObject data = new JSONObject(); data.put("eventType", CareportalEvent.TEMPORARYTARGET); data.put("duration", tempTarget.durationInMinutes); if (tempTarget.low > 0) { data.put("reason", tempTarget.reason); - data.put("targetBottom", Profile.fromMgdlToUnits(tempTarget.low, ConfigBuilderPlugin.getPlugin().getProfileFunction().getUnits())); - data.put("targetTop", Profile.fromMgdlToUnits(tempTarget.high, ConfigBuilderPlugin.getPlugin().getProfileFunction().getUnits())); - data.put("units", ConfigBuilderPlugin.getPlugin().getProfileFunction().getUnits()); + data.put("targetBottom", Profile.fromMgdlToUnits(tempTarget.low, profileFunction.getUnits())); + data.put("targetTop", Profile.fromMgdlToUnits(tempTarget.high, profileFunction.getUnits())); + data.put("units", profileFunction.getUnits()); } data.put("created_at", DateUtil.toISOString(tempTarget.date)); data.put("enteredBy", MainApp.gs(R.string.app_name)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSettingsStatus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSettingsStatus.kt index ae3ec534cd..132d8c9819 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSettingsStatus.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSSettingsStatus.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.general.nsclient.data +import android.content.Context import info.nightscout.androidaps.Config import info.nightscout.androidaps.R import info.nightscout.androidaps.logging.AAPSLogger @@ -10,7 +11,9 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotifi import info.nightscout.androidaps.plugins.general.overview.notifications.Notification import info.nightscout.androidaps.utils.DefaultValueHelper import info.nightscout.androidaps.utils.JsonHelper +import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP import org.json.JSONException import org.json.JSONObject import javax.inject.Inject @@ -111,10 +114,12 @@ class NSSettingsStatus @Inject constructor( private val aapsLogger: AAPSLogger, private val resourceHelper: ResourceHelper, private val rxBus: RxBusWrapper, - private val defaultValueHelper: DefaultValueHelper + private val defaultValueHelper: DefaultValueHelper, + private val sp: SP ) { var nightscoutVersionName = "" + // ***** PUMP STATUS ****** var data: JSONObject? = null @@ -133,6 +138,7 @@ class NSSettingsStatus @Inject constructor( val targetlow = getSettingsThreshold("bgTargetBottom") if (targetHigh != null) defaultValueHelper.bgTargetHigh = targetHigh if (targetlow != null) defaultValueHelper.bgTargetLow = targetlow + copyStatusLightsNsSettings(null) } fun getName(): String? = @@ -152,10 +158,14 @@ class NSSettingsStatus @Inject constructor( // valid property is "warn" or "urgent" // plugings "iage" "sage" "cage" "pbage" - fun getExtendedWarnValue(plugin: String, property: String, defaultValue: Double): Double { - val extendedSettings = getExtendedSettings() ?: return defaultValue - val pluginJson = extendedSettings.optJSONObject(plugin) ?: return defaultValue - return pluginJson.optDouble(property, defaultValue) + fun getExtendedWarnValue(plugin: String, property: String): Double? { + val extendedSettings = getExtendedSettings() ?: return null + val pluginJson = extendedSettings.optJSONObject(plugin) ?: return null + try { + return pluginJson.getDouble(property) + } catch (e: Exception) { + return null + } } // "bgHigh": 252, @@ -211,4 +221,20 @@ class NSSettingsStatus @Inject constructor( val openaps = JsonHelper.safeGetJSONObject(getExtendedSettings(), "openaps", null) return JsonHelper.safeGetBoolean(openaps, "enableAlerts") } -} \ No newline at end of file + + fun copyStatusLightsNsSettings(context: Context?) { + val action = Runnable { + getExtendedWarnValue("cage", "warn")?.let { sp.putDouble(R.string.key_statuslights_cage_warning, it) } + getExtendedWarnValue("cage", "urgent")?.let { sp.putDouble(R.string.key_statuslights_cage_critical, it) } + getExtendedWarnValue("iage", "warn")?.let { sp.putDouble(R.string.key_statuslights_iage_warning, it) } + getExtendedWarnValue("iage", "urgent")?.let { sp.putDouble(R.string.key_statuslights_iage_critical, it) } + getExtendedWarnValue("sage", "warn")?.let { sp.putDouble(R.string.key_statuslights_sage_warning, it) } + getExtendedWarnValue("sage", "urgent")?.let { sp.putDouble(R.string.key_statuslights_sage_critical, it) } + getExtendedWarnValue("bage", "warn")?.let { sp.putDouble(R.string.key_statuslights_bage_warning, it) } + getExtendedWarnValue("bage", "urgent")?.let { sp.putDouble(R.string.key_statuslights_bage_critical, it) } + } + + if (context != null) OKDialog.showConfirmation(context, resourceHelper.gs(R.string.statuslights), resourceHelper.gs(R.string.copyexistingvalues), action) + else action.run() + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index d56d8d9afe..b1b4233b35 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -68,8 +68,13 @@ import info.nightscout.androidaps.utils.wizard.QuickWizard import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers -import kotlinx.android.synthetic.main.careportal_stats_fragment.* import kotlinx.android.synthetic.main.overview_fragment.* +import kotlinx.android.synthetic.main.overview_fragment.careportal_canulaage +import kotlinx.android.synthetic.main.overview_fragment.careportal_insulinage +import kotlinx.android.synthetic.main.overview_fragment.careportal_reservoirlevel +import kotlinx.android.synthetic.main.overview_fragment.careportal_sensorage +import kotlinx.android.synthetic.main.overview_fragment.careportal_pbage +import kotlinx.android.synthetic.main.overview_fragment.careportal_batterylevel import kotlinx.android.synthetic.main.overview_fragment.overview_activeprofile import kotlinx.android.synthetic.main.overview_fragment.overview_apsmode import kotlinx.android.synthetic.main.overview_fragment.overview_arrow @@ -714,15 +719,9 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } } - // NSClient mode - statusLightHandler.updateAge(careportal_sensorage, careportal_insulinage, careportal_canulaage, careportal_pbage) - // Mode modes - if (sp.getBoolean(R.string.key_show_statuslights, false)) { - if (sp.getBoolean(R.string.key_show_statuslights_extended, false)) - statusLightHandler.extendedStatusLight(overview_canulaage, overview_insulinage, overview_reservoirlevel, overview_sensorage, overview_batterylevel) - else - statusLightHandler.statusLight(overview_canulaage, overview_insulinage, overview_reservoirlevel, overview_sensorage, overview_batterylevel) - } + // Status lights + overview_statuslights?.visibility = (sp.getBoolean(R.string.key_show_statuslights, true) || Config.NSCLIENT).toVisibility() + statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, careportal_reservoirlevel, careportal_sensorage, careportal_pbage, careportal_batterylevel) // cob var cobText: String = resourceHelper.gs(R.string.value_unavailable_short) @@ -755,7 +754,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList // ****** GRAPH ******* GlobalScope.launch(Dispatchers.Main) { - overview_bggraph?: return@launch + overview_bggraph ?: return@launch val graphData = GraphData(injector, overview_bggraph, iobCobCalculatorPlugin) val secondaryGraphsData: ArrayList = ArrayList() @@ -868,4 +867,4 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt index 79b1c80ba1..89f500a758 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/StatusLightHandler.kt @@ -1,17 +1,15 @@ package info.nightscout.androidaps.plugins.general.overview -import android.graphics.Color -import android.view.View import android.widget.TextView -import androidx.arch.core.util.Function +import androidx.annotation.StringRes +import info.nightscout.androidaps.Config import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.db.CareportalEvent import info.nightscout.androidaps.interfaces.ActivePluginProvider -import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus import info.nightscout.androidaps.plugins.pump.common.defs.PumpType import info.nightscout.androidaps.utils.DecimalFormatter -import info.nightscout.androidaps.utils.SetWarnColor +import info.nightscout.androidaps.utils.WarnColors import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP import javax.inject.Inject @@ -19,154 +17,44 @@ import javax.inject.Singleton @Singleton class StatusLightHandler @Inject constructor( - private val nsSettingsStatus: NSSettingsStatus, private val resourceHelper: ResourceHelper, private val sp: SP, - private val activePlugin: ActivePluginProvider + private val activePlugin: ActivePluginProvider, + private val warnColors: WarnColors ) { - /** - * applies the statusLight subview on the overview fragment - */ - fun statusLight(cageView: TextView?, iAgeView: TextView?, reservoirView: TextView?, - sageView: TextView?, batteryView: TextView?) { - val pump = activePlugin.activePump - applyStatusLight("cage", CareportalEvent.SITECHANGE, cageView, "CAN", 48, 72) - applyStatusLight("iage", CareportalEvent.INSULINCHANGE, iAgeView, "INS", 72, 96) - val reservoirLevel = if (pump.isInitialized) pump.reservoirLevel else (-1).toDouble() - applyStatusLightLevel(R.string.key_statuslights_res_critical, 10.0, - R.string.key_statuslights_res_warning, 80.0, reservoirView, "RES", reservoirLevel) - applyStatusLight("sage", CareportalEvent.SENSORCHANGE, sageView, "SEN", 164, 166) - if (pump.model() != PumpType.AccuChekCombo) { - val batteryLevel = if (pump.isInitialized) pump.batteryLevel.toDouble() else -1.0 - applyStatusLightLevel(R.string.key_statuslights_bat_critical, 5.0, - R.string.key_statuslights_bat_warning, 22.0, - batteryView, "BAT", batteryLevel) - } else { - applyStatusLight("bage", CareportalEvent.PUMPBATTERYCHANGE, batteryView, "BAT", 224, 336) - } - } - - private fun applyStatusLight(nsSettingPlugin: String?, eventName: String?, view: TextView?, text: String?, - defaultWarnThreshold: Int, defaultUrgentThreshold: Int) { - if (view != null) { - val urgent = nsSettingsStatus.getExtendedWarnValue(nsSettingPlugin!!, "urgent", defaultUrgentThreshold.toDouble()) - val warn = nsSettingsStatus.getExtendedWarnValue(nsSettingPlugin, "warn", defaultWarnThreshold.toDouble()) - val event = MainApp.getDbHelper().getLastCareportalEvent(eventName) - val age = event?.hoursFromStart ?: Double.MAX_VALUE - applyStatusLight(view, text, age, warn, urgent, Double.MAX_VALUE, true) - } - } - - private fun applyStatusLightLevel(criticalSetting: Int, criticalDefaultValue: Double, - warnSetting: Int, warnDefaultValue: Double, - view: TextView?, text: String?, level: Double) { - if (view != null) { - val resUrgent = sp.getDouble(criticalSetting, criticalDefaultValue) - val resWarn = sp.getDouble(warnSetting, warnDefaultValue) - applyStatusLight(view, text, level, resWarn, resUrgent, -1.0, false) - } - } - - private fun applyStatusLight(view: TextView, text: String?, value: Double, warnThreshold: Double, - urgentThreshold: Double, invalid: Double, checkAscending: Boolean) { - val check = - if (checkAscending) Function { threshold: Double -> value >= threshold } - else Function { threshold: Double -> value <= threshold } - if (value != invalid) { - view.text = text - when { - check.apply(urgentThreshold) -> view.setTextColor(resourceHelper.gc(R.color.ribbonCritical)) - check.apply(warnThreshold) -> view.setTextColor(resourceHelper.gc(R.color.ribbonWarning)) - else -> view.setTextColor(resourceHelper.gc(R.color.ribbonDefault)) - } - view.visibility = View.VISIBLE - } else { - view.visibility = View.GONE - } - } - /** * applies the extended statusLight subview on the overview fragment */ - fun extendedStatusLight(cageView: TextView?, iAgeView: TextView?, - reservoirView: TextView?, sageView: TextView?, - batteryView: TextView?) { + fun updateStatusLights(careportal_canulaage: TextView?, careportal_insulinage: TextView?, careportal_reservoirlevel: TextView?, careportal_sensorage: TextView?, careportal_pbage: TextView?, careportal_batterylevel: TextView?) { val pump = activePlugin.activePump - handleAge("cage", CareportalEvent.SITECHANGE, cageView, "CAN ", - 48, 72) - handleAge("iage", CareportalEvent.INSULINCHANGE, iAgeView, "INS ", - 72, 96) - handleLevel(R.string.key_statuslights_res_critical, 10.0, - R.string.key_statuslights_res_warning, 80.0, - reservoirView, "RES ", pump.reservoirLevel) - handleAge("sage", CareportalEvent.SENSORCHANGE, sageView, "SEN ", - 164, 166) - if (pump.model() != PumpType.AccuChekCombo) { - handleLevel(R.string.key_statuslights_bat_critical, 26.0, - R.string.key_statuslights_bat_warning, 51.0, - batteryView, "BAT ", pump.batteryLevel.toDouble()) - } else { - handleAge("bage", CareportalEvent.PUMPBATTERYCHANGE, batteryView, "BAT ", - 224, 336) - } + handleAge(careportal_canulaage, "cage", CareportalEvent.SITECHANGE, R.string.key_statuslights_cage_warning, 48.0, R.string.key_statuslights_cage_critical, 72.0) + handleAge(careportal_insulinage, "iage", CareportalEvent.INSULINCHANGE, R.string.key_statuslights_iage_warning, 72.0, R.string.key_statuslights_iage_critical, 144.0) + handleAge(careportal_sensorage, "sage", CareportalEvent.SENSORCHANGE, R.string.key_statuslights_sage_warning, 216.0, R.string.key_statuslights_sage_critical, 240.0) + handleAge(careportal_pbage, "bage", CareportalEvent.PUMPBATTERYCHANGE, R.string.key_statuslights_bage_warning, 216.0, R.string.key_statuslights_bage_critical, 240.0) + if (!Config.NSCLIENT) + handleLevel(careportal_reservoirlevel, R.string.key_statuslights_res_critical, 10.0, R.string.key_statuslights_res_warning, 80.0, pump.reservoirLevel) + if (!Config.NSCLIENT && pump.model() != PumpType.AccuChekCombo) + handleLevel(careportal_batterylevel, R.string.key_statuslights_bat_critical, 26.0, R.string.key_statuslights_bat_warning, 51.0, pump.batteryLevel.toDouble()) } - private fun handleAge(nsSettingPlugin: String, eventName: String, view: TextView?, text: String, - defaultWarnThreshold: Int, defaultUrgentThreshold: Int) { - val urgent = nsSettingsStatus.getExtendedWarnValue(nsSettingPlugin, "urgent", defaultUrgentThreshold.toDouble()) - val warn = nsSettingsStatus.getExtendedWarnValue(nsSettingPlugin, "warn", defaultWarnThreshold.toDouble()) - handleAge(view, text, eventName, warn, urgent) - } - - private fun handleLevel(criticalSetting: Int, criticalDefaultValue: Double, - warnSetting: Int, warnDefaultValue: Double, - view: TextView?, text: String, level: Double) { - if (view != null) { - val resUrgent = sp.getDouble(criticalSetting, criticalDefaultValue) - val resWarn = sp.getDouble(warnSetting, warnDefaultValue) - @Suppress("SetTextI18n") - view.text = text + DecimalFormatter.to0Decimal(level) - SetWarnColor.setColorInverse(view, level, resWarn, resUrgent) - } - } - - private fun handleAge(age: TextView?, eventType: String, warnThreshold: Double, urgentThreshold: Double) = - handleAge(age, "", eventType, warnThreshold, urgentThreshold) - - fun handleAge(age: TextView?, prefix: String, eventType: String, warnThreshold: Double, urgentThreshold: Double) { - val notavailable = if (resourceHelper.shortTextMode()) "-" else resourceHelper.gs(R.string.notavailable) - val careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(eventType) + private fun handleAge(view: TextView?, nsSettingPlugin: String, eventName: String, @StringRes warnSettings: Int, defaultWarnThreshold: Double, @StringRes urgentSettings: Int, defaultUrgentThreshold: Double) { + val warn = sp.getDouble(warnSettings, defaultWarnThreshold) + val urgent = sp.getDouble(urgentSettings, defaultUrgentThreshold) + val careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(eventName) if (careportalEvent != null) { - age?.setTextColor(determineTextColor(careportalEvent, warnThreshold, urgentThreshold)) - age?.text = prefix + careportalEvent.age(resourceHelper.shortTextMode()) + warnColors.setColorByAge(view, careportalEvent, warn, urgent) + view?.text = careportalEvent.age(resourceHelper.shortTextMode(), resourceHelper) } else { - age?.text = notavailable + view?.text = if (resourceHelper.shortTextMode()) "-" else resourceHelper.gs(R.string.notavailable) } } - fun updateAge(sage: TextView?, iage: TextView?, cage: TextView?, pbage: TextView?) { - val iageUrgent = nsSettingsStatus.getExtendedWarnValue("iage", "urgent", 96.0) - val iageWarn = nsSettingsStatus.getExtendedWarnValue("iage", "warn", 72.0) - handleAge(iage, CareportalEvent.INSULINCHANGE, iageWarn, iageUrgent) - val cageUrgent = nsSettingsStatus.getExtendedWarnValue("cage", "urgent", 72.0) - val cageWarn = nsSettingsStatus.getExtendedWarnValue("cage", "warn", 48.0) - handleAge(cage, CareportalEvent.SITECHANGE, cageWarn, cageUrgent) - val sageUrgent = nsSettingsStatus.getExtendedWarnValue("sage", "urgent", 166.0) - val sageWarn = nsSettingsStatus.getExtendedWarnValue("sage", "warn", 164.0) - handleAge(sage, CareportalEvent.SENSORCHANGE, sageWarn, sageUrgent) - val pbageUrgent = nsSettingsStatus.getExtendedWarnValue("bage", "urgent", 360.0) - val pbageWarn = nsSettingsStatus.getExtendedWarnValue("bage", "warn", 240.0) - handleAge(pbage, CareportalEvent.PUMPBATTERYCHANGE, pbageWarn, pbageUrgent) + private fun handleLevel(view: TextView?, criticalSetting: Int, criticalDefaultValue: Double, warnSetting: Int, warnDefaultValue: Double, level: Double) { + val resUrgent = sp.getDouble(criticalSetting, criticalDefaultValue) + val resWarn = sp.getDouble(warnSetting, warnDefaultValue) + @Suppress("SetTextI18n") + view?.text = " " + DecimalFormatter.to0Decimal(level) + warnColors.setColorInverse(view, level, resWarn, resUrgent) } - - fun determineTextColor(careportalEvent: CareportalEvent, warnThreshold: Double, urgentThreshold: Double): Int { - return if (careportalEvent.isOlderThan(urgentThreshold)) { - resourceHelper.gc(R.color.low) - } else if (careportalEvent.isOlderThan(warnThreshold)) { - resourceHelper.gc(R.color.high) - } else { - Color.WHITE - } - } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationWithAction.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationWithAction.kt index c5670699c9..bb6f47935d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationWithAction.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/notifications/NotificationWithAction.kt @@ -6,7 +6,6 @@ import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.general.nsclient.NSClientPlugin import info.nightscout.androidaps.plugins.general.nsclient.data.NSAlarm -import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus import info.nightscout.androidaps.utils.DefaultValueHelper import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.resources.ResourceHelper @@ -21,7 +20,6 @@ class NotificationWithAction constructor( @Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var sp: SP @Inject lateinit var defaultValueHelper: DefaultValueHelper - @Inject lateinit var nsSettingsStatus: NSSettingsStatus @Inject lateinit var nsClientPlugin: NSClientPlugin private var nsAlarm: NSAlarm? = null @@ -78,4 +76,4 @@ class NotificationWithAction constructor( this.action = action } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java index 5cff3b56c8..915f3b973b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java @@ -470,7 +470,7 @@ public class IobCobCalculatorPlugin extends PluginBase { // OpenAPSSMB only // Add expected zero temp basal for next 240 mins IobTotal basalIobWithZeroTemp = basalIob.copy(); - TemporaryBasal t = new TemporaryBasal() + TemporaryBasal t = new TemporaryBasal(injector) .date(now + 60 * 1000L) .duration(240) .absolute(0); @@ -517,7 +517,7 @@ public class IobCobCalculatorPlugin extends PluginBase { // OpenAPSSMB only // Add expected zero temp basal for next 240 mins IobTotal basalIobWithZeroTemp = basalIob.copy(); - TemporaryBasal t = new TemporaryBasal() + TemporaryBasal t = new TemporaryBasal(injector) .date(now + 60 * 1000L) .duration(240) .absolute(0); @@ -919,4 +919,4 @@ public class IobCobCalculatorPlugin extends PluginBase { if (upper >= arr.length) return arr[(int) lower]; return arr[(int) lower] * (1 - weight) + arr[(int) upper] * weight; } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java index 43fdc571f0..0ec21a8014 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ComboPlugin.java @@ -777,7 +777,7 @@ public class ComboPlugin extends PumpPluginBase implements PumpInterface, Constr PumpState state = commandResult.state; if (state.tbrActive && state.tbrPercent == adjustedPercent && (state.tbrRemainingDuration == durationInMinutes || state.tbrRemainingDuration == durationInMinutes - 1)) { - TemporaryBasal tempStart = new TemporaryBasal() + TemporaryBasal tempStart = new TemporaryBasal(getInjector()) .date(state.timestamp) .duration(state.tbrRemainingDuration) .percent(state.tbrPercent) @@ -823,7 +823,7 @@ public class ComboPlugin extends PumpPluginBase implements PumpInterface, Constr return new PumpEnactResult(getInjector()).success(false).enacted(false); } if (!cancelResult.state.tbrActive) { - TemporaryBasal tempBasal = new TemporaryBasal() + TemporaryBasal tempBasal = new TemporaryBasal(getInjector()) .date(cancelResult.state.timestamp) .duration(0) .source(Source.USER); @@ -974,7 +974,7 @@ public class ComboPlugin extends PumpPluginBase implements PumpInterface, Constr TemporaryBasal aapsTbr = treatmentsPlugin.getTempBasalFromHistory(now); if (aapsTbr == null || aapsTbr.percentRate != 0) { getAapsLogger().debug(LTag.PUMP, "Creating 15m zero temp since pump is suspended"); - TemporaryBasal newTempBasal = new TemporaryBasal() + TemporaryBasal newTempBasal = new TemporaryBasal(getInjector()) .date(now) .percent(0) .duration(15) @@ -1100,7 +1100,7 @@ public class ComboPlugin extends PumpPluginBase implements PumpInterface, Constr TemporaryBasal aapsTbr = treatmentsPlugin.getTempBasalFromHistory(now); if (aapsTbr == null && state.tbrActive && state.tbrRemainingDuration > 2) { getAapsLogger().debug(LTag.PUMP, "Creating temp basal from pump TBR"); - TemporaryBasal newTempBasal = new TemporaryBasal() + TemporaryBasal newTempBasal = new TemporaryBasal(getInjector()) .date(now) .percent(state.tbrPercent) .duration(state.tbrRemainingDuration) @@ -1108,7 +1108,7 @@ public class ComboPlugin extends PumpPluginBase implements PumpInterface, Constr treatmentsPlugin.addToHistoryTempBasal(newTempBasal); } else if (aapsTbr != null && aapsTbr.getPlannedRemainingMinutes() > 2 && !state.tbrActive) { getAapsLogger().debug(LTag.PUMP, "Ending AAPS-TBR since pump has no TBR active"); - TemporaryBasal tempStop = new TemporaryBasal() + TemporaryBasal tempStop = new TemporaryBasal(getInjector()) .date(now) .duration(0) .source(Source.USER); @@ -1117,13 +1117,13 @@ public class ComboPlugin extends PumpPluginBase implements PumpInterface, Constr && (aapsTbr.percentRate != state.tbrPercent || Math.abs(aapsTbr.getPlannedRemainingMinutes() - state.tbrRemainingDuration) > 2)) { getAapsLogger().debug(LTag.PUMP, "AAPSs and pump-TBR differ; ending AAPS-TBR and creating new TBR based on pump TBR"); - TemporaryBasal tempStop = new TemporaryBasal() + TemporaryBasal tempStop = new TemporaryBasal(getInjector()) .date(now - 1000) .duration(0) .source(Source.USER); treatmentsPlugin.addToHistoryTempBasal(tempStop); - TemporaryBasal newTempBasal = new TemporaryBasal() + TemporaryBasal newTempBasal = new TemporaryBasal(getInjector()) .date(now) .percent(state.tbrPercent) .duration(state.tbrRemainingDuration) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java index a18d917666..ebea05f906 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/PumpPluginAbstract.java @@ -6,6 +6,7 @@ import android.content.ServiceConnection; import androidx.annotation.NonNull; +import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.json.JSONObject; @@ -30,10 +31,8 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.PumpPluginBase; import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.bus.RxBus; import info.nightscout.androidaps.plugins.bus.RxBusWrapper; import info.nightscout.androidaps.plugins.common.ManufacturerType; -import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.pump.common.data.PumpStatus; import info.nightscout.androidaps.plugins.pump.common.defs.PumpDriverState; @@ -43,7 +42,6 @@ import info.nightscout.androidaps.plugins.treatments.Treatment; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.DecimalFormatter; import info.nightscout.androidaps.utils.FabricPrivacy; -import info.nightscout.androidaps.utils.TimeChangeType; import info.nightscout.androidaps.utils.resources.ResourceHelper; import info.nightscout.androidaps.utils.sharedPreferences.SP; import io.reactivex.disposables.CompositeDisposable; @@ -78,6 +76,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI // protected boolean isInitialized = false; protected PumpDriverState pumpState = PumpDriverState.NotInitialized; protected boolean displayConnectionMessages = false; + protected PumpType pumpType; protected PumpPluginAbstract( @@ -103,8 +102,7 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI this.sp = sp; pumpDescription.setPumpDescription(pumpType); - - initPumpStatusData(); + this.pumpType = pumpType; } @@ -446,11 +444,35 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI } - - // removed from dev -// public boolean isLoggingEnabled() { -// return L.isEnabled(L.PUMP); -// } + + protected void refreshCustomActionsList() { + rxBus.send(new EventCustomActionsChanged()); + } + + + public ManufacturerType manufacturer() { + return pumpType.getManufacturer() ; + } + + @NotNull + public PumpType model() { + return pumpType; + } + + + public PumpType getPumpType() { + return pumpType; + } + + + public void setPumpType(PumpType pumpType) { + this.pumpType = pumpType; + } + + + public boolean canHandleDST() { + return false; + } protected abstract PumpEnactResult deliverBolus(DetailedBolusInfo detailedBolusInfo); @@ -461,37 +483,4 @@ public abstract class PumpPluginAbstract extends PumpPluginBase implements PumpI return new PumpEnactResult(getInjector()).success(false).enacted(false).comment(getResourceHelper().gs(resourceId)); } - - // removed from dev - @Override - public boolean canHandleDST() { - return false; - } - - - // removed from dev - @Override - public ManufacturerType manufacturer() { - return pumpStatus.pumpType.getManufacturer(); - } - - // removed from dev - @Override - public PumpType model() { - return pumpStatus.pumpType; - } - - - // removed from dev - @Override - public void timezoneOrDSTChanged(TimeChangeType timeChangeType) { - } - - - // removed from dev - public void refreshCustomActionsList() { - rxBus.send(new EventCustomActionsChanged()); - } - - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.java index 6f629c2414..41c4028f96 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/hw/rileylink/service/RileyLinkService.java @@ -33,9 +33,9 @@ import static info.nightscout.androidaps.plugins.pump.common.hw.rileylink.RileyL */ public abstract class RileyLinkService extends DaggerService { - @Inject AAPSLogger aapsLogger; - @Inject SP sp; - @Inject Context context; + @Inject protected AAPSLogger aapsLogger; + @Inject protected SP sp; + @Inject protected Context context; public RileyLinkBLE rileyLinkBLE; // android-bluetooth management @@ -48,7 +48,6 @@ public abstract class RileyLinkService extends DaggerService { @Override public void onCreate() { super.onCreate(); - //LOG.debug("onCreate"); RileyLinkUtil.setContext(this.context); RileyLinkUtil.setRileyLinkService(this); @@ -61,8 +60,6 @@ public abstract class RileyLinkService extends DaggerService { bluetoothStateReceiver = new RileyLinkBluetoothStateReceiver(); bluetoothStateReceiver.registerBroadcasts(this); - - //LOG.debug("onCreate(): It's ALIVE!"); } /** diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java index 79db836a40..4fe2815bdc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/AbstractDanaRPlugin.java @@ -489,4 +489,5 @@ public abstract class AbstractDanaRPlugin extends PumpPluginBase implements Pump public void timezoneOrDSTChanged(TimeChangeType timeChangeType) { } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/DanaRFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/DanaRFragment.kt index 2e7104c9e1..60420d6d70 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/DanaRFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/DanaRFragment.kt @@ -27,8 +27,8 @@ import info.nightscout.androidaps.plugins.pump.danaRKorean.DanaRKoreanPlugin import info.nightscout.androidaps.queue.events.EventQueueChanged import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy -import info.nightscout.androidaps.utils.SetWarnColor import info.nightscout.androidaps.utils.T +import info.nightscout.androidaps.utils.WarnColors import info.nightscout.androidaps.utils.extensions.plusAssign import info.nightscout.androidaps.utils.resources.ResourceHelper import io.reactivex.android.schedulers.AndroidSchedulers @@ -45,6 +45,7 @@ class DanaRFragment : DaggerFragment() { @Inject lateinit var danaRKoreanPlugin: DanaRKoreanPlugin @Inject lateinit var danaRPump: DanaRPump @Inject lateinit var resourceHelper: ResourceHelper + @Inject lateinit var warnColors: WarnColors private var disposable: CompositeDisposable = CompositeDisposable() @@ -157,7 +158,7 @@ class DanaRFragment : DaggerFragment() { val agoMsec = System.currentTimeMillis() - pump.lastConnection val agoMin = (agoMsec.toDouble() / 60.0 / 1000.0).toInt() danar_lastconnection.text = DateUtil.timeString(pump.lastConnection) + " (" + resourceHelper.gs(R.string.minago, agoMin) + ")" - SetWarnColor.setColor(danar_lastconnection, agoMin.toDouble(), 16.0, 31.0) + warnColors.setColor(danar_lastconnection, agoMin.toDouble(), 16.0, 31.0) } if (pump.lastBolusTime != 0L) { val agoMsec = System.currentTimeMillis() - pump.lastBolusTime @@ -170,7 +171,7 @@ class DanaRFragment : DaggerFragment() { } danar_dailyunits.text = resourceHelper.gs(R.string.reservoirvalue, pump.dailyTotalUnits, pump.maxDailyTotalUnits) - SetWarnColor.setColor(danar_dailyunits, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75, pump.maxDailyTotalUnits * 0.9) + warnColors.setColor(danar_dailyunits, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75, pump.maxDailyTotalUnits * 0.9) danar_basabasalrate.text = "( " + (pump.activeProfile + 1) + " ) " + resourceHelper.gs(R.string.pump_basebasalrate, plugin.baseBasalRate) // DanaRPlugin, DanaRKoreanPlugin if (activePlugin.activePump.isFakingTempsByExtendedBoluses == true) { @@ -184,9 +185,9 @@ class DanaRFragment : DaggerFragment() { danar_extendedbolus.text = activePlugin.activeTreatments.getExtendedBolusFromHistory(System.currentTimeMillis())?.toString() ?: "" danar_reservoir.text = resourceHelper.gs(R.string.reservoirvalue, pump.reservoirRemainingUnits, 300) - SetWarnColor.setColorInverse(danar_reservoir, pump.reservoirRemainingUnits, 50.0, 20.0) + warnColors.setColorInverse(danar_reservoir, pump.reservoirRemainingUnits, 50.0, 20.0) danar_battery.text = "{fa-battery-" + pump.batteryRemaining / 25 + "}" - SetWarnColor.setColorInverse(danar_battery, pump.batteryRemaining.toDouble(), 51.0, 26.0) + warnColors.setColorInverse(danar_battery, pump.batteryRemaining.toDouble(), 51.0, 26.0) danar_iob.text = resourceHelper.gs(R.string.formatinsulinunits, pump.iob) if (pump.model != 0 || pump.protocol != 0 || pump.productCode != 0) { danar_firmware.text = resourceHelper.gs(R.string.danar_model, pump.model, pump.protocol, pump.productCode) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableR.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableR.kt index 22c27a9c5e..a0cb2ae0c8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableR.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableR.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.danaR.comm +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider import info.nightscout.androidaps.logging.AAPSLogger @@ -25,7 +26,8 @@ class MessageHashTableR @Inject constructor( danaRKoreanPlugin: DanaRKoreanPlugin, configBuilderPlugin: ConfigBuilderPlugin, commandQueue: CommandQueueProvider, - activePlugin: ActivePluginProvider + activePlugin: ActivePluginProvider, + injector: HasAndroidInjector ) : MessageHashTableBase { var messages: HashMap = HashMap() @@ -36,7 +38,7 @@ class MessageHashTableR @Inject constructor( put(MsgBolusStartWithSpeed(aapsLogger, constraintChecker, danaRPump, 0.0, 0)) // 0x0104 CMD_MEALINS_START_DATA_SPEED put(MsgBolusProgress(aapsLogger, resourceHelper, rxBus, danaRPump)) // 0x0202 CMD_PUMP_THIS_REMAINDER_MEAL_INS put(MsgStatusProfile(aapsLogger, danaRPump)) // 0x0204 CMD_PUMP_CALCULATION_SETTING - put(MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin)) // 0x0205 CMD_PUMP_EXERCISE_MODE + put(MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector)) // 0x0205 CMD_PUMP_EXERCISE_MODE put(MsgStatusBolusExtended(aapsLogger, danaRPump, activePlugin)) // 0x0207 CMD_PUMP_EXPANS_INS_I put(MsgStatusBasic(aapsLogger, danaRPump)) // 0x020A CMD_PUMP_INITVIEW_I put(MsgStatus(aapsLogger, danaRPump)) // 0x020B CMD_PUMP_STATUS diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasal.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasal.kt index 452d911819..c8c73f3324 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasal.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasal.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.danaR.comm +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.db.Source import info.nightscout.androidaps.db.TemporaryBasal import info.nightscout.androidaps.interfaces.ActivePluginProvider @@ -11,7 +12,8 @@ import kotlin.math.ceil class MsgStatusTempBasal( private val aapsLogger: AAPSLogger, private val danaRPump: DanaRPump, - private val activePlugin: ActivePluginProvider + private val activePlugin: ActivePluginProvider, + private val injector: HasAndroidInjector ) : MessageBase() { init { @@ -52,10 +54,10 @@ class MsgStatusTempBasal( val tempBasal = activePlugin.activeTreatments.getRealTempBasalFromHistory(System.currentTimeMillis()) if (danaRPump.isTempBasalInProgress) { if (tempBasal.percentRate != danaRPump.tempBasalPercent) { // Close current temp basal - val tempStop = TemporaryBasal().date(danaRPump.tempBasalStart - 1000).source(Source.USER) + val tempStop = TemporaryBasal(injector).date(danaRPump.tempBasalStart - 1000).source(Source.USER) activePlugin.activeTreatments.addToHistoryTempBasal(tempStop) // Create new - val newTempBasal = TemporaryBasal() + val newTempBasal = TemporaryBasal(injector) .date(danaRPump.tempBasalStart) .percent(danaRPump.tempBasalPercent) .duration(danaRPump.tempBasalTotalSec / 60) @@ -63,12 +65,12 @@ class MsgStatusTempBasal( activePlugin.activeTreatments.addToHistoryTempBasal(newTempBasal) } } else { // Close current temp basal - val tempStop = TemporaryBasal().date(now).source(Source.USER) + val tempStop = TemporaryBasal(injector).date(now).source(Source.USER) activePlugin.activeTreatments.addToHistoryTempBasal(tempStop) } } else { if (danaRPump.isTempBasalInProgress) { // Create new - val newTempBasal = TemporaryBasal() + val newTempBasal = TemporaryBasal(injector) .date(danaRPump.tempBasalStart) .percent(danaRPump.tempBasalPercent) .duration(danaRPump.tempBasalTotalSec / 60) @@ -77,4 +79,4 @@ class MsgStatusTempBasal( } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/AbstractDanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/AbstractDanaRExecutionService.java index 743b0109f9..f93ce4a780 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/AbstractDanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/AbstractDanaRExecutionService.java @@ -55,7 +55,7 @@ import io.reactivex.schedulers.Schedulers; */ public abstract class AbstractDanaRExecutionService extends DaggerService { - @Inject HasAndroidInjector injector; + @Inject protected HasAndroidInjector injector; @Inject AAPSLogger aapsLogger; @Inject RxBusWrapper rxBus; @Inject SP sp; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/DanaRExecutionService.java index 1a677f60e6..af5c6ef814 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaR/services/DanaRExecutionService.java @@ -11,6 +11,7 @@ import java.util.Date; import javax.inject.Inject; +import dagger.android.HasAndroidInjector; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; @@ -91,6 +92,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { @Inject ActivePluginProvider activePlugin; @Inject ProfileFunction profileFunction; @Inject SP sp; + @Inject HasAndroidInjector injector; public DanaRExecutionService() { } @@ -147,7 +149,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(aapsLogger, danaRPump); MsgStatusBasic statusBasicMsg = new MsgStatusBasic(aapsLogger, danaRPump); - MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin); + MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector); MsgStatusBolusExtended exStatusMsg = new MsgStatusBolusExtended(aapsLogger, danaRPump, activePlugin); MsgCheckValue checkValue = new MsgCheckValue(aapsLogger, danaRPump, danaRPlugin); @@ -239,7 +241,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { } rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(aapsLogger, percent, durationInHours)); - mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin)); + mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector)); rxBus.send(new EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING)); return true; } @@ -248,7 +250,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { if (!isConnected()) return false; rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop(aapsLogger)); - mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin)); + mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector)); rxBus.send(new EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING)); return true; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKorean.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKorean.kt index 07491b0721..5e09f02a5d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKorean.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKorean.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.danaRKorean.comm +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider import info.nightscout.androidaps.logging.AAPSLogger @@ -26,7 +27,8 @@ class MessageHashTableRKorean @Inject constructor( danaRKoreanPlugin: DanaRKoreanPlugin, configBuilderPlugin: ConfigBuilderPlugin, commandQueue: CommandQueueProvider, - activePlugin: ActivePluginProvider + activePlugin: ActivePluginProvider, + injector: HasAndroidInjector ) : MessageHashTableBase { var messages: HashMap = HashMap() @@ -36,7 +38,7 @@ class MessageHashTableRKorean @Inject constructor( put(MsgBolusStart(aapsLogger, constraintChecker, danaRPump, 0.0)) // 0x0102 CMD_MEALINS_START_DATA put(MsgBolusProgress(aapsLogger, resourceHelper, rxBus, danaRPump)) // 0x0202 CMD_PUMP_THIS_REMAINDER_MEAL_INS put(MsgStatusProfile(aapsLogger, danaRPump)) // 0x0204 CMD_PUMP_CALCULATION_SETTING - put(MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin)) // 0x0205 CMD_PUMP_EXERCISE_MODE + put(MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector)) // 0x0205 CMD_PUMP_EXERCISE_MODE put(MsgStatusBolusExtended(aapsLogger, danaRPump, activePlugin)) // 0x0207 CMD_PUMP_EXPANS_INS_I put(MsgStatusBasic_k(aapsLogger, danaRPump)) // 0x020A CMD_PUMP_INITVIEW_I put(MsgStatus_k(aapsLogger, danaRPump)) // 0x020B CMD_PUMP_STATUS diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/services/DanaRKoreanExecutionService.java index a0b11102b4..44fb504e79 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRKorean/services/DanaRKoreanExecutionService.java @@ -138,7 +138,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.gettingpumpstatus))); //MsgStatus_k statusMsg = new MsgStatus_k(); MsgStatusBasic_k statusBasicMsg = new MsgStatusBasic_k(aapsLogger, danaRPump); - MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin); + MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector); MsgStatusBolusExtended exStatusMsg = new MsgStatusBolusExtended(aapsLogger, danaRPump, activePlugin); MsgCheckValue_k checkValue = new MsgCheckValue_k(aapsLogger, danaRPump, danaRKoreanPlugin); @@ -228,7 +228,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { } rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(aapsLogger, percent, durationInHours)); - mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin)); + mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector)); rxBus.send(new EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING)); return true; } @@ -237,7 +237,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { if (!isConnected()) return false; rxBus.send(new EventPumpStatusChanged(resourceHelper.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop(aapsLogger)); - mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin)); + mSerialIOThread.sendMessage(new MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector)); rxBus.send(new EventPumpStatusChanged(EventPumpStatusChanged.Status.DISCONNECTING)); return true; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTable.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTable.kt index c589bbe633..9c8f4b6534 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTable.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTable.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.danaRS.comm +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBusWrapper @@ -21,7 +22,8 @@ class DanaRSMessageHashTable @Inject constructor( danaRSPlugin: DanaRSPlugin, activePlugin: ActivePluginProvider, constraintChecker: ConstraintChecker, - detailedBolusInfoStorage: DetailedBolusInfoStorage + detailedBolusInfoStorage: DetailedBolusInfoStorage, + injector: HasAndroidInjector ) { var messages: HashMap = HashMap() @@ -99,7 +101,7 @@ class DanaRSMessageHashTable @Inject constructor( put(DanaRS_Packet_History_Temporary(aapsLogger, rxBus)) // APS put(DanaRS_Packet_APS_Basal_Set_Temporary_Basal(aapsLogger, 0)) - put(DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, 0)) + put(DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, injector,0)) put(DanaRS_Packet_APS_Set_Event_History(aapsLogger, 0, 0, 0, 0)) } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_Events.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_Events.kt index 08b4502daa..8728a0e014 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_Events.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_Events.kt @@ -1,6 +1,7 @@ package info.nightscout.androidaps.plugins.pump.danaRS.comm import com.cozmo.danar.util.BleCommandUtil +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.R import info.nightscout.androidaps.data.DetailedBolusInfo import info.nightscout.androidaps.db.ExtendedBolus @@ -25,6 +26,7 @@ open class DanaRS_Packet_APS_History_Events( private val activePlugin: ActivePluginProvider, private val danaRSPlugin: DanaRSPlugin, private val detailedBolusInfoStorage: DetailedBolusInfoStorage, + private val injector: HasAndroidInjector, private var from: Long ) : DanaRS_Packet() { @@ -75,7 +77,7 @@ open class DanaRS_Packet_APS_History_Events( val datetime = dateTimeSecFromBuff(data, 1) // 6 bytes val param1 = (intFromBuff(data, 7, 1) shl 8 and 0xFF00) + (intFromBuff(data, 8, 1) and 0xFF) val param2 = (intFromBuff(data, 9, 1) shl 8 and 0xFF00) + (intFromBuff(data, 10, 1) and 0xFF) - val temporaryBasal = TemporaryBasal().date(datetime).source(Source.PUMP).pumpId(datetime) + val temporaryBasal = TemporaryBasal(injector).date(datetime).source(Source.PUMP).pumpId(datetime) val extendedBolus = ExtendedBolus().date(datetime).source(Source.PUMP).pumpId(datetime) val status: String when (recordCode.toInt()) { @@ -198,4 +200,4 @@ open class DanaRS_Packet_APS_History_Events( override fun getFriendlyName(): String { return "APS_HISTORY_EVENTS" } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/services/DanaRSService.java index df12f7b0c3..3d7eb03e0a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRS/services/DanaRSService.java @@ -271,10 +271,10 @@ public class DanaRSService extends DaggerService { DanaRS_Packet_APS_History_Events msg; if (lastHistoryFetched == 0) { - msg = new DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, 0); + msg = new DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, injector, 0); aapsLogger.debug(LTag.PUMPCOMM, "Loading complete event history"); } else { - msg = new DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, lastHistoryFetched); + msg = new DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, injector, lastHistoryFetched); aapsLogger.debug(LTag.PUMPCOMM, "Loading event history from: " + DateUtil.dateAndTimeString(lastHistoryFetched)); } bleComm.sendMessage(msg); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTableRv2.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTableRv2.kt index b131aa55fd..7fbb2f3258 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTableRv2.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTableRv2.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.danaRv2.comm +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider import info.nightscout.androidaps.logging.AAPSLogger @@ -32,7 +33,8 @@ class MessageHashTableRv2 @Inject constructor( commandQueue: CommandQueueProvider, activePlugin: ActivePluginProvider, detailedBolusInfoStorage: DetailedBolusInfoStorage, - treatmentsPlugin: TreatmentsPlugin + treatmentsPlugin: TreatmentsPlugin, + injector: HasAndroidInjector ) : MessageHashTableBase { var messages: HashMap = HashMap() @@ -91,7 +93,7 @@ class MessageHashTableRv2 @Inject constructor( put(MsgCheckValue_v2(aapsLogger, rxBus, resourceHelper, danaRPump, danaRPlugin, danaRKoreanPlugin, danaRv2Plugin, configBuilderPlugin, commandQueue)) // 0xF0F1 CMD_PUMP_CHECK_VALUE put(MsgStatusAPS_v2(aapsLogger, danaRPump)) // 0xE001 CMD_PUMPSTATUS_APS put(MsgSetAPSTempBasalStart_v2(aapsLogger, 0, false, false)) // 0xE002 CMD_PUMPSET_APSTEMP - put(MsgHistoryEvents_v2(aapsLogger, resourceHelper, detailedBolusInfoStorage, danaRv2Plugin, rxBus, treatmentsPlugin)) // 0xE003 CMD_GET_HISTORY + put(MsgHistoryEvents_v2(aapsLogger, resourceHelper, detailedBolusInfoStorage, danaRv2Plugin, rxBus, treatmentsPlugin, injector)) // 0xE003 CMD_GET_HISTORY put(MsgSetHistoryEntry_v2(aapsLogger, 0, 0, 0, 0)) // 0xE004 CMD_SET_HISTORY_ENTRY } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2.kt index ffb9c6a9f3..a23a3e6a73 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2.kt @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.pump.danaRv2.comm +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.R import info.nightscout.androidaps.data.DetailedBolusInfo import info.nightscout.androidaps.db.ExtendedBolus @@ -25,6 +26,7 @@ class MsgHistoryEvents_v2 constructor( val danaRv2Plugin: DanaRv2Plugin, val rxBus: RxBusWrapper, val treatmentsPlugin: TreatmentsPlugin, + private val injector: HasAndroidInjector, var from: Long = 0 ) : MessageBase() { @@ -61,7 +63,7 @@ class MsgHistoryEvents_v2 constructor( val datetime = dateTimeSecFromBuff(bytes, 1) // 6 bytes val param1 = intFromBuff(bytes, 7, 2) val param2 = intFromBuff(bytes, 9, 2) - val temporaryBasal = TemporaryBasal() + val temporaryBasal = TemporaryBasal(injector) .date(datetime) .source(Source.PUMP) .pumpId(datetime) @@ -181,4 +183,4 @@ class MsgHistoryEvents_v2 constructor( if (datetime > danaRv2Plugin.lastEventTimeLoaded) danaRv2Plugin.lastEventTimeLoaded = datetime rxBus.send(EventPumpStatusChanged(resourceHelper.gs(R.string.processinghistory) + ": " + status)) } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/services/DanaRv2ExecutionService.java index 264c7dadf1..564b59e77f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/danaRv2/services/DanaRv2ExecutionService.java @@ -455,7 +455,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { if (!isConnected()) return new PumpEnactResult(injector).success(false); SystemClock.sleep(300); - MsgHistoryEvents_v2 msg = new MsgHistoryEvents_v2(aapsLogger, resourceHelper, detailedBolusInfoStorage, danaRv2Plugin, rxBus, treatmentsPlugin, lastHistoryFetched); + MsgHistoryEvents_v2 msg = new MsgHistoryEvents_v2(aapsLogger, resourceHelper, detailedBolusInfoStorage, danaRv2Plugin, rxBus, treatmentsPlugin, injector, lastHistoryFetched); aapsLogger.debug(LTag.PUMP, "Loading event history from: " + DateUtil.dateAndTimeString(lastHistoryFetched)); mSerialIOThread.sendMessage(msg); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java index 887fb2f763..0b3a513bf5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java @@ -1230,7 +1230,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface, InsightPumpID stoppedEvent = MainApp.getDbHelper().getPumpStoppedEvent(pumpID.pumpSerial, pumpID.timestamp); if (stoppedEvent == null || stoppedEvent.eventType.equals("PumpPaused")) continue; long tbrStart = stoppedEvent.timestamp + 10000; - TemporaryBasal temporaryBasal = new TemporaryBasal(); + TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()); temporaryBasal.durationInMinutes = (int) ((pumpID.timestamp - tbrStart) / 60000); temporaryBasal.date = tbrStart; temporaryBasal.source = Source.PUMP; @@ -1356,7 +1356,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface, pumpID.timestamp = timestamp; pumpID.eventType = "StartOfTBR"; MainApp.getDbHelper().createOrUpdate(pumpID); - TemporaryBasal temporaryBasal = new TemporaryBasal(); + TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()); temporaryBasal.durationInMinutes = event.getDuration(); temporaryBasal.source = Source.PUMP; temporaryBasal.pumpId = pumpID.id; @@ -1375,7 +1375,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface, pumpID.eventType = "EndOfTBR"; pumpID.timestamp = timestamp; MainApp.getDbHelper().createOrUpdate(pumpID); - TemporaryBasal temporaryBasal = new TemporaryBasal(); + TemporaryBasal temporaryBasal = new TemporaryBasal(getInjector()); temporaryBasal.durationInMinutes = 0; temporaryBasal.source = Source.PUMP; temporaryBasal.pumpId = pumpID.id; @@ -1573,7 +1573,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface, data.put("created_at", DateUtil.toISOString(date)); data.put("eventType", CareportalEvent.NOTE); data.put("notes", note); - CareportalEvent careportalEvent = new CareportalEvent(); + CareportalEvent careportalEvent = new CareportalEvent(getInjector()); careportalEvent.date = date; careportalEvent.source = Source.USER; careportalEvent.eventType = CareportalEvent.NOTE; @@ -1607,7 +1607,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface, if (!enteredBy.equals("")) data.put("enteredBy", enteredBy); data.put("created_at", DateUtil.toISOString(date)); data.put("eventType", event); - CareportalEvent careportalEvent = new CareportalEvent(); + CareportalEvent careportalEvent = new CareportalEvent(getInjector()); careportalEvent.date = date; careportalEvent.source = Source.USER; careportalEvent.eventType = event; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt index 62999798ba..7237dab948 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicFragment.kt @@ -38,8 +38,8 @@ import info.nightscout.androidaps.queue.events.EventQueueChanged import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog -import info.nightscout.androidaps.utils.SetWarnColor import info.nightscout.androidaps.utils.T +import info.nightscout.androidaps.utils.WarnColors import info.nightscout.androidaps.utils.extensions.plusAssign import info.nightscout.androidaps.utils.resources.ResourceHelper import io.reactivex.android.schedulers.AndroidSchedulers @@ -56,6 +56,7 @@ class MedtronicFragment : DaggerFragment() { @Inject lateinit var commandQueue: CommandQueueProvider @Inject lateinit var activePlugin: ActivePluginProvider @Inject lateinit var medtronicPumpPlugin: MedtronicPumpPlugin + @Inject lateinit var warnColors: WarnColors private var disposable: CompositeDisposable = CompositeDisposable() @@ -325,11 +326,11 @@ class MedtronicFragment : DaggerFragment() { } else { medtronic_pumpstate_battery.text = "{fa-battery-" + pumpStatus.batteryRemaining / 25 + "} " + pumpStatus.batteryRemaining + "%" + String.format(" (%.2f V)", pumpStatus.batteryVoltage) } - SetWarnColor.setColorInverse(medtronic_pumpstate_battery, pumpStatus.batteryRemaining.toDouble(), 25.0, 10.0) + warnColors.setColorInverse(medtronic_pumpstate_battery, pumpStatus.batteryRemaining.toDouble(), 25.0, 10.0) // reservoir medtronic_reservoir.text = resourceHelper.gs(R.string.reservoirvalue, pumpStatus.reservoirRemainingUnits, pumpStatus.reservoirFullUnits) - SetWarnColor.setColorInverse(medtronic_reservoir, pumpStatus.reservoirRemainingUnits, 50.0, 20.0) + warnColors.setColorInverse(medtronic_reservoir, pumpStatus.reservoirRemainingUnits, 50.0, 20.0) medtronic_errors.text = pumpStatus.errorInfo } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java index f40a12aa30..523a9c5f53 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java @@ -95,8 +95,6 @@ import static info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUt @Singleton public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInterface { - //private final SP sp; - protected static MedtronicPumpPlugin plugin = null; private RileyLinkMedtronicService medtronicService; private MedtronicPumpStatus pumpStatusLocal = null; @@ -1031,7 +1029,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter pumpStatusLocal.tempBasalAmount = absoluteRate; pumpStatusLocal.tempBasalLength = durationInMinutes; - TemporaryBasal tempStart = new TemporaryBasal() // + TemporaryBasal tempStart = new TemporaryBasal(getInjector()) // .date(System.currentTimeMillis()) // .duration(durationInMinutes) // .absolute(absoluteRate) // @@ -1372,7 +1370,7 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter if (response) { aapsLogger.info(LTag.PUMP, getLogPrefix() + "cancelTempBasal - Cancel TBR successful."); - TemporaryBasal tempBasal = new TemporaryBasal() // + TemporaryBasal tempBasal = new TemporaryBasal(getInjector()) // .date(System.currentTimeMillis()) // .duration(0) // .source(Source.USER); @@ -1577,10 +1575,6 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter this.hasTimeDateOrTimeZoneChanged = true; } -// private void refreshCustomActionsList() { -// rxBus.send(new EventCustomActionsChanged()); -// } - public void setEnableCustomAction(MedtronicCustomActionType customAction, boolean isEnabled) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalPair.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalPair.java index d01763e6ab..83ee3baf03 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalPair.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/data/dto/TempBasalPair.java @@ -127,4 +127,10 @@ public class TempBasalPair extends info.nightscout.androidaps.plugins.pump.commo } } + + @Override + public String toString() { + return "TempBasalPair [" + "Rate=" + insulinRate + ", DurationMinutes=" + durationMinutes + ", IsPercent=" + + isPercent + "]"; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java index 2996260fbc..0de5e3f355 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/service/RileyLinkMedtronicService.java @@ -36,10 +36,10 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP; */ public class RileyLinkMedtronicService extends RileyLinkService { - @Inject AAPSLogger aapsLogger; - @Inject Context context; + //@Inject AAPSLogger aapsLogger; + //@Inject Context context; @Inject MedtronicPumpPlugin medtronicPumpPlugin; - @Inject SP sp; + //@Inject SP sp; private static RileyLinkMedtronicService instance; private static ServiceTask currentTask = null; @@ -53,9 +53,6 @@ public class RileyLinkMedtronicService extends RileyLinkService { public RileyLinkMedtronicService() { super(); instance = this; - aapsLogger.debug(LTag.PUMPCOMM, "RileyLinkMedtronicService newly constructed"); - MedtronicUtil.setMedtronicService(this); - pumpStatus = (MedtronicPumpStatus) medtronicPumpPlugin.getPumpStatusData(); } @@ -106,6 +103,11 @@ public class RileyLinkMedtronicService extends RileyLinkService { // init rileyLinkCommunicationManager medtronicCommunicationManager = new MedtronicCommunicationManager(rfspy); + + aapsLogger.debug(LTag.PUMPCOMM, "RileyLinkMedtronicService newly constructed"); + MedtronicUtil.setMedtronicService(this); + pumpStatus = (MedtronicPumpStatus) medtronicPumpPlugin.getPumpStatusData(); + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt index e01b27bf64..41578a77fd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodFragment.kt @@ -60,6 +60,7 @@ class OmnipodFragment : DaggerFragment() { @Inject lateinit var commandQueue: CommandQueueProvider @Inject lateinit var activePlugin: ActivePluginProvider @Inject lateinit var medtronicPumpPlugin: MedtronicPumpPlugin + @Inject lateinit var warnColors: WarnColors private var disposable: CompositeDisposable = CompositeDisposable() @@ -443,7 +444,7 @@ class OmnipodFragment : DaggerFragment() { } else { omnipod_reservoir.text = resourceHelper.gs(R.string.omnipod_reservoir_left, pumpStatus.reservoirRemainingUnits) } - SetWarnColor.setColorInverse(omnipod_reservoir, pumpStatus.reservoirRemainingUnits, 50.0, 20.0) + warnColors.setColorInverse(omnipod_reservoir, pumpStatus.reservoirRemainingUnits, 50.0, 20.0) } else { omnipod_basabasalrate.text = "" diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.kt index 36ce3da6c9..4854112fc3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/virtual/VirtualPumpPlugin.kt @@ -240,7 +240,7 @@ class VirtualPumpPlugin @Inject constructor( override fun stopBolusDelivering() {} override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean): PumpEnactResult { - val tempBasal = TemporaryBasal() + val tempBasal = TemporaryBasal(injector) .date(System.currentTimeMillis()) .absolute(absoluteRate) .duration(durationInMinutes) @@ -260,7 +260,7 @@ class VirtualPumpPlugin @Inject constructor( } override fun setTempBasalPercent(percent: Int, durationInMinutes: Int, profile: Profile, enforceNew: Boolean): PumpEnactResult { - val tempBasal = TemporaryBasal() + val tempBasal = TemporaryBasal(injector) .date(System.currentTimeMillis()) .percent(percent) .duration(durationInMinutes) @@ -308,7 +308,7 @@ class VirtualPumpPlugin @Inject constructor( result.comment = resourceHelper.gs(R.string.virtualpump_resultok) if (treatmentsPlugin.isTempBasalInProgress) { result.enacted = true - val tempStop = TemporaryBasal().date(System.currentTimeMillis()).source(Source.USER) + val tempStop = TemporaryBasal(injector).date(System.currentTimeMillis()).source(Source.USER) treatmentsPlugin.addToHistoryTempBasal(tempStop) //tempBasal = null; aapsLogger.debug(LTag.PUMP, "Canceling temp basal: $result") @@ -412,4 +412,4 @@ class VirtualPumpPlugin @Inject constructor( override fun timezoneOrDSTChanged(timeChangeType: TimeChangeType?) {} -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java index cd10ea6088..090e980d9f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityAAPSPlugin.java @@ -109,7 +109,7 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin { } // reset deviations after site change - if (CareportalEvent.isEvent5minBack(siteChanges, autosensData.time)) { + if (new CareportalEvent(getInjector()).isEvent5minBack(siteChanges, autosensData.time)) { deviationsArray.clear(); pastSensitivity += "(SITECHANGE)"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java index f83e17fd7a..8424a65a93 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityOref1Plugin.java @@ -118,7 +118,7 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin { String pastSensitivity = pastSensitivityArray.get(hoursegment); // reset deviations after site change - if (CareportalEvent.isEvent5minBack(siteChanges, autosensData.time)) { + if (new CareportalEvent(getInjector()).isEvent5minBack(siteChanges, autosensData.time)) { deviationsArray.clear(); pastSensitivity += "(SITECHANGE)"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityWeightedAveragePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityWeightedAveragePlugin.java index 5a00a47461..09a4a20838 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityWeightedAveragePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/sensitivity/SensitivityWeightedAveragePlugin.java @@ -111,7 +111,7 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin } // reset deviations after site change - if (CareportalEvent.isEvent5minBack(siteChanges, autosensData.time)) { + if (new CareportalEvent(getInjector()).isEvent5minBack(siteChanges, autosensData.time)) { data.clear(); pastSensitivity += "(SITECHANGE)"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt index f123b4171a..7e854f7e96 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt @@ -102,7 +102,7 @@ class DexcomPlugin @Inject constructor( jsonObject.put("glucose", meter.getInt("meterValue")) jsonObject.put("units", Constants.MGDL) - val careportalEvent = CareportalEvent() + val careportalEvent = CareportalEvent(injector) careportalEvent.date = timestamp careportalEvent.source = Source.USER careportalEvent.eventType = CareportalEvent.BGCHECK @@ -122,7 +122,7 @@ class DexcomPlugin @Inject constructor( jsonObject.put("enteredBy", "AndroidAPS-Dexcom$sensorType") jsonObject.put("created_at", DateUtil.toISOString(sensorInsertionTime)) jsonObject.put("eventType", CareportalEvent.SENSORCHANGE) - val careportalEvent = CareportalEvent() + val careportalEvent = CareportalEvent(injector) careportalEvent.date = sensorInsertionTime careportalEvent.source = Source.USER careportalEvent.eventType = CareportalEvent.SENSORCHANGE diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java index c3de444efd..c91e06a4a0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPlugin.java @@ -402,7 +402,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface Profile profile = profileFunction.getProfile(t.date); if (profile == null) continue; if (truncate && t.end() > truncateTime) { - TemporaryBasal dummyTemp = new TemporaryBasal(); + TemporaryBasal dummyTemp = new TemporaryBasal(getInjector()); dummyTemp.copyFrom(t); dummyTemp.cutEndTo(truncateTime); calc = dummyTemp.iobCalc(time, profile); @@ -477,7 +477,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface Profile profile = profileFunction.getProfile(t.date); if (profile == null) continue; if (t.end() > truncateTime) { - TemporaryBasal dummyTemp = new TemporaryBasal(); + TemporaryBasal dummyTemp = new TemporaryBasal(getInjector()); dummyTemp.copyFrom(t); dummyTemp.cutEndTo(truncateTime); calc = dummyTemp.iobCalc(time, profile, lastAutosensResult, exercise_mode, half_basal_exercise_target, isTempTarget); @@ -586,7 +586,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface else if (tempBasal.isAbsolute) NSUpload.uploadTempBasalStartAbsolute(tempBasal, null); else - NSUpload.uploadTempBasalStartPercent(tempBasal); + NSUpload.uploadTempBasalStartPercent(tempBasal, profileFunction.getProfile(tempBasal.date)); } return newRecordCreated; } @@ -652,8 +652,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface context.startActivity(i); Bundle bundle = new Bundle(); - bundle.putString(FirebaseAnalytics.Param.ITEM_ID, "TreatmentClash"); - bundle.putString(FirebaseAnalytics.Param.VALUE, status); + bundle.putString(FirebaseAnalytics.Param.ITEM_LIST_ID, "TreatmentClash"); + bundle.putString(FirebaseAnalytics.Param.ITEM_LIST_NAME, status); fabricPrivacy.logCustom(bundle); } @@ -706,7 +706,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface public void addToHistoryTempTarget(TempTarget tempTarget) { //log.debug("Adding new TemporaryBasal record" + profileSwitch.log()); MainApp.getDbHelper().createOrUpdate(tempTarget); - NSUpload.uploadTempTarget(tempTarget); + NSUpload.uploadTempTarget(tempTarget, profileFunction); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/BTReceiver.kt b/app/src/main/java/info/nightscout/androidaps/receivers/BTReceiver.kt index a3b54e924e..f311d4b5c9 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/BTReceiver.kt +++ b/app/src/main/java/info/nightscout/androidaps/receivers/BTReceiver.kt @@ -13,13 +13,13 @@ class BTReceiver : DaggerBroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { super.onReceive(context, intent) - val device : BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) + val device: BluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) when (intent.action) { - BluetoothDevice.ACTION_ACL_CONNECTED -> - rxBus.send(EventBTChange(EventBTChange.Change.CONNECT, device.name)) + BluetoothDevice.ACTION_ACL_CONNECTED -> + rxBus.send(EventBTChange(EventBTChange.Change.CONNECT, deviceName = device.name, deviceAddress = device.address)) BluetoothDevice.ACTION_ACL_DISCONNECTED -> - rxBus.send(EventBTChange(EventBTChange.Change.DISCONNECT, device.name)) + rxBus.send(EventBTChange(EventBTChange.Change.DISCONNECT, deviceName = device.name, deviceAddress = device.address)) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/TimeDateOrTZChangeReceiver.kt b/app/src/main/java/info/nightscout/androidaps/receivers/TimeDateOrTZChangeReceiver.kt index 3c4a413b79..564ce70582 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/TimeDateOrTZChangeReceiver.kt +++ b/app/src/main/java/info/nightscout/androidaps/receivers/TimeDateOrTZChangeReceiver.kt @@ -2,19 +2,13 @@ package info.nightscout.androidaps.receivers import android.content.Context import android.content.Intent -import android.content.IntentFilter import dagger.android.DaggerBroadcastReceiver -import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.PumpInterface import info.nightscout.androidaps.logging.AAPSLogger -import info.nightscout.androidaps.logging.L import info.nightscout.androidaps.logging.LTag -import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodUtil -import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.TimeChangeType -import org.slf4j.LoggerFactory import java.util.* import javax.inject.Inject @@ -76,4 +70,4 @@ class TimeDateOrTZChangeReceiver : DaggerBroadcastReceiver() { } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt b/app/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt index 19d25e008b..5db1800490 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/FabricPrivacy.kt @@ -48,7 +48,7 @@ class FabricPrivacy @Inject constructor( fun logCustom(event: Bundle) { try { if (fabricEnabled()) { - mainApp.firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, event) + mainApp.firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM, event) } else { aapsLogger.debug(LTag.CORE, "Ignoring recently opted-out event: $event") } @@ -140,4 +140,4 @@ class FabricPrivacy @Inject constructor( activePlugin.activeSensitivity.let { mainApp.firebaseAnalytics.setUserProperty("Sensitivity", it::class.java.simpleName) } activePlugin.activeInsulin.let { mainApp.firebaseAnalytics.setUserProperty("Insulin", it::class.java.simpleName) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/utils/SetWarnColor.java b/app/src/main/java/info/nightscout/androidaps/utils/SetWarnColor.java deleted file mode 100644 index e22197d83f..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/utils/SetWarnColor.java +++ /dev/null @@ -1,25 +0,0 @@ -package info.nightscout.androidaps.utils; - -import android.graphics.Color; -import android.widget.TextView; - -/** - * Created by mike on 08.07.2016. - */ -public class SetWarnColor { - static final int normalColor = Color.WHITE; - static final int warnColor = Color.YELLOW; - static final int urgentColor = Color.RED; - - public static void setColor(TextView view, double value, double warnLevel, double urgentLevel) { - if (value >= urgentLevel) view.setTextColor(urgentColor); - else if (value >= warnLevel) view.setTextColor(warnColor); - else view.setTextColor(normalColor); - } - - public static void setColorInverse(TextView view, double value, double warnLevel, double urgentLevel) { - if (value <= urgentLevel) view.setTextColor(urgentColor); - else if (value <= warnLevel) view.setTextColor(warnColor); - else view.setTextColor(normalColor); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/utils/SetWarnColor.kt b/app/src/main/java/info/nightscout/androidaps/utils/SetWarnColor.kt new file mode 100644 index 0000000000..fd375ad1cc --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/utils/SetWarnColor.kt @@ -0,0 +1,38 @@ +package info.nightscout.androidaps.utils + +import android.graphics.Color +import android.widget.TextView +import info.nightscout.androidaps.R +import info.nightscout.androidaps.db.CareportalEvent +import info.nightscout.androidaps.utils.resources.ResourceHelper +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class WarnColors @Inject constructor(val resourceHelper: ResourceHelper) { + + private val normalColor = Color.WHITE + private val warnColor = Color.YELLOW + private val urgentColor = Color.RED + + fun setColor(view: TextView?, value: Double, warnLevel: Double, urgentLevel: Double) = + view?.setTextColor(when { + value >= urgentLevel -> urgentColor + value >= warnLevel -> warnColor + else -> normalColor + }) + + fun setColorInverse(view: TextView?, value: Double, warnLevel: Double, urgentLevel: Double) = + view?.setTextColor(when { + value <= urgentLevel -> urgentColor + value <= warnLevel -> warnColor + else -> normalColor + }) + + fun setColorByAge(view: TextView?, careportalEvent: CareportalEvent, warnThreshold: Double, urgentThreshold: Double) = + view?.setTextColor(when { + careportalEvent.isOlderThan(urgentThreshold) -> resourceHelper.gc(R.color.low) + careportalEvent.isOlderThan(warnThreshold) -> resourceHelper.gc(R.color.high) + else -> Color.WHITE + }) +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt b/app/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt index f398534039..72b63912c2 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/resources/ResourceHelperImplementation.kt @@ -42,21 +42,19 @@ class ResourceHelperImplementation @Inject constructor(private val context: Cont override fun openRawResourceFd(id: Int): AssetFileDescriptor = context.resources.openRawResourceFd(id) - override fun getIcon(): Int { - return when { + override fun getIcon(): Int = + when { Config.NSCLIENT -> R.mipmap.ic_yellowowl Config.PUMPCONTROL -> R.mipmap.ic_pumpcontrol else -> R.mipmap.ic_launcher } - } - override fun getNotificationIcon(): Int { - return when { + override fun getNotificationIcon(): Int = + when { Config.NSCLIENT -> R.drawable.ic_notif_nsclient Config.PUMPCONTROL -> R.drawable.ic_notif_pumpcontrol else -> R.drawable.ic_notif_aaps } - } override fun decodeResource(id: Int): Bitmap = BitmapFactory.decodeResource(context.resources, id) @@ -69,5 +67,5 @@ class ResourceHelperImplementation @Inject constructor(private val context: Cont return (dp * scale + 0.5f).toInt() } - override fun shortTextMode() : Boolean = !gb(R.bool.isTablet) && Config.NSCLIENT -} \ No newline at end of file + override fun shortTextMode() : Boolean = !gb(R.bool.isTablet) +} diff --git a/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SP.kt b/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SP.kt index de7b20f403..994b6e93b1 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SP.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SP.kt @@ -29,6 +29,7 @@ interface SP { fun putBoolean(key: String, value: Boolean) fun putBoolean(@StringRes resourceID: Int, value: Boolean) fun putDouble(key: String, value: Double) + fun putDouble(@StringRes resourceID: Int, value: Double) fun putLong(key: String, value: Long) fun putLong(@StringRes resourceID: Int, value: Long) fun putInt(key: String, value: Int) @@ -36,4 +37,4 @@ interface SP { fun incInt(@StringRes resourceID: Int) fun putString(@StringRes resourceID: Int, value: String) fun putString(key: String, value: String) -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SPImplementation.kt b/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SPImplementation.kt index f05582ab5b..e1fc2ea09b 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SPImplementation.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/sharedPreferences/SPImplementation.kt @@ -102,6 +102,10 @@ class SPImplementation @Inject constructor( override fun putDouble(key: String, value: Double) = sharedPreferences.edit().putString(key, value.toString()).apply() + override fun putDouble(resourceID: Int, value: Double) { + sharedPreferences.edit().putString(resourceHelper.gs(resourceID), value.toString()).apply() + } + override fun putLong(key: String, value: Long) = sharedPreferences.edit().putLong(key, value).apply() @@ -125,4 +129,4 @@ class SPImplementation @Inject constructor( override fun putString(key: String, value: String) = sharedPreferences.edit().putString(key, value).apply() -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml index 2c2c5b8cd2..86f4f88711 100644 --- a/app/src/main/res/layout/activity_historybrowse.xml +++ b/app/src/main/res/layout/activity_historybrowse.xml @@ -64,65 +64,42 @@ + android:orientation="vertical"> - - - - - - - - - - - + + android:layout_height="match_parent" /> - + android:layout_alignParentTop="true" + android:layout_alignParentEnd="true" + android:paddingTop="5dp" + app:srcCompat="@drawable/ic_arrow_drop_down_white_24dp" /> - + - + + + android:layout_height="wrap_content" + android:orientation="vertical" /> - - - - - diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 64e32cf747..f122376c2f 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -363,58 +363,101 @@ + + + + + + + + + + + + + + - - - - diff --git a/app/src/main/res/layout/overview_fragment_landscape.xml b/app/src/main/res/layout/overview_fragment_landscape.xml index cea0f76d21..471634ea8a 100644 --- a/app/src/main/res/layout/overview_fragment_landscape.xml +++ b/app/src/main/res/layout/overview_fragment_landscape.xml @@ -363,58 +363,101 @@ + + + + + + + + + + + + + + - - - - diff --git a/app/src/main/res/layout/overview_fragment_nsclient.xml b/app/src/main/res/layout/overview_fragment_nsclient.xml index 026d697838..504e88c789 100644 --- a/app/src/main/res/layout/overview_fragment_nsclient.xml +++ b/app/src/main/res/layout/overview_fragment_nsclient.xml @@ -117,7 +117,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintBottom_toTopOf="@+id/overview_statuslights_nscl" + app:layout_constraintBottom_toTopOf="@+id/overview_statuslights" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/overview_pumpstatuslayout"> @@ -362,98 +362,104 @@ - - + + + + + app:layout_constraintTop_toBottomOf="@+id/overview_statuslights" /> Config Builder Objectives - OpenAPS MA Overview NS Profile Simple profile @@ -652,18 +651,31 @@ key_usersuperbolus Enable superbolus in wizard Enable superbolus functionality in wizard. Do not enable until you learn what it really does. IT MAY CAUSE INSULIN OVERDOSE IF USED BLINDLY! - key_show_statuslights - key_show_statuslights_extended + show_statuslights Show status lights on home screen - Show extended status lights on home screen - Enable extended status lights for cage, iage, sage, reservoir and battery level on home screen. - key_statuslights_res_warning + statuslights_cage_warning + Threshold warning canula age [h] + statuslights_cage_critical + Threshold critical canula age [h] + statuslights_iage_warning + Threshold warning insulin age [h] + statuslights_iage_critical + Threshold critical insulin age [h] + statuslights_sage_warning + Threshold warning sensor age [h] + statuslights_sage_critical + Threshold critical sensor age [h] + statuslights_bage_warning + Threshold warning battery age [h] + statuslights_bage_critical + Threshold critical battery age [h] + statuslights_res_warning Threshold warning reservoir level [U] - key_statuslights_res_critical + statuslights_res_critical Threshold critical reservoir level [U] - key_statuslights_bat_warning + statuslights_bat_warning Threshold warning battery level [%] - key_statuslights_bat_critical + statuslights_bat_critical Threshold critical battery level [%] IOB COB @@ -1547,7 +1559,6 @@ Scanning error: %1$d Never - Settings History @@ -1810,6 +1821,12 @@ Master password is used for backup encryption and to override security in application. Remember it or store on a safe place. Passwords don\'t match Current master password + Status lights + Copy settings from NS + statuslights_copy_ns + Copy NS settings (if exists)? + statuslights_overview_advanced + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1826ca8cc7..e68e414cf1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -94,8 +94,6 @@ @color/errorAlertBackground - - - - - diff --git a/app/src/main/res/xml/pref_openapsma.xml b/app/src/main/res/xml/pref_openapsma.xml deleted file mode 100644 index 418eabe4fb..0000000000 --- a/app/src/main/res/xml/pref_openapsma.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index 1e4825f113..e8f8db4a17 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -274,39 +274,117 @@ android:title="@string/overview_show_notes_field_in_dialogs_title" /> - - + android:key="@string/key_statuslights_overview_advanced" + android:title="@string/statuslights"> - - - + android:inputType="numberSigned" + android:key="@string/key_statuslights_cage_warning" + android:maxLines="20" + android:selectAllOnFocus="true" + android:singleLine="true" + android:title="@string/statuslights_cage_warning" + validate:maxNumber="120" + validate:minNumber="24" + validate:testType="numericRange" /> + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/app/src/test/java/info/nightscout/androidaps/data/NonOverlappingIntervalsTest.kt b/app/src/test/java/info/nightscout/androidaps/data/NonOverlappingIntervalsTest.kt index 7a915e9e13..f2fa2d580f 100644 --- a/app/src/test/java/info/nightscout/androidaps/data/NonOverlappingIntervalsTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/data/NonOverlappingIntervalsTest.kt @@ -1,5 +1,8 @@ package info.nightscout.androidaps.data +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.TestBase import info.nightscout.androidaps.db.TemporaryBasal import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.T @@ -9,21 +12,23 @@ import org.junit.runner.RunWith import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) -class NonOverlappingIntervalsTest { +class NonOverlappingIntervalsTest : TestBase() { private val startDate = DateUtil.now() var list = NonOverlappingIntervals() + val injector = HasAndroidInjector { AndroidInjector {} } + @Test fun doTests() { // create one 10h interval and test value in and out - list.add(TemporaryBasal().date(startDate).duration(T.hours(10).mins().toInt()).absolute(1.0)) + list.add(TemporaryBasal(injector).date(startDate).duration(T.hours(10).mins().toInt()).absolute(1.0)) Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs())) Assert.assertEquals(1.0, list.getValueByInterval(startDate)!!.absoluteRate, 0.01) Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1)) // stop temp after 5h - list.add(TemporaryBasal().date(startDate + T.hours(5).msecs()).duration(0)) + list.add(TemporaryBasal(injector).date(startDate + T.hours(5).msecs()).duration(0)) Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs())) Assert.assertEquals(1.0, list.getValueByInterval(startDate)!!.absoluteRate, 0.01) Assert.assertEquals(1.0, list.getValueByInterval(startDate + T.hours(5).msecs() - 1)!!.absoluteRate, 0.01) @@ -31,7 +36,7 @@ class NonOverlappingIntervalsTest { Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(10).msecs() + 1)) // insert 1h interval inside - list.add(TemporaryBasal().date(startDate + T.hours(3).msecs()).duration(T.hours(1).mins().toInt()).absolute(2.0)) + list.add(TemporaryBasal(injector).date(startDate + T.hours(3).msecs()).duration(T.hours(1).mins().toInt()).absolute(2.0)) Assert.assertEquals(null, list.getValueByInterval(startDate - T.secs(1).msecs())) Assert.assertEquals(1.0, list.getValueByInterval(startDate)!!.absoluteRate, 0.01) Assert.assertEquals(null, list.getValueByInterval(startDate + T.hours(5).msecs() - 1)) @@ -44,8 +49,8 @@ class NonOverlappingIntervalsTest { @Test fun testCopyConstructor() { list.reset() - list.add(TemporaryBasal().date(startDate).duration(T.hours(10).mins().toInt()).absolute(1.0)) + list.add(TemporaryBasal(injector).date(startDate).duration(T.hours(10).mins().toInt()).absolute(1.0)) val list2 = NonOverlappingIntervals(list) Assert.assertEquals(1, list2.list.size.toLong()) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/APSResultTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/APSResultTest.kt index df6e328489..8136433758 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/APSResultTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/aps/loop/APSResultTest.kt @@ -2,20 +2,14 @@ package info.nightscout.androidaps.plugins.aps.loop import dagger.android.AndroidInjector import dagger.android.HasAndroidInjector -import info.nightscout.androidaps.TestBase import info.nightscout.androidaps.TestBaseWithProfile import info.nightscout.androidaps.db.TemporaryBasal -import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.Constraint import info.nightscout.androidaps.interfaces.PumpDescription -import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker -import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction import info.nightscout.androidaps.plugins.pump.common.defs.PumpType import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin -import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin import info.nightscout.androidaps.utils.JsonHelper.safeGetDouble -import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP import org.junit.Assert import org.junit.Before @@ -35,6 +29,8 @@ class APSResultTest : TestBaseWithProfile() { @Mock lateinit var sp: SP @Mock lateinit var virtualPumpPlugin: VirtualPumpPlugin + private val injector = HasAndroidInjector { AndroidInjector { } } + private var closedLoopEnabled = Constraint(false) private val pumpDescription = PumpDescription() @@ -79,36 +75,36 @@ class APSResultTest : TestBaseWithProfile() { Assert.assertEquals(false, apsResult.isChangeRequested) // request equal temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(70).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(70).duration(30)) apsResult.tempBasalRequested(true).percent(70).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) // request zero temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(10).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(10).duration(30)) apsResult.tempBasalRequested(true).percent(0).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) // request high temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(190).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(190).duration(30)) apsResult.tempBasalRequested(true).percent(200).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) // request slightly different temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(70).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(70).duration(30)) apsResult.tempBasalRequested(true).percent(80).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) // request different temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(70).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(70).duration(30)) apsResult.tempBasalRequested(true).percent(120).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) // it should work with absolute temps too // request different temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(1.0).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(1.0).duration(30)) apsResult.tempBasalRequested(true).percent(100).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(2.0).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(2.0).duration(30)) apsResult.tempBasalRequested(true).percent(50).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) @@ -124,39 +120,39 @@ class APSResultTest : TestBaseWithProfile() { Assert.assertEquals(false, apsResult.isChangeRequested) // request equal temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(2.0).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(2.0).duration(30)) apsResult.tempBasalRequested(true).rate(2.0).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(200).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(200).duration(30)) apsResult.tempBasalRequested(true).rate(2.0).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) // request zero temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(0.1).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(0.1).duration(30)) apsResult.tempBasalRequested(true).rate(0.0).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) // request high temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(34.9).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(34.9).duration(30)) apsResult.tempBasalRequested(true).rate(35.0).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) // request slightly different temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(1.1).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(1.1).duration(30)) apsResult.tempBasalRequested(true).rate(1.2).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) // request different temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().absolute(1.1).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).absolute(1.1).duration(30)) apsResult.tempBasalRequested(true).rate(1.5).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) // it should work with percent temps too // request different temp - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(110).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(110).duration(30)) apsResult.tempBasalRequested(true).rate(1.1).duration(30) Assert.assertEquals(false, apsResult.isChangeRequested) - `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal().percent(200).duration(30)) + `when`(treatmentsPlugin.getTempBasalFromHistory(ArgumentMatchers.anyLong())).thenReturn(TemporaryBasal(injector).percent(200).duration(30)) apsResult.tempBasalRequested(true).rate(0.5).duration(30) Assert.assertEquals(true, apsResult.isChangeRequested) } @@ -173,7 +169,7 @@ class APSResultTest : TestBaseWithProfile() { it.resourceHelper = resourceHelper } apsResult.rate(10.0) - val apsResult2 = apsResult.newAndClone(HasAndroidInjector { AndroidInjector { Unit } }) + val apsResult2 = apsResult.newAndClone(injector) Assert.assertEquals(apsResult.rate, apsResult2.rate, 0.0) } @@ -203,4 +199,4 @@ class APSResultTest : TestBaseWithProfile() { `when`(virtualPumpPlugin.pumpDescription).thenReturn(pumpDescription) `when`(profileFunction.getProfile()).thenReturn(validProfile) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPluginTest.kt index ac412d2f02..60de975023 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/configBuilder/ConfigBuilderPluginTest.kt @@ -6,7 +6,6 @@ import dagger.android.HasAndroidInjector import info.nightscout.androidaps.TestBase import info.nightscout.androidaps.interfaces.ActivePluginProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider -import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin @@ -28,7 +27,6 @@ class ConfigBuilderPluginTest : TestBase() { @Mock lateinit var resourceHelper: ResourceHelper @Mock lateinit var commandQueue: CommandQueueProvider @Mock lateinit var activePlugin: ActivePluginProvider - @Mock lateinit var profileFunction: ProfileFunction lateinit var configBuilderPlugin: ConfigBuilderPlugin @@ -45,6 +43,6 @@ class ConfigBuilderPluginTest : TestBase() { @Before fun prepareMock() { - configBuilderPlugin = ConfigBuilderPlugin(activePlugin, injector, sp, RxBusWrapper(), aapsLogger, resourceHelper, profileFunction) + configBuilderPlugin = ConfigBuilderPlugin(injector, aapsLogger, resourceHelper, sp, RxBusWrapper(), activePlugin) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/AutomationEventTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/AutomationEventTest.kt index 363bf83b21..80f22aae25 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/AutomationEventTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/AutomationEventTest.kt @@ -16,9 +16,11 @@ import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock +import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) +@PrepareForTest(ConfigBuilderPlugin::class) class AutomationEventTest : TestBase() { @Mock lateinit var loopPlugin: LoopPlugin @@ -69,4 +71,4 @@ class AutomationEventTest : TestBase() { Assert.assertFalse(event.actions === clone.actions) // not the same object reference Assert.assertEquals(clone.toJSON(), clone.toJSON()) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionsTestBase.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionsTestBase.kt index 55173656b2..3f50b415e1 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionsTestBase.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionsTestBase.kt @@ -21,7 +21,7 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP import org.mockito.Mock import org.powermock.core.classloader.annotations.PrepareForTest -@PrepareForTest(VirtualPumpPlugin::class, RxBusWrapper::class, LocalProfilePlugin::class, SmsCommunicatorPlugin::class) +@PrepareForTest(VirtualPumpPlugin::class, RxBusWrapper::class, LocalProfilePlugin::class, SmsCommunicatorPlugin::class, ConfigBuilderPlugin::class) open class ActionsTestBase : TestBaseWithProfile() { @Mock lateinit var sp: SP @@ -95,4 +95,4 @@ open class ActionsTestBase : TestBaseWithProfile() { } } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/DanaRTestBase.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/DanaRTestBase.kt index 20c5bf6038..b63bfc429a 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/DanaRTestBase.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/DanaRTestBase.kt @@ -1,8 +1,10 @@ package info.nightscout.androidaps.plugins.pump.danaR.comm +import dagger.android.AndroidInjector import dagger.android.HasAndroidInjector import info.nightscout.androidaps.TestBase -import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.db.TemporaryBasal +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction import info.nightscout.androidaps.plugins.pump.danaR.DanaRPump import info.nightscout.androidaps.utils.sharedPreferences.SP import org.junit.Before @@ -11,7 +13,15 @@ import org.mockito.Mock open class DanaRTestBase : TestBase() { @Mock lateinit var sp: SP - @Mock lateinit var injector: HasAndroidInjector + @Mock lateinit var profileFunction: ProfileFunction + + val injector = HasAndroidInjector { + AndroidInjector { + if (it is TemporaryBasal) { + it.profileFunction = profileFunction + } + } + } lateinit var danaRPump: DanaRPump @@ -46,4 +56,4 @@ open class DanaRTestBase : TestBase() { fun setup() { danaRPump = DanaRPump(aapsLogger, sp, injector) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableRTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableRTest.kt index e2ad047b78..d0a97c4c93 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableRTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MessageHashTableRTest.kt @@ -20,7 +20,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) -@PrepareForTest(ConstraintChecker::class, DetailedBolusInfoStorage::class) +@PrepareForTest(ConstraintChecker::class, DetailedBolusInfoStorage::class, ConfigBuilderPlugin::class) class MessageHashTableRTest : DanaRTestBase() { @Mock lateinit var rxBus: RxBusWrapper @@ -36,8 +36,8 @@ class MessageHashTableRTest : DanaRTestBase() { @Test fun runTest() { Mockito.`when`(constraintChecker.applyBolusConstraints(anyObject())).thenReturn(Constraint(0.0)) - val messageHashTable = MessageHashTableR(aapsLogger, rxBus, resourceHelper, constraintChecker, danaRPump, danaRPlugin, danaRKoreanPlugin, configBuilderPlugin, commandQueue, activePlugin) + val messageHashTable = MessageHashTableR(aapsLogger, rxBus, resourceHelper, constraintChecker, danaRPump, danaRPlugin, danaRKoreanPlugin, configBuilderPlugin, commandQueue, activePlugin, injector) val testMessage = messageHashTable.findMessage(0x41f2) Assert.assertEquals("CMD_HISTORY_ALL", testMessage.messageName) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgInitConnStatusTimeTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgInitConnStatusTimeTest.kt index cfb55eaae7..0e5a02fdc4 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgInitConnStatusTimeTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgInitConnStatusTimeTest.kt @@ -14,7 +14,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) -@PrepareForTest(DanaRKoreanPlugin::class, DanaRPlugin::class) +@PrepareForTest(DanaRKoreanPlugin::class, DanaRPlugin::class, ConfigBuilderPlugin::class) class MsgInitConnStatusTimeTest : DanaRTestBase() { @Mock lateinit var resourceHelper: ResourceHelper @@ -33,4 +33,4 @@ class MsgInitConnStatusTimeTest : DanaRTestBase() { packet.handleMessage(createArray(15, 1.toByte())) Assert.assertEquals(true, packet.failed) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasalTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasalTest.kt index 703b9b1e3b..0d6f310e6d 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasalTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaR/comm/MsgStatusTempBasalTest.kt @@ -1,15 +1,18 @@ package info.nightscout.androidaps.plugins.pump.danaR.comm import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.`when` +import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) +@PrepareForTest(ConfigBuilderPlugin::class) class MsgStatusTempBasalTest : DanaRTestBase() { @Mock lateinit var activePlugin: ActivePluginProvider @@ -17,7 +20,7 @@ class MsgStatusTempBasalTest : DanaRTestBase() { @Test fun runTest() { `when`(activePlugin.activeTreatments).thenReturn(treatmentsPlugin) - val packet = MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin) + val packet = MsgStatusTempBasal(aapsLogger, danaRPump, activePlugin, injector) // test message decoding // test message decoding packet.handleMessage(createArray(34, 1.toByte())) @@ -26,4 +29,4 @@ class MsgStatusTempBasalTest : DanaRTestBase() { packet.handleMessage(createArray(34, 2.toByte())) Assert.assertEquals(false, danaRPump.isTempBasalInProgress) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKoreanTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKoreanTest.kt index 90397dc87b..8f743d2307 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKoreanTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRKorean/comm/MessageHashTableRKoreanTest.kt @@ -19,7 +19,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) -@PrepareForTest(ConstraintChecker::class, DetailedBolusInfoStorage::class) +@PrepareForTest(ConstraintChecker::class, DetailedBolusInfoStorage::class, ConfigBuilderPlugin::class) class MessageHashTableRKoreanTest : DanaRSTestBase() { @Mock lateinit var constraintChecker: ConstraintChecker @@ -32,8 +32,8 @@ class MessageHashTableRKoreanTest : DanaRSTestBase() { @Test fun runTest() { Mockito.`when`(constraintChecker.applyBolusConstraints(anyObject())).thenReturn(Constraint(0.0)) - val messageHashTable = MessageHashTableRKorean(aapsLogger, rxBus, resourceHelper, constraintChecker, danaRPump, danaRPlugin, danaRKoreanPlugin, configBuilderPlugin, commandQueue, activePlugin) + val messageHashTable = MessageHashTableRKorean(aapsLogger, rxBus, resourceHelper, constraintChecker, danaRPump, danaRPlugin, danaRKoreanPlugin, configBuilderPlugin, commandQueue, activePlugin, injector) val testMessage = messageHashTable.findMessage(0x41f2) Assert.assertEquals("CMD_HISTORY_ALL", testMessage.messageName) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTableTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTableTest.kt index 34f7c64def..696676b33b 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTableTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSMessageHashTableTest.kt @@ -28,9 +28,9 @@ class DanaRSMessageHashTableTest : DanaRSTestBase() { fun runTest() { `when`(constraintChecker.applyBolusConstraints(anyObject())).thenReturn(Constraint(0.0)) - val danaRSMessageHashTable = DanaRSMessageHashTable(aapsLogger, rxBus, resourceHelper, danaRPump, danaRSPlugin, activePlugin, constraintChecker, detailedBolusInfoStorage) + val danaRSMessageHashTable = DanaRSMessageHashTable(aapsLogger, rxBus, resourceHelper, danaRPump, danaRSPlugin, activePlugin, constraintChecker, detailedBolusInfoStorage, injector) val forTesting: DanaRS_Packet = DanaRS_Packet_APS_Set_Event_History(aapsLogger, DanaRPump.CARBS, 0, 0, 0) val testPacket: DanaRS_Packet = danaRSMessageHashTable.findMessage(forTesting.command) Assert.assertEquals(BleCommandUtil.DANAR_PACKET__OPCODE__APS_SET_EVENT_HISTORY.toLong(), testPacket.getOpCode().toLong()) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSTestBase.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSTestBase.kt index a118af1b85..6ed1a280b3 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSTestBase.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRSTestBase.kt @@ -1,7 +1,10 @@ package info.nightscout.androidaps.plugins.pump.danaRS.comm +import dagger.android.AndroidInjector import dagger.android.HasAndroidInjector import info.nightscout.androidaps.TestBaseWithProfile +import info.nightscout.androidaps.db.TemporaryBasal +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction import info.nightscout.androidaps.plugins.pump.danaR.DanaRPump import info.nightscout.androidaps.utils.sharedPreferences.SP import org.junit.Before @@ -10,7 +13,14 @@ import org.mockito.Mock open class DanaRSTestBase : TestBaseWithProfile() { @Mock lateinit var sp: SP - @Mock lateinit var injector: HasAndroidInjector + + val injector = HasAndroidInjector { + AndroidInjector { + if (it is TemporaryBasal) { + it.profileFunction = profileFunction + } + } + } lateinit var danaRPump: DanaRPump @@ -45,4 +55,4 @@ open class DanaRSTestBase : TestBaseWithProfile() { fun setup() { danaRPump = DanaRPump(aapsLogger, sp, injector) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_EventsTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_EventsTest.kt index 1072c72e09..1742dffbf9 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_EventsTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRS/comm/DanaRS_Packet_APS_History_EventsTest.kt @@ -24,7 +24,7 @@ class DanaRS_Packet_APS_History_EventsTest : DanaRSTestBase() { @Test fun runTest() { val now = DateUtil.now() - val testPacket = DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, now) + val testPacket = DanaRS_Packet_APS_History_Events(aapsLogger, rxBus, resourceHelper, activePlugin, danaRSPlugin, detailedBolusInfoStorage, injector, now) // test getRequestedParams val returnedValues = testPacket.requestParams val expectedValues = getCalender(now) @@ -58,4 +58,4 @@ class DanaRS_Packet_APS_History_EventsTest : DanaRSTestBase() { ret[5] = (cal[Calendar.SECOND] and 0xff).toByte() return ret } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTable_rv2Test.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTable_rv2Test.kt index 8cf2f1c9df..ca642c026b 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTable_rv2Test.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MessageHashTable_rv2Test.kt @@ -23,7 +23,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) -@PrepareForTest(ConstraintChecker::class, DetailedBolusInfoStorage::class) +@PrepareForTest(ConstraintChecker::class, DetailedBolusInfoStorage::class, ConfigBuilderPlugin::class) class MessageHashTable_rv2Test : DanaRTestBase() { @Mock lateinit var rxBus: RxBusWrapper @@ -41,7 +41,7 @@ class MessageHashTable_rv2Test : DanaRTestBase() { @Test fun runTest() { `when`(constraintChecker.applyBolusConstraints(anyObject())).thenReturn(Constraint(0.0)) - val messageHashTableRv2 = MessageHashTableRv2(aapsLogger, rxBus, resourceHelper, constraintChecker, danaRPump, danaRPlugin, danaRKoreanPlugin, danaRv2Plugin, configBuilderPlugin, commandQueue, activePlugin, detailedBolusInfoStorage, treatmentsPlugin) + val messageHashTableRv2 = MessageHashTableRv2(aapsLogger, rxBus, resourceHelper, constraintChecker, danaRPump, danaRPlugin, danaRKoreanPlugin, danaRv2Plugin, configBuilderPlugin, commandQueue, activePlugin, detailedBolusInfoStorage, treatmentsPlugin, injector) val forTesting: MessageBase = MsgStatusAPS_v2(aapsLogger, danaRPump) val testPacket: MessageBase = messageHashTableRv2.findMessage(forTesting.command) Assert.assertEquals(0xE001, testPacket.command.toLong()) @@ -51,4 +51,4 @@ class MessageHashTable_rv2Test : DanaRTestBase() { messageHashTableRv2.put(testMessage) Assert.assertEquals(0xE005, messageHashTableRv2.findMessage(0xE005).command.toLong()) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgCheckValue_v2Test.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgCheckValue_v2Test.kt index 71a361e8c5..2fe7dfa946 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgCheckValue_v2Test.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgCheckValue_v2Test.kt @@ -17,7 +17,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner @RunWith(PowerMockRunner::class) -@PrepareForTest(DanaRKoreanPlugin::class, DanaRPlugin::class, DanaRv2Plugin::class) +@PrepareForTest(DanaRKoreanPlugin::class, DanaRPlugin::class, DanaRv2Plugin::class, ConfigBuilderPlugin::class) class MsgCheckValue_v2Test : DanaRTestBase() { val rxBus = RxBusWrapper() @@ -35,4 +35,4 @@ class MsgCheckValue_v2Test : DanaRTestBase() { packet.handleMessage(createArray(34, 3.toByte())) Assert.assertEquals(DanaRPump.EXPORT_MODEL, danaRPump.model) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2Test.kt b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2Test.kt index 51e0a5585a..ded2eee1e1 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2Test.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/pump/danaRv2/comm/MsgHistoryEvents_v2Test.kt @@ -23,7 +23,7 @@ class MsgHistoryEvents_v2Test : DanaRTestBase() { @Mock lateinit var treatmentsPlugin: TreatmentsPlugin @Test @Throws(Exception::class) fun runTest() { - var packet = MsgHistoryEvents_v2(aapsLogger, resourceHelper, detailedBolusInfoStorage, danaRv2Plugin, RxBusWrapper(), treatmentsPlugin, 0) + var packet = MsgHistoryEvents_v2(aapsLogger, resourceHelper, detailedBolusInfoStorage, danaRv2Plugin, RxBusWrapper(), treatmentsPlugin, injector, 0) // test message decoding val array = ByteArray(100) @@ -36,4 +36,4 @@ class MsgHistoryEvents_v2Test : DanaRTestBase() { packet.handleMessage(array) Assert.assertEquals(false, danaRv2Plugin.eventsLoadingDone) } -} \ No newline at end of file +} diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt index 7cf920af02..5a23ced907 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/treatments/TreatmentsPluginTest.kt @@ -1,6 +1,8 @@ package info.nightscout.androidaps.plugins.treatments import android.content.Context +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.TestBaseWithProfile import info.nightscout.androidaps.db.DatabaseHelper @@ -32,6 +34,14 @@ class TreatmentsPluginTest : TestBaseWithProfile() { @Mock lateinit var databaseHelper: DatabaseHelper @Mock lateinit var treatmentService: TreatmentService + val injector = HasAndroidInjector { + AndroidInjector { + if (it is TemporaryBasal) { + it.profileFunction = profileFunction + } + } + } + lateinit var insulinOrefRapidActingPlugin: InsulinOrefRapidActingPlugin lateinit var sot: TreatmentsPlugin @@ -53,7 +63,7 @@ class TreatmentsPluginTest : TestBaseWithProfile() { fun `zero TBR should produce zero absolute insulin`() { val now = DateUtil.now() val tbrs : MutableList = ArrayList() - tbrs.add(TemporaryBasal().date(now - T.hours(30). msecs()).duration(10000).percent(0)) + tbrs.add(TemporaryBasal(injector).date(now - T.hours(30). msecs()).duration(10000).percent(0)) `when`(databaseHelper.getTemporaryBasalsDataFromTime(ArgumentMatchers.anyLong(), ArgumentMatchers.anyBoolean())).thenReturn(tbrs) sot.initializeData(T.hours(30). msecs()) @@ -69,7 +79,7 @@ class TreatmentsPluginTest : TestBaseWithProfile() { sot.initializeData(T.hours(30). msecs()) val iob100pct = sot.getAbsoluteIOBTempBasals(now) - tbrs.add(TemporaryBasal().date(now - T.hours(30). msecs()).duration(10000).percent(90)) + tbrs.add(TemporaryBasal(injector).date(now - T.hours(30). msecs()).duration(10000).percent(90)) sot.initializeData(T.hours(30). msecs()) val iob90pct = sot.getAbsoluteIOBTempBasals(now) Assert.assertTrue(iob100pct.iob > iob90pct.iob) @@ -83,9 +93,9 @@ class TreatmentsPluginTest : TestBaseWithProfile() { sot.initializeData(T.hours(30). msecs()) val iob100pct = sot.getAbsoluteIOBTempBasals(now) - tbrs.add(TemporaryBasal().date(now - T.hours(30). msecs()).duration(10000).percent(110)) + tbrs.add(TemporaryBasal(injector).date(now - T.hours(30). msecs()).duration(10000).percent(110)) sot.initializeData(T.hours(30). msecs()) val iob110pct = sot.getAbsoluteIOBTempBasals(now) Assert.assertEquals(1.1, iob110pct.iob / iob100pct.iob, 0.0001) } -} \ No newline at end of file +} diff --git a/build.gradle b/build.gradle index e2d3d72abf..579db1fcbf 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.6.2' + classpath 'com.android.tools.build:gradle:3.6.3' classpath 'com.google.gms:google-services:4.3.3' classpath 'io.fabric.tools:gradle:1.31.2'