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

Commit 28ad717e authored by Charles Chen's avatar Charles Chen
Browse files

Avoid to launch overlay from split

When the associated launching activity is from split container, we should
avoid to launch the overlay, and fallback to make the system determine
the launch target.

Bug: 339192249
Test: atest OverlayPresentationTest
Change-Id: I8f04b6fa795202594b7177467d92af39e3ee247e
parent 7f9eba1c
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -2756,6 +2756,12 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
    TaskFragmentContainer createOrUpdateOverlayTaskFragmentIfNeeded(
            @NonNull WindowContainerTransaction wct, @NonNull Bundle options,
            @NonNull Intent intent, @NonNull Activity launchActivity) {
        if (isActivityFromSplit(launchActivity)) {
            // We restrict to launch the overlay from split. Fallback to treat it as normal
            // launch.
            return null;
        }

        final List<TaskFragmentContainer> overlayContainers =
                getAllNonFinishingOverlayContainers();
        final String overlayTag = Objects.requireNonNull(options.getString(KEY_OVERLAY_TAG));
@@ -2868,6 +2874,15 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
                options, associateLaunchingActivity);
    }

    @GuardedBy("mLock")
    private boolean isActivityFromSplit(@NonNull Activity activity) {
        final TaskFragmentContainer container = getContainerWithActivity(activity);
        if (container == null) {
            return false;
        }
        return getActiveSplitForContainer(container) != null;
    }

    private final class LifecycleCallbacks extends EmptyLifecycleCallbacksAdapter {

        @Override
+0 −21
Original line number Diff line number Diff line
@@ -672,27 +672,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
            // Expand the bounds if the bounds exceed the task bounds.
            return new Rect();
        }

        if (!container.isOverlay()) {
            // Stop here if the container is not an overlay.
            return bounds;
        }

        final IBinder associatedActivityToken = container.getAssociatedActivityToken();

        if (associatedActivityToken == null) {
            // Stop here if the container is an always-on-top overlay.
            return bounds;
        }

        // Expand the overlay with activity association if the associated activity is part of a
        // split, or we may need to handle three change transition together.
        final TaskFragmentContainer associatedContainer = taskContainer
                .getContainerWithActivity(associatedActivityToken);
        if (taskContainer.getActiveSplitForContainer(associatedContainer) != null) {
            return new Rect();
        }

        return bounds;
    }

+19 −27
Original line number Diff line number Diff line
@@ -352,6 +352,25 @@ public class OverlayPresentationTest {
                .containsExactly(overlayContainer);
    }

    @Test
    public void testCreateOrUpdateOverlay_launchFromSplit_returnNull() {
        final Activity primaryActivity = createMockActivity();
        final Activity secondaryActivity = createMockActivity();
        final TaskFragmentContainer primaryContainer =
                createMockTaskFragmentContainer(primaryActivity);
        final TaskFragmentContainer secondaryContainer =
                createMockTaskFragmentContainer(secondaryActivity);
        final SplitPairRule splitPairRule = createSplitPairRuleBuilder(
                activityActivityPair -> true /* activityPairPredicate */,
                activityIntentPair -> true  /* activityIntentPairPredicate */,
                parentWindowMetrics -> true /* parentWindowMetricsPredicate */).build();
        mSplitController.registerSplit(mTransaction, primaryContainer, primaryActivity,
                secondaryContainer, splitPairRule,  splitPairRule.getDefaultSplitAttributes());

        assertThat(createOrUpdateOverlayTaskFragmentIfNeeded("test", primaryActivity)).isNull();
        assertThat(createOrUpdateOverlayTaskFragmentIfNeeded("test", secondaryActivity)).isNull();
    }

    private void createExistingOverlayContainers() {
        createExistingOverlayContainers(true /* visible */);
    }
@@ -388,33 +407,6 @@ public class OverlayPresentationTest {
                .isEmpty()).isTrue();
    }

    @Test
    public void testSanitizeBounds_visibleSplit_expandOverlay() {
        // Launch a visible split
        final Activity primaryActivity = createMockActivity();
        final Activity secondaryActivity = createMockActivity();
        final TaskFragmentContainer primaryContainer =
                createMockTaskFragmentContainer(primaryActivity, true /* isVisible */);
        final TaskFragmentContainer secondaryContainer =
                createMockTaskFragmentContainer(secondaryActivity, true /* isVisible */);

        final SplitPairRule splitPairRule = createSplitPairRuleBuilder(
                activityActivityPair -> true /* activityPairPredicate */,
                activityIntentPair -> true  /* activityIntentPairPredicate */,
                parentWindowMetrics -> true /* parentWindowMetricsPredicate */)
                .build();
        mSplitController.registerSplit(mTransaction, primaryContainer, primaryActivity,
                secondaryContainer, splitPairRule,  splitPairRule.getDefaultSplitAttributes());

        final Rect bounds = new Rect(0, 0, 100, 100);
        final TaskFragmentContainer overlayContainer =
                createTestOverlayContainer(TASK_ID, "test1", true /* isVisible */,
                        true /* associatedLaunchingActivity */, secondaryActivity);

        assertThat(sanitizeBounds(bounds, null, overlayContainer)
                .isEmpty()).isTrue();
    }

    @Test
    public void testCreateOrUpdateOverlayTaskFragmentIfNeeded_createOverlay() {
        final Rect bounds = new Rect(0, 0, 100, 100);