From 13ea9ede14b2a7838d1f8b4c6cb290859ccdf028 Mon Sep 17 00:00:00 2001 From: Yunfan Chen Date: Thu, 16 Feb 2023 14:53:00 +0900 Subject: [PATCH] Hide task bar on AOD The previous logic only checks the existance of navigation bar. Check task bar as well to make sure task bar gesture bar can be hidden correctly on AOD. Inject StatusBarKeyguardViewManager into TaskbarDelegate instead of the reverse way to avoid loop injection. Bug: 259759616 Test: See the bug's reproduce steps. Test: atest StatusBarKeyguardViewManagerTest TaskbarDelegateTest Change-Id: I8f1764d1baf59a5fbf44ab6f92845eac7c231608 --- .../navigationbar/TaskbarDelegate.java | 9 ++++++--- .../phone/StatusBarKeyguardViewManager.java | 9 ++++++++- .../navigationbar/TaskbarDelegateTest.kt | 5 ++++- .../StatusBarKeyguardViewManagerTest.java | 20 +++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 6ee86aa021a32..5b02aaf089e07 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -41,7 +41,6 @@ import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode import android.app.StatusBarManager; import android.app.StatusBarManager.WindowVisibleState; -import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; @@ -68,7 +67,6 @@ import com.android.systemui.model.SysUiState; 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.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -78,6 +76,7 @@ import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LightBarTransitionsController; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.pip.Pip; @@ -169,16 +168,20 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private BackAnimation mBackAnimation; + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Inject public TaskbarDelegate(Context context, EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory, - LightBarTransitionsController.Factory lightBarTransitionsControllerFactory) { + LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory; mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context); mContext = context; mDisplayManager = mContext.getSystemService(DisplayManager.class); mPipListener = mEdgeBackGestureHandler::setPipStashExclusionBounds; + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; + mStatusBarKeyguardViewManager.setTaskbarDelegate(this); } public void setDependencies(CommandQueue commandQueue, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index fd465710d4ea9..ceff6dfea0388 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -66,6 +66,7 @@ import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInt import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.navigationbar.NavigationBarView; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.navigationbar.TaskbarDelegate; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shade.NotificationPanelViewController; import com.android.systemui.shade.ShadeController; @@ -300,6 +301,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb @Nullable private KeyguardBypassController mBypassController; @Nullable private OccludingAppBiometricUI mOccludingAppBiometricUI; + @Nullable private TaskbarDelegate mTaskbarDelegate; private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -564,6 +566,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb updateStates(); } + public void setTaskbarDelegate(TaskbarDelegate taskbarDelegate) { + mTaskbarDelegate = taskbarDelegate; + } + /** * Show the keyguard. Will handle creating and attaching to the view manager * lazily. @@ -1194,7 +1200,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb * Updates the visibility of the nav bar window (which will cause insets changes). */ protected void updateNavigationBarVisibility(boolean navBarVisible) { - if (mCentralSurfaces.getNavigationBarView() != null) { + if (mCentralSurfaces.getNavigationBarView() != null + || (mTaskbarDelegate != null && mTaskbarDelegate.isInitialized())) { if (navBarVisible) { long delay = getNavBarShowDelay(); if (delay == 0) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt index 537dfb821fefa..1c9336a3fc66c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt @@ -13,6 +13,7 @@ import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.phone.AutoHideController import com.android.systemui.statusbar.phone.LightBarController import com.android.systemui.statusbar.phone.LightBarTransitionsController +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import com.android.wm.shell.back.BackAnimation import com.android.wm.shell.pip.Pip import org.junit.Before @@ -66,6 +67,8 @@ class TaskbarDelegateTest : SysuiTestCase() { lateinit var mBackAnimation: BackAnimation @Mock lateinit var mCurrentSysUiState: NavBarHelper.CurrentSysuiState + @Mock + lateinit var mStatusBarKeyguardViewManager: StatusBarKeyguardViewManager @Before fun setup() { @@ -76,7 +79,7 @@ class TaskbarDelegateTest : SysuiTestCase() { `when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState) mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance() mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory, - mLightBarControllerFactory) + mLightBarControllerFactory, mStatusBarKeyguardViewManager) mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper, mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController, mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java index d8446f4721b31..1aad83eb73ae0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManagerTest.java @@ -38,6 +38,8 @@ import android.testing.TestableLooper; import android.view.View; import android.view.ViewGroup; import android.view.ViewRootImpl; +import android.view.WindowInsets; +import android.view.WindowInsetsController; import android.window.BackEvent; import android.window.OnBackAnimationCallback; import android.window.OnBackInvokedCallback; @@ -65,8 +67,10 @@ import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInt import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerCallbackInteractor.PrimaryBouncerExpansionCallback; import com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.navigationbar.TaskbarDelegate; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.shade.NotificationPanelViewController; +import com.android.systemui.shade.NotificationShadeWindowView; import com.android.systemui.shade.ShadeController; import com.android.systemui.shade.ShadeExpansionChangeEvent; import com.android.systemui.shade.ShadeExpansionStateManager; @@ -123,6 +127,9 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { @Mock private BouncerView mBouncerView; @Mock private BouncerViewDelegate mBouncerViewDelegate; @Mock private OnBackAnimationCallback mBouncerViewDelegateBackCallback; + @Mock private NotificationShadeWindowView mNotificationShadeWindowView; + @Mock private WindowInsetsController mWindowInsetsController; + @Mock private TaskbarDelegate mTaskbarDelegate; private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private PrimaryBouncerCallbackInteractor.PrimaryBouncerExpansionCallback @@ -151,6 +158,11 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { .isEnabled(Flags.WM_ENABLE_PREDICTIVE_BACK_BOUNCER_ANIM)) .thenReturn(true); + when(mCentralSurfaces.getNotificationShadeWindowView()) + .thenReturn(mNotificationShadeWindowView); + when(mNotificationShadeWindowView.getWindowInsetsController()) + .thenReturn(mWindowInsetsController); + mStatusBarKeyguardViewManager = new StatusBarKeyguardViewManager( getContext(), @@ -639,6 +651,14 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { verify(mCentralSurfaces).setBouncerShowingOverDream(false); } + @Test + public void testHideTaskbar() { + when(mTaskbarDelegate.isInitialized()).thenReturn(true); + mStatusBarKeyguardViewManager.setTaskbarDelegate(mTaskbarDelegate); + mStatusBarKeyguardViewManager.updateNavigationBarVisibility(false); + verify(mWindowInsetsController).hide(WindowInsets.Type.navigationBars()); + } + @Test public void hideAlternateBouncer_beforeCentralSurfacesRegistered() { mStatusBarKeyguardViewManager =