StatusBarWindowManager.java revision dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0
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;
25f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.os.RemoteException;
265cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggiimport android.os.SystemProperties;
27f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggiimport android.os.Trace;
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;
36ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.BaseStatusBar;
37d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roosimport com.android.systemui.statusbar.RemoteInputController;
38ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggiimport com.android.systemui.statusbar.StatusBarState;
395cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
407025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.FileDescriptor;
417025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinekimport java.io.PrintWriter;
426a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinekimport java.lang.reflect.Field;
436a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
445cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi/**
455cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi * Encapsulates all logic for the status bar window state management.
465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi */
47d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roospublic class StatusBarWindowManager implements RemoteInputController.Callback {
485cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
49f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private static final String TAG = "StatusBarWindowManager";
50f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi
515cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final Context mContext;
525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final WindowManager mWindowManager;
53f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private final IActivityManager mActivityManager;
545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private View mStatusBarView;
555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private WindowManager.LayoutParams mLp;
5695e89caeb252a54807c76d60c7440766829e418cJorim Jaggi    private WindowManager.LayoutParams mLpChanged;
57f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private boolean mHasTopUi;
58f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private boolean mHasTopUiChanged;
595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private int mBarHeight;
605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final boolean mKeyguardScreenRotation;
6183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private final float mScreenBrightnessDoze;
625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private final State mCurrentState = new State();
635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public StatusBarWindowManager(Context context) {
655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mContext = context;
665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
67dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka        mActivityManager = ActivityManager.getService();
685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
6983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mScreenBrightnessDoze = mContext.getResources().getInteger(
7083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi                com.android.internal.R.integer.config_screenBrightnessDoze) / 255f;
715cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private boolean shouldEnableKeyguardScreenRotation() {
745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        Resources res = mContext.getResources();
755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        return SystemProperties.getBoolean("lockscreen.rot_override", false)
765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                || res.getBoolean(R.bool.config_enableLockScreenRotation);
775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    /**
805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * Adds the status bar view to the window manager.
815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     *
825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @param statusBarView The view to add.
835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     * @param barHeight The height of the status bar in collapsed state.
845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi     */
855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void add(View statusBarView, int barHeight) {
865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // Now that the status bar window encompasses the sliding panel and its
885cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // translucent backdrop, the entire thing is made TRANSLUCENT and is
895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        // hardware-accelerated.
905cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mLp = new WindowManager.LayoutParams(
915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                ViewGroup.LayoutParams.MATCH_PARENT,
925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                barHeight,
935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                WindowManager.LayoutParams.TYPE_STATUS_BAR,
945cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
955cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
965cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
975cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
98ea56251d92050e9a672d1f66d0d4621e4dd4136eAdrian Roos                        | WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi                PixelFormat.TRANSLUCENT);
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;
1408a825e907689f8ea07c828f292801e2629d95689Jorim Jaggi        if (state.bouncerShowing || BaseStatusBar.ENABLE_REMOTE_INPUT && state.remoteInputActive) {
14195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
14295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1434a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        } else if (state.isKeyguardShowingAndNotOccluded() || panelFocusable) {
14495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
14595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1465cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
14795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
14895e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
1495cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
150dc5b4535165d82e5e9c83576a47bd95cd422ca0aAdrian Roos
1515153d4ac95bc128ecf634d09b9e647cd20e70a65Adrian Roos        mLpChanged.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
1525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1535cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyHeight(State state) {
1556a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        boolean expanded = isExpanded(state);
1565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        if (expanded) {
15795e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.height = ViewGroup.LayoutParams.MATCH_PARENT;
1585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
15995e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.height = mBarHeight;
1605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
1636a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    private boolean isExpanded(State state) {
1646a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        return !state.forceCollapsed && (state.isKeyguardShowingAndNotOccluded()
1656a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                || state.panelVisible || state.keyguardFadingAway || state.bouncerShowing
1666a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                || state.headsUpShowing);
1676a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
1686a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
169a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    private void applyFitsSystemWindows(State state) {
170a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos        boolean fitsSystemWindows = !state.isKeyguardShowingAndNotOccluded();
171a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos        if (mStatusBarView.getFitsSystemWindows() != fitsSystemWindows) {
172a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos            mStatusBarView.setFitsSystemWindows(fitsSystemWindows);
173a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos            mStatusBarView.requestApplyInsets();
174a5d6cd0981ba54b0fa775a7c6a4f7eb8f425896cAdrian Roos        }
175a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi    }
176a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi
1775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void applyUserActivityTimeout(State state) {
178ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()
179b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && state.statusBarState == StatusBarState.KEYGUARD
180b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && !state.qsExpanded) {
1816b88cdfba770efc5722338c240ccaada13d7b0d4Jorim Jaggi            mLpChanged.userActivityTimeout = KeyguardViewMediator.AWAKE_INTERVAL_DEFAULT_MS;
1825cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        } else {
18395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.userActivityTimeout = -1;
1845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
1855cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
1865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
18703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    private void applyInputFeatures(State state) {
1884222d9a7fb87d73e1443ec1a2de9782b05741af6Jorim Jaggi        if (state.isKeyguardShowingAndNotOccluded()
189b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi                && state.statusBarState == StatusBarState.KEYGUARD
1906069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev                && !state.qsExpanded && !state.forceUserActivity) {
19195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.inputFeatures |=
19295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                    WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
19303c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        } else {
19495e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mLpChanged.inputFeatures &=
19595e89caeb252a54807c76d60c7440766829e418cJorim Jaggi                    ~WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
19603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        }
19703c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi    }
19803c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi
1995cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private void apply(State state) {
2005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyKeyguardFlags(state);
2014a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        applyForceStatusBarVisibleFlag(state);
2025cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyFocusableFlag(state);
2035cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        adjustScreenOrientation(state);
2045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyHeight(state);
2055cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        applyUserActivityTimeout(state);
20603c701ec58ff6de3cc3c53b05342a475a63a11cfJorim Jaggi        applyInputFeatures(state);
207a005f1b6853e8852c328f4fdc02fb8f9c9ae1cd6Jorim Jaggi        applyFitsSystemWindows(state);
208a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        applyModalFlag(state);
20983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        applyBrightness(state);
210f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        applyHasTopUi(state);
21195e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        if (mLp.copyFrom(mLpChanged) != 0) {
21295e89caeb252a54807c76d60c7440766829e418cJorim Jaggi            mWindowManager.updateViewLayout(mStatusBarView, mLp);
21395e89caeb252a54807c76d60c7440766829e418cJorim Jaggi        }
214f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        if (mHasTopUi != mHasTopUiChanged) {
215f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            try {
216f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi                mActivityManager.setHasTopUi(mHasTopUiChanged);
217f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            } catch (RemoteException e) {
218f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi                Log.e(TAG, "Failed to call setHasTopUi", e);
219f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            }
220f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi            mHasTopUi = mHasTopUiChanged;
221f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        }
2225cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2235cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2244a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    private void applyForceStatusBarVisibleFlag(State state) {
2254a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        if (state.forceStatusBarVisible) {
2264a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            mLpChanged.privateFlags |= WindowManager
2274a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek                    .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
2284a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        } else {
2294a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek            mLpChanged.privateFlags &= ~WindowManager
2304a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek                    .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
2314a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        }
2324a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
2334a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
234a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek    private void applyModalFlag(State state) {
235a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        if (state.headsUpShowing) {
236a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
237a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        } else {
238a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
239a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek        }
240a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek    }
241a59ecc3401de0c4bf1e13665158f54669f22d06cSelim Cinek
24283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    private void applyBrightness(State state) {
24383eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        if (state.forceDozeBrightness) {
24483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            mLpChanged.screenBrightness = mScreenBrightnessDoze;
24583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        } else {
24683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi            mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
24783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        }
24883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
24983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
250f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    private void applyHasTopUi(State state) {
251f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi        mHasTopUiChanged = isExpanded(state);
252f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi    }
253f6782ee1c87ba1f39f595d1facb8b13d851988b9Jorim Jaggi
2545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardShowing(boolean showing) {
2555cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardShowing = showing;
2565cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2575cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2595cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardOccluded(boolean occluded) {
2605cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardOccluded = occluded;
2615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2625cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2645cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setKeyguardNeedsInput(boolean needsInput) {
2655cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.keyguardNeedsInput = needsInput;
2665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2694a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelVisible(boolean visible) {
2704a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelVisible = visible;
2714a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.statusBarFocusable = visible;
2725cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2745cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    public void setStatusBarFocusable(boolean focusable) {
2765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        mCurrentState.statusBarFocusable = focusable;
2775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        apply(mCurrentState);
2785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
2795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
2805fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi    public void setBouncerShowing(boolean showing) {
2815fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        mCurrentState.bouncerShowing = showing;
2825fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        apply(mCurrentState);
2835fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi    }
2845fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi
285d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    public void setBackdropShowing(boolean showing) {
286d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        mCurrentState.backdropShowing = showing;
287d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        apply(mCurrentState);
288d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    }
289d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
290e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    public void setKeyguardFadingAway(boolean keyguardFadingAway) {
291e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        mCurrentState.keyguardFadingAway = keyguardFadingAway;
292e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        apply(mCurrentState);
293e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi    }
294e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi
295b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    public void setQsExpanded(boolean expanded) {
296b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        mCurrentState.qsExpanded = expanded;
297b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        apply(mCurrentState);
298b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi    }
299b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi
3006069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    public void setForceUserActivity(boolean forceUserActivity) {
3016069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        mCurrentState.forceUserActivity = forceUserActivity;
3026069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        apply(mCurrentState);
3036069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev    }
3046069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev
305b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    public void setHeadsUpShowing(boolean showing) {
306b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        mCurrentState.headsUpShowing = showing;
307b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        apply(mCurrentState);
308b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek    }
309b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek
310ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    /**
311ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     * @param state The {@link StatusBarState} of the status bar.
312ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi     */
313ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    public void setStatusBarState(int state) {
314ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        mCurrentState.statusBarState = state;
315ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        apply(mCurrentState);
316ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi    }
317ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
3184a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    public void setForceStatusBarVisible(boolean forceStatusBarVisible) {
3194a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        mCurrentState.forceStatusBarVisible = forceStatusBarVisible;
3204a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        apply(mCurrentState);
3214a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek    }
3224a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek
323737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    /**
324737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Force the window to be collapsed, even if it should theoretically be expanded.
325737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * Used for when a heads-up comes in but we still need to wait for the touchable regions to
326737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     * be computed.
327737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek     */
328737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    public void setForceWindowCollapsed(boolean force) {
329737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        mCurrentState.forceCollapsed = force;
330737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        apply(mCurrentState);
331737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek    }
332737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek
3334a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    public void setPanelExpanded(boolean isExpanded) {
3344a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        mCurrentState.panelExpanded = isExpanded;
3354a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        apply(mCurrentState);
3364a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek    }
3374a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek
338d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    @Override
339d28ccd7cab8e1a187dfd6c5733efe7cdfb652202Adrian Roos    public void onRemoteInputActive(boolean remoteInputActive) {
3401c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        mCurrentState.remoteInputActive = remoteInputActive;
3411c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        apply(mCurrentState);
3421c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos    }
3431c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
34483eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    /**
34583eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * Set whether the screen brightness is forced to the value we use for doze mode by the status
34683eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     * bar window.
34783eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi     */
34883eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    public void setForceDozeBrightness(boolean forceDozeBrightness) {
34983eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        mCurrentState.forceDozeBrightness = forceDozeBrightness;
35083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        apply(mCurrentState);
35183eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi    }
35283eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi
35311c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi    public void setBarHeight(int barHeight) {
35411c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi        mBarHeight = barHeight;
35511c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi        apply(mCurrentState);
35611c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi    }
35711c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi
3587025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
3597025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println("StatusBarWindowManager state:");
3607025f26a99483d333cd8e4df0b919c3b9e9334b3Selim Cinek        pw.println(mCurrentState);
3616a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek    }
3626a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
363d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    public boolean isShowingWallpaper() {
364d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        return !mCurrentState.backdropShowing;
365d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos    }
366d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos
3675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    private static class State {
3685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardShowing;
3695cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardOccluded;
3705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean keyguardNeedsInput;
3714a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelVisible;
3724a21a7fab6c0cca2c668650969e9af50c9c5068eSelim Cinek        boolean panelExpanded;
3735cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        boolean statusBarFocusable;
3745fd4d05aae4b8b0dc1d1b21a206e218f47b0ea3aJorim Jaggi        boolean bouncerShowing;
375e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        boolean keyguardFadingAway;
376b690f0d5023fcf144f2701058d5a6f88d66cc97aJorim Jaggi        boolean qsExpanded;
377b8f09cf5533d458868a335ce334e4880b2b0788dSelim Cinek        boolean headsUpShowing;
3784a4a2bddc48a33cbaa49a8844b9fd36e2fc5e219Selim Cinek        boolean forceStatusBarVisible;
379737bff3476a3af8f930d29fccce16d033fbc3efaSelim Cinek        boolean forceCollapsed;
38083eb6bb5d83d3994a3750b566a2109a049ab1388Jorim Jaggi        boolean forceDozeBrightness;
3816069c4099e21765af3508a2f7de4dad779dc0543Vadim Tryshev        boolean forceUserActivity;
382d5c2db630fc816e2d9154a61ccbd6770bc57cff8Adrian Roos        boolean backdropShowing;
3835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi
384ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        /**
385ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         * The {@link BaseStatusBar} state from the status bar.
386ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi         */
387ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi        int statusBarState;
388ecbab3662d4474bbb45477939aaa167eb883212bJorim Jaggi
3891c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos        boolean remoteInputActive;
3901c0ca508b9d6184beba2050e6ab3a44ac5be137aAdrian Roos
3915cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        private boolean isKeyguardShowingAndNotOccluded() {
3925cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            return keyguardShowing && !keyguardOccluded;
3935cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        }
3946a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
3956a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        @Override
3966a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        public String toString() {
3976a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            StringBuilder result = new StringBuilder();
3986a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            String newLine = "\n";
3996a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("Window State {");
4006a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append(newLine);
4016a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4026a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            Field[] fields = this.getClass().getDeclaredFields();
4036a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4046a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            // Print field names paired with their values
4056a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            for (Field field : fields) {
4066a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append("  ");
4076a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                try {
4086a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.getName());
4096a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(": ");
4106a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    //requires access to private field:
4116a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                    result.append(field.get(this));
4126a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                } catch (IllegalAccessException ex) {
4136a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                }
4146a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek                result.append(newLine);
4156a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            }
4166a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            result.append("}");
4176a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek
4186a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek            return result.toString();
4196a1bd2b3dbc993e63632f12819d77ae5fa872a06Selim Cinek        }
4205cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi    }
4215cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi}
422