Merge changes from topic "nav_bar_helper_1" into tm-qpr-dev am: 2b2deec8e0
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21780662 Change-Id: I77dbfaf59da8ab79837277f41dfeb48e8a3cb178 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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.*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -38,8 +38,6 @@ class TaskbarDelegateTest : SysuiTestCase() {
|
||||
private lateinit var mTaskStackChangeListeners: TaskStackChangeListeners
|
||||
private lateinit var mTaskbarDelegate: TaskbarDelegate
|
||||
@Mock
|
||||
lateinit var mEdgeBackGestureHandlerFactory : EdgeBackGestureHandler.Factory
|
||||
@Mock
|
||||
lateinit var mEdgeBackGestureHandler : EdgeBackGestureHandler
|
||||
@Mock
|
||||
lateinit var mLightBarControllerFactory : LightBarTransitionsController.Factory
|
||||
@@ -73,13 +71,13 @@ class TaskbarDelegateTest : SysuiTestCase() {
|
||||
@Before
|
||||
fun setup() {
|
||||
MockitoAnnotations.initMocks(this)
|
||||
`when`(mEdgeBackGestureHandlerFactory.create(context)).thenReturn(mEdgeBackGestureHandler)
|
||||
`when`(mNavBarHelper.edgeBackGestureHandler).thenReturn(mEdgeBackGestureHandler)
|
||||
`when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController)
|
||||
`when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState)
|
||||
`when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState)
|
||||
mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance()
|
||||
mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory,
|
||||
mLightBarControllerFactory, mStatusBarKeyguardViewManager)
|
||||
mTaskbarDelegate = TaskbarDelegate(context, mLightBarControllerFactory,
|
||||
mStatusBarKeyguardViewManager)
|
||||
mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper,
|
||||
mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController,
|
||||
mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners)
|
||||
|
||||
Reference in New Issue
Block a user