StatusBarWindowManager.java revision 5153d4ac95bc128ecf634d09b9e647cd20e70a65
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.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
10595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
1065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
107d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
108d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        if (state.keyguardShowing && !state.backdropShowing) {
109d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
110d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        } else {
111d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
112d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        }
1135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void adjustScreenOrientation(State state) {
116ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()) {
117ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            if (mKeyguardScreenRotation) {
11895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER;
119ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            } else {
12095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
121ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi            }
1225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
12395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
1245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyFocusableFlag(State state) {
1284a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelFocusable = state.statusBarFocusable && state.panelExpanded;
129aa8061448ec5a0e3cef9685f4186fc94e09eb78eJorim Jaggi        if (state.keyguardShowing && state.keyguardNeedsInput && state.bouncerShowing
1301c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos                || BaseStatusBar.ENABLE_REMOTE_INPUT && state.remoteInputActive) {
13195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
13295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1334a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
13495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
13595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
13795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
13895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
140dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos
1415153d4ac95bc128ecf634d09b9e647cd20e70a65Adrian Roos        mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
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
258d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    public void setBackdropShowing(boolean showing) {
259d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        mCurrentState.backdropShowing = showing;
260d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        apply(mCurrentState);
261d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    }
262d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
263e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    public void setKeyguardFadingAway(boolean keyguardFadingAway) {
264e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mCurrentState.keyguardFadingAway = keyguardFadingAway;
265e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        apply(mCurrentState);
266e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
267e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
268b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    public void setQsExpanded(boolean expanded) {
269b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        mCurrentState.qsExpanded = expanded;
270b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        apply(mCurrentState);
271b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    }
272b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi
2736069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    public void setForceUserActivity(boolean forceUserActivity) {
2746069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        mCurrentState.forceUserActivity = forceUserActivity;
2756069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        apply(mCurrentState);
2766069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    }
2776069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev
278b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    public void setHeadsUpShowing(boolean showing) {
279b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        mCurrentState.headsUpShowing = showing;
280b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        apply(mCurrentState);
281b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
282b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
283ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    /**
284ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     * @param state The {@link StatusBarState} of the status bar.
285ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     */
286ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    public void setStatusBarState(int state) {
287ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        mCurrentState.statusBarState = state;
288ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        apply(mCurrentState);
289ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    }
290ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
2914a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
2924a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        mCurrentState.forceStatusBarVisible = forceStatusBarVisible;
2934a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        apply(mCurrentState);
2944a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
2954a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
296737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    /**
297737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Force the window to be collapsed, even if it should theoretically be expanded.
298737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Used for when a heads-up comes in but we still need to wait for the touchable regions to
299737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * be computed.
300737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     */
301737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    public void setForceWindowCollapsed(boolean force) {
302737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        mCurrentState.forceCollapsed = force;
303737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        apply(mCurrentState);
304737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    }
305737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek
3064a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelExpanded(boolean isExpanded) {
3074a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelExpanded = isExpanded;
3084a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        apply(mCurrentState);
3094a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    }
3104a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek
311d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    @Override
312d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    public void onRemoteInputActive(boolean remoteInputActive) {
3131c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        mCurrentState.remoteInputActive = remoteInputActive;
3141c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        apply(mCurrentState);
3151c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos    }
3161c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
31783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    /**
31883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * Set whether the screen brightness is forced to the value we use for doze mode by the status
31983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * bar window.
32083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     */
32183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public void setForceDozeBrightness(boolean forceDozeBrightness) {
32283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mCurrentState.forceDozeBrightness = forceDozeBrightness;
32383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        apply(mCurrentState);
32483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
32583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
3267025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
3277025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println("StatusBarWindowManager state:");
3287025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println(mCurrentState);
3296a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
3306a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
331d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    public boolean isShowingWallpaper() {
332d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        return !mCurrentState.backdropShowing;
333d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    }
334d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
3355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static class State {
3365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardShowing;
3375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardOccluded;
3385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardNeedsInput;
3394a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelVisible;
3404a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelExpanded;
3415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean statusBarFocusable;
3425fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        boolean bouncerShowing;
343e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        boolean keyguardFadingAway;
344b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        boolean qsExpanded;
345b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        boolean headsUpShowing;
3464a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        boolean forceStatusBarVisible;
347737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        boolean forceCollapsed;
34883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        boolean forceDozeBrightness;
3496069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        boolean forceUserActivity;
350d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        boolean backdropShowing;
3515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
352ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        /**
353ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         * The {@link BaseStatusBar} state from the status bar.
354ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         */
355ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        int statusBarState;
356ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
3571c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        boolean remoteInputActive;
3581c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
3595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        private boolean isKeyguardShowingAndNotOccluded() {
3605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            return keyguardShowing && !keyguardOccluded;
3615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
3626a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3636a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        @Override
3646a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        public String toString() {
3656a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            StringBuilder result = new StringBuilder();
3666a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            String newLine = "\n";
3676a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("Window State {");
3686a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append(newLine);
3696a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3706a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            Field[] fields = this.getClass().getDeclaredFields();
3716a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3726a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            // Print field names paired with their values
3736a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            for (Field field : fields) {
3746a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append("  ");
3756a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                try {
3766a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.getName());
3776a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(": ");
3786a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    //requires access to private field:
3796a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.get(this));
3806a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                } catch (IllegalAccessException ex) {
3816a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                }
3826a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append(newLine);
3836a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            }
3846a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("}");
3856a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3866a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            return result.toString();
3876a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        }
3885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
3895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi}
390