Merge "Fix launcher crash and correct split behavior" into sc-v2-dev am: b017001ae0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16527653

Change-Id: I10ddbf8c29fda5e2bcbdf83145acdf5b20728091
This commit is contained in:
Tony Huang
2021-12-29 12:14:05 +00:00
committed by Automerger Merge Worker
4 changed files with 34 additions and 10 deletions

View File

@@ -19,7 +19,6 @@ package com.android.wm.shell.splitscreen;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
import android.graphics.Rect;
import android.view.SurfaceSession; import android.view.SurfaceSession;
import android.window.WindowContainerToken; import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction;
@@ -45,11 +44,6 @@ class SideStage extends StageTaskListener {
stageTaskUnfoldController); stageTaskUnfoldController);
} }
void moveToTop(Rect rootBounds, WindowContainerTransaction wct) {
final WindowContainerToken rootToken = mRootTaskInfo.token;
wct.setBounds(rootToken, rootBounds).reorder(rootToken, true /* onTop */);
}
boolean removeAllTasks(WindowContainerTransaction wct, boolean toTop) { boolean removeAllTasks(WindowContainerTransaction wct, boolean toTop) {
// No matter if the root task is empty or not, moving the root to bottom because it no // No matter if the root task is empty or not, moving the root to bottom because it no
// longer preserves visible child task. // longer preserves visible child task.

View File

@@ -368,6 +368,9 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
// Init divider first to make divider leash for remote animation target. // Init divider first to make divider leash for remote animation target.
setDividerVisibility(true /* visible */); setDividerVisibility(true /* visible */);
final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction wct = new WindowContainerTransaction();
final WindowContainerTransaction evictWct = new WindowContainerTransaction();
prepareEvictChildTasks(SPLIT_POSITION_TOP_OR_LEFT, evictWct);
prepareEvictChildTasks(SPLIT_POSITION_BOTTOM_OR_RIGHT, evictWct);
// Need to add another wrapper here in shell so that we can inject the divider bar // Need to add another wrapper here in shell so that we can inject the divider bar
// and also manage the process elevation via setRunningRemote // and also manage the process elevation via setRunningRemote
IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() { IRemoteAnimationRunner wrapper = new IRemoteAnimationRunner.Stub() {
@@ -390,6 +393,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
@Override @Override
public void onAnimationFinished() throws RemoteException { public void onAnimationFinished() throws RemoteException {
mIsDividerRemoteAnimating = false; mIsDividerRemoteAnimating = false;
mSyncQueue.queue(evictWct);
mSyncQueue.runInSync(t -> applyDividerVisibility(t)); mSyncQueue.runInSync(t -> applyDividerVisibility(t));
finishedCallback.onAnimationFinished(); finishedCallback.onAnimationFinished();
} }
@@ -412,6 +416,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
@Override @Override
public void onAnimationCancelled() { public void onAnimationCancelled() {
mIsDividerRemoteAnimating = false; mIsDividerRemoteAnimating = false;
mSyncQueue.queue(evictWct);
mSyncQueue.runInSync(t -> applyDividerVisibility(t));
try { try {
adapter.getRunner().onAnimationCancelled(); adapter.getRunner().onAnimationCancelled();
} catch (RemoteException e) { } catch (RemoteException e) {
@@ -434,10 +440,14 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
setSideStagePosition(sidePosition, wct); setSideStagePosition(sidePosition, wct);
mSplitLayout.setDivideRatio(splitRatio); mSplitLayout.setDivideRatio(splitRatio);
// Build a request WCT that will launch both apps such that task 0 is on the main stage if (mMainStage.isActive()) {
// while task 1 is on the side stage. mMainStage.moveToTop(getMainStageBounds(), wct);
mMainStage.activate(getMainStageBounds(), wct, false /* reparent */); } else {
mSideStage.setBounds(getSideStageBounds(), wct); // Build a request WCT that will launch both apps such that task 0 is on the main stage
// while task 1 is on the side stage.
mMainStage.activate(getMainStageBounds(), wct, false /* reparent */);
}
mSideStage.moveToTop(getSideStageBounds(), wct);
// Make sure the launch options will put tasks in the corresponding split roots // Make sure the launch options will put tasks in the corresponding split roots
addActivityOptions(mainOptions, mMainStage); addActivityOptions(mainOptions, mMainStage);
@@ -902,6 +912,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler,
if (mDividerVisible) { if (mDividerVisible) {
t.show(dividerLeash) t.show(dividerLeash)
.setAlpha(dividerLeash, 1)
.setLayer(dividerLeash, SPLIT_DIVIDER_LAYER) .setLayer(dividerLeash, SPLIT_DIVIDER_LAYER)
.setPosition(dividerLeash, .setPosition(dividerLeash,
mSplitLayout.getDividerBounds().left, mSplitLayout.getDividerBounds().left,

View File

@@ -34,6 +34,7 @@ import android.graphics.Rect;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.view.SurfaceSession; import android.view.SurfaceSession;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -304,6 +305,11 @@ class StageTaskListener implements ShellTaskOrganizer.TaskListener {
wct.reparent(task.token, mRootTaskInfo.token, true /* onTop*/); wct.reparent(task.token, mRootTaskInfo.token, true /* onTop*/);
} }
void moveToTop(Rect rootBounds, WindowContainerTransaction wct) {
final WindowContainerToken rootToken = mRootTaskInfo.token;
wct.setBounds(rootToken, rootBounds).reorder(rootToken, true /* onTop */);
}
void setBounds(Rect bounds, WindowContainerTransaction wct) { void setBounds(Rect bounds, WindowContainerTransaction wct) {
wct.setBounds(mRootTaskInfo.token, bounds); wct.setBounds(mRootTaskInfo.token, bounds);
} }

View File

@@ -54,6 +54,7 @@ class RunningTasks {
private boolean mAllowed; private boolean mAllowed;
private boolean mFilterOnlyVisibleRecents; private boolean mFilterOnlyVisibleRecents;
private Task mTopDisplayFocusRootTask; private Task mTopDisplayFocusRootTask;
private Task mTopDisplayAdjacentTask;
private RecentTasks mRecentTasks; private RecentTasks mRecentTasks;
private boolean mKeepIntentExtra; private boolean mKeepIntentExtra;
@@ -77,6 +78,12 @@ class RunningTasks {
mRecentTasks = root.mService.getRecentTasks(); mRecentTasks = root.mService.getRecentTasks();
mKeepIntentExtra = (flags & FLAG_KEEP_INTENT_EXTRA) == FLAG_KEEP_INTENT_EXTRA; mKeepIntentExtra = (flags & FLAG_KEEP_INTENT_EXTRA) == FLAG_KEEP_INTENT_EXTRA;
if (mTopDisplayFocusRootTask.getAdjacentTaskFragment() != null) {
mTopDisplayAdjacentTask = mTopDisplayFocusRootTask.getAdjacentTaskFragment().asTask();
} else {
mTopDisplayAdjacentTask = null;
}
final PooledConsumer c = PooledLambda.obtainConsumer(RunningTasks::processTask, this, final PooledConsumer c = PooledLambda.obtainConsumer(RunningTasks::processTask, this,
PooledLambda.__(Task.class)); PooledLambda.__(Task.class));
root.forAllLeafTasks(c, false); root.forAllLeafTasks(c, false);
@@ -126,6 +133,12 @@ class RunningTasks {
// can be used to determine the order of the tasks (it may not be set for newly // can be used to determine the order of the tasks (it may not be set for newly
// created tasks) // created tasks)
task.touchActiveTime(); task.touchActiveTime();
} else if (rootTask == mTopDisplayAdjacentTask && rootTask.getTopMostTask() == task) {
// The short-term workaround for launcher could get suitable running task info in
// split screen.
task.touchActiveTime();
// TreeSet doesn't allow same value and make sure this task is lower than focus one.
task.lastActiveTime--;
} }
mTmpSortedSet.add(task); mTmpSortedSet.add(task);