Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f47777d authored by Charles Chen's avatar Charles Chen
Browse files

Fix overlay below activity is dismissed

When launching a new overlay, the overlay container below an activity
could be dismissed unexpectedly because we check if the overlay
container is the top TF of the task, but the top TF could also be
occluded by fullscreen activity.

This CL checks if the overlay is the top child of its parent container
instead.

Fixes: 339195872
Test: atest OverlayPresentationTest
Flag: EXEMPT bugfix
Change-Id: I25a31f64ff006895a97d09f7fb5a583bdec19f11
parent a126bc9d
Loading
Loading
Loading
Loading
+19 −2
Original line number Original line Diff line number Diff line
@@ -102,6 +102,8 @@ public final class TaskFragmentInfo implements Parcelable {
    @NonNull
    @NonNull
    private final Point mMinimumDimensions = new Point();
    private final Point mMinimumDimensions = new Point();


    private final boolean mIsTopNonFishingChild;

    /** @hide */
    /** @hide */
    public TaskFragmentInfo(
    public TaskFragmentInfo(
            @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token,
            @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token,
@@ -110,7 +112,7 @@ public final class TaskFragmentInfo implements Parcelable {
            @NonNull List<IBinder> inRequestedTaskFragmentActivities,
            @NonNull List<IBinder> inRequestedTaskFragmentActivities,
            @NonNull Point positionInParent, boolean isTaskClearedForReuse,
            @NonNull Point positionInParent, boolean isTaskClearedForReuse,
            boolean isTaskFragmentClearedForPip, boolean isClearedForReorderActivityToFront,
            boolean isTaskFragmentClearedForPip, boolean isClearedForReorderActivityToFront,
            @NonNull Point minimumDimensions) {
            @NonNull Point minimumDimensions, boolean isTopNonFinishingChild) {
        mFragmentToken = requireNonNull(fragmentToken);
        mFragmentToken = requireNonNull(fragmentToken);
        mToken = requireNonNull(token);
        mToken = requireNonNull(token);
        mConfiguration.setTo(configuration);
        mConfiguration.setTo(configuration);
@@ -123,6 +125,7 @@ public final class TaskFragmentInfo implements Parcelable {
        mIsTaskFragmentClearedForPip = isTaskFragmentClearedForPip;
        mIsTaskFragmentClearedForPip = isTaskFragmentClearedForPip;
        mIsClearedForReorderActivityToFront = isClearedForReorderActivityToFront;
        mIsClearedForReorderActivityToFront = isClearedForReorderActivityToFront;
        mMinimumDimensions.set(minimumDimensions);
        mMinimumDimensions.set(minimumDimensions);
        mIsTopNonFishingChild = isTopNonFinishingChild;
    }
    }


    @NonNull
    @NonNull
@@ -211,6 +214,16 @@ public final class TaskFragmentInfo implements Parcelable {
        return mMinimumDimensions.y;
        return mMinimumDimensions.y;
    }
    }


    /**
     * Indicates that this TaskFragment is the top non-finishing child of its parent container
     * among all Activities and TaskFragment siblings.
     *
     * @hide
     */
    public boolean isTopNonFinishingChild() {
        return mIsTopNonFishingChild;
    }

    /**
    /**
     * Returns {@code true} if the parameters that are important for task fragment organizers are
     * Returns {@code true} if the parameters that are important for task fragment organizers are
     * equal between this {@link TaskFragmentInfo} and {@param that}.
     * equal between this {@link TaskFragmentInfo} and {@param that}.
@@ -236,7 +249,8 @@ public final class TaskFragmentInfo implements Parcelable {
                && mIsTaskClearedForReuse == that.mIsTaskClearedForReuse
                && mIsTaskClearedForReuse == that.mIsTaskClearedForReuse
                && mIsTaskFragmentClearedForPip == that.mIsTaskFragmentClearedForPip
                && mIsTaskFragmentClearedForPip == that.mIsTaskFragmentClearedForPip
                && mIsClearedForReorderActivityToFront == that.mIsClearedForReorderActivityToFront
                && mIsClearedForReorderActivityToFront == that.mIsClearedForReorderActivityToFront
                && mMinimumDimensions.equals(that.mMinimumDimensions);
                && mMinimumDimensions.equals(that.mMinimumDimensions)
                && mIsTopNonFishingChild == that.mIsTopNonFishingChild;
    }
    }


    private TaskFragmentInfo(Parcel in) {
    private TaskFragmentInfo(Parcel in) {
@@ -252,6 +266,7 @@ public final class TaskFragmentInfo implements Parcelable {
        mIsTaskFragmentClearedForPip = in.readBoolean();
        mIsTaskFragmentClearedForPip = in.readBoolean();
        mIsClearedForReorderActivityToFront = in.readBoolean();
        mIsClearedForReorderActivityToFront = in.readBoolean();
        mMinimumDimensions.readFromParcel(in);
        mMinimumDimensions.readFromParcel(in);
        mIsTopNonFishingChild = in.readBoolean();
    }
    }


    /** @hide */
    /** @hide */
@@ -269,6 +284,7 @@ public final class TaskFragmentInfo implements Parcelable {
        dest.writeBoolean(mIsTaskFragmentClearedForPip);
        dest.writeBoolean(mIsTaskFragmentClearedForPip);
        dest.writeBoolean(mIsClearedForReorderActivityToFront);
        dest.writeBoolean(mIsClearedForReorderActivityToFront);
        mMinimumDimensions.writeToParcel(dest, flags);
        mMinimumDimensions.writeToParcel(dest, flags);
        dest.writeBoolean(mIsTopNonFishingChild);
    }
    }


    @NonNull
    @NonNull
@@ -299,6 +315,7 @@ public final class TaskFragmentInfo implements Parcelable {
                + " isTaskFragmentClearedForPip=" + mIsTaskFragmentClearedForPip
                + " isTaskFragmentClearedForPip=" + mIsTaskFragmentClearedForPip
                + " mIsClearedForReorderActivityToFront=" + mIsClearedForReorderActivityToFront
                + " mIsClearedForReorderActivityToFront=" + mIsClearedForReorderActivityToFront
                + " minimumDimensions=" + mMinimumDimensions
                + " minimumDimensions=" + mMinimumDimensions
                + " isTopNonFinishingChild=" + mIsTopNonFishingChild
                + "}";
                + "}";
    }
    }


