open loop mode & notification

This commit is contained in:
Milos Kozak 2016-06-26 11:43:26 +02:00
parent ff5043e99b
commit 2f16c9b998
17 changed files with 296 additions and 98 deletions

View file

@ -25,5 +25,5 @@ public class Config {
// Developing mode only - never turn on
// TODO: remove fakeGlucoseData
public static final boolean fakeGlucoseData = false;
public static final boolean fakeGlucoseData = true;
}

View file

@ -1,5 +1,7 @@
package info.nightscout.androidaps;
import com.j256.ormlite.stmt.query.In;
/**
* Created by mike on 07.06.2016.
*/
@ -13,5 +15,7 @@ public class Constants {
public static final double basalAbsoluteOnlyForCheckLimit = 10101010d;
public static final Integer basalPercentOnlyForCheckLimit = 10101010;
public static final Integer notificationID = 556677;
public static final int hoursToKeepInDatabase = 24;
}

View file

@ -27,6 +27,8 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_treatments);
if (Config.APS)
addPreferencesFromResource(R.xml.pref_closedmode);
if (Config.OPENAPSMAENABLED)
addPreferencesFromResource(R.xml.pref_openapsma);
if (Config.LOWSUSPEDENABLED)

View file

@ -0,0 +1,7 @@
package info.nightscout.androidaps.events;
/**
* Created by mike on 25.06.2016.
*/
public class EventRefreshOpenLoop {
}

View file

