Merge "Migrate splitscreen to WM shell lib (3/n)"

This commit is contained in:
Jerry Chang
2020-08-23 23:26:08 +00:00
committed by Android (Google) Code Review
21 changed files with 189 additions and 107 deletions

View File

@@ -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<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> splitScreenOptional,
Optional<Recents> recentsOptional,
Lazy<StatusBar> statusBarLazy,
ShadeController shadeController,
@@ -215,7 +215,7 @@ public class DependencyProvider {
sysUiFlagsContainer,
broadcastDispatcher,
commandQueue,
splitScreenControllerOptional,
splitScreenOptional,
recentsOptional,
statusBarLazy,
shadeController,

View File

@@ -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<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
private final Optional<Recents> 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<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> splitScreenOptional,
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;
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;

View File

@@ -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<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
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,
Optional<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> splitScreenOptional,
Optional<Recents> recentsOptional,
Lazy<StatusBar> 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,

View File

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

View File

@@ -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<IBinder, Configuration> mInitialState = new HashMap<>();
private final Optional<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> 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<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> 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;
}

View File

@@ -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<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> 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();

View File

@@ -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<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> 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();

View File

@@ -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<StatusBar> mStatusBarLazy;
private final Optional<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
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<SplitScreenController> splitScreenControllerOptional) {
Optional<SplitScreen> 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

View File

@@ -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<Lazy<StatusBar>> mStatusBarOptionalLazy;
private final Optional<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
private SysUiState mSysUiState;
private final Handler mHandler;
private final Lazy<NavigationBarController> 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<NavigationBarController> navBarControllerLazy, NavigationModeController navModeController,
NotificationShadeWindowController statusBarWinController, SysUiState sysUiState,
PipUI pipUI, Optional<SplitScreenController> splitScreenControllerOptional,
PipUI pipUI, Optional<SplitScreen> splitScreenOptional,
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;
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));
}

View File

@@ -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<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> 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<SplitScreenController> splitScreenControllerOptional, Recents recents) {
Optional<SplitScreen> 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 =

View File

@@ -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<Boolean> listener);
/** @return the container token for the secondary split root task. */
WindowContainerToken getSecondaryRoot();
}

View File

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

View File

@@ -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<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
@Inject
public InstantAppNotifier(Context context, CommandQueue commandQueue,
@UiBackground Executor uiBgExecutor,
Optional<SplitScreenController> splitScreenControllerOptional) {
@UiBackground Executor uiBgExecutor, Optional<SplitScreen> 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();

View File

@@ -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<BiometricUnlockController> mBiometricUnlockControllerLazy;
private final Provider<StatusBarComponent.Builder> mStatusBarComponentBuilder;
private final PluginManager mPluginManager;
private final Optional<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
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<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> 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());
}
}

View File

@@ -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<Recents> recentsOptional,
Provider<StatusBarComponent.Builder> statusBarComponentBuilder,
PluginManager pluginManager,
Optional<SplitScreenController> splitScreenControllerOptional,
Optional<SplitScreen> splitScreenOptional,
LightsOutNotifController lightsOutNotifController,
StatusBarNotificationActivityStarter.Builder
statusBarNotificationActivityStarterBuilder,
@@ -260,7 +260,7 @@ public interface StatusBarPhoneModule {
recentsOptional,
statusBarComponentBuilder,
pluginManager,
splitScreenControllerOptional,
splitScreenOptional,
lightsOutNotifController,
statusBarNotificationActivityStarterBuilder,
shadeController,

View File

@@ -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<SplitScreenController> mSplitScreenControllerOptional;
private final Optional<SplitScreen> mSplitScreenOptional;
@Inject
WMShell(Context context, KeyguardUpdateMonitor keyguardUpdateMonitor,
DisplayImeController displayImeController,
Optional<SplitScreenController> splitScreenControllerOptional) {
Optional<SplitScreen> 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();
}
});
}

View File

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

View File

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

View File

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

View File

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

View File

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