package com.eveningoutpost.dexdrip;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Paint;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
import com.eveningoutpost.dexdrip.Models.ActiveBluetoothDevice;
import com.eveningoutpost.dexdrip.Models.BgReading;
import com.eveningoutpost.dexdrip.Models.Calibration;
import com.eveningoutpost.dexdrip.Services.WixelReader;
import com.eveningoutpost.dexdrip.UtilityModels.BgGraphBuilder;
import com.eveningoutpost.dexdrip.UtilityModels.CollectionServiceStarter;
import com.eveningoutpost.dexdrip.UtilityModels.Intents;
import com.eveningoutpost.dexdrip.UtilityModels.Notifications;
import com.eveningoutpost.dexdrip.utils.DatabaseUtil;
import com.eveningoutpost.dexdrip.utils.ShareNotification;
import java.io.File;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.List;
import lecho.lib.hellocharts.ViewportChangeListener;
import lecho.lib.hellocharts.gesture.ZoomType;
import lecho.lib.hellocharts.model.Viewport;
import lecho.lib.hellocharts.view.LineChartView;
import lecho.lib.hellocharts.view.PreviewLineChartView;
public class Home extends Activity implements NavigationDrawerFragment.NavigationDrawerCallbacks {
private String menu_name = "xDrip";
private NavigationDrawerFragment mNavigationDrawerFragment;
private LineChartView chart;
private PreviewLineChartView previewChart;
SharedPreferences prefs;
Viewport tempViewport = new Viewport();
Viewport holdViewport = new Viewport();
public float left;
public float right;
public float top;
public float bottom;
public boolean updateStuff;
public boolean updatingPreviewViewport = false;
public boolean updatingChartViewport = false;
boolean isBTWixel;
boolean isBTShare;
boolean isWifiWixel;
public BgGraphBuilder bgGraphBuilder;
BroadcastReceiver _broadcastReceiver;
BroadcastReceiver newDataReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CollectionServiceStarter collectionServiceStarter = new CollectionServiceStarter(getApplicationContext());
collectionServiceStarter.start(getApplicationContext());
PreferenceManager.setDefaultValues(this, R.xml.pref_notifications, false);
PreferenceManager.setDefaultValues(this, R.xml.pref_data_source, false);
prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
checkEula();
setContentView(R.layout.activity_home);
}
public void checkEula() {
boolean IUnderstand = prefs.getBoolean("I_understand", false);
if (!IUnderstand) {
Intent intent = new Intent(getApplicationContext(), LicenseAgreementActivity.class);
startActivity(intent);
finish();
}
}
@Override
protected void onResume(){
super.onResume();
checkEula();
_broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent intent) {
if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) {
updateCurrentBgInfo();
}
}
};
newDataReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context ctx, Intent intent) {
holdViewport.set(0, 0, 0, 0);
setupCharts();
updateCurrentBgInfo();
}
};
registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
registerReceiver(newDataReceiver, new IntentFilter(Intents.ACTION_NEW_BG_ESTIMATE_NO_DATA));
mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.navigation_drawer);
mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), menu_name, this);
holdViewport.set(0, 0, 0, 0);
setupCharts();
updateCurrentBgInfo();
}
public void setupCharts() {
bgGraphBuilder = new BgGraphBuilder(this);
updateStuff = false;
chart = (LineChartView) findViewById(R.id.chart);
chart.setZoomType(ZoomType.HORIZONTAL);
previewChart = (PreviewLineChartView) findViewById(R.id.chart_preview);
previewChart.setZoomType(ZoomType.HORIZONTAL);
chart.setLineChartData(bgGraphBuilder.lineData());
previewChart.setLineChartData(bgGraphBuilder.previewLineData());
updateStuff = true;
previewChart.setViewportCalculationEnabled(true);
chart.setViewportCalculationEnabled(true);
previewChart.setViewportChangeListener(new ViewportListener());
chart.setViewportChangeListener(new ChartViewPortListener());
setViewport();
}
private class ChartViewPortListener implements ViewportChangeListener {
@Override
public void onViewportChanged(Viewport newViewport) {
if (!updatingPreviewViewport) {
updatingChartViewport = true;
previewChart.setZoomType(ZoomType.HORIZONTAL);
previewChart.setCurrentViewport(newViewport, false);
updatingChartViewport = false;
}
}
}
private class ViewportListener implements ViewportChangeListener {
@Override
public void onViewportChanged(Viewport newViewport) {
if (!updatingChartViewport) {
updatingPreviewViewport = true;
chart.setZoomType(ZoomType.HORIZONTAL);
chart.setCurrentViewport(newViewport, false);
tempViewport = newViewport;
updatingPreviewViewport = false;
}
if (updateStuff == true) {
holdViewport.set(newViewport.left, newViewport.top, newViewport.right, newViewport.bottom);
}
}
}
@Override
public void onNavigationDrawerItemSelected(int position) {
mNavigationDrawerFragment.swapContext(position);
}
public void setViewport() {
if (tempViewport.left == 0.0 || holdViewport.left == 0.0 || holdViewport.right >= (new Date().getTime())) {
previewChart.setCurrentViewport(bgGraphBuilder.advanceViewport(chart, previewChart), false);
} else {
previewChart.setCurrentViewport(holdViewport, false);
}
}
@Override
public void onPause() {
super.onPause();
if (_broadcastReceiver != null) {
unregisterReceiver(_broadcastReceiver);
}
if(newDataReceiver != null) {
unregisterReceiver(newDataReceiver);
}
}
public void updateCurrentBgInfo() {
final TextView currentBgValueText = (TextView) findViewById(R.id.currentBgValueRealTime);
final TextView notificationText = (TextView)findViewById(R.id.notices);
notificationText.setText("");
isBTWixel = CollectionServiceStarter.isBTWixel(getApplicationContext());
isBTShare = CollectionServiceStarter.isBTShare(getApplicationContext());
isWifiWixel = CollectionServiceStarter.isWifiWixel(getApplicationContext());
if(isBTShare) {
if((android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)) {
notificationText.setText("Unfortunately your android version does not support Bluetooth Low Energy");
} else {
String receiverSn = prefs.getString("share_key", "SM00000000").toUpperCase();
if (receiverSn.compareTo("SM00000000") == 0 || receiverSn.length() == 0) {
notificationText.setText("Please set your Dex Receiver Serial Number in App Settings");
} else {
if (receiverSn.length() < 10) {
notificationText.setText("Double Check Dex Receiver Serial Number, should be 10 characters, don't forget the letters");
} else {
if (ActiveBluetoothDevice.first() == null) {
notificationText.setText("Now pair with your Dexcom Share");
} else {
if (!Sensor.isActive()) {
notificationText.setText("Now choose start your sensor in your settings");
} else {
displayCurrentInfo();
}
}
}
}
}
}
if(isBTWixel) {
if ((android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2)) {
notificationText.setText("Unfortunately your android version does not support Bluetooth Low Energy");
} else {
if (ActiveBluetoothDevice.first() == null) {
notificationText.setText("First pair with your BT device!");
} else {
if (Sensor.isActive() && (Sensor.currentSensor().started_at + (60000 * 60 * 2)) < new Date().getTime()) {
if (BgReading.latest(2).size() > 1) {
List<Calibration> calibrations = Calibration.latest(2);
if (calibrations.size() > 1) {
if (calibrations.get(0).possible_bad != null && calibrations.get(0).possible_bad == true && calibrations.get(1).possible_bad != null && calibrations.get(1).possible_bad != true) {
notificationText.setText("Possible bad calibration slope, please have a glass of water, wash hands, then recalibrate in a few!");
}
displayCurrentInfo();
} else {
notificationText.setText("Please enter two calibrations to get started!");
}
} else {
if(BgReading.latestUnCalculated(2).size() < 2) {
notificationText.setText("Please wait, need 2 readings from transmitter first.");
} else {
List<Calibration> calibrations = Calibration.latest(2);
if (calibrations.size() < 2) {
notificationText.setText("Please enter two calibrations to get started!");
}
}
}
} else if (Sensor.isActive() && ((Sensor.currentSensor().started_at + (60000 * 60 * 2))) >= new Date().getTime()) {
double waitTime = ((Sensor.currentSensor().started_at + (60000 * 60 * 2)) - (new Date().getTime())) / (60000);
notificationText.setText("Please wait while sensor warms up! (" + String.format("%.2f", waitTime) + " minutes)");
} else {
notificationText.setText("Now start your sensor");
}
}
}
}
if(isWifiWixel) {
if (!WixelReader.IsConfigured(getApplicationContext())) {
notificationText.setText("First configure your wifi wixel reader ip addresses");
} else {
if (Sensor.isActive() && (Sensor.currentSensor().started_at + (60000 * 60 * 2)) < new Date().getTime()) {
if (BgReading.latest(2).size() > 1) {
List<Calibration> calibrations = Calibration.latest(2);
if (calibrations.size() > 1) {
if (calibrations.get(0).possible_bad != null && calibrations.get(0).possible_bad == true && calibrations.get(1).possible_bad != null && calibrations.get(1).possible_bad != true) {
notificationText.setText("Possible bad calibration slope, please have a glass of water, wash hands, then recalibrate in a few!");
}
displayCurrentInfo();
} else {
notificationText.setText("Please enter two calibrations to get started!");
}
} else {
notificationText.setText("Please wait, need 2 readings from transmitter first.");
}
} else if (Sensor.isActive() && ((Sensor.currentSensor().started_at + (60000 * 60 * 2))) >= new Date().getTime()) {
double waitTime = ((Sensor.currentSensor().started_at + (60000 * 60 * 2)) - (new Date().getTime())) / (60000);
notificationText.setText("Please wait while sensor warms up! (" + String.format("%.2f", waitTime) + " minutes)");
} else {
notificationText.setText("Now start your sensor");
}
}
}
mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.navigation_drawer);
mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), menu_name, this);
}
public void displayCurrentInfo() {
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(0);
final TextView currentBgValueText = (TextView)findViewById(R.id.currentBgValueRealTime);
final TextView notificationText = (TextView)findViewById(R.id.notices);
if ((currentBgValueText.getPaintFlags() & Paint.STRIKE_THRU_TEXT_FLAG) > 0) {
currentBgValueText.setPaintFlags(currentBgValueText.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
}
BgReading lastBgreading = BgReading.lastNoSenssor();
boolean predictive = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("predictive_bg", false);
if(isBTShare) { predictive = false; }
if (lastBgreading != null) {
double estimate = 0;
if ((new Date().getTime()) - (60000 * 11) - lastBgreading.timestamp > 0) {
notificationText.setText("Signal Missed");
if(!predictive){
estimate=lastBgreading.calculated_value;
} else {
estimate = BgReading.estimated_bg(lastBgreading.timestamp + (6000 * 7));
}
currentBgValueText.setText(bgGraphBuilder.unitized_string(estimate));
currentBgValueText.setPaintFlags(currentBgValueText.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
if(!predictive){
estimate=lastBgreading.calculated_value;
String stringEstimate = bgGraphBuilder.unitized_string(estimate);
String slope_arrow = BgReading.slopeArrow((lastBgreading.calculated_value_slope * 60000));
if(lastBgreading.hide_slope) {
slope_arrow = "";
}
currentBgValueText.setText( stringEstimate + " " + slope_arrow);
} else {
estimate = BgReading.activePrediction();
String stringEstimate = bgGraphBuilder.unitized_string(estimate);
currentBgValueText.setText( stringEstimate + " " + BgReading.slopeArrow());
}
}
if(bgGraphBuilder.unitized(estimate) <= bgGraphBuilder.lowMark) {
currentBgValueText.setTextColor(Color.parseColor("#C30909"));
} else if(bgGraphBuilder.unitized(estimate) >= bgGraphBuilder.highMark) {
currentBgValueText.setTextColor(Color.parseColor("#FFBB33"));
} else {
currentBgValueText.setTextColor(Color.WHITE);
}
}
setupCharts();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_home, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_export_database) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
return DatabaseUtil.saveSql(getBaseContext());
}
@Override
protected void onPostExecute(String filename) {
super.onPostExecute(filename);
final Context ctx = getApplicationContext();
Toast.makeText(ctx, "Export stored at " + filename, Toast.LENGTH_SHORT).show();
final NotificationCompat.Builder n = new NotificationCompat.Builder(ctx);
n.setContentTitle("Export complete");
n.setContentText("Ready to be sent.");
n.setAutoCancel(true);
n.setSmallIcon(R.drawable.ic_action_communication_invert_colors_on);
ShareNotification.viewOrShare("application/octet-stream", Uri.fromFile(new File(filename)), n, ctx);
final NotificationManager manager = (NotificationManager) ctx.getSystemService(Service.NOTIFICATION_SERVICE);
manager.notify(Notifications.exportCompleteNotificationId, n.build());
}
}.execute();
return true;
}
return super.onOptionsItemSelected(item);
}
}