From ff4891638d2c3b2e12ee841ae8e42f26aa497f04 Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Mon, 4 Oct 2021 14:46:29 +0800 Subject: [PATCH] Don't force IME drawing system bar backgrounds If IME doesn't have FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, DecorView won't show the color views for providing background color of system bars. DecorView will call Window#onDrawLegacyNavigationBarBackgroundChanged when the flag is changed. This gives NavigationBarController a chance to decide whether to draw the legacy navigation bar background for the IME or not. Bug: 201375975 Test: Show IME in combinations of a. floating mode or non-floating mode b. gesture navigation or 3-button navigation c. taskbar or navigation bar d. light theme or dark theme And see if there is anything unexpected Change-Id: If7ac32e2b874c04a260d542cb6a7595288aae182 --- core/java/com/android/internal/policy/DecorView.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index ea5797d752d73..13bf64334f61a 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -42,6 +42,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION; +import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static com.android.internal.policy.PhoneWindow.FEATURE_OPTIONS_PANEL; @@ -309,6 +310,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind R.integer.dock_enter_exit_duration); mForceWindowDrawsBarBackgrounds = context.getResources().getBoolean( R.bool.config_forceWindowDrawsStatusBarBackground) + && params.type != TYPE_INPUT_METHOD && context.getApplicationInfo().targetSdkVersion >= N; mSemiTransparentBarColor = context.getResources().getColor( R.color.system_bar_background_semi_transparent, null /* theme */); @@ -1164,8 +1166,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind 0 /* sideInset */, animate && !disallowAnimate, mForceWindowDrawsBarBackgrounds, controller); boolean oldDrawLegacy = mDrawLegacyNavigationBarBackground; - mDrawLegacyNavigationBarBackground = mNavigationColorViewState.visible - && (mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0; + mDrawLegacyNavigationBarBackground = + (mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0; if (oldDrawLegacy != mDrawLegacyNavigationBarBackground) { mDrawLegacyNavigationBarBackgroundHandled = mWindow.onDrawLegacyNavigationBarBackgroundChanged( @@ -1206,7 +1208,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind boolean hideNavigation = (sysUiVisibility & SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0 || !(controller == null || controller.isRequestedVisible(ITYPE_NAVIGATION_BAR)); boolean decorFitsSystemWindows = mWindow.mDecorFitsSystemWindows; - boolean forceConsumingNavBar = (mForceWindowDrawsBarBackgrounds + boolean forceConsumingNavBar = + ((mForceWindowDrawsBarBackgrounds || mDrawLegacyNavigationBarBackgroundHandled) && (attrs.flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) == 0 && (sysUiVisibility & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) == 0 && decorFitsSystemWindows