KeyguardPatternView.java revision 51efddbd3bb304de2dd47fa8cd1114ac555958bb
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 */ 165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard; 17dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 18ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggiimport static com.android.keyguard.LatencyTracker.ACTION_CHECK_CREDENTIAL; 19ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggiimport static com.android.keyguard.LatencyTracker.ACTION_CHECK_CREDENTIAL_UNLOCKED; 20ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi 21dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.content.Context; 225737534abab477cf32b4dd0aa7a72f70ede0502cJim Millerimport android.graphics.Rect; 236e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xiaimport android.os.AsyncTask; 24dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.CountDownTimer; 25dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.os.SystemClock; 263018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinekimport android.text.TextUtils; 27dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.AttributeSet; 28dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.util.Log; 29dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.MotionEvent; 30dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport android.view.View; 313018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinekimport android.view.ViewGroup; 3298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggiimport android.view.animation.AnimationUtils; 333018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinekimport android.view.animation.Interpolator; 343af630c8d18bcf4b23a5a308917319dd04cc8ed2Jim Millerimport android.widget.LinearLayout; 35dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 366e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xiaimport com.android.internal.widget.LockPatternChecker; 37dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternUtils; 38dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport com.android.internal.widget.LockPatternView; 395673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.AppearAnimationCreator; 405673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.AppearAnimationUtils; 415673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggiimport com.android.settingslib.animation.DisappearAnimationUtils; 42dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 43dcb3d84b82cc2448d04e73359a716581bfb657dbJim Millerimport java.util.List; 44dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 453018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinekpublic class KeyguardPatternView extends LinearLayout implements KeyguardSecurityView, 4672b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee AppearAnimationCreator<LockPatternView.CellState>, 4772b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee EmergencyButton.EmergencyButtonCallback { 48dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 49dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final String TAG = "SecurityPatternView"; 505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static final boolean DEBUG = KeyguardConstants.DEBUG; 51dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 52dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // how long before we clear the wrong pattern 53dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final int PATTERN_CLEAR_TIMEOUT_MS = 2000; 54dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 55dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // how long we stay awake after each key beyond MIN_PATTERN_BEFORE_POKE_WAKELOCK 56dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final int UNLOCK_PATTERN_WAKE_INTERVAL_MS = 7000; 57dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 58dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // how many cells the user has to cross before we poke the wakelock 59dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private static final int MIN_PATTERN_BEFORE_POKE_WAKELOCK = 2; 60dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 61e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi // How much we scale up the duration of the disappear animation when the current user is locked 62e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi public static final float DISAPPEAR_MULTIPLIER_LOCKED = 1.5f; 63e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi 647c11f8b4659c3444d5037b756b6e5f45a2ea61a6Adrian Roos private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; 653018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek private final AppearAnimationUtils mAppearAnimationUtils; 66f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek private final DisappearAnimationUtils mDisappearAnimationUtils; 67e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi private final DisappearAnimationUtils mDisappearAnimationUtilsLocked; 687c11f8b4659c3444d5037b756b6e5f45a2ea61a6Adrian Roos 69dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private CountDownTimer mCountdownTimer = null; 70dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternUtils mLockPatternUtils; 716e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia private AsyncTask<?, ?, ?> mPendingLockCheck; 72dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private LockPatternView mLockPatternView; 73dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private KeyguardSecurityCallback mCallback; 74dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 75dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 76dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Keeps track of the last time we poked the wake lock during dispatching of the touch event. 77dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Initialized to something guaranteed to make us poke the wakelock when the user starts 78dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * drawing the pattern. 79dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * @see #dispatchTouchEvent(android.view.MotionEvent) 80dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 81dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private long mLastPokeTime = -UNLOCK_PATTERN_WAKE_INTERVAL_MS; 82dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 83dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** 84dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller * Useful for clearing out the wrong pattern after a delay 85dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller */ 86dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private Runnable mCancelPatternRunnable = new Runnable() { 8751e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 88dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void run() { 89dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.clearPattern(); 90dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 91dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }; 925737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller private Rect mTempRect = new Rect(); 933122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek private KeyguardMessageArea mSecurityMessageDisplay; 94c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren private View mEcaView; 956b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi private ViewGroup mContainer; 9676a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi private int mDisappearYTranslation; 97dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 98dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller enum FooterMode { 99dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller Normal, 100dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ForgotLockPattern, 101dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller VerifyUnlocked 102dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 103dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 104dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardPatternView(Context context) { 105dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller this(context, null); 106dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 107dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 108dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardPatternView(Context context, AttributeSet attrs) { 109dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super(context, attrs); 1107c11f8b4659c3444d5037b756b6e5f45a2ea61a6Adrian Roos mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); 11198f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi mAppearAnimationUtils = new AppearAnimationUtils(context, 112f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek AppearAnimationUtils.DEFAULT_APPEAR_DURATION, 1.5f /* translationScale */, 113f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek 2.0f /* delayScale */, AnimationUtils.loadInterpolator( 11498f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi mContext, android.R.interpolator.linear_out_slow_in)); 115f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek mDisappearAnimationUtils = new DisappearAnimationUtils(context, 116f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek 125, 1.2f /* translationScale */, 11794f6f0610147de16aae7c39f97f21ee31591dd6fJorim Jaggi 0.6f /* delayScale */, AnimationUtils.loadInterpolator( 118f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek mContext, android.R.interpolator.fast_out_linear_in)); 119e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi mDisappearAnimationUtilsLocked = new DisappearAnimationUtils(context, 120e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi (long) (125 * DISAPPEAR_MULTIPLIER_LOCKED), 1.2f /* translationScale */, 121e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi 0.6f /* delayScale */, AnimationUtils.loadInterpolator( 122e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi mContext, android.R.interpolator.fast_out_linear_in)); 12376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi mDisappearYTranslation = getResources().getDimensionPixelSize( 12476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi R.dimen.disappear_y_translation); 125dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 126dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 12751e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 128dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void setKeyguardCallback(KeyguardSecurityCallback callback) { 129dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCallback = callback; 130dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 131dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 13251e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 133dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void setLockPatternUtils(LockPatternUtils utils) { 134dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = utils; 135dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 136dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 137dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 138dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller protected void onFinishInflate() { 139dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller super.onFinishInflate(); 140dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = mLockPatternUtils == null 141dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller ? new LockPatternUtils(mContext) : mLockPatternUtils; 142dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 14351efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette mLockPatternView = findViewById(R.id.lockPatternView); 144dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setSaveEnabled(false); 145dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setOnPatternListener(new UnlockPatternListener()); 146dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 147dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // vibrate mode will be the same for the life of this screen 148dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled()); 149dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 1503122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek mSecurityMessageDisplay = 1513122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek (KeyguardMessageArea) KeyguardMessageArea.findSecurityMessageDisplay(this); 152c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren mEcaView = findViewById(R.id.keyguard_selector_fade_container); 15351efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette mContainer = findViewById(R.id.container); 15472b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee 15551efddbd3bb304de2dd47fa8cd1114ac555958bbAlan Viverette EmergencyButton button = findViewById(R.id.emergency_call_button); 156f98f7b969b55fe517eda9cebcd645309badccae8Andrew Lee if (button != null) { 157f98f7b969b55fe517eda9cebcd645309badccae8Andrew Lee button.setCallback(this); 158f98f7b969b55fe517eda9cebcd645309badccae8Andrew Lee } 15972b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee } 16072b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee 16151e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 16272b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee public void onEmergencyButtonClickedWhenInCall() { 16372b46d429cbab54af962c25ffe087c5f927f7340Andrew Lee mCallback.reset(); 164dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 165dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 166dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 167d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller public boolean onTouchEvent(MotionEvent ev) { 168d2b82f70fede8c2ec4de34d8e6462ed4ece13c56Jim Miller boolean result = super.onTouchEvent(ev); 169dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // as long as the user is entering a pattern (i.e sending a touch event that was handled 170dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // by this screen), keep poking the wake lock so that the screen will stay on. 171dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final long elapsed = SystemClock.elapsedRealtime() - mLastPokeTime; 172dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (result && (elapsed > (UNLOCK_PATTERN_WAKE_INTERVAL_MS - 100))) { 173dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLastPokeTime = SystemClock.elapsedRealtime(); 174dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 1755737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller mTempRect.set(0, 0, 0, 0); 1765737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller offsetRectIntoDescendantCoords(mLockPatternView, mTempRect); 1775737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(mTempRect.left, mTempRect.top); 1785737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller result = mLockPatternView.dispatchTouchEvent(ev) || result; 1795737534abab477cf32b4dd0aa7a72f70ede0502cJim Miller ev.offsetLocation(-mTempRect.left, -mTempRect.top); 180dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return result; 181dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 182dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 18351e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 184dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void reset() { 185dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // reset lock pattern 18617fdb13a600e366ac1166e8dfe82b9b428041e29Toni Barzic mLockPatternView.setInStealthMode(!mLockPatternUtils.isVisiblePatternEnabled( 18717fdb13a600e366ac1166e8dfe82b9b428041e29Toni Barzic KeyguardUpdateMonitor.getCurrentUser())); 188dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.enableInput(); 189dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setEnabled(true); 190dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.clearPattern(); 191dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 192dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller // if the user is currently locked out, enforce it. 1938150d2a2a12b38598fd55d8ae3c3b5662ec3520fAdrian Roos long deadline = mLockPatternUtils.getLockoutAttemptDeadline( 194d6aa6cb0cc8c70a30434048e25e14643b1645755Adrian Roos KeyguardUpdateMonitor.getCurrentUser()); 195dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (deadline != 0) { 196dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller handleAttemptLockout(deadline); 197dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 1981625e87e600e8d0752d2f5e1318151a694f1be3eDanielle Millett displayDefaultSecurityMessage(); 199dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 200dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 201dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 2021625e87e600e8d0752d2f5e1318151a694f1be3eDanielle Millett private void displayDefaultSecurityMessage() { 203db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(""); 2041625e87e600e8d0752d2f5e1318151a694f1be3eDanielle Millett } 2051625e87e600e8d0752d2f5e1318151a694f1be3eDanielle Millett 2066fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen @Override 2076fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHint() { 2086fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 2096fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 210dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller /** TODO: hook this up */ 211dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void cleanUp() { 212dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (DEBUG) Log.v(TAG, "Cleanup() called on " + this); 213dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternUtils = null; 214dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setOnPatternListener(null); 215dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 216dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 217dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private class UnlockPatternListener implements LockPatternView.OnPatternListener { 218dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 21951e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 220dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onPatternStart() { 221dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.removeCallbacks(mCancelPatternRunnable); 222db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(""); 223dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 224dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 22551e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 226dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onPatternCleared() { 227dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 228dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 22951e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 230dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onPatternCellAdded(List<LockPatternView.Cell> pattern) { 231b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mCallback.userActivity(); 232dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 233dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 23451e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller @Override 2356e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia public void onPatternDetected(final List<LockPatternView.Cell> pattern) { 2366e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mLockPatternView.disableInput(); 2376e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia if (mPendingLockCheck != null) { 2386e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mPendingLockCheck.cancel(false); 2396e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia } 2406e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia 241ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia final int userId = KeyguardUpdateMonitor.getCurrentUser(); 2422397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales if (pattern.size() < LockPatternUtils.MIN_PATTERN_REGISTER_FAIL) { 2432397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales mLockPatternView.enableInput(); 244ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia onPatternChecked(userId, false, 0, false /* not valid - too short */); 2452397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales return; 2462397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales } 2472397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales 248ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi if (LatencyTracker.isEnabled(mContext)) { 249ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi LatencyTracker.getInstance(mContext).onActionStart(ACTION_CHECK_CREDENTIAL); 250ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi LatencyTracker.getInstance(mContext).onActionStart(ACTION_CHECK_CREDENTIAL_UNLOCKED); 251ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi } 2526e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mPendingLockCheck = LockPatternChecker.checkPattern( 2536e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mLockPatternUtils, 2546e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia pattern, 255ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia userId, 2566e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia new LockPatternChecker.OnCheckCallback() { 257e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi 258e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi @Override 259e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi public void onEarlyMatched() { 260ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi if (LatencyTracker.isEnabled(mContext)) { 261ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi LatencyTracker.getInstance(mContext).onActionEnd( 262ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi ACTION_CHECK_CREDENTIAL); 263ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi } 264e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi onPatternChecked(userId, true /* matched */, 0 /* timeoutMs */, 265e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi true /* isValidPattern */); 266e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi } 267e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi 2686e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia @Override 2692397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales public void onChecked(boolean matched, int timeoutMs) { 270ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi if (LatencyTracker.isEnabled(mContext)) { 271ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi LatencyTracker.getInstance(mContext).onActionEnd( 272ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi ACTION_CHECK_CREDENTIAL_UNLOCKED); 273ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi } 2746e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mLockPatternView.enableInput(); 2756e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mPendingLockCheck = null; 276e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi if (!matched) { 277e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi onPatternChecked(userId, false /* matched */, timeoutMs, 278e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi true /* isValidPattern */); 279e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi } 2806e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia } 281ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi 282ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi @Override 283ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi public void onCancelled() { 284ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi // We already got dismissed with the early matched callback, so we 285ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi // cancelled the check. However, we still need to note down the latency. 286ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi if (LatencyTracker.isEnabled(mContext)) { 287ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi LatencyTracker.getInstance(mContext).onActionEnd( 288ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi ACTION_CHECK_CREDENTIAL_UNLOCKED); 289ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi } 290ed3032b6b89a9ea72c211b0e973e2d0540bdc86dJorim Jaggi } 2916e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia }); 29251e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) { 29351e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller mCallback.userActivity(); 29451e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller } 2956e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia } 2966e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia 297ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia private void onPatternChecked(int userId, boolean matched, int timeoutMs, 298ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia boolean isValidPattern) { 299ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia boolean dismissKeyguard = KeyguardUpdateMonitor.getCurrentUser() == userId; 3006e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia if (matched) { 301ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mCallback.reportUnlockAttempt(userId, true, 0); 302ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia if (dismissKeyguard) { 303ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); 3048702ca7e2d6a1a66e580d039a1f662cfb94ee4acVadim Tryshev mCallback.dismiss(true, userId); 305ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia } 306dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } else { 307dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); 30851e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller if (isValidPattern) { 309ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia mCallback.reportUnlockAttempt(userId, false, timeoutMs); 31051e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller if (timeoutMs > 0) { 31151e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller long deadline = mLockPatternUtils.setLockoutAttemptDeadline( 312ce64cea38389a75def2f3d933a007515af288714Xiyuan Xia userId, timeoutMs); 31351e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller handleAttemptLockout(deadline); 31451e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller } 31551e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller } 31651e3a672e01d6e9ce4b19ec20d9b62ae8e35fc85Jim Miller if (timeoutMs == 0) { 317db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pattern); 318dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS); 319dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 320dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 321dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 322dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 323dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 324dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller private void handleAttemptLockout(long elapsedRealtimeDeadline) { 325dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.clearPattern(); 326dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setEnabled(false); 327dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller final long elapsedRealtime = SystemClock.elapsedRealtime(); 3285be868c590257f6cdccc19770051bf54552216dfHidenari Koshimae final long secondsInFuture = (long) Math.ceil( 3295be868c590257f6cdccc19770051bf54552216dfHidenari Koshimae (elapsedRealtimeDeadline - elapsedRealtime) / 1000.0); 3305be868c590257f6cdccc19770051bf54552216dfHidenari Koshimae mCountdownTimer = new CountDownTimer(secondsInFuture * 1000, 1000) { 331dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 332dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 333dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onTick(long millisUntilFinished) { 3345be868c590257f6cdccc19770051bf54552216dfHidenari Koshimae final int secondsRemaining = (int) Math.round(millisUntilFinished / 1000.0); 335db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.formatMessage( 336db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos R.string.kg_too_many_failed_attempts_countdown, secondsRemaining); 337dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 338dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 339dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 340dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onFinish() { 341dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mLockPatternView.setEnabled(true); 3421625e87e600e8d0752d2f5e1318151a694f1be3eDanielle Millett displayDefaultSecurityMessage(); 343dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 344dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 345dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller }.start(); 346dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 347dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 348dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 349dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public boolean needsInput() { 350dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return false; 351dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 352dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 353dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 354dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public void onPause() { 355dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller if (mCountdownTimer != null) { 356dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCountdownTimer.cancel(); 357dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller mCountdownTimer = null; 358dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 3596e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia if (mPendingLockCheck != null) { 3606e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mPendingLockCheck.cancel(false); 3616e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia mPendingLockCheck = null; 3626e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia } 363dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 364dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 365dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 366a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren public void onResume(int reason) { 367dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller reset(); 368dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 369dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 370dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller @Override 371dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller public KeyguardSecurityCallback getCallback() { 372dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller return mCallback; 373dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller } 374dcb3d84b82cc2448d04e73359a716581bfb657dbJim Miller 375c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren @Override 3763122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek public void showPromptReason(int reason) { 3773122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek switch (reason) { 3783122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek case PROMPT_REASON_RESTART: 379db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_restart_pattern); 3803122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek break; 38125b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi case PROMPT_REASON_TIMEOUT: 382db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern); 38325b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi break; 384d6d253a5a1e9cd29e1059262206ef9beb8e49fe5Adrian Roos case PROMPT_REASON_DEVICE_ADMIN: 385db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_device_admin); 386d6d253a5a1e9cd29e1059262206ef9beb8e49fe5Adrian Roos break; 387d6d253a5a1e9cd29e1059262206ef9beb8e49fe5Adrian Roos case PROMPT_REASON_USER_REQUEST: 388db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_user_request); 389d6d253a5a1e9cd29e1059262206ef9beb8e49fe5Adrian Roos break; 390c13723f22e476b4558061942c001ee62eaca79e4Adrian Roos case PROMPT_REASON_NONE: 391c13723f22e476b4558061942c001ee62eaca79e4Adrian Roos break; 3923122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek default: 393db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern); 39425b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi break; 3953122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 3963122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek } 3973122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek 3983122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek @Override 399cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek public void showMessage(String message, int color) { 400cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek mSecurityMessageDisplay.setNextMessageColor(color); 401db327e9f5976f8f184ae105e672ea4bda4a0af48Adrian Roos mSecurityMessageDisplay.setMessage(message); 402cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek } 403cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek 404cfafe4ea6ff1610c24d94a9a9ecc7df6b841518cSelim Cinek @Override 405c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi public void startAppearAnimation() { 4063018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek enableClipping(false); 407fb28c0e129896b17e4906b873bf44eb103ac2a8dJorim Jaggi setAlpha(1f); 40876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi setTranslationY(mAppearAnimationUtils.getStartTranslation()); 409613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */, 410613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi 0, mAppearAnimationUtils.getInterpolator()); 4115673353559453ecb57fc767b4e7500dd46e44079Jorim Jaggi mAppearAnimationUtils.startAnimation2d( 4123018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek mLockPatternView.getCellStates(), 4133018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek new Runnable() { 4143018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek @Override 4153018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek public void run() { 4163018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek enableClipping(true); 4173018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek } 4183018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek }, 4193018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek this); 4203122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek if (!TextUtils.isEmpty(mSecurityMessageDisplay.getText())) { 4213122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek mAppearAnimationUtils.createAnimation(mSecurityMessageDisplay, 0, 42298f8530af3bb8636b7b173443c90686c485205d6Jorim Jaggi AppearAnimationUtils.DEFAULT_APPEAR_DURATION, 4233018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek mAppearAnimationUtils.getStartTranslation(), 424f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek true /* appearing */, 4253018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek mAppearAnimationUtils.getInterpolator(), 4263018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek null /* finishRunnable */); 4273018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek } 4283018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek } 4293018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek 43076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi @Override 431f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek public boolean startDisappearAnimation(final Runnable finishRunnable) { 432031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi float durationMultiplier = mKeyguardUpdateMonitor.needsSlowUnlockTransition() 433031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi ? DISAPPEAR_MULTIPLIER_LOCKED 434031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi : 1f; 43576a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi mLockPatternView.clearPattern(); 436f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek enableClipping(false); 437f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek setTranslationY(0); 438e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 439e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi (long) (300 * durationMultiplier), 440613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi -mDisappearAnimationUtils.getStartTranslation(), 441613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi mDisappearAnimationUtils.getInterpolator()); 442e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi 443031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor 444031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi .needsSlowUnlockTransition() 445031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi ? mDisappearAnimationUtilsLocked 446031f79560f65499281bbb500c36e57724d7b514aJorim Jaggi : mDisappearAnimationUtils; 447e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi disappearAnimationUtils.startAnimation2d(mLockPatternView.getCellStates(), 448e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi () -> { 449e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi enableClipping(true); 450e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi if (finishRunnable != null) { 451e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi finishRunnable.run(); 452f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek } 453f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek }, KeyguardPatternView.this); 4543122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek if (!TextUtils.isEmpty(mSecurityMessageDisplay.getText())) { 4553122fa85b2f18c0a89f5fe1ef0942c530a271843Selim Cinek mDisappearAnimationUtils.createAnimation(mSecurityMessageDisplay, 0, 456e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi (long) (200 * durationMultiplier), 457f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek - mDisappearAnimationUtils.getStartTranslation() * 3, 458f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek false /* appearing */, 459f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek mDisappearAnimationUtils.getInterpolator(), 460f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek null /* finishRunnable */); 461f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek } 46276a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return true; 46376a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 46476a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 4653018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek private void enableClipping(boolean enable) { 4663018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek setClipChildren(enable); 4676b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi mContainer.setClipToPadding(enable); 4686b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi mContainer.setClipChildren(enable); 4693018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek } 4703018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek 4713018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek @Override 4723018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek public void createAnimation(final LockPatternView.CellState animatedCell, long delay, 473f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek long duration, float translationY, final boolean appearing, 474f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek Interpolator interpolator, 4753018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek final Runnable finishListener) { 476613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi mLockPatternView.startCellStateAnimation(animatedCell, 477613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi 1f, appearing ? 1f : 0f, /* alpha */ 478613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi appearing ? translationY : 0f, appearing ? 0f : translationY, /* translation */ 479613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi appearing ? 0f : 1f, 1f /* scale */, 480613f55fbbb23249d7c65e3f1fe8c943c4459b41aJorim Jaggi delay, duration, interpolator, finishListener); 4813018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek if (finishListener != null) { 4823018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek // Also animate the Emergency call 483f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek mAppearAnimationUtils.createAnimation(mEcaView, delay, duration, translationY, 484f9c0e8f02f3483d6aa9e762c97a2c02ea50eeb02Selim Cinek appearing, interpolator, null); 4853018197cf0dff5a9061f6065a8ecc108a0866dabSelim Cinek } 486c14f829506a5273e8022b461db2d61038b18ac4bJorim Jaggi } 48776a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi 48876a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi @Override 48976a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi public boolean hasOverlappingRendering() { 49076a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi return false; 49176a1623afc170a13923b68f3256057d8adeb7937Jorim Jaggi } 492c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren} 493