Merge "Compute visibilities when finishing activity with a translucent resume activity" into rvc-dev am: 32729dacab
Change-Id: I4df5e49b97e86e85d68867649d636eb7501f7258
This commit is contained in:
@@ -2669,15 +2669,28 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
||||
return this;
|
||||
}
|
||||
|
||||
// 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()) {
|
||||
getDisplay().ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
|
||||
false /* preserveWindows */, false /* notifyClients */);
|
||||
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.
|
||||
ensureVisibility = true;
|
||||
}
|
||||
|
||||
if (ensureVisibility) {
|
||||
getDisplay().ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
|
||||
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 */,
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user