Merge "PiP animation: Move window with resize when ending animation." into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4624d687f7
@@ -51,6 +51,7 @@ public class SurfaceControl {
|
|||||||
|
|
||||||
private static native void nativeSetLayer(long nativeObject, int zorder);
|
private static native void nativeSetLayer(long nativeObject, int zorder);
|
||||||
private static native void nativeSetPosition(long nativeObject, float x, float y);
|
private static native void nativeSetPosition(long nativeObject, float x, float y);
|
||||||
|
private static native void nativeSetPositionAppliesWithResize(long nativeObject);
|
||||||
private static native void nativeSetSize(long nativeObject, int w, int h);
|
private static native void nativeSetSize(long nativeObject, int w, int h);
|
||||||
private static native void nativeSetTransparentRegionHint(long nativeObject, Region region);
|
private static native void nativeSetTransparentRegionHint(long nativeObject, Region region);
|
||||||
private static native void nativeSetAlpha(long nativeObject, float alpha);
|
private static native void nativeSetAlpha(long nativeObject, float alpha);
|
||||||
@@ -407,6 +408,16 @@ public class SurfaceControl {
|
|||||||
nativeSetPosition(mNativeObject, x, y);
|
nativeSetPosition(mNativeObject, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the size changes in this transaction, position updates specified
|
||||||
|
* in this transaction will not complete until a buffer of the new size
|
||||||
|
* arrives.
|
||||||
|
*/
|
||||||
|
public void setPositionAppliesWithResize() {
|
||||||
|
checkNotReleased();
|
||||||
|
nativeSetPositionAppliesWithResize(mNativeObject);
|
||||||
|
}
|
||||||
|
|
||||||
public void setSize(int w, int h) {
|
public void setSize(int w, int h) {
|
||||||
checkNotReleased();
|
checkNotReleased();
|
||||||
nativeSetSize(mNativeObject, w, h);
|
nativeSetSize(mNativeObject, w, h);
|
||||||
|
|||||||
@@ -248,6 +248,15 @@ static void nativeSetPosition(JNIEnv* env, jclass clazz, jlong nativeObject, jfl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nativeSetPositionAppliesWithResize(JNIEnv* env, jclass clazz,
|
||||||
|
jlong nativeObject) {
|
||||||
|
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
|
||||||
|
status_t err = ctrl->setPositionAppliesWithResize();
|
||||||
|
if (err < 0 && err != NO_INIT) {
|
||||||
|
doThrowIAE(env);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void nativeSetSize(JNIEnv* env, jclass clazz, jlong nativeObject, jint w, jint h) {
|
static void nativeSetSize(JNIEnv* env, jclass clazz, jlong nativeObject, jint w, jint h) {
|
||||||
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
|
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
|
||||||
status_t err = ctrl->setSize(w, h);
|
status_t err = ctrl->setSize(w, h);
|
||||||
@@ -658,6 +667,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
|
|||||||
(void*)nativeSetLayer },
|
(void*)nativeSetLayer },
|
||||||
{"nativeSetPosition", "(JFF)V",
|
{"nativeSetPosition", "(JFF)V",
|
||||||
(void*)nativeSetPosition },
|
(void*)nativeSetPosition },
|
||||||
|
{"nativeSetPositionAppliesWithResize", "(J)V",
|
||||||
|
(void*)nativeSetPositionAppliesWithResize },
|
||||||
{"nativeSetSize", "(JII)V",
|
{"nativeSetSize", "(JII)V",
|
||||||
(void*)nativeSetSize },
|
(void*)nativeSetSize },
|
||||||
{"nativeSetTransparentRegionHint", "(JLandroid/graphics/Region;)V",
|
{"nativeSetTransparentRegionHint", "(JLandroid/graphics/Region;)V",
|
||||||
|
|||||||
@@ -1314,7 +1314,6 @@ class WindowStateAnimator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int resolveStackClip() {
|
private int resolveStackClip() {
|
||||||
|
|
||||||
// App animation overrides window animation stack clip mode.
|
// App animation overrides window animation stack clip mode.
|
||||||
if (mAppAnimator != null && mAppAnimator.animation != null) {
|
if (mAppAnimator != null && mAppAnimator.animation != null) {
|
||||||
return mAppAnimator.getStackClip();
|
return mAppAnimator.getStackClip();
|
||||||
@@ -1420,6 +1419,9 @@ class WindowStateAnimator {
|
|||||||
// aren't observing known issues here outside of PiP resizing. (Typically
|
// aren't observing known issues here outside of PiP resizing. (Typically
|
||||||
// the other windows that use -1 are PopupWindows which aren't likely
|
// the other windows that use -1 are PopupWindows which aren't likely
|
||||||
// to be rendering while we resize).
|
// to be rendering while we resize).
|
||||||
|
|
||||||
|
boolean wasForceScaled = mForceScaleUntilResize;
|
||||||
|
|
||||||
if (!w.inPinnedWorkspace() || (!w.mRelayoutCalled || w.mInRelayout)) {
|
if (!w.inPinnedWorkspace() || (!w.mRelayoutCalled || w.mInRelayout)) {
|
||||||
mSurfaceResized = mSurfaceController.setSizeInTransaction(
|
mSurfaceResized = mSurfaceController.setSizeInTransaction(
|
||||||
mTmpSize.width(), mTmpSize.height(), recoveringMemory);
|
mTmpSize.width(), mTmpSize.height(), recoveringMemory);
|
||||||
@@ -1428,13 +1430,17 @@ class WindowStateAnimator {
|
|||||||
}
|
}
|
||||||
mForceScaleUntilResize = mForceScaleUntilResize && !mSurfaceResized;
|
mForceScaleUntilResize = mForceScaleUntilResize && !mSurfaceResized;
|
||||||
|
|
||||||
|
|
||||||
calculateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect);
|
calculateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect);
|
||||||
|
|
||||||
|
float surfaceWidth = mSurfaceController.getWidth();
|
||||||
|
float surfaceHeight = mSurfaceController.getHeight();
|
||||||
|
|
||||||
if ((task != null && task.mStack.getForceScaleToCrop()) || mForceScaleUntilResize) {
|
if ((task != null && task.mStack.getForceScaleToCrop()) || mForceScaleUntilResize) {
|
||||||
int hInsets = w.getAttrs().surfaceInsets.left + w.getAttrs().surfaceInsets.right;
|
int hInsets = w.getAttrs().surfaceInsets.left + w.getAttrs().surfaceInsets.right;
|
||||||
int vInsets = w.getAttrs().surfaceInsets.top + w.getAttrs().surfaceInsets.bottom;
|
int vInsets = w.getAttrs().surfaceInsets.top + w.getAttrs().surfaceInsets.bottom;
|
||||||
float surfaceWidth = mSurfaceController.getWidth();
|
if (!mForceScaleUntilResize) {
|
||||||
float surfaceHeight = mSurfaceController.getHeight();
|
mSurfaceController.forceScaleableInTransaction(true);
|
||||||
|
}
|
||||||
// We want to calculate the scaling based on the content area, not based on
|
// We want to calculate the scaling based on the content area, not based on
|
||||||
// the entire surface, so that we scale in sync with windows that don't have insets.
|
// the entire surface, so that we scale in sync with windows that don't have insets.
|
||||||
mExtraHScale = (mTmpClipRect.width() - hInsets) / (float)(surfaceWidth - hInsets);
|
mExtraHScale = (mTmpClipRect.width() - hInsets) / (float)(surfaceWidth - hInsets);
|
||||||
@@ -1455,7 +1461,8 @@ class WindowStateAnimator {
|
|||||||
posX += w.getAttrs().surfaceInsets.left * (1 - mExtraHScale);
|
posX += w.getAttrs().surfaceInsets.left * (1 - mExtraHScale);
|
||||||
posY += w.getAttrs().surfaceInsets.top * (1 - mExtraVScale);
|
posY += w.getAttrs().surfaceInsets.top * (1 - mExtraVScale);
|
||||||
|
|
||||||
mSurfaceController.setPositionInTransaction(posX, posY, recoveringMemory);
|
mSurfaceController.setPositionInTransaction((float)Math.floor(posX),
|
||||||
|
(float)Math.floor(posY), recoveringMemory);
|
||||||
|
|
||||||
// Since we are scaled to fit in our previously desired crop, we can now
|
// Since we are scaled to fit in our previously desired crop, we can now
|
||||||
// expose the whole window in buffer space, and not risk extending
|
// expose the whole window in buffer space, and not risk extending
|
||||||
@@ -1467,7 +1474,7 @@ class WindowStateAnimator {
|
|||||||
// We need to ensure for each surface, that we disable transformation matrix
|
// We need to ensure for each surface, that we disable transformation matrix
|
||||||
// scaling in the same transaction which we resize the surface in.
|
// scaling in the same transaction which we resize the surface in.
|
||||||
// As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
|
// As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
|
||||||
// then take over the scaling until the new buffer arrives, and things
|
// then take over the scaling until the new buffer arrives, and things
|
||||||
// will be seamless.
|
// will be seamless.
|
||||||
mForceScaleUntilResize = true;
|
mForceScaleUntilResize = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -1475,6 +1482,22 @@ class WindowStateAnimator {
|
|||||||
recoveringMemory);
|
recoveringMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we are ending the scaling mode. We switch to SCALING_MODE_FREEZE
|
||||||
|
// to prevent further updates until buffer latch. Normally position
|
||||||
|
// would continue to apply immediately. But we need a different position
|
||||||
|
// before and after resize (since we have scaled the shadows, as discussed
|
||||||
|
// above).
|
||||||
|
if (wasForceScaled && !mForceScaleUntilResize) {
|
||||||
|
mSurfaceController.setPositionAppliesWithResizeInTransaction(true);
|
||||||
|
mSurfaceController.forceScaleableInTransaction(false);
|
||||||
|
}
|
||||||
|
if (w.inPinnedWorkspace()) {
|
||||||
|
mTmpClipRect.set(0, 0, -1, -1);
|
||||||
|
task.mStack.getDimBounds(mTmpFinalClipRect);
|
||||||
|
mTmpFinalClipRect.inset(-w.mAttrs.surfaceInsets.left, -w.mAttrs.surfaceInsets.top,
|
||||||
|
-w.mAttrs.surfaceInsets.right, -w.mAttrs.surfaceInsets.bottom);
|
||||||
|
}
|
||||||
|
|
||||||
updateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect, recoveringMemory);
|
updateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect, recoveringMemory);
|
||||||
|
|
||||||
mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * mExtraHScale,
|
mSurfaceController.setMatrixInTransaction(mDsDx * w.mHScale * mExtraHScale,
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ class WindowSurfaceController {
|
|||||||
if (SHOW_TRANSACTIONS) logSurface(
|
if (SHOW_TRANSACTIONS) logSurface(
|
||||||
"CROP " + clipRect.toShortString(), null);
|
"CROP " + clipRect.toShortString(), null);
|
||||||
try {
|
try {
|
||||||
if (clipRect.width() > 0 && clipRect.height() > 0) {
|
if (clipRect.width() != 0 && clipRect.height() != 0) {
|
||||||
mSurfaceControl.setWindowCrop(clipRect);
|
mSurfaceControl.setWindowCrop(clipRect);
|
||||||
mHiddenForCrop = false;
|
mHiddenForCrop = false;
|
||||||
updateVisibility();
|
updateVisibility();
|
||||||
@@ -236,6 +236,10 @@ class WindowSurfaceController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setPositionAppliesWithResizeInTransaction(boolean recoveringMemory) {
|
||||||
|
mSurfaceControl.setPositionAppliesWithResize();
|
||||||
|
}
|
||||||
|
|
||||||
void setMatrixInTransaction(float dsdx, float dtdx, float dsdy, float dtdy,
|
void setMatrixInTransaction(float dsdx, float dtdx, float dsdy, float dtdy,
|
||||||
boolean recoveringMemory) {
|
boolean recoveringMemory) {
|
||||||
try {
|
try {
|
||||||
@@ -553,6 +557,13 @@ class WindowSurfaceController {
|
|||||||
super.setPosition(x, y);
|
super.setPosition(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPositionAppliesWithResize() {
|
||||||
|
if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "setPositionAppliesWithResize(): OLD: "
|
||||||
|
+ this + ". Called by" + Debug.getCallers(9));
|
||||||
|
super.setPositionAppliesWithResize();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setSize(int w, int h) {
|
public void setSize(int w, int h) {
|
||||||
if (w != mSize.x || h != mSize.y) {
|
if (w != mSize.x || h != mSize.y) {
|
||||||
|
|||||||
Reference in New Issue
Block a user