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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure activity visibilities and update lockscreen occluded/dismiss state when
|
final boolean isCurrentVisible = mVisibleRequested || isState(PAUSED);
|
||||||
// finishing the top activity that occluded keyguard. So that, the
|
if (isCurrentVisible) {
|
||||||
// ActivityStack#mTopActivityOccludesKeyguard can be updated and the activity below won't
|
final ActivityStack stack = getStack();
|
||||||
// be resumed.
|
final ActivityRecord activity = stack.mResumedActivity;
|
||||||
if (isState(PAUSED)
|
boolean ensureVisibility = false;
|
||||||
&& mStackSupervisor.getKeyguardController().isKeyguardLocked()
|
if (activity != null && !activity.occludesParent()) {
|
||||||
&& getStack().topActivityOccludesKeyguard()) {
|
// If the resume activity is not opaque, we need to make sure the visibilities of
|
||||||
getDisplay().ensureActivitiesVisible(null /* starting */, 0 /* configChanges */,
|
// activities be updated, they may be seen by users.
|
||||||
false /* preserveWindows */, false /* notifyClients */);
|
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;
|
boolean activityRemoved = false;
|
||||||
@@ -2698,7 +2711,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
|
|||||||
// than destroy immediately.
|
// than destroy immediately.
|
||||||
final boolean isNextNotYetVisible = next != null
|
final boolean isNextNotYetVisible = next != null
|
||||||
&& (!next.nowVisible || !next.mVisibleRequested);
|
&& (!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
|
// Add this activity to the list of stopping activities. It will be processed and
|
||||||
// destroyed when the next activity reports idle.
|
// destroyed when the next activity reports idle.
|
||||||
addToStopping(false /* scheduleIdle */, false /* idleDelayed */,
|
addToStopping(false /* scheduleIdle */, false /* idleDelayed */,
|
||||||
|
|||||||
@@ -1082,6 +1082,46 @@ public class ActivityRecordTests extends ActivityTestsBase {
|
|||||||
assertFalse(mStack.topActivityOccludesKeyguard());
|
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.
|
* Verify destroy activity request completes successfully.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user