diff options
| author | 2023-03-04 00:35:01 +0000 | |
|---|---|---|
| committer | 2023-03-09 18:44:56 +0000 | |
| commit | a9001493800b8e5e0e20a0754d5e89bf950b8c4f (patch) | |
| tree | 8133ee38bbedce257a83e0b86ec78d337c98e1f8 | |
| parent | 81d1f12f5b0e2fbf38b01cf8a06f81a42e722a01 (diff) | |
4/ Keep EdgeBackGestureHandler state across nav/taskbar changes
- Don't update the edge back handler state when switching between nav
and taskbar (since the nav mode doesn't change and a bar still exists
across the change)
Bug: 219035565
Test: atest NavBarHelperTests
Test: atest SystemUITests
Change-Id: If930d8950e5cc19eb8d6e86f01b676c1acabbe2b
8 files changed, 46 insertions, 28 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java index 59d6bfae5368..1da8718b111f 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java @@ -63,6 +63,7 @@ import com.android.systemui.accessibility.SystemActions; import com.android.systemui.assist.AssistManager; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; +import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; @@ -98,6 +99,7 @@ public final class NavBarHelper implements OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener, Dumpable, CommandQueue.Callbacks { private static final String TAG = NavBarHelper.class.getSimpleName(); + private final Handler mHandler = new Handler(Looper.getMainLooper()); private final AccessibilityManager mAccessibilityManager; private final Lazy<AssistManager> mAssistManagerLazy; @@ -111,6 +113,7 @@ public final class NavBarHelper implements private final Context mContext; private final CommandQueue mCommandQueue; private final ContentResolver mContentResolver; + private final EdgeBackGestureHandler mEdgeBackGestureHandler; private final IWindowManager mWm; private final int mDefaultDisplayId; private boolean mAssistantAvailable; @@ -175,6 +178,7 @@ public final class NavBarHelper implements Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, KeyguardStateController keyguardStateController, NavigationModeController navigationModeController, + EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory, IWindowManager wm, UserTracker userTracker, DisplayTracker displayTracker, @@ -193,6 +197,7 @@ public final class NavBarHelper implements mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver; mWm = wm; mDefaultDisplayId = displayTracker.getDefaultDisplayId(); + mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context); mNavBarMode = navigationModeController.addListener(this); mCommandQueue.addCallback(this); @@ -242,6 +247,9 @@ public final class NavBarHelper implements } catch (Exception e) { Log.w(TAG, "Failed to register wallpaper visibility listener", e); } + + // Attach the back handler only when the first bar is registered + mEdgeBackGestureHandler.onNavBarAttached(); } /** @@ -270,6 +278,9 @@ public final class NavBarHelper implements } catch (Exception e) { Log.w(TAG, "Failed to register wallpaper visibility listener", e); } + + // No more bars, detach the back handler for now + mEdgeBackGestureHandler.onNavBarDetached(); } /** @@ -429,6 +440,10 @@ public final class NavBarHelper implements return mLongPressHomeEnabled; } + public EdgeBackGestureHandler getEdgeBackGestureHandler() { + return mEdgeBackGestureHandler; + } + @Override public void startAssistant(Bundle bundle) { mAssistManagerLazy.get().startAssist(bundle); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index ab7581d2d10d..941770cff014 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -208,7 +208,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements private final Optional<Recents> mRecentsOptional; private final DeviceConfigProxy mDeviceConfigProxy; private final NavigationBarTransitions mNavigationBarTransitions; - private final EdgeBackGestureHandler mEdgeBackGestureHandler; private final Optional<BackAnimation> mBackAnimation; private final Handler mHandler; private final UiEventLogger mUiEventLogger; @@ -220,6 +219,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements private final DisplayTracker mDisplayTracker; private final RegionSamplingHelper mRegionSamplingHelper; private final int mNavColorSampleMargin; + private EdgeBackGestureHandler mEdgeBackGestureHandler; private NavigationBarFrame mFrame; private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING; @@ -557,7 +557,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements DeadZone deadZone, DeviceConfigProxy deviceConfigProxy, NavigationBarTransitions navigationBarTransitions, - EdgeBackGestureHandler edgeBackGestureHandler, Optional<BackAnimation> backAnimation, UserContextProvider userContextProvider, WakefulnessLifecycle wakefulnessLifecycle, @@ -587,7 +586,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mDeadZone = deadZone; mDeviceConfigProxy = deviceConfigProxy; mNavigationBarTransitions = navigationBarTransitions; - mEdgeBackGestureHandler = edgeBackGestureHandler; mBackAnimation = backAnimation; mHandler = mainHandler; mUiEventLogger = uiEventLogger; @@ -603,6 +601,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mWakefulnessLifecycle = wakefulnessLifecycle; mTaskStackChangeListeners = taskStackChangeListeners; mDisplayTracker = displayTracker; + mEdgeBackGestureHandler = navBarHelper.getEdgeBackGestureHandler(); mNavColorSampleMargin = getResources() .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin); @@ -722,6 +721,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements mCommandQueue.removeCallback(this); mWindowManager.removeViewImmediate(mView.getRootView()); mNavigationModeController.removeListener(mModeChangedListener); + mEdgeBackGestureHandler.setStateChangeCallback(null); mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater); mNotificationShadeDepthController.removeListener(mDepthListener); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 47701afc387b..5d598e8dc765 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -1093,9 +1093,6 @@ public class NavigationBarView extends FrameLayout { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - // This needs to happen first as it can changed the enabled state which can affect whether - // the back button is visible - mEdgeBackGestureHandler.onNavBarAttached(); requestApplyInsets(); reorient(); if (mRotationButtonController != null) { @@ -1115,8 +1112,6 @@ public class NavigationBarView extends FrameLayout { mFloatingRotationButton.hide(); mRotationButtonController.unregisterListeners(); } - - mEdgeBackGestureHandler.onNavBarDetached(); } void dump(PrintWriter pw) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index dc5c9bd7b38a..85d0ce53d9ff 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -93,7 +93,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, Dumpable { private static final String TAG = TaskbarDelegate.class.getSimpleName(); - private final EdgeBackGestureHandler mEdgeBackGestureHandler; + private EdgeBackGestureHandler mEdgeBackGestureHandler; private final LightBarTransitionsController.Factory mLightBarTransitionsControllerFactory; private boolean mInitialized; private CommandQueue mCommandQueue; @@ -171,15 +171,15 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Inject public TaskbarDelegate(Context context, - EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory, LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, StatusBarKeyguardViewManager statusBarKeyguardViewManager) { mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory; - mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context); mContext = context; mDisplayManager = mContext.getSystemService(DisplayManager.class); - mPipListener = mEdgeBackGestureHandler::setPipStashExclusionBounds; + mPipListener = (bounds) -> { + mEdgeBackGestureHandler.setPipStashExclusionBounds(bounds); + }; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mStatusBarKeyguardViewManager.setTaskbarDelegate(this); } @@ -207,6 +207,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mBackAnimation = backAnimation; mLightBarTransitionsController = createLightBarTransitionsController(); mTaskStackChangeListeners = taskStackChangeListeners; + mEdgeBackGestureHandler = navBarHelper.getEdgeBackGestureHandler(); } // Separated into a method to keep setDependencies() clean/readable. @@ -239,7 +240,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mOverviewProxyService.addCallback(this); onNavigationModeChanged(mNavigationModeController.addListener(this)); mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater); - mEdgeBackGestureHandler.onNavBarAttached(); // Initialize component callback Display display = mDisplayManager.getDisplay(displayId); mWindowContext = mContext.createWindowContext(display, TYPE_APPLICATION, null); @@ -263,7 +263,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, mOverviewProxyService.removeCallback(this); mNavigationModeController.removeListener(this); mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater); - mEdgeBackGestureHandler.onNavBarDetached(); mScreenPinningNotify = null; mWindowContext = null; mAutoHideController.setNavigationBar(null); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index eea0e4cd94b9..c6f3968cec98 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -453,7 +453,7 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack } /** - * @see NavigationBarView#onAttachedToWindow() + * Called when the nav/task bar is attached. */ public void onNavBarAttached() { mIsAttached = true; @@ -465,7 +465,7 @@ public class EdgeBackGestureHandler implements PluginListener<NavigationEdgeBack } /** - * @see NavigationBarView#onDetachedFromWindow() + * Called when the nav/task bar is detached. */ public void onNavBarDetached() { mIsAttached = false; diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java index 56894d7903dc..9b8605dccd09 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java @@ -47,6 +47,7 @@ import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; import com.android.systemui.accessibility.SystemActions; import com.android.systemui.assist.AssistManager; import com.android.systemui.dump.DumpManager; +import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; @@ -107,6 +108,10 @@ public class NavBarHelperTest extends SysuiTestCase { IWindowManager mWm; @Mock DisplayTracker mDisplayTracker; + @Mock + EdgeBackGestureHandler mEdgeBackGestureHandler; + @Mock + EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory; private AccessibilityManager.AccessibilityServicesStateChangeListener mAccessibilityServicesStateChangeListener; @@ -121,6 +126,7 @@ public class NavBarHelperTest extends SysuiTestCase { when(mAssistManager.getAssistInfoForUser(anyInt())).thenReturn(mAssistantComponent); when(mUserTracker.getUserId()).thenReturn(1); when(mDisplayTracker.getDefaultDisplayId()).thenReturn(0); + when(mEdgeBackGestureHandlerFactory.create(any())).thenReturn(mEdgeBackGestureHandler); doAnswer((invocation) -> mAccessibilityServicesStateChangeListener = invocation.getArgument(0)).when( @@ -129,8 +135,8 @@ public class NavBarHelperTest extends SysuiTestCase { mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver, mSystemActions, mOverviewProxyService, mAssistManagerLazy, () -> Optional.of(mock(CentralSurfaces.class)), mock(KeyguardStateController.class), - mNavigationModeController, mWm, mUserTracker, mDisplayTracker, mDumpManager, - mCommandQueue); + mNavigationModeController, mEdgeBackGestureHandlerFactory, mWm, mUserTracker, + mDisplayTracker, mDumpManager, mCommandQueue); } @@ -151,6 +157,7 @@ public class NavBarHelperTest extends SysuiTestCase { verify(mAssistManager, times(1)).getAssistInfoForUser(anyInt()); verify(mWm, times(1)).watchRotation(any(), anyInt()); verify(mWm, times(1)).registerWallpaperVisibilityListener(any(), anyInt()); + verify(mEdgeBackGestureHandler, times(1)).onNavBarAttached(); } @Test @@ -163,6 +170,7 @@ public class NavBarHelperTest extends SysuiTestCase { mNavBarHelper); verify(mWm, times(1)).removeRotationWatcher(any()); verify(mWm, times(1)).unregisterWallpaperVisibilityListener(any(), anyInt()); + verify(mEdgeBackGestureHandler, times(1)).onNavBarDetached(); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index 35ab10ff4c16..f062ec732b21 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -174,8 +174,6 @@ public class NavigationBarTest extends SysuiTestCase { private UiEventLogger mUiEventLogger; @Mock private ViewTreeObserver mViewTreeObserver; - @Mock - EdgeBackGestureHandler mEdgeBackGestureHandler; NavBarHelper mNavBarHelper; @Mock private LightBarController mLightBarController; @@ -207,6 +205,10 @@ public class NavigationBarTest extends SysuiTestCase { private Resources mResources; @Mock private ViewRootImpl mViewRootImpl; + @Mock + private EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory; + @Mock + private EdgeBackGestureHandler mEdgeBackGestureHandler; private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake(); private TaskStackChangeListeners mTaskStackChangeListeners = @@ -236,6 +238,7 @@ public class NavigationBarTest extends SysuiTestCase { .thenReturn(mContext); when(mNavigationBarView.getResources()).thenReturn(mResources); when(mNavigationBarView.getViewRootImpl()).thenReturn(mViewRootImpl); + when(mEdgeBackGestureHandlerFactory.create(any())).thenReturn(mEdgeBackGestureHandler); setupSysuiDependency(); // This class inflates views that call Dependency.get, thus these injections are still // necessary. @@ -252,8 +255,9 @@ public class NavigationBarTest extends SysuiTestCase { mSystemActions, mOverviewProxyService, () -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces), mKeyguardStateController, mock(NavigationModeController.class), - mock(IWindowManager.class), mock(UserTracker.class), mock(DisplayTracker.class), - mock(DumpManager.class), mock(CommandQueue.class))); + mEdgeBackGestureHandlerFactory, mock(IWindowManager.class), + mock(UserTracker.class), mock(DisplayTracker.class), mock(DumpManager.class), + mock(CommandQueue.class))); mNavigationBar = createNavBar(mContext); mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal); }); @@ -495,7 +499,6 @@ public class NavigationBarTest extends SysuiTestCase { mDeadZone, mDeviceConfigProxyFake, mNavigationBarTransitions, - mEdgeBackGestureHandler, Optional.of(mock(BackAnimation.class)), mUserContextProvider, mWakefulnessLifecycle, 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 1c9336a3fc66..8d01e80d37d4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt @@ -38,8 +38,6 @@ class TaskbarDelegateTest : SysuiTestCase() { private lateinit var mTaskStackChangeListeners: TaskStackChangeListeners private lateinit var mTaskbarDelegate: TaskbarDelegate @Mock - lateinit var mEdgeBackGestureHandlerFactory : EdgeBackGestureHandler.Factory - @Mock lateinit var mEdgeBackGestureHandler : EdgeBackGestureHandler @Mock lateinit var mLightBarControllerFactory : LightBarTransitionsController.Factory @@ -73,13 +71,13 @@ class TaskbarDelegateTest : SysuiTestCase() { @Before fun setup() { MockitoAnnotations.initMocks(this) - `when`(mEdgeBackGestureHandlerFactory.create(context)).thenReturn(mEdgeBackGestureHandler) + `when`(mNavBarHelper.edgeBackGestureHandler).thenReturn(mEdgeBackGestureHandler) `when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController) `when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState) `when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState) mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance() - mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory, - mLightBarControllerFactory, mStatusBarKeyguardViewManager) + mTaskbarDelegate = TaskbarDelegate(context, mLightBarControllerFactory, + mStatusBarKeyguardViewManager) mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper, mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController, mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners) |