+1 −3
Original line number Original line Diff line number Diff line
@@ -2759,9 +2759,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
        //      in the same task, the overlay will be dismissed in case an activity above
        //      in the same task, the overlay will be dismissed in case an activity above
        //      the overlay is dismissed and the overlay is shown unexpectedly.
        //      the overlay is dismissed and the overlay is shown unexpectedly.
        for (final TaskFragmentContainer overlayContainer : overlayContainers) {
        for (final TaskFragmentContainer overlayContainer : overlayContainers) {
            final boolean isTopNonFinishingOverlay = overlayContainer.equals(
            final boolean isTopNonFinishingOverlay = overlayContainer.isTopNonFinishingChild();
                    overlayContainer.getTaskContainer().getTopNonFinishingTaskFragmentContainer(
                            true /* includePin */, true /* includeOverlay */));
            final boolean areInSameTask = taskId == overlayContainer.getTaskId();
            final boolean areInSameTask = taskId == overlayContainer.getTaskId();
            final boolean haveSameTag = overlayTag.equals(overlayContainer.getOverlayTag());
            final boolean haveSameTag = overlayTag.equals(overlayContainer.getOverlayTag());
            if (!associateLaunchingActivity && overlayContainer.isAlwaysOnTopOverlay()
            if (!associateLaunchingActivity && overlayContainer.isAlwaysOnTopOverlay()
+7 −0
Original line number Original line Diff line number Diff line
@@ -340,6 +340,13 @@ class TaskFragmentContainer {
        return mInfo != null && mInfo.isVisible();
        return mInfo != null && mInfo.isVisible();
    }
    }


    /**
     * See {@link TaskFragmentInfo#isTopNonFinishingChild()}
     */
    boolean isTopNonFinishingChild() {
        return mInfo != null && mInfo.isTopNonFinishingChild();
    }

    /** Whether the TaskFragment is in an intermediate state waiting for the server update.*/
    /** Whether the TaskFragment is in an intermediate state waiting for the server update.*/
    boolean isInIntermediateState() {
    boolean isInIntermediateState() {
        if (mInfo == null) {
        if (mInfo == null) {
+23 −1
Original line number Original line Diff line number Diff line
@@ -163,12 +163,14 @@ public class EmbeddingTestUtils {
    }
    }


    /** Creates a mock TaskFragmentInfo for the given TaskFragment. */
    /** Creates a mock TaskFragmentInfo for the given TaskFragment. */
    @NonNull
    static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container,
    static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container,
            @NonNull Activity activity) {
            @NonNull Activity activity) {
        return createMockTaskFragmentInfo(container, activity, true /* isVisible */);
        return createMockTaskFragmentInfo(container, activity, true /* isVisible */);
    }
    }


    /** Creates a mock TaskFragmentInfo for the given TaskFragment. */
    /** Creates a mock TaskFragmentInfo for the given TaskFragment. */
    @NonNull
    static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container,
    static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container,
            @NonNull Activity activity, boolean isVisible) {
            @NonNull Activity activity, boolean isVisible) {
        return new TaskFragmentInfo(container.getTaskFragmentToken(),
        return new TaskFragmentInfo(container.getTaskFragmentToken(),
@@ -182,7 +184,27 @@ public class EmbeddingTestUtils {
                false /* isTaskClearedForReuse */,
                false /* isTaskClearedForReuse */,
                false /* isTaskFragmentClearedForPip */,
                false /* isTaskFragmentClearedForPip */,
                false /* isClearedForReorderActivityToFront */,
                false /* isClearedForReorderActivityToFront */,
                new Point());
                new Point(),
                false /* isTopChild */);
    }

    /** Creates a mock TaskFragmentInfo for the given TaskFragment. */
    @NonNull
    static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container,
            @NonNull Activity activity, boolean isVisible, boolean isOnTop) {
        return new TaskFragmentInfo(container.getTaskFragmentToken(),
                mock(WindowContainerToken.class),
                new Configuration(),
                1,
                isVisible,
                Collections.singletonList(activity.getActivityToken()),
                new ArrayList<>(),
                new Point(),
                false /* isTaskClearedForReuse */,
                false /* isTaskFragmentClearedForPip */,
                false /* isClearedForReorderActivityToFront */,
                new Point(),
                isOnTop);
    }
    }


    static ActivityInfo createActivityInfoWithMinDimensions() {
    static ActivityInfo createActivityInfoWithMinDimensions() {
+2 −1
Original line number Original line Diff line number Diff line
@@ -114,6 +114,7 @@ public class JetpackTaskFragmentOrganizerTest {
                mock(WindowContainerToken.class), new Configuration(), 0 /* runningActivityCount */,
                mock(WindowContainerToken.class), new Configuration(), 0 /* runningActivityCount */,
                false /* isVisible */, new ArrayList<>(), new ArrayList<>(), new Point(),
                false /* isVisible */, new ArrayList<>(), new ArrayList<>(), new Point(),
                false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */,
                false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */,
                false /* isClearedForReorderActivityToFront */, new Point());
                false /* isClearedForReorderActivityToFront */, new Point(),
                false /* isTopChild */);
    }
    }
}
}
Loading