diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 428334369e21e..eff8af0fb4c39 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -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; @@ -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); } @@ -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<>(); @@ -3100,10 +3119,12 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable private void generateHeadsUpAnimationEvents() { for (Pair 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; @@ -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 { @@ -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)) { @@ -3151,6 +3174,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable + " onBottom=" + onBottom + " row=" + row.getEntry().getKey()); } + logHunAnimationEventAdded(key, type); } mHeadsUpChangeAnimations.clear(); mAddedHeadsUpChildren.clear(); @@ -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)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index 51ce7792ad086..0d0e5e850523f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -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; @@ -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; @@ -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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt new file mode 100644 index 0000000000000..04bf62104f669 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLogger.kt @@ -0,0 +1,55 @@ +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 diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java index 86a705f947e3e..c4f954fee1f6f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java @@ -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 mStateListenerArgumentCaptor; @@ -193,7 +194,8 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mVisualStabilityManager, mShadeController, mJankMonitor, - mStackLogger + mStackLogger, + mLogger ); when(mNotificationStackScrollLayout.isAttachedToWindow()).thenReturn(true);