summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-02-10 14:50:32 -0800
committerDianne Hackborn <hackbod@google.com>2012-02-13 10:37:08 -0800
commit4dcece8e509027cd28e20b1f9f14d2c0446d84c0 (patch)
tree37d96e76f1b08dfdf308765e0bdcc7981ec92717
parent5dd4754f58e5e99f893749ab3bb3eda1de4cfbe7 (diff)
downloadframeworks_base-4dcece8e509027cd28e20b1f9f14d2c0446d84c0.zip
frameworks_base-4dcece8e509027cd28e20b1f9f14d2c0446d84c0.tar.gz
frameworks_base-4dcece8e509027cd28e20b1f9f14d2c0446d84c0.tar.bz2
Fix issue where screen rotations would stop animating.
If we went through the update loop multiple times, and had finished animating the first time, we would blow away that information the second time and never kill the animation. Also moved killing the animation back up to the animation step -- this involves destroying surfaces and such, and so really should be done as part of the surface transaction. We can also consider the screen rotation animation object to be owned by the animation, so it can destroy it when done. Change-Id: If24356c509c66d046f2ddfd9ad5bfe12504d7716
-rw-r--r--services/java/com/android/server/wm/ScreenRotationAnimation.java42
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java23
2 files changed, 54 insertions, 11 deletions
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java
index 55fb038..04a039f 100644
--- a/services/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -16,6 +16,8 @@
package com.android.server.wm;
+import java.io.PrintWriter;
+
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
@@ -96,6 +98,46 @@ class ScreenRotationAnimation {
final Matrix mTmpMatrix = new Matrix();
final float[] mTmpFloats = new float[9];
+ public void printTo(String prefix, PrintWriter pw) {
+ pw.print(prefix); pw.print("mSurface="); pw.print(mSurface);
+ pw.print(" mWidth="); pw.print(mWidth);
+ pw.print(" mHeight="); pw.println(mHeight);
+ pw.print(prefix); pw.print("mBlackFrame="); pw.println(mBlackFrame);
+ pw.print(prefix); pw.print("mSnapshotRotation="); pw.print(mSnapshotRotation);
+ pw.print(" mSnapshotDeltaRotation="); pw.print(mSnapshotDeltaRotation);
+ pw.print(" mCurRotation="); pw.println(mCurRotation);
+ pw.print(prefix); pw.print("mOriginalRotation="); pw.print(mOriginalRotation);
+ pw.print(" mOriginalWidth="); pw.print(mOriginalWidth);
+ pw.print(" mOriginalHeight="); pw.println(mOriginalHeight);
+ pw.print(prefix); pw.print("mStarted="); pw.print(mStarted);
+ pw.print(" mAnimRunning="); pw.print(mAnimRunning);
+ pw.print(" mFinishAnimReady="); pw.print(mFinishAnimReady);
+ pw.print(" mFinishAnimStartTime="); pw.println(mFinishAnimStartTime);
+ pw.print(prefix); pw.print("mStartExitAnimation="); pw.print(mStartExitAnimation);
+ pw.print(" "); mStartExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mStartEnterAnimation="); pw.print(mStartEnterAnimation);
+ pw.print(" "); mStartEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mFinishExitAnimation="); pw.print(mFinishExitAnimation);
+ pw.print(" "); mFinishExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mFinishEnterAnimation="); pw.print(mFinishEnterAnimation);
+ pw.print(" "); mFinishEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mRotateExitAnimation="); pw.print(mRotateExitAnimation);
+ pw.print(" "); mRotateExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mRotateEnterAnimation="); pw.print(mRotateEnterAnimation);
+ pw.print(" "); mRotateEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mLastRotateExitAnimation=");
+ pw.print(mLastRotateExitAnimation);
+ pw.print(" "); mLastRotateExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mExitTransformation=");
+ mExitTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mEnterTransformation=");
+ mEnterTransformation.printShortString(pw); pw.println();
+ pw.print(prefix); pw.print("mSnapshotInitialMatrix=");
+ mSnapshotInitialMatrix.printShortString(pw);
+ pw.print(" mSnapshotFinalMatrix="); mSnapshotFinalMatrix.printShortString(pw);
+ pw.println();
+ }
+
public ScreenRotationAnimation(Context context, SurfaceSession session,
boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) {
mContext = context;
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 3b5ec03..bdbaab4 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -7636,6 +7636,8 @@ public class WindowManagerService extends IWindowManager.Stub
mInnerFields.mAnimating = true;
} else {
updateRotation = true;
+ mScreenRotationAnimation.kill();
+ mScreenRotationAnimation = null;
}
}
}
@@ -8708,7 +8710,7 @@ public class WindowManagerService extends IWindowManager.Stub
mInnerFields.mAnimating = false;
// SECOND LOOP: Execute animations and update visibility of windows.
- updateRotation =
+ updateRotation |=
updateAppsAndRotationAnimationsLocked(currentTime, innerDw, innerDh);
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq="
@@ -9012,11 +9014,6 @@ public class WindowManagerService extends IWindowManager.Stub
mTurnOnScreen = false;
}
- if (updateRotation && mScreenRotationAnimation != null) {
- mScreenRotationAnimation.kill();
- mScreenRotationAnimation = null;
- }
-
if (updateRotation) {
if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
if (updateRotationUncheckedLocked(false)) {
@@ -9387,7 +9384,7 @@ public class WindowManagerService extends IWindowManager.Stub
}
if (CUSTOM_SCREEN_ROTATION) {
- if (mScreenRotationAnimation != null && mScreenRotationAnimation.isAnimating()) {
+ if (mScreenRotationAnimation != null) {
mScreenRotationAnimation.kill();
mScreenRotationAnimation = null;
}
@@ -9918,11 +9915,15 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mLastWindowForcedOrientation"); pw.print(mLastWindowForcedOrientation);
pw.print(" mForcedAppOrientation="); pw.println(mForcedAppOrientation);
pw.print(" mDeferredRotationPauseCount="); pw.println(mDeferredRotationPauseCount);
- pw.print(" mTraversalScheduled="); pw.print(mTraversalScheduled);
- pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
- pw.print(" mTransitionWindowAnimationScale="); pw.println(mTransitionAnimationScale);
+ if (mScreenRotationAnimation != null) {
+ pw.println(" mScreenRotationAnimation:");
+ mScreenRotationAnimation.printTo(" ", pw);
+ }
+ pw.print(" mWindowAnimationScale="); pw.print(mWindowAnimationScale);
+ pw.print(" mTransitionWindowAnimationScale="); pw.print(mTransitionAnimationScale);
pw.print(" mAnimatorDurationScale="); pw.println(mAnimatorDurationScale);
- pw.print(" mNextAppTransition=0x");
+ pw.print(" mTraversalScheduled="); pw.print(mTraversalScheduled);
+ pw.print(" mNextAppTransition=0x");
pw.print(Integer.toHexString(mNextAppTransition));
pw.print(" mAppTransitionReady="); pw.println(mAppTransitionReady);
pw.print(" mAppTransitionRunning="); pw.print(mAppTransitionRunning);