From 54e0264cdd8dee28ea5b8314a27bdfe7ccb6e94f Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Wed, 8 May 2024 21:38:07 +0100 Subject: [PATCH 1/2] Introduced ParseToDoule function into mUtil as suggested by @AroonPro. I have used NumberFormat to do the parse as recommended by the Oracle java documentation. Fixes #185 --- CHANGELOG.md | 1 + app/src/main/AndroidManifest.xml | 4 +-- .../ExportDataActivity.java | 4 ++- .../uk/org/openseizuredetector/OsdUtil.java | 25 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3355ff7..b783972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ OpenSeizureDetector Android App - Change Log ============================================ + V4.2.8 - Fixed crash in export data function when using european style comma based decimal separator. V4.2.7 - BLE2 data source re-start fixed?? V4.2.6 - Fixed problem with notifications in Android 13 - Improved start-up checks for permissions diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca2c088..bf629f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="142" + android:versionName="4.2.8"> diff --git a/app/src/main/java/uk/org/openseizuredetector/ExportDataActivity.java b/app/src/main/java/uk/org/openseizuredetector/ExportDataActivity.java index 3c43bf2..afccdc8 100644 --- a/app/src/main/java/uk/org/openseizuredetector/ExportDataActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/ExportDataActivity.java @@ -35,11 +35,13 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.text.DateFormat; +import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.Locale; public class ExportDataActivity extends AppCompatActivity implements View.OnClickListener { @@ -198,8 +200,8 @@ public class ExportDataActivity extends AppCompatActivity if (view == mExportBtn) { mDateTxt.setText(String.format("%02d-%02d-%04d", mDay, mMonth + 1, mYear)); mTimeTxt.setText(String.format("%02d:%02d:%02d", mHour, mMinute, 00)); - mDuration = Double.parseDouble(mDurationTxt.getText().toString()); + mDuration = mUtil.parseToDouble(mDurationTxt.getText().toString()); String dateTimeStr = String.format("%04d-%02d-%02dT%02d:%02d:%02dZ", mYear, mMonth + 1, mDay, mHour, mMinute, 00); //mUtil.showToast(dateTimeStr); mEndDate = mUtil.string2date(dateTimeStr); diff --git a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java index 2dee41e..4b86b0b 100644 --- a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java +++ b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java @@ -59,6 +59,7 @@ import java.io.File; import java.io.FileWriter; import java.net.InetAddress; import java.net.NetworkInterface; +import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -66,6 +67,7 @@ import java.util.Arrays; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; +import java.util.Locale; import java.util.function.Consumer; /** @@ -778,4 +780,27 @@ public class OsdUtil { return allOk; } + public double parseToDouble(String userInput) { + /** + * Parse a string to a double value, taking localisation into account. + * Using NumberFormat as recommended by https://docs.oracle.com/javase%2F7%2Fdocs%2Fapi%2F%2F/java/lang/Double.html#valueOf(java.lang.String) + */ + double retVal; + try { + Locale currentLocale; + if (android.os.Build.VERSION.SDK_INT < 24) { + currentLocale = mContext.getResources().getConfiguration().locale; + } else { + currentLocale = mContext.getResources().getConfiguration().getLocales().get(0); + } + NumberFormat nf = NumberFormat.getInstance(currentLocale); + retVal = nf.parse(userInput).doubleValue(); + } catch (ParseException e) { + // Handle invalid input (e.g., non-numeric characters) + showToast("Invalid input. Please enter a valid numeric value."); + retVal = 0.0; + } + return(retVal); + } + } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b4d5a8..cad25c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ OpenSeizureDetector "\n + \nV4.2.8 - fixed crash in export data function. \nV4.2.7 - Finally fixed BLE2 data source re-start after dropping connection? \nV4.2.6 - Fixed issues with Android 13 notifications and BLE data source shutdown. Added support for V2.x of Garmin watch app, Added new BLE2 data source, signal strength and battery level graphs. \nV4.2.4 - Fault alarm rather than crash if bluetooth system crashes. From bcb5f80df5a3c6d4fcfae78ddb47793bc988b52e Mon Sep 17 00:00:00 2001 From: Graham Jones Date: Wed, 8 May 2024 21:56:51 +0100 Subject: [PATCH 2/2] Added exception catching to updateUI in an attempt to fix #176 --- .../org/openseizuredetector/FragmentOsdBaseClass.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/uk/org/openseizuredetector/FragmentOsdBaseClass.java b/app/src/main/java/uk/org/openseizuredetector/FragmentOsdBaseClass.java index 9a57353..91df850 100644 --- a/app/src/main/java/uk/org/openseizuredetector/FragmentOsdBaseClass.java +++ b/app/src/main/java/uk/org/openseizuredetector/FragmentOsdBaseClass.java @@ -111,7 +111,16 @@ public class FragmentOsdBaseClass extends Fragment { updateUiHandler.post(new Runnable() { @Override public void run() { - updateUi(); + // Check for context being null is an attempt to stop the crashes reported in Issue No 176 + if (mContext != null) { + try { + updateUi(); + } catch (Exception e) { + Log.e(TAG,"upateUiOnUiThread() - exception updating UI - "+e.getMessage()); + } + } else { + Log.e(TAG,"updateUionUiThread() - mContext is null?? Can't show a Toast message because context is null...."); + } } }); }