1 package com.android.camera;
3 import android.Manifest;
4 import android.app.Activity;
5 import android.app.AlertDialog;
6 import android.content.DialogInterface;
7 import android.content.pm.PackageManager;
8 import android.os.Bundle;
9 import com.android.camera.app.CameraServicesImpl;
10 import com.android.camera.debug.Log;
11 import com.android.camera.settings.Keys;
12 import com.android.camera.settings.SettingsManager;
13 import com.android.camera2.R;
16 * Activity that shows permissions request dialogs and handles lack of critical permissions.
18 public class PermissionsActivity extends Activity {
19 private static final Log.Tag TAG = new Log.Tag("PermissionsActivity");
21 private static int PERMISSION_REQUEST_CODE = 1;
22 private static int RESULT_CODE_OK = 0;
23 private static int RESULT_CODE_FAILED = 1;
25 private int mIndexPermissionRequestCamera;
26 private int mIndexPermissionRequestMicrophone;
27 private int mIndexPermissionRequestLocation;
28 private int mIndexPermissionRequestStorage;
29 private boolean mShouldRequestCameraPermission;
30 private boolean mShouldRequestMicrophonePermission;
31 private boolean mShouldRequestLocationPermission;
32 private boolean mShouldRequestStoragePermission;
33 private int mNumPermissionsToRequest;
34 private boolean mFlagHasCameraPermission;
35 private boolean mFlagHasMicrophonePermission;
36 private boolean mFlagHasStoragePermission;
37 private SettingsManager mSettingsManager;
40 protected void onCreate(Bundle savedInstanceState) {
41 super.onCreate(savedInstanceState);
42 mSettingsManager = CameraServicesImpl.instance().getSettingsManager();
46 protected void onResume() {
48 mNumPermissionsToRequest = 0;
52 private void checkPermissions() {
53 if (checkSelfPermission(Manifest.permission.CAMERA)
54 != PackageManager.PERMISSION_GRANTED) {
55 mNumPermissionsToRequest++;
56 mShouldRequestCameraPermission = true;
58 mFlagHasCameraPermission = true;
61 if (checkSelfPermission(Manifest.permission.RECORD_AUDIO)
62 != PackageManager.PERMISSION_GRANTED) {
63 mNumPermissionsToRequest++;
64 mShouldRequestMicrophonePermission = true;
66 mFlagHasMicrophonePermission = true;
69 if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
70 != PackageManager.PERMISSION_GRANTED) {
71 mNumPermissionsToRequest++;
72 mShouldRequestStoragePermission = true;
74 mFlagHasStoragePermission = true;
77 if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
78 != PackageManager.PERMISSION_GRANTED) {
79 mNumPermissionsToRequest++;
80 mShouldRequestLocationPermission = true;
83 if (mNumPermissionsToRequest != 0) {
84 if (!mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
85 Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) {
86 buildPermissionsRequest();
88 //Permissions dialog has already been shown, and we're still missing permissions.
89 handlePermissionsFailure();
92 handlePermissionsSuccess();
96 private void buildPermissionsRequest() {
97 String[] permissionsToRequest = new String[mNumPermissionsToRequest];
98 int permissionsRequestIndex = 0;
100 if (mShouldRequestCameraPermission) {
101 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA;
102 mIndexPermissionRequestCamera = permissionsRequestIndex;
103 permissionsRequestIndex++;
105 if (mShouldRequestMicrophonePermission) {
106 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO;
107 mIndexPermissionRequestMicrophone = permissionsRequestIndex;
108 permissionsRequestIndex++;
110 if (mShouldRequestStoragePermission) {
111 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE;
112 mIndexPermissionRequestStorage = permissionsRequestIndex;
113 permissionsRequestIndex++;
115 if (mShouldRequestLocationPermission) {
116 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION;
117 mIndexPermissionRequestLocation = permissionsRequestIndex;
120 requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
124 public void onRequestPermissionsResult(int requestCode,
125 String permissions[], int[] grantResults) {
126 mSettingsManager.set(
127 SettingsManager.SCOPE_GLOBAL,
128 Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS,
131 if (mShouldRequestCameraPermission) {
132 if (grantResults[mIndexPermissionRequestCamera] == PackageManager.PERMISSION_GRANTED) {
133 mFlagHasCameraPermission = true;
135 handlePermissionsFailure();
138 if (mShouldRequestMicrophonePermission) {
139 if (grantResults[mIndexPermissionRequestMicrophone] == PackageManager.PERMISSION_GRANTED) {
140 mFlagHasMicrophonePermission = true;
142 handlePermissionsFailure();
145 if (mShouldRequestStoragePermission) {
146 if (grantResults[mIndexPermissionRequestStorage] == PackageManager.PERMISSION_GRANTED) {
147 mFlagHasStoragePermission = true;
149 handlePermissionsFailure();
153 if (mShouldRequestLocationPermission) {
154 if (grantResults[mIndexPermissionRequestLocation] == PackageManager.PERMISSION_GRANTED) {
161 if (mFlagHasCameraPermission && mFlagHasMicrophonePermission && mFlagHasStoragePermission) {
162 handlePermissionsSuccess();
166 private void handlePermissionsSuccess() {
167 setResult(RESULT_CODE_OK, null);
171 private void handlePermissionsFailure() {
172 new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.camera_error_title))
173 .setMessage(getResources().getString(R.string.error_permissions))
174 .setPositiveButton(getResources().getString(R.string.dialog_dismiss), new DialogInterface.OnClickListener() {
176 public void onClick(DialogInterface dialog, int which) {
177 setResult(RESULT_CODE_FAILED, null);