Revert "Make window stable while resizing"
This reverts commit 5a9a38128f727ac425f1147c0a663328896e5238.
Reason for revert: fixes b/182729646
Change-Id: Idfa7fb9187a4707f4627a41b92f45313fbdc3ca8
(cherry picked from commit 253de9a9ce59ff72f7c15c810eaa979b8fec16d8)
diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
index 35e5491..45c4233 100644
--- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java
@@ -30,6 +30,7 @@
import static com.android.server.wm.InsetsSourceProviderProto.CONTROL_TARGET;
import static com.android.server.wm.InsetsSourceProviderProto.FAKE_CONTROL;
import static com.android.server.wm.InsetsSourceProviderProto.FAKE_CONTROL_TARGET;
+import static com.android.server.wm.InsetsSourceProviderProto.FINISH_SEAMLESS_ROTATE_FRAME_NUMBER;
import static com.android.server.wm.InsetsSourceProviderProto.FRAME;
import static com.android.server.wm.InsetsSourceProviderProto.IME_OVERRIDDEN_FRAME;
import static com.android.server.wm.InsetsSourceProviderProto.IS_LEASH_READY_FOR_DISPATCHING;
@@ -58,7 +59,6 @@
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
import java.io.PrintWriter;
-import java.util.function.Consumer;
/**
* Controller for a specific inset source on the server. It's called provider as it provides the
@@ -84,16 +84,6 @@
private final Rect mImeOverrideFrame = new Rect();
private boolean mIsLeashReadyForDispatching;
- private final Consumer<Transaction> mSetLeashPositionConsumer = t -> {
- if (mControl != null) {
- final SurfaceControl leash = mControl.getLeash();
- if (leash != null) {
- final Point position = mControl.getSurfacePosition();
- t.setPosition(leash, position.x, position.y);
- }
- }
- };
-
/** The visibility override from the current controlling window. */
private boolean mClientVisible;
@@ -159,6 +149,7 @@
// TODO: Ideally, we should wait for the animation to finish so previous window can
// animate-out as new one animates-in.
mWin.cancelAnimation();
+ mWin.mPendingPositionChanged = null;
mWin.mProvidedInsetsSources.remove(mSource.getType());
}
ProtoLog.d(WM_DEBUG_IME, "InsetsSource setWin %s", win);
@@ -257,16 +248,31 @@
if (mControl != null) {
final Point position = getWindowFrameSurfacePosition();
if (mControl.setSurfacePosition(position.x, position.y) && mControlTarget != null) {
- if (mWin.getWindowFrames().didFrameSizeChange()) {
- mWin.applyWithNextDraw(mSetLeashPositionConsumer);
+ if (!mWin.getWindowFrames().didFrameSizeChange()) {
+ updateLeashPosition(-1 /* frameNumber */);
+ } else if (mWin.mInRelayout) {
+ updateLeashPosition(mWin.getFrameNumber());
} else {
- mSetLeashPositionConsumer.accept(mWin.getPendingTransaction());
+ mWin.mPendingPositionChanged = this;
}
mStateController.notifyControlChanged(mControlTarget);
}
}
}
+ void updateLeashPosition(long frameNumber) {
+ if (mControl == null) {
+ return;
+ }
+ final SurfaceControl leash = mControl.getLeash();
+ if (leash != null) {
+ final Transaction t = mDisplayContent.getPendingTransaction();
+ final Point position = mControl.getSurfacePosition();
+ t.setPosition(leash, position.x, position.y);
+ deferTransactionUntil(t, leash, frameNumber);
+ }
+ }
+
private Point getWindowFrameSurfacePosition() {
final Rect frame = mWin.getFrame();
final Point position = new Point();
@@ -274,6 +280,14 @@
return position;
}
+ private void deferTransactionUntil(Transaction t, SurfaceControl leash, long frameNumber) {
+ if (frameNumber >= 0) {
+ final SurfaceControl barrier = mWin.getClientViewRootSurface();
+ t.deferTransactionUntil(mWin.getSurfaceControl(), barrier, frameNumber);
+ t.deferTransactionUntil(leash, barrier, frameNumber);
+ }
+ }
+
/**
* @see InsetsStateController#onControlFakeTargetChanged(int, InsetsControlTarget)
*/
diff --git a/services/core/java/com/android/server/wm/WindowFrames.java b/services/core/java/com/android/server/wm/WindowFrames.java
index ffd6d21..9245f8c 100644
--- a/services/core/java/com/android/server/wm/WindowFrames.java
+++ b/services/core/java/com/android/server/wm/WindowFrames.java
@@ -113,7 +113,7 @@
}
/**
- * @return true if the width or height has changed since last updating resizing window.
+ * @return true if the width or height has changed since last reported to the client.
*/
boolean didFrameSizeChange() {
return (mLastFrame.width() != mFrame.width()) || (mLastFrame.height() != mFrame.height());
@@ -135,13 +135,6 @@
}
/**
- * @return true if the width or height has changed since last reported to the client.
- */
- boolean isFrameSizeChangeReported() {
- return mFrameSizeChanged || didFrameSizeChange();
- }
-
- /**
* Resets the size changed flags so they're all set to false again. This should be called
* after the frames are reported to client.
*/
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index b95674e..e70ad6f 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2234,6 +2234,11 @@
final DisplayContent dc = win.getDisplayContent();
+ if (win.mPendingPositionChanged != null) {
+ win.mPendingPositionChanged.updateLeashPosition(frameNumber);
+ win.mPendingPositionChanged = null;
+ }
+
if (mUseBLASTSync && win.useBLASTSync() && viewVisibility != View.GONE) {
win.prepareDrawHandlers();
result |= RELAYOUT_RES_BLAST_SYNC;
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 7ebc1cc..2eadcd5 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -726,6 +726,8 @@
*/
private InsetsState mFrozenInsetsState;
+ @Nullable InsetsSourceProvider mPendingPositionChanged;
+
private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f;
private KeyInterceptionInfo mKeyInterceptionInfo;
@@ -772,12 +774,6 @@
updateSurfacePosition(t);
};
- private final Consumer<SurfaceControl.Transaction> mSetSurfacePositionConsumer = t -> {
- if (mSurfaceControl != null && mSurfaceControl.isValid()) {
- t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
- }
- };
-
/**
* @see #setSurfaceTranslationY(int)
*/
@@ -2133,8 +2129,6 @@
: getTask().getWindowConfiguration().hasMovementAnimations();
if (mToken.okToAnimate()
&& (mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
- && !mWindowFrames.didFrameSizeChange()
- && !surfaceInsetsChanging()
&& !isDragResizing()
&& hasMovementAnimation
&& !mWinAnimator.mLastHidden
@@ -5324,17 +5318,13 @@
// prior to the rotation.
if (!mSurfaceAnimator.hasLeash() && mPendingSeamlessRotate == null
&& !mLastSurfacePosition.equals(mSurfacePosition)) {
- final boolean frameSizeChanged = mWindowFrames.isFrameSizeChangeReported();
- final boolean surfaceInsetsChanged = surfaceInsetsChanging();
- final boolean surfaceSizeChanged = frameSizeChanged || surfaceInsetsChanged;
+ t.setPosition(mSurfaceControl, mSurfacePosition.x, mSurfacePosition.y);
mLastSurfacePosition.set(mSurfacePosition.x, mSurfacePosition.y);
- if (surfaceInsetsChanged) {
+ if (surfaceInsetsChanging() && mWinAnimator.hasSurface()) {
mLastSurfaceInsets.set(mAttrs.surfaceInsets);
- }
- if (surfaceSizeChanged) {
- applyWithNextDraw(mSetSurfacePositionConsumer);
- } else {
- mSetSurfacePositionConsumer.accept(t);
+ t.deferTransactionUntil(mSurfaceControl,
+ mWinAnimator.mSurfaceController.mSurfaceControl,
+ getFrameNumber());
}
}
}