From 8e08eff7ab68c48d50120516e933bc7ef4ac0ffc Mon Sep 17 00:00:00 2001 From: Tracy Zhou Date: Wed, 5 Jan 2022 18:59:12 -0800 Subject: [PATCH] Support game dashboard on tablets - Report task bar transient state to EdgeBackGestureHandler and NavBarOverlayController - Register/unregister game dashboard listeners when the task bar is attached and detached Fixes: 211513457 Test: Game dashboard button shows and hides with the transient task bar Change-Id: Id55d78fc1ba36025d4441657f550c9e6088112e2 --- .../navigationbar/TaskbarDelegate.java | 57 +++++++++++++++++-- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index feda99fd34710..cabb4b48576b6 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -19,7 +19,7 @@ package com.android.systemui.navigationbar; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; -import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; +import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; 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; @@ -86,6 +86,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private static final String TAG = TaskbarDelegate.class.getSimpleName(); private final EdgeBackGestureHandler mEdgeBackGestureHandler; + private final NavigationBarOverlayController mNavBarOverlayController; private boolean mInitialized; private CommandQueue mCommandQueue; private OverviewProxyService mOverviewProxyService; @@ -140,6 +141,13 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, @Override public void hide() { + clearTransient(); + } + }; + + private final Consumer mNavbarOverlayVisibilityChangeCallback = (visible) -> { + if (visible) { + mAutoHideController.touchAutoHide(); } }; @@ -147,6 +155,11 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, public TaskbarDelegate(Context context) { mEdgeBackGestureHandler = Dependency.get(EdgeBackGestureHandler.Factory.class) .create(context); + mNavBarOverlayController = Dependency.get(NavigationBarOverlayController.class); + if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) { + mNavBarOverlayController.init(mNavbarOverlayVisibilityChangeCallback, + mEdgeBackGestureHandler::updateNavigationBarOverlayExcludeRegion); + } mContext = context; mDisplayManager = mContext.getSystemService(DisplayManager.class); mPipListener = mEdgeBackGestureHandler::setPipStashExclusionBounds; @@ -206,6 +219,9 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mNavigationModeController.addListener(this)); mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater); mNavBarHelper.init(); + if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) { + mNavBarOverlayController.registerListeners(); + } mEdgeBackGestureHandler.onNavBarAttached(); // Initialize component callback Display display = mDisplayManager.getDisplay(displayId); @@ -229,6 +245,9 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mNavigationModeController.removeListener(this); mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater); mNavBarHelper.destroy(); + if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) { + mNavBarOverlayController.unregisterListeners(); + } mEdgeBackGestureHandler.onNavBarDetached(); mScreenPinningNotify = null; if (mWindowContext != null) { @@ -354,10 +373,13 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_NAVIGATION_BAR)) { + if (!containsType(types, ITYPE_EXTRA_NAVIGATION_BAR)) { return; } - mTaskbarTransientShowing = true; + if (!mTaskbarTransientShowing) { + mTaskbarTransientShowing = true; + onTransientStateChanged(); + } } @Override @@ -365,15 +387,14 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, if (displayId != mDisplayId) { return; } - if (!containsType(types, ITYPE_NAVIGATION_BAR)) { + if (!containsType(types, ITYPE_EXTRA_NAVIGATION_BAR)) { return; } - mTaskbarTransientShowing = false; + clearTransient(); } @Override public void onTaskbarAutohideSuspend(boolean suspend) { - mTaskbarTransientShowing = suspend; if (suspend) { mAutoHideController.suspendAutoHide(); } else { @@ -381,6 +402,30 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } } + private void clearTransient() { + if (mTaskbarTransientShowing) { + mTaskbarTransientShowing = false; + onTransientStateChanged(); + } + } + + private void onTransientStateChanged() { + mEdgeBackGestureHandler.onNavBarTransientStateChanged(mTaskbarTransientShowing); + + // The visibility of the navigation bar buttons is dependent on the transient state of + // the navigation bar. + if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) { + mNavBarOverlayController.setButtonState(mTaskbarTransientShowing, /* force */ false); + } + } + + @Override + public void onRecentsAnimationStateChanged(boolean running) { + if (running) { + mNavBarOverlayController.setButtonState(/* visible */false, /* force */true); + } + } + @Override public void onNavigationModeChanged(int mode) { mNavigationMode = mode;