diff options
author | zafir <zafir@google.com> | 2015-06-29 00:08:22 -0500 |
---|---|---|
committer | Jay Wang <jaywang@codeaurora.org> | 2016-06-02 16:10:01 -0700 |
commit | f6ced59d086a755d6f720600181c023c29d202ca (patch) | |
tree | 7633600936f93cebc7e456b3054e97cc2c5b4595 /src/com/android/camera/CameraActivity.java | |
parent | dba00aac4e44a91bc55b0aabca9f191d03994edf (diff) | |
download | android_packages_apps_Snap-f6ced59d086a755d6f720600181c023c29d202ca.tar.gz android_packages_apps_Snap-f6ced59d086a755d6f720600181c023c29d202ca.tar.bz2 android_packages_apps_Snap-f6ced59d086a755d6f720600181c023c29d202ca.zip |
Minimum viable Android M runtime permissions handling for H.
Creates new activity for permissions handling: both checking
for permissions and handling error condition when critical
permissions are not present. The reason for creating a
new activity is so the app does not attempt to continue
executing OnCreate, OnResume etc, which opens
the camera while the dialogs are showing. This should
not slow the app down because the permissions activity
will only run when a) the first time the app has
insufficient permissions and b) when a critical
permission is missing and the app needs to shut down.
Bug: 21273463
CRs-Fixed: 1019847
Change-Id: I603acfb3057ba26b9cfa7935eb4cb24b5d547cb5
(cherry picked from commit ad44cda82fe6ec5ee090115129223c6314f9e1bb)
Diffstat (limited to 'src/com/android/camera/CameraActivity.java')
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index fafb40839..5f93bb93e 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -18,6 +18,7 @@ package com.android.camera; import android.view.Display; import android.graphics.Point; +import android.Manifest; import android.animation.Animator; import android.annotation.TargetApi; import android.app.ActionBar; @@ -32,6 +33,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.database.Cursor; import android.graphics.Bitmap; @@ -144,6 +146,9 @@ public class CameraActivity extends Activity // This string is used for judge start activity from screenoff or not public static final String GESTURE_CAMERA_NAME = "com.android.camera.CameraGestureActivity"; + private static final int PERMISSIONS_ACTIVITY_REQUEST_CODE = 1; + private static final int PERMISSIONS_RESULT_CODE_OK = 0; + private static final int PERMISSIONS_RESULT_CODE_FAILED = 1; /** * Request code from an activity we started that indicated that we do not @@ -220,6 +225,7 @@ public class CameraActivity extends Activity private View mPreviewCover; private FrameLayout mPreviewContentLayout; private boolean mPaused = true; + private boolean mHasCriticalPermissions; private Uri[] mNfcPushUris = new Uri[1]; @@ -1376,6 +1382,7 @@ public class CameraActivity extends Activity @Override public void onCreate(Bundle state) { super.onCreate(state); + checkPermissions(); // Check if this is in the secure camera mode. Intent intent = getIntent(); String action = intent.getAction(); @@ -1613,6 +1620,10 @@ public class CameraActivity extends Activity mIsEditActivityInProgress = false; } else { super.onActivityResult(requestCode, resultCode, data); + // Close the app if critical permissions are missing. + if (requestCode == PERMISSIONS_ACTIVITY_REQUEST_CODE && resultCode == PERMISSIONS_RESULT_CODE_FAILED) { + finish(); + } } } @@ -1623,8 +1634,38 @@ public class CameraActivity extends Activity if (focus) this.setSystemBarsVisibility(false); } + /** + * Checks if any of the needed Android runtime permissions are missing. + * If they are, then launch the permissions activity under one of the following conditions: + * a) The permissions dialogs have not run yet. We will ask for permission only once. + * b) If the missing permissions are critical to the app running, we will display a fatal error dialog. + * Critical permissions are: camera, microphone and storage. The app cannot run without them. + * Non-critical permission is location. + */ + private void checkPermissions() { + + if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && + checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && + checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + mHasCriticalPermissions = true; + } else { + mHasCriticalPermissions = false; + } + + if ((checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || + !mHasCriticalPermissions) { + Intent intent = new Intent(this, PermissionsActivity.class); + startActivityForResult(intent, PERMISSIONS_ACTIVITY_REQUEST_CODE); + } + } + @Override public void onResume() { + if (!mHasCriticalPermissions) { + super.onResume(); + Log.v(TAG, "Missing critical permissions."); + return; + } // Hide action bar first since we are in full screen mode first, and // switch the system UI to lights-out mode. this.setSystemBarsVisibility(false); |