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