diff options
| author | 2021-09-28 12:45:39 +0000 | |
|---|---|---|
| committer | 2021-09-28 12:45:39 +0000 | |
| commit | 22fb5df008edd76ef8aef06954d4a1531c6bf6c2 (patch) | |
| tree | 8af184f678057cf64b8f595d896977d8b853b742 | |
| parent | b85da640d13ced31165c543e686bb47027bff54f (diff) | |
| parent | 9f8305196c46d130639bf40d05a049663aefd4a0 (diff) | |
Merge "Remove Dependency.get from NavigationBar." into sc-v2-dev
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)); } |