Merge "Revert "Make window stable while resizing"" into sc-dev
This commit is contained in:
@@ -30,6 +30,7 @@ import static com.android.server.wm.InsetsSourceProviderProto.CONTROLLABLE;
|
||||
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.AnimationType;
|
||||
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 @@ class InsetsSourceProvider {
|
||||
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 @@ class InsetsSourceProvider {
|
||||
// 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 @@ class InsetsSourceProvider {
|
||||
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 @@ class InsetsSourceProvider {
|
||||
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)
|
||||
*/
|
||||
|
||||
@@ -113,7 +113,7 @@ public class WindowFrames {
|
||||
}
|
||||
|
||||
/**
|
||||
* @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());
|
||||
@@ -134,13 +134,6 @@ public class WindowFrames {
|
||||
return mLastForceReportingResized || mFrameSizeChanged;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
|
||||
@@ -2232,6 +2232,11 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
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;
|
||||
|
||||
@@ -726,6 +726,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
*/
|
||||
private InsetsState mFrozenInsetsState;
|
||||
|
||||
@Nullable InsetsSourceProvider mPendingPositionChanged;
|
||||
|
||||
private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f;
|
||||
private KeyInterceptionInfo mKeyInterceptionInfo;
|
||||
|
||||
@@ -772,12 +774,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
: 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 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
// 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user