From 4f3e4b019a061c3d12b7306e18f5f18f150f532c Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 29 Mar 2021 11:30:17 -0300 Subject: [PATCH] Request user to turn on location for adding contact nearby on API 28+ --- .../AddNearbyContactPermissionManager.java | 37 ++++++++++++++++++- .../add/nearby/AddNearbyContactViewModel.java | 5 ++- briar-android/src/main/res/values/strings.xml | 3 ++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactPermissionManager.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactPermissionManager.java index 426da7cdc..168087611 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactPermissionManager.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactPermissionManager.java @@ -1,6 +1,8 @@ package org.briarproject.briar.android.contact.add.nearby; import android.content.Context; +import android.content.Intent; +import android.location.LocationManager; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.BaseActivity; @@ -15,6 +17,7 @@ import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.CAMERA; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Build.VERSION.SDK_INT; +import static android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS; import static androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale; import static androidx.core.content.ContextCompat.checkSelfPermission; import static org.briarproject.briar.android.util.UiUtils.getGoToSettingsListener; @@ -45,6 +48,19 @@ class AddNearbyContactPermissionManager { locationPermission = Permission.UNKNOWN; } + /** + * @return true if location is enabled, + * or it isn't required due to this being a SDK < 28 device. + */ + static boolean isLocationEnabled(Context ctx) { + if (SDK_INT >= 28) { + LocationManager lm = ctx.getSystemService(LocationManager.class); + return lm.isLocationEnabled(); + } else { + return true; + } + } + static boolean areEssentialPermissionsGranted(Context ctx, boolean isBluetoothSupported) { int ok = PERMISSION_GRANTED; @@ -61,7 +77,8 @@ class AddNearbyContactPermissionManager { } boolean checkPermissions() { - if (areEssentialPermissionsGranted()) return true; + boolean locationEnabled = isLocationEnabled(ctx); + if (locationEnabled && areEssentialPermissionsGranted()) return true; // If an essential permission has been permanently denied, ask the // user to change the setting if (cameraPermission == Permission.PERMANENTLY_DENIED) { @@ -86,8 +103,10 @@ class AddNearbyContactPermissionManager { } else if (locationPermission == Permission.SHOW_RATIONALE) { showRationale(R.string.permission_location_title, R.string.permission_location_request_body); - } else { + } else if (isLocationEnabled(ctx)) { requestPermissions(); + } else { + showLocationDialog(ctx); } return false; } @@ -113,6 +132,20 @@ class AddNearbyContactPermissionManager { builder.show(); } + private static void showLocationDialog(Context ctx) { + AlertDialog.Builder builder = + new AlertDialog.Builder(ctx, R.style.BriarDialogTheme); + builder.setTitle(R.string.permission_location_setting_title); + builder.setMessage(R.string.permission_location_setting_body); + builder.setNegativeButton(R.string.cancel, null); + builder.setPositiveButton(R.string.permission_location_setting_button, + (dialog, which) -> { + Intent i = new Intent(ACTION_LOCATION_SOURCE_SETTINGS); + ctx.startActivity(i); + }); + builder.show(); + } + private void requestPermissions() { String[] permissions; if (isBluetoothSupported) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java index 40650d189..5683b0df5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactViewModel.java @@ -83,6 +83,7 @@ import static org.briarproject.bramble.api.plugin.Plugin.State.INACTIVE; import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactPermissionManager.areEssentialPermissionsGranted; +import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactPermissionManager.isLocationEnabled; import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision.REFUSED; import static org.briarproject.briar.android.contact.add.nearby.AddNearbyContactViewModel.BluetoothDecision.UNKNOWN; @@ -365,7 +366,9 @@ class AddNearbyContactViewModel extends AndroidViewModel void showQrCodeFragmentIfAllowed() { boolean permissionsGranted = areEssentialPermissionsGranted( getApplication(), isBluetoothSupported()); - if (isActivityResumed && wasContinueClicked && permissionsGranted) { + boolean locationEnabled = isLocationEnabled(getApplication()); + if (isActivityResumed && wasContinueClicked && permissionsGranted && + locationEnabled) { if (isWifiReady() && isBluetoothReady()) { LOG.info("Wifi and Bluetooth are ready"); startAddingContact(); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index faa7ae0d9..00e0ed789 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -609,6 +609,9 @@ To scan the QR code, Briar needs access to the camera.\n\nTo discover Bluetooth devices, Briar needs permission to access your location.\n\nBriar does not store your location or share it with anyone. You have denied access to the camera, but adding contacts requires using the camera.\n\nPlease consider granting access. You have denied access to your location, but Briar needs this permission to discover Bluetooth devices.\n\nPlease consider granting access. + Location setting + Your device\'s location setting must be turned on to find other devices via Bluetooth. Please enable location to continue. You can disable it again afterwards. + Enable location QR code Show QR code fullscreen