diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 839a0395b9679..acfa30cb004e1 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -10608,6 +10608,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return false; } if (!isVisibleRequested()) return true; + if (mPendingRelaunchCount > 0) return false; // Wait for attach. That is the earliest time where we know if there will be an associated // display rotation. If we don't wait, the starting-window can finishDrawing first and // cause the display rotation to end-up in a following transition. diff --git a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java index 5eebe746d64b1..fc5e9cab5447d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SyncEngineTests.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; @@ -119,6 +120,22 @@ public class SyncEngineTests extends WindowTestsBase { assertTrue(mockWC.onSyncFinishedDrawing()); bse.onSurfacePlacement(); verify(listener, times(1)).onTransactionReady(eq(id), notNull()); + + // The sync is not finished for a relaunching activity. + id = startSyncSet(bse, listener); + final ActivityRecord r = new ActivityBuilder(mAtm).setCreateTask(true).build(); + final WindowState w = mock(WindowState.class); + doReturn(true).when(w).isVisibleRequested(); + doReturn(true).when(w).fillsParent(); + doReturn(true).when(w).isSyncFinished(any()); + r.mChildren.add(w); + bse.addToSyncSet(id, r); + r.onSyncFinishedDrawing(); + assertTrue(r.isSyncFinished(r.getSyncGroup())); + r.startRelaunching(); + assertFalse(r.isSyncFinished(r.getSyncGroup())); + r.finishRelaunching(); + assertTrue(r.isSyncFinished(r.getSyncGroup())); } @Test