diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e46fae2c92..58cdb693a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/History/DanaRStatsActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/History/DanaRStatsActivity.java index 7a41a9e049..509001d02f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/History/DanaRStatsActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaR/History/DanaRStatsActivity.java @@ -69,7 +69,6 @@ public class DanaRStatsActivity extends Activity { this.mHandler = new Handler(mHandlerThread.getLooper()); } - @Override public void onStart() { super.onStart(); @@ -159,7 +158,6 @@ public class DanaRStatsActivity extends Activity { loadDataFromDB(RecordTypes.RECORD_TYPE_DAILY); } - private void loadDataFromDB(byte type) { try { Dao dao = MainApp.getDbHelper().getDaoDanaRHistory(); @@ -244,7 +242,6 @@ public class DanaRStatsActivity extends Activity { }); } - @Subscribe public void onStatusEvent(final EventDanaRSyncStatus s) { log.debug("EventDanaRSyncStatus: " + s.message); @@ -277,6 +274,4 @@ public class DanaRStatsActivity extends Activity { } ); } - - } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java index d645f252d3..56ed323c17 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/DanaRKoreanFragment.java @@ -28,10 +28,10 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.interfaces.FragmentBase; import info.nightscout.androidaps.plugins.DanaR.Dialogs.ProfileViewDialog; -import info.nightscout.androidaps.plugins.DanaR.History.DanaRStatsActivity; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus; import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRNewStatus; import info.nightscout.androidaps.plugins.DanaRKorean.History.DanaRHistoryActivity; +import info.nightscout.androidaps.plugins.DanaRKorean.History.DanaRStatsActivity; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.SetWarnColor; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRStatsActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRStatsActivity.java new file mode 100644 index 0000000000..3fb6537b0b --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/DanaRKorean/History/DanaRStatsActivity.java @@ -0,0 +1,281 @@ +package info.nightscout.androidaps.plugins.DanaRKorean.History; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +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 com.squareup.otto.Subscribe; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.SQLException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.db.DanaRHistoryRecord; +import info.nightscout.androidaps.interfaces.ProfileInterface; +import info.nightscout.androidaps.plugins.CircadianPercentageProfile.CircadianPercentageProfilePlugin; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.DanaR.comm.RecordTypes; +import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRConnectionStatus; +import info.nightscout.androidaps.plugins.DanaR.events.EventDanaRSyncStatus; +import info.nightscout.androidaps.plugins.DanaRKorean.Services.ExecutionService; +import info.nightscout.utils.DecimalFormatter; +import info.nightscout.utils.ToastUtils; + +public class DanaRStatsActivity extends Activity { + private static Logger log = LoggerFactory.getLogger(DanaRStatsActivity.class); + + private boolean mBounded; + private static ExecutionService mExecutionService; + + private Handler mHandler; + private static HandlerThread mHandlerThread; + + TextView statusView; + TextView mainView; + Button reloadButton; + LinearLayoutManager llm; + + List historyList = new ArrayList<>(); + + + public DanaRStatsActivity() { + super(); + mHandlerThread = new HandlerThread(DanaRStatsActivity.class.getSimpleName()); + mHandlerThread.start(); + this.mHandler = new Handler(mHandlerThread.getLooper()); + } + + @Override + public void onStart() { + super.onStart(); + Intent intent = new Intent(this, ExecutionService.class); + bindService(intent, mConnection, Context.BIND_AUTO_CREATE); + } + + @Override + protected void onResume() { + super.onResume(); + MainApp.bus().register(this); + } + + @Override + protected void onPause() { + super.onPause(); + MainApp.bus().unregister(this); + } + + @Override + public void onStop() { + super.onStop(); + if (mBounded) { + unbindService(mConnection); + mBounded = false; + } + } + + ServiceConnection mConnection = new ServiceConnection() { + + public void onServiceDisconnected(ComponentName name) { + log.debug("Service is disconnected"); + mBounded = false; + mExecutionService = null; + } + + public void onServiceConnected(ComponentName name, IBinder service) { + log.debug("Service is connected"); + mBounded = true; + ExecutionService.LocalBinder mLocalBinder = (ExecutionService.LocalBinder) service; + mExecutionService = mLocalBinder.getServiceInstance(); + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.danar_statsactivity); + + statusView = (TextView) findViewById(R.id.danar_historystatus); + mainView = (TextView) findViewById(R.id.danar_stats_textview); + reloadButton = (Button) findViewById(R.id.danar_historyreload); + llm = new LinearLayoutManager(this); + statusView.setVisibility(View.GONE); + + + reloadButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mExecutionService.isConnected() || mExecutionService.isConnecting()) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.pumpbusy)); + return; + } + mHandler.post(new Runnable() { + @Override + public void run() { + runOnUiThread(new Runnable() { + @Override + public void run() { + reloadButton.setVisibility(View.GONE); + statusView.setVisibility(View.VISIBLE); + } + }); + mExecutionService.loadHistory(RecordTypes.RECORD_TYPE_DAILY); + loadDataFromDB(RecordTypes.RECORD_TYPE_DAILY); + runOnUiThread(new Runnable() { + @Override + public void run() { + reloadButton.setVisibility(View.VISIBLE); + statusView.setVisibility(View.GONE); + } + }); + } + }); + } + }); + loadDataFromDB(RecordTypes.RECORD_TYPE_DAILY); + } + + + private void loadDataFromDB(byte type) { + try { + Dao dao = MainApp.getDbHelper().getDaoDanaRHistory(); + QueryBuilder queryBuilder = dao.queryBuilder(); + queryBuilder.orderBy("recordDate", false); + Where where = queryBuilder.where(); + where.eq("recordCode", type); + queryBuilder.limit(10L); + PreparedQuery preparedQuery = queryBuilder.prepare(); + historyList = dao.query(preparedQuery); + } catch (SQLException e) { + e.printStackTrace(); + historyList = new ArrayList<>(); + } + runOnUiThread(new Runnable() { + @Override + public void run() { + mainView.setText(""); + DateFormat df = new SimpleDateFormat("dd.MM. - "); + + double magicNumber = 18d; + + ProfileInterface pi = ConfigBuilderPlugin.getActiveProfile(); + if (pi instanceof CircadianPercentageProfilePlugin){ + magicNumber = ((CircadianPercentageProfilePlugin)pi).baseBasalSum(); + } + + magicNumber *=2; + + int i = 0; + double sum = 0d; + double weighted03 = 0d; + double weighted05 = 0d; + double weighted07 = 0d; + String avg_string = "\n" + getString(R.string.danar_stats_avg); + String weighted_string = "\n\n" + getString(R.string.danar_stats_expweight); + + for (DanaRHistoryRecord record: historyList) { + double tdd= record.getRecordDailyBolus() + record.getRecordDailyBasal(); + mainView.append(df.format(new Date(record.getRecordDate()))); + mainView.append(getString(R.string.danar_stats_basalrate) + DecimalFormatter.to2Decimal(record.getRecordDailyBasal())); + mainView.append(getString(R.string.danar_stats_bolus) + DecimalFormatter.to2Decimal(record.getRecordDailyBolus())); + mainView.append(getString(R.string.danar_stats_tdi) + DecimalFormatter.to2Decimal(tdd)); + mainView.append(" " + Math.round(100*tdd/magicNumber) +"%"); + mainView.append("\n"); + sum = sum + tdd; + i++; + avg_string = avg_string + "\n " + i +": " + DecimalFormatter.to2Decimal(sum/i) + " " + Math.round(100*sum/i/magicNumber) +"%"; + } + + if (historyList.size()<3 || !(df.format(new Date(historyList.get(0).getRecordDate())).equals(df.format(new Date(System.currentTimeMillis() - 1000*60*60*24))))){ + mainView.setBackgroundColor(Color.RED); + } else { + mainView.setBackgroundColor(Color.TRANSPARENT); + } + + Collections.reverse(historyList); + + i = 0; + for (DanaRHistoryRecord record: historyList) { + double tdd= record.getRecordDailyBolus() + record.getRecordDailyBasal(); + if(i == 0 ) { + weighted03 = tdd; + weighted05 = tdd; + weighted07 = tdd; + + } else { + weighted07 = (weighted07*0.3 + tdd*0.7); + weighted05 = (weighted05*0.5 + tdd*0.5); + weighted03 = (weighted03*0.7 + tdd*0.3); + } + i++; + } + weighted_string = weighted_string + "\n 0.3 " + DecimalFormatter.to2Decimal(weighted03) + " " + Math.round(100*weighted03/magicNumber) +"%"; + weighted_string = weighted_string + "\n 0.5 " + DecimalFormatter.to2Decimal(weighted05) + " " + Math.round(100*weighted05/magicNumber) +"%"; + weighted_string = weighted_string + "\n 0.7 " + DecimalFormatter.to2Decimal(weighted07) + " " + Math.round(100*weighted07/magicNumber) +"%"; + + + mainView.append(avg_string); + mainView.append(weighted_string); + } + }); + } + + + @Subscribe + public void onStatusEvent(final EventDanaRSyncStatus s) { + log.debug("EventDanaRSyncStatus: " + s.message); + runOnUiThread( + new Runnable() { + @Override + public void run() { + statusView.setText(s.message); + } + }); + } + + @Subscribe + public void onStatusEvent(final EventDanaRConnectionStatus c) { + runOnUiThread( + new Runnable() { + @Override + public void run() { + if (c.sStatus == EventDanaRConnectionStatus.CONNECTING) { + statusView.setText(String.format(getString(R.string.danar_history_connectingfor), c.sSecondsElapsed)); + log.debug("EventDanaRConnectionStatus: " + "Connecting for " + c.sSecondsElapsed + "s"); + } else if (c.sStatus == EventDanaRConnectionStatus.CONNECTED) { + statusView.setText(MainApp.sResources.getString(R.string.connected)); + log.debug("EventDanaRConnectionStatus: Connected"); + } else { + statusView.setText(MainApp.sResources.getString(R.string.disconnected)); + log.debug("EventDanaRConnectionStatus: Disconnected"); + } + } + } + ); + } + + +} \ No newline at end of file