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