summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/SurfaceControl.java7
-rw-r--r--core/java/com/android/internal/jank/FrameTracker.java5
-rw-r--r--core/jni/android_view_SurfaceControl.cpp20
-rw-r--r--core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java8
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();
}
}