diff --git a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java index 45f401b520825..fed4f6205a3b9 100644 --- a/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java +++ b/services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java @@ -23,6 +23,8 @@ import static com.android.server.wm.Task.TAG_VISIBILITY; import android.annotation.Nullable; import android.util.Slog; +import java.util.ArrayList; + /** Helper class to ensure activities are in the right visible state for a container. */ class EnsureActivitiesVisibleHelper { private final TaskFragment mTaskFragment; @@ -98,17 +100,37 @@ class EnsureActivitiesVisibleHelper { && mTaskFragment.isTopActivityFocusable() && (starting == null || !starting.isDescendantOf(mTaskFragment)); + ArrayList adjacentTaskFragments = null; for (int i = mTaskFragment.mChildren.size() - 1; i >= 0; --i) { final WindowContainer child = mTaskFragment.mChildren.get(i); if (child.asTaskFragment() != null) { final TaskFragment childTaskFragment = child.asTaskFragment(); childTaskFragment.updateActivityVisibilities(starting, configChanges, preserveWindows, notifyClients); - mBehindFullyOccludedContainer = childTaskFragment.getBounds().equals( + mBehindFullyOccludedContainer |= childTaskFragment.getBounds().equals( mTaskFragment.getBounds()); if (mAboveTop && mTop.getTaskFragment() == childTaskFragment) { mAboveTop = false; } + + if (mBehindFullyOccludedContainer) { + continue; + } + + if (adjacentTaskFragments != null && adjacentTaskFragments.contains( + childTaskFragment)) { + // Everything behind two adjacent TaskFragments are occluded. + mBehindFullyOccludedContainer = true; + continue; + } + + final TaskFragment adjacentTaskFrag = childTaskFragment.getAdjacentTaskFragment(); + if (adjacentTaskFrag != null) { + if (adjacentTaskFragments == null) { + adjacentTaskFragments = new ArrayList<>(); + } + adjacentTaskFragments.add(adjacentTaskFrag); + } } else if (child.asActivityRecord() != null) { setActivityVisibilityState(child.asActivityRecord(), starting, resumeTopActivity); }