blob: 68f2b19a2b7b9999ac101a5551c022cc0c1767fc [file] [log] [blame]
LuK13372be2de92015-12-17 21:32:46 +08001package com.android.browser;
2
3import android.Manifest;
4import android.app.Activity;
5import android.app.Dialog;
6import android.app.AlertDialog;
7import android.app.KeyguardManager;
8import android.content.BroadcastReceiver;
9import android.content.Context;
10import android.content.DialogInterface;
11import android.content.Intent;
12import android.content.IntentFilter;
13import android.content.SharedPreferences;
14import android.content.SharedPreferences.Editor;
15import android.content.pm.PackageManager;
16import android.preference.PreferenceManager;
17import android.os.Bundle;
18import android.util.Log;
19import android.view.KeyEvent;
20import android.view.Window;
21import android.view.WindowManager;
22import com.android.browser.R;
23
24/**
25 * Activity that shows permissions request dialogs and handles lack of critical permissions.
26 */
27public class PermissionsActivity extends Activity {
28 private static final String TAG = "PermissionsActivity";
29
30 private static String PREF_HAS_SEEN_PERMISSIONS_DIALOGS = "pref_has_seen_permissions_dialogs";
31 private static int PERMISSION_REQUEST_CODE = 1;
32 private static int RESULT_CODE_OK = 1;
33 private static int RESULT_CODE_FAILED = 2;
34
35 private int mIndexPermissionRequestStorage;
36 private boolean mShouldRequestStoragePermission;
37 private int mNumPermissionsToRequest;
38 private boolean mFlagHasStoragePermission;
39 private SharedPreferences mPrefs;
40
41 /**
42 * Close activity when secure app passes lock screen or screen turns
43 * off.
44 */
45 private final BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() {
46 @Override
47 public void onReceive(Context context, Intent intent) {
48 Log.v(TAG, "received intent, finishing: " + intent.getAction());
49 finish();
50 }
51 };
52
53 @Override
54 protected void onCreate(Bundle savedInstanceState) {
55 super.onCreate(savedInstanceState);
56 mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
57 }
58
59 @Override
60 protected void onResume() {
61 super.onResume();
62 mNumPermissionsToRequest = 0;
63 checkPermissions();
64 }
65
66 private void checkPermissions() {
67 if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
68 != PackageManager.PERMISSION_GRANTED) {
69 mNumPermissionsToRequest++;
70 mShouldRequestStoragePermission = true;
71 } else {
72 mFlagHasStoragePermission = true;
73 }
74
75 if (mNumPermissionsToRequest != 0) {
76 if (!mPrefs.getBoolean(PREF_HAS_SEEN_PERMISSIONS_DIALOGS, false)) {
77 buildPermissionsRequest();
78 } else {
79 // Permissions dialog has already been shown
80 // and we're still missing permissions.
81 handlePermissionsFailure();
82 }
83 } else {
84 handlePermissionsSuccess();
85 }
86 }
87
88 private void buildPermissionsRequest() {
89 String[] permissionsToRequest = new String[mNumPermissionsToRequest];
90 int permissionsRequestIndex = 0;
91
92 if (mShouldRequestStoragePermission) {
93 permissionsToRequest[permissionsRequestIndex] = Manifest.permission.READ_EXTERNAL_STORAGE;
94 mIndexPermissionRequestStorage = permissionsRequestIndex;
95 permissionsRequestIndex++;
96 }
97
98 Log.v(TAG, "requestPermissions count: " + permissionsToRequest.length);
99 requestPermissions(permissionsToRequest, PERMISSION_REQUEST_CODE);
100 }
101
102 @Override
103 public void onRequestPermissionsResult(int requestCode, String permissions[],
104 int[] grantResults) {
105 Log.v(TAG, "onPermissionsResult counts: " + permissions.length + ":" + grantResults.length);
106
107 if (mShouldRequestStoragePermission) {
108 if (grantResults.length > 0 && grantResults[mIndexPermissionRequestStorage] ==
109 PackageManager.PERMISSION_GRANTED) {
110 mFlagHasStoragePermission = true;
111 } else {
112 handlePermissionsFailure();
113 }
114 }
115
116 if (mFlagHasStoragePermission) {
117 handlePermissionsSuccess();
118 }
119 }
120
121 private void handlePermissionsSuccess() {
122 Editor edit = mPrefs.edit();
123 edit.putBoolean(PREF_HAS_SEEN_PERMISSIONS_DIALOGS, true);
124 edit.commit();
125
126 Intent intent = new Intent(this, BrowserActivity.class);
127 startActivity(intent);
128 finish();
129 }
130
131 private void handlePermissionsFailure() {
132 new AlertDialog.Builder(this).setTitle(getResources().getString(R.string.browser_error_title))
133 .setMessage(getResources().getString(R.string.error_permissions))
134 .setPositiveButton(getResources().getString(R.string.dialog_dismiss),
135 new DialogInterface.OnClickListener() {
136 @Override
137 public void onClick(DialogInterface dialog, int which) {
138 finish();
139 }
140 })
141 .show();
142 }
143}