1ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirpackage com.android.camera;
2ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
3ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.Manifest;
4ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.app.Activity;
5dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.app.Dialog;
6ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.app.AlertDialog;
7dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.app.KeyguardManager;
8dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.BroadcastReceiver;
9dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.Context;
10ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.content.DialogInterface;
11dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.Intent;
12dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.content.IntentFilter;
13ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.content.pm.PackageManager;
14ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport android.os.Bundle;
15dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.view.KeyEvent;
16dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.view.Window;
17dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport android.view.WindowManager;
18ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.app.CameraServicesImpl;
19ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.debug.Log;
20ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.settings.Keys;
21ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera.settings.SettingsManager;
22dd334be92c5513a06c809ee3ea25e411dfad0589zafirimport com.android.camera.util.QuickActivity;
23ad44cda82fe6ec5ee090115129223c6314f9e1bbzafirimport com.android.camera2.R;
24ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
25ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir/**
26ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir * Activity that shows permissions request dialogs and handles lack of critical permissions.
27ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir */
28dd334be92c5513a06c809ee3ea25e411dfad0589zafirpublic class PermissionsActivity extends QuickActivity {
29ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private static final Log.Tag TAG = new Log.Tag("PermissionsActivity");
30ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
31ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private static int PERMISSION_REQUEST_CODE = 1;
32148d0b8e3fd412fa6a666e75484fe6b7e0465f5azafir    private static int RESULT_CODE_OK = 1;
33148d0b8e3fd412fa6a666e75484fe6b7e0465f5azafir    private static int RESULT_CODE_FAILED = 2;
34ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
35ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private int mIndexPermissionRequestCamera;
36ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private int mIndexPermissionRequestMicrophone;
37ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private int mIndexPermissionRequestLocation;
38ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private int mIndexPermissionRequestStorage;
39ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mShouldRequestCameraPermission;
40ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mShouldRequestMicrophonePermission;
41ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mShouldRequestLocationPermission;
42ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mShouldRequestStoragePermission;
43ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private int mNumPermissionsToRequest;
44ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mFlagHasCameraPermission;
45ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mFlagHasMicrophonePermission;
46ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private boolean mFlagHasStoragePermission;
47ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private SettingsManager mSettingsManager;
48ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
49dd334be92c5513a06c809ee3ea25e411dfad0589zafir    /**
50dd334be92c5513a06c809ee3ea25e411dfad0589zafir     * Close activity when secure app passes lock screen or screen turns
51dd334be92c5513a06c809ee3ea25e411dfad0589zafir     * off.
52dd334be92c5513a06c809ee3ea25e411dfad0589zafir     */
53dd334be92c5513a06c809ee3ea25e411dfad0589zafir    private final BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() {
54dd334be92c5513a06c809ee3ea25e411dfad0589zafir        @Override
55dd334be92c5513a06c809ee3ea25e411dfad0589zafir        public void onReceive(Context context, Intent intent) {
56dd334be92c5513a06c809ee3ea25e411dfad0589zafir          Log.v(TAG, "received intent, finishing: " + intent.getAction());
57dd334be92c5513a06c809ee3ea25e411dfad0589zafir          finish();
58dd334be92c5513a06c809ee3ea25e411dfad0589zafir        }
59dd334be92c5513a06c809ee3ea25e411dfad0589zafir    };
60dd334be92c5513a06c809ee3ea25e411dfad0589zafir
61ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    @Override
62dd334be92c5513a06c809ee3ea25e411dfad0589zafir    protected void onCreateTasks(Bundle savedInstanceState) {
63dd334be92c5513a06c809ee3ea25e411dfad0589zafir        setContentView(R.layout.permissions);
64ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        mSettingsManager = CameraServicesImpl.instance().getSettingsManager();
65dd334be92c5513a06c809ee3ea25e411dfad0589zafir
66dd334be92c5513a06c809ee3ea25e411dfad0589zafir        // Filter for screen off so that we can finish permissions activity
67dd334be92c5513a06c809ee3ea25e411dfad0589zafir        // when screen is off.
68dd334be92c5513a06c809ee3ea25e411dfad0589zafir        IntentFilter filter_screen_off = new IntentFilter(Intent.ACTION_SCREEN_OFF);
69dd334be92c5513a06c809ee3ea25e411dfad0589zafir        registerReceiver(mShutdownReceiver, filter_screen_off);
70dd334be92c5513a06c809ee3ea25e411dfad0589zafir
71dd334be92c5513a06c809ee3ea25e411dfad0589zafir        // Filter for phone unlock so that we can finish permissions activity
72dd334be92c5513a06c809ee3ea25e411dfad0589zafir        // via this UI path:
73dd334be92c5513a06c809ee3ea25e411dfad0589zafir        //    1. from secure lock screen, user starts secure camera
74dd334be92c5513a06c809ee3ea25e411dfad0589zafir        //    2. user presses home button
75dd334be92c5513a06c809ee3ea25e411dfad0589zafir        //    3. user unlocks phone
76dd334be92c5513a06c809ee3ea25e411dfad0589zafir        IntentFilter filter_user_unlock = new IntentFilter(Intent.ACTION_USER_PRESENT);
77dd334be92c5513a06c809ee3ea25e411dfad0589zafir        registerReceiver(mShutdownReceiver, filter_user_unlock);
78dd334be92c5513a06c809ee3ea25e411dfad0589zafir
79dd334be92c5513a06c809ee3ea25e411dfad0589zafir        Window win = getWindow();
80dd334be92c5513a06c809ee3ea25e411dfad0589zafir        if (isKeyguardLocked()) {
81dd334be92c5513a06c809ee3ea25e411dfad0589zafir            win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
82dd334be92c5513a06c809ee3ea25e411dfad0589zafir        } else {
83dd334be92c5513a06c809ee3ea25e411dfad0589zafir            win.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
84dd334be92c5513a06c809ee3ea25e411dfad0589zafir        }
85ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
86ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
87ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    @Override
88dd334be92c5513a06c809ee3ea25e411dfad0589zafir    protected void onResumeTasks() {
89ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        mNumPermissionsToRequest = 0;
90ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        checkPermissions();
91ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
92ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
93dd334be92c5513a06c809ee3ea25e411dfad0589zafir    @Override
94dd334be92c5513a06c809ee3ea25e411dfad0589zafir    protected void onDestroyTasks() {
95dd334be92c5513a06c809ee3ea25e411dfad0589zafir        Log.v(TAG, "onDestroy: unregistering receivers");
96dd334be92c5513a06c809ee3ea25e411dfad0589zafir        unregisterReceiver(mShutdownReceiver);
97dd334be92c5513a06c809ee3ea25e411dfad0589zafir    }
98dd334be92c5513a06c809ee3ea25e411dfad0589zafir
99ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private void checkPermissions() {
100ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (checkSelfPermission(Manifest.permission.CAMERA)
101ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                != PackageManager.PERMISSION_GRANTED) {
102ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mNumPermissionsToRequest++;
103ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mShouldRequestCameraPermission = true;
104ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        } else {
105ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mFlagHasCameraPermission = true;
106ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
107ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
108ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (checkSelfPermission(Manifest.permission.RECORD_AUDIO)
109ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                != PackageManager.PERMISSION_GRANTED) {
110ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mNumPermissionsToRequest++;
111ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mShouldRequestMicrophonePermission = true;
112ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        } else {
113ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mFlagHasMicrophonePermission = true;
114ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
115ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
116ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
117ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                != PackageManager.PERMISSION_GRANTED) {
118ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mNumPermissionsToRequest++;
119ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mShouldRequestStoragePermission = true;
120ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        } else {
121ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mFlagHasStoragePermission = true;
122ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
123ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
124ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
125ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                != PackageManager.PERMISSION_GRANTED) {
126ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mNumPermissionsToRequest++;
127ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mShouldRequestLocationPermission = true;
128ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
129ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
130ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mNumPermissionsToRequest != 0) {
131dd334be92c5513a06c809ee3ea25e411dfad0589zafir            if (!isKeyguardLocked() && !mSettingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL,
132ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                    Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS)) {
133ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                buildPermissionsRequest();
134ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            } else {
135dd334be92c5513a06c809ee3ea25e411dfad0589zafir                // Permissions dialog has already been shown, or we're on
136dd334be92c5513a06c809ee3ea25e411dfad0589zafir                // lockscreen, and we're still missing permissions.
137ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                handlePermissionsFailure();
138ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            }
139ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        } else {
140ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            handlePermissionsSuccess();
141ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
142ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
143ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
144ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private void buildPermissionsRequest() {
145ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        String[] permissionsToRequest = new String[mNumPermissionsToRequest];
146ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        int permissionsRequestIndex = 0;
147ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
148ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestCameraPermission) {
149ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsToRequest[permissionsRequestIndex] = Manifest.permission.CAMERA;
150ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mIndexPermissionRequestCamera = permissionsRequestIndex;
151ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsRequestIndex++;
152ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
153ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestMicrophonePermission) {
154ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsToRequest[permissionsRequestIndex] = Manifest.permission.RECORD_AUDIO;
155ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mIndexPermissionRequestMicrophone = permissionsRequestIndex;
156ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsRequestIndex++;
157ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
158ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestStoragePermission) {
159ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE;
160ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mIndexPermissionRequestStorage = permissionsRequestIndex;
161ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsRequestIndex++;
162ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
163ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestLocationPermission) {
164ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            permissionsToRequest[permissionsRequestIndex] = Manifest.permission.ACCESS_COARSE_LOCATION;
165ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            mIndexPermissionRequestLocation = permissionsRequestIndex;
166ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
167ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
168dd334be92c5513a06c809ee3ea25e411dfad0589zafir        Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length);
169ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
170ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
171ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
172ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    @Override
173ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    public void onRequestPermissionsResult(int requestCode,
174ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                                           String permissions[], int[] grantResults) {
175dd334be92c5513a06c809ee3ea25e411dfad0589zafir        Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length);
176ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        mSettingsManager.set(
177ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                SettingsManager.SCOPE_GLOBAL,
178ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                Keys.KEY_HAS_SEEN_PERMISSIONS_DIALOGS,
179ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                true);
180ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
181ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestCameraPermission) {
182c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger            if (grantResults.length > 0 && grantResults[mIndexPermissionRequestCamera] ==
183c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger                    PackageManager.PERMISSION_GRANTED) {
184ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                mFlagHasCameraPermission = true;
185ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            } else {
186ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                handlePermissionsFailure();
187ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            }
188ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
189ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestMicrophonePermission) {
190c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger            if (grantResults.length > 0 && grantResults[mIndexPermissionRequestMicrophone] ==
191c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger                    PackageManager.PERMISSION_GRANTED) {
192ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                mFlagHasMicrophonePermission = true;
193ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            } else {
194ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                handlePermissionsFailure();
195ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            }
196ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
197ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestStoragePermission) {
198c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger            if (grantResults.length > 0 && grantResults[mIndexPermissionRequestStorage] ==
199c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger                    PackageManager.PERMISSION_GRANTED) {
200ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                mFlagHasStoragePermission = true;
201ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            } else {
202ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                handlePermissionsFailure();
203ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            }
204ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
205ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
206ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mShouldRequestLocationPermission) {
207c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger            if (grantResults.length > 0 && grantResults[mIndexPermissionRequestLocation] ==
208c8594ddf504109dc3c17baf9c2448469b28973e9Alan Newberger                    PackageManager.PERMISSION_GRANTED) {
209ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                // Do nothing
210ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            } else {
211ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                // Do nothing
212ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            }
213ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
214ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
215ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        if (mFlagHasCameraPermission && mFlagHasMicrophonePermission && mFlagHasStoragePermission) {
216ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir            handlePermissionsSuccess();
217ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        }
218ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
219ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
220ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private void handlePermissionsSuccess() {
221ac0e2425e77a9b69e76d2f31876798825ea44584zafir        Intent intent = new Intent(this, CameraActivity.class);
222ac0e2425e77a9b69e76d2f31876798825ea44584zafir        startActivity(intent);
223ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        finish();
224ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
225ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir
226ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    private void handlePermissionsFailure() {
227ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir        new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.camera_error_title))
228ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                .setMessage(getResources().getString(R.string.error_permissions))
229dd334be92c5513a06c809ee3ea25e411dfad0589zafir                .setCancelable(false)
230dd334be92c5513a06c809ee3ea25e411dfad0589zafir                .setOnKeyListener(new Dialog.OnKeyListener() {
231dd334be92c5513a06c809ee3ea25e411dfad0589zafir                    @Override
232dd334be92c5513a06c809ee3ea25e411dfad0589zafir                    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
233dd334be92c5513a06c809ee3ea25e411dfad0589zafir                        if (keyCode == KeyEvent.KEYCODE_BACK) {
234dd334be92c5513a06c809ee3ea25e411dfad0589zafir                            finish();
235dd334be92c5513a06c809ee3ea25e411dfad0589zafir                        }
236dd334be92c5513a06c809ee3ea25e411dfad0589zafir                        return true;
237dd334be92c5513a06c809ee3ea25e411dfad0589zafir                    }
238dd334be92c5513a06c809ee3ea25e411dfad0589zafir                })
239dd334be92c5513a06c809ee3ea25e411dfad0589zafir                .setPositiveButton(getResources().getString(R.string.dialog_dismiss),
240dd334be92c5513a06c809ee3ea25e411dfad0589zafir                        new DialogInterface.OnClickListener() {
241ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                    @Override
242ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                    public void onClick(DialogInterface dialog, int which) {
243ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                        finish();
244ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                    }
245ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                })
246ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir                .show();
247ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir    }
248ad44cda82fe6ec5ee090115129223c6314f9e1bbzafir}
249