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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user