Added notification to alert the user if data sharing is not enabled, and provide information on why it is good to enable it.
This commit is contained in:
@@ -26,6 +26,8 @@
|
||||
package uk.org.openseizuredetector;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Color;
|
||||
@@ -81,6 +83,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
final Handler serverStatusHandler = new Handler();
|
||||
Messenger messenger = new Messenger(new ResponseHandler());
|
||||
Timer mUiTimer;
|
||||
private Context mContext;
|
||||
|
||||
/**
|
||||
* Called when the activity is first created.
|
||||
@@ -88,7 +91,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
Log.i(TAG,"onCreate()");
|
||||
Log.i(TAG, "onCreate()");
|
||||
|
||||
// Set our custom uncaught exception handler to report issues.
|
||||
//Thread.setDefaultUncaughtExceptionHandler(new OsdUncaughtExceptionHandler(MainActivity.this));
|
||||
@@ -97,18 +100,19 @@ public class MainActivity extends AppCompatActivity {
|
||||
.build();
|
||||
|
||||
//int i = 5/0; // Force exception to test handler.
|
||||
mUtil = new OsdUtil(getApplicationContext(),serverStatusHandler);
|
||||
mUtil = new OsdUtil(getApplicationContext(), serverStatusHandler);
|
||||
mConnection = new SdServiceConnection(getApplicationContext());
|
||||
mUtil.writeToSysLogFile("");
|
||||
mUtil.writeToSysLogFile("* MainActivity Started *");
|
||||
mUtil.writeToSysLogFile("MainActivity.onCreate()");
|
||||
mContext = this;
|
||||
|
||||
// Initialise the User Interface
|
||||
setContentView(R.layout.main);
|
||||
|
||||
/* Force display of overflow menu - from stackoverflow
|
||||
* "how to force use of..."
|
||||
*/
|
||||
/* Force display of overflow menu - from stackoverflow
|
||||
* "how to force use of..."
|
||||
*/
|
||||
try {
|
||||
Log.v(TAG, "trying menubar fiddle...");
|
||||
ViewConfiguration config = ViewConfiguration.get(this);
|
||||
@@ -135,15 +139,14 @@ public class MainActivity extends AppCompatActivity {
|
||||
Log.v(TAG, "acceptAlarmButton.onClick()");
|
||||
if (mConnection.mBound) {
|
||||
if ((mConnection.mSdServer.mSmsTimer != null)
|
||||
&& (mConnection.mSdServer.mSmsTimer.mTimeLeft > 0 )){
|
||||
&& (mConnection.mSdServer.mSmsTimer.mTimeLeft > 0)) {
|
||||
Log.v(TAG, "acceptAlarmButton.onClick() - Stopping SMS Timer");
|
||||
mUtil.showToast(getString(R.string.SMSAlarmCancelledMsg));
|
||||
mConnection.mSdServer.stopSmsTimer();
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Log.v(TAG, "acceptAlarmButton.onClick() - Accepting Alarm");
|
||||
mConnection.mSdServer.acceptAlarm();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -171,9 +174,9 @@ public class MainActivity extends AppCompatActivity {
|
||||
//builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
|
||||
// @Override
|
||||
// public void onClick(DialogInterface dialog, int which) {
|
||||
if (mConnection.mBound) {
|
||||
mConnection.mSdServer.raiseManualAlarm();
|
||||
}
|
||||
if (mConnection.mBound) {
|
||||
mConnection.mSdServer.raiseManualAlarm();
|
||||
}
|
||||
// dialog.dismiss();
|
||||
// }
|
||||
//});
|
||||
@@ -191,7 +194,42 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
}
|
||||
});
|
||||
// The background service might ask us to show the data sharing dialog if data sharing is not working correctly
|
||||
String actionStr = getIntent().getAction();
|
||||
if (actionStr != null) {
|
||||
Log.i(TAG, "onCreate() - action=" + actionStr);
|
||||
if (actionStr.equals("showDataSharingDialog")) {
|
||||
showDataSharingDialog();
|
||||
}
|
||||
} else {
|
||||
Log.i(TAG, "onCreate - action is null - starting normally");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
String actionStr;
|
||||
Log.i(TAG, "onNewIntent");
|
||||
Bundle extras = intent.getExtras();
|
||||
// The background service might ask us to show the data sharing dialog if data sharing is not working correctly
|
||||
actionStr = getIntent().getAction();
|
||||
if (actionStr != null) {
|
||||
Log.i(TAG, "onNewIntent() - action=" + actionStr);
|
||||
if (actionStr.equals("showDataSharingDialog")) {
|
||||
showDataSharingDialog();
|
||||
}
|
||||
} else {
|
||||
if (extras != null) {
|
||||
actionStr = extras.getString("action");
|
||||
if (actionStr.equals("showDataSharingDialog")) {
|
||||
showDataSharingDialog();
|
||||
}
|
||||
Log.i(TAG, "onNewIntent - extra actionstr is "+actionStr);
|
||||
} else {
|
||||
Log.i(TAG, "onNewIntent - extra actionstr is null - starting normally");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,7 +263,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
mConnection.mSdServer.mSdDataSource.installWatchApp();
|
||||
return true;
|
||||
|
||||
case R.id.action_accept_alarm:
|
||||
case R.id.action_accept_alarm:
|
||||
Log.i(TAG, "action_accept_alarm");
|
||||
if (mConnection.mBound) {
|
||||
mConnection.mSdServer.acceptAlarm();
|
||||
@@ -281,7 +319,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
return true;
|
||||
*/
|
||||
|
||||
case R.id.action_authenticate_api:
|
||||
case R.id.action_authenticate_api:
|
||||
Log.i(TAG, "action_autheticate_api");
|
||||
try {
|
||||
Intent i = new Intent(
|
||||
@@ -292,7 +330,10 @@ public class MainActivity extends AppCompatActivity {
|
||||
Log.i(TAG, "exception starting export activity " + ex.toString());
|
||||
}
|
||||
return true;
|
||||
|
||||
case R.id.action_about_datasharing:
|
||||
Log.i(TAG, "action_about_datasharing");
|
||||
showDataSharingDialog();
|
||||
return true;
|
||||
/*
|
||||
case R.id.action_export:
|
||||
Log.i(TAG, "action_export");
|
||||
@@ -370,7 +411,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
Log.d(TAG,"onStart()");
|
||||
Log.i(TAG, "onStart()");
|
||||
mUtil.writeToSysLogFile("MainActivity.onStart()");
|
||||
SharedPreferences SP = PreferenceManager
|
||||
.getDefaultSharedPreferences(getBaseContext());
|
||||
@@ -386,7 +427,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
mUtil.writeToSysLogFile("MainActivity.onStart - Binding to Server");
|
||||
mUtil.bindToServer(getApplicationContext(), mConnection);
|
||||
} else {
|
||||
Log.i(TAG,"onStart() - Server Not Running");
|
||||
Log.i(TAG, "onStart() - Server Not Running");
|
||||
mUtil.writeToSysLogFile("MainActivity.onStart - Server Not Running");
|
||||
}
|
||||
// start timer to refresh user interface every second.
|
||||
@@ -404,7 +445,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
Log.d(TAG,"onStop() - unbinding from server");
|
||||
Log.i(TAG, "onStop() - unbinding from server");
|
||||
mUtil.writeToSysLogFile("MainActivity.onStop()");
|
||||
mUtil.unbindFromServer(getApplicationContext(), mConnection);
|
||||
mUiTimer.cancel();
|
||||
@@ -465,7 +506,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
tv.setBackgroundColor(okColour);
|
||||
tv.setTextColor(okTextColour);
|
||||
tv = (TextView) findViewById(R.id.serverIpTv);
|
||||
tv.setText(getString(R.string.AccessServerAt)+" http://"
|
||||
tv.setText(getString(R.string.AccessServerAt) + " http://"
|
||||
+ mUtil.getLocalIpAddress()
|
||||
+ ":8080");
|
||||
tv.setBackgroundColor(okColour);
|
||||
@@ -523,8 +564,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
// Pebble Connected Phrase - use for HR if active instead.
|
||||
tv = (TextView) findViewById(R.id.pebbleTv);
|
||||
if (mConnection.mSdServer.mSdData.mHRAlarmActive) {
|
||||
tv.setText(getString(R.string.HR_Equals) + mConnection.mSdServer.mSdData.mHR +" bpm\n"
|
||||
+ "O2 Sat = " + mConnection.mSdServer.mSdData.mO2Sat + "%");
|
||||
tv.setText(getString(R.string.HR_Equals) + mConnection.mSdServer.mSdData.mHR + " bpm\n"
|
||||
+ "O2 Sat = " + mConnection.mSdServer.mSdData.mO2Sat + "%");
|
||||
if (mConnection.mSdServer.mSdData.mHRAlarmStanding || mConnection.mSdServer.mSdData.mO2SatAlarmStanding) {
|
||||
tv.setBackgroundColor(alarmColour);
|
||||
tv.setTextColor(alarmTextColour);
|
||||
@@ -655,9 +696,9 @@ public class MainActivity extends AppCompatActivity {
|
||||
specRatio = 0;
|
||||
|
||||
((TextView) findViewById(R.id.powerTv)).setText(getString(R.string.PowerEquals) + mConnection.mSdServer.mSdData.roiPower +
|
||||
" ("+ getString(R.string.Threshold) + "=" + mConnection.mSdServer.mSdData.alarmThresh + ")");
|
||||
" (" + getString(R.string.Threshold) + "=" + mConnection.mSdServer.mSdData.alarmThresh + ")");
|
||||
((TextView) findViewById(R.id.spectrumTv)).setText(getString(R.string.SpectrumRatioEquals) + specRatio +
|
||||
" ("+ getString(R.string.Threshold) + "=" + mConnection.mSdServer.mSdData.alarmRatioThresh + ")");
|
||||
" (" + getString(R.string.Threshold) + "=" + mConnection.mSdServer.mSdData.alarmRatioThresh + ")");
|
||||
|
||||
ProgressBar pb;
|
||||
Drawable pbDrawable;
|
||||
@@ -712,17 +753,17 @@ public class MainActivity extends AppCompatActivity {
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
tv = (TextView) findViewById(R.id.pebbleTv);
|
||||
tv.setText(getString(R.string.HR_Equals)+" --- bpm\nO2 Sat = --- %");
|
||||
tv.setText(getString(R.string.HR_Equals) + " --- bpm\nO2 Sat = --- %");
|
||||
tv.setBackgroundColor(warnColour);
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
tv = (TextView) findViewById(R.id.appTv);
|
||||
tv.setText(getString(R.string.WatchApp)+" ----");
|
||||
tv.setText(getString(R.string.WatchApp) + " ----");
|
||||
tv.setBackgroundColor(warnColour);
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
tv = (TextView) findViewById(R.id.battTv);
|
||||
tv.setText(getString(R.string.WatchBatteryEquals)+" ---%");
|
||||
tv.setText(getString(R.string.WatchBatteryEquals) + " ---%");
|
||||
tv.setBackgroundColor(warnColour);
|
||||
tv.setTextColor(warnTextColour);
|
||||
}
|
||||
@@ -742,17 +783,17 @@ public class MainActivity extends AppCompatActivity {
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
tv = (TextView) findViewById(R.id.pebbleTv);
|
||||
tv.setText(getString(R.string.HR_Equals)+"---");
|
||||
tv.setText(getString(R.string.HR_Equals) + "---");
|
||||
tv.setBackgroundColor(warnColour);
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
tv = (TextView) findViewById(R.id.appTv);
|
||||
tv.setText(getString(R.string.WatchApp)+" -----");
|
||||
tv.setText(getString(R.string.WatchApp) + " -----");
|
||||
tv.setBackgroundColor(warnColour);
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
tv = (TextView) findViewById(R.id.battTv);
|
||||
tv.setText(getString(R.string.WatchBatteryEquals)+" ---%");
|
||||
tv.setText(getString(R.string.WatchBatteryEquals) + " ---%");
|
||||
tv.setBackgroundColor(warnColour);
|
||||
tv.setTextColor(warnTextColour);
|
||||
|
||||
@@ -774,7 +815,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
&& (mConnection.mSdServer.mSmsTimer.mTimeLeft > 0)) {
|
||||
acceptAlarmButton.setText(getString(R.string.SMSWillBeSentIn) + " " +
|
||||
mConnection.mSdServer.mSmsTimer.mTimeLeft / 1000 +
|
||||
" s - "+getString(R.string.Cancel));
|
||||
" s - " + getString(R.string.Cancel));
|
||||
acceptAlarmButton.setBackgroundColor(alarmColour);
|
||||
acceptAlarmButton.setEnabled(true);
|
||||
} else {
|
||||
@@ -800,7 +841,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
if (mConnection.mBound)
|
||||
if (mConnection.mSdServer.isAudibleCancelled()) {
|
||||
cancelAudibleButton.setText(getString(R.string.AudibleAlarmsCancelledFor)
|
||||
+ " " +mConnection.mSdServer.
|
||||
+ " " + mConnection.mSdServer.
|
||||
cancelAudibleTimeRemaining()
|
||||
+ " sec");
|
||||
cancelAudibleButton.setEnabled(true);
|
||||
@@ -825,17 +866,16 @@ public class MainActivity extends AppCompatActivity {
|
||||
ArrayList<String> xVals = new ArrayList<String>();
|
||||
ArrayList<BarEntry> yBarVals = new ArrayList<BarEntry>();
|
||||
for (int i = 0; i < 10; i++) {
|
||||
xVals.add(i+"-"+(i+1)+" Hz");
|
||||
xVals.add(i + "-" + (i + 1) + " Hz");
|
||||
if (mConnection.mSdServer != null) {
|
||||
yBarVals.add(new BarEntry(mConnection.mSdServer.mSdData.simpleSpec[i], i));
|
||||
}
|
||||
else {
|
||||
yBarVals.add(new BarEntry(i,i));
|
||||
} else {
|
||||
yBarVals.add(new BarEntry(i, i));
|
||||
}
|
||||
}
|
||||
|
||||
// create a dataset and give it a type
|
||||
BarDataSet barDataSet = new BarDataSet(yBarVals,"Spectrum");
|
||||
BarDataSet barDataSet = new BarDataSet(yBarVals, "Spectrum");
|
||||
try {
|
||||
int[] barColours = new int[10];
|
||||
for (int i = 0; i < 10; i++) {
|
||||
@@ -847,20 +887,20 @@ public class MainActivity extends AppCompatActivity {
|
||||
}
|
||||
}
|
||||
barDataSet.setColors(barColours);
|
||||
} catch (NullPointerException e){
|
||||
Log.e(TAG,"Null pointer exception setting bar colours");
|
||||
} catch (NullPointerException e) {
|
||||
Log.e(TAG, "Null pointer exception setting bar colours");
|
||||
}
|
||||
barDataSet.setBarSpacePercent(20f);
|
||||
barDataSet.setBarShadowColor(Color.WHITE);
|
||||
BarData barData = new BarData(xVals,barDataSet);
|
||||
BarData barData = new BarData(xVals, barDataSet);
|
||||
barData.setValueFormatter(new ValueFormatter() {
|
||||
@Override
|
||||
public String getFormattedValue(float v) {
|
||||
DecimalFormat format = new DecimalFormat("####");
|
||||
return format.format(v);
|
||||
}
|
||||
});
|
||||
mChart.setData(barData);
|
||||
@Override
|
||||
public String getFormattedValue(float v) {
|
||||
DecimalFormat format = new DecimalFormat("####");
|
||||
return format.format(v);
|
||||
}
|
||||
});
|
||||
mChart.setData(barData);
|
||||
|
||||
// format the axes
|
||||
XAxis xAxis = mChart.getXAxis();
|
||||
@@ -893,7 +933,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
try {
|
||||
mChart.getLegend().setEnabled(false);
|
||||
} catch (NullPointerException e) {
|
||||
Log.e(TAG,"Null Pointer Exception setting legend");
|
||||
Log.e(TAG, "Null Pointer Exception setting legend");
|
||||
}
|
||||
|
||||
mChart.invalidate();
|
||||
@@ -904,14 +944,14 @@ public class MainActivity extends AppCompatActivity {
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
Log.d(TAG,"onPause()");
|
||||
Log.i(TAG, "onPause()");
|
||||
mUtil.writeToSysLogFile("MainActivity.onPause()");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
Log.d(TAG,"onResume()");
|
||||
Log.i(TAG, "onResume()");
|
||||
mUtil.writeToSysLogFile("MainActivity.onResume()");
|
||||
}
|
||||
|
||||
@@ -924,16 +964,45 @@ public class MainActivity extends AppCompatActivity {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setIcon(R.drawable.icon_24x24);
|
||||
builder.setTitle("OpenSeizureDetector V" + versionName);
|
||||
builder.setPositiveButton("OK", null);
|
||||
builder.setView(aboutView);
|
||||
builder.create();
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void showDataSharingDialog() {
|
||||
mUtil.writeToSysLogFile("MainActivity.showDataSharingDialog()");
|
||||
View aboutView = getLayoutInflater().inflate(R.layout.data_sharing_dialog_layout, null, false);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setIcon(R.drawable.datasharing_fault_24x24);
|
||||
builder.setTitle("OpenSeizureDetector Data Sharing");
|
||||
builder.setNegativeButton(getString(R.string.cancel), null);
|
||||
builder.setPositiveButton(getString(R.string.login), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
Log.i(TAG, "dataSharingDialog.positiveButton.onClick()");
|
||||
try {
|
||||
Intent i = new Intent(
|
||||
MainActivity.this,
|
||||
AuthenticateActivity.class);
|
||||
mContext.startActivity(i);
|
||||
} catch (Exception ex) {
|
||||
Log.i(TAG, "exception starting activity " + ex.toString());
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
builder.setView(aboutView);
|
||||
builder.create();
|
||||
builder.show();
|
||||
}
|
||||
|
||||
|
||||
static class ResponseHandler extends Handler {
|
||||
@Override
|
||||
public void handleMessage(Message message) {
|
||||
Log.i(TAG, "Message=" + message.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -84,11 +84,15 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
private String mUuidStr = "0f675b21-5a36-4fe7-9761-fd0c691651f3"; // UUID to Identify OSD.
|
||||
|
||||
// Notification ID
|
||||
private int NOTIFICATION_ID = 1;
|
||||
private int EVENT_NOTIFICATION_ID = 2;
|
||||
private final int NOTIFICATION_ID = 1;
|
||||
private final int EVENT_NOTIFICATION_ID = 2;
|
||||
private final int DATASHARE_NOTIFICATION_ID = 3;
|
||||
private String mNotChId = "OSD Notification Channel";
|
||||
private CharSequence mNotChName = "OSD Notification Channel";
|
||||
private String mNotChDesc = "OSD Notification Channel Description";
|
||||
private String mEventNotChId = "OSD Event Notification Channel";
|
||||
private CharSequence mEventNotChName = "OSD Event Notification Channel";
|
||||
private String mEventNotChDesc = "OSD Event Notification Channel Description";
|
||||
|
||||
private NotificationManager mNM;
|
||||
private NotificationCompat.Builder mNotificationBuilder;
|
||||
@@ -100,7 +104,7 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
private int mCancelAudiblePeriod = 10; // Cancel Audible Period in minutes
|
||||
private long mCancelAudibleTimeRemaining = 0;
|
||||
private FaultTimer mFaultTimer = null;
|
||||
private CheckUnvalidatedEventsTimer mEventsTimer = null;
|
||||
private CheckEventsTimer mEventsTimer = null;
|
||||
private int mFaultTimerPeriod = 30; // Fault Timer Period in sec
|
||||
private boolean mFaultTimerCompleted = false;
|
||||
|
||||
@@ -132,6 +136,7 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
public boolean mLogDataRemote = false;
|
||||
public boolean mLogDataRemoteMobile = false;
|
||||
private String mAuthToken = null;
|
||||
private long mEventsTimerPeriod = 60; // Number of seconds between checks to see if there are unvalidated remote events.
|
||||
private long mEventDuration = 120; // event duration in seconds - uploads datapoints that cover this time range centred on the event time.
|
||||
public long mDataRetentionPeriod = 1; // Prunes the local db so it only retains data younger than this duration (in days)
|
||||
private long mRemoteLogPeriod = 60; // Period in seconds between uploads to the remote server.
|
||||
@@ -324,7 +329,7 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
}
|
||||
|
||||
if (mLogDataRemote) {
|
||||
startValidatedEventsTimer();
|
||||
startEventsTimer();
|
||||
}
|
||||
|
||||
|
||||
@@ -393,17 +398,17 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
// Stop the Event timer
|
||||
if (mEventsTimer != null) {
|
||||
Log.d(TAG, "onDestroy(): Cancelling events timer");
|
||||
stopValidatedEventsTimer();
|
||||
stopEventsTimer();
|
||||
}
|
||||
|
||||
// Stop the Cancel Alarm Latch timer
|
||||
Log.d(TAG,"onDestroy(): stopping alarm latch timer");
|
||||
Log.d(TAG, "onDestroy(): stopping alarm latch timer");
|
||||
stopLatchTimer();
|
||||
|
||||
|
||||
// Stop the location finder.
|
||||
if (mLocationFinder != null) {
|
||||
Log.d(TAG,"onDestroy(): stopping Location Finder");
|
||||
Log.d(TAG, "onDestroy(): stopping Location Finder");
|
||||
mLocationFinder.destroy();
|
||||
mLocationFinder = null;
|
||||
}
|
||||
@@ -425,6 +430,7 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
mUtil.writeToSysLogFile("SdServer.onDestroy - cancelling notification");
|
||||
mNM.cancel(NOTIFICATION_ID);
|
||||
mNM.cancel(EVENT_NOTIFICATION_ID);
|
||||
mNM.cancel(DATASHARE_NOTIFICATION_ID);
|
||||
|
||||
|
||||
// stop this service.
|
||||
@@ -1513,18 +1519,18 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
/**
|
||||
* Start the events timer.
|
||||
*/
|
||||
public void startValidatedEventsTimer() {
|
||||
public void startEventsTimer() {
|
||||
if (mEventsTimer != null) {
|
||||
Log.v(TAG, "startValidatedEventsTimer(): timer already running - not doing anything.");
|
||||
mUtil.writeToSysLogFile("startValidatedEventsTimer() - timer already running");
|
||||
Log.v(TAG, "startEventsTimer(): timer already running - not doing anything.");
|
||||
mUtil.writeToSysLogFile("startEventsTimer() - timer already running");
|
||||
} else {
|
||||
Log.v(TAG, "startValidatedEventsTimer(): starting timer.");
|
||||
mUtil.writeToSysLogFile("startValidatedEventsTimer() - starting timer");
|
||||
Log.v(TAG, "startEventsTimer(): starting timer.");
|
||||
mUtil.writeToSysLogFile("startEventsTimer() - starting timer");
|
||||
runOnUiThread(new Runnable() {
|
||||
public void run() {
|
||||
mEventsTimer =
|
||||
// Run every 10 sec (convert to ms.)
|
||||
new CheckUnvalidatedEventsTimer(10 * 1000, 1000);
|
||||
new CheckEventsTimer(mEventsTimerPeriod * 1000, 1000);
|
||||
mEventsTimer.mIsRunning = true;
|
||||
mEventsTimer.start();
|
||||
}
|
||||
@@ -1532,7 +1538,7 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
}
|
||||
}
|
||||
|
||||
public void stopValidatedEventsTimer() {
|
||||
public void stopEventsTimer() {
|
||||
if (mEventsTimer != null) {
|
||||
Log.v(TAG, "stopEventsTimer(): timer already running - cancelling it.");
|
||||
mUtil.writeToSysLogFile("stopEventsTimer() - stopping timer, setting mIsRunning to false");
|
||||
@@ -1548,22 +1554,22 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
* Periodically check if we have unvalidated events in the remote database.
|
||||
* Show a notification if we do.
|
||||
*/
|
||||
private class CheckUnvalidatedEventsTimer extends CountDownTimer {
|
||||
private class CheckEventsTimer extends CountDownTimer {
|
||||
long mFirstUnvalidatedEvent;
|
||||
public boolean mIsRunning = true;
|
||||
|
||||
public CheckUnvalidatedEventsTimer(long startTime, long interval) {
|
||||
public CheckEventsTimer(long startTime, long interval) {
|
||||
super(startTime, interval);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFinish() {
|
||||
Log.v(TAG, "CheckUnvalidatedEventsTimer.onFinish()");
|
||||
Log.v(TAG, "CheckEventsTimer.onFinish()");
|
||||
// Retrieve events from remote database
|
||||
if (mLm.mWac.getEvents((JSONObject remoteEventsObj) -> {
|
||||
Log.v(TAG, "CheckUnvalidatedEventsTimer.onFinish.getEvents.Callback()");
|
||||
Log.v(TAG, "CheckEventsTimer.onFinish.getEvents.Callback()");
|
||||
if (remoteEventsObj == null) {
|
||||
Log.e(TAG, "CheckUnvalidatedEventsTimer.onFinish() Callback: Error Retrieving events");
|
||||
Log.e(TAG, "CheckEventsTimer.onFinish() Callback: Error Retrieving events");
|
||||
} else {
|
||||
try {
|
||||
JSONArray eventsArray = remoteEventsObj.getJSONArray("events");
|
||||
@@ -1573,33 +1579,36 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
JSONObject eventObj = eventsArray.getJSONObject(i);
|
||||
Long id = eventObj.getLong("id");
|
||||
String typeStr = eventObj.getString("type");
|
||||
//Log.v(TAG,"CheckUnvalidatedEventsTimer: id="+id+", typeStr="+typeStr);
|
||||
//Log.v(TAG,"CheckEventsTimer: id="+id+", typeStr="+typeStr);
|
||||
if (typeStr.equals("null")) {
|
||||
mFirstUnvalidatedEvent = id;
|
||||
//Log.v(TAG,"CheckUnvalidatedEventsTimer:setting mFirstUnvalidatedEvent to "+mFirstUnvalidatedEvent);
|
||||
//Log.v(TAG,"CheckEventsTimer:setting mFirstUnvalidatedEvent to "+mFirstUnvalidatedEvent);
|
||||
}
|
||||
}
|
||||
Log.v(TAG, "CheckUnvalidatedEventsTimer.onFinish.callback - mFirstUnvalidatedEvent = " +
|
||||
Log.v(TAG, "CheckEventsTimer.onFinish.callback - mFirstUnvalidatedEvent = " +
|
||||
mFirstUnvalidatedEvent);
|
||||
if (mFirstUnvalidatedEvent >= 0) {
|
||||
showEventNotification(mFirstUnvalidatedEvent);
|
||||
mNM.cancel(DATASHARE_NOTIFICATION_ID);
|
||||
} else {
|
||||
mNM.cancel(EVENT_NOTIFICATION_ID);
|
||||
mNM.cancel(DATASHARE_NOTIFICATION_ID);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
Log.e(TAG, "CheckUnvalidatedEventsTimer.onFinish(): Error Parsing remoteEventsObj: " + e.getMessage());
|
||||
Log.e(TAG, "CheckEventsTimer.onFinish(): Error Parsing remoteEventsObj: " + e.getMessage());
|
||||
//mUtil.showToast("Error Parsing remoteEventsObj - this should not happen!!!");
|
||||
}
|
||||
}
|
||||
})) {
|
||||
Log.v(TAG,"CheckUnvalidatedEventsTimer() - requested events");
|
||||
Log.v(TAG, "CheckEventsTimer() - requested events");
|
||||
} else {
|
||||
Log.v(TAG,"CheckUnvalidatedEventsTimer() - Not Logged In");
|
||||
Log.v(TAG, "CheckEventsTimer() - Not Logged In");
|
||||
mNM.cancel(EVENT_NOTIFICATION_ID);
|
||||
showDatashareNotification();
|
||||
}
|
||||
if (mIsRunning) {
|
||||
// Restart this timer.
|
||||
Log.v(TAG,"CheckUnvalidatedEventsTimer.onFinish() - mIsRunning is true, so re-starting timer");
|
||||
Log.v(TAG, "CheckEventsTimer.onFinish() - mIsRunning is true, so re-starting timer");
|
||||
start();
|
||||
}
|
||||
}
|
||||
@@ -1616,31 +1625,97 @@ public class SdServer extends Service implements SdDataReceiver {
|
||||
int iconId;
|
||||
String titleStr;
|
||||
Uri soundUri = null;
|
||||
iconId = R.drawable.star_of_life_query_24x24;
|
||||
|
||||
// Initialise Notification channel for API level 26 and over
|
||||
// from https://stackoverflow.com/questions/44443690/notificationcompat-with-api-26
|
||||
NotificationManager nM = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), mEventNotChId);
|
||||
if (Build.VERSION.SDK_INT >= 26) {
|
||||
NotificationChannel channel = new NotificationChannel(mEventNotChId,
|
||||
mEventNotChName,
|
||||
NotificationManager.IMPORTANCE_DEFAULT);
|
||||
channel.setDescription(mEventNotChDesc);
|
||||
nM.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
iconId = R.drawable.datasharing_query_24x24;
|
||||
titleStr = getString(R.string.unvalidatedEventsTitle);
|
||||
|
||||
Intent i = new Intent(getApplicationContext(), LogManagerControlActivity.class);
|
||||
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
i.setAction("None");
|
||||
PendingIntent contentIntent =
|
||||
PendingIntent.getActivity(getApplicationContext(),
|
||||
0, i, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
String contentStr = getString(R.string.please_confirm_seizure_events);
|
||||
if (mNotificationBuilder != null) {
|
||||
mNotification = mNotificationBuilder.setContentIntent(contentIntent)
|
||||
.setSmallIcon(iconId)
|
||||
.setColor(0x00ffffff)
|
||||
.setAutoCancel(false)
|
||||
.setContentTitle(titleStr)
|
||||
.setContentText(contentStr)
|
||||
.setOnlyAlertOnce(true)
|
||||
.build();
|
||||
mNM.notify(EVENT_NOTIFICATION_ID, mNotification);
|
||||
} else {
|
||||
Log.i(TAG, "showEventNotification() - notification builder is null, so not showing notification.");
|
||||
}
|
||||
|
||||
Notification notification = notificationBuilder.setContentIntent(contentIntent)
|
||||
.setSmallIcon(iconId)
|
||||
.setColor(0x00ffffff)
|
||||
.setAutoCancel(false)
|
||||
.setContentTitle(titleStr)
|
||||
.setContentText(contentStr)
|
||||
.setOnlyAlertOnce(true)
|
||||
.build();
|
||||
nM.notify(EVENT_NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show a notification asking the user to set-up data sharing.
|
||||
*/
|
||||
private void showDatashareNotification() {
|
||||
Log.v(TAG, "showDatashareNotification()");
|
||||
int iconId;
|
||||
String titleStr;
|
||||
Uri soundUri = null;
|
||||
|
||||
// Initialise Notification channel for API level 26 and over
|
||||
// from https://stackoverflow.com/questions/44443690/notificationcompat-with-api-26
|
||||
NotificationManager nM = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext(), mEventNotChId);
|
||||
if (Build.VERSION.SDK_INT >= 26) {
|
||||
NotificationChannel channel = new NotificationChannel(mEventNotChId,
|
||||
mEventNotChName,
|
||||
NotificationManager.IMPORTANCE_DEFAULT);
|
||||
channel.setDescription(mEventNotChDesc);
|
||||
nM.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
iconId = R.drawable.datasharing_fault_24x24;
|
||||
titleStr = getString(R.string.datasharing_notification_title);
|
||||
|
||||
Intent i = new Intent(getApplicationContext(), MainActivity.class);
|
||||
i.putExtra("action", "showDataSharingDialog");
|
||||
i.setAction("showDataSharingDialog");
|
||||
i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
||||
PendingIntent contentIntent =
|
||||
PendingIntent.getActivity(getApplicationContext(),
|
||||
0, i, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
Intent loginIntent = new Intent(getApplicationContext(), AuthenticateActivity.class);
|
||||
loginIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
PendingIntent loginPendingIntent =
|
||||
PendingIntent.getActivity(getApplicationContext(),
|
||||
0, loginIntent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
|
||||
String contentStr = getString(R.string.datasharing_notification_text);
|
||||
Notification notification = notificationBuilder
|
||||
.setContentIntent(contentIntent)
|
||||
.setSmallIcon(iconId)
|
||||
.setColor(0x00ffffff)
|
||||
.setAutoCancel(false)
|
||||
.setContentTitle(titleStr)
|
||||
.setContentText(contentStr)
|
||||
.setOnlyAlertOnce(true)
|
||||
.addAction(R.drawable.common_google_signin_btn_icon_dark, getString(R.string.login), loginPendingIntent)
|
||||
.setPriority(0)
|
||||
.build();
|
||||
nM.notify(DATASHARE_NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user