Merge "Support nesting in leaftaskfilter and make recents compatible" into udc-dev
This commit is contained in:
@@ -35,6 +35,7 @@ import android.os.Bundle;
|
|||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
|
import android.util.IntArray;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.view.Display;
|
import android.view.Display;
|
||||||
@@ -422,26 +423,28 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
// About layering: we divide up the "layer space" into 3 regions (each the size of
|
// About layering: we divide up the "layer space" into 3 regions (each the size of
|
||||||
// the change count). This lets us categorize things into above/below/between
|
// the change count). This lets us categorize things into above/below/between
|
||||||
// while maintaining their relative ordering.
|
// while maintaining their relative ordering.
|
||||||
|
final int belowLayers = info.getChanges().size();
|
||||||
|
final int aboveLayers = info.getChanges().size() * 3;
|
||||||
for (int i = 0; i < info.getChanges().size(); ++i) {
|
for (int i = 0; i < info.getChanges().size(); ++i) {
|
||||||
final TransitionInfo.Change change = info.getChanges().get(i);
|
final TransitionInfo.Change change = info.getChanges().get(i);
|
||||||
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
|
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
|
||||||
if (TransitionUtil.isWallpaper(change)) {
|
if (TransitionUtil.isWallpaper(change)) {
|
||||||
final RemoteAnimationTarget target = TransitionUtil.newTarget(change,
|
final RemoteAnimationTarget target = TransitionUtil.newTarget(change,
|
||||||
// wallpapers go into the "below" layer space
|
// wallpapers go into the "below" layer space
|
||||||
info.getChanges().size() - i, info, t, mLeashMap);
|
belowLayers - i, info, t, mLeashMap);
|
||||||
wallpapers.add(target);
|
wallpapers.add(target);
|
||||||
// Make all the wallpapers opaque since we want them visible from the start
|
// Make all the wallpapers opaque since we want them visible from the start
|
||||||
t.setAlpha(target.leash, 1);
|
t.setAlpha(target.leash, 1);
|
||||||
} else if (leafTaskFilter.test(change)) {
|
} else if (leafTaskFilter.test(change)) {
|
||||||
// start by putting everything into the "below" layer space.
|
// start by putting everything into the "below" layer space.
|
||||||
final RemoteAnimationTarget target = TransitionUtil.newTarget(change,
|
final RemoteAnimationTarget target = TransitionUtil.newTarget(change,
|
||||||
info.getChanges().size() - i, info, t, mLeashMap);
|
belowLayers - i, info, t, mLeashMap);
|
||||||
apps.add(target);
|
apps.add(target);
|
||||||
if (TransitionUtil.isClosingType(change.getMode())) {
|
if (TransitionUtil.isClosingType(change.getMode())) {
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
" adding pausing taskId=%d", taskInfo.taskId);
|
" adding pausing leaf taskId=%d", taskInfo.taskId);
|
||||||
// raise closing (pausing) task to "above" layer so it isn't covered
|
// raise closing (pausing) task to "above" layer so it isn't covered
|
||||||
t.setLayer(target.leash, info.getChanges().size() * 3 - i);
|
t.setLayer(target.leash, aboveLayers - i);
|
||||||
mPausingTasks.add(new TaskState(change, target.leash));
|
mPausingTasks.add(new TaskState(change, target.leash));
|
||||||
if (taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
|
if (taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
|
||||||
// This can only happen if we have a separate recents/home (3p launcher)
|
// This can only happen if we have a separate recents/home (3p launcher)
|
||||||
@@ -454,17 +457,32 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
} else if (taskInfo != null
|
} else if (taskInfo != null
|
||||||
&& taskInfo.topActivityType == ACTIVITY_TYPE_RECENTS) {
|
&& taskInfo.topActivityType == ACTIVITY_TYPE_RECENTS) {
|
||||||
// There's a 3p launcher, so make sure recents goes above that.
|
// There's a 3p launcher, so make sure recents goes above that.
|
||||||
t.setLayer(target.leash, info.getChanges().size() * 3 - i);
|
t.setLayer(target.leash, aboveLayers - i);
|
||||||
} else if (taskInfo != null && taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
|
} else if (taskInfo != null && taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
|
||||||
// do nothing
|
// do nothing
|
||||||
} else if (TransitionUtil.isOpeningType(change.getMode())) {
|
} else if (TransitionUtil.isOpeningType(change.getMode())) {
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
" adding opening taskId=%d", taskInfo.taskId);
|
" adding opening leaf taskId=%d", taskInfo.taskId);
|
||||||
mOpeningTasks.add(new TaskState(change, target.leash));
|
mOpeningTasks.add(new TaskState(change, target.leash));
|
||||||
}
|
}
|
||||||
|
} else if (taskInfo != null && TransitionInfo.isIndependent(change, info)) {
|
||||||
|
// Root tasks
|
||||||
|
if (TransitionUtil.isClosingType(change.getMode())) {
|
||||||
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
|
" adding pausing taskId=%d", taskInfo.taskId);
|
||||||
|
// raise closing (pausing) task to "above" layer so it isn't covered
|
||||||
|
t.setLayer(change.getLeash(), aboveLayers - i);
|
||||||
|
mPausingTasks.add(new TaskState(change, null /* leash */));
|
||||||
|
} else if (TransitionUtil.isOpeningType(change.getMode())) {
|
||||||
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
|
" adding opening taskId=%d", taskInfo.taskId);
|
||||||
|
// Put into the "below" layer space.
|
||||||
|
t.setLayer(change.getLeash(), belowLayers - i);
|
||||||
|
mOpeningTasks.add(new TaskState(change, null /* leash */));
|
||||||
|
}
|
||||||
} else if (TransitionUtil.isDividerBar(change)) {
|
} else if (TransitionUtil.isDividerBar(change)) {
|
||||||
final RemoteAnimationTarget target = TransitionUtil.newTarget(change,
|
final RemoteAnimationTarget target = TransitionUtil.newTarget(change,
|
||||||
info.getChanges().size() - i, info, t, mLeashMap);
|
belowLayers - i, info, t, mLeashMap);
|
||||||
// Add this as a app and we will separate them on launcher side by window type.
|
// Add this as a app and we will separate them on launcher side by window type.
|
||||||
apps.add(target);
|
apps.add(target);
|
||||||
}
|
}
|
||||||
@@ -519,7 +537,9 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
}
|
}
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
"[%d] RecentsController.merge", mInstanceId);
|
"[%d] RecentsController.merge", mInstanceId);
|
||||||
|
// Keep all tasks in one list because order matters.
|
||||||
ArrayList<TransitionInfo.Change> openingTasks = null;
|
ArrayList<TransitionInfo.Change> openingTasks = null;
|
||||||
|
IntArray openingTaskIsLeafs = null;
|
||||||
ArrayList<TransitionInfo.Change> closingTasks = null;
|
ArrayList<TransitionInfo.Change> closingTasks = null;
|
||||||
mOpeningSeparateHome = false;
|
mOpeningSeparateHome = false;
|
||||||
TransitionInfo.Change recentsOpening = null;
|
TransitionInfo.Change recentsOpening = null;
|
||||||
@@ -538,25 +558,29 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
cancel("task #" + taskInfo.taskId + " is always_on_top");
|
cancel("task #" + taskInfo.taskId + " is always_on_top");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hasTaskChange = hasTaskChange || taskInfo != null;
|
final boolean isRootTask = taskInfo != null
|
||||||
|
&& TransitionInfo.isIndependent(change, info);
|
||||||
|
hasTaskChange = hasTaskChange || isRootTask;
|
||||||
final boolean isLeafTask = leafTaskFilter.test(change);
|
final boolean isLeafTask = leafTaskFilter.test(change);
|
||||||
if (TransitionUtil.isOpeningType(change.getMode())) {
|
if (TransitionUtil.isOpeningType(change.getMode())) {
|
||||||
if (mRecentsTask != null && mRecentsTask.equals(change.getContainer())) {
|
if (mRecentsTask != null && mRecentsTask.equals(change.getContainer())) {
|
||||||
recentsOpening = change;
|
recentsOpening = change;
|
||||||
} else if (isLeafTask) {
|
} else if (isRootTask || isLeafTask) {
|
||||||
if (taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
|
if (isLeafTask && taskInfo.topActivityType == ACTIVITY_TYPE_HOME) {
|
||||||
// This is usually a 3p launcher
|
// This is usually a 3p launcher
|
||||||
mOpeningSeparateHome = true;
|
mOpeningSeparateHome = true;
|
||||||
}
|
}
|
||||||
if (openingTasks == null) {
|
if (openingTasks == null) {
|
||||||
openingTasks = new ArrayList<>();
|
openingTasks = new ArrayList<>();
|
||||||
|
openingTaskIsLeafs = new IntArray();
|
||||||
}
|
}
|
||||||
openingTasks.add(change);
|
openingTasks.add(change);
|
||||||
|
openingTaskIsLeafs.add(isLeafTask ? 1 : 0);
|
||||||
}
|
}
|
||||||
} else if (TransitionUtil.isClosingType(change.getMode())) {
|
} else if (TransitionUtil.isClosingType(change.getMode())) {
|
||||||
if (mRecentsTask != null && mRecentsTask.equals(change.getContainer())) {
|
if (mRecentsTask != null && mRecentsTask.equals(change.getContainer())) {
|
||||||
foundRecentsClosing = true;
|
foundRecentsClosing = true;
|
||||||
} else if (isLeafTask) {
|
} else if (isRootTask || isLeafTask) {
|
||||||
if (closingTasks == null) {
|
if (closingTasks == null) {
|
||||||
closingTasks = new ArrayList<>();
|
closingTasks = new ArrayList<>();
|
||||||
}
|
}
|
||||||
@@ -622,7 +646,8 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
}
|
}
|
||||||
final TaskState openingTask = mOpeningTasks.remove(openingIdx);
|
final TaskState openingTask = mOpeningTasks.remove(openingIdx);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
" pausing opening taskId=%d", openingTask.mTaskInfo.taskId);
|
" pausing opening %staskId=%d", openingTask.isLeaf() ? "leaf " : "",
|
||||||
|
openingTask.mTaskInfo.taskId);
|
||||||
mPausingTasks.add(openingTask);
|
mPausingTasks.add(openingTask);
|
||||||
didMergeThings = true;
|
didMergeThings = true;
|
||||||
}
|
}
|
||||||
@@ -632,35 +657,55 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
// Switching to some new tasks, add to mOpening and remove from mPausing. Also,
|
// Switching to some new tasks, add to mOpening and remove from mPausing. Also,
|
||||||
// enter NEW_TASK state since this will start the switch-to animation.
|
// enter NEW_TASK state since this will start the switch-to animation.
|
||||||
final int layer = mInfo.getChanges().size() * 3;
|
final int layer = mInfo.getChanges().size() * 3;
|
||||||
appearedTargets = new RemoteAnimationTarget[openingTasks.size()];
|
int openingLeafCount = 0;
|
||||||
|
for (int i = 0; i < openingTaskIsLeafs.size(); ++i) {
|
||||||
|
openingLeafCount += openingTaskIsLeafs.get(i);
|
||||||
|
}
|
||||||
|
if (openingLeafCount > 0) {
|
||||||
|
appearedTargets = new RemoteAnimationTarget[openingLeafCount];
|
||||||
|
}
|
||||||
|
int nextTargetIdx = 0;
|
||||||
for (int i = 0; i < openingTasks.size(); ++i) {
|
for (int i = 0; i < openingTasks.size(); ++i) {
|
||||||
final TransitionInfo.Change change = openingTasks.get(i);
|
final TransitionInfo.Change change = openingTasks.get(i);
|
||||||
|
final boolean isLeaf = openingTaskIsLeafs.get(i) == 1;
|
||||||
int pausingIdx = TaskState.indexOf(mPausingTasks, change);
|
int pausingIdx = TaskState.indexOf(mPausingTasks, change);
|
||||||
if (pausingIdx >= 0) {
|
if (pausingIdx >= 0) {
|
||||||
// Something is showing/opening a previously-pausing app.
|
// Something is showing/opening a previously-pausing app.
|
||||||
appearedTargets[i] = TransitionUtil.newTarget(
|
if (isLeaf) {
|
||||||
change, layer, mPausingTasks.get(pausingIdx).mLeash);
|
appearedTargets[nextTargetIdx++] = TransitionUtil.newTarget(
|
||||||
|
change, layer, mPausingTasks.get(pausingIdx).mLeash);
|
||||||
|
}
|
||||||
final TaskState pausingTask = mPausingTasks.remove(pausingIdx);
|
final TaskState pausingTask = mPausingTasks.remove(pausingIdx);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
" opening pausing taskId=%d", pausingTask.mTaskInfo.taskId);
|
" opening pausing %staskId=%d", isLeaf ? "leaf " : "",
|
||||||
|
pausingTask.mTaskInfo.taskId);
|
||||||
mOpeningTasks.add(pausingTask);
|
mOpeningTasks.add(pausingTask);
|
||||||
// Setup hides opening tasks initially, so make it visible again (since we
|
// Setup hides opening tasks initially, so make it visible again (since we
|
||||||
// are already showing it).
|
// are already showing it).
|
||||||
t.show(change.getLeash());
|
t.show(change.getLeash());
|
||||||
t.setAlpha(change.getLeash(), 1.f);
|
t.setAlpha(change.getLeash(), 1.f);
|
||||||
} else {
|
} else if (isLeaf) {
|
||||||
// We are receiving new opening tasks, so convert to onTasksAppeared.
|
// We are receiving new opening leaf tasks, so convert to onTasksAppeared.
|
||||||
appearedTargets[i] = TransitionUtil.newTarget(
|
final RemoteAnimationTarget target = TransitionUtil.newTarget(
|
||||||
change, layer, info, t, mLeashMap);
|
change, layer, info, t, mLeashMap);
|
||||||
|
appearedTargets[nextTargetIdx++] = target;
|
||||||
// reparent into the original `mInfo` since that's where we are animating.
|
// reparent into the original `mInfo` since that's where we are animating.
|
||||||
final int rootIdx = TransitionUtil.rootIndexFor(change, mInfo);
|
final int rootIdx = TransitionUtil.rootIndexFor(change, mInfo);
|
||||||
t.reparent(appearedTargets[i].leash, mInfo.getRoot(rootIdx).getLeash());
|
t.reparent(target.leash, mInfo.getRoot(rootIdx).getLeash());
|
||||||
t.setLayer(appearedTargets[i].leash, layer);
|
t.setLayer(target.leash, layer);
|
||||||
// Hide the animation leash, let listener show it.
|
// Hide the animation leash, let listener show it.
|
||||||
t.hide(appearedTargets[i].leash);
|
t.hide(target.leash);
|
||||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
" opening new taskId=%d", appearedTargets[i].taskId);
|
" opening new leaf taskId=%d", target.taskId);
|
||||||
mOpeningTasks.add(new TaskState(change, appearedTargets[i].leash));
|
mOpeningTasks.add(new TaskState(change, target.leash));
|
||||||
|
} else {
|
||||||
|
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_RECENTS_TRANSITION,
|
||||||
|
" opening new taskId=%d", change.getTaskInfo().taskId);
|
||||||
|
t.setLayer(change.getLeash(), layer);
|
||||||
|
// Setup hides opening tasks initially, so make it visible since recents
|
||||||
|
// is only animating the leafs.
|
||||||
|
t.show(change.getLeash());
|
||||||
|
mOpeningTasks.add(new TaskState(change, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
didMergeThings = true;
|
didMergeThings = true;
|
||||||
@@ -845,7 +890,7 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
t.show(mOpeningTasks.get(i).mTaskSurface);
|
t.show(mOpeningTasks.get(i).mTaskSurface);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < mPausingTasks.size(); ++i) {
|
for (int i = 0; i < mPausingTasks.size(); ++i) {
|
||||||
if (!sendUserLeaveHint) {
|
if (!sendUserLeaveHint && mPausingTasks.get(i).isLeaf()) {
|
||||||
// This means recents is not *actually* finishing, so of course we gotta
|
// This means recents is not *actually* finishing, so of course we gotta
|
||||||
// do special stuff in WMCore to accommodate.
|
// do special stuff in WMCore to accommodate.
|
||||||
wct.setDoNotPip(mPausingTasks.get(i).mToken);
|
wct.setDoNotPip(mPausingTasks.get(i).mToken);
|
||||||
@@ -924,7 +969,8 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
/** The surface/leash of the task provided by Core. */
|
/** The surface/leash of the task provided by Core. */
|
||||||
SurfaceControl mTaskSurface;
|
SurfaceControl mTaskSurface;
|
||||||
|
|
||||||
/** The (local) animation-leash created for this task. */
|
/** The (local) animation-leash created for this task. Only non-null for leafs. */
|
||||||
|
@Nullable
|
||||||
SurfaceControl mLeash;
|
SurfaceControl mLeash;
|
||||||
|
|
||||||
TaskState(TransitionInfo.Change change, SurfaceControl leash) {
|
TaskState(TransitionInfo.Change change, SurfaceControl leash) {
|
||||||
@@ -943,6 +989,10 @@ public class RecentsTransitionHandler implements Transitions.TransitionHandler {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isLeaf() {
|
||||||
|
return mLeash != null;
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "" + mToken + " : " + mLeash;
|
return "" + mToken + " : " + mLeash;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -121,15 +121,14 @@ public class TransitionUtil {
|
|||||||
@Override
|
@Override
|
||||||
public boolean test(TransitionInfo.Change change) {
|
public boolean test(TransitionInfo.Change change) {
|
||||||
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
|
final ActivityManager.RunningTaskInfo taskInfo = change.getTaskInfo();
|
||||||
|
if (taskInfo == null) return false;
|
||||||
// Children always come before parent since changes are in top-to-bottom z-order.
|
// Children always come before parent since changes are in top-to-bottom z-order.
|
||||||
if ((taskInfo == null) || mChildTaskTargets.get(taskInfo.taskId)) {
|
boolean hasChildren = mChildTaskTargets.get(taskInfo.taskId);
|
||||||
// has children, so not a leaf. Skip.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (taskInfo.hasParentTask()) {
|
if (taskInfo.hasParentTask()) {
|
||||||
mChildTaskTargets.put(taskInfo.parentTaskId, true);
|
mChildTaskTargets.put(taskInfo.parentTaskId, true);
|
||||||
}
|
}
|
||||||
return true;
|
// If it has children, it's not a leaf.
|
||||||
|
return !hasChildren;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user