diff options
author | Jorim Jaggi <jjaggi@google.com> | 2015-08-19 19:50:49 -0700 |
---|---|---|
committer | Jorim Jaggi <jjaggi@google.com> | 2015-08-21 12:43:40 -0700 |
commit | 5eb67c22489f5fda22770d1fc824e7a8013ec025 (patch) | |
tree | 774682cc73aa4b15e4446888a456f865b054a5b1 | |
parent | ab45a217b0002dcf586d529ab8581cacbbfc37e9 (diff) | |
download | frameworks_base-5eb67c22489f5fda22770d1fc824e7a8013ec025.zip frameworks_base-5eb67c22489f5fda22770d1fc824e7a8013ec025.tar.gz frameworks_base-5eb67c22489f5fda22770d1fc824e7a8013ec025.tar.bz2 |
Fix jank when clicking on HUN
There is jank at the beginning of the transition when the heads-up
disappears when clicking, because a lot of stuff is going on. In
order to make it consistent with other notification clicks in the
shade, introduce a delay for the disappear animation.
Bug: 23365512
Change-Id: Ib7c5db552d6803f96374198c2af38cf8236769cd
5 files changed, 63 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index 98f7bf6..c14f215 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -90,6 +90,7 @@ import com.android.internal.statusbar.StatusBarIconList; import com.android.internal.util.NotificationColorUtil; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.DejankUtils; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SwipeHelper; @@ -1506,6 +1507,15 @@ public abstract class BaseStatusBar extends SystemUI implements final PendingIntent intent = sbn.getNotification().contentIntent; final String notificationKey = sbn.getKey(); + // Mark notification for one frame. + row.setJustClicked(true); + DejankUtils.postAfterTraversal(new Runnable() { + @Override + public void run() { + row.setJustClicked(false); + } + }); + if (NOTIFICATION_CLICK_DEBUG) { Log.d(TAG, "Clicked on content of " + notificationKey); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index b88e5ca..0aa4f6c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -110,6 +110,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } }; + private boolean mJustClicked; + public NotificationContentView getPrivateLayout() { return mPrivateLayout; } @@ -301,6 +303,21 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { return mHeadsUpHeight; } + /** + * Mark whether this notification was just clicked, i.e. the user has just clicked this + * notification in this frame. + */ + public void setJustClicked(boolean justClicked) { + mJustClicked = justClicked; + } + + /** + * @return true if this notification has been clicked in this frame, false otherwise + */ + public boolean wasJustClicked() { + return mJustClicked; + } + public interface ExpansionLogger { public void logNotificationExpansion(String key, boolean userAction, boolean expanded); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java index 753a7f7..56f6564 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java @@ -34,6 +34,7 @@ public class AnimationFilter { boolean hasDelays; boolean hasGoToFullShadeEvent; boolean hasDarkEvent; + boolean hasHeadsUpDisappearClickEvent; int darkAnimationOriginIndex; public AnimationFilter animateAlpha() { @@ -106,6 +107,10 @@ public class AnimationFilter { hasDarkEvent = true; darkAnimationOriginIndex = ev.darkAnimationOriginIndex; } + if (ev.animationType == NotificationStackScrollLayout.AnimationEvent + .ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) { + hasHeadsUpDisappearClickEvent = true; + } } } @@ -135,6 +140,7 @@ public class AnimationFilter { hasDelays = false; hasGoToFullShadeEvent = false; hasDarkEvent = false; + hasHeadsUpDisappearClickEvent = false; darkAnimationOriginIndex = NotificationStackScrollLayout.AnimationEvent.DARK_ANIMATION_ORIGIN_INDEX_ABOVE; } 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 e1a6fa2..a7fe71e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -1915,7 +1915,9 @@ public class NotificationStackScrollLayout extends ViewGroup boolean onBottom = false; boolean pinnedAndClosed = row.isPinned() && !mIsExpanded; if (!mIsExpanded && !isHeadsUp) { - type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR; + type = row.wasJustClicked() + ? AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK + : AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR; } else { StackViewState viewState = mCurrentStackScrollState.getViewStateForView(row); if (viewState == null) { @@ -3016,6 +3018,15 @@ public class NotificationStackScrollLayout extends ViewGroup .animateY() .animateZ(), + // ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK + new AnimationFilter() + .animateAlpha() + .animateHeight() + .animateTopInset() + .animateY() + .animateZ() + .hasDelays(), + // ANIMATION_TYPE_HEADS_UP_OTHER new AnimationFilter() .animateAlpha() @@ -3087,6 +3098,9 @@ public class NotificationStackScrollLayout extends ViewGroup // ANIMATION_TYPE_HEADS_UP_DISAPPEAR StackStateAnimator.ANIMATION_DURATION_HEADS_UP_DISAPPEAR, + // ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK + StackStateAnimator.ANIMATION_DURATION_HEADS_UP_DISAPPEAR, + // ANIMATION_TYPE_HEADS_UP_OTHER StackStateAnimator.ANIMATION_DURATION_STANDARD, @@ -3110,8 +3124,9 @@ public class NotificationStackScrollLayout extends ViewGroup static final int ANIMATION_TYPE_GROUP_EXPANSION_CHANGED = 13; static final int ANIMATION_TYPE_HEADS_UP_APPEAR = 14; static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR = 15; - static final int ANIMATION_TYPE_HEADS_UP_OTHER = 16; - static final int ANIMATION_TYPE_EVERYTHING = 17; + static final int ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK = 16; + static final int ANIMATION_TYPE_HEADS_UP_OTHER = 17; + static final int ANIMATION_TYPE_EVERYTHING = 18; static final int DARK_ANIMATION_ORIGIN_INDEX_ABOVE = -1; static final int DARK_ANIMATION_ORIGIN_INDEX_BELOW = -2; 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 97c7d30..b4ab48a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java @@ -54,6 +54,7 @@ public class StackStateAnimator { public static final int ANIMATION_DELAY_PER_ELEMENT_DARK = 24; public static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2; public static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE_CHILDREN = 3; + public static final int ANIMATION_DELAY_HEADS_UP = 120; 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; @@ -320,6 +321,9 @@ public class StackStateAnimator { if (mAnimationFilter.hasGoToFullShadeEvent) { return calculateDelayGoToFullShade(viewState); } + if (mAnimationFilter.hasHeadsUpDisappearClickEvent) { + return ANIMATION_DELAY_HEADS_UP; + } long minDelay = 0; for (NotificationStackScrollLayout.AnimationEvent event : mNewEvents) { long delayPerElement = ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING; @@ -890,7 +894,9 @@ public class StackStateAnimator { mHeadsUpAppearChildren.add(changingView); finalState.applyState(changingView, mTmpState); } else if (event.animationType == NotificationStackScrollLayout - .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR) { + .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR || + event.animationType == NotificationStackScrollLayout + .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) { mHeadsUpDisappearChildren.add(changingView); if (mHostLayout.indexOfChild(changingView) == -1) { // This notification was actually removed, so we need to add it to the overlay @@ -900,7 +906,11 @@ public class StackStateAnimator { // We temporarily enable Y animations, the real filter will be combined // afterwards anyway mAnimationFilter.animateY = true; - startViewAnimations(changingView, mTmpState, 0, + startViewAnimations(changingView, mTmpState, + event.animationType == NotificationStackScrollLayout + .AnimationEvent.ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK + ? ANIMATION_DELAY_HEADS_UP + : 0, ANIMATION_DURATION_HEADS_UP_DISAPPEAR); mChildrenToClearFromOverlay.add(changingView); } |