Ensure the above-top finishing activity is invisible

The finishing activity was the top-most activity in the Task. The
activity was not updated to invisible because it was above the
top running activity.

Bug: 259566326
Test: Starts a fullscreen activity in a new Task on top that
      resulted in two activities below (in ActivityEmbedding)
      to pause while the pausing activity is also finishing
Change-Id: I446cadf84afd4cad54f357fe9fec5ec6e8ac47b8
This commit is contained in:
Louis Chang
2022-12-16 08:30:06 +00:00
parent 3b378dfe3f
commit c01428ffb1

View File

@@ -28,7 +28,7 @@ import java.util.ArrayList;
/** Helper class to ensure activities are in the right visible state for a container. */
class EnsureActivitiesVisibleHelper {
private final TaskFragment mTaskFragment;
private ActivityRecord mTop;
private ActivityRecord mTopRunningActivity;
private ActivityRecord mStarting;
private boolean mAboveTop;
private boolean mContainerShouldBeVisible;
@@ -54,10 +54,10 @@ class EnsureActivitiesVisibleHelper {
void reset(ActivityRecord starting, int configChanges, boolean preserveWindows,
boolean notifyClients) {
mStarting = starting;
mTop = mTaskFragment.topRunningActivity();
mTopRunningActivity = mTaskFragment.topRunningActivity();
// If the top activity is not fullscreen, then we need to make sure any activities under it
// are now visible.
mAboveTop = mTop != null;
mAboveTop = mTopRunningActivity != null;
mContainerShouldBeVisible = mTaskFragment.shouldBeVisible(mStarting);
mBehindFullyOccludedContainer = !mContainerShouldBeVisible;
mConfigChanges = configChanges;
@@ -85,18 +85,19 @@ class EnsureActivitiesVisibleHelper {
reset(starting, configChanges, preserveWindows, notifyClients);
if (DEBUG_VISIBILITY) {
Slog.v(TAG_VISIBILITY, "ensureActivitiesVisible behind " + mTop
Slog.v(TAG_VISIBILITY, "ensureActivitiesVisible behind " + mTopRunningActivity
+ " configChanges=0x" + Integer.toHexString(configChanges));
}
if (mTop != null && mTaskFragment.asTask() != null) {
if (mTopRunningActivity != null && mTaskFragment.asTask() != null) {
// TODO(14709632): Check if this needed to be implemented in TaskFragment.
mTaskFragment.asTask().checkTranslucentActivityWaiting(mTop);
mTaskFragment.asTask().checkTranslucentActivityWaiting(mTopRunningActivity);
}
// We should not resume activities that being launched behind because these
// activities are actually behind other fullscreen activities, but still required
// to be visible (such as performing Recents animation).
final boolean resumeTopActivity = mTop != null && !mTop.mLaunchTaskBehind
final boolean resumeTopActivity = mTopRunningActivity != null
&& !mTopRunningActivity.mLaunchTaskBehind
&& mTaskFragment.canBeResumed(starting)
&& (starting == null || !starting.isDescendantOf(mTaskFragment));
@@ -113,7 +114,7 @@ class EnsureActivitiesVisibleHelper {
mBehindFullyOccludedContainer |=
(childTaskFragment.getBounds().equals(mTaskFragment.getBounds())
&& !childTaskFragment.isTranslucent(starting));
if (mAboveTop && mTop.getTaskFragment() == childTaskFragment) {
if (mAboveTop && mTopRunningActivity.getTaskFragment() == childTaskFragment) {
mAboveTop = false;
}
@@ -147,8 +148,11 @@ class EnsureActivitiesVisibleHelper {
private void setActivityVisibilityState(ActivityRecord r, ActivityRecord starting,
final boolean resumeTopActivity) {
final boolean isTop = r == mTop;
final boolean isTop = r == mTopRunningActivity;
if (mAboveTop && !isTop) {
// Ensure activities above the top-running activity to be invisible because the
// activity should be finishing or cannot show to current user.
r.makeInvisible();
return;
}
mAboveTop = false;