From caf468dce4755e376d02aaab86457ac2b5f8e2e0 Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Wed, 5 Jan 2022 12:23:52 +0100 Subject: [PATCH] Add Jank test for unfold transition A new TransitionProgressListener is added to start and stop the jank monitor during the transition. This is a no-op if the jank monitor is disabled. The reason why it is added in StatusBarWindowController is that InteractionJankMonitor needs an attached to begin, and the status bar should always be present during the animation. Bug: 213862831 Test: Running test suite in forrest with config in g3 Change-Id: I99dcd4e879b9c2c47611096b29b164881e8714c7 --- .../internal/jank/InteractionJankMonitor.java | 6 +++ .../JankMonitorTransitionProgressListener.kt | 37 +++++++++++++++++++ .../window/StatusBarWindowController.java | 9 ++++- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 packages/SystemUI/shared/src/com/android/systemui/unfold/util/JankMonitorTransitionProgressListener.kt diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index a33b2f18819e3..b474cbc989df5 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -65,6 +65,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SPLASHSCREEN_AVD; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SPLASHSCREEN_EXIT_ANIM; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP; +import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__UNFOLD_ANIM; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__USER_SWITCH; import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__WALLPAPER_TRANSITION; @@ -185,6 +186,7 @@ public class InteractionJankMonitor { public static final int CUJ_SCREEN_OFF_SHOW_AOD = 41; public static final int CUJ_ONE_HANDED_ENTER_TRANSITION = 42; public static final int CUJ_ONE_HANDED_EXIT_TRANSITION = 43; + public static final int CUJ_UNFOLD_ANIM = 44; private static final int NO_STATSD_LOGGING = -1; @@ -237,6 +239,7 @@ public class InteractionJankMonitor { UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SCREEN_OFF_SHOW_AOD, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__ONE_HANDED_ENTER_TRANSITION, UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__ONE_HANDED_EXIT_TRANSITION, + UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__UNFOLD_ANIM, }; private static volatile InteractionJankMonitor sInstance; @@ -301,6 +304,7 @@ public class InteractionJankMonitor { CUJ_SCREEN_OFF_SHOW_AOD, CUJ_ONE_HANDED_ENTER_TRANSITION, CUJ_ONE_HANDED_EXIT_TRANSITION, + CUJ_UNFOLD_ANIM, }) @Retention(RetentionPolicy.SOURCE) public @interface CujType { @@ -724,6 +728,8 @@ public class InteractionJankMonitor { return "ONE_HANDED_ENTER_TRANSITION"; case CUJ_ONE_HANDED_EXIT_TRANSITION: return "ONE_HANDED_EXIT_TRANSITION"; + case CUJ_UNFOLD_ANIM: + return "UNFOLD_ANIM"; } return "UNKNOWN"; } diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/JankMonitorTransitionProgressListener.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/JankMonitorTransitionProgressListener.kt new file mode 100644 index 0000000000000..2b38f3d6aab8d --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/JankMonitorTransitionProgressListener.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.unfold.util + +import android.view.View +import com.android.internal.jank.InteractionJankMonitor +import com.android.internal.jank.InteractionJankMonitor.CUJ_UNFOLD_ANIM +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener +import java.util.function.Supplier + +class JankMonitorTransitionProgressListener(private val attachedViewProvider: Supplier) : + TransitionProgressListener { + + private val interactionJankMonitor = InteractionJankMonitor.getInstance() + + override fun onTransitionStarted() { + interactionJankMonitor.begin(attachedViewProvider.get(), CUJ_UNFOLD_ANIM) + } + + override fun onTransitionFinished() { + interactionJankMonitor.end(CUJ_UNFOLD_ANIM) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java index bd845209a6d6b..31c7006c8edd9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.java @@ -47,6 +47,8 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider; +import com.android.systemui.unfold.UnfoldTransitionProgressProvider; +import com.android.systemui.unfold.util.JankMonitorTransitionProgressListener; import java.util.Optional; @@ -81,7 +83,8 @@ public class StatusBarWindowController { WindowManager windowManager, IWindowManager iWindowManager, StatusBarContentInsetsProvider contentInsetsProvider, - @Main Resources resources) { + @Main Resources resources, + Optional unfoldTransitionProgressProvider) { mContext = context; mWindowManager = windowManager; mIWindowManager = iWindowManager; @@ -94,6 +97,10 @@ public class StatusBarWindowController { if (mBarHeight < 0) { mBarHeight = SystemBarUtils.getStatusBarHeight(mContext); } + unfoldTransitionProgressProvider.ifPresent( + unfoldProgressProvider -> unfoldProgressProvider.addCallback( + new JankMonitorTransitionProgressListener( + /* attachedViewProvider=*/ () -> mStatusBarWindowView))); } public int getStatusBarHeight() {