From 458cc83833b3538afa9c893ee91bb4195f1f7242 Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Mon, 6 Jun 2022 15:03:56 -0700 Subject: [PATCH] Fix transient behavior with task bar Fixes: 200730636 Test: manual Change-Id: Ie3dc424542ff457218fe4ec2fd516244f51bb94f --- .../systemui/navigationbar/NavBarHelper.java | 26 +++++++++++ .../systemui/navigationbar/NavigationBar.java | 25 +---------- .../NavigationBarController.java | 1 - .../navigationbar/TaskbarDelegate.java | 45 ++++++++++++++----- 4 files changed, 60 insertions(+), 37 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java index 779292c433408..6bc50a6b24063 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java @@ -17,11 +17,19 @@ package com.android.systemui.navigationbar; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; +import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; +import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; +import static android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS; import static com.android.systemui.accessibility.SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON; import static com.android.systemui.accessibility.SystemActions.SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; +import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; import android.content.ContentResolver; import android.content.Context; @@ -50,6 +58,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.system.QuickStepContract; +import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import com.android.systemui.statusbar.phone.CentralSurfaces; import java.io.PrintWriter; @@ -325,6 +334,23 @@ public final class NavBarHelper implements void updateAssistantAvailable(boolean available); } + static @TransitionMode int transitionMode(boolean isTransient, int appearance) { + final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS; + if (isTransient) { + return MODE_SEMI_TRANSPARENT; + } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) { + return MODE_LIGHTS_OUT; + } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) { + return MODE_LIGHTS_OUT_TRANSPARENT; + } else if ((appearance & APPEARANCE_OPAQUE_NAVIGATION_BARS) != 0) { + return MODE_OPAQUE; + } else if ((appearance & APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS) != 0) { + return MODE_SEMI_TRANSPARENT; + } else { + return MODE_TRANSPARENT; + } + } + @Override public void dump(@NonNull PrintWriter pw, @NonNull String[] args) { pw.println("NavbarTaskbarFriendster"); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 47b1bff29a106..79e6b060f1fc6 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -27,9 +27,6 @@ import static android.app.WindowConfiguration.ROTATION_UNDEFINED; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.containsType; -import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; -import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS; -import static android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; @@ -39,6 +36,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_FORCE_OPAQUE; +import static com.android.systemui.navigationbar.NavBarHelper.transitionMode; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; import static com.android.systemui.shared.recents.utilities.Utilities.isTablet; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE; @@ -48,11 +46,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_I import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG_WINDOW_STATE; import static com.android.systemui.statusbar.phone.CentralSurfaces.dumpBarTransitions; @@ -1152,23 +1146,6 @@ public class NavigationBar extends ViewController implements return false; } - private static @TransitionMode int transitionMode(boolean isTransient, int appearance) { - final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_NAVIGATION_BARS; - if (isTransient) { - return MODE_SEMI_TRANSPARENT; - } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) { - return MODE_LIGHTS_OUT; - } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) { - return MODE_LIGHTS_OUT_TRANSPARENT; - } else if ((appearance & APPEARANCE_OPAQUE_NAVIGATION_BARS) != 0) { - return MODE_OPAQUE; - } else if ((appearance & APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS) != 0) { - return MODE_SEMI_TRANSPARENT; - } else { - return MODE_TRANSPARENT; - } - } - @Override public void disable(int displayId, int state1, int state2, boolean animate) { if (displayId != mDisplayId) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index d756af77d2a9e..2a7c8716f036a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -69,7 +69,6 @@ import java.util.Optional; import javax.inject.Inject; - /** A controller to handle navigation bars. */ @SysUISingleton public class NavigationBarController implements diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 8ee16a92a9bd9..1abf9903c08df 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -24,6 +24,7 @@ import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; +import static com.android.systemui.navigationbar.NavBarHelper.transitionMode; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY; @@ -35,6 +36,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_I import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; +import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import android.app.StatusBarManager; import android.app.StatusBarManager.WindowVisibleState; @@ -50,6 +52,7 @@ import android.util.Log; import android.view.Display; import android.view.InsetsVisibilities; import android.view.View; +import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; import androidx.annotation.NonNull; @@ -114,6 +117,9 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, }; private int mDisabledFlags; private @WindowVisibleState int mTaskBarWindowState = WINDOW_STATE_SHOWING; + + private @TransitionMode int mTransitionMode; + private @Appearance int mAppearance; private @Behavior int mBehavior; private final Context mContext; private final DisplayManager mDisplayManager; @@ -146,19 +152,12 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } }; - private final Consumer mNavbarOverlayVisibilityChangeCallback = (visible) -> { - if (visible) { - mAutoHideController.touchAutoHide(); - } - }; private BackAnimation mBackAnimation; @Inject - public TaskbarDelegate( - Context context, + public TaskbarDelegate(Context context, EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory, - LightBarTransitionsController.Factory lightBarTransitionsControllerFactory - ) { + LightBarTransitionsController.Factory lightBarTransitionsControllerFactory) { mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory; mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context); @@ -360,9 +359,15 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, int behavior, InsetsVisibilities requestedVisibilities, String packageName) { mOverviewProxyService.onSystemBarAttributesChanged(displayId, behavior); - if (mLightBarController != null && displayId == mDisplayId) { - mLightBarController.onNavigationBarAppearanceChanged(appearance, false/*nbModeChanged*/, - BarTransitions.MODE_TRANSPARENT /*navigationBarMode*/, navbarColorManagedByIme); + boolean nbModeChanged = false; + if (mAppearance != appearance) { + mAppearance = appearance; + nbModeChanged = updateTransitionMode( + transitionMode(mTaskbarTransientShowing, appearance)); + } + if (displayId == mDisplayId) { + mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged, + BarTransitions.MODE_TRANSPARENT, navbarColorManagedByIme); } if (mBehavior != behavior) { mBehavior = behavior; @@ -413,6 +418,22 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private void onTransientStateChanged() { mEdgeBackGestureHandler.onNavBarTransientStateChanged(mTaskbarTransientShowing); + + final int transitionMode = transitionMode(mTaskbarTransientShowing, mAppearance); + if (updateTransitionMode(transitionMode)) { + mLightBarController.onNavigationBarModeChanged(transitionMode); + } + } + + private boolean updateTransitionMode(int barMode) { + if (mTransitionMode != barMode) { + mTransitionMode = barMode; + if (mAutoHideController != null) { + mAutoHideController.touchAutoHide(); + } + return true; + } + return false; } @Override