From aa84d0e857e4e5f0187f1fa120ea7105303abae8 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Thu, 7 Oct 2021 13:49:45 -0700 Subject: [PATCH] Add API to allow launcher to suspend AutoHideController * Make suspend/resume methods public * TaskbarDelegate acts as the AutoHideUiElement for the purposes of simplicity (vs having Taskbar itself in launcher implement the interface). * We re-use existing mNavBar setter in AutoHideController since we know when tablet is showing there is no navigation bar present Bug: 193938507 Test: Taskbar shows when requesting auto-hide suspend. Change-Id: I36429b4ea357646cf6b6dac7a048905b1986be16 --- .../shared/recents/ISystemUiProxy.aidl | 9 +- .../NavigationBarController.java | 8 +- .../navigationbar/TaskbarDelegate.java | 92 ++++++++++++++++--- .../recents/OverviewProxyService.java | 13 +++ .../statusbar/phone/AutoHideController.java | 5 +- .../NavigationBarControllerTest.java | 4 +- 6 files changed, 110 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl index 11557ad87929b..5b7e500c46304 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl @@ -143,5 +143,12 @@ interface ISystemUiProxy { /** Notifies when taskbar status updated */ oneway void notifyTaskbarStatus(boolean visible, boolean stashed) = 47; - // Next id = 48 + /** + * Notifies sysui when taskbar requests autoHide to stop auto-hiding + * If called to suspend, caller is also responsible for calling this method to un-suspend + * @param suspend should be true to stop auto-hide, false to resume normal behavior + */ + oneway void notifyTaskbarAutohideSuspend(boolean suspend) = 48; + + // Next id = 49 } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index 7622d663301d8..2badbfa31979e 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -61,6 +61,7 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationShadeDepthController; +import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; @@ -160,7 +161,8 @@ public class NavigationBarController implements NavigationBarA11yHelper navigationBarA11yHelper, TaskbarDelegate taskbarDelegate, UserTracker userTracker, - DumpManager dumpManager) { + DumpManager dumpManager, + AutoHideController autoHideController) { mContext = context; mWindowManager = windowManager; mAssistManagerLazy = assistManagerLazy; @@ -194,9 +196,9 @@ public class NavigationBarController implements mNavMode = mNavigationModeController.addListener(this); mNavigationModeController.addListener(this); mTaskbarDelegate = taskbarDelegate; - mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService, + mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService, navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer, - dumpManager); + dumpManager, autoHideController); mIsTablet = isTablet(mContext); mUserTracker = userTracker; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 4d29612951cc8..d707dbdf5cba8 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -19,6 +19,8 @@ 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.containsType; import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; @@ -57,7 +59,9 @@ import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.shared.recents.utilities.Utilities; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.AutoHideController; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -77,6 +81,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private NavigationBarA11yHelper mNavigationBarA11yHelper; private NavigationModeController mNavigationModeController; private SysUiState mSysUiState; + private AutoHideController mAutoHideController; private int mDisplayId; private int mNavigationIconHints; private final NavigationBarA11yHelper.NavA11yEventListener mNavA11yEventListener = @@ -87,6 +92,28 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private final Context mContext; private final DisplayManager mDisplayManager; private Context mWindowContext; + /** + * Tracks the system calls for when taskbar should transiently show or hide so we can return + * this value in {@link AutoHideUiElement#isVisible()} below. + * + * This also gets set by {@link #onTaskbarAutohideSuspend(boolean)} to force show the transient + * taskbar if launcher has requested to suspend auto-hide behavior. + */ + private boolean mTaskbarTransientShowing; + private final AutoHideUiElement mAutoHideUiElement = new AutoHideUiElement() { + @Override + public void synchronizeState() { + } + + @Override + public boolean isVisible() { + return mTaskbarTransientShowing; + } + + @Override + public void hide() { + } + }; @Inject public TaskbarDelegate(Context context) { @@ -96,11 +123,12 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mDisplayManager = mContext.getSystemService(DisplayManager.class); } - public void setOverviewProxyService(CommandQueue commandQueue, + public void setDependencies(CommandQueue commandQueue, OverviewProxyService overviewProxyService, NavigationBarA11yHelper navigationBarA11yHelper, NavigationModeController navigationModeController, - SysUiState sysUiState, DumpManager dumpManager) { + SysUiState sysUiState, DumpManager dumpManager, + AutoHideController autoHideController) { // TODO: adding this in the ctor results in a dagger dependency cycle :( mCommandQueue = commandQueue; mOverviewProxyService = overviewProxyService; @@ -108,18 +136,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mNavigationModeController = navigationModeController; mSysUiState = sysUiState; dumpManager.registerDumpable(this); - } - - public void destroy() { - mCommandQueue.removeCallback(this); - mOverviewProxyService.removeCallback(this); - mNavigationModeController.removeListener(this); - mNavigationBarA11yHelper.removeA11yEventListener(mNavA11yEventListener); - mEdgeBackGestureHandler.onNavBarDetached(); - if (mWindowContext != null) { - mWindowContext.unregisterComponentCallbacks(this); - mWindowContext = null; - } + mAutoHideController = autoHideController; } public void init(int displayId) { @@ -136,6 +153,20 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mWindowContext.registerComponentCallbacks(this); // Set initial state for any listeners updateSysuiFlags(); + mAutoHideController.setNavigationBar(mAutoHideUiElement); + } + + public void destroy() { + mCommandQueue.removeCallback(this); + mOverviewProxyService.removeCallback(this); + mNavigationModeController.removeListener(this); + mNavigationBarA11yHelper.removeA11yEventListener(mNavA11yEventListener); + mEdgeBackGestureHandler.onNavBarDetached(); + if (mWindowContext != null) { + mWindowContext.unregisterComponentCallbacks(this); + mWindowContext = null; + } + mAutoHideController.setNavigationBar(null); } private void updateSysuiFlags() { @@ -208,6 +239,38 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } } + @Override + public void showTransient(int displayId, int[] types) { + if (displayId != mDisplayId) { + return; + } + if (!containsType(types, ITYPE_NAVIGATION_BAR)) { + return; + } + mTaskbarTransientShowing = true; + } + + @Override + public void abortTransient(int displayId, int[] types) { + if (displayId != mDisplayId) { + return; + } + if (!containsType(types, ITYPE_NAVIGATION_BAR)) { + return; + } + mTaskbarTransientShowing = false; + } + + @Override + public void onTaskbarAutohideSuspend(boolean suspend) { + mTaskbarTransientShowing = suspend; + if (suspend) { + mAutoHideController.suspendAutoHide(); + } else { + mAutoHideController.resumeSuspendedAutoHide(); + } + } + @Override public void onNavigationModeChanged(int mode) { mEdgeBackGestureHandler.onNavigationModeChanged(mode); @@ -236,6 +299,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, pw.println(" mDisabledFlags=" + mDisabledFlags); pw.println(" mTaskBarWindowState=" + mTaskBarWindowState); pw.println(" mBehavior=" + mBehavior); + pw.println(" mTaskbarTransientShowing=" + mTaskbarTransientShowing); mEdgeBackGestureHandler.dump(pw); } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index c76f01b9f1926..721a6af37e210 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -248,6 +248,12 @@ public class OverviewProxyService extends CurrentUserTracker implements onTaskbarStatusUpdated(visible, stashed)); } + @Override + public void notifyTaskbarAutohideSuspend(boolean suspend) { + verifyCallerAndClearCallingIdentityPostMain("notifyTaskbarAutohideSuspend", () -> + onTaskbarAutohideSuspend(suspend)); + } + private boolean sendEvent(int action, int code) { long when = SystemClock.uptimeMillis(); final KeyEvent ev = new KeyEvent(when, when, action, code, 0 /* repeat */, @@ -818,6 +824,12 @@ public class OverviewProxyService extends CurrentUserTracker implements } } + private void onTaskbarAutohideSuspend(boolean suspend) { + for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { + mConnectionCallbacks.get(i).onTaskbarAutohideSuspend(suspend); + } + } + private void notifyConnectionChanged() { for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { mConnectionCallbacks.get(i).onConnectionChanged(mOverviewProxy != null); @@ -1000,6 +1012,7 @@ public class OverviewProxyService extends CurrentUserTracker implements default void onNavBarButtonAlphaChanged(float alpha, boolean animate) {} default void onHomeRotationEnabled(boolean enabled) {} default void onTaskbarStatusUpdated(boolean visible, boolean stashed) {} + default void onTaskbarAutohideSuspend(boolean suspend) {} default void onSystemUiStateChanged(int sysuiStateFlags) {} default void onAssistantProgress(@FloatRange(from = 0.0, to = 1.0) float progress) {} default void onAssistantGestureCompletion(float velocity) {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java index aeb2efd2026a9..e12009e655b52 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java @@ -37,6 +37,7 @@ public class AutoHideController { private final Handler mHandler; private AutoHideUiElement mStatusBar; + /** For tablets, this will represent the Taskbar */ private AutoHideUiElement mNavigationBar; private int mDisplayId; @@ -89,7 +90,7 @@ public class AutoHideController { } } - void resumeSuspendedAutoHide() { + public void resumeSuspendedAutoHide() { if (mAutoHideSuspended) { scheduleAutoHide(); Runnable checkBarModesRunnable = getCheckBarModesRunnable(); @@ -99,7 +100,7 @@ public class AutoHideController { } } - void suspendAutoHide() { + public void suspendAutoHide() { mHandler.removeCallbacks(mAutoHide); Runnable checkBarModesRunnable = getCheckBarModesRunnable(); if (checkBarModesRunnable != null) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java index c1a9739cb2326..2a8840b503ada 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java @@ -57,6 +57,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationShadeDepthController; +import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; @@ -118,7 +119,8 @@ public class NavigationBarControllerTest extends SysuiTestCase { mock(NavigationBarA11yHelper.class), mock(TaskbarDelegate.class), mock(UserTracker.class), - mock(DumpManager.class))); + mock(DumpManager.class), + mock(AutoHideController.class))); initializeNavigationBars(); }