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