Merge changes from topic "nav_bar_helper_1" into tm-qpr-dev

* changes:
  4/  Keep EdgeBackGestureHandler state across nav/taskbar changes
  3/ Move wallpaper visibility listener to nav bar helper
  2/ Add path for feeding rotation watcher signals to RotationButtonController
  1/ Initialize assistant state change listeners once with the nav bar helper
This commit is contained in:
Winson Chung
2023-03-11 17:33:18 +00:00
committed by Android (Google) Code Review
12 changed files with 331 additions and 172 deletions

View File

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

View File

@@ -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);
}
public void destroy() {
mContentResolver.unregisterContentObserver(mAssistContentObserver);
mCommandQueue.removeCallback(this);
// 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();
}
/**
* 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);
// 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.*/

View File

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

View File

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

View File

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

View File

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

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

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

@@ -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);
@@ -249,15 +295,8 @@ public class NavBarHelperTest extends SysuiTestCase {
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
}
@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();

View File

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

View File

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

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)