[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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user