Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2012 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
Jim Miller | 5ecd811 | 2013-01-09 18:50:26 -0800 | [diff] [blame] | 16 | package com.android.keyguard; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 17 | |
Jason Monk | ea03be1 | 2017-12-04 11:08:41 -0500 | [diff] [blame] | 18 | import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL; |
| 19 | import static com.android.internal.util.LatencyTracker.ACTION_CHECK_CREDENTIAL_UNLOCKED; |
Jorim Jaggi | ed3032b | 2016-10-07 16:49:34 +0200 | [diff] [blame] | 20 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 21 | import android.content.Context; |
Jason Chang | 1e4a4bd | 2018-05-22 17:30:19 +0800 | [diff] [blame] | 22 | import android.content.res.ColorStateList; |
Jim Miller | 5737534 | 2012-09-09 15:20:31 -0700 | [diff] [blame] | 23 | import android.graphics.Rect; |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 24 | import android.os.AsyncTask; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 25 | import android.os.CountDownTimer; |
| 26 | import android.os.SystemClock; |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 27 | import android.text.TextUtils; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 28 | import android.util.AttributeSet; |
| 29 | import android.util.Log; |
| 30 | import android.view.MotionEvent; |
| 31 | import android.view.View; |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 32 | import android.view.ViewGroup; |
Jorim Jaggi | 98f8530 | 2014-08-07 17:45:04 +0200 | [diff] [blame] | 33 | import android.view.animation.AnimationUtils; |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 34 | import android.view.animation.Interpolator; |
Jim Miller | 3af630c | 2012-09-26 14:29:18 -0700 | [diff] [blame] | 35 | import android.widget.LinearLayout; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 36 | |
Lucas Dupin | 2e838ac | 2019-04-17 16:50:58 -0700 | [diff] [blame] | 37 | import com.android.internal.annotations.VisibleForTesting; |
Jason Monk | ea03be1 | 2017-12-04 11:08:41 -0500 | [diff] [blame] | 38 | import com.android.internal.util.LatencyTracker; |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 39 | import com.android.internal.widget.LockPatternChecker; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 40 | import com.android.internal.widget.LockPatternUtils; |
| 41 | import com.android.internal.widget.LockPatternView; |
Jorim Jaggi | 5673353 | 2015-06-09 15:25:40 -0700 | [diff] [blame] | 42 | import com.android.settingslib.animation.AppearAnimationCreator; |
| 43 | import com.android.settingslib.animation.AppearAnimationUtils; |
| 44 | import com.android.settingslib.animation.DisappearAnimationUtils; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 45 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 46 | import java.util.List; |
| 47 | |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 48 | public class KeyguardPatternView extends LinearLayout implements KeyguardSecurityView, |
Andrew Lee | 72b46d4 | 2015-01-30 13:23:21 -0800 | [diff] [blame] | 49 | AppearAnimationCreator<LockPatternView.CellState>, |
| 50 | EmergencyButton.EmergencyButtonCallback { |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 51 | |
| 52 | private static final String TAG = "SecurityPatternView"; |
Jorim Jaggi | 5cf1787 | 2014-03-26 18:31:48 +0100 | [diff] [blame] | 53 | private static final boolean DEBUG = KeyguardConstants.DEBUG; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 54 | |
| 55 | // how long before we clear the wrong pattern |
| 56 | private static final int PATTERN_CLEAR_TIMEOUT_MS = 2000; |
| 57 | |
| 58 | // how long we stay awake after each key beyond MIN_PATTERN_BEFORE_POKE_WAKELOCK |
| 59 | private static final int UNLOCK_PATTERN_WAKE_INTERVAL_MS = 7000; |
| 60 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 61 | // how many cells the user has to cross before we poke the wakelock |
| 62 | private static final int MIN_PATTERN_BEFORE_POKE_WAKELOCK = 2; |
| 63 | |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 64 | // How much we scale up the duration of the disappear animation when the current user is locked |
| 65 | public static final float DISAPPEAR_MULTIPLIER_LOCKED = 1.5f; |
| 66 | |
Adrian Roos | 7c11f8b | 2014-03-10 17:00:11 +0100 | [diff] [blame] | 67 | private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 68 | private final AppearAnimationUtils mAppearAnimationUtils; |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 69 | private final DisappearAnimationUtils mDisappearAnimationUtils; |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 70 | private final DisappearAnimationUtils mDisappearAnimationUtilsLocked; |
Lucas Dupin | 727890f | 2019-05-15 14:32:50 -0700 | [diff] [blame] | 71 | private final int[] mTmpPosition = new int[2]; |
| 72 | private final Rect mTempRect = new Rect(); |
| 73 | private final Rect mLockPatternScreenBounds = new Rect(); |
Adrian Roos | 7c11f8b | 2014-03-10 17:00:11 +0100 | [diff] [blame] | 74 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 75 | private CountDownTimer mCountdownTimer = null; |
| 76 | private LockPatternUtils mLockPatternUtils; |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 77 | private AsyncTask<?, ?, ?> mPendingLockCheck; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 78 | private LockPatternView mLockPatternView; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 79 | private KeyguardSecurityCallback mCallback; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 80 | |
| 81 | /** |
| 82 | * Keeps track of the last time we poked the wake lock during dispatching of the touch event. |
| 83 | * Initialized to something guaranteed to make us poke the wakelock when the user starts |
| 84 | * drawing the pattern. |
| 85 | * @see #dispatchTouchEvent(android.view.MotionEvent) |
| 86 | */ |
| 87 | private long mLastPokeTime = -UNLOCK_PATTERN_WAKE_INTERVAL_MS; |
| 88 | |
| 89 | /** |
| 90 | * Useful for clearing out the wrong pattern after a delay |
| 91 | */ |
| 92 | private Runnable mCancelPatternRunnable = new Runnable() { |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 93 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 94 | public void run() { |
| 95 | mLockPatternView.clearPattern(); |
| 96 | } |
| 97 | }; |
Lucas Dupin | 2e838ac | 2019-04-17 16:50:58 -0700 | [diff] [blame] | 98 | @VisibleForTesting |
| 99 | KeyguardMessageArea mSecurityMessageDisplay; |
Chris Wren | c0ae9e6 | 2012-11-05 13:16:31 -0500 | [diff] [blame] | 100 | private View mEcaView; |
Jorim Jaggi | 6b88cdf | 2014-12-22 20:56:50 +0100 | [diff] [blame] | 101 | private ViewGroup mContainer; |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 102 | private int mDisappearYTranslation; |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 103 | |
| 104 | enum FooterMode { |
| 105 | Normal, |
| 106 | ForgotLockPattern, |
| 107 | VerifyUnlocked |
| 108 | } |
| 109 | |
| 110 | public KeyguardPatternView(Context context) { |
| 111 | this(context, null); |
| 112 | } |
| 113 | |
| 114 | public KeyguardPatternView(Context context, AttributeSet attrs) { |
| 115 | super(context, attrs); |
Adrian Roos | 7c11f8b | 2014-03-10 17:00:11 +0100 | [diff] [blame] | 116 | mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext); |
Jorim Jaggi | 98f8530 | 2014-08-07 17:45:04 +0200 | [diff] [blame] | 117 | mAppearAnimationUtils = new AppearAnimationUtils(context, |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 118 | AppearAnimationUtils.DEFAULT_APPEAR_DURATION, 1.5f /* translationScale */, |
| 119 | 2.0f /* delayScale */, AnimationUtils.loadInterpolator( |
Jorim Jaggi | 98f8530 | 2014-08-07 17:45:04 +0200 | [diff] [blame] | 120 | mContext, android.R.interpolator.linear_out_slow_in)); |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 121 | mDisappearAnimationUtils = new DisappearAnimationUtils(context, |
| 122 | 125, 1.2f /* translationScale */, |
Jorim Jaggi | 94f6f061 | 2015-06-25 14:47:24 -0700 | [diff] [blame] | 123 | 0.6f /* delayScale */, AnimationUtils.loadInterpolator( |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 124 | mContext, android.R.interpolator.fast_out_linear_in)); |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 125 | mDisappearAnimationUtilsLocked = new DisappearAnimationUtils(context, |
| 126 | (long) (125 * DISAPPEAR_MULTIPLIER_LOCKED), 1.2f /* translationScale */, |
| 127 | 0.6f /* delayScale */, AnimationUtils.loadInterpolator( |
| 128 | mContext, android.R.interpolator.fast_out_linear_in)); |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 129 | mDisappearYTranslation = getResources().getDimensionPixelSize( |
| 130 | R.dimen.disappear_y_translation); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 131 | } |
| 132 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 133 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 134 | public void setKeyguardCallback(KeyguardSecurityCallback callback) { |
| 135 | mCallback = callback; |
| 136 | } |
| 137 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 138 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 139 | public void setLockPatternUtils(LockPatternUtils utils) { |
| 140 | mLockPatternUtils = utils; |
| 141 | } |
| 142 | |
| 143 | @Override |
| 144 | protected void onFinishInflate() { |
| 145 | super.onFinishInflate(); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 146 | mLockPatternUtils = mLockPatternUtils == null |
| 147 | ? new LockPatternUtils(mContext) : mLockPatternUtils; |
| 148 | |
Alan Viverette | 51efddb | 2017-04-05 10:00:01 -0400 | [diff] [blame] | 149 | mLockPatternView = findViewById(R.id.lockPatternView); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 150 | mLockPatternView.setSaveEnabled(false); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 151 | mLockPatternView.setOnPatternListener(new UnlockPatternListener()); |
Lucas Dupin | e173274 | 2018-08-23 18:26:49 -0700 | [diff] [blame] | 152 | mLockPatternView.setInStealthMode(!mLockPatternUtils.isVisiblePatternEnabled( |
| 153 | KeyguardUpdateMonitor.getCurrentUser())); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 154 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 155 | // vibrate mode will be the same for the life of this screen |
| 156 | mLockPatternView.setTactileFeedbackEnabled(mLockPatternUtils.isTactileFeedbackEnabled()); |
| 157 | |
Chris Wren | c0ae9e6 | 2012-11-05 13:16:31 -0500 | [diff] [blame] | 158 | mEcaView = findViewById(R.id.keyguard_selector_fade_container); |
Alan Viverette | 51efddb | 2017-04-05 10:00:01 -0400 | [diff] [blame] | 159 | mContainer = findViewById(R.id.container); |
Andrew Lee | 72b46d4 | 2015-01-30 13:23:21 -0800 | [diff] [blame] | 160 | |
Alan Viverette | 51efddb | 2017-04-05 10:00:01 -0400 | [diff] [blame] | 161 | EmergencyButton button = findViewById(R.id.emergency_call_button); |
Andrew Lee | f98f7b9 | 2015-02-02 15:50:29 -0800 | [diff] [blame] | 162 | if (button != null) { |
| 163 | button.setCallback(this); |
| 164 | } |
Jian Jin | 44e4d82 | 2018-04-06 12:40:50 -0700 | [diff] [blame] | 165 | |
| 166 | View cancelBtn = findViewById(R.id.cancel_button); |
| 167 | if (cancelBtn != null) { |
| 168 | cancelBtn.setOnClickListener(view -> { |
| 169 | mCallback.reset(); |
Aarthi Balachander | 0a427ef | 2018-07-13 15:00:58 -0700 | [diff] [blame] | 170 | mCallback.onCancelClicked(); |
Jian Jin | 44e4d82 | 2018-04-06 12:40:50 -0700 | [diff] [blame] | 171 | }); |
| 172 | } |
Andrew Lee | 72b46d4 | 2015-01-30 13:23:21 -0800 | [diff] [blame] | 173 | } |
| 174 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 175 | @Override |
Lucas Dupin | 2e838ac | 2019-04-17 16:50:58 -0700 | [diff] [blame] | 176 | protected void onAttachedToWindow() { |
| 177 | super.onAttachedToWindow(); |
| 178 | mSecurityMessageDisplay = KeyguardMessageArea.findSecurityMessageDisplay(this); |
| 179 | } |
| 180 | |
| 181 | @Override |
Andrew Lee | 72b46d4 | 2015-01-30 13:23:21 -0800 | [diff] [blame] | 182 | public void onEmergencyButtonClickedWhenInCall() { |
| 183 | mCallback.reset(); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 184 | } |
| 185 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 186 | @Override |
Jim Miller | d2b82f7 | 2012-09-18 20:52:55 -0700 | [diff] [blame] | 187 | public boolean onTouchEvent(MotionEvent ev) { |
| 188 | boolean result = super.onTouchEvent(ev); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 189 | // as long as the user is entering a pattern (i.e sending a touch event that was handled |
| 190 | // by this screen), keep poking the wake lock so that the screen will stay on. |
| 191 | final long elapsed = SystemClock.elapsedRealtime() - mLastPokeTime; |
| 192 | if (result && (elapsed > (UNLOCK_PATTERN_WAKE_INTERVAL_MS - 100))) { |
| 193 | mLastPokeTime = SystemClock.elapsedRealtime(); |
| 194 | } |
Jim Miller | 5737534 | 2012-09-09 15:20:31 -0700 | [diff] [blame] | 195 | mTempRect.set(0, 0, 0, 0); |
| 196 | offsetRectIntoDescendantCoords(mLockPatternView, mTempRect); |
| 197 | ev.offsetLocation(mTempRect.left, mTempRect.top); |
| 198 | result = mLockPatternView.dispatchTouchEvent(ev) || result; |
| 199 | ev.offsetLocation(-mTempRect.left, -mTempRect.top); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 200 | return result; |
| 201 | } |
| 202 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 203 | @Override |
Lucas Dupin | 727890f | 2019-05-15 14:32:50 -0700 | [diff] [blame] | 204 | protected void onLayout(boolean changed, int l, int t, int r, int b) { |
| 205 | super.onLayout(changed, l, t, r, b); |
| 206 | mLockPatternView.getLocationOnScreen(mTmpPosition); |
| 207 | mLockPatternScreenBounds.set(mTmpPosition[0], mTmpPosition[1], |
| 208 | mTmpPosition[0] + mLockPatternView.getWidth(), |
| 209 | mTmpPosition[1] + mLockPatternView.getHeight()); |
| 210 | } |
| 211 | |
| 212 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 213 | public void reset() { |
| 214 | // reset lock pattern |
Toni Barzic | 17fdb13 | 2015-10-16 13:38:11 -0700 | [diff] [blame] | 215 | mLockPatternView.setInStealthMode(!mLockPatternUtils.isVisiblePatternEnabled( |
| 216 | KeyguardUpdateMonitor.getCurrentUser())); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 217 | mLockPatternView.enableInput(); |
| 218 | mLockPatternView.setEnabled(true); |
| 219 | mLockPatternView.clearPattern(); |
| 220 | |
Lucas Dupin | 2e838ac | 2019-04-17 16:50:58 -0700 | [diff] [blame] | 221 | if (mSecurityMessageDisplay == null) { |
| 222 | return; |
| 223 | } |
| 224 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 225 | // if the user is currently locked out, enforce it. |
Adrian Roos | 8150d2a | 2015-04-16 17:11:20 -0700 | [diff] [blame] | 226 | long deadline = mLockPatternUtils.getLockoutAttemptDeadline( |
Adrian Roos | d6aa6cb | 2015-04-16 19:31:29 -0700 | [diff] [blame] | 227 | KeyguardUpdateMonitor.getCurrentUser()); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 228 | if (deadline != 0) { |
| 229 | handleAttemptLockout(deadline); |
| 230 | } else { |
Danielle Millett | 1625e87 | 2012-11-01 15:00:12 -0400 | [diff] [blame] | 231 | displayDefaultSecurityMessage(); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 232 | } |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 233 | } |
| 234 | |
Danielle Millett | 1625e87 | 2012-11-01 15:00:12 -0400 | [diff] [blame] | 235 | private void displayDefaultSecurityMessage() { |
Lucas Dupin | 2e838ac | 2019-04-17 16:50:58 -0700 | [diff] [blame] | 236 | if (mSecurityMessageDisplay != null) { |
| 237 | mSecurityMessageDisplay.setMessage(""); |
| 238 | } |
Danielle Millett | 1625e87 | 2012-11-01 15:00:12 -0400 | [diff] [blame] | 239 | } |
| 240 | |
Adam Cohen | 6fb841f | 2012-10-24 13:15:38 -0700 | [diff] [blame] | 241 | @Override |
| 242 | public void showUsabilityHint() { |
| 243 | } |
| 244 | |
Lucas Dupin | 7156bc7 | 2019-05-03 19:37:39 -0700 | [diff] [blame] | 245 | @Override |
| 246 | public boolean disallowInterceptTouch(MotionEvent event) { |
Lucas Dupin | 727890f | 2019-05-15 14:32:50 -0700 | [diff] [blame] | 247 | return mLockPatternScreenBounds.contains((int) event.getRawX(), (int) event.getRawY()); |
Lucas Dupin | 7156bc7 | 2019-05-03 19:37:39 -0700 | [diff] [blame] | 248 | } |
| 249 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 250 | /** TODO: hook this up */ |
| 251 | public void cleanUp() { |
| 252 | if (DEBUG) Log.v(TAG, "Cleanup() called on " + this); |
| 253 | mLockPatternUtils = null; |
| 254 | mLockPatternView.setOnPatternListener(null); |
| 255 | } |
| 256 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 257 | private class UnlockPatternListener implements LockPatternView.OnPatternListener { |
| 258 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 259 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 260 | public void onPatternStart() { |
| 261 | mLockPatternView.removeCallbacks(mCancelPatternRunnable); |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 262 | mSecurityMessageDisplay.setMessage(""); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 263 | } |
| 264 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 265 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 266 | public void onPatternCleared() { |
| 267 | } |
| 268 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 269 | @Override |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 270 | public void onPatternCellAdded(List<LockPatternView.Cell> pattern) { |
Jorim Jaggi | b690f0d | 2014-07-03 23:25:44 +0200 | [diff] [blame] | 271 | mCallback.userActivity(); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 272 | } |
| 273 | |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 274 | @Override |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 275 | public void onPatternDetected(final List<LockPatternView.Cell> pattern) { |
| 276 | mLockPatternView.disableInput(); |
| 277 | if (mPendingLockCheck != null) { |
| 278 | mPendingLockCheck.cancel(false); |
| 279 | } |
| 280 | |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 281 | final int userId = KeyguardUpdateMonitor.getCurrentUser(); |
Andres Morales | 2397427 | 2015-05-14 22:42:26 -0700 | [diff] [blame] | 282 | if (pattern.size() < LockPatternUtils.MIN_PATTERN_REGISTER_FAIL) { |
| 283 | mLockPatternView.enableInput(); |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 284 | onPatternChecked(userId, false, 0, false /* not valid - too short */); |
Andres Morales | 2397427 | 2015-05-14 22:42:26 -0700 | [diff] [blame] | 285 | return; |
| 286 | } |
| 287 | |
Jorim Jaggi | ed3032b | 2016-10-07 16:49:34 +0200 | [diff] [blame] | 288 | if (LatencyTracker.isEnabled(mContext)) { |
| 289 | LatencyTracker.getInstance(mContext).onActionStart(ACTION_CHECK_CREDENTIAL); |
| 290 | LatencyTracker.getInstance(mContext).onActionStart(ACTION_CHECK_CREDENTIAL_UNLOCKED); |
| 291 | } |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 292 | mPendingLockCheck = LockPatternChecker.checkPattern( |
| 293 | mLockPatternUtils, |
| 294 | pattern, |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 295 | userId, |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 296 | new LockPatternChecker.OnCheckCallback() { |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 297 | |
| 298 | @Override |
| 299 | public void onEarlyMatched() { |
Jorim Jaggi | ed3032b | 2016-10-07 16:49:34 +0200 | [diff] [blame] | 300 | if (LatencyTracker.isEnabled(mContext)) { |
| 301 | LatencyTracker.getInstance(mContext).onActionEnd( |
| 302 | ACTION_CHECK_CREDENTIAL); |
| 303 | } |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 304 | onPatternChecked(userId, true /* matched */, 0 /* timeoutMs */, |
| 305 | true /* isValidPattern */); |
| 306 | } |
| 307 | |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 308 | @Override |
Andres Morales | 2397427 | 2015-05-14 22:42:26 -0700 | [diff] [blame] | 309 | public void onChecked(boolean matched, int timeoutMs) { |
Jorim Jaggi | ed3032b | 2016-10-07 16:49:34 +0200 | [diff] [blame] | 310 | if (LatencyTracker.isEnabled(mContext)) { |
| 311 | LatencyTracker.getInstance(mContext).onActionEnd( |
| 312 | ACTION_CHECK_CREDENTIAL_UNLOCKED); |
| 313 | } |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 314 | mLockPatternView.enableInput(); |
| 315 | mPendingLockCheck = null; |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 316 | if (!matched) { |
| 317 | onPatternChecked(userId, false /* matched */, timeoutMs, |
| 318 | true /* isValidPattern */); |
| 319 | } |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 320 | } |
Jorim Jaggi | ed3032b | 2016-10-07 16:49:34 +0200 | [diff] [blame] | 321 | |
| 322 | @Override |
| 323 | public void onCancelled() { |
| 324 | // We already got dismissed with the early matched callback, so we |
| 325 | // cancelled the check. However, we still need to note down the latency. |
| 326 | if (LatencyTracker.isEnabled(mContext)) { |
| 327 | LatencyTracker.getInstance(mContext).onActionEnd( |
| 328 | ACTION_CHECK_CREDENTIAL_UNLOCKED); |
| 329 | } |
| 330 | } |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 331 | }); |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 332 | if (pattern.size() > MIN_PATTERN_BEFORE_POKE_WAKELOCK) { |
| 333 | mCallback.userActivity(); |
| 334 | } |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 335 | } |
| 336 | |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 337 | private void onPatternChecked(int userId, boolean matched, int timeoutMs, |
| 338 | boolean isValidPattern) { |
| 339 | boolean dismissKeyguard = KeyguardUpdateMonitor.getCurrentUser() == userId; |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 340 | if (matched) { |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 341 | mCallback.reportUnlockAttempt(userId, true, 0); |
| 342 | if (dismissKeyguard) { |
| 343 | mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); |
Vadim Tryshev | 8702ca7 | 2016-04-22 08:14:12 -0700 | [diff] [blame] | 344 | mCallback.dismiss(true, userId); |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 345 | } |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 346 | } else { |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 347 | mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 348 | if (isValidPattern) { |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 349 | mCallback.reportUnlockAttempt(userId, false, timeoutMs); |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 350 | if (timeoutMs > 0) { |
| 351 | long deadline = mLockPatternUtils.setLockoutAttemptDeadline( |
Xiyuan Xia | ce64cea | 2016-01-06 08:51:16 -0800 | [diff] [blame] | 352 | userId, timeoutMs); |
Jim Miller | 51e3a67 | 2015-07-31 18:42:53 -0700 | [diff] [blame] | 353 | handleAttemptLockout(deadline); |
| 354 | } |
| 355 | } |
| 356 | if (timeoutMs == 0) { |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 357 | mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pattern); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 358 | mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS); |
| 359 | } |
| 360 | } |
| 361 | } |
| 362 | } |
| 363 | |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 364 | private void handleAttemptLockout(long elapsedRealtimeDeadline) { |
| 365 | mLockPatternView.clearPattern(); |
| 366 | mLockPatternView.setEnabled(false); |
| 367 | final long elapsedRealtime = SystemClock.elapsedRealtime(); |
Hidenari Koshimae | 5be868c | 2014-08-21 11:27:33 +0200 | [diff] [blame] | 368 | final long secondsInFuture = (long) Math.ceil( |
| 369 | (elapsedRealtimeDeadline - elapsedRealtime) / 1000.0); |
| 370 | mCountdownTimer = new CountDownTimer(secondsInFuture * 1000, 1000) { |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 371 | |
| 372 | @Override |
| 373 | public void onTick(long millisUntilFinished) { |
Hidenari Koshimae | 5be868c | 2014-08-21 11:27:33 +0200 | [diff] [blame] | 374 | final int secondsRemaining = (int) Math.round(millisUntilFinished / 1000.0); |
Kevin Chyn | e01c5e1 | 2017-08-29 19:04:25 -0700 | [diff] [blame] | 375 | mSecurityMessageDisplay.setMessage(mContext.getResources().getQuantityString( |
| 376 | R.plurals.kg_too_many_failed_attempts_countdown, |
| 377 | secondsRemaining, secondsRemaining)); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 378 | } |
| 379 | |
| 380 | @Override |
| 381 | public void onFinish() { |
| 382 | mLockPatternView.setEnabled(true); |
Danielle Millett | 1625e87 | 2012-11-01 15:00:12 -0400 | [diff] [blame] | 383 | displayDefaultSecurityMessage(); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 384 | } |
| 385 | |
| 386 | }.start(); |
| 387 | } |
| 388 | |
| 389 | @Override |
| 390 | public boolean needsInput() { |
| 391 | return false; |
| 392 | } |
| 393 | |
| 394 | @Override |
| 395 | public void onPause() { |
| 396 | if (mCountdownTimer != null) { |
| 397 | mCountdownTimer.cancel(); |
| 398 | mCountdownTimer = null; |
| 399 | } |
Xiyuan Xia | 6e38058 | 2015-05-05 15:16:08 -0700 | [diff] [blame] | 400 | if (mPendingLockCheck != null) { |
| 401 | mPendingLockCheck.cancel(false); |
| 402 | mPendingLockCheck = null; |
| 403 | } |
Lucas Dupin | c6b50c6 | 2018-10-09 20:00:35 -0700 | [diff] [blame] | 404 | displayDefaultSecurityMessage(); |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 405 | } |
| 406 | |
| 407 | @Override |
Chris Wren | a042ac9 | 2012-11-07 11:37:06 -0500 | [diff] [blame] | 408 | public void onResume(int reason) { |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 409 | } |
| 410 | |
| 411 | @Override |
| 412 | public KeyguardSecurityCallback getCallback() { |
| 413 | return mCallback; |
| 414 | } |
Chris Wren | c0ae9e6 | 2012-11-05 13:16:31 -0500 | [diff] [blame] | 415 | |
| 416 | @Override |
Selim Cinek | 3122fa8 | 2015-06-18 01:38:59 -0700 | [diff] [blame] | 417 | public void showPromptReason(int reason) { |
| 418 | switch (reason) { |
| 419 | case PROMPT_REASON_RESTART: |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 420 | mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_restart_pattern); |
Selim Cinek | 3122fa8 | 2015-06-18 01:38:59 -0700 | [diff] [blame] | 421 | break; |
Jorim Jaggi | 25b4d4b | 2015-08-11 15:54:06 -0700 | [diff] [blame] | 422 | case PROMPT_REASON_TIMEOUT: |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 423 | mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern); |
Jorim Jaggi | 25b4d4b | 2015-08-11 15:54:06 -0700 | [diff] [blame] | 424 | break; |
Adrian Roos | d6d253a | 2016-04-13 13:06:21 -0700 | [diff] [blame] | 425 | case PROMPT_REASON_DEVICE_ADMIN: |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 426 | mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_device_admin); |
Adrian Roos | d6d253a | 2016-04-13 13:06:21 -0700 | [diff] [blame] | 427 | break; |
| 428 | case PROMPT_REASON_USER_REQUEST: |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 429 | mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_user_request); |
Adrian Roos | d6d253a | 2016-04-13 13:06:21 -0700 | [diff] [blame] | 430 | break; |
Adrian Roos | c13723f | 2016-01-12 20:29:03 +0100 | [diff] [blame] | 431 | case PROMPT_REASON_NONE: |
| 432 | break; |
Selim Cinek | 3122fa8 | 2015-06-18 01:38:59 -0700 | [diff] [blame] | 433 | default: |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 434 | mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern); |
Jorim Jaggi | 25b4d4b | 2015-08-11 15:54:06 -0700 | [diff] [blame] | 435 | break; |
Selim Cinek | 3122fa8 | 2015-06-18 01:38:59 -0700 | [diff] [blame] | 436 | } |
| 437 | } |
| 438 | |
| 439 | @Override |
Jason Chang | 1e4a4bd | 2018-05-22 17:30:19 +0800 | [diff] [blame] | 440 | public void showMessage(CharSequence message, ColorStateList colorState) { |
Lucas Dupin | 51996bb | 2019-05-16 17:56:43 -0700 | [diff] [blame^] | 441 | if (colorState != null) { |
| 442 | mSecurityMessageDisplay.setNextMessageColor(colorState); |
| 443 | } |
Adrian Roos | db327e9 | 2016-10-12 16:41:28 -0700 | [diff] [blame] | 444 | mSecurityMessageDisplay.setMessage(message); |
Selim Cinek | cfafe4e | 2015-08-11 14:58:44 -0700 | [diff] [blame] | 445 | } |
| 446 | |
| 447 | @Override |
Jorim Jaggi | c14f829 | 2014-05-27 02:25:45 +0200 | [diff] [blame] | 448 | public void startAppearAnimation() { |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 449 | enableClipping(false); |
Jorim Jaggi | fb28c0e | 2014-08-22 16:28:42 +0200 | [diff] [blame] | 450 | setAlpha(1f); |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 451 | setTranslationY(mAppearAnimationUtils.getStartTranslation()); |
Jorim Jaggi | 613f55f | 2015-07-16 15:30:10 -0700 | [diff] [blame] | 452 | AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 500 /* duration */, |
| 453 | 0, mAppearAnimationUtils.getInterpolator()); |
Jorim Jaggi | 5673353 | 2015-06-09 15:25:40 -0700 | [diff] [blame] | 454 | mAppearAnimationUtils.startAnimation2d( |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 455 | mLockPatternView.getCellStates(), |
| 456 | new Runnable() { |
| 457 | @Override |
| 458 | public void run() { |
| 459 | enableClipping(true); |
| 460 | } |
| 461 | }, |
| 462 | this); |
Selim Cinek | 3122fa8 | 2015-06-18 01:38:59 -0700 | [diff] [blame] | 463 | if (!TextUtils.isEmpty(mSecurityMessageDisplay.getText())) { |
| 464 | mAppearAnimationUtils.createAnimation(mSecurityMessageDisplay, 0, |
Jorim Jaggi | 98f8530 | 2014-08-07 17:45:04 +0200 | [diff] [blame] | 465 | AppearAnimationUtils.DEFAULT_APPEAR_DURATION, |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 466 | mAppearAnimationUtils.getStartTranslation(), |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 467 | true /* appearing */, |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 468 | mAppearAnimationUtils.getInterpolator(), |
| 469 | null /* finishRunnable */); |
| 470 | } |
| 471 | } |
| 472 | |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 473 | @Override |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 474 | public boolean startDisappearAnimation(final Runnable finishRunnable) { |
Jorim Jaggi | 031f795 | 2016-09-01 16:39:26 -0700 | [diff] [blame] | 475 | float durationMultiplier = mKeyguardUpdateMonitor.needsSlowUnlockTransition() |
| 476 | ? DISAPPEAR_MULTIPLIER_LOCKED |
| 477 | : 1f; |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 478 | mLockPatternView.clearPattern(); |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 479 | enableClipping(false); |
| 480 | setTranslationY(0); |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 481 | AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, |
| 482 | (long) (300 * durationMultiplier), |
Jorim Jaggi | 613f55f | 2015-07-16 15:30:10 -0700 | [diff] [blame] | 483 | -mDisappearAnimationUtils.getStartTranslation(), |
| 484 | mDisappearAnimationUtils.getInterpolator()); |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 485 | |
Jorim Jaggi | 031f795 | 2016-09-01 16:39:26 -0700 | [diff] [blame] | 486 | DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor |
| 487 | .needsSlowUnlockTransition() |
| 488 | ? mDisappearAnimationUtilsLocked |
| 489 | : mDisappearAnimationUtils; |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 490 | disappearAnimationUtils.startAnimation2d(mLockPatternView.getCellStates(), |
| 491 | () -> { |
| 492 | enableClipping(true); |
| 493 | if (finishRunnable != null) { |
| 494 | finishRunnable.run(); |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 495 | } |
| 496 | }, KeyguardPatternView.this); |
Selim Cinek | 3122fa8 | 2015-06-18 01:38:59 -0700 | [diff] [blame] | 497 | if (!TextUtils.isEmpty(mSecurityMessageDisplay.getText())) { |
| 498 | mDisappearAnimationUtils.createAnimation(mSecurityMessageDisplay, 0, |
Jorim Jaggi | e8fde5d | 2016-06-30 23:41:37 -0700 | [diff] [blame] | 499 | (long) (200 * durationMultiplier), |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 500 | - mDisappearAnimationUtils.getStartTranslation() * 3, |
| 501 | false /* appearing */, |
| 502 | mDisappearAnimationUtils.getInterpolator(), |
| 503 | null /* finishRunnable */); |
| 504 | } |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 505 | return true; |
| 506 | } |
| 507 | |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 508 | private void enableClipping(boolean enable) { |
| 509 | setClipChildren(enable); |
Jorim Jaggi | 6b88cdf | 2014-12-22 20:56:50 +0100 | [diff] [blame] | 510 | mContainer.setClipToPadding(enable); |
| 511 | mContainer.setClipChildren(enable); |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 512 | } |
| 513 | |
| 514 | @Override |
| 515 | public void createAnimation(final LockPatternView.CellState animatedCell, long delay, |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 516 | long duration, float translationY, final boolean appearing, |
| 517 | Interpolator interpolator, |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 518 | final Runnable finishListener) { |
Jorim Jaggi | 613f55f | 2015-07-16 15:30:10 -0700 | [diff] [blame] | 519 | mLockPatternView.startCellStateAnimation(animatedCell, |
| 520 | 1f, appearing ? 1f : 0f, /* alpha */ |
| 521 | appearing ? translationY : 0f, appearing ? 0f : translationY, /* translation */ |
| 522 | appearing ? 0f : 1f, 1f /* scale */, |
| 523 | delay, duration, interpolator, finishListener); |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 524 | if (finishListener != null) { |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 525 | // Also animate the Emergency call |
Selim Cinek | f9c0e8f | 2014-11-11 13:41:02 +0100 | [diff] [blame] | 526 | mAppearAnimationUtils.createAnimation(mEcaView, delay, duration, translationY, |
| 527 | appearing, interpolator, null); |
Selim Cinek | 3018197 | 2014-05-30 03:33:06 +0200 | [diff] [blame] | 528 | } |
Jorim Jaggi | c14f829 | 2014-05-27 02:25:45 +0200 | [diff] [blame] | 529 | } |
Jorim Jaggi | 76a1623 | 2014-08-08 17:00:47 +0200 | [diff] [blame] | 530 | |
| 531 | @Override |
| 532 | public boolean hasOverlappingRendering() { |
| 533 | return false; |
| 534 | } |
Phil Weaver | 7d847b0 | 2018-02-13 16:02:35 -0800 | [diff] [blame] | 535 | |
| 536 | @Override |
| 537 | public CharSequence getTitle() { |
| 538 | return getContext().getString( |
| 539 | com.android.internal.R.string.keyguard_accessibility_pattern_unlock); |
| 540 | } |
Jim Miller | dcb3d84 | 2012-08-23 19:18:12 -0700 | [diff] [blame] | 541 | } |