From 62cdfe75f611cb667e9a42598da958170b400e91 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Wed, 13 May 2020 17:25:35 +0800 Subject: [PATCH] Fix returning an occluded activity below boundary WindowContainer#getActivity() was returning null if there was no matching activity or hit the boundary. Since we were unable to tell the difference between the two cases, we would continue looking for a matching activity from higher level window containers. Take below hierarchy for example, #getActivity() returns null if the boundary was TopActivity. So, we were kept looking for the matching activity from Task#2 and returns BottomActivity. RootTask - Task#1 - TopActivity - Task#2 - BottomActivity Bug: 156014697 Test: start activity from recents in split-secondary Change-Id: Ic344e8c1c47e9fa05c4de60be8c6b30f75cdb0bc --- .../core/java/com/android/server/wm/ActivityRecord.java | 2 +- .../core/java/com/android/server/wm/ActivityStack.java | 4 +++- .../core/java/com/android/server/wm/WindowContainer.java | 8 +++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 91c849c4110f6..85f333a19aa07 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3589,7 +3589,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override ActivityRecord getActivity(Predicate callback, boolean traverseTopToBottom, - WindowContainer boundary) { + ActivityRecord boundary) { return callback.test(this) ? this : null; } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 70488b4b29d91..7dcdbdfc52124 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -2689,7 +2689,9 @@ class ActivityStack extends Task { */ @Nullable private ActivityRecord getOccludingActivityAbove(ActivityRecord activity) { - return getActivity((ar) -> ar.occludesParent(), true /* traverseTopToBottom */, activity); + ActivityRecord top = getActivity((ar) -> ar.occludesParent(), + true /* traverseTopToBottom */, activity); + return top != activity ? top : null; } boolean willActivityBeVisible(IBinder token) { diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 5d7ec127da464..aa90b76ebb120 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -1415,11 +1415,12 @@ class WindowContainer extends ConfigurationContainer< } ActivityRecord getActivity(Predicate callback, boolean traverseTopToBottom, - WindowContainer boundary) { + ActivityRecord boundary) { if (traverseTopToBottom) { for (int i = mChildren.size() - 1; i >= 0; --i) { final WindowContainer wc = mChildren.get(i); - if (wc == boundary) return null; + // TODO(b/156986561): Improve the correctness of the boundary check. + if (wc == boundary) return boundary; final ActivityRecord r = wc.getActivity(callback, traverseTopToBottom, boundary); if (r != null) { @@ -1430,7 +1431,8 @@ class WindowContainer extends ConfigurationContainer< final int count = mChildren.size(); for (int i = 0; i < count; i++) { final WindowContainer wc = mChildren.get(i); - if (wc == boundary) return null; + // TODO(b/156986561): Improve the correctness of the boundary check. + if (wc == boundary) return boundary; final ActivityRecord r = wc.getActivity(callback, traverseTopToBottom, boundary); if (r != null) {