diff options
43 files changed, 394 insertions, 518 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java index aeda2d923490..283fd8d997c9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/DisplayImeController.java @@ -68,7 +68,7 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged private final SparseArray<PerDisplay> mImePerDisplay = new SparseArray<>(); private final ArrayList<ImePositionProcessor> mPositionProcessors = new ArrayList<>(); - protected DisplayImeController(IWindowManager wmService, DisplayController displayController, + public DisplayImeController(IWindowManager wmService, DisplayController displayController, Handler mainHandler, TransactionPool transactionPool) { mHandler = mainHandler; mWmService = wmService; @@ -76,7 +76,8 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged mDisplayController = displayController; } - protected void startMonitorDisplays() { + /** Starts monitor displays changes and set insets controller for each displays. */ + public void startMonitorDisplays() { mDisplayController.addDisplayWindowListener(this); } @@ -493,29 +494,4 @@ public class DisplayImeController implements DisplayController.OnDisplaysChanged return IInputMethodManager.Stub.asInterface( ServiceManager.getService(Context.INPUT_METHOD_SERVICE)); } - - /** Builds {@link DisplayImeController} instance. */ - public static class Builder { - private IWindowManager mWmService; - private DisplayController mDisplayController; - private Handler mHandler; - private TransactionPool mTransactionPool; - - public Builder(IWindowManager wmService, DisplayController displayController, - Handler handler, TransactionPool transactionPool) { - mWmService = wmService; - mDisplayController = displayController; - mHandler = handler; - mTransactionPool = transactionPool; - } - - /** Builds and initializes {@link DisplayImeController} instance. */ - public DisplayImeController build() { - DisplayImeController displayImeController = new DisplayImeController(mWmService, - mDisplayController, mHandler, mTransactionPool); - // Separates startMonitorDisplays from constructor to prevent circular init issue. - displayImeController.startMonitorDisplays(); - return displayImeController; - } - } } diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index 039f2c039ded..d3277ded6c5b 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -121,7 +121,6 @@ <string-array name="config_systemUIServiceComponentsExclude" translatable="false"> <item>com.android.systemui.recents.Recents</item> <item>com.android.systemui.volume.VolumeUI</item> - <item>com.android.systemui.stackdivider.Divider</item> <item>com.android.systemui.statusbar.phone.StatusBar</item> <item>com.android.systemui.keyboard.KeyboardUI</item> <item>com.android.systemui.pip.PipUI</item> diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java index 797a178c9a4b..3971e18bb968 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIBinder.java @@ -34,7 +34,6 @@ import com.android.systemui.power.PowerUI; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsModule; import com.android.systemui.shortcut.ShortcutKeyDispatcher; -import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.notification.InstantAppNotifier; import com.android.systemui.statusbar.notification.dagger.NotificationsModule; @@ -42,6 +41,7 @@ import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.toast.ToastUI; import com.android.systemui.util.leak.GarbageMonitor; +import com.android.systemui.wmshell.WMShell; import dagger.Binds; import dagger.Module; @@ -59,12 +59,6 @@ public abstract class CarSystemUIBinder { @ClassKey(AuthController.class) public abstract SystemUI bindAuthController(AuthController sysui); - /** Inject into Divider. */ - @Binds - @IntoMap - @ClassKey(Divider.class) - public abstract SystemUI bindDivider(Divider sysui); - /** Inject Car Navigation Bar. */ @Binds @IntoMap @@ -192,4 +186,10 @@ public abstract class CarSystemUIBinder { @IntoMap @ClassKey(SideLoadedAppController.class) public abstract SystemUI bindSideLoadedAppController(SideLoadedAppController sysui); + + /** Inject into WMShell. */ + @Binds + @IntoMap + @ClassKey(WMShell.class) + public abstract SystemUI bindWMShell(WMShell sysui); } diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java index 290700fad147..3eea5132da1d 100644 --- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java @@ -47,7 +47,6 @@ import com.android.systemui.qs.dagger.QSModule; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsImplementation; -import com.android.systemui.stackdivider.DividerModule; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; @@ -75,7 +74,6 @@ import dagger.Provides; @Module( includes = { - DividerModule.class, QSModule.class, CarWMShellModule.class }) diff --git a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java index e493c97a9b46..c7354ed5b459 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java +++ b/packages/CarSystemUI/src/com/android/systemui/wm/DisplaySystemBarsController.java @@ -49,7 +49,7 @@ public class DisplaySystemBarsController extends DisplayImeController { private final Context mContext; private SparseArray<PerDisplay> mPerDisplaySparseArray; - private DisplaySystemBarsController( + public DisplaySystemBarsController( Context context, IWindowManager wmService, DisplayController displayController, @@ -167,33 +167,4 @@ public class DisplaySystemBarsController extends DisplayImeController { } } } - - /** Builds {@link DisplaySystemBarsController} instance. */ - public static class Builder { - private Context mContext; - private IWindowManager mWmService; - private DisplayController mDisplayController; - private Handler mHandler; - private TransactionPool mTransactionPool; - - public Builder(Context context, IWindowManager wmService, - DisplayController displayController, Handler handler, - TransactionPool transactionPool) { - mContext = context; - mWmService = wmService; - mDisplayController = displayController; - mHandler = handler; - mTransactionPool = transactionPool; - } - - /** Builds and initializes {@link DisplaySystemBarsController} instance. */ - public DisplaySystemBarsController build() { - DisplaySystemBarsController displaySystemBarsController = - new DisplaySystemBarsController( - mContext, mWmService, mDisplayController, mHandler, mTransactionPool); - // Separates startMonitorDisplays from constructor to prevent circular init issue. - displaySystemBarsController.startMonitorDisplays(); - return displaySystemBarsController; - } - } } diff --git a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java index 2324c3d59155..fd6685ffdb8f 100644 --- a/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java +++ b/packages/CarSystemUI/src/com/android/systemui/wmshell/CarWMShellModule.java @@ -40,8 +40,8 @@ public class CarWMShellModule { DisplayImeController provideDisplayImeController(Context context, IWindowManager wmService, DisplayController displayController, @Main Handler mainHandler, TransactionPool transactionPool) { - return new DisplaySystemBarsController.Builder(context, wmService, displayController, - mainHandler, transactionPool).build(); + return new DisplaySystemBarsController(context, wmService, displayController, + mainHandler, transactionPool); } /** TODO(b/150319024): PipMenuActivity will move to a Window */ diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java index b65578dbe02c..391f75e35382 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/wm/DisplaySystemBarsControllerTest.java @@ -64,13 +64,13 @@ public class DisplaySystemBarsControllerTest extends SysuiTestCase { public void setUp() { MockitoAnnotations.initMocks(this); - mController = new DisplaySystemBarsController.Builder( + mController = new DisplaySystemBarsController( mContext, mIWindowManager, mDisplayController, mHandler, mTransactionPool - ).build(); + ); } @Test diff --git a/packages/SystemUI/README.md b/packages/SystemUI/README.md index 68b9553749e7..148fabbbaf2c 100644 --- a/packages/SystemUI/README.md +++ b/packages/SystemUI/README.md @@ -88,11 +88,6 @@ activity. It provides this cached data to RecentsActivity when it is started. Registers all the callbacks/listeners required to show the Volume dialog when it should be shown. -### [com.android.systemui.stackdivider.Divider](/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java) - -Shows the drag handle for the divider between two apps when in split screen -mode. - ### [com.android.systemui.status.phone.StatusBar](/packages/SystemUI/src/com/android/systemui/status/phone/StatusBar.java) This shows the UI for the status bar and the notification shade it contains. @@ -153,6 +148,10 @@ Draws decorations about the screen in software (e.g. rounded corners, cutouts). Biometric UI. +### [com.android.systemui.wmshell.WMShell](/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java) + +Delegates SysUI events to WM Shell controllers. + --- * [Plugins](/packages/SystemUI/docs/plugins.md) diff --git a/packages/SystemUI/res/values-television/config.xml b/packages/SystemUI/res/values-television/config.xml index 7b1479acc35e..b2d057b4bcd8 100644 --- a/packages/SystemUI/res/values-television/config.xml +++ b/packages/SystemUI/res/values-television/config.xml @@ -28,7 +28,6 @@ <string-array name="config_systemUIServiceComponents" translatable="false"> <item>com.android.systemui.util.NotificationChannels</item> <item>com.android.systemui.volume.VolumeUI</item> - <item>com.android.systemui.stackdivider.Divider</item> <item>com.android.systemui.statusbar.tv.TvStatusBar</item> <item>com.android.systemui.usb.StorageNotification</item> <item>com.android.systemui.power.PowerUI</item> @@ -42,6 +41,7 @@ <item>com.android.systemui.statusbar.notification.InstantAppNotifier</item> <item>com.android.systemui.toast.ToastUI</item> <item>com.android.systemui.onehanded.OneHandedUI</item> + <item>com.android.systemui.wmshell.WMShell</item> </string-array> <!-- Show a separate icon for low and high volume on the volume dialog --> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index ce1ca5ad1723..130bb4fc90b9 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -301,7 +301,6 @@ <item>com.android.systemui.keyguard.KeyguardViewMediator</item> <item>com.android.systemui.recents.Recents</item> <item>com.android.systemui.volume.VolumeUI</item> - <item>com.android.systemui.stackdivider.Divider</item> <item>com.android.systemui.statusbar.phone.StatusBar</item> <item>com.android.systemui.usb.StorageNotification</item> <item>com.android.systemui.power.PowerUI</item> @@ -323,6 +322,7 @@ <item>com.android.systemui.accessibility.SystemActions</item> <item>com.android.systemui.toast.ToastUI</item> <item>com.android.systemui.onehanded.OneHandedUI</item> + <item>com.android.systemui.wmshell.WMShell</item> </string-array> <!-- QS tile shape store width. negative implies fill configuration instead of stroke--> diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 748a9c9448c5..27809b50d746 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -65,7 +65,6 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.DevicePolicyManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; -import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -324,7 +323,6 @@ public class Dependency { @Inject Lazy<DisplayImeController> mDisplayImeController; @Inject Lazy<RecordingController> mRecordingController; @Inject Lazy<ProtoTracer> mProtoTracer; - @Inject Lazy<Divider> mDivider; @Inject public Dependency() { @@ -521,7 +519,6 @@ public class Dependency { mProviders.put(AutoHideController.class, mAutoHideController::get); mProviders.put(RecordingController.class, mRecordingController::get); - mProviders.put(Divider.class, mDivider::get); Dependency.setInstance(this); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 2fc5cba35616..e5e3a1d16c01 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -61,7 +61,7 @@ import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManagerImpl; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.DevicePolicyManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.phone.AutoHideController; @@ -193,7 +193,7 @@ public class DependencyProvider { SysUiState sysUiFlagsContainer, BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue, - Divider divider, + Optional<SplitScreenController> splitScreenControllerOptional, Optional<Recents> recentsOptional, Lazy<StatusBar> statusBarLazy, ShadeController shadeController, @@ -215,7 +215,7 @@ public class DependencyProvider { sysUiFlagsContainer, broadcastDispatcher, commandQueue, - divider, + splitScreenControllerOptional, recentsOptional, statusBarLazy, shadeController, diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java index 0aebb7eaf823..9dfd9f8fd9bf 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIBinder.java @@ -34,7 +34,6 @@ import com.android.systemui.power.PowerUI; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsModule; import com.android.systemui.shortcut.ShortcutKeyDispatcher; -import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.dagger.StatusBarModule; import com.android.systemui.statusbar.notification.InstantAppNotifier; import com.android.systemui.statusbar.phone.StatusBar; @@ -43,6 +42,7 @@ import com.android.systemui.theme.ThemeOverlayController; import com.android.systemui.toast.ToastUI; import com.android.systemui.util.leak.GarbageMonitor; import com.android.systemui.volume.VolumeUI; +import com.android.systemui.wmshell.WMShell; import dagger.Binds; import dagger.Module; @@ -61,12 +61,6 @@ public abstract class SystemUIBinder { @ClassKey(AuthController.class) public abstract SystemUI bindAuthController(AuthController service); - /** Inject into Divider. */ - @Binds - @IntoMap - @ClassKey(Divider.class) - public abstract SystemUI bindDivider(Divider sysui); - /** Inject into GarbageMonitor.Service. */ @Binds @IntoMap @@ -187,4 +181,10 @@ public abstract class SystemUIBinder { @IntoMap @ClassKey(WindowMagnification.class) public abstract SystemUI bindWindowMagnification(WindowMagnification sysui); + + /** Inject into WMShell. */ + @Binds + @IntoMap + @ClassKey(WMShell.class) + public abstract SystemUI bindWMShell(WMShell sysui); } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java index 3b225d5313c1..a021114c138b 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java @@ -41,7 +41,6 @@ import com.android.systemui.qs.dagger.QSModule; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsImplementation; -import com.android.systemui.stackdivider.DividerModule; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; @@ -75,7 +74,6 @@ import dagger.Provides; * overridden by the System UI implementation. */ @Module(includes = { - DividerModule.class, QSModule.class, WMShellModule.class }) diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index abfc2ab1c6e8..c26949d6058e 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -33,7 +33,6 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.Recents; import com.android.systemui.settings.dagger.SettingsModule; -import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder; import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl; @@ -118,9 +117,6 @@ public abstract class SystemUIModule { abstract CommandQueue optionalCommandQueue(); @BindsOptionalOf - abstract Divider optionalDivider(); - - @BindsOptionalOf abstract HeadsUpManager optionalHeadsUpManager(); @BindsOptionalOf diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 6c8a23ba96d1..94a2bd915016 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -111,7 +111,6 @@ import com.android.systemui.assist.AssistHandleViewController; import com.android.systemui.assist.AssistManager; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.model.SysUiState; import com.android.systemui.navigationbar.buttons.ButtonDispatcher; import com.android.systemui.navigationbar.buttons.KeyButtonView; @@ -123,7 +122,7 @@ import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; @@ -180,7 +179,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private final NavigationModeController mNavigationModeController; private final BroadcastDispatcher mBroadcastDispatcher; private final CommandQueue mCommandQueue; - private final Divider mDivider; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; private final Optional<Recents> mRecentsOptional; private final SystemActions mSystemActions; private final Handler mHandler; @@ -377,22 +376,22 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private final DeviceConfig.OnPropertiesChangedListener mOnPropertiesChangedListener = new DeviceConfig.OnPropertiesChangedListener() { - @Override - public void onPropertiesChanged(DeviceConfig.Properties properties) { - if (properties.getKeyset().contains(NAV_BAR_HANDLE_FORCE_OPAQUE)) { - mForceNavBarHandleOpaque = properties.getBoolean( - NAV_BAR_HANDLE_FORCE_OPAQUE, /* defaultValue = */ true); - } - } - }; + @Override + public void onPropertiesChanged(DeviceConfig.Properties properties) { + if (properties.getKeyset().contains(NAV_BAR_HANDLE_FORCE_OPAQUE)) { + mForceNavBarHandleOpaque = properties.getBoolean( + NAV_BAR_HANDLE_FORCE_OPAQUE, /* defaultValue = */ true); + } + } + }; private final DeviceProvisionedController.DeviceProvisionedListener mUserSetupListener = new DeviceProvisionedController.DeviceProvisionedListener() { - @Override - public void onUserSetupChanged() { - mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); - } - }; + @Override + public void onUserSetupChanged() { + mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); + } + }; public NavigationBar(Context context, WindowManager windowManager, @@ -406,7 +405,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, StatusBarStateController statusBarStateController, SysUiState sysUiFlagsContainer, BroadcastDispatcher broadcastDispatcher, - CommandQueue commandQueue, Divider divider, + CommandQueue commandQueue, + Optional<SplitScreenController> splitScreenControllerOptional, Optional<Recents> recentsOptional, Lazy<StatusBar> statusBarLazy, ShadeController shadeController, NotificationRemoteInputManager notificationRemoteInputManager, @@ -430,7 +430,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mNavBarMode = navigationModeController.addListener(this); mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; - mDivider = divider; + mSplitScreenControllerOptional = splitScreenControllerOptional; mRecentsOptional = recentsOptional; mSystemActions = systemActions; mHandler = mainHandler; @@ -528,6 +528,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); + mSplitScreenControllerOptional.ifPresent(mNavigationBarView::registerDockedListener); prepareNavigationBarView(); checkNavBarModes(); @@ -559,7 +560,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, setDisabled2Flags(mDisabledFlags2); if (mIsOnDefaultDisplay) { mAssistHandlerViewController = - new AssistHandleViewController(mHandler, mNavigationBarView); + new AssistHandleViewController(mHandler, mNavigationBarView); getBarTransitions().addDarkIntensityListener(mAssistHandlerViewController); } @@ -690,7 +691,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, return; } - if (mStartingQuickSwitchRotation == -1 || mDivider.isDividerVisible()) { + if (mStartingQuickSwitchRotation == -1 || mSplitScreenControllerOptional + .map(SplitScreenController::isDividerVisible).orElse(false)) { // Hide the secondary home handle if we are in multiwindow since apps in multiwindow // aren't allowed to set the display orientation resetSecondaryHandle(); @@ -1121,7 +1123,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } mMetricsLogger.action(MetricsEvent.ACTION_ASSIST_LONG_PRESS); mUiEventLogger.log(NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS); - Bundle args = new Bundle(); + Bundle args = new Bundle(); args.putInt( AssistManager.INVOCATION_TYPE_KEY, AssistManager.INVOCATION_HOME_BUTTON_LONG_PRESS); mAssistManagerLazy.get().startAssist(args); @@ -1246,10 +1248,12 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private boolean onLongPressRecents() { if (mRecentsOptional.isPresent() || !ActivityTaskManager.supportsMultiWindow(mContext) - || !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible() || ActivityManager.isLowRamDeviceStatic() // If we are connected to the overview service, then disable the recents button - || mOverviewProxyService.getProxy() != null) { + || mOverviewProxyService.getProxy() != null + || !mSplitScreenControllerOptional.map(splitScreen -> + splitScreen.getDividerView().getSnapAlgorithm().isSplitScreenFeasible()) + .orElse(false)) { return false; } @@ -1311,6 +1315,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, /** * Returns the system UI flags corresponding the the current accessibility button state + * * @param outFeedbackEnabled if non-null, sets it to true if accessibility feedback is enabled. */ public int getA11yButtonState(@Nullable boolean[] outFeedbackEnabled) { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index fd157c632c7c..23ef71a6541e 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -55,7 +55,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.NotificationRemoteInputManager; @@ -96,7 +96,7 @@ public class NavigationBarController implements Callbacks, private final SysUiState mSysUiFlagsContainer; private final BroadcastDispatcher mBroadcastDispatcher; private final CommandQueue mCommandQueue; - private final Divider mDivider; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; private final Optional<Recents> mRecentsOptional; private final Lazy<StatusBar> mStatusBarLazy; private final ShadeController mShadeController; @@ -130,7 +130,7 @@ public class NavigationBarController implements Callbacks, SysUiState sysUiFlagsContainer, BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue, - Divider divider, + Optional<SplitScreenController> splitScreenControllerOptional, Optional<Recents> recentsOptional, Lazy<StatusBar> statusBarLazy, ShadeController shadeController, @@ -152,7 +152,7 @@ public class NavigationBarController implements Callbacks, mSysUiFlagsContainer = sysUiFlagsContainer; mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; - mDivider = divider; + mSplitScreenControllerOptional = splitScreenControllerOptional; mRecentsOptional = recentsOptional; mStatusBarLazy = statusBarLazy; mShadeController = shadeController; @@ -278,7 +278,7 @@ public class NavigationBarController implements Callbacks, mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, - mDivider, + mSplitScreenControllerOptional, mRecentsOptional, mStatusBarLazy, mShadeController, diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index a3351838ecf2..db34e8d6170b 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -87,14 +87,13 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.shared.system.WindowManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.LightBarTransitionsController; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.StatusBar; -import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.function.Consumer; @@ -912,9 +911,6 @@ public class NavigationBarView extends FrameLayout implements mNavigationInflaterView.setButtonDispatchers(mButtonDispatchers); getImeSwitchButton().setOnClickListener(mImeSwitcherClickListener); - - Divider divider = Dependency.get(Divider.class); - divider.registerInSplitScreenListener(mDockedListener); updateOrientationViews(); reloadNavIcons(); } @@ -1287,6 +1283,10 @@ public class NavigationBarView extends FrameLayout implements return super.onApplyWindowInsets(insets); } + void registerDockedListener(SplitScreenController splitScreenController) { + splitScreenController.registerInSplitScreenListener(mDockedListener); + } + private static void dumpButton(PrintWriter pw, String caption, ButtonDispatcher button) { pw.print(" " + caption + ": "); if (button == null) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 1ea58887ddc7..e558be297a8b 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -58,7 +58,7 @@ import android.window.WindowOrganizer; import com.android.internal.os.SomeArgs; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.pip.phone.PipUpdateThread; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -69,6 +69,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; /** @@ -104,7 +105,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize private final int mEnterExitAnimationDuration; private final PipSurfaceTransactionHelper mSurfaceTransactionHelper; private final Map<IBinder, Configuration> mInitialState = new HashMap<>(); - private final Divider mSplitDivider; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; protected final ShellTaskOrganizer mTaskOrganizer; // These callbacks are called on the update thread @@ -207,7 +208,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler, @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper, - @Nullable Divider divider, + Optional<SplitScreenController> splitScreenControllerOptional, @NonNull DisplayController displayController, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull ShellTaskOrganizer shellTaskOrganizer) { @@ -220,7 +221,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize mPipAnimationController = new PipAnimationController(mSurfaceTransactionHelper); mPipUiEventLoggerLogger = pipUiEventLogger; mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new; - mSplitDivider = divider; + mSplitScreenControllerOptional = splitScreenControllerOptional; mTaskOrganizer = shellTaskOrganizer; mTaskOrganizer.addListener(this, WINDOWING_MODE_PINNED); displayController.addDisplayWindowListener(this); @@ -336,9 +337,11 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize wct.setWindowingMode(mToken, getOutPipWindowingMode()); // Simply reset the activity mode set prior to the animation running. wct.setActivityWindowingMode(mToken, WINDOWING_MODE_UNDEFINED); - if (mSplitDivider != null && direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) { - wct.reparent(mToken, mSplitDivider.getSecondaryRoot(), true /* onTop */); - } + mSplitScreenControllerOptional.ifPresent(splitScreen -> { + if (direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) { + wct.reparent(mToken, splitScreen.getSecondaryRoot(), true /* onTop */); + } + }); } /** @@ -934,20 +937,22 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize } /** - * Sync with {@link #mSplitDivider} on destination bounds if PiP is going to split screen. + * Sync with {@link SplitScreenController} on destination bounds if PiP is going to split + * screen. * * @param destinationBoundsOut contain the updated destination bounds if applicable * @return {@code true} if destinationBounds is altered for split screen */ private boolean syncWithSplitScreenBounds(Rect destinationBoundsOut) { - if (mSplitDivider == null || !mSplitDivider.isDividerVisible()) { - // bail early if system is not in split screen mode + if (!mSplitScreenControllerOptional.isPresent()) { + // fail early if system is not in split screen mode return false; } + // PiP window will go to split-secondary mode instead of fullscreen, populates the // split screen bounds here. - destinationBoundsOut.set( - mSplitDivider.getView().getNonMinimizedSplitScreenSecondaryBounds()); + destinationBoundsOut.set(mSplitScreenControllerOptional.get().getDividerView() + .getNonMinimizedSplitScreenSecondaryBounds()); return true; } diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index 27cc3d458062..6aec14449d70 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -56,7 +56,7 @@ import com.android.systemui.shared.system.InputConsumerController; import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.WindowManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.FloatingContentCoordinator; @@ -65,6 +65,7 @@ import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; import java.io.PrintWriter; +import java.util.Optional; import javax.inject.Inject; @@ -270,7 +271,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio ConfigurationController configController, DeviceConfigProxy deviceConfig, DisplayController displayController, - Divider divider, + Optional<SplitScreenController> splitScreenControllerOptional, FloatingContentCoordinator floatingContentCoordinator, SysUiState sysUiState, PipUiEventLogger pipUiEventLogger, @@ -290,8 +291,8 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio mPipBoundsHandler = new PipBoundsHandler(mContext); mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(context, configController); mPipTaskOrganizer = new PipTaskOrganizer(mContext, mPipBoundsHandler, - mPipSurfaceTransactionHelper, divider, mDisplayController, pipUiEventLogger, - shellTaskOrganizer); + mPipSurfaceTransactionHelper, splitScreenControllerOptional, mDisplayController, + pipUiEventLogger, shellTaskOrganizer); mPipTaskOrganizer.registerPipTransitionCallback(this); mInputConsumerController = InputConsumerController.getPipInputConsumer(); mMediaController = new PipMediaController(context, mActivityManager, broadcastDispatcher); diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java index 0531ca195f95..5d8e6306ba69 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -60,13 +60,14 @@ import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.WindowManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import javax.inject.Inject; @@ -237,7 +238,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio public PipManager(Context context, BroadcastDispatcher broadcastDispatcher, ConfigurationController configController, DisplayController displayController, - Divider divider, + Optional<SplitScreenController> splitScreenControllerOptional, @NonNull PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer) { if (mInitialized) { @@ -257,8 +258,8 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio .getInteger(R.integer.config_pipResizeAnimationDuration); mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(context, configController); mPipTaskOrganizer = new PipTaskOrganizer(mContext, mPipBoundsHandler, - mPipSurfaceTransactionHelper, divider, displayController, pipUiEventLogger, - shellTaskOrganizer); + mPipSurfaceTransactionHelper, splitScreenControllerOptional, displayController, + pipUiEventLogger, shellTaskOrganizer); mPipTaskOrganizer.registerPipTransitionCallback(this); mActivityTaskManager = ActivityTaskManager.getService(); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskStackListener); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java index 0347867b61fc..3decb9688828 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java @@ -38,7 +38,7 @@ import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.phone.StatusBar; import java.util.Optional; @@ -56,7 +56,7 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { private final static String TAG = "OverviewProxyRecentsImpl"; @Nullable private final Lazy<StatusBar> mStatusBarLazy; - private final Optional<Divider> mDividerOptional; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; private Context mContext; private Handler mHandler; @@ -66,9 +66,9 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Inject public OverviewProxyRecentsImpl(Optional<Lazy<StatusBar>> statusBarLazy, - Optional<Divider> dividerOptional) { + Optional<SplitScreenController> splitScreenControllerOptional) { mStatusBarLazy = statusBarLazy.orElse(null); - mDividerOptional = dividerOptional; + mSplitScreenControllerOptional = splitScreenControllerOptional; } @Override @@ -163,12 +163,12 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { if (runningTask.supportsSplitScreenMultiWindow) { if (ActivityManagerWrapper.getInstance().setTaskWindowingModeSplitScreenPrimary( runningTask.id, stackCreateMode, initialBounds)) { - mDividerOptional.ifPresent(Divider::onDockedTopTask); - - // The overview service is handling split screen, so just skip the wait for the - // first draw and notify the divider to start animating now - mDividerOptional.ifPresent(Divider::onRecentsDrawn); - + mSplitScreenControllerOptional.ifPresent(splitScreen -> { + splitScreen.onDockedTopTask(); + // The overview service is handling split screen, so just skip the wait + // for the first draw and notify the divider to start animating now + splitScreen.onRecentsDrawn(); + }); return true; } } else { diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index e931a6bf179a..304dc93c5dee 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -86,7 +86,7 @@ import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.InputMonitorCompat; import com.android.systemui.shared.system.QuickStepContract; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.StatusBar; @@ -123,7 +123,7 @@ public class OverviewProxyService extends CurrentUserTracker implements private final Context mContext; private final PipUI mPipUI; private final Optional<Lazy<StatusBar>> mStatusBarOptionalLazy; - private final Optional<Divider> mDividerOptional; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; private SysUiState mSysUiState; private final Handler mHandler; private final Lazy<NavigationBarController> mNavBarControllerLazy; @@ -232,7 +232,9 @@ public class OverviewProxyService extends CurrentUserTracker implements } long token = Binder.clearCallingIdentity(); try { - mDividerOptional.ifPresent(Divider::onDockedFirstAnimationFrame); + mSplitScreenControllerOptional.ifPresent(splitScreen -> { + splitScreen.onDockedFirstAnimationFrame(); + }); } finally { Binder.restoreCallingIdentity(token); } @@ -262,8 +264,8 @@ public class OverviewProxyService extends CurrentUserTracker implements } long token = Binder.clearCallingIdentity(); try { - return mDividerOptional.map( - divider -> divider.getView().getNonMinimizedSplitScreenSecondaryBounds()) + return mSplitScreenControllerOptional.map(splitScreen -> + splitScreen.getDividerView().getNonMinimizedSplitScreenSecondaryBounds()) .orElse(null); } finally { Binder.restoreCallingIdentity(token); @@ -399,10 +401,8 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void setSplitScreenMinimized(boolean minimized) { - Divider divider = mDividerOptional.get(); - if (divider != null) { - divider.setMinimized(minimized); - } + mSplitScreenControllerOptional.ifPresent( + splitScreen -> splitScreen.setMinimized(minimized)); } @Override @@ -602,7 +602,7 @@ public class OverviewProxyService extends CurrentUserTracker implements public OverviewProxyService(Context context, CommandQueue commandQueue, Lazy<NavigationBarController> navBarControllerLazy, NavigationModeController navModeController, NotificationShadeWindowController statusBarWinController, SysUiState sysUiState, - PipUI pipUI, Optional<Divider> dividerOptional, + PipUI pipUI, Optional<SplitScreenController> splitScreenControllerOptional, Optional<Lazy<StatusBar>> statusBarOptionalLazy, OneHandedUI oneHandedUI, BroadcastDispatcher broadcastDispatcher) { super(broadcastDispatcher); @@ -613,7 +613,7 @@ public class OverviewProxyService extends CurrentUserTracker implements mNavBarControllerLazy = navBarControllerLazy; mStatusBarWinController = statusBarWinController; mConnectionBackoffAttempts = 0; - mDividerOptional = dividerOptional; + mSplitScreenControllerOptional = splitScreenControllerOptional; mRecentsComponentName = ComponentName.unflattenFromString(context.getString( com.android.internal.R.string.config_recentsComponentName)); mQuickStepIntent = new Intent(ACTION_QUICKSTEP) @@ -755,10 +755,8 @@ public class OverviewProxyService extends CurrentUserTracker implements startConnectionToCurrentUser(); // Clean up the minimized state if launcher dies - Divider divider = mDividerOptional.get(); - if (divider != null) { - divider.setMinimized(false); - } + mSplitScreenControllerOptional.ifPresent( + splitScreen -> splitScreen.setMinimized(false)); } public void startConnectionToCurrentUser() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java index 1d29ac629cd8..a641730ac64e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplementation.java @@ -35,7 +35,6 @@ public interface RecentsImplementation { default void showRecentApps(boolean triggeredFromAltTab) {} default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {} default void toggleRecentApps() {} - default void growRecents() {} default boolean splitPrimaryTask(int stackCreateMode, Rect initialBounds, int metricsDockAction) { return false; diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java index ee3303bf33ef..e2118a798a43 100644 --- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java @@ -30,8 +30,10 @@ import com.android.internal.policy.DividerSnapAlgorithm; import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.recents.Recents; -import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.DividerView; +import com.android.systemui.stackdivider.SplitScreenController; + +import java.util.Optional; import javax.inject.Inject; @@ -43,7 +45,7 @@ public class ShortcutKeyDispatcher extends SystemUI implements ShortcutKeyServiceProxy.Callbacks { private static final String TAG = "ShortcutKeyDispatcher"; - private final Divider mDivider; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; private final Recents mRecents; private ShortcutKeyServiceProxy mShortcutKeyServiceProxy = new ShortcutKeyServiceProxy(this); @@ -58,14 +60,16 @@ public class ShortcutKeyDispatcher extends SystemUI protected final long SC_DOCK_RIGHT = META_MASK | KeyEvent.KEYCODE_RIGHT_BRACKET; @Inject - public ShortcutKeyDispatcher(Context context, Divider divider, Recents recents) { + public ShortcutKeyDispatcher(Context context, + Optional<SplitScreenController> splitScreenControllerOptional, Recents recents) { super(context); - mDivider = divider; + mSplitScreenControllerOptional = splitScreenControllerOptional; mRecents = recents; } /** * Registers a shortcut key to window manager. + * * @param shortcutCode packed representation of shortcut key code and meta information */ public void registerShortcutKey(long shortcutCode) { @@ -92,24 +96,28 @@ public class ShortcutKeyDispatcher extends SystemUI } private void handleDockKey(long shortcutCode) { - if (mDivider == null || !mDivider.isDividerVisible()) { - // Split the screen - mRecents.splitPrimaryTask((shortcutCode == SC_DOCK_LEFT) - ? SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT - : SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT, null, -1); - } else { - // If there is already a docked window, we respond by resizing the docking pane. - DividerView dividerView = mDivider.getView(); - DividerSnapAlgorithm snapAlgorithm = dividerView.getSnapAlgorithm(); - int dividerPosition = dividerView.getCurrentPosition(); - DividerSnapAlgorithm.SnapTarget currentTarget = - snapAlgorithm.calculateNonDismissingSnapTarget(dividerPosition); - DividerSnapAlgorithm.SnapTarget target = (shortcutCode == SC_DOCK_LEFT) - ? snapAlgorithm.getPreviousTarget(currentTarget) - : snapAlgorithm.getNextTarget(currentTarget); - dividerView.startDragging(true /* animate */, false /* touching */); - dividerView.stopDragging(target.position, 0f, false /* avoidDismissStart */, - true /* logMetrics */); + if (mSplitScreenControllerOptional.isPresent()) { + SplitScreenController splitScreenController = mSplitScreenControllerOptional.get(); + if (splitScreenController.isDividerVisible()) { + // If there is already a docked window, we respond by resizing the docking pane. + DividerView dividerView = splitScreenController.getDividerView(); + DividerSnapAlgorithm snapAlgorithm = dividerView.getSnapAlgorithm(); + int dividerPosition = dividerView.getCurrentPosition(); + DividerSnapAlgorithm.SnapTarget currentTarget = + snapAlgorithm.calculateNonDismissingSnapTarget(dividerPosition); + DividerSnapAlgorithm.SnapTarget target = (shortcutCode == SC_DOCK_LEFT) + ? snapAlgorithm.getPreviousTarget(currentTarget) + : snapAlgorithm.getNextTarget(currentTarget); + dividerView.startDragging(true /* animate */, false /* touching */); + dividerView.stopDragging(target.position, 0f, false /* avoidDismissStart */, + true /* logMetrics */); + return; + } } + + // Split the screen + mRecents.splitPrimaryTask((shortcutCode == SC_DOCK_LEFT) + ? SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT + : SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT, null, -1); } } diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java b/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java deleted file mode 100644 index e9c880ebbcc9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.stackdivider; - -import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; - -import android.app.ActivityManager; -import android.content.Context; -import android.window.WindowContainerToken; - -import com.android.systemui.SystemUI; -import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.TaskStackChangeListener; -import com.android.systemui.statusbar.policy.KeyguardStateController; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.util.function.Consumer; - -/** - * Controls the docked stack divider. - */ -@SysUISingleton -public class Divider extends SystemUI { - private final KeyguardStateController mKeyguardStateController; - private final DividerController mDividerController; - - Divider(Context context, DividerController dividerController, - KeyguardStateController keyguardStateController) { - super(context); - mDividerController = dividerController; - mKeyguardStateController = keyguardStateController; - } - - @Override - public void start() { - mDividerController.start(); - // Hide the divider when keyguard is showing. Even though keyguard/statusbar is above - // everything, it is actually transparent except for notifications, so we still need to - // hide any surfaces that are below it. - // TODO(b/148906453): Figure out keyguard dismiss animation for divider view. - mKeyguardStateController.addCallback(new KeyguardStateController.Callback() { - @Override - public void onKeyguardShowingChanged() { - mDividerController.onKeyguardShowingChanged(mKeyguardStateController.isShowing()); - } - }); - // Don't initialize the divider or anything until we get the default display. - - ActivityManagerWrapper.getInstance().registerTaskStackListener( - new TaskStackChangeListener() { - @Override - public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, - boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { - if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode() - != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - || !mDividerController.isSplitScreenSupported()) { - return; - } - - if (mDividerController.isMinimized()) { - onUndockingTask(); - } - } - - @Override - public void onActivityForcedResizable(String packageName, int taskId, - int reason) { - mDividerController.onActivityForcedResizable(packageName, taskId, reason); - } - - @Override - public void onActivityDismissingDockedStack() { - mDividerController.onActivityDismissingSplitScreen(); - } - - @Override - public void onActivityLaunchOnSecondaryDisplayFailed() { - mDividerController.onActivityLaunchOnSecondaryDisplayFailed(); - } - } - ); - } - - @Override - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - mDividerController.dump(pw); - } - - /** Switch to minimized state if appropriate. */ - public void setMinimized(final boolean minimized) { - mDividerController.setMinimized(minimized); - } - - public boolean isMinimized() { - return mDividerController.isMinimized(); - } - - public boolean isHomeStackResizable() { - return mDividerController.isHomeStackResizable(); - } - - /** Callback for undocking task. */ - public void onUndockingTask() { - mDividerController.onUndockingTask(); - } - - public void onRecentsDrawn() { - mDividerController.onRecentsDrawn(); - } - - public void onDockedFirstAnimationFrame() { - mDividerController.onDockedFirstAnimationFrame(); - } - - public void onDockedTopTask() { - mDividerController.onDockedTopTask(); - } - - public void onAppTransitionFinished() { - mDividerController.onAppTransitionFinished(); - } - - public DividerView getView() { - return mDividerController.getDividerView(); - } - - /** @return the container token for the secondary split root task. */ - public WindowContainerToken getSecondaryRoot() { - return mDividerController.getSecondaryRoot(); - } - - /** Register a listener that gets called whenever the existence of the divider changes */ - public void registerInSplitScreenListener(Consumer<Boolean> listener) { - mDividerController.registerInSplitScreenListener(listener); - } - - /** {@code true} if this is visible */ - public boolean isDividerVisible() { - return mDividerController.isDividerVisible(); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java index c915f071297f..64ee7ed5e0e0 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerImeController.java @@ -38,7 +38,7 @@ import com.android.wm.shell.common.TransactionPool; class DividerImeController implements DisplayImeController.ImePositionProcessor { private static final String TAG = "DividerImeController"; - private static final boolean DEBUG = DividerController.DEBUG; + private static final boolean DEBUG = SplitScreenController.DEBUG; private static final float ADJUSTED_NONFOCUS_DIM = 0.3f; @@ -100,15 +100,15 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor } private DividerView getView() { - return mSplits.mDividerController.getDividerView(); + return mSplits.mSplitScreenController.getDividerView(); } private SplitDisplayLayout getLayout() { - return mSplits.mDividerController.getSplitLayout(); + return mSplits.mSplitScreenController.getSplitLayout(); } private boolean isDividerVisible() { - return mSplits.mDividerController.isDividerVisible(); + return mSplits.mSplitScreenController.isDividerVisible(); } private boolean getSecondaryHasFocus(int displayId) { @@ -151,7 +151,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor mSecondaryHasFocus = getSecondaryHasFocus(displayId); final boolean targetAdjusted = splitIsVisible && imeShouldShow && mSecondaryHasFocus && !imeIsFloating && !getLayout().mDisplayLayout.isLandscape() - && !mSplits.mDividerController.isMinimized(); + && !mSplits.mSplitScreenController.isMinimized(); if (mLastAdjustTop < 0) { mLastAdjustTop = imeShouldShow ? hiddenTop : shownTop; } else if (mLastAdjustTop != (imeShouldShow ? mShownTop : mHiddenTop)) { @@ -236,7 +236,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor SCREEN_WIDTH_DP_UNDEFINED, SCREEN_HEIGHT_DP_UNDEFINED); } - if (!mSplits.mDividerController.getWmProxy().queueSyncTransactionIfWaiting(wct)) { + if (!mSplits.mSplitScreenController.getWmProxy().queueSyncTransactionIfWaiting(wct)) { WindowOrganizer.applyTransaction(wct); } } @@ -250,7 +250,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor : DisplayImeController.ANIMATION_DURATION_HIDE_MS); } } - mSplits.mDividerController.setAdjustedForIme(mTargetShown && !mPaused); + mSplits.mSplitScreenController.setAdjustedForIme(mTargetShown && !mPaused); } public void updateAdjustForIme() { @@ -402,7 +402,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor mTargetAdjusted = mPausedTargetAdjusted; updateDimTargets(); final DividerView view = getView(); - if ((mTargetAdjusted != mAdjusted) && !mSplits.mDividerController.isMinimized() + if ((mTargetAdjusted != mAdjusted) && !mSplits.mSplitScreenController.isMinimized() && view != null) { // End unminimize animations since they conflict with adjustment animations. view.finishAnimations(); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerModule.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerModule.java deleted file mode 100644 index 9acb96bb45e9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerModule.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.stackdivider; - -import android.content.Context; -import android.os.Handler; - -import com.android.systemui.dagger.SysUISingleton; -import com.android.systemui.dagger.qualifiers.Main; -import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.wm.shell.ShellTaskOrganizer; -import com.android.wm.shell.common.DisplayController; -import com.android.wm.shell.common.DisplayImeController; -import com.android.wm.shell.common.SystemWindows; -import com.android.wm.shell.common.TransactionPool; - -import dagger.Module; -import dagger.Provides; - -/** - * Module which provides a Divider. - */ -@Module -public class DividerModule { - @SysUISingleton - @Provides - static Divider provideDivider(Context context, DisplayController displayController, - SystemWindows systemWindows, DisplayImeController imeController, @Main Handler handler, - KeyguardStateController keyguardStateController, TransactionPool transactionPool, - ShellTaskOrganizer shellTaskOrganizer) { - // TODO(b/161116823): fetch DividerProxy from WM shell lib. - DividerController dividerController = new DividerController(context, displayController, - systemWindows, imeController, handler, transactionPool, shellTaskOrganizer); - return new Divider(context, dividerController, keyguardStateController); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index e5c02d6fc454..95f048b0b06d 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -76,7 +76,7 @@ import java.util.function.Consumer; public class DividerView extends FrameLayout implements OnTouchListener, OnComputeInternalInsetsListener { private static final String TAG = "DividerView"; - private static final boolean DEBUG = DividerController.DEBUG; + private static final boolean DEBUG = SplitScreenController.DEBUG; public interface DividerCallbacks { void onDraggingStart(); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java index ff8bab07db05..4c26694cc22a 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java @@ -69,9 +69,9 @@ final class ForcedResizableInfoActivityController implements DividerView.Divider } public ForcedResizableInfoActivityController(Context context, - DividerController dividerController) { + SplitScreenController splitScreenController) { mContext = context; - dividerController.registerInSplitScreenListener(mDockedStackExistsListener); + splitScreenController.registerInSplitScreenListener(mDockedStackExistsListener); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenController.java index 9b5833b4c116..4cba9c7752eb 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenController.java @@ -49,26 +49,34 @@ import java.util.ArrayList; import java.util.function.Consumer; /** - * Controls the docked stack divider. + * Controls split screen. */ -public class DividerController implements DisplayController.OnDisplaysChangedListener { +// TODO(b/161116823): Extract as an interface to expose to SysUISingleton scope. +public class SplitScreenController implements DisplayController.OnDisplaysChangedListener { static final boolean DEBUG = false; + private static final String TAG = "Divider"; + private static final int DEFAULT_APP_TRANSITION_DURATION = 336; + + private final Context mContext; + private final DisplayChangeController.OnDisplayChangingListener mRotationController; + private final DisplayController mDisplayController; + private final DisplayImeController mImeController; + private final DividerImeController mImePositionProcessor; + private final DividerState mDividerState = new DividerState(); + private final ForcedResizableInfoActivityController mForcedResizableController; + private final Handler mHandler; + private final SplitScreenTaskOrganizer mSplits; + private final SystemWindows mSystemWindows; + final TransactionPool mTransactionPool; + private final WindowManagerProxy mWindowManagerProxy; + + private final ArrayList<WeakReference<Consumer<Boolean>>> mDockedStackExistsListeners = + new ArrayList<>(); - static final int DEFAULT_APP_TRANSITION_DURATION = 336; private DividerWindowManager mWindowManager; private DividerView mView; - private final DividerState mDividerState = new DividerState(); - private boolean mVisible = false; - private boolean mMinimized = false; - private boolean mAdjustedForIme = false; - private boolean mHomeStackResizable = false; - private ForcedResizableInfoActivityController mForcedResizableController; - private SystemWindows mSystemWindows; - private DisplayController mDisplayController; - private DisplayImeController mImeController; - final TransactionPool mTransactionPool; // Keeps track of real-time split geometry including snap positions and ime adjustments private SplitDisplayLayout mSplitLayout; @@ -78,19 +86,13 @@ public class DividerController implements DisplayController.OnDisplaysChangedLis // layout that we sent back to WM. private SplitDisplayLayout mRotateSplitLayout; - private final Handler mHandler; - private final WindowManagerProxy mWindowManagerProxy; - - private final ArrayList<WeakReference<Consumer<Boolean>>> mDockedStackExistsListeners = - new ArrayList<>(); - - private final SplitScreenTaskOrganizer mSplits; - private final DisplayChangeController.OnDisplayChangingListener mRotationController; - private final DividerImeController mImePositionProcessor; - private final Context mContext; private boolean mIsKeyguardShowing; + private boolean mVisible = false; + private boolean mMinimized = false; + private boolean mAdjustedForIme = false; + private boolean mHomeStackResizable = false; - public DividerController(Context context, + public SplitScreenController(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController imeController, Handler handler, TransactionPool transactionPool, ShellTaskOrganizer shellTaskOrganizer) { @@ -142,10 +144,7 @@ public class DividerController implements DisplayController.OnDisplaysChangedLis wct.merge(t, true /* transfer */); } }; - } - /** Inits the divider service. */ - public void start() { mWindowManager = new DividerWindowManager(mSystemWindows); mDisplayController.addDisplayWindowListener(this); // Don't initialize the divider or anything until we get the default display. @@ -157,15 +156,15 @@ public class DividerController implements DisplayController.OnDisplaysChangedLis } /** Called when keyguard showing state changed. */ - public void onKeyguardShowingChanged(boolean isShowing) { + public void onKeyguardVisibilityChanged(boolean showing) { if (!isSplitActive() || mView == null) { return; } - mView.setHidden(isShowing); - if (!isShowing) { + mView.setHidden(showing); + if (!showing) { mImePositionProcessor.updateAdjustForIme(); } - mIsKeyguardShowing = isShowing; + mIsKeyguardShowing = showing; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java index ffd0c7c061d6..325c5597f9d8 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenTaskOrganizer.java @@ -37,7 +37,7 @@ import com.android.wm.shell.ShellTaskOrganizer; class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { private static final String TAG = "SplitScreenTaskOrg"; - private static final boolean DEBUG = DividerController.DEBUG; + private static final boolean DEBUG = SplitScreenController.DEBUG; private final ShellTaskOrganizer mTaskOrganizer; @@ -48,14 +48,14 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { SurfaceControl mPrimaryDim; SurfaceControl mSecondaryDim; Rect mHomeBounds = new Rect(); - final DividerController mDividerController; + final SplitScreenController mSplitScreenController; private boolean mSplitScreenSupported = false; final SurfaceSession mSurfaceSession = new SurfaceSession(); - SplitScreenTaskOrganizer(DividerController dividerController, + SplitScreenTaskOrganizer(SplitScreenController splitScreenController, ShellTaskOrganizer shellTaskOrganizer) { - mDividerController = dividerController; + mSplitScreenController = splitScreenController; mTaskOrganizer = shellTaskOrganizer; mTaskOrganizer.addListener(this, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); @@ -81,11 +81,11 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { } SurfaceControl.Transaction getTransaction() { - return mDividerController.mTransactionPool.acquire(); + return mSplitScreenController.mTransactionPool.acquire(); } void releaseTransaction(SurfaceControl.Transaction t) { - mDividerController.mTransactionPool.release(t); + mSplitScreenController.mTransactionPool.release(t); } @Override @@ -146,7 +146,7 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { t.apply(); releaseTransaction(t); - mDividerController.onTaskVanished(); + mSplitScreenController.onTaskVanished(); } } } @@ -156,7 +156,7 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { if (taskInfo.displayId != DEFAULT_DISPLAY) { return; } - mDividerController.post(() -> handleTaskInfoChanged(taskInfo)); + mSplitScreenController.post(() -> handleTaskInfoChanged(taskInfo)); } /** @@ -175,7 +175,7 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { } final boolean secondaryImpliedMinimize = mSecondary.topActivityType == ACTIVITY_TYPE_HOME || (mSecondary.topActivityType == ACTIVITY_TYPE_RECENTS - && mDividerController.isHomeStackResizable()); + && mSplitScreenController.isHomeStackResizable()); final boolean primaryWasEmpty = mPrimary.topActivityType == ACTIVITY_TYPE_UNDEFINED; final boolean secondaryWasEmpty = mSecondary.topActivityType == ACTIVITY_TYPE_UNDEFINED; if (info.token.asBinder() == mPrimary.token.asBinder()) { @@ -187,7 +187,7 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { final boolean secondaryIsEmpty = mSecondary.topActivityType == ACTIVITY_TYPE_UNDEFINED; final boolean secondaryImpliesMinimize = mSecondary.topActivityType == ACTIVITY_TYPE_HOME || (mSecondary.topActivityType == ACTIVITY_TYPE_RECENTS - && mDividerController.isHomeStackResizable()); + && mSplitScreenController.isHomeStackResizable()); if (DEBUG) { Log.d(TAG, "onTaskInfoChanged " + mPrimary + " " + mSecondary); } @@ -203,14 +203,14 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { Log.d(TAG, " at-least one split empty " + mPrimary.topActivityType + " " + mSecondary.topActivityType); } - if (mDividerController.isDividerVisible()) { + if (mSplitScreenController.isDividerVisible()) { // Was in split-mode, which means we are leaving split, so continue that. // This happens when the stack in the primary-split is dismissed. if (DEBUG) { Log.d(TAG, " was in split, so this means leave it " + mPrimary.topActivityType + " " + mSecondary.topActivityType); } - mDividerController.startDismissSplit(); + mSplitScreenController.startDismissSplit(); } else if (!primaryIsEmpty && primaryWasEmpty && secondaryWasEmpty) { // Wasn't in split-mode (both were empty), but now that the primary split is // populated, we should fully enter split by moving everything else into secondary. @@ -219,15 +219,15 @@ class SplitScreenTaskOrganizer implements ShellTaskOrganizer.TaskListener { if (DEBUG) { Log.d(TAG, " was not in split, but primary is populated, so enter it"); } - mDividerController.startEnterSplit(); + mSplitScreenController.startEnterSplit(); } } else if (secondaryImpliesMinimize) { // Both splits are populated but the secondary split has a home/recents stack on top, // so enter minimized mode. - mDividerController.ensureMinimizedSplit(); + mSplitScreenController.ensureMinimizedSplit(); } else { // Both splits are populated by normal activities, so make sure we aren't minimized. - mDividerController.ensureNormalSplit(); + mSplitScreenController.ensureNormalSplit(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SyncTransactionQueue.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SyncTransactionQueue.java index f2500e59abab..13ed02e9513e 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SyncTransactionQueue.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SyncTransactionQueue.java @@ -33,7 +33,7 @@ import java.util.ArrayList; * Helper for serializing sync-transactions and corresponding callbacks. */ class SyncTransactionQueue { - private static final boolean DEBUG = DividerController.DEBUG; + private static final boolean DEBUG = SplitScreenController.DEBUG; private static final String TAG = "SyncTransactionQueue"; // Just a little longer than the sync-engine timeout of 5s diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java index ea614fb210b3..c27f66356ff3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java @@ -55,12 +55,13 @@ import com.android.systemui.R; import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.UiBackground; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.NotificationChannels; import java.util.List; +import java.util.Optional; import java.util.concurrent.Executor; import javax.inject.Inject; @@ -80,13 +81,14 @@ public class InstantAppNotifier extends SystemUI private final CommandQueue mCommandQueue; private boolean mDockedStackExists; private KeyguardStateController mKeyguardStateController; - private final Divider mDivider; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; @Inject public InstantAppNotifier(Context context, CommandQueue commandQueue, - @UiBackground Executor uiBgExecutor, Divider divider) { + @UiBackground Executor uiBgExecutor, + Optional<SplitScreenController> splitScreenControllerOptional) { super(context); - mDivider = divider; + mSplitScreenControllerOptional = splitScreenControllerOptional; mCommandQueue = commandQueue; mUiBgExecutor = uiBgExecutor; } @@ -105,11 +107,11 @@ public class InstantAppNotifier extends SystemUI mCommandQueue.addCallback(this); mKeyguardStateController.addCallback(this); - mDivider.registerInSplitScreenListener( - exists -> { + mSplitScreenControllerOptional.ifPresent(splitScreen -> + splitScreen.registerInSplitScreenListener(exists -> { mDockedStackExists = exists; updateForegroundInstantApps(); - }); + })); // Clear out all old notifications on startup (only present in the case where sysui dies) NotificationManager noMan = mContext.getSystemService(NotificationManager.class); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 6e37f90f9d94..9391104fc2b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -177,7 +177,7 @@ import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.system.WindowManagerWrapper; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.BackDropView; import com.android.systemui.statusbar.CommandQueue; @@ -388,7 +388,7 @@ public class StatusBar extends SystemUI implements DemoMode, private final Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy; private final Provider<StatusBarComponent.Builder> mStatusBarComponentBuilder; private final PluginManager mPluginManager; - private final Optional<Divider> mDividerOptional; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; private final StatusBarNotificationActivityStarter.Builder mStatusBarNotificationActivityStarterBuilder; private final ShadeController mShadeController; @@ -721,7 +721,7 @@ public class StatusBar extends SystemUI implements DemoMode, Optional<Recents> recentsOptional, Provider<StatusBarComponent.Builder> statusBarComponentBuilder, PluginManager pluginManager, - Optional<Divider> dividerOptional, + Optional<SplitScreenController> splitScreenControllerOptional, LightsOutNotifController lightsOutNotifController, StatusBarNotificationActivityStarter.Builder statusBarNotificationActivityStarterBuilder, @@ -803,7 +803,7 @@ public class StatusBar extends SystemUI implements DemoMode, mRecentsOptional = recentsOptional; mStatusBarComponentBuilder = statusBarComponentBuilder; mPluginManager = pluginManager; - mDividerOptional = dividerOptional; + mSplitScreenControllerOptional = splitScreenControllerOptional; mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder; mShadeController = shadeController; mSuperStatusBarViewFactory = superStatusBarViewFactory; @@ -1550,31 +1550,32 @@ public class StatusBar extends SystemUI implements DemoMode, if (!mRecentsOptional.isPresent()) { return false; } - Divider divider = null; - if (mDividerOptional.isPresent()) { - divider = mDividerOptional.get(); - } - if (divider == null || !divider.isDividerVisible()) { - final int navbarPos = WindowManagerWrapper.getInstance().getNavBarPosition(mDisplayId); - if (navbarPos == NAV_BAR_POS_INVALID) { - return false; - } - int createMode = navbarPos == NAV_BAR_POS_LEFT - ? SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT - : SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; - return mRecentsOptional.get().splitPrimaryTask(createMode, null, metricsDockAction); - } else { - if (divider.isMinimized() && !divider.isHomeStackResizable()) { - // Undocking from the minimized state is not supported - return false; - } else { - divider.onUndockingTask(); - if (metricsUndockAction != -1) { - mMetricsLogger.action(metricsUndockAction); + + if (mSplitScreenControllerOptional.isPresent()) { + SplitScreenController splitScreenController = mSplitScreenControllerOptional.get(); + if (splitScreenController.isDividerVisible()) { + if (splitScreenController.isMinimized() + && !splitScreenController.isHomeStackResizable()) { + // Undocking from the minimized state is not supported + return false; + } else { + splitScreenController.onUndockingTask(); + if (metricsUndockAction != -1) { + mMetricsLogger.action(metricsUndockAction); + } } + return true; } } - return true; + + final int navbarPos = WindowManagerWrapper.getInstance().getNavBarPosition(mDisplayId); + if (navbarPos == NAV_BAR_POS_INVALID) { + return false; + } + int createMode = navbarPos == NAV_BAR_POS_LEFT + ? SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT + : SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; + return mRecentsOptional.get().splitPrimaryTask(createMode, null, metricsDockAction); } /** @@ -3916,14 +3917,16 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void appTransitionCancelled(int displayId) { if (displayId == mDisplayId) { - mDividerOptional.ifPresent(Divider::onAppTransitionFinished); + mSplitScreenControllerOptional.ifPresent( + splitScreen -> splitScreen.onAppTransitionFinished()); } } @Override public void appTransitionFinished(int displayId) { if (displayId == mDisplayId) { - mDividerOptional.ifPresent(Divider::onAppTransitionFinished); + mSplitScreenControllerOptional.ifPresent( + splitScreen -> splitScreen.onAppTransitionFinished()); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java index 2768b826fcfe..024a77664781 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.java @@ -46,7 +46,7 @@ import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationLockscreenUserManager; @@ -180,7 +180,7 @@ public interface StatusBarPhoneModule { Optional<Recents> recentsOptional, Provider<StatusBarComponent.Builder> statusBarComponentBuilder, PluginManager pluginManager, - Optional<Divider> dividerOptional, + Optional<SplitScreenController> splitScreenControllerOptional, LightsOutNotifController lightsOutNotifController, StatusBarNotificationActivityStarter.Builder statusBarNotificationActivityStarterBuilder, @@ -260,7 +260,7 @@ public interface StatusBarPhoneModule { recentsOptional, statusBarComponentBuilder, pluginManager, - dividerOptional, + splitScreenControllerOptional, lightsOutNotifController, statusBarNotificationActivityStarterBuilder, shadeController, diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java index ca9cb08c0a59..e7c10f1697f5 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java @@ -42,7 +42,6 @@ import com.android.systemui.qs.dagger.QSModule; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsImplementation; -import com.android.systemui.stackdivider.DividerModule; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl; @@ -76,7 +75,6 @@ import dagger.Provides; * overridden by the System UI implementation. */ @Module(includes = { - DividerModule.class, QSModule.class, WMShellModule.class }, diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java new file mode 100644 index 000000000000..b7d6903be23a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.wmshell; + +import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; + +import android.app.ActivityManager; +import android.content.Context; + +import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.systemui.SystemUI; +import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.TaskStackChangeListener; +import com.android.systemui.stackdivider.SplitScreenController; +import com.android.wm.shell.common.DisplayImeController; + +import java.util.Optional; + +import javax.inject.Inject; + +/** + * Proxy in SysUiScope to delegate events to controllers in WM Shell library. + */ +@SysUISingleton +public final class WMShell extends SystemUI { + private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; + private final DisplayImeController mDisplayImeController; + private final Optional<SplitScreenController> mSplitScreenControllerOptional; + + @Inject + WMShell(Context context, KeyguardUpdateMonitor keyguardUpdateMonitor, + DisplayImeController displayImeController, + Optional<SplitScreenController> splitScreenControllerOptional) { + super(context); + mKeyguardUpdateMonitor = keyguardUpdateMonitor; + mDisplayImeController = displayImeController; + mSplitScreenControllerOptional = splitScreenControllerOptional; + } + + @Override + public void start() { + // This is to prevent circular init problem by separating registration step out of its + // constructor. And make sure the initialization of DisplayImeController won't depend on + // specific feature anymore. + mDisplayImeController.startMonitorDisplays(); + + mSplitScreenControllerOptional.ifPresent(this::initSplitScreenController); + } + + private void initSplitScreenController(SplitScreenController splitScreenController) { + mKeyguardUpdateMonitor.registerCallback(new KeyguardUpdateMonitorCallback() { + @Override + public void onKeyguardVisibilityChanged(boolean showing) { + // Hide the divider when keyguard is showing. Even though keyguard/statusbar is + // above everything, it is actually transparent except for notifications, so + // we still need to hide any surfaces that are below it. + // TODO(b/148906453): Figure out keyguard dismiss animation for divider view. + splitScreenController.onKeyguardVisibilityChanged(showing); + } + }); + + ActivityManagerWrapper.getInstance().registerTaskStackListener( + new TaskStackChangeListener() { + @Override + public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, + boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { + if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode() + != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY + || !splitScreenController.isSplitScreenSupported()) { + return; + } + + if (splitScreenController.isMinimized()) { + splitScreenController.onUndockingTask(); + } + } + + @Override + public void onActivityForcedResizable(String packageName, int taskId, + int reason) { + splitScreenController + .onActivityForcedResizable(packageName, taskId, reason); + } + + @Override + public void onActivityDismissingDockedStack() { + splitScreenController.onActivityDismissingSplitScreen(); + } + + @Override + public void onActivityLaunchOnSecondaryDisplayFailed() { + splitScreenController.onActivityLaunchOnSecondaryDisplayFailed(); + } + }); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java index 18cb7d3b3200..3111b13bc7f4 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java @@ -24,6 +24,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.pip.PipUiEventLogger; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.FloatingContentCoordinator; import com.android.wm.shell.ShellTaskOrganizer; @@ -31,6 +32,7 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TransactionPool; +import dagger.BindsOptionalOf; import dagger.Module; import dagger.Provides; @@ -40,7 +42,7 @@ import dagger.Provides; */ // TODO(b/162923491): Move most of these dependencies into WMSingleton scope. @Module -public class WMShellBaseModule { +public abstract class WMShellBaseModule { @SysUISingleton @Provides static TransactionPool provideTransactionPool() { @@ -59,6 +61,7 @@ public class WMShellBaseModule { static DeviceConfigProxy provideDeviceConfigProxy() { return new DeviceConfigProxy(); } + @SysUISingleton @Provides static FloatingContentCoordinator provideFloatingContentCoordinator() { @@ -80,9 +83,12 @@ public class WMShellBaseModule { @SysUISingleton @Provides - public ShellTaskOrganizer provideShellTaskOrganizer() { + static ShellTaskOrganizer provideShellTaskOrganizer() { ShellTaskOrganizer organizer = new ShellTaskOrganizer(); organizer.registerOrganizer(); return organizer; } + + @BindsOptionalOf + abstract SplitScreenController optionalSplitScreenController(); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index 44bb6ac5a49c..ceb6d5970007 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -16,6 +16,7 @@ package com.android.systemui.wmshell; +import android.content.Context; import android.os.Handler; import android.view.IWindowManager; @@ -23,8 +24,11 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.pip.phone.PipMenuActivity; import com.android.systemui.pip.phone.dagger.PipMenuActivityClass; +import com.android.systemui.stackdivider.SplitScreenController; +import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayImeController; +import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.common.TransactionPool; import dagger.Module; @@ -42,8 +46,7 @@ public class WMShellModule { static DisplayImeController provideDisplayImeController(IWindowManager wmService, DisplayController displayController, @Main Handler mainHandler, TransactionPool transactionPool) { - return new DisplayImeController.Builder(wmService, displayController, mainHandler, - transactionPool).build(); + return new DisplayImeController(wmService, displayController, mainHandler, transactionPool); } /** TODO(b/150319024): PipMenuActivity will move to a Window */ @@ -53,4 +56,14 @@ public class WMShellModule { static Class<?> providePipMenuActivityClass() { return PipMenuActivity.class; } + + @SysUISingleton + @Provides + static SplitScreenController provideSplitScreenController(Context context, + DisplayController displayController, SystemWindows systemWindows, + DisplayImeController displayImeController, @Main Handler handler, + TransactionPool transactionPool, ShellTaskOrganizer shellTaskOrganizer) { + return new SplitScreenController(context, displayController, systemWindows, + displayImeController, handler, transactionPool, shellTaskOrganizer); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java index 2e4d8a7ff472..4bc9b464334d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java @@ -52,7 +52,7 @@ 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.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -61,13 +61,13 @@ import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import java.util.Optional; - import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Optional; + /** atest NavigationBarControllerTest */ @RunWith(AndroidTestingRunner.class) @RunWithLooper @@ -90,13 +90,13 @@ public class NavigationBarControllerTest extends SysuiTestCase { mock(AccessibilityManagerWrapper.class), mock(DeviceProvisionedController.class), mock(MetricsLogger.class), - mock(OverviewProxyService.class), + mock(OverviewProxyService.class), mock(NavigationModeController.class), mock(StatusBarStateController.class), mock(SysUiState.class), mock(BroadcastDispatcher.class), mock(CommandQueue.class), - mock(Divider.class), + Optional.of(mock(SplitScreenController.class)), Optional.of(mock(Recents.class)), () -> mock(StatusBar.class), mock(ShadeController.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index a643c2dc0f19..63821c400e23 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -68,7 +68,7 @@ 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.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -121,7 +121,6 @@ public class NavigationBarTest extends SysuiTestCase { mDependency.injectMockDependency(KeyguardStateController.class); mDependency.injectMockDependency(StatusBarStateController.class); mDependency.injectMockDependency(NavigationBarController.class); - mDependency.injectMockDependency(Divider.class); mOverviewProxyService = mDependency.injectMockDependency(OverviewProxyService.class); TestableLooper.get(this).runWithLooper(() -> { mHandler = new Handler(); @@ -224,7 +223,7 @@ public class NavigationBarTest extends SysuiTestCase { mMockSysUiState, mBroadcastDispatcher, mCommandQueue, - mock(Divider.class), + Optional.of(mock(SplitScreenController.class)), Optional.of(mock(Recents.class)), () -> mock(StatusBar.class), mock(ShadeController.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 8462386aaf2d..869fbd813e9e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -96,7 +96,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.stackdivider.Divider; +import com.android.systemui.stackdivider.SplitScreenController; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.KeyguardIndicationController; import com.android.systemui.statusbar.NotificationListener; @@ -238,7 +238,7 @@ public class StatusBarTest extends SysuiTestCase { @Mock private StatusBarComponent.Builder mStatusBarComponentBuilder; @Mock private StatusBarComponent mStatusBarComponent; @Mock private PluginManager mPluginManager; - @Mock private Divider mDivider; + @Mock private SplitScreenController mSplitScreenController; @Mock private SuperStatusBarViewFactory mSuperStatusBarViewFactory; @Mock private LightsOutNotifController mLightsOutNotifController; @Mock private ViewMediatorCallback mViewMediatorCallback; @@ -397,7 +397,7 @@ public class StatusBarTest extends SysuiTestCase { Optional.of(mRecents), mStatusBarComponentBuilderProvider, mPluginManager, - Optional.of(mDivider), + Optional.of(mSplitScreenController), mLightsOutNotifController, mStatusBarNotificationActivityStarterBuilder, mShadeController, |