blob: a6a1b37e5879901edb7b5971d53b1daf4fec805c [file] [log] [blame]
Jim Miller00d24762009-12-22 19:04:57 -08001/*
2 * Copyright (C) 2010 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
Maurice Lam2eb170c2017-04-28 16:18:47 -070017package com.android.settings.password;
Jim Miller00d24762009-12-22 19:04:57 -080018
Jim Milleraf366a32010-03-25 18:45:22 -070019import android.app.admin.DevicePolicyManager;
Fan Zhang31b21002019-01-16 13:49:47 -080020import android.app.settings.SettingsEnums;
Andres Morales7bdffd82015-08-04 16:55:00 -070021import android.content.Context;
Jason Monk39b46742015-09-10 15:52:51 -040022import android.content.Intent;
Andrew Sappersteinccbb4cf2017-07-06 14:30:28 -070023import android.graphics.Typeface;
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -070024import android.os.AsyncTask;
Jim Miller00d24762009-12-22 19:04:57 -080025import android.os.Bundle;
Adrian Roos8184ea52014-03-31 21:33:35 +020026import android.os.CountDownTimer;
Adrian Roos8184ea52014-03-31 21:33:35 +020027import android.os.SystemClock;
Clara Bayarri34ec5f92016-01-22 14:59:24 +000028import android.os.UserManager;
Paul Lawrenced71c31e2014-04-03 09:18:45 -070029import android.os.storage.StorageManager;
Rubin Xu010116a2019-09-11 17:36:37 +010030import android.text.Editable;
Jim Miller2e28ace2010-12-15 10:07:16 -080031import android.text.InputType;
Jason Monk39b46742015-09-10 15:52:51 -040032import android.text.TextUtils;
Jim Miller122b6c82010-02-10 19:53:58 -080033import android.view.KeyEvent;
Jim Miller17e9e192010-12-07 20:41:41 -080034import android.view.LayoutInflater;
Jim Miller00d24762009-12-22 19:04:57 -080035import android.view.View;
36import android.view.View.OnClickListener;
Jason parks3e8b7632011-01-17 09:59:54 -060037import android.view.ViewGroup;
Jorim Jaggiff41a9a2015-06-09 15:31:28 -070038import android.view.animation.AnimationUtils;
Jim Miller122b6c82010-02-10 19:53:58 -080039import android.view.inputmethod.EditorInfo;
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -070040import android.view.inputmethod.InputMethodManager;
Jim Miller00d24762009-12-22 19:04:57 -080041import android.widget.TextView;
Jim Miller122b6c82010-02-10 19:53:58 -080042import android.widget.TextView.OnEditorActionListener;
Jim Miller00d24762009-12-22 19:04:57 -080043
Fan Zhang23f8d592018-08-28 15:11:40 -070044import androidx.fragment.app.Fragment;
45
Jason Monk39b46742015-09-10 15:52:51 -040046import com.android.internal.widget.LockPatternChecker;
47import com.android.internal.widget.LockPatternUtils;
Rubin Xu010116a2019-09-11 17:36:37 +010048import com.android.internal.widget.LockscreenCredential;
Jason Monk39b46742015-09-10 15:52:51 -040049import com.android.internal.widget.TextViewInputDisabler;
Maurice Lam2eb170c2017-04-28 16:18:47 -070050import com.android.settings.R;
Tarandeep Singh48032672017-06-12 15:32:28 -070051import com.android.settings.widget.ImeAwareEditText;
Jason Monk39b46742015-09-10 15:52:51 -040052import com.android.settingslib.animation.AppearAnimationUtils;
53import com.android.settingslib.animation.DisappearAnimationUtils;
54
Jorim Jaggiff41a9a2015-06-09 15:31:28 -070055import java.util.ArrayList;
56
Jorim Jaggi8a09b612015-04-06 17:47:18 -070057public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
Svetoslav3ea423a2014-10-16 14:44:25 -070058
Alex Johnston28c6b572020-01-28 17:49:33 +000059 // The index of the array is isStrongAuth << 2 + isManagedProfile << 1 + isAlpha.
Tony Mak7655be02016-04-21 10:27:43 +010060 private static final int[] DETAIL_TEXTS = new int[] {
61 R.string.lockpassword_confirm_your_pin_generic,
62 R.string.lockpassword_confirm_your_password_generic,
Alex Johnston28c6b572020-01-28 17:49:33 +000063 R.string.lockpassword_confirm_your_pin_generic_profile,
64 R.string.lockpassword_confirm_your_password_generic_profile,
Charles He4c96d9b2017-07-04 11:50:03 +010065 R.string.lockpassword_strong_auth_required_device_pin,
Alex Johnston28c6b572020-01-28 17:49:33 +000066 R.string.lockpassword_strong_auth_required_device_password,
67 R.string.lockpassword_strong_auth_required_work_pin,
68 R.string.lockpassword_strong_auth_required_work_password
Tony Mak7655be02016-04-21 10:27:43 +010069 };
70
Paul Lawrence20444042014-07-07 13:10:16 -070071 public static class InternalActivity extends ConfirmLockPassword {
72 }
73
Jim Miller00d24762009-12-22 19:04:57 -080074 @Override
Jim Miller17e9e192010-12-07 20:41:41 -080075 public Intent getIntent() {
76 Intent modIntent = new Intent(super.getIntent());
77 modIntent.putExtra(EXTRA_SHOW_FRAGMENT, ConfirmLockPasswordFragment.class.getName());
Jim Miller17e9e192010-12-07 20:41:41 -080078 return modIntent;
Jim Miller00d24762009-12-22 19:04:57 -080079 }
80
Jim Miller17e9e192010-12-07 20:41:41 -080081 @Override
Amith Yamasania677ee22013-07-26 13:38:41 -070082 protected boolean isValidFragment(String fragmentName) {
83 if (ConfirmLockPasswordFragment.class.getName().equals(fragmentName)) return true;
84 return false;
85 }
86
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -070087 @Override
88 public void onWindowFocusChanged(boolean hasFocus) {
89 super.onWindowFocusChanged(hasFocus);
tmfang27c84de2018-06-28 11:39:05 +080090 Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_content);
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -070091 if (fragment != null && fragment instanceof ConfirmLockPasswordFragment) {
92 ((ConfirmLockPasswordFragment)fragment).onWindowFocusChanged(hasFocus);
93 }
94 }
95
Jorim Jaggi8a09b612015-04-06 17:47:18 -070096 public static class ConfirmLockPasswordFragment extends ConfirmDeviceCredentialBaseFragment
Xiyuan Xia00b17fa2015-08-31 11:59:46 -070097 implements OnClickListener, OnEditorActionListener,
98 CredentialCheckResultTracker.Listener {
Xiyuan Xia00b17fa2015-08-31 11:59:46 -070099 private static final String FRAGMENT_TAG_CHECK_LOCK_RESULT = "check_lock_result";
Tarandeep Singh48032672017-06-12 15:32:28 -0700100 private ImeAwareEditText mPasswordEntry;
Xiyuan Xiaf2c2c192015-05-15 13:37:04 -0700101 private TextViewInputDisabler mPasswordEntryInputDisabler;
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700102 private AsyncTask<?, ?, ?> mPendingLockCheck;
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700103 private CredentialCheckResultTracker mCredentialCheckResultTracker;
104 private boolean mDisappearing = false;
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700105 private TextView mHeaderTextView;
106 private TextView mDetailsTextView;
Adrian Roos8184ea52014-03-31 21:33:35 +0200107 private CountDownTimer mCountdownTimer;
108 private boolean mIsAlpha;
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -0700109 private InputMethodManager mImm;
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700110 private AppearAnimationUtils mAppearAnimationUtils;
111 private DisappearAnimationUtils mDisappearAnimationUtils;
Alex Johnston7868acf2019-12-09 12:52:14 +0000112 private boolean mIsManagedProfile;
Jim Miller00d24762009-12-22 19:04:57 -0800113
Jim Miller17e9e192010-12-07 20:41:41 -0800114 // required constructor for fragments
115 public ConfirmLockPasswordFragment() {
116
Jim Miller122b6c82010-02-10 19:53:58 -0800117 }
Jim Miller122b6c82010-02-10 19:53:58 -0800118
Jim Miller17e9e192010-12-07 20:41:41 -0800119 @Override
Jim Miller17e9e192010-12-07 20:41:41 -0800120 public View onCreateView(LayoutInflater inflater, ViewGroup container,
121 Bundle savedInstanceState) {
Adrian Roos54375882015-04-16 17:11:22 -0700122 final int storedQuality = mLockPatternUtils.getKeyguardStoredPasswordQuality(
Andres Morales7bdffd82015-08-04 16:55:00 -0700123 mEffectiveUserId);
Maurice Lamdaaf8f82017-03-10 15:31:30 -0800124
125 ConfirmLockPassword activity = (ConfirmLockPassword) getActivity();
126 View view = inflater.inflate(
Maurice Lam3e3b8a92018-03-21 18:21:04 -0700127 activity.getConfirmCredentialTheme() == ConfirmCredentialTheme.NORMAL
128 ? R.layout.confirm_lock_password_normal
Maurice Lamdaaf8f82017-03-10 15:31:30 -0800129 : R.layout.confirm_lock_password,
130 container,
131 false);
Jim Miller29c90732011-04-18 18:16:09 -0700132
Tarandeep Singh48032672017-06-12 15:32:28 -0700133 mPasswordEntry = (ImeAwareEditText) view.findViewById(R.id.password_entry);
Jim Miller17e9e192010-12-07 20:41:41 -0800134 mPasswordEntry.setOnEditorActionListener(this);
Tarandeep Singh86b8f442017-06-09 16:24:14 -0700135 // EditText inside ScrollView doesn't automatically get focus.
136 mPasswordEntry.requestFocus();
Xiyuan Xiaf2c2c192015-05-15 13:37:04 -0700137 mPasswordEntryInputDisabler = new TextViewInputDisabler(mPasswordEntry);
Jim Miller29c90732011-04-18 18:16:09 -0700138
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700139 mHeaderTextView = (TextView) view.findViewById(R.id.headerText);
Maurice Lamc41e4082017-04-27 19:04:46 -0700140 if (mHeaderTextView == null) {
pastychang79614822019-01-03 10:12:54 +0800141 mHeaderTextView = view.findViewById(R.id.suc_layout_title);
Maurice Lamc41e4082017-04-27 19:04:46 -0700142 }
pastychangfa68ec42019-04-12 16:22:17 +0800143 mDetailsTextView = (TextView) view.findViewById(R.id.sud_layout_description);
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700144 mErrorTextView = (TextView) view.findViewById(R.id.errorText);
Adrian Roos8184ea52014-03-31 21:33:35 +0200145 mIsAlpha = DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC == storedQuality
Jim Miller17e9e192010-12-07 20:41:41 -0800146 || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == storedQuality
Toni Barzice7d6e4d2016-03-30 11:43:19 -0700147 || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == storedQuality
148 || DevicePolicyManager.PASSWORD_QUALITY_MANAGED == storedQuality;
Svetoslav3ea423a2014-10-16 14:44:25 -0700149
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -0700150 mImm = (InputMethodManager) getActivity().getSystemService(
151 Context.INPUT_METHOD_SERVICE);
152
Alex Johnston7868acf2019-12-09 12:52:14 +0000153 mIsManagedProfile = UserManager.get(getActivity()).isManagedProfile(mEffectiveUserId);
154
Svetoslav3ea423a2014-10-16 14:44:25 -0700155 Intent intent = getActivity().getIntent();
156 if (intent != null) {
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700157 CharSequence headerMessage = intent.getCharSequenceExtra(
158 ConfirmDeviceCredentialBaseFragment.HEADER_TEXT);
159 CharSequence detailsMessage = intent.getCharSequenceExtra(
160 ConfirmDeviceCredentialBaseFragment.DETAILS_TEXT);
Svetoslav3ea423a2014-10-16 14:44:25 -0700161 if (TextUtils.isEmpty(headerMessage)) {
162 headerMessage = getString(getDefaultHeader());
163 }
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700164 if (TextUtils.isEmpty(detailsMessage)) {
165 detailsMessage = getString(getDefaultDetails());
166 }
167 mHeaderTextView.setText(headerMessage);
168 mDetailsTextView.setText(detailsMessage);
Svetoslav3ea423a2014-10-16 14:44:25 -0700169 }
Jim Miller2e28ace2010-12-15 10:07:16 -0800170 int currentType = mPasswordEntry.getInputType();
joshmccloskey50aea6e2019-09-06 11:32:25 -0700171 if (mIsAlpha) {
172 mPasswordEntry.setInputType(currentType);
173 mPasswordEntry.setContentDescription(
174 getContext().getString(R.string.unlock_set_unlock_password_title));
175 } else {
176 mPasswordEntry.setInputType(
177 InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);
178 mPasswordEntry.setContentDescription(
179 getContext().getString(R.string.unlock_set_unlock_pin_title));
180 }
Andrew Sappersteinccbb4cf2017-07-06 14:30:28 -0700181 // Can't set via XML since setInputType resets the fontFamily to null
182 mPasswordEntry.setTypeface(Typeface.create(
183 getContext().getString(com.android.internal.R.string.config_headlineFontFamily),
184 Typeface.NORMAL));
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700185 mAppearAnimationUtils = new AppearAnimationUtils(getContext(),
186 220, 2f /* translationScale */, 1f /* delayScale*/,
187 AnimationUtils.loadInterpolator(getContext(),
188 android.R.interpolator.linear_out_slow_in));
189 mDisappearAnimationUtils = new DisappearAnimationUtils(getContext(),
190 110, 1f /* translationScale */,
191 0.5f /* delayScale */, AnimationUtils.loadInterpolator(
192 getContext(), android.R.interpolator.fast_out_linear_in));
Julia Reynoldsce25af42015-07-08 16:56:31 -0400193 setAccessibilityTitle(mHeaderTextView.getText());
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700194
195 mCredentialCheckResultTracker = (CredentialCheckResultTracker) getFragmentManager()
196 .findFragmentByTag(FRAGMENT_TAG_CHECK_LOCK_RESULT);
197 if (mCredentialCheckResultTracker == null) {
198 mCredentialCheckResultTracker = new CredentialCheckResultTracker();
199 getFragmentManager().beginTransaction().add(mCredentialCheckResultTracker,
200 FRAGMENT_TAG_CHECK_LOCK_RESULT).commit();
201 }
202
Jim Miller17e9e192010-12-07 20:41:41 -0800203 return view;
204 }
205
Adrian Roos8184ea52014-03-31 21:33:35 +0200206 private int getDefaultHeader() {
Adrian Roos6600dde2017-07-23 14:18:16 +0200207 if (mFrp) {
208 return mIsAlpha ? R.string.lockpassword_confirm_your_password_header_frp
209 : R.string.lockpassword_confirm_your_pin_header_frp;
210 }
Alex Johnston7868acf2019-12-09 12:52:14 +0000211 if (mIsManagedProfile) {
212 return mIsAlpha ? R.string.lockpassword_confirm_your_work_password_header
213 : R.string.lockpassword_confirm_your_work_pin_header;
214 }
Adrian Roos8184ea52014-03-31 21:33:35 +0200215 return mIsAlpha ? R.string.lockpassword_confirm_your_password_header
216 : R.string.lockpassword_confirm_your_pin_header;
217 }
218
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700219 private int getDefaultDetails() {
Adrian Roos6600dde2017-07-23 14:18:16 +0200220 if (mFrp) {
221 return mIsAlpha ? R.string.lockpassword_confirm_your_password_details_frp
222 : R.string.lockpassword_confirm_your_pin_details_frp;
223 }
Adrian Roos5a9a3cd2017-03-30 18:02:25 -0700224 boolean isStrongAuthRequired = isStrongAuthRequired();
Alex Johnston28c6b572020-01-28 17:49:33 +0000225 // Map boolean flags to an index by isStrongAuth << 2 + isManagedProfile << 1 + isAlpha.
226 int index = ((isStrongAuthRequired ? 1 : 0) << 2) + ((mIsManagedProfile ? 1 : 0) << 1)
227 + (mIsAlpha ? 1 : 0);
Tony Mak7655be02016-04-21 10:27:43 +0100228 return DETAIL_TEXTS[index];
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700229 }
230
231 private int getErrorMessage() {
232 return mIsAlpha ? R.string.lockpassword_invalid_password
233 : R.string.lockpassword_invalid_pin;
234 }
235
Jim Miller17e9e192010-12-07 20:41:41 -0800236 @Override
Charles He641c9fc2017-04-26 18:45:48 +0100237 protected int getLastTryErrorMessage(int userType) {
238 switch (userType) {
239 case USER_TYPE_PRIMARY:
240 return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_device
241 : R.string.lock_last_pin_attempt_before_wipe_device;
242 case USER_TYPE_MANAGED_PROFILE:
243 return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_profile
244 : R.string.lock_last_pin_attempt_before_wipe_profile;
245 case USER_TYPE_SECONDARY:
246 return mIsAlpha ? R.string.lock_last_password_attempt_before_wipe_user
247 : R.string.lock_last_pin_attempt_before_wipe_user;
248 default:
249 throw new IllegalArgumentException("Unrecognized user type:" + userType);
250 }
Clara Bayarri9d357ea2016-01-28 17:50:53 +0000251 }
252
253 @Override
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700254 public void prepareEnterAnimation() {
255 super.prepareEnterAnimation();
256 mHeaderTextView.setAlpha(0f);
257 mDetailsTextView.setAlpha(0f);
258 mCancelButton.setAlpha(0f);
259 mPasswordEntry.setAlpha(0f);
Charles He170801b2017-07-05 15:59:49 +0100260 mErrorTextView.setAlpha(0f);
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700261 }
262
263 private View[] getActiveViews() {
264 ArrayList<View> result = new ArrayList<>();
265 result.add(mHeaderTextView);
266 result.add(mDetailsTextView);
267 if (mCancelButton.getVisibility() == View.VISIBLE) {
268 result.add(mCancelButton);
269 }
270 result.add(mPasswordEntry);
Charles He170801b2017-07-05 15:59:49 +0100271 result.add(mErrorTextView);
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700272 return result.toArray(new View[] {});
273 }
274
275 @Override
276 public void startEnterAnimation() {
277 super.startEnterAnimation();
Charles He170801b2017-07-05 15:59:49 +0100278 mAppearAnimationUtils.startAnimation(getActiveViews(), this::updatePasswordEntry);
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700279 }
280
281 @Override
Jim Miller17e9e192010-12-07 20:41:41 -0800282 public void onPause() {
283 super.onPause();
Adrian Roos8184ea52014-03-31 21:33:35 +0200284 if (mCountdownTimer != null) {
285 mCountdownTimer.cancel();
286 mCountdownTimer = null;
287 }
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700288 mCredentialCheckResultTracker.setListener(null);
Jim Miller17e9e192010-12-07 20:41:41 -0800289 }
290
291 @Override
Fan Zhang65076132016-08-08 10:25:13 -0700292 public int getMetricsCategory() {
Fan Zhang31b21002019-01-16 13:49:47 -0800293 return SettingsEnums.CONFIRM_LOCK_PASSWORD;
Chris Wren8a963ba2015-03-20 10:29:14 -0400294 }
295
296 @Override
Jim Miller17e9e192010-12-07 20:41:41 -0800297 public void onResume() {
Jim Miller17e9e192010-12-07 20:41:41 -0800298 super.onResume();
Andres Morales7bdffd82015-08-04 16:55:00 -0700299 long deadline = mLockPatternUtils.getLockoutAttemptDeadline(mEffectiveUserId);
Adrian Roos8184ea52014-03-31 21:33:35 +0200300 if (deadline != 0) {
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700301 mCredentialCheckResultTracker.clearResult();
Adrian Roos8184ea52014-03-31 21:33:35 +0200302 handleAttemptLockout(deadline);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700303 } else {
Charles He170801b2017-07-05 15:59:49 +0100304 updatePasswordEntry();
Oleksandr Peletskyia6fb4662016-04-14 19:35:04 +0200305 mErrorTextView.setText("");
Charles He641c9fc2017-04-26 18:45:48 +0100306 updateErrorMessage(
307 mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId));
Adrian Roos8184ea52014-03-31 21:33:35 +0200308 }
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700309 mCredentialCheckResultTracker.setListener(this);
Jorim Jaggi0cb467a2014-09-09 18:25:46 +0200310 }
311
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700312 @Override
Andres Morales59f59762015-04-16 16:30:31 -0700313 protected void authenticationSucceeded() {
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700314 mCredentialCheckResultTracker.setResult(true, new Intent(), 0, mEffectiveUserId);
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700315 }
316
Charles He170801b2017-07-05 15:59:49 +0100317 private void updatePasswordEntry() {
318 final boolean isLockedOut =
319 mLockPatternUtils.getLockoutAttemptDeadline(mEffectiveUserId) != 0;
320 mPasswordEntry.setEnabled(!isLockedOut);
321 mPasswordEntryInputDisabler.setInputEnabled(!isLockedOut);
Kevin Chyne5a016e2018-10-03 18:39:22 -0700322 if (isLockedOut) {
Charles He170801b2017-07-05 15:59:49 +0100323 mImm.hideSoftInputFromWindow(mPasswordEntry.getWindowToken(), 0 /*flags*/);
324 } else {
Tarandeep Singh48032672017-06-12 15:32:28 -0700325 mPasswordEntry.scheduleShowSoftInput();
Xiyuan Xia4f8102d2015-05-21 11:12:19 -0700326 }
327 }
328
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -0700329 public void onWindowFocusChanged(boolean hasFocus) {
Charles He170801b2017-07-05 15:59:49 +0100330 if (!hasFocus) {
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -0700331 return;
332 }
333 // Post to let window focus logic to finish to allow soft input show/hide properly.
Charles He170801b2017-07-05 15:59:49 +0100334 mPasswordEntry.post(this::updatePasswordEntry);
Xiyuan Xia4a8edaf2015-05-20 14:26:15 -0700335 }
336
Jim Miller17e9e192010-12-07 20:41:41 -0800337 private void handleNext() {
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700338 if (mPendingLockCheck != null || mDisappearing) {
339 return;
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700340 }
341
Rich Canningsb27c4302019-02-19 13:15:30 -0800342 // TODO(b/120484642): This is a point of entry for passwords from the UI
Rubin Xu010116a2019-09-11 17:36:37 +0100343 final Editable passwordText = mPasswordEntry.getText();
344 if (TextUtils.isEmpty(passwordText)) {
Fan Zhang774e1d82016-10-03 09:05:55 -0700345 return;
346 }
Rubin Xu010116a2019-09-11 17:36:37 +0100347 final LockscreenCredential credential =
348 mIsAlpha ? LockscreenCredential.createPassword(passwordText)
349 : LockscreenCredential.createPin(passwordText);
Fan Zhang774e1d82016-10-03 09:05:55 -0700350
351 mPasswordEntryInputDisabler.setInputEnabled(false);
Andres Morales6609b0c2015-04-12 15:38:25 -0700352 final boolean verifyChallenge = getActivity().getIntent().getBooleanExtra(
353 ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, false);
Fan Zhang774e1d82016-10-03 09:05:55 -0700354
Andres Morales6609b0c2015-04-12 15:38:25 -0700355 Intent intent = new Intent();
356 if (verifyChallenge) {
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700357 if (isInternalActivity()) {
Rubin Xu010116a2019-09-11 17:36:37 +0100358 startVerifyPassword(credential, intent);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700359 return;
Andres Morales6609b0c2015-04-12 15:38:25 -0700360 }
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700361 } else {
Rubin Xu010116a2019-09-11 17:36:37 +0100362 startCheckPassword(credential, intent);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700363 return;
Andres Morales6609b0c2015-04-12 15:38:25 -0700364 }
365
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700366 mCredentialCheckResultTracker.setResult(false, intent, 0, mEffectiveUserId);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700367 }
368
369 private boolean isInternalActivity() {
370 return getActivity() instanceof ConfirmLockPassword.InternalActivity;
371 }
372
Rubin Xu010116a2019-09-11 17:36:37 +0100373 private void startVerifyPassword(LockscreenCredential credential, final Intent intent) {
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700374 long challenge = getActivity().getIntent().getLongExtra(
375 ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, 0);
Andres Morales7bdffd82015-08-04 16:55:00 -0700376 final int localEffectiveUserId = mEffectiveUserId;
Ricky Wai996d0df2016-04-05 16:33:47 +0100377 final int localUserId = mUserId;
378 final LockPatternChecker.OnVerifyCallback onVerifyCallback =
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700379 new LockPatternChecker.OnVerifyCallback() {
380 @Override
Andres Morales91e6c492015-05-15 15:20:33 -0700381 public void onVerified(byte[] token, int timeoutMs) {
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700382 mPendingLockCheck = null;
383 boolean matched = false;
384 if (token != null) {
385 matched = true;
Victor Chang5e0a46b2016-05-13 17:06:59 +0100386 if (mReturnCredentials) {
387 intent.putExtra(
388 ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
389 token);
390 }
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700391 }
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700392 mCredentialCheckResultTracker.setResult(matched, intent, timeoutMs,
Charles He170801b2017-07-05 15:59:49 +0100393 localEffectiveUserId);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700394 }
Ricky Wai996d0df2016-04-05 16:33:47 +0100395 };
396 mPendingLockCheck = (localEffectiveUserId == localUserId)
Rubin Xu010116a2019-09-11 17:36:37 +0100397 ? LockPatternChecker.verifyCredential(
398 mLockPatternUtils, credential, challenge, localUserId, onVerifyCallback)
Ricky Wai996d0df2016-04-05 16:33:47 +0100399 : LockPatternChecker.verifyTiedProfileChallenge(
Rubin Xu010116a2019-09-11 17:36:37 +0100400 mLockPatternUtils, credential, challenge, localUserId,
Ricky Wai996d0df2016-04-05 16:33:47 +0100401 onVerifyCallback);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700402 }
403
Rubin Xu010116a2019-09-11 17:36:37 +0100404 private void startCheckPassword(final LockscreenCredential credential,
405 final Intent intent) {
Andres Morales7bdffd82015-08-04 16:55:00 -0700406 final int localEffectiveUserId = mEffectiveUserId;
Rubin Xu010116a2019-09-11 17:36:37 +0100407 mPendingLockCheck = LockPatternChecker.checkCredential(
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700408 mLockPatternUtils,
Rubin Xu010116a2019-09-11 17:36:37 +0100409 credential,
Andres Morales7bdffd82015-08-04 16:55:00 -0700410 localEffectiveUserId,
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700411 new LockPatternChecker.OnCheckCallback() {
412 @Override
Andres Morales91e6c492015-05-15 15:20:33 -0700413 public void onChecked(boolean matched, int timeoutMs) {
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700414 mPendingLockCheck = null;
Victor Chang5e0a46b2016-05-13 17:06:59 +0100415 if (matched && isInternalActivity() && mReturnCredentials) {
Rubin Xu010116a2019-09-11 17:36:37 +0100416 // TODO: get rid of EXTRA_KEY_TYPE, since EXTRA_KEY_PASSWORD already
417 // distinguishes beteween PIN and password.
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700418 intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_TYPE,
419 mIsAlpha ? StorageManager.CRYPT_TYPE_PASSWORD
420 : StorageManager.CRYPT_TYPE_PIN);
421 intent.putExtra(
Rubin Xu010116a2019-09-11 17:36:37 +0100422 ChooseLockSettingsHelper.EXTRA_KEY_PASSWORD, credential);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700423 }
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700424 mCredentialCheckResultTracker.setResult(matched, intent, timeoutMs,
425 localEffectiveUserId);
Xiyuan Xiabf9ac6b2015-05-05 16:04:00 -0700426 }
427 });
428 }
429
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700430 private void startDisappearAnimation(final Intent intent) {
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700431 if (mDisappearing) {
432 return;
433 }
434 mDisappearing = true;
435
Maurice Lamdaaf8f82017-03-10 15:31:30 -0800436 final ConfirmLockPassword activity = (ConfirmLockPassword) getActivity();
437 // Bail if there is no active activity.
438 if (activity == null || activity.isFinishing()) {
439 return;
440 }
441 if (activity.getConfirmCredentialTheme() == ConfirmCredentialTheme.DARK) {
442 mDisappearAnimationUtils.startAnimation(getActiveViews(), () -> {
443 activity.setResult(RESULT_OK, intent);
444 activity.finish();
445 activity.overridePendingTransition(
446 R.anim.confirm_credential_close_enter,
447 R.anim.confirm_credential_close_exit);
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700448 });
449 } else {
Maurice Lamdaaf8f82017-03-10 15:31:30 -0800450 activity.setResult(RESULT_OK, intent);
451 activity.finish();
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700452 }
453 }
454
Andres Morales7bdffd82015-08-04 16:55:00 -0700455 private void onPasswordChecked(boolean matched, Intent intent, int timeoutMs,
Clara Bayarri9d357ea2016-01-28 17:50:53 +0000456 int effectiveUserId, boolean newResult) {
Xiyuan Xiaf2c2c192015-05-15 13:37:04 -0700457 mPasswordEntryInputDisabler.setInputEnabled(true);
Andres Morales6609b0c2015-04-12 15:38:25 -0700458 if (matched) {
Clara Bayarri9d357ea2016-01-28 17:50:53 +0000459 if (newResult) {
Kevin Chyn127da9c2018-11-09 16:13:53 -0800460 ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils,
461 mUserManager, mEffectiveUserId);
Clara Bayarri9d357ea2016-01-28 17:50:53 +0000462 }
Jorim Jaggiff41a9a2015-06-09 15:31:28 -0700463 startDisappearAnimation(intent);
Kevin Chyn127da9c2018-11-09 16:13:53 -0800464 ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity());
Jim Miller17e9e192010-12-07 20:41:41 -0800465 } else {
Andres Morales91e6c492015-05-15 15:20:33 -0700466 if (timeoutMs > 0) {
Charles He991ccc22017-04-19 19:32:00 +0100467 refreshLockScreen();
Adrian Roos54375882015-04-16 17:11:22 -0700468 long deadline = mLockPatternUtils.setLockoutAttemptDeadline(
Andres Morales7bdffd82015-08-04 16:55:00 -0700469 effectiveUserId, timeoutMs);
Adrian Roos8184ea52014-03-31 21:33:35 +0200470 handleAttemptLockout(deadline);
471 } else {
Charles Hecaf95102017-08-18 17:35:27 +0100472 showError(getErrorMessage(), CLEAR_WRONG_ATTEMPT_TIMEOUT_MS);
Clara Bayarri9d357ea2016-01-28 17:50:53 +0000473 }
474 if (newResult) {
475 reportFailedAttempt();
Adrian Roos8184ea52014-03-31 21:33:35 +0200476 }
Jim Miller00d24762009-12-22 19:04:57 -0800477 }
Jim Miller122b6c82010-02-10 19:53:58 -0800478 }
Jim Miller17e9e192010-12-07 20:41:41 -0800479
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700480 @Override
481 public void onCredentialChecked(boolean matched, Intent intent, int timeoutMs,
Clara Bayarri9d357ea2016-01-28 17:50:53 +0000482 int effectiveUserId, boolean newResult) {
483 onPasswordChecked(matched, intent, timeoutMs, effectiveUserId, newResult);
484 }
485
486 @Override
487 protected void onShowError() {
488 mPasswordEntry.setText(null);
Xiyuan Xia00b17fa2015-08-31 11:59:46 -0700489 }
490
Adrian Roos8184ea52014-03-31 21:33:35 +0200491 private void handleAttemptLockout(long elapsedRealtimeDeadline) {
Adrian Roos8184ea52014-03-31 21:33:35 +0200492 mCountdownTimer = new CountDownTimer(
Charles He170801b2017-07-05 15:59:49 +0100493 elapsedRealtimeDeadline - SystemClock.elapsedRealtime(),
Adrian Roos8184ea52014-03-31 21:33:35 +0200494 LockPatternUtils.FAILED_ATTEMPT_COUNTDOWN_INTERVAL_MS) {
495
496 @Override
497 public void onTick(long millisUntilFinished) {
498 final int secondsCountdown = (int) (millisUntilFinished / 1000);
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700499 showError(getString(
500 R.string.lockpattern_too_many_failed_confirmation_attempts,
501 secondsCountdown), 0);
Adrian Roos8184ea52014-03-31 21:33:35 +0200502 }
503
504 @Override
505 public void onFinish() {
Charles He170801b2017-07-05 15:59:49 +0100506 updatePasswordEntry();
Jorim Jaggi8a09b612015-04-06 17:47:18 -0700507 mErrorTextView.setText("");
Charles He641c9fc2017-04-26 18:45:48 +0100508 updateErrorMessage(
509 mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId));
Adrian Roos8184ea52014-03-31 21:33:35 +0200510 }
511 }.start();
Charles He170801b2017-07-05 15:59:49 +0100512 updatePasswordEntry();
Adrian Roos8184ea52014-03-31 21:33:35 +0200513 }
514
Jim Miller17e9e192010-12-07 20:41:41 -0800515 public void onClick(View v) {
Colin Cross807e8612019-05-02 19:56:42 -0700516 if (v.getId() == R.id.next_button) {
517 handleNext();
518 } else if (v.getId() == R.id.cancel_button) {
519 getActivity().setResult(RESULT_CANCELED);
520 getActivity().finish();
Jim Miller17e9e192010-12-07 20:41:41 -0800521 }
522 }
523
Jim Miller29c90732011-04-18 18:16:09 -0700524 // {@link OnEditorActionListener} methods.
Jim Miller17e9e192010-12-07 20:41:41 -0800525 public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
Jim Miller74b1e0a2011-04-15 18:52:31 -0700526 // Check if this was the result of hitting the enter or "done" key
527 if (actionId == EditorInfo.IME_NULL
528 || actionId == EditorInfo.IME_ACTION_DONE
529 || actionId == EditorInfo.IME_ACTION_NEXT) {
Jim Miller17e9e192010-12-07 20:41:41 -0800530 handleNext();
531 return true;
532 }
533 return false;
534 }
Jim Miller122b6c82010-02-10 19:53:58 -0800535 }
Jim Miller00d24762009-12-22 19:04:57 -0800536}