Merge "Fixes for ending PiP animation." into nyc-dev

This commit is contained in:
TreeHugger Robot
2016-05-18 21:57:21 +00:00
committed by Android (Google) Code Review
5 changed files with 36 additions and 22 deletions

View File

@@ -702,6 +702,14 @@ public class ActivityManager {
public static boolean windowsAreScaleable(int stackId) { public static boolean windowsAreScaleable(int stackId) {
return stackId == PINNED_STACK_ID; return stackId == PINNED_STACK_ID;
} }
/**
* Returns true if windows in this stack should be given move animations
* by default.
*/
public static boolean hasMovementAnimations(int stackId) {
return stackId != PINNED_STACK_ID;
}
} }
/** /**

View File

@@ -156,12 +156,10 @@ public class BoundsAnimationController {
+ mTmpRect + " from=" + mFrom + " mTo=" + mTo + " value=" + value + mTmpRect + " from=" + mFrom + " mTo=" + mTo + " value=" + value
+ " remains=" + remains); + " remains=" + remains);
if (remains != 0) {
mTmpTaskBounds.set(mTmpRect.left, mTmpRect.top, mTmpTaskBounds.set(mTmpRect.left, mTmpRect.top,
mTmpRect.left + mFrozenTaskWidth, mTmpRect.top + mFrozenTaskHeight); mTmpRect.left + mFrozenTaskWidth, mTmpRect.top + mFrozenTaskHeight);
}
if (!mTarget.setPinnedStackSize(mTmpRect, remains != 0 ? mTmpTaskBounds : null)) { if (!mTarget.setPinnedStackSize(mTmpRect, mTmpTaskBounds)) {
// Whoops, the target doesn't feel like animating anymore. Let's immediately finish // Whoops, the target doesn't feel like animating anymore. Let's immediately finish
// any further animation. // any further animation.
animation.cancel(); animation.cancel();
@@ -205,11 +203,12 @@ public class BoundsAnimationController {
return; return;
} }
finishAnimation();
mTarget.setPinnedStackSize(mTo, null);
if (mMoveToFullScreen && !mWillReplace) { if (mMoveToFullScreen && !mWillReplace) {
mTarget.moveToFullscreen(); mTarget.moveToFullscreen();
} }
finishAnimation();
} }
@Override @Override

View File

@@ -130,12 +130,6 @@ public class TaskStack implements DimLayer.DimLayerUser,
// certain logic we would otherwise apply while resizing, // certain logic we would otherwise apply while resizing,
// while resizing in the bounds animating mode. // while resizing in the bounds animating mode.
private boolean mBoundsAnimating = false; private boolean mBoundsAnimating = false;
// By default, movement animations are applied to all
// window movement. If this is true, animations will not
// be applied within this stack. This is useful for example
// if the windows are moving as the result of a stack animation,
// in which case a second window animation would cause jitter.
private boolean mFreezeMovementAnimations = false;
// Temporary storage for the new bounds that should be used after the configuration change. // Temporary storage for the new bounds that should be used after the configuration change.
// Will be cleared once the client retrieves the new bounds via getBoundsForNewConfiguration(). // Will be cleared once the client retrieves the new bounds via getBoundsForNewConfiguration().
@@ -1361,7 +1355,6 @@ public class TaskStack implements DimLayer.DimLayerUser,
@Override // AnimatesBounds @Override // AnimatesBounds
public void onAnimationStart() { public void onAnimationStart() {
synchronized (mService.mWindowMap) { synchronized (mService.mWindowMap) {
mFreezeMovementAnimations = true;
mBoundsAnimating = true; mBoundsAnimating = true;
} }
} }
@@ -1369,7 +1362,6 @@ public class TaskStack implements DimLayer.DimLayerUser,
@Override // AnimatesBounds @Override // AnimatesBounds
public void onAnimationEnd() { public void onAnimationEnd() {
synchronized (mService.mWindowMap) { synchronized (mService.mWindowMap) {
mFreezeMovementAnimations = false;
mBoundsAnimating = false; mBoundsAnimating = false;
mService.requestTraversal(); mService.requestTraversal();
} }
@@ -1396,8 +1388,8 @@ public class TaskStack implements DimLayer.DimLayerUser,
getDisplayContent().getContentRect(bounds); getDisplayContent().getContentRect(bounds);
} }
public boolean getFreezeMovementAnimations() { public boolean hasMovementAnimations() {
return mFreezeMovementAnimations; return StackId.hasMovementAnimations(mStackId);
} }
public boolean getForceScaleToCrop() { public boolean getForceScaleToCrop() {

View File

@@ -229,6 +229,8 @@ class WindowStateAnimator {
long mDeferTransactionUntilFrame = -1; long mDeferTransactionUntilFrame = -1;
long mDeferTransactionTime = -1; long mDeferTransactionTime = -1;
boolean mForceScaleUntilResize;
private final Rect mTmpSize = new Rect(); private final Rect mTmpSize = new Rect();
WindowStateAnimator(final WindowState win) { WindowStateAnimator(final WindowState win) {
@@ -1416,8 +1418,13 @@ class WindowStateAnimator {
float extraHScale = (float) 1.0; float extraHScale = (float) 1.0;
float extraVScale = (float) 1.0; float extraVScale = (float) 1.0;
mSurfaceResized = mSurfaceController.setSizeInTransaction(
mTmpSize.width(), mTmpSize.height(), recoveringMemory);
mForceScaleUntilResize = mForceScaleUntilResize && !mSurfaceResized;
calculateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect); calculateSurfaceWindowCrop(mTmpClipRect, mTmpFinalClipRect);
if (task != null && task.mStack.getForceScaleToCrop()) { 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;
// 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
@@ -1447,6 +1454,14 @@ class WindowStateAnimator {
// past where the system would have cropped us // past where the system would have cropped us
mTmpClipRect.set(0, 0, mTmpSize.width(), mTmpSize.height()); mTmpClipRect.set(0, 0, mTmpSize.width(), mTmpSize.height());
mTmpFinalClipRect.setEmpty(); mTmpFinalClipRect.setEmpty();
// Various surfaces in the scaled stack may resize at different times.
// We need to ensure for each surface, that we disable transformation matrix
// scaling in the same transaction which we resize the surface in.
// As we are in SCALING_MODE_SCALE_TO_WINDOW, SurfaceFlinger will
// then take over the scaling until the new buffer arrives, and things
// will be seamless.
mForceScaleUntilResize = true;
} else { } else {
mSurfaceController.setPositionInTransaction(mTmpSize.left, mTmpSize.top, mSurfaceController.setPositionInTransaction(mTmpSize.left, mTmpSize.top,
recoveringMemory); recoveringMemory);
@@ -1458,8 +1473,6 @@ class WindowStateAnimator {
mDtDx * w.mVScale * extraVScale, mDtDx * w.mVScale * extraVScale,
mDsDy * w.mHScale * extraHScale, mDsDy * w.mHScale * extraHScale,
mDtDy * w.mVScale * extraVScale, recoveringMemory); mDtDy * w.mVScale * extraVScale, recoveringMemory);
mSurfaceResized = mSurfaceController.setSizeInTransaction(
mTmpSize.width(), mTmpSize.height(), recoveringMemory);
if (mSurfaceResized) { if (mSurfaceResized) {
mReportSurfaceResized = true; mReportSurfaceResized = true;

View File

@@ -719,7 +719,7 @@ class WindowSurfacePlacer {
|| task.mStack.isAdjustedForIme()); || task.mStack.isAdjustedForIme());
if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0 if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
&& !w.isDragResizing() && !adjustedForMinimizedDockOrIme && !w.isDragResizing() && !adjustedForMinimizedDockOrIme
&& (task == null || !w.getTask().mStack.getFreezeMovementAnimations()) && (task == null || w.getTask().mStack.hasMovementAnimations())
&& !w.mWinAnimator.mLastHidden) { && !w.mWinAnimator.mLastHidden) {
winAnimator.setMoveAnimation(left, top); winAnimator.setMoveAnimation(left, top);
} }
@@ -731,7 +731,9 @@ class WindowSurfacePlacer {
} }
try { try {
if (task == null || task.mStack.getBoundsAnimating()) {
w.mClient.moved(left, top); w.mClient.moved(left, top);
}
} catch (RemoteException e) { } catch (RemoteException e) {
} }
w.mMovedByResize = false; w.mMovedByResize = false;