summaryrefslogtreecommitdiff
path: root/services/java/com/android/server/wm/ScreenRotationAnimation.java
diff options
context:
space:
mode:
authorCraig Mautner <cmautner@google.com>2012-03-01 18:59:14 -0800
committerCraig Mautner <cmautner@google.com>2012-03-01 19:06:07 -0800
commitdbb7991b4e4638b284814b50e79cacc1e1c9d8cd (patch)
tree6cbd560dadbcf6673a9f023ef170ae95a4af89dd /services/java/com/android/server/wm/ScreenRotationAnimation.java
parent5bb59daf42fb24c1131effd4265c2386304feceb (diff)
Separate animation steps into start, step and finish phases.
Fixes bug 6089126. Change-Id: Iafbde36ff719640335a7ecf762e1d991cf7915e4
Diffstat (limited to 'services/java/com/android/server/wm/ScreenRotationAnimation.java')
-rw-r--r--services/java/com/android/server/wm/ScreenRotationAnimation.java125
1 files changed, 70 insertions, 55 deletions
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java
index 04a039fbcd56..1335a44c8827 100644
--- a/services/java/com/android/server/wm/ScreenRotationAnimation.java
+++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java
@@ -29,7 +29,7 @@ import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;
-class ScreenRotationAnimation {
+class ScreenRotationAnimation implements WindowManagerService.StepAnimator {
static final String TAG = "ScreenRotationAnimation";
static final boolean DEBUG_STATE = false;
static final boolean DEBUG_TRANSFORMS = false;
@@ -97,6 +97,12 @@ class ScreenRotationAnimation {
final Matrix mSnapshotFinalMatrix = new Matrix();
final Matrix mTmpMatrix = new Matrix();
final float[] mTmpFloats = new float[9];
+ private boolean mMoreRotateEnter;
+ private boolean mMoreRotateExit;
+ private boolean mMoreFinishEnter;
+ private boolean mMoreFinishExit;
+ private boolean mMoreStartEnter;
+ private boolean mMoreStartExit;
public void printTo(String prefix, PrintWriter pw) {
pw.print(prefix); pw.print("mSurface="); pw.print(mSurface);
@@ -456,34 +462,8 @@ class ScreenRotationAnimation {
&& mRotateEnterAnimation != null || mRotateExitAnimation != null;
}
+ @Override
public boolean stepAnimation(long now) {
- if (!isAnimating()) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running");
- return false;
- }
-
- if (!mAnimRunning) {
- if (DEBUG_STATE) Slog.v(TAG, "Step: starting start, finish, rotate");
- if (mStartEnterAnimation != null) {
- mStartEnterAnimation.setStartTime(now);
- }
- if (mStartExitAnimation != null) {
- mStartExitAnimation.setStartTime(now);
- }
- if (mFinishEnterAnimation != null) {
- mFinishEnterAnimation.setStartTime(0);
- }
- if (mFinishExitAnimation != null) {
- mFinishExitAnimation.setStartTime(0);
- }
- if (mRotateEnterAnimation != null) {
- mRotateEnterAnimation.setStartTime(now);
- }
- if (mRotateExitAnimation != null) {
- mRotateExitAnimation.setStartTime(now);
- }
- mAnimRunning = true;
- }
if (mFinishAnimReady && mFinishAnimStartTime < 0) {
if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready");
@@ -493,24 +473,24 @@ class ScreenRotationAnimation {
// If the start animation is no longer running, we want to keep its
// transformation intact until the finish animation also completes.
- boolean moreStartExit = false;
+ mMoreStartExit = false;
if (mStartExitAnimation != null) {
mStartExitTransformation.clear();
- moreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
+ mMoreStartExit = mStartExitAnimation.getTransformation(now, mStartExitTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start exit: " + mStartExitTransformation);
- if (!moreStartExit) {
+ if (!mMoreStartExit) {
if (DEBUG_STATE) Slog.v(TAG, "Start exit animation done!");
mStartExitAnimation.cancel();
mStartExitAnimation = null;
}
}
- boolean moreStartEnter = false;
+ mMoreStartEnter = false;
if (mStartEnterAnimation != null) {
mStartEnterTransformation.clear();
- moreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
+ mMoreStartEnter = mStartEnterAnimation.getTransformation(now, mStartEnterTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped start enter: " + mStartEnterTransformation);
- if (!moreStartEnter) {
+ if (!mMoreStartEnter) {
if (DEBUG_STATE) Slog.v(TAG, "Start enter animation done!");
mStartEnterAnimation.cancel();
mStartEnterAnimation = null;
@@ -521,11 +501,11 @@ class ScreenRotationAnimation {
if (DEBUG_STATE) Slog.v(TAG, "Step: finishNow=" + finishNow);
mFinishExitTransformation.clear();
- boolean moreFinishExit = false;
+ mMoreFinishExit = false;
if (mFinishExitAnimation != null) {
- moreFinishExit = mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
+ mMoreFinishExit = mFinishExitAnimation.getTransformation(finishNow, mFinishExitTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish exit: " + mFinishExitTransformation);
- if (!moreStartExit && !moreFinishExit) {
+ if (!mMoreStartExit && !mMoreFinishExit) {
if (DEBUG_STATE) Slog.v(TAG, "Finish exit animation done, clearing start/finish anims!");
mStartExitTransformation.clear();
mFinishExitAnimation.cancel();
@@ -535,11 +515,11 @@ class ScreenRotationAnimation {
}
mFinishEnterTransformation.clear();
- boolean moreFinishEnter = false;
+ mMoreFinishEnter = false;
if (mFinishEnterAnimation != null) {
- moreFinishEnter = mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
+ mMoreFinishEnter = mFinishEnterAnimation.getTransformation(finishNow, mFinishEnterTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped finish enter: " + mFinishEnterTransformation);
- if (!moreStartEnter && !moreFinishEnter) {
+ if (!mMoreStartEnter && !mMoreFinishEnter) {
if (DEBUG_STATE) Slog.v(TAG, "Finish enter animation done, clearing start/finish anims!");
mStartEnterTransformation.clear();
mFinishEnterAnimation.cancel();
@@ -549,13 +529,13 @@ class ScreenRotationAnimation {
}
mRotateExitTransformation.clear();
- boolean moreRotateExit = false;
+ mMoreRotateExit = false;
if (mRotateExitAnimation != null) {
- moreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
+ mMoreRotateExit = mRotateExitAnimation.getTransformation(now, mRotateExitTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate exit: " + mRotateExitTransformation);
}
- if (!moreFinishExit && !moreRotateExit) {
+ if (!mMoreFinishExit && !mMoreRotateExit) {
if (DEBUG_STATE) Slog.v(TAG, "Rotate exit animation done!");
mRotateExitAnimation.cancel();
mRotateExitAnimation = null;
@@ -563,13 +543,13 @@ class ScreenRotationAnimation {
}
mRotateEnterTransformation.clear();
- boolean moreRotateEnter = false;
+ mMoreRotateEnter = false;
if (mRotateEnterAnimation != null) {
- moreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
+ mMoreRotateEnter = mRotateEnterAnimation.getTransformation(now, mRotateEnterTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Stepped rotate enter: " + mRotateEnterTransformation);
}
- if (!moreFinishEnter && !moreRotateEnter) {
+ if (!mMoreFinishEnter && !mMoreRotateEnter) {
if (DEBUG_STATE) Slog.v(TAG, "Rotate enter animation done!");
mRotateEnterAnimation.cancel();
mRotateEnterAnimation = null;
@@ -587,14 +567,25 @@ class ScreenRotationAnimation {
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final exit: " + mExitTransformation);
if (DEBUG_TRANSFORMS) Slog.v(TAG, "Final enter: " + mEnterTransformation);
- if (!moreStartExit && !moreFinishExit && !moreRotateExit) {
+ final boolean more = mMoreStartEnter || mMoreStartExit || mMoreFinishEnter
+ || mMoreFinishExit || mMoreRotateEnter || mMoreRotateExit || !mFinishAnimReady;
+
+ mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);
+
+ if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);
+
+ return more;
+ }
+
+ void updateSurfaces() {
+ if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) {
if (mSurface != null) {
if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface");
mSurface.hide();
}
}
- if (!moreStartEnter && !moreFinishEnter && !moreRotateEnter) {
+ if (!mMoreStartEnter && !mMoreFinishEnter && !mMoreRotateEnter) {
if (mBlackFrame != null) {
if (DEBUG_STATE) Slog.v(TAG, "Enter animations done, hiding black frame");
mBlackFrame.hide();
@@ -605,15 +596,39 @@ class ScreenRotationAnimation {
}
}
- mSnapshotFinalMatrix.setConcat(mExitTransformation.getMatrix(), mSnapshotInitialMatrix);
setSnapshotTransform(mSnapshotFinalMatrix, mExitTransformation.getAlpha());
+ }
+
+ public boolean startAndFinishAnimationLocked(long now) {
+ if (!isAnimating()) {
+ if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running");
+ return false;
+ }
- final boolean more = moreStartEnter || moreStartExit || moreFinishEnter || moreFinishExit
- || moreRotateEnter || moreRotateExit || !mFinishAnimReady;
-
- if (DEBUG_STATE) Slog.v(TAG, "Step: more=" + more);
-
- return more;
+ if (!mAnimRunning) {
+ if (DEBUG_STATE) Slog.v(TAG, "Step: starting start, finish, rotate");
+ if (mStartEnterAnimation != null) {
+ mStartEnterAnimation.setStartTime(now);
+ }
+ if (mStartExitAnimation != null) {
+ mStartExitAnimation.setStartTime(now);
+ }
+ if (mFinishEnterAnimation != null) {
+ mFinishEnterAnimation.setStartTime(0);
+ }
+ if (mFinishExitAnimation != null) {
+ mFinishExitAnimation.setStartTime(0);
+ }
+ if (mRotateEnterAnimation != null) {
+ mRotateEnterAnimation.setStartTime(now);
+ }
+ if (mRotateExitAnimation != null) {
+ mRotateExitAnimation.setStartTime(now);
+ }
+ mAnimRunning = true;
+ }
+
+ return true;
}
public Transformation getEnterTransformation() {