1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/android/feature_map.h"
13 #include "base/android/jni_array.h"
14 #include "base/android/jni_string.h"
15 #include "base/base_jni/FeatureMap_jni.h"
16 #include "base/metrics/field_trial_params.h"
17 #include "base/notreached.h"
19 namespace base::android {
21 std::pair<StringPiece, const Feature*> MakeNameToFeaturePair(
22 const Feature* feature) {
23 return std::make_pair(feature->name, feature);
26 FeatureMap::FeatureMap(std::vector<const Feature*> features_exposed_to_java) {
27 mapping_ = MakeFlatMap<StringPiece, const Feature*>(
28 features_exposed_to_java, {}, &MakeNameToFeaturePair);
31 FeatureMap::~FeatureMap() = default;
33 const Feature* FeatureMap::FindFeatureExposedToJava(
34 const StringPiece& feature_name) {
35 auto it = mapping_.find(feature_name);
36 if (it != mapping_.end()) {
40 NOTREACHED_NORETURN() << "Queried feature cannot be found in FeatureMap: "
44 static jboolean JNI_FeatureMap_IsEnabled(
47 const android::JavaParamRef<jstring>& jfeature_name) {
48 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
49 const base::Feature* feature = feature_map->FindFeatureExposedToJava(
50 StringPiece(ConvertJavaStringToUTF8(env, jfeature_name)));
51 return base::FeatureList::IsEnabled(*feature);
54 static ScopedJavaLocalRef<jstring> JNI_FeatureMap_GetFieldTrialParamByFeature(
57 const JavaParamRef<jstring>& jfeature_name,
58 const JavaParamRef<jstring>& jparam_name) {
59 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
60 const base::Feature* feature = feature_map->FindFeatureExposedToJava(
61 StringPiece(ConvertJavaStringToUTF8(env, jfeature_name)));
62 const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
63 const std::string& param_value =
64 base::GetFieldTrialParamValueByFeature(*feature, param_name);
65 return ConvertUTF8ToJavaString(env, param_value);
68 static jint JNI_FeatureMap_GetFieldTrialParamByFeatureAsInt(
71 const JavaParamRef<jstring>& jfeature_name,
72 const JavaParamRef<jstring>& jparam_name,
73 const jint jdefault_value) {
74 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
75 const base::Feature* feature = feature_map->FindFeatureExposedToJava(
76 StringPiece(ConvertJavaStringToUTF8(env, jfeature_name)));
77 const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
78 return base::GetFieldTrialParamByFeatureAsInt(*feature, param_name,
82 static jdouble JNI_FeatureMap_GetFieldTrialParamByFeatureAsDouble(
85 const JavaParamRef<jstring>& jfeature_name,
86 const JavaParamRef<jstring>& jparam_name,
87 const jdouble jdefault_value) {
88 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
89 const base::Feature* feature = feature_map->FindFeatureExposedToJava(
90 StringPiece(ConvertJavaStringToUTF8(env, jfeature_name)));
91 const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
92 return base::GetFieldTrialParamByFeatureAsDouble(*feature, param_name,
96 static jboolean JNI_FeatureMap_GetFieldTrialParamByFeatureAsBoolean(
99 const JavaParamRef<jstring>& jfeature_name,
100 const JavaParamRef<jstring>& jparam_name,
101 const jboolean jdefault_value) {
102 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
103 const base::Feature* feature = feature_map->FindFeatureExposedToJava(
104 StringPiece(ConvertJavaStringToUTF8(env, jfeature_name)));
105 const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
106 return base::GetFieldTrialParamByFeatureAsBool(*feature, param_name,
110 static ScopedJavaLocalRef<jobjectArray>
111 JNI_FeatureMap_GetFlattedFieldTrialParamsForFeature(
114 const JavaParamRef<jstring>& jfeature_name) {
115 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
116 base::FieldTrialParams params;
117 std::vector<std::string> keys_and_values;
118 const base::Feature* feature = feature_map->FindFeatureExposedToJava(
119 StringPiece(ConvertJavaStringToUTF8(env, jfeature_name)));
120 if (feature && base::GetFieldTrialParamsByFeature(*feature, ¶ms)) {
121 for (const auto& param_pair : params) {
122 keys_and_values.push_back(param_pair.first);
123 keys_and_values.push_back(param_pair.second);
126 return base::android::ToJavaArrayOfStrings(env, keys_and_values);
129 } // namespace base::android