diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8bc2ed7..6305fa1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,8 +5,11 @@
android:versionName="4.2.6c">
-
-
+
+
+
diff --git a/app/src/main/java/uk/org/openseizuredetector/BLEScanActivity.java b/app/src/main/java/uk/org/openseizuredetector/BLEScanActivity.java
index 91f8c72..35e440a 100644
--- a/app/src/main/java/uk/org/openseizuredetector/BLEScanActivity.java
+++ b/app/src/main/java/uk/org/openseizuredetector/BLEScanActivity.java
@@ -29,13 +29,16 @@ import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanResult;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
+import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -48,6 +51,7 @@ import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
@@ -66,17 +70,11 @@ public class BLEScanActivity extends ListActivity {
private Handler mHandler;
private boolean bleAvailable = false;
+ private OsdUtil mUtil;
+
private boolean mPermissionsRequested = false;
private final String TAG = "BLEScanActivity";
- private final String[] REQUIRED_PERMISSIONS = {
- //Manifest.permission.ACCESS_FINE_LOCATION,
- //Manifest.permission.ACCESS_COARSE_LOCATION,
- //Manifest.permission.BLUETOOTH,
- Manifest.permission.BLUETOOTH_ADMIN,
- Manifest.permission.BLUETOOTH_SCAN,
- //Manifest.permission.BLUETOOTH_PRIVILEGED,
- };
private static final int REQUEST_ENABLE_BT = 1;
// Stops scanning after 10 seconds.
@@ -98,6 +96,7 @@ public class BLEScanActivity extends ListActivity {
//this.getActionBar().setTitle(R.string.title_devices);
this.setTitle(R.string.title_devices);
mHandler = new Handler();
+ mUtil = new OsdUtil(this, mHandler);
// Use this check to determine whether BLE is supported on the device. Then you can
// selectively disable BLE-related features.
@@ -205,23 +204,16 @@ public class BLEScanActivity extends ListActivity {
tv.setBackgroundColor(okColour);
}
- Log.i(TAG,"onResume - calling requestBTPermissions()");
- requestBTPermissions(this);
-
- Log.i(TAG,"onResume - checking permissions");
- boolean permissionsOk = true;
- for (int i = 0; i < REQUIRED_PERMISSIONS.length; i++) {
- if (ContextCompat.checkSelfPermission(this, REQUIRED_PERMISSIONS[i]) == PERMISSION_GRANTED) {
- Log.i(TAG, "Permission " + REQUIRED_PERMISSIONS[i] + " OK");
- } else {
- Log.e(TAG, "Permission " + REQUIRED_PERMISSIONS[i] + " NOT GRANTED");
- permissionsOk = false;
- Toast.makeText(this, "ERROR - Permission " + REQUIRED_PERMISSIONS[i] + " not Granted - this will not work!!!!!", Toast.LENGTH_SHORT).show();
- }
+ if (!mUtil.areBtPermissionsOk()) {
+ Log.i(TAG, "onResume - calling requestBTPermissions()");
+ requestBTPermissions(this);
+ } else {
+ Log.i(TAG, "onResume - Bluetooth Permissions OK");
}
+
tv = (TextView) findViewById(R.id.ble_perm1_tv);
- if (permissionsOk) {
+ if (mUtil.areBtPermissionsOk()) {
tv.setText("Permissions required for Bluetooth Granted OK");
tv.setBackgroundColor(okColour);
tv.setTextColor(okTextColour);
@@ -294,17 +286,44 @@ public class BLEScanActivity extends ListActivity {
Log.i(TAG, "requestBTPermissions() - request already sent - not doing anything");
} else {
Log.i(TAG, "requestBTPermissions() - showing rationale (if necessary)");
- for (int i = 0; i < REQUIRED_PERMISSIONS.length; i++) {
+ boolean showRationale = false;
+ String btPermissions[] = mUtil.getRequiredBtPermissions();
+ for (int i = 0; i < btPermissions.length; i++) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
- REQUIRED_PERMISSIONS[i])) {
- Log.i(TAG, "shouldShowRationale for permission" + REQUIRED_PERMISSIONS[i]);
- Toast toast = Toast.makeText(this, "Please give us permission! ", Toast.LENGTH_SHORT);
+ btPermissions[i])) {
+ Log.i(TAG, "shouldShowRationale for permission" + btPermissions[i]);
+ showRationale = true;
+ Toast toast = Toast.makeText(this, "Please give us permission! "+ btPermissions[i], Toast.LENGTH_SHORT);
toast.show();
}
}
+ if (showRationale) {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
+ this);
+ alertDialogBuilder
+ .setTitle(getString(R.string.permissions_required))
+ .setMessage("Additional Permissions are required to scan for Bluetooth Devices - please grant the permissions in the following dialogs")
+ .setCancelable(false)
+ .setNegativeButton(getString(R.string.closeBtnTxt), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ finish();
+ }
+ })
+ .setPositiveButton("OK", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ })
+ .create()
+ .show();
+ } else {
+ Log.i(TAG,"requestBTPermissions() - rationale display not required");
+ }
+
Log.i(TAG, "requestBTPermissions() - requesting permissions");
ActivityCompat.requestPermissions(activity,
- REQUIRED_PERMISSIONS,
+ btPermissions,
42);
mPermissionsRequested = true;
}
@@ -315,11 +334,11 @@ public class BLEScanActivity extends ListActivity {
try {
mBluetoothLeScanner.startScan(mLeScanCallback);
} catch (SecurityException e) {
- Log.e(TAG, "startScan - SecurityException while starting scan");
+ Log.e(TAG, "startScan - SecurityException while starting scan:" +e.getMessage());
Toast toast = Toast.makeText(this, "ERROR - Security Exception "+e.getMessage(), Toast.LENGTH_SHORT);
toast.show();
} catch (Exception e) {
- Log.e(TAG,"startScan - Exception while starting scan");
+ Log.e(TAG,"startScan - Exception while starting scan:"+e.getMessage());
Toast toast = Toast.makeText(this, "ERROR Starting Scan", Toast.LENGTH_SHORT);
toast.show();
}
diff --git a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java
index 07bbbd0..2dee41e 100644
--- a/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java
+++ b/app/src/main/java/uk/org/openseizuredetector/OsdUtil.java
@@ -99,6 +99,21 @@ public class OsdUtil {
private static int mNbound = 0;
+ public final String[] BT_PERMISSIONS_API30 = {
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.BLUETOOTH_SCAN,
+ //Manifest.permission.BLUETOOTH_ADMIN,
+ Manifest.permission.BLUETOOTH_CONNECT,
+ };
+ public final String[] BT_PERMISSIONS_OLD = {
+ Manifest.permission.ACCESS_FINE_LOCATION,
+ Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.BLUETOOTH,
+ Manifest.permission.BLUETOOTH_ADMIN,
+ };
+ public String[] BT_PERMISSIONS;
+
public OsdUtil(Context context, Handler handler) {
mContext = context;
mHandler = handler;
@@ -737,4 +752,30 @@ public class OsdUtil {
}
}
+
+ public String[] getRequiredBtPermissions() {
+ // API 31 is Android 12 - see https://developer.android.com/develop/connectivity/bluetooth/bt-permissions
+ if (Build.VERSION.SDK_INT >= 31) {
+ Log.d(TAG, "getRequiredBtPermissions() - using new Bluetooth Permissions");
+ BT_PERMISSIONS = BT_PERMISSIONS_API30;
+ } else {
+ Log.d(TAG, "getRequiredBtPermissions() - using old Bluetooth Permissions");
+ BT_PERMISSIONS = BT_PERMISSIONS_OLD;
+ }
+ return (BT_PERMISSIONS);
+ }
+ public boolean areBtPermissionsOk() {
+ String[] btPermissions = getRequiredBtPermissions();
+ boolean allOk = true;
+ Log.d(TAG, "areBTPermissions OK()");
+ for (int i = 0; i < btPermissions.length; i++) {
+ if (ContextCompat.checkSelfPermission(mContext, btPermissions[i])
+ != PackageManager.PERMISSION_GRANTED) {
+ Log.i(TAG, btPermissions[i] + " Permission Not Granted");
+ allOk = false;
+ }
+ }
+ return allOk;
+ }
+
}
diff --git a/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java b/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java
index 8d444c7..dde3e9e 100644
--- a/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java
+++ b/app/src/main/java/uk/org/openseizuredetector/StartupActivity.java
@@ -34,6 +34,7 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
@@ -112,14 +113,7 @@ public class StartupActivity extends AppCompatActivity {
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
};
- public final String[] BT_PERMISSIONS = {
- Manifest.permission.ACCESS_FINE_LOCATION,
- Manifest.permission.ACCESS_COARSE_LOCATION,
- //Manifest.permission.BLUETOOTH,
- //Manifest.permission.BLUETOOTH_SCAN,
- //Manifest.permission.BLUETOOTH_ADMIN,
- Manifest.permission.BLUETOOTH_CONNECT,
- };
+ private String[] BT_PERMISSIONS;
private boolean mBTPermissionsRequested = false;
private String mSdDataSourceName;
private String mBleDeviceAddr;
@@ -325,7 +319,7 @@ public class StartupActivity extends AppCompatActivity {
pb.setProgressDrawable(getResources().getDrawable(R.drawable.start_server));
if (mSdDataSourceName.equals("BLE") || mSdDataSourceName.equals("BLE2")) {
- if (!areBTPermissionsOK()) {
+ if (!mUtil.areBtPermissionsOk()) {
Log.i(TAG, "Bluetooth permissions NOT OK");
tv.setText(getString(R.string.BTPermissionWarning));
tv.setBackgroundColor(alarmColour);
@@ -335,7 +329,7 @@ public class StartupActivity extends AppCompatActivity {
requestBTPermissions();
allOk = false;
} else if (mBleDeviceAddr.equals("")) {
- Log.i(TAG,"BLE daa source selected, but no device address specified");
+ Log.i(TAG,"BLE data source selected, but no device address specified - starting BLEScanActivity");
Intent i;
i = new Intent(getApplicationContext(), BLEScanActivity.class);
startActivity(i);
@@ -750,19 +744,6 @@ public class StartupActivity extends AppCompatActivity {
return allOk;
}
- public boolean areBTPermissionsOK() {
- boolean allOk = true;
- Log.d(TAG, "areBTPermissions OK()");
- for (int i = 0; i < BT_PERMISSIONS.length; i++) {
- if (ContextCompat.checkSelfPermission(this, BT_PERMISSIONS[i])
- != PackageManager.PERMISSION_GRANTED) {
- Log.d(TAG, BT_PERMISSIONS[i] + " Permission Not Granted");
- allOk = false;
- }
- }
- return allOk;
- }
-
public void requestPermissions(AppCompatActivity activity) {
@@ -890,16 +871,10 @@ public class StartupActivity extends AppCompatActivity {
dialog.cancel();
Log.i(TAG, "requestBTPermissions(): Launching ActivityCompat.requestPermissions()");
ActivityCompat.requestPermissions(StartupActivity.this,
- BT_PERMISSIONS,
+ mUtil.getRequiredBtPermissions(),
46);
}
})
- //.setNegativeButton(getString(R.string.cancelBtnTxt), new DialogInterface.OnClickListener() {
- // public void onClick(DialogInterface dialog, int id) {
- // dialog.cancel();
- // }
- //}
- //)
.create().show();
}
}