xref: /aosp_15_r20/external/libtextclassifier/native/utils/intents/jni.cc (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker  *
4*993b0882SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker  *
8*993b0882SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker  *
10*993b0882SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker  * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker  */
16*993b0882SAndroid Build Coastguard Worker 
17*993b0882SAndroid Build Coastguard Worker #include "utils/intents/jni.h"
18*993b0882SAndroid Build Coastguard Worker 
19*993b0882SAndroid Build Coastguard Worker #include <memory>
20*993b0882SAndroid Build Coastguard Worker 
21*993b0882SAndroid Build Coastguard Worker #include "utils/base/status_macros.h"
22*993b0882SAndroid Build Coastguard Worker #include "utils/base/statusor.h"
23*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-base.h"
24*993b0882SAndroid Build Coastguard Worker #include "utils/java/jni-helper.h"
25*993b0882SAndroid Build Coastguard Worker 
26*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
27*993b0882SAndroid Build Coastguard Worker 
28*993b0882SAndroid Build Coastguard Worker // The macros below are intended to reduce the boilerplate and avoid
29*993b0882SAndroid Build Coastguard Worker // easily introduced copy/paste errors.
30*993b0882SAndroid Build Coastguard Worker #define TC3_CHECK_JNI_PTR(PTR) TC3_CHECK((PTR) != nullptr)
31*993b0882SAndroid Build Coastguard Worker #define TC3_GET_CLASS(FIELD, NAME)                                        \
32*993b0882SAndroid Build Coastguard Worker   {                                                                       \
33*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jclass> clazz,                    \
34*993b0882SAndroid Build Coastguard Worker                          JniHelper::FindClass(env, NAME));                \
35*993b0882SAndroid Build Coastguard Worker     handler->FIELD = MakeGlobalRef(clazz.release(), env, jni_cache->jvm); \
36*993b0882SAndroid Build Coastguard Worker     TC3_CHECK_JNI_PTR(handler->FIELD) << "Error finding class: " << NAME; \
37*993b0882SAndroid Build Coastguard Worker   }
38*993b0882SAndroid Build Coastguard Worker #define TC3_GET_METHOD(CLASS, FIELD, NAME, SIGNATURE) \
39*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(                               \
40*993b0882SAndroid Build Coastguard Worker       handler->FIELD,                                 \
41*993b0882SAndroid Build Coastguard Worker       JniHelper::GetMethodID(env, handler->CLASS.get(), NAME, SIGNATURE));
42*993b0882SAndroid Build Coastguard Worker 
43*993b0882SAndroid Build Coastguard Worker StatusOr<std::unique_ptr<RemoteActionTemplatesHandler>>
Create(const std::shared_ptr<JniCache> & jni_cache)44*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler::Create(
45*993b0882SAndroid Build Coastguard Worker     const std::shared_ptr<JniCache>& jni_cache) {
46*993b0882SAndroid Build Coastguard Worker   JNIEnv* env = jni_cache->GetEnv();
47*993b0882SAndroid Build Coastguard Worker   if (env == nullptr) {
48*993b0882SAndroid Build Coastguard Worker     return nullptr;
49*993b0882SAndroid Build Coastguard Worker   }
50*993b0882SAndroid Build Coastguard Worker 
51*993b0882SAndroid Build Coastguard Worker   std::unique_ptr<RemoteActionTemplatesHandler> handler(
52*993b0882SAndroid Build Coastguard Worker       new RemoteActionTemplatesHandler(jni_cache));
53*993b0882SAndroid Build Coastguard Worker 
54*993b0882SAndroid Build Coastguard Worker   TC3_GET_CLASS(integer_class_, "java/lang/Integer");
55*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(integer_class_, integer_init_, "<init>", "(I)V");
56*993b0882SAndroid Build Coastguard Worker 
57*993b0882SAndroid Build Coastguard Worker   TC3_GET_CLASS(remote_action_template_class_,
58*993b0882SAndroid Build Coastguard Worker                 TC3_PACKAGE_PATH TC3_REMOTE_ACTION_TEMPLATE_CLASS_NAME_STR);
59*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(
60*993b0882SAndroid Build Coastguard Worker       remote_action_template_class_, remote_action_template_init_, "<init>",
61*993b0882SAndroid Build Coastguard Worker       "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/"
62*993b0882SAndroid Build Coastguard Worker       "String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/"
63*993b0882SAndroid Build Coastguard Worker       "Integer;[Ljava/lang/String;Ljava/lang/String;[L" TC3_PACKAGE_PATH
64*993b0882SAndroid Build Coastguard Worker           TC3_NAMED_VARIANT_CLASS_NAME_STR ";Ljava/lang/Integer;)V");
65*993b0882SAndroid Build Coastguard Worker 
66*993b0882SAndroid Build Coastguard Worker   TC3_GET_CLASS(named_variant_class_,
67*993b0882SAndroid Build Coastguard Worker                 TC3_PACKAGE_PATH TC3_NAMED_VARIANT_CLASS_NAME_STR);
68*993b0882SAndroid Build Coastguard Worker 
69*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_int_, "<init>",
70*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;I)V");
71*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_long_, "<init>",
72*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;J)V");
73*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_float_, "<init>",
74*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;F)V");
75*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_double_, "<init>",
76*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;D)V");
77*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_bool_, "<init>",
78*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;Z)V");
79*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_string_, "<init>",
80*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;Ljava/lang/String;)V");
81*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_string_array_,
82*993b0882SAndroid Build Coastguard Worker                  "<init>", "(Ljava/lang/String;[Ljava/lang/String;)V");
83*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_float_array_,
84*993b0882SAndroid Build Coastguard Worker                  "<init>", "(Ljava/lang/String;[F)V");
85*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(named_variant_class_, named_variant_from_int_array_, "<init>",
86*993b0882SAndroid Build Coastguard Worker                  "(Ljava/lang/String;[I)V");
87*993b0882SAndroid Build Coastguard Worker   TC3_GET_METHOD(
88*993b0882SAndroid Build Coastguard Worker       named_variant_class_, named_variant_from_named_variant_array_, "<init>",
89*993b0882SAndroid Build Coastguard Worker       "(Ljava/lang/String;[L" TC3_PACKAGE_PATH TC3_NAMED_VARIANT_CLASS_NAME_STR
90*993b0882SAndroid Build Coastguard Worker       ";)V");
91*993b0882SAndroid Build Coastguard Worker   return handler;
92*993b0882SAndroid Build Coastguard Worker }
93*993b0882SAndroid Build Coastguard Worker 
AsUTF8String(const Optional<std::string> & optional) const94*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jstring>> RemoteActionTemplatesHandler::AsUTF8String(
95*993b0882SAndroid Build Coastguard Worker     const Optional<std::string>& optional) const {
96*993b0882SAndroid Build Coastguard Worker   if (!optional.has_value()) {
97*993b0882SAndroid Build Coastguard Worker     return {{nullptr, jni_cache_->GetEnv()}};
98*993b0882SAndroid Build Coastguard Worker   }
99*993b0882SAndroid Build Coastguard Worker   return jni_cache_->ConvertToJavaString(optional.value());
100*993b0882SAndroid Build Coastguard Worker }
101*993b0882SAndroid Build Coastguard Worker 
AsInteger(const Optional<int> & optional) const102*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobject>> RemoteActionTemplatesHandler::AsInteger(
103*993b0882SAndroid Build Coastguard Worker     const Optional<int>& optional) const {
104*993b0882SAndroid Build Coastguard Worker   if (!optional.has_value()) {
105*993b0882SAndroid Build Coastguard Worker     return {{nullptr, jni_cache_->GetEnv()}};
106*993b0882SAndroid Build Coastguard Worker   }
107*993b0882SAndroid Build Coastguard Worker 
108*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
109*993b0882SAndroid Build Coastguard Worker       ScopedLocalRef<jobject> result,
110*993b0882SAndroid Build Coastguard Worker       JniHelper::NewObject(jni_cache_->GetEnv(), integer_class_.get(),
111*993b0882SAndroid Build Coastguard Worker                            integer_init_, optional.value()));
112*993b0882SAndroid Build Coastguard Worker 
113*993b0882SAndroid Build Coastguard Worker   return result;
114*993b0882SAndroid Build Coastguard Worker }
115*993b0882SAndroid Build Coastguard Worker 
116*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobjectArray>>
AsStringArray(const std::vector<std::string> & values) const117*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler::AsStringArray(
118*993b0882SAndroid Build Coastguard Worker     const std::vector<std::string>& values) const {
119*993b0882SAndroid Build Coastguard Worker   if (values.empty()) {
120*993b0882SAndroid Build Coastguard Worker     return {{nullptr, jni_cache_->GetEnv()}};
121*993b0882SAndroid Build Coastguard Worker   }
122*993b0882SAndroid Build Coastguard Worker 
123*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
124*993b0882SAndroid Build Coastguard Worker       ScopedLocalRef<jobjectArray> result,
125*993b0882SAndroid Build Coastguard Worker       JniHelper::NewObjectArray(jni_cache_->GetEnv(), values.size(),
126*993b0882SAndroid Build Coastguard Worker                                 jni_cache_->string_class.get(), nullptr));
127*993b0882SAndroid Build Coastguard Worker 
128*993b0882SAndroid Build Coastguard Worker   for (int k = 0; k < values.size(); k++) {
129*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> value_str,
130*993b0882SAndroid Build Coastguard Worker                          jni_cache_->ConvertToJavaString(values[k]));
131*993b0882SAndroid Build Coastguard Worker     TC3_RETURN_IF_ERROR(JniHelper::SetObjectArrayElement(
132*993b0882SAndroid Build Coastguard Worker         jni_cache_->GetEnv(), result.get(), k, value_str.get()));
133*993b0882SAndroid Build Coastguard Worker   }
134*993b0882SAndroid Build Coastguard Worker   return result;
135*993b0882SAndroid Build Coastguard Worker }
136*993b0882SAndroid Build Coastguard Worker 
137*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jfloatArray>>
AsFloatArray(const std::vector<float> & values) const138*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler::AsFloatArray(
139*993b0882SAndroid Build Coastguard Worker     const std::vector<float>& values) const {
140*993b0882SAndroid Build Coastguard Worker   if (values.empty()) {
141*993b0882SAndroid Build Coastguard Worker     return {{nullptr, jni_cache_->GetEnv()}};
142*993b0882SAndroid Build Coastguard Worker   }
143*993b0882SAndroid Build Coastguard Worker 
144*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
145*993b0882SAndroid Build Coastguard Worker       ScopedLocalRef<jfloatArray> result,
146*993b0882SAndroid Build Coastguard Worker       JniHelper::NewFloatArray(jni_cache_->GetEnv(), values.size()));
147*993b0882SAndroid Build Coastguard Worker 
148*993b0882SAndroid Build Coastguard Worker   TC3_RETURN_IF_ERROR(JniHelper::SetFloatArrayRegion(
149*993b0882SAndroid Build Coastguard Worker       jni_cache_->GetEnv(), result.get(), /*start=*/0,
150*993b0882SAndroid Build Coastguard Worker       /*len=*/values.size(), &(values[0])));
151*993b0882SAndroid Build Coastguard Worker   return result;
152*993b0882SAndroid Build Coastguard Worker }
153*993b0882SAndroid Build Coastguard Worker 
AsIntArray(const std::vector<int> & values) const154*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jintArray>> RemoteActionTemplatesHandler::AsIntArray(
155*993b0882SAndroid Build Coastguard Worker     const std::vector<int>& values) const {
156*993b0882SAndroid Build Coastguard Worker   if (values.empty()) {
157*993b0882SAndroid Build Coastguard Worker     return {{nullptr, jni_cache_->GetEnv()}};
158*993b0882SAndroid Build Coastguard Worker   }
159*993b0882SAndroid Build Coastguard Worker 
160*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
161*993b0882SAndroid Build Coastguard Worker       ScopedLocalRef<jintArray> result,
162*993b0882SAndroid Build Coastguard Worker       JniHelper::NewIntArray(jni_cache_->GetEnv(), values.size()));
163*993b0882SAndroid Build Coastguard Worker 
164*993b0882SAndroid Build Coastguard Worker   TC3_RETURN_IF_ERROR(JniHelper::SetIntArrayRegion(
165*993b0882SAndroid Build Coastguard Worker       jni_cache_->GetEnv(), result.get(), /*start=*/0,
166*993b0882SAndroid Build Coastguard Worker       /*len=*/values.size(), &(values[0])));
167*993b0882SAndroid Build Coastguard Worker   return result;
168*993b0882SAndroid Build Coastguard Worker }
169*993b0882SAndroid Build Coastguard Worker 
AsNamedVariant(const std::string & name_str,const Variant & value) const170*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobject>> RemoteActionTemplatesHandler::AsNamedVariant(
171*993b0882SAndroid Build Coastguard Worker     const std::string& name_str, const Variant& value) const {
172*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jstring> name,
173*993b0882SAndroid Build Coastguard Worker                        jni_cache_->ConvertToJavaString(name_str));
174*993b0882SAndroid Build Coastguard Worker 
175*993b0882SAndroid Build Coastguard Worker   JNIEnv* env = jni_cache_->GetEnv();
176*993b0882SAndroid Build Coastguard Worker   switch (value.GetType()) {
177*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_INT_VALUE:
178*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
179*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_int_, name.get(),
180*993b0882SAndroid Build Coastguard Worker                                   value.Value<int>());
181*993b0882SAndroid Build Coastguard Worker 
182*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_INT64_VALUE:
183*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
184*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_long_, name.get(),
185*993b0882SAndroid Build Coastguard Worker                                   value.Value<int64>());
186*993b0882SAndroid Build Coastguard Worker 
187*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_FLOAT_VALUE:
188*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
189*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_float_, name.get(),
190*993b0882SAndroid Build Coastguard Worker                                   value.Value<float>());
191*993b0882SAndroid Build Coastguard Worker 
192*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_DOUBLE_VALUE:
193*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
194*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_double_, name.get(),
195*993b0882SAndroid Build Coastguard Worker                                   value.Value<double>());
196*993b0882SAndroid Build Coastguard Worker 
197*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_BOOL_VALUE:
198*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
199*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_bool_, name.get(),
200*993b0882SAndroid Build Coastguard Worker                                   value.Value<bool>());
201*993b0882SAndroid Build Coastguard Worker 
202*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_STRING_VALUE: {
203*993b0882SAndroid Build Coastguard Worker       TC3_ASSIGN_OR_RETURN(
204*993b0882SAndroid Build Coastguard Worker           ScopedLocalRef<jstring> value_jstring,
205*993b0882SAndroid Build Coastguard Worker           jni_cache_->ConvertToJavaString(value.ConstRefValue<std::string>()));
206*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
207*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_string_, name.get(),
208*993b0882SAndroid Build Coastguard Worker                                   value_jstring.get());
209*993b0882SAndroid Build Coastguard Worker     }
210*993b0882SAndroid Build Coastguard Worker 
211*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_STRING_VECTOR_VALUE: {
212*993b0882SAndroid Build Coastguard Worker       TC3_ASSIGN_OR_RETURN(
213*993b0882SAndroid Build Coastguard Worker           ScopedLocalRef<jobjectArray> value_jstring_array,
214*993b0882SAndroid Build Coastguard Worker           AsStringArray(value.ConstRefValue<std::vector<std::string>>()));
215*993b0882SAndroid Build Coastguard Worker 
216*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
217*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_string_array_, name.get(),
218*993b0882SAndroid Build Coastguard Worker                                   value_jstring_array.get());
219*993b0882SAndroid Build Coastguard Worker     }
220*993b0882SAndroid Build Coastguard Worker 
221*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_FLOAT_VECTOR_VALUE: {
222*993b0882SAndroid Build Coastguard Worker       TC3_ASSIGN_OR_RETURN(
223*993b0882SAndroid Build Coastguard Worker           ScopedLocalRef<jfloatArray> value_jfloat_array,
224*993b0882SAndroid Build Coastguard Worker           AsFloatArray(value.ConstRefValue<std::vector<float>>()));
225*993b0882SAndroid Build Coastguard Worker 
226*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
227*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_float_array_, name.get(),
228*993b0882SAndroid Build Coastguard Worker                                   value_jfloat_array.get());
229*993b0882SAndroid Build Coastguard Worker     }
230*993b0882SAndroid Build Coastguard Worker 
231*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_INT_VECTOR_VALUE: {
232*993b0882SAndroid Build Coastguard Worker       TC3_ASSIGN_OR_RETURN(ScopedLocalRef<jintArray> value_jint_array,
233*993b0882SAndroid Build Coastguard Worker                            AsIntArray(value.ConstRefValue<std::vector<int>>()));
234*993b0882SAndroid Build Coastguard Worker 
235*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
236*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_int_array_, name.get(),
237*993b0882SAndroid Build Coastguard Worker                                   value_jint_array.get());
238*993b0882SAndroid Build Coastguard Worker     }
239*993b0882SAndroid Build Coastguard Worker 
240*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_STRING_VARIANT_MAP_VALUE: {
241*993b0882SAndroid Build Coastguard Worker       TC3_ASSIGN_OR_RETURN(
242*993b0882SAndroid Build Coastguard Worker           ScopedLocalRef<jobjectArray> value_jobect_array,
243*993b0882SAndroid Build Coastguard Worker           AsNamedVariantArray(
244*993b0882SAndroid Build Coastguard Worker               value.ConstRefValue<std::map<std::string, Variant>>()));
245*993b0882SAndroid Build Coastguard Worker       return JniHelper::NewObject(env, named_variant_class_.get(),
246*993b0882SAndroid Build Coastguard Worker                                   named_variant_from_named_variant_array_,
247*993b0882SAndroid Build Coastguard Worker                                   name.get(), value_jobect_array.get());
248*993b0882SAndroid Build Coastguard Worker     }
249*993b0882SAndroid Build Coastguard Worker 
250*993b0882SAndroid Build Coastguard Worker     case Variant::TYPE_EMPTY:
251*993b0882SAndroid Build Coastguard Worker       return {Status::UNKNOWN};
252*993b0882SAndroid Build Coastguard Worker 
253*993b0882SAndroid Build Coastguard Worker     default:
254*993b0882SAndroid Build Coastguard Worker       TC3_LOG(ERROR) << "Unsupported NamedVariant type: " << value.GetType();
255*993b0882SAndroid Build Coastguard Worker       return {Status::UNKNOWN};
256*993b0882SAndroid Build Coastguard Worker   }
257*993b0882SAndroid Build Coastguard Worker }
258*993b0882SAndroid Build Coastguard Worker 
259*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobjectArray>>
AsNamedVariantArray(const std::map<std::string,Variant> & values) const260*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler::AsNamedVariantArray(
261*993b0882SAndroid Build Coastguard Worker     const std::map<std::string, Variant>& values) const {
262*993b0882SAndroid Build Coastguard Worker   JNIEnv* env = jni_cache_->GetEnv();
263*993b0882SAndroid Build Coastguard Worker   if (values.empty()) {
264*993b0882SAndroid Build Coastguard Worker     return {{nullptr, env}};
265*993b0882SAndroid Build Coastguard Worker   }
266*993b0882SAndroid Build Coastguard Worker 
267*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
268*993b0882SAndroid Build Coastguard Worker       ScopedLocalRef<jobjectArray> result,
269*993b0882SAndroid Build Coastguard Worker       JniHelper::NewObjectArray(jni_cache_->GetEnv(), values.size(),
270*993b0882SAndroid Build Coastguard Worker                                 named_variant_class_.get(), nullptr));
271*993b0882SAndroid Build Coastguard Worker   int element_index = 0;
272*993b0882SAndroid Build Coastguard Worker   for (const auto& key_value_pair : values) {
273*993b0882SAndroid Build Coastguard Worker     if (!key_value_pair.second.HasValue()) {
274*993b0882SAndroid Build Coastguard Worker       element_index++;
275*993b0882SAndroid Build Coastguard Worker       continue;
276*993b0882SAndroid Build Coastguard Worker     }
277*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(
278*993b0882SAndroid Build Coastguard Worker         StatusOr<ScopedLocalRef<jobject>> named_extra,
279*993b0882SAndroid Build Coastguard Worker         AsNamedVariant(key_value_pair.first, key_value_pair.second));
280*993b0882SAndroid Build Coastguard Worker     TC3_RETURN_IF_ERROR(JniHelper::SetObjectArrayElement(
281*993b0882SAndroid Build Coastguard Worker         env, result.get(), element_index, named_extra.ValueOrDie().get()));
282*993b0882SAndroid Build Coastguard Worker     element_index++;
283*993b0882SAndroid Build Coastguard Worker   }
284*993b0882SAndroid Build Coastguard Worker   return result;
285*993b0882SAndroid Build Coastguard Worker }
286*993b0882SAndroid Build Coastguard Worker 
287*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobjectArray>>
RemoteActionTemplatesToJObjectArray(const std::vector<RemoteActionTemplate> & remote_actions) const288*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler::RemoteActionTemplatesToJObjectArray(
289*993b0882SAndroid Build Coastguard Worker     const std::vector<RemoteActionTemplate>& remote_actions) const {
290*993b0882SAndroid Build Coastguard Worker   JNIEnv* env = jni_cache_->GetEnv();
291*993b0882SAndroid Build Coastguard Worker   TC3_ASSIGN_OR_RETURN(
292*993b0882SAndroid Build Coastguard Worker       ScopedLocalRef<jobjectArray> results,
293*993b0882SAndroid Build Coastguard Worker       JniHelper::NewObjectArray(env, remote_actions.size(),
294*993b0882SAndroid Build Coastguard Worker                                 remote_action_template_class_.get(), nullptr));
295*993b0882SAndroid Build Coastguard Worker 
296*993b0882SAndroid Build Coastguard Worker   for (int i = 0; i < remote_actions.size(); i++) {
297*993b0882SAndroid Build Coastguard Worker     const RemoteActionTemplate& remote_action = remote_actions[i];
298*993b0882SAndroid Build Coastguard Worker 
299*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(
300*993b0882SAndroid Build Coastguard Worker         const StatusOr<ScopedLocalRef<jstring>> title_without_entity,
301*993b0882SAndroid Build Coastguard Worker         AsUTF8String(remote_action.title_without_entity));
302*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(
303*993b0882SAndroid Build Coastguard Worker         const StatusOr<ScopedLocalRef<jstring>> title_with_entity,
304*993b0882SAndroid Build Coastguard Worker         AsUTF8String(remote_action.title_with_entity));
305*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jstring>> description,
306*993b0882SAndroid Build Coastguard Worker                          AsUTF8String(remote_action.description));
307*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(
308*993b0882SAndroid Build Coastguard Worker         const StatusOr<ScopedLocalRef<jstring>> description_with_app_name,
309*993b0882SAndroid Build Coastguard Worker         AsUTF8String(remote_action.description_with_app_name));
310*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jstring>> action,
311*993b0882SAndroid Build Coastguard Worker                          AsUTF8String(remote_action.action));
312*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jstring>> data,
313*993b0882SAndroid Build Coastguard Worker                          AsUTF8String(remote_action.data));
314*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jstring>> type,
315*993b0882SAndroid Build Coastguard Worker                          AsUTF8String(remote_action.type));
316*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jobject>> flags,
317*993b0882SAndroid Build Coastguard Worker                          AsInteger(remote_action.flags));
318*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jobjectArray>> category,
319*993b0882SAndroid Build Coastguard Worker                          AsStringArray(remote_action.category));
320*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jstring>> package,
321*993b0882SAndroid Build Coastguard Worker                          AsUTF8String(remote_action.package_name));
322*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jobjectArray>> extra,
323*993b0882SAndroid Build Coastguard Worker                          AsNamedVariantArray(remote_action.extra));
324*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(const StatusOr<ScopedLocalRef<jobject>> request_code,
325*993b0882SAndroid Build Coastguard Worker                          AsInteger(remote_action.request_code));
326*993b0882SAndroid Build Coastguard Worker 
327*993b0882SAndroid Build Coastguard Worker     TC3_ASSIGN_OR_RETURN(
328*993b0882SAndroid Build Coastguard Worker         const ScopedLocalRef<jobject> result,
329*993b0882SAndroid Build Coastguard Worker         JniHelper::NewObject(
330*993b0882SAndroid Build Coastguard Worker             env, remote_action_template_class_.get(),
331*993b0882SAndroid Build Coastguard Worker             remote_action_template_init_,
332*993b0882SAndroid Build Coastguard Worker             title_without_entity.ValueOrDie().get(),
333*993b0882SAndroid Build Coastguard Worker             title_with_entity.ValueOrDie().get(),
334*993b0882SAndroid Build Coastguard Worker             description.ValueOrDie().get(),
335*993b0882SAndroid Build Coastguard Worker             description_with_app_name.ValueOrDie().get(),
336*993b0882SAndroid Build Coastguard Worker             action.ValueOrDie().get(), data.ValueOrDie().get(),
337*993b0882SAndroid Build Coastguard Worker             type.ValueOrDie().get(), flags.ValueOrDie().get(),
338*993b0882SAndroid Build Coastguard Worker             category.ValueOrDie().get(), package.ValueOrDie().get(),
339*993b0882SAndroid Build Coastguard Worker             extra.ValueOrDie().get(), request_code.ValueOrDie().get()));
340*993b0882SAndroid Build Coastguard Worker     TC3_RETURN_IF_ERROR(
341*993b0882SAndroid Build Coastguard Worker         JniHelper::SetObjectArrayElement(env, results.get(), i, result.get()));
342*993b0882SAndroid Build Coastguard Worker   }
343*993b0882SAndroid Build Coastguard Worker   return results;
344*993b0882SAndroid Build Coastguard Worker }
345*993b0882SAndroid Build Coastguard Worker 
346*993b0882SAndroid Build Coastguard Worker StatusOr<ScopedLocalRef<jobjectArray>>
EntityDataAsNamedVariantArray(const reflection::Schema * entity_data_schema,const std::string & serialized_entity_data) const347*993b0882SAndroid Build Coastguard Worker RemoteActionTemplatesHandler::EntityDataAsNamedVariantArray(
348*993b0882SAndroid Build Coastguard Worker     const reflection::Schema* entity_data_schema,
349*993b0882SAndroid Build Coastguard Worker     const std::string& serialized_entity_data) const {
350*993b0882SAndroid Build Coastguard Worker   MutableFlatbufferBuilder entity_data_builder(entity_data_schema);
351*993b0882SAndroid Build Coastguard Worker   std::unique_ptr<MutableFlatbuffer> buffer = entity_data_builder.NewRoot();
352*993b0882SAndroid Build Coastguard Worker   buffer->MergeFromSerializedFlatbuffer(serialized_entity_data);
353*993b0882SAndroid Build Coastguard Worker   std::map<std::string, Variant> entity_data_map = buffer->AsFlatMap();
354*993b0882SAndroid Build Coastguard Worker   return AsNamedVariantArray(entity_data_map);
355*993b0882SAndroid Build Coastguard Worker }
356*993b0882SAndroid Build Coastguard Worker 
357*993b0882SAndroid Build Coastguard Worker }  // namespace libtextclassifier3
358