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 187751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.app.Activity; 197751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.app.AlertDialog; 203a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasaniimport android.app.admin.DevicePolicyManager; 21838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Millerimport android.content.Context; 223a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasaniimport android.os.UserHandle; 23838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Millerimport android.util.AttributeSet; 247751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.util.Log; 257751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.util.Slog; 267751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.view.LayoutInflater; 27052999f3c94df2659e6e3e7730a2810980f718f7Chris Wrenimport android.view.View; 287751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport android.view.WindowManager; 29838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Millerimport android.widget.FrameLayout; 30838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 317751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport com.android.internal.widget.LockPatternUtils; 327751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerimport com.android.keyguard.KeyguardSecurityModel.SecurityMode; 337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 347751ff6cd079e59e3c1f2404198774cd371ea69fJim Millerpublic class KeyguardSecurityContainer extends FrameLayout implements KeyguardSecurityView { 355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static final boolean DEBUG = KeyguardConstants.DEBUG; 367751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private static final String TAG = "KeyguardSecurityView"; 373a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani 383a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private static final int USER_TYPE_PRIMARY = 1; 393a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private static final int USER_TYPE_WORK_PROFILE = 2; 403a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private static final int USER_TYPE_SECONDARY_USER = 3; 413a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani 427751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityModel mSecurityModel; 437751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private LockPatternUtils mLockPatternUtils; 447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityViewFlipper mSecurityViewFlipper; 467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private boolean mIsVerifyUnlockOnly; 477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; 487751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private SecurityCallback mSecurityCallback; 497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 50336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos private final KeyguardUpdateMonitor mUpdateMonitor; 51336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos 527751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Used to notify the container when something interesting happens. 537751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public interface SecurityCallback { 54ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller public boolean dismiss(boolean authenticated); 55b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity(); 56ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller public void onSecurityModeChanged(SecurityMode securityMode, boolean needsInput); 5725b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi 5825b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi /** 5925b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi * @param strongAuth wheher the user has authenticated with strong authentication like 6025b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi * pattern, password or PIN but not by trust agents or fingerprint 6125b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi */ 6225b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi public void finish(boolean strongAuth); 6372b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void reset(); 647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 66838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller public KeyguardSecurityContainer(Context context, AttributeSet attrs) { 67838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller this(context, attrs, 0); 68838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller } 69838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 70838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller public KeyguardSecurityContainer(Context context) { 71fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera this(context, null, 0); 72838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller } 73838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller 74838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller public KeyguardSecurityContainer(Context context, AttributeSet attrs, int defStyle) { 75838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller super(context, attrs, defStyle); 767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityModel = new KeyguardSecurityModel(context); 777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mLockPatternUtils = new LockPatternUtils(context); 78336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos mUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); 797751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 807751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void setSecurityCallback(SecurityCallback callback) { 827751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityCallback = callback; 837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 867751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void onResume(int reason) { 87f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 88f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi getSecurityView(mCurrentSecuritySelection).onResume(reason); 89f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 907751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 937751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void onPause() { 94f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 95f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi getSecurityView(mCurrentSecuritySelection).onPause(); 96f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 99c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 100f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 101f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi getSecurityView(mCurrentSecuritySelection).startAppearAnimation(); 102f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 103c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 104c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi 10576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean startDisappearAnimation(Runnable onFinishRunnable) { 10676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi if (mCurrentSecuritySelection != SecurityMode.None) { 10776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation( 10876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi onFinishRunnable); 10976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 11076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 11176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 11276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 1137751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void announceCurrentSecurityMethod() { 1147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller View v = (View) getSecurityView(mCurrentSecuritySelection); 1157751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (v != null) { 1167751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller v.announceForAccessibility(v.getContentDescription()); 1177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1187751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1197751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 120c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi public CharSequence getCurrentSecurityModeContentDescription() { 121c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi View v = (View) getSecurityView(mCurrentSecuritySelection); 122c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi if (v != null) { 123c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi return v.getContentDescription(); 124c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi } 125c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi return ""; 126c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi } 127c1dff8cee8cf334906c1572cc3c50fbff96d1839Jorim Jaggi 1287751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { 1297751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 1307751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView view = null; 1317751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int children = mSecurityViewFlipper.getChildCount(); 1327751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller for (int child = 0; child < children; child++) { 1337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (mSecurityViewFlipper.getChildAt(child).getId() == securityViewIdForMode) { 1347751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller view = ((KeyguardSecurityView)mSecurityViewFlipper.getChildAt(child)); 1357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 1367751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1387751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller int layoutId = getLayoutIdFor(securityMode); 1397751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (view == null && layoutId != 0) { 1407751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final LayoutInflater inflater = LayoutInflater.from(mContext); 1417751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.v(TAG, "inflating id = " + layoutId); 1427751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller View v = inflater.inflate(layoutId, mSecurityViewFlipper, false); 1437751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.addView(v); 1446b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi updateSecurityView(v); 1457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller view = (KeyguardSecurityView)v; 1467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1487751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return view; 1497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1516b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi private void updateSecurityView(View view) { 1527751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (view instanceof KeyguardSecurityView) { 1537751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView ksv = (KeyguardSecurityView) view; 1547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller ksv.setKeyguardCallback(mCallback); 1557751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller ksv.setLockPatternUtils(mLockPatternUtils); 1567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 1577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller Log.w(TAG, "View " + view + " is not a KeyguardSecurityView"); 1587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1597751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1607751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller protected void onFinishInflate() { 1627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper = (KeyguardSecurityViewFlipper) findViewById(R.id.view_flipper); 1637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setLockPatternUtils(mLockPatternUtils); 1647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void setLockPatternUtils(LockPatternUtils utils) { 1677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mLockPatternUtils = utils; 1687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityModel.setLockPatternUtils(utils); 1697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setLockPatternUtils(mLockPatternUtils); 1707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1717751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1727751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private void showDialog(String title, String message) { 1737751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final AlertDialog dialog = new AlertDialog.Builder(mContext) 1747751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .setTitle(title) 1757751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .setMessage(message) 1767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .setNeutralButton(R.string.ok, null) 1777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller .create(); 1787751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (!(mContext instanceof Activity)) { 1797751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); 1807751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller dialog.show(); 1827751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 1837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1842397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales private void showTimeoutDialog(int timeoutMs) { 1852397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales int timeoutInSeconds = (int) timeoutMs / 1000; 1867751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller int messageId = 0; 1877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 1887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (mSecurityModel.getSecurityMode()) { 1897751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: 1907751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller messageId = R.string.kg_too_many_failed_pattern_attempts_dialog_message; 1917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 1927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: 1937751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller messageId = R.string.kg_too_many_failed_pin_attempts_dialog_message; 1947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 1957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: 1967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller messageId = R.string.kg_too_many_failed_password_attempts_dialog_message; 1977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 1987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // These don't have timeout dialogs. 1997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Invalid: 2007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case None: 2017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: 2027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: 2037751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 2047751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (messageId != 0) { 2077751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final String message = mContext.getString(messageId, 208ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts( 209ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia KeyguardUpdateMonitor.getCurrentUser()), 2107751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller timeoutInSeconds); 2117751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showDialog(null, message); 2127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2137751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2153a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private void showAlmostAtWipeDialog(int attempts, int remaining, int userType) { 2163a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani String message = null; 2173a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani switch (userType) { 2183a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_PRIMARY: 2193a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_almost_at_wipe, 2203a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts, remaining); 2213a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2223a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_SECONDARY_USER: 2233a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_almost_at_erase_user, 2243a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts, remaining); 2253a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2263a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_WORK_PROFILE: 2273a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_almost_at_erase_profile, 2283a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts, remaining); 2293a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2303a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } 2317751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showDialog(null, message); 2327751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2343a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani private void showWipeDialog(int attempts, int userType) { 2353a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani String message = null; 2363a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani switch (userType) { 2373a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_PRIMARY: 2383a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_now_wiping, 2393a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts); 2403a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2413a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_SECONDARY_USER: 2423a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_now_erasing_user, 2433a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts); 2443a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2453a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani case USER_TYPE_WORK_PROFILE: 2463a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani message = mContext.getString(R.string.kg_failed_attempts_now_erasing_profile, 2473a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani attempts); 2483a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani break; 2493a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } 2507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showDialog(null, message); 2517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2527751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 253ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia private void reportFailedUnlockAttempt(int userId, int timeoutMs) { 2547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 255ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia final int failedAttempts = monitor.getFailedUnlockAttempts(userId) + 1; // +1 for this time 2567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); 2587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2593a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani final DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager(); 2603a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani final int failedAttemptsBeforeWipe = 261ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia dpm.getMaximumFailedPasswordsForWipe(null, userId); 2627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? 2647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller (failedAttemptsBeforeWipe - failedAttempts) 2657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller : Integer.MAX_VALUE; // because DPM returns 0 if no restriction 2667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { 267fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera // The user has installed a DevicePolicyManager that requests a user/profile to be wiped 268fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera // N attempts. Once we get below the grace period, we post this dialog every time as a 269fe0f24cc92b04e03cac3f807859721f1ce7ef54aEsteban Talavera // clear warning until the deletion fires. 2703a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani // Check which profile has the strictest policy for failed password attempts 271ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia final int expiringUser = dpm.getProfileWithMinimumFailedPasswordsForWipe(userId); 2723a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani int userType = USER_TYPE_PRIMARY; 273ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia if (expiringUser == userId) { 274cc791bc47c004967557c44abe1764f1f2f7aef8bXiaohui Chen // TODO: http://b/23522538 275cc791bc47c004967557c44abe1764f1f2f7aef8bXiaohui Chen if (expiringUser != UserHandle.USER_SYSTEM) { 2763a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani userType = USER_TYPE_SECONDARY_USER; 2773a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } 2783a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } else if (expiringUser != UserHandle.USER_NULL) { 2793a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani userType = USER_TYPE_WORK_PROFILE; 2803a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani } // If USER_NULL, which shouldn't happen, leave it as USER_TYPE_PRIMARY 2817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (remainingBeforeWipe > 0) { 2823a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani showAlmostAtWipeDialog(failedAttempts, remainingBeforeWipe, userType); 2837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 2847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Too many attempts. The device will be wiped shortly. 2853a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani Slog.i(TAG, "Too many unlock attempts; user " + expiringUser + " will be wiped!"); 2863a3d212a51974ccec6100c1e117225291edc83ccAmith Yamasani showWipeDialog(failedAttempts, userType); 2877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 289ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia monitor.reportFailedStrongAuthUnlockAttempt(userId); 290ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mLockPatternUtils.reportFailedPasswordAttempt(userId); 2912397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (timeoutMs > 0) { 2922397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales showTimeoutDialog(timeoutMs); 2937751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 2957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 2967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller /** 2977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * Shows the primary security screen for the user. This will be either the multi-selector 2987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * or the user's security method. 2997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * @param turningOff true if the device is being turned off 3007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller */ 3017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller void showPrimarySecurityScreen(boolean turningOff) { 3027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 3037751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.v(TAG, "showPrimarySecurityScreen(turningOff=" + turningOff + ")"); 3047751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(securityMode); 3057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3077751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller /** 308ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller * Shows the next security screen if there is one. 309ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller * @param authenticated true if the user entered the correct authentication 310ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller * @return true if keyguard is done 311ba7d94b8f3c41fd5b933b185e7463a56589e04d2Jim Miller */ 3127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller boolean showNextSecurityScreenOrFinish(boolean authenticated) { 3137751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.d(TAG, "showNextSecurityScreenOrFinish(" + authenticated + ")"); 3147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller boolean finish = false; 31525b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi boolean strongAuth = false; 316e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek if (mUpdateMonitor.getUserCanSkipBouncer( 317e8bae6288bf0f241f0cea70f2c5e8294f930d4d8Selim Cinek KeyguardUpdateMonitor.getCurrentUser())) { 318336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos finish = true; 319336be7f7a499eec1acd90ab04d3e47d2789c8168Adrian Roos } else if (SecurityMode.None == mCurrentSecuritySelection) { 3207751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 3217751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (SecurityMode.None == securityMode) { 3227751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller finish = true; // no security required 3237751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 3247751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(securityMode); // switch to the alternate security view 3257751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3267751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else if (authenticated) { 3277751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (mCurrentSecuritySelection) { 3287751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: 3297751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: 3307751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: 33125b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi strongAuth = true; 3327751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller finish = true; 3337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3347751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3357751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: 3367751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: 3377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Shortcut for SIM PIN/PUK to go to directly to user's security screen or home 3387751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller SecurityMode securityMode = mSecurityModel.getSecurityMode(); 339245273ec8dd33f10f2682f140057ea0e5b270ef8Selim Cinek if (securityMode != SecurityMode.None 340245273ec8dd33f10f2682f140057ea0e5b270ef8Selim Cinek || !mLockPatternUtils.isLockScreenDisabled( 341245273ec8dd33f10f2682f140057ea0e5b270ef8Selim Cinek KeyguardUpdateMonitor.getCurrentUser())) { 3427751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(securityMode); 3437751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 3447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller finish = true; 3457751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3477751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3487751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller default: 3497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller Log.v(TAG, "Bad security screen " + mCurrentSecuritySelection + ", fail safe"); 3507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showPrimarySecurityScreen(false); 3517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3527751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3537751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (finish) { 35525b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi mSecurityCallback.finish(strongAuth); 3567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return finish; 3587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3597751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3607751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller /** 3617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * Switches to the given security view unless it's already being shown, in which case 3627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * this is a no-op. 3637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * 3647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller * @param securityMode 3657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller */ 3667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private void showSecurityScreen(SecurityMode securityMode) { 3677751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (DEBUG) Log.d(TAG, "showSecurityScreen(" + securityMode + ")"); 3687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (securityMode == mCurrentSecuritySelection) return; 3707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3717751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView oldView = getSecurityView(mCurrentSecuritySelection); 3727751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardSecurityView newView = getSecurityView(securityMode); 3737751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3747751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Emulate Activity life cycle 3757751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (oldView != null) { 3767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller oldView.onPause(); 3777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view 3787751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 379f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi if (securityMode != SecurityMode.None) { 380f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi newView.onResume(KeyguardSecurityView.VIEW_REVEALED); 381f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi newView.setKeyguardCallback(mCallback); 382f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi } 3837751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3847751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // Find and show this child. 3857751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int childCount = mSecurityViewFlipper.getChildCount(); 3867751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); 3887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller for (int i = 0; i < childCount; i++) { 3897751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (mSecurityViewFlipper.getChildAt(i).getId() == securityViewIdForMode) { 3907751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setDisplayedChild(i); 3917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller break; 3927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3937751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 3957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mCurrentSecuritySelection = securityMode; 396f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi mSecurityCallback.onSecurityModeChanged(securityMode, 397f479792e05485a536c3fa68db9d8a71f34591b78Jorim Jaggi securityMode != SecurityMode.None && newView.needsInput()); 3987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 3997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityViewFlipper getFlipper() { 401052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren for (int i = 0; i < getChildCount(); i++) { 402052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren View child = getChildAt(i); 403052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren if (child instanceof KeyguardSecurityViewFlipper) { 404c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren return (KeyguardSecurityViewFlipper) child; 405052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren } 406052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren } 407052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren return null; 408052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren } 409052999f3c94df2659e6e3e7730a2810980f718f7Chris Wren 4107751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityCallback mCallback = new KeyguardSecurityCallback() { 411b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity() { 4127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (mSecurityCallback != null) { 413b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mSecurityCallback.userActivity(); 4147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4157751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4167751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void dismiss(boolean authenticated) { 4187751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityCallback.dismiss(authenticated); 4197751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4207751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4217751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public boolean isVerifyUnlockOnly() { 4227751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mIsVerifyUnlockOnly; 4237751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4247751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 425ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) { 4267751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); 4277751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller if (success) { 4287751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller monitor.clearFailedUnlockAttempts(); 429ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mLockPatternUtils.reportSuccessfulPasswordAttempt(userId); 4307751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } else { 431ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia KeyguardSecurityContainer.this.reportFailedUnlockAttempt(userId, timeoutMs); 4327751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4337751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4347751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 43572b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void reset() { 43672b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee mSecurityCallback.reset(); 43772b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee } 4387751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller }; 4397751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4407751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // The following is used to ignore callbacks from SecurityViews that are no longer current 4417751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // (e.g. face unlock). This avoids unwanted asynchronous events from messing with the 4427751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller // state for the current security method. 4437751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private KeyguardSecurityCallback mNullCallback = new KeyguardSecurityCallback() { 4447751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 445b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void userActivity() { } 4467751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 447ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia public void reportUnlockAttempt(int userId, boolean success, int timeoutMs) { } 4487751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 4497751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public boolean isVerifyUnlockOnly() { return false; } 4507751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 4517751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void dismiss(boolean securityVerified) { } 45272b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee @Override 45372b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void reset() {} 4547751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller }; 4557751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4567751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller private int getSecurityViewIdForMode(SecurityMode securityMode) { 4577751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (securityMode) { 4587751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: return R.id.keyguard_pattern_view; 4597751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: return R.id.keyguard_pin_view; 4607751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: return R.id.keyguard_password_view; 4617751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: return R.id.keyguard_sim_pin_view; 4627751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: return R.id.keyguard_sim_puk_view; 4637751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4647751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return 0; 4657751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4667751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 467eff74b48a8e137039473cf251bd5be3f34600522Evan Rosky protected int getLayoutIdFor(SecurityMode securityMode) { 4687751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller switch (securityMode) { 4697751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Pattern: return R.layout.keyguard_pattern_view; 4707751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case PIN: return R.layout.keyguard_pin_view; 4717751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case Password: return R.layout.keyguard_password_view; 4727751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPin: return R.layout.keyguard_sim_pin_view; 4737751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller case SimPuk: return R.layout.keyguard_sim_puk_view; 4747751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller default: 4757751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return 0; 4767751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4777751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4787751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4797751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public SecurityMode getSecurityMode() { 4807751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mSecurityModel.getSecurityMode(); 4817751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4827751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 48395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi public SecurityMode getCurrentSecurityMode() { 48495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi return mCurrentSecuritySelection; 48595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi } 48695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi 4877751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void verifyUnlock() { 4887751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mIsVerifyUnlockOnly = true; 4897751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller showSecurityScreen(getSecurityMode()); 4907751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4917751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4927751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public SecurityMode getCurrentSecuritySelection() { 4937751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mCurrentSecuritySelection; 4947751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4957751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 4967751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void dismiss(boolean authenticated) { 4977751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mCallback.dismiss(authenticated); 4987751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 4997751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5007751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public boolean needsInput() { 5017751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mSecurityViewFlipper.needsInput(); 5027751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5037751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5047751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5057751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void setKeyguardCallback(KeyguardSecurityCallback callback) { 5067751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.setKeyguardCallback(callback); 5077751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5087751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5097751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5107751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void reset() { 5117751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.reset(); 5127751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5137751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5147751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5157751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public KeyguardSecurityCallback getCallback() { 5167751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller return mSecurityViewFlipper.getCallback(); 5177751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5187751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 5197751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller @Override 5203122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek public void showPromptReason(int reason) { 5213122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek if (mCurrentSecuritySelection != SecurityMode.None) { 522569edb85125e6754de8f8e60f993afad42eed490Adrian Roos if (reason != PROMPT_REASON_NONE) { 523569edb85125e6754de8f8e60f993afad42eed490Adrian Roos Log.i(TAG, "Strong auth required, reason: " + reason); 524569edb85125e6754de8f8e60f993afad42eed490Adrian Roos } 5253122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek getSecurityView(mCurrentSecuritySelection).showPromptReason(reason); 5263122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 5273122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 5283122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek 529cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek 530cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek public void showMessage(String message, int color) { 531cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek if (mCurrentSecuritySelection != SecurityMode.None) { 532cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek getSecurityView(mCurrentSecuritySelection).showMessage(message, color); 533cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek } 534cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek } 535cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek 5363122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek @Override 5377751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller public void showUsabilityHint() { 5387751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller mSecurityViewFlipper.showUsabilityHint(); 5397751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller } 5407751ff6cd079e59e3c1f2404198774cd371ea69fJim Miller 541838906b165e4d3cb2c512b2db344aa50cb5d4751Jim Miller} 542c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 543