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