summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dave Mankoff <mankoff@google.com> 2021-09-28 12:45:39 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-09-28 12:45:39 +0000
commit22fb5df008edd76ef8aef06954d4a1531c6bf6c2 (patch)
tree8af184f678057cf64b8f595d896977d8b853b742
parentb85da640d13ced31165c543e686bb47027bff54f (diff)
parent9f8305196c46d130639bf40d05a049663aefd4a0 (diff)
Merge "Remove Dependency.get from NavigationBar." into sc-v2-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java177
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java127
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java54
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java104
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java7
9 files changed, 290 insertions, 238 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
index 4d1608fb445d..b210a197f8eb 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java
@@ -367,6 +367,12 @@ public class FrameworkServicesModule {
@Provides
@Singleton
+ static Optional<TelecomManager> provideOptionalTelecomManager(Context context) {
+ return Optional.ofNullable(context.getSystemService(TelecomManager.class));
+ }
+
+ @Provides
+ @Singleton
static TelephonyManager provideTelephonyManager(Context context) {
return context.getSystemService(TelephonyManager.class);
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 8576a280c560..d3a664ba5145 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -93,7 +93,6 @@ import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
-import android.view.IWindowManager;
import android.view.InsetsState.InternalInsetsType;
import android.view.InsetsVisibilities;
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.util.LatencyTracker;
import com.android.internal.view.AppearanceRegion;
-import com.android.systemui.Dependency;
import com.android.systemui.R;
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.qualifiers.Main;
-import com.android.systemui.dump.DumpManager;
import com.android.systemui.model.SysUiState;
import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
import com.android.systemui.navigationbar.buttons.KeyButtonView;
import com.android.systemui.navigationbar.buttons.RotationContextButton;
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
-import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
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.ShadeController;
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.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.pip.Pip;
@@ -162,6 +156,8 @@ import java.util.Locale;
import java.util.Optional;
import java.util.function.Consumer;
+import javax.inject.Inject;
+
import dagger.Lazy;
/**
@@ -243,7 +239,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private boolean mTransientShown;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
private LightBarController mLightBarController;
+ private final LightBarController mMainLightBarController;
+ private final LightBarController.Factory mLightBarControllerFactory;
private AutoHideController mAutoHideController;
+ private final AutoHideController mMainAutoHideController;
+ private final AutoHideController.Factory mAutoHideControllerFactory;
+ private final Optional<TelecomManager> mTelecomManagerOptional;
+ private final InputMethodManager mInputMethodManager;
@VisibleForTesting
public int mDisplayId;
@@ -267,6 +269,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener;
private boolean mShowOrientedHandleForImmersiveMode;
+
@com.android.internal.annotations.VisibleForTesting
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,
Lazy<AssistManager> assistManagerLazy,
AccessibilityManager accessibilityManager,
- AccessibilityManagerWrapper accessibilityManagerWrapper,
DeviceProvisionedController deviceProvisionedController,
MetricsLogger metricsLogger,
OverviewProxyService overviewProxyService,
@@ -504,7 +506,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
NavigationBarOverlayController navbarOverlayController,
UiEventLogger uiEventLogger,
NavigationBarA11yHelper navigationBarA11yHelper,
- UserTracker userTracker) {
+ UserTracker userTracker,
+ LightBarController mainLightBarController,
+ LightBarController.Factory lightBarControllerFactory,
+ AutoHideController mainAutoHideController,
+ AutoHideController.Factory autoHideControllerFactory,
+ Optional<TelecomManager> telecomManagerOptional,
+ InputMethodManager inputMethodManager) {
mContext = context;
mWindowManager = windowManager;
mAccessibilityManager = accessibilityManager;
@@ -531,6 +539,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNavigationBarA11yHelper = navigationBarA11yHelper;
mUserTracker = userTracker;
mNotificationShadeDepthController = notificationShadeDepthController;
+ mMainLightBarController = mainLightBarController;
+ mLightBarControllerFactory = lightBarControllerFactory;
+ mMainAutoHideController = mainAutoHideController;
+ mAutoHideControllerFactory = autoHideControllerFactory;
+ mTelecomManagerOptional = telecomManagerOptional;
+ mInputMethodManager = inputMethodManager;
mNavBarMode = mNavigationModeController.addListener(this);
}
@@ -548,7 +562,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView);
- mContext.getSystemService(WindowManager.class).addView(mFrame,
+ mWindowManager.addView(mFrame,
getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration
.getRotation()));
mDisplayId = mContext.getDisplayId();
@@ -606,8 +620,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
public void destroyView() {
setAutoHideController(/* autoHideController */ null);
mCommandQueue.removeCallback(this);
- mContext.getSystemService(WindowManager.class).removeViewImmediate(
- mNavigationBarView.getRootView());
+ mWindowManager.removeViewImmediate(mNavigationBarView.getRootView());
mNavigationModeController.removeListener(this);
mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener);
@@ -673,22 +686,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
// before notifications creation. We cannot directly use getLightBarController()
// from NavigationBarFragment directly.
LightBarController lightBarController = mIsOnDefaultDisplay
- ? Dependency.get(LightBarController.class)
- : new LightBarController(mContext,
- Dependency.get(DarkIconDispatcher.class),
- Dependency.get(BatteryController.class),
- Dependency.get(NavigationModeController.class),
- Dependency.get(DumpManager.class));
+ ? mMainLightBarController : mLightBarControllerFactory.create(mContext);
setLightBarController(lightBarController);
// 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
// add a new class maybe named DisplayDependency to solve
// per-display Dependency problem.
+ // Alternative: this is a good case for a Dagger subcomponent. Same with LightBarController.
AutoHideController autoHideController = mIsOnDefaultDisplay
- ? Dependency.get(AutoHideController.class)
- : new AutoHideController(mContext, mHandler,
- Dependency.get(IWindowManager.class));
+ ? mMainAutoHideController : mAutoHideControllerFactory.create(mContext);
setAutoHideController(autoHideController);
restoreAppearanceAndTransientState();
}
@@ -1183,9 +1190,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mHomeBlockedThisTouch = false;
- TelecomManager telecomManager =
- mContext.getSystemService(TelecomManager.class);
- if (telecomManager != null && telecomManager.isRinging()) {
+ if (mTelecomManagerOptional.isPresent()
+ && mTelecomManagerOptional.get().isRinging()) {
if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " +
"No heads up");
@@ -1267,7 +1273,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
}
private void onImeSwitcherClick(View v) {
- mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem(
+ mInputMethodManager.showInputMethodPickerFromSystem(
true /* showAuxiliarySubtypes */, mDisplayId);
};
@@ -1702,4 +1708,123 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
int getNavigationIconHints() {
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);
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index a1a630aca94c..8dc6b9966a4e 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -32,52 +32,30 @@ import android.util.SparseArray;
import android.view.Display;
import android.view.IWindowManager;
import android.view.View;
-import android.view.WindowManager;
import android.view.WindowManagerGlobal;
-import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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.settingslib.applications.InterestingConfigChanges;
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.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.model.SysUiState;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
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.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.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.DeviceProvisionedController;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
-import com.android.wm.shell.pip.Pip;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.Optional;
import javax.inject.Inject;
-import dagger.Lazy;
-
/** A controller to handle navigation bars. */
@SysUISingleton
@@ -90,36 +68,12 @@ public class NavigationBarController implements
private static final String TAG = NavigationBarController.class.getSimpleName();
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 NavigationBarA11yHelper mNavigationBarA11yHelper;
+ private final NavigationBar.Factory mNavigationBarFactory;
private final DisplayManager mDisplayManager;
- private final NavigationBarOverlayController mNavBarOverlayController;
private final TaskbarDelegate mTaskbarDelegate;
- private final NotificationShadeDepthController mNotificationShadeDepthController;
private int mNavMode;
@VisibleForTesting boolean mIsTablet;
- private final UserTracker mUserTracker;
/** A displayId - nav bar maps. */
@VisibleForTesting
@@ -132,72 +86,28 @@ public class NavigationBarController implements
@Inject
public NavigationBarController(Context context,
- WindowManager windowManager,
- Lazy<AssistManager> assistManagerLazy,
- AccessibilityManager accessibilityManager,
- AccessibilityManagerWrapper accessibilityManagerWrapper,
- 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,
- UiEventLogger uiEventLogger,
- NavigationBarOverlayController navBarOverlayController,
ConfigurationController configurationController,
NavigationBarA11yHelper navigationBarA11yHelper,
TaskbarDelegate taskbarDelegate,
- UserTracker userTracker,
+ NavigationBar.Factory navigationBarFactory,
DumpManager dumpManager) {
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;
- mNavigationBarA11yHelper = navigationBarA11yHelper;
+ mNavigationBarFactory = navigationBarFactory;
mDisplayManager = mContext.getSystemService(DisplayManager.class);
commandQueue.addCallback(this);
configurationController.addCallback(this);
mConfigChanges.applyNewConfig(mContext.getResources());
- mNavBarOverlayController = navBarOverlayController;
- mNavMode = mNavigationModeController.addListener(this);
- mNavigationModeController.addListener(this);
+ mNavMode = navigationModeController.addListener(this);
mTaskbarDelegate = taskbarDelegate;
mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService,
navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer);
mIsTablet = isTablet(mContext);
- mUserTracker = userTracker;
dumpManager.registerDumpable(this);
}
@@ -354,33 +264,8 @@ public class NavigationBarController implements
final Context context = isOnDefaultDisplay
? mContext
: mContext.createDisplayContext(display);
- NavigationBar navBar = new NavigationBar(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);
+ NavigationBar navBar = mNavigationBarFactory.create(context);
+
mNavigationBars.put(displayId, navBar);
View navigationBarView = navBar.createView(savedState);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
index aeb2efd2026a..b3f861293dc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
@@ -171,4 +171,23 @@ public class AutoHideController {
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);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index abee7a51f91f..3679682eb91c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -298,4 +298,33 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
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);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java
index d38284a26a07..479ca8f1ff96 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java
@@ -14,7 +14,6 @@
package com.android.systemui.statusbar.policy;
-import android.content.Context;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
@@ -35,8 +34,8 @@ public class AccessibilityManagerWrapper implements
private final AccessibilityManager mAccessibilityManager;
@Inject
- public AccessibilityManagerWrapper(Context context) {
- mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
+ public AccessibilityManagerWrapper(AccessibilityManager accessibilityManager) {
+ mAccessibilityManager = accessibilityManager;
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java
index c1a9739cb232..83493aabf4fe 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java
@@ -35,42 +35,23 @@ import static org.mockito.Mockito.verify;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.util.SparseArray;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityManager;
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.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.model.SysUiState;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
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.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.DeviceProvisionedController;
-import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
-import com.android.wm.shell.pip.Pip;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-
-import java.util.Optional;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
/** atest NavigationBarControllerTest */
@RunWith(AndroidTestingRunner.class)
@@ -78,46 +59,31 @@ import java.util.Optional;
@SmallTest
public class NavigationBarControllerTest extends SysuiTestCase {
+ private static final int SECONDARY_DISPLAY = 1;
+
private NavigationBarController mNavigationBarController;
private NavigationBar mDefaultNavBar;
private NavigationBar mSecondaryNavBar;
- private CommandQueue mCommandQueue = mock(CommandQueue.class);
-
- private static final int SECONDARY_DISPLAY = 1;
+ @Mock
+ private CommandQueue mCommandQueue;
+ @Mock
+ private NavigationBar.Factory mNavigationBarFactory;
@Before
public void setUp() {
+ MockitoAnnotations.initMocks(this);
mNavigationBarController = spy(
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(NavigationModeController.class),
- mock(AccessibilityButtonModeObserver.class),
- mock(StatusBarStateController.class),
mock(SysUiState.class),
- mock(BroadcastDispatcher.class),
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),
- mock(UiEventLogger.class),
- mock(NavigationBarOverlayController.class),
mock(ConfigurationController.class),
mock(NavigationBarA11yHelper.class),
mock(TaskbarDelegate.class),
- mock(UserTracker.class),
+ mNavigationBarFactory,
mock(DumpManager.class)));
initializeNavigationBars();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
index e37f4224060c..422db1ff9334 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java
@@ -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_IME_SHOWN;
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.view.Display.DEFAULT_DISPLAY;
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.assertFalse;
-import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -45,11 +45,11 @@ import android.content.Context;
import android.content.IntentFilter;
import android.hardware.display.DisplayManagerGlobal;
import android.os.Handler;
-import android.os.Looper;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.provider.Settings;
+import android.telecom.TelecomManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -60,12 +60,12 @@ import android.view.View;
import android.view.WindowManager;
import android.view.WindowMetrics;
import android.view.accessibility.AccessibilityManager;
+import android.view.inputmethod.InputMethodManager;
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.SysuiTestCase;
import com.android.systemui.SysuiTestableContext;
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.NotificationRemoteInputManager;
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.StatusBar;
-import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.utils.leaks.LeakCheckedTest;
@@ -110,7 +111,13 @@ public class NavigationBarTest extends SysuiTestCase {
private NavigationBar mExternalDisplayNavigationBar;
private SysuiTestableContext mSysuiTestableContextExternal;
+ @Mock
private OverviewProxyService mOverviewProxyService;
+ @Mock
+ private StatusBarStateController mStatusBarStateController;
+ @Mock
+ private NavigationModeController mNavigationModeController;
+ @Mock
private CommandQueue mCommandQueue;
private SysUiState mMockSysUiState;
@Mock
@@ -125,11 +132,25 @@ public class NavigationBarTest extends SysuiTestCase {
EdgeBackGestureHandler mEdgeBackGestureHandler;
@Mock
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
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
- private AccessibilityManagerWrapper mAccessibilityWrapper =
- new AccessibilityManagerWrapper(mContext);
@Before
public void setup() throws Exception {
@@ -137,15 +158,19 @@ public class NavigationBarTest extends SysuiTestCase {
when(mEdgeBackGestureHandlerFactory.create(any(Context.class)))
.thenReturn(mEdgeBackGestureHandler);
- mCommandQueue = new CommandQueue(mContext);
+ when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController);
+ when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController);
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(StatusBarStateController.class);
+ mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
mDependency.injectMockDependency(NavigationBarController.class);
- mOverviewProxyService = mDependency.injectMockDependency(OverviewProxyService.class);
mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class,
mEdgeBackGestureHandlerFactory);
+ mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService);
+ mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
TestableLooper.get(this).runWithLooper(() -> {
mNavigationBar = createNavBar(mContext);
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
@@ -164,23 +189,13 @@ public class NavigationBarTest extends SysuiTestCase {
mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext(
display);
- WindowManager windowManager = mock(WindowManager.class);
- Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay();
- when(windowManager.getDefaultDisplay()).thenReturn(
- defaultDisplay);
- WindowMetrics maximumWindowMetrics = mContext.getSystemService(WindowManager.class)
+ Display defaultDisplay = mContext.getDisplay();
+ when(mWindowManager.getDefaultDisplay()).thenReturn(defaultDisplay);
+ WindowMetrics metrics = mContext.getSystemService(WindowManager.class)
.getMaximumWindowMetrics();
- when(windowManager.getMaximumWindowMetrics()).thenReturn(maximumWindowMetrics);
- WindowMetrics currentWindowMetrics = mContext.getSystemService(WindowManager.class)
- .getCurrentWindowMetrics();
- 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);
-
+ when(mWindowManager.getMaximumWindowMetrics()).thenReturn(metrics);
+ doNothing().when(mWindowManager).addView(any(), any());
+ doNothing().when(mWindowManager).removeViewImmediate(any());
mMockSysUiState = mock(SysUiState.class);
when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState);
}
@@ -239,10 +254,8 @@ public class NavigationBarTest extends SysuiTestCase {
defaultNavBar.createView(null);
externalNavBar.createView(null);
- // Set IME window status for default NavBar.
- mCommandQueue.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
- BACK_DISPOSITION_DEFAULT, true, false);
- processAllMessages();
+ defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
+ BACK_DISPOSITION_DEFAULT, true);
// Verify IME window state will be updated in default NavBar & external NavBar state reset.
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_IME_SHOWN) != 0);
- // Set IME window status for external NavBar.
- mCommandQueue.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null,
- IME_VISIBLE, BACK_DISPOSITION_DEFAULT, true, false);
- processAllMessages();
-
+ externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE,
+ BACK_DISPOSITION_DEFAULT, true);
+ defaultNavBar.setImeWindowStatus(
+ DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false);
// Verify IME window state will be updated in external NavBar & default NavBar state reset.
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
externalNavBar.getNavigationIconHints());
@@ -280,19 +292,16 @@ public class NavigationBarTest extends SysuiTestCase {
DeviceProvisionedController deviceProvisionedController =
mock(DeviceProvisionedController.class);
when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
- assertNotNull(mAccessibilityWrapper);
- return spy(new NavigationBar(context,
- mock(WindowManager.class),
- () -> mock(AssistManager.class),
+ NavigationBar.Factory factory = new NavigationBar.Factory(
+ mWindowManager,
+ () -> mAssistManager,
mock(AccessibilityManager.class),
- context.getDisplayId() == DEFAULT_DISPLAY ? mAccessibilityWrapper
- : mock(AccessibilityManagerWrapper.class),
deviceProvisionedController,
new MetricsLogger(),
mOverviewProxyService,
- mock(NavigationModeController.class),
+ mNavigationModeController,
mock(AccessibilityButtonModeObserver.class),
- mock(StatusBarStateController.class),
+ mStatusBarStateController,
mMockSysUiState,
mBroadcastDispatcher,
mCommandQueue,
@@ -308,7 +317,14 @@ public class NavigationBarTest extends SysuiTestCase {
mock(NavigationBarOverlayController.class),
mUiEventLogger,
mNavigationBarA11yHelper,
- mock(UserTracker.class)));
+ mock(UserTracker.class),
+ mLightBarController,
+ mLightBarcontrollerFactory,
+ mAutoHideController,
+ mAutoHideControllerFactory,
+ Optional.of(mTelecomManager),
+ mInputMethodManager);
+ return spy(factory.create(context));
}
private void processAllMessages() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index 2416132d8b83..af624ed1ea1a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -15,6 +15,8 @@
package com.android.systemui.statusbar;
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.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
@@ -188,8 +190,13 @@ public class CommandQueueTest extends SysuiTestCase {
@Test
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);
waitForIdleSync();
+ verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(null), eq(IME_INVISIBLE),
+ eq(BACK_DISPOSITION_DEFAULT), eq(false));
verify(mCallbacks).setImeWindowStatus(
eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true));
}