diff options
author | Jorim Jaggi <jjaggi@google.com> | 2014-06-12 04:12:50 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-06-10 21:31:35 +0000 |
commit | 44f8d455fe8177479ac1f620d724a21db176847c (patch) | |
tree | 9f8b09fedea1bfdf5e0290a5fb533682792fa638 /packages | |
parent | 98751ac6d3588a5783453728d1a2f496177258a9 (diff) | |
parent | fd9d4414e82f684fa545f75943578d31e2a11722 (diff) | |
download | frameworks_base-44f8d455fe8177479ac1f620d724a21db176847c.zip frameworks_base-44f8d455fe8177479ac1f620d724a21db176847c.tar.gz frameworks_base-44f8d455fe8177479ac1f620d724a21db176847c.tar.bz2 |
Merge "Improve unlock motion." into lmp-preview-dev
Diffstat (limited to 'packages')
4 files changed, 84 insertions, 8 deletions
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index b8f9ad3..836cf82 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -335,4 +335,7 @@ <!-- end margin for multi user switch in expanded quick settings --> <dimen name="multi_user_switch_expanded_margin">8dp</dimen> + + <!-- the distance the panel moves up when starting the up motion on Keyguard --> + <dimen name="keyguard_panel_move_up_distance">100dp</dimen> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 6a83a5e..db85b14 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -88,13 +88,15 @@ public class KeyguardClockPositionAlgorithm { public void run(Result result) { int y = getClockY() - mKeyguardStatusHeight/2; - float clockAdjustment = getClockYExpansionAdjustment(); + float topAdjustment = getTopExpansionAdjustment(); float topPaddingAdjMultiplier = getTopPaddingAdjMultiplier(); - result.stackScrollerPaddingAdjustment = (int) (clockAdjustment*topPaddingAdjMultiplier); + result.stackScrollerPaddingAdjustment = (int) (topAdjustment*topPaddingAdjMultiplier); int clockNotificationsPadding = getClockNotificationsPadding() + result.stackScrollerPaddingAdjustment; int padding = y + clockNotificationsPadding; - y += clockAdjustment; + if (mNotificationCount == 0) { + y += topAdjustment; + } result.clockY = y; result.stackScrollerPadding = mKeyguardStatusHeight + padding; result.clockAlpha = getClockAlpha(result.stackScrollerPadding @@ -117,8 +119,8 @@ public class KeyguardClockPositionAlgorithm { return (int) (getClockYFraction() * mHeight); } - private float getClockYExpansionAdjustment() { - float rubberbandFactor = getClockYExpansionRubberbandFactor(); + private float getTopExpansionAdjustment() { + float rubberbandFactor = getTopExpansionRubberbandFactor(); float value = (rubberbandFactor * (mMaxPanelHeight - mExpandedHeight)); float t = value / mMaxPanelHeight; float slowedDownValue = -sSlowDownInterpolator.getInterpolation(t) * SLOW_DOWN_FACTOR @@ -130,7 +132,7 @@ public class KeyguardClockPositionAlgorithm { } } - private float getClockYExpansionRubberbandFactor() { + private float getTopExpansionRubberbandFactor() { float t = getNotificationAmountT(); t = Math.min(t, 1.0f); t = (float) Math.pow(t, 0.3f); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index eb8bce0..5c686fc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -696,6 +696,11 @@ public class NotificationPanelView extends PanelView implements } @Override + protected boolean hasNotifications() { + return mNotificationStackScroller.getNotGoneChildCount() > 0; + } + + @Override protected int getMaxPanelHeight() { // TODO: Figure out transition for collapsing when QS is open, adjust height here. int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index 1f3098d..08305dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -30,6 +30,8 @@ import android.view.ViewConfiguration; import android.view.ViewTreeObserver; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; +import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import com.android.systemui.R; @@ -43,6 +45,8 @@ public abstract class PanelView extends FrameLayout { public static final boolean DEBUG = PanelBar.DEBUG; public static final String TAG = PanelView.class.getSimpleName(); + private static final long KEYGUARD_MOVE_UP_LENGTH = 300; + private final void logf(String fmt, Object... args) { Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args)); } @@ -62,6 +66,9 @@ public abstract class PanelView extends FrameLayout { protected int mTouchSlop; protected boolean mHintAnimationRunning; private boolean mOverExpandedBeforeFling; + private boolean mKeyguardMovingUp; + private int mKeyguardMoveUpDistance; + private float mKeyguardFingerHeight; private ValueAnimator mHeightAnimator; private ObjectAnimator mPeekAnimator; @@ -82,6 +89,8 @@ public abstract class PanelView extends FrameLayout { private Interpolator mLinearOutSlowInInterpolator; private Interpolator mBounceInterpolator; + private Interpolator mKeyguardMoveUpInterpolator; + private final Interpolator mLinearInterpolator = new LinearInterpolator(); protected void onExpandingFinished() { mBar.onExpandingFinished(); @@ -109,6 +118,7 @@ public abstract class PanelView extends FrameLayout { mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in); mBounceInterpolator = new BounceInterpolator(); + mKeyguardMoveUpInterpolator = new PathInterpolator(0.6f, 0f, 0.4f, 1f); } protected void loadDimens() { @@ -120,6 +130,8 @@ public abstract class PanelView extends FrameLayout { mTouchSlop = configuration.getScaledTouchSlop(); mHintDistance = res.getDimension(R.dimen.hint_move_distance); mEdgeTapAreaWidth = res.getDimensionPixelSize(R.dimen.edge_tap_area_width); + mKeyguardMoveUpDistance = + res.getDimensionPixelSize(R.dimen.keyguard_panel_move_up_distance); } private void trackMovement(MotionEvent event) { @@ -217,8 +229,13 @@ public abstract class PanelView extends FrameLayout { mJustPeeked = false; } if (!mJustPeeked && (!waitForTouchSlop || mTracking)) { - setExpandedHeightInternal(newHeight); - mBar.panelExpansionChanged(PanelView.this, mExpandedFraction); + if (mStatusBar.getBarState() == StatusBarState.KEYGUARD && + !hasNotifications()) { + setExpandedHeightKeyguard(newHeight); + } else { + setExpandedHeightInternal(newHeight); + mBar.panelExpansionChanged(PanelView.this, mExpandedFraction); + } } trackMovement(event); @@ -247,10 +264,56 @@ public abstract class PanelView extends FrameLayout { return !waitForTouchSlop || mTracking; } + protected abstract boolean hasNotifications(); + + private void setExpandedHeightKeyguard(float newHeight) { + mKeyguardFingerHeight = newHeight; + if (newHeight < getMaxPanelHeight() && !mKeyguardMovingUp) { + mKeyguardMovingUp = true; + ValueAnimator anim = createHeightAnimator( + getMaxPanelHeight() - mKeyguardMoveUpDistance); + anim.setDuration(KEYGUARD_MOVE_UP_LENGTH); + anim.setInterpolator(mKeyguardMoveUpInterpolator); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mHeightAnimator = null; + } + }); + mHeightAnimator = anim; + anim.start(); + postOnAnimationDelayed(new Runnable() { + @Override + public void run() { + if (mKeyguardFingerHeight < mExpandedHeight && mHeightAnimator != null + && mKeyguardMovingUp) { + mHeightAnimator.cancel(); + float target = getMaxPanelHeight() - 1.75f * mKeyguardMoveUpDistance; + float diff = mExpandedHeight - target; + ValueAnimator anim = createHeightAnimator(target); + float velocity = 2.5f * mKeyguardMoveUpDistance / + (KEYGUARD_MOVE_UP_LENGTH / 1000f); + anim.setInterpolator(mLinearInterpolator); + anim.setDuration(Math.max(0, (long) (diff / velocity * 1000f))); + anim.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mHeightAnimator = null; + } + }); + mHeightAnimator = anim; + anim.start(); + } + } + }, KEYGUARD_MOVE_UP_LENGTH / 2); + } + } + protected abstract boolean hasConflictingGestures(); protected void onTrackingStopped(boolean expand) { mTracking = false; + mKeyguardMovingUp = false; mBar.onTrackingStopped(PanelView.this, expand); } @@ -381,6 +444,9 @@ public abstract class PanelView extends FrameLayout { protected void fling(float vel, boolean expand) { cancelPeek(); + if (mHeightAnimator != null) { + mHeightAnimator.cancel(); + } float target = expand ? getMaxPanelHeight() : 0.0f; if (target == mExpandedHeight || getOverExpansionAmount() > 0f && expand) { onExpandingFinished(); |