blob: f0115b8ef3c8f1e2756c6de9a384a6d68254e761 [file] [log] [blame]
Jim Miller46c7f6d2014-10-13 18:15:17 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.settings;
18
Jim Milleraa037672014-10-17 18:28:52 -070019import android.accessibilityservice.AccessibilityServiceInfo;
Maurice Lam18d79652017-03-21 17:57:55 -070020import android.app.Activity;
Jim Miller47adff02014-10-17 17:43:18 -070021import android.app.AlertDialog;
22import android.app.Dialog;
Jim Miller46c7f6d2014-10-13 18:15:17 -070023import android.app.admin.DevicePolicyManager;
24import android.content.Context;
Jim Miller47adff02014-10-17 17:43:18 -070025import android.content.DialogInterface;
Jim Miller46c7f6d2014-10-13 18:15:17 -070026import android.content.Intent;
Maurice Lam9990f392017-06-28 15:06:09 -070027import android.content.res.Resources;
Jim Miller46c7f6d2014-10-13 18:15:17 -070028import android.os.Bundle;
Udam Sainiedac1362015-12-08 17:28:19 -080029import android.util.Log;
Jim Miller46c7f6d2014-10-13 18:15:17 -070030import android.view.LayoutInflater;
Maurice Lamd189ac52016-06-15 13:39:34 -070031import android.view.View;
32import android.view.ViewGroup;
Jim Miller47adff02014-10-17 17:43:18 -070033import android.view.accessibility.AccessibilityManager;
Maurice Lamd189ac52016-06-15 13:39:34 -070034import android.widget.LinearLayout;
Jim Miller46c7f6d2014-10-13 18:15:17 -070035import android.widget.TextView;
36
Tamas Berghammer265d3c22016-06-22 15:34:45 +010037import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Maurice Lam18d79652017-03-21 17:57:55 -070038import com.android.settings.core.InstrumentedFragment;
39import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
Maurice Lam2eb170c2017-04-28 16:18:47 -070040import com.android.settings.password.ChooseLockSettingsHelper;
Maurice Lam9be96e02017-02-23 14:43:48 -080041import com.android.setupwizardlib.GlifLayout;
Jason Monk39b46742015-09-10 15:52:51 -040042
43import java.util.List;
44
Jim Miller46c7f6d2014-10-13 18:15:17 -070045public class EncryptionInterstitial extends SettingsActivity {
Maurice Lamd189ac52016-06-15 13:39:34 -070046 private static final String TAG = EncryptionInterstitial.class.getSimpleName();
Jim Miller46c7f6d2014-10-13 18:15:17 -070047
Maurice Lam0973c312014-12-05 12:19:05 -080048 protected static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality";
Udam Sainiedac1362015-12-08 17:28:19 -080049 protected static final String EXTRA_UNLOCK_METHOD_INTENT = "extra_unlock_method_intent";
Jim Miller0698a212014-10-16 19:49:07 -070050 public static final String EXTRA_REQUIRE_PASSWORD = "extra_require_password";
Udam Sainiedac1362015-12-08 17:28:19 -080051 private static final int CHOOSE_LOCK_REQUEST = 100;
Jim Miller46c7f6d2014-10-13 18:15:17 -070052
53 @Override
54 public Intent getIntent() {
55 Intent modIntent = new Intent(super.getIntent());
56 modIntent.putExtra(EXTRA_SHOW_FRAGMENT, EncryptionInterstitialFragment.class.getName());
57 return modIntent;
58 }
59
60 @Override
Maurice Lam9990f392017-06-28 15:06:09 -070061 protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
62 resid = SetupWizardUtils.getTheme(getIntent());
63 super.onApplyThemeResource(theme, resid, first);
64 }
65
66 @Override
Jim Miller46c7f6d2014-10-13 18:15:17 -070067 protected boolean isValidFragment(String fragmentName) {
68 return EncryptionInterstitialFragment.class.getName().equals(fragmentName);
69 }
70
Jim Miller0698a212014-10-16 19:49:07 -070071 public static Intent createStartIntent(Context ctx, int quality,
Udam Sainiedac1362015-12-08 17:28:19 -080072 boolean requirePasswordDefault, Intent unlockMethodIntent) {
Jim Miller46c7f6d2014-10-13 18:15:17 -070073 return new Intent(ctx, EncryptionInterstitial.class)
Jim Miller46c7f6d2014-10-13 18:15:17 -070074 .putExtra(EXTRA_PASSWORD_QUALITY, quality)
Jim Miller0698a212014-10-16 19:49:07 -070075 .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.encryption_interstitial_header)
Udam Sainiedac1362015-12-08 17:28:19 -080076 .putExtra(EXTRA_REQUIRE_PASSWORD, requirePasswordDefault)
77 .putExtra(EXTRA_UNLOCK_METHOD_INTENT, unlockMethodIntent);
Jim Miller46c7f6d2014-10-13 18:15:17 -070078 }
79
Maurice Lamd189ac52016-06-15 13:39:34 -070080 @Override
81 protected void onCreate(Bundle savedInstance) {
82 super.onCreate(savedInstance);
83 LinearLayout layout = (LinearLayout) findViewById(R.id.content_parent);
84 layout.setFitsSystemWindows(false);
85 }
86
Maurice Lam18d79652017-03-21 17:57:55 -070087 public static class EncryptionInterstitialFragment extends InstrumentedFragment
88 implements View.OnClickListener {
Udam Sainid553abc2016-02-16 17:54:13 -080089
Maurice Lam9be96e02017-02-23 14:43:48 -080090 private View mRequirePasswordToDecrypt;
91 private View mDontRequirePasswordToDecrypt;
Jim Miller0698a212014-10-16 19:49:07 -070092 private boolean mPasswordRequired;
Udam Sainiedac1362015-12-08 17:28:19 -080093 private Intent mUnlockMethodIntent;
Maurice Lam8890f7a2016-05-12 16:24:41 -070094 private int mRequestedPasswordQuality;
Jim Miller46c7f6d2014-10-13 18:15:17 -070095
96 @Override
Fan Zhang65076132016-08-08 10:25:13 -070097 public int getMetricsCategory() {
Chris Wren9d1bfd12016-01-26 18:04:01 -050098 return MetricsEvent.ENCRYPTION;
Chris Wren8a963ba2015-03-20 10:29:14 -040099 }
100
101 @Override
Maurice Lam9be96e02017-02-23 14:43:48 -0800102 public View onCreateView(
103 LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
104 return inflater.inflate(R.layout.encryption_interstitial, container, false);
105 }
Maurice Lam7e831032015-07-20 16:08:38 -0700106
Maurice Lam9be96e02017-02-23 14:43:48 -0800107 @Override
108 public void onViewCreated(View view, Bundle savedInstanceState) {
109 super.onViewCreated(view, savedInstanceState);
Udam Sainid553abc2016-02-16 17:54:13 -0800110
Maurice Lam9be96e02017-02-23 14:43:48 -0800111 mRequirePasswordToDecrypt = view.findViewById(R.id.encrypt_require_password);
112 mDontRequirePasswordToDecrypt = view.findViewById(R.id.encrypt_dont_require_password);
Maurice Lamc0e78792015-07-20 14:49:29 -0700113 boolean forFingerprint = getActivity().getIntent().getBooleanExtra(
114 ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
Udam Sainiedac1362015-12-08 17:28:19 -0800115 Intent intent = getActivity().getIntent();
Maurice Lam8890f7a2016-05-12 16:24:41 -0700116 mRequestedPasswordQuality = intent.getIntExtra(EXTRA_PASSWORD_QUALITY, 0);
117 mUnlockMethodIntent = intent.getParcelableExtra(EXTRA_UNLOCK_METHOD_INTENT);
Jim Miller46c7f6d2014-10-13 18:15:17 -0700118 final int msgId;
Maurice Lam8890f7a2016-05-12 16:24:41 -0700119 switch (mRequestedPasswordQuality) {
Jim Miller46c7f6d2014-10-13 18:15:17 -0700120 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
Maurice Lamc0e78792015-07-20 14:49:29 -0700121 msgId = forFingerprint ?
122 R.string.encryption_interstitial_message_pattern_for_fingerprint :
123 R.string.encryption_interstitial_message_pattern;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700124 break;
125 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
126 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
Maurice Lamc0e78792015-07-20 14:49:29 -0700127 msgId = forFingerprint ?
128 R.string.encryption_interstitial_message_pin_for_fingerprint :
129 R.string.encryption_interstitial_message_pin;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700130 break;
131 default:
Maurice Lamc0e78792015-07-20 14:49:29 -0700132 msgId = forFingerprint ?
133 R.string.encryption_interstitial_message_password_for_fingerprint :
134 R.string.encryption_interstitial_message_password;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700135 break;
136 }
Maurice Lam9be96e02017-02-23 14:43:48 -0800137 TextView message = (TextView) getActivity().findViewById(R.id.encryption_message);
Udam Sainid553abc2016-02-16 17:54:13 -0800138 message.setText(msgId);
Jim Miller0698a212014-10-16 19:49:07 -0700139
Maurice Lam9be96e02017-02-23 14:43:48 -0800140 mRequirePasswordToDecrypt.setOnClickListener(this);
141 mDontRequirePasswordToDecrypt.setOnClickListener(this);
Jim Miller0698a212014-10-16 19:49:07 -0700142
Jim Miller47adff02014-10-17 17:43:18 -0700143 setRequirePasswordState(getActivity().getIntent().getBooleanExtra(
144 EXTRA_REQUIRE_PASSWORD, true));
Udam Sainiedac1362015-12-08 17:28:19 -0800145
Maurice Lam9be96e02017-02-23 14:43:48 -0800146 GlifLayout layout = (GlifLayout) view;
Maurice Lamd189ac52016-06-15 13:39:34 -0700147 layout.setHeaderText(getActivity().getTitle());
Udam Sainiedac1362015-12-08 17:28:19 -0800148 }
149
150 protected void startLockIntent() {
151 if (mUnlockMethodIntent != null) {
152 mUnlockMethodIntent.putExtra(EXTRA_REQUIRE_PASSWORD, mPasswordRequired);
153 startActivityForResult(mUnlockMethodIntent, CHOOSE_LOCK_REQUEST);
154 } else {
155 Log.wtf(TAG, "no unlock intent to start");
156 finish();
157 }
158 }
159
160 @Override
161 public void onActivityResult(int requestCode, int resultCode, Intent data) {
162 super.onActivityResult(requestCode, resultCode, data);
Maurice Lame9d2abc2015-12-14 18:03:54 -0800163 if (requestCode == CHOOSE_LOCK_REQUEST && resultCode != RESULT_CANCELED) {
164 getActivity().setResult(resultCode, data);
Udam Sainiedac1362015-12-08 17:28:19 -0800165 finish();
166 }
Jim Miller46c7f6d2014-10-13 18:15:17 -0700167 }
168
169 @Override
Maurice Lam9be96e02017-02-23 14:43:48 -0800170 public void onClick(View view) {
171 if (view == mRequirePasswordToDecrypt) {
Jim Miller47adff02014-10-17 17:43:18 -0700172 final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
173 if (accEn && !mPasswordRequired) {
174 setRequirePasswordState(false); // clear the UI state
Maurice Lam18d79652017-03-21 17:57:55 -0700175 AccessibilityWarningDialogFragment.newInstance(mRequestedPasswordQuality)
176 .show(
177 getChildFragmentManager(),
178 AccessibilityWarningDialogFragment.TAG);
Jim Miller47adff02014-10-17 17:43:18 -0700179 } else {
180 setRequirePasswordState(true);
Udam Sainid553abc2016-02-16 17:54:13 -0800181 startLockIntent();
Jim Miller47adff02014-10-17 17:43:18 -0700182 }
183 } else {
184 setRequirePasswordState(false);
Udam Sainid553abc2016-02-16 17:54:13 -0800185 startLockIntent();
Jim Miller47adff02014-10-17 17:43:18 -0700186 }
Jim Miller0698a212014-10-16 19:49:07 -0700187 }
188
Jim Miller47adff02014-10-17 17:43:18 -0700189 private void setRequirePasswordState(boolean required) {
190 mPasswordRequired = required;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700191 }
Jim Miller47adff02014-10-17 17:43:18 -0700192
Maurice Lam18d79652017-03-21 17:57:55 -0700193 public void finish() {
194 Activity activity = getActivity();
195 if (activity == null) return;
196 if (getFragmentManager().getBackStackEntryCount() > 0) {
197 getFragmentManager().popBackStack();
198 } else {
199 activity.finish();
200 }
201 }
202 }
203
204 public static class AccessibilityWarningDialogFragment extends InstrumentedDialogFragment
205 implements DialogInterface.OnClickListener {
206
207 public static final String TAG = "AccessibilityWarningDialog";
208
209 public static AccessibilityWarningDialogFragment newInstance(int passwordQuality) {
210 AccessibilityWarningDialogFragment fragment = new AccessibilityWarningDialogFragment();
211 Bundle args = new Bundle(1);
212 args.putInt(EXTRA_PASSWORD_QUALITY, passwordQuality);
213 fragment.setArguments(args);
214 return fragment;
215 }
216
217 @Override
218 public Dialog onCreateDialog(Bundle savedInstanceState) {
219 final int titleId;
220 final int messageId;
221 switch (getArguments().getInt(EXTRA_PASSWORD_QUALITY)) {
222 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
223 titleId = R.string.encrypt_talkback_dialog_require_pattern;
224 messageId = R.string.encrypt_talkback_dialog_message_pattern;
225 break;
226 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
227 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
228 titleId = R.string.encrypt_talkback_dialog_require_pin;
229 messageId = R.string.encrypt_talkback_dialog_message_pin;
230 break;
231 default:
232 titleId = R.string.encrypt_talkback_dialog_require_password;
233 messageId = R.string.encrypt_talkback_dialog_message_password;
234 break;
235 }
236
237
238 final Activity activity = getActivity();
239 List<AccessibilityServiceInfo> list =
240 AccessibilityManager.getInstance(activity)
241 .getEnabledAccessibilityServiceList(
242 AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
243 final CharSequence exampleAccessibility;
244 if (list.isEmpty()) {
245 // This should never happen. But we shouldn't crash
246 exampleAccessibility = "";
247 } else {
248 exampleAccessibility = list.get(0).getResolveInfo()
249 .loadLabel(activity.getPackageManager());
250 }
251 return new AlertDialog.Builder(activity)
252 .setTitle(titleId)
253 .setMessage(getString(messageId, exampleAccessibility))
254 .setCancelable(true)
255 .setPositiveButton(android.R.string.ok, this)
256 .setNegativeButton(android.R.string.cancel, this)
257 .create();
258 }
259
260 @Override
261 public int getMetricsCategory() {
262 return MetricsEvent.DIALOG_ENCRYPTION_INTERSTITIAL_ACCESSIBILITY;
263 }
264
Jim Miller47adff02014-10-17 17:43:18 -0700265 @Override
266 public void onClick(DialogInterface dialog, int which) {
Maurice Lam18d79652017-03-21 17:57:55 -0700267 EncryptionInterstitialFragment fragment =
268 (EncryptionInterstitialFragment) getParentFragment();
269 if (fragment != null) {
270 if (which == DialogInterface.BUTTON_POSITIVE) {
271 fragment.setRequirePasswordState(true);
272 fragment.startLockIntent();
273 } else if (which == DialogInterface.BUTTON_NEGATIVE) {
274 fragment.setRequirePasswordState(false);
275 }
Jim Miller47adff02014-10-17 17:43:18 -0700276 }
277 }
Jim Miller46c7f6d2014-10-13 18:15:17 -0700278 }
279}