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
This commit is contained in:
Winson Chung
2023-03-04 00:35:01 +00:00
parent 81d1f12f5b
commit a900149380
8 changed files with 46 additions and 28 deletions

View File

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

View File

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

View File

@@ -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) {

View File

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

View File

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

View File

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

View File

@@ -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,

View File

@@ -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)