From de9dbf9243c8389dfc2acc96591de988e4b3b285 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 4 Mar 2017 20:55:13 +0100 Subject: [PATCH 01/48] CS translations --- app/src/main/res/values-cs/strings.xml | 64 +++++++++++++++++++------- app/src/main/res/values/strings.xml | 8 ++-- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index cbee44bd58..3f71f70213 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -143,7 +143,7 @@ IOB: Celková aktivita IOB: Celkové IOB: - Množtví sacharidů + Množství sacharidů Množství inzulínu Bazální IOB Glykémie @@ -365,7 +365,7 @@ Bazální profil aktualizován Pumpa není inicializována, profil nenastaven! Vybrán špatný ovladač pumpy - Hodnota bazálu pod minimem. Nenastaveno! + Hodnota bazálu pod povoleným minimem. Nenastaveno! Pera Glykémie: Poslední glykémie: @@ -382,7 +382,7 @@ Aktivita Pole %d prvků. Aktuální hodnota: Před jídlem - Řečtina + Greek Inicializuji ... Dlouhodobý průměr OpenAPS AMA @@ -397,22 +397,22 @@ Obnovit dočasné cíle z NS " " " " - " " - " " + ViPu + " " " " - " " - " " + SMS + JP " " - " " - " " + Přehl + Cíle " " - " " - " " - " " - " " - " " - " " + Smyč + LP + Dana + Konf + CPP + Péče Rozšířené nastavení Vždy používat krátkodobý průměrný rozdíl glykémií místo rozdílu posledních 2 hodnot Výhodné, pokud data z xDripu obsahují velký šum @@ -462,8 +462,8 @@ Nezobrazovat znovu Provádím Načítám stav pumpy - Pumpa vypnuta - Pumpa vypnuta. Klik pro obnovení stavu + Pumpa pozastavena + Pumpa pozastavena. Klik pro obnovení stavu Nastavuji extended bolus Nastavuji dočasný bazál Zastavuji extended bolus @@ -477,4 +477,34 @@ Chybné heslo Odemknout nastavení Blíží se denní limit inzulínu + Dospělý + Dítě + Vymazat frontu + Vymazat log + Odeslat teď + neúspěšně - zkontrolujte mobil + Nedostupný + NSClient nedostal oprávnění k zápisu. Špatné API secret? + NSClient interní + Posouvat + Bude použito v poli zadal + Zadej jméno zařízení + Jméno zařízení + Vložte API secret (min 12. znaků) + NSCl + Interní NSClient + URL: + Vložte adresu Nightscoutu + Adresa Nightscoutu + Stáří pacienta + Vyberte věk pacienta pro nastavení bezpečnostních limitů + Pozastaveno + Fronta: + Restart + Zobrazit frontu + Status: + Dospívající + Rozepsat IOB do bolusového a bazálního na hodinkách + Zobrazit detailní IOB + Nastavení hodinek diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a750eb054c..45688577f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -533,9 +533,9 @@ danar_useextended danarprofile_dia Clear log - nsclientinternal_autoscroll - nsclientinternal_paused - NSCLIENT has no write permission + nsclientinternal_autoscroll + nsclientinternal_paused + NSCLIENT has no write permission. Wrong API secret? Wear settings Show detailed IOB Break down IOB into bolus and basal IOB on the watchface @@ -552,5 +552,5 @@ teenage adult Please select patient age to setup safety limits - I_understand + I_understand From 9e05c86284ee80802f088422b4077d56829e6674 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 5 Mar 2017 12:12:28 +0100 Subject: [PATCH 02/48] Log hours in sensitivity --- .../nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java index 44c3970ac5..e44b810d36 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java @@ -81,6 +81,12 @@ public class Autosens { long bgTime = bucketed_data.get(i).timeIndex; int secondsFromMidnight = NSProfile.secondsFromMidnight(new Date(bgTime)); + String hour = ""; + Date d = new Date(secondsFromMidnight); + if (secondsFromMidnight % 3600 < 3 * 60 || secondsFromMidnight % 3600 > 57 * 60) { + hour += "(" + Math.round(secondsFromMidnight / 3600d) + ")"; + } + double sens = NSProfile.toMgdl(profile.getIsf(secondsFromMidnight), profile.getUnits()); //console.error(bgTime , bucketed_data[i].glucose); @@ -122,6 +128,7 @@ public class Autosens { pastSensitivity += ">"; //console.error(bgTime); } + pastSensitivity += hour; //log.debug("TIME: " + new Date(bgTime).toString() + " BG: " + bg + " SENS: " + sens + " DELTA: " + delta + " AVGDELTA: " + avgDelta + " IOB: " + iob.iob + " ACTIVITY: " + iob.activity + " BGI: " + bgi + " DEVIATION: " + deviation); // if bgTime is more recent than mealTime From c21467aede0963444b0f4fef48e5c509393d8209 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 5 Mar 2017 12:13:03 +0100 Subject: [PATCH 03/48] Gradle update --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4b5691656a..f1b7430446 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Aug 18 17:59:31 CEST 2016 +#Sun Mar 05 11:39:37 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip From 54f376330a61a8c21976d485440b059597fa6b1f Mon Sep 17 00:00:00 2001 From: Radoslav Radev Date: Sun, 5 Mar 2017 15:28:20 +0200 Subject: [PATCH 04/48] Update strings.xml --- app/src/main/res/values-bg/strings.xml | 79 +++++++++++++++++++------- 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 39d35570b0..e50a0d93f5 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -212,14 +212,14 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. +XXXXXXXXXX;+YYYYYYYYYY Болус %.2fU беше подаден успешно - Болусът не е доставен + Bolus failed Откажи временен базал Последно свързване: Изчаква резултат SMS комуникатор Позволени телефонни номера Успех - За да доставите болус %.2fU отговорете с код %s + To deliver bolus %.2fU reply with code %s Отдалечен болус не е разрешен Обнови профила Процент @@ -373,24 +373,24 @@ Wear Избран е грешен тип помпа преди %d м. - "ДЕЙСТВ" - "Wear" - "ВП" - "ТТ" - "ВЦeл" - "ВБ" - "СМС" - "ОПРОФ" - "ПРОф" - "ОСН" - \"ЦЕЛИ" - "OAPS" + ДЕЙСТВ + WEAR + ВП + TREAT + ВЦeл + ВБ + SMS + ОПРОФ + ПРОф + ОСН + ЦЕЛИ + OAPS "Loop " - "ЛПр " - "Dana" - "КОНФ" - "ППр " - "CaPr" + ЛПр + Dana + КОНФ + ППр + CaPr Физ.активност DanaR статистика Базал @@ -425,7 +425,7 @@ Експоненциално претеглена TDD Комулативна TDD Тегло - # Days + Дни MM640g Масив от %d елемента. Актуална стойност: Basal: @@ -473,4 +473,43 @@ Помпата е спряна. Натиснете за обновяване Настройки на параметър Δ КЗ Калибрация на КЗ + Възрастен + Разширени настройки + Дете + Изчисти опашката + Изчисти log + + Изпрати сега + неуспешно - проверете телефона + Недостъпно + NSCLIENT няма достъп. Грешна API secret? + вътрешен NSClient + Autoscroll + Ще бъде използвано в поле въведено от + Въведи име на устройство + Име на устройство + Въведи API secret (мин. 12 символа) + Вътрешен NSClient + URL: + Въведи Nightscout URL + Nightscout URL + NS API secret + NS API secret + NSCL + Възраст на потребителя + Изберете възраст за определяне лимитите на безопасност + На пауза + Профил + Рестарт + Покажи опашката + xDrip не приема калибрация + Статус: + Тийнейджър + Раздели IOB на болус и базал IOB на часовника + Покажи подробен IOB + Настройки на часовник + To send calibration %.2f reply with code %s + Calibration sent. Receiving must be enabled in xDrip. + Invalid SMS phone number + Опашка: From a0f2e4f6633b8b3734afdbf5221c08e233b0e204 Mon Sep 17 00:00:00 2001 From: Radoslav Radev Date: Sun, 5 Mar 2017 15:42:01 +0200 Subject: [PATCH 05/48] Update strings.xml --- app/src/main/res/values-bg/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index e50a0d93f5..8915c221da 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -508,7 +508,7 @@ Раздели IOB на болус и базал IOB на часовника Покажи подробен IOB Настройки на часовник - To send calibration %.2f reply with code %s + To send calibration %.2f reply with code %s Calibration sent. Receiving must be enabled in xDrip. Invalid SMS phone number Опашка: From 3b129dc7f680be6d195207ff490459d2407c5c5d Mon Sep 17 00:00:00 2001 From: Radoslav Radev Date: Sun, 5 Mar 2017 15:58:37 +0200 Subject: [PATCH 06/48] Update strings.xml --- app/src/main/res/values-bg/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 8915c221da..9c1030c683 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -508,7 +508,7 @@ Раздели IOB на болус и базал IOB на часовника Покажи подробен IOB Настройки на часовник - To send calibration %.2f reply with code %s + To send calibration %.2f reply with code %s Calibration sent. Receiving must be enabled in xDrip. Invalid SMS phone number Опашка: From 9843f139ad97968a3c2053857db44fcc0054b20f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 5 Mar 2017 15:22:35 +0100 Subject: [PATCH 07/48] fixed bugs in autosens --- .../nightscout/androidaps/data/MealData.java | 2 +- .../androidaps/plugins/OpenAPSAMA/Autosens.java | 16 +++++++++++++--- .../plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/data/MealData.java b/app/src/main/java/info/nightscout/androidaps/data/MealData.java index 18919c3c8a..a9136f88c2 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/MealData.java +++ b/app/src/main/java/info/nightscout/androidaps/data/MealData.java @@ -25,7 +25,7 @@ public class MealData { NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); if (profile == null) return; - List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (new Date().getTime() - 60 * 60 * 1000L * profile.getDia() * 2), false); + List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (new Date().getTime() - 60 * 60 * 1000L * profile.getDia() * 2), true); long now = new Date().getTime(); long dia_ago = now - (new Double(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java index e44b810d36..af32422e01 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java @@ -34,6 +34,7 @@ public class Autosens { for (int i = 1; i < glucose_data.size(); ++i) { long bgTime = glucose_data.get(i).getTimeIndex(); long lastbgTime = glucose_data.get(i - 1).getTimeIndex(); + //log.error("Processing " + i + ": " + new Date(bgTime).toString() + " " + glucose_data.get(i).value + " Previous: " + new Date(lastbgTime).toString() + " " + glucose_data.get(i - 1).value); if (glucose_data.get(i).value < 39 || glucose_data.get(i - 1).value < 39) { continue; } @@ -52,23 +53,32 @@ public class Autosens { newBgreading.timeIndex = nextbgTime; double gapDelta = glucose_data.get(i).value - lastbg; //console.error(gapDelta, lastbg, elapsed_minutes); - double nextbg = lastbg + (5 / elapsed_minutes * gapDelta); + double nextbg = lastbg + (5d / elapsed_minutes * gapDelta); newBgreading.value = Math.round(nextbg); //console.error("Interpolated", bucketed_data[j]); bucketed_data.add(newBgreading); + //log.error("******************************************************************************************************* Adding:" + new Date(newBgreading.timeIndex).toString() + " " + newBgreading.value); elapsed_minutes = elapsed_minutes - 5; lastbg = nextbg; lastbgTime = nextbgTime; } + j++; + BgReading newBgreading = new BgReading(); + newBgreading.value = glucose_data.get(i).value; + newBgreading.timeIndex = bgTime; + bucketed_data.add(newBgreading); + //log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.timeIndex).toString() + " " + newBgreading.value); } else if (Math.abs(elapsed_minutes) > 2) { j++; BgReading newBgreading = new BgReading(); newBgreading.value = glucose_data.get(i).value; newBgreading.timeIndex = bgTime; bucketed_data.add(newBgreading); + //log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.timeIndex).toString() + " " + newBgreading.value); } else { bucketed_data.get(j).value = (bucketed_data.get(j).value + glucose_data.get(i).value) / 2; + //log.error("***** Average"); } } //console.error(bucketed_data); @@ -82,8 +92,8 @@ public class Autosens { int secondsFromMidnight = NSProfile.secondsFromMidnight(new Date(bgTime)); String hour = ""; - Date d = new Date(secondsFromMidnight); - if (secondsFromMidnight % 3600 < 3 * 60 || secondsFromMidnight % 3600 > 57 * 60) { + //log.debug(new Date(bgTime).toString()); + if (secondsFromMidnight % 3600 < 2.5 * 60 || secondsFromMidnight % 3600 > 57.5 * 60) { hour += "(" + Math.round(secondsFromMidnight / 3600d) + ")"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java index 2cbffae52a..e011f49fb8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java @@ -217,7 +217,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { startPart = new Date(); long oldestDataAvailable = MainApp.getConfigBuilder().getActiveTempBasals().oldestDataAvaialable(); - List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime(Math.max(oldestDataAvailable, (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + profile.getDia()))), false); + List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime(Math.max(oldestDataAvailable, (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + profile.getDia()))), true); log.debug("Limiting data to oldest available temps: " + new Date(oldestDataAvailable).toString() + " (" + bgReadings.size() + " records)"); Profiler.log(log, "getBgreadingsDataFromTime()", startPart); From af8e48525002d9fcb5c4b6d58430ab1285f2dce4 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 5 Mar 2017 20:12:30 +0100 Subject: [PATCH 08/48] log SafeParse --- app/src/main/java/info/nightscout/utils/SafeParse.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/info/nightscout/utils/SafeParse.java b/app/src/main/java/info/nightscout/utils/SafeParse.java index 470e649005..8697daeebd 100644 --- a/app/src/main/java/info/nightscout/utils/SafeParse.java +++ b/app/src/main/java/info/nightscout/utils/SafeParse.java @@ -1,15 +1,20 @@ package info.nightscout.utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Created by mike on 23.06.2016. */ public class SafeParse { + private static Logger log = LoggerFactory.getLogger(SafeParse.class); public static Double stringToDouble(String input) { Double result = 0d; input = input.replace(",", "."); try { result = Double.parseDouble(input); } catch (Exception e) { + log.error("Error parsing " + input + " to double"); } return result; } @@ -20,6 +25,7 @@ public class SafeParse { try { result = Integer.parseInt(input); } catch (Exception e) { + log.error("Error parsing " + input + " to int"); } return result; } @@ -30,6 +36,7 @@ public class SafeParse { try { result = Long.parseLong(input); } catch (Exception e) { + log.error("Error parsing " + input + " to long"); } return result; } From be26db356d197e10bcb66a3ffad651a751a521b1 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 6 Mar 2017 18:53:43 +0100 Subject: [PATCH 09/48] another fix --- app/src/main/java/info/nightscout/androidaps/data/MealData.java | 2 +- .../info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java | 2 +- .../androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/data/MealData.java b/app/src/main/java/info/nightscout/androidaps/data/MealData.java index a9136f88c2..18919c3c8a 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/MealData.java +++ b/app/src/main/java/info/nightscout/androidaps/data/MealData.java @@ -25,7 +25,7 @@ public class MealData { NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); if (profile == null) return; - List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (new Date().getTime() - 60 * 60 * 1000L * profile.getDia() * 2), true); + List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (new Date().getTime() - 60 * 60 * 1000L * profile.getDia() * 2), false); long now = new Date().getTime(); long dia_ago = now - (new Double(1.5d * profile.getDia() * 60 * 60 * 1000l)).longValue(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java index af32422e01..b504dde984 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/Autosens.java @@ -47,7 +47,7 @@ public class Autosens { //console.error(elapsed_minutes); long nextbgTime; while (elapsed_minutes > 5) { - nextbgTime = lastbgTime + 5 * 60 * 1000; + nextbgTime = lastbgTime - 5 * 60 * 1000; j++; BgReading newBgreading = new BgReading(); newBgreading.timeIndex = nextbgTime; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java index e011f49fb8..2cbffae52a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java @@ -217,7 +217,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { startPart = new Date(); long oldestDataAvailable = MainApp.getConfigBuilder().getActiveTempBasals().oldestDataAvaialable(); - List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime(Math.max(oldestDataAvailable, (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + profile.getDia()))), true); + List bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime(Math.max(oldestDataAvailable, (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + profile.getDia()))), false); log.debug("Limiting data to oldest available temps: " + new Date(oldestDataAvailable).toString() + " (" + bgReadings.size() + " records)"); Profiler.log(log, "getBgreadingsDataFromTime()", startPart); From 02b90fa6c7f38f999722f057e7fb84417cdd4291 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 7 Mar 2017 10:52:25 +0100 Subject: [PATCH 10/48] update gradle to 2.3 --- app/build.gradle | 8 ++++---- build.gradle | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 152572006c..3b845352a4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -170,10 +170,10 @@ dependencies { testCompile 'org.json:json:20140107' testCompile 'org.mockito:mockito-core:2.+' androidTestCompile 'org.mockito:mockito-core:2.+' - androidTestCompile "com.google.dexmaker:dexmaker:1.2" - androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2" - compile(name:'android-edittext-validator-v1.3.4-mod', ext:'aar') - compile ('io.socket:socket.io-client:0.8.3') { + androidTestCompile 'com.google.dexmaker:dexmaker:1.2' + androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2' + compile(name: 'android-edittext-validator-v1.3.4-mod', ext: 'aar') + compile('io.socket:socket.io-client:0.8.3') { // excluding org.json which is provided by Android exclude group: 'org.json', module: 'json' } diff --git a/build.gradle b/build.gradle index 74b2ab0dd8..1ea4bd0550 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:2.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 151baa2fb55565e18eda2feaf80a8289d338502c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 7 Mar 2017 11:07:56 +0100 Subject: [PATCH 11/48] enable nsclient internal by default --- .../plugins/NSClientInternal/NSClientInternalPlugin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java index 1849bf7149..ba36501a9e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -41,8 +42,8 @@ import info.nightscout.utils.SP; public class NSClientInternalPlugin implements PluginBase { private static Logger log = LoggerFactory.getLogger(NSClientInternalPlugin.class); - boolean fragmentEnabled = false; - boolean fragmentVisible = false; + boolean fragmentEnabled = true; + boolean fragmentVisible = true; static public Handler handler; static private HandlerThread handlerThread; From 242428e2cb1a4f396cc4b7d71ef4acb5f272bad7 Mon Sep 17 00:00:00 2001 From: warstar2187 Date: Thu, 9 Mar 2017 04:20:40 +0900 Subject: [PATCH 12/48] Update strings.xml --- app/src/main/res/values-ko/strings.xml | 191 ++++++++++++++++++++----- 1 file changed, 155 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index d05c3c6715..5b657a4375 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -3,17 +3,17 @@ Treatments 안전설정 최대 허용 식사주입인슐린 [U] 최대 허용 탄수화물 [g] - 설정 NS에서 Treatments 새로고침 백업 테스트 알람 데이터베이스 초기화 + 데이터 베이스를 정말 초기화하시겠습니까? 종료 >200% 주입위한 확장식사주입 다나R 블루투스 기초주입량 절대값 사용하기 - + 폰을 재부팅하고나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그가 기록이되지 않습니다.(알고리즘이 제대로 작동하는지 확인하기 위해 로그가 필요합니다.)! 목표: 방법: 시작 @@ -29,6 +29,7 @@ 인슐린: 탄수화물: IOB: + IOB: 활동: IOB 총량: 활동 IOB 총량: @@ -73,8 +74,8 @@ 근거 혈당 Delta + Delta: Avg. delta - Config Builder 목표 OpenAPS MA @@ -85,8 +86,6 @@ Treatments 가상펌프 Careportal - - 펌프 Treatments 임시기초주입 @@ -96,7 +95,6 @@ 최소기간 제한 - Loop Loop APS @@ -104,6 +102,7 @@ Set by pump 최근 주입 나이트스카우트에서 Treatments를 새로고치시겠습니까 + 나이트스카우트에서 Temp Target을 새로고치시겠습니까 OK 취소 NO APS SELECTED OR PROVIDED RESULT @@ -111,6 +110,7 @@ 플러그인이 사용불가능 합니다 제한 위반 식사주입 전송 에러 + Tempbasal delivery error 기초주입 값 % (100% = 현재) 새 임시기초주입 적용: @@ -120,7 +120,9 @@ 확인 새 Treatment 입력: 식사주입 + Bolus: 기초주입 + Basal: 탄수화물 입력값 변경! 새 확장식사주입 설정: @@ -128,9 +130,9 @@ xDrip NSClient APS 모드 - Closed Loop Open Loop + Loop Disabled 새로운 제안이 있습니다 지원하지 않는 NSClient 버전입니다 NSClient 가 설치되지 않았습니다. 기록이 삭제됩니다! @@ -161,7 +163,6 @@ Temp Basal End Carbs correction OpenAPS Offline - Event type Other Meter @@ -198,14 +199,16 @@ 설정 불러오기 German Spanish + Greek 목표범위 최소 혈당값 목표범위 최대 혈당값 - 임시기초주입 최대량 [U/hr] - OpenAPS가 주입할수 있는 최대 기초주입 IOB [U] + 임시기초주입 최대량 [U/hr] + 이 값은 OpenAPS에서 Max Basal(임시기초주입 최대량)로 설정되는 값입니다 + OpenAPS가 주입할수 있는 최대 기초주입 IOB [U] + 이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후에 적정한 정도에 따라 값을 조정할 수 있습니다. Bulgarian - DISMISS + 닫기 언어 - 다나R 연결중 연결됨 @@ -240,8 +243,11 @@ 허가된 전화번호 +XXXXXXXXXX;+YYYYYYYYYY 식사주입 %.2fU 을 실행하려면 %s 를 입력하고 답장하세요 + To send calibration %.2f reply with code %s Bolus failed Bolus %.2fU delivered successfully + Going to deliver %.2fU + Bolus %.2fU delivered successfully %.2fU 주입중 SMS 원격 명령 사용하기 원격 식사주입 허용되지 않음 @@ -252,6 +258,7 @@ Temporary Target Cancel DanaR 프로파일 설정 인슐린활동시간(DIA) [h] + Duration of Insulin Activity 기초주입 프로파일 갱신 실패 History Reload @@ -285,6 +292,7 @@ 막힘 정지 정지 누름 + Waiting for pump 펌프를 기다리고 있습니다. Click to refresh. %.2fU을 주입합니다 나이트스카우트를 세팅하고, 기초주입과 비율을 분석한다. @@ -307,6 +315,7 @@ Loop가 실행되었습니다. Loop가 중지중입니다. Loop가 실행중입니다. + %.2f limited to %.2f 값 %s 은 하드리밋(Hard Limit)를 벗어났습니다 원격 기초주입설정이 허가되지 않았습니다 기초주입 %.2fU/h 을 실행하려면 %s 를 입력하고 답장하세요 @@ -316,10 +325,9 @@ Temp basal canceled Canceling temp basal failed 알려지지 않은 명령이거나 잘못된 답장입니다 - 퀵마법사 퀵마법사 설정 - 버튼 글자: + 버튼명: 탄수화물: 유효기간: 추가 @@ -334,6 +342,7 @@ NS upload only. 로컬소스(xDrip)가 선택되지 않으면 SGV에는 효력이 없습니다. NS프로파일이 사용중이라면 프로파일에는 효력이 없습니다. 이 기능을 사용하시려면 "NS upload only"을 비활성화 하세요. 펌프가 초기화 되지 않았습니다! + 펌프가 초기화와 프로파일 설정이 되지 않았습니다! 공기/채움 Please make sure the amount matches the specification of your infusion set! 기타 @@ -360,7 +369,7 @@ Overview/스마트워치 차트 표시용 고/저혈당 선 저혈당 선 고혈당 선 - Wear + 웨어 모든 데이터 다시 보내기 웨어에서 설정 열기 펌프 에러 @@ -379,27 +388,137 @@ BG: Last BG: MDI - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - " " - 필수 입력 항목입니다. + MM640g + Ongoing Notification + OLD DATA + %dmin ago + %dmin ago + Local Profile + OpenAPS AMA + Short avg. delta + Long avg. delta + Array of %d elements.\nActual value: + Autosens data + Script debug + AMA autosens 기능 사용하기 + Temp Target + Refresh temp targets from NS + Eating Soon + Activity + Remove record: + DanaR Stats + Cumulative TDD + Exponentially Weighted TDD + Basal + Bolus + TDD + Date + Ratio + # Days + Weight + Possibly inaccurate if using boluses for priming/filling! + Old Data Please Press "RELOAD" + Total Base Basal + TBB * 2 + Initializing ... + ACT + CONF + LOOP + SP + OAPS + TT + LP + DANA + CPP + TB + HOME + VPUMP + NSPROFILE + TREAT + CP + OBJ + WEAR + SMS + 탭 이름 단축 + Delta Settings + Always use short average delta instead of simple delta + Useful when data from unfiltered sources like xDrip gets noisy. + 고급 설정 + Firmware: + Model: %02X Protocol: %02X Code: %02X + 프로파일 + Default value: 3\nThis is a key OpenAPS safety cap. What this does is limit your basals to be 3x (in this people) your biggest basal rate. You likely will not need to change this, but you should be aware that’s what is discussed about “3x max daily; 4x current” for safety caps. + Default value: 4\nThis is the other half of the key OpenAPS safety caps, and the other half of “3x max daily; 4x current” of the safety caps. This means your basal, regardless of max basal set on your pump, cannot be any higher than this number times the current level of your basal. This is to prevent people from getting into dangerous territory by setting excessively high max basals before understanding how the algorithm works. Again, the default is 4x; most people will never need to adjust this and are instead more likely to need to adjust other settings if they feel like they are “running into” this safety cap. + Default value: 1.2\nThis is a multiplier cap for autosens (and soon autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target. + Default value: 0.7\nThe other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets. + Default value: true\nThis is used to allow autosens to adjust BG targets, in addition to ISF and basals. + Default value: 2\nBolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2). + Default value: 3.0\nThis is a setting for default carb absorption impact per 5 minutes. The default is an expected 3mg/dl/5min. This affects how fast COB are decayed, and how much carb absorption is assumed in calculating future predicted BG, when BG is falling more than expected, or not rising as much as expected. + 주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다.. + http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html 숫자만 입력가능합니다. 이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다. - 유효한 도메인 이름이 아닙니다. - 펌프를 기다리고 있습니다 + 필수 입력 항목입니다. + 폰번호가 유효하지 않습니다 + SMS폰번호가 유효하지 않습니다 + Copy To Clipboard + Copied to clipboard + Show log + 보정 + 혈당 보정 + Send calibration %.1f to xDrip? + xDrip+가 설치되지 않았습니다 + 보정이 xDrip으로 전송되었습니다 + 원격보정이 허용되지 않았습니다 + 보정이 전송되었습니다. xDrip에서 수신이 되도록 설정되어 있어야 합니다. + xDrip에서 보정을 받지 못합니다. + Don\'t show again + 펌프 일시중지. 상태를 새로고치려면 클릭하세요 + 펌프 일시중지됨 + 펌프 상태 가져오는중 + 임시 기초주입 설정중 + 임시기초주입 취소중 + 확장식사주입 설정중 + 확장식사주입 취소중 + 기초주입량 업데이트중 + 연결끊기중 + 실행중 + 가상펌프 설정 + Upload status to NS + 잘못된 비밀번호 + 설정 비밀번호 + 설정 잠금해제 + 인슐린 일 허용량에 근접중 + 내장 NSClient + NSCI + URL: + Autoscroll + Restart + 내장 NSClient + Nightscout URL + Nightscout URL 입력 + NS API secret + NS API secret + NS API secret 입력(최소 12글자) + Device name + Enter device name + It will be used for enteredBy field + Deliver now + Clear queue + Show queue + Queue: + Status: + Paused + Clear log + NSCLIENT이 쓰기 권한이 없습니다. 잘못된 API secret? + 웨어 설정 + IOB 자세하게 보여주기 + 워치페이스에 IOB를 식사주입IOB와 기초주입IOB로 나누어서 보여줍니다. + not successful - please check phone + Not available + 나이 + 어린이 + 청소년 + 성인 + 안전제한을 설정하기 위해 당뇨인의 나이를 선택하세요 From 52aa7c1bf85ebf127305cfc906660ada03abc1b5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 09:57:24 +0100 Subject: [PATCH 13/48] fix null pointer exception --- .../info/nightscout/androidaps/receivers/KeepAliveReceiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java index 434d488086..5c889b661f 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java @@ -35,7 +35,7 @@ public class KeepAliveReceiver extends BroadcastReceiver { final PumpInterface pump = MainApp.getConfigBuilder(); final NSProfile profile = MainApp.getConfigBuilder().getActiveProfile().getProfile(); - if (pump != null && profile != null) { + if (pump != null && profile != null && profile.getBasal(NSProfile.secondsFromMidnight()) != null) { boolean isBasalOutdated = false; boolean isStatusOutdated = false; From 2c2d83707928b765f4a383f60274d26edc62887d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 10:20:38 +0100 Subject: [PATCH 14/48] fix null pointer exception --- .../info/nightscout/androidaps/db/TempBasal.java | 6 +++++- .../plugins/NSClientInternal/data/NSProfile.java | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java index d15ab436da..149d188b7c 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java @@ -59,11 +59,15 @@ public class TempBasal { if (profile == null) return result; + Double basalRate = profile.getBasal(profile.secondsFromMidnight(time)); + + if (basalRate == null) + return result; + int realDuration = getRealDuration(); if (realDuration > 0) { Double netBasalRate = 0d; - Double basalRate = profile.getBasal(profile.secondsFromMidnight(time)); Double tempBolusSize = 0.05; if (isExtended) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSProfile.java index 4d3df3068c..5ff95ddf39 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSProfile.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.plugins.NSClientInternal.data; +import android.support.annotation.Nullable; + import com.crashlytics.android.Crashlytics; import org.json.JSONArray; @@ -178,6 +180,7 @@ public class NSProfile { return TimeZone.getDefault(); } + @Nullable public Double getValueToTime(JSONArray array, Integer timeAsSeconds) { Double lastValue = null; @@ -221,10 +224,12 @@ public class NSProfile { return retValue; } + @Nullable public Double getIsf(Integer timeAsSeconds) { return getIsf(getDefaultProfile(), timeAsSeconds); } + @Nullable public Double getIsf(JSONObject profile, Integer timeAsSeconds) { if (profile != null) { try { @@ -251,10 +256,12 @@ public class NSProfile { return ""; } + @Nullable public Double getIc(Integer timeAsSeconds) { return getIc(getDefaultProfile(), timeAsSeconds); } + @Nullable public Double getIc(JSONObject profile, Integer timeAsSeconds) { if (profile != null) { try { @@ -281,10 +288,12 @@ public class NSProfile { return ""; } + @Nullable public Double getBasal(Integer timeAsSeconds) { return getBasal(getDefaultProfile(), timeAsSeconds); } + @Nullable public Double getBasal(JSONObject profile, Integer timeAsSeconds) { if (profile != null) { try { @@ -339,10 +348,12 @@ public class NSProfile { return ""; } + @Nullable public Double getTargetLow(Integer timeAsSeconds) { return getTargetLow(getDefaultProfile(), timeAsSeconds); } + @Nullable public Double getTargetLow(JSONObject profile, Integer timeAsSeconds) { if (profile != null) { try { @@ -354,10 +365,12 @@ public class NSProfile { return 0D; } + @Nullable public Double getTargetHigh(Integer timeAsSeconds) { return getTargetHigh(getDefaultProfile(), timeAsSeconds); } + @Nullable public Double getTargetHigh(JSONObject profile, Integer timeAsSeconds) { if (profile != null) { try { From aa8fa729ad06f7f9edf7d891595cbcaa0f236f6b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 10:25:13 +0100 Subject: [PATCH 15/48] update fabric --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3b845352a4..905f2844c3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -140,10 +140,10 @@ dependencies { wearcontrolWearApp project(path: ':wear', configuration: 'fullRelease') compile fileTree(include: ['*.jar'], dir: 'libs') - compile('com.crashlytics.sdk.android:crashlytics:2.6.6@aar') { + compile('com.crashlytics.sdk.android:crashlytics:2.6.7@aar') { transitive = true; } - compile('com.crashlytics.sdk.android:answers:1.3.11@aar') { + compile('com.crashlytics.sdk.android:answers:1.3.12@aar') { transitive = true; } From 7c6d708d061cca54605ff2f5d55bf87184a84db4 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 10:57:20 +0100 Subject: [PATCH 16/48] use onAttach for context in WizardDialog --- .../Overview/Dialogs/WizardDialog.java | 88 +++++++++---------- .../plugins/Overview/OverviewFragment.java | 1 - 2 files changed, 44 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index 7916291ccc..b0e7123b17 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -85,17 +85,19 @@ public class WizardDialog extends DialogFragment implements OnClickListener { Handler mHandler; public static HandlerThread mHandlerThread; - Context parentContext; + Context context; public WizardDialog() { + super(); mHandlerThread = new HandlerThread(WizardDialog.class.getSimpleName()); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); } - - public void setContext(Context context) { - parentContext = context; + @Override + public void onAttach(Context context) { + super.onAttach(context); + this.context = context; } final private TextWatcher textWatcher = new TextWatcher() { @@ -129,7 +131,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener { @Override public void onNothingSelected(AdapterView parent) { - ToastUtils.showToastInUiThread(parentContext, MainApp.sResources.getString(R.string.noprofileselected)); + ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.noprofileselected)); wizardDialogDeliverButton.setVisibility(View.GONE); } }; @@ -200,8 +202,8 @@ public class WizardDialog extends DialogFragment implements OnClickListener { confirmMessage += "\n" + getString(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; confirmMessage += "\n" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; - if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { - AlertDialog.Builder builder = new AlertDialog.Builder(parentContext); + if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); @@ -212,45 +214,43 @@ public class WizardDialog extends DialogFragment implements OnClickListener { final Double finalInsulinAfterConstraints = insulinAfterConstraints; final Integer finalCarbsAfterConstraints = carbsAfterConstraints; - if (parentContext != null) { - AlertDialog.Builder builder = new AlertDialog.Builder(parentContext); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { - final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { - @Override - public void run() { - PumpEnactResult result = pump.deliverTreatmentFromBolusWizard( - parentContext, - finalInsulinAfterConstraints, - finalCarbsAfterConstraints, - SafeParse.stringToDouble(bgInput.getText().toString()), - "Manual", - SafeParse.stringToInt(carbTimeEdit.getText().toString()), - boluscalcJSON - ); - if (!result.success) { - AlertDialog.Builder builder = new AlertDialog.Builder(parentContext); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - } + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setMessage(confirmMessage); + builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { + final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); + mHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = pump.deliverTreatmentFromBolusWizard( + context, + finalInsulinAfterConstraints, + finalCarbsAfterConstraints, + SafeParse.stringToDouble(bgInput.getText().toString()), + "Manual", + SafeParse.stringToInt(carbTimeEdit.getText().toString()), + boluscalcJSON + ); + if (!result.success) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + builder.setMessage(result.comment); + builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.show(); } - }); - Answers.getInstance().logCustom(new CustomEvent("Wizard")); - } + } + }); + Answers.getInstance().logCustom(new CustomEvent("Wizard")); } - }); - builder.setNegativeButton(getString(R.string.cancel), null); - builder.show(); - dismiss(); - } else { - log.error("parentContext == null"); - } + } + }); + builder.setNegativeButton(getString(R.string.cancel), null); + builder.show(); + dismiss(); + } else { + log.error("parentContext == null"); } break; } 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 b925080c17..a51d3c5ff1 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 @@ -216,7 +216,6 @@ public class OverviewFragment extends Fragment { public void onClick(View view) { FragmentManager manager = getFragmentManager(); WizardDialog wizardDialog = new WizardDialog(); - wizardDialog.setContext(getContext()); wizardDialog.show(manager, "WizardDialog"); } }); From 96427cf3dcebd261084088f266dd40e62e2db239 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 10:59:11 +0100 Subject: [PATCH 17/48] use onAttach for context in CalibrationDialog --- .../plugins/Overview/Dialogs/CalibrationDialog.java | 10 ++++++---- .../androidaps/plugins/Overview/OverviewFragment.java | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java index 5c96cb58e5..d9ab1aa312 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java @@ -35,14 +35,16 @@ public class CalibrationDialog extends DialogFragment implements View.OnClickLis PlusMinusEditText bgText; TextView unitsView; - Context parentContext; + Context context; public CalibrationDialog() { // Required empty public constructor } - public void setContext(Context context) { - parentContext = context; + @Override + public void onAttach(Context context) { + super.onAttach(context); + this.context = context; } @Override @@ -74,7 +76,7 @@ public class CalibrationDialog extends DialogFragment implements View.OnClickLis switch (view.getId()) { case R.id.overview_calibration_okbutton: final Double bg = bgText.getValue(); - XdripCalibrations.confirmAndSendCalibration(bg, parentContext); + XdripCalibrations.confirmAndSendCalibration(bg, context); dismiss(); Answers.getInstance().logCustom(new CustomEvent("Calibration")); break; 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 a51d3c5ff1..d24739c9cf 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 @@ -249,7 +249,6 @@ public class OverviewFragment extends Fragment { public void onClick(View view) { FragmentManager manager = getFragmentManager(); CalibrationDialog calibrationDialog = new CalibrationDialog(); - calibrationDialog.setContext(getContext()); calibrationDialog.show(manager, "CalibrationDialog"); } }); From aa46479cdba22ade6ae2fe74168012bad9479ed0 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 11:00:29 +0100 Subject: [PATCH 18/48] unneeded else --- .../androidaps/plugins/Overview/Dialogs/WizardDialog.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index b0e7123b17..173e73facb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -249,8 +249,6 @@ public class WizardDialog extends DialogFragment implements OnClickListener { builder.setNegativeButton(getString(R.string.cancel), null); builder.show(); dismiss(); - } else { - log.error("parentContext == null"); } break; } From 86a7699d8fb0e77356ff046d0c1c1a6aff3d64ec Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 16:34:08 +0100 Subject: [PATCH 19/48] copy/paste mistake --- .../androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index 75d9bcec11..2d5a4580c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -54,7 +54,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi public static HandlerThread mHandlerThread; public NewTempBasalDialog() { - mHandlerThread = new HandlerThread(NewExtendedBolusDialog.class.getSimpleName()); + mHandlerThread = new HandlerThread(NewTempBasalDialog.class.getSimpleName()); mHandlerThread.start(); this.mHandler = new Handler(mHandlerThread.getLooper()); } From 48d30f2da3880ea4088c02e10c7bce650b780a99 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 9 Mar 2017 22:24:57 +0100 Subject: [PATCH 20/48] toast out of memory --- .../NSClientInternal/NSClientInternalPlugin.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java index ba36501a9e..234fca4b94 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java @@ -38,6 +38,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientS import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI; import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService; import info.nightscout.utils.SP; +import info.nightscout.utils.ToastUtils; public class NSClientInternalPlugin implements PluginBase { private static Logger log = LoggerFactory.getLogger(NSClientInternalPlugin.class); @@ -189,12 +190,16 @@ public class NSClientInternalPlugin implements PluginBase { } private void updateLog() { - Spanned newTextLog = Html.fromHtml(""); - for (EventNSClientNewLog log : listLog) { - newTextLog = (Spanned) TextUtils.concat(newTextLog, log.toHtml()); + try { + Spanned newTextLog = Html.fromHtml(""); + for (EventNSClientNewLog log : listLog) { + newTextLog = (Spanned) TextUtils.concat(newTextLog, log.toHtml()); + } + textLog = newTextLog; + MainApp.bus().post(new EventNSClientUpdateGUI()); + } catch (OutOfMemoryError e) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), "Out of memory!\nStop using this phone !!!"); } - textLog = newTextLog; - MainApp.bus().post(new EventNSClientUpdateGUI()); } public void resend(String reason) { From 7f4db28c4193fb66dc481393a9b3738ccc3e6481 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 10 Mar 2017 10:42:12 +0100 Subject: [PATCH 21/48] add sound --- .../plugins/NSClientInternal/NSClientInternalPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java index 234fca4b94..46c19b2eaa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java @@ -198,7 +198,7 @@ public class NSClientInternalPlugin implements PluginBase { textLog = newTextLog; MainApp.bus().post(new EventNSClientUpdateGUI()); } catch (OutOfMemoryError e) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), "Out of memory!\nStop using this phone !!!"); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), "Out of memory!\nStop using this phone !!!", R.raw.error); } } From f528f1cd8317871b81844dee10ea2f6ac5f013e7 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 18 Mar 2017 23:35:43 +0100 Subject: [PATCH 22/48] fix reading glimp bg data --- app/src/main/java/info/nightscout/androidaps/db/BgReading.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java index 951d370bf3..8a0aaf96e1 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java +++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java @@ -47,7 +47,7 @@ public class BgReading implements DataPointInterface { public BgReading(NSSgv sgv) { timeIndex = sgv.getMills(); value = sgv.getMgdl(); - raw = sgv.getFiltered(); + raw = sgv.getFiltered() != null ? sgv.getFiltered() : value; direction = sgv.getDirection(); } From e8edf9eb542f7c4a08e2262cd64d749acef9f23c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 21 Mar 2017 19:11:39 +0100 Subject: [PATCH 23/48] Glimp support --- .../info/nightscout/androidaps/MainApp.java | 2 + .../androidaps/Services/DataService.java | 38 ++++++++++++ .../androidaps/Services/Intents.java | 2 + .../SourceGlimp/SourceGlimpFragment.java | 16 +++++ .../SourceGlimp/SourceGlimpPlugin.java | 62 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 121 insertions(+) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpFragment.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpPlugin.java diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index ec478584a2..67057f1e9d 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -38,6 +38,7 @@ import info.nightscout.androidaps.plugins.Overview.OverviewFragment; import info.nightscout.androidaps.plugins.SafetyFragment.SafetyFragment; import info.nightscout.androidaps.plugins.SimpleProfile.SimpleProfileFragment; import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorFragment; +import info.nightscout.androidaps.plugins.SourceGlimp.SourceGlimpFragment; import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gFragment; import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment; import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripFragment; @@ -104,6 +105,7 @@ public class MainApp extends Application { pluginsList.add(SourceXdripFragment.getPlugin()); pluginsList.add(SourceNSClientFragment.getPlugin()); pluginsList.add(SourceMM640gFragment.getPlugin()); + pluginsList.add(SourceGlimpFragment.getPlugin()); if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorFragment.getPlugin()); if (Config.WEAR) pluginsList.add(WearFragment.getPlugin(this)); diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java index b27a1a85b4..f45e59f4c1 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java @@ -44,6 +44,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotificati import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorPlugin; import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS; +import info.nightscout.androidaps.plugins.SourceGlimp.SourceGlimpPlugin; import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gPlugin; import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientPlugin; import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin; @@ -59,6 +60,7 @@ public class DataService extends IntentService { boolean xDripEnabled = false; boolean nsClientEnabled = true; boolean mm640gEnabled = false; + boolean glimpEnabled = false; public DataService() { super("DataService"); @@ -74,14 +76,22 @@ public class DataService extends IntentService { xDripEnabled = true; nsClientEnabled = false; mm640gEnabled = false; + glimpEnabled = false; } else if (ConfigBuilderPlugin.getActiveBgSource().getClass().equals(SourceNSClientPlugin.class)) { xDripEnabled = false; nsClientEnabled = true; mm640gEnabled = false; + glimpEnabled = false; } else if (ConfigBuilderPlugin.getActiveBgSource().getClass().equals(SourceMM640gPlugin.class)) { xDripEnabled = false; nsClientEnabled = false; mm640gEnabled = true; + glimpEnabled = false; + } else if (ConfigBuilderPlugin.getActiveBgSource().getClass().equals(SourceGlimpPlugin.class)) { + xDripEnabled = false; + nsClientEnabled = false; + mm640gEnabled = false; + glimpEnabled = true; } boolean isNSProfile = ConfigBuilderPlugin.getActiveProfile().getClass().equals(NSProfilePlugin.class); @@ -99,6 +109,10 @@ public class DataService extends IntentService { if (mm640gEnabled) { handleNewDataFromMM640g(intent); } + } else if (Intents.GLIMP_BG.equals(action)) { + if (glimpEnabled) { + handleNewDataFromGlimp(intent); + } } else if (Intents.ACTION_NEW_SGV.equals(action)) { // always handle SGV if NS-Client is the source if (nsClientEnabled) { @@ -185,6 +199,30 @@ public class DataService extends IntentService { MainApp.bus().post(new EventNewBG()); } + private void handleNewDataFromGlimp(Intent intent) { + Bundle bundle = intent.getExtras(); + if (bundle == null) return; + + BgReading bgReading = new BgReading(); + + bgReading.value = bundle.getDouble("mySGV"); + bgReading.direction = bundle.getString("myTrend"); + bgReading.battery_level = bundle.getInt("myBatLvl"); + bgReading.timeIndex = bundle.getLong("myTimestamp"); + bgReading.raw = 0; + + if (Config.logIncommingBG) + log.debug(bundle.toString()); + log.debug("GLIMP BG " + bgReading.toString()); + + try { + MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading); + } catch (SQLException e) { + e.printStackTrace(); + } + MainApp.bus().post(new EventNewBG()); + } + private void handleNewDataFromMM640g(Intent intent) { Bundle bundle = intent.getExtras(); if (bundle == null) return; diff --git a/app/src/main/java/info/nightscout/androidaps/Services/Intents.java b/app/src/main/java/info/nightscout/androidaps/Services/Intents.java index 4787838d4f..1b7b0875e5 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/Intents.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/Intents.java @@ -35,4 +35,6 @@ public interface Intents { String NS_EMULATOR = "com.eveningoutpost.dexdrip.NS_EMULATOR"; String ACTION_REMOTE_CALIBRATION = "com.eveningoutpost.dexdrip.NewCalibration"; + + String GLIMP_BG = "it.ct.glicemia.ACTION_GLUCOSE_MEASURED"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpFragment.java new file mode 100644 index 0000000000..85a4ee9646 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpFragment.java @@ -0,0 +1,16 @@ +package info.nightscout.androidaps.plugins.SourceGlimp; + + +import android.support.v4.app.Fragment; + +import info.nightscout.androidaps.interfaces.FragmentBase; + +public class SourceGlimpFragment extends Fragment implements FragmentBase { + + private static SourceGlimpPlugin sourceGlimpPlugin = new SourceGlimpPlugin(); + + public static SourceGlimpPlugin getPlugin() { + return sourceGlimpPlugin; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpPlugin.java new file mode 100644 index 0000000000..7a5965e3df --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SourceGlimp/SourceGlimpPlugin.java @@ -0,0 +1,62 @@ +package info.nightscout.androidaps.plugins.SourceGlimp; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.interfaces.BgSourceInterface; +import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gFragment; + +/** + * Created by mike on 05.08.2016. + */ +public class SourceGlimpPlugin implements PluginBase, BgSourceInterface { + boolean fragmentEnabled = false; + + @Override + public String getFragmentClass() { + return SourceGlimpFragment.class.getName(); + } + + @Override + public int getType() { + return PluginBase.BGSOURCE; + } + + @Override + public String getName() { + return MainApp.instance().getString(R.string.Glimp); + } + + @Override + public String getNameShort() { + // use long name as fallback (no tabs) + return getName(); + } + + @Override + public boolean isEnabled(int type) { + return type == BGSOURCE && fragmentEnabled; + } + + @Override + public boolean isVisibleInTabs(int type) { + return false; + } + + @Override + public boolean canBeHidden(int type) { + return true; + } + + @Override + public void setFragmentEnabled(int type, boolean fragmentEnabled) { + if (type == BGSOURCE) this.fragmentEnabled = fragmentEnabled; + } + + @Override + public void setFragmentVisible(int type, boolean fragmentVisible) { + + } + + +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 45688577f3..5c28094f14 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -553,4 +553,5 @@ adult Please select patient age to setup safety limits I_understand + Glimp From 8b357ac49e957a70adfbd2ea97c7da4fb7369e74 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 23 Mar 2017 10:12:36 +0100 Subject: [PATCH 24/48] fix null pointer exception --- .../info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java index 556c6d9770..4a2d9d3a56 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java @@ -276,6 +276,7 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf for (int h = 0; h < basalValues; h++) { Double pumpValue = pump.pumpProfiles[pump.activeProfile][h]; Double profileValue = profile.getBasal(h * basalIncrement); + if (profileValue == null) return true; if (Math.abs(pumpValue - profileValue) > getPumpDescription().basalStep) { log.debug("Diff found. Hour: " + h + " Pump: " + pumpValue + " Profile: " + profileValue); return false; From 32fda0f0df276b9bcbcfb238c5651dd5062ad681 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 23 Mar 2017 10:48:49 +0100 Subject: [PATCH 25/48] fix upload virtual pump status --- .../plugins/ConfigBuilder/ConfigBuilderPlugin.java | 2 +- .../plugins/VirtualPump/VirtualPumpPlugin.java | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) 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 f780596e59..e1dacda013 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 @@ -1025,7 +1025,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain deviceStatus.device = "openaps://" + deviceID(); JSONObject pumpstatus = getJSONStatus(); if (pumpstatus != null) { - deviceStatus.pump = getJSONStatus(); + deviceStatus.pump = pumpstatus; } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/VirtualPump/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/VirtualPump/VirtualPumpPlugin.java index f84adf737e..2e3a802a7a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/VirtualPump/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/VirtualPump/VirtualPumpPlugin.java @@ -38,6 +38,8 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { public static Integer batteryPercent = 50; public static Integer reservoirInUnits = 50; + Date lastDataTime = new Date(0); + boolean fragmentEnabled = true; boolean fragmentVisible = true; @@ -150,6 +152,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public int setNewBasalProfile(NSProfile profile) { // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); + lastDataTime = new Date(); return SUCCESS; } @@ -160,12 +163,13 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public Date lastDataTime() { - return new Date(); + return lastDataTime; } @Override public void refreshDataFromPump(String reason) { - // do nothing + MainApp.getConfigBuilder().uploadDeviceStatus(); + lastDataTime = new Date(); } @Override @@ -251,6 +255,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { if (Config.logPumpComm) log.debug("Delivering treatment insulin: " + insulin + "U carbs: " + carbs + "g " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); + lastDataTime = new Date(); return result; } @@ -285,6 +290,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { if (Config.logPumpComm) log.debug("Setting temp basal absolute: " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); + lastDataTime = new Date(); return result; } @@ -318,6 +324,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { if (Config.logPumpComm) log.debug("Settings temp basal percent: " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); + lastDataTime = new Date(); return result; } @@ -349,6 +356,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { if (Config.logPumpComm) log.debug("Setting extended bolus: " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); + lastDataTime = new Date(); return result; } @@ -375,6 +383,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { result.comment = MainApp.instance().getString(R.string.virtualpump_sqlerror); } } + lastDataTime = new Date(); return result; } @@ -399,6 +408,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { if (Config.logPumpComm) log.debug("Canceling extended basal: " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); + lastDataTime = new Date(); return result; } From a4f302ee4a897fac34aba2be17f386289ce4da96 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 24 Mar 2017 12:05:12 +0100 Subject: [PATCH 26/48] show if pump is suspended --- .../androidaps/plugins/DanaR/DanaRPlugin.java | 12 ++++++++++++ .../plugins/DanaRKorean/DanaRKoreanPlugin.java | 12 ++++++++++++ .../androidaps/plugins/Loop/LoopPlugin.java | 12 ++++++++++++ .../plugins/Overview/OverviewFragment.java | 10 +++++++--- app/src/main/res/drawable/loopmodeborder.xml | 2 +- app/src/main/res/drawable/loopmodedisabledborder.xml | 2 +- .../main/res/drawable/loopmodesuspendedborder.xml | 7 +++++++ .../temptargetborder.xml | 0 .../temptargetborderdisabled.xml | 0 app/src/main/res/values/colors.xml | 4 ++++ 10 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/loopmodesuspendedborder.xml rename app/src/main/res/{drawable-mdpi-v11 => drawable}/temptargetborder.xml (100%) rename app/src/main/res/{drawable-mdpi-v11 => drawable}/temptargetborderdisabled.xml (100%) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java index 4a2d9d3a56..cb4e1b5bce 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java @@ -106,6 +106,18 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf pumpDescription.basalMinimumRate = 0.04d; pumpDescription.isRefillingCapable = true; + + Thread t = new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + refreshDataFromPump("Initialization"); + } + }); + t.start(); } ServiceConnection mConnection = new ServiceConnection() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java index 683e2d8f1b..c701f5e5fe 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java @@ -108,6 +108,18 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints pumpDescription.basalMinimumRate = 0.1d; pumpDescription.isRefillingCapable = true; + + Thread t = new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + refreshDataFromPump("Initialization"); + } + }); + t.start(); } ServiceConnection mConnection = new ServiceConnection() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index c73b4a7f1f..b77d5f7834 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -133,12 +133,24 @@ public class LoopPlugin implements PluginBase { log.debug("invoke"); ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder(); if (!constraintsInterface.isLoopEnabled()) { + log.debug(MainApp.sResources.getString(R.string.loopdisabled)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopdisabled))); + return; + } + if (!constraintsInterface.isLoopEnabled()) { + log.debug(MainApp.sResources.getString(R.string.loopdisabled)); MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopdisabled))); return; } final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder(); APSResult result = null; + if (!configBuilder.isSuspended()) { + log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); + return; + } + if (configBuilder == null || !isEnabled(PluginBase.LOOP)) return; 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 d24739c9cf..a10fbca206 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 @@ -546,6 +546,8 @@ public class OverviewFragment extends Fragment { loopStatusLayout.setVisibility(View.VISIBLE); } + PumpInterface pump = MainApp.getConfigBuilder(); + // Skip if not initialized yet if (bgGraph == null) return; @@ -560,7 +562,11 @@ public class OverviewFragment extends Fragment { apsModeView.setBackgroundResource(R.drawable.loopmodeborder); apsModeView.setTextColor(Color.BLACK); final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); - if (activeloop != null && activeloop.isEnabled(activeloop.getType())) { + if (pump.isSuspended()) { + apsModeView.setBackgroundResource(R.drawable.loopmodesuspendedborder); + apsModeView.setText(MainApp.sResources.getString(R.string.pumpsuspended)); + apsModeView.setTextColor(Color.WHITE); + } else if (activeloop != null && activeloop.isEnabled(activeloop.getType())) { if (MainApp.getConfigBuilder().isClosedModeEnabled()) { apsModeView.setText(MainApp.sResources.getString(R.string.closedloop)); } else { @@ -627,8 +633,6 @@ public class OverviewFragment extends Fragment { } // **** Temp button **** - PumpInterface pump = MainApp.getConfigBuilder(); - boolean showAcceptButton = !MainApp.getConfigBuilder().isClosedModeEnabled(); // Open mode needed showAcceptButton = showAcceptButton && finalLastRun != null && finalLastRun.lastAPSRun != null; // aps result must exist showAcceptButton = showAcceptButton && (finalLastRun.lastOpenModeAccept == null || finalLastRun.lastOpenModeAccept.getTime() < finalLastRun.lastAPSRun.getTime()); // never accepted or before last result diff --git a/app/src/main/res/drawable/loopmodeborder.xml b/app/src/main/res/drawable/loopmodeborder.xml index 86d49ae55d..95f3c114e6 100644 --- a/app/src/main/res/drawable/loopmodeborder.xml +++ b/app/src/main/res/drawable/loopmodeborder.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/loopmodedisabledborder.xml b/app/src/main/res/drawable/loopmodedisabledborder.xml index 1d312404e0..2326b5ca14 100644 --- a/app/src/main/res/drawable/loopmodedisabledborder.xml +++ b/app/src/main/res/drawable/loopmodedisabledborder.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable/loopmodesuspendedborder.xml b/app/src/main/res/drawable/loopmodesuspendedborder.xml new file mode 100644 index 0000000000..9caa1789c1 --- /dev/null +++ b/app/src/main/res/drawable/loopmodesuspendedborder.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-mdpi-v11/temptargetborder.xml b/app/src/main/res/drawable/temptargetborder.xml similarity index 100% rename from app/src/main/res/drawable-mdpi-v11/temptargetborder.xml rename to app/src/main/res/drawable/temptargetborder.xml diff --git a/app/src/main/res/drawable-mdpi-v11/temptargetborderdisabled.xml b/app/src/main/res/drawable/temptargetborderdisabled.xml similarity index 100% rename from app/src/main/res/drawable-mdpi-v11/temptargetborderdisabled.xml rename to app/src/main/res/drawable/temptargetborderdisabled.xml diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 04dc1e3798..4af451b366 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -27,6 +27,10 @@ #779ECB #FF478EFF + #47c8ff + #FFDD7792 + #ff0400 + #ff0400 #ff5e55 #ff827c From c78adb6256b4c0daf920af1c42d2b720cf1ab492 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 24 Mar 2017 12:22:36 +0100 Subject: [PATCH 27/48] suspended status for korean pump --- .../androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java | 2 +- .../androidaps/plugins/DanaRKorean/DanaRKoreanPump.java | 2 ++ .../plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java index c701f5e5fe..ae541abbb6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java @@ -227,7 +227,7 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints @Override public boolean isSuspended() { - return false; + return getDanaRPump().pumpSuspended; } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java index b8a7016956..6786cc4c2e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPump.java @@ -43,6 +43,8 @@ public class DanaRKoreanPump { public int protocol; public int productCode; + public boolean pumpSuspended; + public boolean isConfigUD; public boolean isExtendedBolusEnabled; public boolean isEasyModeEnabled; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java index 39f45d7843..e21db06d4c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/comm/MsgInitConnStatusBasic.java @@ -26,13 +26,13 @@ public class MsgInitConnStatusBasic extends MessageBase { return; } DanaRKoreanPump pump = DanaRKoreanPlugin.getDanaRPump(); - int isStatusSuspendOn = intFromBuff(bytes, 0, 1); + pump.pumpSuspended = intFromBuff(bytes, 0, 1) == 1; int isUtilityEnable = intFromBuff(bytes, 1, 1); pump.isEasyModeEnabled = intFromBuff(bytes, 2, 1) == 1; int easyUIMode = intFromBuff(bytes, 3, 1); pump.password = intFromBuff(bytes, 4, 2) ^ 0x3463; if (Config.logDanaMessageDetail) { - log.debug("isStatusSuspendOn: " + isStatusSuspendOn); + log.debug("isStatusSuspendOn: " + pump.pumpSuspended); log.debug("isUtilityEnable: " + isUtilityEnable); log.debug("Is EasyUI Enabled: " + pump.isEasyModeEnabled); log.debug("easyUIMode: " + easyUIMode); From b6016dc08489e28997266bd0b4d6ad95b63a3d6b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 24 Mar 2017 12:31:28 +0100 Subject: [PATCH 28/48] objective 0 zero days duration --- .../androidaps/plugins/Objectives/ObjectivesPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Objectives/ObjectivesPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Objectives/ObjectivesPlugin.java index 5d33fdae5e..86cea210b4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Objectives/ObjectivesPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Objectives/ObjectivesPlugin.java @@ -153,7 +153,7 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { MainApp.sResources.getString(R.string.objectives_0_objective), MainApp.sResources.getString(R.string.objectives_0_gate), new Date(0), - 1, // 1 day + 0, // 0 day new Date(0))); objectives.add(new Objective(1, MainApp.sResources.getString(R.string.objectives_1_objective), From dc45d01120af743e780aca58c916d8fdf1c278f6 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 24 Mar 2017 23:03:55 +0100 Subject: [PATCH 29/48] changle loading initial status --- .../java/info/nightscout/androidaps/MainApp.java | 15 +++++++++++++++ .../androidaps/plugins/DanaR/DanaRPlugin.java | 12 ------------ .../plugins/DanaRKorean/DanaRKoreanPlugin.java | 12 ------------ 3 files changed, 15 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 67057f1e9d..6568e03a53 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Actions.ActionsFragment; import info.nightscout.androidaps.plugins.Careportal.CareportalFragment; import info.nightscout.androidaps.plugins.CircadianPercentageProfile.CircadianPercentageProfileFragment; @@ -119,6 +120,20 @@ public class MainApp extends Application { MainApp.getConfigBuilder().uploadAppStart(); startKeepAliveService(); + + Thread t = new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + PumpInterface pump = MainApp.getConfigBuilder(); + if (pump != null) + pump.refreshDataFromPump("Initialization"); + } + }); + t.start(); } private void startKeepAliveService() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java index cb4e1b5bce..4a2d9d3a56 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/DanaRPlugin.java @@ -106,18 +106,6 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf pumpDescription.basalMinimumRate = 0.04d; pumpDescription.isRefillingCapable = true; - - Thread t = new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - refreshDataFromPump("Initialization"); - } - }); - t.start(); } ServiceConnection mConnection = new ServiceConnection() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java index ae541abbb6..11debc415a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanPlugin.java @@ -108,18 +108,6 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints pumpDescription.basalMinimumRate = 0.1d; pumpDescription.isRefillingCapable = true; - - Thread t = new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - refreshDataFromPump("Initialization"); - } - }); - t.start(); } ServiceConnection mConnection = new ServiceConnection() { From fe6ff686b1643370b4cb130ff0e0741ee338b76d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 27 Mar 2017 18:37:43 +0200 Subject: [PATCH 30/48] fix pump suspended message --- .../nightscout/androidaps/plugins/Loop/LoopPlugin.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index b77d5f7834..392f98a5e9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -137,15 +137,10 @@ public class LoopPlugin implements PluginBase { MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopdisabled))); return; } - if (!constraintsInterface.isLoopEnabled()) { - log.debug(MainApp.sResources.getString(R.string.loopdisabled)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopdisabled))); - return; - } final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder(); APSResult result = null; - if (!configBuilder.isSuspended()) { + if (configBuilder.isSuspended()) { log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); return; From 0cb4ace05226af3c524e7a9ed4c3eafd60df6647 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 28 Mar 2017 22:49:56 +0200 Subject: [PATCH 31/48] glimp broadcast to manifest --- app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2694197809..7216557a89 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -74,6 +74,8 @@ + + From d6f31820d9b16d75bfa679b19ca760f26410b7e9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 31 Mar 2017 09:21:40 +0200 Subject: [PATCH 32/48] request battery optimalization whitelisting --- app/src/main/AndroidManifest.xml | 1 + .../nightscout/androidaps/MainActivity.java | 38 ++++++++++++++++ .../java/info/nightscout/utils/OKDialog.java | 44 +++++++++++++++++++ app/src/main/res/values/strings.xml | 3 ++ 4 files changed, 86 insertions(+) create mode 100644 app/src/main/java/info/nightscout/utils/OKDialog.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7216557a89..e01ed53f34 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ + diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index 715756259a..ccca5bcb22 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -1,13 +1,17 @@ package info.nightscout.androidaps; import android.Manifest; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Rect; +import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.os.PowerManager; +import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewPager; @@ -37,8 +41,10 @@ import info.nightscout.androidaps.tabs.TabPageAdapter; import info.nightscout.utils.ImportExportPrefs; import info.nightscout.utils.LocaleHelper; import info.nightscout.utils.LogDialog; +import info.nightscout.utils.OKDialog; import info.nightscout.utils.PasswordProtection; import info.nightscout.utils.SP; +import info.nightscout.utils.ToastUtils; public class MainActivity extends AppCompatActivity { private static Logger log = LoggerFactory.getLogger(MainActivity.class); @@ -59,6 +65,7 @@ public class MainActivity extends AppCompatActivity { askForPermission(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, CASE_STORAGE); } + askForBatteryOptimizationPermission(); if (Config.logFunctionCalls) log.debug("onCreate"); @@ -228,6 +235,37 @@ public class MainActivity extends AppCompatActivity { askForSMSPermissions(); } + private void askForBatteryOptimizationPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + final String packageName = getPackageName(); + + final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (!pm.isIgnoringBatteryOptimizations(packageName)) { + log.debug("Requesting ignore battery optimization"); + + OKDialog.show(this, getString(R.string.pleaseallowpermission), String.format(getString(R.string.needwhitelisting), getString(R.string.app_name)), new Runnable() { + + @Override + public void run() { + try { + final Intent intent = new Intent(); + + // ignoring battery optimizations required for constant connection + intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); + intent.setData(Uri.parse("package:" + packageName)); + startActivity(intent); + + } catch (ActivityNotFoundException e) { + final String msg = getString(R.string.batteryoptimalizationerror); + ToastUtils.showToastInUiThread(getApplicationContext(), msg); + log.error(msg); + } + } + }); + } + } + } + private synchronized void askForSMSPermissions() { if (askForSMS) { //only when settings were changed an MainActivity resumes. askForSMS = false; diff --git a/app/src/main/java/info/nightscout/utils/OKDialog.java b/app/src/main/java/info/nightscout/utils/OKDialog.java new file mode 100644 index 0000000000..19fbe7c62a --- /dev/null +++ b/app/src/main/java/info/nightscout/utils/OKDialog.java @@ -0,0 +1,44 @@ +package info.nightscout.utils; + +import android.app.Activity; +import android.content.DialogInterface; +import android.support.v7.app.AlertDialog; +import android.support.v7.view.ContextThemeWrapper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; + +/** + * Created by mike on 31.03.2017. + */ + +public class OKDialog { + private static Logger log = LoggerFactory.getLogger(OKDialog.class); + + public static void show(final Activity activity, String title, String message, final Runnable runnable) { + try { + AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme)); + builder.setTitle(title); + builder.setMessage(message); + builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + if (runnable != null) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + activity.runOnUiThread(runnable); + } + } + }); + + builder.create().show(); + } catch (Exception e) { + log.debug("show_dialog exception: " + e); + } + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5c28094f14..955c02017f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -554,4 +554,7 @@ Please select patient age to setup safety limits I_understand Glimp + Device does not appear to support battery optimization whitelisting! + Please Allow Permission + %s needs battery optimalization whitelisting for proper performance From 5f0de38dfe4c7eb9cb77d599aef40ab7bc2d639b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 1 Apr 2017 12:47:18 +0200 Subject: [PATCH 33/48] 1.3rc2 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 905f2844c3..b81a8e12d2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ android { minSdkVersion 21 targetSdkVersion 23 versionCode 1100 - version "1.3rc1" + version "1.3rc2" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() } From e5012d8633fe2a505678a4343d4fd56a13dcb97c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Apr 2017 10:03:15 +0200 Subject: [PATCH 34/48] Answers for SMS commands --- .../SmsCommunicator/SmsCommunicatorPlugin.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java index 4258907547..af085d9c4a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java @@ -7,6 +7,8 @@ import android.preference.PreferenceManager; import android.telephony.SmsManager; import android.telephony.SmsMessage; +import com.crashlytics.android.answers.Answers; +import com.crashlytics.android.answers.CustomEvent; import com.squareup.otto.Subscribe; import org.slf4j.Logger; @@ -244,6 +246,7 @@ public class SmsCommunicatorPlugin implements PluginBase { sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Bg")); break; case "LOOP": switch (splited[1].toUpperCase()) { @@ -255,6 +258,7 @@ public class SmsCommunicatorPlugin implements PluginBase { sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Stop")); break; case "START": loopPlugin = (LoopPlugin) MainApp.getSpecificPlugin(LoopPlugin.class); @@ -264,6 +268,7 @@ public class SmsCommunicatorPlugin implements PluginBase { sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Start")); break; case "STATUS": loopPlugin = (LoopPlugin) MainApp.getSpecificPlugin(LoopPlugin.class); @@ -276,6 +281,7 @@ public class SmsCommunicatorPlugin implements PluginBase { sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Status")); break; } break; @@ -289,6 +295,7 @@ public class SmsCommunicatorPlugin implements PluginBase { reply = "TERATMENTS REFRESH " + q.size() + " receivers"; sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Treatments_Refresh")); break; } break; @@ -301,6 +308,7 @@ public class SmsCommunicatorPlugin implements PluginBase { reply = "NSCLIENT RESTART " + q.size() + " receivers"; sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Nsclient_Restart")); break; } break; @@ -316,6 +324,7 @@ public class SmsCommunicatorPlugin implements PluginBase { sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } receivedSms.processed = true; + Answers.getInstance().logCustom(new CustomEvent("SMS_Danar")); break; case "BASAL": if (splited.length > 1) { @@ -327,6 +336,7 @@ public class SmsCommunicatorPlugin implements PluginBase { receivedSms.processed = true; resetWaitingMessages(); sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); + Answers.getInstance().logCustom(new CustomEvent("SMS_Basal")); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); @@ -341,6 +351,7 @@ public class SmsCommunicatorPlugin implements PluginBase { resetWaitingMessages(); sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); tempBasalWaitingForConfirmation.tempBasal = tempBasal; + Answers.getInstance().logCustom(new CustomEvent("SMS_Basal")); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); @@ -363,6 +374,7 @@ public class SmsCommunicatorPlugin implements PluginBase { resetWaitingMessages(); sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); bolusWaitingForConfirmation.bolusRequested = amount; + Answers.getInstance().logCustom(new CustomEvent("SMS_Bolus")); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); @@ -380,6 +392,7 @@ public class SmsCommunicatorPlugin implements PluginBase { resetWaitingMessages(); sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); calibrationWaitingForConfirmation.calibrationRequested = amount; + Answers.getInstance().logCustom(new CustomEvent("SMS_Cal")); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_remotecalibrationnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); From 42883a81a0deb2ee8130d780acfbf6eaa7e0ceee Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Apr 2017 10:29:46 +0200 Subject: [PATCH 35/48] allow return GlucoseStatus with only 1 actual value --- .../nightscout/androidaps/data/GlucoseStatus.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/data/GlucoseStatus.java b/app/src/main/java/info/nightscout/androidaps/data/GlucoseStatus.java index 9fc8bd0ff4..ad9b0acecf 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/GlucoseStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/data/GlucoseStatus.java @@ -73,7 +73,7 @@ public class GlucoseStatus { List data = MainApp.getDbHelper().getBgreadingsDataFromTime(fromtime, false); int sizeRecords = data.size(); - if (sizeRecords < 4 || data.get(0).timeIndex < new Date().getTime() - 7 * 60 * 1000L) { + if (sizeRecords < 1 || data.get(0).timeIndex < new Date().getTime() - 7 * 60 * 1000L) { return null; } @@ -81,6 +81,16 @@ public class GlucoseStatus { long now_date = now.timeIndex; double change; + if (sizeRecords < 2) { + GlucoseStatus status = new GlucoseStatus(); + status.glucose = now.value; + status.short_avgdelta = 0d; + status.delta = 0d; + status.long_avgdelta = 0d; + status.avgdelta = 0d; // for OpenAPS MA + return status.round(); + } + ArrayList last_deltas = new ArrayList(); ArrayList short_deltas = new ArrayList(); ArrayList long_deltas = new ArrayList(); @@ -121,7 +131,7 @@ public class GlucoseStatus { status.short_avgdelta = average(short_deltas); - if(prefs.getBoolean("always_use_shortavg",false) || last_deltas.isEmpty()){ + if (prefs.getBoolean("always_use_shortavg", false) || last_deltas.isEmpty()) { status.delta = status.short_avgdelta; } else { status.delta = average(last_deltas); From f5960502396b8e59cb907f97aab00dfa039c9a43 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 5 Apr 2017 21:39:39 +0200 Subject: [PATCH 36/48] loop suspend menu --- .../androidaps/plugins/Loop/LoopPlugin.java | 54 ++++++- .../plugins/Overview/OverviewFragment.java | 144 +++++++++++++++++- .../main/java/info/nightscout/utils/SP.java | 10 +- app/src/main/res/values/strings.xml | 14 ++ 4 files changed, 211 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index 392f98a5e9..ec3fdc32a0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -32,6 +32,7 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui; import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui; import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification; +import info.nightscout.utils.SP; /** * Created by mike on 05.08.2016. @@ -45,6 +46,8 @@ public class LoopPlugin implements PluginBase { private boolean fragmentEnabled = false; private boolean fragmentVisible = true; + private long loopSuspendedTill = 0L; // end of manual loop suspend + public class LastRun { public APSResult request = null; public APSResult constraintsProcessed = null; @@ -64,6 +67,7 @@ public class LoopPlugin implements PluginBase { sHandler = new Handler(sHandlerThread.getLooper()); } MainApp.bus().register(this); + loopSuspendedTill = SP.getLong("loopSuspendedTill", 0L); } @Override @@ -127,6 +131,44 @@ public class LoopPlugin implements PluginBase { invoke("EventNewBG", true); } + public long suspendedTo() { + return loopSuspendedTill; + } + + public void suspendTo(long endTime) { + loopSuspendedTill = endTime; + SP.putLong("loopSuspendedTill", loopSuspendedTill); + } + + public int minutesToEndOfSuspend() { + if (loopSuspendedTill == 0) + return 0; + + long now = new Date().getTime(); + long msecDiff = loopSuspendedTill - now; + + if (loopSuspendedTill <= now) { // time exceeded + suspendTo(0L); + return 0; + } + + return (int) (msecDiff / 60d / 1000d); + } + + public boolean isSuspended() { + if (loopSuspendedTill == 0) + return false; + + long now = new Date().getTime(); + + if (loopSuspendedTill <= now) { // time exceeded + suspendTo(0L); + return false; + } + + return true; + } + public void invoke(String initiator, boolean allowNotification) { try { if (Config.logFunctionCalls) @@ -140,15 +182,21 @@ public class LoopPlugin implements PluginBase { final ConfigBuilderPlugin configBuilder = MainApp.getConfigBuilder(); APSResult result = null; + if (configBuilder == null || !isEnabled(PluginBase.LOOP)) + return; + + if (isSuspended()) { + log.debug(MainApp.sResources.getString(R.string.loopsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopsuspended))); + return; + } + if (configBuilder.isSuspended()) { log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); return; } - if (configBuilder == null || !isEnabled(PluginBase.LOOP)) - return; - // Check if pump info is loaded if (configBuilder.getBaseBasalRate() < 0.01d) return; 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 a10fbca206..f449dc18d1 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 @@ -18,8 +18,10 @@ import android.support.v7.app.AlertDialog; import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.view.ContextMenu; import android.view.HapticFeedbackConstants; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -95,6 +97,7 @@ import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.Round; import info.nightscout.utils.SP; +import info.nightscout.utils.ToastUtils; public class OverviewFragment extends Fragment { @@ -310,6 +313,133 @@ public class OverviewFragment extends Fragment { return view; } + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + if (activeloop == null) + return; + menu.setHeaderTitle(MainApp.sResources.getString(R.string.loop)); + if (activeloop.isEnabled(PluginBase.LOOP)) { + menu.add(MainApp.sResources.getString(R.string.disabledloop)); + if (!activeloop.isSuspended()) { + menu.add(MainApp.sResources.getString(R.string.suspendloopfor1h)); + menu.add(MainApp.sResources.getString(R.string.suspendloopfor2h)); + menu.add(MainApp.sResources.getString(R.string.suspendloopfor3h)); + menu.add(MainApp.sResources.getString(R.string.suspendloopfor10h)); + menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor30m)); + menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor1h)); + menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor2h)); + menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor3h)); + } else { + menu.add(MainApp.sResources.getString(R.string.resume)); + } + } + if (!activeloop.isEnabled(PluginBase.LOOP)) + menu.add(MainApp.sResources.getString(R.string.enabledloop)); + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + if (item.getTitle() == MainApp.sResources.getString(R.string.disabledloop)) { + activeloop.setFragmentEnabled(PluginBase.LOOP, false); + activeloop.setFragmentVisible(PluginBase.LOOP, false); + MainApp.getConfigBuilder().storeSettings(); + MainApp.bus().post(new EventRefreshGui(false)); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.enabledloop)) { + activeloop.setFragmentEnabled(PluginBase.LOOP, true); + activeloop.setFragmentVisible(PluginBase.LOOP, true); + MainApp.getConfigBuilder().storeSettings(); + MainApp.bus().post(new EventRefreshGui(false)); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.resume)) { + activeloop.suspendTo(0L); + sHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(); + if (!result.success) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + } + MainApp.bus().post(new EventRefreshGui(false)); + } + }); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor1h)) { + activeloop.suspendTo(new Date().getTime() + 60L * 60 * 1000); + MainApp.bus().post(new EventRefreshGui(false)); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor2h)) { + activeloop.suspendTo(new Date().getTime() + 2 * 60L * 60 * 1000); + MainApp.bus().post(new EventRefreshGui(false)); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor3h)) { + activeloop.suspendTo(new Date().getTime() + 3 * 60L * 60 * 1000); + MainApp.bus().post(new EventRefreshGui(false)); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor10h)) { + activeloop.suspendTo(new Date().getTime() + 10 * 60L * 60 * 1000); + MainApp.bus().post(new EventRefreshGui(false)); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor30m)) { + activeloop.suspendTo(new Date().getTime() + 30L * 60 * 1000); + sHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 30); + if (!result.success) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + } + MainApp.bus().post(new EventRefreshGui(false)); + } + }); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor1h)) { + activeloop.suspendTo(new Date().getTime() + 1 * 60L * 60 * 1000); + sHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 60); + if (!result.success) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + } + MainApp.bus().post(new EventRefreshGui(false)); + } + }); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor2h)) { + activeloop.suspendTo(new Date().getTime() + 2 * 60L * 60 * 1000); + sHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 2 * 60); + if (!result.success) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + } + MainApp.bus().post(new EventRefreshGui(false)); + } + }); + return true; + } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor3h)) { + activeloop.suspendTo(new Date().getTime() + 3 * 60L * 60 * 1000); + sHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 3 * 60); + if (!result.success) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + } + MainApp.bus().post(new EventRefreshGui(false)); + } + }); + return true; + } + + return super.onContextItemSelected(item); + } + void processQuickWizard() { final BgReading actualBg = GlucoseStatus.actualBg(); if (MainApp.getConfigBuilder() == null || ConfigBuilderPlugin.getActiveProfile() == null) // app not initialized yet @@ -410,6 +540,7 @@ public class OverviewFragment extends Fragment { super.onPause(); MainApp.bus().unregister(this); sLoopHandler.removeCallbacksAndMessages(null); + unregisterForContextMenu(apsModeView); } @Override @@ -424,6 +555,7 @@ public class OverviewFragment extends Fragment { } }; sLoopHandler.postDelayed(sRefreshLoop, 60 * 1000L); + registerForContextMenu(apsModeView); updateGUIIfVisible(); } @@ -562,7 +694,11 @@ public class OverviewFragment extends Fragment { apsModeView.setBackgroundResource(R.drawable.loopmodeborder); apsModeView.setTextColor(Color.BLACK); final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); - if (pump.isSuspended()) { + if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuspended()) { + apsModeView.setBackgroundResource(R.drawable.loopmodesuspendedborder); + apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), activeloop.minutesToEndOfSuspend())); + apsModeView.setTextColor(Color.WHITE); + } else if (pump.isSuspended()) { apsModeView.setBackgroundResource(R.drawable.loopmodesuspendedborder); apsModeView.setText(MainApp.sResources.getString(R.string.pumpsuspended)); apsModeView.setTextColor(Color.WHITE); @@ -576,10 +712,8 @@ public class OverviewFragment extends Fragment { apsModeView.setBackgroundResource(R.drawable.loopmodedisabledborder); apsModeView.setText(MainApp.sResources.getString(R.string.disabledloop)); apsModeView.setTextColor(Color.WHITE); - } - - +/* apsModeView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { @@ -600,7 +734,7 @@ public class OverviewFragment extends Fragment { } }); apsModeView.setLongClickable(true); - +*/ } else { apsModeView.setVisibility(View.GONE); } diff --git a/app/src/main/java/info/nightscout/utils/SP.java b/app/src/main/java/info/nightscout/utils/SP.java index cce1df9474..9bed316195 100644 --- a/app/src/main/java/info/nightscout/utils/SP.java +++ b/app/src/main/java/info/nightscout/utils/SP.java @@ -61,7 +61,11 @@ public class SP { } static public long getLong(String key, Long defaultValue) { - return SafeParse.stringToLong(sharedPreferences.getString(key, defaultValue.toString())); + try { + return sharedPreferences.getLong(key, defaultValue); + } catch (Exception e) { + return SafeParse.stringToLong(sharedPreferences.getString(key, defaultValue.toString())); + } } static public void putBoolean(String key, boolean value) { @@ -82,9 +86,9 @@ public class SP { editor.apply(); } - static public void putString(String key, String value) { + static public void putLong(String key, long value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(key, value); + editor.putLong(key, value); editor.apply(); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 955c02017f..8c79783784 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -139,6 +139,7 @@ Closed Loop Open Loop Loop Disabled + Loop Enabled New suggestion available Unsupported version of NSClient @@ -557,4 +558,17 @@ Device does not appear to support battery optimization whitelisting! Please Allow Permission %s needs battery optimalization whitelisting for proper performance + Loop suspended + Suspended (%d m) + Loop menu + Suspend loop for 1h + Suspend loop for 2h + Suspend loop for 3h + Suspend loop for 10h + Disconnect pump for 30 min + Disconnect pump for 1 h + Disconnect pump for 2 h + Disconnect pump for 3 h + Disconnect pump for 10 h + Resume From a02da220c95eaca968bcbdbf84b98d478870299b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 5 Apr 2017 22:04:55 +0200 Subject: [PATCH 37/48] CS translations --- .../plugins/Overview/OverviewFragment.java | 8 ++++---- app/src/main/res/values-cs/strings.xml | 19 +++++++++++++++++++ app/src/main/res/values/strings.xml | 5 +++-- 3 files changed, 26 insertions(+), 6 deletions(-) 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 f449dc18d1..18ef2d633e 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 @@ -321,7 +321,7 @@ public class OverviewFragment extends Fragment { return; menu.setHeaderTitle(MainApp.sResources.getString(R.string.loop)); if (activeloop.isEnabled(PluginBase.LOOP)) { - menu.add(MainApp.sResources.getString(R.string.disabledloop)); + menu.add(MainApp.sResources.getString(R.string.disableloop)); if (!activeloop.isSuspended()) { menu.add(MainApp.sResources.getString(R.string.suspendloopfor1h)); menu.add(MainApp.sResources.getString(R.string.suspendloopfor2h)); @@ -336,19 +336,19 @@ public class OverviewFragment extends Fragment { } } if (!activeloop.isEnabled(PluginBase.LOOP)) - menu.add(MainApp.sResources.getString(R.string.enabledloop)); + menu.add(MainApp.sResources.getString(R.string.enableloop)); } @Override public boolean onContextItemSelected(MenuItem item) { final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); - if (item.getTitle() == MainApp.sResources.getString(R.string.disabledloop)) { + if (item.getTitle() == MainApp.sResources.getString(R.string.disableloop)) { activeloop.setFragmentEnabled(PluginBase.LOOP, false); activeloop.setFragmentVisible(PluginBase.LOOP, false); MainApp.getConfigBuilder().storeSettings(); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.enabledloop)) { + } else if (item.getTitle() == MainApp.sResources.getString(R.string.enableloop)) { activeloop.setFragmentEnabled(PluginBase.LOOP, true); activeloop.setFragmentVisible(PluginBase.LOOP, true); MainApp.getConfigBuilder().storeSettings(); diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3f71f70213..84c35f78e7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -507,4 +507,23 @@ Rozepsat IOB do bolusového a bazálního na hodinkách Zobrazit detailní IOB Nastavení hodinek + Glimp + Zařízení patrně nepodporuje vyloučení z optimalizace baterie. + Odpojit pumpu na 10 h + Odpojit pumpu na 1 h + Odpojit pumpu na 2 h + Odpojit pumpu na 30 min + Odpojit pumpu na 3 h + Povolit smyčku + Menu smyčky + Smyčka pozastavena + Pozastaveno (%d min) + %s potřebuje vypnout optimalizace baterie pro optimalní výkon + Prosím povolte oprávnění + Obnovit + Pozastavit smyčku na 10 h + Pozastavit smyčku na 1 h + Pozastavit smyčku na 2 h + Pozastavit smyčku na 3 h + Zakázat smyčku diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c79783784..2ac856be38 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -139,7 +139,8 @@ Closed Loop Open Loop Loop Disabled - Loop Enabled + Disable loop + Enable loop New suggestion available Unsupported version of NSClient @@ -564,7 +565,7 @@ Suspend loop for 1h Suspend loop for 2h Suspend loop for 3h - Suspend loop for 10h + Suspend loop for 10 h Disconnect pump for 30 min Disconnect pump for 1 h Disconnect pump for 2 h From c5245ae5fd17821c59944d907d5f7b13ce0c7658 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 6 Apr 2017 21:22:27 +0200 Subject: [PATCH 38/48] SMS suspend/resume loop --- .../plugins/Overview/OverviewFragment.java | 22 ------ .../SmsCommunicatorPlugin.java | 73 ++++++++++++++++--- app/src/main/res/values-cs/strings.xml | 5 ++ app/src/main/res/values/strings.xml | 5 ++ 4 files changed, 72 insertions(+), 33 deletions(-) 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 18ef2d633e..5efdee1d34 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 @@ -713,28 +713,6 @@ public class OverviewFragment extends Fragment { apsModeView.setText(MainApp.sResources.getString(R.string.disabledloop)); apsModeView.setTextColor(Color.WHITE); } -/* - apsModeView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); - if (activeloop == null) { - log.error("no active loop?"); - return true; - } else if (activeloop.isEnabled(PluginBase.LOOP)) { - activeloop.setFragmentEnabled(PluginBase.LOOP, false); - activeloop.setFragmentVisible(PluginBase.LOOP, false); - } else { - activeloop.setFragmentEnabled(PluginBase.LOOP, true); - activeloop.setFragmentVisible(PluginBase.LOOP, true); - } - MainApp.getConfigBuilder().storeSettings(); - MainApp.bus().post(new EventRefreshGui(false)); - return true; - } - }); - apsModeView.setLongClickable(true); -*/ } else { apsModeView.setVisibility(View.GONE); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java index af085d9c4a..fcaf379af2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java @@ -28,6 +28,7 @@ import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.DanaR.DanaRPlugin; @@ -68,6 +69,7 @@ public class SmsCommunicatorPlugin implements PluginBase { double bolusRequested = 0d; double tempBasal = 0d; double calibrationRequested = 0d; + int duration = 0; public Sms(SmsMessage message) { phoneNumber = message.getOriginatingAddress(); @@ -100,6 +102,7 @@ public class SmsCommunicatorPlugin implements PluginBase { Sms tempBasalWaitingForConfirmation = null; Sms bolusWaitingForConfirmation = null; Sms calibrationWaitingForConfirmation = null; + Sms suspendWaitingForConfirmation = null; Date lastRemoteBolusTime = new Date(0); ArrayList messages = new ArrayList<>(); @@ -212,7 +215,9 @@ public class SmsCommunicatorPlugin implements PluginBase { String[] splited = receivedSms.text.split("\\s+"); Double amount = 0d; Double tempBasal = 0d; + int duration = 0; String passCode = ""; + boolean remoteCommandsAllowed = SP.getBoolean(R.string.key_smscommunicator_remotecommandsallowed, false); if (splited.length > 0) { switch (splited[0].toUpperCase()) { @@ -250,6 +255,7 @@ public class SmsCommunicatorPlugin implements PluginBase { break; case "LOOP": switch (splited[1].toUpperCase()) { + case "DISABLE": case "STOP": LoopPlugin loopPlugin = (LoopPlugin) MainApp.getSpecificPlugin(LoopPlugin.class); if (loopPlugin != null && loopPlugin.isEnabled(PluginBase.LOOP)) { @@ -260,6 +266,7 @@ public class SmsCommunicatorPlugin implements PluginBase { receivedSms.processed = true; Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Stop")); break; + case "ENABLE": case "START": loopPlugin = (LoopPlugin) MainApp.getSpecificPlugin(LoopPlugin.class); if (loopPlugin != null && !loopPlugin.isEnabled(PluginBase.LOOP)) { @@ -274,7 +281,10 @@ public class SmsCommunicatorPlugin implements PluginBase { loopPlugin = (LoopPlugin) MainApp.getSpecificPlugin(LoopPlugin.class); if (loopPlugin != null) { if (loopPlugin.isEnabled(PluginBase.LOOP)) { - reply = MainApp.sResources.getString(R.string.smscommunicator_loopisenabled); + if (loopPlugin.isSuspended()) + reply = String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend()); + else + reply = MainApp.sResources.getString(R.string.smscommunicator_loopisenabled); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_loopisdisabled); } @@ -283,6 +293,35 @@ public class SmsCommunicatorPlugin implements PluginBase { receivedSms.processed = true; Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Status")); break; + case "RESUME": + final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + activeloop.suspendTo(0); + MainApp.bus().post(new EventRefreshGui(false)); + reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_loopresumed)); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); + Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume")); + break; + case "SUSPEND": + if (splited.length >= 3) + duration = SafeParse.stringToInt(splited[2]); + duration = Math.max(0, duration); + duration = Math.min(180, duration); + if (duration == 0) { + reply = MainApp.sResources.getString(R.string.smscommunicator_wrongduration); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } else if (remoteCommandsAllowed) { + passCode = generatePasscode(); + reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_suspendreplywithcode), duration, passCode); + receivedSms.processed = true; + resetWaitingMessages(); + sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); + suspendWaitingForConfirmation.duration = duration; + Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend")); + } else { + reply = MainApp.sResources.getString(R.string.smscommunicator_remotecommandnotallowed); + sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); + } + break; } break; case "TREATMENTS": @@ -328,7 +367,6 @@ public class SmsCommunicatorPlugin implements PluginBase { break; case "BASAL": if (splited.length > 1) { - boolean remoteCommandsAllowed = SP.getBoolean(R.string.key_smscommunicator_remotecommandsallowed, false); if (splited[1].toUpperCase().equals("CANCEL") || splited[1].toUpperCase().equals("STOP")) { if (remoteCommandsAllowed) { passCode = generatePasscode(); @@ -366,7 +404,6 @@ public class SmsCommunicatorPlugin implements PluginBase { } else if (splited.length > 1) { amount = SafeParse.stringToDouble(splited[1]); amount = MainApp.getConfigBuilder().applyBolusConstraints(amount); - boolean remoteCommandsAllowed = SP.getBoolean(R.string.key_smscommunicator_remotecommandsallowed, false); if (amount > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusreplywithcode), amount, passCode); @@ -384,7 +421,6 @@ public class SmsCommunicatorPlugin implements PluginBase { case "CAL": if (splited.length > 1) { amount = SafeParse.stringToDouble(splited[1]); - boolean remoteCommandsAllowed = SP.getBoolean(R.string.key_smscommunicator_remotecommandsallowed, false); if (amount > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_calibrationreplywithcode), amount, passCode); @@ -409,12 +445,14 @@ public class SmsCommunicatorPlugin implements PluginBase { PumpEnactResult result = pumpInterface.deliverTreatment(bolusWaitingForConfirmation.bolusRequested, 0, null); if (result.success) { reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); - if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus(true); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); lastRemoteBolusTime = new Date(); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_bolusfailed); - if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus(true); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -427,11 +465,13 @@ public class SmsCommunicatorPlugin implements PluginBase { PumpEnactResult result = pumpInterface.setTempBasalAbsolute(tempBasalWaitingForConfirmation.tempBasal, 30); if (result.success) { reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); - if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus(true); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalfailed); - if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus(true); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -444,11 +484,13 @@ public class SmsCommunicatorPlugin implements PluginBase { PumpEnactResult result = pumpInterface.cancelTempBasal(); if (result.success) { reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_tempbasalcanceled)); - if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus(true); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); - if (danaRPlugin != null) reply += "\n" + danaRPlugin.shortStatus(true); + if (danaRPlugin != null) + reply += "\n" + danaRPlugin.shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -463,6 +505,14 @@ public class SmsCommunicatorPlugin implements PluginBase { reply = MainApp.sResources.getString(R.string.smscommunicator_calibrationfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } + } else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed && + suspendWaitingForConfirmation.confirmCode.equals(splited[0]) && new Date().getTime() - suspendWaitingForConfirmation.date.getTime() < CONFIRM_TIMEOUT) { + suspendWaitingForConfirmation.processed = true; + final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + activeloop.suspendTo(new Date().getTime() + suspendWaitingForConfirmation.duration * 60L * 1000); + MainApp.bus().post(new EventRefreshGui(false)); + reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_loopsuspended)); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { sendSMS(new Sms(receivedSms.phoneNumber, MainApp.sResources.getString(R.string.smscommunicator_unknowncommand), new Date())); } @@ -482,7 +532,7 @@ public class SmsCommunicatorPlugin implements PluginBase { } public void sendSMSToAllNumbers(Sms sms) { - for (String number: allowedNumbers) { + for (String number : allowedNumbers) { sms.phoneNumber = number; sendSMS(sms); } @@ -517,6 +567,7 @@ public class SmsCommunicatorPlugin implements PluginBase { cancelTempBasalWaitingForConfirmation = null; bolusWaitingForConfirmation = null; calibrationWaitingForConfirmation = null; + suspendWaitingForConfirmation = null; } public static String stripAccents(String s) { diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 84c35f78e7..ed59f4f009 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -526,4 +526,9 @@ Pozastavit smyčku na 2 h Pozastavit smyčku na 3 h Zakázat smyčku + Smyčka obnovena + Smyčka pozastavena + Vzdálení příkaz není povolen + K pozastavení smyčky na %d minut odpověz SMS s kódem %s + Chybná doba trvání diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ac856be38..719d7dc51b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -329,7 +329,9 @@ %.2f limited to %.2f Value %s is out of hard limits Remote basal setting is not allowed + Remote command is not allowed To start basal %.2fU/h reply with code %s + To suspend loop for %d minutes reply with code %s Temp basal %.2fU/h for %d min started successfully Temp basal start failed To stop temp basal reply with code %s @@ -572,4 +574,7 @@ Disconnect pump for 3 h Disconnect pump for 10 h Resume + Wrong duration + Loop suspended + Loop resumed From 5fe22eac65d28c7d1b3be2fbf061989abbb3219f Mon Sep 17 00:00:00 2001 From: Radoslav Radev Date: Fri, 7 Apr 2017 13:53:47 +0300 Subject: [PATCH 39/48] Update strings.xml --- app/src/main/res/values-cs/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index ed59f4f009..be3f3bfae3 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -369,12 +369,12 @@ Pera Glykémie: Poslední glykémie: - před %d min + před %d min Bazál: Bolus: Rozdíl: IOB: - před %d min + před %d min Bolus %.2fU aplikován úspěšně Průběžné oznámení ZASTARALÉ @@ -517,7 +517,7 @@ Povolit smyčku Menu smyčky Smyčka pozastavena - Pozastaveno (%d min) + Pozastaveno (%d min) %s potřebuje vypnout optimalizace baterie pro optimalní výkon Prosím povolte oprávnění Obnovit @@ -529,6 +529,6 @@ Smyčka obnovena Smyčka pozastavena Vzdálení příkaz není povolen - K pozastavení smyčky na %d minut odpověz SMS s kódem %s + K pozastavení smyčky na %d minut odpověz SMS s kódem %s Chybná doba trvání From d41d5f9e6bd4ab14f28d0257258f698ce4045f8e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 8 Apr 2017 20:13:30 +0200 Subject: [PATCH 40/48] loop context menu fix --- .../plugins/Overview/OverviewFragment.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) 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 5efdee1d34..56cf041042 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 @@ -342,48 +342,48 @@ public class OverviewFragment extends Fragment { @Override public boolean onContextItemSelected(MenuItem item) { final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); - if (item.getTitle() == MainApp.sResources.getString(R.string.disableloop)) { + if (item.getTitle().equals(MainApp.sResources.getString(R.string.disableloop))) { activeloop.setFragmentEnabled(PluginBase.LOOP, false); activeloop.setFragmentVisible(PluginBase.LOOP, false); MainApp.getConfigBuilder().storeSettings(); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.enableloop)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.enableloop))) { activeloop.setFragmentEnabled(PluginBase.LOOP, true); activeloop.setFragmentVisible(PluginBase.LOOP, true); MainApp.getConfigBuilder().storeSettings(); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.resume)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.resume))) { activeloop.suspendTo(0L); sHandler.post(new Runnable() { @Override public void run() { + MainApp.bus().post(new EventRefreshGui(false)); PumpEnactResult result = MainApp.getConfigBuilder().cancelTempBasal(); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } - MainApp.bus().post(new EventRefreshGui(false)); } }); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor1h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor1h))) { activeloop.suspendTo(new Date().getTime() + 60L * 60 * 1000); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor2h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor2h))) { activeloop.suspendTo(new Date().getTime() + 2 * 60L * 60 * 1000); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor3h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor3h))) { activeloop.suspendTo(new Date().getTime() + 3 * 60L * 60 * 1000); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.suspendloopfor10h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor10h))) { activeloop.suspendTo(new Date().getTime() + 10 * 60L * 60 * 1000); MainApp.bus().post(new EventRefreshGui(false)); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor30m)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor30m))) { activeloop.suspendTo(new Date().getTime() + 30L * 60 * 1000); sHandler.post(new Runnable() { @Override @@ -396,42 +396,42 @@ public class OverviewFragment extends Fragment { } }); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor1h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor1h))) { activeloop.suspendTo(new Date().getTime() + 1 * 60L * 60 * 1000); sHandler.post(new Runnable() { @Override public void run() { + MainApp.bus().post(new EventRefreshGui(false)); PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 60); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } - MainApp.bus().post(new EventRefreshGui(false)); } }); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor2h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor2h))) { activeloop.suspendTo(new Date().getTime() + 2 * 60L * 60 * 1000); sHandler.post(new Runnable() { @Override public void run() { + MainApp.bus().post(new EventRefreshGui(false)); PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 2 * 60); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } - MainApp.bus().post(new EventRefreshGui(false)); } }); return true; - } else if (item.getTitle() == MainApp.sResources.getString(R.string.disconnectpumpfor3h)) { + } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor3h))) { activeloop.suspendTo(new Date().getTime() + 3 * 60L * 60 * 1000); sHandler.post(new Runnable() { @Override public void run() { + MainApp.bus().post(new EventRefreshGui(false)); PumpEnactResult result = MainApp.getConfigBuilder().setTempBasalAbsolute(0d, 3 * 60); if (!result.success) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); } - MainApp.bus().post(new EventRefreshGui(false)); } }); return true; From a203591d4438adeac4b23bf07fdd9da76ffeda92 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Apr 2017 11:47:20 +0200 Subject: [PATCH 41/48] ver 1.3 bump --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index b81a8e12d2..712c3c133d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ android { minSdkVersion 21 targetSdkVersion 23 versionCode 1100 - version "1.3rc2" + version "1.3" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() } From 387defbfc7a203703edfb4e896be8055c5965d87 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Apr 2017 21:50:05 +0200 Subject: [PATCH 42/48] fix sms pref key --- app/src/main/res/xml/pref_smscommunicator.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/xml/pref_smscommunicator.xml b/app/src/main/res/xml/pref_smscommunicator.xml index 0f9440a615..06614f81df 100644 --- a/app/src/main/res/xml/pref_smscommunicator.xml +++ b/app/src/main/res/xml/pref_smscommunicator.xml @@ -7,7 +7,7 @@ Date: Sun, 9 Apr 2017 21:50:53 +0200 Subject: [PATCH 43/48] ver 1.31 bump --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 712c3c133d..478567d87d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ android { minSdkVersion 21 targetSdkVersion 23 versionCode 1100 - version "1.3" + version "1.31" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() } From 2413fae0a9ec158aa2a673074629088609c54bed Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 14 Apr 2017 14:50:18 +0200 Subject: [PATCH 44/48] 1.32 superbolus & trend contribution in wizard --- app/build.gradle | 6 +- .../androidaps/plugins/Loop/LoopPlugin.java | 23 ++ .../Overview/Dialogs/WizardDialog.java | 376 ++++++++++++------ .../plugins/Overview/OverviewFragment.java | 11 +- .../plugins/Wear/ActionStringHandler.java | 2 +- .../info/nightscout/utils/BolusWizard.java | 29 +- .../res/layout/overview_wizard_dialog.xml | 177 +++++++-- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values/strings.xml | 6 +- build.gradle | 2 +- 10 files changed, 479 insertions(+), 155 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 478567d87d..c4ade1bbe8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,7 +44,7 @@ android { minSdkVersion 21 targetSdkVersion 23 versionCode 1100 - version "1.31" + version "1.32" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() } @@ -180,4 +180,8 @@ dependencies { compile 'com.google.code.gson:gson:2.4' compile 'com.google.guava:guava:18.0' + compile ('com.jakewharton:butterknife:8.5.1') { + exclude module: 'support-compat' + } + annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1' } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index ec3fdc32a0..6a3869589b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -47,6 +47,7 @@ public class LoopPlugin implements PluginBase { private boolean fragmentVisible = true; private long loopSuspendedTill = 0L; // end of manual loop suspend + private boolean isSuperBolus = false; public class LastRun { public APSResult request = null; @@ -68,6 +69,7 @@ public class LoopPlugin implements PluginBase { } MainApp.bus().register(this); loopSuspendedTill = SP.getLong("loopSuspendedTill", 0L); + isSuperBolus = SP.getBoolean("isSuperBolus", false); } @Override @@ -137,6 +139,13 @@ public class LoopPlugin implements PluginBase { public void suspendTo(long endTime) { loopSuspendedTill = endTime; + isSuperBolus = false; + SP.putLong("loopSuspendedTill", loopSuspendedTill); + } + + public void superBolusTo(long endTime) { + loopSuspendedTill = endTime; + isSuperBolus = true; SP.putLong("loopSuspendedTill", loopSuspendedTill); } @@ -169,6 +178,20 @@ public class LoopPlugin implements PluginBase { return true; } + public boolean isSuperBolus() { + if (loopSuspendedTill == 0) + return false; + + long now = new Date().getTime(); + + if (loopSuspendedTill <= now) { // time exceeded + suspendTo(0L); + return false; + } + + return isSuperBolus; + } + public void invoke(String initiator, boolean allowNotification) { try { if (Config.logFunctionCalls) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index 173e73facb..eaebeec73e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -1,5 +1,6 @@ package info.nightscout.androidaps.plugins.Overview.Dialogs; +import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; @@ -21,32 +22,49 @@ import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import com.crashlytics.android.answers.Answers; import com.crashlytics.android.answers.CustomEvent; +import com.squareup.otto.Subscribe; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.w3c.dom.Text; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnCheckedChanged; +import butterknife.OnClick; +import butterknife.OnItemSelected; +import butterknife.OnTextChanged; +import butterknife.Unbinder; 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.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.events.EventNewBG; +import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.data.IobTotal; +import info.nightscout.androidaps.plugins.Loop.APSResult; +import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; +import info.nightscout.androidaps.plugins.OpenAPSAMA.DetermineBasalResultAMA; +import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; +import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui; import info.nightscout.utils.BolusWizard; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; @@ -54,33 +72,81 @@ import info.nightscout.utils.PlusMinusEditText; import info.nightscout.utils.SafeParse; import info.nightscout.utils.ToastUtils; -public class WizardDialog extends DialogFragment implements OnClickListener { +import static butterknife.OnItemSelected.Callback.NOTHING_SELECTED; + +public class WizardDialog extends DialogFragment { private static Logger log = LoggerFactory.getLogger(WizardDialog.class); + @BindView(R.id.treatments_wizard_deliverButton) Button wizardDialogDeliverButton; + @BindView(R.id.treatments_wizard_correctioninput) TextView correctionInput; + @BindView(R.id.treatments_wizard_carbsinput) TextView carbsInput; + @BindView(R.id.treatments_wizard_bginput) TextView bgInput; - TextView bg, bgInsulin, bgUnits; + @BindView(R.id.treatments_wizard_bg) + TextView bg; + @BindView(R.id.treatments_wizard_bginsulin) + TextView bgInsulin; + @BindView(R.id.treatments_wizard_bgunits) + TextView bgUnits; + @BindView(R.id.treatments_wizard_bgcheckbox) CheckBox bgCheckbox; - TextView carbs, carbsInsulin; + @BindView(R.id.treatments_wizard_carbs) + TextView carbs; + @BindView(R.id.treatments_wizard_carbsinsulin) + TextView carbsInsulin; + @BindView(R.id.treatments_wizard_bolusiobinsulin) TextView bolusIobInsulin; + @BindView(R.id.treatments_wizard_basaliobinsulin) TextView basalIobInsulin; + @BindView(R.id.treatments_wizard_bolusiobcheckbox) CheckBox bolusIobCheckbox; + @BindView(R.id.treatments_wizard_basaliobcheckbox) CheckBox basalIobCheckbox; + @BindView(R.id.treatments_wizard_correctioninsulin) TextView correctionInsulin; - TextView total, totalInsulin; + @BindView(R.id.treatments_wizard_total) + TextView total; + @BindView(R.id.treatments_wizard_totalinsulin) + TextView totalInsulin; + @BindView(R.id.treatments_wizard_carbtimeinput) EditText carbTimeEdit; + @BindView(R.id.treatments_wizard_profile) Spinner profileSpinner; + @BindView(R.id.treatments_wizard_sbcheckbox) + CheckBox superbolusCheckbox; + @BindView(R.id.treatments_wizard_sb) + TextView superbolus; + @BindView(R.id.treatments_wizard_sbinsulin) + TextView superbolusInsulin; + @BindView(R.id.treatments_wizard_bgtrendcheckbox) + CheckBox bgtrendCheckbox; + @BindView(R.id.treatments_wizard_bgtrend) + TextView bgTrend; + @BindView(R.id.treatments_wizard_bgtrendinsulin) + TextView bgTrendInsulin; + @BindView(R.id.treatments_wizard_cob_layout) + LinearLayout cobLayout; + @BindView(R.id.treatments_wizard_cobcheckbox) + CheckBox cobCheckbox; + @BindView(R.id.treatments_wizard_cob) + TextView cob; + @BindView(R.id.treatments_wizard_cobinsulin) + TextView cobInsulin; PlusMinusEditText editBg; PlusMinusEditText editCarbs; PlusMinusEditText editCorr; PlusMinusEditText editCarbTime; + private Unbinder unbinder; + Integer calculatedCarbs = 0; Double calculatedTotalInsulin = 0d; JSONObject boluscalcJSON; + boolean cobAvailable = false; Handler mHandler; public static HandlerThread mHandlerThread; @@ -100,6 +166,57 @@ public class WizardDialog extends DialogFragment implements OnClickListener { this.context = context; } + @Override + public void onDestroyView() { + super.onDestroyView(); + unbinder.unbind(); + } + + @Override + public void onResume() { + super.onResume(); + if (getDialog() != null) + getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + MainApp.bus().register(this); + } + + @Override + public void onPause() { + super.onPause(); + MainApp.bus().unregister(this); + } + + @Subscribe + public void onStatusEvent(final EventOpenAPSUpdateGui e) { + Activity activity = getActivity(); + if (activity != null) + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + if (ConfigBuilderPlugin.getActiveAPS() instanceof OpenAPSAMAPlugin && ConfigBuilderPlugin.getActiveAPS().getLastAPSResult() != null && ConfigBuilderPlugin.getActiveAPS().getLastAPSRun().after(new Date(new Date().getTime() - 11 * 60 * 1000L))) { + cobLayout.setVisibility(View.VISIBLE); + cobAvailable = true; + } else { + cobLayout.setVisibility(View.GONE); + cobAvailable = false; + } + calculateInsulin(); + } + }); + } + + @Subscribe + public void onStatusEvent(final EventNewBG e) { + Activity activity = getActivity(); + if (activity != null) + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + calculateInsulin(); + } + }); + } + final private TextWatcher textWatcher = new TextWatcher() { @Override public void afterTextChanged(Editable s) { @@ -115,67 +232,20 @@ public class WizardDialog extends DialogFragment implements OnClickListener { } }; - final CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - calculateInsulin(); - } - }; - - final AdapterView.OnItemSelectedListener onItemSelectedListener = new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - calculateInsulin(); - wizardDialogDeliverButton.setVisibility(View.VISIBLE); - } - - @Override - public void onNothingSelected(AdapterView parent) { - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.noprofileselected)); - wizardDialogDeliverButton.setVisibility(View.GONE); - } - }; - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.overview_wizard_dialog, null, false); - wizardDialogDeliverButton = (Button) view.findViewById(R.id.treatments_wizard_deliverButton); - wizardDialogDeliverButton.setOnClickListener(this); - getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); - correctionInput = (TextView) view.findViewById(R.id.treatments_wizard_correctioninput); - carbsInput = (TextView) view.findViewById(R.id.treatments_wizard_carbsinput); - bgInput = (TextView) view.findViewById(R.id.treatments_wizard_bginput); + unbinder = ButterKnife.bind(this, view); correctionInput.addTextChangedListener(textWatcher); carbsInput.addTextChangedListener(textWatcher); bgInput.addTextChangedListener(textWatcher); - bg = (TextView) view.findViewById(R.id.treatments_wizard_bg); - bgInsulin = (TextView) view.findViewById(R.id.treatments_wizard_bginsulin); - bgUnits = (TextView) view.findViewById(R.id.treatments_wizard_bgunits); - bgCheckbox = (CheckBox) view.findViewById(R.id.treatments_wizard_bgcheckbox); - carbs = (TextView) view.findViewById(R.id.treatments_wizard_carbs); - carbsInsulin = (TextView) view.findViewById(R.id.treatments_wizard_carbsinsulin); - bolusIobInsulin = (TextView) view.findViewById(R.id.treatments_wizard_bolusiobinsulin); - basalIobInsulin = (TextView) view.findViewById(R.id.treatments_wizard_basaliobinsulin); - bolusIobCheckbox = (CheckBox) view.findViewById(R.id.treatments_wizard_bolusiobcheckbox); - basalIobCheckbox = (CheckBox) view.findViewById(R.id.treatments_wizard_basaliobcheckbox); - correctionInsulin = (TextView) view.findViewById(R.id.treatments_wizard_correctioninsulin); - total = (TextView) view.findViewById(R.id.treatments_wizard_total); - totalInsulin = (TextView) view.findViewById(R.id.treatments_wizard_totalinsulin); - carbTimeEdit = (EditText) view.findViewById(R.id.treatments_wizard_carbtimeinput); - profileSpinner = (Spinner) view.findViewById(R.id.treatments_wizard_profile); - - bgCheckbox.setOnCheckedChangeListener(onCheckedChangeListener); - basalIobCheckbox.setOnCheckedChangeListener(onCheckedChangeListener); - bolusIobCheckbox.setOnCheckedChangeListener(onCheckedChangeListener); - profileSpinner.setOnItemSelectedListener(onItemSelectedListener); - Integer maxCarbs = MainApp.getConfigBuilder().applyCarbsConstraints(Constants.carbsOnlyForCheckLimit); Double maxCorrection = MainApp.getConfigBuilder().applyBolusConstraints(Constants.bolusOnlyForCheckLimit); @@ -188,71 +258,102 @@ public class WizardDialog extends DialogFragment implements OnClickListener { return view; } - @Override + @OnCheckedChanged({R.id.treatments_wizard_bgcheckbox, R.id.treatments_wizard_bolusiobcheckbox, R.id.treatments_wizard_basaliobcheckbox, R.id.treatments_wizard_sbcheckbox, R.id.treatments_wizard_cobcheckbox, R.id.treatments_wizard_bgtrendcheckbox}) + public void checkboxToggled(boolean isChecked) { + calculateInsulin(); + } + + @OnItemSelected(R.id.treatments_wizard_profile) + public void profileSelected(int position) { + calculateInsulin(); + wizardDialogDeliverButton.setVisibility(View.VISIBLE); + } + + @OnItemSelected(value = R.id.treatments_wizard_profile, + callback = NOTHING_SELECTED) + public void profileNotSelected() { + ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.noprofileselected)); + wizardDialogDeliverButton.setVisibility(View.GONE); + } + + @OnClick(R.id.treatments_wizard_deliverButton) public void onClick(View view) { - switch (view.getId()) { - case R.id.treatments_wizard_deliverButton: - if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d) { - DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00"); - String confirmMessage = getString(R.string.entertreatmentquestion); + if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d) { + DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00"); + String confirmMessage = getString(R.string.entertreatmentquestion); - Double insulinAfterConstraints = MainApp.getConfigBuilder().applyBolusConstraints(calculatedTotalInsulin); - Integer carbsAfterConstraints = MainApp.getConfigBuilder().applyCarbsConstraints(calculatedCarbs); + Double insulinAfterConstraints = MainApp.getConfigBuilder().applyBolusConstraints(calculatedTotalInsulin); + Integer carbsAfterConstraints = MainApp.getConfigBuilder().applyCarbsConstraints(calculatedCarbs); - confirmMessage += "\n" + getString(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; - confirmMessage += "\n" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + confirmMessage += "\n" + getString(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; + confirmMessage += "\n" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; - if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - return; - } + if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); + builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.show(); + return; + } - final Double finalInsulinAfterConstraints = insulinAfterConstraints; - final Integer finalCarbsAfterConstraints = carbsAfterConstraints; + final Double finalInsulinAfterConstraints = insulinAfterConstraints; + final Integer finalCarbsAfterConstraints = carbsAfterConstraints; + final Double bg = SafeParse.stringToDouble(bgInput.getText().toString()); + final int carbTime = SafeParse.stringToInt(carbTimeEdit.getText().toString()); + final boolean useSuperBolus = superbolusCheckbox.isChecked(); - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { - final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); - mHandler.post(new Runnable() { - @Override - public void run() { - PumpEnactResult result = pump.deliverTreatmentFromBolusWizard( - context, - finalInsulinAfterConstraints, - finalCarbsAfterConstraints, - SafeParse.stringToDouble(bgInput.getText().toString()), - "Manual", - SafeParse.stringToInt(carbTimeEdit.getText().toString()), - boluscalcJSON - ); - if (!result.success) { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(result.comment); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); - builder.show(); - } + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setMessage(confirmMessage); + builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { + final ConfigBuilderPlugin pump = MainApp.getConfigBuilder(); + mHandler.post(new Runnable() { + @Override + public void run() { + PumpEnactResult result = pump.deliverTreatmentFromBolusWizard( + context, + finalInsulinAfterConstraints, + finalCarbsAfterConstraints, + bg, + "Manual", + carbTime, + boluscalcJSON + ); + if (!result.success) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + builder.setMessage(result.comment); + builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.show(); + } + if (useSuperBolus) { + final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + result = pump.setTempBasalAbsolute(0d, 120); + if (!result.success) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + builder.setMessage(result.comment); + builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.show(); } - }); - Answers.getInstance().logCustom(new CustomEvent("Wizard")); + if (activeloop != null) { + activeloop.superBolusTo(new Date().getTime() + 2 * 60L * 60 * 1000); + MainApp.bus().post(new EventRefreshGui(false)); + } + } } - } - }); - builder.setNegativeButton(getString(R.string.cancel), null); - builder.show(); - dismiss(); + }); + Answers.getInstance().logCustom(new CustomEvent("Wizard")); + } } - break; + }); + builder.setNegativeButton(getString(R.string.cancel), null); + builder.show(); + dismiss(); } - } private void initDialog() { @@ -327,13 +428,14 @@ public class WizardDialog extends DialogFragment implements OnClickListener { totalInsulin.setText(""); wizardDialogDeliverButton.setVisibility(Button.INVISIBLE); - } - - @Override - public void onResume() { - super.onResume(); - if (getDialog() != null) - getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + // COB only if AMA is selected + if (ConfigBuilderPlugin.getActiveAPS() instanceof OpenAPSAMAPlugin && ConfigBuilderPlugin.getActiveAPS().getLastAPSResult() != null && ConfigBuilderPlugin.getActiveAPS().getLastAPSRun().after(new Date(new Date().getTime() - 11 * 60 * 1000L))) { + cobLayout.setVisibility(View.VISIBLE); + cobAvailable = true; + } else { + cobLayout.setVisibility(View.GONE); + cobAvailable = false; + } } private void calculateInsulin() { @@ -368,8 +470,19 @@ public class WizardDialog extends DialogFragment implements OnClickListener { c_bg = bgCheckbox.isChecked() ? c_bg : 0d; + // COB + Double c_cob = 0d; + if (cobAvailable && cobCheckbox.isChecked()) { + if (ConfigBuilderPlugin.getActiveAPS().getLastAPSResult() != null && ConfigBuilderPlugin.getActiveAPS().getLastAPSRun().after(new Date(new Date().getTime() - 11 * 60 * 1000L))) { + try { + c_cob = SafeParse.stringToDouble(ConfigBuilderPlugin.getActiveAPS().getLastAPSResult().json().getString("COB")); + } catch (JSONException e) { + } + } + } + BolusWizard wizard = new BolusWizard(); - wizard.doCalc(specificProfile, carbsAfterConstraint, c_bg, corrAfterConstraint, bolusIobCheckbox.isChecked(), basalIobCheckbox.isChecked()); + wizard.doCalc(specificProfile, carbsAfterConstraint, c_cob, c_bg, corrAfterConstraint, bolusIobCheckbox.isChecked(), basalIobCheckbox.isChecked(), superbolusCheckbox.isChecked(), bgtrendCheckbox.isChecked()); bg.setText(c_bg + " ISF: " + DecimalFormatter.to1Decimal(wizard.sens)); bgInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromBG) + "U"); @@ -393,6 +506,35 @@ public class WizardDialog extends DialogFragment implements OnClickListener { calculatedCarbs = carbsAfterConstraint; + // Superbolus + if (superbolusCheckbox.isChecked()) { + superbolus.setText("2h"); + } else { + superbolus.setText(""); + } + superbolusInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromSuperBolus) + "U"); + + // Trend + if (bgtrendCheckbox.isChecked()) { + if (wizard.glucoseStatus != null) { + bgTrend.setText((wizard.glucoseStatus.avgdelta > 0 ? "+" : "") + NSProfile.toUnitsString(wizard.glucoseStatus.avgdelta * 3, wizard.glucoseStatus.avgdelta * 3 / 18, profile.getUnits()) + " " + profile.getUnits()); + } else { + bgTrend.setText(""); + } + } else { + bgTrend.setText(""); + } + bgTrendInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromTrend) + "U"); + + // COB + if (cobAvailable && cobCheckbox.isChecked()) { + cob.setText(DecimalFormatter.to2Decimal(c_cob) + "g IC: " + DecimalFormatter.to1Decimal(wizard.ic)); + cobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCOB) + "U"); + } else { + cob.setText(""); + cobInsulin.setText(""); + } + if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d) { String insulinText = calculatedTotalInsulin > 0d ? (DecimalFormatter.to2Decimal(calculatedTotalInsulin) + "U") : ""; String carbsText = calculatedCarbs > 0d ? (DecimalFormatter.to0Decimal(calculatedCarbs) + "g") : ""; @@ -419,7 +561,11 @@ public class WizardDialog extends DialogFragment implements OnClickListener { boluscalcJSON.put("bgdiff", wizard.bgDiff); boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs); boluscalcJSON.put("carbs", c_carbs); + boluscalcJSON.put("cob", c_cob); + boluscalcJSON.put("insulincob", wizard.insulinFromCOB); boluscalcJSON.put("othercorrection", corrAfterConstraint); + boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus); + boluscalcJSON.put("insulintrend", wizard.insulinFromTrend); boluscalcJSON.put("insulin", calculatedTotalInsulin); } catch (JSONException e) { e.printStackTrace(); 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 56cf041042..5571aa99d4 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 @@ -451,7 +451,7 @@ public class OverviewFragment extends Fragment { quickWizardButton.setVisibility(View.VISIBLE); String text = MainApp.sResources.getString(R.string.bolus) + ": " + quickWizardEntry.buttonText(); BolusWizard wizard = new BolusWizard(); - wizard.doCalc(profile.getDefaultProfile(), quickWizardEntry.carbs(), actualBg.valueToUnits(profile.getUnits()), 0d, true, true); + wizard.doCalc(profile.getDefaultProfile(), quickWizardEntry.carbs(), 0d, actualBg.valueToUnits(profile.getUnits()), 0d, true, true, false, true); final JSONObject boluscalcJSON = new JSONObject(); try { @@ -470,6 +470,7 @@ public class OverviewFragment extends Fragment { boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs); boluscalcJSON.put("carbs", quickWizardEntry.carbs()); boluscalcJSON.put("othercorrection", 0d); + boluscalcJSON.put("insulintrend", wizard.insulinFromTrend); boluscalcJSON.put("insulin", wizard.calculatedTotalInsulin); } catch (JSONException e) { e.printStackTrace(); @@ -694,7 +695,11 @@ public class OverviewFragment extends Fragment { apsModeView.setBackgroundResource(R.drawable.loopmodeborder); apsModeView.setTextColor(Color.BLACK); final LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); - if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuspended()) { + if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuperBolus()) { + apsModeView.setBackgroundResource(R.drawable.loopmodesuspendedborder); + apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuperbolusfor), activeloop.minutesToEndOfSuspend())); + apsModeView.setTextColor(Color.WHITE); + } else if (activeloop != null && activeloop.isEnabled(activeloop.getType()) && activeloop.isSuspended()) { apsModeView.setBackgroundResource(R.drawable.loopmodesuspendedborder); apsModeView.setText(String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), activeloop.minutesToEndOfSuspend())); apsModeView.setTextColor(Color.WHITE); @@ -820,7 +825,7 @@ public class OverviewFragment extends Fragment { quickWizardButton.setVisibility(View.VISIBLE); String text = MainApp.sResources.getString(R.string.bolus) + ": " + quickWizardEntry.buttonText() + " " + DecimalFormatter.to0Decimal(quickWizardEntry.carbs()) + "g"; BolusWizard wizard = new BolusWizard(); - wizard.doCalc(profile.getDefaultProfile(), quickWizardEntry.carbs(), lastBG.valueToUnits(profile.getUnits()), 0d, true, true); + wizard.doCalc(profile.getDefaultProfile(), quickWizardEntry.carbs(), 0d, lastBG.valueToUnits(profile.getUnits()), 0d, true, true, false, true); text += " " + DecimalFormatter.to2Decimal(wizard.calculatedTotalInsulin) + "U"; quickWizardButton.setText(text); if (wizard.calculatedTotalInsulin <= 0) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 6afb51c5c6..ba93968e78 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -192,7 +192,7 @@ public class ActionStringHandler { } DecimalFormat format = new DecimalFormat("0.00"); BolusWizard bolusWizard = new BolusWizard(); - bolusWizard.doCalc(profile.getDefaultProfile(), carbsAfterConstraints, useBG?bgReading.valueToUnits(profile.getUnits()):0d, 0d, useBolusIOB, useBasalIOB); + bolusWizard.doCalc(profile.getDefaultProfile(), carbsAfterConstraints, 0d, useBG?bgReading.valueToUnits(profile.getUnits()):0d, 0d, useBolusIOB, useBasalIOB, false, false); Double insulinAfterConstraints = MainApp.getConfigBuilder().applyBolusConstraints(bolusWizard.calculatedTotalInsulin); if(insulinAfterConstraints - bolusWizard.calculatedTotalInsulin !=0){ diff --git a/app/src/main/java/info/nightscout/utils/BolusWizard.java b/app/src/main/java/info/nightscout/utils/BolusWizard.java index 308da980e8..848263ebc5 100644 --- a/app/src/main/java/info/nightscout/utils/BolusWizard.java +++ b/app/src/main/java/info/nightscout/utils/BolusWizard.java @@ -5,6 +5,7 @@ import org.json.JSONObject; import java.util.Date; import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.data.IobTotal; @@ -23,11 +24,15 @@ public class BolusWizard { Double correction; Boolean includeBolusIOB = true; Boolean includeBasalIOB = true; + Boolean superBolus = false; + Boolean trend = false; // Intermediate public Double sens = 0d; public Double ic = 0d; + public GlucoseStatus glucoseStatus; + public Double targetBGLow = 0d; public Double targetBGHigh = 0d; public Double bgDiff = 0d; @@ -40,16 +45,21 @@ public class BolusWizard { public Double insulingFromBolusIOB = 0d; public Double insulingFromBasalsIOB = 0d; public Double insulinFromCorrection = 0d; + public Double insulinFromSuperBolus = 0d; + public Double insulinFromCOB = 0d; + public Double insulinFromTrend = 0d; // Result public Double calculatedTotalInsulin = 0d; public Double carbsEquivalent = 0d; - public Double doCalc(JSONObject specificProfile, Integer carbs, Double bg, Double correction, Boolean includeBolusIOB, Boolean includeBasalIOB) { + public Double doCalc(JSONObject specificProfile, Integer carbs, Double cob, Double bg, Double correction, Boolean includeBolusIOB, Boolean includeBasalIOB, Boolean superBolus, Boolean trend) { this.specificProfile = specificProfile; this.carbs = carbs; this.bg = bg; this.correction = correction; + this.superBolus = superBolus; + this.trend = trend; NSProfile profile = ConfigBuilderPlugin.getActiveProfile().getProfile(); @@ -64,9 +74,16 @@ public class BolusWizard { } insulinFromBG = bg != 0d ? bgDiff / sens : 0d; + // Insulin from 15 min trend + glucoseStatus = GlucoseStatus.getGlucoseStatusData(); + if (glucoseStatus != null) { + insulinFromTrend = (NSProfile.fromMgdlToUnits(glucoseStatus.short_avgdelta, profile.getUnits()) * 3) / sens; + } + // Insuling from carbs ic = profile.getIc(specificProfile, NSProfile.secondsFromMidnight()); insulinFromCarbs = carbs / ic; + insulinFromCOB = -cob / ic; // Insulin from IOB // IOB calculation @@ -86,8 +103,16 @@ public class BolusWizard { // Insulin from correction insulinFromCorrection = correction; + // Insulin from superbolus for 2h. Get basal rate now and after 1h + if (superBolus) { + insulinFromSuperBolus = profile.getBasal(NSProfile.secondsFromMidnight()); + long timeAfter1h = new Date().getTime(); + timeAfter1h += 60L * 60 * 1000; + insulinFromSuperBolus += profile.getBasal(NSProfile.secondsFromMidnight(new Date(timeAfter1h))); + } + // Total - calculatedTotalInsulin = insulinFromBG + insulinFromCarbs + insulingFromBolusIOB + insulingFromBasalsIOB + insulinFromCorrection; + calculatedTotalInsulin = insulinFromBG + insulinFromTrend + insulinFromCarbs + insulingFromBolusIOB + insulingFromBasalsIOB + insulinFromCorrection + insulinFromSuperBolus + insulinFromCOB; if (calculatedTotalInsulin < 0) { carbsEquivalent = -calculatedTotalInsulin * ic; diff --git a/app/src/main/res/layout/overview_wizard_dialog.xml b/app/src/main/res/layout/overview_wizard_dialog.xml index 00b0df9e2a..caeee2b270 100644 --- a/app/src/main/res/layout/overview_wizard_dialog.xml +++ b/app/src/main/res/layout/overview_wizard_dialog.xml @@ -253,7 +253,7 @@ @@ -269,9 +269,42 @@ + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_weight="0.5" /> + + + + + + +