@ -7,8 +7,7 @@ import info.nightscout.androidaps.plugins.APSResult;
*/
public interface ConstraintsInterface {
boolean isAutomaticProcessingEnabled();
boolean manualConfirmationNeeded();
boolean isClosedModeEnabled();
APSResult applyBasalConstraints(APSResult request);
Double applyBasalConstraints(Double absoluteRate);
Integer applyBasalConstraints(Integer percentRate);

View file

@ -709,27 +709,14 @@ public class ConfigBuilderFragment extends Fragment implements PluginBase, PumpI
* Constraints interface
**/
@Override
public boolean isAutomaticProcessingEnabled() {
public boolean isClosedModeEnabled() {
boolean result = true;
ArrayList<PluginBase> constraintsPlugins = MainActivity.getSpecificPluginsList(PluginBase.CONSTRAINTS);
for (PluginBase p : constraintsPlugins) {
ConstraintsInterface constrain = (ConstraintsInterface) p;
if (!p.isEnabled()) continue;
result = result && constrain.isAutomaticProcessingEnabled();
}
return result;
}
@Override
public boolean manualConfirmationNeeded() {
boolean result = false;
ArrayList<PluginBase> constraintsPlugins = MainActivity.getSpecificPluginsList(PluginBase.CONSTRAINTS);
for (PluginBase p : constraintsPlugins) {
ConstraintsInterface constrain = (ConstraintsInterface) p;
if (!p.isEnabled()) continue;
result = result || constrain.manualConfirmationNeeded();
result = result && constrain.isClosedModeEnabled();
}
return result;
}

View file

@ -2,10 +2,17 @@ package info.nightscout.androidaps.plugins.Loop;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v7.app.NotificationCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -20,11 +27,13 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Date;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventRefreshOpenLoop;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
@ -43,8 +52,6 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
TextView constraintsProcessedView;
TextView setByPumpView;
boolean confirmed;
public class LastRun implements Parcelable {
public APSResult request = null;
public APSResult constraintsProcessed = null;
@ -52,6 +59,7 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
public String source = null;
public Date lastAPSRun = null;
public Date lastEnact = null;
public Date lastOpenModeAccept = null;
@Override
public int describeContents() {
@ -65,7 +73,8 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
dest.writeParcelable(setByPump, 0);
dest.writeString(source);
dest.writeLong(lastAPSRun.getTime());
dest.writeLong(lastEnact!= null ? lastEnact.getTime(): 0l);
dest.writeLong(lastEnact != null ? lastEnact.getTime() : 0l);
dest.writeLong(lastOpenModeAccept != null ? lastOpenModeAccept.getTime() : 0l);
}
public final Parcelable.Creator<LastRun> CREATOR = new Parcelable.Creator<LastRun>() {
@ -85,6 +94,7 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
source = in.readString();
lastAPSRun = new Date(in.readLong());
lastEnact = new Date(in.readLong());
lastOpenModeAccept = new Date(in.readLong());
}
public LastRun() {
@ -186,7 +196,7 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
public void onClick(View view) {
switch (view.getId()) {
case R.id.loop_run:
invoke();
invoke(true);
break;
}
@ -195,22 +205,15 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
@Subscribe
public void onStatusEvent(final EventTreatmentChange ev) {
ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder();
if (constraintsInterface.isAutomaticProcessingEnabled()) {
invoke();
updateGUI();
}
invoke(true);
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder();
if (constraintsInterface.isAutomaticProcessingEnabled()) {
invoke();
updateGUI();
}
invoke(true);
}
private void invoke() {
public void invoke(boolean allowNotification) {
ConstraintsInterface constraintsInterface = MainApp.getConfigBuilder();
PumpInterface pumpInterface = MainApp.getConfigBuilder().getActivePump();
APSResult result = null;
@ -247,39 +250,63 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
return;
}
confirmed = false;
if (constraintsInterface.manualConfirmationNeeded()) {
// TODO: user notification here
confirmed = true;
} else {
confirmed = true;
}
// check rate for constrais
APSResult resultAfterConstraints = result.clone();
constraintsInterface.applyBasalConstraints(resultAfterConstraints);
if (result.changeRequested) {
constraintsInterface.applyBasalConstraints(resultAfterConstraints);
PumpEnactResult applyResult = pumpInterface.applyAPSRequest(resultAfterConstraints);
Date lastEnact = lastRun != null ? lastRun.lastEnact : new Date(0, 0, 0);
lastRun = new LastRun();
lastRun.request = result;
lastRun.constraintsProcessed = resultAfterConstraints;
lastRun.setByPump = applyResult;
lastRun.source = ((PluginBase) usedAPS).getName();
lastRun.lastAPSRun = new Date();
if (applyResult.enacted)
lastRun.lastEnact = lastRun.lastAPSRun;
else
lastRun.lastEnact = lastEnact;
if (lastRun == null) lastRun = new LastRun();
lastRun.request = result;
lastRun.constraintsProcessed = resultAfterConstraints;
lastRun.lastAPSRun = new Date();
lastRun.source = usedAPS != null ? ((PluginBase) usedAPS).getName() : "";
lastRun.setByPump = null;
if (constraintsInterface.isClosedModeEnabled()) {
if (result.changeRequested) {
PumpEnactResult applyResult = pumpInterface.applyAPSRequest(resultAfterConstraints);
if (applyResult.enacted) {
lastRun.setByPump = applyResult;
lastRun.lastEnact = lastRun.lastAPSRun;
}
} else {
lastRun.setByPump = null;
lastRun.source = null;
}
} else {
if (lastRun == null) lastRun = new LastRun();
lastRun.request = result;
lastRun.constraintsProcessed = resultAfterConstraints;
lastRun.setByPump = null;
lastRun.source = null;
lastRun.lastAPSRun = new Date();
if (result.changeRequested && allowNotification) {
NotificationCompat.Builder builder =
new NotificationCompat.Builder(MainApp.instance().getApplicationContext());
builder.setSmallIcon(R.drawable.notification_icon)
.setContentTitle(MainApp.resources.getString(R.string.openloop_newsuggestion))
.setContentText(resultAfterConstraints.toString())
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_HIGH)
.setCategory(Notification.CATEGORY_ALARM)
.setVisibility(Notification.VISIBILITY_PUBLIC);
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(MainApp.instance().getApplicationContext(), MainActivity.class);
// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(MainApp.instance().getApplicationContext());
stackBuilder.addParentStack(MainActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(resultPendingIntent);
builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000});
NotificationManager mNotificationManager =
(NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(Constants.notificationID, builder.build());
MainApp.bus().post(new EventRefreshOpenLoop());
}
}
updateGUI();
MainApp.getConfigBuilder().uploadDeviceStatus();
}
@ -296,7 +323,7 @@ public class LoopFragment extends Fragment implements View.OnClickListener, Plug
setByPumpView.setText(lastRun.setByPump != null ? lastRun.setByPump.toString() : "");
sourceView.setText(lastRun.source != null ? lastRun.source.toString() : "");
lastRunView.setText(lastRun.lastAPSRun != null && lastRun.lastAPSRun.getTime() != 0 ? lastRun.lastAPSRun.toLocaleString() : "");
lastEnactView.setText(lastRun.lastEnact!= null && lastRun.lastEnact.getTime() != 0 ? lastRun.lastEnact.toLocaleString() : "");
lastEnactView.setText(lastRun.lastEnact != null && lastRun.lastEnact.getTime() != 0 ? lastRun.lastEnact.toLocaleString() : "");
}
}
});

View file

@ -317,17 +317,11 @@ public class ObjectivesFragment extends Fragment implements View.OnClickListener
* Constraints interface
**/
@Override
public boolean isAutomaticProcessingEnabled() {
public boolean isClosedModeEnabled() {
return true; // TODO: revert back
//return objectives.get(3).started.getTime() > 0;
}
@Override
public boolean manualConfirmationNeeded() {
return false; // TODO: revert back
//return objectives.get(3).started.getTime() < 0;
}
@Override
public APSResult applyBasalConstraints(APSResult result) {
return result;

View file

@ -171,9 +171,9 @@ public class WizardDialog extends DialogFragment implements OnClickListener {
// Set BG if not old
BgReading lastBg = MainApp.getDbHelper().lastBg();
Double lastBgValue = lastBg.valueToUnits(units);
if (lastBg != null) {
Double lastBgValue = lastBg.valueToUnits(units);
Double sens = profile.getIsf(NSProfile.secondsFromMidnight());
Double targetBGLow = profile.getTargetLow(NSProfile.secondsFromMidnight());
Double targetBGHigh = profile.getTargetHigh(NSProfile.secondsFromMidnight());

View file

@ -1,14 +1,15 @@
package info.nightscout.androidaps.plugins.Overview;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.provider.ContactsContract;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -34,18 +35,23 @@ import java.util.Date;
import java.util.Iterator;
import java.util.List;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.TempBasal;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.events.EventRefreshOpenLoop;
import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.Loop.LoopFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal;
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewExtendedBolusDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTempBasalDialog;
@ -63,15 +69,18 @@ public class OverviewFragment extends Fragment implements PluginBase {
TextView deltaView;
TextView runningTempView;
TextView iobView;
TextView apsModeView;
GraphView bgGraph;
LinearLayout cancelTempLayout;
LinearLayout setTempLayout;
LinearLayout acceptTempLayout;
Button cancelTempButton;
Button treatmentButton;
Button wizardButton;
Button setTempButton;
Button setExtenedButton;
Button acceptTempButton;
boolean visibleNow = false;
Handler loopHandler = new Handler();
@ -155,6 +164,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
deltaView = (TextView) view.findViewById(R.id.overview_delta);
runningTempView = (TextView) view.findViewById(R.id.overview_runningtemp);
iobView = (TextView) view.findViewById(R.id.overview_iob);
apsModeView = (TextView) view.findViewById(R.id.overview_apsmode);
bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph);
cancelTempButton = (Button) view.findViewById(R.id.overview_canceltemp);
treatmentButton = (Button) view.findViewById(R.id.overview_treatment);
@ -164,6 +174,8 @@ public class OverviewFragment extends Fragment implements PluginBase {
cancelTempButton = (Button) view.findViewById(R.id.overview_canceltemp);
setTempLayout = (LinearLayout) view.findViewById(R.id.overview_settemplayout);
cancelTempLayout = (LinearLayout) view.findViewById(R.id.overview_canceltemplayout);
acceptTempButton = (Button) view.findViewById(R.id.overview_accepttempbutton);
acceptTempLayout = (LinearLayout) view.findViewById(R.id.overview_accepttemplayout);
treatmentButton.setOnClickListener(new View.OnClickListener() {
@Override
@ -212,6 +224,34 @@ public class OverviewFragment extends Fragment implements PluginBase {
}
});
acceptTempButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainApp.getConfigBuilder().getActiveLoop().invoke(false);
final LoopFragment.LastRun finalLastRun = MainApp.getConfigBuilder().getActiveLoop().lastRun;
if (finalLastRun != null && finalLastRun.lastAPSRun != null && finalLastRun.constraintsProcessed.changeRequested) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(getContext().getString(R.string.dialog));
builder.setMessage(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed);
builder.setPositiveButton(getContext().getString(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
PumpEnactResult applyResult = MainApp.getConfigBuilder().getActivePump().applyAPSRequest(finalLastRun.constraintsProcessed);
if (applyResult.enacted) {
finalLastRun.setByPump = applyResult;
finalLastRun.lastEnact = new Date();
finalLastRun.lastOpenModeAccept = new Date();
MainApp.getConfigBuilder().uploadDeviceStatus();
}
updateGUI();
}
});
builder.setNegativeButton(getContext().getString(R.string.cancel), null);
builder.show();
}
updateGUI();
}
});
updateGUI();
return view;
}
@ -225,6 +265,34 @@ public class OverviewFragment extends Fragment implements PluginBase {
MainApp.bus().register(this);
}
@Subscribe
public void onStatusEvent(final EventPreferenceChange ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateGUI();
}
});
else
log.debug("EventPreferenceChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventRefreshGui ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateGUI();
}
});
else
log.debug("EventRefreshGui: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventTreatmentChange ev) {
Activity activity = getActivity();
@ -267,6 +335,20 @@ public class OverviewFragment extends Fragment implements PluginBase {
log.debug("EventNewBG: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventRefreshOpenLoop ev) {
Activity activity = getActivity();
if (activity != null)
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
updateGUI();
}
});
else
log.debug("EventNewBG: Activity is null");
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
@ -295,6 +377,30 @@ public class OverviewFragment extends Fragment implements PluginBase {
if (bgGraph == null)
return;
// open loop mode
final LoopFragment.LastRun finalLastRun = MainApp.getConfigBuilder().getActiveLoop().lastRun;
if (Config.APS) {
apsModeView.setVisibility(View.VISIBLE);
if (MainApp.getConfigBuilder().isClosedModeEnabled())
apsModeView.setText(MainApp.resources.getString(R.string.closedloop));
else apsModeView.setText(MainApp.resources.getString(R.string.openloop));
} else {
apsModeView.setVisibility(View.GONE);
}
boolean showAcceptButton = true;
showAcceptButton = 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
showAcceptButton = showAcceptButton && finalLastRun.constraintsProcessed.changeRequested; // change is requested
if (showAcceptButton) {
acceptTempLayout.setVisibility(View.VISIBLE);
acceptTempButton.setText(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed);
} else {
acceptTempLayout.setVisibility(View.GONE);
}
// **** Temp button ****
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
@ -379,6 +485,7 @@ public class OverviewFragment extends Fragment implements PluginBase {
super(x, y);
this.isTempBasal = isTempBasal;
}
public boolean isTempBasal = false;
}

