StatusBarWindowManager.java revision 6069c4099e21765af3508a2f7de4dad779dc0543
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
195cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.Context;
205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.pm.ActivityInfo;
215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.res.Resources;
225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.graphics.PixelFormat;
235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.SystemProperties;
245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.Gravity;
255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.View;
265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.ViewGroup;
275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.WindowManager;
285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.R;
306b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggiimport com.android.systemui.keyguard.KeyguardViewMediator;
31ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.BaseStatusBar;
32d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roosimport com.android.systemui.statusbar.RemoteInputController;
33ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
357025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.FileDescriptor;
367025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.PrintWriter;
376a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinekimport java.lang.reflect.Field;
386a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/**
405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Encapsulates all logic for the status bar window state management.
415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
42d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roospublic class StatusBarWindowManager implements RemoteInputController.Callback {
435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final Context mContext;
455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final WindowManager mWindowManager;
465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private View mStatusBarView;
475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private WindowManager.LayoutParams mLp;
4895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi    private WindowManager.LayoutParams mLpChanged;
495cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private int mBarHeight;
505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final boolean mKeyguardScreenRotation;
5183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private final float mScreenBrightnessDoze;
525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final State mCurrentState = new State();
535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public StatusBarWindowManager(Context context) {
555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContext = context;
565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
5883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mScreenBrightnessDoze = mContext.getResources().getInteger(
5983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                com.android.internal.R.integer.config_screenBrightnessDoze) / 255f;
605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private boolean shouldEnableKeyguardScreenRotation() {
635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        Resources res = mContext.getResources();
645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        return SystemProperties.getBoolean("lockscreen.rot_override", false)
655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                || res.getBoolean(R.bool.config_enableLockScreenRotation);
665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Adds the status bar view to the window manager.
705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     *
715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @param statusBarView The view to add.
725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @param barHeight The height of the status bar in collapsed state.
735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void add(View statusBarView, int barHeight) {
755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // Now that the status bar window encompasses the sliding panel and its
775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // translucent backdrop, the entire thing is made TRANSLUCENT and is
785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // hardware-accelerated.
795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp = new WindowManager.LayoutParams(
805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                ViewGroup.LayoutParams.MATCH_PARENT,
815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                barHeight,
825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                WindowManager.LayoutParams.TYPE_STATUS_BAR,
835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
87ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                PixelFormat.TRANSLUCENT);
895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
9076aaef537a83486134a8118331b70854fbdecc3eJorim Jaggi        mLp.gravity = Gravity.TOP;
915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.setTitle("StatusBar");
935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp.packageName = mContext.getPackageName();
945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mStatusBarView = statusBarView;
955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mBarHeight = barHeight;
965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mWindowManager.addView(mStatusBarView, mLp);
9795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        mLpChanged = new WindowManager.LayoutParams();
9895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        mLpChanged.copyFrom(mLp);
995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1015cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyKeyguardFlags(State state) {
1025cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        if (state.keyguardShowing) {
10395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
10495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
1055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
10695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
10795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
1085cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1095cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void adjustScreenOrientation(State state) {
112ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()) {
113ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            if (mKeyguardScreenRotation) {
11495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
115ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            } else {
11695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
117ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            }
1185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
11995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
1205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyFocusableFlag(State state) {
1244a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelFocusable = state.statusBarFocusable && state.panelExpanded;
125aa8061448ec5a0e3cef9685f4186fc94e09eb78eJorim Jaggi        if (state.keyguardShowing && state.keyguardNeedsInput && state.bouncerShowing
1261c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos                || BaseStatusBar.ENABLE_REMOTE_INPUT && state.remoteInputActive) {
12795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
12895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1294a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
13095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
13195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
13395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
13495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
136dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos
137dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos        if (state.remoteInputActive) {
138dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos            mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN;
139dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos        } else {
140dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos            mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
141dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos        }
1425cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyHeight(State state) {
1456a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        boolean expanded = isExpanded(state);
1465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        if (expanded) {
14795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT;
1485cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
14995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.height = mBarHeight;
1505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1536a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    private boolean isExpanded(State state) {
1546a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded()
1556a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing
1566a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                || state.headsUpShowing);
1576a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
1586a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
159a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    private void applyFitsSystemWindows(State state) {
160a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        mStatusBarView.setFitsSystemWindows(!state.isKeyguardShowingAndNotOccluded());
161a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    }
162a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
1635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyUserActivityTimeout(State state) {
164ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()
165b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && state.statusBarState == StatusBarState.KEYGUARD
166b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && !state.qsExpanded) {
1676b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi            mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
1685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
16995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.userActivityTimeout = -1;
1705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
17303c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private void applyInputFeatures(State state) {
1744222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()
175b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && state.statusBarState == StatusBarState.KEYGUARD
1766069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev                && !state.qsExpanded && !state.forceUserActivity) {
17795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.inputFeatures |=
17895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                    WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
17903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        } else {
18095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.inputFeatures &=
18195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                    ~WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
18203c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        }
18303c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    }
18403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi
1855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void apply(State state) {
1865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyKeyguardFlags(state);
1874a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        applyForceStatusBarVisibleFlag(state);
1885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyFocusableFlag(state);
1895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        adjustScreenOrientation(state);
1905cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyHeight(state);
1915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyUserActivityTimeout(state);
19203c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        applyInputFeatures(state);
193a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        applyFitsSystemWindows(state);
194a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        applyModalFlag(state);
19583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        applyBrightness(state);
19695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        if (mLp.copyFrom(mLpChanged) != 0) {
19795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mWindowManager.updateViewLayout(mStatusBarView, mLp);
19895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        }
1995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2014a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    private void applyForceStatusBarVisibleFlag(State state) {
2024a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        if (state.forceStatusBarVisible) {
2034a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            mLpChanged.privateFlags |= WindowManager
2044a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek                    .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
2054a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        } else {
2064a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            mLpChanged.privateFlags &= ~WindowManager
2074a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek                    .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
2084a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        }
2094a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
2104a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
211a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek    private void applyModalFlag(State state) {
212a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        if (state.headsUpShowing) {
213a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
214a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        } else {
215a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
216a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        }
217a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek    }
218a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek
21983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private void applyBrightness(State state) {
22083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        if (state.forceDozeBrightness) {
22183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            mLpChanged.screenBrightness = mScreenBrightnessDoze;
22283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        } else {
22383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
22483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        }
22583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
22683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
2275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
2285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardShowing = showing;
2295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardOccluded(boolean occluded) {
2335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardOccluded = occluded;
2345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardNeedsInput(boolean needsInput) {
2385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardNeedsInput = needsInput;
2395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2405cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2424a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelVisible(boolean visible) {
2434a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelVisible = visible;
2444a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.statusBarFocusable = visible;
2455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2485cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setStatusBarFocusable(boolean focusable) {
2495cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.statusBarFocusable = focusable;
2505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2535fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi    public void setBouncerShowing(boolean showing) {
2545fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        mCurrentState.bouncerShowing = showing;
2555fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        apply(mCurrentState);
2565fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi    }
2575fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi
258e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    public void setKeyguardFadingAway(boolean keyguardFadingAway) {
259e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mCurrentState.keyguardFadingAway = keyguardFadingAway;
260e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        apply(mCurrentState);
261e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
262e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
263b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    public void setQsExpanded(boolean expanded) {
264b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        mCurrentState.qsExpanded = expanded;
265b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        apply(mCurrentState);
266b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    }
267b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi
2686069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    public void setForceUserActivity(boolean forceUserActivity) {
2696069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        mCurrentState.forceUserActivity = forceUserActivity;
2706069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        apply(mCurrentState);
2716069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    }
2726069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev
273b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    public void setHeadsUpShowing(boolean showing) {
274b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        mCurrentState.headsUpShowing = showing;
275b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        apply(mCurrentState);
276b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
277b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
278ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    /**
279ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     * @param state The {@link StatusBarState} of the status bar.
280ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     */
281ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    public void setStatusBarState(int state) {
282ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        mCurrentState.statusBarState = state;
283ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        apply(mCurrentState);
284ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    }
285ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
2864a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
2874a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        mCurrentState.forceStatusBarVisible = forceStatusBarVisible;
2884a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        apply(mCurrentState);
2894a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
2904a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
291737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    /**
292737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Force the window to be collapsed, even if it should theoretically be expanded.
293737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Used for when a heads-up comes in but we still need to wait for the touchable regions to
294737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * be computed.
295737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     */
296737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    public void setForceWindowCollapsed(boolean force) {
297737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        mCurrentState.forceCollapsed = force;
298737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        apply(mCurrentState);
299737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    }
300737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek
3014a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelExpanded(boolean isExpanded) {
3024a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelExpanded = isExpanded;
3034a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        apply(mCurrentState);
3044a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    }
3054a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek
306d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    @Override
307d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    public void onRemoteInputActive(boolean remoteInputActive) {
3081c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        mCurrentState.remoteInputActive = remoteInputActive;
3091c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        apply(mCurrentState);
3101c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos    }
3111c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
31283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    /**
31383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * Set whether the screen brightness is forced to the value we use for doze mode by the status
31483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * bar window.
31583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     */
31683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public void setForceDozeBrightness(boolean forceDozeBrightness) {
31783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mCurrentState.forceDozeBrightness = forceDozeBrightness;
31883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        apply(mCurrentState);
31983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
32083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
3217025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
3227025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println("StatusBarWindowManager state:");
3237025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println(mCurrentState);
3246a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
3256a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static class State {
3275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardShowing;
3285cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardOccluded;
3295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardNeedsInput;
3304a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelVisible;
3314a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelExpanded;
3325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean statusBarFocusable;
3335fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        boolean bouncerShowing;
334e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        boolean keyguardFadingAway;
335b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        boolean qsExpanded;
336b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        boolean headsUpShowing;
3374a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        boolean forceStatusBarVisible;
338737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        boolean forceCollapsed;
33983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        boolean forceDozeBrightness;
3406069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        boolean forceUserActivity;
3415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
342ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        /**
343ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         * The {@link BaseStatusBar} state from the status bar.
344ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         */
345ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        int statusBarState;
346ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
3471c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        boolean remoteInputActive;
3481c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
3495cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        private boolean isKeyguardShowingAndNotOccluded() {
3505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            return keyguardShowing && !keyguardOccluded;
3515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
3526a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3536a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        @Override
3546a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        public String toString() {
3556a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            StringBuilder result = new StringBuilder();
3566a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            String newLine = "\n";
3576a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("Window State {");
3586a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append(newLine);
3596a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3606a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            Field[] fields = this.getClass().getDeclaredFields();
3616a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3626a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            // Print field names paired with their values
3636a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            for (Field field : fields) {
3646a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append("  ");
3656a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                try {
3666a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.getName());
3676a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(": ");
3686a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    //requires access to private field:
3696a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.get(this));
3706a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                } catch (IllegalAccessException ex) {
3716a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                }
3726a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append(newLine);
3736a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            }
3746a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("}");
3756a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3766a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            return result.toString();
3776a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        }
3785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi}
380