diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 508b3d9b88..ee6ddd0307 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -3,8 +3,9 @@
-
+
-
-
-
-
- 1.8
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8d8c9baf08..7de867c70c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,9 @@
+
+
+
-
+
-
@@ -45,6 +47,21 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/Config.java b/app/src/main/java/info/nightscout/androidaps/Config.java
new file mode 100644
index 0000000000..b4f54dae85
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/Config.java
@@ -0,0 +1,11 @@
+package info.nightscout.androidaps;
+
+/**
+ * Created by mike on 07.06.2016.
+ */
+public class Config {
+ public static final boolean detailedLog = true;
+ public static final boolean logFunctionCalls = true;
+ public static final boolean logIncommingBG = true;
+ public static final boolean logIncommingData = true;
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java
new file mode 100644
index 0000000000..bb947f94a0
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/Constants.java
@@ -0,0 +1,13 @@
+package info.nightscout.androidaps;
+
+/**
+ * Created by mike on 07.06.2016.
+ */
+public class Constants {
+ public static final String MGDL = "mg/dl"; // This is Nightscout representation
+ public static final String MMOL = "mmol";
+
+ public static final double MMOLL_TO_MGDL = 18.0182;
+ public static final double MGDL_TO_MMOLL = 1 / MMOLL_TO_MGDL;
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java
index 83dbffab35..e657fcd5d9 100644
--- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java
@@ -1,7 +1,5 @@
package info.nightscout.androidaps;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
@@ -12,15 +10,12 @@ import android.view.MenuItem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.List;
-
+import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
import info.nightscout.androidaps.plugins.ProfileViewer.ProfileViewerFragment;
import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
import info.nightscout.androidaps.tabs.*;
import info.nightscout.androidaps.plugins.Objectives.ObjectivesFragment;
-import info.nightscout.androidaps.plugins.Test.TestFragment;
-import info.nightscout.client.broadcasts.Intents;
public class MainActivity extends AppCompatActivity
implements ObjectivesFragment.OnFragmentInteractionListener,
@@ -33,6 +28,10 @@ public class MainActivity extends AppCompatActivity
private ViewPager mPager;
private TabPageAdapter mAdapter;
+ public static TreatmentsFragment treatmentsFragment;
+ public static TempBasalsFragment tempBasalsFragment;
+
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -40,9 +39,9 @@ public class MainActivity extends AppCompatActivity
// Register all tabs in app here
mAdapter = new TabPageAdapter(getSupportFragmentManager());
- mAdapter.registerNewFragment("Test", TestFragment.newInstance());
- mAdapter.registerNewFragment("Treatments", TreatmentsFragment.newInstance());
- mAdapter.registerNewFragment("TempBasals", TempBasalsFragment.newInstance());
+ mAdapter.registerNewFragment("Overview", OverviewFragment.newInstance());
+ mAdapter.registerNewFragment("Treatments", treatmentsFragment = TreatmentsFragment.newInstance());
+ mAdapter.registerNewFragment("TempBasals", tempBasalsFragment = TempBasalsFragment.newInstance());
mAdapter.registerNewFragment("Profile", ProfileViewerFragment.newInstance());
mAdapter.registerNewFragment("Objectives", ObjectivesFragment.newInstance());
diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java
index 3b861c5b63..8a80793ab6 100644
--- a/app/src/main/java/info/nightscout/androidaps/MainApp.java
+++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java
@@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
import info.nightscout.androidaps.data.Pump;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
import info.nightscout.client.data.NSProfile;
import info.nightscout.androidaps.db.DatabaseHelper;
diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
new file mode 100644
index 0000000000..f09c16cd28
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
@@ -0,0 +1,391 @@
+package info.nightscout.androidaps.Services;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.HandlerThread;
+
+import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.stmt.PreparedQuery;
+import com.j256.ormlite.stmt.QueryBuilder;
+import com.j256.ormlite.stmt.Where;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.List;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.db.BgReading;
+import info.nightscout.androidaps.db.Treatment;
+import info.nightscout.androidaps.events.EventNewBG;
+import info.nightscout.androidaps.events.EventNewBasalProfile;
+import info.nightscout.androidaps.events.EventTreatmentChange;
+import info.nightscout.androidaps.Config;
+import info.nightscout.client.data.NSProfile;
+import info.nightscout.client.data.NSSgv;
+
+
+public class DataService extends IntentService {
+ private static Logger log = LoggerFactory.getLogger(DataService.class);
+
+ Handler mHandler;
+ private HandlerThread mHandlerThread;
+
+ public DataService() {
+ super("DataService");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ if (Config.logFunctionCalls)
+ log.debug("onHandleIntent");
+
+ if (intent != null) {
+ final String action = intent.getAction();
+ if (Intents.ACTION_NEW_BG_ESTIMATE.equals(action)) {
+ handleNewDataFromXDrip(intent);
+ } else if (Intents.ACTION_NEW_PROFILE.equals(action) ||
+ Intents.ACTION_NEW_TREATMENT.equals(action) ||
+ Intents.ACTION_CHANGED_TREATMENT.equals(action) ||
+ Intents.ACTION_REMOVED_TREATMENT.equals(action) ||
+ Intents.ACTION_NEW_SGV.equals(action)
+ ) {
+ handleNewDataFromNSClient(intent);
+ }
+ }
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ super.onStartCommand(intent, flags, startId);
+
+ if (Config.logFunctionCalls)
+ log.debug("onStartCommand");
+
+ if (mHandlerThread == null) {
+ if (Config.detailedLog)
+ log.debug("Creating handler thread");
+
+ this.mHandlerThread = new HandlerThread(DataService.class.getSimpleName() + "Handler");
+ mHandlerThread.start();
+
+ this.mHandler = new Handler(mHandlerThread.getLooper());
+
+ registerBus();
+ }
+ return START_STICKY;
+ }
+
+ @Override
+ public void onDestroy() {
+ MainApp.bus().unregister(this);
+ }
+
+ private void registerBus() {
+ try {
+ MainApp.bus().unregister(this);
+ } catch (RuntimeException x) {
+ // Ignore
+ }
+ MainApp.bus().register(this);
+ }
+
+ private void handleNewDataFromXDrip(Intent intent) {
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ BgReading bgReading = new BgReading();
+
+ bgReading.value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE);
+ bgReading.slope = bundle.getDouble(Intents.EXTRA_BG_SLOPE);
+ bgReading.battery_level = bundle.getInt(Intents.EXTRA_SENSOR_BATTERY);
+ bgReading.timestamp = bundle.getLong(Intents.EXTRA_TIMESTAMP);
+ bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW);
+
+ if (Config.logIncommingBG)
+ log.debug("XDRIPREC BG " + bgReading.toString());
+
+ try {
+ MainApp.instance().getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ MainApp.bus().post(new EventNewBG());
+ }
+
+ private void handleNewDataFromNSClient(Intent intent) {
+ Bundle bundles = intent.getExtras();
+ if (bundles == null) return;
+
+
+ // Handle profile
+ if (intent.getAction().equals(Intents.ACTION_NEW_PROFILE)) {
+ try {
+ String activeProfile = bundles.getString("activeprofile");
+ String profile = bundles.getString("profile");
+ NSProfile nsProfile = new NSProfile(new JSONObject(profile), activeProfile);
+ MainApp.instance().setNSProfile(nsProfile);
+ MainApp.instance().setActiveProfile(activeProfile);
+ storeNSProfile();
+ if (MainApp.getActivePump() != null) {
+ MainApp.getActivePump().setNewBasalProfile();
+ } else {
+ log.error("No active pump selected");
+ }
+ if (Config.logIncommingData)
+ log.debug("Received profile: " + activeProfile + " " + profile);
+ MainApp.bus().post(new EventNewBasalProfile());
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ if (intent.getAction().equals(Intents.ACTION_NEW_TREATMENT)) {
+ try {
+ String trstring = bundles.getString("treatment");
+ JSONObject trJson = new JSONObject(trstring);
+ if (!trJson.has("insulin") && !trJson.has("carbs")) {
+ if (Config.logIncommingData)
+ log.debug("ADD: Uninterested treatment: " + trstring);
+ return;
+ }
+
+ Treatment stored = null;
+ trJson = new JSONObject(trstring);
+ String _id = trJson.getString("_id");
+
+ if (trJson.has("timeIndex")) {
+ if (Config.logIncommingData)
+ log.debug("ADD: timeIndex found: " + trstring);
+ stored = findByTimeIndex(trJson.getLong("timeIndex"));
+ } else {
+ stored = findById(_id);
+ }
+
+ if (stored != null) {
+ if (Config.logIncommingData)
+ log.debug("ADD: Existing treatment: " + trstring);
+ if (trJson.has("timeIndex")) {
+ stored._id = _id;
+ MainApp.getDbHelper().getDaoTreatments().update(stored);
+ }
+ return;
+ } else {
+ if (Config.logIncommingData)
+ log.debug("ADD: New treatment: " + trstring);
+ Treatment treatment = new Treatment();
+ treatment._id = _id;
+ treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
+ treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
+ treatment.created_at = new Date(trJson.getLong("mills"));
+ treatment.setTimeIndex(treatment.getTimeIndex());
+ try {
+ MainApp.getDbHelper().getDaoTreatments().create(treatment);
+ if (Config.logIncommingData)
+ log.debug("ADD: Stored treatment: " + treatment.log());
+ MainApp.bus().post(new EventTreatmentChange());
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+
+ }
+
+ if (intent.getAction().equals(Intents.ACTION_CHANGED_TREATMENT)) {
+ try {
+ String trstring = bundles.getString("treatment");
+ JSONObject trJson = new JSONObject(trstring);
+ if (!trJson.has("insulin") && !trJson.has("carbs")) {
+ if (Config.logIncommingData)
+ log.debug("CHANGE: Uninterested treatment: " + trstring);
+ return;
+ }
+ trJson = new JSONObject(trstring);
+ String _id = trJson.getString("_id");
+
+ Treatment stored;
+
+ if (trJson.has("timeIndex")) {
+ if (Config.logIncommingData)
+ log.debug("ADD: timeIndex found: " + trstring);
+ stored = findByTimeIndex(trJson.getLong("timeIndex"));
+ } else {
+ stored = findById(_id);
+ }
+
+ if (stored != null) {
+ if (Config.logIncommingData)
+ log.debug("CHANGE: Existing treatment: " + trstring);
+ stored._id = _id;
+ stored.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
+ stored.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
+ stored.created_at = new Date(trJson.getLong("mills"));
+ MainApp.getDbHelper().getDaoTreatments().update(stored);
+ MainApp.bus().post(new EventTreatmentChange());
+ } else {
+ if (Config.logIncommingData)
+ log.debug("CHANGE: New treatment: " + trstring);
+ Treatment treatment = new Treatment();
+ treatment._id = _id;
+ treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
+ treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
+ //treatment.created_at = DateUtil.fromISODateString(trJson.getString("created_at"));
+ treatment.created_at = new Date(trJson.getLong("mills"));
+ treatment.setTimeIndex(treatment.getTimeIndex());
+ try {
+ MainApp.getDbHelper().getDaoTreatments().create(treatment);
+ if (Config.logIncommingData)
+ log.debug("CHANGE: Stored treatment: " + treatment.log());
+ MainApp.bus().post(new EventTreatmentChange());
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ if (intent.getAction().equals(Intents.ACTION_REMOVED_TREATMENT)) {
+ try {
+ if (bundles.containsKey("treatment")) {
+ String trstring = bundles.getString("treatment");
+ JSONObject trJson = new JSONObject(trstring);
+ String _id = trJson.getString("_id");
+ removeTreatmentFromDb(_id);
+ }
+
+ if (bundles.containsKey("treatments")) {
+ String trstring = bundles.getString("treatments");
+ JSONArray jsonArray = new JSONArray(trstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject trJson = jsonArray.getJSONObject(i);
+ String _id = trJson.getString("_id");
+ removeTreatmentFromDb(_id);
+ }
+ }
+ MainApp.bus().post(new EventTreatmentChange());
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ }
+
+ if (intent.getAction().equals(Intents.ACTION_NEW_SGV)) {
+ try {
+ if (bundles.containsKey("sgv")) {
+ String sgvstring = bundles.getString("sgv");
+ JSONObject sgvJson = new JSONObject(sgvstring);
+ NSSgv nsSgv = new NSSgv(sgvJson);
+ BgReading bgReading = new BgReading(nsSgv);
+ MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
+ if (Config.logIncommingData)
+ log.debug("ADD: Stored new BG: " + bgReading.toString());
+ }
+
+ if (bundles.containsKey("sgvs")) {
+ String sgvstring = bundles.getString("sgvs");
+ JSONArray jsonArray = new JSONArray(sgvstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject sgvJson = jsonArray.getJSONObject(i);
+ NSSgv nsSgv = new NSSgv(sgvJson);
+ BgReading bgReading = new BgReading(nsSgv);
+ MainApp.getDbHelper().getDaoBgReadings().createIfNotExists(bgReading);
+ if (Config.logIncommingData)
+ log.debug("ADD: Stored new BG: " + bgReading.toString());
+ }
+ }
+ MainApp.bus().post(new EventTreatmentChange());
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ MainApp.bus().post(new EventNewBG());
+ }
+ }
+
+ public void storeNSProfile() {
+ SharedPreferences settings = MainApp.instance().getApplicationContext().getSharedPreferences(MainApp.instance().PREFS_NAME, 0);
+ SharedPreferences.Editor editor = settings.edit();
+ editor.putString("profile", MainApp.instance().getNSProfile().getData().toString());
+ editor.putString("activeProfile", MainApp.instance().getActiveProfile());
+ editor.commit();
+ }
+
+ public static Treatment findById(String _id) {
+ try {
+ QueryBuilder qb = null;
+ Dao daoTreatments = MainApp.getDbHelper().getDaoTreatments();
+ QueryBuilder queryBuilder = daoTreatments.queryBuilder();
+ Where where = queryBuilder.where();
+ where.eq("_id", _id);
+ queryBuilder.limit(10);
+ PreparedQuery preparedQuery = queryBuilder.prepare();
+ List trList = daoTreatments.query(preparedQuery);
+ if (trList.size() != 1) {
+ //log.debug("Treatment findById query size: " + trList.size());
+ return null;
+ } else {
+ //log.debug("Treatment findById found: " + trList.get(0).log());
+ return trList.get(0);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static Treatment findByTimeIndex(Long timeIndex) {
+ try {
+ QueryBuilder qb = null;
+ Dao daoTreatments = MainApp.getDbHelper().getDaoTreatments();
+ QueryBuilder queryBuilder = daoTreatments.queryBuilder();
+ Where where = queryBuilder.where();
+ where.eq("timeIndex", timeIndex);
+ queryBuilder.limit(10);
+ PreparedQuery preparedQuery = queryBuilder.prepare();
+ List trList = daoTreatments.query(preparedQuery);
+ if (trList.size() != 1) {
+ log.debug("Treatment findByTimeIndex query size: " + trList.size());
+ return null;
+ } else {
+ log.debug("Treatment findByTimeIndex found: " + trList.get(0).log());
+ return trList.get(0);
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private void removeTreatmentFromDb(String _id) throws SQLException {
+ Treatment stored = findById(_id);
+ if (stored != null) {
+ log.debug("REMOVE: Existing treatment (removing): " + _id);
+ MainApp.getDbHelper().getDaoTreatments().delete(stored);
+ MainApp.bus().post(new EventTreatmentChange());
+ } else {
+ log.debug("REMOVE: Not stored treatment (ignoring): " + _id);
+ }
+ }
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/Services/Intents.java b/app/src/main/java/info/nightscout/androidaps/Services/Intents.java
new file mode 100644
index 0000000000..5a959ee42d
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/Services/Intents.java
@@ -0,0 +1,29 @@
+package info.nightscout.androidaps.Services;
+
+public interface Intents {
+ // NSClient -> App
+ String ACTION_NEW_TREATMENT = "info.nightscout.client.NEW_TREATMENT";
+ String ACTION_CHANGED_TREATMENT = "info.nightscout.client.CHANGED_TREATMENT";
+ String ACTION_REMOVED_TREATMENT = "info.nightscout.client.REMOVED_TREATMENT";
+ String ACTION_NEW_PROFILE = "info.nightscout.client.NEW_PROFILE";
+ String ACTION_NEW_SGV = "info.nightscout.client.NEW_SGV";
+ String ACTION_NEW_STATUS = "info.nightscout.client.NEW_STATUS";
+
+
+ // App -> NSClient
+ String ACTION_DATABASE = "info.nightscout.client.DBACCESS";
+ String ACTION_RESTART = "info.nightscout.client.RESTART";
+
+ // xDrip -> App
+ String RECEIVER_PERMISSION = "com.eveningoutpost.dexdrip.permissions.RECEIVE_BG_ESTIMATE";
+
+ String ACTION_NEW_BG_ESTIMATE = "com.eveningoutpost.dexdrip.BgEstimate";
+ String EXTRA_BG_ESTIMATE = "com.eveningoutpost.dexdrip.Extras.BgEstimate";
+ String EXTRA_BG_SLOPE = "com.eveningoutpost.dexdrip.Extras.BgSlope";
+ String EXTRA_BG_SLOPE_NAME = "com.eveningoutpost.dexdrip.Extras.BgSlopeName";
+ String EXTRA_SENSOR_BATTERY = "com.eveningoutpost.dexdrip.Extras.SensorBattery";
+ String EXTRA_TIMESTAMP = "com.eveningoutpost.dexdrip.Extras.Time";
+ String EXTRA_RAW = "com.eveningoutpost.dexdrip.Extras.Raw";
+
+ String ACTION_NEW_BG_ESTIMATE_NO_DATA = "com.eveningoutpost.dexdrip.BgEstimateNoData";
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java
new file mode 100644
index 0000000000..697bac70a3
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java
@@ -0,0 +1,80 @@
+package info.nightscout.androidaps.db;
+
+import com.j256.ormlite.field.DatabaseField;
+import com.j256.ormlite.table.DatabaseTable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.DecimalFormat;
+import java.util.Date;
+
+import info.nightscout.androidaps.Constants;
+import info.nightscout.client.data.NSCal;
+import info.nightscout.client.data.NSSgv;
+
+@DatabaseTable(tableName = "BgReadings")
+public class BgReading {
+ private static Logger log = LoggerFactory.getLogger(BgReading.class);
+ public static final DecimalFormat mmolFormat = new DecimalFormat("0.0");
+ public static final DecimalFormat mgdlFormat = new DecimalFormat("0");
+
+ public long getTimeIndex() {
+ return (long) Math.ceil(timestamp / 60000d);
+ }
+
+ public void setTimeIndex(long timeIndex) {
+ this.timestamp = timeIndex;
+ }
+
+ @DatabaseField(id = true, useGetSet = true)
+ public long timeIndex;
+
+ @DatabaseField
+ public long timestamp;
+
+ @DatabaseField
+ public double value;
+
+ @DatabaseField
+ public double slope;
+
+ @DatabaseField
+ public double raw;
+
+ @DatabaseField
+ public int battery_level;
+
+ public BgReading() {}
+
+ public BgReading(NSSgv sgv) {
+ timestamp = sgv.getMills();
+ value = sgv.getMgdl();
+ raw = sgv.getFiltered();
+ }
+
+ public Double valueToUnits(String units) {
+ if (units.equals(Constants.MGDL))
+ return value;
+ else
+ return value * Constants.MGDL_TO_MMOLL;
+ }
+
+ public String valueToUnitsToString(String units) {
+ if (units.equals(Constants.MGDL)) return mgdlFormat.format(value);
+ else return mmolFormat.format(value * Constants.MGDL_TO_MMOLL);
+ }
+
+ @Override
+ public String toString() {
+ return "BgReading{" +
+ "timeIndex=" + timeIndex +
+ ", timestamp=" + timestamp +
+ ", date=" + new Date(timestamp) +
+ ", value=" + value +
+ ", slope=" + slope +
+ ", raw=" + raw +
+ ", battery_level=" + battery_level +
+ '}';
+ }
+}
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 ed04522a71..ddb9614abd 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
@@ -1,6 +1,7 @@
package info.nightscout.androidaps.db;
import java.sql.SQLException;
+import java.util.Date;
import java.util.List;
import android.content.Context;
@@ -8,85 +9,135 @@ import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.stmt.PreparedQuery;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.MainApp;
+
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
- private static Logger log = LoggerFactory.getLogger(DatabaseHelper.class);
+ private static Logger log = LoggerFactory.getLogger(DatabaseHelper.class);
- public static final String DATABASE_NAME = "AndroidAPSDb";
+ public static final String DATABASE_NAME = "AndroidAPSDb";
- private static final int DATABASE_VERSION = 2;
+ private static final int DATABASE_VERSION = 1;
- public DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
+ public DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
- try {
- log.info("onCreate");
- TableUtils.createTableIfNotExists(connectionSource, TempBasal.class);
- TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
- // TODO: add bg support
- } catch (SQLException e) {
- log.error(DatabaseHelper.class.getName(), "Can't create database", e);
- throw new RuntimeException(e);
- }
+ try {
+ log.info("onCreate");
+ TableUtils.createTableIfNotExists(connectionSource, TempBasal.class);
+ TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
+ TableUtils.createTableIfNotExists(connectionSource, BgReading.class);
+ // TODO: add bg support
+ } catch (SQLException e) {
+ log.error(DatabaseHelper.class.getName(), "Can't create database", e);
+ throw new RuntimeException(e);
+ }
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
- try {
- log.info(DatabaseHelper.class.getName(), "onUpgrade");
- TableUtils.dropTable(connectionSource, TempBasal.class, true);
- TableUtils.dropTable(connectionSource, Treatment.class, true);
- onCreate(database, connectionSource);
- } catch (SQLException e) {
- log.error(DatabaseHelper.class.getName(), "Can't drop databases", e);
- throw new RuntimeException(e);
- }
+ try {
+ log.info(DatabaseHelper.class.getName(), "onUpgrade");
+ TableUtils.dropTable(connectionSource, TempBasal.class, true);
+ TableUtils.dropTable(connectionSource, Treatment.class, true);
+ TableUtils.dropTable(connectionSource, BgReading.class, true);
+ onCreate(database, connectionSource);
+ } catch (SQLException e) {
+ log.error(DatabaseHelper.class.getName(), "Can't drop databases", e);
+ throw new RuntimeException(e);
+ }
}
/**
- * Close the database connections and clear any cached DAOs.
- */
- @Override
- public void close() {
- super.close();
- }
-
- public void resetDatabases() {
- try {
- TableUtils.dropTable(connectionSource, TempBasal.class, true);
- TableUtils.dropTable(connectionSource, Treatment.class, true);
- TableUtils.createTableIfNotExists(connectionSource, TempBasal.class);
- TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- public void resetTreatments() {
- try {
-
- TableUtils.dropTable(connectionSource, Treatment.class, true);
- TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- public Dao getDaoTempBasals() throws SQLException {
- return getDao(TempBasal.class);
+ * Close the database connections and clear any cached DAOs.
+ */
+ @Override
+ public void close() {
+ super.close();
}
- public Dao getDaoTreatments() throws SQLException {
- return getDao(Treatment.class);
- }
+ public void resetDatabases() {
+ try {
+ TableUtils.dropTable(connectionSource, TempBasal.class, true);
+ TableUtils.dropTable(connectionSource, Treatment.class, true);
+ TableUtils.dropTable(connectionSource, BgReading.class, true);
+ TableUtils.createTableIfNotExists(connectionSource, TempBasal.class);
+ TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
+ TableUtils.createTableIfNotExists(connectionSource, BgReading.class);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ public void resetTreatments() {
+ try {
+
+ TableUtils.dropTable(connectionSource, Treatment.class, true);
+ TableUtils.createTableIfNotExists(connectionSource, Treatment.class);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Dao getDaoTempBasals() throws SQLException {
+ return getDao(TempBasal.class);
+ }
+
+ public Dao getDaoTreatments() throws SQLException {
+ return getDao(Treatment.class);
+ }
+
+ public Dao getDaoBgReadings() throws SQLException {
+ return getDao(BgReading.class);
+ }
+
+ /*
+ * Return last BgReading from database or null if db is empty
+ */
+ public BgReading lastBg() {
+ List bgList = null;
+
+ try {
+ Dao daoBgReadings = MainApp.getDbHelper().getDaoBgReadings();
+ QueryBuilder queryBuilder = daoBgReadings.queryBuilder();
+ queryBuilder.orderBy("timeIndex", false);
+ queryBuilder.limit(1l);
+ PreparedQuery preparedQuery = queryBuilder.prepare();
+ bgList = daoBgReadings.query(preparedQuery);
+
+ } catch (SQLException e) {
+ log.debug(e.getMessage(), e);
+ }
+ if (bgList.size() > 0)
+ return bgList.get(0);
+ else
+ return null;
+ }
+
+ /*
+ * Return bg reading if not old ( <9 min )
+ * or null if older
+ */
+ public BgReading actualBg() {
+ BgReading lastBg = lastBg();
+
+ if (lastBg == null)
+ return null;
+
+ if (lastBg.timestamp > new Date().getTime() - 9 * 60 * 1000)
+ return lastBg;
+
+ return null;
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/db/Treatment.java b/app/src/main/java/info/nightscout/androidaps/db/Treatment.java
index 132e87bf14..59bb255062 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/Treatment.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/Treatment.java
@@ -17,7 +17,7 @@ import java.util.Date;
import java.util.List;
import info.nightscout.androidaps.data.Iob;
-import info.nightscout.client.broadcasts.Intents;
+import info.nightscout.androidaps.Services.Intents;
import info.nightscout.androidaps.MainApp;
import info.nightscout.client.data.NSProfile;
import info.nightscout.utils.DateUtil;
@@ -87,12 +87,12 @@ public class Treatment {
Double x1 = minAgo / 5d + 1;
result.iobContrib = this.insulin * (1 - 0.001852 * x1 * x1 + 0.001852 * x1);
// units: BG (mg/dL) = (BG/U) * U insulin * scalar
- result.activityContrib = sens * this.insulin * (2 / dia / 60 / peak) * minAgo;
+ result.activityContrib = this.insulin * (2 / dia / 60 / peak) * minAgo;
} else if (minAgo < end) {
Double x2 = (minAgo - 75) / 5;
result.iobContrib = this.insulin * (0.001323 * x2 * x2 - 0.054233 * x2 + 0.55556);
- result.activityContrib = sens * this.insulin * (2 / dia / 60 - (minAgo - peak) * 2 / dia / 60 / (60 * dia - peak));
+ result.activityContrib = this.insulin * (2 / dia / 60 - (minAgo - peak) * 2 / dia / 60 / (60 * dia - peak));
}
}
return result;
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
new file mode 100644
index 0000000000..40e19d93c2
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
@@ -0,0 +1,104 @@
+package info.nightscout.androidaps.plugins.Overview;
+
+import android.app.Activity;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.squareup.otto.Subscribe;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.BgReading;
+import info.nightscout.androidaps.events.EventNewBG;
+import info.nightscout.androidaps.events.EventTempBasalChange;
+import info.nightscout.client.data.NSProfile;
+
+
+public class OverviewFragment extends Fragment {
+ private static Logger log = LoggerFactory.getLogger(OverviewFragment.class);
+
+ TextView bg;
+
+ public static OverviewFragment newInstance() {
+ OverviewFragment fragment = new OverviewFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ registerBus();
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.overview_fragment, container, false);
+ bg = (TextView) view.findViewById(R.id.overview_bg);
+ return view;
+ }
+
+ private void registerBus() {
+ try {
+ MainApp.bus().unregister(this);
+ } catch (RuntimeException x) {
+ // Ignore
+ }
+ MainApp.bus().register(this);
+ }
+
+ private void updateData() {
+ BgReading bgReading = MainApp.getDbHelper().lastBg();
+ NSProfile profile = MainApp.getNSProfile();
+ if (profile != null && bgReading != null && bg != null)
+ bg.setText(bgReading.valueToUnitsToString(profile.getUnits()));
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventTempBasalChange ev) {
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateData();
+ }
+ });
+ else
+ log.debug("EventTempBasalChange: Activity is null");
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventNewBG ev) {
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateData();
+ }
+ });
+ else
+ log.debug("EventNewBG: Activity is null");
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+
+ if (isVisibleToUser)
+ updateData();
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileViewer/ProfileViewerFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileViewer/ProfileViewerFragment.java
index 747733913e..02fa968d82 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileViewer/ProfileViewerFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileViewer/ProfileViewerFragment.java
@@ -1,5 +1,6 @@
package info.nightscout.androidaps.plugins.ProfileViewer;
+import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
@@ -9,6 +10,9 @@ import android.widget.TextView;
import com.squareup.otto.Subscribe;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.text.DecimalFormat;
import info.nightscout.androidaps.MainApp;
@@ -17,6 +21,8 @@ import info.nightscout.androidaps.events.EventNewBasalProfile;
import info.nightscout.client.data.NSProfile;
public class ProfileViewerFragment extends Fragment {
+ private static Logger log = LoggerFactory.getLogger(ProfileViewerFragment.class);
+
private static TextView noProfile;
private static TextView dia;
private static TextView activeProfile;
@@ -67,6 +73,7 @@ public class ProfileViewerFragment extends Fragment {
NSProfile profile = MainApp.getNSProfile();
if (profile == null) {
noProfile.setVisibility(View.VISIBLE);
+ return;
} else {
noProfile.setVisibility(View.GONE);
}
@@ -76,7 +83,7 @@ public class ProfileViewerFragment extends Fragment {
isf.setText(profile.getIsfList());
basal.setText(profile.getBasalList());
target.setText(profile.getTargetList());
- }
+ }
private void registerBus() {
try {
@@ -89,6 +96,15 @@ public class ProfileViewerFragment extends Fragment {
@Subscribe
public void onStatusEvent(final EventNewBasalProfile ev) {
- setContent();
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ setContent();
+ }
+ });
+ else
+ log.debug("EventNewBG: Activity is null");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java
index e9846e149f..deb8b2e6fb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java
@@ -1,5 +1,6 @@
package info.nightscout.androidaps.plugins.TempBasals;
+import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
@@ -45,6 +46,9 @@ public class TempBasalsFragment extends Fragment {
TextView iobTotal;
TextView activityTotal;
+ public long lastCalculationTimestamp = 0;
+ public Iob lastCalculation;
+
private static DecimalFormat formatNumber0decimalplaces = new DecimalFormat("0");
private static DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00");
private static DecimalFormat formatNumber3decimalplaces = new DecimalFormat("0.000");
@@ -65,7 +69,7 @@ public class TempBasalsFragment extends Fragment {
fake.percent = 150;
fake.isAbsolute = false;
fake.isExtended = false;
- dao.create(fake);
+ dao.createOrUpdate(fake);
// **************** TESTING CREATE FAKE RECORD *****************
QueryBuilder queryBuilder = dao.queryBuilder();
@@ -80,9 +84,15 @@ public class TempBasalsFragment extends Fragment {
if (recyclerView != null) {
recyclerView.swapAdapter(new RecyclerViewAdapter(tempBasals), false);
}
+ updateTotalIOB();
+ }
-
-
+ /*
+ * Recalculate IOB if value is older than 1 minute
+ */
+ public void updateTotalIOBIfNeeded() {
+ if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
+ return;
updateTotalIOB();
}
@@ -196,7 +206,7 @@ public class TempBasalsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.tempbasals_fragment, container, false);
+ View view = inflater.inflate(R.layout.tempbasals_fragment, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.tempbasals_recyclerview);
recyclerView.setHasFixedSize(true);
@@ -248,13 +258,32 @@ public class TempBasalsFragment extends Fragment {
@Subscribe
public void onStatusEvent(final EventTempBasalChange ev) {
- initializeData();
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateTotalIOB();
+ recyclerView.getAdapter().notifyDataSetChanged();
+ }
+ });
+ else
+ log.debug("EventTempBasalChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
- updateTotalIOB();
- recyclerView.getAdapter().notifyDataSetChanged();
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateTotalIOB();
+ recyclerView.getAdapter().notifyDataSetChanged();
+ }
+ });
+ else
+ log.debug("EventNewBG: Activity is null");
}
@Override
@@ -262,7 +291,7 @@ public class TempBasalsFragment extends Fragment {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
- updateTotalIOB();
+ updateTotalIOBIfNeeded();
}
/**
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Test/TestFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Test/TestFragment.java
deleted file mode 100644
index 1b3b57ca1f..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Test/TestFragment.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package info.nightscout.androidaps.plugins.Test;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import info.nightscout.androidaps.R;
-
-/**
- * Created by mike on 30.05.2016.
- */
-public class TestFragment extends Fragment {
- private static TextView textView;
- private static TestFragment instance;
-
- public TestFragment() {
- super();
- }
-
-
- public static TestFragment newInstance() {
- if (instance == null)
- instance = new TestFragment();
- return instance;
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstance) {
- View layout = inflater.inflate(R.layout.test_fragment, container, false);
- textView = (TextView) layout.findViewById(R.id.position);
- Bundle bundle = getArguments();
- if (bundle != null) {
- textView.setText("This is page of tab " + bundle.getString("name"));
- }
- return layout;
- }
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Dialogs/NewTreatmentDialogFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Dialogs/NewTreatmentDialogFragment.java
new file mode 100644
index 0000000000..44beab6bd2
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Dialogs/NewTreatmentDialogFragment.java
@@ -0,0 +1,84 @@
+package info.nightscout.androidaps.plugins.Treatments.Dialogs;
+
+import android.app.Activity;
+import android.app.DialogFragment;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.*;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+
+public class NewTreatmentDialogFragment extends DialogFragment implements OnClickListener {
+
+ Button deliverButton;
+ Communicator communicator;
+ TextView insulin;
+ TextView carbs;
+
+ @Override
+ public void onAttach(Activity activity) {
+
+ super.onAttach(activity);
+
+ if (activity instanceof Communicator) {
+ communicator = (Communicator) getActivity();
+
+ } else {
+ throw new ClassCastException(activity.toString()
+ + " must implemenet NewTreatmentDialogFragment.Communicator");
+ }
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.treatments_newtreatment_fragment, null, false);
+
+ deliverButton = (Button) view.findViewById(R.id.treatments_newtreatment_deliverbutton);
+
+ deliverButton.setOnClickListener(this);
+ getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ insulin = (TextView) view.findViewById(R.id.treatments_newtreatment_insulinamount);
+ carbs = (TextView) view.findViewById(R.id.treatments_newtreatment_carbsamount);
+
+ return view;
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.treatments_newtreatment_deliverbutton:
+ SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
+ Double maxbolus = Double.parseDouble(SP.getString("safety_maxbolus", "3"));
+ Double maxcarbs = Double.parseDouble(SP.getString("safety_maxcarbs", "48"));
+
+
+ String insulinText = this.insulin.getText().toString();
+ String carbsText = this.carbs.getText().toString();
+ Double insulin = Double.parseDouble(!insulinText.equals("") ? this.insulin.getText().toString() : "0");
+ Double carbs = Double.parseDouble(!carbsText.equals("") ? this.carbs.getText().toString() : "0");
+ if (insulin > maxbolus) {
+ this.insulin.setText("");
+ } else if (carbs > maxcarbs) {
+ this.carbs.setText("");
+ } else if (insulin > 0d || carbs > 0d) {
+ dismiss();
+ communicator.treatmentDeliverRequest(insulin, carbs);
+ }
+ break;
+ }
+
+ }
+
+ public interface Communicator {
+ void treatmentDeliverRequest(Double insulin, Double carbs);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Dialogs/WizardDialogFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Dialogs/WizardDialogFragment.java
new file mode 100644
index 0000000000..0e137c7a04
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Dialogs/WizardDialogFragment.java
@@ -0,0 +1,295 @@
+package info.nightscout.androidaps.plugins.Treatments.Dialogs;
+
+import android.app.Activity;
+import android.app.DialogFragment;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.*;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+
+import java.text.DecimalFormat;
+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.Iob;
+import info.nightscout.androidaps.db.BgReading;
+import info.nightscout.androidaps.db.Treatment;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment;
+import info.nightscout.client.data.NSProfile;
+import info.nightscout.utils.*;
+
+public class WizardDialogFragment extends DialogFragment implements OnClickListener {
+
+ Button wizardDialogDeliverButton;
+ Communicator communicator;
+ TextView correctionInput;
+ TextView carbsInput;
+ TextView bgInput;
+ TextView bg, bgInsulin, bgUnits;
+ CheckBox bgCheckbox;
+ TextView carbs, carbsInsulin;
+ TextView iob, iobInsulin;
+ CheckBox iobCheckbox;
+ TextView correctionInsulin;
+ TextView total, totalInsulin;
+
+ public static final DecimalFormat numberFormat = new DecimalFormat("0.00");
+ public static final DecimalFormat intFormat = new DecimalFormat("0");
+
+ Double calculatedCarbs = 0d;
+ Double calculatedTotalInsulin = 0d;
+
+ final private TextWatcher textWatcher = new TextWatcher() {
+ @Override
+ public void afterTextChanged(Editable s) {}
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+ @Override
+ public void onTextChanged(CharSequence s, int start,int before, int count) {
+ calculateInsulin();
+ }
+ };
+
+ final CompoundButton.OnCheckedChangeListener onCheckedChangeListener = new CompoundButton.OnCheckedChangeListener()
+ {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
+ {
+ calculateInsulin();
+ }
+ };
+
+ @Override
+ public void onAttach(Activity activity) {
+
+ super.onAttach(activity);
+
+ if (activity instanceof Communicator) {
+ communicator = (Communicator) getActivity();
+
+ } else {
+ throw new ClassCastException(activity.toString()
+ + " must implemenet WizardDialogFragment.Communicator");
+ }
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.treatments_wizard_fragment, 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_VISIBLE);
+ 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);
+
+ 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);
+ iob = (TextView)view.findViewById(R.id.treatments_wizard_iob);
+ iobInsulin = (TextView)view.findViewById(R.id.treatments_wizard_iobinsulin);
+ iobCheckbox = (CheckBox) view.findViewById(R.id.treatments_wizard_iobcheckbox);
+ 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);
+
+ bgCheckbox.setOnCheckedChangeListener(onCheckedChangeListener);
+ iobCheckbox.setOnCheckedChangeListener(onCheckedChangeListener);
+
+ initDialog();
+ return view;
+ }
+
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.treatments_wizard_deliverButton:
+ if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d){
+ dismiss();
+ communicator.treatmentDialogDeliver(calculatedTotalInsulin, calculatedCarbs);
+ }
+ break;
+ }
+
+ }
+
+ private void initDialog() {
+ SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
+ String units = SP.getString("ns_units", Constants.MGDL);
+
+ if (MainApp.getNSProfile() == null) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), "No profile loaded from NS yet");
+ dismiss();
+ return;
+ }
+
+ bgUnits.setText(units);
+
+ // Set BG if not old
+ BgReading lastBg = MainApp.getDbHelper().lastBg();
+ Double lastBgValue = lastBg.valueToUnits(units);
+
+ if (lastBg != null) {
+ Double sens = MainApp.getNSProfile().getIsf(MainApp.getNSProfile().secondsFromMidnight());
+ Double targetBGLow = MainApp.getNSProfile().getTargetLow(MainApp.getNSProfile().secondsFromMidnight());
+ Double targetBGHigh = MainApp.getNSProfile().getTargetHigh(MainApp.getNSProfile().secondsFromMidnight());
+ Double bgDiff;
+ if (lastBgValue <= targetBGLow) {
+ bgDiff = lastBgValue - targetBGLow;
+ } else {
+ bgDiff = lastBgValue - targetBGHigh;
+ }
+
+ bg.setText(lastBg.valueToUnitsToString(units) + " ISF: " + intFormat.format(sens));
+ bgInsulin.setText(numberFormat.format(bgDiff / sens) + "U");
+ bgInput.setText(lastBg.valueToUnitsToString(units));
+ } else {
+ bg.setText("");
+ bgInsulin.setText("");
+ bgInput.setText("");
+ }
+
+ // IOB calculation
+ MainActivity.treatmentsFragment.updateTotalIOBIfNeeded();
+ MainActivity.tempBasalsFragment.updateTotalIOBIfNeeded();
+
+ Iob bolusIob = MainActivity.treatmentsFragment.lastCalculation;
+ Iob basalIob = MainActivity.tempBasalsFragment.lastCalculation;
+ bolusIob.plus(basalIob);
+ iobInsulin.setText("-" + numberFormat.format(bolusIob.iobContrib) + "U");
+
+ totalInsulin.setText("");
+ wizardDialogDeliverButton.setVisibility(Button.GONE);
+
+ }
+
+ private void calculateInsulin() {
+ SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
+ Double maxbolus = Double.parseDouble(SP.getString("safety_maxbolus", "3"));
+ Double maxcarbs = Double.parseDouble(SP.getString("safety_maxcarbs", "48"));
+ String units = SP.getString("ns_units", Constants.MGDL);
+
+ NSProfile profile = MainApp.instance().getNSProfile();
+
+ // Entered values
+ String i_bg = this.bgInput.getText().toString();
+ String i_carbs = this.carbsInput.getText().toString();
+ String i_correction = this.correctionInput.getText().toString();
+ Double c_bg = 0d;
+ try { c_bg = Double.parseDouble(i_bg.equals("") ? "0" : i_bg); } catch (Exception e) {}
+ Double c_carbs = 0d;
+ try { c_carbs = Double.parseDouble(i_carbs.equals("") ? "0" : i_carbs); } catch (Exception e) {}
+ c_carbs = ((Long)Math.round(c_carbs)).doubleValue();
+ Double c_correction = 0d;
+ try { c_correction = Double.parseDouble(i_correction.equals("") ? "0" : i_correction); } catch (Exception e) {}
+ if(c_correction > maxbolus) {
+ this.correctionInput.setText("");
+ wizardDialogDeliverButton.setVisibility(Button.GONE);
+ return;
+ }
+ if(c_carbs > maxcarbs) {
+ this.carbsInput.setText("");
+ wizardDialogDeliverButton.setVisibility(Button.GONE);
+ return;
+ }
+
+
+ // Insulin from BG
+ Double sens = profile.getIsf(MainApp.getNSProfile().secondsFromMidnight());
+ Double targetBGLow = profile.getTargetLow(MainApp.getNSProfile().secondsFromMidnight());
+ Double targetBGHigh = profile.getTargetHigh(MainApp.getNSProfile().secondsFromMidnight());
+ Double bgDiff;
+ if (c_bg <= targetBGLow) {
+ bgDiff = c_bg - targetBGLow;
+ } else {
+ bgDiff = c_bg - targetBGHigh;
+ }
+ Double insulinFromBG = (bgCheckbox.isChecked() && c_bg != 0d) ? bgDiff /sens : 0d;
+ bg.setText(c_bg + " ISF: " + intFormat.format(sens));
+ bgInsulin.setText(numberFormat.format(insulinFromBG) + "U");
+
+ // Insuling from carbs
+ Double ic = profile.getIc(MainApp.getNSProfile().secondsFromMidnight());
+ Double insulinFromCarbs = c_carbs / ic;
+ carbs.setText(intFormat.format(c_carbs) + "g IC: " + intFormat.format(ic));
+ carbsInsulin.setText(numberFormat.format(insulinFromCarbs) + "U");
+
+ // Insulin from IOB
+ MainActivity.treatmentsFragment.updateTotalIOBIfNeeded();
+ MainActivity.tempBasalsFragment.updateTotalIOBIfNeeded();
+
+ Iob bolusIob = MainActivity.treatmentsFragment.lastCalculation;
+ Iob basalIob = MainActivity.tempBasalsFragment.lastCalculation;
+ bolusIob.plus(basalIob);
+ Double insulingFromIOB = iobCheckbox.isChecked() ? bolusIob.iobContrib : 0d;
+ iobInsulin.setText("-" + numberFormat.format(insulingFromIOB) + "U");
+
+ // Insulin from correction
+ Double insulinFromCorrection = c_correction;
+ correctionInsulin.setText(numberFormat.format(insulinFromCorrection) + "U");
+
+ // Total
+ calculatedTotalInsulin = insulinFromBG + insulinFromCarbs - insulingFromIOB + insulinFromCorrection;
+
+ if (calculatedTotalInsulin < 0) {
+ Double carbsEquivalent = -calculatedTotalInsulin * ic;
+ total.setText("Missing " + intFormat.format(carbsEquivalent) + "g");
+ calculatedTotalInsulin = 0d;
+ totalInsulin.setText("");
+ } else {
+ calculatedTotalInsulin = roundTo(calculatedTotalInsulin, 0.05d);
+ total.setText("");
+ totalInsulin.setText(numberFormat.format(calculatedTotalInsulin) + "U");
+ }
+
+ calculatedCarbs = c_carbs;
+
+ if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d) {
+ String insulinText = calculatedTotalInsulin > 0d ? (numberFormat.format(calculatedTotalInsulin) + "U") : "";
+ String carbsText = calculatedCarbs > 0d ? (intFormat.format(calculatedCarbs) + "g") : "";
+ wizardDialogDeliverButton.setText("SEND " + insulinText + " " + carbsText);
+ wizardDialogDeliverButton.setVisibility(Button.VISIBLE);
+ } else {
+ wizardDialogDeliverButton.setVisibility(Button.GONE);
+ }
+ }
+
+ private double fromMgdl(Double value, String units) {
+ if (units.equals(Constants.MGDL)) return value;
+ else return value / 18;
+ }
+
+ private Double roundTo(Double x, Double step) {
+ if (x != 0d) {
+ return Math.round(x / step) * step;
+ }
+ return 0d;
+ }
+
+ public interface Communicator {
+ void treatmentDialogDeliver(Double insulin, Double carbs);
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
index 6fb32c044d..a24256e7de 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
@@ -1,14 +1,19 @@
package info.nightscout.androidaps.plugins.Treatments;
+import android.app.Activity;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
+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.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Button;
import android.widget.TextView;
import com.j256.ormlite.dao.Dao;
@@ -27,15 +32,17 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
+import info.nightscout.androidaps.MainActivity;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Iob;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.events.EventNewBG;
-import info.nightscout.androidaps.events.EventNewBasalProfile;
import info.nightscout.androidaps.events.EventTreatmentChange;
+import info.nightscout.androidaps.plugins.Treatments.Dialogs.NewTreatmentDialogFragment;
+import info.nightscout.androidaps.Services.Intents;
-public class TreatmentsFragment extends Fragment {
+public class TreatmentsFragment extends Fragment implements View.OnClickListener, NewTreatmentDialogFragment.Communicator {
private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class);
RecyclerView recyclerView;
@@ -43,6 +50,10 @@ public class TreatmentsFragment extends Fragment {
TextView iobTotal;
TextView activityTotal;
+ Button refreshFromNS;
+
+ public long lastCalculationTimestamp = 0;
+ public Iob lastCalculation;
private static DecimalFormat formatNumber0decimalplaces = new DecimalFormat("0");
private static DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00");
@@ -70,9 +81,18 @@ public class TreatmentsFragment extends Fragment {
updateTotalIOB();
}
+ /*
+ * Recalculate IOB if value is older than 1 minute
+ */
+ public void updateTotalIOBIfNeeded() {
+ if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000)
+ return;
+ updateTotalIOB();
+ }
+
private void updateTotalIOB() {
Iob total = new Iob();
- for (Integer pos = 0; pos < treatments.size(); pos++ ) {
+ for (Integer pos = 0; pos < treatments.size(); pos++) {
Treatment t = treatments.get(pos);
total.plus(t.iobCalc(new Date()));
}
@@ -80,6 +100,9 @@ public class TreatmentsFragment extends Fragment {
iobTotal.setText(formatNumber2decimalplaces.format(total.iobContrib));
if (activityTotal != null)
activityTotal.setText(formatNumber3decimalplaces.format(total.activityContrib));
+
+ lastCalculationTimestamp = new Date().getTime();
+ lastCalculation = total;
}
public static class RecyclerViewAdapter extends RecyclerView.Adapter {
@@ -171,17 +194,34 @@ public class TreatmentsFragment extends Fragment {
iobTotal = (TextView) view.findViewById(R.id.treatments_iobtotal);
activityTotal = (TextView) view.findViewById(R.id.treatments_iobactivitytotal);
+ refreshFromNS = (Button) view.findViewById(R.id.treatments_reshreshfromnightscout);
+
+ refreshFromNS.setOnClickListener(this);
return view;
}
- /*
- // TODO: Rename method, update argument and hook method into UI event
- public void onButtonPressed(Uri uri) {
- if (mListener != null) {
- mListener.onFragmentInteraction(uri);
- }
+ @Override
+ public void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.treatments_reshreshfromnightscout:
+ AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());
+ builder.setTitle("Dialog");
+ builder.setMessage("Do you want to refresh treatments from Nightscout");
+ builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ MainApp.getDbHelper().resetTreatments();
+ initializeData();
+ Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
+ MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
+ }
+ });
+ builder.setNegativeButton("Cancel", null);
+ builder.show();
+
+ break;
}
- */
+ }
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -210,13 +250,31 @@ public class TreatmentsFragment extends Fragment {
@Subscribe
public void onStatusEvent(final EventTreatmentChange ev) {
- initializeData();
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ initializeData();
+ }
+ });
+ else
+ log.debug("EventTreatmentChange: Activity is null");
}
@Subscribe
public void onStatusEvent(final EventNewBG ev) {
- updateTotalIOB();
- recyclerView.getAdapter().notifyDataSetChanged();
+ Activity activity = getActivity();
+ if (activity != null)
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateTotalIOB();
+ recyclerView.getAdapter().notifyDataSetChanged();
+ }
+ });
+ else
+ log.debug("EventNewBG: Activity is null");
}
@Override
@@ -224,7 +282,7 @@ public class TreatmentsFragment extends Fragment {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser)
- updateTotalIOB();
+ updateTotalIOBIfNeeded();
}
/**
@@ -241,4 +299,10 @@ public class TreatmentsFragment extends Fragment {
// TODO: Update argument type and name
void onFragmentInteraction(String param);
}
+
+ @Override
+ public void treatmentDeliverRequest(Double insulin, Double carbs) {
+ // TODO: implement treatment delivery
+ }
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/xDripReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/xDripReceiver.java
new file mode 100644
index 0000000000..2c2af6404d
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/xDripReceiver.java
@@ -0,0 +1,25 @@
+package info.nightscout.androidaps.receivers;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.content.WakefulBroadcastReceiver;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.Services.DataService;
+import info.nightscout.androidaps.Config;
+
+
+public class xDripReceiver extends WakefulBroadcastReceiver {
+ private static Logger log = LoggerFactory.getLogger(xDripReceiver.class);
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Config.logFunctionCalls)
+ log.debug("onReceive " + intent);
+ startWakefulService(context, new Intent(context, DataService.class)
+ .setAction(intent.getAction())
+ .putExtras(intent));
+ }
+}
diff --git a/app/src/main/java/info/nightscout/client/broadcasts/Intents.java b/app/src/main/java/info/nightscout/client/broadcasts/Intents.java
deleted file mode 100644
index f667b048ed..0000000000
--- a/app/src/main/java/info/nightscout/client/broadcasts/Intents.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package info.nightscout.client.broadcasts;
-
-public interface Intents {
- // NSClient -> App
- String ACTION_NEW_TREATMENT = "info.nightscout.client.NEW_TREATMENT";
- String ACTION_CHANGED_TREATMENT = "info.nightscout.client.CHANGED_TREATMENT";
- String ACTION_REMOVED_TREATMENT = "info.nightscout.client.REMOVED_TREATMENT";
- String ACTION_NEW_PROFILE = "info.nightscout.client.NEW_PROFILE";
- String ACTION_NEW_SGV = "info.nightscout.client.NEW_SGV";
- String ACTION_NEW_STATUS = "info.nightscout.client.NEW_STATUS";
-
-
- // App -> NSClient
- String ACTION_DATABASE = "info.nightscout.client.DBACCESS";
-}
diff --git a/app/src/main/java/info/nightscout/client/receivers/NSClientDataReceiver.java b/app/src/main/java/info/nightscout/client/receivers/NSClientDataReceiver.java
index 91756deffc..10c1c6fcec 100644
--- a/app/src/main/java/info/nightscout/client/receivers/NSClientDataReceiver.java
+++ b/app/src/main/java/info/nightscout/client/receivers/NSClientDataReceiver.java
@@ -1,264 +1,24 @@
package info.nightscout.client.receivers;
-import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Bundle;
+import android.support.v4.content.WakefulBroadcastReceiver;
-import com.j256.ormlite.dao.Dao;
-import com.j256.ormlite.stmt.PreparedQuery;
-import com.j256.ormlite.stmt.QueryBuilder;
-import com.j256.ormlite.stmt.Where;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.sql.SQLException;
-import java.util.Date;
-import java.util.List;
+import info.nightscout.androidaps.Services.DataService;
+import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.events.EventNewBG;
-import info.nightscout.androidaps.events.EventNewBasalProfile;
-import info.nightscout.androidaps.events.EventTreatmentChange;
-import info.nightscout.client.broadcasts.Intents;
-import info.nightscout.client.data.NSProfile;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.db.Treatment;
-
-public class NSClientDataReceiver extends BroadcastReceiver {
+public class NSClientDataReceiver extends WakefulBroadcastReceiver {
private static Logger log = LoggerFactory.getLogger(NSClientDataReceiver.class);
- public NSClientDataReceiver() {
- }
@Override
public void onReceive(Context context, Intent intent) {
- Bundle bundles = intent.getExtras();
- if (bundles == null) return;
-
-
- // Handle profile
- if (intent.getAction().equals(Intents.ACTION_NEW_PROFILE)){
- try {
- String activeProfile = bundles.getString("activeprofile");
- String profile = bundles.getString("profile");
- NSProfile nsProfile = new NSProfile(new JSONObject(profile), activeProfile);
- MainApp.instance().setNSProfile(nsProfile);
- MainApp.instance().setActiveProfile(activeProfile);
- storeNSProfile();
- if (MainApp.getActivePump() != null) {
- MainApp.getActivePump().setNewBasalProfile();
- } else {
- log.error("No active pump selected");
- }
- log.debug("Received profile: " + activeProfile + " " + profile);
- MainApp.bus().post(new EventNewBasalProfile());
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- if (intent.getAction().equals(Intents.ACTION_NEW_TREATMENT)) {
- try {
- String trstring = bundles.getString("treatment");
- JSONObject trJson = new JSONObject(trstring);
- if (!trJson.has("insulin") && !trJson.has("carbs")) {
- log.debug("ADD: Uninterested treatment: " + trstring);
- return;
- }
-
- Treatment stored = null;
- trJson = new JSONObject(trstring);
- String _id = trJson.getString("_id");
-
- if (trJson.has("timeIndex")) {
- log.debug("ADD: timeIndex found: " + trstring);
- stored = findByTimeIndex(trJson.getLong("timeIndex"));
- } else {
- stored = findById(_id);
- }
-
- if (stored != null) {
- log.debug("ADD: Existing treatment: " + trstring);
- if (trJson.has("timeIndex")) {
- stored._id = _id;
- MainApp.getDbHelper().getDaoTreatments().update(stored);
- }
- return;
- } else {
- log.debug("ADD: New treatment: " + trstring);
- Treatment treatment = new Treatment();
- treatment._id = _id;
- treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
- treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
- treatment.created_at = new Date(trJson.getLong("mills"));
- treatment.setTimeIndex(treatment.getTimeIndex());
- try {
- MainApp.getDbHelper().getDaoTreatments().create(treatment);
- log.debug("ADD: Stored treatment: " + treatment.log());
- MainApp.bus().post(new EventTreatmentChange());
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- } catch (JSONException e) {
- e.printStackTrace();
- } catch (Exception e1) {
- e1.printStackTrace();
- }
-
- }
-
- if (intent.getAction().equals(Intents.ACTION_CHANGED_TREATMENT)) {
- try {
- String trstring = bundles.getString("treatment");
- JSONObject trJson = new JSONObject(trstring);
- if (!trJson.has("insulin") && !trJson.has("carbs")) {
- log.debug("CHANGE: Uninterested treatment: " + trstring);
- return;
- }
- trJson = new JSONObject(trstring);
- String _id = trJson.getString("_id");
-
- Treatment stored;
-
- if (trJson.has("timeIndex")) {
- log.debug("ADD: timeIndex found: " + trstring);
- stored = findByTimeIndex(trJson.getLong("timeIndex"));
- } else {
- stored = findById(_id);
- }
-
- if (stored != null) {
- log.debug("CHANGE: Existing treatment: " + trstring);
- stored._id = _id;
- stored.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
- stored.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
- stored.created_at = new Date(trJson.getLong("mills"));
- MainApp.getDbHelper().getDaoTreatments().update(stored);
- MainApp.bus().post(new EventTreatmentChange());
- } else {
- log.debug("CHANGE: New treatment: " + trstring);
- Treatment treatment = new Treatment();
- treatment._id = _id;
- treatment.carbs = trJson.has("carbs") ? trJson.getDouble("carbs") : 0;
- treatment.insulin = trJson.has("insulin") ? trJson.getDouble("insulin") : 0d;
- //treatment.created_at = DateUtil.fromISODateString(trJson.getString("created_at"));
- treatment.created_at = new Date(trJson.getLong("mills"));
- treatment.setTimeIndex(treatment.getTimeIndex());
- try {
- MainApp.getDbHelper().getDaoTreatments().create(treatment);
- log.debug("CHANGE: Stored treatment: " + treatment.log());
- MainApp.bus().post(new EventTreatmentChange());
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- } catch (JSONException e) {
- e.printStackTrace();
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_REMOVED_TREATMENT)) {
- try {
- if (bundles.containsKey("treatment")) {
- String trstring = bundles.getString("treatment");
- JSONObject trJson = new JSONObject(trstring);
- String _id = trJson.getString("_id");
- removeTreatmentFromDb(_id);
- }
-
- if (bundles.containsKey("treatments")) {
- String trstring = bundles.getString("treatments");
- JSONArray jsonArray = new JSONArray(trstring);
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject trJson = jsonArray.getJSONObject(i);
- String _id = trJson.getString("_id");
- removeTreatmentFromDb(_id);
- }
- }
- MainApp.bus().post(new EventTreatmentChange());
-
- } catch (JSONException e) {
- e.printStackTrace();
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_NEW_SGV)) {
- MainApp.bus().post(new EventNewBG());
- }
- }
-
- public void storeNSProfile() {
- SharedPreferences settings = MainApp.instance().getApplicationContext().getSharedPreferences(MainApp.instance().PREFS_NAME, 0);
- SharedPreferences.Editor editor = settings.edit();
- editor.putString("profile", MainApp.instance().getNSProfile().getData().toString());
- editor.putString("activeProfile", MainApp.instance().getActiveProfile());
- editor.commit();
- }
-
- public static Treatment findById(String _id) {
- try {
- QueryBuilder qb = null;
- Dao daoTreatments = MainApp.getDbHelper().getDaoTreatments();
- QueryBuilder queryBuilder = daoTreatments.queryBuilder();
- Where where = queryBuilder.where();
- where.eq("_id", _id);
- queryBuilder.limit(10);
- PreparedQuery preparedQuery = queryBuilder.prepare();
- List trList = daoTreatments.query(preparedQuery);
- if (trList.size() != 1) {
- //log.debug("Treatment findById query size: " + trList.size());
- return null;
- } else {
- //log.debug("Treatment findById found: " + trList.get(0).log());
- return trList.get(0);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- public static Treatment findByTimeIndex(Long timeIndex) {
- try {
- QueryBuilder qb = null;
- Dao daoTreatments = MainApp.getDbHelper().getDaoTreatments();
- QueryBuilder queryBuilder = daoTreatments.queryBuilder();
- Where where = queryBuilder.where();
- where.eq("timeIndex", timeIndex);
- queryBuilder.limit(10);
- PreparedQuery preparedQuery = queryBuilder.prepare();
- List trList = daoTreatments.query(preparedQuery);
- if (trList.size() != 1) {
- log.debug("Treatment findByTimeIndex query size: " + trList.size());
- return null;
- } else {
- log.debug("Treatment findByTimeIndex found: " + trList.get(0).log());
- return trList.get(0);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- private void removeTreatmentFromDb(String _id) throws SQLException {
- Treatment stored = findById(_id);
- if (stored != null) {
- log.debug("REMOVE: Existing treatment (removing): " + _id);
- MainApp.getDbHelper().getDaoTreatments().delete(stored);
- MainApp.bus().post(new EventTreatmentChange());
- } else {
- log.debug("REMOVE: Not stored treatment (ignoring): " + _id);
- }
+ if (Config.logFunctionCalls)
+ log.debug("onReceive " + intent);
+ startWakefulService(context, new Intent(context, DataService.class)
+ .setAction(intent.getAction())
+ .putExtras(intent));
}
}
diff --git a/app/src/main/java/info/nightscout/utils/ToastUtils.java b/app/src/main/java/info/nightscout/utils/ToastUtils.java
new file mode 100644
index 0000000000..47f7154d84
--- /dev/null
+++ b/app/src/main/java/info/nightscout/utils/ToastUtils.java
@@ -0,0 +1,21 @@
+package info.nightscout.utils;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+import android.widget.Toast;
+
+public class ToastUtils {
+
+ public static void showToastInUiThread(final Context ctx,
+ final String string) {
+
+ Handler mainThread = new Handler(Looper.getMainLooper());
+ mainThread.post(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(ctx, string, Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml
new file mode 100644
index 0000000000..9a3b811023
--- /dev/null
+++ b/app/src/main/res/layout/overview_fragment.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/test_fragment.xml b/app/src/main/res/layout/test_fragment.xml
deleted file mode 100644
index b557cc3c63..0000000000
--- a/app/src/main/res/layout/test_fragment.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/treatments_fragment.xml b/app/src/main/res/layout/treatments_fragment.xml
index 578e1b3900..1085adbc36 100644
--- a/app/src/main/res/layout/treatments_fragment.xml
+++ b/app/src/main/res/layout/treatments_fragment.xml
@@ -47,6 +47,13 @@
android:paddingLeft="10dp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treatments_wizard_fragment.xml b/app/src/main/res/layout/treatments_wizard_fragment.xml
new file mode 100644
index 0000000000..85bc920beb
--- /dev/null
+++ b/app/src/main/res/layout/treatments_wizard_fragment.xml
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 927dc0ba02..2d26f7f214 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -1,15 +1,9 @@