diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fcd349..e1eec5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ OpenSeizureDetector Android App - Change Log ============================================ + V3.6.2 - Nov 2020 + - Extended Polish translation further + - Improved system log output to help with answering queries from users. V3.6.1 - Nov 2020 - Extended polish translation to all settings screens. - Possible fix for issue with failing to shutdown system sometimes. diff --git a/app/release/app-release-3.6.2.apk b/app/release/app-release-3.6.2.apk new file mode 100644 index 0000000..0ac5488 Binary files /dev/null and b/app/release/app-release-3.6.2.apk differ diff --git a/app/release/app-release.apk b/app/release/app-release.apk index b918e1c..0ac5488 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/old_versions/app-release-3.6.2a.apk b/app/release/old_versions/app-release-3.6.2a.apk new file mode 100644 index 0000000..27196ba Binary files /dev/null and b/app/release/old_versions/app-release-3.6.2a.apk differ diff --git a/app/release/old_versions/app-release-3.6.2b.apk b/app/release/old_versions/app-release-3.6.2b.apk new file mode 100644 index 0000000..6682b4e Binary files /dev/null and b/app/release/old_versions/app-release-3.6.2b.apk differ diff --git a/app/release/old_versions/app-release-3.6.2c.apk b/app/release/old_versions/app-release-3.6.2c.apk new file mode 100644 index 0000000..3c13337 Binary files /dev/null and b/app/release/old_versions/app-release-3.6.2c.apk differ diff --git a/app/release/old_versions/app-release-3.6.2d.apk b/app/release/old_versions/app-release-3.6.2d.apk new file mode 100644 index 0000000..3d0f688 Binary files /dev/null and b/app/release/old_versions/app-release-3.6.2d.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 5cead3d..e96a6b2 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -10,9 +10,9 @@ { "type": "SINGLE", "filters": [], - "versionCode": 83, - "versionName": "3.6.1", + "versionCode": 87, + "versionName": "3.6.2", "outputFile": "app-release.apk" } ] -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c63a94d..5c78f79 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ + android:versionCode="87" + android:versionName="3.6.2"> diff --git a/app/src/main/java/uk/org/openseizuredetector/MainActivity.java b/app/src/main/java/uk/org/openseizuredetector/MainActivity.java index 4628262..04bd053 100644 --- a/app/src/main/java/uk/org/openseizuredetector/MainActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/MainActivity.java @@ -136,7 +136,7 @@ public class MainActivity extends AppCompatActivity { if ((mConnection.mSdServer.mSmsTimer != null) && (mConnection.mSdServer.mSmsTimer.mTimeLeft > 0 )){ Log.v(TAG, "acceptAlarmButton.onClick() - Stopping SMS Timer"); - mUtil.showToast("SMS Alarm Cancelled"); + mUtil.showToast(getString(R.string.SMSAlarmCancelledMsg)); mConnection.mSdServer.stopSmsTimer(); } else { @@ -357,7 +357,7 @@ public class MainActivity extends AppCompatActivity { Log.v(TAG, "Changing menu icons"); MenuItem menuItem = mOptionsMenu.findItem(R.id.action_start_stop); menuItem.setIcon(R.drawable.stop_server); - menuItem.setTitle("Stop Server"); + menuItem.setTitle(R.string.StopServerTitle); } else { Log.v(TAG, "mOptionsMenu is null - not changing icons!"); } @@ -371,7 +371,7 @@ public class MainActivity extends AppCompatActivity { if (mOptionsMenu != null) { Log.v(TAG, "Changing action bar icons"); mOptionsMenu.findItem(R.id.action_start_stop).setIcon(R.drawable.start_server); - mOptionsMenu.findItem(R.id.action_start_stop).setTitle("Start Server"); + mOptionsMenu.findItem(R.id.action_start_stop).setTitle(R.string.StartServerTitle); } else { Log.v(TAG, "mOptionsMenu is null, not changing icons!"); } @@ -398,7 +398,7 @@ public class MainActivity extends AppCompatActivity { if (mUtil.isServerRunning()) { tv = (TextView) findViewById(R.id.serverStatusTv); if (mConnection.mBound) - tv.setText(getString(R.string.ServerRunningOK) + mConnection.mSdServer.mSdDataSourceName + " " +getString(R.string.DataSource)); + tv.setText(getString(R.string.ServerRunningOK) + getString(R.string.DataSource) + " = " + mConnection.mSdServer.mSdDataSourceName); tv.setBackgroundColor(okColour); tv.setTextColor(okTextColour); tv = (TextView) findViewById(R.id.serverIpTv); diff --git a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java index 2e42e8d..6520b20 100644 --- a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java +++ b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java @@ -71,6 +71,7 @@ import org.apache.http.conn.util.InetAddressUtils; import java.io.File; import java.io.FileWriter; +import java.io.IOException; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.AbstractList; @@ -142,7 +143,7 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem parsing preferences!"); - showToast("Problem Parsing Preferences - Something won't work - Please go back to Settings and correct it!"); + showToast(mContext.getString(R.string.ParsePreferenceWarning)); } } @@ -171,8 +172,7 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac if (nServers != 0) { Log.v(TAG, "isServerRunning() - " + nServers + " instances are running"); return true; - } - else + } else return false; } @@ -181,16 +181,16 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac */ public void startServer() { // Start the server - Log.d(TAG,"OsdUtil.startServer()"); + Log.d(TAG, "OsdUtil.startServer()"); writeToSysLogFile("startServer() - starting server"); Intent sdServerIntent; sdServerIntent = new Intent(mContext, SdServer.class); sdServerIntent.setData(Uri.parse("Start")); if (Build.VERSION.SDK_INT >= 26) { - Log.i(TAG,"Starting Foreground Service (Android 8 and above)"); + Log.i(TAG, "Starting Foreground Service (Android 8 and above)"); mContext.startForegroundService(sdServerIntent); } else { - Log.i(TAG,"Starting Normal Service (Pre-Android 8)"); + Log.i(TAG, "Starting Normal Service (Pre-Android 8)"); mContext.startService(sdServerIntent); } } @@ -219,7 +219,7 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac Intent intent = new Intent(sdServiceConnection.mContext, SdServer.class); activity.bindService(intent, sdServiceConnection, Context.BIND_AUTO_CREATE); mNbound = mNbound + 1; - Log.i(TAG,"OsdUtil.bindToServer() - mNbound = "+mNbound); + Log.i(TAG, "OsdUtil.bindToServer() - mNbound = " + mNbound); } /** @@ -234,16 +234,16 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac activity.unbindService(sdServiceConnection); sdServiceConnection.mBound = false; mNbound = mNbound - 1; - Log.i(TAG,"OsdUtil.unBindFromServer() - mNbound = "+mNbound); + Log.i(TAG, "OsdUtil.unBindFromServer() - mNbound = " + mNbound); } catch (Exception ex) { Log.e(TAG, "unbindFromServer() - error unbinding service - " + ex.toString()); - writeToSysLogFile("unbindFromServer() - error unbinding service - " +ex.toString()); - Log.i(TAG,"OsdUtil.unBindFromServer() - mNbound = "+mNbound); + writeToSysLogFile("unbindFromServer() - error unbinding service - " + ex.toString()); + Log.i(TAG, "OsdUtil.unBindFromServer() - mNbound = " + mNbound); } } else { Log.i(TAG, "unbindFromServer() - not bound to server - ignoring"); writeToSysLogFile("unbindFromServer() - not bound to server - ignoring"); - Log.i(TAG,"OsdUtil.unBindFromServer() - mNbound = "+mNbound); + Log.i(TAG, "OsdUtil.unBindFromServer() - mNbound = " + mNbound); } } @@ -299,7 +299,7 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac public boolean isMobileDataActive() { // return true if we are using mobile data, otherwise return false - ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { return true; @@ -310,7 +310,7 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac public boolean isNetworkConnected() { // return true if we have a network connection, otherwise false. - ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return (activeNetwork.isConnected()); } @@ -332,35 +332,38 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac /** * Write a message to the system log file, provided mLogSystem is true. + * * @param msgStr */ public void writeToSysLogFile(String msgStr) { if (mLogSystem) - writeToLogFile(SYSLOG,msgStr); + writeToLogFile(SYSLOG, msgStr); else - Log.v(TAG,"writeToSysLogFile - mLogSystem False so not writing"); + Log.v(TAG, "writeToSysLogFile - mLogSystem False so not writing"); } /** * Write a message to the alarm log file, provided mLogAlarms is true. + * * @param msgStr */ public void writeToAlarmLogFile(String msgStr) { if (mLogAlarms) - writeToLogFile(ALARMLOG,msgStr); + writeToLogFile(ALARMLOG, msgStr); else - Log.v(TAG,"writeToAlarmLogFile - mLogAlarms False so not writing"); + Log.v(TAG, "writeToAlarmLogFile - mLogAlarms False so not writing"); } /** * Write a message to the data log file, provided mLogData is true. + * * @param msgStr */ public void writeToDataLogFile(String msgStr) { if (mLogData) - writeToLogFile(DATALOG,msgStr); + writeToLogFile(DATALOG, msgStr); else - Log.v(TAG,"writeToDataLogFile - mLogData False so not writing"); + Log.v(TAG, "writeToDataLogFile - mLogData False so not writing"); } @@ -380,12 +383,11 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - Log.e(TAG,"ERROR: We do not have permission to write to external storage"); + Log.e(TAG, "ERROR: We do not have permission to write to external storage"); } else { if (isExternalStorageWritable()) { try { - FileWriter of = new FileWriter(getDataStorageDir().toString() - + "/" + fname, true); + FileWriter of = new FileWriter(getDataStorageDir() + "/" + fname, true); if (msgStr != null) { String dateTimeStr = tnow.format("%Y-%m-%d %H:%M:%S"); //Log.v(TAG, "writing msgStr"); @@ -396,7 +398,10 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac of.close(); } catch (Exception ex) { Log.e(TAG, "writeToLogFile - error " + ex.toString()); - showToast("ERROR Writing to Log File"); + for (int i = 0; i < (ex.getStackTrace().length); i++) { + Log.e(TAG, "writeToLogFile - error " + ex.getStackTrace()[i]); + } + showToast(mContext.getString(R.string.ErrorWritingLogFileWarning) + ex.toString()); } } else { Log.e(TAG, "ERROR - Can not Write to External Folder"); @@ -404,6 +409,16 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac } } + public File[] getDataFilesList() { + File[] files = getDataStorageDir().listFiles(); + Log.d("Files", "Size: "+ files.length); + for (int i = 0; i < files.length; i++) + { + Log.d("Files", "FileName:" + files[i].getName()); + } + return(files); + } + /* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); @@ -415,18 +430,11 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac public File getDataStorageDir() { // Get the directory for the user's public directory. - File file = - new File(Environment.getExternalStorageDirectory() - , "OpenSeizureDetector"); - if (!file.isDirectory()) { - Log.i(TAG,"getDataStorageDir() - creating directory"); - if (!file.mkdirs()) { - Log.e(TAG, "Failed to create directory"); - } - } + File file = mContext.getExternalFilesDir(null); return file; } + public String getPreferredPebbleAppPackageName() { // returns the package name of the preferred Android Pebble App. return "com.getpebble.android.basalt"; @@ -456,8 +464,8 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac public boolean arePermissionsOK() { boolean allOk = true; - Log.v(TAG,"arePermissionsOK"); - for (int i = 0; i< REQUIRED_PERMISSIONS.length; i++) { + Log.v(TAG, "arePermissionsOK"); + for (int i = 0; i < REQUIRED_PERMISSIONS.length; i++) { if (ContextCompat.checkSelfPermission(mContext, REQUIRED_PERMISSIONS[i]) != PackageManager.PERMISSION_GRANTED) { Log.i(TAG, REQUIRED_PERMISSIONS[i] + " Permission Not Granted"); @@ -469,8 +477,8 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac public boolean areSMSPermissionsOK() { boolean allOk = true; - Log.v(TAG,"areSMSPermissionsOK()"); - for (int i = 0; i< SMS_PERMISSIONS.length; i++) { + Log.v(TAG, "areSMSPermissionsOK()"); + for (int i = 0; i < SMS_PERMISSIONS.length; i++) { if (ContextCompat.checkSelfPermission(mContext, SMS_PERMISSIONS[i]) != PackageManager.PERMISSION_GRANTED) { Log.i(TAG, SMS_PERMISSIONS[i] + " Permission Not Granted"); @@ -481,10 +489,9 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac } - public void requestPermissions(Activity activity) { if (mPermissionsRequested) { - Log.i(TAG,"requestPermissions() - request already sent - not doing anything"); + Log.i(TAG, "requestPermissions() - request already sent - not doing anything"); } else { Log.i(TAG, "requestPermissions() - requesting permissions"); for (int i = 0; i < REQUIRED_PERMISSIONS.length; i++) { @@ -502,7 +509,7 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac public void requestSMSPermissions(Activity activity) { if (mSMSPermissionsRequested) { - Log.i(TAG,"requestSMSPermissions() - request already sent - not doing anything"); + Log.i(TAG, "requestSMSPermissions() - request already sent - not doing anything"); } else { Log.i(TAG, "requestSMSPermissions() - requesting permissions"); for (int i = 0; i < SMS_PERMISSIONS.length; i++) { @@ -522,8 +529,8 @@ public class OsdUtil implements ActivityCompat.OnRequestPermissionsResultCallbac @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { - Log.i(TAG,"onRequestPermissionsResult - Permission" + permissions + " = " + grantResults); - showToast("Permissions Changed - restarting server"); + Log.i(TAG, "onRequestPermissionsResult - Permission" + permissions + " = " + grantResults); + showToast(mContext.getString(R.string.RestartingServerMsg)); stopServer(); // Wait 0.1 second to give the server chance to shutdown, then re-start it mHandler.postDelayed(new Runnable() { diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java index 3f23fe6..1218ee8 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSource.java @@ -128,6 +128,7 @@ public abstract class SdDataSource { public void start() { Log.v(TAG, "start()"); + mUtil.writeToSysLogFile("SdDataSource.start()"); updatePrefs(); // Start timer to check status of watch regularly. mDataStatusTime = new Time(Time.getCurrentTimezone()); @@ -184,6 +185,7 @@ public abstract class SdDataSource { */ public void stop() { Log.v(TAG, "stop()"); + mUtil.writeToSysLogFile("SDDataSource.stop()"); try { // Stop the status timer if (mStatusTimer != null) { @@ -613,7 +615,7 @@ public abstract class SdDataSource { // Only make audible warning beep if we have not received data for more than mFaultTimerPeriod seconds. if (tdiff > (mDataUpdatePeriod + mFaultTimerPeriod) * 1000) { Log.v(TAG, "getStatus() - Watch App Not Running"); - mUtil.writeToSysLogFile("SDDataSourceBLE.getStatus() - Watch App not Running"); + mUtil.writeToSysLogFile("SDDataSource.getStatus() - Watch App not Running"); //mDataStatusTime.setToNow(); mSdData.roiPower = -1; mSdData.specPower = -1; @@ -662,7 +664,7 @@ public abstract class SdDataSource { */ public void updatePrefs() { Log.v(TAG, "updatePrefs()"); - mUtil.writeToSysLogFile("SDDataSourceBLE.updatePrefs()"); + mUtil.writeToSysLogFile("SDDataSource.updatePrefs()"); SharedPreferences SP = PreferenceManager .getDefaultSharedPreferences(mContext); try { @@ -671,8 +673,10 @@ public abstract class SdDataSource { String appRestartTimeoutStr = SP.getString("AppRestartTimeout", "10"); mAppRestartTimeout = Integer.parseInt(appRestartTimeoutStr); Log.v(TAG, "updatePrefs() - mAppRestartTimeout = " + mAppRestartTimeout); + mUtil.writeToSysLogFile( "updatePrefs() - mAppRestartTimeout = " + mAppRestartTimeout); } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem with AppRestartTimeout preference!"); + mUtil.writeToSysLogFile( "updatePrefs() - Problem with AppRestartTimeout preference!"); Toast toast = Toast.makeText(mContext, "Problem Parsing AppRestartTimeout Preference", Toast.LENGTH_SHORT); toast.show(); } @@ -682,8 +686,10 @@ public abstract class SdDataSource { String faultTimerPeriodStr = SP.getString("FaultTimerPeriod", "30"); mFaultTimerPeriod = Integer.parseInt(faultTimerPeriodStr); Log.v(TAG, "updatePrefs() - mFaultTimerPeriod = " + mFaultTimerPeriod); + mUtil.writeToSysLogFile( "updatePrefs() - mFaultTimerPeriod = " + mFaultTimerPeriod); } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem with FaultTimerPeriod preference!"); + mUtil.writeToSysLogFile( "updatePrefs() - Problem with FaultTimerPeriod preference!"); Toast toast = Toast.makeText(mContext, "Problem Parsing FaultTimerPeriod Preference", Toast.LENGTH_SHORT); toast.show(); } @@ -694,106 +700,130 @@ public abstract class SdDataSource { prefStr = SP.getString("BLE_Device_Addr", "SET_FROM_XML"); mBleDeviceAddr = prefStr; Log.v(TAG, "mBLEDeviceAddr=" + mBleDeviceAddr); + mUtil.writeToSysLogFile( "mBLEDeviceAddr=" + mBleDeviceAddr); prefStr = SP.getString("BLE_Device_Name", "SET_FROM_XML"); mBleDeviceName = prefStr; Log.v(TAG, "mBLEDeviceName=" + mBleDeviceName); + mUtil.writeToSysLogFile( "mBLEDeviceName=" + mBleDeviceName); prefStr = SP.getString("PebbleDebug", "SET_FROM_XML"); if (prefStr != null) { mDebug = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() Debug = " + mDebug); + mUtil.writeToSysLogFile( "updatePrefs() Debug = " + mDebug); prefStr = SP.getString("PebbleDisplaySpectrum", "SET_FROM_XML"); mDisplaySpectrum = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() DisplaySpectrum = " + mDisplaySpectrum); + mUtil.writeToSysLogFile( "updatePrefs() DisplaySpectrum = " + mDisplaySpectrum); prefStr = SP.getString("PebbleUpdatePeriod", "SET_FROM_XML"); mDataUpdatePeriod = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() DataUpdatePeriod = " + mDataUpdatePeriod); + mUtil.writeToSysLogFile( "updatePrefs() DataUpdatePeriod = " + mDataUpdatePeriod); prefStr = SP.getString("MutePeriod", "SET_FROM_XML"); mMutePeriod = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() MutePeriod = " + mMutePeriod); + mUtil.writeToSysLogFile( "updatePrefs() MutePeriod = " + mMutePeriod); prefStr = SP.getString("ManAlarmPeriod", "SET_FROM_XML"); mManAlarmPeriod = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() ManAlarmPeriod = " + mManAlarmPeriod); + mUtil.writeToSysLogFile( "updatePrefs() ManAlarmPeriod = " + mManAlarmPeriod); prefStr = SP.getString("PebbleSdMode", "SET_FROM_XML"); mPebbleSdMode = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() PebbleSdMode = " + mPebbleSdMode); + mUtil.writeToSysLogFile( "updatePrefs() PebbleSdMode = " + mPebbleSdMode); prefStr = SP.getString("SampleFreq", "SET_FROM_XML"); mSampleFreq = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() SampleFreq = " + mSampleFreq); + mUtil.writeToSysLogFile( "updatePrefs() SampleFreq = " + mSampleFreq); prefStr = SP.getString("SamplePeriod", "SET_FROM_XML"); mSamplePeriod = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AnalysisPeriod = " + mSamplePeriod); + mUtil.writeToSysLogFile( "updatePrefs() AnalysisPeriod = " + mSamplePeriod); prefStr = SP.getString("AlarmFreqMin", "SET_FROM_XML"); mAlarmFreqMin = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AlarmFreqMin = " + mAlarmFreqMin); + mUtil.writeToSysLogFile( "updatePrefs() AlarmFreqMin = " + mAlarmFreqMin); prefStr = SP.getString("AlarmFreqMax", "SET_FROM_XML"); mAlarmFreqMax = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AlarmFreqMax = " + mAlarmFreqMax); + mUtil.writeToSysLogFile("updatePrefs() AlarmFreqMax = " + mAlarmFreqMax); prefStr = SP.getString("WarnTime", "SET_FROM_XML"); mWarnTime = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() WarnTime = " + mWarnTime); + mUtil.writeToSysLogFile( "updatePrefs() WarnTime = " + mWarnTime); prefStr = SP.getString("AlarmTime", "SET_FROM_XML"); mAlarmTime = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AlarmTime = " + mAlarmTime); + mUtil.writeToSysLogFile( "updatePrefs() AlarmTime = " + mAlarmTime); prefStr = SP.getString("AlarmThresh", "SET_FROM_XML"); mAlarmThresh = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AlarmThresh = " + mAlarmThresh); + mUtil.writeToSysLogFile( "updatePrefs() AlarmThresh = " + mAlarmThresh); prefStr = SP.getString("AlarmRatioThresh", "SET_FROM_XML"); mAlarmRatioThresh = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() AlarmRatioThresh = " + mAlarmRatioThresh); + mUtil.writeToSysLogFile( "updatePrefs() AlarmRatioThresh = " + mAlarmRatioThresh); mFallActive = SP.getBoolean("FallActive", false); Log.v(TAG, "updatePrefs() FallActive = " + mFallActive); + mUtil.writeToSysLogFile( "updatePrefs() FallActive = " + mFallActive); prefStr = SP.getString("FallThreshMin", "SET_FROM_XML"); mFallThreshMin = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() FallThreshMin = " + mFallThreshMin); + mUtil.writeToSysLogFile( "updatePrefs() FallThreshMin = " + mFallThreshMin); prefStr = SP.getString("FallThreshMax", "SET_FROM_XML"); mFallThreshMax = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() FallThreshMax = " + mFallThreshMax); + mUtil.writeToSysLogFile( "updatePrefs() FallThreshMax = " + mFallThreshMax); prefStr = SP.getString("FallWindow", "SET_FROM_XML"); mFallWindow = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() FallWindow = " + mFallWindow); + mUtil.writeToSysLogFile( "updatePrefs() FallWindow = " + mFallWindow); mSdData.mHRAlarmActive = SP.getBoolean("HRAlarmActive", false); Log.v(TAG, "updatePrefs() HRAlarmActive = " + mSdData.mHRAlarmActive); + mUtil.writeToSysLogFile( "updatePrefs() HRAlarmActive = " + mSdData.mHRAlarmActive); mSdData.mHRNullAsAlarm = SP.getBoolean("HRNullAsAlarm", false); Log.v(TAG, "updatePrefs() HRNullAsAlarm = " + mSdData.mHRNullAsAlarm); + mUtil.writeToSysLogFile( "updatePrefs() HRNullAsAlarm = " + mSdData.mHRNullAsAlarm); prefStr = SP.getString("HRThreshMin", "SET_FROM_XML"); mSdData.mHRThreshMin = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() HRThreshMin = " + mSdData.mHRThreshMin); + mUtil.writeToSysLogFile( "updatePrefs() HRThreshMin = " + mSdData.mHRThreshMin); prefStr = SP.getString("HRThreshMax", "SET_FROM_XML"); mSdData.mHRThreshMax = (short) Integer.parseInt(prefStr); Log.v(TAG, "updatePrefs() HRThreshMax = " + mSdData.mHRThreshMax); + mUtil.writeToSysLogFile( "updatePrefs() HRThreshMax = " + mSdData.mHRThreshMax); } else { Log.v(TAG, "updatePrefs() - prefStr is null - WHY????"); - mUtil.writeToSysLogFile("SDDataSourceBLE.updatePrefs() - prefStr is null - WHY??"); + mUtil.writeToSysLogFile("SDDataSource.updatePrefs() - prefStr is null - WHY??"); Toast toast = Toast.makeText(mContext, "Problem Parsing Preferences - Something won't work - Please go back to Settings and correct it!", Toast.LENGTH_SHORT); toast.show(); } } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem parsing preferences!"); - mUtil.writeToSysLogFile("SDDataSourceBLE.updatePrefs() - ERROR " + ex.toString()); + mUtil.writeToSysLogFile("SDDataSource.updatePrefs() - ERROR " + ex.toString()); Toast toast = Toast.makeText(mContext, "Problem Parsing Preferences - Something won't work - Please go back to Settings and correct it!", Toast.LENGTH_SHORT); toast.show(); } diff --git a/app/src/main/java/uk/org/openseizuredetector/SdDataSourceGarmin.java b/app/src/main/java/uk/org/openseizuredetector/SdDataSourceGarmin.java index 7dbf47d..eebc258 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdDataSourceGarmin.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdDataSourceGarmin.java @@ -23,27 +23,10 @@ */ package uk.org.openseizuredetector; -import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; import android.os.Handler; import android.preference.PreferenceManager; -import android.text.format.Time; import android.util.Log; -import android.widget.Toast; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.jtransforms.fft.DoubleFFT_1D; - -import java.util.Arrays; -import java.util.Timer; -import java.util.TimerTask; - -import static java.lang.Long.parseLong; /** diff --git a/app/src/main/java/uk/org/openseizuredetector/SdServer.java b/app/src/main/java/uk/org/openseizuredetector/SdServer.java index 864c25a..d0d4c1c 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdServer.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdServer.java @@ -256,11 +256,11 @@ public class SdServer extends Service implements SdDataReceiver { mSdDataSource = new SdDataSourcePhone(this.getApplicationContext(), mHandler, this); break; default: - Log.e(TAG, "Datasource " + mSdDataSourceName + " not recognised - Defaulting to Pebble"); - mUtil.writeToSysLogFile("SdServer.onStartCommand() - Datasource " + mSdDataSourceName + " not recognised - exiting"); - mUtil.showToast("Datasource " + mSdDataSourceName + " not recognised - Defaulting to Pebble"); - mUtil.writeToSysLogFile("SdServer.onStartCommand() - creating SdDataSourcePebble"); - mSdDataSource = new SdDataSourcePebble(this.getApplicationContext(), mHandler, this); + Log.e(TAG, "Datasource " + mSdDataSourceName + " not recognised - Defaulting to Phone"); + //mUtil.writeToSysLogFile("SdServer.onStartCommand() - Datasource " + mSdDataSourceName + " not recognised - exiting"); + mUtil.showToast(getString(R.string.DatasourceTitle) + " " + mSdDataSourceName + getString(R.string.DefaultingToPhoneMsg)); + mUtil.writeToSysLogFile("SdServer.onStartCommand() - creating SdDataSourcePhone"); + mSdDataSource = new SdDataSourcePhone(this.getApplicationContext(), mHandler, this); } if (mSMSAlarm) { @@ -349,7 +349,7 @@ public class SdServer extends Service implements SdDataReceiver { } catch (Exception e) { Log.e(TAG, "Error Releasing Wakelock - " + e.toString()); mUtil.writeToSysLogFile("SdServer.onDestroy() - Error releasing wakelock."); - mUtil.showToast("Error Releasing Wakelock"); + mUtil.showToast(getString(R.string.ErrorReleasingWakelockMsg)); } } else { Log.d(TAG, "mmm...mWakeLock is null, so not releasing lock. This shouldn't happen!"); @@ -393,10 +393,6 @@ public class SdServer extends Service implements SdDataReceiver { try { - // Cancel the notification. - Log.v(TAG, "onDestroy(): cancelling notification"); - mUtil.writeToSysLogFile("SdServer.onDestroy - cancelling notification"); - mNM.cancel(NOTIFICATION_ID); // Stop web server Log.v(TAG, "onDestroy(): stopping web server"); mUtil.writeToSysLogFile("SdServer.onDestroy() - stopping Web Server"); @@ -406,6 +402,12 @@ public class SdServer extends Service implements SdDataReceiver { mToneGenerator.release(); mToneGenerator = null; + this.stopForeground(true); + // Cancel the notification. + Log.v(TAG, "onDestroy(): cancelling notification"); + mUtil.writeToSysLogFile("SdServer.onDestroy - cancelling notification"); + mNM.cancel(NOTIFICATION_ID); + // stop this service. Log.v(TAG, "onDestroy(): calling stopSelf()"); mUtil.writeToSysLogFile("SdServer.onDestroy() - stopping self"); @@ -589,11 +591,11 @@ public class SdServer extends Service implements SdDataReceiver { sendPhoneAlarm(); mSMSTime = tnow; } else { - mUtil.showToast("SMS Alarm already sent - not re-sending"); + mUtil.showToast(getString(R.string.SMSAlarmAlreadySentMsg)); Log.v(TAG, "SMS Alarm already sent - not re-sending"); } } else { - mUtil.showToast("mSMSAlarm is false - not sending"); + mUtil.showToast(getString(R.string.SMSAlarmDisabledNotSendingMsg)); Log.v(TAG, "mSMSAlarm is false - not sending"); } @@ -625,7 +627,7 @@ public class SdServer extends Service implements SdDataReceiver { sendSMSAlarm(); mSMSTime = tnow; } else { - mUtil.showToast("SMS Alarm already sent - not re-sending"); + mUtil.showToast(getString(R.string.SMSAlarmAlreadySentMsg)); Log.v(TAG, "SMS Alarm already sent - not re-sending"); } } else { @@ -663,7 +665,7 @@ public class SdServer extends Service implements SdDataReceiver { Log.v(TAG, "SMS Alarm already sent - not re-sending"); } } else { - mUtil.showToast("mSMSAlarm is false - not sending"); + mUtil.showToast(getString(R.string.SMSAlarmDisabledNotSendingMsg)); Log.v(TAG, "mSMSAlarm is false - not sending"); } @@ -724,7 +726,7 @@ public class SdServer extends Service implements SdDataReceiver { mToneGenerator.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, duration); Log.v(TAG, "beep()"); } else { - mUtil.showToast("Warning mToneGenerator is null - not beeping!!!"); + mUtil.showToast(getString(R.string.PleaseForceStopOSDorRebootMsg)); Log.v(TAG, "beep() - Warming mToneGenerator is null - not beeping!!!"); mUtil.writeToSysLogFile("SdServer.beep() - mToneGenerator is null???"); } @@ -806,7 +808,7 @@ public class SdServer extends Service implements SdDataReceiver { if (mSMSAlarm) { if (!mCancelAudible) { if (!mUtil.areSMSPermissionsOK()) { - mUtil.showToast("ERROR - Permission for SMS or Location Denied - Not Sending SMS"); + mUtil.showToast(getString(R.string.SMSPermissionsDeniedMsg)); Log.e(TAG, "ERROR - Permission for SMS or Location Denied - Not Sending SMS"); } else { //mSMSAlertDialog = new AlertDialog.Builder(this); @@ -978,7 +980,7 @@ public class SdServer extends Service implements SdDataReceiver { Log.i(TAG, "startWebServer()"); mUtil.writeToSysLogFile("SdServer.Start Web Server."); if (webServer == null) { - webServer = new SdWebServer(getApplicationContext(), mUtil.getDataStorageDir(), mSdData, this); + webServer = new SdWebServer(getApplicationContext(), mSdData, this); try { webServer.start(); } catch (IOException ioe) { @@ -1009,6 +1011,7 @@ public class SdServer extends Service implements SdDataReceiver { } else { if (webServer.isAlive()) { Log.w(TAG, "stopWebServer() - server still alive???"); + mUtil.writeToSysLogFile( "stopWebServer() - server still alive???"); } else { mUtil.writeToSysLogFile("stopWebServer() - server died ok"); Log.v(TAG, "stopWebServer() - server died ok"); @@ -1025,7 +1028,7 @@ public class SdServer extends Service implements SdDataReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "NetworkBroadCastReceiver.onReceive"); - //mUtil.writeToSysLogFile("Network State Changed" + intent.getAction()); + mUtil.writeToSysLogFile("NetworkBroadcastReceiver.onReceive(): Network State Changed" + intent.getAction()); //mUtil.showToast("Network State Changed" + intent.getAction()); ConnectivityManager cm = @@ -1086,53 +1089,71 @@ public class SdServer extends Service implements SdDataReceiver { try { mSdDataSourceName = SP.getString("DataSource", "Pebble"); Log.v(TAG, "updatePrefs() - DataSource = " + mSdDataSourceName); + mUtil.writeToSysLogFile("updatePrefs() - DataSource = " + mSdDataSourceName); mLatchAlarms = SP.getBoolean("LatchAlarms", false); Log.v(TAG, "updatePrefs() - mLatchAlarms = " + mLatchAlarms); + mUtil.writeToSysLogFile("updatePrefs() - mLatchAlarms = " + mLatchAlarms); // Parse the LatchAlarmPeriod setting. try { String latchAlarmPeriodStr = SP.getString("LatchAlarmTimerPeriod", "30"); mLatchAlarmPeriod = Integer.parseInt(latchAlarmPeriodStr); Log.v(TAG, "updatePrefs() - mLatchAlarmTimerPeriod = " + mLatchAlarmPeriod); + mUtil.writeToSysLogFile("updatePrefs() - mLatchAlarmTimerPeriod = " + mLatchAlarmPeriod); } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem with LatchAlarmTimerPeriod preference!"); - mUtil.showToast("Problem Parsing LatchAlarmTimerPeriod Preference"); + mUtil.writeToSysLogFile( "updatePrefs() - Problem with LatchAlarmTimerPeriod preference!"); + mUtil.showToast(getString(R.string.problem_parsing_preferences)); } mAudibleFaultWarning = SP.getBoolean("AudibleFaultWarning", true); Log.v(TAG, "updatePrefs() - mAuidbleFaultWarning = " + mAudibleFaultWarning); + mUtil.writeToSysLogFile("updatePrefs() - mAuidbleFaultWarning = " + mAudibleFaultWarning); // Parse the faultTimer period setting. try { String faultTimerPeriodStr = SP.getString("FaultTimerPeriod", "30"); mFaultTimerPeriod = Integer.parseInt(faultTimerPeriodStr); Log.v(TAG, "updatePrefs() - mFaultTimerPeriod = " + mFaultTimerPeriod); + mUtil.writeToSysLogFile("updatePrefs() - mFaultTimerPeriod = " + mFaultTimerPeriod); } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem with FaultTimerPeriod preference!"); - mUtil.showToast("Problem Parsing FaultTimerPeriod Preference"); + mUtil.writeToSysLogFile("updatePrefs() - Problem with FaultTimerPeriod preference!"); + mUtil.showToast(getString(R.string.problem_parsing_preferences)); } mAudibleAlarm = SP.getBoolean("AudibleAlarm", true); Log.v(TAG, "updatePrefs() - mAuidbleAlarm = " + mAudibleAlarm); + mUtil.writeToSysLogFile("updatePrefs() - mAuidbleAlarm = " + mAudibleAlarm); mAudibleWarning = SP.getBoolean("AudibleWarning", true); Log.v(TAG, "updatePrefs() - mAuidbleWarning = " + mAudibleWarning); + mUtil.writeToSysLogFile("updatePrefs() - mAuidbleWarning = " + mAudibleWarning); mMp3Alarm = SP.getBoolean("UseMp3Alarm", false); Log.v(TAG, "updatePrefs() - mMp3Alarm = " + mMp3Alarm); + mUtil.writeToSysLogFile( "updatePrefs() - mMp3Alarm = " + mMp3Alarm); mSMSAlarm = SP.getBoolean("SMSAlarm", false); Log.v(TAG, "updatePrefs() - mSMSAlarm = " + mSMSAlarm); + mUtil.writeToSysLogFile( "updatePrefs() - mSMSAlarm = " + mSMSAlarm); mPhoneAlarm = SP.getBoolean("PhoneCallAlarm", false); Log.v(TAG, "updatePrefs() - mSMSAlarm = " + mSMSAlarm); + mUtil.writeToSysLogFile( "updatePrefs() - mSMSAlarm = " + mSMSAlarm); String SMSNumberStr = SP.getString("SMSNumbers", ""); mSMSNumbers = SMSNumberStr.split(","); mSMSMsgStr = SP.getString("SMSMsg", "Seizure Detected!!!"); Log.v(TAG, "updatePrefs() - SMSNumberStr = " + SMSNumberStr); + mUtil.writeToSysLogFile( "updatePrefs() - SMSNumberStr = " + SMSNumberStr); Log.v(TAG, "updatePrefs() - mSMSNumbers = " + mSMSNumbers); + mUtil.writeToSysLogFile( "updatePrefs() - mSMSNumbers = " + mSMSNumbers); mLogAlarms = SP.getBoolean("LogAlarms", true); Log.v(TAG, "updatePrefs() - mLogAlarms = " + mLogAlarms); + mUtil.writeToSysLogFile("updatePrefs() - mLogAlarms = " + mLogAlarms); mLogData = SP.getBoolean("LogData", true); Log.v(TAG, "updatePrefs() - mLogData = " + mLogData); + mUtil.writeToSysLogFile( "updatePrefs() - mLogData = " + mLogData); mLogDataRemote = SP.getBoolean("LogDataRemote", false); Log.v(TAG, "updatePrefs() - mLogDataRemote = " + mLogDataRemote); + mUtil.writeToSysLogFile( "updatePrefs() - mLogDataRemote = " + mLogDataRemote); mLogDataRemoteMobile = SP.getBoolean("LogDataRemoteMobile", false); Log.v(TAG, "updatePrefs() - mLogDataRemoteMobile = " + mLogDataRemoteMobile); + mUtil.writeToSysLogFile("updatePrefs() - mLogDataRemoteMobile = " + mLogDataRemoteMobile); mOSDUname = SP.getString("OSDUname", ""); Log.v(TAG, "updatePrefs() - mOSDUname = " + mOSDUname); mOSDPasswd = SP.getString("OSDPasswd", ""); @@ -1141,6 +1162,7 @@ public class SdServer extends Service implements SdDataReceiver { Log.v(TAG, "updatePrefs() - mOSDWearerId = " + mOSDWearerId); mOSDUrl = SP.getString("OSDUrl", "http://openseizuredetector.org.uk/webApi"); Log.v(TAG, "updatePrefs() - mOSDUrl = " + mOSDUrl); + mUtil.writeToSysLogFile( "updatePrefs() - mOSDUrl = " + mOSDUrl); } catch (Exception ex) { Log.v(TAG, "updatePrefs() - Problem parsing preferences!"); mUtil.writeToSysLogFile("SdServer.updatePrefs() - Error " + ex.toString()); @@ -1184,7 +1206,7 @@ public class SdServer extends Service implements SdDataReceiver { // Open output directory on SD Card. if (mUtil.isExternalStorageWritable()) { try { - FileWriter of = new FileWriter(mUtil.getDataStorageDir().toString() + FileWriter of = new FileWriter(getExternalFilesDir(null).toString() + "/" + fname, true); if (mSdData != null) { if (alarm) { diff --git a/app/src/main/java/uk/org/openseizuredetector/SdWebServer.java b/app/src/main/java/uk/org/openseizuredetector/SdWebServer.java index 35d0647..2b0e182 100644 --- a/app/src/main/java/uk/org/openseizuredetector/SdWebServer.java +++ b/app/src/main/java/uk/org/openseizuredetector/SdWebServer.java @@ -2,6 +2,7 @@ package uk.org.openseizuredetector; import android.content.Context; import android.content.res.AssetManager; +import android.os.Handler; import android.util.Log; import org.json.JSONArray; @@ -28,15 +29,17 @@ public class SdWebServer extends NanoHTTPD { private SdData mSdData; private SdServer mSdServer; private Context mContext; - private File mDataStorageDir = null; + private Handler mHandler; + private OsdUtil mUtil; - public SdWebServer(Context context, File storageDir, SdData sdData, SdServer sdServer) { + public SdWebServer(Context context, SdData sdData, SdServer sdServer) { // Set the port to listen on (8080) super(8080); mSdData = sdData; mContext = context; mSdServer = sdServer; - mDataStorageDir = storageDir; + mHandler = new Handler(); + mUtil = new OsdUtil(mContext, mHandler); } public void setSdData(SdData sdData) { @@ -235,16 +238,16 @@ public class SdWebServer extends NanoHTTPD { if (uriParts.countTokens() == 1) { Log.v(TAG, "Returning list of files"); - File dirs = mDataStorageDir; try { JSONObject jsonObj = new JSONObject(); - if (dirs.exists()) { - String[] fileList = dirs.list(); - JSONArray arr = new JSONArray(); - for (int i = 0; i < fileList.length; i++) - arr.put(fileList[i]); + File[] fileList = mUtil.getDataFilesList(); + Log.v(TAG, "serveLogFile(): fileList=" + fileList.toString()+", length="+fileList.length); + JSONArray arr = new JSONArray(); + for (int i = 0; i < fileList.length; i++) { + Log.v(TAG, "serveLogFile(): file[" + i + "]=" + fileList[i]); + arr.put(fileList[i].getName()); + } jsonObj.put("logFileList", arr); - } res = new NanoHTTPD.Response(NanoHTTPD.Response.Status.OK, "text/html", jsonObj.toString()); } catch (Exception ex) { @@ -256,7 +259,7 @@ public class SdWebServer extends NanoHTTPD { uripart = uriParts.nextToken(); // This will just be /logs uripart = uriParts.nextToken(); // this is the requested file. - String fname = mDataStorageDir.toString() + "/" + uripart; + String fname = mUtil.getDataStorageDir().toString() + "/" + uripart; Log.v(TAG, "serveLogFile - uri=" + uri + ", fname=" + fname); ip = new FileInputStream(fname); String mimeStr = "text/html"; diff --git a/app/src/main/res/layout/main.xml b/app/src/main/res/layout/main.xml index 0cfbf24..0fdb82d 100644 --- a/app/src/main/res/layout/main.xml +++ b/app/src/main/res/layout/main.xml @@ -122,13 +122,13 @@ android:id="@+id/acceptAlarmButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="Accept Alarm" /> + android:text="@string/AcceptAlarmBtnTxt" />