diff options
author | John Spurlock <jspurlock@google.com> | 2012-06-01 15:34:27 -0400 |
---|---|---|
committer | John Spurlock <jspurlock@google.com> | 2012-06-05 10:09:08 -0400 |
commit | 804df70112204a492730a5632e4524fddf0e4f48 (patch) | |
tree | 70b9dbdf69794daf8d14438130f3f9ca7239e59d /packages/SystemUI/src/com/android/systemui/statusbar/phone | |
parent | 51df04b93e8e362edd867abd7efaf1659b8b8b82 (diff) | |
download | frameworks_base-804df70112204a492730a5632e4524fddf0e4f48.zip frameworks_base-804df70112204a492730a5632e4524fddf0e4f48.tar.gz frameworks_base-804df70112204a492730a5632e4524fddf0e4f48.tar.bz2 |
StatusBar: Improve framerate on reveal animation.
Ensure reveal animation runs after notification panel is completely drawn.
Align minimum close handle position to proper height with new super status bar.
Bug: 6555172
Change-Id: I7ae978caa1f28932ee56f65484b18330a4406b80
Diffstat (limited to 'packages/SystemUI/src/com/android/systemui/statusbar/phone')
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java | 95 |
1 files changed, 69 insertions, 26 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 6842b17..be71d96 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -39,6 +39,7 @@ import android.graphics.PixelFormat; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.graphics.drawable.NinePatchDrawable; import android.inputmethodservice.InputMethodService; import android.os.IBinder; import android.os.Message; @@ -161,6 +162,7 @@ public class PhoneStatusBar extends BaseStatusBar { View mExpandedContents; int mNotificationPanelMarginBottomPx, mNotificationPanelMarginLeftPx; int mNotificationPanelGravity; + int mNotificationPanelMinHeight; // top bar View mClearButton; @@ -208,6 +210,8 @@ public class PhoneStatusBar extends BaseStatusBar { long mAnimLastTimeNanos; boolean mAnimatingReveal = false; int mViewDelta; + float mFlingVelocity; + int mFlingY; int[] mAbsPos = new int[2]; Runnable mPostCollapseCleanup = null; @@ -236,6 +240,33 @@ public class PhoneStatusBar extends BaseStatusBar { } }; + private final Runnable mStartRevealAnimation = new Runnable() { + @Override + public void run() { + mAnimAccel = mExpandAccelPx; + mAnimVel = mFlingExpandMinVelocityPx; + mAnimY = getStatusBarHeight(); + updateExpandedViewPos((int)mAnimY); + + mAnimating = true; + mAnimatingReveal = true; + resetLastAnimTime(); + mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION, + mAnimationCallback, null); + mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION, + mRevealAnimationCallback, null); + mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, + mRevealAnimationCallback, null); + } + }; + + private final Runnable mPerformFling = new Runnable() { + @Override + public void run() { + performFling(mFlingY + mViewDelta, mFlingVelocity, false); + } + }; + private class ExpandedDialog extends Dialog { ExpandedDialog(Context context) { super(context, com.android.internal.R.style.Theme_Translucent_NoTitleBar); @@ -321,7 +352,6 @@ public class PhoneStatusBar extends BaseStatusBar { mNotificationPanel.setBackground(new FastColorDrawable(context.getResources().getColor( R.color.notification_panel_solid_background))); } - if (ENABLE_INTRUDERS) { mIntruderAlertView = (IntruderAlertView) View.inflate(context, R.layout.intruder_alert, null); mIntruderAlertView.setVisibility(View.GONE); @@ -1042,14 +1072,13 @@ public class PhoneStatusBar extends BaseStatusBar { } }; - private void makeExpandedVisible() { + private void makeExpandedVisible(boolean revealAfterDraw) { if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible); if (mExpandedVisible) { return; } mExpandedVisible = true; - mNotificationPanel.setVisibility(View.VISIBLE); makeSlippery(mNavigationBarView, true); updateExpandedViewPos(EXPANDED_LEAVE_ALONE); @@ -1063,6 +1092,12 @@ public class PhoneStatusBar extends BaseStatusBar { final WindowManager wm = WindowManagerImpl.getDefault(); wm.updateViewLayout(mStatusBarWindow, lp); + // Updating the window layout will force an expensive traversal/redraw. + // Kick off the reveal animation after this is complete to avoid animation latency. + if (revealAfterDraw) { + mHandler.post(mStartRevealAnimation); + } + visibilityChanged(true); } @@ -1148,7 +1183,7 @@ public class PhoneStatusBar extends BaseStatusBar { } mExpanded = true; - makeExpandedVisible(); + makeExpandedVisible(false); updateExpandedViewPos(EXPANDED_FULL_OPEN); if (false) postStartTracing(); @@ -1163,7 +1198,6 @@ public class PhoneStatusBar extends BaseStatusBar { } mExpandedVisible = false; visibilityChanged(false); - mNotificationPanel.setVisibility(View.INVISIBLE); makeSlippery(mNavigationBarView, false); // Shrink the window to the size of the status bar only @@ -1244,6 +1278,8 @@ public class PhoneStatusBar extends BaseStatusBar { } void stopTracking() { + if (!mTracking) + return; mTracking = false; mPile.setLayerType(View.LAYER_TYPE_NONE, null); mVelocityTracker.recycle(); @@ -1268,7 +1304,7 @@ public class PhoneStatusBar extends BaseStatusBar { if (SPEW) { Slog.d(TAG, "doRevealAnimation: dt=" + (frameTimeNanos - mAnimLastTimeNanos)); } - final int h = getCloseViewHeight() + getStatusBarHeight(); + final int h = mNotificationPanelMinHeight; if (mAnimatingReveal && mAnimating && mAnimY < h) { incrementAnim(frameTimeNanos); if (mAnimY >= h) { @@ -1293,20 +1329,7 @@ public class PhoneStatusBar extends BaseStatusBar { mPile.setLayerType(View.LAYER_TYPE_HARDWARE, null); mVelocityTracker = VelocityTracker.obtain(); if (opening) { - mAnimAccel = mExpandAccelPx; - mAnimVel = mFlingExpandMinVelocityPx; - mAnimY = getStatusBarHeight(); - updateExpandedViewPos((int)mAnimY); - mAnimating = true; - mAnimatingReveal = true; - resetLastAnimTime(); - mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION, - mAnimationCallback, null); - mChoreographer.removeCallbacks(Choreographer.CALLBACK_ANIMATION, - mRevealAnimationCallback, null); - mChoreographer.postCallback(Choreographer.CALLBACK_ANIMATION, - mRevealAnimationCallback, null); - makeExpandedVisible(); + makeExpandedVisible(true); } else { // it's open, close it? if (mAnimating) { @@ -1320,7 +1343,7 @@ public class PhoneStatusBar extends BaseStatusBar { void performFling(int y, float vel, boolean always) { if (CHATTY) { - Slog.d(TAG, "panel: will fling, y=" + y + " vel=" + vel); + Slog.d(TAG, "panel: will fling, y=" + y + " vel=" + vel + " mExpanded=" + mExpanded); } mAnimatingReveal = false; @@ -1389,7 +1412,7 @@ public class PhoneStatusBar extends BaseStatusBar { boolean interceptTouchEvent(MotionEvent event) { if (SPEW) { Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled=" - + mDisabled); + + mDisabled + " mTracking=" + mTracking); } else if (CHATTY) { if (event.getAction() != MotionEvent.ACTION_MOVE) { Slog.d(TAG, String.format( @@ -1434,9 +1457,8 @@ public class PhoneStatusBar extends BaseStatusBar { } } else if (mTracking) { trackMovement(event); - final int minY = statusBarSize + getCloseViewHeight(); if (action == MotionEvent.ACTION_MOVE) { - if (mAnimatingReveal && (y + mViewDelta) < minY) { + if (mAnimatingReveal && (y + mViewDelta) < mNotificationPanelMinHeight) { // nothing } else { mAnimatingReveal = false; @@ -1470,7 +1492,15 @@ public class PhoneStatusBar extends BaseStatusBar { vel)); } - performFling(y + mViewDelta, vel, false); + if (mTrackingPosition == mNotificationPanelMinHeight) { + // start the fling from the tracking position, ignore y and view delta + mFlingY = mTrackingPosition; + mViewDelta = 0; + } else { + mFlingY = y; + } + mFlingVelocity = vel; + mHandler.post(mPerformFling); } } @@ -1873,7 +1903,6 @@ public class PhoneStatusBar extends BaseStatusBar { + " mTrackingPosition=" + mTrackingPosition + " gravity=" + mNotificationPanelGravity); } - int panelh = 0; final int disph = getExpandedViewMaxHeight(); @@ -2159,10 +2188,24 @@ public class PhoneStatusBar extends BaseStatusBar { if (mNotificationPanelGravity <= 0) { mNotificationPanelGravity = Gravity.CENTER_VERTICAL | Gravity.TOP; } + mNotificationPanelMinHeight = + res.getDimensionPixelSize(R.dimen.notification_panel_padding_top) + + res.getDimensionPixelSize(R.dimen.notification_panel_header_height) + + res.getDimensionPixelSize(R.dimen.close_handle_underlap) + + getNinePatchPadding(res.getDrawable(R.drawable.notification_panel_bg)).bottom; if (false) Slog.v(TAG, "updateResources"); } + private static Rect getNinePatchPadding(Drawable d) { + Rect padding = new Rect(); + if (d instanceof NinePatchDrawable) { + NinePatchDrawable ninePatch = (NinePatchDrawable) d; + ninePatch.getPadding(padding); + } + return padding; + } + // // tracing // |