Use new ActivityResultLauncher to request permissions for AddNearbyContact

This commit is contained in:
Torsten Grote
2021-03-24 14:48:45 -03:00
parent 7f486eef4c
commit a37af592cd
4 changed files with 31 additions and 32 deletions

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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) {