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

Commit 8fc91fa0 authored by Jerry Chang's avatar Jerry Chang
Browse files

Fix flicker while resizing split screen

Client app in split screen without focus was considered as occluded
unexpectedly while applying transaction to resize split screen, so it
won't process the new size config until the client app been relaunched
due to configuration changed later and thus introduce a flicker. Refines
ActivityRecord#shouldBeVisible to respect leaf task occluding state.

Fix: 228569855
Test: client app on non-focused side of the split screen won't flicker
      after resized
Change-Id: I19ac501526c6a4662609ef84532dc093acb63f54
parent f0af0661
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -5515,8 +5515,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
    }

    /** @return {@code true} if this activity should be made visible. */
    private boolean shouldBeVisible(boolean behindFullscreenActivity, boolean ignoringKeyguard) {
        updateVisibilityIgnoringKeyguard(behindFullscreenActivity);
    private boolean shouldBeVisible(boolean behindOccludedContainer, boolean ignoringKeyguard) {
        updateVisibilityIgnoringKeyguard(behindOccludedContainer);

        if (ignoringKeyguard) {
            return visibleIgnoringKeyguard;
@@ -5574,20 +5574,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        return differentUidOverlayActivity != null;
    }

    void updateVisibilityIgnoringKeyguard(boolean behindFullscreenActivity) {
        visibleIgnoringKeyguard = (!behindFullscreenActivity || mLaunchTaskBehind)
    void updateVisibilityIgnoringKeyguard(boolean behindOccludedContainer) {
        visibleIgnoringKeyguard = (!behindOccludedContainer || mLaunchTaskBehind)
                && showToCurrentUser();
    }

    boolean shouldBeVisible() {
        final Task rootTask = getRootTask();
        if (rootTask == null) {
        final Task task = getTask();
        if (task == null) {
            return false;
        }

        final boolean behindFullscreenActivity = !rootTask.shouldBeVisible(null /* starting */)
                || rootTask.getOccludingActivityAbove(this) != null;
        return shouldBeVisible(behindFullscreenActivity, false /* ignoringKeyguard */);
        final boolean behindOccludedContainer = !task.shouldBeVisible(null /* starting */)
                || task.getOccludingActivityAbove(this) != null;
        return shouldBeVisible(behindOccludedContainer, false /* ignoringKeyguard */);
    }

    void makeVisibleIfNeeded(ActivityRecord starting, boolean reportToClient) {
+4 −18
Original line number Diff line number Diff line
@@ -5047,22 +5047,10 @@ class Task extends TaskFragment {
            positionChildAtTop(rTask);
        }
        Task task = null;
        if (!newTask && isOrhasTask) {
            // Starting activity cannot be occluding activity, otherwise starting window could be
            // remove immediately without transferring to starting activity.
            final ActivityRecord occludingActivity = getOccludingActivityAbove(r);
            if (occludingActivity != null) {
                // Here it is!  Now, if this is not yet visible (occluded by another task) to the
                // user, then just add it without starting; it will get started when the user
                // navigates back to it.
                ProtoLog.i(WM_DEBUG_ADD_REMOVE, "Adding activity %s to task %s "
                                + "callers: %s", r, task,
                        new RuntimeException("here").fillInStackTrace());
                rTask.positionChildAtTop(r);
        if (!newTask && isOrhasTask && !r.shouldBeVisible()) {
            ActivityOptions.abort(options);
            return;
        }
        }

        // Place a new activity at top of root task, so it is next to interact with the user.

@@ -5691,9 +5679,7 @@ class Task extends TaskFragment {
            return false;
        }

        // See if there is an occluding activity on-top of this one.
        final ActivityRecord occludingActivity = getOccludingActivityAbove(r);
        if (occludingActivity != null) return false;
        if (!r.shouldBeVisible()) return false;

        if (r.finishing) Slog.e(TAG, "willActivityBeVisible: Returning false,"
                + " would have returned true for r=" + r);