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
This commit is contained in:
Tracy Zhou
2022-01-05 18:59:12 -08:00
parent 62232b6c74
commit 8e08eff7ab

View File

@@ -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<Boolean> 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;