Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 225ea651 authored by Robert Carr's avatar Robert Carr
Browse files

WindowManager: Handle main window size change transaction with BLAST.

Rather than push and defer the pending transaction we can use the
new applyWithNextDraw primitive to make sure the transaction applies
with the app redraw. We need to be a little careful. Since
mainWindowSizeTransaction is consumed during layout, we need
to move the check for pending draw handlers to the end of relayout.

Test: Existing tests pass
Bug: 168505645
Change-Id: Iae7906ee6def94ee3adc71b5f5ba022157379c73
parent 0f979050
Loading
Loading
Loading
Loading
+9 −13
Original line number Diff line number Diff line
@@ -538,22 +538,18 @@ class WindowStateAnimator {
                // The sync transaction will contain the buffer so the bounds change transaction
                // will only be applied with the buffer.
                t.merge(task.getMainWindowSizeChangeTransaction());
                task.setMainWindowSizeChangeTransaction(null);
            } else {
                // Use pending transaction here instead of the transaction passed in because we
                // want to ensure the defer transaction is applied on the main transaction and
                // not on the sync  transaction. This is because the sync transaction could
                // contain the buffer and we'd defer the transaction that contains the buffer
                // we're deferring on.
                SurfaceControl.Transaction pendingTransaction = mWin.getPendingTransaction();
                pendingTransaction.deferTransactionUntil(
                        task.getMainWindowSizeChangeTask().getSurfaceControl(),
                        mWin.getClientViewRootSurface(), mWin.getFrameNumber());
                pendingTransaction.deferTransactionUntil(mSurfaceController.mSurfaceControl,
                        mWin.getClientViewRootSurface(), mWin.getFrameNumber());
                pendingTransaction.merge(task.getMainWindowSizeChangeTransaction());
            }
                mWin.applyWithNextDraw(finishedFrame -> {
                      final SurfaceControl.Transaction sizeChangedTransaction =
                          task.getMainWindowSizeChangeTransaction();
                      if (sizeChangedTransaction != null) {
                          finishedFrame.merge(sizeChangedTransaction);
                          task.setMainWindowSizeChangeTransaction(null);
                      }
                });
            }
        }
    }

    void prepareSurfaceLocked(SurfaceControl.Transaction t) {