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

Commit 32729dac authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Compute visibilities when finishing activity with a translucent resume...

Merge "Compute visibilities when finishing activity with a translucent resume activity" into rvc-dev
parents 13d78380 de2c5f13
Loading
Loading
Loading
Loading
+23 −10
Original line number Diff line number Diff line
@@ -2669,15 +2669,28 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            return this;
        }

        final boolean isCurrentVisible = mVisibleRequested || isState(PAUSED);
        if (isCurrentVisible) {
            final ActivityStack stack = getStack();
            final ActivityRecord activity = stack.mResumedActivity;
            boolean ensureVisibility = false;
            if (activity != null && !activity.occludesParent()) {
                // If the resume activity is not opaque, we need to make sure the visibilities of
                // activities be updated, they may be seen by users.
                ensureVisibility = true;
            } else if (mStackSupervisor.getKeyguardController().isKeyguardLocked()
                    && stack.topActivityOccludesKeyguard()) {
                // Ensure activity visibilities and update lockscreen occluded/dismiss state when
                // finishing the top activity that occluded keyguard. So that, the
        // ActivityStack#mTopActivityOccludesKeyguard can be updated and the activity below won't
        // be resumed.
        if (isState(PAUSED)
                && mStackSupervisor.getKeyguardController().isKeyguardLocked()
                && getStack().topActivityOccludesKeyguard()) {
                // ActivityStack#mTopActivityOccludesKeyguard can be updated and the activity below
                // won't be resumed.
                ensureVisibility = true;
            }

            if (ensureVisibility) {
                getDisplay().ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
                    false /* preserveWindows */, false /* notifyClients */);
                        false /* preserveWindows */, true /* notifyClients */);
            }
        }

        boolean activityRemoved = false;
@@ -2698,7 +2711,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        // than destroy immediately.
        final boolean isNextNotYetVisible = next != null
                && (!next.nowVisible || !next.mVisibleRequested);
        if ((mVisibleRequested || isState(PAUSED)) && isNextNotYetVisible) {
        if (isCurrentVisible && isNextNotYetVisible) {
            // Add this activity to the list of stopping activities. It will be processed and
            // destroyed when the next activity reports idle.
            addToStopping(false /* scheduleIdle */, false /* idleDelayed */,
+40 −0
Original line number Diff line number Diff line
@@ -1082,6 +1082,46 @@ public class ActivityRecordTests extends ActivityTestsBase {
        assertFalse(mStack.topActivityOccludesKeyguard());
    }

    /**
     * Verify that complete finish request for an activity which the resume activity is translucent
     * must ensure the visibilities of activities being updated.
     */
    @Test
    public void testCompleteFinishing_ensureActivitiesVisible() {
        final ActivityRecord firstActivity = new ActivityBuilder(mService).setTask(mTask).build();
        firstActivity.mVisibleRequested = false;
        firstActivity.nowVisible = false;
        firstActivity.setState(STOPPED, "true");

        final ActivityRecord secondActivity = new ActivityBuilder(mService).setTask(mTask).build();
        secondActivity.mVisibleRequested = true;
        secondActivity.nowVisible = true;
        secondActivity.setState(PAUSED, "true");

        final ActivityRecord translucentActivity =
                new ActivityBuilder(mService).setTask(mTask).build();
        translucentActivity.mVisibleRequested = true;
        translucentActivity.nowVisible = true;
        translucentActivity.setState(RESUMED, "true");

        doReturn(false).when(translucentActivity).occludesParent();

        // Finish the second activity
        secondActivity.finishing = true;
        secondActivity.completeFinishing("test");
        verify(secondActivity.getDisplay()).ensureActivitiesVisible(null /* starting */,
                0 /* configChanges */ , false /* preserveWindows */,
                true /* notifyClients */);

        // Finish the first activity
        firstActivity.finishing = true;
        firstActivity.mVisibleRequested = true;
        firstActivity.completeFinishing("test");
        verify(firstActivity.getDisplay(), times(2)).ensureActivitiesVisible(null /* starting */,
                0 /* configChanges */ , false /* preserveWindows */,
                true /* notifyClients */);
    }

    /**
     * Verify destroy activity request completes successfully.
     */