Loading services/core/java/com/android/server/wm/WindowContainer.java +11 −4 Original line number Diff line number Diff line Loading @@ -2617,10 +2617,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< return willSync; } boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, boolean setPendingListener(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { 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) { Loading @@ -2631,6 +2629,15 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // Make sure to set these before we call setReady in case the sync was a no-op mWaitingSyncId = waitingId; mWaitingListener = waitingListener; return true; } boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { boolean willSync = setPendingListener(waitingListener, waitingId); if (!willSync) { return false; } int localId = mBLASTSyncEngine.startSyncSet(this); willSync |= addChildrenToSyncSet(localId); Loading services/core/java/com/android/server/wm/WindowState.java +8 −4 Original line number Diff line number Diff line Loading @@ -5707,16 +5707,20 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { if (!isVisible()) { boolean willSync = setPendingListener(waitingListener, waitingId); if (!willSync) { return false; } mWaitingListener = waitingListener; mWaitingSyncId = waitingId; mUsingBLASTSyncTransaction = true; mLocalSyncId = mBLASTSyncEngine.startSyncSet(this); addChildrenToSyncSet(mLocalSyncId); // In the WindowContainer implementation we immediately mark ready // since a generic WindowContainer only needs to wait for its // children to finish and is immediately ready from its own // perspective but at the WindowState level we need to wait for ourselves // to draw even if the children draw first our don't need to sync, so we omit // the set ready call until later in finishDrawing() mWmService.mH.removeMessages(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this); mWmService.mH.sendNewMessageDelayed(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this, BLAST_TIMEOUT_DURATION); Loading services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +22 −0 Original line number Diff line number Diff line Loading @@ -757,6 +757,28 @@ public class WindowOrganizerTests extends WindowTestsBase { .onTransactionReady(anyInt(), any()); } @Test public void testBLASTCallbackNoDoubleAdd() { final ActivityStack stackController1 = createStack(); final Task task = createTask(stackController1); final ITaskOrganizer organizer = registerMockOrganizer(); 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); assertTrue(bse.addToSyncSet(id, w)); assertFalse(bse.addToSyncSet(id, w)); // Clean-up bse.setReady(id); } @Test public void testBLASTCallbackWithInvisibleWindow() { final ActivityStack stackController1 = createStack(); Loading Loading
services/core/java/com/android/server/wm/WindowContainer.java +11 −4 Original line number Diff line number Diff line Loading @@ -2617,10 +2617,8 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< return willSync; } boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, boolean setPendingListener(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { 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) { Loading @@ -2631,6 +2629,15 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< // Make sure to set these before we call setReady in case the sync was a no-op mWaitingSyncId = waitingId; mWaitingListener = waitingListener; return true; } boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { boolean willSync = setPendingListener(waitingListener, waitingId); if (!willSync) { return false; } int localId = mBLASTSyncEngine.startSyncSet(this); willSync |= addChildrenToSyncSet(localId); Loading
services/core/java/com/android/server/wm/WindowState.java +8 −4 Original line number Diff line number Diff line Loading @@ -5707,16 +5707,20 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override boolean prepareForSync(BLASTSyncEngine.TransactionReadyListener waitingListener, int waitingId) { if (!isVisible()) { boolean willSync = setPendingListener(waitingListener, waitingId); if (!willSync) { return false; } mWaitingListener = waitingListener; mWaitingSyncId = waitingId; mUsingBLASTSyncTransaction = true; mLocalSyncId = mBLASTSyncEngine.startSyncSet(this); addChildrenToSyncSet(mLocalSyncId); // In the WindowContainer implementation we immediately mark ready // since a generic WindowContainer only needs to wait for its // children to finish and is immediately ready from its own // perspective but at the WindowState level we need to wait for ourselves // to draw even if the children draw first our don't need to sync, so we omit // the set ready call until later in finishDrawing() mWmService.mH.removeMessages(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this); mWmService.mH.sendNewMessageDelayed(WINDOW_STATE_BLAST_SYNC_TIMEOUT, this, BLAST_TIMEOUT_DURATION); Loading
services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +22 −0 Original line number Diff line number Diff line Loading @@ -757,6 +757,28 @@ public class WindowOrganizerTests extends WindowTestsBase { .onTransactionReady(anyInt(), any()); } @Test public void testBLASTCallbackNoDoubleAdd() { final ActivityStack stackController1 = createStack(); final Task task = createTask(stackController1); final ITaskOrganizer organizer = registerMockOrganizer(); 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); assertTrue(bse.addToSyncSet(id, w)); assertFalse(bse.addToSyncSet(id, w)); // Clean-up bse.setReady(id); } @Test public void testBLASTCallbackWithInvisibleWindow() { final ActivityStack stackController1 = createStack(); Loading