summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/CameraActivity.java
diff options
context:
space:
mode:
authorzafir <zafir@google.com>2015-06-29 00:08:22 -0500
committerJay Wang <jaywang@codeaurora.org>2016-06-02 16:10:01 -0700
commitf6ced59d086a755d6f720600181c023c29d202ca (patch)
tree7633600936f93cebc7e456b3054e97cc2c5b4595 /src/com/android/camera/CameraActivity.java
parentdba00aac4e44a91bc55b0aabca9f191d03994edf (diff)
downloadandroid_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.java41
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);