View file

@ -66,13 +66,10 @@ public class SafetyFragment extends Fragment implements PluginBase, ConstraintsI
* Constraints interface
**/
@Override
public boolean isAutomaticProcessingEnabled() {
return true;
}
@Override
public boolean manualConfirmationNeeded() {
return false;
public boolean isClosedModeEnabled() {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
String mode = SP.getString("aps_mode", "open");
return mode.equals("closed");
}
@Override

View file

@ -0,0 +1,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid android:color="@color/colorCancelTempButton" />
<stroke android:width="1dip" android:color="@android:color/white"/>
<corners
android:radius="2dp" >
</corners>
</shape>

View file

@ -30,12 +30,32 @@
android:layout_marginTop="10dp"
android:orientation="vertical">
<TextView
android:id="@+id/overview_timeago"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/overview_timeago"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="0.5" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="Medium Text"
android:id="@+id/overview_apsmode"
android:layout_marginRight="10dp"
android:background="@drawable/loopmodeborder"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:gravity="center_vertical|center_horizontal" />
</LinearLayout>
<TextView
android:id="@+id/overview_delta"
@ -66,6 +86,22 @@
android:layout_width="match_parent"
android:layout_height="160dip" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/overview_accepttemplayout">
<Button
android:id="@+id/overview_accepttempbutton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="0.5"
android:text="Accept new temp\n0.25U/h"
android:textColor="@color/colorAcceptTempButton" />
</LinearLayout>
<LinearLayout
android:id="@+id/overview_canceltemplayout"
android:layout_width="match_parent"
@ -79,8 +115,8 @@
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="0.5"
android:textColor="@color/colorCancelTempButton"
android:text="Cancel temp basal" />
android:text="Cancel temp basal"
android:textColor="@color/colorCancelTempButton" />
</LinearLayout>
@ -97,8 +133,8 @@
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="0.5"
android:textColor="@color/colorSetTempButton"
android:text="TempBasal" />
android:text="TempBasal"
android:textColor="@color/colorSetTempButton" />
<Button
android:id="@+id/overview_extendedbolus"
@ -107,8 +143,8 @@
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="0.5"
android:textColor="@color/colorSetExtendedButton"
android:text="Extended Bolus" />
android:text="Extended Bolus"
android:textColor="@color/colorSetExtendedButton" />
</LinearLayout>
<LinearLayout
@ -123,8 +159,8 @@
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="0.5"
android:textColor="@color/colorTreatmentButton"
android:text="@string/overview_treatment_label" />
android:text="@string/overview_treatment_label"
android:textColor="@color/colorTreatmentButton" />
<Button
android:id="@+id/overview_wizard"
@ -133,8 +169,8 @@
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_weight="0.5"
android:textColor="@color/colorWizardButton"
android:text="@string/overview_calculator_label" />
android:text="@string/overview_calculator_label"
android:textColor="@color/colorWizardButton" />
</LinearLayout>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="aps_modeArray">
<item>@string/closedloop</item>
<item>@string/openloop</item>
</string-array>
<string-array name="aps_modeValues">
<item>closed</item>
<item>open</item>
</string-array>
</resources>

View file

@ -9,9 +9,10 @@
<color name="linearBlockBackground">#3e3d3d</color>
<color name="colorAcceptTempButton">#f4d700</color>
<color name="colorTreatmentButton">#FFB347</color>
<color name="colorWizardButton">#77dd77</color>
<color name="colorCancelTempButton">#FF47C8FF</color>
<color name="colorCancelTempButton">#47c8ff</color>
<color name="colorSetTempButton">#FF478EFF</color>
<color name="colorSetExtendedButton">#FFDD7792</color>

View file

@ -106,8 +106,6 @@
<string name="minimalduration">Minimal duration</string>
<string name="configbuilder_constraints">Constraints</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="loop">Loop</string>
<string name="configbuilder_loop">Loop</string>
<string name="loop_aps_label">APS</string>
@ -132,7 +130,7 @@
<string name="treatmentdeliveryerror">Treatment delivery error</string>
<string name="overview_newtempbasal_basal_label">Basal value</string>
<string name="overview_newtempbasal_percent_label">% (100% = current)</string>
<string name="setbasalquestion">Set new temp basal:</string>
<string name="setbasalquestion">Accept new temp basal:</string>
<string name="overview_treatment_label">Treatment</string>
<string name="overview_calculator_label">Calculator</string>
<string name="constraintapllied">Constraint applied!</string>
@ -146,5 +144,10 @@
<string name="configbuilder_bgsource">BG Source</string>
<string name="xdrip">xDrip</string>
<string name="nsclient">NSClient</string>
<string name="apsmode_title">APS Mode</string>
<string name="apsmode_summary">APS Loop Mode</string>
<string name="closedloop">Closed Loop</string>
<string name="openloop">Open Loop</string>
<string name="openloop_newsuggestion">New suggestion available</string>
</resources>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="aps_general"
android:title="General">
<ListPreference
android:title="@string/apsmode_title"
android:key="aps_mode"
android:defaultValue="open"
android:summary="@string/apsmode_summary"
android:entries="@array/aps_modeArray"
android:entryValues="@array/aps_modeValues"/>
</PreferenceCategory>
</PreferenceScreen>