[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
(cherry picked from commit 73d6c7926d)
This commit is contained in:
Jeff Chang
2020-08-07 16:08:15 +08:00
parent 6128b1ba0f
commit 31fc73a707
2 changed files with 34 additions and 9 deletions

View File

@@ -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;
}

View File

@@ -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.