diff options
4 files changed, 28 insertions, 12 deletions
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 0d5554484dc1..00d1570df799 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -87,6 +87,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -463,7 +464,7 @@ public final class SurfaceControl implements Parcelable { /** * Called when new jank classifications are available. */ - void onJankDataAvailable(JankData[] jankData); + void onJankDataAvailable(@NonNull List<JankData> jankData); } @@ -2686,7 +2687,9 @@ public final class SurfaceControl implements Parcelable { * Adds a callback to be informed about SF's jank classification for this surface. * @hide */ - public OnJankDataListenerRegistration addJankDataListener(OnJankDataListener listener) { + @NonNull + public OnJankDataListenerRegistration addOnJankDataListener( + @NonNull OnJankDataListener listener) { return new OnJankDataListenerRegistration(this, listener); } diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 0af4bea70e65..44c0bd01d545 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -54,6 +54,7 @@ import com.android.internal.util.FrameworkStatsLog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -448,7 +449,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai } @Override - public void onJankDataAvailable(SurfaceControl.JankData[] jankData) { + public void onJankDataAvailable(List<SurfaceControl.JankData> jankData) { postCallback(() -> { try { Trace.beginSection("FrameTracker#onJankDataAvailable"); @@ -832,7 +833,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai /** adds the jank listener to the given surface */ public SurfaceControl.OnJankDataListenerRegistration addJankStatsListener( SurfaceControl.OnJankDataListener listener, SurfaceControl surfaceControl) { - return surfaceControl.addJankDataListener(listener); + return surfaceControl.addOnJankDataListener(listener); } } diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 7fefe1755fa9..df87a69f02ce 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -298,6 +298,11 @@ static struct { jmethodID ctor; } gFrameRateCategoryRateClassInfo; +static struct { + jclass clazz; + jmethodID asList; +} gUtilArrays; + constexpr ui::Dataspace pickDataspaceFromColorMode(const ui::ColorMode colorMode) { switch (colorMode) { case ui::ColorMode::DISPLAY_P3: @@ -2206,10 +2211,13 @@ public: env->SetObjectArrayElement(jJankDataArray, i, jJankData); env->DeleteLocalRef(jJankData); } - env->CallVoidMethod(target, - gJankDataListenerClassInfo.onJankDataAvailable, - jJankDataArray); + + jobject jJankDataList = + env->CallStaticObjectMethod(gUtilArrays.clazz, gUtilArrays.asList, jJankDataArray); env->DeleteLocalRef(jJankDataArray); + + env->CallVoidMethod(target, gJankDataListenerClassInfo.onJankDataAvailable, jJankDataList); + env->DeleteLocalRef(jJankDataList); env->DeleteLocalRef(target); return true; @@ -2858,7 +2866,7 @@ int register_android_view_SurfaceControl(JNIEnv* env) gJankDataListenerClassInfo.clazz = MakeGlobalRefOrDie(env, onJankDataListenerClazz); gJankDataListenerClassInfo.onJankDataAvailable = GetMethodIDOrDie(env, onJankDataListenerClazz, "onJankDataAvailable", - "([Landroid/view/SurfaceControl$JankData;)V"); + "(Ljava/util/List;)V"); jclass transactionCommittedListenerClazz = FindClassOrDie(env, "android/view/SurfaceControl$TransactionCommittedListener"); @@ -2933,6 +2941,10 @@ int register_android_view_SurfaceControl(JNIEnv* env) gStalledTransactionInfoClassInfo.frameNumber = GetFieldIDOrDie(env, stalledTransactionInfoClazz, "frameNumber", "J"); + jclass utilArrays = FindClassOrDie(env, "java/util/Arrays"); + gUtilArrays.clazz = MakeGlobalRefOrDie(env, utilArrays); + gUtilArrays.asList = GetStaticMethodIDOrDie(env, utilArrays, "asList", + "([Ljava/lang/Object;)Ljava/util/List;"); return err; } diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java index 60b5a422ea80..e7a6cb7291c5 100644 --- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java @@ -67,6 +67,7 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import java.util.Arrays; import java.util.concurrent.TimeUnit; @SmallTest @@ -690,10 +691,9 @@ public class FrameTrackerTest { FrameTracker tracker, long durationMillis, long vsyncId, @JankType int jankType) { final ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class); doNothing().when(tracker).postCallback(captor.capture()); - mListenerCapture.getValue().onJankDataAvailable(new JankData[] { - new JankData(vsyncId, jankType, FRAME_TIME_60Hz, FRAME_TIME_60Hz, - TimeUnit.MILLISECONDS.toNanos(durationMillis)) - }); + mListenerCapture.getValue().onJankDataAvailable(Arrays.asList(new JankData( + vsyncId, jankType, FRAME_TIME_60Hz, FRAME_TIME_60Hz, + TimeUnit.MILLISECONDS.toNanos(durationMillis)))); captor.getValue().run(); } } |