From 4d9c3009ce737c64ee8ad0822fd88380b8dae733 Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Mon, 14 Jul 2025 18:58:54 +0100 Subject: [PATCH] V4.3.0a - added grouping function to data sharing event editing screen --- CHANGELOG.md | 3 + app/src/main/AndroidManifest.xml | 4 +- .../EditEventActivity.java | 62 ++++- .../LogManagerControlActivity.java | 240 +++++++++++++++--- .../WebApiConnection_osdapi.java | 8 +- .../layout/activity_log_manager_control.xml | 39 ++- .../res/layout/grouped_event_entry_layout.xml | 42 +++ app/src/main/res/values/strings.xml | 3 + releases/app-release-3.6.2.apk | Bin 8154786 -> 0 bytes releases/app-release-3.6.3c.apk | Bin 8156490 -> 0 bytes releases/app-release-4.3.0a.apk | Bin 0 -> 15245198 bytes .../{ => old_versions}/app-release-4.0.4.apk | Bin .../{ => old_versions}/app-release-4.0.6.apk | Bin .../{ => old_versions}/app-release-4.0.7.apk | Bin .../{ => old_versions}/app-release-4.1.13.apk | Bin .../{ => old_versions}/app-release-4.1.7.apk | Bin .../{ => old_versions}/app-release-4.2.10.apk | Bin .../{ => old_versions}/app-release-4.2.11.apk | Bin .../{ => old_versions}/app-release-4.2.8.apk | Bin .../{ => old_versions}/app-release-4.2.9.apk | Bin 20 files changed, 353 insertions(+), 48 deletions(-) create mode 100644 app/src/main/res/layout/grouped_event_entry_layout.xml delete mode 100644 releases/app-release-3.6.2.apk delete mode 100644 releases/app-release-3.6.3c.apk create mode 100644 releases/app-release-4.3.0a.apk rename releases/{ => old_versions}/app-release-4.0.4.apk (100%) rename releases/{ => old_versions}/app-release-4.0.6.apk (100%) rename releases/{ => old_versions}/app-release-4.0.7.apk (100%) rename releases/{ => old_versions}/app-release-4.1.13.apk (100%) rename releases/{ => old_versions}/app-release-4.1.7.apk (100%) rename releases/{ => old_versions}/app-release-4.2.10.apk (100%) rename releases/{ => old_versions}/app-release-4.2.11.apk (100%) rename releases/{ => old_versions}/app-release-4.2.8.apk (100%) rename releases/{ => old_versions}/app-release-4.2.9.apk (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a11db1..8db8f8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ OpenSeizureDetector Android App - Change Log ============================================ + V4.3.0a - 2024-10-01 + - Added support for Android 14 (API 34) to allow publishing on Play Store. + - Improved the data sharing screen to show grouped events to reduce the number of events that need to be edited. V4.2.12 - Fixed crash when pressing 'Install Watch App' button by hiding the button if the Pebble data source is not selected - Added a 'Help' and 'Troubleshooting' button and menu item to draw users' attention to the web site instructions. V4.2.11 - Updated permissions handling to support Android 14 (needed to publish on Play Store) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 131c331..6c6554e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="152" + android:versionName="4.3.0a"> diff --git a/app/src/main/java/uk/org/openseizuredetector/EditEventActivity.java b/app/src/main/java/uk/org/openseizuredetector/EditEventActivity.java index 2a00c6b..d0eb881 100644 --- a/app/src/main/java/uk/org/openseizuredetector/EditEventActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/EditEventActivity.java @@ -38,6 +38,7 @@ public class EditEventActivity extends AppCompatActivity { private String mEventTypeStr = null; private String mEventSubTypeStr = null; private String mEventId; + private ArrayList mEventIds; // For group editing private String mEventNotes = ""; //private Date mEventDateTime; private RadioGroup mEventTypeRg; @@ -61,8 +62,15 @@ public class EditEventActivity extends AppCompatActivity { Bundle extras = getIntent().getExtras(); if (extras != null) { - String eventId = extras.getString("eventId"); - mEventId = eventId; + mEventIds = extras.getStringArrayList("eventIds"); + if (mEventIds != null && !mEventIds.isEmpty()) { + Log.v(TAG, "onCreate - Group Edit - eventIds=" + mEventIds.toString()); + mEventId = mEventIds.get(0); + } else { + Log.v(TAG, "onCreate - Single Edit - eventId=" + extras.getString("eventId")); + mEventId = extras.getString("eventId"); + mEventIds = null; + } Log.v(TAG, "onCreate - mEventId=" + mEventId); } @@ -297,6 +305,7 @@ public class EditEventActivity extends AppCompatActivity { } Log.v(TAG, "onOK() - eventObj=" + mEventObj.toString()); + // First we just save the open event, irrespective of whether it is a group edit or not. try { mWac.updateEvent(mEventObj, new WebApiConnection.JSONObjectCallback() { @Override @@ -320,9 +329,58 @@ public class EditEventActivity extends AppCompatActivity { mUtil.showToast("Error Updating Event"); updateUi(); } + + // If this is a group edit, we need to update the other events in the group. + if (mEventIds != null && mEventIds.size() > 1) { + Log.v(TAG, "onOK() - Group Edit - updating other events in group"); + updateGroupEventsSequentially(0); + } } + }; + private void updateGroupEventsSequentially(final int index) { + if (mEventIds == null || index >= mEventIds.size()) { + Log.v(TAG, "updateGroupEventsSequentially - All events updated"); + return; + } + final String eventId = mEventIds.get(index); + mWac.getEvent(eventId, new WebApiConnection.JSONObjectCallback() { + @Override + public void accept(JSONObject eventObj) { + if (eventObj == null) { + Log.e(TAG, "updateGroupEventsSequentially - ERROR: could not retrieve event " + eventId); + mUtil.showToast("Error Retrieving Event " + eventId); + updateGroupEventsSequentially(index + 1); + return; + } + try { + eventObj.put("id", eventId); + eventObj.put("type", mEventObj.getString("type")); + eventObj.put("subType", mEventObj.getString("subType")); + eventObj.put("desc", mEventObj.getString("desc")); + } catch (JSONException e) { + Log.e(TAG, "updateGroupEventsSequentially - ERROR: " + e.getMessage()); + updateGroupEventsSequentially(index + 1); + return; + } + mWac.updateEvent(eventObj, new WebApiConnection.JSONObjectCallback() { + @Override + public void accept(JSONObject updatedObj) { + if (updatedObj == null) { + Log.e(TAG, "updateGroupEventsSequentially - ERROR: update failed for " + eventId); + mUtil.showToast("Error Updating Event " + eventId); + } else { + Log.v(TAG, "updateGroupEventsSequentially - Updated event " + eventId + " OK"); + mUtil.showToast("Event " + eventId + " Updated OK"); + } + updateGroupEventsSequentially(index + 1); + } + }); + } + }); + } + RadioGroup.OnCheckedChangeListener onEventTypeChange = new RadioGroup.OnCheckedChangeListener() { diff --git a/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java b/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java index e0e4518..f100f9a 100644 --- a/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/LogManagerControlActivity.java @@ -17,6 +17,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.util.Log; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -42,13 +43,17 @@ import java.lang.reflect.Field; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; public class LogManagerControlActivity extends AppCompatActivity { private String TAG = "LogManagerControlActivity"; + private static final long GROUPING_WINDOW_MINUTES = 3; + private static final long GROUPING_WINDOW_MS = GROUPING_WINDOW_MINUTES * 60 * 1000; private LogManager mLm; private Context mContext; private UiTimer mUiTimer; @@ -63,6 +68,7 @@ public class LogManagerControlActivity extends AppCompatActivity { private Integer mUiTimerPeriodSlow = 60000; // 60 seconds - once data has been received and UI populated we only update once per minute. private boolean mUpdateSysLog = true; private Menu mMenu; + private CheckBox mGroupEventsCb; // Declare the CheckBox member //private Integer UI_MODE_LOCAL = 0; //private Integer UI_MODE_SHARED = 1; //private Integer mUiMode = UI_MODE_SHARED; @@ -118,6 +124,21 @@ public class LogManagerControlActivity extends AppCompatActivity { (CheckBox) findViewById(R.id.include_nda_cb); includeNDACb.setOnCheckedChangeListener(onIncludeNDACb); + mGroupEventsCb = findViewById(R.id.group_events_cb); + mGroupEventsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + // When the checkbox state changes, re-process and update the UI + if (mRemoteEventsList != null && !mRemoteEventsList.isEmpty()) { + if (isChecked) { + createGroupedEventsList(); + } + updateUi(); // Update UI to reflect grouped or non-grouped list + } + } + }); + + ListView lv = (ListView) findViewById(R.id.eventLogListView); lv.setOnItemClickListener(onEventListClick); @@ -219,7 +240,7 @@ public class LogManagerControlActivity extends AppCompatActivity { updateUi(); }); } else { - Log.e(TAG,"ERROR: initialiseServiceConnection() - mLm is null"); + Log.e(TAG, "ERROR: initialiseServiceConnection() - mLm is null"); mUtil.showToast(getString(R.string.error_failed_to_start_log_manager)); } } @@ -227,6 +248,7 @@ public class LogManagerControlActivity extends AppCompatActivity { private void getRemoteEvents(boolean includeWarnings, boolean includeNDA) { mRemoteEventsList = null; // clear existing data + mGroupedRemoteEventsList = null; // Retrieve events from remote database mLm.mWac.getEvents((JSONObject remoteEventsObj) -> { Log.v(TAG, "getRemoteEvents()"); @@ -253,7 +275,7 @@ public class LogManagerControlActivity extends AppCompatActivity { String dataTime = "null"; if (!eventObj.isNull("dataTime")) { dataTime = eventObj.getString("dataTime"); - Log.v(TAG, "getRemoteEvents() - dataTime=" + dataTime); + //Log.v(TAG, "getRemoteEvents() - dataTime=" + dataTime); } String typeStr = "null"; if (!eventObj.isNull("type")) { @@ -282,27 +304,141 @@ public class LogManagerControlActivity extends AppCompatActivity { Log.v(TAG, "getRemoteEvents - skipping warning or NDA record"); } } - createGroupedEventsList(); - Log.v(TAG, "getRemoteEvents() - set mRemoteEventsList(). Updating UI"); + + // Sort the remote events list by date, descending (newest first) + Log.v(TAG, "getRemoteEvents() - Sorting mRemoteEventsList by date"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.getDefault()); // Adjust format if needed + Collections.sort(mRemoteEventsList, (event1, event2) -> { + try { + String dt1Str = event1.get("dataTime"); + String dt2Str = event2.get("dataTime"); + if ( + dt1Str == null + || dt2Str == null + || dt1Str.equals("null") + || dt2Str.equals("null")) + return 0; + Date date1 = sdf.parse(dt1Str); + Date date2 = sdf.parse(dt2Str); + return date2.compareTo(date1); // Descending + } catch (ParseException e) { + Log.e(TAG, "Error parsing date for sorting: " + e.getMessage()); + return 0; + } + }); + if (mGroupEventsCb.isChecked()) { // Check if grouping is enabled + createGroupedEventsList(); + Log.v(TAG, "getRemoteEvents() - created grouped events. Updating UI"); + } else { + mGroupedRemoteEventsList = null; // Ensure grouped list is cleared if not used + Log.v(TAG, "getRemoteEvents() - grouping disabled. Updating UI with flat list."); + } updateUi(); } catch (JSONException e) { Log.e(TAG, "getRemoteEvents(): Error Parsing remoteEventsObj: " + e.getMessage()); mUtil.showToast("Error Parsing remoteEventsObj - this should not happen!!!"); mRemoteEventsList = null; + mGroupedRemoteEventsList = null; + updateUi(); // Update UI to show error state } - //Log.v(TAG, "getRemoteEvents(): mRemoteEventsList = " + mRemoteEventsList.toString()); } }); } + /** + * createGroupedEventsList() + * Reads the complete list of remote events mRemoteEventsList and creates a new list mGroupedRemoteEventsList + * where each item is a list of events that comprise a group based on time (all events within a 3 minute period are grouped together). + */ private void createGroupedEventsList() { - /** - * Reads the complete list of remote events mRemoteEventsList and creates a new list mGroupedRemoteEventsList - * where each item is a list of events that comprise a group based on time (all events within a 3 minute period are grouped together). - */ Log.i(TAG, "createGroupedEventsList()"); - mGroupedRemoteEventsList = new ArrayList>>(); - // FIXME - Make this do something! + /** + * createGroupedEventsList() + * Reads the complete list of remote events mRemoteEventsList (sorted newest first) + * and creates a new list mGroupedRemoteEventsList + * where each item is a list of events that comprise a group based on time. + */ + mGroupedRemoteEventsList = new ArrayList<>(); + if (mRemoteEventsList == null || mRemoteEventsList.isEmpty()) { + Log.i(TAG, "createGroupedEventsList() - mRemoteEventsList is null or empty."); + return; + } + + // Helper to parse date strings to long timestamps. + // Adjust the SimpleDateFormat pattern to match your "dataTime" format. + // If "dataTime" is already a timestamp (long), you can use it directly. + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.getDefault()); // Example format + + ArrayList> currentGroup = null; + long lastEventTimeInGroup = 0; + + for (HashMap event : mRemoteEventsList) { + String dataTimeString = event.get("dataTime"); + if (dataTimeString == null || dataTimeString.equals("null")) { + Log.w(TAG, "Event has null or invalid dataTime: " + event.get("id")); + continue; // Skip events with no valid time + } + + long currentEventTime; + try { + Date eventDate = sdf.parse(dataTimeString); + if (eventDate == null) { + Log.w(TAG, "Could not parse dataTime: " + dataTimeString + " for event: " + event.get("id")); + continue; + } + currentEventTime = eventDate.getTime(); + } catch (ParseException e) { + Log.e(TAG, "Error parsing date string: " + dataTimeString + " - " + e.getMessage()); + continue; // Skip if date can't be parsed + } + + if (currentGroup == null || (lastEventTimeInGroup - currentEventTime) > GROUPING_WINDOW_MS) { + // Start a new group + if (currentGroup != null) { + moveFirstAlarmToFront(currentGroup); // Move the first ALARM event to the front of the group) + mGroupedRemoteEventsList.add(currentGroup); + } + currentGroup = new ArrayList<>(); + currentGroup.add(event); + lastEventTimeInGroup = currentEventTime; + } else { + // Add to the current group + currentGroup.add(event); + // lastEventTimeInGroup remains the time of the first event added to this group (newest) + } + } + + // Add the last group if it exists + if (currentGroup != null && !currentGroup.isEmpty()) { + moveFirstAlarmToFront(currentGroup); // Move the first ALARM event to the front of the group + mGroupedRemoteEventsList.add(currentGroup); + } + + Log.i(TAG, "createGroupedEventsList() - Grouped " + mRemoteEventsList.size() + + " events into " + mGroupedRemoteEventsList.size() + " groups."); + } + + /** + * moveFirstAlarmToFront() - This method checks the group for the first + * event with an ALARM state (osdAlarmState = 2) and makes that event the + * first in the list. + * + * @param group An ArrayList of HashMaps representing a group of events. + */ + private void moveFirstAlarmToFront(ArrayList> group) { + //Log.i(TAG, "moveFirstAlarmToFront() - Checking group of size: " + group.size()); + for (int i = 0; i < group.size(); i++) { + HashMap event = group.get(i); + String alarmStateStr = event.get("osdAlarmState"); + if (alarmStateStr != null && alarmStateStr.equals("2")) { // ALARM is 2 + //Log.v(TAG," moveFirstAlarmToFront() - Found ALARM event at index: " + i); + if (i != 0) { + group.remove(i); + group.add(0, event); + } + break; + } + } } private void updateUi() { @@ -353,13 +489,27 @@ public class LogManagerControlActivity extends AppCompatActivity { pb.setIndeterminate(false); pb.setVisibility(View.INVISIBLE); ListView lv = (ListView) findViewById(R.id.remoteEventsLv); - ListAdapter adapter = new RemoteEventsAdapter(LogManagerControlActivity.this, mRemoteEventsList, R.layout.log_entry_layout_remote, - new String[]{"id", "dataTime", "type", "subType", "osdAlarmStateStr", "desc"}, - new int[]{R.id.event_id_remote_tv, R.id.event_date_remote_tv, R.id.event_type_remote_tv, R.id.event_subtype_remote_tv, - R.id.event_alarmState_remote_tv, R.id.event_notes_remote_tv}); - lv.setAdapter(adapter); - //Log.i(TAG,"adapter[0]="+adapter.getItem(0)); - //Log.i(TAG,"adapter[3]="+adapter.getItem(3)); + + if (mGroupEventsCb.isChecked() && mGroupedRemoteEventsList != null) { + // Show only the first event of each group + ArrayList> displayList = new ArrayList<>(); + for (ArrayList> group : mGroupedRemoteEventsList) { + displayList.add(group.get(0)); + } + ListAdapter adapter = new RemoteEventsAdapter(LogManagerControlActivity.this, displayList, R.layout.log_entry_layout_remote, + new String[]{"id", "dataTime", "type", "subType", "osdAlarmStateStr", "desc"}, + new int[]{R.id.event_id_remote_tv, R.id.event_date_remote_tv, R.id.event_type_remote_tv, R.id.event_subtype_remote_tv, + R.id.event_alarmState_remote_tv, R.id.event_notes_remote_tv}); + lv.setAdapter(adapter); + } else if (mRemoteEventsList != null) { + ListAdapter adapter = new RemoteEventsAdapter(LogManagerControlActivity.this, mRemoteEventsList, R.layout.log_entry_layout_remote, + new String[]{"id", "dataTime", "type", "subType", "osdAlarmStateStr", "desc"}, + new int[]{R.id.event_id_remote_tv, R.id.event_date_remote_tv, R.id.event_type_remote_tv, R.id.event_subtype_remote_tv, + R.id.event_alarmState_remote_tv, R.id.event_notes_remote_tv}); + lv.setAdapter(adapter); + } else { + Log.i(TAG, "UpdateUi: No Remote Events"); + } } else { //mUtil.showToast("No Remote Events"); Log.i(TAG, "UpdateUi: No Remote Events"); @@ -656,15 +806,26 @@ public class LogManagerControlActivity extends AppCompatActivity { new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView adapter, View v, int position, long id) { Log.v(TAG, "onItemClicKListener() - Position=" + position + ", id=" + id);// Confirmation dialog based on: https://stackoverflow.com/a/12213536/2104584 - HashMap eventObj = (HashMap) adapter.getItemAtPosition(position); - String eventId = eventObj.get("uploaded"); - Log.d(TAG, "onItemClickListener(): eventId=" + eventId + ", eventObj=" + eventObj); - if (eventId != null) { + + if (mGroupEventsCb.isChecked() && mGroupedRemoteEventsList != null) { + Log.v(TAG,"onItemClickListener() - Creating Grouped Events List from Position=" + position); + // Get the group for this position + ArrayList> group = mGroupedRemoteEventsList.get(position); + ArrayList eventIds = new ArrayList<>(); + for (HashMap event : group) { + Log.v(TAG,"onItemClickListener() - Adding event to edit list: " + event.get("id")); + eventIds.add(event.get("id")); + } + Intent i = new Intent(getApplicationContext(), EditEventActivity.class); + i.putStringArrayListExtra("eventIds", eventIds); + startActivity(i); + } else { + Log.v(TAG,"onItemClickListener() - Editing Single event at Position=" + position); + HashMap eventObj = (HashMap) adapter.getItemAtPosition(position); + String eventId = eventObj.get("id"); Intent i = new Intent(getApplicationContext(), EditEventActivity.class); i.putExtra("eventId", eventId); startActivity(i); - } else { - mUtil.showToast("You Must Wait for Event to Upload before Editing it"); } } }; @@ -673,13 +834,31 @@ public class LogManagerControlActivity extends AppCompatActivity { new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView adapter, View v, int position, long id) { Log.v(TAG, "onRemoteEventList Click() - Position=" + position + ", id=" + id);// Confirmation dialog based on: https://stackoverflow.com/a/12213536/2104584 - HashMap eventObj = (HashMap) adapter.getItemAtPosition(position); - String eventId = eventObj.get("id"); - Log.d(TAG, "onItemClickListener(): eventId=" + eventId + ", eventObj=" + eventObj); - Intent i = new Intent(getApplicationContext(), EditEventActivity.class); - i.putExtra("eventId", eventId); - startActivity(i); + Log.v(TAG, "onItemClickListener() - Position=" + position + ", id=" + id);// Confirmation dialog based on: https://stackoverflow.com/a/12213536/2104584 + + if (mGroupEventsCb.isChecked() && mGroupedRemoteEventsList != null) { + Log.v(TAG,"onItemClickListener() - Creating Grouped Events List from Position=" + position); + // Get the group for this position + ArrayList> group = mGroupedRemoteEventsList.get(position); + ArrayList eventIds = new ArrayList<>(); + for (HashMap event : group) { + Log.v(TAG,"onItemClickListener() - Adding event to edit list: " + event.get("id")); + eventIds.add(event.get("id")); + } + Intent i = new Intent(getApplicationContext(), EditEventActivity.class); + i.putStringArrayListExtra("eventIds", eventIds); + startActivity(i); + } else { + Log.v(TAG,"onItemClickListener() - Editing Single event at Position=" + position); + HashMap eventObj = (HashMap) adapter.getItemAtPosition(position); + String eventId = eventObj.get("id"); + Intent i = new Intent(getApplicationContext(), EditEventActivity.class); + i.putExtra("eventId", eventId); + startActivity(i); + } } + + }; @@ -787,6 +966,7 @@ public class LogManagerControlActivity extends AppCompatActivity { } } + private void showDataSharingDialog() { mUtil.writeToSysLogFile("MainActivity.showDataSharingDialog()"); View aboutView = getLayoutInflater().inflate(R.layout.data_sharing_dialog_layout, null, false); diff --git a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection_osdapi.java b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection_osdapi.java index b7cfc02..eab56dd 100644 --- a/app/src/main/java/uk/org/openseizuredetector/WebApiConnection_osdapi.java +++ b/app/src/main/java/uk/org/openseizuredetector/WebApiConnection_osdapi.java @@ -369,13 +369,13 @@ public class WebApiConnection_osdapi extends WebApiConnection { new Response.Listener() { @Override public void onResponse(String response) { - Log.v(TAG, "Response is: " + response); + Log.v(TAG, "updateEvent.onResponse(): Response is: " + response); mServerConnectionOk = true; try { JSONObject retObj = new JSONObject(response); callback.accept(retObj); } catch (JSONException e) { - Log.e(TAG, "getEventTypes.onRespons(): Error: " + e.getMessage() + "," + e.toString()); + Log.e(TAG, "updateEvent.onResponse(): Error: " + e.getMessage() + "," + e.toString()); callback.accept(null); } } @@ -385,9 +385,9 @@ public class WebApiConnection_osdapi extends WebApiConnection { public void onErrorResponse(VolleyError error) { mServerConnectionOk = false; if (error != null) { - Log.e(TAG, "Create Event Error: " + error.toString() + ", message:" + error.getMessage()); + Log.e(TAG, "updateEvent.onErrorResponse(): Error: " + error.toString() + ", message:" + error.getMessage()); } else { - Log.e(TAG, "Create Event Error - returned null response"); + Log.e(TAG, "updateEvent.onErrorResponse(): Error - returned null response"); } callback.accept(null); } diff --git a/app/src/main/res/layout/activity_log_manager_control.xml b/app/src/main/res/layout/activity_log_manager_control.xml index c5dafde..9fb7dc0 100644 --- a/app/src/main/res/layout/activity_log_manager_control.xml +++ b/app/src/main/res/layout/activity_log_manager_control.xml @@ -121,48 +121,67 @@ + android:orientation="horizontal" + android:gravity="center_vertical"> + android:text="@string/not_authenticated" + android:layout_marginEnd="8dp"/>