Merge "Remove Dependency.get from NavigationBar." into sc-v2-dev

This commit is contained in:
Dave Mankoff
2021-09-28 12:45:39 +00:00
committed by Android (Google) Code Review
9 changed files with 290 additions and 238 deletions

View File

@@ -365,6 +365,12 @@ public class FrameworkServicesModule {
return context.getSystemService(TelecomManager.class); return context.getSystemService(TelecomManager.class);
} }
@Provides
@Singleton
static Optional<TelecomManager> provideOptionalTelecomManager(Context context) {
return Optional.ofNullable(context.getSystemService(TelecomManager.class));
}
@Provides @Provides
@Singleton @Singleton
static TelephonyManager provideTelephonyManager(Context context) { static TelephonyManager provideTelephonyManager(Context context) {

View File

@@ -93,7 +93,6 @@ import android.util.Log;
import android.view.Display; import android.view.Display;
import android.view.Gravity; import android.view.Gravity;
import android.view.HapticFeedbackConstants; import android.view.HapticFeedbackConstants;
import android.view.IWindowManager;
import android.view.InsetsState.InternalInsetsType; import android.view.InsetsState.InternalInsetsType;
import android.view.InsetsVisibilities; import android.view.InsetsVisibilities;
import android.view.KeyEvent; import android.view.KeyEvent;
@@ -118,20 +117,17 @@ import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker; import com.android.internal.util.LatencyTracker;
import com.android.internal.view.AppearanceRegion; import com.android.internal.view.AppearanceRegion;
import com.android.systemui.Dependency;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
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.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.model.SysUiState; import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.buttons.ButtonDispatcher; import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
import com.android.systemui.navigationbar.buttons.KeyButtonView; import com.android.systemui.navigationbar.buttons.KeyButtonView;
import com.android.systemui.navigationbar.buttons.RotationContextButton; import com.android.systemui.navigationbar.buttons.RotationContextButton;
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle; import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
import com.android.systemui.plugins.DarkIconDispatcher;
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;
@@ -151,8 +147,6 @@ import com.android.systemui.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.Pip;
@@ -162,6 +156,8 @@ import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import javax.inject.Inject;
import dagger.Lazy; import dagger.Lazy;
/** /**
@@ -243,7 +239,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private boolean mTransientShown; private boolean mTransientShown;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON; private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
private LightBarController mLightBarController; private LightBarController mLightBarController;
private final LightBarController mMainLightBarController;
private final LightBarController.Factory mLightBarControllerFactory;
private AutoHideController mAutoHideController; private AutoHideController mAutoHideController;
private final AutoHideController mMainAutoHideController;
private final AutoHideController.Factory mAutoHideControllerFactory;
private final Optional<TelecomManager> mTelecomManagerOptional;
private final InputMethodManager mInputMethodManager;
@VisibleForTesting @VisibleForTesting
public int mDisplayId; public int mDisplayId;
@@ -267,6 +269,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener; private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener;
private boolean mShowOrientedHandleForImmersiveMode; private boolean mShowOrientedHandleForImmersiveMode;
@com.android.internal.annotations.VisibleForTesting @com.android.internal.annotations.VisibleForTesting
public enum NavBarActionEvent implements UiEventLogger.UiEventEnum { public enum NavBarActionEvent implements UiEventLogger.UiEventEnum {
@@ -478,11 +481,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
} }
}; };
public NavigationBar(Context context, private NavigationBar(Context context,
WindowManager windowManager, WindowManager windowManager,
Lazy<AssistManager> assistManagerLazy, Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager, AccessibilityManager accessibilityManager,
AccessibilityManagerWrapper accessibilityManagerWrapper,
DeviceProvisionedController deviceProvisionedController, DeviceProvisionedController deviceProvisionedController,
MetricsLogger metricsLogger, MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService, OverviewProxyService overviewProxyService,
@@ -504,7 +506,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
NavigationBarOverlayController navbarOverlayController, NavigationBarOverlayController navbarOverlayController,
UiEventLogger uiEventLogger, UiEventLogger uiEventLogger,
NavigationBarA11yHelper navigationBarA11yHelper, NavigationBarA11yHelper navigationBarA11yHelper,
UserTracker userTracker) { UserTracker userTracker,
LightBarController mainLightBarController,
LightBarController.Factory lightBarControllerFactory,
AutoHideController mainAutoHideController,
AutoHideController.Factory autoHideControllerFactory,
Optional<TelecomManager> telecomManagerOptional,
InputMethodManager inputMethodManager) {
mContext = context; mContext = context;
mWindowManager = windowManager; mWindowManager = windowManager;
mAccessibilityManager = accessibilityManager; mAccessibilityManager = accessibilityManager;
@@ -531,6 +539,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNavigationBarA11yHelper = navigationBarA11yHelper; mNavigationBarA11yHelper = navigationBarA11yHelper;
mUserTracker = userTracker; mUserTracker = userTracker;
mNotificationShadeDepthController = notificationShadeDepthController; mNotificationShadeDepthController = notificationShadeDepthController;
mMainLightBarController = mainLightBarController;
mLightBarControllerFactory = lightBarControllerFactory;
mMainAutoHideController = mainAutoHideController;
mAutoHideControllerFactory = autoHideControllerFactory;
mTelecomManagerOptional = telecomManagerOptional;
mInputMethodManager = inputMethodManager;
mNavBarMode = mNavigationModeController.addListener(this); mNavBarMode = mNavigationModeController.addListener(this);
} }
@@ -548,7 +562,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view); mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView); if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView);
mContext.getSystemService(WindowManager.class).addView(mFrame, mWindowManager.addView(mFrame,
getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration
.getRotation())); .getRotation()));
mDisplayId = mContext.getDisplayId(); mDisplayId = mContext.getDisplayId();
@@ -606,8 +620,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
public void destroyView() { public void destroyView() {
setAutoHideController(/* autoHideController */ null); setAutoHideController(/* autoHideController */ null);
mCommandQueue.removeCallback(this); mCommandQueue.removeCallback(this);
mContext.getSystemService(WindowManager.class).removeViewImmediate( mWindowManager.removeViewImmediate(mNavigationBarView.getRootView());
mNavigationBarView.getRootView());
mNavigationModeController.removeListener(this); mNavigationModeController.removeListener(this);
mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener); mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener);
@@ -673,22 +686,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
// before notifications creation. We cannot directly use getLightBarController() // before notifications creation. We cannot directly use getLightBarController()
// from NavigationBarFragment directly. // from NavigationBarFragment directly.
LightBarController lightBarController = mIsOnDefaultDisplay LightBarController lightBarController = mIsOnDefaultDisplay
? Dependency.get(LightBarController.class) ? mMainLightBarController : mLightBarControllerFactory.create(mContext);
: new LightBarController(mContext,
Dependency.get(DarkIconDispatcher.class),
Dependency.get(BatteryController.class),
Dependency.get(NavigationModeController.class),
Dependency.get(DumpManager.class));
setLightBarController(lightBarController); setLightBarController(lightBarController);
// TODO(b/118592525): to support multi-display, we start to add something which is // TODO(b/118592525): to support multi-display, we start to add something which is
// per-display, while others may be global. I think it's time to // per-display, while others may be global. I think it's time to
// add a new class maybe named DisplayDependency to solve // add a new class maybe named DisplayDependency to solve
// per-display Dependency problem. // per-display Dependency problem.
// Alternative: this is a good case for a Dagger subcomponent. Same with LightBarController.
AutoHideController autoHideController = mIsOnDefaultDisplay AutoHideController autoHideController = mIsOnDefaultDisplay
? Dependency.get(AutoHideController.class) ? mMainAutoHideController : mAutoHideControllerFactory.create(mContext);
: new AutoHideController(mContext, mHandler,
Dependency.get(IWindowManager.class));
setAutoHideController(autoHideController); setAutoHideController(autoHideController);
restoreAppearanceAndTransientState(); restoreAppearanceAndTransientState();
} }
@@ -1183,9 +1190,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
switch (event.getAction()) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
mHomeBlockedThisTouch = false; mHomeBlockedThisTouch = false;
TelecomManager telecomManager = if (mTelecomManagerOptional.isPresent()
mContext.getSystemService(TelecomManager.class); && mTelecomManagerOptional.get().isRinging()) {
if (telecomManager != null && telecomManager.isRinging()) {
if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) { if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " + Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " +
"No heads up"); "No heads up");
@@ -1267,7 +1273,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
} }
private void onImeSwitcherClick(View v) { private void onImeSwitcherClick(View v) {
mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem( mInputMethodManager.showInputMethodPickerFromSystem(
true /* showAuxiliarySubtypes */, mDisplayId); true /* showAuxiliarySubtypes */, mDisplayId);
}; };
@@ -1702,4 +1708,123 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
int getNavigationIconHints() { int getNavigationIconHints() {
return mNavigationIconHints; return mNavigationIconHints;
} }
/**
* Injectable factory for construction a {@link NavigationBar}.
*/
public static class Factory {
private final WindowManager mWindowManager;
private final Lazy<AssistManager> mAssistManagerLazy;
private final AccessibilityManager mAccessibilityManager;
private final DeviceProvisionedController mDeviceProvisionedController;
private final MetricsLogger mMetricsLogger;
private final OverviewProxyService mOverviewProxyService;
private final NavigationModeController mNavigationModeController;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final StatusBarStateController mStatusBarStateController;
private final SysUiState mSysUiFlagsContainer;
private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue;
private final Optional<Pip> mPipOptional;
private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final Optional<Recents> mRecentsOptional;
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
private final ShadeController mShadeController;
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final NotificationShadeDepthController mNotificationShadeDepthController;
private final SystemActions mSystemActions;
private final Handler mMainHandler;
private final NavigationBarOverlayController mNavbarOverlayController;
private final UiEventLogger mUiEventLogger;
private final NavigationBarA11yHelper mNavigationBarA11yHelper;
private final UserTracker mUserTracker;
private final LightBarController mMainLightBarController;
private final LightBarController.Factory mLightBarControllerFactory;
private final AutoHideController mMainAutoHideController;
private final AutoHideController.Factory mAutoHideControllerFactory;
private final Optional<TelecomManager> mTelecomManagerOptional;
private final InputMethodManager mInputMethodManager;
@Inject
public Factory(
WindowManager windowManager,
Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager,
DeviceProvisionedController deviceProvisionedController,
MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController,
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer,
BroadcastDispatcher broadcastDispatcher,
CommandQueue commandQueue,
Optional<Pip> pipOptional,
Optional<LegacySplitScreen> splitScreenOptional,
Optional<Recents> recentsOptional,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
ShadeController shadeController,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationShadeDepthController notificationShadeDepthController,
SystemActions systemActions,
@Main Handler mainHandler,
NavigationBarOverlayController navbarOverlayController,
UiEventLogger uiEventLogger,
NavigationBarA11yHelper navigationBarA11yHelper,
UserTracker userTracker,
LightBarController mainLightBarController,
LightBarController.Factory lightBarControllerFactory,
AutoHideController mainAutoHideController,
AutoHideController.Factory autoHideControllerFactory,
Optional<TelecomManager> telecomManagerOptional,
InputMethodManager inputMethodManager) {
mWindowManager = windowManager;
mAssistManagerLazy = assistManagerLazy;
mAccessibilityManager = accessibilityManager;
mDeviceProvisionedController = deviceProvisionedController;
mMetricsLogger = metricsLogger;
mOverviewProxyService = overviewProxyService;
mNavigationModeController = navigationModeController;
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mStatusBarStateController = statusBarStateController;
mSysUiFlagsContainer = sysUiFlagsContainer;
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
mPipOptional = pipOptional;
mSplitScreenOptional = splitScreenOptional;
mRecentsOptional = recentsOptional;
mStatusBarOptionalLazy = statusBarOptionalLazy;
mShadeController = shadeController;
mNotificationRemoteInputManager = notificationRemoteInputManager;
mNotificationShadeDepthController = notificationShadeDepthController;
mSystemActions = systemActions;
mMainHandler = mainHandler;
mNavbarOverlayController = navbarOverlayController;
mUiEventLogger = uiEventLogger;
mNavigationBarA11yHelper = navigationBarA11yHelper;
mUserTracker = userTracker;
mMainLightBarController = mainLightBarController;
mLightBarControllerFactory = lightBarControllerFactory;
mMainAutoHideController = mainAutoHideController;
mAutoHideControllerFactory = autoHideControllerFactory;
mTelecomManagerOptional = telecomManagerOptional;
mInputMethodManager = inputMethodManager;
}
/** Construct a {@link NavigationBar} */
public NavigationBar create(Context context) {
return new NavigationBar(context, mWindowManager, mAssistManagerLazy,
mAccessibilityManager, mDeviceProvisionedController, mMetricsLogger,
mOverviewProxyService, mNavigationModeController,
mAccessibilityButtonModeObserver, mStatusBarStateController,
mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, mPipOptional,
mSplitScreenOptional, mRecentsOptional, mStatusBarOptionalLazy,
mShadeController, mNotificationRemoteInputManager,
mNotificationShadeDepthController, mSystemActions, mMainHandler,
mNavbarOverlayController, mUiEventLogger, mNavigationBarA11yHelper,
mUserTracker, mMainLightBarController, mLightBarControllerFactory,
mMainAutoHideController, mAutoHideControllerFactory, mTelecomManagerOptional,
mInputMethodManager);
}
}
} }

