diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowContainer.java | 9 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java | 32 |
2 files changed, 38 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index 9a9283257b03..a1902bbd6764 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -2476,9 +2476,12 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { - boolean willSync = false; - if (!isVisible()) { - return willSync; + boolean willSync = true; + + // If we are invisible, no need to sync, likewise if we are already engaged in a sync, + // we can't support overlapping syncs on a single container yet. + if (!isVisible() || mWaitingListener != null) { + return false; } mUsingBLASTSyncTransaction = true; diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java index bc81d5e7c807..dea5ee25d91e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java @@ -532,6 +532,9 @@ public class TaskOrganizerTests extends WindowTestsBase { final Task task = createTaskInStack(stackController1, 0 /* userId */); final ITaskOrganizer organizer = registerMockOrganizer(); + spyOn(task); + doReturn(true).when(task).isVisible(); + BLASTSyncEngine bse = new BLASTSyncEngine(); BLASTSyncEngine.TransactionReadyListener transactionListener = @@ -546,6 +549,35 @@ public class TaskOrganizerTests extends WindowTestsBase { } @Test + public void testOverlappingBLASTCallback() throws RemoteException { + final ActivityStack stackController1 = createTaskStackOnDisplay(mDisplayContent); + final Task task = createTaskInStack(stackController1, 0 /* userId */); + final ITaskOrganizer organizer = registerMockOrganizer(); + + spyOn(task); + doReturn(true).when(task).isVisible(); + final WindowState w = createAppWindow(task, TYPE_APPLICATION, "Enlightened Window"); + makeWindowVisible(w); + + BLASTSyncEngine bse = new BLASTSyncEngine(); + + BLASTSyncEngine.TransactionReadyListener transactionListener = + mock(BLASTSyncEngine.TransactionReadyListener.class); + + int id = bse.startSyncSet(transactionListener); + assertEquals(true, bse.addToSyncSet(id, task)); + bse.setReady(id); + + int id2 = bse.startSyncSet(transactionListener); + // We should be rejected from the second sync since we are already + // in one. + assertEquals(false, bse.addToSyncSet(id2, task)); + w.finishDrawing(null); + assertEquals(true, bse.addToSyncSet(id2, task)); + bse.setReady(id2); + } + + @Test public void testBLASTCallbackWithWindow() { final ActivityStack stackController1 = createTaskStackOnDisplay(mDisplayContent); final Task task = createTaskInStack(stackController1, 0 /* userId */); |