15cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/*
25cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project
35cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *
45cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
55cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * you may not use this file except in compliance with the License.
65cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * You may obtain a copy of the License at
75cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *
85cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
95cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi *
105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * See the License for the specific language governing permissions and
145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * limitations under the License
155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipackage com.android.systemui.statusbar.phone;
185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
19dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shankaimport android.app.ActivityManager;
20f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.app.IActivityManager;
215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.Context;
225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.pm.ActivityInfo;
235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.res.Resources;
245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.graphics.PixelFormat;
256ce0fb8ddbdc726d55c81a4bf797f028e441e448Wale Ogunwaleimport android.os.Binder;
26f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.os.RemoteException;
275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.SystemProperties;
28f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.util.Log;
295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.Gravity;
305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.View;
315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.ViewGroup;
325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.WindowManager;
33f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggiimport android.view.WindowManager.LayoutParams;
345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.R;
36421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monkimport com.android.systemui.Dumpable;
376b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggiimport com.android.systemui.keyguard.KeyguardViewMediator;
38d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roosimport com.android.systemui.statusbar.RemoteInputController;
39ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
417025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.FileDescriptor;
427025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.PrintWriter;
436a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinekimport java.lang.reflect.Field;
446a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/**
465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Encapsulates all logic for the status bar window state management.
475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
48421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monkpublic class StatusBarWindowManager implements RemoteInputController.Callback, Dumpable {
495cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
50f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private static final String TAG = "StatusBarWindowManager";
51f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi
525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final Context mContext;
535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final WindowManager mWindowManager;
54f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private final IActivityManager mActivityManager;
555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private View mStatusBarView;
565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private WindowManager.LayoutParams mLp;
5795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi    private WindowManager.LayoutParams mLpChanged;
58f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private boolean mHasTopUi;
59f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private boolean mHasTopUiChanged;
605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private int mBarHeight;
615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final boolean mKeyguardScreenRotation;
623e23eb59d09faca2e40e308a191d8499ffdb6ab3Adrian Roos    private float mScreenBrightnessDoze;
635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final State mCurrentState = new State();
64421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    private OtherwisedCollapsedListener mListener;
655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public StatusBarWindowManager(Context context) {
675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContext = context;
685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
69dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka        mActivityManager = ActivityManager.getService();
705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
7183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mScreenBrightnessDoze = mContext.getResources().getInteger(
7283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                com.android.internal.R.integer.config_screenBrightnessDoze) / 255f;
735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private boolean shouldEnableKeyguardScreenRotation() {
765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        Resources res = mContext.getResources();
775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        return SystemProperties.getBoolean("lockscreen.rot_override", false)
785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                || res.getBoolean(R.bool.config_enableLockScreenRotation);
795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Adds the status bar view to the window manager.
835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     *
845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @param statusBarView The view to add.
855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @param barHeight The height of the status bar in collapsed state.
865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void add(View statusBarView, int barHeight) {
885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // Now that the status bar window encompasses the sliding panel and its
905cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // translucent backdrop, the entire thing is made TRANSLUCENT and is
915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // hardware-accelerated.
925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp = new WindowManager.LayoutParams(
935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                ViewGroup.LayoutParams.MATCH_PARENT,
945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                barHeight,
955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                WindowManager.LayoutParams.TYPE_STATUS_BAR,
965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
975cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
985cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
100ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
1015cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                PixelFormat.TRANSLUCENT);
1026ce0fb8ddbdc726d55c81a4bf797f028e441e448Wale Ogunwale        mLp.token = new Binder();
10376aaef537a83486134a8118331b70854fbdecc3eJorim Jaggi        mLp.gravity = Gravity.TOP;
1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
1055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.setTitle("StatusBar");
1065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.packageName = mContext.getPackageName();
1075cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mStatusBarView = statusBarView;
1085cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mBarHeight = barHeight;
1095cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mWindowManager.addView(mStatusBarView, mLp);
11095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        mLpChanged = new WindowManager.LayoutParams();
11195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        mLpChanged.copyFrom(mLp);
1125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1143e23eb59d09faca2e40e308a191d8499ffdb6ab3Adrian Roos    public void setDozeScreenBrightness(int value) {
1153e23eb59d09faca2e40e308a191d8499ffdb6ab3Adrian Roos        mScreenBrightnessDoze = value / 255f;
1163e23eb59d09faca2e40e308a191d8499ffdb6ab3Adrian Roos    }
1173e23eb59d09faca2e40e308a191d8499ffdb6ab3Adrian Roos
118987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin    public void setKeyguardDark(boolean dark) {
119987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin        int vis = mStatusBarView.getSystemUiVisibility();
120987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin        if (dark) {
121987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin            vis = vis | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
122987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin            vis = vis | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
123987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin        } else {
124987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin            vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
125987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin            vis = vis & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
126987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin        }
127987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin        mStatusBarView.setSystemUiVisibility(vis);
128987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin    }
129987f1937a0231a2b6d09bf7c3bbb7df9de04d6b4Lucas Dupin
1305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyKeyguardFlags(State state) {
1315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        if (state.keyguardShowing) {
13295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
1335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
13495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
1355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
136d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
13767cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos        if (state.keyguardShowing && !state.backdropShowing && !state.dozing) {
138d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
139d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        } else {
140d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
141d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        }
1425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void adjustScreenOrientation(State state) {
1458206944f26715283a412c897d638bf4cf4bd5f4dAdrian Roos        if (state.isKeyguardShowingAndNotOccluded() || state.dozing) {
146ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            if (mKeyguardScreenRotation) {
14795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
148ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            } else {
14995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
150ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            }
1515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
15295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
1535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyFocusableFlag(State state) {
1574a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelFocusable = state.statusBarFocusable && state.panelExpanded;
158bb336699bd7127742d43db4e2bed9c60220d0620Jorim Jaggi        if (state.bouncerShowing && (state.keyguardOccluded || state.keyguardNeedsInput)
1592a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk                || StatusBar.ENABLE_REMOTE_INPUT && state.remoteInputActive) {
16095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
16195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1624a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
16395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
16495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
16695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
16795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
169dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos
1705153d4ac95bc128ecf634d09b9e647cd20e70a65Adrian Roos        mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
1715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyHeight(State state) {
1746a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        boolean expanded = isExpanded(state);
175421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        if (state.forcePluginOpen) {
176421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk            mListener.setWouldOtherwiseCollapse(expanded);
177421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk            expanded = true;
178421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        }
1795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        if (expanded) {
18095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT;
1815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
18295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.height = mBarHeight;
1835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1866a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    private boolean isExpanded(State state) {
1876a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded()
1886a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing
189a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos                || state.headsUpShowing || state.scrimsVisible);
1906a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
1916a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
192a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    private void applyFitsSystemWindows(State state) {
193a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos        boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded();
194a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos        if (mStatusBarView.getFitsSystemWindows() != fitsSystemWindows) {
195a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos            mStatusBarView.setFitsSystemWindows(fitsSystemWindows);
196a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos            mStatusBarView.requestApplyInsets();
197a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos        }
198a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    }
199a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
2005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyUserActivityTimeout(State state) {
201ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()
202b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && state.statusBarState == StatusBarState.KEYGUARD
203b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && !state.qsExpanded) {
2046b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi            mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
2055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
20695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.userActivityTimeout = -1;
2075cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
2085cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2095cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
21003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private void applyInputFeatures(State state) {
2114222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()
212b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && state.statusBarState == StatusBarState.KEYGUARD
2136069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev                && !state.qsExpanded && !state.forceUserActivity) {
21495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.inputFeatures |=
21595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                    WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
21603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        } else {
21795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.inputFeatures &=
21895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                    ~WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
21903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        }
22003c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    }
22103c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi
2225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void apply(State state) {
2235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyKeyguardFlags(state);
2244a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        applyForceStatusBarVisibleFlag(state);
2255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyFocusableFlag(state);
2265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        adjustScreenOrientation(state);
2275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyHeight(state);
2285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyUserActivityTimeout(state);
22903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        applyInputFeatures(state);
230a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        applyFitsSystemWindows(state);
231a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        applyModalFlag(state);
23283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        applyBrightness(state);
233f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        applyHasTopUi(state);
234f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi        applySleepToken(state);
23595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        if (mLp.copyFrom(mLpChanged) != 0) {
23695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mWindowManager.updateViewLayout(mStatusBarView, mLp);
23795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        }
238f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        if (mHasTopUi != mHasTopUiChanged) {
239f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            try {
240f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi                mActivityManager.setHasTopUi(mHasTopUiChanged);
241f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            } catch (RemoteException e) {
242f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi                Log.e(TAG, "Failed to call setHasTopUi", e);
243f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            }
244f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            mHasTopUi = mHasTopUiChanged;
245f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        }
2465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2484a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    private void applyForceStatusBarVisibleFlag(State state) {
2494a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        if (state.forceStatusBarVisible) {
2504a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            mLpChanged.privateFlags |= WindowManager
2514a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek                    .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
2524a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        } else {
2534a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            mLpChanged.privateFlags &= ~WindowManager
2544a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek                    .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
2554a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        }
2564a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
2574a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
258a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek    private void applyModalFlag(State state) {
259a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        if (state.headsUpShowing) {
260a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
261a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        } else {
262a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
263a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        }
264a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek    }
265a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek
26683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private void applyBrightness(State state) {
26783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        if (state.forceDozeBrightness) {
26883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            mLpChanged.screenBrightness = mScreenBrightnessDoze;
26983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        } else {
27083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
27183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        }
27283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
27383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
274f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private void applyHasTopUi(State state) {
275f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        mHasTopUiChanged = isExpanded(state);
276f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    }
277f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi
278f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi    private void applySleepToken(State state) {
279f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi        if (state.dozing) {
280f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi            mLpChanged.privateFlags |= LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
281f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi        } else {
282f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi            mLpChanged.privateFlags &= ~LayoutParams.PRIVATE_FLAG_ACQUIRES_SLEEP_TOKEN;
283f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi        }
284f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi    }
285f12ec0fb6419920d3aa606141a91343cc9421275Jorim Jaggi
2865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
2875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardShowing = showing;
2885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2905cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardOccluded(boolean occluded) {
2925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardOccluded = occluded;
2935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardNeedsInput(boolean needsInput) {
2975cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardNeedsInput = needsInput;
2985cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
3014a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelVisible(boolean visible) {
3024a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelVisible = visible;
3034a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.statusBarFocusable = visible;
3045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
3055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
3075cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setStatusBarFocusable(boolean focusable) {
3085cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.statusBarFocusable = focusable;
3095cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
3105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
3125fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi    public void setBouncerShowing(boolean showing) {
3135fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        mCurrentState.bouncerShowing = showing;
3145fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        apply(mCurrentState);
3155fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi    }
3165fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi
317d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    public void setBackdropShowing(boolean showing) {
318d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        mCurrentState.backdropShowing = showing;
319d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        apply(mCurrentState);
320d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    }
321d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
322e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    public void setKeyguardFadingAway(boolean keyguardFadingAway) {
323e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mCurrentState.keyguardFadingAway = keyguardFadingAway;
324e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        apply(mCurrentState);
325e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
326e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
327b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    public void setQsExpanded(boolean expanded) {
328b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        mCurrentState.qsExpanded = expanded;
329b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        apply(mCurrentState);
330b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    }
331b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi
3326069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    public void setForceUserActivity(boolean forceUserActivity) {
3336069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        mCurrentState.forceUserActivity = forceUserActivity;
3346069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        apply(mCurrentState);
3356069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    }
3366069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev
337a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos    public void setScrimsVisible(boolean scrimsVisible) {
338a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos        mCurrentState.scrimsVisible = scrimsVisible;
339a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos        apply(mCurrentState);
340a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos    }
341a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos
342b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    public void setHeadsUpShowing(boolean showing) {
343b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        mCurrentState.headsUpShowing = showing;
344b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        apply(mCurrentState);
345b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
346b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
347ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    /**
348ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     * @param state The {@link StatusBarState} of the status bar.
349ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     */
350ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    public void setStatusBarState(int state) {
351ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        mCurrentState.statusBarState = state;
352ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        apply(mCurrentState);
353ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    }
354ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
3554a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
3564a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        mCurrentState.forceStatusBarVisible = forceStatusBarVisible;
3574a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        apply(mCurrentState);
3584a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
3594a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
360737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    /**
361737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Force the window to be collapsed, even if it should theoretically be expanded.
362737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Used for when a heads-up comes in but we still need to wait for the touchable regions to
363737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * be computed.
364737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     */
365737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    public void setForceWindowCollapsed(boolean force) {
366737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        mCurrentState.forceCollapsed = force;
367737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        apply(mCurrentState);
368737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    }
369737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek
3704a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelExpanded(boolean isExpanded) {
3714a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelExpanded = isExpanded;
3724a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        apply(mCurrentState);
3734a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    }
3744a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek
375d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    @Override
376d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    public void onRemoteInputActive(boolean remoteInputActive) {
3771c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        mCurrentState.remoteInputActive = remoteInputActive;
3781c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        apply(mCurrentState);
3791c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos    }
3801c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
38183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    /**
38283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * Set whether the screen brightness is forced to the value we use for doze mode by the status
38383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * bar window.
38483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     */
38583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public void setForceDozeBrightness(boolean forceDozeBrightness) {
38683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mCurrentState.forceDozeBrightness = forceDozeBrightness;
38783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        apply(mCurrentState);
38883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
38983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
39067cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos    public void setDozing(boolean dozing) {
39167cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos        mCurrentState.dozing = dozing;
39267cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos        apply(mCurrentState);
39367cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos    }
39467cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos
39511c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi    public void setBarHeight(int barHeight) {
39611c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi        mBarHeight = barHeight;
39711c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi        apply(mCurrentState);
39811c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi    }
39911c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi
400421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    public void setForcePluginOpen(boolean forcePluginOpen) {
401421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        mCurrentState.forcePluginOpen = forcePluginOpen;
402421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        apply(mCurrentState);
403421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    }
404421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk
405421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    public void setStateListener(OtherwisedCollapsedListener listener) {
406421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        mListener = listener;
407421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    }
408421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk
4097025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
4107025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println("StatusBarWindowManager state:");
4117025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println(mCurrentState);
4126a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
4136a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
414d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    public boolean isShowingWallpaper() {
415d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        return !mCurrentState.backdropShowing;
416d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    }
417d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
4185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static class State {
4195cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardShowing;
4205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardOccluded;
4215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardNeedsInput;
4224a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelVisible;
4234a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelExpanded;
4245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean statusBarFocusable;
4255fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        boolean bouncerShowing;
426e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        boolean keyguardFadingAway;
427b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        boolean qsExpanded;
428b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        boolean headsUpShowing;
4294a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        boolean forceStatusBarVisible;
430737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        boolean forceCollapsed;
43183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        boolean forceDozeBrightness;
4326069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        boolean forceUserActivity;
433d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        boolean backdropShowing;
4345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
435ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        /**
4362a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk         * The {@link StatusBar} state from the status bar.
437ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         */
438ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        int statusBarState;
439ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
4401c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        boolean remoteInputActive;
441421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        boolean forcePluginOpen;
44267cca7442bfeffc0bace506a796cfdd39e5d511cAdrian Roos        boolean dozing;
443a5c6322dc5ad01d05560182651d4af84d32c2fc5Adrian Roos        boolean scrimsVisible;
4441c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
4455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        private boolean isKeyguardShowingAndNotOccluded() {
4465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            return keyguardShowing && !keyguardOccluded;
4475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
4486a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4496a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        @Override
4506a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        public String toString() {
4516a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            StringBuilder result = new StringBuilder();
4526a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            String newLine = "\n";
4536a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("Window State {");
4546a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append(newLine);
4556a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4566a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            Field[] fields = this.getClass().getDeclaredFields();
4576a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4586a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            // Print field names paired with their values
4596a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            for (Field field : fields) {
4606a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append("  ");
4616a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                try {
4626a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.getName());
4636a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(": ");
4646a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    //requires access to private field:
4656a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.get(this));
4666a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                } catch (IllegalAccessException ex) {
4676a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                }
4686a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append(newLine);
4696a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            }
4706a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("}");
4716a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4726a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            return result.toString();
4736a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        }
4745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
475421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk
476421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    /**
477421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk     * Custom listener to pipe data back to plugins about whether or not the status bar would be
478421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk     * collapsed if not for the plugin.
479421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk     * TODO: Find cleaner way to do this.
480421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk     */
481421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    public interface OtherwisedCollapsedListener {
482421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk        void setWouldOtherwiseCollapse(boolean otherwiseCollapse);
483421a9410b462770544c6ae9a554542fa2fe1acb1Jason Monk    }
4845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi}
485