diff --git a/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java b/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java index a7eb350..2321f47 100644 --- a/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java @@ -426,6 +426,9 @@ public class LogManagerControlActivity extends AppCompatActivity { Log.i(TAG, "exception starting settings activity " + ex.toString()); } return true; + case R.id.action_mark_unknown: + Log.i(TAG,"action_mark_unknown"); + mLm.mWac.markUnverifiedEventsAsUnknown(); default: return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java index f63e1b2..43ebd3a 100644 --- a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java +++ b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection.java @@ -34,6 +34,7 @@ import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -49,7 +50,6 @@ public abstract class WebApiConnection { private String mAuthToken; - public interface JSONObjectCallback { public void accept(JSONObject retValObj); } @@ -115,7 +115,7 @@ public abstract class WebApiConnection { public boolean authenticate(final String uname, final String passwd, StringCallback callback) { - Log.e(TAG,"WebApiConnection.authenticate(username, password, callback) Not Implemented"); + Log.e(TAG, "WebApiConnection.authenticate(username, password, callback) Not Implemented"); return false; } @@ -133,4 +133,99 @@ public abstract class WebApiConnection { return (mAuthToken); } + + /** + * Mark all of the events with IDs contained in eventList as unknown type. + * @param eventList list of String IDs of the events to mark as unknown. + * @return true if request sent successfully or false. + */ + private boolean markEventsAsUnknown(ArrayListeventList) { + if (eventList.size()>0) { + Log.i(TAG,"markEventsAsUnknown - eventList.size()="+eventList.size()); + Log.i(TAG,"markEventsAsUnknown - 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); + if (eventObj != null) { + Log.v(TAG, "markEventsAsUnknown.getEvent.callback: eventObj=" + eventObj.toString()); + try { + eventObj.put("type", "Unknown"); + String notesStr = eventObj.getString("desc"); + if (notesStr == null) notesStr = new String(""); + notesStr = notesStr + " Set to Unknown automatically by OSD Android App"; + 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()); + // 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); + } else { + Log.e(TAG, "markEventsAsUnknown.updateEvent.callback - eventObj is null"); + } + } + }); + } catch (JSONException e) { + Log.e(TAG,"markEventsAsUnknown.getEvent.callback: Error editing eventObj"); + } + } else { + mUtil.showToast("Failed to Retrieve Event from Remote Database"); + return; + } + } + }); + } else { + Log.i(TAG,"markEventsAsUnknown(): No more events to Modify"); + mUtil.showToast("No unvalidated events to modify :)"); + + } + return(true); + } + + /** + * Mark all unverified events in the remote database as unknown + * + * @return true if request is successful or false. + */ + public boolean markUnverifiedEventsAsUnknown() { + if (getEvents((JSONObject remoteEventsObj) -> { + Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents.Callback()"); + Boolean haveUnvalidatedEvent = false; + if (remoteEventsObj == null) { + Log.e(TAG, "markUnverifiedEventsAsUnknown.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("")) { + haveUnvalidatedEvent = true; + unvalidatedEventsList.add(eventObj.getString("id")); + } + } + Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents.onFinish.callback - haveUnvalidatedEvent = " + + haveUnvalidatedEvent); + markEventsAsUnknown(unvalidatedEventsList); + + } catch (JSONException e) { + Log.e(TAG, "markUnverifiedEventsAsUnknown.getEvents.onFinish(): Error Parsing remoteEventsObj: " + e.getMessage()); + //mUtil.showToast("Error Parsing remoteEventsObj - this should not happen!!!"); + } + } + })) { + Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents - requested events"); + } else { + Log.v(TAG, "markUnverifiedEventsAsUnknown.getEvents - Not Logged In"); + + } + + + 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 eaecd8a..a8d09e4 100644 --- a/app/src/main/res/menu/log_manager_activity_menu.xml +++ b/app/src/main/res/menu/log_manager_activity_menu.xml @@ -5,6 +5,10 @@ android:id="@+id/pruneDatabaseMenuItem" app:showAsAction="never|withText" android:title="@string/prune_database" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 72b2d0e..ba03c31 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -434,4 +434,5 @@ Permissions Disclosure About Data Sharing Privacy Policy + Mark Unverified Events as Unknown