blob: 7a11053c571e9b202afc63d154584d2c38b7a9c7 [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.Dialog;
Jim Miller46c7f6d2014-10-13 18:15:17 -070022import android.app.admin.DevicePolicyManager;
Fan Zhang31b21002019-01-16 13:49:47 -080023import android.app.settings.SettingsEnums;
Jim Miller46c7f6d2014-10-13 18:15:17 -070024import 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;
Jim Miller46c7f6d2014-10-13 18:15:17 -070034import android.widget.TextView;
35
Fan Zhang23f8d592018-08-28 15:11:40 -070036import androidx.appcompat.app.AlertDialog;
37
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;
Pasty Changc1f86002018-12-11 02:22:55 +000041
pastychang9bdb59a2019-01-21 09:49:15 +080042import com.google.android.setupcompat.template.FooterBarMixin;
43import com.google.android.setupcompat.template.FooterButton;
Pasty Changc1f86002018-12-11 02:22:55 +000044import com.google.android.setupdesign.GlifLayout;
Jason Monk39b46742015-09-10 15:52:51 -040045
46import java.util.List;
47
Jim Miller46c7f6d2014-10-13 18:15:17 -070048public class EncryptionInterstitial extends SettingsActivity {
Maurice Lamd189ac52016-06-15 13:39:34 -070049 private static final String TAG = EncryptionInterstitial.class.getSimpleName();
Jim Miller46c7f6d2014-10-13 18:15:17 -070050
Maurice Lam0973c312014-12-05 12:19:05 -080051 protected static final String EXTRA_PASSWORD_QUALITY = "extra_password_quality";
Udam Sainiedac1362015-12-08 17:28:19 -080052 protected static final String EXTRA_UNLOCK_METHOD_INTENT = "extra_unlock_method_intent";
Jim Miller0698a212014-10-16 19:49:07 -070053 public static final String EXTRA_REQUIRE_PASSWORD = "extra_require_password";
Udam Sainiedac1362015-12-08 17:28:19 -080054 private static final int CHOOSE_LOCK_REQUEST = 100;
Jim Miller46c7f6d2014-10-13 18:15:17 -070055
56 @Override
57 public Intent getIntent() {
58 Intent modIntent = new Intent(super.getIntent());
59 modIntent.putExtra(EXTRA_SHOW_FRAGMENT, EncryptionInterstitialFragment.class.getName());
60 return modIntent;
61 }
62
63 @Override
Maurice Lam9990f392017-06-28 15:06:09 -070064 protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
65 resid = SetupWizardUtils.getTheme(getIntent());
66 super.onApplyThemeResource(theme, resid, first);
67 }
68
69 @Override
Jim Miller46c7f6d2014-10-13 18:15:17 -070070 protected boolean isValidFragment(String fragmentName) {
71 return EncryptionInterstitialFragment.class.getName().equals(fragmentName);
72 }
73
Jim Miller0698a212014-10-16 19:49:07 -070074 public static Intent createStartIntent(Context ctx, int quality,
Udam Sainiedac1362015-12-08 17:28:19 -080075 boolean requirePasswordDefault, Intent unlockMethodIntent) {
Jim Miller46c7f6d2014-10-13 18:15:17 -070076 return new Intent(ctx, EncryptionInterstitial.class)
Jim Miller46c7f6d2014-10-13 18:15:17 -070077 .putExtra(EXTRA_PASSWORD_QUALITY, quality)
Jim Miller0698a212014-10-16 19:49:07 -070078 .putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.encryption_interstitial_header)
Udam Sainiedac1362015-12-08 17:28:19 -080079 .putExtra(EXTRA_REQUIRE_PASSWORD, requirePasswordDefault)
80 .putExtra(EXTRA_UNLOCK_METHOD_INTENT, unlockMethodIntent);
Jim Miller46c7f6d2014-10-13 18:15:17 -070081 }
82
Maurice Lamd189ac52016-06-15 13:39:34 -070083 @Override
84 protected void onCreate(Bundle savedInstance) {
85 super.onCreate(savedInstance);
Fan Zhang9db66a52019-05-10 14:18:33 -070086 findViewById(R.id.content_parent).setFitsSystemWindows(false);
Maurice Lamd189ac52016-06-15 13:39:34 -070087 }
88
pastychang5dfdb4f2018-12-17 14:50:27 +080089 public static class EncryptionInterstitialFragment extends InstrumentedFragment {
Udam Sainid553abc2016-02-16 17:54:13 -080090
Jim Miller0698a212014-10-16 19:49:07 -070091 private boolean mPasswordRequired;
Udam Sainiedac1362015-12-08 17:28:19 -080092 private Intent mUnlockMethodIntent;
Maurice Lam8890f7a2016-05-12 16:24:41 -070093 private int mRequestedPasswordQuality;
Jim Miller46c7f6d2014-10-13 18:15:17 -070094
95 @Override
Fan Zhang65076132016-08-08 10:25:13 -070096 public int getMetricsCategory() {
Fan Zhang31b21002019-01-16 13:49:47 -080097 return SettingsEnums.ENCRYPTION;
Chris Wren8a963ba2015-03-20 10:29:14 -040098 }
99
100 @Override
Maurice Lam9be96e02017-02-23 14:43:48 -0800101 public View onCreateView(
102 LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
103 return inflater.inflate(R.layout.encryption_interstitial, container, false);
104 }
Maurice Lam7e831032015-07-20 16:08:38 -0700105
Maurice Lam9be96e02017-02-23 14:43:48 -0800106 @Override
107 public void onViewCreated(View view, Bundle savedInstanceState) {
108 super.onViewCreated(view, savedInstanceState);
Udam Sainid553abc2016-02-16 17:54:13 -0800109
Kevin Chyn81dc0292018-06-28 14:59:38 -0700110 final boolean forFingerprint = getActivity().getIntent().getBooleanExtra(
Maurice Lamc0e78792015-07-20 14:49:29 -0700111 ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, false);
Kevin Chyn81dc0292018-06-28 14:59:38 -0700112 final boolean forFace = getActivity().getIntent()
113 .getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, false);
Udam Sainiedac1362015-12-08 17:28:19 -0800114 Intent intent = getActivity().getIntent();
Maurice Lam8890f7a2016-05-12 16:24:41 -0700115 mRequestedPasswordQuality = intent.getIntExtra(EXTRA_PASSWORD_QUALITY, 0);
116 mUnlockMethodIntent = intent.getParcelableExtra(EXTRA_UNLOCK_METHOD_INTENT);
Jim Miller46c7f6d2014-10-13 18:15:17 -0700117 final int msgId;
Maurice Lam8890f7a2016-05-12 16:24:41 -0700118 switch (mRequestedPasswordQuality) {
Jim Miller46c7f6d2014-10-13 18:15:17 -0700119 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
Maurice Lamc0e78792015-07-20 14:49:29 -0700120 msgId = forFingerprint ?
121 R.string.encryption_interstitial_message_pattern_for_fingerprint :
Kevin Chyn81dc0292018-06-28 14:59:38 -0700122 forFace ?
123 R.string.encryption_interstitial_message_pattern_for_face :
Maurice Lamc0e78792015-07-20 14:49:29 -0700124 R.string.encryption_interstitial_message_pattern;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700125 break;
126 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
127 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
Maurice Lamc0e78792015-07-20 14:49:29 -0700128 msgId = forFingerprint ?
129 R.string.encryption_interstitial_message_pin_for_fingerprint :
Kevin Chyn81dc0292018-06-28 14:59:38 -0700130 forFace ?
131 R.string.encryption_interstitial_message_pin_for_face :
Maurice Lamc0e78792015-07-20 14:49:29 -0700132 R.string.encryption_interstitial_message_pin;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700133 break;
134 default:
Maurice Lamc0e78792015-07-20 14:49:29 -0700135 msgId = forFingerprint ?
136 R.string.encryption_interstitial_message_password_for_fingerprint :
Kevin Chyn81dc0292018-06-28 14:59:38 -0700137 forFace ?
138 R.string.encryption_interstitial_message_password_for_face :
Maurice Lamc0e78792015-07-20 14:49:29 -0700139 R.string.encryption_interstitial_message_password;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700140 break;
141 }
pastychangfa68ec42019-04-12 16:22:17 +0800142 TextView message = (TextView) getActivity().findViewById(R.id.sud_layout_description);
Udam Sainid553abc2016-02-16 17:54:13 -0800143 message.setText(msgId);
Jim Miller0698a212014-10-16 19:49:07 -0700144
Jim Miller47adff02014-10-17 17:43:18 -0700145 setRequirePasswordState(getActivity().getIntent().getBooleanExtra(
146 EXTRA_REQUIRE_PASSWORD, true));
Udam Sainiedac1362015-12-08 17:28:19 -0800147
Maurice Lam9be96e02017-02-23 14:43:48 -0800148 GlifLayout layout = (GlifLayout) view;
Maurice Lamd189ac52016-06-15 13:39:34 -0700149 layout.setHeaderText(getActivity().getTitle());
pastychang5dfdb4f2018-12-17 14:50:27 +0800150
pastychang9bdb59a2019-01-21 09:49:15 +0800151 final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
152 mixin.setSecondaryButton(
pastychang908501e2018-12-26 10:46:40 +0800153 new FooterButton.Builder(getContext())
154 .setText(R.string.encryption_interstitial_no)
155 .setListener(this::onNoButtonClicked)
156 .setButtonType(FooterButton.ButtonType.SKIP)
pastychang79614822019-01-03 10:12:54 +0800157 .setTheme(R.style.SudGlifButton_Secondary)
pastychang908501e2018-12-26 10:46:40 +0800158 .build()
pastychang5dfdb4f2018-12-17 14:50:27 +0800159 );
160
pastychang9bdb59a2019-01-21 09:49:15 +0800161 mixin.setPrimaryButton(
pastychang908501e2018-12-26 10:46:40 +0800162 new FooterButton.Builder(getContext())
163 .setText(R.string.encryption_interstitial_yes)
164 .setListener(this::onYesButtonClicked)
165 .setButtonType(FooterButton.ButtonType.NEXT)
pastychang79614822019-01-03 10:12:54 +0800166 .setTheme(R.style.SudGlifButton_Primary)
pastychang908501e2018-12-26 10:46:40 +0800167 .build()
pastychang5dfdb4f2018-12-17 14:50:27 +0800168 );
Udam Sainiedac1362015-12-08 17:28:19 -0800169 }
170
171 protected void startLockIntent() {
172 if (mUnlockMethodIntent != null) {
173 mUnlockMethodIntent.putExtra(EXTRA_REQUIRE_PASSWORD, mPasswordRequired);
174 startActivityForResult(mUnlockMethodIntent, CHOOSE_LOCK_REQUEST);
175 } else {
176 Log.wtf(TAG, "no unlock intent to start");
177 finish();
178 }
179 }
180
181 @Override
182 public void onActivityResult(int requestCode, int resultCode, Intent data) {
183 super.onActivityResult(requestCode, resultCode, data);
Maurice Lame9d2abc2015-12-14 18:03:54 -0800184 if (requestCode == CHOOSE_LOCK_REQUEST && resultCode != RESULT_CANCELED) {
185 getActivity().setResult(resultCode, data);
Udam Sainiedac1362015-12-08 17:28:19 -0800186 finish();
187 }
Jim Miller46c7f6d2014-10-13 18:15:17 -0700188 }
189
pastychang5dfdb4f2018-12-17 14:50:27 +0800190 private void onYesButtonClicked(View view) {
191 final boolean accEn = AccessibilityManager.getInstance(getActivity()).isEnabled();
192 if (accEn && !mPasswordRequired) {
193 setRequirePasswordState(false); // clear the UI state
194 AccessibilityWarningDialogFragment.newInstance(mRequestedPasswordQuality)
195 .show(
196 getChildFragmentManager(),
197 AccessibilityWarningDialogFragment.TAG);
Jim Miller47adff02014-10-17 17:43:18 -0700198 } else {
pastychang5dfdb4f2018-12-17 14:50:27 +0800199 setRequirePasswordState(true);
Udam Sainid553abc2016-02-16 17:54:13 -0800200 startLockIntent();
Jim Miller47adff02014-10-17 17:43:18 -0700201 }
Jim Miller0698a212014-10-16 19:49:07 -0700202 }
203
pastychang5dfdb4f2018-12-17 14:50:27 +0800204 private void onNoButtonClicked(View view) {
205 setRequirePasswordState(false);
206 startLockIntent();
207 }
208
Jim Miller47adff02014-10-17 17:43:18 -0700209 private void setRequirePasswordState(boolean required) {
210 mPasswordRequired = required;
Jim Miller46c7f6d2014-10-13 18:15:17 -0700211 }
Jim Miller47adff02014-10-17 17:43:18 -0700212
Maurice Lam18d79652017-03-21 17:57:55 -0700213 public void finish() {
214 Activity activity = getActivity();
215 if (activity == null) return;
216 if (getFragmentManager().getBackStackEntryCount() > 0) {
217 getFragmentManager().popBackStack();
218 } else {
219 activity.finish();
220 }
221 }
222 }
223
224 public static class AccessibilityWarningDialogFragment extends InstrumentedDialogFragment
225 implements DialogInterface.OnClickListener {
226
227 public static final String TAG = "AccessibilityWarningDialog";
228
229 public static AccessibilityWarningDialogFragment newInstance(int passwordQuality) {
230 AccessibilityWarningDialogFragment fragment = new AccessibilityWarningDialogFragment();
231 Bundle args = new Bundle(1);
232 args.putInt(EXTRA_PASSWORD_QUALITY, passwordQuality);
233 fragment.setArguments(args);
234 return fragment;
235 }
236
237 @Override
238 public Dialog onCreateDialog(Bundle savedInstanceState) {
239 final int titleId;
240 final int messageId;
241 switch (getArguments().getInt(EXTRA_PASSWORD_QUALITY)) {
242 case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
243 titleId = R.string.encrypt_talkback_dialog_require_pattern;
244 messageId = R.string.encrypt_talkback_dialog_message_pattern;
245 break;
246 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
247 case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
248 titleId = R.string.encrypt_talkback_dialog_require_pin;
249 messageId = R.string.encrypt_talkback_dialog_message_pin;
250 break;
251 default:
252 titleId = R.string.encrypt_talkback_dialog_require_password;
253 messageId = R.string.encrypt_talkback_dialog_message_password;
254 break;
255 }
256
257
258 final Activity activity = getActivity();
259 List<AccessibilityServiceInfo> list =
260 AccessibilityManager.getInstance(activity)
261 .getEnabledAccessibilityServiceList(
262 AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
263 final CharSequence exampleAccessibility;
264 if (list.isEmpty()) {
265 // This should never happen. But we shouldn't crash
266 exampleAccessibility = "";
267 } else {
268 exampleAccessibility = list.get(0).getResolveInfo()
269 .loadLabel(activity.getPackageManager());
270 }
271 return new AlertDialog.Builder(activity)
272 .setTitle(titleId)
273 .setMessage(getString(messageId, exampleAccessibility))
274 .setCancelable(true)
275 .setPositiveButton(android.R.string.ok, this)
276 .setNegativeButton(android.R.string.cancel, this)
277 .create();
278 }
279
280 @Override
281 public int getMetricsCategory() {
Fan Zhang31b21002019-01-16 13:49:47 -0800282 return SettingsEnums.DIALOG_ENCRYPTION_INTERSTITIAL_ACCESSIBILITY;
Maurice Lam18d79652017-03-21 17:57:55 -0700283 }
284
Jim Miller47adff02014-10-17 17:43:18 -0700285 @Override
286 public void onClick(DialogInterface dialog, int which) {
Maurice Lam18d79652017-03-21 17:57:55 -0700287 EncryptionInterstitialFragment fragment =
288 (EncryptionInterstitialFragment) getParentFragment();
289 if (fragment != null) {
290 if (which == DialogInterface.BUTTON_POSITIVE) {
291 fragment.setRequirePasswordState(true);
292 fragment.startLockIntent();
293 } else if (which == DialogInterface.BUTTON_NEGATIVE) {
294 fragment.setRequirePasswordState(false);
295 }
Jim Miller47adff02014-10-17 17:43:18 -0700296 }
297 }
Jim Miller46c7f6d2014-10-13 18:15:17 -0700298 }
299}