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:
@@ -96,9 +96,9 @@ public class RotationButtonController {
|
|||||||
private boolean mHoveringRotationSuggestion;
|
private boolean mHoveringRotationSuggestion;
|
||||||
private final AccessibilityManager mAccessibilityManager;
|
private final AccessibilityManager mAccessibilityManager;
|
||||||
private final TaskStackListenerImpl mTaskStackListener;
|
private final TaskStackListenerImpl mTaskStackListener;
|
||||||
private Consumer<Integer> mRotWatcherListener;
|
|
||||||
|
|
||||||
private boolean mListenersRegistered = false;
|
private boolean mListenersRegistered = false;
|
||||||
|
private boolean mRotationWatcherRegistered = false;
|
||||||
private boolean mIsNavigationBarShowing;
|
private boolean mIsNavigationBarShowing;
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
private @WindowInsetsController.Behavior
|
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
|
// We need this to be scheduled as early as possible to beat the redrawing of
|
||||||
// window in response to the orientation change.
|
// window in response to the orientation change.
|
||||||
mMainThreadHandler.postAtFrontOfQueue(() -> {
|
mMainThreadHandler.postAtFrontOfQueue(() -> {
|
||||||
// If the screen rotation changes while locked, potentially update lock to flow with
|
onRotationWatcherChanged(rotation);
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -206,8 +191,11 @@ public class RotationButtonController {
|
|||||||
return mContext;
|
return mContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called during Taskbar initialization.
|
||||||
|
*/
|
||||||
public void init() {
|
public void init() {
|
||||||
registerListeners();
|
registerListeners(true /* registerRotationWatcher */);
|
||||||
if (mContext.getDisplay().getDisplayId() != DEFAULT_DISPLAY) {
|
if (mContext.getDisplay().getDisplayId() != DEFAULT_DISPLAY) {
|
||||||
// Currently there is no accelerometer sensor on non-default display, disable fixed
|
// Currently there is no accelerometer sensor on non-default display, disable fixed
|
||||||
// rotation for non-default display
|
// rotation for non-default display
|
||||||
@@ -215,11 +203,14 @@ public class RotationButtonController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called during Taskbar uninitialization.
|
||||||
|
*/
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
unregisterListeners();
|
unregisterListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerListeners() {
|
public void registerListeners(boolean registerRotationWatcher) {
|
||||||
if (mListenersRegistered || getContext().getPackageManager().hasSystemFeature(FEATURE_PC)) {
|
if (mListenersRegistered || getContext().getPackageManager().hasSystemFeature(FEATURE_PC)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -229,16 +220,19 @@ public class RotationButtonController {
|
|||||||
updateDockedState(mContext.registerReceiver(mDockedReceiver,
|
updateDockedState(mContext.registerReceiver(mDockedReceiver,
|
||||||
new IntentFilter(Intent.ACTION_DOCK_EVENT)));
|
new IntentFilter(Intent.ACTION_DOCK_EVENT)));
|
||||||
|
|
||||||
|
if (registerRotationWatcher) {
|
||||||
try {
|
try {
|
||||||
WindowManagerGlobal.getWindowManagerService()
|
WindowManagerGlobal.getWindowManagerService()
|
||||||
.watchRotation(mRotationWatcher, DEFAULT_DISPLAY);
|
.watchRotation(mRotationWatcher, DEFAULT_DISPLAY);
|
||||||
|
mRotationWatcherRegistered = true;
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
mListenersRegistered = false;
|
mListenersRegistered = false;
|
||||||
Log.w(TAG, "RegisterListeners for the display failed");
|
Log.w(TAG, "RegisterListeners for the display failed", e);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "RegisterListeners caught a RemoteException", e);
|
Log.e(TAG, "RegisterListeners caught a RemoteException", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener);
|
TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener);
|
||||||
}
|
}
|
||||||
@@ -251,18 +245,17 @@ public class RotationButtonController {
|
|||||||
mListenersRegistered = false;
|
mListenersRegistered = false;
|
||||||
|
|
||||||
mContext.unregisterReceiver(mDockedReceiver);
|
mContext.unregisterReceiver(mDockedReceiver);
|
||||||
|
if (mRotationWatcherRegistered) {
|
||||||
try {
|
try {
|
||||||
WindowManagerGlobal.getWindowManagerService().removeRotationWatcher(mRotationWatcher);
|
WindowManagerGlobal.getWindowManagerService().removeRotationWatcher(
|
||||||
|
mRotationWatcher);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "UnregisterListeners caught a RemoteException", e);
|
Log.e(TAG, "UnregisterListeners caught a RemoteException", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRotationCallback(Consumer<Integer> watcher) {
|
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
|
||||||
mRotWatcherListener = watcher;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRotationLockedAtAngle(int rotationSuggestion) {
|
public void setRotationLockedAtAngle(int 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) {
|
public void onDisable2FlagChanged(int state2) {
|
||||||
final boolean rotateSuggestionsDisabled = hasDisable2RotateSuggestionFlag(state2);
|
final boolean rotateSuggestionsDisabled = hasDisable2RotateSuggestionFlag(state2);
|
||||||
if (rotateSuggestionsDisabled) onRotationSuggestionsDisabled();
|
if (rotateSuggestionsDisabled) onRotationSuggestionsDisabled();
|
||||||
|
|||||||
@@ -41,11 +41,17 @@ import android.net.Uri;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
import android.os.RemoteException;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.provider.Settings.Secure;
|
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.View;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
|
import android.view.WindowManagerGlobal;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@@ -57,7 +63,9 @@ import com.android.systemui.accessibility.SystemActions;
|
|||||||
import com.android.systemui.assist.AssistManager;
|
import com.android.systemui.assist.AssistManager;
|
||||||
import com.android.systemui.dagger.SysUISingleton;
|
import com.android.systemui.dagger.SysUISingleton;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
|
import com.android.systemui.settings.DisplayTracker;
|
||||||
import com.android.systemui.settings.UserTracker;
|
import com.android.systemui.settings.UserTracker;
|
||||||
import com.android.systemui.shared.system.QuickStepContract;
|
import com.android.systemui.shared.system.QuickStepContract;
|
||||||
import com.android.systemui.statusbar.CommandQueue;
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
@@ -90,6 +98,9 @@ public final class NavBarHelper implements
|
|||||||
AccessibilityButtonTargetsObserver.TargetsChangedListener,
|
AccessibilityButtonTargetsObserver.TargetsChangedListener,
|
||||||
OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener,
|
OverviewProxyService.OverviewProxyListener, NavigationModeController.ModeChangedListener,
|
||||||
Dumpable, CommandQueue.Callbacks {
|
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 AccessibilityManager mAccessibilityManager;
|
||||||
private final Lazy<AssistManager> mAssistManagerLazy;
|
private final Lazy<AssistManager> mAssistManagerLazy;
|
||||||
private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
|
private final Lazy<Optional<CentralSurfaces>> mCentralSurfacesOptionalLazy;
|
||||||
@@ -98,28 +109,60 @@ public final class NavBarHelper implements
|
|||||||
private final SystemActions mSystemActions;
|
private final SystemActions mSystemActions;
|
||||||
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
|
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
|
||||||
private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
|
private final AccessibilityButtonTargetsObserver mAccessibilityButtonTargetsObserver;
|
||||||
private final List<NavbarTaskbarStateUpdater> mA11yEventListeners = new ArrayList<>();
|
private final List<NavbarTaskbarStateUpdater> mStateListeners = new ArrayList<>();
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final CommandQueue mCommandQueue;
|
private final CommandQueue mCommandQueue;
|
||||||
private final ContentResolver mContentResolver;
|
private final ContentResolver mContentResolver;
|
||||||
|
private final EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
|
private final IWindowManager mWm;
|
||||||
|
private final int mDefaultDisplayId;
|
||||||
private boolean mAssistantAvailable;
|
private boolean mAssistantAvailable;
|
||||||
private boolean mLongPressHomeEnabled;
|
private boolean mLongPressHomeEnabled;
|
||||||
private boolean mAssistantTouchGestureEnabled;
|
private boolean mAssistantTouchGestureEnabled;
|
||||||
private int mNavBarMode;
|
private int mNavBarMode;
|
||||||
private int mA11yButtonState;
|
private int mA11yButtonState;
|
||||||
|
private int mRotationWatcherRotation;
|
||||||
|
private boolean mTogglingNavbarTaskbar;
|
||||||
|
private boolean mWallpaperVisible;
|
||||||
|
|
||||||
// Attributes used in NavBarHelper.CurrentSysuiState
|
// Attributes used in NavBarHelper.CurrentSysuiState
|
||||||
private int mWindowStateDisplayId;
|
private int mWindowStateDisplayId;
|
||||||
private @WindowVisibleState int mWindowState;
|
private @WindowVisibleState int mWindowState;
|
||||||
|
|
||||||
private final ContentObserver mAssistContentObserver = new ContentObserver(
|
// Listens for changes to the assistant
|
||||||
new Handler(Looper.getMainLooper())) {
|
private final ContentObserver mAssistContentObserver = new ContentObserver(mHandler) {
|
||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange, Uri uri) {
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
updateAssistantAvailability();
|
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
|
* @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
|
* 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,
|
Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy,
|
||||||
KeyguardStateController keyguardStateController,
|
KeyguardStateController keyguardStateController,
|
||||||
NavigationModeController navigationModeController,
|
NavigationModeController navigationModeController,
|
||||||
|
EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory,
|
||||||
|
IWindowManager wm,
|
||||||
UserTracker userTracker,
|
UserTracker userTracker,
|
||||||
|
DisplayTracker displayTracker,
|
||||||
DumpManager dumpManager,
|
DumpManager dumpManager,
|
||||||
CommandQueue commandQueue) {
|
CommandQueue commandQueue) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
@@ -147,18 +193,36 @@ public final class NavBarHelper implements
|
|||||||
mKeyguardStateController = keyguardStateController;
|
mKeyguardStateController = keyguardStateController;
|
||||||
mUserTracker = userTracker;
|
mUserTracker = userTracker;
|
||||||
mSystemActions = systemActions;
|
mSystemActions = systemActions;
|
||||||
accessibilityManager.addAccessibilityServicesStateChangeListener(this);
|
|
||||||
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
|
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
|
||||||
mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver;
|
mAccessibilityButtonTargetsObserver = accessibilityButtonTargetsObserver;
|
||||||
|
mWm = wm;
|
||||||
|
mDefaultDisplayId = displayTracker.getDefaultDisplayId();
|
||||||
|
mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context);
|
||||||
|
|
||||||
mAccessibilityButtonModeObserver.addListener(this);
|
|
||||||
mAccessibilityButtonTargetsObserver.addListener(this);
|
|
||||||
mNavBarMode = navigationModeController.addListener(this);
|
mNavBarMode = navigationModeController.addListener(this);
|
||||||
|
mCommandQueue.addCallback(this);
|
||||||
overviewProxyService.addCallback(this);
|
overviewProxyService.addCallback(this);
|
||||||
dumpManager.registerDumpable(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(
|
mContentResolver.registerContentObserver(
|
||||||
Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),
|
Settings.Secure.getUriFor(Settings.Secure.ASSISTANT),
|
||||||
false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL);
|
false /* notifyForDescendants */, mAssistContentObserver, UserHandle.USER_ALL);
|
||||||
@@ -168,59 +232,114 @@ public final class NavBarHelper implements
|
|||||||
mContentResolver.registerContentObserver(
|
mContentResolver.registerContentObserver(
|
||||||
Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),
|
Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),
|
||||||
false, mAssistContentObserver, UserHandle.USER_ALL);
|
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() {
|
// Setup wallpaper visibility listener
|
||||||
mContentResolver.unregisterContentObserver(mAssistContentObserver);
|
try {
|
||||||
mCommandQueue.removeCallback(this);
|
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
|
* @param listener Will immediately get callbacks based on current state
|
||||||
*/
|
*/
|
||||||
public void registerNavTaskStateUpdater(NavbarTaskbarStateUpdater listener) {
|
public void registerNavTaskStateUpdater(NavbarTaskbarStateUpdater listener) {
|
||||||
mA11yEventListeners.add(listener);
|
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.updateAccessibilityServicesState();
|
||||||
listener.updateAssistantAvailable(mAssistantAvailable, mLongPressHomeEnabled);
|
listener.updateAssistantAvailable(mAssistantAvailable, mLongPressHomeEnabled);
|
||||||
}
|
}
|
||||||
|
listener.updateWallpaperVisibility(mWallpaperVisible, mDefaultDisplayId);
|
||||||
|
listener.updateRotationWatcherState(mRotationWatcherRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a previously registered listener.
|
||||||
|
*/
|
||||||
public void removeNavTaskStateUpdater(NavbarTaskbarStateUpdater listener) {
|
public void removeNavTaskStateUpdater(NavbarTaskbarStateUpdater listener) {
|
||||||
mA11yEventListeners.remove(listener);
|
mStateListeners.remove(listener);
|
||||||
|
if (!mTogglingNavbarTaskbar && mStateListeners.isEmpty()) {
|
||||||
|
cleanupAfterLastBar();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dispatchA11yEventUpdate() {
|
private void dispatchA11yEventUpdate() {
|
||||||
for (NavbarTaskbarStateUpdater listener : mA11yEventListeners) {
|
for (NavbarTaskbarStateUpdater listener : mStateListeners) {
|
||||||
listener.updateAccessibilityServicesState();
|
listener.updateAccessibilityServicesState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dispatchAssistantEventUpdate(boolean assistantAvailable,
|
private void dispatchAssistantEventUpdate(boolean assistantAvailable,
|
||||||
boolean longPressHomeEnabled) {
|
boolean longPressHomeEnabled) {
|
||||||
for (NavbarTaskbarStateUpdater listener : mA11yEventListeners) {
|
for (NavbarTaskbarStateUpdater listener : mStateListeners) {
|
||||||
listener.updateAssistantAvailable(assistantAvailable, longPressHomeEnabled);
|
listener.updateAssistantAvailable(assistantAvailable, longPressHomeEnabled);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAccessibilityServicesStateChanged(AccessibilityManager manager) {
|
public void onAccessibilityServicesStateChanged(AccessibilityManager manager) {
|
||||||
dispatchA11yEventUpdate();
|
|
||||||
updateA11yState();
|
updateA11yState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAccessibilityButtonModeChanged(int mode) {
|
public void onAccessibilityButtonModeChanged(int mode) {
|
||||||
updateA11yState();
|
updateA11yState();
|
||||||
dispatchA11yEventUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAccessibilityButtonTargetsChanged(String targets) {
|
public void onAccessibilityButtonTargetsChanged(String targets) {
|
||||||
updateA11yState();
|
updateA11yState();
|
||||||
dispatchA11yEventUpdate();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -262,6 +381,8 @@ public final class NavBarHelper implements
|
|||||||
updateSystemAction(clickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON);
|
updateSystemAction(clickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON);
|
||||||
updateSystemAction(longClickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER);
|
updateSystemAction(longClickable, SYSTEM_ACTION_ID_ACCESSIBILITY_BUTTON_CHOOSER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dispatchA11yEventUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -319,6 +440,10 @@ public final class NavBarHelper implements
|
|||||||
return mLongPressHomeEnabled;
|
return mLongPressHomeEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EdgeBackGestureHandler getEdgeBackGestureHandler() {
|
||||||
|
return mEdgeBackGestureHandler;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startAssistant(Bundle bundle) {
|
public void startAssistant(Bundle bundle) {
|
||||||
mAssistManagerLazy.get().startAssist(bundle);
|
mAssistManagerLazy.get().startAssist(bundle);
|
||||||
@@ -357,6 +482,18 @@ public final class NavBarHelper implements
|
|||||||
mWindowState = state;
|
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() {
|
public CurrentSysuiState getCurrentSysuiState() {
|
||||||
return new CurrentSysuiState();
|
return new CurrentSysuiState();
|
||||||
}
|
}
|
||||||
@@ -368,6 +505,8 @@ public final class NavBarHelper implements
|
|||||||
public interface NavbarTaskbarStateUpdater {
|
public interface NavbarTaskbarStateUpdater {
|
||||||
void updateAccessibilityServicesState();
|
void updateAccessibilityServicesState();
|
||||||
void updateAssistantAvailable(boolean available, boolean longPressHomeEnabled);
|
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.*/
|
/** 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.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
@@ -209,7 +208,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
private final Optional<Recents> mRecentsOptional;
|
private final Optional<Recents> mRecentsOptional;
|
||||||
private final DeviceConfigProxy mDeviceConfigProxy;
|
private final DeviceConfigProxy mDeviceConfigProxy;
|
||||||
private final NavigationBarTransitions mNavigationBarTransitions;
|
private final NavigationBarTransitions mNavigationBarTransitions;
|
||||||
private final EdgeBackGestureHandler mEdgeBackGestureHandler;
|
|
||||||
private final Optional<BackAnimation> mBackAnimation;
|
private final Optional<BackAnimation> mBackAnimation;
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
private final UiEventLogger mUiEventLogger;
|
private final UiEventLogger mUiEventLogger;
|
||||||
@@ -221,6 +219,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
private final DisplayTracker mDisplayTracker;
|
private final DisplayTracker mDisplayTracker;
|
||||||
private final RegionSamplingHelper mRegionSamplingHelper;
|
private final RegionSamplingHelper mRegionSamplingHelper;
|
||||||
private final int mNavColorSampleMargin;
|
private final int mNavColorSampleMargin;
|
||||||
|
private EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
private NavigationBarFrame mFrame;
|
private NavigationBarFrame mFrame;
|
||||||
|
|
||||||
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
|
private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
|
||||||
@@ -350,6 +349,21 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mLongPressHomeEnabled = longPressHomeEnabled;
|
mLongPressHomeEnabled = longPressHomeEnabled;
|
||||||
updateAssistantEntrypoints(available, 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() {
|
private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() {
|
||||||
@@ -543,7 +557,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
DeadZone deadZone,
|
DeadZone deadZone,
|
||||||
DeviceConfigProxy deviceConfigProxy,
|
DeviceConfigProxy deviceConfigProxy,
|
||||||
NavigationBarTransitions navigationBarTransitions,
|
NavigationBarTransitions navigationBarTransitions,
|
||||||
EdgeBackGestureHandler edgeBackGestureHandler,
|
|
||||||
Optional<BackAnimation> backAnimation,
|
Optional<BackAnimation> backAnimation,
|
||||||
UserContextProvider userContextProvider,
|
UserContextProvider userContextProvider,
|
||||||
WakefulnessLifecycle wakefulnessLifecycle,
|
WakefulnessLifecycle wakefulnessLifecycle,
|
||||||
@@ -573,7 +586,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mDeadZone = deadZone;
|
mDeadZone = deadZone;
|
||||||
mDeviceConfigProxy = deviceConfigProxy;
|
mDeviceConfigProxy = deviceConfigProxy;
|
||||||
mNavigationBarTransitions = navigationBarTransitions;
|
mNavigationBarTransitions = navigationBarTransitions;
|
||||||
mEdgeBackGestureHandler = edgeBackGestureHandler;
|
|
||||||
mBackAnimation = backAnimation;
|
mBackAnimation = backAnimation;
|
||||||
mHandler = mainHandler;
|
mHandler = mainHandler;
|
||||||
mUiEventLogger = uiEventLogger;
|
mUiEventLogger = uiEventLogger;
|
||||||
@@ -589,6 +601,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mWakefulnessLifecycle = wakefulnessLifecycle;
|
mWakefulnessLifecycle = wakefulnessLifecycle;
|
||||||
mTaskStackChangeListeners = taskStackChangeListeners;
|
mTaskStackChangeListeners = taskStackChangeListeners;
|
||||||
mDisplayTracker = displayTracker;
|
mDisplayTracker = displayTracker;
|
||||||
|
mEdgeBackGestureHandler = navBarHelper.getEdgeBackGestureHandler();
|
||||||
|
|
||||||
mNavColorSampleMargin = getResources()
|
mNavColorSampleMargin = getResources()
|
||||||
.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
|
.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
|
// start firing, since the latter is source of truth
|
||||||
parseCurrentSysuiState();
|
parseCurrentSysuiState();
|
||||||
mCommandQueue.addCallback(this);
|
mCommandQueue.addCallback(this);
|
||||||
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
|
|
||||||
mNavBarHelper.init();
|
|
||||||
mHomeButtonLongPressDurationMs = Optional.of(mDeviceConfigProxy.getLong(
|
mHomeButtonLongPressDurationMs = Optional.of(mDeviceConfigProxy.getLong(
|
||||||
DeviceConfig.NAMESPACE_SYSTEMUI,
|
DeviceConfig.NAMESPACE_SYSTEMUI,
|
||||||
HOME_BUTTON_LONG_PRESS_DURATION_MS,
|
HOME_BUTTON_LONG_PRESS_DURATION_MS,
|
||||||
/* defaultValue = */ 0
|
/* defaultValue = */ 0
|
||||||
)).filter(duration -> duration != 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(
|
mDeviceConfigProxy.addOnPropertiesChangedListener(
|
||||||
DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener);
|
DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener);
|
||||||
|
|
||||||
@@ -707,9 +721,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mCommandQueue.removeCallback(this);
|
mCommandQueue.removeCallback(this);
|
||||||
mWindowManager.removeViewImmediate(mView.getRootView());
|
mWindowManager.removeViewImmediate(mView.getRootView());
|
||||||
mNavigationModeController.removeListener(mModeChangedListener);
|
mNavigationModeController.removeListener(mModeChangedListener);
|
||||||
|
mEdgeBackGestureHandler.setStateChangeCallback(null);
|
||||||
|
|
||||||
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
mNavBarHelper.destroy();
|
|
||||||
mNotificationShadeDepthController.removeListener(mDepthListener);
|
mNotificationShadeDepthController.removeListener(mDepthListener);
|
||||||
|
|
||||||
mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
|
mDeviceConfigProxy.removeOnPropertiesChangedListener(mOnPropertiesChangedListener);
|
||||||
@@ -746,8 +760,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
mView.getViewRootImpl().addSurfaceChangedCallback(mSurfaceChangedCallback);
|
mView.getViewRootImpl().addSurfaceChangedCallback(mSurfaceChangedCallback);
|
||||||
notifyNavigationBarSurface();
|
notifyNavigationBarSurface();
|
||||||
|
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
|
||||||
|
|
||||||
mPipOptional.ifPresent(mView::addPipExclusionBoundsChangeListener);
|
mPipOptional.ifPresent(mView::addPipExclusionBoundsChangeListener);
|
||||||
mBackAnimation.ifPresent(mView::registerBackAnimation);
|
mBackAnimation.ifPresent(mView::registerBackAnimation);
|
||||||
|
|
||||||
@@ -765,7 +777,6 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
if (mIsOnDefaultDisplay) {
|
if (mIsOnDefaultDisplay) {
|
||||||
final RotationButtonController rotationButtonController =
|
final RotationButtonController rotationButtonController =
|
||||||
mView.getRotationButtonController();
|
mView.getRotationButtonController();
|
||||||
rotationButtonController.setRotationCallback(mRotationWatcher);
|
|
||||||
|
|
||||||
// Reset user rotation pref to match that of the WindowManager if starting in locked
|
// 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.
|
// 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
|
@Override
|
||||||
public void onViewDetached() {
|
public void onViewDetached() {
|
||||||
final RotationButtonController rotationButtonController =
|
|
||||||
mView.getRotationButtonController();
|
|
||||||
rotationButtonController.setRotationCallback(null);
|
|
||||||
mView.setUpdateActiveTouchRegionsCallback(null);
|
mView.setUpdateActiveTouchRegionsCallback(null);
|
||||||
getBarTransitions().destroy();
|
getBarTransitions().destroy();
|
||||||
mOverviewProxyService.removeCallback(mOverviewProxyListener);
|
mOverviewProxyService.removeCallback(mOverviewProxyListener);
|
||||||
@@ -1487,6 +1495,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateAccessibilityStateFlags() {
|
void updateAccessibilityStateFlags() {
|
||||||
|
mLongPressHomeEnabled = mNavBarHelper.getLongPressHomeEnabled();
|
||||||
if (mView != null) {
|
if (mView != null) {
|
||||||
int a11yFlags = mNavBarHelper.getA11yButtonState();
|
int a11yFlags = mNavBarHelper.getA11yButtonState();
|
||||||
boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
|
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;
|
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 =
|
private final UserTracker.Callback mUserChangedCallback =
|
||||||
new UserTracker.Callback() {
|
new UserTracker.Callback() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ public class NavigationBarController implements
|
|||||||
private final DisplayTracker mDisplayTracker;
|
private final DisplayTracker mDisplayTracker;
|
||||||
private final DisplayManager mDisplayManager;
|
private final DisplayManager mDisplayManager;
|
||||||
private final TaskbarDelegate mTaskbarDelegate;
|
private final TaskbarDelegate mTaskbarDelegate;
|
||||||
|
private final NavBarHelper mNavBarHelper;
|
||||||
private int mNavMode;
|
private int mNavMode;
|
||||||
@VisibleForTesting boolean mIsLargeScreen;
|
@VisibleForTesting boolean mIsLargeScreen;
|
||||||
|
|
||||||
@@ -133,6 +134,7 @@ public class NavigationBarController implements
|
|||||||
configurationController.addCallback(this);
|
configurationController.addCallback(this);
|
||||||
mConfigChanges.applyNewConfig(mContext.getResources());
|
mConfigChanges.applyNewConfig(mContext.getResources());
|
||||||
mNavMode = navigationModeController.addListener(this);
|
mNavMode = navigationModeController.addListener(this);
|
||||||
|
mNavBarHelper = navBarHelper;
|
||||||
mTaskbarDelegate = taskbarDelegate;
|
mTaskbarDelegate = taskbarDelegate;
|
||||||
mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
|
mTaskbarDelegate.setDependencies(commandQueue, overviewProxyService,
|
||||||
navBarHelper, navigationModeController, sysUiFlagsContainer,
|
navBarHelper, navigationModeController, sysUiFlagsContainer,
|
||||||
@@ -241,10 +243,15 @@ public class NavigationBarController implements
|
|||||||
|
|
||||||
if (taskbarEnabled) {
|
if (taskbarEnabled) {
|
||||||
Trace.beginSection("NavigationBarController#initializeTaskbarIfNecessary");
|
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
|
// Remove navigation bar when taskbar is showing
|
||||||
removeNavigationBar(mContext.getDisplayId());
|
removeNavigationBar(displayId);
|
||||||
mTaskbarDelegate.init(mContext.getDisplayId());
|
mTaskbarDelegate.init(displayId);
|
||||||
|
mNavBarHelper.setTogglingNavbarTaskbar(false);
|
||||||
Trace.endSection();
|
Trace.endSection();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
mTaskbarDelegate.destroy();
|
mTaskbarDelegate.destroy();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,11 +21,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
|
|||||||
import static com.android.systemui.util.Utils.isGesturalModeOnDefaultDisplay;
|
import static com.android.systemui.util.Utils.isGesturalModeOnDefaultDisplay;
|
||||||
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.IWallpaperVisibilityListener;
|
|
||||||
import android.view.IWindowManager;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
@@ -36,7 +32,6 @@ import com.android.systemui.statusbar.phone.BarTransitions;
|
|||||||
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
|
import com.android.systemui.statusbar.phone.LightBarTransitionsController;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.lang.ref.WeakReference;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -63,8 +58,6 @@ public final class NavigationBarTransitions extends BarTransitions implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final NavigationBarView mView;
|
private final NavigationBarView mView;
|
||||||
@org.jetbrains.annotations.NotNull
|
|
||||||
private final IWindowManager mWindowManagerService;
|
|
||||||
private final LightBarTransitionsController mLightTransitionsController;
|
private final LightBarTransitionsController mLightTransitionsController;
|
||||||
private final DisplayTracker mDisplayTracker;
|
private final DisplayTracker mDisplayTracker;
|
||||||
private final boolean mAllowAutoDimWallpaperNotVisible;
|
private final boolean mAllowAutoDimWallpaperNotVisible;
|
||||||
@@ -76,51 +69,20 @@ public final class NavigationBarTransitions extends BarTransitions implements
|
|||||||
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
|
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
|
||||||
private List<DarkIntensityListener> mDarkIntensityListeners;
|
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
|
@Inject
|
||||||
public NavigationBarTransitions(
|
public NavigationBarTransitions(
|
||||||
NavigationBarView view,
|
NavigationBarView view,
|
||||||
IWindowManager windowManagerService,
|
|
||||||
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
|
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
|
||||||
DisplayTracker displayTracker) {
|
DisplayTracker displayTracker) {
|
||||||
super(view, R.drawable.nav_background);
|
super(view, R.drawable.nav_background);
|
||||||
|
|
||||||
mView = view;
|
mView = view;
|
||||||
mWindowManagerService = windowManagerService;
|
|
||||||
mLightTransitionsController = lightBarTransitionsControllerFactory.create(this);
|
mLightTransitionsController = lightBarTransitionsControllerFactory.create(this);
|
||||||
mDisplayTracker = displayTracker;
|
mDisplayTracker = displayTracker;
|
||||||
mAllowAutoDimWallpaperNotVisible = view.getContext().getResources()
|
mAllowAutoDimWallpaperNotVisible = view.getContext().getResources()
|
||||||
.getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper);
|
.getBoolean(R.bool.config_navigation_bar_enable_auto_dim_no_visible_wallpaper);
|
||||||
mDarkIntensityListeners = new ArrayList();
|
mDarkIntensityListeners = new ArrayList();
|
||||||
|
|
||||||
mWallpaperVisibilityListener = new WallpaperVisibilityListener(this);
|
|
||||||
try {
|
|
||||||
mWallpaperVisible = mWindowManagerService.registerWallpaperVisibilityListener(
|
|
||||||
mWallpaperVisibilityListener, mDisplayTracker.getDefaultDisplayId());
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
|
||||||
mView.addOnLayoutChangeListener(
|
mView.addOnLayoutChangeListener(
|
||||||
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
|
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
|
||||||
View currentView = mView.getCurrentView();
|
View currentView = mView.getCurrentView();
|
||||||
@@ -142,14 +104,14 @@ public final class NavigationBarTransitions extends BarTransitions implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
try {
|
|
||||||
mWindowManagerService.unregisterWallpaperVisibilityListener(mWallpaperVisibilityListener,
|
|
||||||
mDisplayTracker.getDefaultDisplayId());
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
}
|
|
||||||
mLightTransitionsController.destroy();
|
mLightTransitionsController.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setWallpaperVisibility(boolean visible) {
|
||||||
|
mWallpaperVisible = visible;
|
||||||
|
applyLightsOut(true, false);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAutoDim(boolean autoDim) {
|
public void setAutoDim(boolean autoDim) {
|
||||||
// Ensure we aren't in gestural nav if we are triggering auto dim
|
// Ensure we aren't in gestural nav if we are triggering auto dim
|
||||||
|
|||||||
@@ -1093,13 +1093,10 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
@Override
|
@Override
|
||||||
protected void onAttachedToWindow() {
|
protected void onAttachedToWindow() {
|
||||||
super.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();
|
requestApplyInsets();
|
||||||
reorient();
|
reorient();
|
||||||
if (mRotationButtonController != null) {
|
if (mRotationButtonController != null) {
|
||||||
mRotationButtonController.registerListeners();
|
mRotationButtonController.registerListeners(false /* registerRotationWatcher */);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateNavButtonIcons();
|
updateNavButtonIcons();
|
||||||
@@ -1115,8 +1112,6 @@ public class NavigationBarView extends FrameLayout {
|
|||||||
mFloatingRotationButton.hide();
|
mFloatingRotationButton.hide();
|
||||||
mRotationButtonController.unregisterListeners();
|
mRotationButtonController.unregisterListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
mEdgeBackGestureHandler.onNavBarDetached();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump(PrintWriter pw) {
|
void dump(PrintWriter pw) {
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
Dumpable {
|
Dumpable {
|
||||||
private static final String TAG = TaskbarDelegate.class.getSimpleName();
|
private static final String TAG = TaskbarDelegate.class.getSimpleName();
|
||||||
|
|
||||||
private final EdgeBackGestureHandler mEdgeBackGestureHandler;
|
private EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
private final LightBarTransitionsController.Factory mLightBarTransitionsControllerFactory;
|
private final LightBarTransitionsController.Factory mLightBarTransitionsControllerFactory;
|
||||||
private boolean mInitialized;
|
private boolean mInitialized;
|
||||||
private CommandQueue mCommandQueue;
|
private CommandQueue mCommandQueue;
|
||||||
@@ -171,15 +171,15 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||||
@Inject
|
@Inject
|
||||||
public TaskbarDelegate(Context context,
|
public TaskbarDelegate(Context context,
|
||||||
EdgeBackGestureHandler.Factory edgeBackGestureHandlerFactory,
|
|
||||||
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
|
LightBarTransitionsController.Factory lightBarTransitionsControllerFactory,
|
||||||
StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
|
StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
|
||||||
mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory;
|
mLightBarTransitionsControllerFactory = lightBarTransitionsControllerFactory;
|
||||||
mEdgeBackGestureHandler = edgeBackGestureHandlerFactory.create(context);
|
|
||||||
|
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mDisplayManager = mContext.getSystemService(DisplayManager.class);
|
mDisplayManager = mContext.getSystemService(DisplayManager.class);
|
||||||
mPipListener = mEdgeBackGestureHandler::setPipStashExclusionBounds;
|
mPipListener = (bounds) -> {
|
||||||
|
mEdgeBackGestureHandler.setPipStashExclusionBounds(bounds);
|
||||||
|
};
|
||||||
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
|
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
|
||||||
mStatusBarKeyguardViewManager.setTaskbarDelegate(this);
|
mStatusBarKeyguardViewManager.setTaskbarDelegate(this);
|
||||||
}
|
}
|
||||||
@@ -207,6 +207,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
mBackAnimation = backAnimation;
|
mBackAnimation = backAnimation;
|
||||||
mLightBarTransitionsController = createLightBarTransitionsController();
|
mLightBarTransitionsController = createLightBarTransitionsController();
|
||||||
mTaskStackChangeListeners = taskStackChangeListeners;
|
mTaskStackChangeListeners = taskStackChangeListeners;
|
||||||
|
mEdgeBackGestureHandler = navBarHelper.getEdgeBackGestureHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Separated into a method to keep setDependencies() clean/readable.
|
// Separated into a method to keep setDependencies() clean/readable.
|
||||||
@@ -239,8 +240,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
mOverviewProxyService.addCallback(this);
|
mOverviewProxyService.addCallback(this);
|
||||||
onNavigationModeChanged(mNavigationModeController.addListener(this));
|
onNavigationModeChanged(mNavigationModeController.addListener(this));
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
mNavBarHelper.init();
|
|
||||||
mEdgeBackGestureHandler.onNavBarAttached();
|
|
||||||
// Initialize component callback
|
// Initialize component callback
|
||||||
Display display = mDisplayManager.getDisplay(displayId);
|
Display display = mDisplayManager.getDisplay(displayId);
|
||||||
mWindowContext = mContext.createWindowContext(display, TYPE_APPLICATION, null);
|
mWindowContext = mContext.createWindowContext(display, TYPE_APPLICATION, null);
|
||||||
@@ -264,8 +263,6 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
|
|||||||
mOverviewProxyService.removeCallback(this);
|
mOverviewProxyService.removeCallback(this);
|
||||||
mNavigationModeController.removeListener(this);
|
mNavigationModeController.removeListener(this);
|
||||||
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.removeNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
mNavBarHelper.destroy();
|
|
||||||
mEdgeBackGestureHandler.onNavBarDetached();
|
|
||||||
mScreenPinningNotify = null;
|
mScreenPinningNotify = null;
|
||||||
mWindowContext = null;
|
mWindowContext = null;
|
||||||
mAutoHideController.setNavigationBar(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() {
|
public void onNavBarAttached() {
|
||||||
mIsAttached = true;
|
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() {
|
public void onNavBarDetached() {
|
||||||
mIsAttached = false;
|
mIsAttached = false;
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
|
import android.view.IWindowManager;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
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.accessibility.SystemActions;
|
||||||
import com.android.systemui.assist.AssistManager;
|
import com.android.systemui.assist.AssistManager;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
|
import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler;
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
|
import com.android.systemui.settings.DisplayTracker;
|
||||||
import com.android.systemui.settings.UserTracker;
|
import com.android.systemui.settings.UserTracker;
|
||||||
import com.android.systemui.statusbar.CommandQueue;
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
import com.android.systemui.statusbar.phone.CentralSurfaces;
|
||||||
@@ -101,6 +104,14 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
NavBarHelper.NavbarTaskbarStateUpdater mNavbarTaskbarStateUpdater;
|
NavBarHelper.NavbarTaskbarStateUpdater mNavbarTaskbarStateUpdater;
|
||||||
@Mock
|
@Mock
|
||||||
CommandQueue mCommandQueue;
|
CommandQueue mCommandQueue;
|
||||||
|
@Mock
|
||||||
|
IWindowManager mWm;
|
||||||
|
@Mock
|
||||||
|
DisplayTracker mDisplayTracker;
|
||||||
|
@Mock
|
||||||
|
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
|
@Mock
|
||||||
|
EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
|
||||||
private AccessibilityManager.AccessibilityServicesStateChangeListener
|
private AccessibilityManager.AccessibilityServicesStateChangeListener
|
||||||
mAccessibilityServicesStateChangeListener;
|
mAccessibilityServicesStateChangeListener;
|
||||||
|
|
||||||
@@ -114,6 +125,8 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
when(mAssistManagerLazy.get()).thenReturn(mAssistManager);
|
when(mAssistManagerLazy.get()).thenReturn(mAssistManager);
|
||||||
when(mAssistManager.getAssistInfoForUser(anyInt())).thenReturn(mAssistantComponent);
|
when(mAssistManager.getAssistInfoForUser(anyInt())).thenReturn(mAssistantComponent);
|
||||||
when(mUserTracker.getUserId()).thenReturn(1);
|
when(mUserTracker.getUserId()).thenReturn(1);
|
||||||
|
when(mDisplayTracker.getDefaultDisplayId()).thenReturn(0);
|
||||||
|
when(mEdgeBackGestureHandlerFactory.create(any())).thenReturn(mEdgeBackGestureHandler);
|
||||||
|
|
||||||
doAnswer((invocation) -> mAccessibilityServicesStateChangeListener =
|
doAnswer((invocation) -> mAccessibilityServicesStateChangeListener =
|
||||||
invocation.getArgument(0)).when(
|
invocation.getArgument(0)).when(
|
||||||
@@ -122,36 +135,70 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
|
mAccessibilityButtonModeObserver, mAccessibilityButtonTargetObserver,
|
||||||
mSystemActions, mOverviewProxyService, mAssistManagerLazy,
|
mSystemActions, mOverviewProxyService, mAssistManagerLazy,
|
||||||
() -> Optional.of(mock(CentralSurfaces.class)), mock(KeyguardStateController.class),
|
() -> Optional.of(mock(CentralSurfaces.class)), mock(KeyguardStateController.class),
|
||||||
mNavigationModeController, mUserTracker, mDumpManager, mCommandQueue);
|
mNavigationModeController, mEdgeBackGestureHandlerFactory, mWm, mUserTracker,
|
||||||
|
mDisplayTracker, mDumpManager, mCommandQueue);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void registerListenersInCtor() {
|
public void registerListenersInCtor() {
|
||||||
verify(mAccessibilityButtonModeObserver, times(1)).addListener(mNavBarHelper);
|
|
||||||
verify(mNavigationModeController, times(1)).addListener(mNavBarHelper);
|
verify(mNavigationModeController, times(1)).addListener(mNavBarHelper);
|
||||||
verify(mOverviewProxyService, times(1)).addCallback(mNavBarHelper);
|
verify(mOverviewProxyService, times(1)).addCallback(mNavBarHelper);
|
||||||
|
verify(mCommandQueue, times(1)).addCallback(any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void registerAssistantContentObserver() {
|
public void testSetupBarsRegistersListeners() throws Exception {
|
||||||
mNavBarHelper.init();
|
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(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
|
@Test
|
||||||
public void callbacksFiredWhenRegistering() {
|
public void callbacksFiredWhenRegistering() {
|
||||||
mNavBarHelper.init();
|
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
verify(mNavbarTaskbarStateUpdater, times(1))
|
verify(mNavbarTaskbarStateUpdater, times(1))
|
||||||
.updateAccessibilityServicesState();
|
.updateAccessibilityServicesState();
|
||||||
verify(mNavbarTaskbarStateUpdater, times(1))
|
verify(mNavbarTaskbarStateUpdater, times(1))
|
||||||
.updateAssistantAvailable(anyBoolean(), anyBoolean());
|
.updateAssistantAvailable(anyBoolean(), anyBoolean());
|
||||||
|
verify(mNavbarTaskbarStateUpdater, times(1))
|
||||||
|
.updateRotationWatcherState(anyInt());
|
||||||
|
verify(mNavbarTaskbarStateUpdater, times(1))
|
||||||
|
.updateWallpaperVisibility(anyBoolean(), anyInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assistantCallbacksFiredAfterConnecting() {
|
public void assistantCallbacksFiredAfterConnecting() {
|
||||||
mNavBarHelper.init();
|
|
||||||
// 1st set of callbacks get called when registering
|
// 1st set of callbacks get called when registering
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
@@ -172,7 +219,6 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void a11yCallbacksFiredAfterModeChange() {
|
public void a11yCallbacksFiredAfterModeChange() {
|
||||||
mNavBarHelper.init();
|
|
||||||
// 1st set of callbacks get called when registering
|
// 1st set of callbacks get called when registering
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
@@ -185,7 +231,6 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assistantCallbacksFiredAfterNavModeChange() {
|
public void assistantCallbacksFiredAfterNavModeChange() {
|
||||||
mNavBarHelper.init();
|
|
||||||
// 1st set of callbacks get called when registering
|
// 1st set of callbacks get called when registering
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
@@ -198,7 +243,6 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void removeListenerNoCallbacksFired() {
|
public void removeListenerNoCallbacksFired() {
|
||||||
mNavBarHelper.init();
|
|
||||||
// 1st set of callbacks get called when registering
|
// 1st set of callbacks get called when registering
|
||||||
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
@@ -220,7 +264,7 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
when(mAccessibilityManager.getAccessibilityShortcutTargets(
|
when(mAccessibilityManager.getAccessibilityShortcutTargets(
|
||||||
AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
|
AccessibilityManager.ACCESSIBILITY_BUTTON)).thenReturn(createFakeShortcutTargets());
|
||||||
|
|
||||||
mNavBarHelper.init();
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
assertThat(mNavBarHelper.getA11yButtonState()).isEqualTo(
|
assertThat(mNavBarHelper.getA11yButtonState()).isEqualTo(
|
||||||
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
|
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
|
||||||
@@ -230,13 +274,15 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
public void initAccessibilityStateWithFloatingMenuModeAndTargets_disableClickableState() {
|
public void initAccessibilityStateWithFloatingMenuModeAndTargets_disableClickableState() {
|
||||||
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
|
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
|
||||||
ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU);
|
ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU);
|
||||||
mNavBarHelper.init();
|
|
||||||
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
|
|
||||||
assertThat(mNavBarHelper.getA11yButtonState()).isEqualTo(/* disable_clickable_state */ 0);
|
assertThat(mNavBarHelper.getA11yButtonState()).isEqualTo(/* disable_clickable_state */ 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onA11yServicesStateChangedWithMultipleServices_a11yButtonClickableState() {
|
public void onA11yServicesStateChangedWithMultipleServices_a11yButtonClickableState() {
|
||||||
|
mNavBarHelper.registerNavTaskStateUpdater(mNavbarTaskbarStateUpdater);
|
||||||
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
|
when(mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode()).thenReturn(
|
||||||
ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
|
ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR);
|
||||||
|
|
||||||
@@ -249,15 +295,8 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
|
ACCESSIBILITY_BUTTON_CLICKABLE_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void registerCommandQueueCallbacks() {
|
|
||||||
mNavBarHelper.init();
|
|
||||||
verify(mCommandQueue, times(1)).addCallback(any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void saveMostRecentSysuiState() {
|
public void saveMostRecentSysuiState() {
|
||||||
mNavBarHelper.init();
|
|
||||||
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
|
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
|
||||||
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
|
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
|
||||||
@@ -274,7 +313,6 @@ public class NavBarHelperTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void ignoreNonNavbarSysuiState() {
|
public void ignoreNonNavbarSysuiState() {
|
||||||
mNavBarHelper.init();
|
|
||||||
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
|
mNavBarHelper.setWindowState(DISPLAY_ID, WINDOW, STATE_ID);
|
||||||
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
|
NavBarHelper.CurrentSysuiState state1 = mNavBarHelper.getCurrentSysuiState();
|
||||||
|
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ import android.testing.TestableLooper;
|
|||||||
import android.testing.TestableLooper.RunWithLooper;
|
import android.testing.TestableLooper.RunWithLooper;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.DisplayInfo;
|
import android.view.DisplayInfo;
|
||||||
|
import android.view.IWindowManager;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewRootImpl;
|
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.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
import com.android.systemui.recents.Recents;
|
import com.android.systemui.recents.Recents;
|
||||||
|
import com.android.systemui.settings.DisplayTracker;
|
||||||
import com.android.systemui.settings.FakeDisplayTracker;
|
import com.android.systemui.settings.FakeDisplayTracker;
|
||||||
import com.android.systemui.settings.UserContextProvider;
|
import com.android.systemui.settings.UserContextProvider;
|
||||||
import com.android.systemui.settings.UserTracker;
|
import com.android.systemui.settings.UserTracker;
|
||||||
@@ -172,8 +174,6 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
private UiEventLogger mUiEventLogger;
|
private UiEventLogger mUiEventLogger;
|
||||||
@Mock
|
@Mock
|
||||||
private ViewTreeObserver mViewTreeObserver;
|
private ViewTreeObserver mViewTreeObserver;
|
||||||
@Mock
|
|
||||||
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
|
||||||
NavBarHelper mNavBarHelper;
|
NavBarHelper mNavBarHelper;
|
||||||
@Mock
|
@Mock
|
||||||
private LightBarController mLightBarController;
|
private LightBarController mLightBarController;
|
||||||
@@ -205,6 +205,10 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
private Resources mResources;
|
private Resources mResources;
|
||||||
@Mock
|
@Mock
|
||||||
private ViewRootImpl mViewRootImpl;
|
private ViewRootImpl mViewRootImpl;
|
||||||
|
@Mock
|
||||||
|
private EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
|
||||||
|
@Mock
|
||||||
|
private EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
|
private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
|
||||||
private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake();
|
private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake();
|
||||||
private TaskStackChangeListeners mTaskStackChangeListeners =
|
private TaskStackChangeListeners mTaskStackChangeListeners =
|
||||||
@@ -234,6 +238,7 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
.thenReturn(mContext);
|
.thenReturn(mContext);
|
||||||
when(mNavigationBarView.getResources()).thenReturn(mResources);
|
when(mNavigationBarView.getResources()).thenReturn(mResources);
|
||||||
when(mNavigationBarView.getViewRootImpl()).thenReturn(mViewRootImpl);
|
when(mNavigationBarView.getViewRootImpl()).thenReturn(mViewRootImpl);
|
||||||
|
when(mEdgeBackGestureHandlerFactory.create(any())).thenReturn(mEdgeBackGestureHandler);
|
||||||
setupSysuiDependency();
|
setupSysuiDependency();
|
||||||
// This class inflates views that call Dependency.get, thus these injections are still
|
// This class inflates views that call Dependency.get, thus these injections are still
|
||||||
// necessary.
|
// necessary.
|
||||||
@@ -250,7 +255,9 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mSystemActions, mOverviewProxyService,
|
mSystemActions, mOverviewProxyService,
|
||||||
() -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces),
|
() -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces),
|
||||||
mKeyguardStateController, mock(NavigationModeController.class),
|
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);
|
mNavigationBar = createNavBar(mContext);
|
||||||
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
|
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
|
||||||
});
|
});
|
||||||
@@ -492,7 +499,6 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mDeadZone,
|
mDeadZone,
|
||||||
mDeviceConfigProxyFake,
|
mDeviceConfigProxyFake,
|
||||||
mNavigationBarTransitions,
|
mNavigationBarTransitions,
|
||||||
mEdgeBackGestureHandler,
|
|
||||||
Optional.of(mock(BackAnimation.class)),
|
Optional.of(mock(BackAnimation.class)),
|
||||||
mUserContextProvider,
|
mUserContextProvider,
|
||||||
mWakefulnessLifecycle,
|
mWakefulnessLifecycle,
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import static org.mockito.Mockito.when;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper.RunWithLooper;
|
import android.testing.TestableLooper.RunWithLooper;
|
||||||
import android.view.IWindowManager;
|
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
@@ -60,8 +59,6 @@ public class NavigationBarTransitionsTest extends SysuiTestCase {
|
|||||||
EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
|
EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
|
||||||
@Mock
|
@Mock
|
||||||
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
@Mock
|
|
||||||
IWindowManager mIWindowManager;
|
|
||||||
|
|
||||||
private NavigationBarTransitions mTransitions;
|
private NavigationBarTransitions mTransitions;
|
||||||
private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext);
|
private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext);
|
||||||
@@ -88,7 +85,7 @@ public class NavigationBarTransitionsTest extends SysuiTestCase {
|
|||||||
when(navBar.getCurrentView()).thenReturn(navBar);
|
when(navBar.getCurrentView()).thenReturn(navBar);
|
||||||
when(navBar.findViewById(anyInt())).thenReturn(navBar);
|
when(navBar.findViewById(anyInt())).thenReturn(navBar);
|
||||||
mTransitions = new NavigationBarTransitions(
|
mTransitions = new NavigationBarTransitions(
|
||||||
navBar, mIWindowManager, mLightBarTransitionsFactory, mDisplayTracker);
|
navBar, mLightBarTransitionsFactory, mDisplayTracker);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ class TaskbarDelegateTest : SysuiTestCase() {
|
|||||||
private lateinit var mTaskStackChangeListeners: TaskStackChangeListeners
|
private lateinit var mTaskStackChangeListeners: TaskStackChangeListeners
|
||||||
private lateinit var mTaskbarDelegate: TaskbarDelegate
|
private lateinit var mTaskbarDelegate: TaskbarDelegate
|
||||||
@Mock
|
@Mock
|
||||||
lateinit var mEdgeBackGestureHandlerFactory : EdgeBackGestureHandler.Factory
|
|
||||||
@Mock
|
|
||||||
lateinit var mEdgeBackGestureHandler : EdgeBackGestureHandler
|
lateinit var mEdgeBackGestureHandler : EdgeBackGestureHandler
|
||||||
@Mock
|
@Mock
|
||||||
lateinit var mLightBarControllerFactory : LightBarTransitionsController.Factory
|
lateinit var mLightBarControllerFactory : LightBarTransitionsController.Factory
|
||||||
@@ -73,13 +71,13 @@ class TaskbarDelegateTest : SysuiTestCase() {
|
|||||||
@Before
|
@Before
|
||||||
fun setup() {
|
fun setup() {
|
||||||
MockitoAnnotations.initMocks(this)
|
MockitoAnnotations.initMocks(this)
|
||||||
`when`(mEdgeBackGestureHandlerFactory.create(context)).thenReturn(mEdgeBackGestureHandler)
|
`when`(mNavBarHelper.edgeBackGestureHandler).thenReturn(mEdgeBackGestureHandler)
|
||||||
`when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController)
|
`when`(mLightBarControllerFactory.create(any())).thenReturn(mLightBarTransitionController)
|
||||||
`when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState)
|
`when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState)
|
||||||
`when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState)
|
`when`(mSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mSysUiState)
|
||||||
mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance()
|
mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance()
|
||||||
mTaskbarDelegate = TaskbarDelegate(context, mEdgeBackGestureHandlerFactory,
|
mTaskbarDelegate = TaskbarDelegate(context, mLightBarControllerFactory,
|
||||||
mLightBarControllerFactory, mStatusBarKeyguardViewManager)
|
mStatusBarKeyguardViewManager)
|
||||||
mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper,
|
mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper,
|
||||||
mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController,
|
mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController,
|
||||||
mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners)
|
mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners)
|
||||||
|
|||||||
Reference in New Issue
Block a user