mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
Use new ActivityResultLauncher to request permissions for AddNearbyContact
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<String[]> permissionLauncher =
|
||||
registerForActivityResult(new RequestMultiplePermissions(), r ->
|
||||
permissionManager.onRequestPermissionResult(r,
|
||||
viewModel::showQrCodeFragmentIfAllowed));
|
||||
private final ActivityResultLauncher<Integer> 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) {
|
||||
|
||||
@@ -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<String[]> requestPermissions;
|
||||
private final boolean isBluetoothSupported;
|
||||
|
||||
AddNearbyContactPermissionManager(BaseActivity ctx,
|
||||
Consumer<String[]> 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<String, Boolean> 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<String, Boolean> 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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user