Merge "Remove Dependency.get from NavigationBar." into sc-v2-dev am: 22fb5df008
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15909679 Change-Id: Ief123b421b9291b30846705737b84db36ae8fbea
This commit is contained in:
@@ -365,6 +365,12 @@ public class FrameworkServicesModule {
|
|||||||
return context.getSystemService(TelecomManager.class);
|
return context.getSystemService(TelecomManager.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
static Optional<TelecomManager> provideOptionalTelecomManager(Context context) {
|
||||||
|
return Optional.ofNullable(context.getSystemService(TelecomManager.class));
|
||||||
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
static TelephonyManager provideTelephonyManager(Context context) {
|
static TelephonyManager provideTelephonyManager(Context context) {
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ import android.util.Log;
|
|||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.HapticFeedbackConstants;
|
import android.view.HapticFeedbackConstants;
|
||||||
import android.view.IWindowManager;
|
|
||||||
import android.view.InsetsState.InternalInsetsType;
|
import android.view.InsetsState.InternalInsetsType;
|
||||||
import android.view.InsetsVisibilities;
|
import android.view.InsetsVisibilities;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
@@ -118,20 +117,17 @@ import com.android.internal.logging.UiEventLogger;
|
|||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.internal.util.LatencyTracker;
|
import com.android.internal.util.LatencyTracker;
|
||||||
import com.android.internal.view.AppearanceRegion;
|
import com.android.internal.view.AppearanceRegion;
|
||||||
import com.android.systemui.Dependency;
|
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
|
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
|
||||||
import com.android.systemui.accessibility.SystemActions;
|
import com.android.systemui.accessibility.SystemActions;
|
||||||
import com.android.systemui.assist.AssistManager;
|
import com.android.systemui.assist.AssistManager;
|
||||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.dump.DumpManager;
|
|
||||||
import com.android.systemui.model.SysUiState;
|
import com.android.systemui.model.SysUiState;
|
||||||
import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
|
import com.android.systemui.navigationbar.buttons.ButtonDispatcher;
|
||||||
import com.android.systemui.navigationbar.buttons.KeyButtonView;
|
import com.android.systemui.navigationbar.buttons.KeyButtonView;
|
||||||
import com.android.systemui.navigationbar.buttons.RotationContextButton;
|
import com.android.systemui.navigationbar.buttons.RotationContextButton;
|
||||||
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
|
import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
|
||||||
import com.android.systemui.plugins.DarkIconDispatcher;
|
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
import com.android.systemui.recents.Recents;
|
import com.android.systemui.recents.Recents;
|
||||||
@@ -151,8 +147,6 @@ import com.android.systemui.statusbar.phone.BarTransitions;
|
|||||||
import com.android.systemui.statusbar.phone.LightBarController;
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.phone.ShadeController;
|
import com.android.systemui.statusbar.phone.ShadeController;
|
||||||
import com.android.systemui.statusbar.phone.StatusBar;
|
import com.android.systemui.statusbar.phone.StatusBar;
|
||||||
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
|
||||||
import com.android.systemui.statusbar.policy.BatteryController;
|
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||||
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
|
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
|
||||||
import com.android.wm.shell.pip.Pip;
|
import com.android.wm.shell.pip.Pip;
|
||||||
@@ -162,6 +156,8 @@ import java.util.Locale;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import dagger.Lazy;
|
import dagger.Lazy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -243,7 +239,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
private boolean mTransientShown;
|
private boolean mTransientShown;
|
||||||
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
|
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
|
||||||
private LightBarController mLightBarController;
|
private LightBarController mLightBarController;
|
||||||
|
private final LightBarController mMainLightBarController;
|
||||||
|
private final LightBarController.Factory mLightBarControllerFactory;
|
||||||
private AutoHideController mAutoHideController;
|
private AutoHideController mAutoHideController;
|
||||||
|
private final AutoHideController mMainAutoHideController;
|
||||||
|
private final AutoHideController.Factory mAutoHideControllerFactory;
|
||||||
|
private final Optional<TelecomManager> mTelecomManagerOptional;
|
||||||
|
private final InputMethodManager mInputMethodManager;
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public int mDisplayId;
|
public int mDisplayId;
|
||||||
@@ -267,6 +269,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener;
|
private ViewTreeObserver.OnGlobalLayoutListener mOrientationHandleGlobalLayoutListener;
|
||||||
private boolean mShowOrientedHandleForImmersiveMode;
|
private boolean mShowOrientedHandleForImmersiveMode;
|
||||||
|
|
||||||
|
|
||||||
@com.android.internal.annotations.VisibleForTesting
|
@com.android.internal.annotations.VisibleForTesting
|
||||||
public enum NavBarActionEvent implements UiEventLogger.UiEventEnum {
|
public enum NavBarActionEvent implements UiEventLogger.UiEventEnum {
|
||||||
|
|
||||||
@@ -478,11 +481,10 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
public NavigationBar(Context context,
|
private NavigationBar(Context context,
|
||||||
WindowManager windowManager,
|
WindowManager windowManager,
|
||||||
Lazy<AssistManager> assistManagerLazy,
|
Lazy<AssistManager> assistManagerLazy,
|
||||||
AccessibilityManager accessibilityManager,
|
AccessibilityManager accessibilityManager,
|
||||||
AccessibilityManagerWrapper accessibilityManagerWrapper,
|
|
||||||
DeviceProvisionedController deviceProvisionedController,
|
DeviceProvisionedController deviceProvisionedController,
|
||||||
MetricsLogger metricsLogger,
|
MetricsLogger metricsLogger,
|
||||||
OverviewProxyService overviewProxyService,
|
OverviewProxyService overviewProxyService,
|
||||||
@@ -504,7 +506,13 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
NavigationBarOverlayController navbarOverlayController,
|
NavigationBarOverlayController navbarOverlayController,
|
||||||
UiEventLogger uiEventLogger,
|
UiEventLogger uiEventLogger,
|
||||||
NavigationBarA11yHelper navigationBarA11yHelper,
|
NavigationBarA11yHelper navigationBarA11yHelper,
|
||||||
UserTracker userTracker) {
|
UserTracker userTracker,
|
||||||
|
LightBarController mainLightBarController,
|
||||||
|
LightBarController.Factory lightBarControllerFactory,
|
||||||
|
AutoHideController mainAutoHideController,
|
||||||
|
AutoHideController.Factory autoHideControllerFactory,
|
||||||
|
Optional<TelecomManager> telecomManagerOptional,
|
||||||
|
InputMethodManager inputMethodManager) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mWindowManager = windowManager;
|
mWindowManager = windowManager;
|
||||||
mAccessibilityManager = accessibilityManager;
|
mAccessibilityManager = accessibilityManager;
|
||||||
@@ -531,6 +539,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
mNavigationBarA11yHelper = navigationBarA11yHelper;
|
mNavigationBarA11yHelper = navigationBarA11yHelper;
|
||||||
mUserTracker = userTracker;
|
mUserTracker = userTracker;
|
||||||
mNotificationShadeDepthController = notificationShadeDepthController;
|
mNotificationShadeDepthController = notificationShadeDepthController;
|
||||||
|
mMainLightBarController = mainLightBarController;
|
||||||
|
mLightBarControllerFactory = lightBarControllerFactory;
|
||||||
|
mMainAutoHideController = mainAutoHideController;
|
||||||
|
mAutoHideControllerFactory = autoHideControllerFactory;
|
||||||
|
mTelecomManagerOptional = telecomManagerOptional;
|
||||||
|
mInputMethodManager = inputMethodManager;
|
||||||
|
|
||||||
mNavBarMode = mNavigationModeController.addListener(this);
|
mNavBarMode = mNavigationModeController.addListener(this);
|
||||||
}
|
}
|
||||||
@@ -548,7 +562,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
|
mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
|
||||||
|
|
||||||
if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView);
|
if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView);
|
||||||
mContext.getSystemService(WindowManager.class).addView(mFrame,
|
mWindowManager.addView(mFrame,
|
||||||
getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration
|
getBarLayoutParams(mContext.getResources().getConfiguration().windowConfiguration
|
||||||
.getRotation()));
|
.getRotation()));
|
||||||
mDisplayId = mContext.getDisplayId();
|
mDisplayId = mContext.getDisplayId();
|
||||||
@@ -606,8 +620,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
public void destroyView() {
|
public void destroyView() {
|
||||||
setAutoHideController(/* autoHideController */ null);
|
setAutoHideController(/* autoHideController */ null);
|
||||||
mCommandQueue.removeCallback(this);
|
mCommandQueue.removeCallback(this);
|
||||||
mContext.getSystemService(WindowManager.class).removeViewImmediate(
|
mWindowManager.removeViewImmediate(mNavigationBarView.getRootView());
|
||||||
mNavigationBarView.getRootView());
|
|
||||||
mNavigationModeController.removeListener(this);
|
mNavigationModeController.removeListener(this);
|
||||||
|
|
||||||
mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener);
|
mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener);
|
||||||
@@ -673,22 +686,16 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
// before notifications creation. We cannot directly use getLightBarController()
|
// before notifications creation. We cannot directly use getLightBarController()
|
||||||
// from NavigationBarFragment directly.
|
// from NavigationBarFragment directly.
|
||||||
LightBarController lightBarController = mIsOnDefaultDisplay
|
LightBarController lightBarController = mIsOnDefaultDisplay
|
||||||
? Dependency.get(LightBarController.class)
|
? mMainLightBarController : mLightBarControllerFactory.create(mContext);
|
||||||
: new LightBarController(mContext,
|
|
||||||
Dependency.get(DarkIconDispatcher.class),
|
|
||||||
Dependency.get(BatteryController.class),
|
|
||||||
Dependency.get(NavigationModeController.class),
|
|
||||||
Dependency.get(DumpManager.class));
|
|
||||||
setLightBarController(lightBarController);
|
setLightBarController(lightBarController);
|
||||||
|
|
||||||
// TODO(b/118592525): to support multi-display, we start to add something which is
|
// TODO(b/118592525): to support multi-display, we start to add something which is
|
||||||
// per-display, while others may be global. I think it's time to
|
// per-display, while others may be global. I think it's time to
|
||||||
// add a new class maybe named DisplayDependency to solve
|
// add a new class maybe named DisplayDependency to solve
|
||||||
// per-display Dependency problem.
|
// per-display Dependency problem.
|
||||||
|
// Alternative: this is a good case for a Dagger subcomponent. Same with LightBarController.
|
||||||
AutoHideController autoHideController = mIsOnDefaultDisplay
|
AutoHideController autoHideController = mIsOnDefaultDisplay
|
||||||
? Dependency.get(AutoHideController.class)
|
? mMainAutoHideController : mAutoHideControllerFactory.create(mContext);
|
||||||
: new AutoHideController(mContext, mHandler,
|
|
||||||
Dependency.get(IWindowManager.class));
|
|
||||||
setAutoHideController(autoHideController);
|
setAutoHideController(autoHideController);
|
||||||
restoreAppearanceAndTransientState();
|
restoreAppearanceAndTransientState();
|
||||||
}
|
}
|
||||||
@@ -1183,9 +1190,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
switch (event.getAction()) {
|
switch (event.getAction()) {
|
||||||
case MotionEvent.ACTION_DOWN:
|
case MotionEvent.ACTION_DOWN:
|
||||||
mHomeBlockedThisTouch = false;
|
mHomeBlockedThisTouch = false;
|
||||||
TelecomManager telecomManager =
|
if (mTelecomManagerOptional.isPresent()
|
||||||
mContext.getSystemService(TelecomManager.class);
|
&& mTelecomManagerOptional.get().isRinging()) {
|
||||||
if (telecomManager != null && telecomManager.isRinging()) {
|
|
||||||
if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
|
if (statusBarOptional.map(StatusBar::isKeyguardShowing).orElse(false)) {
|
||||||
Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " +
|
Log.i(TAG, "Ignoring HOME; there's a ringing incoming call. " +
|
||||||
"No heads up");
|
"No heads up");
|
||||||
@@ -1267,7 +1273,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onImeSwitcherClick(View v) {
|
private void onImeSwitcherClick(View v) {
|
||||||
mContext.getSystemService(InputMethodManager.class).showInputMethodPickerFromSystem(
|
mInputMethodManager.showInputMethodPickerFromSystem(
|
||||||
true /* showAuxiliarySubtypes */, mDisplayId);
|
true /* showAuxiliarySubtypes */, mDisplayId);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1702,4 +1708,123 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
|
|||||||
int getNavigationIconHints() {
|
int getNavigationIconHints() {
|
||||||
return mNavigationIconHints;
|
return mNavigationIconHints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injectable factory for construction a {@link NavigationBar}.
|
||||||
|
*/
|
||||||
|
public static class Factory {
|
||||||
|
private final WindowManager mWindowManager;
|
||||||
|
private final Lazy<AssistManager> mAssistManagerLazy;
|
||||||
|
private final AccessibilityManager mAccessibilityManager;
|
||||||
|
private final DeviceProvisionedController mDeviceProvisionedController;
|
||||||
|
private final MetricsLogger mMetricsLogger;
|
||||||
|
private final OverviewProxyService mOverviewProxyService;
|
||||||
|
private final NavigationModeController mNavigationModeController;
|
||||||
|
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
|
||||||
|
private final StatusBarStateController mStatusBarStateController;
|
||||||
|
private final SysUiState mSysUiFlagsContainer;
|
||||||
|
private final BroadcastDispatcher mBroadcastDispatcher;
|
||||||
|
private final CommandQueue mCommandQueue;
|
||||||
|
private final Optional<Pip> mPipOptional;
|
||||||
|
private final Optional<LegacySplitScreen> mSplitScreenOptional;
|
||||||
|
private final Optional<Recents> mRecentsOptional;
|
||||||
|
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
|
||||||
|
private final ShadeController mShadeController;
|
||||||
|
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
|
||||||
|
private final NotificationShadeDepthController mNotificationShadeDepthController;
|
||||||
|
private final SystemActions mSystemActions;
|
||||||
|
private final Handler mMainHandler;
|
||||||
|
private final NavigationBarOverlayController mNavbarOverlayController;
|
||||||
|
private final UiEventLogger mUiEventLogger;
|
||||||
|
private final NavigationBarA11yHelper mNavigationBarA11yHelper;
|
||||||
|
private final UserTracker mUserTracker;
|
||||||
|
private final LightBarController mMainLightBarController;
|
||||||
|
private final LightBarController.Factory mLightBarControllerFactory;
|
||||||
|
private final AutoHideController mMainAutoHideController;
|
||||||
|
private final AutoHideController.Factory mAutoHideControllerFactory;
|
||||||
|
private final Optional<TelecomManager> mTelecomManagerOptional;
|
||||||
|
private final InputMethodManager mInputMethodManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public Factory(
|
||||||
|
WindowManager windowManager,
|
||||||
|
Lazy<AssistManager> assistManagerLazy,
|
||||||
|
AccessibilityManager accessibilityManager,
|
||||||
|
DeviceProvisionedController deviceProvisionedController,
|
||||||
|
MetricsLogger metricsLogger,
|
||||||
|
OverviewProxyService overviewProxyService,
|
||||||
|
NavigationModeController navigationModeController,
|
||||||
|
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
|
||||||
|
StatusBarStateController statusBarStateController,
|
||||||
|
SysUiState sysUiFlagsContainer,
|
||||||
|
BroadcastDispatcher broadcastDispatcher,
|
||||||
|
CommandQueue commandQueue,
|
||||||
|
Optional<Pip> pipOptional,
|
||||||
|
Optional<LegacySplitScreen> splitScreenOptional,
|
||||||
|
Optional<Recents> recentsOptional,
|
||||||
|
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
|
||||||
|
ShadeController shadeController,
|
||||||
|
NotificationRemoteInputManager notificationRemoteInputManager,
|
||||||
|
NotificationShadeDepthController notificationShadeDepthController,
|
||||||
|
SystemActions systemActions,
|
||||||
|
@Main Handler mainHandler,
|
||||||
|
NavigationBarOverlayController navbarOverlayController,
|
||||||
|
UiEventLogger uiEventLogger,
|
||||||
|
NavigationBarA11yHelper navigationBarA11yHelper,
|
||||||
|
UserTracker userTracker,
|
||||||
|
LightBarController mainLightBarController,
|
||||||
|
LightBarController.Factory lightBarControllerFactory,
|
||||||
|
AutoHideController mainAutoHideController,
|
||||||
|
AutoHideController.Factory autoHideControllerFactory,
|
||||||
|
Optional<TelecomManager> telecomManagerOptional,
|
||||||
|
InputMethodManager inputMethodManager) {
|
||||||
|
mWindowManager = windowManager;
|
||||||
|
mAssistManagerLazy = assistManagerLazy;
|
||||||
|
mAccessibilityManager = accessibilityManager;
|
||||||
|
mDeviceProvisionedController = deviceProvisionedController;
|
||||||
|
mMetricsLogger = metricsLogger;
|
||||||
|
mOverviewProxyService = overviewProxyService;
|
||||||
|
mNavigationModeController = navigationModeController;
|
||||||
|
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
|
||||||
|
mStatusBarStateController = statusBarStateController;
|
||||||
|
mSysUiFlagsContainer = sysUiFlagsContainer;
|
||||||
|
mBroadcastDispatcher = broadcastDispatcher;
|
||||||
|
mCommandQueue = commandQueue;
|
||||||
|
mPipOptional = pipOptional;
|
||||||
|
mSplitScreenOptional = splitScreenOptional;
|
||||||
|
mRecentsOptional = recentsOptional;
|
||||||
|
mStatusBarOptionalLazy = statusBarOptionalLazy;
|
||||||
|
mShadeController = shadeController;
|
||||||
|
mNotificationRemoteInputManager = notificationRemoteInputManager;
|
||||||
|
mNotificationShadeDepthController = notificationShadeDepthController;
|
||||||
|
mSystemActions = systemActions;
|
||||||
|
mMainHandler = mainHandler;
|
||||||
|
mNavbarOverlayController = navbarOverlayController;
|
||||||
|
mUiEventLogger = uiEventLogger;
|
||||||
|
mNavigationBarA11yHelper = navigationBarA11yHelper;
|
||||||
|
mUserTracker = userTracker;
|
||||||
|
mMainLightBarController = mainLightBarController;
|
||||||
|
mLightBarControllerFactory = lightBarControllerFactory;
|
||||||
|
mMainAutoHideController = mainAutoHideController;
|
||||||
|
mAutoHideControllerFactory = autoHideControllerFactory;
|
||||||
|
mTelecomManagerOptional = telecomManagerOptional;
|
||||||
|
mInputMethodManager = inputMethodManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Construct a {@link NavigationBar} */
|
||||||
|
public NavigationBar create(Context context) {
|
||||||
|
return new NavigationBar(context, mWindowManager, mAssistManagerLazy,
|
||||||
|
mAccessibilityManager, mDeviceProvisionedController, mMetricsLogger,
|
||||||
|
mOverviewProxyService, mNavigationModeController,
|
||||||
|
mAccessibilityButtonModeObserver, mStatusBarStateController,
|
||||||
|
mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, mPipOptional,
|
||||||
|
mSplitScreenOptional, mRecentsOptional, mStatusBarOptionalLazy,
|
||||||
|
mShadeController, mNotificationRemoteInputManager,
|
||||||
|
mNotificationShadeDepthController, mSystemActions, mMainHandler,
|
||||||
|
mNavbarOverlayController, mUiEventLogger, mNavigationBarA11yHelper,
|
||||||
|
mUserTracker, mMainLightBarController, mLightBarControllerFactory,
|
||||||
|
mMainAutoHideController, mAutoHideControllerFactory, mTelecomManagerOptional,
|
||||||
|
mInputMethodManager);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -32,52 +32,30 @@ import android.util.SparseArray;
|
|||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
import android.view.IWindowManager;
|
import android.view.IWindowManager;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.view.WindowManagerGlobal;
|
import android.view.WindowManagerGlobal;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.logging.MetricsLogger;
|
|
||||||
import com.android.internal.logging.UiEventLogger;
|
|
||||||
import com.android.internal.statusbar.RegisterStatusBarResult;
|
import com.android.internal.statusbar.RegisterStatusBarResult;
|
||||||
import com.android.settingslib.applications.InterestingConfigChanges;
|
import com.android.settingslib.applications.InterestingConfigChanges;
|
||||||
import com.android.systemui.Dumpable;
|
import com.android.systemui.Dumpable;
|
||||||
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
|
|
||||||
import com.android.systemui.accessibility.SystemActions;
|
|
||||||
import com.android.systemui.assist.AssistManager;
|
|
||||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
|
||||||
import com.android.systemui.dagger.SysUISingleton;
|
import com.android.systemui.dagger.SysUISingleton;
|
||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.model.SysUiState;
|
import com.android.systemui.model.SysUiState;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
import com.android.systemui.recents.Recents;
|
|
||||||
import com.android.systemui.settings.UserTracker;
|
|
||||||
import com.android.systemui.statusbar.CommandQueue;
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
import com.android.systemui.statusbar.CommandQueue.Callbacks;
|
import com.android.systemui.statusbar.CommandQueue.Callbacks;
|
||||||
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
|
||||||
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
|
||||||
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
|
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
|
||||||
import com.android.systemui.statusbar.phone.ShadeController;
|
|
||||||
import com.android.systemui.statusbar.phone.StatusBar;
|
|
||||||
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
|
||||||
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
|
|
||||||
import com.android.wm.shell.pip.Pip;
|
|
||||||
|
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import dagger.Lazy;
|
|
||||||
|
|
||||||
|
|
||||||
/** A controller to handle navigation bars. */
|
/** A controller to handle navigation bars. */
|
||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
@@ -90,36 +68,12 @@ public class NavigationBarController implements
|
|||||||
private static final String TAG = NavigationBarController.class.getSimpleName();
|
private static final String TAG = NavigationBarController.class.getSimpleName();
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final WindowManager mWindowManager;
|
|
||||||
private final Lazy<AssistManager> mAssistManagerLazy;
|
|
||||||
private final AccessibilityManager mAccessibilityManager;
|
|
||||||
private final AccessibilityManagerWrapper mAccessibilityManagerWrapper;
|
|
||||||
private final DeviceProvisionedController mDeviceProvisionedController;
|
|
||||||
private final MetricsLogger mMetricsLogger;
|
|
||||||
private final OverviewProxyService mOverviewProxyService;
|
|
||||||
private final NavigationModeController mNavigationModeController;
|
|
||||||
private final AccessibilityButtonModeObserver mAccessibilityButtonModeObserver;
|
|
||||||
private final StatusBarStateController mStatusBarStateController;
|
|
||||||
private final SysUiState mSysUiFlagsContainer;
|
|
||||||
private final BroadcastDispatcher mBroadcastDispatcher;
|
|
||||||
private final CommandQueue mCommandQueue;
|
|
||||||
private final Optional<Pip> mPipOptional;
|
|
||||||
private final Optional<LegacySplitScreen> mSplitScreenOptional;
|
|
||||||
private final Optional<Recents> mRecentsOptional;
|
|
||||||
private final Lazy<Optional<StatusBar>> mStatusBarOptionalLazy;
|
|
||||||
private final ShadeController mShadeController;
|
|
||||||
private final NotificationRemoteInputManager mNotificationRemoteInputManager;
|
|
||||||
private final SystemActions mSystemActions;
|
|
||||||
private final UiEventLogger mUiEventLogger;
|
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
private final NavigationBarA11yHelper mNavigationBarA11yHelper;
|
private final NavigationBar.Factory mNavigationBarFactory;
|
||||||
private final DisplayManager mDisplayManager;
|
private final DisplayManager mDisplayManager;
|
||||||
private final NavigationBarOverlayController mNavBarOverlayController;
|
|
||||||
private final TaskbarDelegate mTaskbarDelegate;
|
private final TaskbarDelegate mTaskbarDelegate;
|
||||||
private final NotificationShadeDepthController mNotificationShadeDepthController;
|
|
||||||
private int mNavMode;
|
private int mNavMode;
|
||||||
@VisibleForTesting boolean mIsTablet;
|
@VisibleForTesting boolean mIsTablet;
|
||||||
private final UserTracker mUserTracker;
|
|
||||||
|
|
||||||
/** A displayId - nav bar maps. */
|
/** A displayId - nav bar maps. */
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -132,72 +86,28 @@ public class NavigationBarController implements
|
|||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public NavigationBarController(Context context,
|
public NavigationBarController(Context context,
|
||||||
WindowManager windowManager,
|
|
||||||
Lazy<AssistManager> assistManagerLazy,
|
|
||||||
AccessibilityManager accessibilityManager,
|
|
||||||
AccessibilityManagerWrapper accessibilityManagerWrapper,
|
|
||||||
DeviceProvisionedController deviceProvisionedController,
|
|
||||||
MetricsLogger metricsLogger,
|
|
||||||
OverviewProxyService overviewProxyService,
|
OverviewProxyService overviewProxyService,
|
||||||
NavigationModeController navigationModeController,
|
NavigationModeController navigationModeController,
|
||||||
AccessibilityButtonModeObserver accessibilityButtonModeObserver,
|
|
||||||
StatusBarStateController statusBarStateController,
|
|
||||||
SysUiState sysUiFlagsContainer,
|
SysUiState sysUiFlagsContainer,
|
||||||
BroadcastDispatcher broadcastDispatcher,
|
|
||||||
CommandQueue commandQueue,
|
CommandQueue commandQueue,
|
||||||
Optional<Pip> pipOptional,
|
|
||||||
Optional<LegacySplitScreen> splitScreenOptional,
|
|
||||||
Optional<Recents> recentsOptional,
|
|
||||||
Lazy<Optional<StatusBar>> statusBarOptionalLazy,
|
|
||||||
ShadeController shadeController,
|
|
||||||
NotificationRemoteInputManager notificationRemoteInputManager,
|
|
||||||
NotificationShadeDepthController notificationShadeDepthController,
|
|
||||||
SystemActions systemActions,
|
|
||||||
@Main Handler mainHandler,
|
@Main Handler mainHandler,
|
||||||
UiEventLogger uiEventLogger,
|
|
||||||
NavigationBarOverlayController navBarOverlayController,
|
|
||||||
ConfigurationController configurationController,
|
ConfigurationController configurationController,
|
||||||
NavigationBarA11yHelper navigationBarA11yHelper,
|
NavigationBarA11yHelper navigationBarA11yHelper,
|
||||||
TaskbarDelegate taskbarDelegate,
|
TaskbarDelegate taskbarDelegate,
|
||||||
UserTracker userTracker,
|
NavigationBar.Factory navigationBarFactory,
|
||||||
DumpManager dumpManager) {
|
DumpManager dumpManager) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mWindowManager = windowManager;
|
|
||||||
mAssistManagerLazy = assistManagerLazy;
|
|
||||||
mAccessibilityManager = accessibilityManager;
|
|
||||||
mAccessibilityManagerWrapper = accessibilityManagerWrapper;
|
|
||||||
mDeviceProvisionedController = deviceProvisionedController;
|
|
||||||
mMetricsLogger = metricsLogger;
|
|
||||||
mOverviewProxyService = overviewProxyService;
|
|
||||||
mNavigationModeController = navigationModeController;
|
|
||||||
mAccessibilityButtonModeObserver = accessibilityButtonModeObserver;
|
|
||||||
mStatusBarStateController = statusBarStateController;
|
|
||||||
mSysUiFlagsContainer = sysUiFlagsContainer;
|
|
||||||
mBroadcastDispatcher = broadcastDispatcher;
|
|
||||||
mCommandQueue = commandQueue;
|
|
||||||
mPipOptional = pipOptional;
|
|
||||||
mSplitScreenOptional = splitScreenOptional;
|
|
||||||
mRecentsOptional = recentsOptional;
|
|
||||||
mStatusBarOptionalLazy = statusBarOptionalLazy;
|
|
||||||
mShadeController = shadeController;
|
|
||||||
mNotificationRemoteInputManager = notificationRemoteInputManager;
|
|
||||||
mNotificationShadeDepthController = notificationShadeDepthController;
|
|
||||||
mSystemActions = systemActions;
|
|
||||||
mUiEventLogger = uiEventLogger;
|
|
||||||
mHandler = mainHandler;
|
mHandler = mainHandler;
|
||||||
mNavigationBarA11yHelper = navigationBarA11yHelper;
|
mNavigationBarFactory = navigationBarFactory;
|
||||||
mDisplayManager = mContext.getSystemService(DisplayManager.class);
|
mDisplayManager = mContext.getSystemService(DisplayManager.class);
|
||||||
commandQueue.addCallback(this);
|
commandQueue.addCallback(this);
|
||||||
configurationController.addCallback(this);
|
configurationController.addCallback(this);
|
||||||
mConfigChanges.applyNewConfig(mContext.getResources());
|
mConfigChanges.applyNewConfig(mContext.getResources());
|
||||||
mNavBarOverlayController = navBarOverlayController;
|
mNavMode = navigationModeController.addListener(this);
|
||||||
mNavMode = mNavigationModeController.addListener(this);
|
|
||||||
mNavigationModeController.addListener(this);
|
|
||||||
mTaskbarDelegate = taskbarDelegate;
|
mTaskbarDelegate = taskbarDelegate;
|
||||||
mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService,
|
mTaskbarDelegate.setOverviewProxyService(commandQueue, overviewProxyService,
|
||||||
navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer);
|
navigationBarA11yHelper, navigationModeController, sysUiFlagsContainer);
|
||||||
mIsTablet = isTablet(mContext);
|
mIsTablet = isTablet(mContext);
|
||||||
mUserTracker = userTracker;
|
|
||||||
|
|
||||||
dumpManager.registerDumpable(this);
|
dumpManager.registerDumpable(this);
|
||||||
}
|
}
|
||||||
@@ -354,33 +264,8 @@ public class NavigationBarController implements
|
|||||||
final Context context = isOnDefaultDisplay
|
final Context context = isOnDefaultDisplay
|
||||||
? mContext
|
? mContext
|
||||||
: mContext.createDisplayContext(display);
|
: mContext.createDisplayContext(display);
|
||||||
NavigationBar navBar = new NavigationBar(context,
|
NavigationBar navBar = mNavigationBarFactory.create(context);
|
||||||
mWindowManager,
|
|
||||||
mAssistManagerLazy,
|
|
||||||
mAccessibilityManager,
|
|
||||||
mAccessibilityManagerWrapper,
|
|
||||||
mDeviceProvisionedController,
|
|
||||||
mMetricsLogger,
|
|
||||||
mOverviewProxyService,
|
|
||||||
mNavigationModeController,
|
|
||||||
mAccessibilityButtonModeObserver,
|
|
||||||
mStatusBarStateController,
|
|
||||||
mSysUiFlagsContainer,
|
|
||||||
mBroadcastDispatcher,
|
|
||||||
mCommandQueue,
|
|
||||||
mPipOptional,
|
|
||||||
mSplitScreenOptional,
|
|
||||||
mRecentsOptional,
|
|
||||||
mStatusBarOptionalLazy,
|
|
||||||
mShadeController,
|
|
||||||
mNotificationRemoteInputManager,
|
|
||||||
mNotificationShadeDepthController,
|
|
||||||
mSystemActions,
|
|
||||||
mHandler,
|
|
||||||
mNavBarOverlayController,
|
|
||||||
mUiEventLogger,
|
|
||||||
mNavigationBarA11yHelper,
|
|
||||||
mUserTracker);
|
|
||||||
mNavigationBars.put(displayId, navBar);
|
mNavigationBars.put(displayId, navBar);
|
||||||
|
|
||||||
View navigationBarView = navBar.createView(savedState);
|
View navigationBarView = navBar.createView(savedState);
|
||||||
|
|||||||
@@ -171,4 +171,23 @@ public class AutoHideController {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injectable factory for creating a {@link AutoHideController}.
|
||||||
|
*/
|
||||||
|
public static class Factory {
|
||||||
|
private final Handler mHandler;
|
||||||
|
private final IWindowManager mIWindowManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public Factory(@Main Handler handler, IWindowManager iWindowManager) {
|
||||||
|
mHandler = handler;
|
||||||
|
mIWindowManager = iWindowManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create an {@link AutoHideController} */
|
||||||
|
public AutoHideController create(Context context) {
|
||||||
|
return new AutoHideController(context, mHandler, mIWindowManager);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -298,4 +298,33 @@ public class LightBarController implements BatteryController.BatteryStateChangeC
|
|||||||
pw.println();
|
pw.println();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Injectable factory for creating a {@link LightBarController}.
|
||||||
|
*/
|
||||||
|
public static class Factory {
|
||||||
|
private final DarkIconDispatcher mDarkIconDispatcher;
|
||||||
|
private final BatteryController mBatteryController;
|
||||||
|
private final NavigationModeController mNavModeController;
|
||||||
|
private final DumpManager mDumpManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public Factory(
|
||||||
|
DarkIconDispatcher darkIconDispatcher,
|
||||||
|
BatteryController batteryController,
|
||||||
|
NavigationModeController navModeController,
|
||||||
|
DumpManager dumpManager) {
|
||||||
|
|
||||||
|
mDarkIconDispatcher = darkIconDispatcher;
|
||||||
|
mBatteryController = batteryController;
|
||||||
|
mNavModeController = navModeController;
|
||||||
|
mDumpManager = dumpManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Create an {@link LightBarController} */
|
||||||
|
public LightBarController create(Context context) {
|
||||||
|
return new LightBarController(context, mDarkIconDispatcher, mBatteryController,
|
||||||
|
mNavModeController, mDumpManager);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
package com.android.systemui.statusbar.policy;
|
package com.android.systemui.statusbar.policy;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
|
import android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener;
|
||||||
@@ -35,8 +34,8 @@ public class AccessibilityManagerWrapper implements
|
|||||||
private final AccessibilityManager mAccessibilityManager;
|
private final AccessibilityManager mAccessibilityManager;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public AccessibilityManagerWrapper(Context context) {
|
public AccessibilityManagerWrapper(AccessibilityManager accessibilityManager) {
|
||||||
mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
|
mAccessibilityManager = accessibilityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -35,42 +35,23 @@ import static org.mockito.Mockito.verify;
|
|||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper.RunWithLooper;
|
import android.testing.TestableLooper.RunWithLooper;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.WindowManager;
|
|
||||||
import android.view.accessibility.AccessibilityManager;
|
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
import com.android.internal.logging.MetricsLogger;
|
|
||||||
import com.android.internal.logging.UiEventLogger;
|
|
||||||
import com.android.systemui.Dependency;
|
import com.android.systemui.Dependency;
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
|
|
||||||
import com.android.systemui.accessibility.SystemActions;
|
|
||||||
import com.android.systemui.assist.AssistManager;
|
|
||||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.model.SysUiState;
|
import com.android.systemui.model.SysUiState;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
|
||||||
import com.android.systemui.recents.OverviewProxyService;
|
import com.android.systemui.recents.OverviewProxyService;
|
||||||
import com.android.systemui.recents.Recents;
|
|
||||||
import com.android.systemui.settings.UserTracker;
|
|
||||||
import com.android.systemui.statusbar.CommandQueue;
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
|
||||||
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
|
||||||
import com.android.systemui.statusbar.phone.ShadeController;
|
|
||||||
import com.android.systemui.statusbar.phone.StatusBar;
|
|
||||||
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
|
||||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
|
||||||
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
|
|
||||||
import com.android.wm.shell.pip.Pip;
|
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
import java.util.Optional;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
|
||||||
/** atest NavigationBarControllerTest */
|
/** atest NavigationBarControllerTest */
|
||||||
@RunWith(AndroidTestingRunner.class)
|
@RunWith(AndroidTestingRunner.class)
|
||||||
@@ -78,46 +59,31 @@ import java.util.Optional;
|
|||||||
@SmallTest
|
@SmallTest
|
||||||
public class NavigationBarControllerTest extends SysuiTestCase {
|
public class NavigationBarControllerTest extends SysuiTestCase {
|
||||||
|
|
||||||
|
private static final int SECONDARY_DISPLAY = 1;
|
||||||
|
|
||||||
private NavigationBarController mNavigationBarController;
|
private NavigationBarController mNavigationBarController;
|
||||||
private NavigationBar mDefaultNavBar;
|
private NavigationBar mDefaultNavBar;
|
||||||
private NavigationBar mSecondaryNavBar;
|
private NavigationBar mSecondaryNavBar;
|
||||||
|
|
||||||
private CommandQueue mCommandQueue = mock(CommandQueue.class);
|
@Mock
|
||||||
|
private CommandQueue mCommandQueue;
|
||||||
private static final int SECONDARY_DISPLAY = 1;
|
@Mock
|
||||||
|
private NavigationBar.Factory mNavigationBarFactory;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
mNavigationBarController = spy(
|
mNavigationBarController = spy(
|
||||||
new NavigationBarController(mContext,
|
new NavigationBarController(mContext,
|
||||||
mock(WindowManager.class),
|
|
||||||
() -> mock(AssistManager.class),
|
|
||||||
mock(AccessibilityManager.class),
|
|
||||||
mock(AccessibilityManagerWrapper.class),
|
|
||||||
mock(DeviceProvisionedController.class),
|
|
||||||
mock(MetricsLogger.class),
|
|
||||||
mock(OverviewProxyService.class),
|
mock(OverviewProxyService.class),
|
||||||
mock(NavigationModeController.class),
|
mock(NavigationModeController.class),
|
||||||
mock(AccessibilityButtonModeObserver.class),
|
|
||||||
mock(StatusBarStateController.class),
|
|
||||||
mock(SysUiState.class),
|
mock(SysUiState.class),
|
||||||
mock(BroadcastDispatcher.class),
|
|
||||||
mCommandQueue,
|
mCommandQueue,
|
||||||
Optional.of(mock(Pip.class)),
|
|
||||||
Optional.of(mock(LegacySplitScreen.class)),
|
|
||||||
Optional.of(mock(Recents.class)),
|
|
||||||
() -> Optional.of(mock(StatusBar.class)),
|
|
||||||
mock(ShadeController.class),
|
|
||||||
mock(NotificationRemoteInputManager.class),
|
|
||||||
mock(NotificationShadeDepthController.class),
|
|
||||||
mock(SystemActions.class),
|
|
||||||
Dependency.get(Dependency.MAIN_HANDLER),
|
Dependency.get(Dependency.MAIN_HANDLER),
|
||||||
mock(UiEventLogger.class),
|
|
||||||
mock(NavigationBarOverlayController.class),
|
|
||||||
mock(ConfigurationController.class),
|
mock(ConfigurationController.class),
|
||||||
mock(NavigationBarA11yHelper.class),
|
mock(NavigationBarA11yHelper.class),
|
||||||
mock(TaskbarDelegate.class),
|
mock(TaskbarDelegate.class),
|
||||||
mock(UserTracker.class),
|
mNavigationBarFactory,
|
||||||
mock(DumpManager.class)));
|
mock(DumpManager.class)));
|
||||||
initializeNavigationBars();
|
initializeNavigationBars();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.systemui.navigationbar;
|
|||||||
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
|
import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT;
|
||||||
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN;
|
import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN;
|
||||||
import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT;
|
import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT;
|
||||||
|
import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
|
||||||
import static android.inputmethodservice.InputMethodService.IME_VISIBLE;
|
import static android.inputmethodservice.InputMethodService.IME_VISIBLE;
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
import static android.view.Display.DEFAULT_DISPLAY;
|
||||||
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
|
import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
|
||||||
@@ -28,7 +29,6 @@ import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent
|
|||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
@@ -45,11 +45,11 @@ import android.content.Context;
|
|||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.hardware.display.DisplayManagerGlobal;
|
import android.hardware.display.DisplayManagerGlobal;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.provider.DeviceConfig;
|
import android.provider.DeviceConfig;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
|
import android.telecom.TelecomManager;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper;
|
import android.testing.TestableLooper;
|
||||||
import android.testing.TestableLooper.RunWithLooper;
|
import android.testing.TestableLooper.RunWithLooper;
|
||||||
@@ -60,12 +60,12 @@ import android.view.View;
|
|||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.view.WindowMetrics;
|
import android.view.WindowMetrics;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
|
||||||
import androidx.test.filters.SmallTest;
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
import com.android.internal.logging.MetricsLogger;
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.internal.logging.UiEventLogger;
|
import com.android.internal.logging.UiEventLogger;
|
||||||
import com.android.systemui.Dependency;
|
|
||||||
import com.android.systemui.SysuiTestCase;
|
import com.android.systemui.SysuiTestCase;
|
||||||
import com.android.systemui.SysuiTestableContext;
|
import com.android.systemui.SysuiTestableContext;
|
||||||
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
|
import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
|
||||||
@@ -81,9 +81,10 @@ import com.android.systemui.settings.UserTracker;
|
|||||||
import com.android.systemui.statusbar.CommandQueue;
|
import com.android.systemui.statusbar.CommandQueue;
|
||||||
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
import com.android.systemui.statusbar.NotificationRemoteInputManager;
|
||||||
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
import com.android.systemui.statusbar.NotificationShadeDepthController;
|
||||||
|
import com.android.systemui.statusbar.phone.AutoHideController;
|
||||||
|
import com.android.systemui.statusbar.phone.LightBarController;
|
||||||
import com.android.systemui.statusbar.phone.ShadeController;
|
import com.android.systemui.statusbar.phone.ShadeController;
|
||||||
import com.android.systemui.statusbar.phone.StatusBar;
|
import com.android.systemui.statusbar.phone.StatusBar;
|
||||||
import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper;
|
|
||||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||||
import com.android.systemui.utils.leaks.LeakCheckedTest;
|
import com.android.systemui.utils.leaks.LeakCheckedTest;
|
||||||
@@ -110,7 +111,13 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
private NavigationBar mExternalDisplayNavigationBar;
|
private NavigationBar mExternalDisplayNavigationBar;
|
||||||
|
|
||||||
private SysuiTestableContext mSysuiTestableContextExternal;
|
private SysuiTestableContext mSysuiTestableContextExternal;
|
||||||
|
@Mock
|
||||||
private OverviewProxyService mOverviewProxyService;
|
private OverviewProxyService mOverviewProxyService;
|
||||||
|
@Mock
|
||||||
|
private StatusBarStateController mStatusBarStateController;
|
||||||
|
@Mock
|
||||||
|
private NavigationModeController mNavigationModeController;
|
||||||
|
@Mock
|
||||||
private CommandQueue mCommandQueue;
|
private CommandQueue mCommandQueue;
|
||||||
private SysUiState mMockSysUiState;
|
private SysUiState mMockSysUiState;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -125,11 +132,25 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
EdgeBackGestureHandler mEdgeBackGestureHandler;
|
||||||
@Mock
|
@Mock
|
||||||
NavigationBarA11yHelper mNavigationBarA11yHelper;
|
NavigationBarA11yHelper mNavigationBarA11yHelper;
|
||||||
|
@Mock
|
||||||
|
private LightBarController mLightBarController;
|
||||||
|
@Mock
|
||||||
|
private LightBarController.Factory mLightBarcontrollerFactory;
|
||||||
|
@Mock
|
||||||
|
private AutoHideController mAutoHideController;
|
||||||
|
@Mock
|
||||||
|
private AutoHideController.Factory mAutoHideControllerFactory;
|
||||||
|
@Mock
|
||||||
|
private WindowManager mWindowManager;
|
||||||
|
@Mock
|
||||||
|
private TelecomManager mTelecomManager;
|
||||||
|
@Mock
|
||||||
|
private InputMethodManager mInputMethodManager;
|
||||||
|
@Mock
|
||||||
|
private AssistManager mAssistManager;
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
|
public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
|
||||||
private AccessibilityManagerWrapper mAccessibilityWrapper =
|
|
||||||
new AccessibilityManagerWrapper(mContext);
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
@@ -137,15 +158,19 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
|
|
||||||
when(mEdgeBackGestureHandlerFactory.create(any(Context.class)))
|
when(mEdgeBackGestureHandlerFactory.create(any(Context.class)))
|
||||||
.thenReturn(mEdgeBackGestureHandler);
|
.thenReturn(mEdgeBackGestureHandler);
|
||||||
mCommandQueue = new CommandQueue(mContext);
|
when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController);
|
||||||
|
when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController);
|
||||||
setupSysuiDependency();
|
setupSysuiDependency();
|
||||||
mDependency.injectMockDependency(AssistManager.class);
|
// This class inflates views that call Dependency.get, thus these injections are still
|
||||||
|
// necessary.
|
||||||
|
mDependency.injectTestDependency(AssistManager.class, mAssistManager);
|
||||||
mDependency.injectMockDependency(KeyguardStateController.class);
|
mDependency.injectMockDependency(KeyguardStateController.class);
|
||||||
mDependency.injectMockDependency(StatusBarStateController.class);
|
mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController);
|
||||||
mDependency.injectMockDependency(NavigationBarController.class);
|
mDependency.injectMockDependency(NavigationBarController.class);
|
||||||
mOverviewProxyService = mDependency.injectMockDependency(OverviewProxyService.class);
|
|
||||||
mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class,
|
mDependency.injectTestDependency(EdgeBackGestureHandler.Factory.class,
|
||||||
mEdgeBackGestureHandlerFactory);
|
mEdgeBackGestureHandlerFactory);
|
||||||
|
mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService);
|
||||||
|
mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController);
|
||||||
TestableLooper.get(this).runWithLooper(() -> {
|
TestableLooper.get(this).runWithLooper(() -> {
|
||||||
mNavigationBar = createNavBar(mContext);
|
mNavigationBar = createNavBar(mContext);
|
||||||
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
|
mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal);
|
||||||
@@ -164,23 +189,13 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext(
|
mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext(
|
||||||
display);
|
display);
|
||||||
|
|
||||||
WindowManager windowManager = mock(WindowManager.class);
|
Display defaultDisplay = mContext.getDisplay();
|
||||||
Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay();
|
when(mWindowManager.getDefaultDisplay()).thenReturn(defaultDisplay);
|
||||||
when(windowManager.getDefaultDisplay()).thenReturn(
|
WindowMetrics metrics = mContext.getSystemService(WindowManager.class)
|
||||||
defaultDisplay);
|
|
||||||
WindowMetrics maximumWindowMetrics = mContext.getSystemService(WindowManager.class)
|
|
||||||
.getMaximumWindowMetrics();
|
.getMaximumWindowMetrics();
|
||||||
when(windowManager.getMaximumWindowMetrics()).thenReturn(maximumWindowMetrics);
|
when(mWindowManager.getMaximumWindowMetrics()).thenReturn(metrics);
|
||||||
WindowMetrics currentWindowMetrics = mContext.getSystemService(WindowManager.class)
|
doNothing().when(mWindowManager).addView(any(), any());
|
||||||
.getCurrentWindowMetrics();
|
doNothing().when(mWindowManager).removeViewImmediate(any());
|
||||||
when(windowManager.getCurrentWindowMetrics()).thenReturn(currentWindowMetrics);
|
|
||||||
doNothing().when(windowManager).addView(any(), any());
|
|
||||||
mContext.addMockSystemService(Context.WINDOW_SERVICE, windowManager);
|
|
||||||
mSysuiTestableContextExternal.addMockSystemService(Context.WINDOW_SERVICE, windowManager);
|
|
||||||
|
|
||||||
mDependency.injectTestDependency(Dependency.BG_LOOPER, Looper.getMainLooper());
|
|
||||||
mDependency.injectTestDependency(AccessibilityManagerWrapper.class, mAccessibilityWrapper);
|
|
||||||
|
|
||||||
mMockSysUiState = mock(SysUiState.class);
|
mMockSysUiState = mock(SysUiState.class);
|
||||||
when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState);
|
when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState);
|
||||||
}
|
}
|
||||||
@@ -239,10 +254,8 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
defaultNavBar.createView(null);
|
defaultNavBar.createView(null);
|
||||||
externalNavBar.createView(null);
|
externalNavBar.createView(null);
|
||||||
|
|
||||||
// Set IME window status for default NavBar.
|
defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
|
||||||
mCommandQueue.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
|
BACK_DISPOSITION_DEFAULT, true);
|
||||||
BACK_DISPOSITION_DEFAULT, true, false);
|
|
||||||
processAllMessages();
|
|
||||||
|
|
||||||
// Verify IME window state will be updated in default NavBar & external NavBar state reset.
|
// Verify IME window state will be updated in default NavBar & external NavBar state reset.
|
||||||
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
|
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
|
||||||
@@ -250,11 +263,10 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
|
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
|
||||||
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
|
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
|
||||||
|
|
||||||
// Set IME window status for external NavBar.
|
externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE,
|
||||||
mCommandQueue.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null,
|
BACK_DISPOSITION_DEFAULT, true);
|
||||||
IME_VISIBLE, BACK_DISPOSITION_DEFAULT, true, false);
|
defaultNavBar.setImeWindowStatus(
|
||||||
processAllMessages();
|
DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false);
|
||||||
|
|
||||||
// Verify IME window state will be updated in external NavBar & default NavBar state reset.
|
// Verify IME window state will be updated in external NavBar & default NavBar state reset.
|
||||||
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
|
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN,
|
||||||
externalNavBar.getNavigationIconHints());
|
externalNavBar.getNavigationIconHints());
|
||||||
@@ -280,19 +292,16 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
DeviceProvisionedController deviceProvisionedController =
|
DeviceProvisionedController deviceProvisionedController =
|
||||||
mock(DeviceProvisionedController.class);
|
mock(DeviceProvisionedController.class);
|
||||||
when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
|
when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true);
|
||||||
assertNotNull(mAccessibilityWrapper);
|
NavigationBar.Factory factory = new NavigationBar.Factory(
|
||||||
return spy(new NavigationBar(context,
|
mWindowManager,
|
||||||
mock(WindowManager.class),
|
() -> mAssistManager,
|
||||||
() -> mock(AssistManager.class),
|
|
||||||
mock(AccessibilityManager.class),
|
mock(AccessibilityManager.class),
|
||||||
context.getDisplayId() == DEFAULT_DISPLAY ? mAccessibilityWrapper
|
|
||||||
: mock(AccessibilityManagerWrapper.class),
|
|
||||||
deviceProvisionedController,
|
deviceProvisionedController,
|
||||||
new MetricsLogger(),
|
new MetricsLogger(),
|
||||||
mOverviewProxyService,
|
mOverviewProxyService,
|
||||||
mock(NavigationModeController.class),
|
mNavigationModeController,
|
||||||
mock(AccessibilityButtonModeObserver.class),
|
mock(AccessibilityButtonModeObserver.class),
|
||||||
mock(StatusBarStateController.class),
|
mStatusBarStateController,
|
||||||
mMockSysUiState,
|
mMockSysUiState,
|
||||||
mBroadcastDispatcher,
|
mBroadcastDispatcher,
|
||||||
mCommandQueue,
|
mCommandQueue,
|
||||||
@@ -308,7 +317,14 @@ public class NavigationBarTest extends SysuiTestCase {
|
|||||||
mock(NavigationBarOverlayController.class),
|
mock(NavigationBarOverlayController.class),
|
||||||
mUiEventLogger,
|
mUiEventLogger,
|
||||||
mNavigationBarA11yHelper,
|
mNavigationBarA11yHelper,
|
||||||
mock(UserTracker.class)));
|
mock(UserTracker.class),
|
||||||
|
mLightBarController,
|
||||||
|
mLightBarcontrollerFactory,
|
||||||
|
mAutoHideController,
|
||||||
|
mAutoHideControllerFactory,
|
||||||
|
Optional.of(mTelecomManager),
|
||||||
|
mInputMethodManager);
|
||||||
|
return spy(factory.create(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processAllMessages() {
|
private void processAllMessages() {
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
package com.android.systemui.statusbar;
|
package com.android.systemui.statusbar;
|
||||||
|
|
||||||
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
|
import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
|
||||||
|
import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT;
|
||||||
|
import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
|
||||||
import static android.view.Display.DEFAULT_DISPLAY;
|
import static android.view.Display.DEFAULT_DISPLAY;
|
||||||
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
|
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
|
||||||
import static android.view.InsetsState.ITYPE_STATUS_BAR;
|
import static android.view.InsetsState.ITYPE_STATUS_BAR;
|
||||||
@@ -188,8 +190,13 @@ public class CommandQueueTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testShowImeButtonForSecondaryDisplay() {
|
public void testShowImeButtonForSecondaryDisplay() {
|
||||||
|
// First show in default display to update the "last updated ime display"
|
||||||
|
testShowImeButton();
|
||||||
|
|
||||||
mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, null, 1, 2, true, false);
|
mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, null, 1, 2, true, false);
|
||||||
waitForIdleSync();
|
waitForIdleSync();
|
||||||
|
verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(null), eq(IME_INVISIBLE),
|
||||||
|
eq(BACK_DISPOSITION_DEFAULT), eq(false));
|
||||||
verify(mCallbacks).setImeWindowStatus(
|
verify(mCallbacks).setImeWindowStatus(
|
||||||
eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true));
|
eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user