summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TaskOrganizerTests.java32
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 */);