Merge "Consolidate entering split screen behavior" into tm-qpr-dev
This commit is contained in:
@@ -341,6 +341,16 @@ public class RecentTasksController implements TaskStackListenerCallback,
|
||||
return recentTasks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the top running leaf task.
|
||||
*/
|
||||
@Nullable
|
||||
public ActivityManager.RunningTaskInfo getTopRunningTask() {
|
||||
List<ActivityManager.RunningTaskInfo> tasks = mActivityTaskManager.getTasks(1,
|
||||
false /* filterOnlyVisibleRecents */);
|
||||
return tasks.isEmpty() ? null : tasks.get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the background task that match the given component.
|
||||
*/
|
||||
|
||||
@@ -315,10 +315,6 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
return mStageCoordinator;
|
||||
}
|
||||
|
||||
public ActivityManager.RunningTaskInfo getFocusingTaskInfo() {
|
||||
return mStageCoordinator.getFocusingTaskInfo();
|
||||
}
|
||||
|
||||
public boolean isValidToEnterSplitScreen(@NonNull ActivityManager.RunningTaskInfo taskInfo) {
|
||||
return mStageCoordinator.isValidToEnterSplitScreen(taskInfo);
|
||||
}
|
||||
@@ -628,9 +624,10 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
|
||||
if (!isSplitScreenVisible()) {
|
||||
// Split screen is not yet activated, check if the current top running task is valid to
|
||||
// split together.
|
||||
final ActivityManager.RunningTaskInfo taskInfo = getFocusingTaskInfo();
|
||||
if (taskInfo != null && isValidToEnterSplitScreen(taskInfo)) {
|
||||
return Objects.equals(taskInfo.baseIntent.getComponent(), launchingActivity);
|
||||
final ActivityManager.RunningTaskInfo topRunningTask = mRecentTasksOptional
|
||||
.map(recentTasks -> recentTasks.getTopRunningTask()).orElse(null);
|
||||
if (topRunningTask != null && isValidToEnterSplitScreen(topRunningTask)) {
|
||||
return Objects.equals(topRunningTask.baseIntent.getComponent(), launchingActivity);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ import java.util.Optional;
|
||||
*/
|
||||
public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
DisplayController.OnDisplaysChangedListener, Transitions.TransitionHandler,
|
||||
ShellTaskOrganizer.TaskListener, ShellTaskOrganizer.FocusListener {
|
||||
ShellTaskOrganizer.TaskListener {
|
||||
|
||||
private static final String TAG = StageCoordinator.class.getSimpleName();
|
||||
|
||||
@@ -186,8 +186,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
private final Rect mTempRect1 = new Rect();
|
||||
private final Rect mTempRect2 = new Rect();
|
||||
|
||||
private ActivityManager.RunningTaskInfo mFocusingTaskInfo;
|
||||
|
||||
/**
|
||||
* A single-top root task which the split divider attached to.
|
||||
*/
|
||||
@@ -304,7 +302,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
mDisplayController.addDisplayWindowListener(this);
|
||||
mDisplayLayout = new DisplayLayout(displayController.getDisplayLayout(displayId));
|
||||
transitions.addHandler(this);
|
||||
mTaskOrganizer.addFocusListener(this);
|
||||
mSplitUnsupportedToast = Toast.makeText(mContext,
|
||||
R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT);
|
||||
}
|
||||
@@ -455,8 +452,9 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
}
|
||||
|
||||
/** Launches an activity into split by legacy transition. */
|
||||
void startIntentLegacy(PendingIntent intent, Intent fillInIntent,
|
||||
@SplitPosition int position, @Nullable Bundle options) {
|
||||
void startIntentLegacy(PendingIntent intent, Intent fillInIntent, @SplitPosition int position,
|
||||
@Nullable Bundle options) {
|
||||
final boolean isEnteringSplit = !isSplitActive();
|
||||
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
|
||||
prepareEvictChildTasks(position, evictWct);
|
||||
|
||||
@@ -466,22 +464,29 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps,
|
||||
IRemoteAnimationFinishedCallback finishedCallback,
|
||||
SurfaceControl.Transaction t) {
|
||||
if (apps == null || apps.length == 0) {
|
||||
if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0) {
|
||||
mMainExecutor.execute(() ->
|
||||
exitSplitScreen(mMainStage.getChildCount() == 0
|
||||
? mSideStage : mMainStage, EXIT_REASON_UNKNOWN));
|
||||
mSplitUnsupportedToast.show();
|
||||
if (isEnteringSplit) {
|
||||
boolean openingToSide = false;
|
||||
if (apps != null) {
|
||||
for (int i = 0; i < apps.length; ++i) {
|
||||
if (apps[i].mode == MODE_OPENING
|
||||
&& mSideStage.containsTask(apps[i].taskId)) {
|
||||
openingToSide = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!openingToSide) {
|
||||
mMainExecutor.execute(() -> exitSplitScreen(
|
||||
mSideStage.getChildCount() == 0 ? mMainStage : mSideStage,
|
||||
EXIT_REASON_UNKNOWN));
|
||||
}
|
||||
|
||||
// Do nothing when the animation was cancelled.
|
||||
t.apply();
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < apps.length; ++i) {
|
||||
if (apps[i].mode == MODE_OPENING) {
|
||||
t.show(apps[i].leash);
|
||||
if (apps != null) {
|
||||
for (int i = 0; i < apps.length; ++i) {
|
||||
if (apps[i].mode == MODE_OPENING) {
|
||||
t.show(apps[i].leash);
|
||||
}
|
||||
}
|
||||
}
|
||||
t.apply();
|
||||
@@ -503,7 +508,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
|
||||
// If split still not active, apply windows bounds first to avoid surface reset to
|
||||
// wrong pos by SurfaceAnimator from wms.
|
||||
if (!mMainStage.isActive() && mLogger.isEnterRequestedByDrag()) {
|
||||
if (isEnteringSplit && mLogger.isEnterRequestedByDrag()) {
|
||||
updateWindowBounds(mSplitLayout, wct);
|
||||
}
|
||||
|
||||
@@ -1615,15 +1620,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
|
||||
&& ArrayUtils.contains(CONTROLLED_WINDOWING_MODES, taskInfo.getWindowingMode());
|
||||
}
|
||||
|
||||
ActivityManager.RunningTaskInfo getFocusingTaskInfo() {
|
||||
return mFocusingTaskInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) {
|
||||
mFocusingTaskInfo = taskInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSnappedToDismiss(boolean bottomOrRight, int reason) {
|
||||
final boolean mainStageToTop =
|
||||
|
||||
@@ -178,10 +178,10 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
||||
Intent startIntent = createStartIntent("startActivity");
|
||||
PendingIntent pendingIntent =
|
||||
PendingIntent.getActivity(mContext, 0, startIntent, FLAG_IMMUTABLE);
|
||||
// Put the same component into focus task
|
||||
ActivityManager.RunningTaskInfo focusTaskInfo =
|
||||
// Put the same component to the top running task
|
||||
ActivityManager.RunningTaskInfo topRunningTask =
|
||||
createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent);
|
||||
doReturn(focusTaskInfo).when(mStageCoordinator).getFocusingTaskInfo();
|
||||
doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask();
|
||||
doReturn(true).when(mStageCoordinator).isValidToEnterSplitScreen(any());
|
||||
|
||||
mSplitScreenController.startIntent(pendingIntent, null, SPLIT_POSITION_TOP_OR_LEFT, null);
|
||||
@@ -199,10 +199,10 @@ public class SplitScreenControllerTests extends ShellTestCase {
|
||||
Intent startIntent = createStartIntent("startActivity");
|
||||
PendingIntent pendingIntent =
|
||||
PendingIntent.getActivity(mContext, 0, startIntent, FLAG_IMMUTABLE);
|
||||
// Put the same component into focus task
|
||||
ActivityManager.RunningTaskInfo focusTaskInfo =
|
||||
// Put the same component to the top running task
|
||||
ActivityManager.RunningTaskInfo topRunningTask =
|
||||
createTaskInfo(WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, startIntent);
|
||||
doReturn(focusTaskInfo).when(mStageCoordinator).getFocusingTaskInfo();
|
||||
doReturn(topRunningTask).when(mRecentTasks).getTopRunningTask();
|
||||
doReturn(true).when(mStageCoordinator).isValidToEnterSplitScreen(any());
|
||||
// Put the same component into a task in the background
|
||||
ActivityManager.RecentTaskInfo sameTaskInfo = new ActivityManager.RecentTaskInfo();
|
||||
|
||||
Reference in New Issue
Block a user