1dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller/*
2dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Copyright (C) 2012 The Android Open Source Project
3dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
4dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Licensed under the Apache License, Version 2.0 (the "License");
5dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * you may not use this file except in compliance with the License.
6dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * You may obtain a copy of the License at
7dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
8dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *      http://www.apache.org/licenses/LICENSE-2.0
9dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller *
10dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Unless required by applicable law or agreed to in writing, software
11dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * distributed under the License is distributed on an "AS IS" BASIS,
12dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * See the License for the specific language governing permissions and
14dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * limitations under the License.
15dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */
16dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpackage com.android.internal.policy.impl.keyguard;
17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
18dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context;
19c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wrenimport android.graphics.drawable.Drawable;
2094c7b14b1a4f53157997939505b70ef056ca90d8Uriel Rodriguezimport android.os.PowerManager;
21000464ac012471d301c6e48a8228291519915e17Jim Millerimport android.telephony.TelephonyManager;
22dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet;
23000464ac012471d301c6e48a8228291519915e17Jim Millerimport android.util.Log;
24000464ac012471d301c6e48a8228291519915e17Jim Millerimport android.view.View;
2561413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millettimport android.widget.ImageButton;
26dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.widget.LinearLayout;
27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
28000464ac012471d301c6e48a8228291519915e17Jim Millerimport com.android.internal.R;
29109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils;
31dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
32dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerpublic class KeyguardFaceUnlockView extends LinearLayout implements KeyguardSecurityView {
33dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
3494c7b14b1a4f53157997939505b70ef056ca90d8Uriel Rodriguez    private static final String TAG = "FULKeyguardFaceUnlockView";
3561413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett    private static final boolean DEBUG = false;
36dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private KeyguardSecurityCallback mKeyguardSecurityCallback;
37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    private LockPatternUtils mLockPatternUtils;
38000464ac012471d301c6e48a8228291519915e17Jim Miller    private BiometricSensorUnlock mBiometricUnlock;
39000464ac012471d301c6e48a8228291519915e17Jim Miller    private View mFaceUnlockAreaView;
4061413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett    private ImageButton mCancelButton;
41c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    private SecurityMessageDisplay mSecurityMessageDisplay;
42c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    private View mEcaView;
43c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    private Drawable mBouncerFrame;
44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
45f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett    private boolean mIsShowing = false;
46f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett    private final Object mIsShowingLock = new Object();
47f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett
48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardFaceUnlockView(Context context) {
49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        this(context, null);
50dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardFaceUnlockView(Context context, AttributeSet attrs) {
53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        super(context, attrs);
54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
57000464ac012471d301c6e48a8228291519915e17Jim Miller    protected void onFinishInflate() {
58000464ac012471d301c6e48a8228291519915e17Jim Miller        super.onFinishInflate();
59000464ac012471d301c6e48a8228291519915e17Jim Miller
60000464ac012471d301c6e48a8228291519915e17Jim Miller        initializeBiometricUnlockView();
61c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
62c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this);
63c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        mEcaView = findViewById(R.id.keyguard_selector_fade_container);
64c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        View bouncerFrameView = findViewById(R.id.keyguard_bouncer_frame);
65c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        if (bouncerFrameView != null) {
66c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren            mBouncerFrame = bouncerFrameView.getBackground();
67c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        }
68000464ac012471d301c6e48a8228291519915e17Jim Miller    }
69000464ac012471d301c6e48a8228291519915e17Jim Miller
70000464ac012471d301c6e48a8228291519915e17Jim Miller    @Override
71dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setKeyguardCallback(KeyguardSecurityCallback callback) {
72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mKeyguardSecurityCallback = callback;
73000464ac012471d301c6e48a8228291519915e17Jim Miller        // TODO: formalize this in the interface or factor it out
74000464ac012471d301c6e48a8228291519915e17Jim Miller        ((FaceUnlock)mBiometricUnlock).setKeyguardCallback(callback);
75dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void setLockPatternUtils(LockPatternUtils utils) {
79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        mLockPatternUtils = utils;
80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void reset() {
84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
87dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
88fbb9c6197f4c9dd2583590559502e3b0600867d8Steven Ross    public void onDetachedFromWindow() {
8961413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        if (DEBUG) Log.d(TAG, "onDetachedFromWindow()");
90fbb9c6197f4c9dd2583590559502e3b0600867d8Steven Ross        if (mBiometricUnlock != null) {
919a9f4ce1e2522f020b72a08161c1c3d244dd5c68Steven Ross            mBiometricUnlock.stop();
92fbb9c6197f4c9dd2583590559502e3b0600867d8Steven Ross        }
93cade0049a729ac63832f45befa91cec3b7ce88f5Danielle Millett        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateCallback);
94fbb9c6197f4c9dd2583590559502e3b0600867d8Steven Ross    }
95fbb9c6197f4c9dd2583590559502e3b0600867d8Steven Ross
96fbb9c6197f4c9dd2583590559502e3b0600867d8Steven Ross    @Override
97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public void onPause() {
9861413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        if (DEBUG) Log.d(TAG, "onPause()");
99000464ac012471d301c6e48a8228291519915e17Jim Miller        if (mBiometricUnlock != null) {
1001108a2cb412b054cc9e4acc48182c46c45180c0cDanielle Millett            mBiometricUnlock.stop();
101000464ac012471d301c6e48a8228291519915e17Jim Miller        }
102000464ac012471d301c6e48a8228291519915e17Jim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mUpdateCallback);
103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
106a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren    public void onResume(int reason) {
10761413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        if (DEBUG) Log.d(TAG, "onResume()");
1085d2404da57926736317c1a08d989cd55784ef8a1Danielle Millett        mIsShowing = KeyguardUpdateMonitor.getInstance(mContext).isKeyguardVisible();
109000464ac012471d301c6e48a8228291519915e17Jim Miller        maybeStartBiometricUnlock();
110000464ac012471d301c6e48a8228291519915e17Jim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateCallback);
111dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
112dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
113dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
114dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public boolean needsInput() {
115dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return false;
116dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
117dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
118dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    @Override
119dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    public KeyguardSecurityCallback getCallback() {
120dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller        return mKeyguardSecurityCallback;
121dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller    }
122dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
123000464ac012471d301c6e48a8228291519915e17Jim Miller    @Override
124000464ac012471d301c6e48a8228291519915e17Jim Miller    protected void onLayout(boolean changed, int l, int t, int r, int b) {
125000464ac012471d301c6e48a8228291519915e17Jim Miller        super.onLayout(changed, l, t, r, b);
126000464ac012471d301c6e48a8228291519915e17Jim Miller        mBiometricUnlock.initializeView(mFaceUnlockAreaView);
127000464ac012471d301c6e48a8228291519915e17Jim Miller    }
128000464ac012471d301c6e48a8228291519915e17Jim Miller
129000464ac012471d301c6e48a8228291519915e17Jim Miller    private void initializeBiometricUnlockView() {
130f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett        if (DEBUG) Log.d(TAG, "initializeBiometricUnlockView()");
131000464ac012471d301c6e48a8228291519915e17Jim Miller        mFaceUnlockAreaView = findViewById(R.id.face_unlock_area_view);
132000464ac012471d301c6e48a8228291519915e17Jim Miller        if (mFaceUnlockAreaView != null) {
133000464ac012471d301c6e48a8228291519915e17Jim Miller            mBiometricUnlock = new FaceUnlock(mContext);
13461413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett
13561413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett            mCancelButton = (ImageButton) findViewById(R.id.face_unlock_cancel_button);
13661413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett            mCancelButton.setOnClickListener(new OnClickListener() {
13761413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett                @Override
13861413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett                public void onClick(View v) {
13961413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett                    mBiometricUnlock.stopAndShowBackup();
14061413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett                }
14161413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett            });
142000464ac012471d301c6e48a8228291519915e17Jim Miller        } else {
143000464ac012471d301c6e48a8228291519915e17Jim Miller            Log.w(TAG, "Couldn't find biometric unlock view");
144000464ac012471d301c6e48a8228291519915e17Jim Miller        }
145000464ac012471d301c6e48a8228291519915e17Jim Miller    }
146000464ac012471d301c6e48a8228291519915e17Jim Miller
147000464ac012471d301c6e48a8228291519915e17Jim Miller    /**
148f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett     * Starts the biometric unlock if it should be started based on a number of factors.  If it
149f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett     * should not be started, it either goes to the back up, or remains showing to prepare for
150f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett     * it being started later.
151000464ac012471d301c6e48a8228291519915e17Jim Miller     */
152000464ac012471d301c6e48a8228291519915e17Jim Miller    private void maybeStartBiometricUnlock() {
15361413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett        if (DEBUG) Log.d(TAG, "maybeStartBiometricUnlock()");
154000464ac012471d301c6e48a8228291519915e17Jim Miller        if (mBiometricUnlock != null) {
155000464ac012471d301c6e48a8228291519915e17Jim Miller            KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
156000464ac012471d301c6e48a8228291519915e17Jim Miller            final boolean backupIsTimedOut = (
157000464ac012471d301c6e48a8228291519915e17Jim Miller                    monitor.getFailedUnlockAttempts() >=
158000464ac012471d301c6e48a8228291519915e17Jim Miller                    LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT);
15994c7b14b1a4f53157997939505b70ef056ca90d8Uriel Rodriguez            PowerManager powerManager = (PowerManager) mContext.getSystemService(
16094c7b14b1a4f53157997939505b70ef056ca90d8Uriel Rodriguez                    Context.POWER_SERVICE);
161f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett
162f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            boolean isShowing;
163f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            synchronized(mIsShowingLock) {
164f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                isShowing = mIsShowing;
165f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            }
166f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett
167f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            // Don't start it if the screen is off or if it's not showing, but keep this view up
168f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            // because we want it here and ready for when the screen turns on or when it does start
169f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            // showing.
170f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            if (!powerManager.isScreenOn() || !isShowing) {
171f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                mBiometricUnlock.stop(); // It shouldn't be running but calling this can't hurt.
172f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                return;
173f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            }
174f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett
17594c7b14b1a4f53157997939505b70ef056ca90d8Uriel Rodriguez            // TODO: Some of these conditions are handled in KeyguardSecurityModel and may not be
17694c7b14b1a4f53157997939505b70ef056ca90d8Uriel Rodriguez            // necessary here.
177d95c659a1d621dfbdd892759419ffc089e248672Danielle Millett            if (monitor.getPhoneState() == TelephonyManager.CALL_STATE_IDLE
178000464ac012471d301c6e48a8228291519915e17Jim Miller                    && !monitor.getMaxBiometricUnlockAttemptsReached()
179f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                    && !backupIsTimedOut) {
180000464ac012471d301c6e48a8228291519915e17Jim Miller                mBiometricUnlock.start();
181000464ac012471d301c6e48a8228291519915e17Jim Miller            } else {
18261413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett                mBiometricUnlock.stopAndShowBackup();
183000464ac012471d301c6e48a8228291519915e17Jim Miller            }
184000464ac012471d301c6e48a8228291519915e17Jim Miller        }
185000464ac012471d301c6e48a8228291519915e17Jim Miller    }
186000464ac012471d301c6e48a8228291519915e17Jim Miller
187000464ac012471d301c6e48a8228291519915e17Jim Miller    KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() {
188000464ac012471d301c6e48a8228291519915e17Jim Miller        // We need to stop the biometric unlock when a phone call comes in
189000464ac012471d301c6e48a8228291519915e17Jim Miller        @Override
190000464ac012471d301c6e48a8228291519915e17Jim Miller        public void onPhoneStateChanged(int phoneState) {
19161413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett            if (DEBUG) Log.d(TAG, "onPhoneStateChanged(" + phoneState + ")");
192000464ac012471d301c6e48a8228291519915e17Jim Miller            if (phoneState == TelephonyManager.CALL_STATE_RINGING) {
193f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                if (mBiometricUnlock != null) {
194f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                    mBiometricUnlock.stopAndShowBackup();
195f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                }
196000464ac012471d301c6e48a8228291519915e17Jim Miller            }
197000464ac012471d301c6e48a8228291519915e17Jim Miller        }
198000464ac012471d301c6e48a8228291519915e17Jim Miller
199000464ac012471d301c6e48a8228291519915e17Jim Miller        @Override
200000464ac012471d301c6e48a8228291519915e17Jim Miller        public void onUserSwitched(int userId) {
20161413b5ed215accd7b4f3eaf80edeab2f330aa49Danielle Millett            if (DEBUG) Log.d(TAG, "onUserSwitched(" + userId + ")");
202000464ac012471d301c6e48a8228291519915e17Jim Miller            if (mBiometricUnlock != null) {
203000464ac012471d301c6e48a8228291519915e17Jim Miller                mBiometricUnlock.stop();
204000464ac012471d301c6e48a8228291519915e17Jim Miller            }
205ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            // No longer required; static value set by KeyguardViewMediator
206ee82f8fa2d47fc1dbfc29582ae348b3c45ff8fe0Jim Miller            // mLockPatternUtils.setCurrentUser(userId);
207000464ac012471d301c6e48a8228291519915e17Jim Miller        }
208f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett
209f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett        @Override
210f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett        public void onKeyguardVisibilityChanged(boolean showing) {
211f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            if (DEBUG) Log.d(TAG, "onKeyguardVisibilityChanged(" + showing + ")");
212f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            boolean wasShowing = false;
213f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            synchronized(mIsShowingLock) {
214f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                wasShowing = mIsShowing;
215f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                mIsShowing = showing;
216f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            }
217f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            PowerManager powerManager = (PowerManager) mContext.getSystemService(
218f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                    Context.POWER_SERVICE);
219f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            if (mBiometricUnlock != null) {
220f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                if (!showing && wasShowing) {
221f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                    mBiometricUnlock.stop();
222f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                } else if (showing && powerManager.isScreenOn() && !wasShowing) {
223f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                    maybeStartBiometricUnlock();
224f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett                }
225f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett            }
226f6d0fc190c4b257ee4f2f1ae8a59519d3a21ce6dDanielle Millett        }
227000464ac012471d301c6e48a8228291519915e17Jim Miller    };
228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller
2290ff7f010f8bfd011f0915031b02739ae3bee401eJim Miller    @Override
2306fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHint() {
2316fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
232c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
233c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    @Override
234c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    public void showBouncer(int duration) {
235c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        KeyguardSecurityViewHelper.
236c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren                showBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
237c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    }
238c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
239c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    @Override
240c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    public void hideBouncer(int duration) {
241c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        KeyguardSecurityViewHelper.
242c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren                hideBouncer(mSecurityMessageDisplay, mEcaView, mBouncerFrame, duration);
243c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    }
244c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
245dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller}
246