View File

@@ -32,52 +32,30 @@ import android.util.SparseArray;
import android.view.Display; import android.view.Display;
import android.view.IWindowManager; import android.view.IWindowManager;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.view.WindowManagerGlobal; import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.RegisterStatusBarResult; import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.settingslib.applications.InterestingConfigChanges; import com.android.settingslib.applications.InterestingConfigChanges;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.model.SysUiState; import com.android.systemui.model.SysUiState;
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.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
import dagger.Lazy;
/** A controller to handle navigation bars. */ /** A controller to handle navigation bars. */
@SysUISingleton @SysUISingleton
@@ -90,36 +68,12 @@ public class NavigationBarController implements
private static final String TAG = NavigationBarController.class.getSimpleName(); private static final String TAG = NavigationBarController.class.getSimpleName();
private final Context mContext; private final Context mContext;
private final WindowManager mWindowManager;
private final Lazy<AssistManager> mAssistManagerLazy;
private final AccessibilityManager mAccessibilityManager;
private final AccessibilityManagerWrapper mAccessibilityManagerWrapper;
private final DeviceProvisionedController mDeviceProvisionedController;
private final MetricsLogger mMetricsLogger;
private final OverviewProxyService mOverviewProxyService;
private final NavigationModeController mNavigationModeController;
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
private final StatusBarStateController mStatusBarStateController;
private final SysUiState mSysUiFlagsContainer;
private final BroadcastDispatcher mBroadcastDispatcher;
private final CommandQueue mCommandQueue;
private final Optional<Pip> mPipOptional;
private final Optional<LegacySplitScreen> mSplitScreenOptional;
private final Optional<Recents> mRecentsOptional;
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
private final ShadeController mShadeController;
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
private final SystemActions mSystemActions;
private final UiEventLogger mUiEventLogger;
private final Handler mHandler; private final Handler mHandler;
private final NavigationBarA11yHelper mNavigationBarA11yHelper; private final NavigationBar.Factory mNavigationBarFactory;
private final DisplayManager mDisplayManager; private final DisplayManager mDisplayManager;
private final NavigationBarOverlayController mNavBarOverlayController;
private final TaskbarDelegate mTaskbarDelegate; private final TaskbarDelegate mTaskbarDelegate;
private final NotificationShadeDepthController mNotificationShadeDepthController;
private int mNavMode; private int mNavMode;
@VisibleForTesting boolean mIsTablet; @VisibleForTesting boolean mIsTablet;
private final UserTracker mUserTracker;
/** A displayId - nav bar maps. */ /** A displayId - nav bar maps. */
@VisibleForTesting @VisibleForTesting
@@ -132,72 +86,28 @@ public class NavigationBarController implements
@Inject @Inject
public NavigationBarController(Context context, public NavigationBarController(Context context,
WindowManager windowManager,
Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager,
AccessibilityManagerWrapper accessibilityManagerWrapper,
DeviceProvisionedController deviceProvisionedController,
MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService, OverviewProxyService overviewProxyService,
NavigationModeController navigationModeController, NavigationModeController navigationModeController,
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
StatusBarStateController statusBarStateController,
SysUiState sysUiFlagsContainer, SysUiState sysUiFlagsContainer,
BroadcastDispatcher broadcastDispatcher,
CommandQueue commandQueue, CommandQueue commandQueue,
Optional<Pip> pipOptional,
Optional<LegacySplitScreen> splitScreenOptional,
Optional<Recents> recentsOptional,
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
ShadeController shadeController,
NotificationRemoteInputManager notificationRemoteInputManager,
NotificationShadeDepthController notificationShadeDepthController,
SystemActions systemActions,
@Main Handler mainHandler, @Main Handler mainHandler,
UiEventLogger uiEventLogger,
NavigationBarOverlayController navBarOverlayController,
ConfigurationController configurationController, ConfigurationController configurationController,
NavigationBarA11yHelper navigationBarA11yHelper, NavigationBarA11yHelper navigationBarA11yHelper,
TaskbarDelegate taskbarDelegate, TaskbarDelegate taskbarDelegate,
UserTracker userTracker, NavigationBar.Factory navigationBarFactory,
DumpManager dumpManager) { DumpManager dumpManager) {
mContext = context; mContext = context;
mWindowManager = windowManager;
mAssistManagerLazy = assistManagerLazy;
mAccessibilityManager = accessibilityManager;
mAccessibilityManagerWrapper = accessibilityManagerWrapper;
mDeviceProvisionedController = deviceProvisionedController;
mMetricsLogger = metricsLogger;
mOverviewProxyService = overviewProxyService;
mNavigationModeController = navigationModeController;
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
mStatusBarStateController = statusBarStateController;
mSysUiFlagsContainer = sysUiFlagsContainer;
mBroadcastDispatcher = broadcastDispatcher;
mCommandQueue = commandQueue;
mPipOptional = pipOptional;
mSplitScreenOptional = splitScreenOptional;
mRecentsOptional = recentsOptional;
mStatusBarOptionalLazy = statusBarOptionalLazy;
mShadeController = shadeController;
mNotificationRemoteInputManager = notificationRemoteInputManager;
mNotificationShadeDepthController = notificationShadeDepthController;
mSystemActions = systemActions;
mUiEventLogger = uiEventLogger;
mHandler = mainHandler; mHandler = mainHandler;
mNavigationBarA11yHelper = navigationBarA11yHelper; mNavigationBarFactory = navigationBarFactory;
mDisplayManager = mContext.getSystemService(DisplayManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class);
commandQueue.addCallback(this); commandQueue.addCallback(this);
configurationController.addCallback(this); configurationController.addCallback(this);
mConfigChanges.applyNewConfig(mContext.getResources()); mConfigChanges.applyNewConfig(mContext.getResources());
mNavBarOverlayController = navBarOverlayController; mNavMode = navigationModeController.addListener(this);
mNavMode = mNavigationModeController.addListener(this);
mNavigationModeController.addListener(this);
mTaskbarDelegate = taskbarDelegate; mTaskbarDelegate = taskbarDelegate;
mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService, mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService,
navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer); navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer);
mIsTablet = isTablet(mContext); mIsTablet = isTablet(mContext);
mUserTracker = userTracker;
dumpManager.registerDumpable(this); dumpManager.registerDumpable(this);
} }
@@ -354,33 +264,8 @@ public class NavigationBarController implements
final Context context = isOnDefaultDisplay final Context context = isOnDefaultDisplay
? mContext ? mContext
: mContext.createDisplayContext(display); : mContext.createDisplayContext(display);
NavigationBar navBar = new NavigationBar(context, NavigationBar navBar = mNavigationBarFactory.create(context);
mWindowManager,
mAssistManagerLazy,
mAccessibilityManager,
mAccessibilityManagerWrapper,
mDeviceProvisionedController,
mMetricsLogger,
mOverviewProxyService,
mNavigationModeController,
mAccessibilityButtonModeObserver,
mStatusBarStateController,
mSysUiFlagsContainer,
mBroadcastDispatcher,
mCommandQueue,
mPipOptional,
mSplitScreenOptional,
mRecentsOptional,
mStatusBarOptionalLazy,
mShadeController,
mNotificationRemoteInputManager,
mNotificationShadeDepthController,
mSystemActions,
mHandler,
mNavBarOverlayController,
mUiEventLogger,
mNavigationBarA11yHelper,
mUserTracker);
mNavigationBars.put(displayId, navBar); mNavigationBars.put(displayId, navBar);
View navigationBarView = navBar.createView(savedState); View navigationBarView = navBar.createView(savedState);

