15a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller/* 25a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * Copyright (C) 2014 The Android Open Source Project 35a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * 45a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 55a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * you may not use this file except in compliance with the License. 65a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * You may obtain a copy of the License at 75a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * 85a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * http://www.apache.org/licenses/LICENSE-2.0 95a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * 105a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * Unless required by applicable law or agreed to in writing, software 115a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 125a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * See the License for the specific language governing permissions and 145a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller * limitations under the License. 155a8daad469c22b9b48fdf3ac478991e4ddefdf1eJim Miller */ 165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard; 17838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 1818c990104c8cc75aa080fa7dd96313252bf333a9Jason Monkimport android.R.style; 197751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.app.Activity; 207751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.app.AlertDialog; 213a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasaniimport android.app.admin.DevicePolicyManager; 22838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Millerimport android.content.Context; 233a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasaniimport android.os.UserHandle; 24838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Millerimport android.util.AttributeSet; 257751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.util.Log; 267751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.util.Slog; 2718c990104c8cc75aa080fa7dd96313252bf333a9Jason Monkimport android.view.ContextThemeWrapper; 287751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.view.LayoutInflater; 29052999f3c94df2659e6e3e7730a2810980f718f7Chris Wrenimport android.view.View; 307751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.view.WindowManager; 31838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Millerimport android.widget.FrameLayout; 32838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 337751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport com.android.internal.widget.LockPatternUtils; 347751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport com.android.keyguard.KeyguardSecurityModel.SecurityMode; 357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 367751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerpublic class KeyguardSecurityContainer extends FrameLayout implements KeyguardSecurityView { 375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static final boolean DEBUG = KeyguardConstants.DEBUG; 387751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private static final String TAG = "KeyguardSecurityView"; 393a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani 403a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private static final int USER_TYPE_PRIMARY = 1; 413a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private static final int USER_TYPE_WORK_PROFILE = 2; 423a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private static final int USER_TYPE_SECONDARY_USER = 3; 433a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani 447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityModel mSecurityModel; 457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private LockPatternUtils mLockPatternUtils; 467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityViewFlipper mSecurityViewFlipper; 487751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private boolean mIsVerifyUnlockOnly; 497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; 507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private SecurityCallback mSecurityCallback; 517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 52336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos private final KeyguardUpdateMonitor mUpdateMonitor; 53336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos 547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Used to notify the container when something interesting happens. 557751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public interface SecurityCallback { 568702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev public boolean dismiss(boolean authenticated, int targetUserId); 57b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity(); 58ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput); 5925b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi 6025b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi /** 6125b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi * @param strongAuth wheher the user has authenticated with strong authentication like 6225b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi * pattern, password or PIN but not by trust agents or fingerprint 638702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev * @param targetUserId a user that needs to be the foreground user at the finish completion. 6425b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi */ 658702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev public void finish(boolean strongAuth, int targetUserId); 6672b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void reset(); 677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 69838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller public KeyguardSecurityContainer(Context context, AttributeSet attrs) { 70838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller this(context, attrs, 0); 71838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller } 72838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 73838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller public KeyguardSecurityContainer(Context context) { 74fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera this(context, null, 0); 75838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller } 76838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 77838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller public KeyguardSecurityContainer(Context context, AttributeSet attrs, int defStyle) { 7818c990104c8cc75aa080fa7dd96313252bf333a9Jason Monk super(new ContextThemeWrapper(context, android.R.style.Theme_DeviceDefault), attrs, 7918c990104c8cc75aa080fa7dd96313252bf333a9Jason Monk defStyle); 807751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityModel = new KeyguardSecurityModel(context); 817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mLockPatternUtils = new LockPatternUtils(context); 82336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); 837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void setSecurityCallback(SecurityCallback callback) { 867751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityCallback = callback; 877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 897751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 907751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void onResume(int reason) { 91f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 92f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi getSecurityView(mCurrentSecuritySelection).onResume(reason); 93f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void onPause() { 98f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 99f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi getSecurityView(mCurrentSecuritySelection).onPause(); 100f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 1017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 103c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 104f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 105f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi getSecurityView(mCurrentSecuritySelection).startAppearAnimation(); 106f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 107c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 108c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi 10976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean startDisappearAnimation(Runnable onFinishRunnable) { 11076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 11176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation( 11276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi onFinishRunnable); 11376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 11476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 11576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 11676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 1177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void announceCurrentSecurityMethod() { 1187751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller View v = (View) getSecurityView(mCurrentSecuritySelection); 1197751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (v != null) { 1207751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller v.announceForAccessibility(v.getContentDescription()); 1217751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1227751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1237751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 124c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi public CharSequence getCurrentSecurityModeContentDescription() { 125c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi View v = (View) getSecurityView(mCurrentSecuritySelection); 126c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi if (v != null) { 127c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi return v.getContentDescription(); 128c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi } 129c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi return ""; 130c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi } 131c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi 1327751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { 1337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 1347751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView view = null; 1357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int children = mSecurityViewFlipper.getChildCount(); 1367751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller for (int child = 0; child < children; child++) { 1377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (mSecurityViewFlipper.getChildAt(child).getId() == securityViewIdForMode) { 1387751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller view = ((KeyguardSecurityView)mSecurityViewFlipper.getChildAt(child)); 1397751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 1407751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1417751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1427751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller int layoutId = getLayoutIdFor(securityMode); 1437751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (view == null && layoutId != 0) { 1447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 1457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); 1467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller View v = inflater.inflate(layoutId, mSecurityViewFlipper, false); 1477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.addView(v); 1486b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi updateSecurityView(v); 1497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller view = (KeyguardSecurityView)v; 1507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1527751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return view; 1537751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1556b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi private void updateSecurityView(View view) { 1567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (view instanceof KeyguardSecurityView) { 1577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView ksv = (KeyguardSecurityView) view; 1587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller ksv.setKeyguardCallback(mCallback); 1597751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller ksv.setLockPatternUtils(mLockPatternUtils); 1607751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 1617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); 1627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller protected void onFinishInflate() { 16651efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette mSecurityViewFlipper = findViewById(R.id.view_flipper); 1677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setLockPatternUtils(mLockPatternUtils); 1687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void setLockPatternUtils(LockPatternUtils utils) { 1717751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mLockPatternUtils = utils; 1727751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityModel.setLockPatternUtils(utils); 1737751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setLockPatternUtils(mLockPatternUtils); 1747751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1757751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private void showDialog(String title, String message) { 1777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final AlertDialog dialog = new AlertDialog.Builder(mContext) 1787751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .setTitle(title) 1797751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .setMessage(message) 180b08a14661701621e242acb01a9f858d7c6e34579Edward Savage-Jones .setCancelable(false) 1817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .setNeutralButton(R.string.ok, null) 1827751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .create(); 1837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (!(mContext instanceof Activity)) { 1847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 1857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1867751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller dialog.show(); 1877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1898702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev private void showTimeoutDialog(int userId, int timeoutMs) { 1902397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales int timeoutInSeconds = (int) timeoutMs / 1000; 1917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller int messageId = 0; 1927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1938702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev switch (mSecurityModel.getSecurityMode(userId)) { 1947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: 1957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message; 1967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 1977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: 1987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message; 1997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 2007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: 2017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller messageId = R.string.kg_too_many_failed_password_attempts_dialog_message; 2027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 2037751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // These don't have timeout dialogs. 2047751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Invalid: 2057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case None: 2067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: 2077751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: 2087751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 2097751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2107751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2117751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (messageId != 0) { 2127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final String message = mContext.getString(messageId, 2138702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts(userId), 2147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller timeoutInSeconds); 2157751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showDialog(null, message); 2167751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2187751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2193a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private void showAlmostAtWipeDialog(int attempts, int remaining, int userType) { 2203a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani String message = null; 2213a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani switch (userType) { 2223a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_PRIMARY: 2233a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe, 2243a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts, remaining); 2253a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2263a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_SECONDARY_USER: 2273a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_almost_at_erase_user, 2283a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts, remaining); 2293a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2303a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_WORK_PROFILE: 2313a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_almost_at_erase_profile, 2323a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts, remaining); 2333a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2343a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } 2357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showDialog(null, message); 2367751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2383a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private void showWipeDialog(int attempts, int userType) { 2393a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani String message = null; 2403a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani switch (userType) { 2413a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_PRIMARY: 2423a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_now_wiping, 2433a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts); 2443a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2453a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_SECONDARY_USER: 2463a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_now_erasing_user, 2473a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts); 2483a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2493a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_WORK_PROFILE: 2503a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_now_erasing_profile, 2513a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts); 2523a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2533a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } 2547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showDialog(null, message); 2557751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 257ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia private void reportFailedUnlockAttempt(int userId, int timeoutMs) { 2587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 259ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia final int failedAttempts = monitor.getFailedUnlockAttempts(userId) + 1; // +1 for this time 2607751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); 2627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2633a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani final DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager(); 2643a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani final int failedAttemptsBeforeWipe = 265ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia dpm.getMaximumFailedPasswordsForWipe(null, userId); 2667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? 2687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller (failedAttemptsBeforeWipe - failedAttempts) 2697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller : Integer.MAX_VALUE; // because DPM returns 0 if no restriction 2707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { 271fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera // The user has installed a DevicePolicyManager that requests a user/profile to be wiped 272fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera // N attempts. Once we get below the grace period, we post this dialog every time as a 273fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera // clear warning until the deletion fires. 2743a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani // Check which profile has the strictest policy for failed password attempts 275ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia final int expiringUser = dpm.getProfileWithMinimumFailedPasswordsForWipe(userId); 2763a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani int userType = USER_TYPE_PRIMARY; 277ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia if (expiringUser == userId) { 278cc791bc47c004967557c44abe1764f1f2f7aef8bXiaohui Chen // TODO: http://b/23522538 279cc791bc47c004967557c44abe1764f1f2f7aef8bXiaohui Chen if (expiringUser != UserHandle.USER_SYSTEM) { 2803a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani userType = USER_TYPE_SECONDARY_USER; 2813a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } 2823a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } else if (expiringUser != UserHandle.USER_NULL) { 2833a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani userType = USER_TYPE_WORK_PROFILE; 2843a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } // If USER_NULL, which shouldn't happen, leave it as USER_TYPE_PRIMARY 2857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (remainingBeforeWipe > 0) { 2863a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe, userType); 2877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 2887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Too many attempts. The device will be wiped shortly. 2893a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani Slog.i(TAG, "Too many unlock attempts; user " + expiringUser + " will be wiped!"); 2903a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani showWipeDialog(failedAttempts, userType); 2917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 293ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia monitor.reportFailedStrongAuthUnlockAttempt(userId); 294ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mLockPatternUtils.reportFailedPasswordAttempt(userId); 2952397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (timeoutMs > 0) { 296327323d2b337077433fe02438a79cc98e91799e3Zachary Iqbal mLockPatternUtils.reportPasswordLockout(timeoutMs, userId); 2978702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev showTimeoutDialog(userId, timeoutMs); 2987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller /** 3027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * Shows the primary security screen for the user. This will be either the multi-selector 3037751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * or the user's security method. 3047751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * @param turningOff true if the device is being turned off 3057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller */ 3067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller void showPrimarySecurityScreen(boolean turningOff) { 3078702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev SecurityMode securityMode = mSecurityModel.getSecurityMode( 3088702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev KeyguardUpdateMonitor.getCurrentUser()); 3097751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); 3107751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(securityMode); 3117751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3137751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller /** 314ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller * Shows the next security screen if there is one. 315ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller * @param authenticated true if the user entered the correct authentication 3168702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev * @param targetUserId a user that needs to be the foreground user at the finish (if called) 3178702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev * completion. 318ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller * @return true if keyguard is done 319ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller */ 3208702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev boolean showNextSecurityScreenOrFinish(boolean authenticated, int targetUserId) { 3217751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); 3227751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller boolean finish = false; 32325b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi boolean strongAuth = false; 3248702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev if (mUpdateMonitor.getUserCanSkipBouncer(targetUserId)) { 325336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos finish = true; 326336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos } else if (SecurityMode.None == mCurrentSecuritySelection) { 3278702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId); 3287751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (SecurityMode.None == securityMode) { 3297751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller finish = true; // no security required 3307751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 3317751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(securityMode); // switch to the alternate security view 3327751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else if (authenticated) { 3347751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (mCurrentSecuritySelection) { 3357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: 3367751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: 3377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: 33825b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi strongAuth = true; 3397751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller finish = true; 3407751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3417751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3427751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: 3437751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: 3447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home 3458702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev SecurityMode securityMode = mSecurityModel.getSecurityMode(targetUserId); 346245273ec8dd33f10f2682f140057ea0e5b270ef8Selim Cinek if (securityMode != SecurityMode.None 347245273ec8dd33f10f2682f140057ea0e5b270ef8Selim Cinek || !mLockPatternUtils.isLockScreenDisabled( 348245273ec8dd33f10f2682f140057ea0e5b270ef8Selim Cinek KeyguardUpdateMonitor.getCurrentUser())) { 3497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(securityMode); 3507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 3517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller finish = true; 3527751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3537751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3557751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller default: 3567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); 3577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showPrimarySecurityScreen(false); 3587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3597751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3607751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (finish) { 3628702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev mSecurityCallback.finish(strongAuth, targetUserId); 3637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return finish; 3657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller /** 3687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * Switches to the given security view unless it's already being shown, in which case 3697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * this is a no-op. 3707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * 3717751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * @param securityMode 3727751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller */ 3737751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private void showSecurityScreen(SecurityMode securityMode) { 3747751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")"); 3757751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (securityMode == mCurrentSecuritySelection) return; 3777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3787751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); 3797751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView newView = getSecurityView(securityMode); 3807751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Emulate Activity life cycle 3827751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (oldView != null) { 3837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller oldView.onPause(); 3847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view 3857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 386f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (securityMode != SecurityMode.None) { 387f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi newView.onResume(KeyguardSecurityView.VIEW_REVEALED); 388f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi newView.setKeyguardCallback(mCallback); 389f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 3907751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Find and show this child. 3927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int childCount = mSecurityViewFlipper.getChildCount(); 3937751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 3957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller for (int i = 0; i < childCount; i++) { 3967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (mSecurityViewFlipper.getChildAt(i).getId() == securityViewIdForMode) { 3977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setDisplayedChild(i); 3987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mCurrentSecuritySelection = securityMode; 403f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi mSecurityCallback.onSecurityModeChanged(securityMode, 404f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi securityMode != SecurityMode.None && newView.needsInput()); 4057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4077751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityViewFlipper getFlipper() { 408052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren for (int i = 0; i < getChildCount(); i++) { 409052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren View child = getChildAt(i); 410052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren if (child instanceof KeyguardSecurityViewFlipper) { 411c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren return (KeyguardSecurityViewFlipper) child; 412052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren } 413052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren } 414052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren return null; 415052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren } 416052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren 4177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() { 418b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity() { 4197751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (mSecurityCallback != null) { 420b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mSecurityCallback.userActivity(); 4217751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4227751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4237751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4248702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev public void dismiss(boolean authenticated, int targetId) { 4258702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev mSecurityCallback.dismiss(authenticated, targetId); 4267751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4277751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4287751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public boolean isVerifyUnlockOnly() { 4297751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mIsVerifyUnlockOnly; 4307751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4317751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 432ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) { 4337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 4347751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (success) { 4357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller monitor.clearFailedUnlockAttempts(); 436ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mLockPatternUtils.reportSuccessfulPasswordAttempt(userId); 4377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 438ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia KeyguardSecurityContainer.this.reportFailedUnlockAttempt(userId, timeoutMs); 4397751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4407751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4417751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 44272b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void reset() { 44372b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee mSecurityCallback.reset(); 44472b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee } 4457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller }; 4467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // The following is used to ignore callbacks from SecurityViews that are no longer current 4487751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // (e.g. face unlock). This avoids unwanted asynchronous events from messing with the 4497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // state for the current security method. 4507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 4517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 452b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity() { } 4537751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 454ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) { } 4557751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 4567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public boolean isVerifyUnlockOnly() { return false; } 4577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 4588702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev public void dismiss(boolean securityVerified, int targetUserId) { } 45972b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee @Override 46072b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void reset() {} 4617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller }; 4627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private int getSecurityViewIdForMode(SecurityMode securityMode) { 4647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (securityMode) { 4657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: return R.id.keyguard_pattern_view; 4667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: return R.id.keyguard_pin_view; 4677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: return R.id.keyguard_password_view; 4687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: return R.id.keyguard_sim_pin_view; 4697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: return R.id.keyguard_sim_puk_view; 4707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4717751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return 0; 4727751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4737751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 474eff74b48a8e137039473cf251bd5be3f34600522Evan Rosky protected int getLayoutIdFor(SecurityMode securityMode) { 4757751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (securityMode) { 4767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: return R.layout.keyguard_pattern_view; 4777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: return R.layout.keyguard_pin_view; 4787751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: return R.layout.keyguard_password_view; 4797751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: return R.layout.keyguard_sim_pin_view; 4807751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: return R.layout.keyguard_sim_puk_view; 4817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller default: 4827751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return 0; 4837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4867751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public SecurityMode getSecurityMode() { 4878702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev return mSecurityModel.getSecurityMode(KeyguardUpdateMonitor.getCurrentUser()); 4887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4897751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 49095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi public SecurityMode getCurrentSecurityMode() { 49195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi return mCurrentSecuritySelection; 49295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi } 49395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi 4947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void verifyUnlock() { 4957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mIsVerifyUnlockOnly = true; 4967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(getSecurityMode()); 4977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public SecurityMode getCurrentSecuritySelection() { 5007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mCurrentSecuritySelection; 5017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5038702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev public void dismiss(boolean authenticated, int targetUserId) { 5048702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev mCallback.dismiss(authenticated, targetUserId); 5057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5077751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public boolean needsInput() { 5087751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mSecurityViewFlipper.needsInput(); 5097751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5107751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5117751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void setKeyguardCallback(KeyguardSecurityCallback callback) { 5137751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setKeyguardCallback(callback); 5147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5157751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5167751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void reset() { 5187751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.reset(); 5197751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5207751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5217751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5227751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public KeyguardSecurityCallback getCallback() { 5237751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mSecurityViewFlipper.getCallback(); 5247751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5257751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5267751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5273122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek public void showPromptReason(int reason) { 5283122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek if (mCurrentSecuritySelection != SecurityMode.None) { 529569edb85125e6754de8f8e60f993afad42eed490Adrian Roos if (reason != PROMPT_REASON_NONE) { 530569edb85125e6754de8f8e60f993afad42eed490Adrian Roos Log.i(TAG, "Strong auth required, reason: " + reason); 531569edb85125e6754de8f8e60f993afad42eed490Adrian Roos } 5323122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek getSecurityView(mCurrentSecuritySelection).showPromptReason(reason); 5333122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 5343122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 5353122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek 536cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek 537cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek public void showMessage(String message, int color) { 538cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek if (mCurrentSecuritySelection != SecurityMode.None) { 539cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek getSecurityView(mCurrentSecuritySelection).showMessage(message, color); 540cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek } 541cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek } 542cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek 5433122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek @Override 5447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void showUsabilityHint() { 5457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.showUsabilityHint(); 5467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 548838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller} 549c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 550