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.
4
5 #include "base/android/feature_map.h"
6
7 #include <jni.h>
8 #include <stddef.h>
9
10 #include <memory>
11 #include <string>
12 #include <string_view>
13
14 #include "base/base_jni/FeatureMap_jni.h"
15 #include "base/metrics/field_trial_params.h"
16 #include "base/notreached.h"
17
18 namespace base::android {
19
MakeNameToFeaturePair(const Feature * feature)20 std::pair<std::string_view, const Feature*> MakeNameToFeaturePair(
21 const Feature* feature) {
22 return std::make_pair(feature->name, feature);
23 }
24
FeatureMap(std::vector<const Feature * > features_exposed_to_java)25 FeatureMap::FeatureMap(std::vector<const Feature*> features_exposed_to_java) {
26 mapping_ = MakeFlatMap<std::string_view, const Feature*>(
27 features_exposed_to_java, {}, &MakeNameToFeaturePair);
28 }
29
30 FeatureMap::~FeatureMap() = default;
31
FindFeatureExposedToJava(const std::string & feature_name)32 const Feature* FeatureMap::FindFeatureExposedToJava(
33 const std::string& feature_name) {
34 auto it = mapping_.find(feature_name);
35 if (it != mapping_.end()) {
36 return it->second;
37 }
38
39 NOTREACHED_NORETURN() << "Queried feature cannot be found in FeatureMap: "
40 << feature_name;
41 }
42
JNI_FeatureMap_IsEnabled(JNIEnv * env,jlong jfeature_map,std::string & feature_name)43 static jboolean JNI_FeatureMap_IsEnabled(JNIEnv* env,
44 jlong jfeature_map,
45 std::string& feature_name) {
46 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
47 const base::Feature* feature =
48 feature_map->FindFeatureExposedToJava(feature_name);
49 return base::FeatureList::IsEnabled(*feature);
50 }
51
JNI_FeatureMap_GetFieldTrialParamByFeature(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name)52 static std::string JNI_FeatureMap_GetFieldTrialParamByFeature(
53 JNIEnv* env,
54 jlong jfeature_map,
55 std::string& feature_name,
56 std::string& param_name) {
57 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
58 const base::Feature* feature =
59 feature_map->FindFeatureExposedToJava(feature_name);
60 return base::GetFieldTrialParamValueByFeature(*feature, param_name);
61 }
62
JNI_FeatureMap_GetFieldTrialParamByFeatureAsInt(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name,const jint jdefault_value)63 static jint JNI_FeatureMap_GetFieldTrialParamByFeatureAsInt(
64 JNIEnv* env,
65 jlong jfeature_map,
66 std::string& feature_name,
67 std::string& param_name,
68 const jint jdefault_value) {
69 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
70 const base::Feature* feature =
71 feature_map->FindFeatureExposedToJava(feature_name);
72 return base::GetFieldTrialParamByFeatureAsInt(*feature, param_name,
73 jdefault_value);
74 }
75
JNI_FeatureMap_GetFieldTrialParamByFeatureAsDouble(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name,const jdouble jdefault_value)76 static jdouble JNI_FeatureMap_GetFieldTrialParamByFeatureAsDouble(
77 JNIEnv* env,
78 jlong jfeature_map,
79 std::string& feature_name,
80 std::string& param_name,
81 const jdouble jdefault_value) {
82 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
83 const base::Feature* feature =
84 feature_map->FindFeatureExposedToJava(feature_name);
85 return base::GetFieldTrialParamByFeatureAsDouble(*feature, param_name,
86 jdefault_value);
87 }
88
JNI_FeatureMap_GetFieldTrialParamByFeatureAsBoolean(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name,const jboolean jdefault_value)89 static jboolean JNI_FeatureMap_GetFieldTrialParamByFeatureAsBoolean(
90 JNIEnv* env,
91 jlong jfeature_map,
92 std::string& feature_name,
93 std::string& param_name,
94 const jboolean jdefault_value) {
95 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
96 const base::Feature* feature =
97 feature_map->FindFeatureExposedToJava(feature_name);
98 return base::GetFieldTrialParamByFeatureAsBool(*feature, param_name,
99 jdefault_value);
100 }
101
JNI_FeatureMap_GetFlattedFieldTrialParamsForFeature(JNIEnv * env,jlong jfeature_map,std::string & feature_name)102 std::vector<std::string> JNI_FeatureMap_GetFlattedFieldTrialParamsForFeature(
103 JNIEnv* env,
104 jlong jfeature_map,
105 std::string& feature_name) {
106 FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
107 base::FieldTrialParams params;
108 std::vector<std::string> keys_and_values;
109 const base::Feature* feature =
110 feature_map->FindFeatureExposedToJava(feature_name);
111 if (feature && base::GetFieldTrialParamsByFeature(*feature, ¶ms)) {
112 for (const auto& param_pair : params) {
113 keys_and_values.push_back(param_pair.first);
114 keys_and_values.push_back(param_pair.second);
115 }
116 }
117 return keys_and_values;
118 }
119
120 } // namespace base::android
121