1 package com.android.camera;
3 import android.Manifest;
4 import android.app.Activity;
5 import android.app.Dialog;
6 import android.app.AlertDialog;
7 import android.app.KeyguardManager;
8 import android.content.BroadcastReceiver;
9 import android.content.Context;
10 import android.content.DialogInterface;
11 import android.content.Intent;
12 import android.content.IntentFilter;
13 import android.content.pm.PackageManager;
14 import android.os.Bundle;
15 import android.view.KeyEvent;
16 import android.view.Window;
17 import android.view.WindowManager;
18 import com.android.camera.app.CameraServicesImpl;
19 import com.android.camera.debug.Log;
20 import com.android.camera.settings.Keys;
21 import com.android.camera.settings.SettingsManager;
22 import com.android.camera.util.QuickActivity;
23 import com.android.camera2.R;
26 * Activity that shows permissions request dialogs and handles lack of critical permissions.
28 public class PermissionsActivity extends QuickActivity {
29 private static final Log.Tag TAG = new Log.Tag("PermissionsActivity");
31 private static int PERMISSION_REQUEST_CODE = 1;
32 private static int RESULT_CODE_OK = 1;
33 private static int RESULT_CODE_FAILED = 2;
35 private int mIndexPermissionRequestCamera;
36 private int mIndexPermissionRequestMicrophone;
37 private int mIndexPermissionRequestLocation;
38 private int mIndexPermissionRequestStorage;
39 private boolean mShouldRequestCameraPermission;
40 private boolean mShouldRequestMicrophonePermission;
41 private boolean mShouldRequestLocationPermission;
42 private boolean mShouldRequestStoragePermission;
43 private int mNumPermissionsToRequest;
44 private boolean mFlagHasCameraPermission;
45 private boolean mFlagHasMicrophonePermission;
46 private boolean mFlagHasStoragePermission;
47 private SettingsManager mSettingsManager;
50 * Close activity when secure app passes lock screen or screen turns
53 private final BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() {
55 public void onReceive(Context context, Intent intent) {
56 Log.v(TAG, "received intent, finishing: " + intent.getAction());
62 protected void onCreateTasks(Bundle savedInstanceState) {
63 setContentView(R.layout.permissions);
64 mSettingsManager = CameraServicesImpl.instance().getSettingsManager();
66 // Filter for screen off so that we can finish permissions activity
67 // when screen is off.
68 IntentFilter filter_screen_off = new IntentFilter(Intent.ACTION_SCREEN_OFF);
69 registerReceiver(mShutdownReceiver, filter_screen_off);
71 // Filter for phone unlock so that we can finish permissions activity
73 // 1. from secure lock screen, user starts secure camera
74 // 2. user presses home button
75 // 3. user unlocks phone
76 IntentFilter filter_user_unlock = new IntentFilter(Intent.ACTION_USER_PRESENT);
77 registerReceiver(mShutdownReceiver, filter_user_unlock);
79 Window win = getWindow();
80 if (isKeyguardLocked()) {
81 win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
83 win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
88 protected void onResumeTasks() {
89 mNumPermissionsToRequest = 0;
94 protected void onDestroyTasks() {
95 Log.v(TAG, "onDestroy: unregistering receivers");
96 unregisterReceiver(mShutdownReceiver);
99 private void checkPermissions() {
100 if (checkSelfPermission(Manifest.permission.CAMERA)
101 != PackageManager.PERMISSION_GRANTED) {
102 mNumPermissionsToRequest++;
103 mShouldRequestCameraPermission = true;
105 mFlagHasCameraPermission = true;
108 if (checkSelfPermission(Manifest.permission.RECORD_AUDIO)
109 != PackageManager.PERMISSION_GRANTED) {
110 mNumPermissionsToRequest++;
111 mShouldRequestMicrophonePermission = true;
113 mFlagHasMicrophonePermission = true;
116 if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
117 != PackageManager.PERMISSION_GRANTED) {
118 mNumPermissionsToRequest++;
119 mShouldRequestStoragePermission = true;
121 mFlagHasStoragePermission = true;
124 if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
125 != PackageManager.PERMISSION_GRANTED) {
126 mNumPermissionsToRequest++;
127 mShouldRequestLocationPermission = true;
130 if (mNumPermissionsToRequest != 0) {
131 if (!isKeyguardLocked() && !mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
132 Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) {
133 buildPermissionsRequest();
135 // Permissions dialog has already been shown, or we're on
136 // lockscreen, and we're still missing permissions.
137 handlePermissionsFailure();
140 handlePermissionsSuccess();
144 private void buildPermissionsRequest() {
145 String[] permissionsToRequest = new String[mNumPermissionsToRequest];
146 int permissionsRequestIndex = 0;
148 if (mShouldRequestCameraPermission) {
149 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA;
150 mIndexPermissionRequestCamera = permissionsRequestIndex;
151 permissionsRequestIndex++;
153 if (mShouldRequestMicrophonePermission) {
154 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO;
155 mIndexPermissionRequestMicrophone = permissionsRequestIndex;
156 permissionsRequestIndex++;
158 if (mShouldRequestStoragePermission) {
159 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE;
160 mIndexPermissionRequestStorage = permissionsRequestIndex;
161 permissionsRequestIndex++;
163 if (mShouldRequestLocationPermission) {
164 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION;
165 mIndexPermissionRequestLocation = permissionsRequestIndex;
168 Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length);
169 requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
173 public void onRequestPermissionsResult(int requestCode,
174 String permissions[], int[] grantResults) {
175 Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length);
176 mSettingsManager.set(
177 SettingsManager.SCOPE_GLOBAL,
178 Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS,
181 if (mShouldRequestCameraPermission) {
182 if (grantResults.length > 0 && grantResults[mIndexPermissionRequestCamera] ==
183 PackageManager.PERMISSION_GRANTED) {
184 mFlagHasCameraPermission = true;
186 handlePermissionsFailure();
189 if (mShouldRequestMicrophonePermission) {
190 if (grantResults.length > 0 && grantResults[mIndexPermissionRequestMicrophone] ==
191 PackageManager.PERMISSION_GRANTED) {
192 mFlagHasMicrophonePermission = true;
194 handlePermissionsFailure();
197 if (mShouldRequestStoragePermission) {
198 if (grantResults.length > 0 && grantResults[mIndexPermissionRequestStorage] ==
199 PackageManager.PERMISSION_GRANTED) {
200 mFlagHasStoragePermission = true;
202 handlePermissionsFailure();
206 if (mShouldRequestLocationPermission) {
207 if (grantResults.length > 0 && grantResults[mIndexPermissionRequestLocation] ==
208 PackageManager.PERMISSION_GRANTED) {
215 if (mFlagHasCameraPermission && mFlagHasMicrophonePermission && mFlagHasStoragePermission) {
216 handlePermissionsSuccess();
220 private void handlePermissionsSuccess() {
221 Intent intent = new Intent(this, CameraActivity.class);
222 startActivity(intent);
226 private void handlePermissionsFailure() {
227 new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.camera_error_title))
228 .setMessage(getResources().getString(R.string.error_permissions))
229 .setCancelable(false)
230 .setOnKeyListener(new Dialog.OnKeyListener() {
232 public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
233 if (keyCode == KeyEvent.KEYCODE_BACK) {
239 .setPositiveButton(getResources().getString(R.string.dialog_dismiss),
240 new DialogInterface.OnClickListener() {
242 public void onClick(DialogInterface dialog, int which) {