blob: 5001d4ffa13caeab2f9ebad79c9ab9c7aa185d9c [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 Jaggif5304ad2017-07-17 18:31:13 +020019import static com.android.keyguard.KeyguardHostView.OnDismissAction;
20import static com.android.systemui.statusbar.phone.FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
21import static com.android.systemui.statusbar.phone.FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
22
Jorim Jaggi786afcb2014-09-25 02:41:29 +020023import android.content.ComponentCallbacks2;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010024import android.content.Context;
25import android.os.Bundle;
Jorim Jaggie29b2db2014-05-30 23:17:03 +020026import android.os.SystemClock;
Tej Singhdd7bd352018-02-09 19:33:15 -080027import android.util.StatsLog;
Jorim Jaggidf993512014-05-13 23:06:35 +020028import android.view.KeyEvent;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010029import android.view.View;
30import android.view.ViewGroup;
Jorim Jaggib774e552015-08-24 14:52:45 -070031import android.view.ViewRootImpl;
Jorim Jaggi786afcb2014-09-25 02:41:29 +020032import android.view.WindowManagerGlobal;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010033
Lucas Dupinf9ca35e2018-05-16 20:41:35 -070034import com.android.internal.annotations.VisibleForTesting;
Lucas Dupinbc9aac12018-03-04 20:18:15 -080035import com.android.internal.util.LatencyTracker;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010036import com.android.internal.widget.LockPatternUtils;
Adrian Roosb6011622014-05-14 15:52:53 +020037import com.android.keyguard.KeyguardUpdateMonitor;
Jorim Jaggia9d7fcd2017-05-18 01:08:12 +020038import com.android.keyguard.KeyguardUpdateMonitorCallback;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010039import com.android.keyguard.ViewMediatorCallback;
Jorim Jaggi8adb30c2016-09-13 15:02:22 -070040import com.android.systemui.DejankUtils;
Jason Monk421a9412017-02-06 09:15:21 -080041import com.android.systemui.Dependency;
Xiyuan Xia1b30f792016-01-06 08:50:30 -080042import com.android.systemui.SystemUIFactory;
Jorim Jaggi241ae102016-11-02 21:57:33 -070043import com.android.systemui.keyguard.DismissCallbackRegistry;
Jim Miller25d7e512015-03-03 17:12:09 -080044import com.android.systemui.statusbar.CommandQueue;
Adrian Roosd28ccd72016-01-06 15:23:14 +010045import com.android.systemui.statusbar.RemoteInputController;
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080046import com.android.systemui.statusbar.phone.KeyguardBouncer.BouncerExpansionCallback;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010047
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080048import java.io.PrintWriter;
Jorim Jaggibcbe9482016-11-23 17:37:49 +010049import java.util.ArrayList;
50
Jorim Jaggi5cf17872014-03-26 18:31:48 +010051/**
52 * Manages creating, showing, hiding and resetting the keyguard within the status bar. Calls back
53 * via {@link ViewMediatorCallback} to poke the wake lock and report that the keyguard is done,
54 * which is in turn, reported to this class by the current
55 * {@link com.android.keyguard.KeyguardViewBase}.
56 */
Adrian Roosd28ccd72016-01-06 15:23:14 +010057public class StatusBarKeyguardViewManager implements RemoteInputController.Callback {
Jorim Jaggi76a16232014-08-08 17:00:47 +020058
59 // When hiding the Keyguard with timing supplied from WindowManager, better be early than late.
Jorim Jaggi56fd70c2016-10-27 19:57:08 -070060 private static final long HIDE_TIMING_CORRECTION_MS = - 16 * 3;
Jorim Jaggi76a16232014-08-08 17:00:47 +020061
Jorim Jaggi416493b2014-09-13 03:57:32 +020062 // Delay for showing the navigation bar when the bouncer appears. This should be kept in sync
63 // with the appear animations of the PIN/pattern/password views.
64 private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
65
Jorim Jaggi007f0e82015-08-14 13:56:01 -070066 private static final long WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS = 200;
67
Jorim Jaggie8fde5d2016-06-30 23:41:37 -070068 // Duration of the Keyguard dismissal animation in case the user is currently locked. This is to
69 // make everything a bit slower to bridge a gap until the user is unlocked and home screen has
70 // dranw its first frame.
71 private static final long KEYGUARD_DISMISS_DURATION_LOCKED = 2000;
72
Jorim Jaggi5cf17872014-03-26 18:31:48 +010073 private static String TAG = "StatusBarKeyguardViewManager";
74
Xiyuan Xia1b30f792016-01-06 08:50:30 -080075 protected final Context mContext;
Jason Monk421a9412017-02-06 09:15:21 -080076 private final StatusBarWindowManager mStatusBarWindowManager;
Lucas Dupin15a6b6c2018-04-16 14:50:20 +080077 private final BouncerExpansionCallback mExpansionCallback = new BouncerExpansionCallback() {
78 @Override
79 public void onFullyShown() {
80 updateStates();
81 }
82
83 @Override
84 public void onFullyHidden() {
85 updateStates();
86 }
87 };
Jorim Jaggi5cf17872014-03-26 18:31:48 +010088
Xiyuan Xia1b30f792016-01-06 08:50:30 -080089 protected LockPatternUtils mLockPatternUtils;
90 protected ViewMediatorCallback mViewMediatorCallback;
Jason Monk2a6ea9c2017-01-26 11:14:51 -050091 protected StatusBar mStatusBar;
Lucas Dupinbc9aac12018-03-04 20:18:15 -080092 private NotificationPanelView mNotificationPanelView;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -070093 private FingerprintUnlockController mFingerprintUnlockController;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010094
Jorim Jaggi5cf17872014-03-26 18:31:48 +010095 private ViewGroup mContainer;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010096
Xiyuan Xia1b30f792016-01-06 08:50:30 -080097 protected KeyguardBouncer mBouncer;
98 protected boolean mShowing;
99 protected boolean mOccluded;
100 protected boolean mRemoteInputActive;
Adrian Roos087826a2017-04-19 16:59:09 -0700101 private boolean mDozing;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100102
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800103 protected boolean mFirstUpdate = true;
104 protected boolean mLastShowing;
105 protected boolean mLastOccluded;
Adrian Roosb6011622014-05-14 15:52:53 +0200106 private boolean mLastBouncerShowing;
107 private boolean mLastBouncerDismissible;
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800108 protected boolean mLastRemoteInputActive;
Adrian Roos087826a2017-04-19 16:59:09 -0700109 private boolean mLastDozing;
Jorim Jaggif5304ad2017-07-17 18:31:13 +0200110 private int mLastFpMode;
Lucas Dupin16cfe452018-02-08 13:14:50 -0800111 private boolean mGoingToSleepVisibleNotOccluded;
Adrian Roosd28ccd72016-01-06 15:23:14 +0100112
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200113 private OnDismissAction mAfterKeyguardGoneAction;
Jorim Jaggibcbe9482016-11-23 17:37:49 +0100114 private final ArrayList<Runnable> mAfterKeyguardGoneRunnables = new ArrayList<>();
Adrian Roosb6011622014-05-14 15:52:53 +0200115
Adrian Roosfee661c2017-08-04 17:05:45 +0200116 // Dismiss action to be launched when we stop dozing or the keyguard is gone.
Adrian Roos34e65402017-08-07 19:32:45 +0200117 private DismissWithActionRequest mPendingWakeupAction;
Adrian Roosfee661c2017-08-04 17:05:45 +0200118
Jorim Jaggia9d7fcd2017-05-18 01:08:12 +0200119 private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
120 new KeyguardUpdateMonitorCallback() {
121 @Override
122 public void onEmergencyCallAction() {
123
124 // Since we won't get a setOccluded call we have to reset the view manually such that
125 // the bouncer goes away.
126 if (mOccluded) {
Lucas Dupin28f90292017-08-08 18:07:49 -0400127 reset(true /* hideBouncerWhenShowing */);
Jorim Jaggia9d7fcd2017-05-18 01:08:12 +0200128 }
129 }
130 };
131
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100132 public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
133 LockPatternUtils lockPatternUtils) {
134 mContext = context;
135 mViewMediatorCallback = callback;
136 mLockPatternUtils = lockPatternUtils;
Jason Monk421a9412017-02-06 09:15:21 -0800137 mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
Jorim Jaggia9d7fcd2017-05-18 01:08:12 +0200138 KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitorCallback);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100139 }
140
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500141 public void registerStatusBar(StatusBar statusBar,
Jason Monk421a9412017-02-06 09:15:21 -0800142 ViewGroup container,
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800143 NotificationPanelView notificationPanelView,
Jorim Jaggi241ae102016-11-02 21:57:33 -0700144 FingerprintUnlockController fingerprintUnlockController,
145 DismissCallbackRegistry dismissCallbackRegistry) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500146 mStatusBar = statusBar;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100147 mContainer = container;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700148 mFingerprintUnlockController = fingerprintUnlockController;
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800149 mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800150 mViewMediatorCallback, mLockPatternUtils, container, dismissCallbackRegistry,
151 mExpansionCallback);
Lucas Dupin4c2aa392018-03-28 18:00:45 -0700152 mContainer.addOnLayoutChangeListener(this::onContainerLayout);
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800153 mNotificationPanelView = notificationPanelView;
154 notificationPanelView.setExpansionListener(this::onPanelExpansionChanged);
155 }
156
Lucas Dupin4c2aa392018-03-28 18:00:45 -0700157 private void onContainerLayout(View v, int left, int top, int right, int bottom,
158 int oldLeft, int oldTop, int oldRight, int oldBottom) {
159 mNotificationPanelView.setBouncerTop(mBouncer.getTop());
160 }
161
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700162 @VisibleForTesting
163 void onPanelExpansionChanged(float expansion, boolean tracking) {
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700164 // We don't want to translate the bounce when:
165 // • Keyguard is occluded, because we're in a FLAG_SHOW_WHEN_LOCKED activity and need to
166 // conserve the original animation.
167 // • The user quickly taps on the display and we show "swipe up to unlock."
168 // • Keyguard will be dismissed by an action. a.k.a: FLAG_DISMISS_KEYGUARD_ACTIVITY
jovanak5f6dc612018-03-27 11:59:22 -0700169 // • Full-screen user switcher is displayed.
Lucas Dupind7344dc2018-04-20 12:08:52 +0800170 if (mNotificationPanelView.isUnlockHintRunning()) {
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700171 mBouncer.setExpansion(KeyguardBouncer.EXPANSION_HIDDEN);
Lucas Dupinaece5022018-05-21 16:44:28 -0700172 } else if (mOccluded || mBouncer.willDismissWithAction() || mBouncer.isShowingScrimmed()
jovanak5f6dc612018-03-27 11:59:22 -0700173 || mStatusBar.isFullScreenUserSwitcherState()) {
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700174 mBouncer.setExpansion(KeyguardBouncer.EXPANSION_VISIBLE);
Lucas Dupin52a95872018-04-20 10:28:07 +0800175 } else if (mShowing && !mDozing) {
Lucas Dupin71dd4842018-05-29 15:41:03 -0700176 if (!isWakeAndUnlocking()) {
177 mBouncer.setExpansion(expansion);
178 }
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700179 if (expansion != KeyguardBouncer.EXPANSION_HIDDEN && tracking
180 && mStatusBar.isKeyguardCurrentlySecure()
Lucas Dupin52a95872018-04-20 10:28:07 +0800181 && !mBouncer.isShowing() && !mBouncer.isAnimatingAway()) {
Lucas Dupin71dd4842018-05-29 15:41:03 -0700182 mBouncer.show(false /* resetSecuritySelection */, false /* scrimmed */);
Lucas Dupin3d565fa2018-03-20 15:40:14 -0700183 }
Lucas Dupinbc9aac12018-03-04 20:18:15 -0800184 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100185 }
186
187 /**
188 * Show the keyguard. Will handle creating and attaching to the view manager
189 * lazily.
190 */
191 public void show(Bundle options) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200192 mShowing = true;
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200193 mStatusBarWindowManager.setKeyguardShowing(true);
Jorim Jaggife762342016-10-13 14:33:27 +0200194 reset(true /* hideBouncerWhenShowing */);
Tej Singhdd7bd352018-02-09 19:33:15 -0800195 StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
196 StatsLog.KEYGUARD_STATE_CHANGED__STATE__SHOWN);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100197 }
198
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200199 /**
200 * Shows the notification keyguard or the bouncer depending on
201 * {@link KeyguardBouncer#needsFullscreenBouncer()}.
202 */
Jorim Jaggife762342016-10-13 14:33:27 +0200203 protected void showBouncerOrKeyguard(boolean hideBouncerWhenShowing) {
Adrian Roos41eecff2017-06-29 14:09:52 +0200204 if (mBouncer.needsFullscreenBouncer() && !mDozing) {
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200205 // The keyguard might be showing (already). So we need to hide it.
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500206 mStatusBar.hideKeyguard();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100207 mBouncer.show(true /* resetSecuritySelection */);
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200208 } else {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500209 mStatusBar.showKeyguard();
Jorim Jaggife762342016-10-13 14:33:27 +0200210 if (hideBouncerWhenShowing) {
Jian Jind1b63982018-05-21 15:20:40 -0700211 hideBouncer(shouldDestroyViewOnReset() /* destroyView */);
Jorim Jaggife762342016-10-13 14:33:27 +0200212 mBouncer.prepare();
213 }
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200214 }
Adrian Roos61676aa2017-08-03 16:24:32 +0200215 updateStates();
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200216 }
217
Jian Jind1b63982018-05-21 15:20:40 -0700218 protected boolean shouldDestroyViewOnReset() {
219 return false;
220 }
221
Lucas Dupin3c9df5a2018-02-27 11:32:16 -0800222 private void hideBouncer(boolean destroyView) {
Adrian Roosfee661c2017-08-04 17:05:45 +0200223 mBouncer.hide(destroyView);
Adrian Roos34e65402017-08-07 19:32:45 +0200224 cancelPendingWakeupAction();
Adrian Roosfee661c2017-08-04 17:05:45 +0200225 }
226
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700227 public void showBouncer(boolean scrimmed) {
228 if (mShowing && !mBouncer.isShowing()) {
229 mBouncer.show(false /* resetSecuritySelection */, scrimmed);
Dan Sandler3806c772014-05-08 14:52:10 -0400230 }
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200231 updateStates();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100232 }
233
Jorim Jaggid9449862015-05-29 14:49:08 -0700234 public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
235 boolean afterKeyguardGone) {
Lucas Dupinc80c67e2017-12-04 14:29:10 -0800236 dismissWithAction(r, cancelAction, afterKeyguardGone, null /* message */);
237 }
238
239 public void dismissWithAction(OnDismissAction r, Runnable cancelAction,
240 boolean afterKeyguardGone, String message) {
Adrian Roos0002a452014-07-03 13:46:07 +0200241 if (mShowing) {
Adrian Roos34e65402017-08-07 19:32:45 +0200242 cancelPendingWakeupAction();
Adrian Roosfee661c2017-08-04 17:05:45 +0200243 // If we're dozing, this needs to be delayed until after we wake up - unless we're
244 // wake-and-unlocking, because there dozing will last until the end of the transition.
245 if (mDozing && !isWakeAndUnlocking()) {
Adrian Roos34e65402017-08-07 19:32:45 +0200246 mPendingWakeupAction = new DismissWithActionRequest(
Lucas Dupinc80c67e2017-12-04 14:29:10 -0800247 r, cancelAction, afterKeyguardGone, message);
Adrian Roosfee661c2017-08-04 17:05:45 +0200248 return;
249 }
250
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200251 if (!afterKeyguardGone) {
Jorim Jaggid9449862015-05-29 14:49:08 -0700252 mBouncer.showWithDismissAction(r, cancelAction);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200253 } else {
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200254 mAfterKeyguardGoneAction = r;
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700255 mBouncer.show(false /* resetSecuritySelection */);
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200256 }
Adrian Roos7d7090d2014-05-21 13:10:23 +0200257 }
258 updateStates();
259 }
260
Adrian Roosfee661c2017-08-04 17:05:45 +0200261 private boolean isWakeAndUnlocking() {
262 int mode = mFingerprintUnlockController.getMode();
263 return mode == MODE_WAKE_AND_UNLOCK || mode == MODE_WAKE_AND_UNLOCK_PULSING;
264 }
265
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100266 /**
Jorim Jaggibcbe9482016-11-23 17:37:49 +0100267 * Adds a {@param runnable} to be executed after Keyguard is gone.
268 */
269 public void addAfterKeyguardGoneRunnable(Runnable runnable) {
270 mAfterKeyguardGoneRunnables.add(runnable);
271 }
272
273 /**
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100274 * Reset the state of the view.
275 */
Jorim Jaggife762342016-10-13 14:33:27 +0200276 public void reset(boolean hideBouncerWhenShowing) {
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200277 if (mShowing) {
Adrian Roos7a56d1a2017-08-04 15:04:43 +0200278 if (mOccluded && !mDozing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500279 mStatusBar.hideKeyguard();
Adrian Roos91ffdc42017-08-04 18:14:41 +0200280 if (hideBouncerWhenShowing || mBouncer.needsFullscreenBouncer()) {
281 hideBouncer(false /* destroyView */);
282 }
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200283 } else {
Jorim Jaggife762342016-10-13 14:33:27 +0200284 showBouncerOrKeyguard(hideBouncerWhenShowing);
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200285 }
Selim Cinek1fcafc42015-07-20 14:39:25 -0700286 KeyguardUpdateMonitor.getInstance(mContext).sendKeyguardReset();
Jorim Jaggi43bdbbd2014-05-09 16:05:53 +0200287 updateStates();
Dan Sandler3806c772014-05-08 14:52:10 -0400288 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100289 }
290
Lucas Dupin16cfe452018-02-08 13:14:50 -0800291 public boolean isGoingToSleepVisibleNotOccluded() {
292 return mGoingToSleepVisibleNotOccluded;
293 }
294
Jorim Jaggi18f18ae2015-09-10 15:48:21 -0700295 public void onStartedGoingToSleep() {
Lucas Dupin16cfe452018-02-08 13:14:50 -0800296 mGoingToSleepVisibleNotOccluded = isShowing() && !isOccluded();
Jorim Jaggi18f18ae2015-09-10 15:48:21 -0700297 }
298
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700299 public void onFinishedGoingToSleep() {
Lucas Dupin16cfe452018-02-08 13:14:50 -0800300 mGoingToSleepVisibleNotOccluded = false;
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200301 mBouncer.onScreenTurnedOff();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100302 }
303
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700304 public void onStartedWakingUp() {
Adrian Roos731d4df2017-07-18 15:10:39 +0200305 // TODO: remove
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100306 }
307
Jorim Jaggi93739112015-08-13 15:53:14 -0700308 public void onScreenTurningOn() {
Adrian Roos731d4df2017-07-18 15:10:39 +0200309 // TODO: remove
Selim Cinek372d1bd2015-08-14 13:19:37 -0700310 }
311
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700312 public void onScreenTurnedOn() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800313 // TODO: remove
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700314 }
315
Adrian Roosd28ccd72016-01-06 15:23:14 +0100316 @Override
317 public void onRemoteInputActive(boolean active) {
318 mRemoteInputActive = active;
319 updateStates();
320 }
321
Adrian Roos087826a2017-04-19 16:59:09 -0700322 public void setDozing(boolean dozing) {
Adrian Roos41eecff2017-06-29 14:09:52 +0200323 if (mDozing != dozing) {
324 mDozing = dozing;
Adrian Roos61676aa2017-08-03 16:24:32 +0200325 if (dozing || mBouncer.needsFullscreenBouncer() || mOccluded) {
326 reset(dozing /* hideBouncerWhenShowing */);
327 }
Adrian Roos41eecff2017-06-29 14:09:52 +0200328 updateStates();
Adrian Roosfee661c2017-08-04 17:05:45 +0200329
330 if (!dozing) {
Adrian Roos34e65402017-08-07 19:32:45 +0200331 launchPendingWakeupAction();
Adrian Roosfee661c2017-08-04 17:05:45 +0200332 }
Adrian Roos41eecff2017-06-29 14:09:52 +0200333 }
Adrian Roos087826a2017-04-19 16:59:09 -0700334 }
335
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700336 public void onScreenTurnedOff() {
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800337 // TODO: remove
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700338 }
339
340 public void notifyDeviceWakeUpRequested() {
Adrian Roos731d4df2017-07-18 15:10:39 +0200341 // TODO: remove
Selim Cinekf8fbc2a72015-06-22 16:42:07 -0400342 }
343
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100344 public void setNeedsInput(boolean needsInput) {
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200345 mStatusBarWindowManager.setKeyguardNeedsInput(needsInput);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100346 }
347
Adrian Roosd5c2db62016-03-08 16:11:31 -0800348 public boolean isUnlockWithWallpaper() {
349 return mStatusBarWindowManager.isShowingWallpaper();
350 }
351
Jorim Jaggi6626f542016-08-22 13:08:44 -0700352 public void setOccluded(boolean occluded, boolean animate) {
Selim Cinek3a49ba22017-08-10 11:17:39 -0700353 mStatusBar.setOccluded(occluded);
Selim Cinekbaa23272014-07-08 18:01:07 +0200354 if (occluded && !mOccluded && mShowing) {
Tej Singhdd7bd352018-02-09 19:33:15 -0800355 StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
356 StatsLog.KEYGUARD_STATE_CHANGED__STATE__OCCLUDED);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500357 if (mStatusBar.isInLaunchTransition()) {
Selim Cinekbaa23272014-07-08 18:01:07 +0200358 mOccluded = true;
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500359 mStatusBar.fadeKeyguardAfterLaunchTransition(null /* beforeFading */,
Selim Cinekbaa23272014-07-08 18:01:07 +0200360 new Runnable() {
361 @Override
362 public void run() {
Jorim Jaggi826730a2014-12-08 21:05:13 +0100363 mStatusBarWindowManager.setKeyguardOccluded(mOccluded);
Jorim Jaggife762342016-10-13 14:33:27 +0200364 reset(true /* hideBouncerWhenShowing */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200365 }
366 });
367 return;
368 }
Tej Singhdd7bd352018-02-09 19:33:15 -0800369 } else if (!occluded && mOccluded && mShowing) {
370 StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
371 StatsLog.KEYGUARD_STATE_CHANGED__STATE__SHOWN);
Selim Cinekbaa23272014-07-08 18:01:07 +0200372 }
Lucas Dupin28f90292017-08-08 18:07:49 -0400373 boolean isOccluding = !mOccluded && occluded;
Jorim Jaggia6310292014-04-16 14:11:52 +0200374 mOccluded = occluded;
Adrian Roos909fe2d2016-10-12 12:03:24 -0700375 if (mShowing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500376 mStatusBar.updateMediaMetaData(false, animate && !occluded);
Adrian Roos909fe2d2016-10-12 12:03:24 -0700377 }
Jorim Jaggicff0acb2014-03-31 16:35:15 +0200378 mStatusBarWindowManager.setKeyguardOccluded(occluded);
Jorim Jaggife762342016-10-13 14:33:27 +0200379
Adrian Roos7a56d1a2017-08-04 15:04:43 +0200380 // setDozing(false) will call reset once we stop dozing.
381 if (!mDozing) {
382 // If Keyguard is reshown, don't hide the bouncer as it might just have been requested
383 // by a FLAG_DISMISS_KEYGUARD_ACTIVITY.
Lucas Dupin28f90292017-08-08 18:07:49 -0400384 reset(isOccluding /* hideBouncerWhenShowing*/);
Adrian Roos7a56d1a2017-08-04 15:04:43 +0200385 }
Adrian Roos909fe2d2016-10-12 12:03:24 -0700386 if (animate && !occluded && mShowing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500387 mStatusBar.animateKeyguardUnoccluding();
Jorim Jaggi6626f542016-08-22 13:08:44 -0700388 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100389 }
390
Dan Sandler4b22bdf2014-06-05 00:58:02 -0400391 public boolean isOccluded() {
392 return mOccluded;
393 }
394
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100395 /**
Jorim Jaggi76a16232014-08-08 17:00:47 +0200396 * Starts the animation before we dismiss Keyguard, i.e. an disappearing animation on the
397 * security view of the bouncer.
398 *
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200399 * @param finishRunnable the runnable to be run after the animation finished, or {@code null} if
400 * no action should be run
Jorim Jaggi76a16232014-08-08 17:00:47 +0200401 */
402 public void startPreHideAnimation(Runnable finishRunnable) {
403 if (mBouncer.isShowing()) {
404 mBouncer.startPreHideAnimation(finishRunnable);
Lucas Dupin93752552018-03-19 21:32:19 -0700405 mNotificationPanelView.onBouncerPreHideAnimation();
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200406 } else if (finishRunnable != null) {
Jorim Jaggi76a16232014-08-08 17:00:47 +0200407 finishRunnable.run();
408 }
409 }
410
411 /**
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100412 * Hides the keyguard view
413 */
Jorim Jaggie8fde5d2016-06-30 23:41:37 -0700414 public void hide(long startTime, long fadeoutDuration) {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200415 mShowing = false;
Adrian Roos34e65402017-08-07 19:32:45 +0200416 launchPendingWakeupAction();
Jorim Jaggi44cf9192014-06-17 19:16:00 -0700417
Jorim Jaggi031f7952016-09-01 16:39:26 -0700418 if (KeyguardUpdateMonitor.getInstance(mContext).needsSlowUnlockTransition()) {
Jorim Jaggie8fde5d2016-06-30 23:41:37 -0700419 fadeoutDuration = KEYGUARD_DISMISS_DURATION_LOCKED;
420 }
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200421 long uptimeMillis = SystemClock.uptimeMillis();
Jorim Jaggi76a16232014-08-08 17:00:47 +0200422 long delay = Math.max(0, startTime + HIDE_TIMING_CORRECTION_MS - uptimeMillis);
Selim Cinekbaa23272014-07-08 18:01:07 +0200423
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500424 if (mStatusBar.isInLaunchTransition() ) {
425 mStatusBar.fadeKeyguardAfterLaunchTransition(new Runnable() {
Selim Cinekbaa23272014-07-08 18:01:07 +0200426 @Override
427 public void run() {
428 mStatusBarWindowManager.setKeyguardShowing(false);
429 mStatusBarWindowManager.setKeyguardFadingAway(true);
Adrian Roosfee661c2017-08-04 17:05:45 +0200430 hideBouncer(true /* destroyView */);
Selim Cinekbaa23272014-07-08 18:01:07 +0200431 updateStates();
Selim Cinekbaa23272014-07-08 18:01:07 +0200432 }
433 }, new Runnable() {
434 @Override
435 public void run() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500436 mStatusBar.hideKeyguard();
Selim Cinekbaa23272014-07-08 18:01:07 +0200437 mStatusBarWindowManager.setKeyguardFadingAway(false);
438 mViewMediatorCallback.keyguardGone();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200439 executeAfterKeyguardGoneAction();
Selim Cinekbaa23272014-07-08 18:01:07 +0200440 }
441 });
442 } else {
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700443 executeAfterKeyguardGoneAction();
Jorim Jaggie93698b2016-11-11 18:24:38 -0800444 boolean wakeUnlockPulsing =
445 mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK_PULSING;
446 if (wakeUnlockPulsing) {
447 delay = 0;
448 fadeoutDuration = 240;
449 }
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500450 mStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
Jorim Jaggie93698b2016-11-11 18:24:38 -0800451 mFingerprintUnlockController.startKeyguardFadingAway();
Adrian Roosfee661c2017-08-04 17:05:45 +0200452 hideBouncer(true /* destroyView */);
Jorim Jaggie93698b2016-11-11 18:24:38 -0800453 if (wakeUnlockPulsing) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500454 mStatusBar.fadeKeyguardWhilePulsing();
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800455 wakeAndUnlockDejank();
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200456 } else {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500457 boolean staying = mStatusBar.hideKeyguard();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700458 if (!staying) {
459 mStatusBarWindowManager.setKeyguardFadingAway(true);
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800460 wakeAndUnlockDejank();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700461 } else {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500462 mStatusBar.finishKeyguardFadingAway();
Adrian Roos88e61aa2017-05-23 16:16:50 -0700463 mFingerprintUnlockController.finishKeyguardFadingAway();
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700464 }
Jorim Jaggidbc3dce2014-08-01 01:16:36 +0200465 }
Jorim Jaggi67b29d52017-06-09 18:00:00 -0700466 updateStates();
Selim Cinekbaa23272014-07-08 18:01:07 +0200467 mStatusBarWindowManager.setKeyguardShowing(false);
Selim Cinekbaa23272014-07-08 18:01:07 +0200468 mViewMediatorCallback.keyguardGone();
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200469 }
Tej Singhdd7bd352018-02-09 19:33:15 -0800470 StatsLog.write(StatsLog.KEYGUARD_STATE_CHANGED,
471 StatsLog.KEYGUARD_STATE_CHANGED__STATE__HIDDEN);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100472 }
473
Selim Cinekaa8bbf12016-05-04 14:13:20 -0700474 public void onDensityOrFontScaleChanged() {
Adrian Roosfee661c2017-08-04 17:05:45 +0200475 hideBouncer(true /* destroyView */);
Selim Cinekaa8bbf12016-05-04 14:13:20 -0700476 }
477
Lucas Dupin8c51ce22017-11-21 13:21:05 -0800478 public void onThemeChanged() {
Adrian Roosfee661c2017-08-04 17:05:45 +0200479 hideBouncer(true /* destroyView */);
Lucas Dupinf190a852017-07-31 17:11:26 -0700480 mBouncer.prepare();
Lucas Dupin89516d42017-07-05 13:29:18 -0700481 }
482
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800483 public void onKeyguardFadedAway() {
484 mContainer.postDelayed(() -> mStatusBarWindowManager.setKeyguardFadingAway(false),
485 100);
486 mStatusBar.finishKeyguardFadingAway();
487 mFingerprintUnlockController.finishKeyguardFadingAway();
488 WindowManagerGlobal.getInstance().trimMemory(
489 ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
490
Jorim Jaggi90978852015-08-18 19:55:53 -0700491 }
492
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800493 private void wakeAndUnlockDejank() {
Jorim Jaggi8adb30c2016-09-13 15:02:22 -0700494 if (mFingerprintUnlockController.getMode() == MODE_WAKE_AND_UNLOCK
495 && LatencyTracker.isEnabled(mContext)) {
496 DejankUtils.postAfterTraversal(() ->
497 LatencyTracker.getInstance(mContext).onActionEnd(
498 LatencyTracker.ACTION_FINGERPRINT_WAKE_AND_UNLOCK));
499 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700500 }
501
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200502 private void executeAfterKeyguardGoneAction() {
503 if (mAfterKeyguardGoneAction != null) {
504 mAfterKeyguardGoneAction.onDismiss();
505 mAfterKeyguardGoneAction = null;
506 }
Jorim Jaggibcbe9482016-11-23 17:37:49 +0100507 for (int i = 0; i < mAfterKeyguardGoneRunnables.size(); i++) {
508 mAfterKeyguardGoneRunnables.get(i).run();
509 }
510 mAfterKeyguardGoneRunnables.clear();
Jorim Jaggi746f7fa2014-08-27 17:52:46 +0200511 }
512
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100513 /**
514 * Dismisses the keyguard by going to the next screen or making it gone.
515 */
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700516 public void dismissAndCollapse() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500517 mStatusBar.executeRunnableDismissingKeyguard(null, null, true, false, true);
Jorim Jaggi8d5a6e72016-11-02 21:57:33 -0700518 }
519
Christoph Studer2231c6e2014-12-19 12:40:13 +0100520 /**
521 * WARNING: This method might cause Binder calls.
522 */
Jorim Jaggi15682502014-04-23 12:01:36 +0200523 public boolean isSecure() {
524 return mBouncer.isSecure();
525 }
526
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100527 /**
528 * @return Whether the keyguard is showing
529 */
530 public boolean isShowing() {
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200531 return mShowing;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100532 }
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200533
534 /**
535 * Notifies this manager that the back button has been pressed.
536 *
Lucas Dupin3f54fe22018-04-08 23:17:40 -0700537 * @param hideImmediately Hide bouncer when {@code true}, keep it around otherwise.
538 * Non-scrimmed bouncers have a special animation tied to the expansion
539 * of the notification panel.
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200540 * @return whether the back press has been handled
541 */
Lucas Dupin3f54fe22018-04-08 23:17:40 -0700542 public boolean onBackPressed(boolean hideImmediately) {
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200543 if (mBouncer.isShowing()) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500544 mStatusBar.endAffordanceLaunch();
Lucas Dupin3f54fe22018-04-08 23:17:40 -0700545 reset(hideImmediately);
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200546 return true;
547 }
548 return false;
549 }
550
Jim Millerf41fc962014-06-18 16:33:51 -0700551 public boolean isBouncerShowing() {
552 return mBouncer.isShowing();
553 }
554
Jackal Guo42cae962018-04-18 18:41:19 +0800555 public boolean isFullscreenBouncer() {
556 return mBouncer.isFullscreenBouncer();
557 }
558
Jorim Jaggi416493b2014-09-13 03:57:32 +0200559 private long getNavBarShowDelay() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500560 if (mStatusBar.isKeyguardFadingAway()) {
561 return mStatusBar.getKeyguardFadingAwayDelay();
Adrian Roos087826a2017-04-19 16:59:09 -0700562 } else if (mBouncer.isShowing()) {
Jorim Jaggi416493b2014-09-13 03:57:32 +0200563 return NAV_BAR_SHOW_DELAY_BOUNCER;
Adrian Roos087826a2017-04-19 16:59:09 -0700564 } else {
565 // No longer dozing, or remote input is active. No delay.
566 return 0;
Jorim Jaggi416493b2014-09-13 03:57:32 +0200567 }
568 }
569
570 private Runnable mMakeNavigationBarVisibleRunnable = new Runnable() {
571 @Override
572 public void run() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500573 mStatusBar.getNavigationBarView().getRootView().setVisibility(View.VISIBLE);
Jorim Jaggi416493b2014-09-13 03:57:32 +0200574 }
575 };
576
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800577 protected void updateStates() {
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200578 int vis = mContainer.getSystemUiVisibility();
Adrian Roosb6011622014-05-14 15:52:53 +0200579 boolean showing = mShowing;
580 boolean occluded = mOccluded;
581 boolean bouncerShowing = mBouncer.isShowing();
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100582 boolean bouncerDismissible = !mBouncer.isFullscreenBouncer();
Adrian Roosd28ccd72016-01-06 15:23:14 +0100583 boolean remoteInputActive = mRemoteInputActive;
Adrian Roosb6011622014-05-14 15:52:53 +0200584
Adrian Roosd28ccd72016-01-06 15:23:14 +0100585 if ((bouncerDismissible || !showing || remoteInputActive) !=
586 (mLastBouncerDismissible || !mLastShowing || mLastRemoteInputActive)
Adrian Roosb6011622014-05-14 15:52:53 +0200587 || mFirstUpdate) {
Adrian Roosd28ccd72016-01-06 15:23:14 +0100588 if (bouncerDismissible || !showing || remoteInputActive) {
Adrian Roosb6011622014-05-14 15:52:53 +0200589 mContainer.setSystemUiVisibility(vis & ~View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400590 } else {
Adrian Roosb6011622014-05-14 15:52:53 +0200591 mContainer.setSystemUiVisibility(vis | View.STATUS_BAR_DISABLE_BACK);
Jason Monk1e68fb32014-05-02 16:06:20 -0400592 }
Jorim Jaggia6310292014-04-16 14:11:52 +0200593 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700594
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800595 boolean navBarVisible = isNavBarVisible();
596 boolean lastNavBarVisible = getLastNavBarVisible();
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700597 if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
Brad Stenning7e411812018-04-13 22:52:39 -0700598 updateNavigationBarVisibility(navBarVisible);
Adrian Roosb6011622014-05-14 15:52:53 +0200599 }
600
601 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
602 mStatusBarWindowManager.setBouncerShowing(bouncerShowing);
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500603 mStatusBar.setBouncerShowing(bouncerShowing);
Adrian Roosb6011622014-05-14 15:52:53 +0200604 }
605
606 KeyguardUpdateMonitor updateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
607 if ((showing && !occluded) != (mLastShowing && !mLastOccluded) || mFirstUpdate) {
Jorim Jaggi6a15d522015-09-22 15:55:33 -0700608 updateMonitor.onKeyguardVisibilityChanged(showing && !occluded);
Adrian Roosb6011622014-05-14 15:52:53 +0200609 }
610 if (bouncerShowing != mLastBouncerShowing || mFirstUpdate) {
611 updateMonitor.sendKeyguardBouncerChanged(bouncerShowing);
612 }
613
614 mFirstUpdate = false;
615 mLastShowing = showing;
616 mLastOccluded = occluded;
617 mLastBouncerShowing = bouncerShowing;
618 mLastBouncerDismissible = bouncerDismissible;
Adrian Roosd28ccd72016-01-06 15:23:14 +0100619 mLastRemoteInputActive = remoteInputActive;
Adrian Roos087826a2017-04-19 16:59:09 -0700620 mLastDozing = mDozing;
Jorim Jaggif5304ad2017-07-17 18:31:13 +0200621 mLastFpMode = mFingerprintUnlockController.getMode();
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500622 mStatusBar.onKeyguardViewManagerStatesUpdated();
Jorim Jaggie5c7a892014-04-10 20:37:32 +0200623 }
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200624
Brad Stenning7e411812018-04-13 22:52:39 -0700625 protected void updateNavigationBarVisibility(boolean navBarVisible) {
626 if (mStatusBar.getNavigationBarView() != null) {
627 if (navBarVisible) {
628 long delay = getNavBarShowDelay();
629 if (delay == 0) {
630 mMakeNavigationBarVisibleRunnable.run();
631 } else {
632 mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
633 delay);
634 }
635 } else {
636 mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
637 mStatusBar.getNavigationBarView().getRootView().setVisibility(View.GONE);
638 }
639 }
640 }
641
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800642 /**
643 * @return Whether the navigation bar should be made visible based on the current state.
644 */
645 protected boolean isNavBarVisible() {
Jorim Jaggif5304ad2017-07-17 18:31:13 +0200646 int fpMode = mFingerprintUnlockController.getMode();
647 boolean keyguardShowing = mShowing && !mOccluded;
648 boolean hideWhileDozing = mDozing && fpMode != MODE_WAKE_AND_UNLOCK_PULSING;
649 return (!keyguardShowing && !hideWhileDozing || mBouncer.isShowing()
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800650 || mRemoteInputActive);
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800651 }
652
653 /**
654 * @return Whether the navigation bar was made visible based on the last known state.
655 */
656 protected boolean getLastNavBarVisible() {
Jorim Jaggif5304ad2017-07-17 18:31:13 +0200657 boolean keyguardShowing = mLastShowing && !mLastOccluded;
658 boolean hideWhileDozing = mLastDozing && mLastFpMode != MODE_WAKE_AND_UNLOCK_PULSING;
659 return (!keyguardShowing && !hideWhileDozing || mLastBouncerShowing
Lucas Dupin9e3fa102017-11-08 17:16:55 -0800660 || mLastRemoteInputActive);
Xiyuan Xia1b30f792016-01-06 08:50:30 -0800661 }
662
Selim Cinek28540192016-02-19 17:25:08 -0800663 public boolean shouldDismissOnMenuPressed() {
664 return mBouncer.shouldDismissOnMenuPressed();
Jorim Jaggi8c8bcc12014-04-16 21:36:51 +0200665 }
Jorim Jaggidf993512014-05-13 23:06:35 +0200666
667 public boolean interceptMediaKey(KeyEvent event) {
668 return mBouncer.interceptMediaKey(event);
669 }
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200670
Jorim Jaggife762342016-10-13 14:33:27 +0200671 public void readyForKeyguardDone() {
672 mViewMediatorCallback.readyForKeyguardDone();
673 }
674
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200675 public boolean shouldDisableWindowAnimationsForUnlock() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500676 return mStatusBar.isInLaunchTransition();
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200677 }
678
679 public boolean isGoingToNotificationShade() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500680 return mStatusBar.isGoingToNotificationShade();
Jorim Jaggi84a3e7a2014-08-13 17:58:58 +0200681 }
Adrian Roos31b844b2014-11-21 13:55:09 +0100682
683 public boolean isSecure(int userId) {
684 return mBouncer.isSecure() || mLockPatternUtils.isSecure(userId);
685 }
Jim Millerab954542014-10-10 18:21:49 -0700686
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100687 public void keyguardGoingAway() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500688 mStatusBar.keyguardGoingAway();
Jorim Jaggi33ae80e2015-02-04 16:37:11 +0100689 }
Jim Miller25d7e512015-03-03 17:12:09 -0800690
Jorim Jaggif3b3bee2015-04-16 14:57:34 -0700691 public void animateCollapsePanels(float speedUpFactor) {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500692 mStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
Jorim Jaggif3b3bee2015-04-16 14:57:34 -0700693 false /* delayed */, speedUpFactor);
Jim Miller25d7e512015-03-03 17:12:09 -0800694 }
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700695
696 /**
697 * Notifies that the user has authenticated by other means than using the bouncer, for example,
698 * fingerprint.
699 */
Jorim Jaggi25b4d4b2015-08-11 15:54:06 -0700700 public void notifyKeyguardAuthenticated(boolean strongAuth) {
701 mBouncer.notifyKeyguardAuthenticated(strongAuth);
Jorim Jaggi5cc86592015-06-08 14:48:28 -0700702 }
Jorim Jaggi0d210f62015-07-10 14:24:44 -0700703
Selim Cinekcfafe4e2015-08-11 14:58:44 -0700704 public void showBouncerMessage(String message, int color) {
705 mBouncer.showMessage(message, color);
706 }
Jorim Jaggib774e552015-08-24 14:52:45 -0700707
708 public ViewRootImpl getViewRootImpl() {
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500709 return mStatusBar.getStatusBarView().getViewRootImpl();
Jorim Jaggib774e552015-08-24 14:52:45 -0700710 }
Adrian Roosfee661c2017-08-04 17:05:45 +0200711
Adrian Roos34e65402017-08-07 19:32:45 +0200712 public void launchPendingWakeupAction() {
713 DismissWithActionRequest request = mPendingWakeupAction;
714 mPendingWakeupAction = null;
Adrian Roosfee661c2017-08-04 17:05:45 +0200715 if (request != null) {
716 if (mShowing) {
717 dismissWithAction(request.dismissAction, request.cancelAction,
Lucas Dupinc80c67e2017-12-04 14:29:10 -0800718 request.afterKeyguardGone, request.message);
Adrian Roosfee661c2017-08-04 17:05:45 +0200719 } else if (request.dismissAction != null) {
720 request.dismissAction.onDismiss();
721 }
722 }
723 }
724
Adrian Roos34e65402017-08-07 19:32:45 +0200725 public void cancelPendingWakeupAction() {
726 DismissWithActionRequest request = mPendingWakeupAction;
727 mPendingWakeupAction = null;
Adrian Roosfee661c2017-08-04 17:05:45 +0200728 if (request != null && request.cancelAction != null) {
729 request.cancelAction.run();
730 }
731 }
732
Lucas Dupin6f0d71f2018-03-23 17:26:06 -0700733 public boolean willDismissWithAction() {
734 return mBouncer.willDismissWithAction();
735 }
736
Lucas Dupinf9ca35e2018-05-16 20:41:35 -0700737 public boolean bouncerNeedsScrimming() {
738 return mBouncer.isShowingScrimmed();
739 }
740
Lucas Dupin15a6b6c2018-04-16 14:50:20 +0800741 public void dump(PrintWriter pw) {
742 pw.println("StatusBarKeyguardViewManager:");
743 pw.println(" mShowing: " + mShowing);
744 pw.println(" mOccluded: " + mOccluded);
745 pw.println(" mRemoteInputActive: " + mRemoteInputActive);
746 pw.println(" mDozing: " + mDozing);
747 pw.println(" mGoingToSleepVisibleNotOccluded: " + mGoingToSleepVisibleNotOccluded);
748 pw.println(" mAfterKeyguardGoneAction: " + mAfterKeyguardGoneAction);
749 pw.println(" mAfterKeyguardGoneRunnables: " + mAfterKeyguardGoneRunnables);
750 pw.println(" mPendingWakeupAction: " + mPendingWakeupAction);
751
752 if (mBouncer != null) {
753 mBouncer.dump(pw);
754 }
755 }
756
Adrian Roos34e65402017-08-07 19:32:45 +0200757 private static class DismissWithActionRequest {
Adrian Roosfee661c2017-08-04 17:05:45 +0200758 final OnDismissAction dismissAction;
759 final Runnable cancelAction;
760 final boolean afterKeyguardGone;
Lucas Dupinc80c67e2017-12-04 14:29:10 -0800761 final String message;
Adrian Roosfee661c2017-08-04 17:05:45 +0200762
Adrian Roos34e65402017-08-07 19:32:45 +0200763 DismissWithActionRequest(OnDismissAction dismissAction, Runnable cancelAction,
Lucas Dupinc80c67e2017-12-04 14:29:10 -0800764 boolean afterKeyguardGone, String message) {
Adrian Roosfee661c2017-08-04 17:05:45 +0200765 this.dismissAction = dismissAction;
766 this.cancelAction = cancelAction;
767 this.afterKeyguardGone = afterKeyguardGone;
Lucas Dupinc80c67e2017-12-04 14:29:10 -0800768 this.message = message;
Adrian Roosfee661c2017-08-04 17:05:45 +0200769 }
770 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100771}