Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +27 −1 Original line number Diff line number Diff line Loading @@ -305,7 +305,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return true; } }; private NotificationStackScrollLogger mLogger; private StatusBar mStatusBar; private int[] mTempInt2 = new int[2]; private boolean mGenerateChildOrderChangedEvent; Loading Loading @@ -658,6 +658,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return 0f; } protected void setLogger(NotificationStackScrollLogger logger) { mLogger = logger; } public float getNotificationSquishinessFraction() { return mStackScrollAlgorithm.getNotificationSquishinessFraction(mAmbientState); } Loading Loading @@ -736,6 +740,21 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } } private void logHunSkippedForUnexpectedState(String key, boolean expected, boolean actual) { if (mLogger == null) return; mLogger.hunSkippedForUnexpectedState(key, expected, actual); } private void logHunAnimationSkipped(String key, String reason) { if (mLogger == null) return; mLogger.hunAnimationSkipped(key, reason); } private void logHunAnimationEventAdded(String key, int type) { if (mLogger == null) return; mLogger.hunAnimationEventAdded(key, type); } private void onDrawDebug(Canvas canvas) { if (mDebugTextUsedYPositions == null) { mDebugTextUsedYPositions = new HashSet<>(); Loading Loading @@ -3100,10 +3119,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private void generateHeadsUpAnimationEvents() { for (Pair<ExpandableNotificationRow, Boolean> eventPair : mHeadsUpChangeAnimations) { ExpandableNotificationRow row = eventPair.first; String key = row.getEntry().getKey(); boolean isHeadsUp = eventPair.second; if (isHeadsUp != row.isHeadsUp()) { // For cases where we have a heads up showing and appearing again we shouldn't // do the animations at all. logHunSkippedForUnexpectedState(key, isHeadsUp, row.isHeadsUp()); continue; } int type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_OTHER; Loading @@ -3121,6 +3142,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (row.isChildInGroup()) { // We can otherwise get stuck in there if it was just isolated row.setHeadsUpAnimatingAway(false); logHunAnimationSkipped(key, "row is child in group"); continue; } } else { Loading @@ -3128,6 +3150,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (viewState == null) { // A view state was never generated for this view, so we don't need to animate // this. This may happen with notification children. logHunAnimationSkipped(key, "row has no viewState"); continue; } if (isHeadsUp && (mAddedHeadsUpChildren.contains(row) || pinnedAndClosed)) { Loading @@ -3151,6 +3174,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable + " onBottom=" + onBottom + " row=" + row.getEntry().getKey()); } logHunAnimationEventAdded(key, type); } mHeadsUpChangeAnimations.clear(); mAddedHeadsUpChildren.clear(); Loading Loading @@ -4699,6 +4723,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (SPEW) { Log.v(TAG, "generateHeadsUpAnimation: previous hun appear animation cancelled"); } logHunAnimationSkipped(row.getEntry().getKey(), "previous hun appear animation cancelled"); return; } mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp)); Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +5 −1 Original line number Diff line number Diff line Loading @@ -185,6 +185,7 @@ public class NotificationStackScrollLayoutController { private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final InteractionJankMonitor mJankMonitor; private final StackStateLogger mStackStateLogger; private final NotificationStackScrollLogger mLogger; private NotificationStackScrollLayout mView; private boolean mFadeNotificationsOnDismiss; Loading Loading @@ -662,8 +663,10 @@ public class NotificationStackScrollLayoutController { VisualStabilityManager visualStabilityManager, ShadeController shadeController, InteractionJankMonitor jankMonitor, StackStateLogger stackLogger) { StackStateLogger stackLogger, NotificationStackScrollLogger logger) { mStackStateLogger = stackLogger; mLogger = logger; mAllowLongPress = allowLongPress; mNotificationGutsManager = notificationGutsManager; mVisibilityProvider = visibilityProvider; Loading Loading @@ -717,6 +720,7 @@ public class NotificationStackScrollLayoutController { mView = view; mView.setLogger(mStackStateLogger); mView.setController(this); mView.setLogger(mLogger); mView.setTouchHandler(new TouchHandler()); mView.setStatusBar(mStatusBar); mView.setClearAllAnimationListener(this::onAnimationEnd); Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt 0 → 100644 +55 −0 Original line number Diff line number Diff line package com.android.systemui.statusbar.notification.stack import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.AnimationEvent.* import javax.inject.Inject class NotificationStackScrollLogger @Inject constructor( @NotificationHeadsUpLog private val buffer: LogBuffer ) { fun hunAnimationSkipped(key: String, reason: String) { buffer.log(TAG, INFO, { str1 = key str2 = reason }, { "heads up animation skipped: key: $str1 reason: $str2" }) } fun hunAnimationEventAdded(key: String, type: Int) { val reason: String reason = if (type == ANIMATION_TYPE_HEADS_UP_DISAPPEAR) { "HEADS_UP_DISAPPEAR" } else if (type == ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) { "HEADS_UP_DISAPPEAR_CLICK" } else if (type == ANIMATION_TYPE_HEADS_UP_APPEAR) { "HEADS_UP_APPEAR" } else if (type == ANIMATION_TYPE_HEADS_UP_OTHER) { "HEADS_UP_OTHER" } else if (type == ANIMATION_TYPE_ADD) { "ADD" } else { type.toString() } buffer.log(TAG, INFO, { str1 = key str2 = reason }, { "heads up animation added: $str1 with type $str2" }) } fun hunSkippedForUnexpectedState(key: String, expected: Boolean, actual: Boolean) { buffer.log(TAG, INFO, { str1 = key bool1 = expected bool2 = actual }, { "HUN animation skipped for unexpected hun state: " + "key: $str1 expected: $bool1 actual: $bool2" }) } } private const val TAG = "NotificationStackScroll" No newline at end of file packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -138,6 +138,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private ShadeController mShadeController; @Mock private InteractionJankMonitor mJankMonitor; @Mock private StackStateLogger mStackLogger; @Mock private NotificationStackScrollLogger mLogger; @Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerArgumentCaptor; Loading Loading @@ -193,7 +194,8 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mVisualStabilityManager, mShadeController, mJankMonitor, mStackLogger mStackLogger, mLogger ); when(mNotificationStackScrollLayout.isAttachedToWindow()).thenReturn(true); Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +27 −1 Original line number Diff line number Diff line Loading @@ -305,7 +305,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return true; } }; private NotificationStackScrollLogger mLogger; private StatusBar mStatusBar; private int[] mTempInt2 = new int[2]; private boolean mGenerateChildOrderChangedEvent; Loading Loading @@ -658,6 +658,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable return 0f; } protected void setLogger(NotificationStackScrollLogger logger) { mLogger = logger; } public float getNotificationSquishinessFraction() { return mStackScrollAlgorithm.getNotificationSquishinessFraction(mAmbientState); } Loading Loading @@ -736,6 +740,21 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } } private void logHunSkippedForUnexpectedState(String key, boolean expected, boolean actual) { if (mLogger == null) return; mLogger.hunSkippedForUnexpectedState(key, expected, actual); } private void logHunAnimationSkipped(String key, String reason) { if (mLogger == null) return; mLogger.hunAnimationSkipped(key, reason); } private void logHunAnimationEventAdded(String key, int type) { if (mLogger == null) return; mLogger.hunAnimationEventAdded(key, type); } private void onDrawDebug(Canvas canvas) { if (mDebugTextUsedYPositions == null) { mDebugTextUsedYPositions = new HashSet<>(); Loading Loading @@ -3100,10 +3119,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private void generateHeadsUpAnimationEvents() { for (Pair<ExpandableNotificationRow, Boolean> eventPair : mHeadsUpChangeAnimations) { ExpandableNotificationRow row = eventPair.first; String key = row.getEntry().getKey(); boolean isHeadsUp = eventPair.second; if (isHeadsUp != row.isHeadsUp()) { // For cases where we have a heads up showing and appearing again we shouldn't // do the animations at all. logHunSkippedForUnexpectedState(key, isHeadsUp, row.isHeadsUp()); continue; } int type = AnimationEvent.ANIMATION_TYPE_HEADS_UP_OTHER; Loading @@ -3121,6 +3142,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (row.isChildInGroup()) { // We can otherwise get stuck in there if it was just isolated row.setHeadsUpAnimatingAway(false); logHunAnimationSkipped(key, "row is child in group"); continue; } } else { Loading @@ -3128,6 +3150,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (viewState == null) { // A view state was never generated for this view, so we don't need to animate // this. This may happen with notification children. logHunAnimationSkipped(key, "row has no viewState"); continue; } if (isHeadsUp && (mAddedHeadsUpChildren.contains(row) || pinnedAndClosed)) { Loading @@ -3151,6 +3174,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable + " onBottom=" + onBottom + " row=" + row.getEntry().getKey()); } logHunAnimationEventAdded(key, type); } mHeadsUpChangeAnimations.clear(); mAddedHeadsUpChildren.clear(); Loading Loading @@ -4699,6 +4723,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable if (SPEW) { Log.v(TAG, "generateHeadsUpAnimation: previous hun appear animation cancelled"); } logHunAnimationSkipped(row.getEntry().getKey(), "previous hun appear animation cancelled"); return; } mHeadsUpChangeAnimations.add(new Pair<>(row, isHeadsUp)); Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +5 −1 Original line number Diff line number Diff line Loading @@ -185,6 +185,7 @@ public class NotificationStackScrollLayoutController { private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final InteractionJankMonitor mJankMonitor; private final StackStateLogger mStackStateLogger; private final NotificationStackScrollLogger mLogger; private NotificationStackScrollLayout mView; private boolean mFadeNotificationsOnDismiss; Loading Loading @@ -662,8 +663,10 @@ public class NotificationStackScrollLayoutController { VisualStabilityManager visualStabilityManager, ShadeController shadeController, InteractionJankMonitor jankMonitor, StackStateLogger stackLogger) { StackStateLogger stackLogger, NotificationStackScrollLogger logger) { mStackStateLogger = stackLogger; mLogger = logger; mAllowLongPress = allowLongPress; mNotificationGutsManager = notificationGutsManager; mVisibilityProvider = visibilityProvider; Loading Loading @@ -717,6 +720,7 @@ public class NotificationStackScrollLayoutController { mView = view; mView.setLogger(mStackStateLogger); mView.setController(this); mView.setLogger(mLogger); mView.setTouchHandler(new TouchHandler()); mView.setStatusBar(mStatusBar); mView.setClearAllAnimationListener(this::onAnimationEnd); Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt 0 → 100644 +55 −0 Original line number Diff line number Diff line package com.android.systemui.statusbar.notification.stack import com.android.systemui.log.LogBuffer import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout.AnimationEvent.* import javax.inject.Inject class NotificationStackScrollLogger @Inject constructor( @NotificationHeadsUpLog private val buffer: LogBuffer ) { fun hunAnimationSkipped(key: String, reason: String) { buffer.log(TAG, INFO, { str1 = key str2 = reason }, { "heads up animation skipped: key: $str1 reason: $str2" }) } fun hunAnimationEventAdded(key: String, type: Int) { val reason: String reason = if (type == ANIMATION_TYPE_HEADS_UP_DISAPPEAR) { "HEADS_UP_DISAPPEAR" } else if (type == ANIMATION_TYPE_HEADS_UP_DISAPPEAR_CLICK) { "HEADS_UP_DISAPPEAR_CLICK" } else if (type == ANIMATION_TYPE_HEADS_UP_APPEAR) { "HEADS_UP_APPEAR" } else if (type == ANIMATION_TYPE_HEADS_UP_OTHER) { "HEADS_UP_OTHER" } else if (type == ANIMATION_TYPE_ADD) { "ADD" } else { type.toString() } buffer.log(TAG, INFO, { str1 = key str2 = reason }, { "heads up animation added: $str1 with type $str2" }) } fun hunSkippedForUnexpectedState(key: String, expected: Boolean, actual: Boolean) { buffer.log(TAG, INFO, { str1 = key bool1 = expected bool2 = actual }, { "HUN animation skipped for unexpected hun state: " + "key: $str1 expected: $bool1 actual: $bool2" }) } } private const val TAG = "NotificationStackScroll" No newline at end of file
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -138,6 +138,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private ShadeController mShadeController; @Mock private InteractionJankMonitor mJankMonitor; @Mock private StackStateLogger mStackLogger; @Mock private NotificationStackScrollLogger mLogger; @Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListenerArgumentCaptor; Loading Loading @@ -193,7 +194,8 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mVisualStabilityManager, mShadeController, mJankMonitor, mStackLogger mStackLogger, mLogger ); when(mNotificationStackScrollLayout.isAttachedToWindow()).thenReturn(true); Loading