summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java91
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java181
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java41
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java48
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java76
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt8
12 files changed, 329 insertions, 170 deletions
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java
index 5b27c40740da..53fab69bd3b8 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/rotation/RotationButtonController.java
@@ -96,9 +96,9 @@ public class RotationButtonController {
private boolean mHoveringRotationSuggestion;
private final AccessibilityManager mAccessibilityManager;
private final TaskStackListenerImpl mTaskStackListener;
- private Consumer<Integer> mRotWatcherListener;
private boolean mListenersRegistered = false;
+ private boolean mRotationWatcherRegistered = false;
private boolean mIsNavigationBarShowing;
@SuppressLint("InlinedApi")
private @WindowInsetsController.Behavior
@@ -140,22 +140,7 @@ public class RotationButtonController {
// We need this to be scheduled as early as possible to beat the redrawing of
// window in response to the orientation change.
mMainThreadHandler.postAtFrontOfQueue(() -> {
- // If the screen rotation changes while locked, potentially update lock to flow with
- // new screen rotation and hide any showing suggestions.
- boolean rotationLocked = isRotationLocked();
- // The isVisible check makes the rotation button disappear when we are not locked
- // (e.g. for tabletop auto-rotate).
- if (rotationLocked || mRotationButton.isVisible()) {
- // Do not allow a change in rotation to set user rotation when docked.
- if (shouldOverrideUserLockPrefs(rotation) && rotationLocked && !mDocked) {
- setRotationLockedAtAngle(rotation);
- }
- setRotateSuggestionButtonState(false /* visible */, true /* forced */);
- }
-
- if (mRotWatcherListener != null) {
- mRotWatcherListener.accept(rotation);
- }
+ onRotationWatcherChanged(rotation);
});
}
};
@@ -206,8 +191,11 @@ public class RotationButtonController {
return mContext;
}
+ /**
+ * Called during Taskbar initialization.
+ */
public void init() {
- registerListeners();
+ registerListeners(true /* registerRotationWatcher */);
if (mContext.getDisplay().getDisplayId() != DEFAULT_DISPLAY) {
// Currently there is no accelerometer sensor on non-default display, disable fixed
// rotation for non-default display
@@ -215,11 +203,14 @@ public class RotationButtonController {
}
}
+ /**
+ * Called during Taskbar uninitialization.
+ */
public void onDestroy() {
unregisterListeners();
}
- public void registerListeners() {
+ public void registerListeners(boolean registerRotationWatcher) {
if (mListenersRegistered || getContext().getPackageManager().hasSystemFeature(FEATURE_PC)) {
return;
}
@@ -229,15 +220,18 @@ public class RotationButtonController {
updateDockedState(mContext.registerReceiver(mDockedReceiver,
new IntentFilter(Intent.ACTION_DOCK_EVENT)));
- try {
- WindowManagerGlobal.getWindowManagerService()
- .watchRotation(mRotationWatcher, DEFAULT_DISPLAY);
- } catch (IllegalArgumentException e) {
- mListenersRegistered = false;
- Log.w(TAG, "RegisterListeners for the display failed");
- } catch (RemoteException e) {
- Log.e(TAG, "RegisterListeners caught a RemoteException", e);
- return;
+ if (registerRotationWatcher) {
+ try {
+ WindowManagerGlobal.getWindowManagerService()
+ .watchRotation(mRotationWatcher, DEFAULT_DISPLAY);
+ mRotationWatcherRegistered = true;
+ } catch (IllegalArgumentException e) {
+ mListenersRegistered = false;
+ Log.w(TAG, "RegisterListeners for the display failed", e);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RegisterListeners caught a RemoteException", e);
+ return;
+ }
}
TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener);
@@ -251,20 +245,19 @@ public class RotationButtonController {
mListenersRegistered = false;
mContext.unregisterReceiver(mDockedReceiver);
- try {
- WindowManagerGlobal.getWindowManagerService().removeRotationWatcher(mRotationWatcher);
- } catch (RemoteException e) {
- Log.e(TAG, "UnregisterListeners caught a RemoteException", e);
- return;
+ if (mRotationWatcherRegistered) {
+ try {
+ WindowManagerGlobal.getWindowManagerService().removeRotationWatcher(
+ mRotationWatcher);
+ } catch (RemoteException e) {
+ Log.e(TAG, "UnregisterListeners caught a RemoteException", e);
+ return;
+ }
}
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
}
- public void setRotationCallback(Consumer<Integer> watcher) {
- mRotWatcherListener = watcher;
- }
-
public void setRotationLockedAtAngle(int rotationSuggestion) {
RotationPolicy.setRotationLockAtAngle(mContext, /* enabled= */ isRotationLocked(),
/* rotation= */ rotationSuggestion);
@@ -427,6 +420,30 @@ public class RotationButtonController {
}
}
+ /**
+ * Called when the rotation watcher rotation changes, either from the watcher registered
+ * internally in this class, or a signal propagated from NavBarHelper.
+ */
+ public void onRotationWatcherChanged(int rotation) {
+ if (!mListenersRegistered) {
+ // Ignore if not registered
+ return;
+ }
+
+ // If the screen rotation changes while locked, potentially update lock to flow with
+ // new screen rotation and hide any showing suggestions.
+ boolean rotationLocked = isRotationLocked();
+ // The isVisible check makes the rotation button disappear when we are not locked
+ // (e.g. for tabletop auto-rotate).
+ if (rotationLocked || mRotationButton.isVisible()) {
+ // Do not allow a change in rotation to set user rotation when docked.
+ if (shouldOverrideUserLockPrefs(rotation) && rotationLocked && !mDocked) {
+ setRotationLockedAtAngle(rotation);
+ }
+ setRotateSuggestionButtonState(false /* visible */, true /* forced */);
+ }
+ }
+
public void onDisable2FlagChanged(int state2) {
final boolean rotateSuggestionsDisabled = hasDisable2RotateSuggestionFlag(state2);
if (rotateSuggestionsDisabled) onRotationSuggestionsDisabled();
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
index 1121e160c353..1da8718b111f 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavBarHelper.java
@@ -41,11 +41,17 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings.Secure;
+import android.util.Log;
+import android.view.IRotationWatcher;
+import android.view.IWallpaperVisibilityListener;
+import android.view.IWindowManager;
import android.view.View;
import android.view.WindowInsets;
+import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull;
@@ -57,7 +63,9 @@ 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;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue;
@@ -90,6 +98,9 @@ public final class NavBarHelper implements
AccessibilityButtonTargetsObserver.TargetsChangedListener,
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;
private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
@@ -98,28 +109,60 @@ public final class NavBarHelper implements
private final SystemActions mSystemActions;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
- private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
+ private final List<NavbarTaskbarStateUpdater> mStateListeners = new ArrayList<>();
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;
private boolean mLongPressHomeEnabled;
private boolean mAssistantTouchGestureEnabled;
private int mNavBarMode;
private int mA11yButtonState;
+ private int mRotationWatcherRotation;
+ private boolean mTogglingNavbarTaskbar;
+ private boolean mWallpaperVisible;
// Attributes used in NavBarHelper.CurrentSysuiState
private int mWindowStateDisplayId;
private @WindowVisibleState int mWindowState;
- private final ContentObserver mAssistContentObserver = new ContentObserver(
- new Handler(Looper.getMainLooper())) {
+ // Listens for changes to the assistant
+ private final ContentObserver mAssistContentObserver = new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange, Uri uri) {
updateAssistantAvailability();
}
};
+ // Listens for changes to the wallpaper visibility
+ private final IWallpaperVisibilityListener mWallpaperVisibilityListener =
+ new IWallpaperVisibilityListener.Stub() {
+ @Override
+ public void onWallpaperVisibilityChanged(boolean visible,
+ int displayId) throws RemoteException {
+ mHandler.post(() -> {
+ mWallpaperVisible = visible;
+ dispatchWallpaperVisibilityChanged(visible, displayId);
+ });
+ }
+ };
+
+ // Listens for changes to display rotation
+ private final IRotationWatcher mRotationWatcher = new IRotationWatcher.Stub() {
+ @Override
+ public void onRotationChanged(final int rotation) {
+ // We need this to be scheduled as early as possible to beat the redrawing of
+ // window in response to the orientation change.
+ mHandler.postAtFrontOfQueue(() -> {
+ mRotationWatcherRotation = rotation;
+ dispatchRotationChanged(rotation);
+ });
+ }
+ };
+
/**
* @param context This is not display specific, then again neither is any of the code in
* this class. Once there's display specific code, we may want to create an
@@ -135,7 +178,10 @@ public final class NavBarHelper implements
Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
KeyguardStateController keyguardStateController,
NavigationModeController navigationModeController,
+ EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory,
+ IWindowManager wm,
UserTracker userTracker,
+ DisplayTracker displayTracker,
DumpManager dumpManager,
CommandQueue commandQueue) {
mContext = context;
@@ -147,18 +193,36 @@ public final class NavBarHelper implements
mKeyguardStateController = keyguardStateController;
mUserTracker = userTracker;
mSystemActions = systemActions;
- accessibilityManager.addAccessibilityServicesStateChangeListener(this);
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver;
+ mWm = wm;
+ mDefaultDisplayId = displayTracker.getDefaultDisplayId();
+ mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context);
- mAccessibilityButtonModeObserver.addListener(this);
- mAccessibilityButtonTargetsObserver.addListener(this);
mNavBarMode = navigationModeController.addListener(this);
+ mCommandQueue.addCallback(this);
overviewProxyService.addCallback(this);
dumpManager.registerDumpable(this);
}
- public void init() {
+ /**
+ * Hints to the helper that bars are being replaced, which is a signal to potentially suppress
+ * normal setup/cleanup when no bars are present.
+ */
+ public void setTogglingNavbarTaskbar(boolean togglingNavbarTaskbar) {
+ mTogglingNavbarTaskbar = togglingNavbarTaskbar;
+ }
+
+ /**
+ * Called when the first (non-replacing) bar is registered.
+ */
+ private void setupOnFirstBar() {
+ // Setup accessibility listeners
+ mAccessibilityManager.addAccessibilityServicesStateChangeListener(this);
+ mAccessibilityButtonModeObserver.addListener(this);
+ mAccessibilityButtonTargetsObserver.addListener(this);
+
+ // Setup assistant listener
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),
false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL);
@@ -168,59 +232,114 @@ public final class NavBarHelper implements
mContentResolver.registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),
false, mAssistContentObserver, UserHandle.USER_ALL);
- updateAssistantAvailability();
- updateA11yState();
- mCommandQueue.addCallback(this);
+ // Setup display rotation watcher
+ try {
+ mWm.watchRotation(mRotationWatcher, mDefaultDisplayId);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to register rotation watcher", e);
+ }
+
+ // Setup wallpaper visibility listener
+ try {
+ mWallpaperVisible = mWm.registerWallpaperVisibilityListener(
+ mWallpaperVisibilityListener, mDefaultDisplayId);
+ } 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();
}
- public void destroy() {
+ /**
+ * Called after the last (non-replacing) bar is unregistered.
+ */
+ private void cleanupAfterLastBar() {
+ // Clean up accessibility listeners
+ mAccessibilityManager.removeAccessibilityServicesStateChangeListener(this);
+ mAccessibilityButtonModeObserver.removeListener(this);
+ mAccessibilityButtonTargetsObserver.removeListener(this);
+
+ // Clean up assistant listeners
mContentResolver.unregisterContentObserver(mAssistContentObserver);
- mCommandQueue.removeCallback(this);
+
+ // Clean up display rotation watcher
+ try {
+ mWm.removeRotationWatcher(mRotationWatcher);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to unregister rotation watcher", e);
+ }
+
+ // Clean up wallpaper visibility listener
+ try {
+ mWm.unregisterWallpaperVisibilityListener(mWallpaperVisibilityListener,
+ mDefaultDisplayId);
+ } catch (Exception e) {
+ Log.w(TAG, "Failed to register wallpaper visibility listener", e);
+ }
+
+ // No more bars, detach the back handler for now
+ mEdgeBackGestureHandler.onNavBarDetached();
}
/**
+ * Registers a listener for future updates to the shared navbar/taskbar state.
* @param listener Will immediately get callbacks based on current state
*/
public void registerNavTaskStateUpdater(NavbarTaskbarStateUpdater listener) {
- mA11yEventListeners.add(listener);
- listener.updateAccessibilityServicesState();
- listener.updateAssistantAvailable(mAssistantAvailable, mLongPressHomeEnabled);
+ mStateListeners.add(listener);
+ if (!mTogglingNavbarTaskbar && mStateListeners.size() == 1) {
+ setupOnFirstBar();
+
+ // Update the state once the first bar is registered
+ updateAssistantAvailability();
+ updateA11yState();
+ mCommandQueue.recomputeDisableFlags(mContext.getDisplayId(), false /* animate */);
+ } else {
+ listener.updateAccessibilityServicesState();
+ listener.updateAssistantAvailable(mAssistantAvailable, mLongPressHomeEnabled);
+ }
+ listener.updateWallpaperVisibility(mWallpaperVisible, mDefaultDisplayId);
+ listener.updateRotationWatcherState(mRotationWatcherRotation);
}
+ /**
+ * Removes a previously registered listener.
+ */
public void removeNavTaskStateUpdater(NavbarTaskbarStateUpdater listener) {
- mA11yEventListeners.remove(listener);
+ mStateListeners.remove(listener);
+ if (!mTogglingNavbarTaskbar && mStateListeners.isEmpty()) {
+ cleanupAfterLastBar();
+ }
}
private void dispatchA11yEventUpdate() {
- for (NavbarTaskbarStateUpdater listener : mA11yEventListeners) {
+ for (NavbarTaskbarStateUpdater listener : mStateListeners) {
listener.updateAccessibilityServicesState();
}
}
private void dispatchAssistantEventUpdate(boolean assistantAvailable,
boolean longPressHomeEnabled) {
- for (NavbarTaskbarStateUpdater listener : mA11yEventListeners) {
+ for (NavbarTaskbarStateUpdater listener : mStateListeners) {
listener.updateAssistantAvailable(assistantAvailable, longPressHomeEnabled);
}
}
@Override
public void onAccessibilityServicesStateChanged(AccessibilityManager manager) {
- dispatchA11yEventUpdate();
updateA11yState();
}
@Override
public void onAccessibilityButtonModeChanged(int mode) {
updateA11yState();
- dispatchA11yEventUpdate();
}
@Override
public void onAccessibilityButtonTargetsChanged(String targets) {
updateA11yState();
- dispatchA11yEventUpdate();
}
/**
@@ -262,6 +381,8 @@ public final class NavBarHelper implements
updateSystemAction(clickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON);
updateSystemAction(longClickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER);
}
+
+ dispatchA11yEventUpdate();
}
/**
@@ -319,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);
@@ -357,6 +482,18 @@ public final class NavBarHelper implements
mWindowState = state;
}
+ private void dispatchWallpaperVisibilityChanged(boolean visible, int displayId) {
+ for (NavbarTaskbarStateUpdater listener : mStateListeners) {
+ listener.updateWallpaperVisibility(visible, displayId);
+ }
+ }
+
+ private void dispatchRotationChanged(int rotation) {
+ for (NavbarTaskbarStateUpdater listener : mStateListeners) {
+ listener.updateRotationWatcherState(rotation);
+ }
+ }
+
public CurrentSysuiState getCurrentSysuiState() {
return new CurrentSysuiState();
}
@@ -368,6 +505,8 @@ public final class NavBarHelper implements
public interface NavbarTaskbarStateUpdater {
void updateAccessibilityServicesState();
void updateAssistantAvailable(boolean available, boolean longPressHomeEnabled);
+ default void updateWallpaperVisibility(boolean visible, int displayId) {}
+ default void updateRotationWatcherState(int rotation) {}
}
/** Data class to help Taskbar/Navbar initiate state correctly when switching between the two.*/
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index f81743928e3b..941770cff014 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -164,7 +164,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executor;
-import java.util.function.Consumer;
import javax.inject.Inject;
@@ -209,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;
@@ -221,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;
@@ -350,6 +349,21 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mLongPressHomeEnabled = longPressHomeEnabled;
updateAssistantEntrypoints(available, longPressHomeEnabled);
}
+
+ @Override
+ public void updateWallpaperVisibility(boolean visible, int displayId) {
+ mNavigationBarTransitions.setWallpaperVisibility(visible);
+ }
+
+ @Override
+ public void updateRotationWatcherState(int rotation) {
+ if (mIsOnDefaultDisplay && mView != null) {
+ mView.getRotationButtonController().onRotationWatcherChanged(rotation);
+ if (mView.needsReorient(rotation)) {
+ repositionNavigationBar(rotation);
+ }
+ }
+ }
};
private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() {
@@ -543,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,
@@ -573,7 +586,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mDeadZone = deadZone;
mDeviceConfigProxy = deviceConfigProxy;
mNavigationBarTransitions = navigationBarTransitions;
- mEdgeBackGestureHandler = edgeBackGestureHandler;
mBackAnimation = backAnimation;
mHandler = mainHandler;
mUiEventLogger = uiEventLogger;
@@ -589,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);
@@ -677,13 +690,14 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
// start firing, since the latter is source of truth
parseCurrentSysuiState();
mCommandQueue.addCallback(this);
- mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
- mNavBarHelper.init();
mHomeButtonLongPressDurationMs = Optional.of(mDeviceConfigProxy.getLong(
DeviceConfig.NAMESPACE_SYSTEMUI,
HOME_BUTTON_LONG_PRESS_DURATION_MS,
/* defaultValue = */ 0
)).filter(duration -> duration != 0);
+ // This currently MUST be called after mHomeButtonLongPressDurationMs is initialized since
+ // the registration callbacks will trigger code that uses it
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
mDeviceConfigProxy.addOnPropertiesChangedListener(
DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener);
@@ -707,9 +721,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mCommandQueue.removeCallback(this);
mWindowManager.removeViewImmediate(mView.getRootView());
mNavigationModeController.removeListener(mModeChangedListener);
+ mEdgeBackGestureHandler.setStateChangeCallback(null);
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
- mNavBarHelper.destroy();
mNotificationShadeDepthController.removeListener(mDepthListener);
mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
@@ -746,8 +760,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
mView.getViewRootImpl().addSurfaceChangedCallback(mSurfaceChangedCallback);
notifyNavigationBarSurface();
- mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
-
mPipOptional.ifPresent(mView::addPipExclusionBoundsChangeListener);
mBackAnimation.ifPresent(mView::registerBackAnimation);
@@ -765,7 +777,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
if (mIsOnDefaultDisplay) {
final RotationButtonController rotationButtonController =
mView.getRotationButtonController();
- rotationButtonController.setRotationCallback(mRotationWatcher);
// Reset user rotation pref to match that of the WindowManager if starting in locked
// mode. This will automatically happen when switching from auto-rotate to locked mode.
@@ -799,9 +810,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
@Override
public void onViewDetached() {
- final RotationButtonController rotationButtonController =
- mView.getRotationButtonController();
- rotationButtonController.setRotationCallback(null);
mView.setUpdateActiveTouchRegionsCallback(null);
getBarTransitions().destroy();
mOverviewProxyService.removeCallback(mOverviewProxyListener);
@@ -1487,6 +1495,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
}
void updateAccessibilityStateFlags() {
+ mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
if (mView != null) {
int a11yFlags = mNavBarHelper.getA11yButtonState();
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
@@ -1702,12 +1711,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
return mNavBarMode == NAV_BAR_MODE_GESTURAL && mOrientationHandle != null;
}
- private final Consumer<Integer> mRotationWatcher = rotation -> {
- if (mView != null && mView.needsReorient(rotation)) {
- repositionNavigationBar(rotation);
- }
- };
-
private final UserTracker.Callback mUserChangedCallback =
new UserTracker.Callback() {
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index 153d5a651f9c..21398e23cc10 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -90,6 +90,7 @@ public class NavigationBarController implements
private final DisplayTracker mDisplayTracker;
private final DisplayManager mDisplayManager;
private final TaskbarDelegate mTaskbarDelegate;
+ private final NavBarHelper mNavBarHelper;
private int mNavMode;
@VisibleForTesting boolean mIsLargeScreen;
@@ -133,6 +134,7 @@ public class NavigationBarController implements
configurationController.addCallback(this);
mConfigChanges.applyNewConfig(mContext.getResources());
mNavMode = navigationModeController.addListener(this);
+ mNavBarHelper = navBarHelper;
mTaskbarDelegate = taskbarDelegate;
mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
navBarHelper, navigationModeController, sysUiFlagsContainer,
@@ -241,10 +243,15 @@ public class NavigationBarController implements
if (taskbarEnabled) {
Trace.beginSection("NavigationBarController#initializeTaskbarIfNecessary");
+ final int displayId = mContext.getDisplayId();
+ // Hint to NavBarHelper if we are replacing an existing bar to skip extra work
+ mNavBarHelper.setTogglingNavbarTaskbar(mNavigationBars.contains(displayId));
// Remove navigation bar when taskbar is showing
- removeNavigationBar(mContext.getDisplayId());
- mTaskbarDelegate.init(mContext.getDisplayId());
+ removeNavigationBar(displayId);
+ mTaskbarDelegate.init(displayId);
+ mNavBarHelper.setTogglingNavbarTaskbar(false);
Trace.endSection();
+
} else {
mTaskbarDelegate.destroy();
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java
index 20b50325f65f..1d73bc205dc4 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarTransitions.java
@@ -21,11 +21,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
import static com.android.systemui.util.Utils.isGesturalModeOnDefaultDisplay;
import android.graphics.Rect;
-import android.os.Handler;
-import android.os.RemoteException;
import android.util.SparseArray;
-import android.view.IWallpaperVisibilityListener;
-import android.view.IWindowManager;
import android.view.View;
import com.android.systemui.R;
@@ -36,7 +32,6 @@ import com.android.systemui.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
import java.io.PrintWriter;
-import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@@ -63,8 +58,6 @@ public final class NavigationBarTransitions extends BarTransitions implements
}
private final NavigationBarView mView;
- @org.jetbrains.annotations.NotNull
- private final IWindowManager mWindowManagerService;
private final LightBarTransitionsController mLightTransitionsController;
private final DisplayTracker mDisplayTracker;
private final boolean mAllowAutoDimWallpaperNotVisible;
@@ -76,51 +69,20 @@ public final class NavigationBarTransitions extends BarTransitions implements
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
private List<DarkIntensityListener> mDarkIntensityListeners;
- private final Handler mHandler = Handler.getMain();
-
- static final class WallpaperVisibilityListener extends IWallpaperVisibilityListener.Stub {
- private final WeakReference<NavigationBarTransitions> mSelf;
-
- WallpaperVisibilityListener(NavigationBarTransitions self) {
- mSelf = new WeakReference<>(self);
- }
-
- @Override
- public void onWallpaperVisibilityChanged(boolean newVisibility,
- int displayId) throws RemoteException {
- NavigationBarTransitions self = mSelf.get();
- if (self == null) {
- return;
- }
- self.mWallpaperVisible = newVisibility;
- self.mHandler.post(() -> self.applyLightsOut(true, false));
- }
- }
-
- private final IWallpaperVisibilityListener mWallpaperVisibilityListener;
-
@Inject
public NavigationBarTransitions(
NavigationBarView view,
- IWindowManager windowManagerService,
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
DisplayTracker displayTracker) {
super(view, R.drawable.nav_background);
mView = view;
- mWindowManagerService = windowManagerService;
mLightTransitionsController = lightBarTransitionsControllerFactory.create(this);
mDisplayTracker = displayTracker;
mAllowAutoDimWallpaperNotVisible = view.getContext().getResources()
.getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper);
mDarkIntensityListeners = new ArrayList();
- mWallpaperVisibilityListener = new WallpaperVisibilityListener(this);
- try {
- mWallpaperVisible = mWindowManagerService.registerWallpaperVisibilityListener(
- mWallpaperVisibilityListener, mDisplayTracker.getDefaultDisplayId());
- } catch (RemoteException e) {
- }
mView.addOnLayoutChangeListener(
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
View currentView = mView.getCurrentView();
@@ -142,14 +104,14 @@ public final class NavigationBarTransitions extends BarTransitions implements
@Override
public void destroy() {
- try {
- mWindowManagerService.unregisterWallpaperVisibilityListener(mWallpaperVisibilityListener,
- mDisplayTracker.getDefaultDisplayId());
- } catch (RemoteException e) {
- }
mLightTransitionsController.destroy();
}
+ void setWallpaperVisibility(boolean visible) {
+ mWallpaperVisible = visible;
+ applyLightsOut(true, false);
+ }
+
@Override
public void setAutoDim(boolean autoDim) {
// Ensure we aren't in gestural nav if we are triggering auto dim
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
index 63fb4996fbbf..5d598e8dc765 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
@@ -1093,13 +1093,10 @@ 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) {
- mRotationButtonController.registerListeners();
+ mRotationButtonController.registerListeners(false /* registerRotationWatcher */);
}
updateNavButtonIcons();
@@ -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 5b02aaf089e0..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,8 +240,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mOverviewProxyService.addCallback(this);
onNavigationModeChanged(mNavigationModeController.addListener(this));
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
- mNavBarHelper.init();
- mEdgeBackGestureHandler.onNavBarAttached();
// Initialize component callback
Display display = mDisplayManager.getDisplay(displayId);
mWindowContext = mContext.createWindowContext(display, TYPE_APPLICATION, null);
@@ -264,8 +263,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
mOverviewProxyService.removeCallback(this);
mNavigationModeController.removeListener(this);
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
- mNavBarHelper.destroy();
- 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 ce6a98c9e162..9b8605dccd09 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavBarHelperTest.java
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.ComponentName;
+import android.view.IWindowManager;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.SmallTest;
@@ -46,7 +47,9 @@ 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;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.CentralSurfaces;
@@ -101,6 +104,14 @@ public class NavBarHelperTest extends SysuiTestCase {
NavBarHelper.NavbarTaskbarStateUpdater mNavbarTaskbarStateUpdater;
@Mock
CommandQueue mCommandQueue;
+ @Mock
+ IWindowManager mWm;
+ @Mock
+ DisplayTracker mDisplayTracker;
+ @Mock
+ EdgeBackGestureHandler mEdgeBackGestureHandler;
+ @Mock
+ EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
private AccessibilityManager.AccessibilityServicesStateChangeListener
mAccessibilityServicesStateChangeListener;
@@ -114,6 +125,8 @@ public class NavBarHelperTest extends SysuiTestCase {
when(mAssistManagerLazy.get()).thenReturn(mAssistManager);
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(
@@ -122,36 +135,70 @@ public class NavBarHelperTest extends SysuiTestCase {
mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
mSystemActions, mOverviewProxyService, mAssistManagerLazy,
() -> Optional.of(mock(CentralSurfaces.class)), mock(KeyguardStateController.class),
- mNavigationModeController, mUserTracker, mDumpManager, mCommandQueue);
+ mNavigationModeController, mEdgeBackGestureHandlerFactory, mWm, mUserTracker,
+ mDisplayTracker, mDumpManager, mCommandQueue);
}
@Test
public void registerListenersInCtor() {
- verify(mAccessibilityButtonModeObserver, times(1)).addListener(mNavBarHelper);
verify(mNavigationModeController, times(1)).addListener(mNavBarHelper);
verify(mOverviewProxyService, times(1)).addCallback(mNavBarHelper);
+ verify(mCommandQueue, times(1)).addCallback(any());
}
@Test
- public void registerAssistantContentObserver() {
- mNavBarHelper.init();
+ public void testSetupBarsRegistersListeners() throws Exception {
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
+ verify(mAccessibilityButtonModeObserver, times(1)).addListener(mNavBarHelper);
+ verify(mAccessibilityButtonTargetObserver, times(1)).addListener(mNavBarHelper);
+ verify(mAccessibilityManager, times(1)).addAccessibilityServicesStateChangeListener(
+ mNavBarHelper);
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
+ public void testCleanupBarsUnregistersListeners() throws Exception {
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
+ mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
+ verify(mAccessibilityButtonModeObserver, times(1)).removeListener(mNavBarHelper);
+ verify(mAccessibilityButtonTargetObserver, times(1)).removeListener(mNavBarHelper);
+ verify(mAccessibilityManager, times(1)).removeAccessibilityServicesStateChangeListener(
+ mNavBarHelper);
+ verify(mWm, times(1)).removeRotationWatcher(any());
+ verify(mWm, times(1)).unregisterWallpaperVisibilityListener(any(), anyInt());
+ verify(mEdgeBackGestureHandler, times(1)).onNavBarDetached();
+ }
+
+ @Test
+ public void replacingBarsHint() {
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
+ mNavBarHelper.setTogglingNavbarTaskbar(true);
+ mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
+ mNavBarHelper.setTogglingNavbarTaskbar(false);
+ // Use any state in cleanup to verify it was not called
+ verify(mAccessibilityButtonModeObserver, times(0)).removeListener(mNavBarHelper);
}
@Test
public void callbacksFiredWhenRegistering() {
- mNavBarHelper.init();
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
verify(mNavbarTaskbarStateUpdater, times(1))
.updateAccessibilityServicesState();
verify(mNavbarTaskbarStateUpdater, times(1))
.updateAssistantAvailable(anyBoolean(), anyBoolean());
+ verify(mNavbarTaskbarStateUpdater, times(1))
+ .updateRotationWatcherState(anyInt());
+ verify(mNavbarTaskbarStateUpdater, times(1))
+ .updateWallpaperVisibility(anyBoolean(), anyInt());
}
@Test
public void assistantCallbacksFiredAfterConnecting() {
- mNavBarHelper.init();
// 1st set of callbacks get called when registering
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -172,7 +219,6 @@ public class NavBarHelperTest extends SysuiTestCase {
@Test
public void a11yCallbacksFiredAfterModeChange() {
- mNavBarHelper.init();
// 1st set of callbacks get called when registering
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -185,7 +231,6 @@ public class NavBarHelperTest extends SysuiTestCase {
@Test
public void assistantCallbacksFiredAfterNavModeChange() {
- mNavBarHelper.init();
// 1st set of callbacks get called when registering
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -198,7 +243,6 @@ public class NavBarHelperTest extends SysuiTestCase {
@Test
public void removeListenerNoCallbacksFired() {
- mNavBarHelper.init();
// 1st set of callbacks get called when registering
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
@@ -220,7 +264,7 @@ public class NavBarHelperTest extends SysuiTestCase {
when(mAccessibilityManager.getAccessibilityShortcutTargets(
AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
- mNavBarHelper.init();
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
assertThat(mNavBarHelper.getA11yButtonState()).isEqualTo(
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
@@ -230,13 +274,15 @@ public class NavBarHelperTest extends SysuiTestCase {
public void initAccessibilityStateWithFloatingMenuModeAndTargets_disableClickableState() {
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU);
- mNavBarHelper.init();
+
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
assertThat(mNavBarHelper.getA11yButtonState()).isEqualTo(/* disable_clickable_state */ 0);
}
@Test
public void onA11yServicesStateChangedWithMultipleServices_a11yButtonClickableState() {
+ mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
@@ -250,14 +296,7 @@ public class NavBarHelperTest extends SysuiTestCase {
}
@Test
- public void registerCommandQueueCallbacks() {
- mNavBarHelper.init();
- verify(mCommandQueue, times(1)).addCallback(any());
- }
-
- @Test
public void saveMostRecentSysuiState() {
- mNavBarHelper.init();
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
@@ -274,7 +313,6 @@ public class NavBarHelperTest extends SysuiTestCase {
@Test
public void ignoreNonNavbarSysuiState() {
- mNavBarHelper.init();
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
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 764ddc49d110..f062ec732b21 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -58,6 +58,7 @@ import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.Display;
import android.view.DisplayInfo;
+import android.view.IWindowManager;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewRootImpl;
@@ -87,6 +88,7 @@ import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.recents.Recents;
+import com.android.systemui.settings.DisplayTracker;
import com.android.systemui.settings.FakeDisplayTracker;
import com.android.systemui.settings.UserContextProvider;
import com.android.systemui.settings.UserTracker;
@@ -172,8 +174,6 @@ public class NavigationBarTest extends SysuiTestCase {
private UiEventLogger mUiEventLogger;
@Mock
private ViewTreeObserver mViewTreeObserver;
- @Mock
- EdgeBackGestureHandler mEdgeBackGestureHandler;
NavBarHelper mNavBarHelper;
@Mock
private LightBarController mLightBarController;
@@ -205,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 =
@@ -234,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.
@@ -250,7 +255,9 @@ public class NavigationBarTest extends SysuiTestCase {
mSystemActions, mOverviewProxyService,
() -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces),
mKeyguardStateController, mock(NavigationModeController.class),
- mock(UserTracker.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);
});
@@ -492,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/NavigationBarTransitionsTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java
index 5270737b7f3e..54aec3014f95 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTransitionsTest.java
@@ -27,7 +27,6 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
-import android.view.IWindowManager;
import androidx.test.filters.SmallTest;
@@ -60,8 +59,6 @@ public class NavigationBarTransitionsTest extends SysuiTestCase {
EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
@Mock
EdgeBackGestureHandler mEdgeBackGestureHandler;
- @Mock
- IWindowManager mIWindowManager;
private NavigationBarTransitions mTransitions;
private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext);
@@ -88,7 +85,7 @@ public class NavigationBarTransitionsTest extends SysuiTestCase {
when(navBar.getCurrentView()).thenReturn(navBar);
when(navBar.findViewById(anyInt())).thenReturn(navBar);
mTransitions = new NavigationBarTransitions(
- navBar, mIWindowManager, mLightBarTransitionsFactory, mDisplayTracker);
+ navBar, mLightBarTransitionsFactory, mDisplayTracker);
}
@Test
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)