From fe6bfa644c5287069468b1141cec7ee510a22382 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 7 May 2014 23:23:18 +0200 Subject: [PATCH 1/2] Only handle scroll events when over content. This makes sure that the unlock text is always shown when tapping the bottom area. Bug: 14381296 Change-Id: If1729a01dab21ddf0b93e665c85fd72ed399c0fd --- .../statusbar/stack/NotificationStackScrollLayout.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 739803589c243..e83c3b5dab8f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -516,7 +516,7 @@ public class NotificationStackScrollLayout extends ViewGroup switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { - if (getChildCount() == 0) { + if (getChildCount() == 0 || !isInContentBounds(ev)) { return false; } boolean isBeingDragged = !mScroller.isFinished(); @@ -1140,6 +1140,13 @@ public class NotificationStackScrollLayout extends ViewGroup return mIsBeingDragged; } + /** + * @return Whether the specified motion event is actually happening over the content. + */ + private boolean isInContentBounds(MotionEvent event) { + return event.getY() < getHeight() - getEmptyBottomMargin(); + } + private void setIsBeingDragged(boolean isDragged) { mIsBeingDragged = isDragged; if (isDragged) { From 5aa045cc6bca84f5c11f1a99999546ba5e5949a5 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 7 May 2014 21:42:40 +0200 Subject: [PATCH 2/2] Allow different animation lengths in StackStateAnimator. Combine them using the maximum length. Change-Id: Idc1e6e52f7f36ed46fbfba013c23773eeed95cd6 --- .../stack/NotificationStackScrollLayout.java | 44 +++++++++++++++++++ .../statusbar/stack/StackStateAnimator.java | 8 +++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index e83c3b5dab8f3..afd5068445508 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -1315,6 +1315,33 @@ public class NotificationStackScrollLayout extends ViewGroup .animateDimmed() }; + static int[] LENGTHS = new int[] { + + // ANIMATION_TYPE_ADD + StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_REMOVE + StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_REMOVE_SWIPED_OUT + StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_TOP_PADDING_CHANGED + StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_START_DRAG + StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_SNAP_BACK + StackStateAnimator.ANIMATION_DURATION_STANDARD, + + // ANIMATION_TYPE_ACTIVATED_CHILD + StackStateAnimator.ANIMATION_DURATION_DIMMED_ACTIVATED, + + // ANIMATION_TYPE_DIMMED + StackStateAnimator.ANIMATION_DURATION_DIMMED_ACTIVATED, + }; + static int ANIMATION_TYPE_ADD = 0; static int ANIMATION_TYPE_REMOVE = 1; static int ANIMATION_TYPE_REMOVE_SWIPED_OUT = 2; @@ -1328,12 +1355,29 @@ public class NotificationStackScrollLayout extends ViewGroup final View changingView; final int animationType; final AnimationFilter filter; + final long length; AnimationEvent(View view, int type) { eventStartTime = AnimationUtils.currentAnimationTimeMillis(); changingView = view; animationType = type; filter = FILTERS[type]; + length = LENGTHS[type]; + } + + /** + * Combines the length of several animation events into a single value. + * + * @param events The events of the lengths to combine. + * @return The combined length. This is just the maximum of all length. + */ + static long combineLength(ArrayList events) { + long length = 0; + int size = events.size(); + for (int i = 0; i < size; i++) { + length = Math.max(length, events.get(i).length); + } + return length; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java index 695a0db6658bd..c9526986515f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -39,7 +39,9 @@ import java.util.Stack; */ public class StackStateAnimator { - private static final int ANIMATION_DURATION = 360; + public static final int ANIMATION_DURATION_STANDARD = 360; + public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220; + private static final int TAG_ANIMATOR_TRANSLATION_Y = R.id.translation_y_animator_tag; private static final int TAG_ANIMATOR_TRANSLATION_Z = R.id.translation_z_animator_tag; private static final int TAG_ANIMATOR_SCALE = R.id.scale_animator_tag; @@ -63,6 +65,7 @@ public class StackStateAnimator { private Stack mAnimationListenerPool = new Stack(); private AnimationFilter mAnimationFilter = new AnimationFilter(); + private long mCurrentLength; public StackStateAnimator(NotificationStackScrollLayout hostLayout) { mHostLayout = hostLayout; @@ -82,6 +85,7 @@ public class StackStateAnimator { int childCount = mHostLayout.getChildCount(); mAnimationFilter.applyCombination(mNewEvents); + mCurrentLength = NotificationStackScrollLayout.AnimationEvent.combineLength(mNewEvents); for (int i = 0; i < childCount; i++) { final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i); StackScrollState.ViewState viewState = finalState.getViewStateForView(child); @@ -410,7 +414,7 @@ public class StackStateAnimator { */ private long cancelAnimatorAndGetNewDuration(ValueAnimator previousAnimator, boolean newAnimationNeeded) { - long newDuration = ANIMATION_DURATION; + long newDuration = mCurrentLength; if (previousAnimator != null) { if (!newAnimationNeeded) { // This is only an update, no new event came in. lets just take the remaining