diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 4eb436e784ed1..1bbb7b4bd6714 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2426,7 +2426,7 @@ public final class ViewRootImpl implements ViewParent, * * @hide */ - void notifyRendererOfExpensiveFrame() { + public void notifyRendererOfExpensiveFrame() { if (mAttachInfo.mThreadedRenderer != null) { mAttachInfo.mThreadedRenderer.notifyExpensiveFrame(); } diff --git a/packages/SystemUI/src/com/android/systemui/DejankUtils.java b/packages/SystemUI/src/com/android/systemui/DejankUtils.java index 3fce55f6e5155..146d12c3e6216 100644 --- a/packages/SystemUI/src/com/android/systemui/DejankUtils.java +++ b/packages/SystemUI/src/com/android/systemui/DejankUtils.java @@ -29,13 +29,17 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.StrictMode; import android.os.SystemProperties; +import android.os.Trace; import android.view.Choreographer; +import android.view.View; +import android.view.ViewRootImpl; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.util.Assert; import java.util.ArrayList; import java.util.HashSet; +import java.util.Random; import java.util.Stack; import java.util.function.Supplier; @@ -43,12 +47,14 @@ import java.util.function.Supplier; * Utility class for methods used to dejank the UI. */ public class DejankUtils { + private static final String TRACK_NAME = "DejankUtils"; public static final boolean STRICT_MODE_ENABLED = Build.IS_ENG || SystemProperties.getBoolean("persist.sysui.strictmode", false); private static final Choreographer sChoreographer = Choreographer.getInstance(); private static final Handler sHandler = new Handler(); private static final ArrayList sPendingRunnables = new ArrayList<>(); + private static final Random sRandom = new Random(); private static Stack sBlockingIpcs = new Stack<>(); private static boolean sTemporarilyIgnoreStrictMode; private static final HashSet sWhitelistedFrameworkClasses = new HashSet<>(); @@ -254,4 +260,30 @@ public class DejankUtils { public static void setImmediate(boolean immediate) { sImmediate = immediate; } + + /** + * Calls notifyRendererOfExpensiveFrame on the ViewRootImpl after performing null checks. + */ + public static void notifyRendererOfExpensiveFrame(View view, String reason) { + if (view == null) return; + notifyRendererOfExpensiveFrame(view.getViewRootImpl(), reason); + } + + /** + * Calls notifyRendererOfExpensiveFrame on the ViewRootImpl after performing null checks. + */ + public static void notifyRendererOfExpensiveFrame(ViewRootImpl viewRoot, String reason) { + if (viewRoot == null) return; + if (Trace.isTagEnabled(Trace.TRACE_TAG_APP)) { + int cookie = sRandom.nextInt(); + Trace.asyncTraceForTrackBegin( + Trace.TRACE_TAG_APP, + TRACK_NAME, + "notifyRendererOfExpensiveFrame (" + reason + ")", + cookie); + DejankUtils.postAfterTraversal( + () -> Trace.asyncTraceForTrackEnd(Trace.TRACE_TAG_APP, TRACK_NAME, cookie)); + } + viewRoot.notifyRendererOfExpensiveFrame(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 047fea123dc39..ca8369950e4be 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -222,6 +222,8 @@ import com.android.systemui.util.Utils; import com.android.systemui.util.time.SystemClock; import com.android.wm.shell.animation.FlingAnimationUtils; +import kotlin.Unit; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; @@ -232,7 +234,6 @@ import java.util.function.Consumer; import javax.inject.Inject; import javax.inject.Provider; -import kotlin.Unit; import kotlinx.coroutines.CoroutineDispatcher; @CentralSurfacesComponent.CentralSurfacesScope @@ -3450,6 +3451,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @VisibleForTesting void notifyExpandingStarted() { if (!mExpanding) { + DejankUtils.notifyRendererOfExpensiveFrame(mView, "notifyExpandingStarted"); mExpanding = true; mIsExpandingOrCollapsing = true; mQsController.onExpandingStarted(mQsController.getFullyExpanded()); diff --git a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java index c42c2f4fa15ab..6480164cdaf55 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java @@ -63,6 +63,7 @@ import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.policy.SystemBarUtils; import com.android.keyguard.FaceAuthApiRequestReason; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.systemui.DejankUtils; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.classifier.Classifier; @@ -958,6 +959,7 @@ public class QuickSettingsController implements Dumpable { // TODO (b/265193930): remove dependency on NPVC mPanelViewControllerLazy.get().cancelHeightAnimator(); // end + DejankUtils.notifyRendererOfExpensiveFrame(mPanelView, "onExpansionStarted"); // Reset scroll position and apply that position to the expanded height. float height = mExpansionHeight; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt index b6970aef6cad2..39d213d46c9a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BlurUtils.kt @@ -83,7 +83,8 @@ open class BlurUtils @Inject constructor( return } if (lastAppliedBlur == 0 && radius != 0) { - Trace.asyncTraceForTrackBegin(TRACE_TAG_APP, TRACK_NAME, EARLY_WAKEUP_SLICE_NAME, 0) + Trace.asyncTraceForTrackBegin( + TRACE_TAG_APP, TRACK_NAME, "eEarlyWakeup (prepareBlur)", 0) earlyWakeupEnabled = true createTransaction().use { it.setEarlyWakeupStart() @@ -110,7 +111,7 @@ open class BlurUtils @Inject constructor( Trace.asyncTraceForTrackBegin( TRACE_TAG_APP, TRACK_NAME, - EARLY_WAKEUP_SLICE_NAME, + "eEarlyWakeup (applyBlur)", 0 ) it.setEarlyWakeupStart() @@ -159,6 +160,5 @@ open class BlurUtils @Inject constructor( companion object { const val TRACK_NAME = "BlurUtils" - const val EARLY_WAKEUP_SLICE_NAME = "eEarlyWakeup" } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index 0402d4f882050..096f73f80165d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -3677,7 +3677,10 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private void onShadeVisibilityChanged(boolean visible) { if (mVisible != visible) { mVisible = visible; - if (!visible) { + if (visible) { + DejankUtils.notifyRendererOfExpensiveFrame( + mNotificationShadeWindowView, "onShadeVisibilityChanged"); + } else { mGutsManager.closeAndSaveGuts(true /* removeLeavebehind */, true /* force */, true /* removeControls */, -1 /* x */, -1 /* y */, true /* resetMenu */); }