From be525911ceab3fc0cf727f7a9c8d204b480e0bf9 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Tue, 28 Sep 2021 17:23:33 +0000 Subject: [PATCH] Revert "Remove Dependency.get from NavigationBar." This reverts commit 9f8305196c46d130639bf40d05a049663aefd4a0. Reason for revert: http://b/201416807 Change-Id: Iab917251e00c3ab2ef9f44835728abd93eb16fa5 --- .../dagger/FrameworkServicesModule.java | 6 - .../systemui/navigationbar/NavigationBar.java | 177 +++--------------- .../NavigationBarController.java | 127 ++++++++++++- .../statusbar/phone/AutoHideController.java | 19 -- .../statusbar/phone/LightBarController.java | 29 --- .../policy/AccessibilityManagerWrapper.java | 5 +- .../NavigationBarControllerTest.java | 54 +++++- .../navigationbar/NavigationBarTest.java | 104 +++++----- .../systemui/statusbar/CommandQueueTest.java | 7 - 9 files changed, 238 insertions(+), 290 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java index b210a197f8eb1..4d1608fb445d0 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/FrameworkServicesModule.java @@ -365,12 +365,6 @@ public class FrameworkServicesModule { return context.getSystemService(TelecomManager.class); } - @Provides - @Singleton - static Optional provideOptionalTelecomManager(Context context) { - return Optional.ofNullable(context.getSystemService(TelecomManager.class)); - } - @Provides @Singleton static TelephonyManager provideTelephonyManager(Context context) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index d3a664ba5145a..8576a280c5601 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -93,6 +93,7 @@ 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; @@ -117,17 +118,20 @@ 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; @@ -147,6 +151,8 @@ 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; @@ -156,8 +162,6 @@ import java.util.Locale; import java.util.Optional; import java.util.function.Consumer; -import javax.inject.Inject; - import dagger.Lazy; /** @@ -239,13 +243,7 @@ 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 mTelecomManagerOptional; - private final InputMethodManager mInputMethodManager; @VisibleForTesting public int mDisplayId; @@ -269,7 +267,6 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener; private boolean mShowOrientedHandleForImmersiveMode; - @com.android.internal.annotations.VisibleForTesting public enum NavBarActionEvent implements UiEventLogger.UiEventEnum { @@ -481,10 +478,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } }; - private NavigationBar(Context context, + public NavigationBar(Context context, WindowManager windowManager, Lazy assistManagerLazy, AccessibilityManager accessibilityManager, + AccessibilityManagerWrapper accessibilityManagerWrapper, DeviceProvisionedController deviceProvisionedController, MetricsLogger metricsLogger, OverviewProxyService overviewProxyService, @@ -506,13 +504,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, NavigationBarOverlayController navbarOverlayController, UiEventLogger uiEventLogger, NavigationBarA11yHelper navigationBarA11yHelper, - UserTracker userTracker, - LightBarController mainLightBarController, - LightBarController.Factory lightBarControllerFactory, - AutoHideController mainAutoHideController, - AutoHideController.Factory autoHideControllerFactory, - Optional telecomManagerOptional, - InputMethodManager inputMethodManager) { + UserTracker userTracker) { mContext = context; mWindowManager = windowManager; mAccessibilityManager = accessibilityManager; @@ -539,12 +531,6 @@ 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); } @@ -562,7 +548,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); - mWindowManager.addView(mFrame, + mContext.getSystemService(WindowManager.class).addView(mFrame, getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration .getRotation())); mDisplayId = mContext.getDisplayId(); @@ -620,7 +606,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, public void destroyView() { setAutoHideController(/* autoHideController */ null); mCommandQueue.removeCallback(this); - mWindowManager.removeViewImmediate(mNavigationBarView.getRootView()); + mContext.getSystemService(WindowManager.class).removeViewImmediate( + mNavigationBarView.getRootView()); mNavigationModeController.removeListener(this); mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener); @@ -686,16 +673,22 @@ public class NavigationBar implements View.OnAttachStateChangeListener, // before notifications creation. We cannot directly use getLightBarController() // from NavigationBarFragment directly. LightBarController lightBarController = mIsOnDefaultDisplay - ? mMainLightBarController : mLightBarControllerFactory.create(mContext); + ? Dependency.get(LightBarController.class) + : new LightBarController(mContext, + Dependency.get(DarkIconDispatcher.class), + Dependency.get(BatteryController.class), + Dependency.get(NavigationModeController.class), + Dependency.get(DumpManager.class)); 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 - ? mMainAutoHideController : mAutoHideControllerFactory.create(mContext); + ? Dependency.get(AutoHideController.class) + : new AutoHideController(mContext, mHandler, + Dependency.get(IWindowManager.class)); setAutoHideController(autoHideController); restoreAppearanceAndTransientState(); } @@ -1190,8 +1183,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener, switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mHomeBlockedThisTouch = false; - if (mTelecomManagerOptional.isPresent() - && mTelecomManagerOptional.get().isRinging()) { + TelecomManager telecomManager = + mContext.getSystemService(TelecomManager.class); + if (telecomManager != null && telecomManager.isRinging()) { if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) { Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " + "No heads up"); @@ -1273,7 +1267,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } private void onImeSwitcherClick(View v) { - mInputMethodManager.showInputMethodPickerFromSystem( + mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem( true /* showAuxiliarySubtypes */, mDisplayId); }; @@ -1708,123 +1702,4 @@ 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 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 mPipOptional; - private final Optional mSplitScreenOptional; - private final Optional mRecentsOptional; - private final Lazy> 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 mTelecomManagerOptional; - private final InputMethodManager mInputMethodManager; - - @Inject - public Factory( - WindowManager windowManager, - Lazy assistManagerLazy, - AccessibilityManager accessibilityManager, - DeviceProvisionedController deviceProvisionedController, - MetricsLogger metricsLogger, - OverviewProxyService overviewProxyService, - NavigationModeController navigationModeController, - AccessibilityButtonModeObserver accessibilityButtonModeObserver, - StatusBarStateController statusBarStateController, - SysUiState sysUiFlagsContainer, - BroadcastDispatcher broadcastDispatcher, - CommandQueue commandQueue, - Optional pipOptional, - Optional splitScreenOptional, - Optional recentsOptional, - Lazy> 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 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 8dc6b9966a4e3..a1a630aca94c4 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -32,30 +32,52 @@ 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 @@ -68,12 +90,36 @@ public class NavigationBarController implements private static final String TAG = NavigationBarController.class.getSimpleName(); private final Context mContext; + private final WindowManager mWindowManager; + private final Lazy 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 mPipOptional; + private final Optional mSplitScreenOptional; + private final Optional mRecentsOptional; + private final Lazy> mStatusBarOptionalLazy; + private final ShadeController mShadeController; + private final NotificationRemoteInputManager mNotificationRemoteInputManager; + private final SystemActions mSystemActions; + private final UiEventLogger mUiEventLogger; private final Handler mHandler; - private final NavigationBar.Factory mNavigationBarFactory; + private final NavigationBarA11yHelper mNavigationBarA11yHelper; 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 @@ -86,28 +132,72 @@ public class NavigationBarController implements @Inject public NavigationBarController(Context context, + WindowManager windowManager, + Lazy assistManagerLazy, + AccessibilityManager accessibilityManager, + AccessibilityManagerWrapper accessibilityManagerWrapper, + DeviceProvisionedController deviceProvisionedController, + MetricsLogger metricsLogger, OverviewProxyService overviewProxyService, NavigationModeController navigationModeController, + AccessibilityButtonModeObserver accessibilityButtonModeObserver, + StatusBarStateController statusBarStateController, SysUiState sysUiFlagsContainer, + BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue, + Optional pipOptional, + Optional splitScreenOptional, + Optional recentsOptional, + Lazy> statusBarOptionalLazy, + ShadeController shadeController, + NotificationRemoteInputManager notificationRemoteInputManager, + NotificationShadeDepthController notificationShadeDepthController, + SystemActions systemActions, @Main Handler mainHandler, + UiEventLogger uiEventLogger, + NavigationBarOverlayController navBarOverlayController, ConfigurationController configurationController, NavigationBarA11yHelper navigationBarA11yHelper, TaskbarDelegate taskbarDelegate, - NavigationBar.Factory navigationBarFactory, + UserTracker userTracker, 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; - mNavigationBarFactory = navigationBarFactory; + mNavigationBarA11yHelper = navigationBarA11yHelper; mDisplayManager = mContext.getSystemService(DisplayManager.class); commandQueue.addCallback(this); configurationController.addCallback(this); mConfigChanges.applyNewConfig(mContext.getResources()); - mNavMode = navigationModeController.addListener(this); + mNavBarOverlayController = navBarOverlayController; + mNavMode = mNavigationModeController.addListener(this); + mNavigationModeController.addListener(this); mTaskbarDelegate = taskbarDelegate; mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService, navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer); mIsTablet = isTablet(mContext); + mUserTracker = userTracker; dumpManager.registerDumpable(this); } @@ -264,8 +354,33 @@ public class NavigationBarController implements final Context context = isOnDefaultDisplay ? mContext : mContext.createDisplayContext(display); - NavigationBar navBar = mNavigationBarFactory.create(context); - + 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); 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 b3f861293dc54..aeb2efd2026a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java @@ -171,23 +171,4 @@ 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 3679682eb91c2..abee7a51f91f5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -298,33 +298,4 @@ 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 479ca8f1ff96e..d38284a26a07f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessibilityManagerWrapper.java @@ -14,6 +14,7 @@ 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; @@ -34,8 +35,8 @@ public class AccessibilityManagerWrapper implements private final AccessibilityManager mAccessibilityManager; @Inject - public AccessibilityManagerWrapper(AccessibilityManager accessibilityManager) { - mAccessibilityManager = accessibilityManager; + public AccessibilityManagerWrapper(Context context) { + mAccessibilityManager = context.getSystemService(AccessibilityManager.class); } @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 83493aabf4fef..c1a9739cb2326 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java @@ -35,23 +35,42 @@ 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 org.mockito.Mock; -import org.mockito.MockitoAnnotations; + +import java.util.Optional; /** atest NavigationBarControllerTest */ @RunWith(AndroidTestingRunner.class) @@ -59,31 +78,46 @@ import org.mockito.MockitoAnnotations; @SmallTest public class NavigationBarControllerTest extends SysuiTestCase { - private static final int SECONDARY_DISPLAY = 1; - private NavigationBarController mNavigationBarController; private NavigationBar mDefaultNavBar; private NavigationBar mSecondaryNavBar; - @Mock - private CommandQueue mCommandQueue; - @Mock - private NavigationBar.Factory mNavigationBarFactory; + private CommandQueue mCommandQueue = mock(CommandQueue.class); + + private static final int SECONDARY_DISPLAY = 1; @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), - mNavigationBarFactory, + mock(UserTracker.class), 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 422db1ff9334c..e37f4224060cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -19,7 +19,6 @@ 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; @@ -29,6 +28,7 @@ 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,10 +81,9 @@ 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; @@ -111,13 +110,7 @@ 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 @@ -132,25 +125,11 @@ 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 { @@ -158,19 +137,15 @@ public class NavigationBarTest extends SysuiTestCase { when(mEdgeBackGestureHandlerFactory.create(any(Context.class))) .thenReturn(mEdgeBackGestureHandler); - when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController); - when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController); + mCommandQueue = new CommandQueue(mContext); setupSysuiDependency(); - // This class inflates views that call Dependency.get, thus these injections are still - // necessary. - mDependency.injectTestDependency(AssistManager.class, mAssistManager); + mDependency.injectMockDependency(AssistManager.class); mDependency.injectMockDependency(KeyguardStateController.class); - mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); + mDependency.injectMockDependency(StatusBarStateController.class); 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); @@ -189,13 +164,23 @@ public class NavigationBarTest extends SysuiTestCase { mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext( display); - Display defaultDisplay = mContext.getDisplay(); - when(mWindowManager.getDefaultDisplay()).thenReturn(defaultDisplay); - WindowMetrics metrics = mContext.getSystemService(WindowManager.class) + WindowManager windowManager = mock(WindowManager.class); + Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay(); + when(windowManager.getDefaultDisplay()).thenReturn( + defaultDisplay); + WindowMetrics maximumWindowMetrics = mContext.getSystemService(WindowManager.class) .getMaximumWindowMetrics(); - when(mWindowManager.getMaximumWindowMetrics()).thenReturn(metrics); - doNothing().when(mWindowManager).addView(any(), any()); - doNothing().when(mWindowManager).removeViewImmediate(any()); + 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); + mMockSysUiState = mock(SysUiState.class); when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState); } @@ -254,8 +239,10 @@ public class NavigationBarTest extends SysuiTestCase { defaultNavBar.createView(null); externalNavBar.createView(null); - defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, - BACK_DISPOSITION_DEFAULT, true); + // Set IME window status for default NavBar. + mCommandQueue.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, + BACK_DISPOSITION_DEFAULT, true, false); + processAllMessages(); // Verify IME window state will be updated in default NavBar & external NavBar state reset. assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN, @@ -263,10 +250,11 @@ public class NavigationBarTest extends SysuiTestCase { assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); - externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE, - BACK_DISPOSITION_DEFAULT, true); - defaultNavBar.setImeWindowStatus( - DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false); + // Set IME window status for external NavBar. + mCommandQueue.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, + IME_VISIBLE, BACK_DISPOSITION_DEFAULT, true, false); + processAllMessages(); + // 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()); @@ -292,16 +280,19 @@ public class NavigationBarTest extends SysuiTestCase { DeviceProvisionedController deviceProvisionedController = mock(DeviceProvisionedController.class); when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true); - NavigationBar.Factory factory = new NavigationBar.Factory( - mWindowManager, - () -> mAssistManager, + assertNotNull(mAccessibilityWrapper); + return spy(new NavigationBar(context, + mock(WindowManager.class), + () -> mock(AssistManager.class), mock(AccessibilityManager.class), + context.getDisplayId() == DEFAULT_DISPLAY ? mAccessibilityWrapper + : mock(AccessibilityManagerWrapper.class), deviceProvisionedController, new MetricsLogger(), mOverviewProxyService, - mNavigationModeController, + mock(NavigationModeController.class), mock(AccessibilityButtonModeObserver.class), - mStatusBarStateController, + mock(StatusBarStateController.class), mMockSysUiState, mBroadcastDispatcher, mCommandQueue, @@ -317,14 +308,7 @@ public class NavigationBarTest extends SysuiTestCase { mock(NavigationBarOverlayController.class), mUiEventLogger, mNavigationBarA11yHelper, - mock(UserTracker.class), - mLightBarController, - mLightBarcontrollerFactory, - mAutoHideController, - mAutoHideControllerFactory, - Optional.of(mTelecomManager), - mInputMethodManager); - return spy(factory.create(context)); + mock(UserTracker.class))); } 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 af624ed1ea1a0..2416132d8b834 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -15,8 +15,6 @@ 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; @@ -190,13 +188,8 @@ 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)); }