diff --git a/app/build.gradle b/app/build.gradle index 7b98881..1b6f2a2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ android { defaultConfig { applicationId "uk.org.openseizuredetector" minSdkVersion 23 // Android 6 - targetSdkVersion 33 // Android 13 = 33 + targetSdkVersion 34 // Android 14 = 34 multiDexEnabled true } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8c730ed..14bd92a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="147" + android:versionName="4.3.0a"> @@ -12,6 +12,8 @@ android:maxSdkVersion="30" /> + + @@ -80,6 +82,7 @@ diff --git a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java index 4b86b0b..b44ca30 100644 --- a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java +++ b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java @@ -116,6 +116,15 @@ public class OsdUtil { }; public String[] BT_PERMISSIONS; + public final String[] ACTIVITY_PERMISSIONS_API34 = { + Manifest.permission.FOREGROUND_SERVICE_HEALTH, + Manifest.permission.ACTIVITY_RECOGNITION + }; + + public final String[] ACTIVITY_PERMISSIONS_OLD = {}; + public String[] ACTIVITY_PERMISSIONS; + + public OsdUtil(Context context, Handler handler) { mContext = context; mHandler = handler; @@ -780,6 +789,33 @@ public class OsdUtil { return allOk; } + public String[] getRequiredActivityPermissions() { + // API 34 is Android 14 - see https://developer.android.com/develop/connectivity/bluetooth/bt-permissions + if (Build.VERSION.SDK_INT >= 34) { + Log.d(TAG, "getRequiredActivityPermissions() - using new Activity Permissions"); + ACTIVITY_PERMISSIONS = ACTIVITY_PERMISSIONS_API34; + } else { + Log.d(TAG, "getRequiredActivityPermissions() - using old Activity Permissions"); + ACTIVITY_PERMISSIONS = ACTIVITY_PERMISSIONS_OLD; + } + return (ACTIVITY_PERMISSIONS); + } + public boolean areActivityPermissionsOk() { + String[] activityPermissions = getRequiredActivityPermissions(); + boolean allOk = true; + Log.d(TAG, "areActivityPermissions OK()"); + for (int i = 0; i < activityPermissions.length; i++) { + if (ContextCompat.checkSelfPermission(mContext, activityPermissions[i]) + != PackageManager.PERMISSION_GRANTED) { + Log.i(TAG, activityPermissions[i] + " Permission Not Granted"); + allOk = false; + } + } + return allOk; + } + + + public double parseToDouble(String userInput) { /** * Parse a string to a double value, taking localisation into account. diff --git a/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java b/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java index dde3e9e..4ee024e 100644 --- a/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java +++ b/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java @@ -88,8 +88,10 @@ public class StartupActivity extends AppCompatActivity { private boolean mLocationPermissions2Requested; private boolean mSmsPermissionsRequested; private boolean mPermissionsRequested; + private boolean mActivityPermissionsRequested = false; private boolean mBindInProgress = false; + public final String[] REQUIRED_PERMISSIONS = { //Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.WAKE_LOCK, @@ -328,14 +330,22 @@ public class StartupActivity extends AppCompatActivity { //pb.setProgressDrawable(getResources().getDrawable(R.drawable.start_server)); requestBTPermissions(); allOk = false; - } else if (mBleDeviceAddr.equals("")) { - Log.i(TAG,"BLE data source selected, but no device address specified - starting BLEScanActivity"); + } else if (mBleDeviceAddr.equals("")) { + Log.i(TAG, "BLE data source selected, but no device address specified - starting BLEScanActivity"); Intent i; i = new Intent(getApplicationContext(), BLEScanActivity.class); startActivity(i); finish(); return; } + } else if (!mUtil.areActivityPermissionsOk()) { + Log.i(TAG, "Activity permissions NOT OK"); + tv.setText(getString(R.string.ActivityPermissionWarning)); + tv.setBackgroundColor(alarmColour); + tv.setTextColor(alarmTextColour); + requestActivityPermissions(); + allOk = false; + } else if (smsAlarmsActive && !areSMSPermissions1OK()) { Log.i(TAG, "SMS permissions NOT OK"); tv.setText(getString(R.string.SmsPermissionWarning)); @@ -699,6 +709,7 @@ public class StartupActivity extends AppCompatActivity { return allOk; } + public boolean areSMSPermissions1OK() { boolean allOk = true; Log.v(TAG, "areSMSPermissions1 OK()"); @@ -879,6 +890,33 @@ public class StartupActivity extends AppCompatActivity { } } + public void requestActivityPermissions() { + if (mActivityPermissionsRequested) { + Log.i(TAG, "requestActivityPermissions() - request already sent - not doing anything"); + } else { + Log.i(TAG, "requestActivityPermissions() - requesting permissions"); + mActivityPermissionsRequested = true; + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( + this); + alertDialogBuilder + .setTitle(R.string.activity_permissions_required) + .setMessage(R.string.activity_permissions_rationale) + .setCancelable(false) + .setPositiveButton(getString(R.string.okBtnTxt), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + Log.i(TAG, "requestActivityPermissions(): Launching ActivityCompat.requestPermissions()"); + ActivityCompat.requestPermissions(StartupActivity.this, + mUtil.getRequiredActivityPermissions(), + 49); + } + }) + .create().show(); + } + } + + + @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { diff --git a/app/src/main/res/layout/activity_main_simple.xml b/app/src/main/res/layout/activity_main_simple.xml new file mode 100644 index 0000000..a00ae34 --- /dev/null +++ b/app/src/main/res/layout/activity_main_simple.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9611f5..f7b9b39 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -578,4 +578,7 @@ Restart Server ERROR: failed to create local event ERROR: Failed to start Log Manager + Problem with Activity Detection Permissions + Activity Detection Permission Required. + Permission required to analyse your movements to detect seizure activity. diff --git a/app/src/test/java/uk/org/openseizuredetector/SdAlgHrTest.java b/app/src/test/java/uk/org/openseizuredetector/SdAlgHrTest.java index 859a642..64a78f9 100644 --- a/app/src/test/java/uk/org/openseizuredetector/SdAlgHrTest.java +++ b/app/src/test/java/uk/org/openseizuredetector/SdAlgHrTest.java @@ -57,7 +57,7 @@ public class SdAlgHrTest extends TestCase { mSdAlgHr.checkHr(60.); mSdAlgHr.checkHr(70.); mSdAlgHr.checkHr(80.); - double hrAv = mSdAlgHr.getAverageHrVal(); + double hrAv = mSdAlgHr.getAverageHrAverage(); assertEquals(hrAv, 70); } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1166b18..8611b29 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.2' + classpath 'com.android.tools.build:gradle:8.4.1' classpath 'com.google.gms:google-services:4.3.15' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3f8e9a4..87fdfe6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip