[DO NOT MERGE] Fix regression for enter PIP when onUserLeaveHint

This was changed in ag/15886711, but it shouldn't be needed anymore as
for case we need to animate the close transition, isVisible() will stay
true until the app transition is finished. Otherwise we shouldn't need
to keep the surface as visible even if it is in the closing app list.

Without this fix, we may accidentally show the surface that has been
commited to be invisible, such as enter pip onUserLeaveHint.

Fix: 216145863
Test: manually verify with Google Meet.
Test: atest WmTests:ActivityRecordTests
Change-Id: Ib28651f5c4dc728d19f968adc56015836e307ef8
Merged-In: Ib28651f5c4dc728d19f968adc56015836e307ef8
This commit is contained in:
Chris Li
2022-01-27 11:52:51 +08:00
parent 4afa26e51f
commit 0207f039d2
2 changed files with 36 additions and 8 deletions

View File

@@ -6913,7 +6913,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
@Override @Override
void prepareSurfaces() { void prepareSurfaces() {
final boolean show = isVisible() || isAnimating(TRANSITION | PARENTS, final boolean show = isVisible() || isAnimating(PARENTS,
ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS); ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS);
if (mSurfaceControl != null) { if (mSurfaceControl != null) {

View File

@@ -80,7 +80,6 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED;
import static com.android.server.wm.ActivityRecord.State.STARTED; import static com.android.server.wm.ActivityRecord.State.STARTED;
import static com.android.server.wm.ActivityRecord.State.STOPPED; import static com.android.server.wm.ActivityRecord.State.STOPPED;
import static com.android.server.wm.ActivityRecord.State.STOPPING; import static com.android.server.wm.ActivityRecord.State.STOPPING;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_APP_TRANSITION;
import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_INVISIBLE; import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_INVISIBLE;
import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE; import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE;
import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT; import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
@@ -3124,7 +3123,7 @@ public class ActivityRecordTests extends WindowTestsBase {
} }
@Test @Test
public void testInClosingAnimation_doNotHideSurface() { public void testInClosingAnimation_visibilityNotCommitted_doNotHideSurface() {
final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
makeWindowVisibleAndDrawn(app); makeWindowVisibleAndDrawn(app);
@@ -3133,16 +3132,45 @@ public class ActivityRecordTests extends WindowTestsBase {
mDisplayContent.mClosingApps.add(app.mActivityRecord); mDisplayContent.mClosingApps.add(app.mActivityRecord);
mDisplayContent.prepareAppTransition(TRANSIT_CLOSE); mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
// Update visibility and call to remove window // Remove window during transition, so it is requested to hide, but won't be committed until
app.mActivityRecord.commitVisibility(false, false); // the transition is finished.
app.mActivityRecord.onRemovedFromDisplay();
assertTrue(mDisplayContent.mClosingApps.contains(app.mActivityRecord));
assertFalse(app.mActivityRecord.isVisibleRequested());
assertTrue(app.mActivityRecord.isVisible());
assertTrue(app.mActivityRecord.isSurfaceShowing());
// Start transition.
app.mActivityRecord.prepareSurfaces(); app.mActivityRecord.prepareSurfaces();
// Because the app is waiting for transition, it should not hide the surface. // Because the app is waiting for transition, it should not hide the surface.
assertTrue(app.mActivityRecord.isSurfaceShowing()); assertTrue(app.mActivityRecord.isSurfaceShowing());
}
// Ensure onAnimationFinished will callback when the closing animation is finished. @Test
verify(app.mActivityRecord).onAnimationFinished(eq(ANIMATION_TYPE_APP_TRANSITION), public void testInClosingAnimation_visibilityCommitted_hideSurface() {
eq(null)); final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
makeWindowVisibleAndDrawn(app);
// Put the activity in close transition.
mDisplayContent.mOpeningApps.clear();
mDisplayContent.mClosingApps.add(app.mActivityRecord);
mDisplayContent.prepareAppTransition(TRANSIT_CLOSE);
// Commit visibility before start transition.
app.mActivityRecord.commitVisibility(false, false);
assertFalse(app.mActivityRecord.isVisibleRequested());
assertFalse(app.mActivityRecord.isVisible());
assertTrue(app.mActivityRecord.isSurfaceShowing());
// Start transition.
app.mActivityRecord.prepareSurfaces();
// Because the app visibility has been committed before the transition start, it should hide
// the surface.
assertFalse(app.mActivityRecord.isSurfaceShowing());
} }
private void assertHasStartingWindow(ActivityRecord atoken) { private void assertHasStartingWindow(ActivityRecord atoken) {