From fcd753e8a96b406f6309886b07fea505934c6f46 Mon Sep 17 00:00:00 2001 From: Dariusz Seweryn Date: Thu, 5 Dec 2019 18:57:10 +0100 Subject: [PATCH] Updated examples to use new scan runtime permission helper functions --- .../example1_scanning/ScanActivity.kt | 4 +- .../BackgroundScanActivity.kt | 4 +- .../samplekotlin/util/LocationPermission.kt | 30 ++++++-------- .../example1_scanning/ScanActivity.java | 6 +-- .../BackgroundScanActivity.java | 6 +-- .../sample/util/LocationPermission.java | 40 +++++++++---------- 6 files changed, 42 insertions(+), 48 deletions(-) diff --git a/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1_scanning/ScanActivity.kt b/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1_scanning/ScanActivity.kt index c27c8a96e..a943260d8 100644 --- a/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1_scanning/ScanActivity.kt +++ b/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1_scanning/ScanActivity.kt @@ -55,7 +55,7 @@ class ScanActivity : AppCompatActivity() { if (isScanning) { scanDisposable?.dispose() } else { - if (isLocationPermissionGranted()) { + if (rxBleClient.isScanRuntimePermissionGranted) { scanBleDevices() .observeOn(AndroidSchedulers.mainThread()) .doFinally { dispose() } @@ -63,7 +63,7 @@ class ScanActivity : AppCompatActivity() { .let { scanDisposable = it } } else { hasClickedScan = true - requestLocationPermission() + requestLocationPermission(rxBleClient) } } updateButtonUIState() diff --git a/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1a_background_scanning/BackgroundScanActivity.kt b/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1a_background_scanning/BackgroundScanActivity.kt index 2e02dcf46..59c611e08 100644 --- a/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1a_background_scanning/BackgroundScanActivity.kt +++ b/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example1a_background_scanning/BackgroundScanActivity.kt @@ -42,11 +42,11 @@ class BackgroundScanActivity : AppCompatActivity() { } private fun onScanStartClick() { - if (isLocationPermissionGranted()) { + if (rxBleClient.isScanRuntimePermissionGranted) { scanBleDeviceInBackground() } else { hasClickedScan = true - requestLocationPermission() + requestLocationPermission(rxBleClient) } } diff --git a/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/util/LocationPermission.kt b/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/util/LocationPermission.kt index 5a3ddde21..057eb0bfe 100644 --- a/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/util/LocationPermission.kt +++ b/sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/util/LocationPermission.kt @@ -1,26 +1,22 @@ package com.polidea.rxandroidble2.samplekotlin.util -import android.Manifest.permission import android.app.Activity -import android.content.Context import android.content.pm.PackageManager -import android.os.Build import androidx.core.app.ActivityCompat -import androidx.core.content.ContextCompat +import com.polidea.rxandroidble2.RxBleClient -private const val REQUEST_PERMISSION_COARSE_LOCATION = 101 +private const val REQUEST_PERMISSION_BLE_SCAN = 101 -internal fun Context.isLocationPermissionGranted(): Boolean = when { - Build.VERSION.SDK_INT < Build.VERSION_CODES.M -> true // It is not needed at all as there were no runtime permissions yet - else -> ContextCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED -} - -internal fun Activity.requestLocationPermission() = - ActivityCompat.requestPermissions( - this, - arrayOf(permission.ACCESS_COARSE_LOCATION), - REQUEST_PERMISSION_COARSE_LOCATION - ) +internal fun Activity.requestLocationPermission(client: RxBleClient) = + ActivityCompat.requestPermissions( + this, + /* + * the below would cause a ArrayIndexOutOfBoundsException on API < 23. Yet it should not be called then as runtime + * permissions are not needed and RxBleClient.isScanRuntimePermissionGranted() returns `true` + */ + arrayOf(client.recommendedScanRuntimePermissions[0]), + REQUEST_PERMISSION_BLE_SCAN + ) internal fun isLocationPermissionGranted(requestCode: Int, grantResults: IntArray) = - requestCode == REQUEST_PERMISSION_COARSE_LOCATION && grantResults[0] == PackageManager.PERMISSION_GRANTED + requestCode == REQUEST_PERMISSION_BLE_SCAN && grantResults[0] == PackageManager.PERMISSION_GRANTED diff --git a/sample/src/main/java/com/polidea/rxandroidble2/sample/example1_scanning/ScanActivity.java b/sample/src/main/java/com/polidea/rxandroidble2/sample/example1_scanning/ScanActivity.java index 9c155679b..beae9e285 100644 --- a/sample/src/main/java/com/polidea/rxandroidble2/sample/example1_scanning/ScanActivity.java +++ b/sample/src/main/java/com/polidea/rxandroidble2/sample/example1_scanning/ScanActivity.java @@ -57,11 +57,11 @@ public void onScanToggleClick() { if (isScanning()) { scanDisposable.dispose(); } else { - if (LocationPermission.isLocationPermissionGranted(this)) { + if (rxBleClient.isScanRuntimePermissionGranted()) { scanBleDevices(); } else { hasClickedScan = true; - LocationPermission.requestLocationPermission(this); + LocationPermission.requestLocationPermission(this, rxBleClient); } } @@ -87,7 +87,7 @@ private void scanBleDevices() { @Override public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { - if (LocationPermission.isRequestLocationPermissionGranted(requestCode, permissions, grantResults) + if (LocationPermission.isRequestLocationPermissionGranted(requestCode, permissions, grantResults, rxBleClient) && hasClickedScan) { hasClickedScan = false; scanBleDevices(); diff --git a/sample/src/main/java/com/polidea/rxandroidble2/sample/example1a_background_scanning/BackgroundScanActivity.java b/sample/src/main/java/com/polidea/rxandroidble2/sample/example1a_background_scanning/BackgroundScanActivity.java index 8ff2676db..91d5f9cb2 100644 --- a/sample/src/main/java/com/polidea/rxandroidble2/sample/example1a_background_scanning/BackgroundScanActivity.java +++ b/sample/src/main/java/com/polidea/rxandroidble2/sample/example1a_background_scanning/BackgroundScanActivity.java @@ -41,10 +41,10 @@ public void onCreate(Bundle savedInstanceState) { @OnClick(R.id.scan_start_btn) public void onScanStartClick() { hasClickedScan = true; - if (LocationPermission.isLocationPermissionGranted(this)) { + if (rxBleClient.isScanRuntimePermissionGranted()) { scanBleDeviceInBackground(); } else { - LocationPermission.requestLocationPermission(this); + LocationPermission.requestLocationPermission(this, rxBleClient); } } @@ -72,7 +72,7 @@ private void scanBleDeviceInBackground() { @Override public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { - if (LocationPermission.isRequestLocationPermissionGranted(requestCode, permissions, grantResults) + if (LocationPermission.isRequestLocationPermissionGranted(requestCode, permissions, grantResults, rxBleClient) && hasClickedScan) { hasClickedScan = false; scanBleDeviceInBackground(); diff --git a/sample/src/main/java/com/polidea/rxandroidble2/sample/util/LocationPermission.java b/sample/src/main/java/com/polidea/rxandroidble2/sample/util/LocationPermission.java index ceddc035d..7b8c68492 100644 --- a/sample/src/main/java/com/polidea/rxandroidble2/sample/util/LocationPermission.java +++ b/sample/src/main/java/com/polidea/rxandroidble2/sample/util/LocationPermission.java @@ -1,13 +1,9 @@ package com.polidea.rxandroidble2.sample.util; -import android.Manifest; -import android.Manifest.permission; import android.app.Activity; -import android.content.Context; import android.content.pm.PackageManager; -import android.os.Build; import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; +import com.polidea.rxandroidble2.RxBleClient; public class LocationPermission { @@ -15,34 +11,36 @@ private LocationPermission() { // Utility class } - private static final int REQUEST_PERMISSION_COARSE_LOCATION = 9358; + private static final int REQUEST_PERMISSION_BLE_SCAN = 9358; - public static boolean isLocationPermissionGranted(final Context context) { - if (Build.VERSION.SDK_INT < 23 /* Build.VERSION_CODES.M */) { - // It is not needed at all as there were no runtime permissions yet - return true; - } - return ContextCompat.checkSelfPermission(context, permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; - } - - public static void requestLocationPermission(final Activity activity) { + public static void requestLocationPermission(final Activity activity, final RxBleClient client) { ActivityCompat.requestPermissions( activity, - new String[]{permission.ACCESS_COARSE_LOCATION}, - REQUEST_PERMISSION_COARSE_LOCATION + /* + * the below would cause a ArrayIndexOutOfBoundsException on API < 23. Yet it should not be called then as runtime + * permissions are not needed and RxBleClient.isScanRuntimePermissionGranted() returns `true` + */ + new String[]{client.getRecommendedScanRuntimePermissions()[0]}, + REQUEST_PERMISSION_BLE_SCAN ); } public static boolean isRequestLocationPermissionGranted(final int requestCode, final String[] permissions, - final int[] grantResults) { - if (requestCode == REQUEST_PERMISSION_COARSE_LOCATION) { - for (int i = 0; i < permissions.length; i++) { - if (permissions[i].equals(Manifest.permission.ACCESS_COARSE_LOCATION) + final int[] grantResults, RxBleClient client) { + if (requestCode != REQUEST_PERMISSION_BLE_SCAN) { + return false; + } + + String[] recommendedScanRuntimePermissions = client.getRecommendedScanRuntimePermissions(); + for (int i = 0; i < permissions.length; i++) { + for (String recommendedScanRuntimePermission : recommendedScanRuntimePermissions) { + if (permissions[i].equals(recommendedScanRuntimePermission) && grantResults[i] == PackageManager.PERMISSION_GRANTED) { return true; } } } + return false; } }