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

This commit is contained in:
Wei Sheng Shih
2021-10-18 01:39:08 +00:00
committed by Android (Google) Code Review
9 changed files with 295 additions and 238 deletions

View File

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

View File

@@ -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,121 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
int getNavigationIconHints() {
return mNavigationIconHints;
}
}
/**
* Injectable factory for construction a {@link NavigationBar}.
*/
public static class Factory {
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(
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) {
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) {
final WindowManager wm = context.getSystemService(WindowManager.class);
return new NavigationBar(context, wm, mAssistManagerLazy,
mAccessibilityManager, mDeviceProvisionedController, mMetricsLogger,
mOverviewProxyService, mNavigationModeController,
mAccessibilityButtonModeObserver, mStatusBarStateController,
mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, mPipOptional,
mSplitScreenOptional, mRecentsOptional, mStatusBarOptionalLazy,
mShadeController, mNotificationRemoteInputManager,
mNotificationShadeDepthController, mSystemActions, mMainHandler,
mNavbarOverlayController, mUiEventLogger, mNavigationBarA11yHelper,
mUserTracker, mMainLightBarController, mLightBarControllerFactory,
mMainAutoHideController, mAutoHideControllerFactory, mTelecomManagerOptional,
mInputMethodManager);
}
}
}

View File

@@ -32,53 +32,31 @@ 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.AutoHideController;
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
@@ -91,36 +69,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
@@ -133,75 +87,30 @@ 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,
AutoHideController autoHideController) {
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.setDependencies(commandQueue, overviewProxyService,
navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer,
dumpManager, autoHideController);
mIsTablet = isTablet(mContext);
mUserTracker = userTracker;
dumpManager.registerDumpable(this);
}
@@ -357,33 +266,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);

View File

@@ -172,4 +172,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);
}
}
}

View File

@@ -16,6 +16,7 @@
package com.android.systemui.statusbar.phone;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
@@ -101,7 +102,9 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
mNavigationMode = mode;
});
dumpManager.registerDumpable(getClass().getSimpleName(), this);
if (ctx.getDisplayId() == DEFAULT_DISPLAY) {
dumpManager.registerDumpable(getClass().getSimpleName(), this);
}
}
public void setNavigationBar(LightBarTransitionsController navigationBar) {
@@ -298,4 +301,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);
}
}
}

View File

@@ -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

View File

@@ -35,43 +35,24 @@ 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.AutoHideController;
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)
@@ -79,46 +60,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),
mock(AutoHideController.class)));
initializeNavigationBars();

View File

@@ -19,6 +19,7 @@ package com.android.systemui.navigationbar;
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
import static android.app.StatusBarManager.NAVIGATION_HINT_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,25 +189,21 @@ 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);
when(mWindowManager.getMaximumWindowMetrics()).thenReturn(metrics);
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.getCurrentWindowMetrics()).thenReturn(currentWindowMetrics);
doNothing().when(mWindowManager).addView(any(), any());
doNothing().when(mWindowManager).removeViewImmediate(any());
mMockSysUiState = mock(SysUiState.class);
when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState);
mContext.addMockSystemService(WindowManager.class, mWindowManager);
mSysuiTestableContextExternal.addMockSystemService(WindowManager.class, mWindowManager);
}
@Test
@@ -239,10 +260,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 +269,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 +298,15 @@ 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(
() -> 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 +322,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() {

View File

@@ -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));
}