View File

@@ -171,4 +171,23 @@ public class AutoHideController {
return false; return false;
} }
/**
* Injectable factory for creating a {@link AutoHideController}.
*/
public static class Factory {
private final Handler mHandler;
private final IWindowManager mIWindowManager;
@Inject
public Factory(@Main Handler handler, IWindowManager iWindowManager) {
mHandler = handler;
mIWindowManager = iWindowManager;
}
/** Create an {@link AutoHideController} */
public AutoHideController create(Context context) {
return new AutoHideController(context, mHandler, mIWindowManager);
}
}
} }

View File

@@ -298,4 +298,33 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
pw.println(); pw.println();
} }
} }
/**
* Injectable factory for creating a {@link LightBarController}.
*/
public static class Factory {
private final DarkIconDispatcher mDarkIconDispatcher;
private final BatteryController mBatteryController;
private final NavigationModeController mNavModeController;
private final DumpManager mDumpManager;
@Inject
public Factory(
DarkIconDispatcher darkIconDispatcher,
BatteryController batteryController,
NavigationModeController navModeController,
DumpManager dumpManager) {
mDarkIconDispatcher = darkIconDispatcher;
mBatteryController = batteryController;
mNavModeController = navModeController;
mDumpManager = dumpManager;
}
/** Create an {@link LightBarController} */
public LightBarController create(Context context) {
return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
mNavModeController, mDumpManager);
}
}
} }

