From 6cd046459acb69c48c2b8463ba75129d939e9d7e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 22 May 2017 20:58:05 +0200 Subject: [PATCH] original treatmens plugin removed, temp basals working --- .../info/nightscout/androidaps/MainApp.java | 2 - .../androidaps/db/DatabaseHelper.java | 225 ++++++--- .../androidaps/db/ExtendedBolus.java | 2 +- .../nightscout/androidaps/db/TempExBasal.java | 225 --------- .../androidaps/db/TemporaryBasal.java | 14 +- .../interfaces/TreatmentsInterface.java | 20 +- .../ConfigBuilder/ConfigBuilderPlugin.java | 35 +- .../DetermineBasalAdapterAMAJS.java | 6 +- .../plugins/Overview/OverviewFragment.java | 8 +- .../PersistentNotificationPlugin.java | 6 +- .../plugins/PumpDanaR/DanaRPlugin.java | 22 +- .../comm/MsgStatusBolusExtended.java | 28 +- .../PumpDanaR/comm/MsgStatusTempBasal.java | 26 +- .../PumpDanaRKorean/DanaRKoreanPlugin.java | 49 +- .../plugins/PumpDanaRv2/DanaRv2Plugin.java | 18 +- .../androidaps/plugins/PumpMDI/MDIPlugin.java | 4 +- .../PumpVirtual/VirtualPumpPlugin.java | 53 +- .../Treatments/TreatmentsFragment.java | 73 --- .../plugins/Treatments/TreatmentsPlugin.java | 461 ------------------ .../TreatmentsFromHistoryFragment.java | 50 +- .../TreatmentsFromHistoryPlugin.java | 168 ++++--- .../fragments/TreatmentsBolusFragment.java | 22 +- .../TreatmentsTemporaryBasalsFragment.java} | 65 ++- .../wearintegration/WatchUpdaterService.java | 130 ++--- .../XDripStatusline/StatuslinePlugin.java | 23 +- .../utils/OverlappingIntervals.java | 55 ++- .../main/res/layout/tempbasals_fragment.xml | 5 +- app/src/main/res/layout/tempbasals_item.xml | 38 +- app/src/main/res/values/colors.xml | 2 +- 29 files changed, 610 insertions(+), 1225 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/db/TempExBasal.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java rename app/src/main/java/info/nightscout/androidaps/plugins/{Treatments => TreatmentsFromHistory}/fragments/TreatmentsBolusFragment.java (92%) rename app/src/main/java/info/nightscout/androidaps/plugins/{Treatments/fragments/TreatmentsTempBasalsFragment.java => TreatmentsFromHistory/fragments/TreatmentsTemporaryBasalsFragment.java} (78%) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index e504034d31..bf7939ca00 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -52,7 +52,6 @@ import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gFragment; import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment; import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripFragment; import info.nightscout.androidaps.plugins.TempTargetRange.TempTargetRangeFragment; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpFragment; import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryFragment; import info.nightscout.androidaps.plugins.Wear.WearFragment; @@ -113,7 +112,6 @@ public class MainApp extends Application { if (Config.OTHERPROFILES) pluginsList.add(CircadianPercentageProfileFragment.getPlugin()); if (Config.APS) pluginsList.add(TempTargetRangeFragment.getPlugin()); - pluginsList.add(TreatmentsFragment.getPlugin()); pluginsList.add(TreatmentsFromHistoryFragment.getPlugin()); if (Config.SAFETY) pluginsList.add(SafetyFragment.getPlugin()); if (Config.APS) pluginsList.add(ObjectivesFragment.getPlugin()); diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index 69fd03fdb0..9248c17dfa 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -31,7 +31,9 @@ import java.util.concurrent.TimeUnit; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.events.EventExtendedBolusChange; import info.nightscout.androidaps.events.EventNewBG; +import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; @@ -43,7 +45,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public static final String DATABASE_NAME = "AndroidAPSDb"; public static final String DATABASE_BGREADINGS = "BgReadings"; - public static final String DATABASE_TEMPEXBASALS = "TempBasals"; public static final String DATABASE_TEMPORARYBASALS = "TemporaryBasals"; public static final String DATABASE_EXTENDEDBOLUSES = "ExtendedBoluses"; public static final String DATABASE_TEMPTARGETS = "TempTargets"; @@ -55,8 +56,14 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { private static Long latestTreatmentChange = null; - private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); - private static ScheduledFuture scheduledPost = null; + private static final ScheduledExecutorService treatmentsWorker = Executors.newSingleThreadScheduledExecutor(); + private static ScheduledFuture scheduledTratmentPost = null; + + private static final ScheduledExecutorService tempBasalsWorker = Executors.newSingleThreadScheduledExecutor(); + private static ScheduledFuture scheduledTemBasalsPost = null; + + private static final ScheduledExecutorService extendedBolusWorker = Executors.newSingleThreadScheduledExecutor(); + private static ScheduledFuture scheduledExtendedBolusPost = null; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); @@ -67,7 +74,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { try { log.info("onCreate"); - TableUtils.createTableIfNotExists(connectionSource, TempExBasal.class); TableUtils.createTableIfNotExists(connectionSource, TempTarget.class); TableUtils.createTableIfNotExists(connectionSource, Treatment.class); TableUtils.createTableIfNotExists(connectionSource, BgReading.class); @@ -85,7 +91,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { log.info(DatabaseHelper.class.getName(), "onUpgrade"); - TableUtils.dropTable(connectionSource, TempExBasal.class, true); TableUtils.dropTable(connectionSource, TempTarget.class, true); TableUtils.dropTable(connectionSource, Treatment.class, true); TableUtils.dropTable(connectionSource, BgReading.class, true); @@ -114,10 +119,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { getWritableDatabase().delete(DATABASE_BGREADINGS, "date" + " < '" + (new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) + "'", null); log.debug("After BgReadings size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_BGREADINGS)); - log.debug("Before TempBasals size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPEXBASALS)); - getWritableDatabase().delete(DATABASE_TEMPEXBASALS, "date" + " < '" + (new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) + "'", null); - log.debug("After TempBasals size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPEXBASALS)); - log.debug("Before TempTargets size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPTARGETS)); getWritableDatabase().delete(DATABASE_TEMPTARGETS, "date" + " < '" + (new Date().getTime() - Constants.hoursToKeepInDatabase * 60 * 60 * 1000L) + "'", null); log.debug("After TempTargets size: " + DatabaseUtils.queryNumEntries(getReadableDatabase(), DATABASE_TEMPTARGETS)); @@ -147,7 +148,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public void resetDatabases() { try { - TableUtils.dropTable(connectionSource, TempExBasal.class, true); TableUtils.dropTable(connectionSource, TempTarget.class, true); TableUtils.dropTable(connectionSource, Treatment.class, true); TableUtils.dropTable(connectionSource, BgReading.class, true); @@ -156,7 +156,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.dropTable(connectionSource, TemporaryBasal.class, true); TableUtils.dropTable(connectionSource, ExtendedBolus.class, true); //DbRequests can be cleared from NSClient fragment - TableUtils.createTableIfNotExists(connectionSource, TempExBasal.class); TableUtils.createTableIfNotExists(connectionSource, TempTarget.class); TableUtils.createTableIfNotExists(connectionSource, Treatment.class); TableUtils.createTableIfNotExists(connectionSource, BgReading.class); @@ -178,6 +177,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { } catch (SQLException e) { e.printStackTrace(); } + scheduleTreatmentChange(); } public void resetTempTargets() { @@ -196,6 +196,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { } catch (SQLException e) { e.printStackTrace(); } + scheduleTemporaryBasalChange(); } public void resetExtededBoluses() { @@ -205,14 +206,11 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { } catch (SQLException e) { e.printStackTrace(); } + scheduleExtendedBolusChange(); } // ------------------ getDao ------------------------------------------- - private Dao getDaoTempBasals() throws SQLException { - return getDao(TempExBasal.class); - } - private Dao getDaoTempTargets() throws SQLException { return getDao(TempTarget.class); } @@ -233,11 +231,11 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return getDao(DbRequest.class); } - private Dao getDaoTemporaryBasal() throws SQLException { + private Dao getDaoTemporaryBasal() throws SQLException { return getDao(TemporaryBasal.class); } - private Dao getDaoExtendedBolus() throws SQLException { + private Dao getDaoExtendedBolus() throws SQLException { return getDao(ExtendedBolus.class); } @@ -510,16 +508,16 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { if (latestTreatmentChange != null) MainApp.bus().post(new EventNewHistoryData(latestTreatmentChange)); latestTreatmentChange = null; - scheduledPost = null; + scheduledTratmentPost = null; } } // prepare task for execution in 5 sec // cancel waiting task to prevent sending multiple posts - if (scheduledPost != null) - scheduledPost.cancel(false); + if (scheduledTratmentPost != null) + scheduledTratmentPost.cancel(false); Runnable task = new PostRunnable(); final int sec = 5; - scheduledPost = worker.schedule(task, sec, TimeUnit.SECONDS); + scheduledTratmentPost = treatmentsWorker.schedule(task, sec, TimeUnit.SECONDS); } @@ -540,57 +538,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return new ArrayList(); } - // ------------ TempExBasal handling --------------- - - public int update(TempExBasal tempBasal) { - int updated = 0; - try { - updated = getDaoTempBasals().update(tempBasal); - latestTreatmentChange = tempBasal.timeIndex; - } catch (SQLException e) { - e.printStackTrace(); - } - scheduleTreatmentChange(); - return updated; - } - - public void create(TempExBasal tempBasal) { - try { - getDaoTempBasals().create(tempBasal); - latestTreatmentChange = tempBasal.timeIndex; - } catch (SQLException e) { - e.printStackTrace(); - } - scheduleTreatmentChange(); - } - - public void delete(TempExBasal tempBasal) { - try { - getDaoTempBasals().delete(tempBasal); - latestTreatmentChange = tempBasal.timeIndex; - } catch (SQLException e) { - e.printStackTrace(); - } - scheduleTreatmentChange(); - } - - public List getTempbasalsDataFromTime(long mills, boolean ascending, boolean isExtended) { - try { - Dao daoTempbasals = getDaoTempBasals(); - List tempbasals; - QueryBuilder queryBuilder = daoTempbasals.queryBuilder(); - queryBuilder.orderBy("timeIndex", ascending); - Where where = queryBuilder.where(); - where.ge("timeIndex", mills).and().eq("isExtended", isExtended); - PreparedQuery preparedQuery = queryBuilder.prepare(); - tempbasals = daoTempbasals.query(preparedQuery); - return tempbasals; - } catch (SQLException e) { - e.printStackTrace(); - } - return new ArrayList(); - } - // ---------------- TempTargets handling --------------- public List getTemptargetsDataFromTime(long mills, boolean ascending) { @@ -746,5 +693,139 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { } } + // ------------ TemporaryBasal handling --------------- + + public int update(TemporaryBasal tempBasal) { + int updated = 0; + try { + updated = getDaoTemporaryBasal().update(tempBasal); + latestTreatmentChange = tempBasal.date; + } catch (SQLException e) { + e.printStackTrace(); + } + scheduleTemporaryBasalChange(); + return updated; + } + + public void create(TemporaryBasal tempBasal) { + try { + getDaoTemporaryBasal().create(tempBasal); + latestTreatmentChange = tempBasal.date; + } catch (SQLException e) { + e.printStackTrace(); + } + scheduleTemporaryBasalChange(); + } + + public void delete(TemporaryBasal tempBasal) { + try { + getDaoTemporaryBasal().delete(tempBasal); + latestTreatmentChange = tempBasal.date; + } catch (SQLException e) { + e.printStackTrace(); + } + scheduleTemporaryBasalChange(); + } + + public List getTemporaryBasalsDataFromTime(long mills, boolean ascending) { + try { + List tempbasals; + QueryBuilder queryBuilder = getDaoTemporaryBasal().queryBuilder(); + queryBuilder.orderBy("date", ascending); + Where where = queryBuilder.where(); + where.ge("date", mills); + PreparedQuery preparedQuery = queryBuilder.prepare(); + tempbasals = getDaoTemporaryBasal().query(preparedQuery); + return tempbasals; + } catch (SQLException e) { + e.printStackTrace(); + } + return new ArrayList(); + } + + static public void scheduleTemporaryBasalChange() { + class PostRunnable implements Runnable { + public void run() { + MainApp.bus().post(new EventTempBasalChange()); + scheduledTemBasalsPost = null; + } + } + // prepare task for execution in 5 sec + // cancel waiting task to prevent sending multiple posts + if (scheduledTemBasalsPost != null) + scheduledTemBasalsPost.cancel(false); + Runnable task = new PostRunnable(); + final int sec = 5; + scheduledTemBasalsPost = tempBasalsWorker.schedule(task, sec, TimeUnit.SECONDS); + + } + + // ------------ ExtendedBolus handling --------------- + + public int update(ExtendedBolus extendedBolus) { + int updated = 0; + try { + updated = getDaoExtendedBolus().update(extendedBolus); + latestTreatmentChange = extendedBolus.date; + } catch (SQLException e) { + e.printStackTrace(); + } + scheduleExtendedBolusChange(); + return updated; + } + + public void create(ExtendedBolus extendedBolus) { + try { + getDaoExtendedBolus().create(extendedBolus); + latestTreatmentChange = extendedBolus.date; + } catch (SQLException e) { + e.printStackTrace(); + } + scheduleExtendedBolusChange(); + } + + public void delete(ExtendedBolus extendedBolus) { + try { + getDaoExtendedBolus().delete(extendedBolus); + latestTreatmentChange = extendedBolus.date; + } catch (SQLException e) { + e.printStackTrace(); + } + scheduleExtendedBolusChange(); + } + + public List getExtendedBolusDataFromTime(long mills, boolean ascending) { + try { + List extendedBoluses; + QueryBuilder queryBuilder = getDaoExtendedBolus().queryBuilder(); + queryBuilder.orderBy("date", ascending); + Where where = queryBuilder.where(); + where.ge("date", mills); + PreparedQuery preparedQuery = queryBuilder.prepare(); + extendedBoluses = getDaoExtendedBolus().query(preparedQuery); + return extendedBoluses; + } catch (SQLException e) { + e.printStackTrace(); + } + return new ArrayList(); + } + + static public void scheduleExtendedBolusChange() { + class PostRunnable implements Runnable { + public void run() { + MainApp.bus().post(new EventExtendedBolusChange()); + scheduledExtendedBolusPost = null; + } + } + // prepare task for execution in 5 sec + // cancel waiting task to prevent sending multiple posts + if (scheduledExtendedBolusPost != null) + scheduledExtendedBolusPost.cancel(false); + Runnable task = new PostRunnable(); + final int sec = 5; + scheduledExtendedBolusPost = extendedBolusWorker.schedule(task, sec, TimeUnit.SECONDS); + + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java index f7404bcbee..a69925079c 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java @@ -112,7 +112,7 @@ public class ExtendedBolus implements Interval { "}"; } - double absoluteRate() { + public double absoluteRate() { return Round.roundTo(insulin / durationInMinutes * 60, 0.01); } diff --git a/app/src/main/java/info/nightscout/androidaps/db/TempExBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TempExBasal.java deleted file mode 100644 index f715fc42e9..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/db/TempExBasal.java +++ /dev/null @@ -1,225 +0,0 @@ -package info.nightscout.androidaps.db; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Date; - -import info.nightscout.androidaps.data.Iob; -import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.interfaces.InsulinInterface; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.utils.DateUtil; -import info.nightscout.utils.DecimalFormatter; - -@DatabaseTable(tableName = DatabaseHelper.DATABASE_TEMPEXBASALS) -public class TempExBasal { - private static Logger log = LoggerFactory.getLogger(TempExBasal.class); - - @DatabaseField(id = true) - public long timeIndex; - - @DatabaseField - public Date timeStart; - - @DatabaseField - public Date timeEnd; - - @DatabaseField - public int percent; // In % of current basal. 100% == current basal - - @DatabaseField - public Double absolute; // Absolute value in U - - @DatabaseField - public int duration; // in minutes - - @DatabaseField - public boolean isExtended = false; // true if set as extended bolus - - @DatabaseField - public boolean isAbsolute = false; // true if if set as absolute value in U - - - public IobTotal iobCalc(long time) { - IobTotal result = new IobTotal(time); - NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile(); - InsulinInterface insulinInterface = ConfigBuilderPlugin.getActiveInsulin(); - - if (profile == null) - return result; - - int realDuration = getDurationToTime(time); - Double netBasalAmount = 0d; - - if (realDuration > 0) { - Double netBasalRate = 0d; - - Double dia_ago = time - profile.getDia() * 60 * 60 * 1000; - int aboutFiveMinIntervals = (int) Math.ceil(realDuration / 5d); - double tempBolusSpacing = realDuration / aboutFiveMinIntervals; - - for (Long j = 0L; j < aboutFiveMinIntervals; j++) { - // find middle of the interval - Long date = (long) (timeStart.getTime() + j * tempBolusSpacing * 60 * 1000 + 0.5d * tempBolusSpacing * 60 * 1000); - - Double basalRate = profile.getBasal(NSProfile.secondsFromMidnight(date)); - - if (basalRate == null) - continue; - if (isExtended) { - netBasalRate = this.absolute; - } else { - if (this.isAbsolute) { - netBasalRate = this.absolute - basalRate; - } else { - netBasalRate = (this.percent - 100) / 100d * basalRate; - } - } - - if (date > dia_ago && date <= time) { - double tempBolusSize = netBasalRate * tempBolusSpacing / 60d; - netBasalAmount += tempBolusSize; - - Treatment tempBolusPart = new Treatment(insulinInterface); - tempBolusPart.insulin = tempBolusSize; - tempBolusPart.date = date; - - Iob aIOB = insulinInterface.iobCalcForTreatment(tempBolusPart, time, profile.getDia()); - result.basaliob += aIOB.iobContrib; - result.activity += aIOB.activityContrib; - result.netbasalinsulin += tempBolusPart.insulin; - if (tempBolusPart.insulin > 0) { - result.hightempinsulin += tempBolusPart.insulin; - } - } - result.netRatio = netBasalRate; // ratio at the end of interval - } - } - result.netInsulin = netBasalAmount; - return result; - } - - // Determine end of basal - public long getTimeEnd() { - long tempBasalTimePlannedEnd = getPlannedTimeEnd(); - long now = new Date().getTime(); - - if (timeEnd != null && timeEnd.getTime() < tempBasalTimePlannedEnd) { - tempBasalTimePlannedEnd = timeEnd.getTime(); - } - - if (now < tempBasalTimePlannedEnd) - tempBasalTimePlannedEnd = now; - - return tempBasalTimePlannedEnd; - } - - public long getPlannedTimeEnd() { - return timeStart.getTime() + 60 * 1_000 * duration; - } - - public int getRealDuration() { - long msecs = getTimeEnd() - timeStart.getTime(); - return Math.round(msecs / 60f / 1000); - } - - private int getDurationToTime(long time) { - long endTime = Math.min(time, getTimeEnd()); - long msecs = endTime - timeStart.getTime(); - return Math.round(msecs / 60f / 1000); - } - - public long getMillisecondsFromStart() { - return new Date().getTime() - timeStart.getTime(); - } - - public int getPlannedRemainingMinutes() { - if (timeEnd != null) return 0; - float remainingMin = (getPlannedTimeEnd() - new Date().getTime()) / 1000f / 60; - return (remainingMin < 0) ? 0 : Math.round(remainingMin); - } - - public boolean isInProgress() { - return isInProgress(new Date().getTime()); - } - - public double tempBasalConvertedToAbsolute(Date time) { - if (isExtended) { - NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile(); - return profile.getBasal(NSProfile.secondsFromMidnight(time)) + absolute; - } else { - if (isAbsolute) return absolute; - else { - NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile(); - return profile.getBasal(NSProfile.secondsFromMidnight(time)) * percent / 100; - } - } - } - - public boolean isInProgress(long time) { - if (timeStart.getTime() > time) return false; // in the future - if (timeEnd == null) { // open end - if (timeStart.getTime() < time && getPlannedTimeEnd() > time) - return true; // in interval - return false; - } - // closed end - if (timeStart.getTime() < time && timeEnd.getTime() > time) - return true; // in interval - return false; - } - - public String log() { - return "TempExBasal{" + - "timeIndex=" + timeIndex + - ", timeStart=" + timeStart + - ", timeEnd=" + timeEnd + - ", percent=" + percent + - ", absolute=" + absolute + - ", duration=" + duration + - ", isAbsolute=" + isAbsolute + - ", isExtended=" + isExtended + - '}'; - } - - public String toString() { - String extended = isExtended ? "E " : ""; - - if (isAbsolute) { - return extended + DecimalFormatter.to2Decimal(absolute) + "U/h @" + - DateUtil.timeString(timeStart) + - " " + getRealDuration() + "/" + duration + "min"; - } else { // percent - return percent + "% @" + - DateUtil.timeString(timeStart) + - " " + getRealDuration() + "/" + duration + "min"; - } - } - - public String toStringShort() { - String extended = isExtended ? "E" : ""; - - if (isAbsolute) { - return extended + DecimalFormatter.to2Decimal(absolute) + "U/h "; - } else { // percent - return percent + "% "; - } - } - - public String toStringMedium() { - String extended = isExtended ? "E" : ""; - - if (isAbsolute) { - return extended + DecimalFormatter.to2Decimal(absolute) + "U/h (" - + getRealDuration() + "/" + duration + ") "; - } else { // percent - return percent + "% (" + getRealDuration() + "/" + duration + ") "; - } - } - -} 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 b3b35ec978..9a3400817c 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java @@ -45,6 +45,18 @@ public class TemporaryBasal implements Interval { @DatabaseField public double absoluteRate = 0d; + public TemporaryBasal() {} + + public TemporaryBasal(ExtendedBolus extendedBolus) { + this.date = extendedBolus.date; + this.isValid = extendedBolus.isValid; + this.source = extendedBolus.source; + this._id = extendedBolus._id; + this.durationInMinutes = extendedBolus.durationInMinutes; + this.isAbsolute = true; + this.absoluteRate = extendedBolus.absoluteRate(); + } + // -------- Interval interface --------- Long cuttedEnd = null; @@ -167,7 +179,7 @@ public class TemporaryBasal implements Interval { return match(new Date().getTime()); } - public double tempBasalConvertedToAbsolute(Date time) { + public double tempBasalConvertedToAbsolute(long time) { if (isAbsolute) return absoluteRate; else { NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile(); diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java index ce19b519df..804a6a05be 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java @@ -2,10 +2,12 @@ package info.nightscout.androidaps.interfaces; import java.util.List; -import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.db.TempExBasal; -import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.data.IobTotal; +import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.db.Treatment; +import info.nightscout.utils.OverlappingIntervals; /** * Created by mike on 14.06.2016. @@ -27,21 +29,23 @@ public interface TreatmentsInterface { // real basals on pump boolean isRealTempBasalInProgress(); - TempExBasal getRealTempBasal (long time); + TemporaryBasal getRealTempBasal (long time); - void tempBasalStart(TempExBasal tempBasal); + void tempBasalStart(TemporaryBasal tempBasal); void tempBasalStop(long time); // basal that can be faked by extended boluses boolean isTempBasalInProgress(); - TempExBasal getTempBasal (long time); + TemporaryBasal getTempBasal (long time); double getTempBasalAbsoluteRate(); double getTempBasalRemainingMinutes(); + OverlappingIntervals getTemporaryBasals(); boolean isExtendedBoluslInProgress(); - TempExBasal getExtendedBolus (long time); - void extendedBolusStart(TempExBasal extendedBolus); + ExtendedBolus getExtendedBolus (long time); + void extendedBolusStart(ExtendedBolus extendedBolus); void extendedBolusStop(long time); + OverlappingIntervals getExtendedBoluses(); long oldestDataAvaialable(); 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 index d9831f4145..11c135e59b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java @@ -25,11 +25,10 @@ import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventBolusRequested; -import info.nightscout.androidaps.events.EventExtendedBolusChange; -import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.BgSourceInterface; @@ -56,6 +55,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgError; import info.nightscout.utils.BatteryLevel; import info.nightscout.utils.DateUtil; +import info.nightscout.utils.OverlappingIntervals; import info.nightscout.utils.SP; /** @@ -553,7 +553,6 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } else { uploadTempBasalStartAbsolute(result.absolute, result.duration); } - MainApp.bus().post(new EventTempBasalChange()); } return result; } @@ -573,7 +572,6 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain log.debug("setTempBasalPercent percent: " + percentAfterConstraints + " durationInMinutes: " + durationInMinutes + " success: " + result.success + " enacted: " + result.enacted); if (result.enacted && result.success) { uploadTempBasalStartPercent(result.percent, result.duration); - MainApp.bus().post(new EventTempBasalChange()); } return result; } @@ -598,7 +596,6 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain log.debug("cancelTempBasal success: " + result.success + " enacted: " + result.enacted); if (result.enacted && result.success) { uploadTempBasalEnd(); - MainApp.bus().post(new EventTempBasalChange()); } return result; } @@ -1179,7 +1176,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public TempExBasal getRealTempBasal(long time) { + public TemporaryBasal getRealTempBasal(long time) { return activeTreatments.getRealTempBasal(time); } @@ -1189,7 +1186,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public TempExBasal getTempBasal(long time) { + public TemporaryBasal getTempBasal(long time) { return activeTreatments.getTempBasal(time); } @@ -1204,15 +1201,18 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public void tempBasalStart(TempExBasal tempBasal) { + public OverlappingIntervals getTemporaryBasals() { + return activeTreatments.getTemporaryBasals(); + } + + @Override + public void tempBasalStart(TemporaryBasal tempBasal) { activeTreatments.tempBasalStart(tempBasal); - MainApp.bus().post(new EventTempBasalChange()); } @Override public void tempBasalStop(long time) { activeTreatments.tempBasalStop(time); - MainApp.bus().post(new EventTempBasalChange()); } @Override @@ -1221,20 +1221,23 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public TempExBasal getExtendedBolus(long time) { + public ExtendedBolus getExtendedBolus(long time) { return activeTreatments.getExtendedBolus(time); } @Override - public void extendedBolusStart(TempExBasal tempBasal) { - activeTreatments.extendedBolusStart(tempBasal); - MainApp.bus().post(new EventExtendedBolusChange()); + public void extendedBolusStart(ExtendedBolus extendedBolus) { + activeTreatments.extendedBolusStart(extendedBolus); } @Override public void extendedBolusStop(long time) { activeTreatments.extendedBolusStop(time); - MainApp.bus().post(new EventExtendedBolusChange()); + } + + @Override + public OverlappingIntervals getExtendedBoluses() { + return activeTreatments.getExtendedBoluses(); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index 5bffdfc2e1..49402da15c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -16,12 +16,12 @@ import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.GlucoseStatus; +import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.ScriptReader; -import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.utils.SP; @@ -232,7 +232,7 @@ public class DetermineBasalAdapterAMAJS { mCurrentTemp.add("rate", MainApp.getConfigBuilder().getTempBasalAbsoluteRate()); // as we have non default temps longer than 30 mintues - TempExBasal tempBasal = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); + TemporaryBasal tempBasal = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); if(tempBasal != null){ mCurrentTemp.add("minutesrunning", tempBasal.getRealDuration()); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index ba351d0214..67c3212f09 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -67,8 +67,8 @@ import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; -import info.nightscout.androidaps.db.TempExBasal; import info.nightscout.androidaps.db.TempTarget; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventExtendedBolusChange; import info.nightscout.androidaps.events.EventInitializationChanged; @@ -898,7 +898,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, calibrationButton.setVisibility(View.GONE); } - TempExBasal activeTemp = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); + TemporaryBasal activeTemp = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); if (MainApp.getConfigBuilder().isTempBasalInProgress()) { cancelTempButton.setVisibility(View.VISIBLE); cancelTempButton.setText(MainApp.instance().getString(R.string.cancel) + "\n" + activeTemp.toStringShort()); @@ -1084,13 +1084,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, double lastBaseBasal = 0; double lastTempBasal = 0; for (long time = fromTime; time < now; time += 5 * 60 * 1000L) { - TempExBasal tb = MainApp.getConfigBuilder().getTempBasal(time); + TemporaryBasal tb = MainApp.getConfigBuilder().getTempBasal(time); double baseBasalValue = profile.getBasal(NSProfile.secondsFromMidnight(new Date(time))); double baseLineValue = baseBasalValue; double tempBasalValue = 0; double basal = 0d; if (tb != null) { - tempBasalValue = tb.tempBasalConvertedToAbsolute(new Date(time)); + tempBasalValue = tb.tempBasalConvertedToAbsolute(new Date(time).getTime()); if (tempBasalValue != lastTempBasal) { tempBasalArray.add(new DataPoint(time, lastTempBasal)); tempBasalArray.add(new DataPoint(time, basal = tempBasalValue)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index c5021f244d..e8a2f9a769 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -18,9 +18,10 @@ import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.GlucoseStatus; +import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.events.EventExtendedBolusChange; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventNewBG; @@ -31,7 +32,6 @@ import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.utils.DecimalFormatter; @@ -140,7 +140,7 @@ public class PersistentNotificationPlugin implements PluginBase{ PumpInterface pump = MainApp.getConfigBuilder(); if (MainApp.getConfigBuilder().isTempBasalInProgress()) { - TempExBasal activeTemp = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); + TemporaryBasal activeTemp = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); line1 += " " + activeTemp.toStringShort(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index dd6d510f60..97c42a1f13 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -25,7 +25,8 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; @@ -42,7 +43,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotificati import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin; import info.nightscout.androidaps.plugins.PumpDanaR.services.DanaRExecutionService; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.Round; @@ -220,7 +221,7 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf @Override public String treatmentPlugin() { - return TreatmentsPlugin.class.getName(); + return TreatmentsFromHistoryPlugin.class.getName(); } @Override @@ -400,7 +401,7 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf // Check if some temp is already in progress if (MainApp.getConfigBuilder().isTempBasalInProgress()) { // Correct basal already set ? - if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()).percent == percentRate) { + if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()).percentRate == percentRate) { result.success = true; result.percent = percentRate; result.absolute = MainApp.getConfigBuilder().getTempBasalAbsoluteRate(); @@ -670,12 +671,17 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf extended.put("PumpIOB", getDanaRPump().iob); extended.put("LastBolus", getDanaRPump().lastBolusTime.toLocaleString()); extended.put("LastBolusAmount", getDanaRPump().lastBolusAmount); - TempExBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); + TemporaryBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); if (tb != null) { - extended.put("TempBasalAbsoluteRate", MainApp.getConfigBuilder().getTempBasalAbsoluteRate()); - extended.put("TempBasalStart", tb.timeStart.toLocaleString()); + extended.put("TempBasalAbsoluteRate", tb.tempBasalConvertedToAbsolute(new Date().getTime())); + extended.put("TempBasalStart", DateUtil.dateAndTimeString(tb.date)); extended.put("TempBasalRemaining", tb.getPlannedRemainingMinutes()); - extended.put("IsExtended", tb.isExtended); + } + ExtendedBolus eb = MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()); + if (eb != null) { + extended.put("ExtendedBolusAbsoluteRate", eb.absoluteRate()); + extended.put("ExtendedBolusStart", DateUtil.dateAndTimeString(eb.date)); + extended.put("ExtendedBolusRemaining", eb.getPlannedRemainingMinutes()); } extended.put("BaseBasalRate", getBaseBasalRate()); try { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java index c42cfccaa0..5f64913cbd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java @@ -9,7 +9,7 @@ import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -69,18 +69,16 @@ public class MsgStatusBolusExtended extends MessageBase { long now = new Date().getTime(); if (treatmentsInterface.isExtendedBoluslInProgress()) { - TempExBasal extendedBolus = treatmentsInterface.getExtendedBolus(new Date().getTime()); + ExtendedBolus extendedBolus = treatmentsInterface.getExtendedBolus(new Date().getTime()); if (pump.isExtendedInProgress) { - if (extendedBolus.absolute != pump.extendedBolusAbsoluteRate) { + if (extendedBolus.absoluteRate() != pump.extendedBolusAbsoluteRate) { // Close current extended - treatmentsInterface.extendedBolusStop(now); + treatmentsInterface.extendedBolusStop(now - 1000); // Create new - TempExBasal newExtended = new TempExBasal(); - newExtended.timeStart = new Date(now); - newExtended.absolute = pump.extendedBolusAbsoluteRate; - newExtended.isAbsolute = true; - newExtended.duration = pump.extendedBolusMinutes; - newExtended.isExtended = true; + ExtendedBolus newExtended = new ExtendedBolus(); + newExtended.date = new Date(now).getTime(); + newExtended.insulin = pump.extendedBolusAmount; + newExtended.durationInMinutes = pump.extendedBolusMinutes; treatmentsInterface.extendedBolusStart(newExtended); } } else { @@ -90,12 +88,10 @@ public class MsgStatusBolusExtended extends MessageBase { } else { if (pump.isExtendedInProgress) { // Create new - TempExBasal newExtended = new TempExBasal(); - newExtended.timeStart = new Date(now); - newExtended.absolute = pump.extendedBolusAbsoluteRate; - newExtended.isAbsolute = true; - newExtended.duration = pump.extendedBolusMinutes; - newExtended.isExtended = true; + ExtendedBolus newExtended = new ExtendedBolus(); + newExtended.date = new Date(now).getTime(); + newExtended.insulin = pump.extendedBolusAmount; + newExtended.durationInMinutes = pump.extendedBolusMinutes; treatmentsInterface.extendedBolusStart(newExtended); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusTempBasal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusTempBasal.java index 696cb38160..6490a9d852 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusTempBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusTempBasal.java @@ -9,7 +9,7 @@ import java.util.Date; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -63,18 +63,17 @@ public class MsgStatusTempBasal extends MessageBase { long now = new Date().getTime(); if (treatmentsInterface.isTempBasalInProgress()) { - TempExBasal tempBasal = treatmentsInterface.getTempBasal(new Date().getTime()); + TemporaryBasal tempBasal = treatmentsInterface.getTempBasal(new Date().getTime()); if (danaRPump.isTempBasalInProgress) { - if (tempBasal.percent != danaRPump.tempBasalPercent) { + if (tempBasal.percentRate != danaRPump.tempBasalPercent) { // Close current temp basal - treatmentsInterface.tempBasalStop(now); + treatmentsInterface.tempBasalStop(now - 1000); // Create new - TempExBasal newTempBasal = new TempExBasal(); - newTempBasal.timeStart = new Date(now); - newTempBasal.percent = danaRPump.tempBasalPercent; + TemporaryBasal newTempBasal = new TemporaryBasal(); + newTempBasal.date = new Date(now).getTime(); + newTempBasal.percentRate = danaRPump.tempBasalPercent; newTempBasal.isAbsolute = false; - newTempBasal.duration = danaRPump.tempBasalTotalSec / 60; - newTempBasal.isExtended = false; + newTempBasal.durationInMinutes = danaRPump.tempBasalTotalSec / 60; treatmentsInterface.tempBasalStart(newTempBasal); } } else { @@ -84,12 +83,11 @@ public class MsgStatusTempBasal extends MessageBase { } else { if (danaRPump.isTempBasalInProgress) { // Create new - TempExBasal newTempBasal = new TempExBasal(); - newTempBasal.timeStart = new Date(now); - newTempBasal.percent = danaRPump.tempBasalPercent; + TemporaryBasal newTempBasal = new TemporaryBasal(); + newTempBasal.date = new Date(now).getTime(); + newTempBasal.percentRate = danaRPump.tempBasalPercent; newTempBasal.isAbsolute = false; - newTempBasal.duration = danaRPump.tempBasalTotalSec / 60; - newTempBasal.isExtended = false; + newTempBasal.durationInMinutes = danaRPump.tempBasalTotalSec / 60; treatmentsInterface.tempBasalStart(newTempBasal); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index efe2729ec1..2277992525 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -25,7 +25,8 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; @@ -36,14 +37,14 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; -import info.nightscout.androidaps.plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService; -import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; -import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; +import info.nightscout.androidaps.plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.Round; @@ -158,7 +159,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints @Override public String getNameShort() { String name = MainApp.sResources.getString(R.string.danarpump_shortname); - if (!name.trim().isEmpty()){ + if (!name.trim().isEmpty()) { //only if translation exists return name; } @@ -219,7 +220,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints @Override public String treatmentPlugin() { - return TreatmentsPlugin.class.getName(); + return TreatmentsFromHistoryPlugin.class.getName(); } @Override @@ -241,7 +242,8 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints // Pump interface public boolean isTempBasalInProgress() { if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()) != null) return true; - if (MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()) != null && useExtendedBoluses) return true; + if (MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()) != null && useExtendedBoluses) + return true; return false; } @@ -306,11 +308,11 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints return pump.currentBasal; } - public TempExBasal getTempBasal(long time) { - TempExBasal temp = MainApp.getConfigBuilder().getTempBasal(time); + public TemporaryBasal getTempBasal(long time) { + TemporaryBasal temp = MainApp.getConfigBuilder().getTempBasal(time); if (temp != null) return temp; if (useExtendedBoluses) - return MainApp.getConfigBuilder().getExtendedBolus(time); + return new TemporaryBasal(MainApp.getConfigBuilder().getExtendedBolus(time)); return null; } @@ -411,7 +413,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints // Check if some temp is already in progress if (MainApp.getConfigBuilder().isTempBasalInProgress()) { // Correct basal already set ? - if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()).percent == percentRate) { + if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()).percentRate == percentRate) { result.success = true; result.percent = percentRate; result.absolute = MainApp.getConfigBuilder().getTempBasalAbsoluteRate(); @@ -513,7 +515,8 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints log.error("setTempBasalPercent: Invalid input"); return result; } - if (percent > getPumpDescription().maxHighTempPercent) percent = getPumpDescription().maxHighTempPercent; + if (percent > getPumpDescription().maxHighTempPercent) + percent = getPumpDescription().maxHighTempPercent; if (pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = false; result.success = true; @@ -681,12 +684,17 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints extended.put("PumpIOB", pump.iob); // extended.put("LastBolus", pump.lastBolusTime.toLocaleString()); // extended.put("LastBolusAmount", pump.lastBolusAmount); - TempExBasal tb = getTempBasal(new Date().getTime()); + TemporaryBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); if (tb != null) { - extended.put("TempBasalAbsoluteRate", MainApp.getConfigBuilder().getTempBasalAbsoluteRate()); - extended.put("TempBasalStart", tb.timeStart.toLocaleString()); + extended.put("TempBasalAbsoluteRate", tb.tempBasalConvertedToAbsolute(new Date().getTime())); + extended.put("TempBasalStart", DateUtil.dateAndTimeString(tb.date)); extended.put("TempBasalRemaining", tb.getPlannedRemainingMinutes()); - extended.put("IsExtended", tb.isExtended); + } + ExtendedBolus eb = MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()); + if (eb != null) { + extended.put("ExtendedBolusAbsoluteRate", eb.absoluteRate()); + extended.put("ExtendedBolusStart", DateUtil.dateAndTimeString(eb.date)); + extended.put("ExtendedBolusRemaining", eb.getPlannedRemainingMinutes()); } extended.put("BaseBasalRate", getBaseBasalRate()); try { @@ -758,7 +766,8 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints public Integer applyBasalConstraints(Integer percentRate) { Integer origPercentRate = percentRate; if (percentRate < 0) percentRate = 0; - if (percentRate > getPumpDescription().maxHighTempPercent) percentRate = getPumpDescription().maxHighTempPercent; + if (percentRate > getPumpDescription().maxHighTempPercent) + percentRate = getPumpDescription().maxHighTempPercent; if (!Objects.equals(percentRate, origPercentRate) && Config.logConstraintsChanges && !Objects.equals(origPercentRate, Constants.basalPercentOnlyForCheckLimit)) log.debug("Limiting percent rate " + origPercentRate + "% to " + percentRate + "%"); return percentRate; @@ -813,7 +822,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints if (MainApp.getConfigBuilder().isExtendedBoluslInProgress()) { ret += "Extended: " + MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()).toString() + "\n"; } - if (!veryShort){ + if (!veryShort) { ret += "TDD: " + DecimalFormatter.to0Decimal(pump.dailyTotalUnits) + " / " + pump.maxDailyTotalUnits + " U\n"; } ret += "IOB: " + pump.iob + "U\n"; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index 2120589ce6..1a60016a99 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -25,7 +25,8 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.ConstraintsInterface; @@ -365,7 +366,7 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, ConstraintsInte // Check if some temp is already in progress if (MainApp.getConfigBuilder().isTempBasalInProgress()) { // Correct basal already set ? - if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()).percent == percentRate) { + if (MainApp.getConfigBuilder().getTempBasal(new Date().getTime()).percentRate == percentRate) { result.success = true; result.percent = percentRate; result.absolute = MainApp.getConfigBuilder().getTempBasalAbsoluteRate(); @@ -591,12 +592,17 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, ConstraintsInte extended.put("PumpIOB", getDanaRPump().iob); extended.put("LastBolus", getDanaRPump().lastBolusTime.toLocaleString()); extended.put("LastBolusAmount", getDanaRPump().lastBolusAmount); - TempExBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); + TemporaryBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); if (tb != null) { - extended.put("TempBasalAbsoluteRate", MainApp.getConfigBuilder().getTempBasalAbsoluteRate()); - extended.put("TempBasalStart", tb.timeStart.toLocaleString()); + extended.put("TempBasalAbsoluteRate", tb.tempBasalConvertedToAbsolute(new Date().getTime())); + extended.put("TempBasalStart", DateUtil.dateAndTimeString(tb.date)); extended.put("TempBasalRemaining", tb.getPlannedRemainingMinutes()); - extended.put("IsExtended", tb.isExtended); + } + ExtendedBolus eb = MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()); + if (eb != null) { + extended.put("ExtendedBolusAbsoluteRate", eb.absoluteRate()); + extended.put("ExtendedBolusStart", DateUtil.dateAndTimeString(eb.date)); + extended.put("ExtendedBolusRemaining", eb.getPlannedRemainingMinutes()); } extended.put("BaseBasalRate", getBaseBasalRate()); try { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index 631afccf9d..f7622f73ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -19,7 +19,7 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryPlugin; import info.nightscout.utils.DateUtil; /** @@ -119,7 +119,7 @@ public class MDIPlugin implements PluginBase, PumpInterface { @Override public String treatmentPlugin() { - return TreatmentsPlugin.class.getName(); + return TreatmentsFromHistoryPlugin.class.getName(); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java index ef28b0244c..e1907122e7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java @@ -16,7 +16,8 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpDescription; @@ -26,7 +27,7 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryPlugin; import info.nightscout.utils.DateUtil; /** @@ -138,7 +139,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public String treatmentPlugin() { - return TreatmentsPlugin.class.getName(); + return TreatmentsFromHistoryPlugin.class.getName(); } @Override @@ -236,14 +237,12 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes) { TreatmentsInterface treatmentsInterface = MainApp.getConfigBuilder(); - PumpEnactResult result = cancelTempBasal(); - if (!result.success) - return result; - TempExBasal tempBasal = new TempExBasal(); - tempBasal.timeStart = new Date(); + TemporaryBasal tempBasal = new TemporaryBasal(); + tempBasal.date = new Date().getTime(); tempBasal.isAbsolute = true; - tempBasal.absolute = absoluteRate; - tempBasal.duration = durationInMinutes; + tempBasal.absoluteRate = absoluteRate; + tempBasal.durationInMinutes = durationInMinutes; + PumpEnactResult result = new PumpEnactResult(); result.success = true; result.enacted = true; result.isTempCancel = false; @@ -267,11 +266,11 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { if (!result.success) return result; } - TempExBasal tempBasal = new TempExBasal(); - tempBasal.timeStart = new Date(); + TemporaryBasal tempBasal = new TemporaryBasal(); + tempBasal.date = new Date().getTime(); tempBasal.isAbsolute = false; - tempBasal.percent = percent; - tempBasal.duration = durationInMinutes; + tempBasal.percentRate = percent; + tempBasal.durationInMinutes = durationInMinutes; result.success = true; result.enacted = true; result.percent = percent; @@ -293,12 +292,10 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { PumpEnactResult result = cancelExtendedBolus(); if (!result.success) return result; - TempExBasal extendedBolus = new TempExBasal(); - extendedBolus.timeStart = new Date(); - extendedBolus.isExtended = true; - extendedBolus.absolute = insulin * 60d / durationInMinutes; - extendedBolus.duration = durationInMinutes; - extendedBolus.isAbsolute = true; + ExtendedBolus extendedBolus = new ExtendedBolus(); + extendedBolus.date = new Date().getTime(); + extendedBolus.insulin = insulin; + extendedBolus.durationInMinutes = durationInMinutes; result.success = true; result.enacted = true; result.bolusDelivered = insulin; @@ -367,11 +364,17 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { try { extended.put("ActiveProfile", MainApp.getConfigBuilder().getActiveProfile().getProfile().getActiveProfile()); } catch (Exception e) {} - TempExBasal tb; - if ((tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime())) != null) { - status.put("tempbasalpct", tb.percent); - status.put("tempbasalstart", DateUtil.toISOString(tb.timeStart)); - status.put("tempbasalremainmin", tb.getPlannedRemainingMinutes()); + TemporaryBasal tb = MainApp.getConfigBuilder().getTempBasal(new Date().getTime()); + if (tb != null) { + extended.put("TempBasalAbsoluteRate", tb.tempBasalConvertedToAbsolute(new Date().getTime())); + extended.put("TempBasalStart", DateUtil.dateAndTimeString(tb.date)); + extended.put("TempBasalRemaining", tb.getPlannedRemainingMinutes()); + } + ExtendedBolus eb = MainApp.getConfigBuilder().getExtendedBolus(new Date().getTime()); + if (eb != null) { + extended.put("ExtendedBolusAbsoluteRate", eb.absoluteRate()); + extended.put("ExtendedBolusStart", DateUtil.dateAndTimeString(eb.date)); + extended.put("ExtendedBolusRemaining", eb.getPlannedRemainingMinutes()); } status.put("timestamp", DateUtil.toISOString(new Date())); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java deleted file mode 100644 index 45f2dface3..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java +++ /dev/null @@ -1,73 +0,0 @@ -package info.nightscout.androidaps.plugins.Treatments; - -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsBolusFragment; -import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempBasalsFragment; - -public class TreatmentsFragment extends Fragment implements View.OnClickListener { - private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class); - - private static TreatmentsPlugin treatmentsPlugin = new TreatmentsPlugin(); - - public static TreatmentsPlugin getPlugin() { - return treatmentsPlugin; - } - - Context context; - TextView treatmentsTab; - TextView tempBasalsTab; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.treatments_fragment, container, false); - - treatmentsTab = (TextView) view.findViewById(R.id.treatments_treatments); - tempBasalsTab = (TextView) view.findViewById(R.id.treatments_tempbasals); - treatmentsTab.setOnClickListener(this); - tempBasalsTab.setOnClickListener(this); - context = getContext(); - - setFragment(new TreatmentsBolusFragment()); - - return view; - } - - @Override - public void onClick(View v) { - - switch (v.getId()) { - case R.id.treatments_treatments: - setFragment(new TreatmentsBolusFragment()); - break; - case R.id.treatments_tempbasals: - setFragment(new TreatmentsTempBasalsFragment()); - break; - - } - } - - private void setFragment(Fragment selectedFragment) { - FragmentTransaction ft = getChildFragmentManager().beginTransaction(); - ft.replace(R.id.treatments_fragment_container, selectedFragment); // f2_container is your FrameLayout container - ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); - ft.addToBackStack(null); - ft.commit(); - } -} 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 deleted file mode 100644 index c9adfa1002..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ /dev/null @@ -1,461 +0,0 @@ -package info.nightscout.androidaps.plugins.Treatments; - -import android.support.annotation.Nullable; - -import com.squareup.otto.Subscribe; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.List; - -import info.nightscout.androidaps.Config; -import info.nightscout.androidaps.Constants; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.data.Iob; -import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.db.TempExBasal; -import info.nightscout.androidaps.db.Treatment; -import info.nightscout.androidaps.events.EventExtendedBolusChange; -import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.events.EventTempBasalChange; -import info.nightscout.androidaps.events.EventTreatmentChange; -import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.interfaces.TreatmentsInterface; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; -import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; -import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.utils.SP; - -/** - * Created by mike on 05.08.2016. - */ -public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { - private static Logger log = LoggerFactory.getLogger(TreatmentsPlugin.class); - - public static IobTotal lastTreatmentCalculation; - public static IobTotal lastTempBasalsCalculation; - - public static List treatments; - private static List tempBasals; - private static List extendedBoluses; - - private static boolean useExtendedBoluses = false; - - private static boolean fragmentEnabled = true; - private static boolean fragmentVisible = true; - - private static TreatmentsPlugin treatmentsPlugin = new TreatmentsPlugin(); - - public static TreatmentsPlugin getPlugin() { - return treatmentsPlugin; - } - - @Override - public String getFragmentClass() { - return TreatmentsFragment.class.getName(); - } - - @Override - public String getName() { - return MainApp.instance().getString(R.string.treatments); - } - - @Override - public String getNameShort() { - String name = MainApp.sResources.getString(R.string.treatments_shortname); - if (!name.trim().isEmpty()) { - //only if translation exists - return name; - } - // use long name as fallback - return getName(); - } - - @Override - public boolean isEnabled(int type) { - boolean canBeEnabled = MainApp.getConfigBuilder().treatmentPlugin() == null ? true : MainApp.getConfigBuilder().treatmentPlugin().equals(getClass().getName()); - return type == TREATMENT && fragmentEnabled && canBeEnabled; - } - - @Override - public boolean isVisibleInTabs(int type) { - return type == TREATMENT && fragmentVisible; - } - - @Override - public boolean canBeHidden(int type) { - return true; - } - - @Override - public boolean hasFragment() { - return true; - } - - @Override - public boolean showInList(int type) { - boolean canBeEnabled = MainApp.getConfigBuilder().treatmentPlugin() == null ? true : MainApp.getConfigBuilder().treatmentPlugin().equals(getClass().getName()); - return canBeEnabled; - } - - @Override - public void setFragmentEnabled(int type, boolean fragmentEnabled) { - if (type == TREATMENT) this.fragmentEnabled = fragmentEnabled; - } - - @Override - public void setFragmentVisible(int type, boolean fragmentVisible) { - if (type == TREATMENT) this.fragmentVisible = fragmentVisible; - } - - @Override - public int getType() { - return PluginBase.TREATMENT; - } - - public TreatmentsPlugin() { - useExtendedBoluses = SP.getBoolean("danar_useextended", false); - MainApp.bus().register(this); - initializeData(); - } - - public static void initializeData() { - // Treatments - double dia = Constants.defaultDIA; - if (MainApp.getConfigBuilder().getActiveProfile() != null && MainApp.getConfigBuilder().getActiveProfile().getProfile() != null) - dia = MainApp.getConfigBuilder().getActiveProfile().getProfile().getDia(); - long fromMills = (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)); - treatments = MainApp.getDbHelper().getTreatmentDataFromTime(fromMills, false); - - // Temp basals - tempBasals = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, false); - extendedBoluses = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, true); - - // Update ended - checkForExpiredExtended(); - checkForExpiredTemps(); - } - - public static void checkForExpiredTemps() { - checkForExpired(tempBasals); - } - - public static void checkForExpiredExtended() { - checkForExpired(extendedBoluses); - } - - private static void checkForExpired(List list) { - long now = new Date().getTime(); - for (int position = list.size() - 1; position >= 0; position--) { - TempExBasal t = list.get(position); - boolean update = false; - if (t.timeEnd == null && t.getPlannedTimeEnd() < now) { - t.timeEnd = new Date(t.getPlannedTimeEnd()); - if (Config.logTempBasalsCut) - log.debug("Add timeEnd to old record"); - update = true; - } - if (position > 0) { - Date startofnewer = list.get(position - 1).timeStart; - if (t.timeEnd == null) { - t.timeEnd = new Date(Math.min(startofnewer.getTime(), t.getPlannedTimeEnd())); - if (Config.logTempBasalsCut) - log.debug("Add timeEnd to old record"); - update = true; - } else if (t.timeEnd.getTime() > startofnewer.getTime()) { - t.timeEnd = startofnewer; - update = true; - } - } - if (update) { - MainApp.getDbHelper().update(t); - if (Config.logTempBasalsCut) { - log.debug("Fixing unfinished temp end: " + t.log()); - if (position > 0) - log.debug("Previous: " + list.get(position - 1).log()); - } - } - } - } - - @Override - public IobTotal getLastCalculationTreatments() { - return lastTreatmentCalculation; - } - - @Override - public IobTotal getCalculationToTimeTreatments(long time) { - IobTotal total = new IobTotal(time); - - if (MainApp.getConfigBuilder() == null || ConfigBuilderPlugin.getActiveProfile() == null) // app not initialized yet - return total; - NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile(); - if (profile == null) - return total; - - Double dia = profile.getDia(); - - for (Integer pos = 0; pos < treatments.size(); pos++) { - Treatment t = treatments.get(pos); - if (t.date > time) continue; - Iob tIOB = t.iobCalc(time, dia); - total.iob += tIOB.iobContrib; - total.activity += tIOB.activityContrib; - Iob bIOB = t.iobCalc(time, dia / SP.getInt("openapsama_bolussnooze_dia_divisor", 2)); - total.bolussnooze += bIOB.iobContrib; - } - return total; - } - - @Override - public void updateTotalIOBTreatments() { - IobTotal total = getCalculationToTimeTreatments(new Date().getTime()); - - lastTreatmentCalculation = total; - } - - @Override - public MealData getMealData() { - MealData result = new MealData(); - - NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); - if (profile == null) return result; - - long now = new Date().getTime(); - long dia_ago = now - (new Double(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue(); - - for (Treatment treatment : treatments) { - long t = treatment.date; - if (t > dia_ago && t <= now) { - if (treatment.carbs >= 1) { - result.carbs += treatment.carbs; - } - if (treatment.insulin > 0 && treatment.mealBolus) { - result.boluses += treatment.insulin; - } - } - } - - AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData(); - if (autosensData != null) { - result.mealCOB = autosensData.cob; - } - return result; - } - - @Override - public List getTreatments() { - return treatments; - } - - @Override - public List getTreatments5MinBack(long time) { - List in5minback = new ArrayList<>(); - for (Integer pos = 0; pos < treatments.size(); pos++) { - Treatment t = treatments.get(pos); - if (t.date <= time && t.date > time - 5 * 60 * 1000) - in5minback.add(t); - } - return in5minback; - } - - @Subscribe - public void onStatusEvent(final EventTreatmentChange ev) { - initializeData(); - updateTotalIOBTreatments(); - } - - @Override - public IobTotal getLastCalculationTempBasals() { - return lastTempBasalsCalculation; - } - - @Override - public IobTotal getCalculationToTimeTempBasals(long time) { - checkForExpired(tempBasals); - checkForExpired(extendedBoluses); - IobTotal total = new IobTotal(time); - for (Integer pos = 0; pos < tempBasals.size(); pos++) { - TempExBasal t = tempBasals.get(pos); - if (t.timeStart.getTime() > time) continue; - IobTotal calc = t.iobCalc(time); - //log.debug("BasalIOB " + new Date(time) + " >>> " + calc.basaliob); - total.plus(calc); - } - if (useExtendedBoluses) { - for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { - TempExBasal t = extendedBoluses.get(pos); - if (t.timeStart.getTime() > time) continue; - IobTotal calc = t.iobCalc(time); - total.plus(calc); - } - } - return total; - } - - @Override - public void updateTotalIOBTempBasals() { - IobTotal total = getCalculationToTimeTempBasals(new Date().getTime()); - - lastTempBasalsCalculation = total; - } - - public boolean isRealTempBasalInProgress() { - return getRealTempBasal(new Date().getTime()) != null; - } - - @Override - public boolean isTempBasalInProgress() { - return getTempBasal(new Date().getTime()) != null; - } - - @Nullable - public TempExBasal getRealTempBasal(long time) { - checkForExpired(tempBasals); - for (TempExBasal t : tempBasals) { - if (t.isInProgress(time)) return t; - } - return null; - } - - @Nullable - @Override - public TempExBasal getTempBasal(long time) { - if (isRealTempBasalInProgress()) - return getRealTempBasal(time); - if (isExtendedBoluslInProgress() && useExtendedBoluses) - return getExtendedBolus(time); - return null; - } - - @Override - public boolean isExtendedBoluslInProgress() { - return getExtendedBolus(new Date().getTime()) != null; //TODO: crosscheck here - } - - @Nullable - @Override - public TempExBasal getExtendedBolus(long time) { - checkForExpired(extendedBoluses); - for (TempExBasal t : extendedBoluses) { - if (t.isInProgress(time)) return t; - } - return null; - } - - @Override - public void extendedBolusStart(TempExBasal extendedBolus) { - MainApp.getDbHelper().create(extendedBolus); - } - - @Override - public void extendedBolusStop(long time) { - TempExBasal extendedBolus = getExtendedBolus(time); - if (extendedBolus != null) { - extendedBolus.timeEnd = new Date(time); - MainApp.getDbHelper().update(extendedBolus); - } - } - - @Override - public double getTempBasalAbsoluteRate() { - PumpInterface pump = MainApp.getConfigBuilder(); - - TempExBasal tb = getTempBasal(new Date().getTime()); - if (tb != null) { - if (tb.isAbsolute) { - return tb.absolute; - } else { - Double baseRate = pump.getBaseBasalRate(); - Double tempRate = baseRate * (tb.percent / 100d); - return tempRate; - } - } - TempExBasal eb = getExtendedBolus(new Date().getTime()); - if (eb != null && useExtendedBoluses) { - return pump.getBaseBasalRate() + eb.absolute; - } - return 0; - } - - @Override - public double getTempBasalRemainingMinutes() { - if (isTempBasalInProgress()) - return getTempBasal(new Date().getTime()).getPlannedRemainingMinutes(); - if (isExtendedBoluslInProgress() && useExtendedBoluses) - return getExtendedBolus(new Date().getTime()).getPlannedRemainingMinutes(); - return 0; - } - - @Override - public void tempBasalStart(TempExBasal tempBasal) { - MainApp.getDbHelper().create(tempBasal); - } - - @Override - public void tempBasalStop(long time) { - TempExBasal tempBasal = getTempBasal(time); - if (tempBasal != null) { - tempBasal.timeEnd = new Date(time); - MainApp.getDbHelper().update(tempBasal); - } - - } - - @Override - public long oldestDataAvaialable() { - long oldestTemp = new Date().getTime(); - if (tempBasals.size() > 0) - oldestTemp = Math.min(oldestTemp, tempBasals.get(tempBasals.size() - 1).timeStart.getTime()); - if (extendedBoluses.size() > 0) - oldestTemp = Math.min(oldestTemp, extendedBoluses.get(extendedBoluses.size() - 1).timeStart.getTime()); - oldestTemp -= 15 * 60 * 1000L; // allow 15 min before - return oldestTemp; - } - - public static List getMergedList() { - if (useExtendedBoluses) { - List merged = new ArrayList(); - merged.addAll(tempBasals); - if (useExtendedBoluses) - merged.addAll(extendedBoluses); - - class CustomComparator implements Comparator { - public int compare(TempExBasal object1, TempExBasal object2) { - return (int) (object2.timeIndex - object1.timeIndex); - } - } - Collections.sort(merged, new CustomComparator()); - return merged; - } else { - return tempBasals; - } - } - - @Subscribe - public void onStatusEvent(final EventTempBasalChange ev) { - initializeData(); - } - - @Subscribe - public void onStatusEvent(final EventExtendedBolusChange ev) { - initializeData(); - } - - public void onStatusEvent(final EventPreferenceChange s) { - if (s.isChanged("danar_useextended")) { - useExtendedBoluses = SP.getBoolean("danar_useextended", false); - initializeData(); - } - } - -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryFragment.java index f0c867ae33..a5ffcee7af 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryFragment.java @@ -3,22 +3,20 @@ package info.nightscout.androidaps.plugins.TreatmentsFromHistory; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; +import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; -import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsBolusFragment; -import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempBasalsFragment; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.fragments.TreatmentsBolusFragment; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.fragments.TreatmentsTemporaryBasalsFragment; -public class TreatmentsFromHistoryFragment extends Fragment { +public class TreatmentsFromHistoryFragment extends Fragment implements View.OnClickListener { private static Logger log = LoggerFactory.getLogger(TreatmentsFromHistoryFragment.class); private static TreatmentsFromHistoryPlugin treatmentsPlugin = new TreatmentsFromHistoryPlugin(); @@ -28,20 +26,44 @@ public class TreatmentsFromHistoryFragment extends Fragment { } Context context; - - Fragment bolusFragment; - Fragment tempBasalsFragment; + TextView treatmentsTab; + TextView tempBasalsTab; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.treatments_fragment, container, false); - bolusFragment = new TreatmentsBolusFragment(); - tempBasalsFragment = new TreatmentsTempBasalsFragment(); - + treatmentsTab = (TextView) view.findViewById(R.id.treatments_treatments); + tempBasalsTab = (TextView) view.findViewById(R.id.treatments_tempbasals); + treatmentsTab.setOnClickListener(this); + tempBasalsTab.setOnClickListener(this); context = getContext(); + setFragment(new TreatmentsBolusFragment()); + return view; } -} + + @Override + public void onClick(View v) { + + switch (v.getId()) { + case R.id.treatments_treatments: + setFragment(new TreatmentsBolusFragment()); + break; + case R.id.treatments_tempbasals: + setFragment(new TreatmentsTemporaryBasalsFragment()); + break; + + } + } + + private void setFragment(Fragment selectedFragment) { + FragmentTransaction ft = getChildFragmentManager().beginTransaction(); + ft.replace(R.id.treatments_fragment_container, selectedFragment); // f2_container is your FrameLayout container + ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); + ft.addToBackStack(null); + ft.commit(); + } +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryPlugin.java index 63eec7fcd6..c8283a9e7a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/TreatmentsFromHistoryPlugin.java @@ -11,15 +11,17 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.ExtendedBolus; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.events.EventExtendedBolusChange; +import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; @@ -28,6 +30,7 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; +import info.nightscout.utils.OverlappingIntervals; import info.nightscout.utils.SP; /** @@ -40,8 +43,8 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf public static IobTotal lastTempBasalsCalculation; public static List treatments; - private static List tempBasals; - private static List extendedBoluses; + private static OverlappingIntervals tempBasals = new OverlappingIntervals<>(); + private static OverlappingIntervals extendedBoluses = new OverlappingIntervals<>(); private static boolean fragmentEnabled = true; private static boolean fragmentVisible = true; @@ -59,7 +62,7 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf @Override public String getName() { - return MainApp.instance().getString(R.string.treatments); + return MainApp.instance().getString(R.string.treatments) + "FromHistory"; // TODO: remove later } @Override @@ -117,66 +120,41 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf public TreatmentsFromHistoryPlugin() { MainApp.bus().register(this); - initializeData(); + initializeTempBasalData(); + initializeTreatmentData(); + initializeExtendedBolusData(); } - public static void initializeData() { + public static void initializeTreatmentData() { // Treatments double dia = Constants.defaultDIA; if (MainApp.getConfigBuilder().getActiveProfile() != null && MainApp.getConfigBuilder().getActiveProfile().getProfile() != null) dia = MainApp.getConfigBuilder().getActiveProfile().getProfile().getDia(); long fromMills = (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)); + treatments = MainApp.getDbHelper().getTreatmentDataFromTime(fromMills, false); - - // Temp basals - tempBasals = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, false); - extendedBoluses = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, true); - - // Update ended - checkForExpiredExtended(); - checkForExpiredTemps(); } - public static void checkForExpiredTemps() { - checkForExpired(tempBasals); + public static void initializeTempBasalData() { + // Treatments + double dia = Constants.defaultDIA; + if (MainApp.getConfigBuilder().getActiveProfile() != null && MainApp.getConfigBuilder().getActiveProfile().getProfile() != null) + dia = MainApp.getConfigBuilder().getActiveProfile().getProfile().getDia(); + long fromMills = (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)); + + tempBasals.reset().add(MainApp.getDbHelper().getTemporaryBasalsDataFromTime(fromMills, false)); + } - public static void checkForExpiredExtended() { - checkForExpired(extendedBoluses); - } + public static void initializeExtendedBolusData() { + // Treatments + double dia = Constants.defaultDIA; + if (MainApp.getConfigBuilder().getActiveProfile() != null && MainApp.getConfigBuilder().getActiveProfile().getProfile() != null) + dia = MainApp.getConfigBuilder().getActiveProfile().getProfile().getDia(); + long fromMills = (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)); + + extendedBoluses.reset().add(MainApp.getDbHelper().getExtendedBolusDataFromTime(fromMills, false)); - private static void checkForExpired(List list) { - long now = new Date().getTime(); - for (int position = list.size() - 1; position >= 0; position--) { - TempExBasal t = list.get(position); - boolean update = false; - if (t.timeEnd == null && t.getPlannedTimeEnd() < now) { - t.timeEnd = new Date(t.getPlannedTimeEnd()); - if (Config.logTempBasalsCut) - log.debug("Add timeEnd to old record"); - update = true; - } - if (position > 0) { - Date startofnewer = list.get(position - 1).timeStart; - if (t.timeEnd == null) { - t.timeEnd = new Date(Math.min(startofnewer.getTime(), t.getPlannedTimeEnd())); - if (Config.logTempBasalsCut) - log.debug("Add timeEnd to old record"); - update = true; - } else if (t.timeEnd.getTime() > startofnewer.getTime()) { - t.timeEnd = startofnewer; - update = true; - } - } - if (update) { - MainApp.getDbHelper().update(t); - if (Config.logTempBasalsCut) { - log.debug("Fixing unfinished temp end: " + t.log()); - if (position > 0) - log.debug("Previous: " + list.get(position - 1).log()); - } - } - } } @Override @@ -206,11 +184,10 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf total.bolussnooze += bIOB.iobContrib; } - checkForExpired(extendedBoluses); for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { - TempExBasal t = extendedBoluses.get(pos); - if (t.timeStart.getTime() > time) continue; - IobTotal calc = t.iobCalc(time); + ExtendedBolus e = extendedBoluses.get(pos); + if (e.date > time) continue; + IobTotal calc = e.iobCalc(time); total.plus(calc); } return total; @@ -274,7 +251,7 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf } @Override - public TempExBasal getRealTempBasal(long time) { + public TemporaryBasal getRealTempBasal(long time) { return null; } @@ -290,7 +267,19 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf @Subscribe public void onStatusEvent(final EventTreatmentChange ev) { - initializeData(); + initializeTreatmentData(); + updateTotalIOBTreatments(); + } + + @Subscribe + public void onStatusEvent(final EventTempBasalChange ev) { + initializeTempBasalData(); + updateTotalIOBTempBasals(); + } + + @Subscribe + public void onStatusEvent(final EventExtendedBolusChange ev) { + initializeExtendedBolusData(); updateTotalIOBTreatments(); } @@ -301,11 +290,10 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf @Override public IobTotal getCalculationToTimeTempBasals(long time) { - checkForExpired(tempBasals); IobTotal total = new IobTotal(time); for (Integer pos = 0; pos < tempBasals.size(); pos++) { - TempExBasal t = tempBasals.get(pos); - if (t.timeStart.getTime() > time) continue; + TemporaryBasal t = tempBasals.get(pos); + if (t.date > time) continue; IobTotal calc = t.iobCalc(time); //log.debug("BasalIOB " + new Date(time) + " >>> " + calc.basaliob); total.plus(calc); @@ -322,44 +310,44 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf @Nullable @Override - public TempExBasal getTempBasal(long time) { - checkForExpired(tempBasals); - for (TempExBasal t : tempBasals) { - if (t.isInProgress(time)) return t; - } - return null; + public TemporaryBasal getTempBasal(long time) { + return (TemporaryBasal) tempBasals.getValueByInterval(time); } @Override - public TempExBasal getExtendedBolus(long time) { - checkForExpired(extendedBoluses); - for (TempExBasal t : extendedBoluses) { - if (t.isInProgress(time)) return t; - } - return null; + public ExtendedBolus getExtendedBolus(long time) { + return (ExtendedBolus) extendedBoluses.getValueByInterval(time); } @Override - public void extendedBolusStart(TempExBasal extendedBolus) { - + public void extendedBolusStart(ExtendedBolus extendedBolus) { + MainApp.getDbHelper().create(extendedBolus); } @Override public void extendedBolusStop(long time) { + ExtendedBolus extendedBolus = new ExtendedBolus(); + extendedBolus.date = time; + extendedBolus.durationInMinutes = 0; + MainApp.getDbHelper().create(extendedBolus); + } + @Override + public OverlappingIntervals getExtendedBoluses() { + return extendedBoluses; } @Override public double getTempBasalAbsoluteRate() { PumpInterface pump = MainApp.getConfigBuilder(); - TempExBasal tb = getTempBasal(new Date().getTime()); + TemporaryBasal tb = getTempBasal(new Date().getTime()); if (tb != null) { if (tb.isAbsolute) { - return tb.absolute; + return tb.absoluteRate; } else { Double baseRate = pump.getBaseBasalRate(); - Double tempRate = baseRate * (tb.percent / 100d); + Double tempRate = baseRate * (tb.percentRate / 100d); return tempRate; } } @@ -374,24 +362,34 @@ public class TreatmentsFromHistoryPlugin implements PluginBase, TreatmentsInterf } @Override - public void tempBasalStart(TempExBasal tempBasal) { + public OverlappingIntervals getTemporaryBasals() { + return tempBasals; + } + @Override + public void tempBasalStart(TemporaryBasal tempBasal) { + MainApp.getDbHelper().create(tempBasal); } @Override public void tempBasalStop(long time) { - + TemporaryBasal temporaryBasal = new TemporaryBasal(); + temporaryBasal.date = time; + temporaryBasal.durationInMinutes = 0; + MainApp.getDbHelper().create(temporaryBasal); } @Override public long oldestDataAvaialable() { - long oldestTemp = new Date().getTime(); + long oldestTime = new Date().getTime(); if (tempBasals.size() > 0) - oldestTemp = Math.min(oldestTemp, tempBasals.get(tempBasals.size() - 1).timeStart.getTime()); + oldestTime = Math.min(oldestTime, tempBasals.get(0).date); if (extendedBoluses.size() > 0) - oldestTemp = Math.min(oldestTemp, extendedBoluses.get(extendedBoluses.size() - 1).timeStart.getTime()); - oldestTemp -= 15 * 60 * 1000L; // allow 15 min before - return oldestTemp; + oldestTime = Math.min(oldestTime, extendedBoluses.get(0).date); + if (treatments.size() > 0) + oldestTime = Math.min(oldestTime, extendedBoluses.get(treatments.size() - 1).date); + oldestTime -= 15 * 60 * 1000L; // allow 15 min before + return oldestTime; } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/fragments/TreatmentsBolusFragment.java similarity index 92% rename from app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java rename to app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/fragments/TreatmentsBolusFragment.java index 1e04a7d81c..8cb498a8c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/fragments/TreatmentsBolusFragment.java @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.Treatments.fragments; +package info.nightscout.androidaps.plugins.TreatmentsFromHistory.fragments; import android.app.Activity; import android.content.Context; @@ -35,10 +35,9 @@ import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.events.EventTreatmentChange; -import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SP; @@ -85,7 +84,7 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis holder.activity.setText(DecimalFormatter.to3Decimal(iob.activityContrib) + " U"); holder.mealOrCorrection.setText(treatments.get(position).mealBolus ? MainApp.sResources.getString(R.string.mealbolus) : MainApp.sResources.getString(R.string.correctionbous)); if (iob.iobContrib != 0) - holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.colorAffectingIOB)); + holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive)); else holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.cardColorBackground)); holder.remove.setTag(treatments.get(position)); @@ -142,7 +141,6 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis MainApp.getConfigBuilder().removeCareportalEntryFromNS(_id); } MainApp.getDbHelper().delete(treatment); - TreatmentsPlugin.initializeData(); updateGUI(); Answers.getInstance().logCustom(new CustomEvent("RemoveTreatment")); } @@ -165,7 +163,7 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis llm = new LinearLayoutManager(view.getContext()); recyclerView.setLayoutManager(llm); - RecyclerViewAdapter adapter = new RecyclerViewAdapter(TreatmentsPlugin.treatments); + RecyclerViewAdapter adapter = new RecyclerViewAdapter(TreatmentsFromHistoryPlugin.treatments); recyclerView.setAdapter(adapter); iobTotal = (TextView) view.findViewById(R.id.treatments_iobtotal); @@ -194,8 +192,6 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetTreatments(); - TreatmentsPlugin.initializeData(); - updateGUI(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } @@ -234,11 +230,11 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis activity.runOnUiThread(new Runnable() { @Override public void run() { - recyclerView.swapAdapter(new RecyclerViewAdapter(TreatmentsPlugin.treatments), false); - if (TreatmentsPlugin.lastTreatmentCalculation != null) - iobTotal.setText(DecimalFormatter.to2Decimal(TreatmentsPlugin.lastTreatmentCalculation.iob) + " U"); - if (TreatmentsPlugin.lastTreatmentCalculation != null) - activityTotal.setText(DecimalFormatter.to3Decimal(TreatmentsPlugin.lastTreatmentCalculation.activity) + " U"); + recyclerView.swapAdapter(new RecyclerViewAdapter(TreatmentsFromHistoryPlugin.treatments), false); + if (TreatmentsFromHistoryPlugin.lastTreatmentCalculation != null) + iobTotal.setText(DecimalFormatter.to2Decimal(TreatmentsFromHistoryPlugin.lastTreatmentCalculation.iob) + " U"); + if (TreatmentsFromHistoryPlugin.lastTreatmentCalculation != null) + activityTotal.setText(DecimalFormatter.to3Decimal(TreatmentsFromHistoryPlugin.lastTreatmentCalculation.activity) + " U"); } }); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempBasalsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/fragments/TreatmentsTemporaryBasalsFragment.java similarity index 78% rename from app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempBasalsFragment.java rename to app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/fragments/TreatmentsTemporaryBasalsFragment.java index fb3a3bb41f..654cba6b89 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempBasalsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/TreatmentsFromHistory/fragments/TreatmentsTemporaryBasalsFragment.java @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.Treatments.fragments; +package info.nightscout.androidaps.plugins.TreatmentsFromHistory.fragments; import android.app.Activity; import android.content.Context; @@ -25,20 +25,21 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; -import java.util.List; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventTempBasalChange; -import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; +import info.nightscout.androidaps.plugins.TreatmentsFromHistory.TreatmentsFromHistoryPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; +import info.nightscout.utils.OverlappingIntervals; -public class TreatmentsTempBasalsFragment extends Fragment { - private static Logger log = LoggerFactory.getLogger(TreatmentsTempBasalsFragment.class); +public class TreatmentsTemporaryBasalsFragment extends Fragment { + private static Logger log = LoggerFactory.getLogger(TreatmentsTemporaryBasalsFragment.class); RecyclerView recyclerView; LinearLayoutManager llm; @@ -49,9 +50,9 @@ public class TreatmentsTempBasalsFragment extends Fragment { public class RecyclerViewAdapter extends RecyclerView.Adapter { - List tempBasalList; + OverlappingIntervals tempBasalList; - RecyclerViewAdapter(List tempBasalList) { + RecyclerViewAdapter(OverlappingIntervals tempBasalList) { this.tempBasalList = tempBasalList; } @@ -63,34 +64,31 @@ public class TreatmentsTempBasalsFragment extends Fragment { @Override public void onBindViewHolder(TempBasalsViewHolder holder, int position) { - TempExBasal tempBasal = tempBasalList.get(position); - if (tempBasal.timeEnd != null) { - holder.date.setText(DateUtil.dateAndTimeString(tempBasal.timeStart) + " - " + DateUtil.timeString(tempBasalList.get(position).timeEnd)); + TemporaryBasal tempBasal = tempBasalList.getReversed(position); + if (tempBasal.isInProgress()) { + holder.date.setText(DateUtil.dateAndTimeString(tempBasal.date)); } else { - holder.date.setText(DateUtil.dateAndTimeString(tempBasal.timeStart)); + holder.date.setText(DateUtil.dateAndTimeString(tempBasal.date) + " - " + DateUtil.timeString(tempBasalList.get(position).end())); } - holder.duration.setText(DecimalFormatter.to0Decimal(tempBasal.duration) + " min"); + holder.duration.setText(DecimalFormatter.to0Decimal(tempBasal.getRealDuration()) + " min"); if (tempBasal.isAbsolute) { - holder.absolute.setText(DecimalFormatter.to0Decimal(tempBasal.tempBasalConvertedToAbsolute(tempBasal.timeStart)) + " U/h"); + holder.absolute.setText(DecimalFormatter.to0Decimal(tempBasal.tempBasalConvertedToAbsolute(tempBasal.date)) + " U/h"); holder.percent.setText(""); } else { holder.absolute.setText(""); - holder.percent.setText(DecimalFormatter.to0Decimal(tempBasal.percent) + "%"); + holder.percent.setText(DecimalFormatter.to0Decimal(tempBasal.percentRate) + "%"); } holder.realDuration.setText(DecimalFormatter.to0Decimal(tempBasal.getRealDuration()) + " min"); IobTotal iob = tempBasal.iobCalc(new Date().getTime()); holder.iob.setText(DecimalFormatter.to2Decimal(iob.basaliob) + " U"); holder.netInsulin.setText(DecimalFormatter.to2Decimal(iob.netInsulin) + " U"); holder.netRatio.setText(DecimalFormatter.to2Decimal(iob.netRatio) + " U/h"); - holder.extendedFlag.setVisibility(tempBasal.isExtended ? View.VISIBLE : View.GONE); + //holder.extendedFlag.setVisibility(tempBasal.isExtended ? View.VISIBLE : View.GONE); + holder.extendedFlag.setVisibility(View.GONE); if (tempBasal.isInProgress()) - holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.colorInProgress)); - else if (tempBasal.timeEnd == null) - holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.colorNotEnded)); - else if (tempBasal.iobCalc(new Date().getTime()).basaliob != 0) - holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.colorAffectingIOB)); - else - holder.dateLinearLayout.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.cardColorBackground)); + holder.date.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive)); + if (tempBasal.iobCalc(new Date().getTime()).basaliob != 0) + holder.iob.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive)); holder.remove.setTag(tempBasal); } @@ -115,7 +113,6 @@ public class TreatmentsTempBasalsFragment extends Fragment { TextView netInsulin; TextView iob; TextView extendedFlag; - LinearLayout dateLinearLayout; TextView remove; TempBasalsViewHolder(View itemView) { @@ -130,7 +127,6 @@ public class TreatmentsTempBasalsFragment extends Fragment { netInsulin = (TextView) itemView.findViewById(R.id.tempbasals_netinsulin); iob = (TextView) itemView.findViewById(R.id.tempbasals_iob); extendedFlag = (TextView) itemView.findViewById(R.id.tempbasals_extendedflag); - dateLinearLayout = (LinearLayout) itemView.findViewById(R.id.tempbasals_datelinearlayout); remove = (TextView) itemView.findViewById(R.id.tempbasals_remove); remove.setOnClickListener(this); remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); @@ -138,12 +134,12 @@ public class TreatmentsTempBasalsFragment extends Fragment { @Override public void onClick(View v) { - final TempExBasal tempBasal = (TempExBasal) v.getTag(); + final TemporaryBasal tempBasal = (TemporaryBasal) v.getTag(); switch (v.getId()) { case R.id.tempbasals_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(tempBasal.timeStart)); + builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(tempBasal.date)); builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // TODO: handle this in NS too @@ -152,8 +148,6 @@ public class TreatmentsTempBasalsFragment extends Fragment { // MainApp.getConfigBuilder().removeCareportalEntryFromNS(_id); //} MainApp.getDbHelper().delete(tempBasal); - TreatmentsPlugin.initializeData(); - updateGUI(); Answers.getInstance().logCustom(new CustomEvent("RemoveTempBasal")); } }); @@ -175,7 +169,7 @@ public class TreatmentsTempBasalsFragment extends Fragment { llm = new LinearLayoutManager(view.getContext()); recyclerView.setLayoutManager(llm); - RecyclerViewAdapter adapter = new RecyclerViewAdapter(TreatmentsPlugin.getMergedList()); + RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainApp.getConfigBuilder().getTemporaryBasals()); recyclerView.setAdapter(adapter); tempBasalTotalView = (TextView) view.findViewById(R.id.tempbasals_totaltempiob); @@ -203,15 +197,20 @@ public class TreatmentsTempBasalsFragment extends Fragment { updateGUI(); } + @Subscribe + public void onStatusEvent(final EventNewBG ev) { + updateGUI(); + } + public void updateGUI() { Activity activity = getActivity(); if (activity != null && recyclerView != null) activity.runOnUiThread(new Runnable() { @Override public void run() { - recyclerView.swapAdapter(new RecyclerViewAdapter(TreatmentsPlugin.getMergedList()), false); - if (TreatmentsPlugin.lastTempBasalsCalculation != null) { - String totalText = DecimalFormatter.to2Decimal(TreatmentsPlugin.lastTempBasalsCalculation.basaliob) + " U"; + recyclerView.swapAdapter(new RecyclerViewAdapter(MainApp.getConfigBuilder().getTemporaryBasals()), false); + if (MainApp.getConfigBuilder().getLastCalculationTempBasals() != null) { + String totalText = DecimalFormatter.to2Decimal(MainApp.getConfigBuilder().getLastCalculationTempBasals().basaliob) + " U"; tempBasalTotalView.setText(totalText); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 1642af7cda..3d74eec9b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -27,18 +27,18 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.GlucoseStatus; +import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; import info.nightscout.androidaps.plugins.Wear.ActionStringHandler; import info.nightscout.androidaps.plugins.Wear.WearPlugin; -import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SafeParse; import info.nightscout.utils.ToastUtils; @@ -68,7 +68,6 @@ public class WatchUpdaterService extends WearableListenerService implements public static final String ACTION_CONFIRMATION_REQUEST_PATH = "/nightscout_watch_actionconfirmationrequest"; - boolean wear_integration = false; SharedPreferences mPrefs; private static boolean lastLoopStatus; @@ -95,7 +94,9 @@ public class WatchUpdaterService extends WearableListenerService implements } public void googleApiConnect() { - if(googleApiClient != null && (googleApiClient.isConnected() || googleApiClient.isConnecting())) { googleApiClient.disconnect(); } + if (googleApiClient != null && (googleApiClient.isConnected() || googleApiClient.isConnecting())) { + googleApiClient.disconnect(); + } googleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) @@ -131,15 +132,14 @@ public class WatchUpdaterService extends WearableListenerService implements sendStatus(); } else if (ACTION_SEND_BASALS.equals(action)) { sendBasals(); - } else if (ACTION_SEND_BOLUSPROGRESS.equals(action)){ - sendBolusProgress(intent.getIntExtra("progresspercent", 0), intent.hasExtra("progressstatus")?intent.getStringExtra("progressstatus"):""); - } else if (ACTION_SEND_ACTIONCONFIRMATIONREQUEST.equals(action)){ + } else if (ACTION_SEND_BOLUSPROGRESS.equals(action)) { + sendBolusProgress(intent.getIntExtra("progresspercent", 0), intent.hasExtra("progressstatus") ? intent.getStringExtra("progressstatus") : ""); + } else if (ACTION_SEND_ACTIONCONFIRMATIONREQUEST.equals(action)) { String title = intent.getStringExtra("title"); String message = intent.getStringExtra("message"); String actionstring = intent.getStringExtra("actionstring"); sendActionConfirmationRequest(title, message, actionstring); - } - else { + } else { sendData(); } } else { @@ -192,11 +192,13 @@ public class WatchUpdaterService extends WearableListenerService implements if (lastBG != null) { GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); - if(googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { googleApiConnect(); } + if (googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { + googleApiConnect(); + } if (wear_integration) { final DataMap dataMap = dataMapSingleBG(lastBG, glucoseStatus); - if(dataMap==null) { + if (dataMap == null) { ToastUtils.showToastInUiThread(this, getString(R.string.noprofile)); return; } @@ -208,23 +210,23 @@ public class WatchUpdaterService extends WearableListenerService implements private DataMap dataMapSingleBG(BgReading lastBG, GlucoseStatus glucoseStatus) { NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); - if(profile == null) return null; + if (profile == null) return null; Double lowLine = SafeParse.stringToDouble(mPrefs.getString("low_mark", "0")); Double highLine = SafeParse.stringToDouble(mPrefs.getString("high_mark", "0")); //convert to mg/dl - if (! profile.getUnits().equals(Constants.MGDL)){ + if (!profile.getUnits().equals(Constants.MGDL)) { lowLine *= Constants.MMOLL_TO_MGDL; highLine *= Constants.MMOLL_TO_MGDL; } - if (lowLine < 1){ + if (lowLine < 1) { lowLine = OverviewPlugin.bgTargetLow; } - if(highLine < 1){ + if (highLine < 1) { highLine = OverviewPlugin.bgTargetHigh; } @@ -239,8 +241,8 @@ public class WatchUpdaterService extends WearableListenerService implements int battery = getBatteryLevel(getApplicationContext()); dataMap.putString("sgvString", lastBG.valueToUnitsToString(profile.getUnits())); dataMap.putDouble("timestamp", lastBG.date); - if(glucoseStatus == null) { - dataMap.putString("slopeArrow", "" ); + if (glucoseStatus == null) { + dataMap.putString("slopeArrow", ""); dataMap.putString("delta", ""); dataMap.putString("avgDelta", ""); } else { @@ -250,7 +252,7 @@ public class WatchUpdaterService extends WearableListenerService implements } dataMap.putString("battery", "" + battery); dataMap.putLong("sgvLevel", sgvLevel); - dataMap.putInt("batteryLevel", (battery>=30)?1:0); + dataMap.putInt("batteryLevel", (battery >= 30) ? 1 : 0); dataMap.putDouble("sgvDouble", lastBG.value); dataMap.putDouble("high", highLine); dataMap.putDouble("low", lowLine); @@ -259,33 +261,32 @@ public class WatchUpdaterService extends WearableListenerService implements private String deltastring(double deltaMGDL, double deltaMMOL, String units) { String deltastring = ""; - if (deltaMGDL >=0){ + if (deltaMGDL >= 0) { deltastring += "+"; - } else{ + } else { deltastring += "-"; } - if (units.equals(Constants.MGDL)){ + if (units.equals(Constants.MGDL)) { deltastring += DecimalFormatter.to1Decimal(Math.abs(deltaMGDL)); - } - else { + } else { deltastring += DecimalFormatter.to1Decimal(Math.abs(deltaMMOL)); } return deltastring; } private String slopeArrow(double delta) { - if (delta <= (-3.5*5)) { + if (delta <= (-3.5 * 5)) { return "\u21ca"; - } else if (delta <= (-2*5)) { + } else if (delta <= (-2 * 5)) { return "\u2193"; - } else if (delta <= (-1*5)) { + } else if (delta <= (-1 * 5)) { return "\u2198"; - } else if (delta <= (1*5)) { + } else if (delta <= (1 * 5)) { return "\u2192"; - } else if (delta <= (2*5)) { + } else if (delta <= (2 * 5)) { return "\u2197"; - } else if (delta <= (3.5*5)) { + } else if (delta <= (3.5 * 5)) { return "\u2191"; } else { return "\u21c8"; @@ -294,25 +295,27 @@ public class WatchUpdaterService extends WearableListenerService implements private void resendData() { - if(googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { googleApiConnect(); } - long startTime = System.currentTimeMillis() - (long)(60000 * 60 * 5.5); + if (googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { + googleApiConnect(); + } + long startTime = System.currentTimeMillis() - (long) (60000 * 60 * 5.5); BgReading last_bg = DatabaseHelper.lastBg(); if (last_bg == null) return; - List graph_bgs = MainApp.getDbHelper().getBgreadingsDataFromTime(startTime, true); + List graph_bgs = MainApp.getDbHelper().getBgreadingsDataFromTime(startTime, true); GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); if (!graph_bgs.isEmpty()) { DataMap entries = dataMapSingleBG(last_bg, glucoseStatus); - if(entries==null) { + if (entries == null) { ToastUtils.showToastInUiThread(this, getString(R.string.noprofile)); return; } final ArrayList dataMaps = new ArrayList<>(graph_bgs.size()); for (BgReading bg : graph_bgs) { DataMap dataMap = dataMapSingleBG(bg, glucoseStatus); - if(dataMap != null) { + if (dataMap != null) { dataMaps.add(dataMap); } } @@ -324,11 +327,12 @@ public class WatchUpdaterService extends WearableListenerService implements } private void sendBasals() { - if(googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { googleApiConnect(); } + if (googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) { + googleApiConnect(); + } long now = System.currentTimeMillis(); - long startTimeWindow = now - (long)(60000 * 60 * 5.5); - + long startTimeWindow = now - (long) (60000 * 60 * 5.5); ArrayList basals = new ArrayList<>(); @@ -337,7 +341,7 @@ public class WatchUpdaterService extends WearableListenerService implements NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); - if(profile==null) { + if (profile == null) { return; } @@ -347,24 +351,24 @@ public class WatchUpdaterService extends WearableListenerService implements double beginBasalValue = profile.getBasal(NSProfile.secondsFromMidnight(new Date(beginBasalSegmentTime))); double endBasalValue = beginBasalValue; - TempExBasal tb1 = MainApp.getConfigBuilder().getTempBasal(runningTime); - TempExBasal tb2 = MainApp.getConfigBuilder().getTempBasal(runningTime); + TemporaryBasal tb1 = MainApp.getConfigBuilder().getTempBasal(runningTime); + TemporaryBasal tb2 = MainApp.getConfigBuilder().getTempBasal(runningTime); double tb_before = beginBasalValue; double tb_amount = beginBasalValue; long tb_start = runningTime; - if(tb1 != null){ + if (tb1 != null) { tb_before = beginBasalValue; - tb_amount = tb1.tempBasalConvertedToAbsolute(new Date(runningTime)); + tb_amount = tb1.tempBasalConvertedToAbsolute(runningTime); tb_start = runningTime; } - for(;runningTime=0)?"+":"") + DecimalFormatter.to2Decimal(bgi); + status += " " + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to2Decimal(bgi); return status; } @@ -585,7 +589,7 @@ public class WatchUpdaterService extends WearableListenerService implements public void onConnectionFailed(ConnectionResult connectionResult) { } - public static boolean shouldReportLoopStatus(boolean enabled){ + public static boolean shouldReportLoopStatus(boolean enabled) { return (lastLoopStatus != enabled); } @@ -593,9 +597,9 @@ public class WatchUpdaterService extends WearableListenerService implements Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); - if(level == -1 || scale == -1) { + if (level == -1 || scale == -1) { return 50; } - return (int)(((float)level / (float)scale) * 100.0f); + return (int) (((float) level / (float) scale) * 100.0f); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index c61bcb6075..ed998c2b6a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -14,7 +14,7 @@ import java.util.Date; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.db.TempExBasal; +import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.events.EventExtendedBolusChange; import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventPreferenceChange; @@ -109,13 +109,14 @@ public class StatuslinePlugin implements PluginBase { if (fragmentEnabled) { try { MainApp.bus().register(this); - } catch (Exception e) {} + } catch (Exception e) { + } sendStatus(); - } - else{ + } else { try { MainApp.bus().unregister(this); - } catch (Exception e) {} + } catch (Exception e) { + } sendStatus(); } } @@ -130,9 +131,9 @@ public class StatuslinePlugin implements PluginBase { private void sendStatus() { - String status = ""; // sent once on disable + String status = ""; // sent once on disable - if(fragmentEnabled) { + if (fragmentEnabled) { status = buildStatusString(); } @@ -164,7 +165,7 @@ public class StatuslinePlugin implements PluginBase { TreatmentsInterface treatmentsInterface = MainApp.getConfigBuilder(); if (treatmentsInterface.isTempBasalInProgress()) { - TempExBasal activeTemp = treatmentsInterface.getTempBasal(new Date().getTime()); + TemporaryBasal activeTemp = treatmentsInterface.getTempBasal(new Date().getTime()); if (shortString) { status += activeTemp.toStringShort(); } else { @@ -186,13 +187,13 @@ public class StatuslinePlugin implements PluginBase { + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; } NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); - if (!mPrefs.getBoolean("xdripstatus_showbgi", false) ||profile == null || profile.getIsf(NSProfile.secondsFromMidnight()) == null || profile.getIc(NSProfile.secondsFromMidnight()) == null) { + if (!mPrefs.getBoolean("xdripstatus_showbgi", false) || profile == null || profile.getIsf(NSProfile.secondsFromMidnight()) == null || profile.getIc(NSProfile.secondsFromMidnight()) == null) { return status; } - double bgi = -(bolusIob.activity + basalIob.activity)*5*profile.getIsf(NSProfile.secondsFromMidnight()); + double bgi = -(bolusIob.activity + basalIob.activity) * 5 * profile.getIsf(NSProfile.secondsFromMidnight()); - status += " " + ((bgi>=0)?"+":"") + DecimalFormatter.to2Decimal(bgi); + status += " " + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to2Decimal(bgi); return status; } diff --git a/app/src/main/java/info/nightscout/utils/OverlappingIntervals.java b/app/src/main/java/info/nightscout/utils/OverlappingIntervals.java index cdae4d2e1a..55647061f2 100644 --- a/app/src/main/java/info/nightscout/utils/OverlappingIntervals.java +++ b/app/src/main/java/info/nightscout/utils/OverlappingIntervals.java @@ -14,35 +14,22 @@ import info.nightscout.androidaps.interfaces.Interval; * Created by mike on 09.05.2017. */ -public class OverlappingIntervals { +public class OverlappingIntervals { - private Handler sHandler = null; - private HandlerThread sHandlerThread = null; - private Object dataLock = new Object(); + private LongSparseArray rawData = new LongSparseArray<>(); // oldest at index 0 - - private static LongSparseArray rawData = new LongSparseArray<>(); // oldest at index 0 - - public OverlappingIntervals() { - if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(OverlappingIntervals.class.getSimpleName()); - sHandlerThread.start(); - sHandler = new Handler(sHandlerThread.getLooper()); - } - } - - public OverlappingIntervals resetData() { + public OverlappingIntervals reset() { rawData = new LongSparseArray<>(); return this; } - public void add(Interval newInterval) { + public void add(T newInterval) { rawData.put(newInterval.start(), newInterval); merge(); } - public void add(List list) { - for (Interval interval : list) { + public void add(List list) { + for (T interval : list) { rawData.put(interval.start(), interval); } merge(); @@ -50,8 +37,8 @@ public class OverlappingIntervals { private void merge() { for (int index = 0; index < rawData.size() - 1; index++) { - Interval i = rawData.get(index); - long startOfNewer = rawData.get(index + 1).start(); + Interval i = rawData.valueAt(index); + long startOfNewer = rawData.valueAt(index + 1).start(); if (i.originalEnd() > startOfNewer) { i.cutEndTo(startOfNewer); } @@ -61,18 +48,25 @@ public class OverlappingIntervals { @Nullable public Interval getValueByInterval(long time) { int index = binarySearch(time); - if (index >= 0) return rawData.get(index); + if (index >= 0) return rawData.valueAt(index); return null; } - public List getList() { - List list = new ArrayList<>(); + public List getList() { + List list = new ArrayList<>(); for (int i = 0; i < rawData.size(); i++) list.add(rawData.valueAt(i)); return list; } - private static int binarySearch(long value) { + public List getReversedList() { + List list = new ArrayList<>(); + for (int i = rawData.size() -1; i>=0; i--) + list.add(rawData.valueAt(i)); + return list; + } + + private int binarySearch(long value) { int lo = 0; int hi = rawData.size() - 1; @@ -91,4 +85,15 @@ public class OverlappingIntervals { return ~lo; // value not present } + public int size() { + return rawData.size(); + } + + public T get(int index) { + return rawData.valueAt(index); + } + + public T getReversed(int index) { + return rawData.valueAt(size() - 1 - index); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/tempbasals_fragment.xml b/app/src/main/res/layout/tempbasals_fragment.xml index 00c3ece1a5..e94ee551c1 100644 --- a/app/src/main/res/layout/tempbasals_fragment.xml +++ b/app/src/main/res/layout/tempbasals_fragment.xml @@ -22,14 +22,15 @@ android:layout_height="wrap_content" android:paddingLeft="10dp" android:text="@string/tempbasals_iobtotal_label_string" - android:textStyle="bold" /> + android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textStyle="bold" + android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/app/src/main/res/layout/tempbasals_item.xml b/app/src/main/res/layout/tempbasals_item.xml index a5766f9713..d946b3eb23 100644 --- a/app/src/main/res/layout/tempbasals_item.xml +++ b/app/src/main/res/layout/tempbasals_item.xml @@ -5,10 +5,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" - card_view:cardBackgroundColor="@color/cardColorBackground" - card_view:cardCornerRadius="6dp" - card_view:cardUseCompatPadding="true" - card_view:contentPadding="6dp"> + card_view:cardBackgroundColor="?android:colorBackground" +> + android:text="{fa-clock-o}" /> + android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textAppearance="?android:attr/textAppearanceSmall" /> + android:textAppearance="?android:attr/textAppearanceSmall" /> + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c6edf50845..c72f2b0a3a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -37,7 +37,7 @@ #d43429 #c45026 - #830400 + #1b5e20 #190084 #779ECB