StatusBarWindowManager.java revision 2a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34
15cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/* 25cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project 35cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 45cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 55cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * you may not use this file except in compliance with the License. 65cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * You may obtain a copy of the License at 75cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 85cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 95cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * See the License for the specific language governing permissions and 145cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * limitations under the License 155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 165cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggipackage com.android.systemui.statusbar.phone; 185cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 19dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shankaimport android.app.ActivityManager; 20f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.app.IActivityManager; 215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.Context; 225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.pm.ActivityInfo; 235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.content.res.Resources; 245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.graphics.PixelFormat; 256ce0fb8ddbdc726d55c81a4bf797f028e441e448Wale Ogunwaleimport android.os.Binder; 26f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.os.RemoteException; 275cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.SystemProperties; 28f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.util.Log; 295cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.Gravity; 305cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.View; 315cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.ViewGroup; 325cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.view.WindowManager; 335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 345cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport com.android.keyguard.R; 356b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggiimport com.android.systemui.keyguard.KeyguardViewMediator; 36d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roosimport com.android.systemui.statusbar.RemoteInputController; 37ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState; 385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 397025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.FileDescriptor; 407025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.PrintWriter; 416a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinekimport java.lang.reflect.Field; 426a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 435cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/** 445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Encapsulates all logic for the status bar window state management. 455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 46d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roospublic class StatusBarWindowManager implements RemoteInputController.Callback { 475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 48f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi private static final String TAG = "StatusBarWindowManager"; 49f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi 505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private final Context mContext; 515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private final WindowManager mWindowManager; 52f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi private final IActivityManager mActivityManager; 535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private View mStatusBarView; 545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private WindowManager.LayoutParams mLp; 5595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi private WindowManager.LayoutParams mLpChanged; 56f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi private boolean mHasTopUi; 57f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi private boolean mHasTopUiChanged; 585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private int mBarHeight; 595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private final boolean mKeyguardScreenRotation; 6083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi private final float mScreenBrightnessDoze; 615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private final State mCurrentState = new State(); 625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public StatusBarWindowManager(Context context) { 645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mContext = context; 655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 66dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka mActivityManager = ActivityManager.getService(); 675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation(); 6883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi mScreenBrightnessDoze = mContext.getResources().getInteger( 6983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi com.android.internal.R.integer.config_screenBrightnessDoze) / 255f; 705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private boolean shouldEnableKeyguardScreenRotation() { 735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi Resources res = mContext.getResources(); 745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi return SystemProperties.getBoolean("lockscreen.rot_override", false) 755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi || res.getBoolean(R.bool.config_enableLockScreenRotation); 765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi /** 795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Adds the status bar view to the window manager. 805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * 815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @param statusBarView The view to add. 825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * @param barHeight The height of the status bar in collapsed state. 835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */ 845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void add(View statusBarView, int barHeight) { 855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi // Now that the status bar window encompasses the sliding panel and its 875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi // translucent backdrop, the entire thing is made TRANSLUCENT and is 885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi // hardware-accelerated. 895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mLp = new WindowManager.LayoutParams( 905cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi ViewGroup.LayoutParams.MATCH_PARENT, 915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi barHeight, 925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi WindowManager.LayoutParams.TYPE_STATUS_BAR, 935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING 955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH 965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 97ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, 985cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi PixelFormat.TRANSLUCENT); 996ce0fb8ddbdc726d55c81a4bf797f028e441e448Wale Ogunwale mLp.token = new Binder(); 1005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mLp.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; 10176aaef537a83486134a8118331b70854fbdecc3eJorim Jaggi mLp.gravity = Gravity.TOP; 1025cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; 1035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mLp.setTitle("StatusBar"); 1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mLp.packageName = mContext.getPackageName(); 1055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mStatusBarView = statusBarView; 1065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mBarHeight = barHeight; 1075cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mWindowManager.addView(mStatusBarView, mLp); 10895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged = new WindowManager.LayoutParams(); 10995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.copyFrom(mLp); 1105cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1115cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1125cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void applyKeyguardFlags(State state) { 1135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (state.keyguardShowing) { 11495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; 1155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } else { 11695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; 1175cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 118d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos 119d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos if (state.keyguardShowing && !state.backdropShowing) { 120d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos mLpChanged.flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 121d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos } else { 122d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 123d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos } 1245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1255cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void adjustScreenOrientation(State state) { 127ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi if (state.isKeyguardShowingAndNotOccluded()) { 128ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi if (mKeyguardScreenRotation) { 12995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; 130ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi } else { 13195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; 132ca36cf7bcaa8785a13b1e1a6038d94a9dd963c49Jorim Jaggi } 1335cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } else { 13495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 1355cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1365cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1375cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1385cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void applyFocusableFlag(State state) { 1394a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek boolean panelFocusable = state.statusBarFocusable && state.panelExpanded; 140bb336699bd7127742d43db4e2bed9c60220d0620Jorim Jaggi if (state.bouncerShowing && (state.keyguardOccluded || state.keyguardNeedsInput) 1412a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk || StatusBar.ENABLE_REMOTE_INPUT && state.remoteInputActive) { 14295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 14395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 1444a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) { 14595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 14695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 1475cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } else { 14895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 14995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; 1505cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 151dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos 1525153d4ac95bc128ecf634d09b9e647cd20e70a65Adrian Roos mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; 1535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void applyHeight(State state) { 1566a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek boolean expanded = isExpanded(state); 1575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi if (expanded) { 15895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT; 1595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } else { 16095e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.height = mBarHeight; 1615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 1646a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek private boolean isExpanded(State state) { 1656a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded() 1666a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing 1676a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek || state.headsUpShowing); 1686a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek } 1696a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 170a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi private void applyFitsSystemWindows(State state) { 171a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded(); 172a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos if (mStatusBarView.getFitsSystemWindows() != fitsSystemWindows) { 173a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos mStatusBarView.setFitsSystemWindows(fitsSystemWindows); 174a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos mStatusBarView.requestApplyInsets(); 175a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos } 176a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi } 177a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi 1785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void applyUserActivityTimeout(State state) { 179ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi if (state.isKeyguardShowingAndNotOccluded() 180b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi && state.statusBarState == StatusBarState.KEYGUARD 181b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi && !state.qsExpanded) { 1826b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS; 1835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } else { 18495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.userActivityTimeout = -1; 1855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 1875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 18803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi private void applyInputFeatures(State state) { 1894222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi if (state.isKeyguardShowingAndNotOccluded() 190b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi && state.statusBarState == StatusBarState.KEYGUARD 1916069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev && !state.qsExpanded && !state.forceUserActivity) { 19295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.inputFeatures |= 19395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; 19403c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi } else { 19595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mLpChanged.inputFeatures &= 19695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi ~WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY; 19703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi } 19803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi } 19903c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi 2005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private void apply(State state) { 2015cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi applyKeyguardFlags(state); 2024a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek applyForceStatusBarVisibleFlag(state); 2035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi applyFocusableFlag(state); 2045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi adjustScreenOrientation(state); 2055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi applyHeight(state); 2065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi applyUserActivityTimeout(state); 20703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi applyInputFeatures(state); 208a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi applyFitsSystemWindows(state); 209a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek applyModalFlag(state); 21083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi applyBrightness(state); 211f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi applyHasTopUi(state); 21295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi if (mLp.copyFrom(mLpChanged) != 0) { 21395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi mWindowManager.updateViewLayout(mStatusBarView, mLp); 21495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi } 215f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi if (mHasTopUi != mHasTopUiChanged) { 216f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi try { 217f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi mActivityManager.setHasTopUi(mHasTopUiChanged); 218f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi } catch (RemoteException e) { 219f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi Log.e(TAG, "Failed to call setHasTopUi", e); 220f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi } 221f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi mHasTopUi = mHasTopUiChanged; 222f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi } 2235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 2245cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 2254a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek private void applyForceStatusBarVisibleFlag(State state) { 2264a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek if (state.forceStatusBarVisible) { 2274a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek mLpChanged.privateFlags |= WindowManager 2284a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; 2294a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek } else { 2304a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek mLpChanged.privateFlags &= ~WindowManager 2314a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; 2324a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek } 2334a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek } 2344a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek 235a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek private void applyModalFlag(State state) { 236a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek if (state.headsUpShowing) { 237a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 238a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek } else { 239a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 240a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek } 241a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek } 242a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek 24383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi private void applyBrightness(State state) { 24483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi if (state.forceDozeBrightness) { 24583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi mLpChanged.screenBrightness = mScreenBrightnessDoze; 24683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } else { 24783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE; 24883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } 24983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } 25083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi 251f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi private void applyHasTopUi(State state) { 252f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi mHasTopUiChanged = isExpanded(state); 253f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi } 254f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi 2555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setKeyguardShowing(boolean showing) { 2565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mCurrentState.keyguardShowing = showing; 2575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi apply(mCurrentState); 2585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 2595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 2605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setKeyguardOccluded(boolean occluded) { 2615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mCurrentState.keyguardOccluded = occluded; 2625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi apply(mCurrentState); 2635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 2645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 2655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setKeyguardNeedsInput(boolean needsInput) { 2665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mCurrentState.keyguardNeedsInput = needsInput; 2675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi apply(mCurrentState); 2685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 2695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 2704a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek public void setPanelVisible(boolean visible) { 2714a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek mCurrentState.panelVisible = visible; 2724a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek mCurrentState.statusBarFocusable = visible; 2735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi apply(mCurrentState); 2745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 2755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 2765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setStatusBarFocusable(boolean focusable) { 2775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mCurrentState.statusBarFocusable = focusable; 2785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi apply(mCurrentState); 2795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 2805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 2815fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi public void setBouncerShowing(boolean showing) { 2825fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi mCurrentState.bouncerShowing = showing; 2835fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi apply(mCurrentState); 2845fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi } 2855fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi 286d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos public void setBackdropShowing(boolean showing) { 287d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos mCurrentState.backdropShowing = showing; 288d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos apply(mCurrentState); 289d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos } 290d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos 291e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void setKeyguardFadingAway(boolean keyguardFadingAway) { 292e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mCurrentState.keyguardFadingAway = keyguardFadingAway; 293e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi apply(mCurrentState); 294e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi } 295e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi 296b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi public void setQsExpanded(boolean expanded) { 297b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi mCurrentState.qsExpanded = expanded; 298b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi apply(mCurrentState); 299b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi } 300b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi 3016069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev public void setForceUserActivity(boolean forceUserActivity) { 3026069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev mCurrentState.forceUserActivity = forceUserActivity; 3036069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev apply(mCurrentState); 3046069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev } 3056069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev 306b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek public void setHeadsUpShowing(boolean showing) { 307b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek mCurrentState.headsUpShowing = showing; 308b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek apply(mCurrentState); 309b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek } 310b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek 311ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi /** 312ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi * @param state The {@link StatusBarState} of the status bar. 313ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi */ 314ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi public void setStatusBarState(int state) { 315ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi mCurrentState.statusBarState = state; 316ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi apply(mCurrentState); 317ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi } 318ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 3194a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek public void setForceStatusBarVisible(boolean forceStatusBarVisible) { 3204a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek mCurrentState.forceStatusBarVisible = forceStatusBarVisible; 3214a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek apply(mCurrentState); 3224a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek } 3234a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek 324737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek /** 325737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek * Force the window to be collapsed, even if it should theoretically be expanded. 326737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek * Used for when a heads-up comes in but we still need to wait for the touchable regions to 327737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek * be computed. 328737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek */ 329737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek public void setForceWindowCollapsed(boolean force) { 330737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek mCurrentState.forceCollapsed = force; 331737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek apply(mCurrentState); 332737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek } 333737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek 3344a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek public void setPanelExpanded(boolean isExpanded) { 3354a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek mCurrentState.panelExpanded = isExpanded; 3364a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek apply(mCurrentState); 3374a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek } 3384a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek 339d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos @Override 340d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos public void onRemoteInputActive(boolean remoteInputActive) { 3411c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos mCurrentState.remoteInputActive = remoteInputActive; 3421c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos apply(mCurrentState); 3431c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos } 3441c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos 34583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi /** 34683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi * Set whether the screen brightness is forced to the value we use for doze mode by the status 34783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi * bar window. 34883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi */ 34983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi public void setForceDozeBrightness(boolean forceDozeBrightness) { 35083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi mCurrentState.forceDozeBrightness = forceDozeBrightness; 35183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi apply(mCurrentState); 35283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi } 35383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi 35411c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi public void setBarHeight(int barHeight) { 35511c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi mBarHeight = barHeight; 35611c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi apply(mCurrentState); 35711c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi } 35811c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi 3597025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 3607025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek pw.println("StatusBarWindowManager state:"); 3617025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek pw.println(mCurrentState); 3626a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek } 3636a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 364d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos public boolean isShowingWallpaper() { 365d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos return !mCurrentState.backdropShowing; 366d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos } 367d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos 3685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private static class State { 3695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi boolean keyguardShowing; 3705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi boolean keyguardOccluded; 3715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi boolean keyguardNeedsInput; 3724a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek boolean panelVisible; 3734a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek boolean panelExpanded; 3745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi boolean statusBarFocusable; 3755fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi boolean bouncerShowing; 376e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi boolean keyguardFadingAway; 377b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi boolean qsExpanded; 378b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek boolean headsUpShowing; 3794a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek boolean forceStatusBarVisible; 380737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek boolean forceCollapsed; 38183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi boolean forceDozeBrightness; 3826069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev boolean forceUserActivity; 383d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos boolean backdropShowing; 3845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi 385ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi /** 3862a6ea9c2a1b52b0386270ec73e1e6d6a9b614a34Jason Monk * The {@link StatusBar} state from the status bar. 387ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi */ 388ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi int statusBarState; 389ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi 3901c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos boolean remoteInputActive; 3911c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos 3925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private boolean isKeyguardShowingAndNotOccluded() { 3935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi return keyguardShowing && !keyguardOccluded; 3945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 3956a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 3966a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek @Override 3976a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek public String toString() { 3986a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek StringBuilder result = new StringBuilder(); 3996a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek String newLine = "\n"; 4006a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append("Window State {"); 4016a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append(newLine); 4026a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 4036a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek Field[] fields = this.getClass().getDeclaredFields(); 4046a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 4056a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek // Print field names paired with their values 4066a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek for (Field field : fields) { 4076a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append(" "); 4086a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek try { 4096a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append(field.getName()); 4106a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append(": "); 4116a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek //requires access to private field: 4126a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append(field.get(this)); 4136a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek } catch (IllegalAccessException ex) { 4146a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek } 4156a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append(newLine); 4166a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek } 4176a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek result.append("}"); 4186a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek 4196a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek return result.toString(); 4206a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek } 4215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi } 4225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi} 423