View File

@@ -14,7 +14,6 @@
package com.android.systemui.statusbar.policy; package com.android.systemui.statusbar.policy;
import android.content.Context;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener; import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
@@ -35,8 +34,8 @@ public class AccessibilityManagerWrapper implements
private final AccessibilityManager mAccessibilityManager; private final AccessibilityManager mAccessibilityManager;
@Inject @Inject
public AccessibilityManagerWrapper(Context context) { public AccessibilityManagerWrapper(AccessibilityManager accessibilityManager) {
mAccessibilityManager = context.getSystemService(AccessibilityManager.class); mAccessibilityManager = accessibilityManager;
} }
@Override @Override

View File

@@ -35,42 +35,23 @@ import static org.mockito.Mockito.verify;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
import com.android.systemui.accessibility.SystemActions;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.DumpManager;
import com.android.systemui.model.SysUiState; import com.android.systemui.model.SysUiState;
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.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import java.util.Optional; import org.mockito.MockitoAnnotations;
/** atest NavigationBarControllerTest */ /** atest NavigationBarControllerTest */
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
@@ -78,46 +59,31 @@ import java.util.Optional;
@SmallTest @SmallTest
public class NavigationBarControllerTest extends SysuiTestCase { public class NavigationBarControllerTest extends SysuiTestCase {
private static final int SECONDARY_DISPLAY = 1;
private NavigationBarController mNavigationBarController; private NavigationBarController mNavigationBarController;
private NavigationBar mDefaultNavBar; private NavigationBar mDefaultNavBar;
private NavigationBar mSecondaryNavBar; private NavigationBar mSecondaryNavBar;
private CommandQueue mCommandQueue = mock(CommandQueue.class); @Mock
private CommandQueue mCommandQueue;
private static final int SECONDARY_DISPLAY = 1; @Mock
private NavigationBar.Factory mNavigationBarFactory;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mNavigationBarController = spy( mNavigationBarController = spy(
new NavigationBarController(mContext, new NavigationBarController(mContext,
mock(WindowManager.class),
() -> mock(AssistManager.class),
mock(AccessibilityManager.class),
mock(AccessibilityManagerWrapper.class),
mock(DeviceProvisionedController.class),
mock(MetricsLogger.class),
mock(OverviewProxyService.class), mock(OverviewProxyService.class),
mock(NavigationModeController.class), mock(NavigationModeController.class),
mock(AccessibilityButtonModeObserver.class),
mock(StatusBarStateController.class),
mock(SysUiState.class), mock(SysUiState.class),
mock(BroadcastDispatcher.class),
mCommandQueue, mCommandQueue,
Optional.of(mock(Pip.class)),
Optional.of(mock(LegacySplitScreen.class)),
Optional.of(mock(Recents.class)),
() -> Optional.of(mock(StatusBar.class)),
mock(ShadeController.class),
mock(NotificationRemoteInputManager.class),
mock(NotificationShadeDepthController.class),
mock(SystemActions.class),
Dependency.get(Dependency.MAIN_HANDLER), Dependency.get(Dependency.MAIN_HANDLER),
mock(UiEventLogger.class),
mock(NavigationBarOverlayController.class),
mock(ConfigurationController.class), mock(ConfigurationController.class),
mock(NavigationBarA11yHelper.class), mock(NavigationBarA11yHelper.class),
mock(TaskbarDelegate.class), mock(TaskbarDelegate.class),
mock(UserTracker.class), mNavigationBarFactory,
mock(DumpManager.class))); mock(DumpManager.class)));
initializeNavigationBars(); initializeNavigationBars();
} }

