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