OSDN Git Service

af223d53f7ac0c039706909faba7f671cbad8fbe
[android-x86/packages-apps-Camera2.git] / src / com / android / camera / PermissionsActivity.java
1 package com.android.camera;
2
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;
14
15 /**
16  * Activity that shows permissions request dialogs and handles lack of critical permissions.
17  */
18 public class PermissionsActivity extends Activity {
19     private static final Log.Tag TAG = new Log.Tag("PermissionsActivity");
20
21     private static int PERMISSION_REQUEST_CODE = 1;
22     private static int RESULT_CODE_OK = 0;
23     private static int RESULT_CODE_FAILED = 1;
24
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;
38
39     @Override
40     protected void onCreate(Bundle savedInstanceState) {
41         super.onCreate(savedInstanceState);
42         mSettingsManager = CameraServicesImpl.instance().getSettingsManager();
43     }
44
45     @Override
46     protected void onResume() {
47         super.onResume();
48         mNumPermissionsToRequest = 0;
49         checkPermissions();
50     }
51
52     private void checkPermissions() {
53         if (checkSelfPermission(Manifest.permission.CAMERA)
54                 != PackageManager.PERMISSION_GRANTED) {
55             mNumPermissionsToRequest++;
56             mShouldRequestCameraPermission = true;
57         } else {
58             mFlagHasCameraPermission = true;
59         }
60
61         if (checkSelfPermission(Manifest.permission.RECORD_AUDIO)
62                 != PackageManager.PERMISSION_GRANTED) {
63             mNumPermissionsToRequest++;
64             mShouldRequestMicrophonePermission = true;
65         } else {
66             mFlagHasMicrophonePermission = true;
67         }
68
69         if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
70                 != PackageManager.PERMISSION_GRANTED) {
71             mNumPermissionsToRequest++;
72             mShouldRequestStoragePermission = true;
73         } else {
74             mFlagHasStoragePermission = true;
75         }
76
77         if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
78                 != PackageManager.PERMISSION_GRANTED) {
79             mNumPermissionsToRequest++;
80             mShouldRequestLocationPermission = true;
81         }
82
83         if (mNumPermissionsToRequest != 0) {
84             if (!mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
85                     Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) {
86                 buildPermissionsRequest();
87             } else {
88                 //Permissions dialog has already been shown, and we're still missing permissions.
89                 handlePermissionsFailure();
90             }
91         } else {
92             handlePermissionsSuccess();
93         }
94     }
95
96     private void buildPermissionsRequest() {
97         String[] permissionsToRequest = new String[mNumPermissionsToRequest];
98         int permissionsRequestIndex = 0;
99
100         if (mShouldRequestCameraPermission) {
101             permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA;
102             mIndexPermissionRequestCamera = permissionsRequestIndex;
103             permissionsRequestIndex++;
104         }
105         if (mShouldRequestMicrophonePermission) {
106             permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO;
107             mIndexPermissionRequestMicrophone = permissionsRequestIndex;
108             permissionsRequestIndex++;
109         }
110         if (mShouldRequestStoragePermission) {
111             permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE;
112             mIndexPermissionRequestStorage = permissionsRequestIndex;
113             permissionsRequestIndex++;
114         }
115         if (mShouldRequestLocationPermission) {
116             permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION;
117             mIndexPermissionRequestLocation = permissionsRequestIndex;
118         }
119
120         requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
121     }
122
123     @Override
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,
129                 true);
130
131         if (mShouldRequestCameraPermission) {
132             if (grantResults[mIndexPermissionRequestCamera] == PackageManager.PERMISSION_GRANTED) {
133                 mFlagHasCameraPermission = true;
134             } else {
135                 handlePermissionsFailure();
136             }
137         }
138         if (mShouldRequestMicrophonePermission) {
139             if (grantResults[mIndexPermissionRequestMicrophone] == PackageManager.PERMISSION_GRANTED) {
140                 mFlagHasMicrophonePermission = true;
141             } else {
142                 handlePermissionsFailure();
143             }
144         }
145         if (mShouldRequestStoragePermission) {
146             if (grantResults[mIndexPermissionRequestStorage] == PackageManager.PERMISSION_GRANTED) {
147                 mFlagHasStoragePermission = true;
148             } else {
149                 handlePermissionsFailure();
150             }
151         }
152
153         if (mShouldRequestLocationPermission) {
154             if (grantResults[mIndexPermissionRequestLocation] == PackageManager.PERMISSION_GRANTED) {
155                 // Do nothing
156             } else {
157                 // Do nothing
158             }
159         }
160
161         if (mFlagHasCameraPermission && mFlagHasMicrophonePermission && mFlagHasStoragePermission) {
162             handlePermissionsSuccess();
163         }
164     }
165
166     private void handlePermissionsSuccess() {
167         setResult(RESULT_CODE_OK, null);
168         finish();
169     }
170
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() {
175                     @Override
176                     public void onClick(DialogInterface dialog, int which) {
177                         setResult(RESULT_CODE_FAILED, null);
178                         finish();
179                     }
180                 })
181                 .show();
182     }
183 }