Updated permissions handling so it can target Android 14 (API 34) which is a requirement of Play Store
This commit is contained in:
@@ -7,7 +7,7 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "uk.org.openseizuredetector"
|
applicationId "uk.org.openseizuredetector"
|
||||||
minSdkVersion 23 // Android 6
|
minSdkVersion 23 // Android 6
|
||||||
targetSdkVersion 33 // Android 13 = 33
|
targetSdkVersion 34 // Android 14 = 34
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:versionCode="146"
|
android:versionCode="147"
|
||||||
android:versionName="4.2.11x2">
|
android:versionName="4.3.0a">
|
||||||
<!-- android:allowBackup="false" -->
|
<!-- android:allowBackup="false" -->
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
|
||||||
@@ -12,6 +12,8 @@
|
|||||||
android:maxSdkVersion="30" />
|
android:maxSdkVersion="30" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
<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.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
@@ -80,6 +82,7 @@
|
|||||||
|
|
||||||
<service
|
<service
|
||||||
android:name=".SdServer"
|
android:name=".SdServer"
|
||||||
|
android:foregroundServiceType="health"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|
||||||
<activity android:name=".LogManagerControlActivity" />
|
<activity android:name=".LogManagerControlActivity" />
|
||||||
|
|||||||
@@ -116,6 +116,15 @@ public class OsdUtil {
|
|||||||
};
|
};
|
||||||
public String[] BT_PERMISSIONS;
|
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) {
|
public OsdUtil(Context context, Handler handler) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mHandler = handler;
|
mHandler = handler;
|
||||||
@@ -780,6 +789,33 @@ public class OsdUtil {
|
|||||||
return allOk;
|
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) {
|
public double parseToDouble(String userInput) {
|
||||||
/**
|
/**
|
||||||
* Parse a string to a double value, taking localisation into account.
|
* Parse a string to a double value, taking localisation into account.
|
||||||
|
|||||||
@@ -88,8 +88,10 @@ public class StartupActivity extends AppCompatActivity {
|
|||||||
private boolean mLocationPermissions2Requested;
|
private boolean mLocationPermissions2Requested;
|
||||||
private boolean mSmsPermissionsRequested;
|
private boolean mSmsPermissionsRequested;
|
||||||
private boolean mPermissionsRequested;
|
private boolean mPermissionsRequested;
|
||||||
|
private boolean mActivityPermissionsRequested = false;
|
||||||
private boolean mBindInProgress = false;
|
private boolean mBindInProgress = false;
|
||||||
|
|
||||||
|
|
||||||
public final String[] REQUIRED_PERMISSIONS = {
|
public final String[] REQUIRED_PERMISSIONS = {
|
||||||
//Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
//Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||||
Manifest.permission.WAKE_LOCK,
|
Manifest.permission.WAKE_LOCK,
|
||||||
@@ -329,13 +331,21 @@ public class StartupActivity extends AppCompatActivity {
|
|||||||
requestBTPermissions();
|
requestBTPermissions();
|
||||||
allOk = false;
|
allOk = false;
|
||||||
} else if (mBleDeviceAddr.equals("")) {
|
} else if (mBleDeviceAddr.equals("")) {
|
||||||
Log.i(TAG,"BLE data source selected, but no device address specified - starting BLEScanActivity");
|
Log.i(TAG, "BLE data source selected, but no device address specified - starting BLEScanActivity");
|
||||||
Intent i;
|
Intent i;
|
||||||
i = new Intent(getApplicationContext(), BLEScanActivity.class);
|
i = new Intent(getApplicationContext(), BLEScanActivity.class);
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
finish();
|
finish();
|
||||||
return;
|
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()) {
|
} else if (smsAlarmsActive && !areSMSPermissions1OK()) {
|
||||||
Log.i(TAG, "SMS permissions NOT OK");
|
Log.i(TAG, "SMS permissions NOT OK");
|
||||||
tv.setText(getString(R.string.SmsPermissionWarning));
|
tv.setText(getString(R.string.SmsPermissionWarning));
|
||||||
@@ -699,6 +709,7 @@ public class StartupActivity extends AppCompatActivity {
|
|||||||
return allOk;
|
return allOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean areSMSPermissions1OK() {
|
public boolean areSMSPermissions1OK() {
|
||||||
boolean allOk = true;
|
boolean allOk = true;
|
||||||
Log.v(TAG, "areSMSPermissions1 OK()");
|
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
|
@Override
|
||||||
public void onRequestPermissionsResult(int requestCode,
|
public void onRequestPermissionsResult(int requestCode,
|
||||||
String permissions[], int[] grantResults) {
|
String permissions[], int[] grantResults) {
|
||||||
|
|||||||
26
app/src/main/res/layout/activity_main_simple.xml
Normal file
26
app/src/main/res/layout/activity_main_simple.xml
Normal 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>
|
||||||
@@ -578,4 +578,7 @@
|
|||||||
<string name="restart_server">Restart Server</string>
|
<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_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="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>
|
</resources>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class SdAlgHrTest extends TestCase {
|
|||||||
mSdAlgHr.checkHr(60.);
|
mSdAlgHr.checkHr(60.);
|
||||||
mSdAlgHr.checkHr(70.);
|
mSdAlgHr.checkHr(70.);
|
||||||
mSdAlgHr.checkHr(80.);
|
mSdAlgHr.checkHr(80.);
|
||||||
double hrAv = mSdAlgHr.getAverageHrVal();
|
double hrAv = mSdAlgHr.getAverageHrAverage();
|
||||||
assertEquals(hrAv, 70);
|
assertEquals(hrAv, 70);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@ buildscript {
|
|||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
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'
|
classpath 'com.google.gms:google-services:4.3.15'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
|||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user