Converted all localDB select queries to async tasks

This commit is contained in:
Graham Jones
2022-01-21 22:34:55 +00:00
parent 40251112b6
commit 8c7cd852bb
3 changed files with 207 additions and 217 deletions

View File

@@ -295,7 +295,7 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
* @param statusVal * @param statusVal
* @return true on success or false on failure * @return true on success or false on failure
*/ */
public boolean setDatapointStatus(int id, int statusVal) { public boolean setDatapointStatus(Long id, int statusVal) {
Log.d(TAG, "setDatapointStatus() - id=" + id + ", statusVal=" + statusVal); Log.d(TAG, "setDatapointStatus() - id=" + id + ", statusVal=" + statusVal);
Cursor c = null; Cursor c = null;
ContentValues cv = new ContentValues(); ContentValues cv = new ContentValues();
@@ -309,36 +309,27 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
/** /**
* getDatapointsJSON() Returns a JSON Object of all of the datapoints in the local database * Return a JSON string representing all the datapoints between startDate and endDate
* between endDateStr-duration and endDateStr
* *
* @param endDateStr String representation of the period end date * @return True on successful start or false if call fails.
* @param duration Duration in minutes.
* @return JSONObject of all the datapoints in the range.
*/ */
public String getDatapointsbyDate(String startDateStr, String endDateStr) { public boolean getDatapointsByDate(String startDateStr, String endDateStr, Consumer<String> callback) {
Log.d(TAG, "getDatapointsbyDate() - startDateStr=" + startDateStr + ", endDateStr=" + endDateStr); Log.d(TAG, "getDatapointsbyDate() - startDateStr=" + startDateStr + ", endDateStr=" + endDateStr);
Cursor c = null; String[] columns = {"*"};
String retVal; String whereClause = "DataTime>? AND DataTime<?";
try { String[] whereArgs = {startDateStr, endDateStr};
//String selectStr = "DataTime>=? and DataTime<=?"; new SelectQueryTask(mDbTableName, columns, whereClause, whereArgs,
//String[] selectArgs = {startDateStr, endDateStr}; null, null, "dataTime DESC", (Cursor cursor) -> {
//c = mOSDDb.getWritableDatabase().query(mDbTableName, null, Log.v(TAG, "getDataPointsByDate - returned " + cursor);
// null, null, null, null, null); if (cursor != null) {
c = mOSDDb.getWritableDatabase().rawQuery( callback.accept(cursor2Json(cursor));
"Select * from " + mDbTableName } else {
+ " where dataTime>= '" + startDateStr callback.accept(null);
+ "' and dataTime<= '" + endDateStr + "'",
null);
retVal = cursor2Json(c);
} catch (Exception e) {
Log.d(TAG, "Error selecting datapoints" + e.toString());
retVal = null;
} }
return (retVal); }).execute();
return (true);
} }
//Consumer<JSONObject> callback
/** /**
* Return an array list of objects representing the events in the database by calling the specified callback function. * Return an array list of objects representing the events in the database by calling the specified callback function.
@@ -350,17 +341,8 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
Log.v(TAG, "getEventsList - includeWarnings=" + includeWarnings); Log.v(TAG, "getEventsList - includeWarnings=" + includeWarnings);
ArrayList<HashMap<String, String>> eventsList = new ArrayList<>(); ArrayList<HashMap<String, String>> eventsList = new ArrayList<>();
String[] whereArgs; String[] whereArgs = getEventWhereArgs(includeWarnings);
String whereClause; String whereClause = getEventWhereClause(includeWarnings);
if (includeWarnings) {
String[] whereArgsWarnings = { "1", "2", "3", "5"};
whereClause = "Status in (?, ?, ?, ?)";
whereArgs = whereArgsWarnings;
} else {
whereClause = "Status in (?, ?, ?)";
String[] whereArgsNoWarnings = { "2", "3", "5"};
whereArgs = whereArgsNoWarnings;
}
//sqlStr = "SELECT * from " + mDbTableName + " where Status in (" + statusListStr + ") order by dataTime desc;"; //sqlStr = "SELECT * from " + mDbTableName + " where Status in (" + statusListStr + ") order by dataTime desc;";
String[] columns = {"*"}; String[] columns = {"*"};
new SelectQueryTask(mDbTableName, columns, whereClause, whereArgs, new SelectQueryTask(mDbTableName, columns, whereClause, whereArgs,
@@ -368,7 +350,7 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
Log.v(TAG, "getEventsList - returned " + cursor); Log.v(TAG, "getEventsList - returned " + cursor);
if (cursor != null) { if (cursor != null) {
Log.v(TAG, "getEventsList - returned " + cursor.getCount() + " records"); Log.v(TAG, "getEventsList - returned " + cursor.getCount() + " records");
while (cursor.moveToNext()) { while (!cursor.isAfterLast()) {
HashMap<String, String> event = new HashMap<>(); HashMap<String, String> event = new HashMap<>();
//event.put("id", cursor.getString(cursor.getColumnIndex("id"))); //event.put("id", cursor.getString(cursor.getColumnIndex("id")));
event.put("dataTime", cursor.getString(cursor.getColumnIndex("dataTime"))); event.put("dataTime", cursor.getString(cursor.getColumnIndex("dataTime")));
@@ -378,6 +360,7 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
event.put("uploaded", cursor.getString(cursor.getColumnIndex("uploaded"))); event.put("uploaded", cursor.getString(cursor.getColumnIndex("uploaded")));
//event.put("dataJSON", cursor.getString(cursor.getColumnIndex("dataJSON"))); //event.put("dataJSON", cursor.getString(cursor.getColumnIndex("dataJSON")));
eventsList.add(event); eventsList.add(event);
cursor.moveToNext();
} }
} }
callback.accept(eventsList); callback.accept(eventsList);
@@ -412,154 +395,135 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
} }
public boolean getNextEventToUpload(Consumer<Long> callback) {
Log.v(TAG, "getNextEventToUpload");
// Based on https://stackoverflow.com/questions/24827312/is-a-good-practice-create-anonymous-asynctask-for-parallel-small-known-freeze-pr
new AsyncTask<Void, Void, Long>() {
@Override
protected Long doInBackground(Void... params) {
Log.v(TAG, "getEventsNextEventToUpload.doInBackground");
Long eventId;
eventId = _getNextEventToUpload(false);
if (eventId == -1) {
eventId = _getNextEventToUpload(true);
}
return (eventId);
}
@Override
protected void onPostExecute(final Long result) {
callback.accept(result);
}
}.execute();
return (true);
}
/** /**
* Return the ID of the next event (alarm, warning, fall etc that needs to be uploaded (alarm or warning condition and has not yet been uploaded. * Return the ID of the next event (alarm, warning, fall etc that needs to be uploaded (alarm or warning condition and has not yet been uploaded.
*
* @param includeWarnings - whether to include warnings in the list of events, or just alarm conditions.
* @return True on successful start or false if call fails.
*/ */
public Long _getNextEventToUpload(boolean includeWarnings) { public boolean getNextEventToUpload(boolean includeWarnings, Consumer<Long> callback) {
Log.v(TAG, "getNextEventToUpload(" + includeWarnings + ")"); Log.v(TAG, "getNextEventToUpload - includeWarnings=" + includeWarnings);
Time tnow = new Time(Time.getCurrentTimezone());
tnow.setToNow();
String dateStr = tnow.format("%Y-%m-%d");
String SQLStr = "SQLStr";
String statusListStr;
String recordStr;
Long recordId;
if (includeWarnings) { String[] whereArgsStatus = getEventWhereArgs(includeWarnings);
statusListStr = "1,2,3,5"; // Warning, Alarm, Fall, Manual Alarm String whereClauseStatus = getEventWhereClause(includeWarnings);
} else { String[] columns = {"*"};
statusListStr = "2,3,5"; // Alarm, Fall, Manual Alarm
}
// Do not try to upload very recent events so that we have chance to record the post-event data before uploading it. // Do not try to upload very recent events so that we have chance to record the post-event data before uploading it.
long currentDateMillis = new Date().getTime(); long currentDateMillis = new Date().getTime();
long endDateMillis = currentDateMillis - 1000 * mEventDuration; long endDateMillis = currentDateMillis - 1000 * mEventDuration;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String endDateStr = dateFormat.format(new Date(endDateMillis)); String endDateStr = dateFormat.format(new Date(endDateMillis));
try { String whereClauseUploaded = "uploaded = false";
SQLStr = "SELECT * from " + mDbTableName + " where uploaded=false and Status in (" + statusListStr + ") and DataTime<'" + endDateStr + "';"; String whereClauseDate = "DataTime<?";
Cursor resultSet = mOSDDb.getWritableDatabase().rawQuery(SQLStr, null); String whereClause = whereClauseStatus + " AND " + whereClauseUploaded + " AND " + whereClauseDate;
resultSet.moveToFirst();
if (resultSet.getCount() == 0) { String[] whereArgs = new String[ whereArgsStatus.length + 1];
for (int i = 0; i<whereArgsStatus.length; i++) {
whereArgs[i] = whereArgsStatus[i];
}
whereArgs[whereArgsStatus.length] = endDateStr;
new SelectQueryTask(mDbTableName, columns, whereClause, whereArgs,
null, null, "dataTime DESC", (Cursor cursor) -> {
Log.v(TAG, "getEventsList - returned " + cursor);
Long recordId = new Long(-1);
if (cursor != null) {
Log.v(TAG, "getNextEventToUpload - returned " + cursor.getCount() + " records");
cursor.moveToFirst();
if (cursor.getCount() == 0) {
Log.v(TAG, "getNextEventToUpload() - no events to Upload - exiting"); Log.v(TAG, "getNextEventToUpload() - no events to Upload - exiting");
recordId = new Long(-1); recordId = new Long(-1);
} else { } else {
recordStr = resultSet.getString(3); String recordStr = cursor.getString(3);
recordId = resultSet.getLong(0); recordId = cursor.getLong(0);
Log.d(TAG, "getNextEventToUpload(): id=" + recordId + ", recordStr=" + recordStr); Log.d(TAG, "getNextEventToUpload(): id=" + recordId + ", recordStr=" + recordStr);
} }
} catch (SQLException e) {
Log.e(TAG, "getNextEventToUpload(): Error selecting Data: " + e.toString());
Log.e(TAG, "SQLStr was " + SQLStr);
recordStr = "ERROR";
recordId = new Long(-1);
} }
return (recordId); callback.accept(recordId);
}).execute();
return (true);
} }
/** /**
* Return the ID of the datapoint that is closest to date/time string dateStr * Return the ID of the datapoint that is closest to date/time string dateStr
* Based on https://stackoverflow.com/questions/45749046/sql-get-nearest-date-record * Based on https://stackoverflow.com/questions/45749046/sql-get-nearest-date-record
*
* @return True on successful start or false if call fails.
*/ */
public int getNearestDatapointToDate(String dateStr) { public boolean getNearestDatapointToDate(String dateStr, Consumer<Long> callback) {
Log.v(TAG, "getNearestDatapointToDate()"); Log.v(TAG, "getNextEventToDate - dateStr=" + dateStr);
String SQLStr = "SQLStr"; String[] columns = {"*","(julianday(dataTime)-julianday(datetime('" + dateStr + "'))) as ddiff"};
//String recordStr; //SQLStr = "SELECT *, (julianday(dataTime)-julianday(datetime('" + dateStr + "'))) as ddiff from " + mDbTableName + " order by ABS(ddiff) asc;";
int recordId; String orderByStr = "ABS(ddiff) asc";
new SelectQueryTask(mDbTableName, columns, null, null,
try { null, null, orderByStr, (Cursor cursor) -> {
SQLStr = "SELECT *, (julianday(dataTime)-julianday(datetime('" + dateStr + "'))) as ddiff from " + mDbTableName + " order by ABS(ddiff) asc;"; Log.v(TAG, "getEventsNearestDatapointToDate - returned " + cursor);
//SQLStr = "SELECT * from "+ mDbTableName + " ;"; Long recordId = new Long(-1);
Cursor resultSet = mOSDDb.getWritableDatabase().rawQuery(SQLStr, null); if (cursor != null) {
resultSet.moveToFirst(); Log.v(TAG, "getNearestDatapointToDate - returned " + cursor.getCount() + " records");
if (resultSet.getCount() == 0) { cursor.moveToFirst();
Log.v(TAG, "getNearestDatapointToDate() - no datapoints found - exiting"); if (cursor.getCount() == 0) {
recordId = -1; Log.v(TAG, "getNearestDatapointToDate() - no events to Upload - exiting");
recordId = new Long(-1);
} else { } else {
recordId = resultSet.getInt(0); String recordStr = cursor.getString(3);
//resultSet.moveToFirst(); recordId = cursor.getLong(0);
//recordStr = cursor2Json(resultSet); //getDatapointById(recordId); Log.d(TAG, "getNearestDatapointToDate(): id=" + recordId + ", recordStr=" + recordStr);
Log.d(TAG, "getNearestDatapointToDate(): id=" + recordId + ", count=" + resultSet.getCount());
} }
} catch (SQLException e) {
Log.e(TAG, "getNearestDatapointToDate(): Error selecting Data: " + e.toString());
Log.e(TAG, "SQLStr was " + SQLStr);
//recordStr = "ERROR";
recordId = -1;
} }
return (recordId); callback.accept(recordId);
}).execute();
return (true);
} }
/** /**
* Return the number of events stored in the local database * Return the number of events stored in the local database (via a callback).
*
* @param includeWarnings - whether to include warnings in the list of events, or just alarm conditions.
* @return True on successful start or false if call fails.
*/ */
public int getLocalEventsCount(boolean includeWarnings) { public boolean getLocalEventsCount(boolean includeWarnings, Consumer<Long> callback) {
//Log.v(TAG, "getLocalEventsCount()"); Log.v(TAG, "getLocalEventsCount- includeWarnings=" + includeWarnings);
String SQLStr = "SQLStr"; String[] whereArgs = getEventWhereArgs(includeWarnings);
String statusListStr; String whereClause = getEventWhereClause(includeWarnings);
String[] columns = {"*"};
if (includeWarnings) { new SelectQueryTask(mDbTableName, columns, whereClause, whereArgs,
statusListStr = "1,2,3,5"; // Warning, Alarm, Fall, Manual Alarm null, null, null, (Cursor cursor) -> {
} else { Log.v(TAG, "getLocalEventsCount - returned " + cursor);
statusListStr = "2,3,5"; // Alarm, Fall, Manual Alarm Long eventCount = Long.valueOf(0);
} if (cursor != null) {
try { eventCount = Long.valueOf(cursor.getCount());
SQLStr = "SELECT * from " + mDbTableName + " where Status in (" + statusListStr + ");"; Log.v(TAG, "getLocalEventsCount - returned " + eventCount + " records");
Cursor resultSet = mOSDDb.getWritableDatabase().rawQuery(SQLStr, null);
resultSet.moveToFirst();
return (resultSet.getCount());
} catch (SQLException e) {
Log.e(TAG, "getLocalEventsCount(): Error selecting Data: " + e.toString());
Log.e(TAG, "SQLStr was " + SQLStr);
return (0);
} }
callback.accept(eventCount);
}).execute();
return (true);
} }
/** /**
* Return the number of datapoints stored in the local database * Return the number of datapoints stored in the local database (via a callback).
*
* @return True on successful start or false if call fails.
*/ */
public int getLocalDatapointsCount() { public boolean getLocalDatapointsCount(Consumer<Long> callback) {
//Log.v(TAG, "getLocalDatapointsCount()"); Log.v(TAG, "getLocalDatapointsCount");
String SQLStr = "SQLStr"; String[] whereArgs = null;
String statusListStr; String whereClause = null;
String[] columns = {"*"};
new SelectQueryTask(mDbTableName, columns, whereClause, whereArgs,
null, null, null, (Cursor cursor) -> {
Log.v(TAG, "getLocalDatapointsCount - returned " + cursor);
Long eventCount = Long.valueOf(0);
if (cursor != null) {
eventCount = Long.valueOf(cursor.getCount());
Log.v(TAG, "getLocalDatapointsCount - returned " + eventCount + " records");
}
callback.accept(eventCount);
}).execute();
return (true);
}
try {
SQLStr = "SELECT * from " + mDbTableName + ";";
Cursor resultSet = mOSDDb.getWritableDatabase().rawQuery(SQLStr, null);
resultSet.moveToFirst();
return (resultSet.getCount());
} catch (SQLException e) {
Log.e(TAG, "getLocalDatapointsCount(): Error selecting Data: " + e.toString());
Log.e(TAG, "SQLStr was " + SQLStr);
return (0);
}
}
/** /**
* Executes the sqlite query (=SELECT statement) * Executes the sqlite query (=SELECT statement)
@@ -630,6 +594,31 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
} }
private String getEventWhereClause(boolean includeWarnings) {
String whereClause;
if (includeWarnings) {
whereClause = "Status in (?, ?, ?, ?)";
} else {
whereClause = "Status in (?, ?, ?)";
}
return(whereClause);
}
private String[] getEventWhereArgs(boolean includeWarnings) {
String[] whereArgs;
if (includeWarnings) {
String[] whereArgsWarnings = { "1", "2", "3", "5"};
whereArgs = whereArgsWarnings;
} else {
String[] whereArgsNoWarnings = { "2", "3", "5"};
whereArgs = whereArgsNoWarnings;
}
return(whereArgs);
}
/*************************************************************************************** /***************************************************************************************
* Remote Database Part * Remote Database Part
*/ */
@@ -673,7 +662,7 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
//int eventId = -1; //int eventId = -1;
Log.v(TAG, "uploadSdData()"); Log.v(TAG, "uploadSdData()");
// First try uploading full alarms, and only if we do not have any of those, upload warnings. // First try uploading full alarms, and only if we do not have any of those, upload warnings.
getNextEventToUpload((Long eventId) -> { getNextEventToUpload(true, (Long eventId) -> {
if (eventId != -1) { if (eventId != -1) {
Log.v(TAG, "uploadSdData() - eventId=" + eventId); Log.v(TAG, "uploadSdData() - eventId=" + eventId);
String eventJsonStr = getDatapointById(eventId); String eventJsonStr = getDatapointById(eventId);
@@ -757,11 +746,10 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
long endDateMillis = eventDateMillis + 1000 * mEventDuration / 2; long endDateMillis = eventDateMillis + 1000 * mEventDuration / 2;
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String datapointsJsonStr = getDatapointsbyDate( getDatapointsByDate(
dateFormat.format(new Date(startDateMillis)), dateFormat.format(new Date(startDateMillis)),
dateFormat.format(new Date(endDateMillis))); dateFormat.format(new Date(endDateMillis)), (String datapointsJsonStr) -> {
Log.v(TAG, "eventCallback() - datapointsJsonStr=" + datapointsJsonStr); Log.v(TAG, "eventCallback() - datapointsJsonStr=" + datapointsJsonStr);
JSONArray dataObj; JSONArray dataObj;
mDatapointsToUploadList = new ArrayList<JSONObject>(); mDatapointsToUploadList = new ArrayList<JSONObject>();
try { try {
@@ -770,9 +758,6 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
for (int i = 0; i < dataObj.length(); i++) { for (int i = 0; i < dataObj.length(); i++) {
mDatapointsToUploadList.add(dataObj.getJSONObject(i)); mDatapointsToUploadList.add(dataObj.getJSONObject(i));
} }
//dataObj.put("dataTime", dateFormat.format(new Date()));
//Log.v(TAG, "eventCallback(): Creating Datapoint...SdData="+dataObj.toString());
//mWac.createDatapoint(dataObj,eventId);
} catch (JSONException e) { } catch (JSONException e) {
Log.v(TAG, "Error Creating JSON Object from string " + datapointsJsonStr); Log.v(TAG, "Error Creating JSON Object from string " + datapointsJsonStr);
dataObj = null; dataObj = null;
@@ -783,6 +768,8 @@ public class LogManager implements AuthCallbackInterface, EventCallbackInterface
mUploadInProgress = true; mUploadInProgress = true;
Log.v(TAG, "eventCallback() - starting datapoints upload with eventId " + mCurrentEventId); Log.v(TAG, "eventCallback() - starting datapoints upload with eventId " + mCurrentEventId);
uploadNextDatapoint(); uploadNextDatapoint();
});
} }
// takes the next datapoint of the list mDatapointsToUploadList and uploads it to the remote server. // takes the next datapoint of the list mDatapointsToUploadList and uploads it to the remote server.

View File

@@ -136,14 +136,13 @@ public class LogManagerControlActivity extends AppCompatActivity {
// Based on https://www.tutlane.com/tutorial/android/android-sqlite-listview-with-examples // Based on https://www.tutlane.com/tutorial/android/android-sqlite-listview-with-examples
mLm.getEventsList(true, (ArrayList<HashMap<String, String>> eventsList) -> { mLm.getEventsList(true, (ArrayList<HashMap<String, String>> eventsList) -> {
mEventsList = eventsList; mEventsList = eventsList;
Log.v(TAG,"initialiseServiceConnection() - set mEventsList"); Log.v(TAG, "initialiseServiceConnection() - set mEventsList - Updating UI");
updateUi(); updateUi();
}); });
//mEventsList = mLm.getEventsList(true); //mEventsList = mLm.getEventsList(true);
} }
private void getRemoteEvents() { private void getRemoteEvents() {
// Retrieve events from remote database // Retrieve events from remote database
mLm.mWac.getEvents((JSONObject remoteEventsObj) -> { mLm.mWac.getEvents((JSONObject remoteEventsObj) -> {
@@ -175,6 +174,8 @@ public class LogManagerControlActivity extends AppCompatActivity {
eventHashMap.put("desc", desc); eventHashMap.put("desc", desc);
mRemoteEventsList.add(eventHashMap); mRemoteEventsList.add(eventHashMap);
} }
Log.v(TAG, "getRemoteEvents() - set mRemoteEventsList(). Updating UI");
updateUi();
} catch (JSONException e) { } catch (JSONException e) {
Log.e(TAG, "getRemoteEvents(): Error Parsing remoteEventsObj: " + e.getMessage()); Log.e(TAG, "getRemoteEvents(): Error Parsing remoteEventsObj: " + e.getMessage());
mUtil.showToast("Error Parsing remoteEventsObj - this should not happen!!!"); mUtil.showToast("Error Parsing remoteEventsObj - this should not happen!!!");
@@ -193,12 +194,14 @@ public class LogManagerControlActivity extends AppCompatActivity {
Button btn; Button btn;
// Local Database Information // Local Database Information
if (mLm != null) { if (mLm != null) {
tv = (TextView) findViewById(R.id.num_local_events_tv); mLm.getLocalEventsCount(true, (Long eventCount) -> {
int eventCount = mLm.getLocalEventsCount(true); TextView tv1 = (TextView) findViewById(R.id.num_local_events_tv);
tv.setText(String.format("%d", eventCount)); tv1.setText(String.format("%d", eventCount));
tv = (TextView) findViewById(R.id.num_local_datapoints_tv); });
int datapointsCount = mLm.getLocalDatapointsCount(); mLm.getLocalDatapointsCount((Long datapointsCount) -> {
tv.setText(String.format("%d", datapointsCount)); TextView tv2 = (TextView) findViewById(R.id.num_local_datapoints_tv);
tv2.setText(String.format("%d", datapointsCount));
});
} else { } else {
stopUpdating = false; stopUpdating = false;
} }
@@ -245,7 +248,6 @@ public class LogManagerControlActivity extends AppCompatActivity {
} //updateUi(); } //updateUi();
View.OnClickListener onAuth = View.OnClickListener onAuth =
new View.OnClickListener() { new View.OnClickListener() {
@Override @Override

View File

@@ -147,7 +147,7 @@ public class ReportSeizureActivity extends AppCompatActivity {
String dateStr=String.format("%4d-%02d-%02d %02d:%02d:30",mYear,mMonth+1,mDay, mHour, mMinute); String dateStr=String.format("%4d-%02d-%02d %02d:%02d:30",mYear,mMonth+1,mDay, mHour, mMinute);
Log.v(TAG, "onOk() - dateSTr="+dateStr); Log.v(TAG, "onOk() - dateSTr="+dateStr);
mMsg = "Finding Nearest Datapoint to Date/Time "+dateStr+"..."; mMsg = "Finding Nearest Datapoint to Date/Time "+dateStr+"...";
int id = mLm.getNearestDatapointToDate(dateStr); mLm.getNearestDatapointToDate(dateStr, (Long id) -> {
mMsg = mMsg + "\nNearest Datapoint is "+id; mMsg = mMsg + "\nNearest Datapoint is "+id;
Log.v(TAG, "onOK() - nearest datapoint is "+id); Log.v(TAG, "onOK() - nearest datapoint is "+id);
if (id!=-1) { if (id!=-1) {
@@ -159,6 +159,7 @@ public class ReportSeizureActivity extends AppCompatActivity {
mMsg = mMsg + "\n*** Datapoint not found - not doing anything ***"; mMsg = mMsg + "\n*** Datapoint not found - not doing anything ***";
osdUtil.showToast(getString(R.string.DatapointNotFound)); osdUtil.showToast(getString(R.string.DatapointNotFound));
} }
});
} }
}; };
View.OnClickListener onCancel = View.OnClickListener onCancel =