summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvichal Rakesh <arakesh@google.com>2021-11-01 17:26:54 -0700
committerAvichal Rakesh <arakesh@google.com>2021-11-15 12:46:15 -0800
commitfb34661a69905d18d4a9cb87f71ce59775b0ad19 (patch)
treea40d581e3cb5e7aaf409ae443deaf000540d9207
parent49509f84ae0e77373eca4bf84c343b3871376e0b (diff)
downloadCamera2-fb34661a69905d18d4a9cb87f71ce59775b0ad19.tar.gz
Add Precise Location Permission to AOSP Camera2 app
Camera2 app was never updated to support precise and coarse location. It only ever asked for coarse location permission, and ended up using network based location to tag location. This CL enables the app to request precise location permission and use GPS based location to tag photos instead. Bug: 169458466 Test: Manually Tested Change-Id: Icda8af338e610855e47e8f7469cd9be9323505ea
-rw-r--r--src/com/android/camera/PermissionsActivity.java113
-rw-r--r--src/com/android/camera/app/FirstRunDialog.java32
-rw-r--r--src/com/android/camera/settings/CameraSettingsActivity.java6
3 files changed, 56 insertions, 95 deletions
diff --git a/src/com/android/camera/PermissionsActivity.java b/src/com/android/camera/PermissionsActivity.java
index 895d3168c..713f44bf0 100644
--- a/src/com/android/camera/PermissionsActivity.java
+++ b/src/com/android/camera/PermissionsActivity.java
@@ -22,6 +22,9 @@ import com.android.camera.settings.SettingsManager;
import com.android.camera.util.QuickActivity;
import com.android.camera2.R;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Activity that shows permissions request dialogs and handles lack of critical permissions.
* TODO: Convert PermissionsActivity into a dialog to be emitted from
@@ -31,21 +34,8 @@ import com.android.camera2.R;
public class PermissionsActivity extends QuickActivity {
private static final Log.Tag TAG = new Log.Tag("PermissionsActivity");
- private static int PERMISSION_REQUEST_CODE = 1;
- private static int RESULT_CODE_OK = 1;
- private static int RESULT_CODE_FAILED = 2;
-
- private int mIndexPermissionRequestCamera;
- private int mIndexPermissionRequestMicrophone;
- private int mIndexPermissionRequestLocation;
- private int mIndexPermissionRequestStorage;
- private int mIndexPermissionRequestWriteStorage;
- private boolean mShouldRequestCameraPermission;
- private boolean mShouldRequestMicrophonePermission;
- private boolean mShouldRequestLocationPermission;
- private int mNumPermissionsToRequest;
- private boolean mFlagHasCameraPermission;
- private boolean mFlagHasMicrophonePermission;
+ private static final int PERMISSION_REQUEST_CODE = 1;
+
private SettingsManager mSettingsManager;
/**
@@ -88,7 +78,6 @@ public class PermissionsActivity extends QuickActivity {
@Override
protected void onResumeTasks() {
- mNumPermissionsToRequest = 0;
checkPermissions();
}
@@ -99,34 +88,31 @@ public class PermissionsActivity extends QuickActivity {
}
private void checkPermissions() {
- if (checkSelfPermission(Manifest.permission.CAMERA)
- != PackageManager.PERMISSION_GRANTED) {
- mNumPermissionsToRequest++;
- mShouldRequestCameraPermission = true;
- } else {
- mFlagHasCameraPermission = true;
+ List<String> permissions = new ArrayList<>();
+
+ if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+ permissions.add(Manifest.permission.CAMERA);
}
if (checkSelfPermission(Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
- mNumPermissionsToRequest++;
- mShouldRequestMicrophonePermission = true;
- } else {
- mFlagHasMicrophonePermission = true;
+ permissions.add(Manifest.permission.RECORD_AUDIO);
}
- if (mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
- Keys.KEY_RECORD_LOCATION)
- && (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED)) {
- mNumPermissionsToRequest++;
- mShouldRequestLocationPermission = true;
+ if (mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL, Keys.KEY_RECORD_LOCATION)
+ && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED
+ && checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED) {
+ permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
+ permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
- if (mNumPermissionsToRequest != 0) {
+ if (!permissions.isEmpty()) {
if (!isKeyguardLocked() && !mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) {
- buildPermissionsRequest();
+ Log.v(TAG, "requestPermissions count: " + permissions.size());
+ requestPermissions(permissions.toArray(new String[0]), PERMISSION_REQUEST_CODE);
} else {
// Permissions dialog has already been shown, or we're on
// lockscreen, and we're still missing permissions.
@@ -137,64 +123,31 @@ public class PermissionsActivity extends QuickActivity {
}
}
- private void buildPermissionsRequest() {
- String[] permissionsToRequest = new String[mNumPermissionsToRequest];
- int permissionsRequestIndex = 0;
-
- if (mShouldRequestCameraPermission) {
- permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA;
- mIndexPermissionRequestCamera = permissionsRequestIndex;
- permissionsRequestIndex++;
- }
- if (mShouldRequestMicrophonePermission) {
- permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO;
- mIndexPermissionRequestMicrophone = permissionsRequestIndex;
- permissionsRequestIndex++;
- }
- if (mShouldRequestLocationPermission) {
- permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION;
- mIndexPermissionRequestLocation = permissionsRequestIndex;
- }
-
- Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length);
- requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
- }
-
@Override
public void onRequestPermissionsResult(int requestCode,
- String permissions[], int[] grantResults) {
+ String[] permissions, int[] grantResults) {
Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length);
mSettingsManager.set(
SettingsManager.SCOPE_GLOBAL,
Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS,
true);
- if (mShouldRequestCameraPermission) {
- if (grantResults.length > 0 && grantResults[mIndexPermissionRequestCamera] ==
- PackageManager.PERMISSION_GRANTED) {
- mFlagHasCameraPermission = true;
- } else {
+ boolean missingCriticalPermissions = false;
+ for (int i = 0; i < permissions.length; i++) {
+ String permission = permissions[i];
+ int result = grantResults[i];
+ // Show fail dialog if critical permissions are not granted
+ if (Manifest.permission.CAMERA.equals(permission)
+ && result == PackageManager.PERMISSION_DENIED) {
handlePermissionsFailure();
- }
- }
- if (mShouldRequestMicrophonePermission) {
- if (grantResults.length > 0 && grantResults[mIndexPermissionRequestMicrophone] ==
- PackageManager.PERMISSION_GRANTED) {
- mFlagHasMicrophonePermission = true;
- } else {
+ missingCriticalPermissions = true;
+ } else if (Manifest.permission.RECORD_AUDIO.equals(permission)
+ && result == PackageManager.PERMISSION_DENIED) {
handlePermissionsFailure();
+ missingCriticalPermissions = true;
}
}
- if (mShouldRequestLocationPermission) {
- if (grantResults.length > 0 && grantResults[mIndexPermissionRequestLocation] ==
- PackageManager.PERMISSION_GRANTED) {
- // Do nothing
- } else {
- // Do nothing
- }
- }
-
- if (mFlagHasCameraPermission && mFlagHasMicrophonePermission) {
+ if (!missingCriticalPermissions) {
handlePermissionsSuccess();
}
}
diff --git a/src/com/android/camera/app/FirstRunDialog.java b/src/com/android/camera/app/FirstRunDialog.java
index 58e1fcbba..fa419fd44 100644
--- a/src/com/android/camera/app/FirstRunDialog.java
+++ b/src/com/android/camera/app/FirstRunDialog.java
@@ -44,7 +44,9 @@ public class FirstRunDialog {
public interface FirstRunDialogListener {
public void onFirstRunStateReady();
+
public void onFirstRunDialogCancelled();
+
public void onCameraAccessException();
}
@@ -83,15 +85,14 @@ public class FirstRunDialog {
/**
* Constructs a first run dialog.
- *
*/
public FirstRunDialog(
- AppController appController,
- Context activityContext,
- ResolutionSetting resolutionSetting,
- SettingsManager settingManager,
- OneCameraManager hardwareManager,
- FirstRunDialogListener listener) {
+ AppController appController,
+ Context activityContext,
+ ResolutionSetting resolutionSetting,
+ SettingsManager settingManager,
+ OneCameraManager hardwareManager,
+ FirstRunDialogListener listener) {
mAppController = appController;
mContext = activityContext;
mResolutionSetting = resolutionSetting;
@@ -211,14 +212,19 @@ public class FirstRunDialog {
private void checkLocationPermission() {
if (mContext.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
- Activity activity = (Activity) mContext;
- activity.requestPermissions(
- new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
+ == PackageManager.PERMISSION_GRANTED || mContext.checkSelfPermission(
+ Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+
+ Activity activity = (Activity) mContext;
+ activity.requestPermissions(
+ new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_REQUEST_CODE);
- mSettingsManager.set(SettingsManager.SCOPE_GLOBAL,
+ mSettingsManager.set(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS, true);
- }
+
}
/**
diff --git a/src/com/android/camera/settings/CameraSettingsActivity.java b/src/com/android/camera/settings/CameraSettingsActivity.java
index 85d13f67b..6c76e961c 100644
--- a/src/com/android/camera/settings/CameraSettingsActivity.java
+++ b/src/com/android/camera/settings/CameraSettingsActivity.java
@@ -353,8 +353,10 @@ public class CameraSettingsActivity extends FragmentActivity {
Context context = this.getActivity().getApplicationContext();
if (context.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
- requestPermissions(new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
- PERMISSION_REQUEST_CODE);
+ requestPermissions(
+ new String[] {Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION},
+ PERMISSION_REQUEST_CODE);
}
}
}