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