diff options
author | Avichal Rakesh <arakesh@google.com> | 2021-11-01 17:26:54 -0700 |
---|---|---|
committer | Avichal Rakesh <arakesh@google.com> | 2021-11-15 12:46:15 -0800 |
commit | fb34661a69905d18d4a9cb87f71ce59775b0ad19 (patch) | |
tree | a40d581e3cb5e7aaf409ae443deaf000540d9207 | |
parent | 49509f84ae0e77373eca4bf84c343b3871376e0b (diff) | |
download | Camera2-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.java | 113 | ||||
-rw-r--r-- | src/com/android/camera/app/FirstRunDialog.java | 32 | ||||
-rw-r--r-- | src/com/android/camera/settings/CameraSettingsActivity.java | 6 |
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); } } } |