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:
@@ -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.
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user