diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index e5e3a1d16c01b..8a67e968ae134 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, Optional recentsOptional, Lazy statusBarLazy, ShadeController shadeController, @@ -215,7 +215,7 @@ public class DependencyProvider { sysUiFlagsContainer, broadcastDispatcher, commandQueue, - splitScreenControllerOptional, + splitScreenOptional, recentsOptional, statusBarLazy, shadeController, diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 33431a31d3efe..aec3543de4eb8 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -122,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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; @@ -179,7 +179,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private final NavigationModeController mNavigationModeController; private final BroadcastDispatcher mBroadcastDispatcher; private final CommandQueue mCommandQueue; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; private final Optional mRecentsOptional; private final SystemActions mSystemActions; private final Handler mHandler; @@ -406,7 +406,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, SysUiState sysUiFlagsContainer, BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, Optional recentsOptional, Lazy statusBarLazy, ShadeController shadeController, NotificationRemoteInputManager notificationRemoteInputManager, @@ -430,7 +430,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mNavBarMode = navigationModeController.addListener(this); mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mRecentsOptional = recentsOptional; mSystemActions = systemActions; mHandler = mainHandler; @@ -528,7 +528,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } mNavigationBarView.setNavigationIconHints(mNavigationIconHints); mNavigationBarView.setWindowVisible(isNavBarWindowVisible()); - mSplitScreenControllerOptional.ifPresent(mNavigationBarView::registerDockedListener); + mSplitScreenOptional.ifPresent(mNavigationBarView::registerDockedListener); prepareNavigationBarView(); checkNavBarModes(); @@ -691,8 +691,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, return; } - if (mStartingQuickSwitchRotation == -1 || mSplitScreenControllerOptional - .map(SplitScreenController::isDividerVisible).orElse(false)) { + if (mStartingQuickSwitchRotation == -1 || mSplitScreenOptional + .map(SplitScreen::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(); @@ -1251,7 +1251,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, || ActivityManager.isLowRamDeviceStatic() // If we are connected to the overview service, then disable the recents button || mOverviewProxyService.getProxy() != null - || !mSplitScreenControllerOptional.map(splitScreen -> + || !mSplitScreenOptional.map(splitScreen -> splitScreen.getDividerView().getSnapAlgorithm().isSplitScreenFeasible()) .orElse(false)) { return false; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index 23ef71a6541eb..9b9dc6dec5838 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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 Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; private final Optional mRecentsOptional; private final Lazy mStatusBarLazy; private final ShadeController mShadeController; @@ -130,7 +130,7 @@ public class NavigationBarController implements Callbacks, SysUiState sysUiFlagsContainer, BroadcastDispatcher broadcastDispatcher, CommandQueue commandQueue, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, Optional recentsOptional, Lazy statusBarLazy, ShadeController shadeController, @@ -152,7 +152,7 @@ public class NavigationBarController implements Callbacks, mSysUiFlagsContainer = sysUiFlagsContainer; mBroadcastDispatcher = broadcastDispatcher; mCommandQueue = commandQueue; - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mRecentsOptional = recentsOptional; mStatusBarLazy = statusBarLazy; mShadeController = shadeController; @@ -278,7 +278,7 @@ public class NavigationBarController implements Callbacks, mSysUiFlagsContainer, mBroadcastDispatcher, mCommandQueue, - mSplitScreenControllerOptional, + mSplitScreenOptional, 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 84a13a9d3c912..8a468f6eb7097 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -87,7 +87,7 @@ 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.LightBarTransitionsController; @@ -1283,8 +1283,8 @@ public class NavigationBarView extends FrameLayout implements return super.onApplyWindowInsets(insets); } - void registerDockedListener(SplitScreenController splitScreenController) { - splitScreenController.registerInSplitScreenListener(mDockedListener); + void registerDockedListener(SplitScreen splitScreen) { + splitScreen.registerInSplitScreenListener(mDockedListener); } private static void dumpButton(PrintWriter pw, String caption, ButtonDispatcher button) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 3adf7ffb347b4..7421ec14398b6 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.wm.shell.R; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -105,7 +105,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize private final int mEnterExitAnimationDuration; private final PipSurfaceTransactionHelper mSurfaceTransactionHelper; private final Map mInitialState = new HashMap<>(); - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; protected final ShellTaskOrganizer mTaskOrganizer; // These callbacks are called on the update thread @@ -208,7 +208,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize public PipTaskOrganizer(Context context, @NonNull PipBoundsHandler boundsHandler, @NonNull PipSurfaceTransactionHelper surfaceTransactionHelper, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, @NonNull DisplayController displayController, @NonNull PipUiEventLogger pipUiEventLogger, @NonNull ShellTaskOrganizer shellTaskOrganizer) { @@ -221,7 +221,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize mPipAnimationController = new PipAnimationController(mSurfaceTransactionHelper); mPipUiEventLoggerLogger = pipUiEventLogger; mSurfaceControlTransactionFactory = SurfaceControl.Transaction::new; - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mTaskOrganizer = shellTaskOrganizer; mTaskOrganizer.addListener(this, WINDOWING_MODE_PINNED); displayController.addDisplayWindowListener(this); @@ -337,7 +337,7 @@ 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); - mSplitScreenControllerOptional.ifPresent(splitScreen -> { + mSplitScreenOptional.ifPresent(splitScreen -> { if (direction == TRANSITION_DIRECTION_LEAVE_PIP_TO_SPLIT_SCREEN) { wct.reparent(mToken, splitScreen.getSecondaryRoot(), true /* onTop */); } @@ -937,26 +937,25 @@ public class PipTaskOrganizer extends TaskOrganizer implements ShellTaskOrganize } /** - * Sync with {@link SplitScreenController} on destination bounds if PiP is going to split - * screen. + * Sync with {@link SplitScreen} 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 (!mSplitScreenControllerOptional.isPresent()) { + if (!mSplitScreenOptional.isPresent()) { return false; } - SplitScreenController splitScreenController = mSplitScreenControllerOptional.get(); - if (!splitScreenController.isDividerVisible()) { + SplitScreen splitScreen = mSplitScreenOptional.get(); + if (!splitScreen.isDividerVisible()) { // 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(splitScreenController.getDividerView() + destinationBoundsOut.set(splitScreen.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 6aec14449d702..d8864ec72dc3a 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.FloatingContentCoordinator; @@ -271,7 +271,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio ConfigurationController configController, DeviceConfigProxy deviceConfig, DisplayController displayController, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, FloatingContentCoordinator floatingContentCoordinator, SysUiState sysUiState, PipUiEventLogger pipUiEventLogger, @@ -291,7 +291,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio mPipBoundsHandler = new PipBoundsHandler(mContext); mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(context, configController); mPipTaskOrganizer = new PipTaskOrganizer(mContext, mPipBoundsHandler, - mPipSurfaceTransactionHelper, splitScreenControllerOptional, mDisplayController, + mPipSurfaceTransactionHelper, splitScreenOptional, mDisplayController, pipUiEventLogger, shellTaskOrganizer); mPipTaskOrganizer.registerPipTransitionCallback(this); mInputConsumerController = InputConsumerController.getPipInputConsumer(); 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 5d8e6306ba69e..8d0948b16d202 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -60,7 +60,7 @@ 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -238,7 +238,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio public PipManager(Context context, BroadcastDispatcher broadcastDispatcher, ConfigurationController configController, DisplayController displayController, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, @NonNull PipUiEventLogger pipUiEventLogger, ShellTaskOrganizer shellTaskOrganizer) { if (mInitialized) { @@ -258,7 +258,7 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio .getInteger(R.integer.config_pipResizeAnimationDuration); mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(context, configController); mPipTaskOrganizer = new PipTaskOrganizer(mContext, mPipBoundsHandler, - mPipSurfaceTransactionHelper, splitScreenControllerOptional, displayController, + mPipSurfaceTransactionHelper, splitScreenOptional, displayController, pipUiEventLogger, shellTaskOrganizer); mPipTaskOrganizer.registerPipTransitionCallback(this); mActivityTaskManager = ActivityTaskManager.getService(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyRecentsImpl.java index 3decb9688828d..1a7e2290e044e 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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 mStatusBarLazy; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; private Context mContext; private Handler mHandler; @@ -66,9 +66,9 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Inject public OverviewProxyRecentsImpl(Optional> statusBarLazy, - Optional splitScreenControllerOptional) { + Optional splitScreenOptional) { mStatusBarLazy = statusBarLazy.orElse(null); - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; } @Override @@ -163,7 +163,7 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation { if (runningTask.supportsSplitScreenMultiWindow) { if (ActivityManagerWrapper.getInstance().setTaskWindowingModeSplitScreenPrimary( runningTask.id, stackCreateMode, initialBounds)) { - mSplitScreenControllerOptional.ifPresent(splitScreen -> { + mSplitScreenOptional.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 diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 304dc93c5dee4..c0cc58638e3f8 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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> mStatusBarOptionalLazy; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; private SysUiState mSysUiState; private final Handler mHandler; private final Lazy mNavBarControllerLazy; @@ -232,7 +232,7 @@ public class OverviewProxyService extends CurrentUserTracker implements } long token = Binder.clearCallingIdentity(); try { - mSplitScreenControllerOptional.ifPresent(splitScreen -> { + mSplitScreenOptional.ifPresent(splitScreen -> { splitScreen.onDockedFirstAnimationFrame(); }); } finally { @@ -264,7 +264,7 @@ public class OverviewProxyService extends CurrentUserTracker implements } long token = Binder.clearCallingIdentity(); try { - return mSplitScreenControllerOptional.map(splitScreen -> + return mSplitScreenOptional.map(splitScreen -> splitScreen.getDividerView().getNonMinimizedSplitScreenSecondaryBounds()) .orElse(null); } finally { @@ -401,7 +401,7 @@ public class OverviewProxyService extends CurrentUserTracker implements @Override public void setSplitScreenMinimized(boolean minimized) { - mSplitScreenControllerOptional.ifPresent( + mSplitScreenOptional.ifPresent( splitScreen -> splitScreen.setMinimized(minimized)); } @@ -602,7 +602,7 @@ public class OverviewProxyService extends CurrentUserTracker implements public OverviewProxyService(Context context, CommandQueue commandQueue, Lazy navBarControllerLazy, NavigationModeController navModeController, NotificationShadeWindowController statusBarWinController, SysUiState sysUiState, - PipUI pipUI, Optional splitScreenControllerOptional, + PipUI pipUI, Optional splitScreenOptional, Optional> statusBarOptionalLazy, OneHandedUI oneHandedUI, BroadcastDispatcher broadcastDispatcher) { super(broadcastDispatcher); @@ -613,7 +613,7 @@ public class OverviewProxyService extends CurrentUserTracker implements mNavBarControllerLazy = navBarControllerLazy; mStatusBarWinController = statusBarWinController; mConnectionBackoffAttempts = 0; - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mRecentsComponentName = ComponentName.unflattenFromString(context.getString( com.android.internal.R.string.config_recentsComponentName)); mQuickStepIntent = new Intent(ACTION_QUICKSTEP) @@ -755,7 +755,7 @@ public class OverviewProxyService extends CurrentUserTracker implements startConnectionToCurrentUser(); // Clean up the minimized state if launcher dies - mSplitScreenControllerOptional.ifPresent( + mSplitScreenOptional.ifPresent( splitScreen -> splitScreen.setMinimized(false)); } diff --git a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java index e2118a798a436..0d92d1e198e73 100644 --- a/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java @@ -31,7 +31,7 @@ import com.android.systemui.SystemUI; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.recents.Recents; import com.android.systemui.stackdivider.DividerView; -import com.android.systemui.stackdivider.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import java.util.Optional; @@ -45,7 +45,7 @@ public class ShortcutKeyDispatcher extends SystemUI implements ShortcutKeyServiceProxy.Callbacks { private static final String TAG = "ShortcutKeyDispatcher"; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; private final Recents mRecents; private ShortcutKeyServiceProxy mShortcutKeyServiceProxy = new ShortcutKeyServiceProxy(this); @@ -61,9 +61,9 @@ public class ShortcutKeyDispatcher extends SystemUI @Inject public ShortcutKeyDispatcher(Context context, - Optional splitScreenControllerOptional, Recents recents) { + Optional splitScreenOptional, Recents recents) { super(context); - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mRecents = recents; } @@ -96,11 +96,11 @@ public class ShortcutKeyDispatcher extends SystemUI } private void handleDockKey(long shortcutCode) { - if (mSplitScreenControllerOptional.isPresent()) { - SplitScreenController splitScreenController = mSplitScreenControllerOptional.get(); - if (splitScreenController.isDividerVisible()) { + if (mSplitScreenOptional.isPresent()) { + SplitScreen splitScreen = mSplitScreenOptional.get(); + if (splitScreen.isDividerVisible()) { // If there is already a docked window, we respond by resizing the docking pane. - DividerView dividerView = splitScreenController.getDividerView(); + DividerView dividerView = splitScreen.getDividerView(); DividerSnapAlgorithm snapAlgorithm = dividerView.getSnapAlgorithm(); int dividerPosition = dividerView.getCurrentPosition(); DividerSnapAlgorithm.SnapTarget currentTarget = diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreen.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreen.java new file mode 100644 index 0000000000000..91850cc46ab6a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreen.java @@ -0,0 +1,86 @@ +/* + * 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.stackdivider; + +import android.window.WindowContainerToken; + +import java.io.PrintWriter; +import java.util.function.Consumer; + +/** + * Interface to engage split screen feature. + */ +public interface SplitScreen { + /** Returns {@code true} if split screen is supported on the device. */ + boolean isSplitScreenSupported(); + + /** Called when keyguard showing state changed. */ + void onKeyguardVisibilityChanged(boolean isShowing); + + /** Returns {@link DividerView}. */ + DividerView getDividerView(); + + /** Returns {@code true} if one of the split screen is in minimized mode. */ + boolean isMinimized(); + + /** Returns {@code true} if the home stack is resizable. */ + boolean isHomeStackResizable(); + + /** Returns {@code true} if the divider is visible. */ + boolean isDividerVisible(); + + /** Switch to minimized state if appropriate. */ + void setMinimized(boolean minimized); + + /** + * Workaround for b/62528361, at the time recents has drawn, it may happen before a + * configuration change to the Divider, and internally, the event will be posted to the + * subscriber, or DividerView, which has been removed and prevented from resizing. Instead, + * register the event handler here and proxy the event to the current DividerView. + */ + void onRecentsDrawn(); + + /** Called when there's an activity forced resizable. */ + void onActivityForcedResizable(String packageName, int taskId, int reason); + + /** Called when there's an activity dismissing split screen. */ + void onActivityDismissingSplitScreen(); + + /** Called when there's an activity launch on secondary display failed. */ + void onActivityLaunchOnSecondaryDisplayFailed(); + + /** Called when there's a task undocking. */ + void onUndockingTask(); + + /** Called when the first docked animation frame rendered. */ + void onDockedFirstAnimationFrame(); + + /** Called when top task docked. */ + void onDockedTopTask(); + + /** Called when app transition finished. */ + void onAppTransitionFinished(); + + /** Dumps current status of Split Screen. */ + void dump(PrintWriter pw); + + /** Registers listener that gets called whenever the existence of the divider changes. */ + void registerInSplitScreenListener(Consumer listener); + + /** @return the container token for the secondary split root task. */ + WindowContainerToken getSecondaryRoot(); +} diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenController.java index 4cba9c7752eba..11773f6d358c0 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/SplitScreenController.java @@ -49,10 +49,10 @@ import java.util.ArrayList; import java.util.function.Consumer; /** - * Controls split screen. + * Controls split screen feature. */ -// TODO(b/161116823): Extract as an interface to expose to SysUISingleton scope. -public class SplitScreenController implements DisplayController.OnDisplaysChangedListener { +public class SplitScreenController implements SplitScreen, + DisplayController.OnDisplaysChangedListener { static final boolean DEBUG = false; private static final String TAG = "Divider"; 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 c27f66356ff38..838cf0c9a6d0f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/InstantAppNotifier.java @@ -55,7 +55,7 @@ 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.NotificationChannels; @@ -81,14 +81,13 @@ public class InstantAppNotifier extends SystemUI private final CommandQueue mCommandQueue; private boolean mDockedStackExists; private KeyguardStateController mKeyguardStateController; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; @Inject public InstantAppNotifier(Context context, CommandQueue commandQueue, - @UiBackground Executor uiBgExecutor, - Optional splitScreenControllerOptional) { + @UiBackground Executor uiBgExecutor, Optional splitScreenOptional) { super(context); - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mCommandQueue = commandQueue; mUiBgExecutor = uiBgExecutor; } @@ -107,7 +106,7 @@ public class InstantAppNotifier extends SystemUI mCommandQueue.addCallback(this); mKeyguardStateController.addCallback(this); - mSplitScreenControllerOptional.ifPresent(splitScreen -> + mSplitScreenOptional.ifPresent(splitScreen -> splitScreen.registerInSplitScreenListener(exists -> { mDockedStackExists = exists; updateForegroundInstantApps(); 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 a1826648679ce..115d164bd7614 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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 mBiometricUnlockControllerLazy; private final Provider mStatusBarComponentBuilder; private final PluginManager mPluginManager; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; private final StatusBarNotificationActivityStarter.Builder mStatusBarNotificationActivityStarterBuilder; private final ShadeController mShadeController; @@ -721,7 +721,7 @@ public class StatusBar extends SystemUI implements DemoMode, Optional recentsOptional, Provider statusBarComponentBuilder, PluginManager pluginManager, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, LightsOutNotifController lightsOutNotifController, StatusBarNotificationActivityStarter.Builder statusBarNotificationActivityStarterBuilder, @@ -803,7 +803,7 @@ public class StatusBar extends SystemUI implements DemoMode, mRecentsOptional = recentsOptional; mStatusBarComponentBuilder = statusBarComponentBuilder; mPluginManager = pluginManager; - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder; mShadeController = shadeController; mSuperStatusBarViewFactory = superStatusBarViewFactory; @@ -1551,15 +1551,15 @@ public class StatusBar extends SystemUI implements DemoMode, return false; } - if (mSplitScreenControllerOptional.isPresent()) { - SplitScreenController splitScreenController = mSplitScreenControllerOptional.get(); - if (splitScreenController.isDividerVisible()) { - if (splitScreenController.isMinimized() - && !splitScreenController.isHomeStackResizable()) { + if (mSplitScreenOptional.isPresent()) { + SplitScreen splitScreen = mSplitScreenOptional.get(); + if (splitScreen.isDividerVisible()) { + if (splitScreen.isMinimized() + && !splitScreen.isHomeStackResizable()) { // Undocking from the minimized state is not supported return false; } else { - splitScreenController.onUndockingTask(); + splitScreen.onUndockingTask(); if (metricsUndockAction != -1) { mMetricsLogger.action(metricsUndockAction); } @@ -3917,16 +3917,14 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void appTransitionCancelled(int displayId) { if (displayId == mDisplayId) { - mSplitScreenControllerOptional.ifPresent( - splitScreen -> splitScreen.onAppTransitionFinished()); + mSplitScreenOptional.ifPresent(splitScreen -> splitScreen.onAppTransitionFinished()); } } @Override public void appTransitionFinished(int displayId) { if (displayId == mDisplayId) { - mSplitScreenControllerOptional.ifPresent( - splitScreen -> splitScreen.onAppTransitionFinished()); + mSplitScreenOptional.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 024a776647816..72067d376f7cf 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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 recentsOptional, Provider statusBarComponentBuilder, PluginManager pluginManager, - Optional splitScreenControllerOptional, + Optional splitScreenOptional, LightsOutNotifController lightsOutNotifController, StatusBarNotificationActivityStarter.Builder statusBarNotificationActivityStarterBuilder, @@ -260,7 +260,7 @@ public interface StatusBarPhoneModule { recentsOptional, statusBarComponentBuilder, pluginManager, - splitScreenControllerOptional, + splitScreenOptional, lightsOutNotifController, statusBarNotificationActivityStarterBuilder, shadeController, diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index b7d6903be23ae..49226000e97d1 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -27,7 +27,7 @@ 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.systemui.stackdivider.SplitScreen; import com.android.wm.shell.common.DisplayImeController; import java.util.Optional; @@ -41,16 +41,16 @@ import javax.inject.Inject; public final class WMShell extends SystemUI { private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; private final DisplayImeController mDisplayImeController; - private final Optional mSplitScreenControllerOptional; + private final Optional mSplitScreenOptional; @Inject WMShell(Context context, KeyguardUpdateMonitor keyguardUpdateMonitor, DisplayImeController displayImeController, - Optional splitScreenControllerOptional) { + Optional splitScreenOptional) { super(context); mKeyguardUpdateMonitor = keyguardUpdateMonitor; mDisplayImeController = displayImeController; - mSplitScreenControllerOptional = splitScreenControllerOptional; + mSplitScreenOptional = splitScreenOptional; } @Override @@ -60,10 +60,10 @@ public final class WMShell extends SystemUI { // specific feature anymore. mDisplayImeController.startMonitorDisplays(); - mSplitScreenControllerOptional.ifPresent(this::initSplitScreenController); + mSplitScreenOptional.ifPresent(this::initSplitScreen); } - private void initSplitScreenController(SplitScreenController splitScreenController) { + private void initSplitScreen(SplitScreen splitScreen) { mKeyguardUpdateMonitor.registerCallback(new KeyguardUpdateMonitorCallback() { @Override public void onKeyguardVisibilityChanged(boolean showing) { @@ -71,7 +71,7 @@ public final class WMShell extends SystemUI { // 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); + splitScreen.onKeyguardVisibilityChanged(showing); } }); @@ -82,30 +82,29 @@ public final class WMShell extends SystemUI { boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode() != WINDOWING_MODE_SPLIT_SCREEN_PRIMARY - || !splitScreenController.isSplitScreenSupported()) { + || !splitScreen.isSplitScreenSupported()) { return; } - if (splitScreenController.isMinimized()) { - splitScreenController.onUndockingTask(); + if (splitScreen.isMinimized()) { + splitScreen.onUndockingTask(); } } @Override public void onActivityForcedResizable(String packageName, int taskId, int reason) { - splitScreenController - .onActivityForcedResizable(packageName, taskId, reason); + splitScreen.onActivityForcedResizable(packageName, taskId, reason); } @Override public void onActivityDismissingDockedStack() { - splitScreenController.onActivityDismissingSplitScreen(); + splitScreen.onActivityDismissingSplitScreen(); } @Override public void onActivityLaunchOnSecondaryDisplayFailed() { - splitScreenController.onActivityLaunchOnSecondaryDisplayFailed(); + splitScreen.onActivityLaunchOnSecondaryDisplayFailed(); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java index 3111b13bc7f44..0a3172ce4eb6e 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellBaseModule.java @@ -24,7 +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.stackdivider.SplitScreen; import com.android.systemui.util.DeviceConfigProxy; import com.android.systemui.util.FloatingContentCoordinator; import com.android.wm.shell.ShellTaskOrganizer; @@ -90,5 +90,5 @@ public abstract class WMShellBaseModule { } @BindsOptionalOf - abstract SplitScreenController optionalSplitScreenController(); + abstract SplitScreen optionalSplitScreen(); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java index ceb6d59700078..7b4547689c8bb 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShellModule.java @@ -24,6 +24,7 @@ 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.SplitScreen; import com.android.systemui.stackdivider.SplitScreenController; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; @@ -59,7 +60,7 @@ public class WMShellModule { @SysUISingleton @Provides - static SplitScreenController provideSplitScreenController(Context context, + static SplitScreen provideSplitScreen(Context context, DisplayController displayController, SystemWindows systemWindows, DisplayImeController displayImeController, @Main Handler handler, TransactionPool transactionPool, ShellTaskOrganizer 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 4bc9b464334de..57dbac5bfb103 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -96,7 +96,7 @@ public class NavigationBarControllerTest extends SysuiTestCase { mock(SysUiState.class), mock(BroadcastDispatcher.class), mock(CommandQueue.class), - Optional.of(mock(SplitScreenController.class)), + Optional.of(mock(SplitScreen.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 63821c400e237..389c5a08b7c6f 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -223,7 +223,7 @@ public class NavigationBarTest extends SysuiTestCase { mMockSysUiState, mBroadcastDispatcher, mCommandQueue, - Optional.of(mock(SplitScreenController.class)), + Optional.of(mock(SplitScreen.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 869fbd813e9ef..87aee3fd47940 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.SplitScreenController; +import com.android.systemui.stackdivider.SplitScreen; 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 SplitScreenController mSplitScreenController; + @Mock private SplitScreen mSplitScreen; @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(mSplitScreenController), + Optional.of(mSplitScreen), mLightsOutNotifController, mStatusBarNotificationActivityStarterBuilder, mShadeController,