Merge "Remove stage type from split screen APIs" into sc-v2-dev am: 4ce27c5400
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16358306 Change-Id: Ide16292fc7f49ecab93c5847a1764928ea3fee9f
This commit is contained in:
@@ -37,8 +37,6 @@ import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPL
|
|||||||
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_LEFT;
|
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_LEFT;
|
||||||
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_RIGHT;
|
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_RIGHT;
|
||||||
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_TOP;
|
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_TOP;
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE;
|
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.ActivityTaskManager;
|
import android.app.ActivityTaskManager;
|
||||||
@@ -66,7 +64,6 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
import com.android.internal.logging.InstanceId;
|
import com.android.internal.logging.InstanceId;
|
||||||
import com.android.wm.shell.common.DisplayLayout;
|
import com.android.wm.shell.common.DisplayLayout;
|
||||||
import com.android.wm.shell.common.split.SplitLayout.SplitPosition;
|
import com.android.wm.shell.common.split.SplitLayout.SplitPosition;
|
||||||
import com.android.wm.shell.splitscreen.SplitScreen.StageType;
|
|
||||||
import com.android.wm.shell.splitscreen.SplitScreenController;
|
import com.android.wm.shell.splitscreen.SplitScreenController;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@@ -198,29 +195,23 @@ public class DragAndDropPolicy {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean inSplitScreen = mSplitScreen != null && mSplitScreen.isSplitScreenVisible();
|
|
||||||
final boolean leftOrTop = target.type == TYPE_SPLIT_TOP || target.type == TYPE_SPLIT_LEFT;
|
final boolean leftOrTop = target.type == TYPE_SPLIT_TOP || target.type == TYPE_SPLIT_LEFT;
|
||||||
|
|
||||||
@StageType int stage = STAGE_TYPE_UNDEFINED;
|
|
||||||
@SplitPosition int position = SPLIT_POSITION_UNDEFINED;
|
@SplitPosition int position = SPLIT_POSITION_UNDEFINED;
|
||||||
if (target.type != TYPE_FULLSCREEN && mSplitScreen != null) {
|
if (target.type != TYPE_FULLSCREEN && mSplitScreen != null) {
|
||||||
// Update launch options for the split side we are targeting.
|
// Update launch options for the split side we are targeting.
|
||||||
position = leftOrTop ? SPLIT_POSITION_TOP_OR_LEFT : SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
position = leftOrTop ? SPLIT_POSITION_TOP_OR_LEFT : SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
||||||
if (!inSplitScreen) {
|
|
||||||
// Launch in the side stage if we are not in split-screen already.
|
|
||||||
stage = STAGE_TYPE_SIDE;
|
|
||||||
}
|
|
||||||
// Add some data for logging splitscreen once it is invoked
|
// Add some data for logging splitscreen once it is invoked
|
||||||
mSplitScreen.logOnDroppedToSplit(position, mLoggerSessionId);
|
mSplitScreen.logOnDroppedToSplit(position, mLoggerSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
final ClipDescription description = data.getDescription();
|
final ClipDescription description = data.getDescription();
|
||||||
final Intent dragData = mSession.dragData;
|
final Intent dragData = mSession.dragData;
|
||||||
startClipDescription(description, dragData, stage, position);
|
startClipDescription(description, dragData, position);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startClipDescription(ClipDescription description, Intent intent,
|
private void startClipDescription(ClipDescription description, Intent intent,
|
||||||
@StageType int stage, @SplitPosition int position) {
|
@SplitPosition int position) {
|
||||||
final boolean isTask = description.hasMimeType(MIMETYPE_APPLICATION_TASK);
|
final boolean isTask = description.hasMimeType(MIMETYPE_APPLICATION_TASK);
|
||||||
final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
|
final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
|
||||||
final Bundle opts = intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)
|
final Bundle opts = intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)
|
||||||
@@ -228,15 +219,15 @@ public class DragAndDropPolicy {
|
|||||||
|
|
||||||
if (isTask) {
|
if (isTask) {
|
||||||
final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
|
final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
|
||||||
mStarter.startTask(taskId, stage, position, opts);
|
mStarter.startTask(taskId, position, opts);
|
||||||
} else if (isShortcut) {
|
} else if (isShortcut) {
|
||||||
final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
|
final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
|
||||||
final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
|
final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
|
||||||
final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
|
final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
|
||||||
mStarter.startShortcut(packageName, id, stage, position, opts, user);
|
mStarter.startShortcut(packageName, id, position, opts, user);
|
||||||
} else {
|
} else {
|
||||||
mStarter.startIntent(intent.getParcelableExtra(EXTRA_PENDING_INTENT),
|
mStarter.startIntent(intent.getParcelableExtra(EXTRA_PENDING_INTENT),
|
||||||
null, stage, position, opts);
|
null, position, opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,12 +282,10 @@ public class DragAndDropPolicy {
|
|||||||
* Interface for actually committing the task launches.
|
* Interface for actually committing the task launches.
|
||||||
*/
|
*/
|
||||||
public interface Starter {
|
public interface Starter {
|
||||||
void startTask(int taskId, @StageType int stage, @SplitPosition int position,
|
void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options);
|
||||||
@Nullable Bundle options);
|
void startShortcut(String packageName, String shortcutId, @SplitPosition int position,
|
||||||
void startShortcut(String packageName, String shortcutId, @StageType int stage,
|
@Nullable Bundle options, UserHandle user);
|
||||||
@SplitPosition int position, @Nullable Bundle options, UserHandle user);
|
void startIntent(PendingIntent intent, Intent fillInIntent, @SplitPosition int position,
|
||||||
void startIntent(PendingIntent intent, Intent fillInIntent,
|
|
||||||
@StageType int stage, @SplitPosition int position,
|
|
||||||
@Nullable Bundle options);
|
@Nullable Bundle options);
|
||||||
void enterSplitScreen(int taskId, boolean leftOrTop);
|
void enterSplitScreen(int taskId, boolean leftOrTop);
|
||||||
|
|
||||||
@@ -319,8 +308,7 @@ public class DragAndDropPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startTask(int taskId, int stage, int position,
|
public void startTask(int taskId, int position, @Nullable Bundle options) {
|
||||||
@Nullable Bundle options) {
|
|
||||||
try {
|
try {
|
||||||
ActivityTaskManager.getService().startActivityFromRecents(taskId, options);
|
ActivityTaskManager.getService().startActivityFromRecents(taskId, options);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -329,7 +317,7 @@ public class DragAndDropPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startShortcut(String packageName, String shortcutId, int stage, int position,
|
public void startShortcut(String packageName, String shortcutId, int position,
|
||||||
@Nullable Bundle options, UserHandle user) {
|
@Nullable Bundle options, UserHandle user) {
|
||||||
try {
|
try {
|
||||||
LauncherApps launcherApps =
|
LauncherApps launcherApps =
|
||||||
@@ -342,8 +330,8 @@ public class DragAndDropPolicy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntent(PendingIntent intent, @Nullable Intent fillInIntent, int stage,
|
public void startIntent(PendingIntent intent, @Nullable Intent fillInIntent, int position,
|
||||||
int position, @Nullable Bundle options) {
|
@Nullable Bundle options) {
|
||||||
try {
|
try {
|
||||||
intent.send(mContext, 0, fillInIntent, null, null, null, options);
|
intent.send(mContext, 0, fillInIntent, null, null, null, options);
|
||||||
} catch (PendingIntent.CanceledException e) {
|
} catch (PendingIntent.CanceledException e) {
|
||||||
|
|||||||
@@ -65,19 +65,19 @@ interface ISplitScreen {
|
|||||||
/**
|
/**
|
||||||
* Starts a task in a stage.
|
* Starts a task in a stage.
|
||||||
*/
|
*/
|
||||||
oneway void startTask(int taskId, int stage, int position, in Bundle options) = 7;
|
oneway void startTask(int taskId, int position, in Bundle options) = 7;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts a shortcut in a stage.
|
* Starts a shortcut in a stage.
|
||||||
*/
|
*/
|
||||||
oneway void startShortcut(String packageName, String shortcutId, int stage, int position,
|
oneway void startShortcut(String packageName, String shortcutId, int position,
|
||||||
in Bundle options, in UserHandle user) = 8;
|
in Bundle options, in UserHandle user) = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts an activity in a stage.
|
* Starts an activity in a stage.
|
||||||
*/
|
*/
|
||||||
oneway void startIntent(in PendingIntent intent, in Intent fillInIntent, int stage,
|
oneway void startIntent(in PendingIntent intent, in Intent fillInIntent, int position,
|
||||||
int position, in Bundle options) = 9;
|
in Bundle options) = 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts tasks simultaneously in one transition.
|
* Starts tasks simultaneously in one transition.
|
||||||
|
|||||||
@@ -265,9 +265,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
mStageCoordinator.unregisterSplitScreenListener(listener);
|
mStageCoordinator.unregisterSplitScreenListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startTask(int taskId, @SplitScreen.StageType int stage,
|
public void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options) {
|
||||||
@SplitPosition int position, @Nullable Bundle options) {
|
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options,
|
||||||
options = mStageCoordinator.resolveStartStage(stage, position, options, null /* wct */);
|
null /* wct */);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||||
@@ -282,10 +282,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startShortcut(String packageName, String shortcutId,
|
public void startShortcut(String packageName, String shortcutId, @SplitPosition int position,
|
||||||
@SplitScreen.StageType int stage, @SplitPosition int position,
|
|
||||||
@Nullable Bundle options, UserHandle user) {
|
@Nullable Bundle options, UserHandle user) {
|
||||||
options = mStageCoordinator.resolveStartStage(stage, position, options, null /* wct */);
|
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options,
|
||||||
|
null /* wct */);
|
||||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||||
mStageCoordinator.prepareEvictChildTasks(position, evictWct);
|
mStageCoordinator.prepareEvictChildTasks(position, evictWct);
|
||||||
|
|
||||||
@@ -300,20 +300,18 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startIntent(PendingIntent intent, Intent fillInIntent,
|
public void startIntent(PendingIntent intent, Intent fillInIntent, @SplitPosition int position,
|
||||||
@SplitScreen.StageType int stage, @SplitPosition int position,
|
|
||||||
@Nullable Bundle options) {
|
@Nullable Bundle options) {
|
||||||
if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
|
if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
|
||||||
startIntentLegacy(intent, fillInIntent, stage, position, options);
|
startIntentLegacy(intent, fillInIntent, position, options);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mStageCoordinator.startIntent(intent, fillInIntent, stage, position, options,
|
mStageCoordinator.startIntent(intent, fillInIntent, STAGE_TYPE_UNDEFINED, position, options,
|
||||||
null /* remote */);
|
null /* remote */);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startIntentLegacy(PendingIntent intent, Intent fillInIntent,
|
private void startIntentLegacy(PendingIntent intent, Intent fillInIntent,
|
||||||
@SplitScreen.StageType int stage, @SplitPosition int position,
|
@SplitPosition int position, @Nullable Bundle options) {
|
||||||
@Nullable Bundle options) {
|
|
||||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||||
mStageCoordinator.prepareEvictChildTasks(position, evictWct);
|
mStageCoordinator.prepareEvictChildTasks(position, evictWct);
|
||||||
|
|
||||||
@@ -347,7 +345,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
};
|
};
|
||||||
|
|
||||||
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
final WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||||
options = mStageCoordinator.resolveStartStage(stage, position, options, wct);
|
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, wct);
|
||||||
wct.sendPendingIntent(intent, fillInIntent, options);
|
wct.sendPendingIntent(intent, fillInIntent, options);
|
||||||
mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct);
|
mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct);
|
||||||
}
|
}
|
||||||
@@ -604,10 +602,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startTask(int taskId, int stage, int position, @Nullable Bundle options) {
|
public void startTask(int taskId, int position, @Nullable Bundle options) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startTask",
|
executeRemoteCallWithTaskPermission(mController, "startTask",
|
||||||
(controller) -> {
|
(controller) -> {
|
||||||
controller.startTask(taskId, stage, position, options);
|
controller.startTask(taskId, position, options);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,21 +630,20 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startShortcut(String packageName, String shortcutId, int stage, int position,
|
public void startShortcut(String packageName, String shortcutId, int position,
|
||||||
@Nullable Bundle options, UserHandle user) {
|
@Nullable Bundle options, UserHandle user) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startShortcut",
|
executeRemoteCallWithTaskPermission(mController, "startShortcut",
|
||||||
(controller) -> {
|
(controller) -> {
|
||||||
controller.startShortcut(packageName, shortcutId, stage, position,
|
controller.startShortcut(packageName, shortcutId, position, options, user);
|
||||||
options, user);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startIntent(PendingIntent intent, Intent fillInIntent, int stage, int position,
|
public void startIntent(PendingIntent intent, Intent fillInIntent, int position,
|
||||||
@Nullable Bundle options) {
|
@Nullable Bundle options) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startIntent",
|
executeRemoteCallWithTaskPermission(mController, "startIntent",
|
||||||
(controller) -> {
|
(controller) -> {
|
||||||
controller.startIntent(intent, fillInIntent, stage, position, options);
|
controller.startIntent(intent, fillInIntent, position, options);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -462,12 +462,15 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
|||||||
@androidx.annotation.Nullable WindowContainerTransaction wct) {
|
@androidx.annotation.Nullable WindowContainerTransaction wct) {
|
||||||
switch (stage) {
|
switch (stage) {
|
||||||
case STAGE_TYPE_UNDEFINED: {
|
case STAGE_TYPE_UNDEFINED: {
|
||||||
// Use the stage of the specified position is valid.
|
|
||||||
if (position != SPLIT_POSITION_UNDEFINED) {
|
if (position != SPLIT_POSITION_UNDEFINED) {
|
||||||
if (position == getSideStagePosition()) {
|
if (mMainStage.isActive()) {
|
||||||
options = resolveStartStage(STAGE_TYPE_SIDE, position, options, wct);
|
// Use the stage of the specified position
|
||||||
|
options = resolveStartStage(
|
||||||
|
position == mSideStagePosition ? STAGE_TYPE_SIDE : STAGE_TYPE_MAIN,
|
||||||
|
position, options, wct);
|
||||||
} else {
|
} else {
|
||||||
options = resolveStartStage(STAGE_TYPE_MAIN, position, options, wct);
|
// Use the side stage as default to active split screen
|
||||||
|
options = resolveStartStage(STAGE_TYPE_SIDE, position, options, wct);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Exit split-screen and launch fullscreen since stage wasn't specified.
|
// Exit split-screen and launch fullscreen since stage wasn't specified.
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import static android.view.RemoteAnimationTarget.MODE_OPENING;
|
|||||||
import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
|
import static com.android.wm.shell.common.ExecutorUtils.executeRemoteCallWithTaskPermission;
|
||||||
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
||||||
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_TOP_OR_LEFT;
|
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_TOP_OR_LEFT;
|
||||||
|
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.ActivityTaskManager;
|
import android.app.ActivityTaskManager;
|
||||||
@@ -208,9 +209,9 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
mStageCoordinator.unregisterSplitScreenListener(listener);
|
mStageCoordinator.unregisterSplitScreenListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startTask(int taskId, @SplitScreen.StageType int stage,
|
public void startTask(int taskId, @SplitPosition int position, @Nullable Bundle options) {
|
||||||
@SplitPosition int position, @Nullable Bundle options) {
|
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options,
|
||||||
options = mStageCoordinator.resolveStartStage(stage, position, options, null /* wct */);
|
null /* wct */);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ActivityTaskManager.getService().startActivityFromRecents(taskId, options);
|
ActivityTaskManager.getService().startActivityFromRecents(taskId, options);
|
||||||
@@ -219,10 +220,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startShortcut(String packageName, String shortcutId,
|
public void startShortcut(String packageName, String shortcutId, @SplitPosition int position,
|
||||||
@SplitScreen.StageType int stage, @SplitPosition int position,
|
|
||||||
@Nullable Bundle options, UserHandle user) {
|
@Nullable Bundle options, UserHandle user) {
|
||||||
options = mStageCoordinator.resolveStartStage(stage, position, options, null /* wct */);
|
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options,
|
||||||
|
null /* wct */);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
LauncherApps launcherApps =
|
LauncherApps launcherApps =
|
||||||
@@ -234,20 +235,18 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startIntent(PendingIntent intent, Intent fillInIntent,
|
public void startIntent(PendingIntent intent, Intent fillInIntent, @SplitPosition int position,
|
||||||
@SplitScreen.StageType int stage, @SplitPosition int position,
|
|
||||||
@Nullable Bundle options) {
|
@Nullable Bundle options) {
|
||||||
if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
|
if (!Transitions.ENABLE_SHELL_TRANSITIONS) {
|
||||||
startIntentLegacy(intent, fillInIntent, stage, position, options);
|
startIntentLegacy(intent, fillInIntent, position, options);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mStageCoordinator.startIntent(intent, fillInIntent, stage, position, options,
|
mStageCoordinator.startIntent(intent, fillInIntent, STAGE_TYPE_UNDEFINED, position, options,
|
||||||
null /* remote */);
|
null /* remote */);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startIntentLegacy(PendingIntent intent, Intent fillInIntent,
|
private void startIntentLegacy(PendingIntent intent, Intent fillInIntent,
|
||||||
@SplitScreen.StageType int stage, @SplitPosition int position,
|
@SplitPosition int position, @Nullable Bundle options) {
|
||||||
@Nullable Bundle options) {
|
|
||||||
LegacyTransitions.ILegacyTransition transition = new LegacyTransitions.ILegacyTransition() {
|
LegacyTransitions.ILegacyTransition transition = new LegacyTransitions.ILegacyTransition() {
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
|
public void onAnimationStart(int transit, RemoteAnimationTarget[] apps,
|
||||||
@@ -275,7 +274,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
WindowContainerTransaction wct = new WindowContainerTransaction();
|
WindowContainerTransaction wct = new WindowContainerTransaction();
|
||||||
options = mStageCoordinator.resolveStartStage(stage, position, options, wct);
|
options = mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, position, options, wct);
|
||||||
wct.sendPendingIntent(intent, fillInIntent, options);
|
wct.sendPendingIntent(intent, fillInIntent, options);
|
||||||
mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct);
|
mSyncQueue.queue(transition, WindowManager.TRANSIT_OPEN, wct);
|
||||||
}
|
}
|
||||||
@@ -539,7 +538,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
public void startTask(int taskId, int stage, int position, @Nullable Bundle options) {
|
public void startTask(int taskId, int stage, int position, @Nullable Bundle options) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startTask",
|
executeRemoteCallWithTaskPermission(mController, "startTask",
|
||||||
(controller) -> {
|
(controller) -> {
|
||||||
controller.startTask(taskId, stage, position, options);
|
controller.startTask(taskId, position, options);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +567,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
@Nullable Bundle options, UserHandle user) {
|
@Nullable Bundle options, UserHandle user) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startShortcut",
|
executeRemoteCallWithTaskPermission(mController, "startShortcut",
|
||||||
(controller) -> {
|
(controller) -> {
|
||||||
controller.startShortcut(packageName, shortcutId, stage, position,
|
controller.startShortcut(packageName, shortcutId, position,
|
||||||
options, user);
|
options, user);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -578,7 +577,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
|||||||
@Nullable Bundle options) {
|
@Nullable Bundle options) {
|
||||||
executeRemoteCallWithTaskPermission(mController, "startIntent",
|
executeRemoteCallWithTaskPermission(mController, "startIntent",
|
||||||
(controller) -> {
|
(controller) -> {
|
||||||
controller.startIntent(intent, fillInIntent, stage, position, options);
|
controller.startIntent(intent, fillInIntent, position, options);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPL
|
|||||||
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_LEFT;
|
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_LEFT;
|
||||||
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_RIGHT;
|
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_RIGHT;
|
||||||
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_TOP;
|
import static com.android.wm.shell.draganddrop.DragAndDropPolicy.Target.TYPE_SPLIT_TOP;
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE;
|
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
|
||||||
|
|
||||||
import static junit.framework.Assert.assertTrue;
|
import static junit.framework.Assert.assertTrue;
|
||||||
import static junit.framework.Assert.fail;
|
import static junit.framework.Assert.fail;
|
||||||
@@ -149,7 +147,6 @@ public class DragAndDropPolicyTest {
|
|||||||
mSplitPrimaryAppTask = createTaskInfo(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
|
mSplitPrimaryAppTask = createTaskInfo(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
|
||||||
ACTIVITY_TYPE_STANDARD);
|
ACTIVITY_TYPE_STANDARD);
|
||||||
|
|
||||||
setInSplitScreen(false);
|
|
||||||
setRunningTask(mFullscreenAppTask);
|
setRunningTask(mFullscreenAppTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,10 +195,6 @@ public class DragAndDropPolicyTest {
|
|||||||
: ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
|
: ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setInSplitScreen(boolean inSplitscreen) {
|
|
||||||
doReturn(inSplitscreen).when(mSplitScreenStarter).isSplitScreenVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDragAppOverFullscreenHome_expectOnlyFullscreenTarget() {
|
public void testDragAppOverFullscreenHome_expectOnlyFullscreenTarget() {
|
||||||
setRunningTask(mHomeTask);
|
setRunningTask(mHomeTask);
|
||||||
@@ -211,7 +204,7 @@ public class DragAndDropPolicyTest {
|
|||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_FULLSCREEN), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_FULLSCREEN), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), any(),
|
||||||
eq(STAGE_TYPE_UNDEFINED), eq(SPLIT_POSITION_UNDEFINED), any());
|
eq(SPLIT_POSITION_UNDEFINED), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -223,12 +216,12 @@ public class DragAndDropPolicyTest {
|
|||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), any(),
|
||||||
eq(STAGE_TYPE_SIDE), eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
||||||
reset(mSplitScreenStarter);
|
reset(mSplitScreenStarter);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), any(),
|
||||||
eq(STAGE_TYPE_SIDE), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -240,64 +233,12 @@ public class DragAndDropPolicyTest {
|
|||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), any(),
|
||||||
eq(STAGE_TYPE_SIDE), eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
||||||
reset(mSplitScreenStarter);
|
reset(mSplitScreenStarter);
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM), mActivityClipData);
|
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM), mActivityClipData);
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
verify(mSplitScreenStarter).startIntent(any(), any(),
|
||||||
eq(STAGE_TYPE_SIDE), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDragAppOverSplitApp_expectSplitTargets_DropLeft() {
|
|
||||||
setInSplitScreen(true);
|
|
||||||
setRunningTask(mSplitPrimaryAppTask);
|
|
||||||
mPolicy.start(mLandscapeDisplayLayout, mActivityClipData, mLoggerSessionId);
|
|
||||||
ArrayList<Target> targets = assertExactTargetTypes(
|
|
||||||
mPolicy.getTargets(mInsets), TYPE_SPLIT_LEFT, TYPE_SPLIT_RIGHT);
|
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_LEFT), mActivityClipData);
|
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
|
||||||
eq(STAGE_TYPE_UNDEFINED), eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDragAppOverSplitApp_expectSplitTargets_DropRight() {
|
|
||||||
setInSplitScreen(true);
|
|
||||||
setRunningTask(mSplitPrimaryAppTask);
|
|
||||||
mPolicy.start(mLandscapeDisplayLayout, mActivityClipData, mLoggerSessionId);
|
|
||||||
ArrayList<Target> targets = assertExactTargetTypes(
|
|
||||||
mPolicy.getTargets(mInsets), TYPE_SPLIT_LEFT, TYPE_SPLIT_RIGHT);
|
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_RIGHT), mActivityClipData);
|
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
|
||||||
eq(STAGE_TYPE_UNDEFINED), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDragAppOverSplitAppPhone_expectVerticalSplitTargets_DropTop() {
|
|
||||||
setInSplitScreen(true);
|
|
||||||
setRunningTask(mSplitPrimaryAppTask);
|
|
||||||
mPolicy.start(mPortraitDisplayLayout, mActivityClipData, mLoggerSessionId);
|
|
||||||
ArrayList<Target> targets = assertExactTargetTypes(
|
|
||||||
mPolicy.getTargets(mInsets), TYPE_SPLIT_TOP, TYPE_SPLIT_BOTTOM);
|
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_TOP), mActivityClipData);
|
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
|
||||||
eq(STAGE_TYPE_UNDEFINED), eq(SPLIT_POSITION_TOP_OR_LEFT), any());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDragAppOverSplitAppPhone_expectVerticalSplitTargets_DropBottom() {
|
|
||||||
setInSplitScreen(true);
|
|
||||||
setRunningTask(mSplitPrimaryAppTask);
|
|
||||||
mPolicy.start(mPortraitDisplayLayout, mActivityClipData, mLoggerSessionId);
|
|
||||||
ArrayList<Target> targets = assertExactTargetTypes(
|
|
||||||
mPolicy.getTargets(mInsets), TYPE_SPLIT_TOP, TYPE_SPLIT_BOTTOM);
|
|
||||||
|
|
||||||
mPolicy.handleDrop(filterTargetByType(targets, TYPE_SPLIT_BOTTOM), mActivityClipData);
|
|
||||||
verify(mSplitScreenStarter).startIntent(any(), any(),
|
|
||||||
eq(STAGE_TYPE_UNDEFINED), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT), any());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import static android.view.Display.DEFAULT_DISPLAY;
|
|||||||
|
|
||||||
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_BOTTOM_OR_RIGHT;
|
||||||
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_TOP_OR_LEFT;
|
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_TOP_OR_LEFT;
|
||||||
|
import static com.android.wm.shell.common.split.SplitLayout.SPLIT_POSITION_UNDEFINED;
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN;
|
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_MAIN;
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE;
|
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_SIDE;
|
||||||
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
import static com.android.wm.shell.splitscreen.SplitScreen.STAGE_TYPE_UNDEFINED;
|
||||||
@@ -28,10 +29,13 @@ import static com.android.wm.shell.splitscreen.SplitScreenController.EXIT_REASON
|
|||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.clearInvocations;
|
import static org.mockito.Mockito.clearInvocations;
|
||||||
|
import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@@ -105,7 +109,8 @@ public class StageCoordinatorTests extends ShellTestCase {
|
|||||||
@Before
|
@Before
|
||||||
public void setup() {
|
public void setup() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mStageCoordinator = createStageCoordinator(/* splitLayout */ null);
|
mStageCoordinator = spy(createStageCoordinator(/* splitLayout */ null));
|
||||||
|
doNothing().when(mStageCoordinator).updateActivityOptions(any(), anyInt());
|
||||||
|
|
||||||
when(mSplitLayout.getBounds1()).thenReturn(mBounds1);
|
when(mSplitLayout.getBounds1()).thenReturn(mBounds1);
|
||||||
when(mSplitLayout.getBounds2()).thenReturn(mBounds2);
|
when(mSplitLayout.getBounds2()).thenReturn(mBounds2);
|
||||||
@@ -224,6 +229,63 @@ public class StageCoordinatorTests extends ShellTestCase {
|
|||||||
verify(mMainStage).deactivate(any(WindowContainerTransaction.class), eq(false));
|
verify(mMainStage).deactivate(any(WindowContainerTransaction.class), eq(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testResolveStartStage_beforeSplitActivated_setsStagePosition() {
|
||||||
|
mStageCoordinator.setSideStagePosition(SPLIT_POSITION_TOP_OR_LEFT, null /* wct */);
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, SPLIT_POSITION_BOTTOM_OR_RIGHT,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getSideStagePosition(), SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
||||||
|
verify(mStageCoordinator).updateActivityOptions(any(), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT));
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, SPLIT_POSITION_TOP_OR_LEFT,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getSideStagePosition(), SPLIT_POSITION_TOP_OR_LEFT);
|
||||||
|
verify(mStageCoordinator).updateActivityOptions(any(), eq(SPLIT_POSITION_TOP_OR_LEFT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testResolveStartStage_afterSplitActivated_retrievesStagePosition() {
|
||||||
|
when(mMainStage.isActive()).thenReturn(true);
|
||||||
|
mStageCoordinator.setSideStagePosition(SPLIT_POSITION_TOP_OR_LEFT, null /* wct */);
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, SPLIT_POSITION_TOP_OR_LEFT,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getSideStagePosition(), SPLIT_POSITION_TOP_OR_LEFT);
|
||||||
|
verify(mStageCoordinator).updateActivityOptions(any(), eq(SPLIT_POSITION_TOP_OR_LEFT));
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_UNDEFINED, SPLIT_POSITION_BOTTOM_OR_RIGHT,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getMainStagePosition(), SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
||||||
|
verify(mStageCoordinator).updateActivityOptions(any(), eq(SPLIT_POSITION_BOTTOM_OR_RIGHT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testResolveStartStage_setsSideStagePosition() {
|
||||||
|
mStageCoordinator.setSideStagePosition(SPLIT_POSITION_TOP_OR_LEFT, null /* wct */);
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_SIDE, SPLIT_POSITION_BOTTOM_OR_RIGHT,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getSideStagePosition(), SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_MAIN, SPLIT_POSITION_BOTTOM_OR_RIGHT,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getMainStagePosition(), SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testResolveStartStage_retrievesStagePosition() {
|
||||||
|
mStageCoordinator.setSideStagePosition(SPLIT_POSITION_TOP_OR_LEFT, null /* wct */);
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_SIDE, SPLIT_POSITION_UNDEFINED,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getSideStagePosition(), SPLIT_POSITION_TOP_OR_LEFT);
|
||||||
|
|
||||||
|
mStageCoordinator.resolveStartStage(STAGE_TYPE_MAIN, SPLIT_POSITION_UNDEFINED,
|
||||||
|
null /* options */, null /* wct */);
|
||||||
|
assertEquals(mStageCoordinator.getMainStagePosition(), SPLIT_POSITION_BOTTOM_OR_RIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
private StageCoordinator createStageCoordinator(SplitLayout splitLayout) {
|
private StageCoordinator createStageCoordinator(SplitLayout splitLayout) {
|
||||||
return new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY,
|
return new SplitTestUtils.TestStageCoordinator(mContext, DEFAULT_DISPLAY,
|
||||||
mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage,
|
mSyncQueue, mRootTDAOrganizer, mTaskOrganizer, mMainStage, mSideStage,
|
||||||
|
|||||||
Reference in New Issue
Block a user