blob: 47c469208d92eafec78042b1e53b77b348514d6b [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 Jaggia9d7fcd2017-05-18 01:08:12 +020032import com.android.keyguard.KeyguardUpdateMonitorCallback;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010033import com.android.keyguard.ViewMediatorCallback;
Jorim Jaggi8adb30c2016-09-13 15:02:22 -070034import com.android.systemui.DejankUtils;
Jorim Jaggid0565172016-09-15 16:31:14 -070035import com.android.keyguard.LatencyTracker;
Jason Monk421a9412017-02-06 09:15:21 -080036import com.android.systemui.Dependency;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080037import com.android.systemui.SystemUIFactory;
Jorim Jaggi241ae102016-11-02 21:57:33 -070038import com.android.systemui.keyguard.DismissCallbackRegistry;
Jim Miller25d7e512015-03-03 17:12:09 -080039import com.android.systemui.statusbar.CommandQueue;
Adrian Roosd28ccd72016-01-06 15:23:14 +010040import com.android.systemui.statusbar.RemoteInputController;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010041
Jorim Jaggi6b88cdf2014-12-22 20:56:50 +010042import static com.android.keyguard.KeyguardHostView.OnDismissAction;
Jorim Jaggi8adb30c2016-09-13 15:02:22 -070043import static com.android.systemui.statusbar.phone.FingerprintUnlockController.*;
Adrian Roos7d7090d2014-05-21 13:10:23 +020044
Jorim Jaggibcbe9482016-11-23 17:37:49 +010045import java.util.ArrayList;
46
Jorim Jaggi5cf17872014-03-26 18:31:48 +010047/**
48 * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
49 * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
50 * which is in turn, reported to this class by the current
51 * {@link com.android.keyguard.KeyguardViewBase}.
52 */
Adrian Roosd28ccd72016-01-06 15:23:14 +010053public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {
Jorim Jaggi76a16232014-08-08 17:00:47 +020054
55 // When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
Jorim Jaggi56fd70c2016-10-27 19:57:08 -070056 private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3;
Jorim Jaggi76a16232014-08-08 17:00:47 +020057
Jorim Jaggi416493b2014-09-13 03:57:32 +020058 // Delay for showing the navigation bar when the bouncer appears. This should be kept in sync
59 // with the appear animations of the PIN/pattern/password views.
60 private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
61
Jorim Jaggi007f0e82015-08-14 13:56:01 -070062 private static final long WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS = 200;
63
Jorim Jaggie8fde5d2016-06-30 23:41:37 -070064 // Duration of the Keyguard dismissal animation in case the user is currently locked. This is to
65 // make everything a bit slower to bridge a gap until the user is unlocked and home screen has
66 // dranw its first frame.
67 private static final long KEYGUARD_DISMISS_DURATION_LOCKED = 2000;
68
Jorim Jaggi5cf17872014-03-26 18:31:48 +010069 private static String TAG = "StatusBarKeyguardViewManager";
70
Xiyuan Xia1b30f792016-01-06 08:50:30 -080071 protected final Context mContext;
Jason Monk421a9412017-02-06 09:15:21 -080072 private final StatusBarWindowManager mStatusBarWindowManager;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010073
Xiyuan Xia1b30f792016-01-06 08:50:30 -080074 protected LockPatternUtils mLockPatternUtils;
75 protected ViewMediatorCallback mViewMediatorCallback;
Jason Monk2a6ea9c2017-01-26 11:14:51 -050076 protected StatusBar mStatusBar;
Jorim Jaggiecc798e2014-05-26 18:14:37 +020077 private ScrimController mScrimController;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -070078 private FingerprintUnlockController mFingerprintUnlockController;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010079
Jorim Jaggi5cf17872014-03-26 18:31:48 +010080 private ViewGroup mContainer;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010081
Jorim Jaggi0d210f62015-07-10 14:24:44 -070082 private boolean mDeviceInteractive = false;
83 private boolean mScreenTurnedOn;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080084 protected KeyguardBouncer mBouncer;
85 protected boolean mShowing;
86 protected boolean mOccluded;
87 protected boolean mRemoteInputActive;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010088
Xiyuan Xia1b30f792016-01-06 08:50:30 -080089 protected boolean mFirstUpdate = true;
90 protected boolean mLastShowing;
91 protected boolean mLastOccluded;
Adrian Roosb6011622014-05-14 15:52:53 +020092 private boolean mLastBouncerShowing;
93 private boolean mLastBouncerDismissible;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080094 protected boolean mLastRemoteInputActive;
Jorim Jaggi67b29d52017-06-09 18:00:00 -070095 private boolean mLastDeferScrimFadeOut;
Adrian Roosd28ccd72016-01-06 15:23:14 +010096
Jorim Jaggi746f7fa2014-08-27 17:52:46 +020097 private OnDismissAction mAfterKeyguardGoneAction;
Jorim Jaggibcbe9482016-11-23 17:37:49 +010098 private final ArrayList<Runnable> mAfterKeyguardGoneRunnables = new ArrayList<>();
Jorim Jaggi0d210f62015-07-10 14:24:44 -070099 private boolean mDeviceWillWakeUp;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700100 private boolean mDeferScrimFadeOut;
Adrian Roosb6011622014-05-14 15:52:53 +0200101
Jorim Jaggia9d7fcd2017-05-18 01:08:12 +0200102 private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
103 new KeyguardUpdateMonitorCallback() {
104 @Override
105 public void onEmergencyCallAction() {
106
107 // Since we won't get a setOccluded call we have to reset the view manually such that
108 // the bouncer goes away.
109 if (mOccluded) {
110 reset(false /* hideBouncerWhenShowing */);
111 }
112 }
113 };
114
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100115 public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
116 LockPatternUtils lockPatternUtils) {
117 mContext = context;
118 mViewMediatorCallback = callback;
119 mLockPatternUtils = lockPatternUtils;
Jason Monk421a9412017-02-06 09:15:21 -0800120 mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
Jorim Jaggia9d7fcd2017-05-18 01:08:12 +0200121 KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitorCallback);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100122 }
123
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500124 public void registerStatusBar(StatusBar statusBar,
Jason Monk421a9412017-02-06 09:15:21 -0800125 ViewGroup container,
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700126 ScrimController scrimController,
Jorim Jaggi241ae102016-11-02 21:57:33 -0700127 FingerprintUnlockController fingerprintUnlockController,
128 DismissCallbackRegistry dismissCallbackRegistry) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500129 mStatusBar = statusBar;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100130 mContainer = container;
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200131 mScrimController = scrimController;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700132 mFingerprintUnlockController = fingerprintUnlockController;
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800133 mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
Jorim Jaggi241ae102016-11-02 21:57:33 -0700134 mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100135 }
136
137 /**
138 * Show the keyguard. Will handle creating and attaching to the view manager
139 * lazily.
140 */
141 public void show(Bundle options) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200142 mShowing = true;
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200143 mStatusBarWindowManager.setKeyguardShowing(true);
Selim Cinekedd32b82015-06-23 22:05:58 -0400144 mScrimController.abortKeyguardFadingOut();
Jorim Jaggife762342016-10-13 14:33:27 +0200145 reset(true /* hideBouncerWhenShowing */);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100146 }
147
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200148 /**
149 * Shows the notification keyguard or the bouncer depending on
150 * {@link KeyguardBouncer#needsFullscreenBouncer()}.
151 */
Jorim Jaggife762342016-10-13 14:33:27 +0200152 protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) {
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200153 if (mBouncer.needsFullscreenBouncer()) {
154
155 // The keyguard might be showing (already). So we need to hide it.
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500156 mStatusBar.hideKeyguard();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100157 mBouncer.show(true /* resetSecuritySelection */);
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200158 } else {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500159 mStatusBar.showKeyguard();
Jorim Jaggife762342016-10-13 14:33:27 +0200160 if (hideBouncerWhenShowing) {
161 mBouncer.hide(false /* destroyView */);
162 mBouncer.prepare();
163 }
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200164 }
165 }
166
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200167 private void showBouncer() {
Adrian Roos0002a452014-07-03 13:46:07 +0200168 if (mShowing) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100169 mBouncer.show(false /* resetSecuritySelection */);
Dan Sandler3806c772014-05-08 14:52:10 -0400170 }
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200171 updateStates();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100172 }
173
Jorim Jaggid9449862015-05-29 14:49:08 -0700174 public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
175 boolean afterKeyguardGone) {
Adrian Roos0002a452014-07-03 13:46:07 +0200176 if (mShowing) {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200177 if (!afterKeyguardGone) {
Jorim Jaggid9449862015-05-29 14:49:08 -0700178 mBouncer.showWithDismissAction(r, cancelAction);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200179 } else {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200180 mAfterKeyguardGoneAction = r;
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700181 mBouncer.show(false /* resetSecuritySelection */);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200182 }
Adrian Roos7d7090d2014-05-21 13:10:23 +0200183 }
184 updateStates();
185 }
186
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100187 /**
Jorim Jaggibcbe9482016-11-23 17:37:49 +0100188 * Adds a {@param runnable} to be executed after Keyguard is gone.
189 */
190 public void addAfterKeyguardGoneRunnable(Runnable runnable) {
191 mAfterKeyguardGoneRunnables.add(runnable);
192 }
193
194 /**
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100195 * Reset the state of the view.
196 */
Jorim Jaggife762342016-10-13 14:33:27 +0200197 public void reset(boolean hideBouncerWhenShowing) {
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200198 if (mShowing) {
199 if (mOccluded) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500200 mStatusBar.hideKeyguard();
201 mStatusBar.stopWaitingForKeyguardExit();
Jorim Jaggia0be6d52014-05-26 03:01:13 +0200202 mBouncer.hide(false /* destroyView */);
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200203 } else {
Jorim Jaggife762342016-10-13 14:33:27 +0200204 showBouncerOrKeyguard(hideBouncerWhenShowing);
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200205 }
Selim Cinek1fcafc42015-07-20 14:39:25 -0700206 KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200207 updateStates();
Dan Sandler3806c772014-05-08 14:52:10 -0400208 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100209 }
210
Jorim Jaggi18f18ae2015-09-10 15:48:21 -0700211 public void onStartedGoingToSleep() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500212 mStatusBar.onStartedGoingToSleep();
Jorim Jaggi18f18ae2015-09-10 15:48:21 -0700213 }
214
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700215 public void onFinishedGoingToSleep() {
216 mDeviceInteractive = false;
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500217 mStatusBar.onFinishedGoingToSleep();
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200218 mBouncer.onScreenTurnedOff();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100219 }
220
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700221 public void onStartedWakingUp() {
Nick Desaulniers1d396752016-07-25 15:05:33 -0700222 Trace.beginSection("StatusBarKeyguardViewManager#onStartedWakingUp");
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700223 mDeviceInteractive = true;
224 mDeviceWillWakeUp = false;
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500225 mStatusBar.onStartedWakingUp();
Nick Desaulniers1d396752016-07-25 15:05:33 -0700226 Trace.endSection();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100227 }
228
Jorim Jaggi93739112015-08-13 15:53:14 -0700229 public void onScreenTurningOn() {
Nick Desaulniers1d396752016-07-25 15:05:33 -0700230 Trace.beginSection("StatusBarKeyguardViewManager#onScreenTurningOn");
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500231 mStatusBar.onScreenTurningOn();
Nick Desaulniers1d396752016-07-25 15:05:33 -0700232 Trace.endSection();
Jorim Jaggi93739112015-08-13 15:53:14 -0700233 }
234
Selim Cinek372d1bd2015-08-14 13:19:37 -0700235 public boolean isScreenTurnedOn() {
236 return mScreenTurnedOn;
237 }
238
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700239 public void onScreenTurnedOn() {
Nick Desaulniers1d396752016-07-25 15:05:33 -0700240 Trace.beginSection("StatusBarKeyguardViewManager#onScreenTurnedOn");
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700241 mScreenTurnedOn = true;
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700242 if (mDeferScrimFadeOut) {
243 mDeferScrimFadeOut = false;
Jorim Jaggiab45a212015-08-20 16:59:44 -0700244 animateScrimControllerKeyguardFadingOut(0, WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS,
245 true /* skipFirstFrame */);
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700246 updateStates();
247 }
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500248 mStatusBar.onScreenTurnedOn();
Nick Desaulniers1d396752016-07-25 15:05:33 -0700249 Trace.endSection();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700250 }
251
Adrian Roosd28ccd72016-01-06 15:23:14 +0100252 @Override
253 public void onRemoteInputActive(boolean active) {
254 mRemoteInputActive = active;
255 updateStates();
256 }
257
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700258 public void onScreenTurnedOff() {
259 mScreenTurnedOn = false;
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500260 mStatusBar.onScreenTurnedOff();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700261 }
262
263 public void notifyDeviceWakeUpRequested() {
264 mDeviceWillWakeUp = !mDeviceInteractive;
Selim Cinekf8fbc2a72015-06-22 16:42:07 -0400265 }
266
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100267 public void setNeedsInput(boolean needsInput) {
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200268 mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100269 }
270
Adrian Roosd5c2db62016-03-08 16:11:31 -0800271 public boolean isUnlockWithWallpaper() {
272 return mStatusBarWindowManager.isShowingWallpaper();
273 }
274
Jorim Jaggi6626f542016-08-22 13:08:44 -0700275 public void setOccluded(boolean occluded, boolean animate) {
Vadim Tryshev9ef8a512016-04-07 14:27:46 -0700276 if (occluded != mOccluded) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500277 mStatusBar.onKeyguardOccludedChanged(occluded);
Vadim Tryshev9ef8a512016-04-07 14:27:46 -0700278 }
Selim Cinekbaa23272014-07-08 18:01:07 +0200279 if (occluded && !mOccluded && mShowing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500280 if (mStatusBar.isInLaunchTransition()) {
Selim Cinekbaa23272014-07-08 18:01:07 +0200281 mOccluded = true;
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500282 mStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
Selim Cinekbaa23272014-07-08 18:01:07 +0200283 new Runnable() {
284 @Override
285 public void run() {
Jorim Jaggi826730a2014-12-08 21:05:13 +0100286 mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
Jorim Jaggife762342016-10-13 14:33:27 +0200287 reset(true /* hideBouncerWhenShowing */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200288 }
289 });
290 return;
291 }
292 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200293 mOccluded = occluded;
Adrian Roos909fe2d2016-10-12 12:03:24 -0700294 if (mShowing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500295 mStatusBar.updateMediaMetaData(false, animate && !occluded);
Adrian Roos909fe2d2016-10-12 12:03:24 -0700296 }
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200297 mStatusBarWindowManager.setKeyguardOccluded(occluded);
Jorim Jaggife762342016-10-13 14:33:27 +0200298
299 // If Keyguard is reshown, don't hide the bouncer as it might just have been requested by
300 // a FLAG_DISMISS_KEYGUARD_ACTIVITY.
301 reset(false /* hideBouncerWhenShowing*/);
Adrian Roos909fe2d2016-10-12 12:03:24 -0700302 if (animate && !occluded && mShowing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500303 mStatusBar.animateKeyguardUnoccluding();
Jorim Jaggi6626f542016-08-22 13:08:44 -0700304 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100305 }
306
Dan Sandler4b22bdf2014-06-05 00:58:02 -0400307 public boolean isOccluded() {
308 return mOccluded;
309 }
310
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100311 /**
Jorim Jaggi76a16232014-08-08 17:00:47 +0200312 * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
313 * security view of the bouncer.
314 *
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200315 * @param finishRunnable the runnable to be run after the animation finished, or {@code null} if
316 * no action should be run
Jorim Jaggi76a16232014-08-08 17:00:47 +0200317 */
318 public void startPreHideAnimation(Runnable finishRunnable) {
319 if (mBouncer.isShowing()) {
320 mBouncer.startPreHideAnimation(finishRunnable);
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200321 } else if (finishRunnable != null) {
Jorim Jaggi76a16232014-08-08 17:00:47 +0200322 finishRunnable.run();
323 }
324 }
325
326 /**
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100327 * Hides the keyguard view
328 */
Jorim Jaggie8fde5d2016-06-30 23:41:37 -0700329 public void hide(long startTime, long fadeoutDuration) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200330 mShowing = false;
Jorim Jaggi44cf9192014-06-17 19:16:00 -0700331
Jorim Jaggi031f7952016-09-01 16:39:26 -0700332 if (KeyguardUpdateMonitor.getInstance(mContext).needsSlowUnlockTransition()) {
Jorim Jaggie8fde5d2016-06-30 23:41:37 -0700333 fadeoutDuration = KEYGUARD_DISMISS_DURATION_LOCKED;
334 }
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200335 long uptimeMillis = SystemClock.uptimeMillis();
Jorim Jaggi76a16232014-08-08 17:00:47 +0200336 long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
Selim Cinekbaa23272014-07-08 18:01:07 +0200337
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500338 if (mStatusBar.isInLaunchTransition() ) {
339 mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
Selim Cinekbaa23272014-07-08 18:01:07 +0200340 @Override
341 public void run() {
342 mStatusBarWindowManager.setKeyguardShowing(false);
343 mStatusBarWindowManager.setKeyguardFadingAway(true);
Jorim Jaggi76a16232014-08-08 17:00:47 +0200344 mBouncer.hide(true /* destroyView */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200345 updateStates();
346 mScrimController.animateKeyguardFadingOut(
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500347 StatusBar.FADE_KEYGUARD_START_DELAY,
348 StatusBar.FADE_KEYGUARD_DURATION, null,
Jorim Jaggiab45a212015-08-20 16:59:44 -0700349 false /* skipFirstFrame */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200350 }
351 }, new Runnable() {
352 @Override
353 public void run() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500354 mStatusBar.hideKeyguard();
Selim Cinekbaa23272014-07-08 18:01:07 +0200355 mStatusBarWindowManager.setKeyguardFadingAway(false);
356 mViewMediatorCallback.keyguardGone();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200357 executeAfterKeyguardGoneAction();
Selim Cinekbaa23272014-07-08 18:01:07 +0200358 }
359 });
360 } else {
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700361 executeAfterKeyguardGoneAction();
Jorim Jaggie93698b2016-11-11 18:24:38 -0800362 boolean wakeUnlockPulsing =
363 mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING;
364 if (wakeUnlockPulsing) {
365 delay = 0;
366 fadeoutDuration = 240;
367 }
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500368 mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
Jorim Jaggie93698b2016-11-11 18:24:38 -0800369 mFingerprintUnlockController.startKeyguardFadingAway();
370 mBouncer.hide(true /* destroyView */);
Jorim Jaggie93698b2016-11-11 18:24:38 -0800371 if (wakeUnlockPulsing) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700372 mStatusBarWindowManager.setKeyguardFadingAway(true);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500373 mStatusBar.fadeKeyguardWhilePulsing();
Jorim Jaggie93698b2016-11-11 18:24:38 -0800374 animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration,
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500375 mStatusBar::hideKeyguard, false /* skipFirstFrame */);
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200376 } else {
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700377 mFingerprintUnlockController.startKeyguardFadingAway();
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500378 mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
379 boolean staying = mStatusBar.hideKeyguard();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700380 if (!staying) {
381 mStatusBarWindowManager.setKeyguardFadingAway(true);
Jorim Jaggi8adb30c2016-09-13 15:02:22 -0700382 if (mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK) {
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700383 if (!mScreenTurnedOn) {
384 mDeferScrimFadeOut = true;
385 } else {
386
387 // Screen is already on, don't defer with fading out.
388 animateScrimControllerKeyguardFadingOut(0,
Jorim Jaggiab45a212015-08-20 16:59:44 -0700389 WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS,
390 true /* skipFirstFrame */);
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700391 }
392 } else {
Jorim Jaggiab45a212015-08-20 16:59:44 -0700393 animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration,
394 false /* skipFirstFrame */);
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700395 }
396 } else {
397 mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500398 mStatusBar.finishKeyguardFadingAway();
Adrian Roos88e61aa2017-05-23 16:16:50 -0700399 mFingerprintUnlockController.finishKeyguardFadingAway();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700400 }
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200401 }
Jorim Jaggi67b29d52017-06-09 18:00:00 -0700402 updateStates();
Selim Cinekbaa23272014-07-08 18:01:07 +0200403 mStatusBarWindowManager.setKeyguardShowing(false);
Selim Cinekbaa23272014-07-08 18:01:07 +0200404 mViewMediatorCallback.keyguardGone();
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200405 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100406 }
407
Selim Cinekaa8bbf12016-05-04 14:13:20 -0700408 public void onDensityOrFontScaleChanged() {
409 mBouncer.hide(true /* destroyView */);
410 }
411
Jorim Jaggiab45a212015-08-20 16:59:44 -0700412 private void animateScrimControllerKeyguardFadingOut(long delay, long duration,
413 boolean skipFirstFrame) {
414 animateScrimControllerKeyguardFadingOut(delay, duration, null /* endRunnable */,
415 skipFirstFrame);
Jorim Jaggi90978852015-08-18 19:55:53 -0700416 }
417
418 private void animateScrimControllerKeyguardFadingOut(long delay, long duration,
Jorim Jaggiab45a212015-08-20 16:59:44 -0700419 final Runnable endRunnable, boolean skipFirstFrame) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700420 Trace.asyncTraceBegin(Trace.TRACE_TAG_VIEW, "Fading out", 0);
421 mScrimController.animateKeyguardFadingOut(delay, duration, new Runnable() {
422 @Override
423 public void run() {
Jorim Jaggi90978852015-08-18 19:55:53 -0700424 if (endRunnable != null) {
425 endRunnable.run();
426 }
Jorim Jaggi56fd70c2016-10-27 19:57:08 -0700427 mContainer.postDelayed(() -> mStatusBarWindowManager.setKeyguardFadingAway(false),
428 100);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500429 mStatusBar.finishKeyguardFadingAway();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700430 mFingerprintUnlockController.finishKeyguardFadingAway();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700431 WindowManagerGlobal.getInstance().trimMemory(
432 ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
433 Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0);
434 }
Jorim Jaggiab45a212015-08-20 16:59:44 -0700435 }, skipFirstFrame);
Jorim Jaggi8adb30c2016-09-13 15:02:22 -0700436 if (mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK
437 && LatencyTracker.isEnabled(mContext)) {
438 DejankUtils.postAfterTraversal(() ->
439 LatencyTracker.getInstance(mContext).onActionEnd(
440 LatencyTracker.ACTION_FINGERPRINT_WAKE_AND_UNLOCK));
441 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700442 }
443
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200444 private void executeAfterKeyguardGoneAction() {
445 if (mAfterKeyguardGoneAction != null) {
446 mAfterKeyguardGoneAction.onDismiss();
447 mAfterKeyguardGoneAction = null;
448 }
Jorim Jaggibcbe9482016-11-23 17:37:49 +0100449 for (int i = 0; i < mAfterKeyguardGoneRunnables.size(); i++) {
450 mAfterKeyguardGoneRunnables.get(i).run();
451 }
452 mAfterKeyguardGoneRunnables.clear();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200453 }
454
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100455 /**
456 * Dismisses the keyguard by going to the next screen or making it gone.
457 */
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700458 public void dismissAndCollapse() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500459 mStatusBar.executeRunnableDismissingKeyguard(null, null, true, false, true);
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700460 }
461
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100462 public void dismiss() {
Jorim Jaggife762342016-10-13 14:33:27 +0200463 showBouncer();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100464 }
465
Christoph Studer2231c6e2014-12-19 12:40:13 +0100466 /**
467 * WARNING: This method might cause Binder calls.
468 */
Jorim Jaggi15682502014-04-23 12:01:36 +0200469 public boolean isSecure() {
470 return mBouncer.isSecure();
471 }
472
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100473 /**
474 * @return Whether the keyguard is showing
475 */
476 public boolean isShowing() {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200477 return mShowing;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100478 }
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200479
480 /**
481 * Notifies this manager that the back button has been pressed.
482 *
483 * @return whether the back press has been handled
484 */
485 public boolean onBackPressed() {
486 if (mBouncer.isShowing()) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500487 mStatusBar.endAffordanceLaunch();
Jorim Jaggife762342016-10-13 14:33:27 +0200488 reset(true /* hideBouncerWhenShowing */);
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200489 return true;
490 }
491 return false;
492 }
493
Jim Millerf41fc962014-06-18 16:33:51 -0700494 public boolean isBouncerShowing() {
495 return mBouncer.isShowing();
496 }
497
Jorim Jaggi416493b2014-09-13 03:57:32 +0200498 private long getNavBarShowDelay() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500499 if (mStatusBar.isKeyguardFadingAway()) {
500 return mStatusBar.getKeyguardFadingAwayDelay();
Jorim Jaggi416493b2014-09-13 03:57:32 +0200501 } else {
502
503 // Keyguard is not going away, thus we are showing the navigation bar because the
504 // bouncer is appearing.
505 return NAV_BAR_SHOW_DELAY_BOUNCER;
506 }
507 }
508
509 private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
510 @Override
511 public void run() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500512 mStatusBar.getNavigationBarView().getRootView().setVisibility(View.VISIBLE);
Jorim Jaggi416493b2014-09-13 03:57:32 +0200513 }
514 };
515
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800516 protected void updateStates() {
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200517 int vis = mContainer.getSystemUiVisibility();
Adrian Roosb6011622014-05-14 15:52:53 +0200518 boolean showing = mShowing;
519 boolean occluded = mOccluded;
520 boolean bouncerShowing = mBouncer.isShowing();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100521 boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
Adrian Roosd28ccd72016-01-06 15:23:14 +0100522 boolean remoteInputActive = mRemoteInputActive;
Adrian Roosb6011622014-05-14 15:52:53 +0200523
Adrian Roosd28ccd72016-01-06 15:23:14 +0100524 if ((bouncerDismissible || !showing || remoteInputActive) !=
525 (mLastBouncerDismissible || !mLastShowing || mLastRemoteInputActive)
Adrian Roosb6011622014-05-14 15:52:53 +0200526 || mFirstUpdate) {
Adrian Roosd28ccd72016-01-06 15:23:14 +0100527 if (bouncerDismissible || !showing || remoteInputActive) {
Adrian Roosb6011622014-05-14 15:52:53 +0200528 mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400529 } else {
Adrian Roosb6011622014-05-14 15:52:53 +0200530 mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400531 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200532 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700533
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800534 boolean navBarVisible = isNavBarVisible();
535 boolean lastNavBarVisible = getLastNavBarVisible();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700536 if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500537 if (mStatusBar.getNavigationBarView() != null) {
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700538 if (navBarVisible) {
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700539 long delay = getNavBarShowDelay();
540 if (delay == 0) {
541 mMakeNavigationBarVisibleRunnable.run();
542 } else {
543 mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
544 delay);
545 }
Adrian Roosb6011622014-05-14 15:52:53 +0200546 } else {
Jorim Jaggi416493b2014-09-13 03:57:32 +0200547 mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500548 mStatusBar.getNavigationBarView().getRootView().setVisibility(View.GONE);
Adrian Roosb6011622014-05-14 15:52:53 +0200549 }
550 }
551 }
552
553 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
554 mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500555 mStatusBar.setBouncerShowing(bouncerShowing);
Jorim Jaggiecc798e2014-05-26 18:14:37 +0200556 mScrimController.setBouncerShowing(bouncerShowing);
Adrian Roosb6011622014-05-14 15:52:53 +0200557 }
558
559 KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
560 if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
Jorim Jaggi6a15d522015-09-22 15:55:33 -0700561 updateMonitor.onKeyguardVisibilityChanged(showing && !occluded);
Adrian Roosb6011622014-05-14 15:52:53 +0200562 }
563 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
564 updateMonitor.sendKeyguardBouncerChanged(bouncerShowing);
565 }
566
567 mFirstUpdate = false;
568 mLastShowing = showing;
569 mLastOccluded = occluded;
570 mLastBouncerShowing = bouncerShowing;
571 mLastBouncerDismissible = bouncerDismissible;
Adrian Roosd28ccd72016-01-06 15:23:14 +0100572 mLastRemoteInputActive = remoteInputActive;
Jorim Jaggi67b29d52017-06-09 18:00:00 -0700573 mLastDeferScrimFadeOut = mDeferScrimFadeOut;
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500574 mStatusBar.onKeyguardViewManagerStatesUpdated();
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200575 }
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200576
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800577 /**
578 * @return Whether the navigation bar should be made visible based on the current state.
579 */
580 protected boolean isNavBarVisible() {
Jorim Jaggi67b29d52017-06-09 18:00:00 -0700581 return (!(mShowing && !mOccluded) || mBouncer.isShowing() || mRemoteInputActive)
582 && !mDeferScrimFadeOut;
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800583 }
584
585 /**
586 * @return Whether the navigation bar was made visible based on the last known state.
587 */
588 protected boolean getLastNavBarVisible() {
Jorim Jaggi67b29d52017-06-09 18:00:00 -0700589 return (!(mLastShowing && !mLastOccluded) || mLastBouncerShowing || mLastRemoteInputActive)
590 && !mLastDeferScrimFadeOut;
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800591 }
592
Selim Cinek28540192016-02-19 17:25:08 -0800593 public boolean shouldDismissOnMenuPressed() {
594 return mBouncer.shouldDismissOnMenuPressed();
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200595 }
Jorim Jaggidf993512014-05-13 23:06:35 +0200596
597 public boolean interceptMediaKey(KeyEvent event) {
598 return mBouncer.interceptMediaKey(event);
599 }
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200600
Jorim Jaggife762342016-10-13 14:33:27 +0200601 public void readyForKeyguardDone() {
602 mViewMediatorCallback.readyForKeyguardDone();
603 }
604
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200605 public boolean shouldDisableWindowAnimationsForUnlock() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500606 return mStatusBar.isInLaunchTransition();
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200607 }
608
609 public boolean isGoingToNotificationShade() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500610 return mStatusBar.isGoingToNotificationShade();
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200611 }
Adrian Roos31b844b2014-11-21 13:55:09 +0100612
613 public boolean isSecure(int userId) {
614 return mBouncer.isSecure() || mLockPatternUtils.isSecure(userId);
615 }
Jim Millerab954542014-10-10 18:21:49 -0700616
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100617 public void keyguardGoingAway() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500618 mStatusBar.keyguardGoingAway();
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100619 }
Jim Miller25d7e512015-03-03 17:12:09 -0800620
Jorim Jaggif3b3bee2015-04-16 14:57:34 -0700621 public void animateCollapsePanels(float speedUpFactor) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500622 mStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
Jorim Jaggif3b3bee2015-04-16 14:57:34 -0700623 false /* delayed */, speedUpFactor);
Jim Miller25d7e512015-03-03 17:12:09 -0800624 }
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700625
626 /**
627 * Notifies that the user has authenticated by other means than using the bouncer, for example,
628 * fingerprint.
629 */
Jorim Jaggi25b4d4b2015-08-11 15:54:06 -0700630 public void notifyKeyguardAuthenticated(boolean strongAuth) {
631 mBouncer.notifyKeyguardAuthenticated(strongAuth);
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700632 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700633
Selim Cinekcfafe4e2015-08-11 14:58:44 -0700634 public void showBouncerMessage(String message, int color) {
635 mBouncer.showMessage(message, color);
636 }
Jorim Jaggib774e552015-08-24 14:52:45 -0700637
638 public ViewRootImpl getViewRootImpl() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500639 return mStatusBar.getStatusBarView().getViewRootImpl();
Jorim Jaggib774e552015-08-24 14:52:45 -0700640 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100641}