@@ -109,11 +109,17 @@ JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetToken(
109109 JNIEnv* env, jobject j_provider, jlong c_provider,
110110 jobject task_completion_source);
111111
112+ JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetLimitedUseToken (
113+ JNIEnv* env, jobject j_provider, jlong c_provider,
114+ jobject task_completion_source);
115+
112116static const JNINativeMethod kNativeJniAppCheckProviderMethods [] = {
113117 {" nativeGetToken" ,
114118 " (JLcom/google/android/gms/tasks/TaskCompletionSource;)V" ,
115119 reinterpret_cast <void *>(JniAppCheckProvider_nativeGetToken)},
116- };
120+ {" nativeGetLimitedUseToken" ,
121+ " (JLcom/google/android/gms/tasks/TaskCompletionSource;)V" ,
122+ reinterpret_cast <void *>(JniAppCheckProvider_nativeGetLimitedUseToken)}};
117123
118124// clang-format off
119125#define JNI_APP_CHECK_LISTENER_METHODS (X ) \
@@ -266,6 +272,39 @@ JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetToken(
266272 provider->GetToken (token_callback);
267273}
268274
275+ JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetLimitedUseToken (
276+ JNIEnv* env, jobject j_provider, jlong c_provider,
277+ jobject task_completion_source) {
278+ // Create GlobalReferences to the provider and task. These references will be
279+ // deleted in the completion callback.
280+ jobject j_provider_global = env->NewGlobalRef (j_provider);
281+ jobject task_completion_source_global =
282+ env->NewGlobalRef (task_completion_source);
283+
284+ // Defines a C++ callback method to call
285+ // JniAppCheckProvider.HandleGetTokenResult with the resulting token
286+ auto token_callback{[j_provider_global, task_completion_source_global](
287+ firebase::app_check::AppCheckToken token,
288+ int error_code, const std::string& error_message) {
289+ // util::GetJNIEnvFromApp returns a threadsafe instance of JNIEnv.
290+ JNIEnv* env = firebase::util::GetJNIEnvFromApp ();
291+ jstring error_string = env->NewStringUTF (error_message.c_str ());
292+ jstring token_string = env->NewStringUTF (token.token .c_str ());
293+ env->CallVoidMethod (
294+ j_provider_global,
295+ jni_provider::GetMethodId (jni_provider::kHandleGetTokenResult ),
296+ task_completion_source_global, token_string, token.expire_time_millis ,
297+ error_code, error_string);
298+ FIREBASE_ASSERT (!util::CheckAndClearJniExceptions (env));
299+ env->DeleteLocalRef (token_string);
300+ env->DeleteLocalRef (error_string);
301+ env->DeleteGlobalRef (j_provider_global);
302+ env->DeleteGlobalRef (task_completion_source_global);
303+ }};
304+ AppCheckProvider* provider = reinterpret_cast <AppCheckProvider*>(c_provider);
305+ provider->GetLimitedUseToken (token_callback);
306+ }
307+
269308JNIEXPORT void JNICALL JniAppCheckListener_nativeOnAppCheckTokenChanged (
270309 JNIEnv* env, jobject clazz, jlong c_app_check, jobject token) {
271310 auto app_check_internal = reinterpret_cast <AppCheckInternal*>(c_app_check);
0 commit comments