From 9a1d7b2c9fd0c98b54becbea6bd256da4c5e65cd Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 17 Mar 2018 18:46:11 +0100 Subject: [PATCH 1/9] remove duplicated code --- .../androidaps/plugins/Overview/OverviewFragment.java | 8 +------- 1 file changed, 1 insertion(+), 7 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 3dd6b04f40..99caa034b8 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 @@ -966,7 +966,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (timeView != null) { //must not exists timeView.setText(DateUtil.timeString(new Date())); } - if (!MainApp.getConfigBuilder().isProfileValid("Overview")) {// app not initialized yet + if (!MainApp.getConfigBuilder().isProfileValid("Overview")) { pumpStatusView.setText(R.string.noprofileset); pumpStatusLayout.setVisibility(View.VISIBLE); loopStatusLayout.setVisibility(View.GONE); @@ -983,12 +983,6 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); final Profile profile = MainApp.getConfigBuilder().getProfile(); - if (profile == null) { - pumpStatusView.setText(R.string.noprofileset); - pumpStatusLayout.setVisibility(View.VISIBLE); - loopStatusLayout.setVisibility(View.GONE); - return; - } final String units = profile.getUnits(); final double lowLine = OverviewPlugin.getPlugin().determineLowLine(units); From 4f43feb12eb0e9f7ea28f92b362fdaf0bb5df8ba Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 17 Mar 2018 23:18:34 +0100 Subject: [PATCH 2/9] allow profile to be null --- .../androidaps/Services/DataService.java | 2 +- .../nightscout/androidaps/data/Profile.java | 54 +++---------- .../androidaps/data/ProfileIntervals.java | 10 +++ .../androidaps/db/DatabaseHelper.java | 2 +- .../Careportal/CareportalFragment.java | 2 +- .../Dialogs/NewNSTreatmentDialog.java | 36 +++++---- .../ConfigBuilder/ConfigBuilderPlugin.java | 75 +++++------------- .../Overview/Dialogs/WizardDialog.java | 4 +- .../plugins/Overview/OverviewFragment.java | 10 ++- .../Overview/notifications/Notification.java | 5 +- .../plugins/ProfileNS/NSProfileFragment.java | 79 +++++++++++-------- .../SourceDexcomG5/BGSourceFragment.java | 2 +- .../fragments/ProfileViewerDialog.java | 76 +++++++++++------- .../main/res/layout/nsprofile_fragment.xml | 3 +- .../res/layout/profileviewer_fragment.xml | 27 +++++-- app/src/main/res/values-bg/strings.xml | 6 -- app/src/main/res/values-cs/strings.xml | 6 -- app/src/main/res/values-de/strings.xml | 6 -- app/src/main/res/values-el/strings.xml | 6 -- app/src/main/res/values-es/strings.xml | 6 -- app/src/main/res/values-fr/strings.xml | 6 -- app/src/main/res/values-ko/strings.xml | 6 -- app/src/main/res/values-nl/strings.xml | 6 -- app/src/main/res/values-ru/strings.xml | 6 -- app/src/main/res/values-sv/strings.xml | 5 -- app/src/main/res/values/strings.xml | 7 -- app/src/main/res/xml/pref_advanced.xml | 7 -- 27 files changed, 190 insertions(+), 270 deletions(-) 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 14465ccdc9..e771dc3fa5 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java @@ -96,7 +96,7 @@ public class DataService extends IntentService { dexcomG5Enabled = true; } - boolean isNSProfile = ConfigBuilderPlugin.getActiveProfileInterface().getClass().equals(NSProfilePlugin.class); + boolean isNSProfile = MainApp.getConfigBuilder().getActiveProfileInterface().getClass().equals(NSProfilePlugin.class); boolean acceptNSData = !SP.getBoolean(R.string.key_ns_upload_only, false); Bundle bundles = intent.getExtras(); diff --git a/app/src/main/java/info/nightscout/androidaps/data/Profile.java b/app/src/main/java/info/nightscout/androidaps/data/Profile.java index 5c6d4c9629..be06258d76 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/Profile.java +++ b/app/src/main/java/info/nightscout/androidaps/data/Profile.java @@ -78,53 +78,12 @@ public class Profile { if (json.has("timezone")) timeZone = TimeZone.getTimeZone(json.getString("timezone")); isf = json.getJSONArray("sens"); - if (getIsf(0) == null) { - int defaultISF = units.equals(Constants.MGDL) ? 400 : 20; - isf = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultISF + "\",\"timeAsSeconds\":\"0\"}]"); - Notification noisf = new Notification(Notification.ISF_MISSING, MainApp.sResources.getString(R.string.isfmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(noisf)); - } else { - MainApp.bus().post(new EventDismissNotification(Notification.ISF_MISSING)); - } ic = json.getJSONArray("carbratio"); - if (getIc(0) == null) { - int defaultIC = 25; - ic = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultIC + "\",\"timeAsSeconds\":\"0\"}]"); - Notification noic = new Notification(Notification.IC_MISSING, MainApp.sResources.getString(R.string.icmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(noic)); - } else { - MainApp.bus().post(new EventDismissNotification(Notification.IC_MISSING)); - } basal = json.getJSONArray("basal"); - if (getBasal(0) == null) { - double defaultBasal = 0.1d; - basal = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultBasal + "\",\"timeAsSeconds\":\"0\"}]"); - Notification nobasal = new Notification(Notification.BASAL_MISSING, MainApp.sResources.getString(R.string.basalmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(nobasal)); - } else { - MainApp.bus().post(new EventDismissNotification(Notification.BASAL_MISSING)); - } targetLow = json.getJSONArray("target_low"); - if (getTargetLow(0) == null) { - double defaultLow = units.equals(Constants.MGDL) ? 120 : 6; - targetLow = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultLow + "\",\"timeAsSeconds\":\"0\"}]"); - Notification notarget = new Notification(Notification.TARGET_MISSING, MainApp.sResources.getString(R.string.targetmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notarget)); - } else { - MainApp.bus().post(new EventDismissNotification(Notification.TARGET_MISSING)); - } targetHigh = json.getJSONArray("target_high"); - if (getTargetHigh(0) == null) { - double defaultHigh = units.equals(Constants.MGDL) ? 160 : 8; - targetHigh = new JSONArray("[{\"time\":\"00:00\",\"value\":\"" + defaultHigh + "\",\"timeAsSeconds\":\"0\"}]"); - Notification notarget = new Notification(Notification.TARGET_MISSING, MainApp.sResources.getString(R.string.targetmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notarget)); - } else { - MainApp.bus().post(new EventDismissNotification(Notification.TARGET_MISSING)); - } } catch (JSONException e) { log.error("Unhandled exception", e); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.invalidprofile)); isValid = false; isValidated = true; } @@ -164,6 +123,11 @@ public class Profile { } private LongSparseArray convertToSparseArray(JSONArray array) { + if (array == null) { + isValid = false; + return new LongSparseArray<>(); + } + double multiplier = getMultiplier(array); LongSparseArray sparse = new LongSparseArray<>(); @@ -379,6 +343,8 @@ public class Profile { } public String getIsfList() { + if (isf_v == null) + isf_v = convertToSparseArray(isf); return getValuesList(isf_v, null, new DecimalFormat("0.0"), getUnits() + "/U"); } @@ -397,6 +363,8 @@ public class Profile { } public String getIcList() { + if (ic_v == null) + ic_v = convertToSparseArray(ic); return getValuesList(ic_v, null, new DecimalFormat("0.0"), " g/U"); } @@ -481,6 +449,10 @@ public class Profile { } public String getTargetList() { + if (targetLow_v == null) + targetLow_v = convertToSparseArray(targetLow); + if (targetHigh_v == null) + targetHigh_v = convertToSparseArray(targetHigh); return getValuesList(targetLow_v, targetHigh_v, new DecimalFormat("0.0"), getUnits()); } diff --git a/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java b/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java index 0ea76ffb15..8ea89e2a5b 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java +++ b/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java @@ -3,10 +3,14 @@ package info.nightscout.androidaps.data; import android.support.annotation.Nullable; import android.support.v4.util.LongSparseArray; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.ArrayList; import java.util.List; import info.nightscout.androidaps.interfaces.Interval; +import info.nightscout.utils.DateUtil; /** * Created by mike on 09.05.2017. @@ -16,6 +20,7 @@ import info.nightscout.androidaps.interfaces.Interval; // When no interval match the lastest record without duration is used public class ProfileIntervals { + private static Logger log = LoggerFactory.getLogger(ProfileIntervals.class); private LongSparseArray rawData = new LongSparseArray<>(); // oldest at index 0 @@ -51,6 +56,11 @@ public class ProfileIntervals { public synchronized Interval getValueToTime(long time) { int index = binarySearch(time); if (index >= 0) return rawData.valueAt(index); + // if we request data older than first record, use oldest instead + if (rawData.size() > 0) { + log.debug("Requested profile for time: " + DateUtil.dateAndTimeString(time) + ". Providing oldest record: " + rawData.valueAt(0).toString()); + return rawData.valueAt(0); + } return null; } diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index 06e411d856..72d45c9950 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -1709,7 +1709,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { if (trJson.has("profileJson")) profileSwitch.profileJson = trJson.getString("profileJson"); else { - ProfileStore store = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); + ProfileStore store = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); Profile profile = store.getSpecificProfile(profileSwitch.profileName); if (profile != null) { profileSwitch.profileJson = profile.getData().toString(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index 701d050cee..2656e43a26 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -96,7 +96,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli noProfileView = view.findViewById(R.id.profileview_noprofile); butonsLayout = (LinearLayout) view.findViewById(R.id.careportal_buttons); - ProfileStore profileStore = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); + ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); if (profileStore == null) { noProfileView.setVisibility(View.VISIBLE); butonsLayout.setVisibility(View.GONE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java index 6e2728c95b..99fc44341b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java @@ -59,6 +59,7 @@ import info.nightscout.utils.FabricPrivacy; import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.NumberPicker; +import info.nightscout.utils.OKDialog; import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; import info.nightscout.utils.Translator; @@ -73,7 +74,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick Profile profile; ProfileStore profileStore; - String units; + String units = Constants.MGDL; TextView eventTypeText; LinearLayout layoutPercent; @@ -168,19 +169,24 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick // profile profile = MainApp.getConfigBuilder().getProfile(); - profileStore = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); - ArrayList profileList; - units = profile != null ? profile.getUnits() : Constants.MGDL; - profileList = profileStore.getProfileList(); - ArrayAdapter adapter = new ArrayAdapter(getContext(), - R.layout.spinner_centered, profileList); - profileSpinner.setAdapter(adapter); - // set selected to actual profile - for (int p = 0; p < profileList.size(); p++) { - if (profileList.get(p).equals(MainApp.getConfigBuilder().getProfileName(false))) - profileSpinner.setSelection(p); + profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); + if (profileStore == null) { + if (options.eventType == R.id.careportal_profileswitch) { + log.error("Profile switch called but plugin doesn't contain valid profile"); + } + } else { + ArrayList profileList; + units = profile != null ? profile.getUnits() : Constants.MGDL; + profileList = profileStore.getProfileList(); + ArrayAdapter adapter = new ArrayAdapter<>(getContext(), + R.layout.spinner_centered, profileList); + profileSpinner.setAdapter(adapter); + // set selected to actual profile + for (int p = 0; p < profileList.size(); p++) { + if (profileList.get(p).equals(MainApp.getConfigBuilder().getProfileName(false))) + profileSpinner.setSelection(p); + } } - final Double bg = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, units); // temp target @@ -720,7 +726,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick profileSwitch.source = Source.USER; profileSwitch.profileName = profileName; profileSwitch.profileJson = profileStore.getSpecificProfile(profileName).getData().toString(); - profileSwitch.profilePlugin = ConfigBuilderPlugin.getActiveProfileInterface().getClass().getName(); + profileSwitch.profilePlugin = MainApp.getConfigBuilder().getActiveProfileInterface().getClass().getName(); profileSwitch.durationInMinutes = duration; profileSwitch.isCPP = percentage != 100 || timeshift != 0; profileSwitch.timeshift = timeshift; @@ -752,7 +758,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick profileSwitch.source = Source.USER; profileSwitch.profileName = MainApp.getConfigBuilder().getProfileName(System.currentTimeMillis(), false); profileSwitch.profileJson = MainApp.getConfigBuilder().getProfile().getData().toString(); - profileSwitch.profilePlugin = ConfigBuilderPlugin.getActiveProfileInterface().getClass().getName(); + profileSwitch.profilePlugin = MainApp.getConfigBuilder().getActiveProfileInterface().getClass().getName(); profileSwitch.durationInMinutes = duration; profileSwitch.isCPP = percentage != 100 || timeshift != 0; profileSwitch.timeshift = timeshift; 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 1b411b3c40..45e4ddffc6 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 @@ -200,7 +200,7 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr return activeBgSource; } - public static ProfileInterface getActiveProfileInterface() { + public ProfileInterface getActiveProfileInterface() { return activeProfile; } @@ -760,33 +760,21 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr } public String getProfileName(long time, boolean customized) { - boolean ignoreProfileSwitchEvents = SP.getBoolean(R.string.key_do_not_track_profile_switch, false); - if (!ignoreProfileSwitchEvents) { - ProfileSwitch profileSwitch = getProfileSwitchFromHistory(time); - if (profileSwitch != null) { - if (profileSwitch.profileJson != null) { - return customized ? profileSwitch.getCustomizedName() : profileSwitch.profileName; - } else { - Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName); - if (profile != null) - return profileSwitch.profileName; - } + ProfileSwitch profileSwitch = getProfileSwitchFromHistory(time); + if (profileSwitch != null) { + if (profileSwitch.profileJson != null) { + return customized ? profileSwitch.getCustomizedName() : profileSwitch.profileName; + } else { + Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName); + if (profile != null) + return profileSwitch.profileName; } } - // Unable to determine profile, failover to default - String defaultProfile = activeProfile.getProfile().getDefaultProfileName(); - if (defaultProfile != null) - return defaultProfile; - // If default from plugin fails .... create empty - return "Default"; + return MainApp.gs(R.string.noprofileselected); } public boolean isProfileValid(String from) { - return getProfile() != null && getProfile().isValid(from) && - activeProfile != null && - activeProfile.getProfile() != null && - activeProfile.getProfile().getDefaultProfile() != null && - activeProfile.getProfile().getDefaultProfile().isValid(from); + return getProfile() != null && getProfile().isValid(from); } @Nullable @@ -806,41 +794,16 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr return null; //app not initialized } //log.debug("Profile for: " + new Date(time).toLocaleString() + " : " + getProfileName(time)); - boolean ignoreProfileSwitchEvents = SP.getBoolean(R.string.key_do_not_track_profile_switch, false); - if (!ignoreProfileSwitchEvents) { - ProfileSwitch profileSwitch = getProfileSwitchFromHistory(time); - if (profileSwitch != null) { - if (profileSwitch.profileJson != null) { - return profileSwitch.getProfileObject(); - } else if (activeProfile.getProfile() != null) { - Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName); - if (profile != null) - return profile; - } + ProfileSwitch profileSwitch = getProfileSwitchFromHistory(time); + if (profileSwitch != null) { + if (profileSwitch.profileJson != null) { + return profileSwitch.getProfileObject(); + } else if (activeProfile.getProfile() != null) { + Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName); + if (profile != null) + return profile; } } - // Unable to determine profile, failover to default - if (activeProfile.getProfile() == null) { - log.debug("getProfile activeProfile.getProfile() == null: returning null (activeProfile=" + activeProfile.getClass().getSimpleName() + ")"); - return null; //app not initialized - } - Profile defaultProfile = activeProfile.getProfile().getDefaultProfile(); - if (defaultProfile != null) - return defaultProfile; - // If default from plugin fails .... create empty - try { - Notification noisf = new Notification(Notification.ISF_MISSING, MainApp.sResources.getString(R.string.isfmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(noisf)); - Notification noic = new Notification(Notification.IC_MISSING, MainApp.sResources.getString(R.string.icmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(noic)); - Notification nobasal = new Notification(Notification.BASAL_MISSING, MainApp.sResources.getString(R.string.basalmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(nobasal)); - Notification notarget = new Notification(Notification.TARGET_MISSING, MainApp.sResources.getString(R.string.targetmissing), Notification.URGENT); - MainApp.bus().post(new EventNewNotification(notarget)); - return new Profile(new JSONObject("{\"dia\":\"3\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"20\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"20\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"0.1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"6\"}],\"target_high\":[{\"time\":\"00:00\",\"value\":\"8\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}}"), 100, 0); - } catch (JSONException e) { - log.error("Unhandled exception", e); - } log.debug("getProfile at the end: returning null"); return null; } 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 e99248c966..56f2276327 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 @@ -400,7 +400,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com private void initDialog() { Profile profile = MainApp.getConfigBuilder().getProfile(); - ProfileStore profileStore = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); + ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); if (profile == null) { ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile)); @@ -444,7 +444,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com } private void calculateInsulin() { - ProfileStore profileStore = ConfigBuilderPlugin.getActiveProfileInterface().getProfile(); + ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); if (profileSpinner == null || profileSpinner.getSelectedItem() == null || profileStore == null) return; // not initialized yet String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString(); 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 99caa034b8..58675099a8 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 @@ -187,7 +187,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final Object updateSync = new Object(); - public enum CHARTTYPE {PRE,BAS, IOB, COB, DEV, SEN}; + public enum CHARTTYPE {PRE, BAS, IOB, COB, DEV, SEN} + + ; private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledUpdate = null; @@ -344,7 +346,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, SpannableString s; PopupMenu popup = new PopupMenu(v.getContext(), v); - if(predictionsAvailable) { + if (predictionsAvailable) { item = popup.getMenu().add(Menu.NONE, CHARTTYPE.PRE.ordinal(), Menu.NONE, "Predictions"); title = item.getTitle(); s = new SpannableString(title); @@ -464,7 +466,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } else if (v == activeProfileView) { menu.setHeaderTitle(MainApp.sResources.getString(R.string.profile)); menu.add(MainApp.sResources.getString(R.string.danar_viewprofile)); - menu.add(MainApp.sResources.getString(R.string.careportal_profileswitch)); + if (MainApp.getConfigBuilder().getActiveProfileInterface().getProfile() != null) { + menu.add(MainApp.sResources.getString(R.string.careportal_profileswitch)); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java index 7f8b94cfa9..af41ed9541 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java @@ -42,10 +42,7 @@ public class Notification { public static final int APPROACHING_DAILY_LIMIT = 11; public static final int NSCLIENT_NO_WRITE_PERMISSION = 12; public static final int MISSING_SMS_PERMISSION = 13; - public static final int ISF_MISSING = 14; - public static final int IC_MISSING = 15; - public static final int BASAL_MISSING = 16; - public static final int TARGET_MISSING = 17; + public static final int NSANNOUNCEMENT = 18; public static final int NSALARM = 19; public static final int NSURGENTALARM = 20; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java index 84a1dd3a87..b99a9f0799 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java @@ -14,47 +14,55 @@ import com.squareup.otto.Subscribe; import java.util.ArrayList; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnItemSelected; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.androidaps.plugins.ProfileNS.events.EventNSProfileUpdateGUI; +import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileGraph; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.FabricPrivacy; +import static butterknife.OnItemSelected.Callback.NOTHING_SELECTED; -public class NSProfileFragment extends SubscriberFragment implements AdapterView.OnItemSelectedListener { - private Spinner profileSpinner; - private TextView noProfile; - private TextView units; - private TextView dia; - private TextView activeProfile; - private TextView ic; - private TextView isf; - private TextView basal; - private TextView target; + +public class NSProfileFragment extends SubscriberFragment { + @BindView(R.id.nsprofile_spinner) + Spinner profileSpinner; + @BindView(R.id.profileview_noprofile) + TextView noProfile; + @BindView(R.id.profileview_invalidprofile) + TextView invalidProfile; + @BindView(R.id.profileview_units) + TextView units; + @BindView(R.id.profileview_dia) + TextView dia; + @BindView(R.id.profileview_activeprofile) + TextView activeProfile; + @BindView(R.id.profileview_ic) + TextView ic; + @BindView(R.id.profileview_isf) + TextView isf; + @BindView(R.id.profileview_basal) + TextView basal; + @BindView(R.id.profileview_target) + TextView target; + @BindView(R.id.basal_graph) + ProfileGraph basalGraph; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { try { - View layout = inflater.inflate(R.layout.nsprofile_fragment, container, false); - - profileSpinner = (Spinner) layout.findViewById(R.id.nsprofile_spinner); - noProfile = (TextView) layout.findViewById(R.id.profileview_noprofile); - units = (TextView) layout.findViewById(R.id.profileview_units); - dia = (TextView) layout.findViewById(R.id.profileview_dia); - activeProfile = (TextView) layout.findViewById(R.id.profileview_activeprofile); - ic = (TextView) layout.findViewById(R.id.profileview_ic); - isf = (TextView) layout.findViewById(R.id.profileview_isf); - basal = (TextView) layout.findViewById(R.id.profileview_basal); - target = (TextView) layout.findViewById(R.id.profileview_target); - - profileSpinner.setOnItemSelectedListener(this); + View view = inflater.inflate(R.layout.nsprofile_fragment, container, false); + unbinder = ButterKnife.bind(this, view); updateGUI(); - return layout; + return view; } catch (Exception e) { FabricPrivacy.logException(e); } @@ -66,12 +74,7 @@ public class NSProfileFragment extends SubscriberFragment implements AdapterView public void onStatusEvent(final EventNSProfileUpdateGUI ev) { Activity activity = getActivity(); if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - updateGUI(); - } - }); + activity.runOnUiThread(() -> updateGUI()); } @Override @@ -97,9 +100,9 @@ public class NSProfileFragment extends SubscriberFragment implements AdapterView } } - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - String name = parent.getItemAtPosition(position).toString(); + @OnItemSelected(R.id.nsprofile_spinner) + public void onItemSelected(Spinner spinner, int position) { + String name = spinner.getItemAtPosition(position).toString(); ProfileStore store = NSProfilePlugin.getPlugin().getProfile(); if (store != null) { @@ -112,12 +115,18 @@ public class NSProfileFragment extends SubscriberFragment implements AdapterView isf.setText(profile.getIsfList()); basal.setText(profile.getBasalList()); target.setText(profile.getTargetList()); + basalGraph.show(profile); } + if (profile.isValid("NSProfileFragment")) + invalidProfile.setVisibility(View.GONE); + else + invalidProfile.setVisibility(View.VISIBLE); } } - @Override - public void onNothingSelected(AdapterView parent) { + @OnItemSelected(value = R.id.nsprofile_spinner, callback = NOTHING_SELECTED) + public void onNothingSelected() { + invalidProfile.setVisibility(View.VISIBLE); noProfile.setVisibility(View.VISIBLE); units.setText(""); dia.setText(""); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java index 4b3208a2bf..ef5c4bce5b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java @@ -59,7 +59,7 @@ public class BGSourceFragment extends SubscriberFragment { RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false)); recyclerView.setAdapter(adapter); - profile = ConfigBuilderPlugin.getActiveProfileInterface().getProfile().getDefaultProfile(); + profile = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile().getDefaultProfile(); return view; } catch (Exception e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java index fa1105faac..3286f91a62 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java @@ -12,6 +12,9 @@ import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.Unbinder; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; @@ -30,19 +33,36 @@ public class ProfileViewerDialog extends DialogFragment { private static Logger log = LoggerFactory.getLogger(ProfileViewDialog.class); - private TextView noProfile; - private TextView units; - private TextView dia; - private TextView activeProfile; - private TextView ic; - private TextView isf; - private TextView basal; - private TextView target; - private View dateDelimiter; - private LinearLayout dateLayout; - private TextView dateTextView; - private Button refreshButton; - private ProfileGraph basalGraph; + @BindView(R.id.profileview_noprofile) + TextView noProfile; + @BindView(R.id.profileview_invalidprofile) + TextView invalidProfile; + @BindView(R.id.profileview_units) + TextView units; + @BindView(R.id.profileview_dia) + TextView dia; + @BindView(R.id.profileview_activeprofile) + TextView activeProfile; + @BindView(R.id.profileview_ic) + TextView ic; + @BindView(R.id.profileview_isf) + TextView isf; + @BindView(R.id.profileview_basal) + TextView basal; + @BindView(R.id.profileview_target) + TextView target; + @BindView(R.id.profileview_datedelimiter) + View dateDelimiter; + @BindView(R.id.profileview_datelayout) + LinearLayout dateLayout; + @BindView(R.id.profileview_date) + TextView dateTextView; + @BindView(R.id.profileview_reload) + Button refreshButton; + @BindView(R.id.basal_graph) + ProfileGraph basalGraph; + + private Unbinder unbinder; public static ProfileViewerDialog newInstance(long time) { ProfileViewerDialog dialog = new ProfileViewerDialog(); @@ -61,31 +81,26 @@ public class ProfileViewerDialog extends DialogFragment { time = getArguments().getLong("time"); } + @Override + public void onDestroyView() { + super.onDestroyView(); + if (unbinder != null) + unbinder.unbind(); + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View layout = inflater.inflate(R.layout.profileviewer_fragment, container, false); + View view = inflater.inflate(R.layout.profileviewer_fragment, container, false); + unbinder = ButterKnife.bind(this, view); - noProfile = (TextView) layout.findViewById(R.id.profileview_noprofile); - units = (TextView) layout.findViewById(R.id.profileview_units); - dia = (TextView) layout.findViewById(R.id.profileview_dia); - activeProfile = (TextView) layout.findViewById(R.id.profileview_activeprofile); - ic = (TextView) layout.findViewById(R.id.profileview_ic); - isf = (TextView) layout.findViewById(R.id.profileview_isf); - basal = (TextView) layout.findViewById(R.id.profileview_basal); - target = (TextView) layout.findViewById(R.id.profileview_target); - refreshButton = (Button) layout.findViewById(R.id.profileview_reload); refreshButton.setVisibility(View.GONE); - dateDelimiter = layout.findViewById(R.id.profileview_datedelimiter); dateDelimiter.setVisibility(View.VISIBLE); - dateLayout = (LinearLayout) layout.findViewById(R.id.profileview_datelayout); dateLayout.setVisibility(View.VISIBLE); - dateTextView = (TextView) layout.findViewById(R.id.profileview_date); - basalGraph = (ProfileGraph) layout.findViewById(R.id.basal_graph); setContent(); - return layout; + return view; } @Override @@ -114,6 +129,11 @@ public class ProfileViewerDialog extends DialogFragment { basal.setText(profile.getBasalList()); target.setText(profile.getTargetList()); basalGraph.show(profile); + + if (profile.isValid("ProfileViewDialog")) + invalidProfile.setVisibility(View.GONE); + else + invalidProfile.setVisibility(View.VISIBLE); } else { noProfile.setVisibility(View.VISIBLE); } diff --git a/app/src/main/res/layout/nsprofile_fragment.xml b/app/src/main/res/layout/nsprofile_fragment.xml index b1c88c41c1..e8a38195cb 100644 --- a/app/src/main/res/layout/nsprofile_fragment.xml +++ b/app/src/main/res/layout/nsprofile_fragment.xml @@ -12,7 +12,6 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/profileviewer_fragment.xml b/app/src/main/res/layout/profileviewer_fragment.xml index 9f6da2acfb..7019c306ea 100644 --- a/app/src/main/res/layout/profileviewer_fragment.xml +++ b/app/src/main/res/layout/profileviewer_fragment.xml @@ -13,6 +13,17 @@ android:layout_height="wrap_content" android:orientation="vertical"> + + + android:visibility="gone" /> + + android:layout_height="100dip" + android:layout_margin="20dp" /> +