diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/RequestCodes.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/RequestCodes.java index de989877f..c6bf3b520 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/RequestCodes.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/RequestCodes.java @@ -9,7 +9,6 @@ public interface RequestCodes { int REQUEST_WRITE_BLOG_POST = 5; int REQUEST_SHARE_BLOG = 6; int REQUEST_RINGTONE = 7; - int REQUEST_PERMISSION_CAMERA_LOCATION = 8; int REQUEST_DOZE_WHITELISTING = 9; int REQUEST_UNLOCK = 11; int REQUEST_KEYGUARD_UNLOCK = 12; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java index 126590ae1..1fdbcd550 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/nearby/AddNearbyContactActivity.java @@ -25,6 +25,7 @@ import javax.annotation.Nullable; import javax.inject.Inject; import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; @@ -51,6 +52,10 @@ public class AddNearbyContactActivity extends BriarActivity private AddNearbyContactViewModel viewModel; private AddNearbyContactPermissionManager permissionManager; + private final ActivityResultLauncher permissionLauncher = + registerForActivityResult(new RequestMultiplePermissions(), r -> + permissionManager.onRequestPermissionResult(r, + viewModel::showQrCodeFragmentIfAllowed)); private final ActivityResultLauncher bluetoothLauncher = registerForActivityResult(new RequestBluetoothDiscoverable(), this::onBluetoothDiscoverableResult); @@ -61,7 +66,7 @@ public class AddNearbyContactActivity extends BriarActivity viewModel = new ViewModelProvider(this, viewModelFactory) .get(AddNearbyContactViewModel.class); permissionManager = new AddNearbyContactPermissionManager(this, - viewModel.isBluetoothSupported()); + permissionLauncher::launch, viewModel.isBluetoothSupported()); } @Override @@ -75,7 +80,7 @@ public class AddNearbyContactActivity extends BriarActivity showInitialFragment(AddNearbyContactIntroFragment.newInstance()); } viewModel.getCheckPermissions().observeEvent(this, check -> - permissionManager.checkPermissions()); // never false + permissionManager.checkPermissions()); viewModel.getRequestBluetoothDiscoverable().observeEvent(this, r -> requestBluetoothDiscoverable()); // never false viewModel.getShowQrCodeFragment().observeEvent(this, show -> { @@ -125,15 +130,6 @@ public class AddNearbyContactActivity extends BriarActivity return super.onOptionsItemSelected(item); } - @Override - public void onRequestPermissionsResult(int requestCode, - String[] permissions, int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, - grantResults); - permissionManager.onRequestPermissionsResult(requestCode, permissions, - grantResults, viewModel::showQrCodeFragmentIfAllowed); - } - @Override public void onBackPressed() { if (viewModel.getState().getValue() instanceof Failed) { 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 937799e10..426da7cdc 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 @@ -5,9 +5,11 @@ import android.content.Context; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.BaseActivity; +import java.util.Map; + import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; -import androidx.core.app.ActivityCompat; +import androidx.core.util.Consumer; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.CAMERA; @@ -15,7 +17,6 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Build.VERSION.SDK_INT; import static androidx.core.app.ActivityCompat.shouldShowRequestPermissionRationale; import static androidx.core.content.ContextCompat.checkSelfPermission; -import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_PERMISSION_CAMERA_LOCATION; import static org.briarproject.briar.android.util.UiUtils.getGoToSettingsListener; class AddNearbyContactPermissionManager { @@ -28,11 +29,14 @@ class AddNearbyContactPermissionManager { private Permission locationPermission = Permission.UNKNOWN; private final BaseActivity ctx; + private final Consumer requestPermissions; private final boolean isBluetoothSupported; AddNearbyContactPermissionManager(BaseActivity ctx, + Consumer requestPermissions, boolean isBluetoothSupported) { this.ctx = ctx; + this.requestPermissions = requestPermissions; this.isBluetoothSupported = isBluetoothSupported; } @@ -116,15 +120,12 @@ class AddNearbyContactPermissionManager { } else { permissions = new String[] {CAMERA}; } - ActivityCompat.requestPermissions(ctx, permissions, - REQUEST_PERMISSION_CAMERA_LOCATION); + requestPermissions.accept(permissions); } - void onRequestPermissionsResult(int requestCode, String[] permissions, - int[] grantResults, Runnable onPermissionsGranted) { - if (requestCode != REQUEST_PERMISSION_CAMERA_LOCATION) - throw new AssertionError(); - if (gotPermission(CAMERA, permissions, grantResults)) { + void onRequestPermissionResult(Map result, + Runnable onPermissionsGranted) { + if (gotPermission(CAMERA, result)) { cameraPermission = Permission.GRANTED; } else if (shouldShowRationale(CAMERA)) { cameraPermission = Permission.SHOW_RATIONALE; @@ -132,8 +133,7 @@ class AddNearbyContactPermissionManager { cameraPermission = Permission.PERMANENTLY_DENIED; } if (isBluetoothSupported) { - if (gotPermission(ACCESS_FINE_LOCATION, permissions, - grantResults)) { + if (gotPermission(ACCESS_FINE_LOCATION, result)) { locationPermission = Permission.GRANTED; } else if (shouldShowRationale(ACCESS_FINE_LOCATION)) { locationPermission = Permission.SHOW_RATIONALE; @@ -150,13 +150,15 @@ class AddNearbyContactPermissionManager { if (checkPermissions()) onPermissionsGranted.run(); } - private boolean gotPermission(String permission, String[] permissions, - int[] grantResults) { - for (int i = 0; i < permissions.length; i++) { - if (permission.equals(permissions[i])) - return grantResults[i] == PERMISSION_GRANTED; - } - return false; + private boolean gotPermission(String permission, + Map result) { + Boolean permissionResult = result.get(permission); + return permissionResult == null ? + isGranted(permission) : permissionResult; + } + + private boolean isGranted(String permission) { + return checkSelfPermission(ctx, permission) == PERMISSION_GRANTED; } private boolean shouldShowRationale(String permission) { 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 46182ce29..40650d189 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 @@ -70,6 +70,7 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import static android.bluetooth.BluetoothAdapter.ACTION_SCAN_MODE_CHANGED; +import static android.bluetooth.BluetoothAdapter.EXTRA_SCAN_MODE; import static android.bluetooth.BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE; import static android.widget.Toast.LENGTH_LONG; import static java.util.Objects.requireNonNull; @@ -464,7 +465,8 @@ class AddNearbyContactViewModel extends AndroidViewModel @UiThread @Override public void onReceive(Context context, Intent intent) { - LOG.info("Bluetooth scan mode changed"); + int scanMode = intent.getIntExtra(EXTRA_SCAN_MODE, -1); + LOG.info("Bluetooth scan mode changed: " + scanMode); showQrCodeFragmentIfAllowed(); } } @@ -483,7 +485,7 @@ class AddNearbyContactViewModel extends AndroidViewModel * QR code fragment from being shown if onRequestPermissionsResult() is * called while the activity is paused, which could cause a crash due to * https://issuetracker.google.com/issues/37067655. - * TODO check if this is still happening when using new permission requesting + * TODO check if this is still happening with new permission requesting */ @UiThread void setIsActivityResumed(boolean resumed) {