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

Commit 73d6c792 authored by Jeff Chang's avatar Jeff Chang
Browse files

[RESTRICT AUTOMERGE] Update the visibility of activities on sleeping display

Activity with showWhenLocked flag is visible when screen is off and
leads to activity restart called.

This CL update the visibility condition for showWhenLocked and
dismisskeyguard activities and refer the keyguard visibility to
ensure the function works as expected.

Bug: 161036653
Test: atest ActivityRecordTests
      atest CtsWindowManagerDeviceTestCases:KeyguardTests
      atest CtsWindowManagerDeviceTestCases:KeyguardLockedTests

Change-Id: I9d56e40de964e9d11193fec7008f8d880028ac50
parent 3315572d
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -4578,15 +4578,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
            return false;
        }

        // Check if the activity is on a sleeping display, and if it can turn it ON.
        if (getDisplay().isSleeping()) {
            final boolean canTurnScreenOn = !mSetToSleep || canTurnScreenOn()
                    || canShowWhenLocked() || containsDismissKeyguardWindow();
            if (!canTurnScreenOn) {
                return false;
            }
        }

        // Now check whether it's really visible depending on Keyguard state, and update
        // {@link ActivityStack} internal states.
        // Inform the method if this activity is the top activity of this stack, but exclude the
@@ -4597,6 +4588,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        final boolean visibleIgnoringDisplayStatus = stack.checkKeyguardVisibility(this,
                visibleIgnoringKeyguard, isTop && isTopNotPinnedStack);

        // Check if the activity is on a sleeping display, and if it can turn it ON.
        // TODO(b/163993448): Do not make activity visible before display awake.
        if (visibleIgnoringDisplayStatus && getDisplay().isSleeping()) {
            return !mSetToSleep || canTurnScreenOn();
        }

        return visibleIgnoringDisplayStatus;
    }

+28 −0
Original line number Diff line number Diff line
@@ -1099,6 +1099,34 @@ public class ActivityRecordTests extends ActivityTestsBase {
        verify(topActivity).destroyIfPossible(anyString());
    }

    /**
     * Verify the visibility of a show-when-locked and dismiss keyguard activity on sleeping
     * display.
     */
    @Test
    public void testDisplaySleeping_activityInvisible() {
        final KeyguardController keyguardController =
                mActivity.mStackSupervisor.getKeyguardController();
        doReturn(true).when(keyguardController).isKeyguardLocked();
        final ActivityRecord topActivity = new ActivityBuilder(mService).setTask(mTask).build();
        topActivity.mVisibleRequested = true;
        topActivity.nowVisible = true;
        topActivity.setState(RESUMED, "test" /*reason*/);
        doReturn(true).when(topActivity).containsDismissKeyguardWindow();
        doCallRealMethod().when(mRootWindowContainer).ensureActivitiesVisible(
                any() /* starting */, anyInt() /* configChanges */,
                anyBoolean() /* preserveWindows */, anyBoolean() /* notifyClients */);
        topActivity.setShowWhenLocked(true);

        // Verify the top activity is occluded keyguard.
        assertEquals(topActivity, mStack.topRunningActivity());
        assertTrue(mStack.topActivityOccludesKeyguard());

        final DisplayContent display = mActivity.mDisplayContent;
        doReturn(true).when(display).isSleeping();
        assertFalse(topActivity.shouldBeVisible());
    }

    /**
     * Verify that complete finish request for a show-when-locked activity must ensure the
     * keyguard occluded state being updated.