xref: /aosp_15_r20/external/webrtc/sdk/android/src/jni/pc/stats_observer.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2017 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "sdk/android/src/jni/pc/stats_observer.h"
12 
13 #include <vector>
14 
15 #include "sdk/android/generated_peerconnection_jni/StatsObserver_jni.h"
16 #include "sdk/android/generated_peerconnection_jni/StatsReport_jni.h"
17 #include "sdk/android/native_api/jni/java_types.h"
18 #include "sdk/android/src/jni/jni_helpers.h"
19 
20 namespace webrtc {
21 namespace jni {
22 
23 namespace {
24 
NativeToJavaStatsReportValue(JNIEnv * env,const rtc::scoped_refptr<StatsReport::Value> & value_ptr)25 ScopedJavaLocalRef<jobject> NativeToJavaStatsReportValue(
26     JNIEnv* env,
27     const rtc::scoped_refptr<StatsReport::Value>& value_ptr) {
28   // Should we use the '.name' enum value here instead of converting the
29   // name to a string?
30   return Java_Value_Constructor(
31       env, NativeToJavaString(env, value_ptr->display_name()),
32       NativeToJavaString(env, value_ptr->ToString()));
33 }
34 
NativeToJavaStatsReportValueArray(JNIEnv * env,const StatsReport::Values & value_map)35 ScopedJavaLocalRef<jobjectArray> NativeToJavaStatsReportValueArray(
36     JNIEnv* env,
37     const StatsReport::Values& value_map) {
38   // Ignore the keys and make an array out of the values.
39   std::vector<StatsReport::ValuePtr> values;
40   for (const auto& it : value_map)
41     values.push_back(it.second);
42   return NativeToJavaObjectArray(env, values,
43                                  org_webrtc_StatsReport_00024Value_clazz(env),
44                                  &NativeToJavaStatsReportValue);
45 }
46 
NativeToJavaStatsReport(JNIEnv * env,const StatsReport & report)47 ScopedJavaLocalRef<jobject> NativeToJavaStatsReport(JNIEnv* env,
48                                                     const StatsReport& report) {
49   return Java_StatsReport_Constructor(
50       env, NativeToJavaString(env, report.id()->ToString()),
51       NativeToJavaString(env, report.TypeToString()), report.timestamp(),
52       NativeToJavaStatsReportValueArray(env, report.values()));
53 }
54 
55 }  // namespace
56 
StatsObserverJni(JNIEnv * jni,const JavaRef<jobject> & j_observer)57 StatsObserverJni::StatsObserverJni(JNIEnv* jni,
58                                    const JavaRef<jobject>& j_observer)
59     : j_observer_global_(jni, j_observer) {}
60 
61 StatsObserverJni::~StatsObserverJni() = default;
62 
OnComplete(const StatsReports & reports)63 void StatsObserverJni::OnComplete(const StatsReports& reports) {
64   JNIEnv* env = AttachCurrentThreadIfNeeded();
65   ScopedJavaLocalRef<jobjectArray> j_reports =
66       NativeToJavaObjectArray(env, reports, org_webrtc_StatsReport_clazz(env),
67                               [](JNIEnv* env, const StatsReport* report) {
68                                 return NativeToJavaStatsReport(env, *report);
69                               });
70   Java_StatsObserver_onComplete(env, j_observer_global_, j_reports);
71 }
72 
73 }  // namespace jni
74 }  // namespace webrtc
75