Updated permissions handling so it can target Android 14 (API 34) which is a requirement of Play Store

This commit is contained in:
Graham Jones
2024-07-12 20:36:09 +01:00
parent c483795d44
commit db60f7f095
9 changed files with 114 additions and 8 deletions

View File

@@ -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
}

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:versionCode="146"
android:versionName="4.2.11x2">
android:versionCode="147"
android:versionName="4.3.0a">
<!-- android:allowBackup="false" -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
@@ -12,6 +12,8 @@
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@@ -80,6 +82,7 @@
<service
android:name=".SdServer"
android:foregroundServiceType="health"
android:exported="false" />
<activity android:name=".LogManagerControlActivity" />

View File

@@ -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.

View File

@@ -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) {

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/versionTv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name" />
<androidx.fragment.app.FragmentContainerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_common_container_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/fragment_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

View File

@@ -578,4 +578,7 @@
<string name="restart_server">Restart Server</string>
<string name="error_failed_to_create_local_event">ERROR: failed to create local event</string>
<string name="error_failed_to_start_log_manager">ERROR: Failed to start Log Manager</string>
<string name="ActivityPermissionWarning">Problem with Activity Detection Permissions</string>
<string name="activity_permissions_required">Activity Detection Permission Required.</string>
<string name="activity_permissions_rationale">Permission required to analyse your movements to detect seizure activity.</string>
</resources>

View File

@@ -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);
}
}