diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index ac2a8e4ffcd2c..e68087f3ad555 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -5304,6 +5304,11 @@ message UIInteractionFrameInfoReported { LAUNCHER_APP_CLOSE_TO_HOME = 10; LAUNCHER_APP_CLOSE_TO_PIP = 11; LAUNCHER_QUICK_SWITCH = 12; + SHADE_HEADS_UP_APPEAR = 13; + SHADE_HEADS_UP_DISAPPEAR = 14; + SHADE_NOTIFICATION_ADD = 15; + SHADE_NOTIFICATION_REMOVE = 16; + SHADE_APP_LAUNCH = 17; } optional InteractionType interaction_type = 1; diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index ba07863a292dd..137430b7de144 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -22,7 +22,12 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_APP_LAUNCH_FROM_RECENTS; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_QUICK_SWITCH; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__NOTIFICATION_SHADE_SWIPE; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_EXPAND_COLLAPSE_LOCK; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_HEADS_UP_APPEAR; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_HEADS_UP_DISAPPEAR; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_NOTIFICATION_ADD; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_NOTIFICATION_REMOVE; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_QS_EXPAND_COLLAPSE; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_QS_SCROLL_SWIPE; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_ROW_EXPAND; @@ -67,6 +72,11 @@ public class InteractionJankMonitor { public static final int CUJ_LAUNCHER_APP_CLOSE_TO_HOME = 9; public static final int CUJ_LAUNCHER_APP_CLOSE_TO_PIP = 10; public static final int CUJ_LAUNCHER_QUICK_SWITCH = 11; + public static final int CUJ_NOTIFICATION_HEADS_UP_APPEAR = 12; + public static final int CUJ_NOTIFICATION_HEADS_UP_DISAPPEAR = 13; + public static final int CUJ_NOTIFICATION_ADD = 14; + public static final int CUJ_NOTIFICATION_REMOVE = 15; + public static final int CUJ_NOTIFICATION_APP_START = 16; private static final int NO_STATSD_LOGGING = -1; @@ -87,6 +97,11 @@ public class InteractionJankMonitor { UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_APP_CLOSE_TO_HOME, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_APP_CLOSE_TO_PIP, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_QUICK_SWITCH, + UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_HEADS_UP_APPEAR, + UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_HEADS_UP_DISAPPEAR, + UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_NOTIFICATION_ADD, + UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_NOTIFICATION_REMOVE, + UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH, }; private static volatile InteractionJankMonitor sInstance; @@ -112,6 +127,11 @@ public class InteractionJankMonitor { CUJ_LAUNCHER_APP_CLOSE_TO_HOME, CUJ_LAUNCHER_APP_CLOSE_TO_PIP, CUJ_LAUNCHER_QUICK_SWITCH, + CUJ_NOTIFICATION_HEADS_UP_APPEAR, + CUJ_NOTIFICATION_HEADS_UP_DISAPPEAR, + CUJ_NOTIFICATION_ADD, + CUJ_NOTIFICATION_REMOVE, + CUJ_NOTIFICATION_APP_START, }) @Retention(RetentionPolicy.SOURCE) public @interface CujType {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java index 382715a3fb77d..45e8098e71d3f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification; +import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_APP_START; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; @@ -32,6 +34,7 @@ import android.view.SyncRtSurfaceTransactionApplier; import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams; import android.view.View; +import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.systemui.Interpolators; import com.android.systemui.statusbar.NotificationShadeDepthController; @@ -226,10 +229,27 @@ public class ActivityLaunchAnimator { } }); anim.addListener(new AnimatorListenerAdapter() { + private boolean mWasCancelled; + + @Override + public void onAnimationStart(Animator animation) { + InteractionJankMonitor.getInstance().begin(CUJ_NOTIFICATION_APP_START); + } + + @Override + public void onAnimationCancel(Animator animation) { + mWasCancelled = true; + } + @Override public void onAnimationEnd(Animator animation) { setExpandAnimationRunning(false); invokeCallback(iRemoteAnimationFinishedCallback); + if (!mWasCancelled) { + InteractionJankMonitor.getInstance().end(CUJ_NOTIFICATION_APP_START); + } else { + InteractionJankMonitor.getInstance().cancel(CUJ_NOTIFICATION_APP_START); + } } }); anim.start(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java index 094e8661d2623..10273cbbebad7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ActivatableNotificationView.java @@ -33,6 +33,7 @@ import android.view.accessibility.AccessibilityManager; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; +import com.android.internal.jank.InteractionJankMonitor; import com.android.systemui.Gefingerpoken; import com.android.systemui.Interpolators; import com.android.systemui.R; @@ -750,12 +751,16 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView if (!mWasCancelled) { enableAppearDrawing(false); onAppearAnimationFinished(isAppearing); + InteractionJankMonitor.getInstance().end(getCujType(isAppearing)); + } else { + InteractionJankMonitor.getInstance().cancel(getCujType(isAppearing)); } } @Override public void onAnimationStart(Animator animation) { mWasCancelled = false; + InteractionJankMonitor.getInstance().begin(getCujType(isAppearing)); } @Override @@ -766,6 +771,18 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mAppearAnimator.start(); } + private int getCujType(boolean isAppearing) { + if (mIsHeadsUpAnimation) { + return isAppearing + ? InteractionJankMonitor.CUJ_NOTIFICATION_HEADS_UP_APPEAR + : InteractionJankMonitor.CUJ_NOTIFICATION_HEADS_UP_DISAPPEAR; + } else { + return isAppearing + ? InteractionJankMonitor.CUJ_NOTIFICATION_ADD + : InteractionJankMonitor.CUJ_NOTIFICATION_REMOVE; + } + } + protected void onAppearAnimationFinished(boolean wasAppearing) { }