diff --git a/app/release/app-release-4.1.0e.apk b/app/release/app-release-4.1.0f.apk similarity index 67% rename from app/release/app-release-4.1.0e.apk rename to app/release/app-release-4.1.0f.apk index 5fd5c88..39b5232 100644 Binary files a/app/release/app-release-4.1.0e.apk and b/app/release/app-release-4.1.0f.apk differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dae4947..8f63e33 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="109" + android:versionName="4.1.0f"> diff --git a/app/src/main/assets/best_model_v0.06.tflite b/app/src/main/assets/best_model_v0.06.tflite deleted file mode 100644 index 08345a6..0000000 Binary files a/app/src/main/assets/best_model_v0.06.tflite and /dev/null differ diff --git a/app/src/main/assets/best_model_v0.07.tflite b/app/src/main/assets/best_model_v0.07.tflite new file mode 100644 index 0000000..56c882b Binary files /dev/null and b/app/src/main/assets/best_model_v0.07.tflite differ diff --git a/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java b/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java index 16be319..d072d95 100644 --- a/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java @@ -458,6 +458,19 @@ public class LogManagerControlActivity extends AppCompatActivity { }) .setNegativeButton(android.R.string.no, null) .show(); + case R.id.action_mark_false_alarm: + Log.i(TAG, "action_mark_false_alarm"); + new AlertDialog.Builder(this) + .setTitle(R.string.mark_unverified_events_false_alarm_dialog_title) + .setMessage(R.string.mark_unverified_events_false_alarm_dialog_message) + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + mLm.mWac.markUnverifiedEventsAsFalseAlarm(); + } + }) + .setNegativeButton(android.R.string.no, null) + .show(); default: return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java b/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java index fecaacc..c8d1a26 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdAlgNn.java @@ -25,7 +25,7 @@ import java.util.Map; public class SdAlgNn { private final static String TAG = "SdAlgNn"; - private final static String MODEL_PATH = "best_model_v0.06.tflite"; + private final static String MODEL_PATH = "best_model_v0.07.tflite"; private String mUrlBase = "https://osdApi.ddns.net"; private InterpreterApi interpreter; private Context mContext; diff --git a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java index b261bec..2eafc56 100644 --- a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java +++ b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java @@ -136,43 +136,46 @@ public abstract class WebApiConnection { /** - * Mark all of the events with IDs contained in eventList as unknown type. + * Mark all of the events with IDs contained in eventList as the specified type and subtype. * @param eventList list of String IDs of the events to mark as unknown. + * @param typeStr + * @param subTypeStr * @return true if request sent successfully or false. */ - private boolean markEventsAsUnknown(ArrayListeventList) { + private boolean markEventsAsTypeSubType(ArrayListeventList, String typeStr, String subTypeStr) { if (eventList.size()>0) { - Log.i(TAG,"markEventsAsUnknown - eventList.size()="+eventList.size()); - Log.i(TAG,"markEventsAsUnknown - eventList(0) = "+eventList.get(0)); + Log.i(TAG,"markEventsAsTypeSubtype - eventList.size()="+eventList.size()); + Log.i(TAG,"markEventsAsSypeSubtype - eventList(0) = "+eventList.get(0)); getEvent(eventList.get(0), new WebApiConnection.JSONObjectCallback() { @Override public void accept(JSONObject eventObj) { - Log.v(TAG, "markEventsAsUnknown.getEvent.callback: "+eventObj); + Log.v(TAG, "markEventsAsTypeSubtype.getEvent.callback: "+eventObj); if (eventObj != null) { - Log.v(TAG, "markEventsAsUnknown.getEvent.callback: eventObj=" + eventObj.toString()); + Log.v(TAG, "markEventsAsTypeSubtype.getEvent.callback: eventObj=" + eventObj.toString()); try { - eventObj.put("type", "Unknown"); + eventObj.put("type", typeStr); + eventObj.put("subType", subTypeStr); String notesStr = eventObj.getString("desc"); if (notesStr == null) notesStr = new String(""); - notesStr = notesStr + " Set to Unknown automatically by OSD Android App"; + notesStr = notesStr + " bulk type/subtype set"; eventObj.put("desc", notesStr); updateEvent(eventObj,new WebApiConnection.JSONObjectCallback() { @Override public void accept(JSONObject eventObj) { if (eventObj != null) { - Log.i(TAG, "markEventsAsUnknown.updateEvent.callback" + eventObj.toString()); + Log.i(TAG, "markEventsAsTypeSubtype.updateEvent.callback" + eventObj.toString()); // Remove the first item from the list,then call this whole procedure again to modify the next one on the list. eventList.remove(0); - markEventsAsUnknown(eventList); + markEventsAsTypeSubType(eventList, typeStr, subTypeStr); } else { - Log.e(TAG, "markEventsAsUnknown.updateEvent.callback - eventObj is null"); - mUtil.showToast("markEventsAsUnknown.updateEvent.callback - eventObj is null"); + Log.e(TAG, "markEventsAsTypeSubtype.updateEvent.callback - eventObj is null"); + mUtil.showToast("markEventsAsTypeSubtype.updateEvent.callback - eventObj is null"); } } }); } catch (JSONException e) { - Log.e(TAG,"markEventsAsUnknown.getEvent.callback: Error editing eventObj"); - mUtil.showToast("markEventsAsUnknown.getEvent.callback: Error editing eventObj"); + Log.e(TAG,"markEventsAsTypeSubtype.getEvent.callback: Error editing eventObj"); + mUtil.showToast("markEventsAsTypeSubtype.getEvent.callback: Error editing eventObj"); } } else { mUtil.showToast("Failed to Retrieve Event from Remote Database"); @@ -181,7 +184,7 @@ public abstract class WebApiConnection { } }); } else { - Log.i(TAG,"markEventsAsUnknown(): No more events to Modify"); + Log.i(TAG,"markEventsAsTypeSubtype(): No more events to Modify"); mUtil.showToast("No more unvalidated events to modify."); } @@ -193,37 +196,37 @@ public abstract class WebApiConnection { * * @return true if request is successful or false. */ - public boolean markUnverifiedEventsAsUnknown() { + public boolean markUnverifiedEventsAsTypeSubtype(String typeStr, String subTypeStr) { if (getEvents((JSONObject remoteEventsObj) -> { - Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents.Callback()"); + Log.v(TAG, "markUnverifiedEventsAsTypeSubtype.getEvents.Callback()"); Boolean haveUnvalidatedEvent = false; if (remoteEventsObj == null) { - Log.e(TAG, "markUnverifiedEventsAsUnknown.getEvents.Callback: Error Retrieving events"); + Log.e(TAG, "markUnverifiedEventsAsTypeSubtype.getEvents.Callback: Error Retrieving events"); } else { try { JSONArray eventsArray = remoteEventsObj.getJSONArray("events"); ArrayList unvalidatedEventsList = new ArrayList(); for (int i = eventsArray.length() - 1; i >= 0; i--) { JSONObject eventObj = eventsArray.getJSONObject(i); - String typeStr = eventObj.getString("type"); - if (typeStr.equals("null") || typeStr.equals("")) { + String currTypeStr = eventObj.getString("type"); + if (currTypeStr.equals("null") || currTypeStr.equals("")) { haveUnvalidatedEvent = true; unvalidatedEventsList.add(eventObj.getString("id")); } } - Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents.onFinish.callback - haveUnvalidatedEvent = " + + Log.v(TAG, "markUnverifiedEventsAsTypeSubtype.getEvents.onFinish.callback - haveUnvalidatedEvent = " + haveUnvalidatedEvent); - markEventsAsUnknown(unvalidatedEventsList); + markEventsAsTypeSubType(unvalidatedEventsList, typeStr, subTypeStr); } catch (JSONException e) { - Log.e(TAG, "markUnverifiedEventsAsUnknown.getEvents.onFinish(): Error Parsing remoteEventsObj: " + e.getMessage()); + Log.e(TAG, "markUnverifiedEventsAsTypeSubtype.getEvents.onFinish(): Error Parsing remoteEventsObj: " + e.getMessage()); //mUtil.showToast("Error Parsing remoteEventsObj - this should not happen!!!"); } } })) { - Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents - requested events"); + Log.v(TAG, "markUnverifiedEventsAsTypeSubtype.getEvents - requested events"); } else { - Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents - Not Logged In"); + Log.v(TAG, "markUnverifiedEventsAsTypeSubtype.getEvents - Not Logged In"); } @@ -231,4 +234,12 @@ public abstract class WebApiConnection { return (true); } + public boolean markUnverifiedEventsAsUnknown() { + markUnverifiedEventsAsTypeSubtype("Unknown", ""); + return true; + } + public boolean markUnverifiedEventsAsFalseAlarm() { + markUnverifiedEventsAsTypeSubtype("False Alarm", ""); + return true; + } } diff --git a/app/src/main/res/menu/log_manager_activity_menu.xml b/app/src/main/res/menu/log_manager_activity_menu.xml index a8d09e4..1170cde 100644 --- a/app/src/main/res/menu/log_manager_activity_menu.xml +++ b/app/src/main/res/menu/log_manager_activity_menu.xml @@ -9,6 +9,10 @@ android:id="@+id/action_mark_unknown" app:showAsAction="never|withText" android:title="@string/mark_unverified_events_as_unknown" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 638cca9..8647fe5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -443,4 +443,7 @@ Enable AI (Neural Network) Algorithm Enable the Artificial Intelligence (Neural Network) algorithm to generate alarms. Seizure Detection Algorithms Selection + Mark all Unverified Events as False Alarm + Please confirm that all genuine seizure events have been verified before marking all unverified events as type \'False Alarm\'. \n\nContinue to mark unverified events as False Alarm? + Mark all Unverified Events as False Alarm