From dc9c1d41928e976d044f1f8f454b9c26296a76bd Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Tue, 11 Feb 2020 14:57:34 +0800 Subject: [PATCH] Exclude the ActivityStack when processing the reset of a task When processing the reset of task by ResetTargetTaskHelper, we should prevent to process task with ActivityStack case. This CL exclude the root task(ActivityStack) when execute the processing the reset of a task. Bug: 148590003 Test: atest WmTests:ActivityStackTests atest WmTests:TaskTests atest WmTests:ActivityRecordTests Change-Id: I63ed4c2d87f7844fc05c6f61434a0923f2ed3d21 --- .../android/server/wm/ResetTargetTaskHelper.java | 2 +- services/core/java/com/android/server/wm/Task.java | 14 ++++---------- .../com/android/server/wm/WindowContainer.java | 13 +++++++++++++ 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java index 2f61ca05ada5b..63346b9a3e5bc 100644 --- a/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java +++ b/services/core/java/com/android/server/wm/ResetTargetTaskHelper.java @@ -67,7 +67,7 @@ class ResetTargetTaskHelper { final PooledConsumer c = PooledLambda.obtainConsumer( ResetTargetTaskHelper::processTask, this, PooledLambda.__(Task.class)); - targetTask.mWmService.mRoot.forAllTasks(c); + targetTask.mWmService.mRoot.forAllTasks(c, true /*traverseTopToBottom*/, mTargetStack); c.recycle(); processPendingReparentActivities(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 9fb8e2f4e3da5..81286b935c6b9 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3064,17 +3064,11 @@ class Task extends WindowContainer { return matchParentBounds(); } + @Override void forAllTasks(Consumer callback, boolean traverseTopToBottom, Task excludedTask) { - if (traverseTopToBottom) { - super.forAllTasks(callback, traverseTopToBottom); - if (excludedTask != this) { - callback.accept(this); - } - } else { - super.forAllTasks(callback, traverseTopToBottom); - if (excludedTask != this) { - callback.accept(this); - } + super.forAllTasks(callback, traverseTopToBottom, excludedTask); + if (excludedTask != this) { + callback.accept(this); } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 504aa2dc7b4c7..0bb4e03e2cb01 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1425,6 +1425,19 @@ class WindowContainer extends ConfigurationContainer< } } + void forAllTasks(Consumer callback, boolean traverseTopToBottom, Task excludedTask) { + final int count = mChildren.size(); + if (traverseTopToBottom) { + for (int i = count - 1; i >= 0; --i) { + mChildren.get(i).forAllTasks(callback, traverseTopToBottom, excludedTask); + } + } else { + for (int i = 0; i < count; i++) { + mChildren.get(i).forAllTasks(callback, traverseTopToBottom, excludedTask); + } + } + } + Task getTaskAbove(Task t) { return getTask( (above) -> true, t, false /*includeBoundary*/, false /*traverseTopToBottom*/);