View File

@@ -19,6 +19,7 @@ package com.android.systemui.navigationbar;
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN;
import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT;
import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
import static android.inputmethodservice.InputMethodService.IME_VISIBLE; import static android.inputmethodservice.InputMethodService.IME_VISIBLE;
import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS; import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
@@ -28,7 +29,6 @@ import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
@@ -45,11 +45,11 @@ import android.content.Context;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.hardware.display.DisplayManagerGlobal; import android.hardware.display.DisplayManagerGlobal;
import android.os.Handler; import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
import android.provider.Settings; import android.provider.Settings;
import android.telecom.TelecomManager;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper;
@@ -60,12 +60,12 @@ import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.view.WindowMetrics; import android.view.WindowMetrics;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.view.inputmethod.InputMethodManager;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestableContext; import com.android.systemui.SysuiTestableContext;
import com.android.systemui.accessibility.AccessibilityButtonModeObserver; import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
@@ -81,9 +81,10 @@ import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationRemoteInputManager;
import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest; import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -110,7 +111,13 @@ public class NavigationBarTest extends SysuiTestCase {
private NavigationBar mExternalDisplayNavigationBar; private NavigationBar mExternalDisplayNavigationBar;
private SysuiTestableContext mSysuiTestableContextExternal; private SysuiTestableContext mSysuiTestableContextExternal;
@Mock
private OverviewProxyService mOverviewProxyService; private OverviewProxyService mOverviewProxyService;
@Mock
private StatusBarStateController mStatusBarStateController;
@Mock
private NavigationModeController mNavigationModeController;
@Mock
private CommandQueue mCommandQueue; private CommandQueue mCommandQueue;
private SysUiState mMockSysUiState; private SysUiState mMockSysUiState;
@Mock @Mock
@@ -125,11 +132,25 @@ public class NavigationBarTest extends SysuiTestCase {
EdgeBackGestureHandler mEdgeBackGestureHandler; EdgeBackGestureHandler mEdgeBackGestureHandler;
@Mock @Mock
NavigationBarA11yHelper mNavigationBarA11yHelper; NavigationBarA11yHelper mNavigationBarA11yHelper;
@Mock
private LightBarController mLightBarController;
@Mock
private LightBarController.Factory mLightBarcontrollerFactory;
@Mock
private AutoHideController mAutoHideController;
@Mock
private AutoHideController.Factory mAutoHideControllerFactory;
@Mock
private WindowManager mWindowManager;
@Mock
private TelecomManager mTelecomManager;
@Mock
private InputMethodManager mInputMethodManager;
@Mock
private AssistManager mAssistManager;
@Rule @Rule
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck(); public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
private AccessibilityManagerWrapper mAccessibilityWrapper =
new AccessibilityManagerWrapper(mContext);
@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
@@ -137,15 +158,19 @@ public class NavigationBarTest extends SysuiTestCase {
when(mEdgeBackGestureHandlerFactory.create(any(Context.class))) when(mEdgeBackGestureHandlerFactory.create(any(Context.class)))
.thenReturn(mEdgeBackGestureHandler); .thenReturn(mEdgeBackGestureHandler);
mCommandQueue = new CommandQueue(mContext); when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController);
when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController);
setupSysuiDependency(); setupSysuiDependency();
mDependency.injectMockDependency(AssistManager.class); // This class inflates views that call Dependency.get, thus these injections are still
// necessary.
mDependency.injectTestDependency(AssistManager.class, mAssistManager);
mDependency.injectMockDependency(KeyguardStateController.class); mDependency.injectMockDependency(KeyguardStateController.class);
mDependency.injectMockDependency(StatusBarStateController.class); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
mDependency.injectMockDependency(NavigationBarController.class); mDependency.injectMockDependency(NavigationBarController.class);
mOverviewProxyService = mDependency.injectMockDependency(OverviewProxyService.class);
mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class, mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class,
mEdgeBackGestureHandlerFactory); mEdgeBackGestureHandlerFactory);
mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService);
mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
TestableLooper.get(this).runWithLooper(() -> { TestableLooper.get(this).runWithLooper(() -> {
mNavigationBar = createNavBar(mContext); mNavigationBar = createNavBar(mContext);
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal); mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
@@ -164,23 +189,13 @@ public class NavigationBarTest extends SysuiTestCase {
mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext( mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext(
display); display);
WindowManager windowManager = mock(WindowManager.class); Display defaultDisplay = mContext.getDisplay();
Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay(); when(mWindowManager.getDefaultDisplay()).thenReturn(defaultDisplay);
when(windowManager.getDefaultDisplay()).thenReturn( WindowMetrics metrics = mContext.getSystemService(WindowManager.class)
defaultDisplay);
WindowMetrics maximumWindowMetrics = mContext.getSystemService(WindowManager.class)
.getMaximumWindowMetrics(); .getMaximumWindowMetrics();
when(windowManager.getMaximumWindowMetrics()).thenReturn(maximumWindowMetrics); when(mWindowManager.getMaximumWindowMetrics()).thenReturn(metrics);
WindowMetrics currentWindowMetrics = mContext.getSystemService(WindowManager.class) doNothing().when(mWindowManager).addView(any(), any());
.getCurrentWindowMetrics(); doNothing().when(mWindowManager).removeViewImmediate(any());
when(windowManager.getCurrentWindowMetrics()).thenReturn(currentWindowMetrics);
doNothing().when(windowManager).addView(any(), any());
mContext.addMockSystemService(Context.WINDOW_SERVICE, windowManager);
mSysuiTestableContextExternal.addMockSystemService(Context.WINDOW_SERVICE, windowManager);
mDependency.injectTestDependency(Dependency.BG_LOOPER, Looper.getMainLooper());
mDependency.injectTestDependency(AccessibilityManagerWrapper.class, mAccessibilityWrapper);
mMockSysUiState = mock(SysUiState.class); mMockSysUiState = mock(SysUiState.class);
when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState); when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState);
} }
@@ -239,10 +254,8 @@ public class NavigationBarTest extends SysuiTestCase {
defaultNavBar.createView(null); defaultNavBar.createView(null);
externalNavBar.createView(null); externalNavBar.createView(null);
// Set IME window status for default NavBar. defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
mCommandQueue.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, BACK_DISPOSITION_DEFAULT, true);
BACK_DISPOSITION_DEFAULT, true, false);
processAllMessages();
// Verify IME window state will be updated in default NavBar & external NavBar state reset. // Verify IME window state will be updated in default NavBar & external NavBar state reset.
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN, assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
@@ -250,11 +263,10 @@ public class NavigationBarTest extends SysuiTestCase {
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
// Set IME window status for external NavBar. externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE,
mCommandQueue.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, BACK_DISPOSITION_DEFAULT, true);
IME_VISIBLE, BACK_DISPOSITION_DEFAULT, true, false); defaultNavBar.setImeWindowStatus(
processAllMessages(); DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false);
// Verify IME window state will be updated in external NavBar & default NavBar state reset. // Verify IME window state will be updated in external NavBar & default NavBar state reset.
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN, assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
externalNavBar.getNavigationIconHints()); externalNavBar.getNavigationIconHints());
@@ -280,19 +292,16 @@ public class NavigationBarTest extends SysuiTestCase {
DeviceProvisionedController deviceProvisionedController = DeviceProvisionedController deviceProvisionedController =
mock(DeviceProvisionedController.class); mock(DeviceProvisionedController.class);
when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true); when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
assertNotNull(mAccessibilityWrapper); NavigationBar.Factory factory = new NavigationBar.Factory(
return spy(new NavigationBar(context, mWindowManager,
mock(WindowManager.class), () -> mAssistManager,
() -> mock(AssistManager.class),
mock(AccessibilityManager.class), mock(AccessibilityManager.class),
context.getDisplayId() == DEFAULT_DISPLAY ? mAccessibilityWrapper
: mock(AccessibilityManagerWrapper.class),
deviceProvisionedController, deviceProvisionedController,
new MetricsLogger(), new MetricsLogger(),
mOverviewProxyService, mOverviewProxyService,
mock(NavigationModeController.class), mNavigationModeController,
mock(AccessibilityButtonModeObserver.class), mock(AccessibilityButtonModeObserver.class),
mock(StatusBarStateController.class), mStatusBarStateController,
mMockSysUiState, mMockSysUiState,
mBroadcastDispatcher, mBroadcastDispatcher,
mCommandQueue, mCommandQueue,
@@ -308,7 +317,14 @@ public class NavigationBarTest extends SysuiTestCase {
mock(NavigationBarOverlayController.class), mock(NavigationBarOverlayController.class),
mUiEventLogger, mUiEventLogger,
mNavigationBarA11yHelper, mNavigationBarA11yHelper,
mock(UserTracker.class))); mock(UserTracker.class),
mLightBarController,
mLightBarcontrollerFactory,
mAutoHideController,
mAutoHideControllerFactory,
Optional.of(mTelecomManager),
mInputMethodManager);
return spy(factory.create(context));
} }
private void processAllMessages() { private void processAllMessages() {

View File

@@ -15,6 +15,8 @@
package com.android.systemui.statusbar; package com.android.systemui.statusbar;
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT;
import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR;
@@ -188,8 +190,13 @@ public class CommandQueueTest extends SysuiTestCase {
@Test @Test
public void testShowImeButtonForSecondaryDisplay() { public void testShowImeButtonForSecondaryDisplay() {
// First show in default display to update the "last updated ime display"
testShowImeButton();
mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, null, 1, 2, true, false); mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, null, 1, 2, true, false);
waitForIdleSync(); waitForIdleSync();
verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(null), eq(IME_INVISIBLE),
eq(BACK_DISPOSITION_DEFAULT), eq(false));
verify(mCallbacks).setImeWindowStatus( verify(mCallbacks).setImeWindowStatus(
eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true)); eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true));
} }