summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Sandler <dsandler@android.com>2012-05-09 02:06:29 -0400
committerDaniel Sandler <dsandler@android.com>2012-05-09 03:05:57 -0400
commitfbab8ae9d562ee7ebe22ec6bcf3aa03d4db106fb (patch)
treeabf09e518ac9294c33cfc6c2e797e1740642efc8
parentd1e323b272db90db426a4add18af4993f41ae361 (diff)
downloadframeworks_base-fbab8ae9d562ee7ebe22ec6bcf3aa03d4db106fb.zip
frameworks_base-fbab8ae9d562ee7ebe22ec6bcf3aa03d4db106fb.tar.gz
frameworks_base-fbab8ae9d562ee7ebe22ec6bcf3aa03d4db106fb.tar.bz2
Fix situations where the shade wouldn't close.
It appears sometimes the Choreographer will call you with an old frame (i.e. an animation time in the past). Bug: 6457615 Change-Id: I7135e2f4f524c14fe4f58f9a367f764b66d68edc
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java31
1 files changed, 24 insertions, 7 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 96f08b1..1d281c5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -212,6 +212,7 @@ public class PhoneStatusBar extends BaseStatusBar {
Choreographer mChoreographer;
boolean mAnimating;
+ boolean mClosing; // only valid when mAnimating; indicates the initial acceleration
float mAnimY;
float mAnimVel;
float mAnimAccel;
@@ -1276,14 +1277,26 @@ public class PhoneStatusBar extends BaseStatusBar {
}
}
+ void resetLastAnimTime() {
+ mAnimLastTimeNanos = System.nanoTime();
+ if (SPEW) {
+ Throwable t = new Throwable();
+ t.fillInStackTrace();
+ Slog.d(TAG, "resetting last anim time=" + mAnimLastTimeNanos, t);
+ }
+ }
+
void doAnimation(long frameTimeNanos) {
if (mAnimating) {
- if (SPEW) Slog.d(TAG, "doAnimation");
+ if (SPEW) Slog.d(TAG, "doAnimation dt=" + (frameTimeNanos - mAnimLastTimeNanos));
if (SPEW) Slog.d(TAG, "doAnimation before mAnimY=" + mAnimY);
incrementAnim(frameTimeNanos);
- if (SPEW) Slog.d(TAG, "doAnimation after mAnimY=" + mAnimY);
+ if (SPEW) {
+ Slog.d(TAG, "doAnimation after mAnimY=" + mAnimY);
+ Slog.d(TAG, "doAnimation expandedViewMax=" + getExpandedViewMaxHeight());
+ }
- if (mAnimY >= getExpandedViewMaxHeight()-1) {
+ if (mAnimY >= getExpandedViewMaxHeight()-1 && !mClosing) {
if (SPEW) Slog.d(TAG, "Animation completed to expanded state.");
mAnimating = false;
updateExpandedViewPos(EXPANDED_FULL_OPEN);
@@ -1291,14 +1304,14 @@ public class PhoneStatusBar extends BaseStatusBar {
return;
}
- if (mAnimY == 0 && mAnimAccel == 0 && mAnimVel == 0) {
+ if (mAnimY == 0 && mAnimAccel == 0 && mClosing) {
if (SPEW) Slog.d(TAG, "Animation completed to collapsed state.");
mAnimating = false;
performCollapse();
return;
}
- if (mAnimY < getStatusBarHeight()) {
+ if (mAnimY < getStatusBarHeight() && mClosing) {
// Draw one more frame with the bar positioned at the top of the screen
// before ending the animation so that the user sees the bar in
// its final position. The call to performCollapse() causes a window
@@ -1336,6 +1349,9 @@ public class PhoneStatusBar extends BaseStatusBar {
}
void doRevealAnimation(long frameTimeNanos) {
+ if (SPEW) {
+ Slog.d(TAG, "doRevealAnimation: dt=" + (frameTimeNanos - mAnimLastTimeNanos));
+ }
final int h = getCloseViewHeight() + getStatusBarHeight();
if (mAnimatingReveal && mAnimating && mAnimY < h) {
incrementAnim(frameTimeNanos);
@@ -1365,7 +1381,7 @@ public class PhoneStatusBar extends BaseStatusBar {
updateExpandedViewPos((int)mAnimY);
mAnimating = true;
mAnimatingReveal = true;
- mAnimLastTimeNanos = System.nanoTime();
+ resetLastAnimTime();
mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION,
mAnimationCallback, null);
mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION,
@@ -1439,8 +1455,9 @@ public class PhoneStatusBar extends BaseStatusBar {
//Slog.d(TAG, "mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel
// + " mAnimAccel=" + mAnimAccel);
- mAnimLastTimeNanos = System.nanoTime();
+ resetLastAnimTime();
mAnimating = true;
+ mClosing = mAnimAccel < 0;
mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION,
mAnimationCallback, null);