Add log session id to MediaParser

Bug: 167036690
Test: atest CtsMediaParserHostTestCases
Change-Id: Idee9c7248ee6107379c8e58410346b8c92d3c250
Merged-In: Idee9c7248ee6107379c8e58410346b8c92d3c250
diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp
index 7020f18..1bf732b 100644
--- a/apex/media/framework/Android.bp
+++ b/apex/media/framework/Android.bp
@@ -41,7 +41,10 @@
     installable: true,
 
     sdk_version: "module_current",
-    libs: ["framework-annotations-lib"],
+    libs: [
+        "androidx.annotation_annotation",
+        "framework-annotations-lib",
+    ],
     static_libs: [
         "exoplayer2-extractor",
         "mediatranscoding_aidl_interface-java",
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java
index cff422d..8cc3bc0 100644
--- a/apex/media/framework/java/android/media/MediaParser.java
+++ b/apex/media/framework/java/android/media/MediaParser.java
@@ -28,6 +28,10 @@
 import android.util.Pair;
 import android.util.SparseArray;
 
+import androidx.annotation.RequiresApi;
+
+import com.android.modules.utils.build.SdkLevel;
+
 import com.google.android.exoplayer2.C;
 import com.google.android.exoplayer2.Format;
 import com.google.android.exoplayer2.ParserException;
@@ -1068,7 +1072,7 @@
     private boolean mReleased;
 
     // MediaMetrics fields.
-    @NonNull private LogSessionId mLogSessionId = LogSessionId.LOG_SESSION_ID_NONE;
+    @Nullable private LogSessionId mLogSessionId;
     private final boolean mCreatedByName;
     private final SparseArray<Format> mTrackFormats;
     private String mLastObservedExceptionName;
@@ -1331,7 +1335,7 @@
                                 MEDIAMETRICS_PARAMETER_LIST_MAX_LENGTH));
 
         nativeSubmitMetrics(
-                // TODO: mLogSessionId,
+                SdkLevel.isAtLeastS() ? getLogSessionIdStringV31() : "",
                 mParserName,
                 mCreatedByName,
                 String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool),
@@ -1345,13 +1349,15 @@
                 videoHeight);
     }
 
-    public void setLogSessionId(@NonNull LogSessionId sessionId) {
-        this.mLogSessionId = Objects.requireNonNull(sessionId);
+    @RequiresApi(31)
+    public void setLogSessionId(@NonNull LogSessionId logSessionId) {
+        this.mLogSessionId = Objects.requireNonNull(logSessionId);
     }
 
+    @RequiresApi(31)
     @NonNull
     public LogSessionId getLogSessionId() {
-        return mLogSessionId;
+        return mLogSessionId != null ? mLogSessionId : LogSessionId.LOG_SESSION_ID_NONE;
     }
 
     // Private methods.
@@ -1548,6 +1554,11 @@
         return (String) mParserParameters.getOrDefault(name, defaultValue);
     }
 
+    @RequiresApi(31)
+    private String getLogSessionIdStringV31() {
+        return mLogSessionId != null ? mLogSessionId.getStringId() : "";
+    }
+
     // Private classes.
 
     private static final class InputReadingDataReader implements DataReader {
@@ -2197,7 +2208,7 @@
     // Native methods.
 
     private native void nativeSubmitMetrics(
-            // TODO: String logSessionId,
+            String logSessionId,
             String parserName,
             boolean createdByName,
             String parserPool,
diff --git a/apex/media/framework/jni/android_media_MediaParserJNI.cpp b/apex/media/framework/jni/android_media_MediaParserJNI.cpp
index 7fc4628..c81152c 100644
--- a/apex/media/framework/jni/android_media_MediaParserJNI.cpp
+++ b/apex/media/framework/jni/android_media_MediaParserJNI.cpp
@@ -29,6 +29,7 @@
 
 constexpr char kMediaMetricsKey[] = "mediaparser";
 
+constexpr char kAttributeLogSessionId[] = "android.media.mediaparser.logSessionId";
 constexpr char kAttributeParserName[] = "android.media.mediaparser.parserName";
 constexpr char kAttributeCreatedByName[] = "android.media.mediaparser.createdByName";
 constexpr char kAttributeParserPool[] = "android.media.mediaparser.parserPool";
@@ -65,11 +66,14 @@
 
 } // namespace
 
-JNI_FUNCTION(void, nativeSubmitMetrics, jstring parserNameJstring, jboolean createdByName,
-             jstring parserPoolJstring, jstring lastExceptionJstring, jlong resourceByteCount,
-             jlong durationMillis, jstring trackMimeTypesJstring, jstring trackCodecsJstring,
-             jstring alteredParameters, jint videoWidth, jint videoHeight) {
+JNI_FUNCTION(void, nativeSubmitMetrics, jstring logSessionIdJstring, jstring parserNameJstring,
+             jboolean createdByName, jstring parserPoolJstring, jstring lastExceptionJstring,
+             jlong resourceByteCount, jlong durationMillis, jstring trackMimeTypesJstring,
+             jstring trackCodecsJstring, jstring alteredParameters, jint videoWidth,
+             jint videoHeight) {
     mediametrics_handle_t item(mediametrics_create(kMediaMetricsKey));
+    mediametrics_setCString(item, kAttributeLogSessionId,
+                            JstringHandle(env, logSessionIdJstring).value());
     mediametrics_setCString(item, kAttributeParserName,
                             JstringHandle(env, parserNameJstring).value());
     mediametrics_setInt32(item, kAttributeCreatedByName, createdByName ? 1 : 0);