diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index cb2d98cc2afb5..70488b4b29d91 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -382,6 +382,7 @@ class ActivityStack extends Task { return mBehindFullscreenActivity; } + /** Returns {@code true} to stop the outer loop and indicate the result is computed. */ private boolean processActivity(ActivityRecord r, ActivityRecord topActivity) { if (mAboveTop) { if (r == topActivity) { @@ -397,7 +398,10 @@ class ActivityStack extends Task { } if (mHandlingOccluded) { - mHandleBehindFullscreenActivity.accept(r); + // Iterating through all occluded activities. + if (mBehindFullscreenActivity) { + mHandleBehindFullscreenActivity.accept(r); + } } else if (r == mToCheck) { return true; } else if (mBehindFullscreenActivity) { diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java index 822cb5a0c2d42..64e08c6ef1085 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java @@ -76,6 +76,9 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.function.Consumer; + /** * Tests for the {@link ActivityStack} class. * @@ -1327,6 +1330,8 @@ public class ActivityStackTests extends ActivityTestsBase { @Test public void testCheckBehindFullscreenActivity() { + final ArrayList occludedActivities = new ArrayList<>(); + final Consumer handleBehindFullscreenActivity = occludedActivities::add; final ActivityRecord bottomActivity = new ActivityBuilder(mService).setStack(mStack).setTask(mTask).build(); final ActivityRecord topActivity = @@ -1337,12 +1342,21 @@ public class ActivityStackTests extends ActivityTestsBase { assertFalse(mStack.checkBehindFullscreenActivity(topActivity, null /* handleBehindFullscreenActivity */)); + // Top activity occludes bottom activity. + mStack.checkBehindFullscreenActivity(null /* toCheck */, handleBehindFullscreenActivity); + assertThat(occludedActivities).containsExactly(bottomActivity); + doReturn(false).when(topActivity).occludesParent(); assertFalse(mStack.checkBehindFullscreenActivity(bottomActivity, null /* handleBehindFullscreenActivity */)); assertFalse(mStack.checkBehindFullscreenActivity(topActivity, null /* handleBehindFullscreenActivity */)); + occludedActivities.clear(); + // Top activity doesn't occlude parent, so the bottom activity is not occluded. + mStack.checkBehindFullscreenActivity(null /* toCheck */, handleBehindFullscreenActivity); + assertThat(occludedActivities).isEmpty(); + final ActivityRecord finishingActivity = new ActivityBuilder(mService).setStack(mStack).setTask(mTask).build(); finishingActivity.finishing = true;