blob: 4d601218b7ca1e0a42323f6a72ec693e58a64e6c [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
Adrian Roos7b54b072018-03-08 12:52:22 +010019import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
20
Eliot Courtneye77edea2017-11-15 14:25:21 +090021import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT;
22
Sudheer Shankadc589ac2016-11-10 15:30:17 -080023import android.app.ActivityManager;
Jorim Jaggif6782ee2016-07-22 11:40:00 +020024import android.app.IActivityManager;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010025import android.content.Context;
26import android.content.pm.ActivityInfo;
27import android.content.res.Resources;
28import android.graphics.PixelFormat;
Wale Ogunwale6ce0fb82016-12-13 14:24:00 -080029import android.os.Binder;
Jorim Jaggif6782ee2016-07-22 11:40:00 +020030import android.os.RemoteException;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010031import android.os.SystemProperties;
Jorim Jaggif6782ee2016-07-22 11:40:00 +020032import android.util.Log;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010033import android.view.Gravity;
34import android.view.View;
35import android.view.ViewGroup;
36import android.view.WindowManager;
Jorim Jaggif12ec0f2017-08-23 16:14:10 +020037import android.view.WindowManager.LayoutParams;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010038
Lucas Dupina3e36272018-08-21 13:22:33 -070039import com.android.internal.annotations.VisibleForTesting;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010040import com.android.keyguard.R;
Jason Monk421a9412017-02-06 09:15:21 -080041import com.android.systemui.Dumpable;
Jorim Jaggi6b88cdf2014-12-22 20:56:50 +010042import com.android.systemui.keyguard.KeyguardViewMediator;
Adrian Roosd28ccd72016-01-06 15:23:14 +010043import com.android.systemui.statusbar.RemoteInputController;
Jorim Jaggiecbab362014-04-23 16:13:15 +020044import com.android.systemui.statusbar.StatusBarState;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010045
Selim Cinek7025f262015-07-13 16:22:48 -070046import java.io.FileDescriptor;
47import java.io.PrintWriter;
Selim Cinek6a1bd2b2015-06-02 16:02:41 +020048import java.lang.reflect.Field;
49
Jorim Jaggi5cf17872014-03-26 18:31:48 +010050/**
51 * Encapsulates all logic for the status bar window state management.
52 */
Lucas Dupin1a8588d2018-08-21 12:18:47 -070053public class StatusBarWindowController implements RemoteInputController.Callback, Dumpable {
Jorim Jaggi5cf17872014-03-26 18:31:48 +010054
Lucas Dupin1a8588d2018-08-21 12:18:47 -070055 private static final String TAG = "StatusBarWindowController";
Jorim Jaggif6782ee2016-07-22 11:40:00 +020056
Jorim Jaggi5cf17872014-03-26 18:31:48 +010057 private final Context mContext;
58 private final WindowManager mWindowManager;
Jorim Jaggif6782ee2016-07-22 11:40:00 +020059 private final IActivityManager mActivityManager;
Lucas Dupin7517b5d2017-08-22 12:51:25 -070060 private final DozeParameters mDozeParameters;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010061 private View mStatusBarView;
62 private WindowManager.LayoutParams mLp;
Jorim Jaggi95e89ca2014-11-24 20:12:50 +010063 private WindowManager.LayoutParams mLpChanged;
Jorim Jaggif6782ee2016-07-22 11:40:00 +020064 private boolean mHasTopUi;
65 private boolean mHasTopUiChanged;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010066 private int mBarHeight;
67 private final boolean mKeyguardScreenRotation;
Adrian Roos3e23eb52017-07-07 15:58:57 +020068 private float mScreenBrightnessDoze;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010069 private final State mCurrentState = new State();
Jason Monk421a9412017-02-06 09:15:21 -080070 private OtherwisedCollapsedListener mListener;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010071
Lucas Dupin1a8588d2018-08-21 12:18:47 -070072 public StatusBarWindowController(Context context) {
Lucas Dupina3e36272018-08-21 13:22:33 -070073 this(context, context.getSystemService(WindowManager.class), ActivityManager.getService(),
74 DozeParameters.getInstance(context));
75 }
76
77 @VisibleForTesting
78 StatusBarWindowController(Context context, WindowManager windowManager,
79 IActivityManager activityManager, DozeParameters dozeParameters) {
Jorim Jaggi5cf17872014-03-26 18:31:48 +010080 mContext = context;
Lucas Dupina3e36272018-08-21 13:22:33 -070081 mWindowManager = windowManager;
82 mActivityManager = activityManager;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010083 mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
Lucas Dupina3e36272018-08-21 13:22:33 -070084 mDozeParameters = dozeParameters;
Lucas Dupin7517b5d2017-08-22 12:51:25 -070085 mScreenBrightnessDoze = mDozeParameters.getScreenBrightnessDoze();
Jorim Jaggi5cf17872014-03-26 18:31:48 +010086 }
87
88 private boolean shouldEnableKeyguardScreenRotation() {
89 Resources res = mContext.getResources();
90 return SystemProperties.getBoolean("lockscreen.rot_override", false)
91 || res.getBoolean(R.bool.config_enableLockScreenRotation);
92 }
93
94 /**
95 * Adds the status bar view to the window manager.
96 *
97 * @param statusBarView The view to add.
98 * @param barHeight The height of the status bar in collapsed state.
99 */
100 public void add(View statusBarView, int barHeight) {
101
102 // Now that the status bar window encompasses the sliding panel and its
103 // translucent backdrop, the entire thing is made TRANSLUCENT and is
104 // hardware-accelerated.
105 mLp = new WindowManager.LayoutParams(
106 ViewGroup.LayoutParams.MATCH_PARENT,
107 barHeight,
108 WindowManager.LayoutParams.TYPE_STATUS_BAR,
109 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
110 | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
111 | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
112 | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
Adrian Roosea562512014-05-05 13:33:03 +0200113 | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100114 PixelFormat.TRANSLUCENT);
Wale Ogunwale6ce0fb82016-12-13 14:24:00 -0800115 mLp.token = new Binder();
Jorim Jaggi76aaef52014-05-08 19:16:49 +0200116 mLp.gravity = Gravity.TOP;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100117 mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100118 mLp.setTitle("StatusBar");
119 mLp.packageName = mContext.getPackageName();
Adrian Roos7b54b072018-03-08 12:52:22 +0100120 mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100121 mStatusBarView = statusBarView;
122 mBarHeight = barHeight;
123 mWindowManager.addView(mStatusBarView, mLp);
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100124 mLpChanged = new WindowManager.LayoutParams();
125 mLpChanged.copyFrom(mLp);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100126 }
127
Adrian Roos3e23eb52017-07-07 15:58:57 +0200128 public void setDozeScreenBrightness(int value) {
129 mScreenBrightnessDoze = value / 255f;
130 }
131
Lucas Dupin987f1932017-05-13 21:02:52 -0700132 public void setKeyguardDark(boolean dark) {
133 int vis = mStatusBarView.getSystemUiVisibility();
134 if (dark) {
135 vis = vis | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
136 vis = vis | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
137 } else {
138 vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
139 vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
140 }
141 mStatusBarView.setSystemUiVisibility(vis);
142 }
143
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100144 private void applyKeyguardFlags(State state) {
145 if (state.keyguardShowing) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100146 mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100147 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100148 mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100149 }
Adrian Roosd5c2db62016-03-08 16:11:31 -0800150
Lucas Dupin16cfe452018-02-08 13:14:50 -0800151 final boolean scrimsOccludingWallpaper =
152 state.scrimsVisibility == ScrimController.VISIBILITY_FULLY_OPAQUE;
Lucas Dupin47a65c72018-02-15 14:16:18 -0800153 final boolean keyguardOrAod = state.keyguardShowing
154 || (state.dozing && mDozeParameters.getAlwaysOn());
Selim Cinekdbf172e2018-08-08 18:31:45 +0000155 if (keyguardOrAod && !state.backdropShowing && !scrimsOccludingWallpaper) {
Adrian Roosd5c2db62016-03-08 16:11:31 -0800156 mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
157 } else {
158 mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
159 }
Lucas Dupina3e36272018-08-21 13:22:33 -0700160
161 if (state.dozing) {
162 mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
163 } else {
164 mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
165 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100166 }
167
168 private void adjustScreenOrientation(State state) {
Adrian Roos82069442017-06-28 19:37:24 +0200169 if (state.isKeyguardShowingAndNotOccluded() || state.dozing) {
Jorim Jaggica36cf72014-04-17 20:36:15 +0200170 if (mKeyguardScreenRotation) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100171 mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
Jorim Jaggica36cf72014-04-17 20:36:15 +0200172 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100173 mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
Jorim Jaggica36cf72014-04-17 20:36:15 +0200174 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100175 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100176 mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100177 }
178 }
179
180 private void applyFocusableFlag(State state) {
Selim Cinek4a21a7f2015-05-19 11:00:38 -0700181 boolean panelFocusable = state.statusBarFocusable && state.panelExpanded;
Jorim Jaggibb336692016-11-15 15:24:26 -0800182 if (state.bouncerShowing && (state.keyguardOccluded || state.keyguardNeedsInput)
Eliot Courtneye77edea2017-11-15 14:25:21 +0900183 || ENABLE_REMOTE_INPUT && state.remoteInputActive) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100184 mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
185 mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
Selim Cinek4a21a7f2015-05-19 11:00:38 -0700186 } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100187 mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
188 mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100189 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100190 mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
191 mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100192 }
Adrian Roosdc5b4532016-01-06 20:49:41 +0100193
Adrian Roos5153d4a2016-03-22 10:01:56 -0700194 mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100195 }
196
Tiger Huanga90dea42018-08-03 17:20:17 +0800197 private void applyForceShowNavigationFlag(State state) {
198 if (state.panelExpanded || state.bouncerShowing
Tiger Huang34046012018-06-29 15:26:52 +0800199 || ENABLE_REMOTE_INPUT && state.remoteInputActive) {
Tiger Huanga90dea42018-08-03 17:20:17 +0800200 mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
Tiger Huang34046012018-06-29 15:26:52 +0800201 } else {
Tiger Huanga90dea42018-08-03 17:20:17 +0800202 mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_STATUS_FORCE_SHOW_NAVIGATION;
Tiger Huang34046012018-06-29 15:26:52 +0800203 }
204 }
205
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100206 private void applyHeight(State state) {
Selim Cinek6a1bd2b2015-06-02 16:02:41 +0200207 boolean expanded = isExpanded(state);
Jason Monk421a9412017-02-06 09:15:21 -0800208 if (state.forcePluginOpen) {
209 mListener.setWouldOtherwiseCollapse(expanded);
210 expanded = true;
211 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100212 if (expanded) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100213 mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100214 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100215 mLpChanged.height = mBarHeight;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100216 }
217 }
218
Selim Cinek6a1bd2b2015-06-02 16:02:41 +0200219 private boolean isExpanded(State state) {
220 return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded()
221 || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing
Lucas Dupin82aa1632017-12-13 00:13:57 -0800222 || state.headsUpShowing
223 || state.scrimsVisibility != ScrimController.VISIBILITY_FULLY_TRANSPARENT);
Selim Cinek6a1bd2b2015-06-02 16:02:41 +0200224 }
225
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200226 private void applyFitsSystemWindows(State state) {
Adrian Roosa5d6cd02016-07-27 15:12:40 -0700227 boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded();
228 if (mStatusBarView.getFitsSystemWindows() != fitsSystemWindows) {
229 mStatusBarView.setFitsSystemWindows(fitsSystemWindows);
230 mStatusBarView.requestApplyInsets();
231 }
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200232 }
233
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100234 private void applyUserActivityTimeout(State state) {
Jorim Jaggiecbab362014-04-23 16:13:15 +0200235 if (state.isKeyguardShowingAndNotOccluded()
Jorim Jaggib690f0d2014-07-03 23:25:44 +0200236 && state.statusBarState == StatusBarState.KEYGUARD
237 && !state.qsExpanded) {
Jorim Jaggi6b88cdf2014-12-22 20:56:50 +0100238 mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100239 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100240 mLpChanged.userActivityTimeout = -1;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100241 }
242 }
243
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200244 private void applyInputFeatures(State state) {
Jorim Jaggi4222d9a2014-04-23 16:13:15 +0200245 if (state.isKeyguardShowingAndNotOccluded()
Jorim Jaggib690f0d2014-07-03 23:25:44 +0200246 && state.statusBarState == StatusBarState.KEYGUARD
Vadim Tryshev6069c402016-03-09 14:24:29 -0800247 && !state.qsExpanded && !state.forceUserActivity) {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100248 mLpChanged.inputFeatures |=
249 WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200250 } else {
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100251 mLpChanged.inputFeatures &=
252 ~WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200253 }
254 }
255
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100256 private void apply(State state) {
257 applyKeyguardFlags(state);
Selim Cinek4a4a2bddc2015-05-07 12:50:19 -0700258 applyForceStatusBarVisibleFlag(state);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100259 applyFocusableFlag(state);
Tiger Huanga90dea42018-08-03 17:20:17 +0800260 applyForceShowNavigationFlag(state);
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100261 adjustScreenOrientation(state);
262 applyHeight(state);
263 applyUserActivityTimeout(state);
Jorim Jaggi03c701e2014-04-02 12:39:51 +0200264 applyInputFeatures(state);
Jorim Jaggia005f1b2014-04-16 19:06:10 +0200265 applyFitsSystemWindows(state);
Selim Cineka59ecc32015-04-07 10:51:49 -0700266 applyModalFlag(state);
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700267 applyBrightness(state);
Jorim Jaggif6782ee2016-07-22 11:40:00 +0200268 applyHasTopUi(state);
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200269 applySleepToken(state);
Jorim Jaggi95e89ca2014-11-24 20:12:50 +0100270 if (mLp.copyFrom(mLpChanged) != 0) {
271 mWindowManager.updateViewLayout(mStatusBarView, mLp);
272 }
Jorim Jaggif6782ee2016-07-22 11:40:00 +0200273 if (mHasTopUi != mHasTopUiChanged) {
274 try {
275 mActivityManager.setHasTopUi(mHasTopUiChanged);
276 } catch (RemoteException e) {
277 Log.e(TAG, "Failed to call setHasTopUi", e);
278 }
279 mHasTopUi = mHasTopUiChanged;
280 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100281 }
282
Selim Cinek4a4a2bddc2015-05-07 12:50:19 -0700283 private void applyForceStatusBarVisibleFlag(State state) {
284 if (state.forceStatusBarVisible) {
285 mLpChanged.privateFlags |= WindowManager
286 .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
287 } else {
288 mLpChanged.privateFlags &= ~WindowManager
289 .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
290 }
291 }
292
Selim Cineka59ecc32015-04-07 10:51:49 -0700293 private void applyModalFlag(State state) {
294 if (state.headsUpShowing) {
295 mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
296 } else {
297 mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
298 }
299 }
300
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700301 private void applyBrightness(State state) {
302 if (state.forceDozeBrightness) {
303 mLpChanged.screenBrightness = mScreenBrightnessDoze;
304 } else {
305 mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
306 }
307 }
308
Jorim Jaggif6782ee2016-07-22 11:40:00 +0200309 private void applyHasTopUi(State state) {
310 mHasTopUiChanged = isExpanded(state);
311 }
312
Jorim Jaggif12ec0f2017-08-23 16:14:10 +0200313 private void applySleepToken(State state) {
314 if (state.dozing) {
315 mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
316 } else {
317 mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
318 }
319 }
320
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100321 public void setKeyguardShowing(boolean showing) {
322 mCurrentState.keyguardShowing = showing;
323 apply(mCurrentState);
324 }
325
326 public void setKeyguardOccluded(boolean occluded) {
327 mCurrentState.keyguardOccluded = occluded;
328 apply(mCurrentState);
329 }
330
331 public void setKeyguardNeedsInput(boolean needsInput) {
332 mCurrentState.keyguardNeedsInput = needsInput;
333 apply(mCurrentState);
334 }
335
Selim Cinek4a21a7f2015-05-19 11:00:38 -0700336 public void setPanelVisible(boolean visible) {
337 mCurrentState.panelVisible = visible;
338 mCurrentState.statusBarFocusable = visible;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100339 apply(mCurrentState);
340 }
341
342 public void setStatusBarFocusable(boolean focusable) {
343 mCurrentState.statusBarFocusable = focusable;
344 apply(mCurrentState);
345 }
346
Jorim Jaggi5fd4d052014-05-13 22:50:20 +0200347 public void setBouncerShowing(boolean showing) {
348 mCurrentState.bouncerShowing = showing;
349 apply(mCurrentState);
350 }
351
Adrian Roosd5c2db62016-03-08 16:11:31 -0800352 public void setBackdropShowing(boolean showing) {
353 mCurrentState.backdropShowing = showing;
354 apply(mCurrentState);
355 }
356
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200357 public void setKeyguardFadingAway(boolean keyguardFadingAway) {
358 mCurrentState.keyguardFadingAway = keyguardFadingAway;
359 apply(mCurrentState);
360 }
361
Jorim Jaggib690f0d2014-07-03 23:25:44 +0200362 public void setQsExpanded(boolean expanded) {
363 mCurrentState.qsExpanded = expanded;
364 apply(mCurrentState);
365 }
366
Vadim Tryshev6069c402016-03-09 14:24:29 -0800367 public void setForceUserActivity(boolean forceUserActivity) {
368 mCurrentState.forceUserActivity = forceUserActivity;
369 apply(mCurrentState);
370 }
371
Lucas Dupin82aa1632017-12-13 00:13:57 -0800372 public void setScrimsVisibility(int scrimsVisibility) {
373 mCurrentState.scrimsVisibility = scrimsVisibility;
Adrian Roosa5c63222017-07-27 16:33:39 +0200374 apply(mCurrentState);
375 }
376
Selim Cinekb8f09cf2015-03-16 17:09:28 -0700377 public void setHeadsUpShowing(boolean showing) {
378 mCurrentState.headsUpShowing = showing;
379 apply(mCurrentState);
380 }
381
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700382 public void setWallpaperSupportsAmbientMode(boolean supportsAmbientMode) {
383 mCurrentState.wallpaperSupportsAmbientMode = supportsAmbientMode;
384 apply(mCurrentState);
385 }
386
Jorim Jaggiecbab362014-04-23 16:13:15 +0200387 /**
388 * @param state The {@link StatusBarState} of the status bar.
389 */
390 public void setStatusBarState(int state) {
391 mCurrentState.statusBarState = state;
392 apply(mCurrentState);
393 }
394
Selim Cinek4a4a2bddc2015-05-07 12:50:19 -0700395 public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
396 mCurrentState.forceStatusBarVisible = forceStatusBarVisible;
397 apply(mCurrentState);
398 }
399
Selim Cinek737bff32015-05-08 16:08:35 -0700400 /**
401 * Force the window to be collapsed, even if it should theoretically be expanded.
402 * Used for when a heads-up comes in but we still need to wait for the touchable regions to
403 * be computed.
404 */
405 public void setForceWindowCollapsed(boolean force) {
406 mCurrentState.forceCollapsed = force;
407 apply(mCurrentState);
408 }
409
Selim Cinek4a21a7f2015-05-19 11:00:38 -0700410 public void setPanelExpanded(boolean isExpanded) {
411 mCurrentState.panelExpanded = isExpanded;
412 apply(mCurrentState);
413 }
414
Adrian Roosd28ccd72016-01-06 15:23:14 +0100415 @Override
416 public void onRemoteInputActive(boolean remoteInputActive) {
Adrian Roos1c0ca502015-10-07 12:20:42 -0700417 mCurrentState.remoteInputActive = remoteInputActive;
418 apply(mCurrentState);
419 }
420
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700421 /**
422 * Set whether the screen brightness is forced to the value we use for doze mode by the status
423 * bar window.
424 */
425 public void setForceDozeBrightness(boolean forceDozeBrightness) {
426 mCurrentState.forceDozeBrightness = forceDozeBrightness;
427 apply(mCurrentState);
428 }
429
Adrian Roos67cca742017-04-13 16:52:51 -0700430 public void setDozing(boolean dozing) {
431 mCurrentState.dozing = dozing;
432 apply(mCurrentState);
433 }
434
Jorim Jaggi11c62e12016-04-05 20:41:21 -0700435 public void setBarHeight(int barHeight) {
436 mBarHeight = barHeight;
437 apply(mCurrentState);
438 }
439
Jason Monk421a9412017-02-06 09:15:21 -0800440 public void setForcePluginOpen(boolean forcePluginOpen) {
441 mCurrentState.forcePluginOpen = forcePluginOpen;
442 apply(mCurrentState);
443 }
444
445 public void setStateListener(OtherwisedCollapsedListener listener) {
446 mListener = listener;
447 }
448
Selim Cinek7025f262015-07-13 16:22:48 -0700449 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
Lucas Dupin1a8588d2018-08-21 12:18:47 -0700450 pw.println("StatusBarWindowController state:");
Selim Cinek7025f262015-07-13 16:22:48 -0700451 pw.println(mCurrentState);
Selim Cinek6a1bd2b2015-06-02 16:02:41 +0200452 }
453
Adrian Roosd5c2db62016-03-08 16:11:31 -0800454 public boolean isShowingWallpaper() {
455 return !mCurrentState.backdropShowing;
456 }
457
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100458 private static class State {
459 boolean keyguardShowing;
460 boolean keyguardOccluded;
461 boolean keyguardNeedsInput;
Selim Cinek4a21a7f2015-05-19 11:00:38 -0700462 boolean panelVisible;
463 boolean panelExpanded;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100464 boolean statusBarFocusable;
Jorim Jaggi5fd4d052014-05-13 22:50:20 +0200465 boolean bouncerShowing;
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200466 boolean keyguardFadingAway;
Jorim Jaggib690f0d2014-07-03 23:25:44 +0200467 boolean qsExpanded;
Selim Cinekb8f09cf2015-03-16 17:09:28 -0700468 boolean headsUpShowing;
Selim Cinek4a4a2bddc2015-05-07 12:50:19 -0700469 boolean forceStatusBarVisible;
Selim Cinek737bff32015-05-08 16:08:35 -0700470 boolean forceCollapsed;
Jorim Jaggi83eb6bb2015-08-17 17:38:58 -0700471 boolean forceDozeBrightness;
Vadim Tryshev6069c402016-03-09 14:24:29 -0800472 boolean forceUserActivity;
Adrian Roosd5c2db62016-03-08 16:11:31 -0800473 boolean backdropShowing;
Lucas Dupin7517b5d2017-08-22 12:51:25 -0700474 boolean wallpaperSupportsAmbientMode;
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100475
Jorim Jaggiecbab362014-04-23 16:13:15 +0200476 /**
Jason Monk2a6ea9c2017-01-26 11:14:51 -0500477 * The {@link StatusBar} state from the status bar.
Jorim Jaggiecbab362014-04-23 16:13:15 +0200478 */
479 int statusBarState;
480
Adrian Roos1c0ca502015-10-07 12:20:42 -0700481 boolean remoteInputActive;
Jason Monk421a9412017-02-06 09:15:21 -0800482 boolean forcePluginOpen;
Adrian Roos67cca742017-04-13 16:52:51 -0700483 boolean dozing;
Lucas Dupin82aa1632017-12-13 00:13:57 -0800484 int scrimsVisibility;
Adrian Roos1c0ca502015-10-07 12:20:42 -0700485
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100486 private boolean isKeyguardShowingAndNotOccluded() {
487 return keyguardShowing && !keyguardOccluded;
488 }
Selim Cinek6a1bd2b2015-06-02 16:02:41 +0200489
490 @Override
491 public String toString() {
492 StringBuilder result = new StringBuilder();
493 String newLine = "\n";
494 result.append("Window State {");
495 result.append(newLine);
496
497 Field[] fields = this.getClass().getDeclaredFields();
498
499 // Print field names paired with their values
500 for (Field field : fields) {
501 result.append(" ");
502 try {
503 result.append(field.getName());
504 result.append(": ");
505 //requires access to private field:
506 result.append(field.get(this));
507 } catch (IllegalAccessException ex) {
508 }
509 result.append(newLine);
510 }
511 result.append("}");
512
513 return result.toString();
514 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100515 }
Jason Monk421a9412017-02-06 09:15:21 -0800516
517 /**
518 * Custom listener to pipe data back to plugins about whether or not the status bar would be
519 * collapsed if not for the plugin.
520 * TODO: Find cleaner way to do this.
521 */
522 public interface OtherwisedCollapsedListener {
523 void setWouldOtherwiseCollapse(boolean otherwiseCollapse);
524 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100525}