blob: 2ba1562c39e4ea9a12499bbee971be65942b7383 [file] [log] [blame]
Jorim Jaggi5cf17872014-03-26 18:31:48 +01001/*
2 * Copyright (C) 2014 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 */
16
17package com.android.systemui.statusbar.phone;
18
Jorim Jaggi786afcb2014-09-25 02:41:29 +020019import android.content.ComponentCallbacks2;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010020import android.content.Context;
21import android.os.Bundle;
Jorim Jaggie29b2db2014-05-30 23:17:03 +020022import android.os.SystemClock;
Jorim Jaggi0d210f62015-07-10 14:24:44 -070023import android.os.Trace;
Jorim Jaggidf993512014-05-13 23:06:35 +020024import android.view.KeyEvent;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010025import android.view.View;
26import android.view.ViewGroup;
Jorim Jaggib774e552015-08-24 14:52:45 -070027import android.view.ViewRootImpl;
Jorim Jaggi786afcb2014-09-25 02:41:29 +020028import android.view.WindowManagerGlobal;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010029
Jorim Jaggi5cf17872014-03-26 18:31:48 +010030import com.android.internal.widget.LockPatternUtils;
Adrian Roosb6011622014-05-14 15:52:53 +020031import com.android.keyguard.KeyguardUpdateMonitor;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010032import com.android.keyguard.ViewMediatorCallback;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080033import com.android.systemui.SystemUIFactory;
Jim Miller25d7e512015-03-03 17:12:09 -080034import com.android.systemui.statusbar.CommandQueue;
Adrian Roosd28ccd72016-01-06 15:23:14 +010035import com.android.systemui.statusbar.RemoteInputController;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010036
Jorim Jaggi6b88cdf2014-12-22 20:56:50 +010037import static com.android.keyguard.KeyguardHostView.OnDismissAction;
Adrian Roos7d7090d2014-05-21 13:10:23 +020038
Jorim Jaggi5cf17872014-03-26 18:31:48 +010039/**
40 * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
41 * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
42 * which is in turn, reported to this class by the current
43 * {@link com.android.keyguard.KeyguardViewBase}.
44 */
Adrian Roosd28ccd72016-01-06 15:23:14 +010045public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {
Jorim Jaggi76a16232014-08-08 17:00:47 +020046
47 // When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
48 private static final long HIDE_TIMING_CORRECTION_MS = -3 * 16;
49
Jorim Jaggi416493b2014-09-13 03:57:32 +020050 // Delay for showing the navigation bar when the bouncer appears. This should be kept in sync
51 // with the appear animations of the PIN/pattern/password views.
52 private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
53
Jorim Jaggi007f0e82015-08-14 13:56:01 -070054 private static final long WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS = 200;
55
Jorim Jaggi5cf17872014-03-26 18:31:48 +010056 private static String TAG = "StatusBarKeyguardViewManager";
57
Xiyuan Xia1b30f792016-01-06 08:50:30 -080058 protected final Context mContext;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010059
Xiyuan Xia1b30f792016-01-06 08:50:30 -080060 protected LockPatternUtils mLockPatternUtils;
61 protected ViewMediatorCallback mViewMediatorCallback;
62 protected PhoneStatusBar mPhoneStatusBar;
Jorim Jaggiecc798e2014-05-26 18:14:37 +020063 private ScrimController mScrimController;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -070064 private FingerprintUnlockController mFingerprintUnlockController;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010065
Jorim Jaggi5cf17872014-03-26 18:31:48 +010066 private ViewGroup mContainer;
67 private StatusBarWindowManager mStatusBarWindowManager;
68
Jorim Jaggi0d210f62015-07-10 14:24:44 -070069 private boolean mDeviceInteractive = false;
70 private boolean mScreenTurnedOn;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080071 protected KeyguardBouncer mBouncer;
72 protected boolean mShowing;
73 protected boolean mOccluded;
74 protected boolean mRemoteInputActive;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010075
Xiyuan Xia1b30f792016-01-06 08:50:30 -080076 protected boolean mFirstUpdate = true;
77 protected boolean mLastShowing;
78 protected boolean mLastOccluded;
Adrian Roosb6011622014-05-14 15:52:53 +020079 private boolean mLastBouncerShowing;
80 private boolean mLastBouncerDismissible;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080081 protected boolean mLastRemoteInputActive;
Adrian Roosd28ccd72016-01-06 15:23:14 +010082
Jorim Jaggi746f7fa2014-08-27 17:52:46 +020083 private OnDismissAction mAfterKeyguardGoneAction;
Jorim Jaggi0d210f62015-07-10 14:24:44 -070084 private boolean mDeviceWillWakeUp;
Jorim Jaggi0d210f62015-07-10 14:24:44 -070085 private boolean mDeferScrimFadeOut;
Adrian Roosb6011622014-05-14 15:52:53 +020086
Jorim Jaggi5cf17872014-03-26 18:31:48 +010087 public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
88 LockPatternUtils lockPatternUtils) {
89 mContext = context;
90 mViewMediatorCallback = callback;
91 mLockPatternUtils = lockPatternUtils;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010092 }
93
94 public void registerStatusBar(PhoneStatusBar phoneStatusBar,
Jorim Jaggiecc798e2014-05-26 18:14:37 +020095 ViewGroup container, StatusBarWindowManager statusBarWindowManager,
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -070096 ScrimController scrimController,
97 FingerprintUnlockController fingerprintUnlockController) {
Jorim Jaggi5cf17872014-03-26 18:31:48 +010098 mPhoneStatusBar = phoneStatusBar;
99 mContainer = container;
100 mStatusBarWindowManager = statusBarWindowManager;
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200101 mScrimController = scrimController;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700102 mFingerprintUnlockController = fingerprintUnlockController;
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800103 mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
104 mViewMediatorCallback, mLockPatternUtils, mStatusBarWindowManager, container);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100105 }
106
107 /**
108 * Show the keyguard. Will handle creating and attaching to the view manager
109 * lazily.
110 */
111 public void show(Bundle options) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200112 mShowing = true;
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200113 mStatusBarWindowManager.setKeyguardShowing(true);
Selim Cinekedd32b82015-06-23 22:05:58 -0400114 mScrimController.abortKeyguardFadingOut();
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200115 reset();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100116 }
117
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200118 /**
119 * Shows the notification keyguard or the bouncer depending on
120 * {@link KeyguardBouncer#needsFullscreenBouncer()}.
121 */
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800122 protected void showBouncerOrKeyguard() {
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200123 if (mBouncer.needsFullscreenBouncer()) {
124
125 // The keyguard might be showing (already). So we need to hide it.
126 mPhoneStatusBar.hideKeyguard();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100127 mBouncer.show(true /* resetSecuritySelection */);
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200128 } else {
129 mPhoneStatusBar.showKeyguard();
Jorim Jaggia0be6d52014-05-26 03:01:13 +0200130 mBouncer.hide(false /* destroyView */);
Jorim Jaggi2fbad7b2014-05-26 22:38:00 +0200131 mBouncer.prepare();
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200132 }
133 }
134
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200135 private void showBouncer() {
Adrian Roos0002a452014-07-03 13:46:07 +0200136 if (mShowing) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100137 mBouncer.show(false /* resetSecuritySelection */);
Dan Sandler3806c772014-05-08 14:52:10 -0400138 }
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200139 updateStates();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100140 }
141
Jorim Jaggid9449862015-05-29 14:49:08 -0700142 public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
143 boolean afterKeyguardGone) {
Adrian Roos0002a452014-07-03 13:46:07 +0200144 if (mShowing) {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200145 if (!afterKeyguardGone) {
Jorim Jaggid9449862015-05-29 14:49:08 -0700146 mBouncer.showWithDismissAction(r, cancelAction);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200147 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100148 mBouncer.show(false /* resetSecuritySelection */);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200149 mAfterKeyguardGoneAction = r;
150 }
Adrian Roos7d7090d2014-05-21 13:10:23 +0200151 }
152 updateStates();
153 }
154
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100155 /**
156 * Reset the state of the view.
157 */
158 public void reset() {
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200159 if (mShowing) {
160 if (mOccluded) {
161 mPhoneStatusBar.hideKeyguard();
Adrian Roosd322f1a2015-04-23 15:19:45 -0700162 mPhoneStatusBar.stopWaitingForKeyguardExit();
Jorim Jaggia0be6d52014-05-26 03:01:13 +0200163 mBouncer.hide(false /* destroyView */);
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200164 } else {
165 showBouncerOrKeyguard();
166 }
Selim Cinek1fcafc42015-07-20 14:39:25 -0700167 KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200168 updateStates();
Dan Sandler3806c772014-05-08 14:52:10 -0400169 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100170 }
171
Jorim Jaggi18f18ae2015-09-10 15:48:21 -0700172 public void onStartedGoingToSleep() {
173 mPhoneStatusBar.onStartedGoingToSleep();
174 }
175
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700176 public void onFinishedGoingToSleep() {
177 mDeviceInteractive = false;
Jorim Jaggi50ff3af2015-08-12 18:35:42 -0700178 mPhoneStatusBar.onFinishedGoingToSleep();
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200179 mBouncer.onScreenTurnedOff();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100180 }
181
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700182 public void onStartedWakingUp() {
183 mDeviceInteractive = true;
184 mDeviceWillWakeUp = false;
Jorim Jaggi50ff3af2015-08-12 18:35:42 -0700185 mPhoneStatusBar.onStartedWakingUp();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100186 }
187
Jorim Jaggi93739112015-08-13 15:53:14 -0700188 public void onScreenTurningOn() {
189 mPhoneStatusBar.onScreenTurningOn();
190 }
191
Selim Cinek372d1bd2015-08-14 13:19:37 -0700192 public boolean isScreenTurnedOn() {
193 return mScreenTurnedOn;
194 }
195
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700196 public void onScreenTurnedOn() {
197 mScreenTurnedOn = true;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700198 if (mDeferScrimFadeOut) {
199 mDeferScrimFadeOut = false;
Jorim Jaggiab45a212015-08-20 16:59:44 -0700200 animateScrimControllerKeyguardFadingOut(0, WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS,
201 true /* skipFirstFrame */);
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700202 updateStates();
203 }
Jorim Jaggi50ff3af2015-08-12 18:35:42 -0700204 mPhoneStatusBar.onScreenTurnedOn();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700205 }
206
Adrian Roosd28ccd72016-01-06 15:23:14 +0100207 @Override
208 public void onRemoteInputActive(boolean active) {
209 mRemoteInputActive = active;
210 updateStates();
211 }
212
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700213 public void onScreenTurnedOff() {
214 mScreenTurnedOn = false;
Adrian Roos401caae2016-03-04 13:35:21 -0800215 mPhoneStatusBar.onScreenTurnedOff();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700216 }
217
218 public void notifyDeviceWakeUpRequested() {
219 mDeviceWillWakeUp = !mDeviceInteractive;
Selim Cinekf8fbc2a72015-06-22 16:42:07 -0400220 }
221
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100222 public void verifyUnlock() {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200223 dismiss();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100224 }
225
226 public void setNeedsInput(boolean needsInput) {
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200227 mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100228 }
229
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100230 public void setOccluded(boolean occluded) {
Selim Cinekbaa23272014-07-08 18:01:07 +0200231 if (occluded && !mOccluded && mShowing) {
232 if (mPhoneStatusBar.isInLaunchTransition()) {
233 mOccluded = true;
234 mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
235 new Runnable() {
236 @Override
237 public void run() {
Jorim Jaggi826730a2014-12-08 21:05:13 +0100238 mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
Jorim Jaggifbc88e12014-08-14 23:38:15 +0200239 reset();
Selim Cinekbaa23272014-07-08 18:01:07 +0200240 }
241 });
242 return;
243 }
244 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200245 mOccluded = occluded;
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200246 mStatusBarWindowManager.setKeyguardOccluded(occluded);
Dan Sandler3806c772014-05-08 14:52:10 -0400247 reset();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100248 }
249
Dan Sandler4b22bdf2014-06-05 00:58:02 -0400250 public boolean isOccluded() {
251 return mOccluded;
252 }
253
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100254 /**
Jorim Jaggi76a16232014-08-08 17:00:47 +0200255 * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
256 * security view of the bouncer.
257 *
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200258 * @param finishRunnable the runnable to be run after the animation finished, or {@code null} if
259 * no action should be run
Jorim Jaggi76a16232014-08-08 17:00:47 +0200260 */
261 public void startPreHideAnimation(Runnable finishRunnable) {
262 if (mBouncer.isShowing()) {
263 mBouncer.startPreHideAnimation(finishRunnable);
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200264 } else if (finishRunnable != null) {
Jorim Jaggi76a16232014-08-08 17:00:47 +0200265 finishRunnable.run();
266 }
267 }
268
269 /**
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100270 * Hides the keyguard view
271 */
Selim Cinekbaa23272014-07-08 18:01:07 +0200272 public void hide(long startTime, final long fadeoutDuration) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200273 mShowing = false;
Jorim Jaggi44cf9192014-06-17 19:16:00 -0700274
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200275 long uptimeMillis = SystemClock.uptimeMillis();
Jorim Jaggi76a16232014-08-08 17:00:47 +0200276 long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
Selim Cinekbaa23272014-07-08 18:01:07 +0200277
278 if (mPhoneStatusBar.isInLaunchTransition() ) {
279 mPhoneStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
280 @Override
281 public void run() {
282 mStatusBarWindowManager.setKeyguardShowing(false);
283 mStatusBarWindowManager.setKeyguardFadingAway(true);
Jorim Jaggi76a16232014-08-08 17:00:47 +0200284 mBouncer.hide(true /* destroyView */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200285 updateStates();
286 mScrimController.animateKeyguardFadingOut(
287 PhoneStatusBar.FADE_KEYGUARD_START_DELAY,
Jorim Jaggiab45a212015-08-20 16:59:44 -0700288 PhoneStatusBar.FADE_KEYGUARD_DURATION, null,
289 false /* skipFirstFrame */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200290 }
291 }, new Runnable() {
292 @Override
293 public void run() {
294 mPhoneStatusBar.hideKeyguard();
295 mStatusBarWindowManager.setKeyguardFadingAway(false);
296 mViewMediatorCallback.keyguardGone();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200297 executeAfterKeyguardGoneAction();
Selim Cinekbaa23272014-07-08 18:01:07 +0200298 }
299 });
300 } else {
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700301 if (mFingerprintUnlockController.getMode()
302 == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING) {
303 mFingerprintUnlockController.startKeyguardFadingAway();
Jorim Jaggi90978852015-08-18 19:55:53 -0700304 mPhoneStatusBar.setKeyguardFadingAway(startTime, 0, 240);
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700305 mStatusBarWindowManager.setKeyguardFadingAway(true);
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700306 mPhoneStatusBar.fadeKeyguardWhilePulsing();
Jorim Jaggi90978852015-08-18 19:55:53 -0700307 animateScrimControllerKeyguardFadingOut(0, 240, new Runnable() {
308 @Override
309 public void run() {
310 mPhoneStatusBar.hideKeyguard();
311 }
Jorim Jaggiab45a212015-08-20 16:59:44 -0700312 }, false /* skipFirstFrame */);
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200313 } else {
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700314 mFingerprintUnlockController.startKeyguardFadingAway();
315 mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
316 boolean staying = mPhoneStatusBar.hideKeyguard();
317 if (!staying) {
318 mStatusBarWindowManager.setKeyguardFadingAway(true);
319 if (mFingerprintUnlockController.getMode()
320 == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK) {
321 if (!mScreenTurnedOn) {
322 mDeferScrimFadeOut = true;
323 } else {
324
325 // Screen is already on, don't defer with fading out.
326 animateScrimControllerKeyguardFadingOut(0,
Jorim Jaggiab45a212015-08-20 16:59:44 -0700327 WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS,
328 true /* skipFirstFrame */);
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700329 }
330 } else {
Jorim Jaggiab45a212015-08-20 16:59:44 -0700331 animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration,
332 false /* skipFirstFrame */);
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700333 }
334 } else {
335 mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
336 mPhoneStatusBar.finishKeyguardFadingAway();
337 }
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200338 }
Selim Cinekbaa23272014-07-08 18:01:07 +0200339 mStatusBarWindowManager.setKeyguardShowing(false);
Jorim Jaggi76a16232014-08-08 17:00:47 +0200340 mBouncer.hide(true /* destroyView */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200341 mViewMediatorCallback.keyguardGone();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200342 executeAfterKeyguardGoneAction();
Selim Cinekbaa23272014-07-08 18:01:07 +0200343 updateStates();
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200344 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100345 }
346
Jorim Jaggiab45a212015-08-20 16:59:44 -0700347 private void animateScrimControllerKeyguardFadingOut(long delay, long duration,
348 boolean skipFirstFrame) {
349 animateScrimControllerKeyguardFadingOut(delay, duration, null /* endRunnable */,
350 skipFirstFrame);
Jorim Jaggi90978852015-08-18 19:55:53 -0700351 }
352
353 private void animateScrimControllerKeyguardFadingOut(long delay, long duration,
Jorim Jaggiab45a212015-08-20 16:59:44 -0700354 final Runnable endRunnable, boolean skipFirstFrame) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700355 Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "Fading out", 0);
356 mScrimController.animateKeyguardFadingOut(delay, duration, new Runnable() {
357 @Override
358 public void run() {
Jorim Jaggi90978852015-08-18 19:55:53 -0700359 if (endRunnable != null) {
360 endRunnable.run();
361 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700362 mStatusBarWindowManager.setKeyguardFadingAway(false);
363 mPhoneStatusBar.finishKeyguardFadingAway();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700364 mFingerprintUnlockController.finishKeyguardFadingAway();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700365 WindowManagerGlobal.getInstance().trimMemory(
366 ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
367 Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0);
368 }
Jorim Jaggiab45a212015-08-20 16:59:44 -0700369 }, skipFirstFrame);
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700370 }
371
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200372 private void executeAfterKeyguardGoneAction() {
373 if (mAfterKeyguardGoneAction != null) {
374 mAfterKeyguardGoneAction.onDismiss();
375 mAfterKeyguardGoneAction = null;
376 }
377 }
378
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100379 /**
380 * Dismisses the keyguard by going to the next screen or making it gone.
381 */
382 public void dismiss() {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700383 if (mDeviceInteractive || mDeviceWillWakeUp) {
Jorim Jaggi0bed7f22014-04-03 16:12:54 +0200384 showBouncer();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100385 }
386 }
387
Christoph Studer2231c6e2014-12-19 12:40:13 +0100388 /**
389 * WARNING: This method might cause Binder calls.
390 */
Jorim Jaggi15682502014-04-23 12:01:36 +0200391 public boolean isSecure() {
392 return mBouncer.isSecure();
393 }
394
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100395 /**
396 * @return Whether the keyguard is showing
397 */
398 public boolean isShowing() {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200399 return mShowing;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100400 }
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200401
402 /**
403 * Notifies this manager that the back button has been pressed.
404 *
405 * @return whether the back press has been handled
406 */
407 public boolean onBackPressed() {
408 if (mBouncer.isShowing()) {
Selim Cinek372d1bd2015-08-14 13:19:37 -0700409 mPhoneStatusBar.endAffordanceLaunch();
Jorim Jaggi6bad2442014-08-26 15:16:57 +0200410 reset();
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200411 return true;
412 }
413 return false;
414 }
415
Jim Millerf41fc962014-06-18 16:33:51 -0700416 public boolean isBouncerShowing() {
417 return mBouncer.isShowing();
418 }
419
Jorim Jaggi416493b2014-09-13 03:57:32 +0200420 private long getNavBarShowDelay() {
421 if (mPhoneStatusBar.isKeyguardFadingAway()) {
422 return mPhoneStatusBar.getKeyguardFadingAwayDelay();
423 } else {
424
425 // Keyguard is not going away, thus we are showing the navigation bar because the
426 // bouncer is appearing.
427 return NAV_BAR_SHOW_DELAY_BOUNCER;
428 }
429 }
430
431 private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
432 @Override
433 public void run() {
434 mPhoneStatusBar.getNavigationBarView().setVisibility(View.VISIBLE);
435 }
436 };
437
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800438 protected void updateStates() {
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200439 int vis = mContainer.getSystemUiVisibility();
Adrian Roosb6011622014-05-14 15:52:53 +0200440 boolean showing = mShowing;
441 boolean occluded = mOccluded;
442 boolean bouncerShowing = mBouncer.isShowing();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100443 boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
Adrian Roosd28ccd72016-01-06 15:23:14 +0100444 boolean remoteInputActive = mRemoteInputActive;
Adrian Roosb6011622014-05-14 15:52:53 +0200445
Adrian Roosd28ccd72016-01-06 15:23:14 +0100446 if ((bouncerDismissible || !showing || remoteInputActive) !=
447 (mLastBouncerDismissible || !mLastShowing || mLastRemoteInputActive)
Adrian Roosb6011622014-05-14 15:52:53 +0200448 || mFirstUpdate) {
Adrian Roosd28ccd72016-01-06 15:23:14 +0100449 if (bouncerDismissible || !showing || remoteInputActive) {
Adrian Roosb6011622014-05-14 15:52:53 +0200450 mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400451 } else {
Adrian Roosb6011622014-05-14 15:52:53 +0200452 mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400453 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200454 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700455
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800456 boolean navBarVisible = isNavBarVisible();
457 boolean lastNavBarVisible = getLastNavBarVisible();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700458 if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
Adrian Roosb6011622014-05-14 15:52:53 +0200459 if (mPhoneStatusBar.getNavigationBarView() != null) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700460 if (navBarVisible) {
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700461 long delay = getNavBarShowDelay();
462 if (delay == 0) {
463 mMakeNavigationBarVisibleRunnable.run();
464 } else {
465 mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
466 delay);
467 }
Adrian Roosb6011622014-05-14 15:52:53 +0200468 } else {
Jorim Jaggi416493b2014-09-13 03:57:32 +0200469 mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
Adrian Roosb6011622014-05-14 15:52:53 +0200470 mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE);
471 }
472 }
473 }
474
475 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
476 mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
477 mPhoneStatusBar.setBouncerShowing(bouncerShowing);
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200478 mScrimController.setBouncerShowing(bouncerShowing);
Adrian Roosb6011622014-05-14 15:52:53 +0200479 }
480
481 KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
482 if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
Jorim Jaggi6a15d522015-09-22 15:55:33 -0700483 updateMonitor.onKeyguardVisibilityChanged(showing && !occluded);
Adrian Roosb6011622014-05-14 15:52:53 +0200484 }
485 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
486 updateMonitor.sendKeyguardBouncerChanged(bouncerShowing);
487 }
488
489 mFirstUpdate = false;
490 mLastShowing = showing;
491 mLastOccluded = occluded;
492 mLastBouncerShowing = bouncerShowing;
493 mLastBouncerDismissible = bouncerDismissible;
Adrian Roosd28ccd72016-01-06 15:23:14 +0100494 mLastRemoteInputActive = remoteInputActive;
Christoph Studer2231c6e2014-12-19 12:40:13 +0100495
496 mPhoneStatusBar.onKeyguardViewManagerStatesUpdated();
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200497 }
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200498
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800499 /**
500 * @return Whether the navigation bar should be made visible based on the current state.
501 */
502 protected boolean isNavBarVisible() {
503 return !(mShowing && !mOccluded) || mBouncer.isShowing() || mRemoteInputActive;
504 }
505
506 /**
507 * @return Whether the navigation bar was made visible based on the last known state.
508 */
509 protected boolean getLastNavBarVisible() {
510 return !(mLastShowing && !mLastOccluded) || mLastBouncerShowing || mLastRemoteInputActive;
511 }
512
Selim Cinek28540192016-02-19 17:25:08 -0800513 public boolean shouldDismissOnMenuPressed() {
514 return mBouncer.shouldDismissOnMenuPressed();
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200515 }
Jorim Jaggidf993512014-05-13 23:06:35 +0200516
517 public boolean interceptMediaKey(KeyEvent event) {
518 return mBouncer.interceptMediaKey(event);
519 }
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200520
521 public void onActivityDrawn() {
522 if (mPhoneStatusBar.isCollapsing()) {
523 mPhoneStatusBar.addPostCollapseAction(new Runnable() {
524 @Override
525 public void run() {
526 mViewMediatorCallback.readyForKeyguardDone();
527 }
528 });
529 } else {
530 mViewMediatorCallback.readyForKeyguardDone();
531 }
532 }
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200533
534 public boolean shouldDisableWindowAnimationsForUnlock() {
535 return mPhoneStatusBar.isInLaunchTransition();
536 }
537
538 public boolean isGoingToNotificationShade() {
539 return mPhoneStatusBar.isGoingToNotificationShade();
540 }
Adrian Roos31b844b2014-11-21 13:55:09 +0100541
542 public boolean isSecure(int userId) {
543 return mBouncer.isSecure() || mLockPatternUtils.isSecure(userId);
544 }
Jim Millerab954542014-10-10 18:21:49 -0700545
546 public boolean isInputRestricted() {
547 return mViewMediatorCallback.isInputRestricted();
548 }
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100549
550 public void keyguardGoingAway() {
551 mPhoneStatusBar.keyguardGoingAway();
552 }
Jim Miller25d7e512015-03-03 17:12:09 -0800553
Jorim Jaggif3b3bee2015-04-16 14:57:34 -0700554 public void animateCollapsePanels(float speedUpFactor) {
555 mPhoneStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
556 false /* delayed */, speedUpFactor);
Jim Miller25d7e512015-03-03 17:12:09 -0800557 }
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700558
559 /**
560 * Notifies that the user has authenticated by other means than using the bouncer, for example,
561 * fingerprint.
562 */
Jorim Jaggi25b4d4b2015-08-11 15:54:06 -0700563 public void notifyKeyguardAuthenticated(boolean strongAuth) {
564 mBouncer.notifyKeyguardAuthenticated(strongAuth);
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700565 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700566
Selim Cinekcfafe4e2015-08-11 14:58:44 -0700567 public void showBouncerMessage(String message, int color) {
568 mBouncer.showMessage(message, color);
569 }
Jorim Jaggib774e552015-08-24 14:52:45 -0700570
571 public ViewRootImpl getViewRootImpl() {
572 return mPhoneStatusBar.getStatusBarView().getViewRootImpl();
573 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100574}