@@ -48,7 +48,8 @@ namespace internal {
4848 X (GetToken, " getAppCheckToken" , \
4949 " (Z)Lcom/google/android/gms/tasks/Task;" ), \
5050 X (GetLimitedUseToken, " getLimitedUseAppCheckToken" , \
51- " ()Lcom/google/android/gms/tasks/Task;" ), \
51+ " ()Lcom/google/android/gms/tasks/Task;" , \
52+ util::kMethodTypeInstance , util::kMethodOptional ), \
5253 X (AddAppCheckListener, " addAppCheckListener" , \
5354 " (Lcom/google/firebase/appcheck/FirebaseAppCheck$AppCheckListener;)V" ), \
5455 X (RemoveAppCheckListener, " removeAppCheckListener" , \
@@ -111,17 +112,10 @@ JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetToken(
111112 JNIEnv* env, jobject j_provider, jlong c_provider,
112113 jobject task_completion_source);
113114
114- JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetLimitedUseToken (
115- JNIEnv* env, jobject j_provider, jlong c_provider,
116- jobject task_completion_source);
117-
118115static const JNINativeMethod kNativeJniAppCheckProviderMethods [] = {
119116 {" nativeGetToken" ,
120117 " (JLcom/google/android/gms/tasks/TaskCompletionSource;)V" ,
121- reinterpret_cast <void *>(JniAppCheckProvider_nativeGetToken)},
122- {" nativeGetLimitedUseToken" ,
123- " (JLcom/google/android/gms/tasks/TaskCompletionSource;)V" ,
124- reinterpret_cast <void *>(JniAppCheckProvider_nativeGetLimitedUseToken)}};
118+ reinterpret_cast <void *>(JniAppCheckProvider_nativeGetToken)}};
125119
126120// clang-format off
127121#define JNI_APP_CHECK_LISTENER_METHODS (X ) \
@@ -269,39 +263,6 @@ JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetToken(
269263 provider->GetToken (token_callback);
270264}
271265
272- JNIEXPORT void JNICALL JniAppCheckProvider_nativeGetLimitedUseToken (
273- JNIEnv* env, jobject j_provider, jlong c_provider,
274- jobject task_completion_source) {
275- // Create GlobalReferences to the provider and task. These references will be
276- // deleted in the completion callback.
277- jobject j_provider_global = env->NewGlobalRef (j_provider);
278- jobject task_completion_source_global =
279- env->NewGlobalRef (task_completion_source);
280-
281- // Defines a C++ callback method to call
282- // JniAppCheckProvider.HandleGetTokenResult with the resulting token
283- auto token_callback{[j_provider_global, task_completion_source_global](
284- firebase::app_check::AppCheckToken token,
285- int error_code, const std::string& error_message) {
286- // util::GetJNIEnvFromApp returns a threadsafe instance of JNIEnv.
287- JNIEnv* env = firebase::util::GetJNIEnvFromApp ();
288- jstring error_string = env->NewStringUTF (error_message.c_str ());
289- jstring token_string = env->NewStringUTF (token.token .c_str ());
290- env->CallVoidMethod (
291- j_provider_global,
292- jni_provider::GetMethodId (jni_provider::kHandleGetTokenResult ),
293- task_completion_source_global, token_string, token.expire_time_millis ,
294- error_code, error_string);
295- FIREBASE_ASSERT (!util::CheckAndClearJniExceptions (env));
296- env->DeleteLocalRef (token_string);
297- env->DeleteLocalRef (error_string);
298- env->DeleteGlobalRef (j_provider_global);
299- env->DeleteGlobalRef (task_completion_source_global);
300- }};
301- AppCheckProvider* provider = reinterpret_cast <AppCheckProvider*>(c_provider);
302- provider->GetLimitedUseToken (token_callback);
303- }
304-
305266JNIEXPORT void JNICALL JniAppCheckListener_nativeOnAppCheckTokenChanged (
306267 JNIEnv* env, jobject clazz, jlong c_app_check, jobject token) {
307268 auto app_check_internal = reinterpret_cast <AppCheckInternal*>(c_app_check);
@@ -492,21 +453,27 @@ Future<AppCheckToken> AppCheckInternal::GetLimitedUseAppCheckToken() {
492453 JNIEnv* env = app_->GetJNIEnv ();
493454 auto handle =
494455 future ()->SafeAlloc <AppCheckToken>(kAppCheckFnGetLimitedUseAppCheckToken );
495- jobject j_task = env->CallObjectMethod (
496- app_check_impl_, app_check::GetMethodId (app_check::kGetLimitedUseToken ));
497-
498- std::string error = util::GetAndClearExceptionMessage (env);
499- if (error.empty ()) {
500- auto data_handle = new FutureDataHandle (future (), handle);
501- util::RegisterCallbackOnTask (env, j_task, TokenResultCallback,
502- reinterpret_cast <void *>(data_handle),
503- jni_task_id_.c_str ());
456+ jmethodID method_id = app_check::GetMethodId (app_check::kGetLimitedUseToken );
457+ if (method_id != nullptr ) {
458+ jobject j_task = env->CallObjectMethod (app_check_impl_, method_id);
459+
460+ std::string error = util::GetAndClearExceptionMessage (env);
461+ if (error.empty ()) {
462+ auto data_handle = new FutureDataHandle (future (), handle);
463+ util::RegisterCallbackOnTask (env, j_task, TokenResultCallback,
464+ reinterpret_cast <void *>(data_handle),
465+ jni_task_id_.c_str ());
466+ } else {
467+ AppCheckToken empty_token;
468+ future ()->CompleteWithResult (handle, kAppCheckErrorUnknown , error.c_str (),
469+ empty_token);
470+ }
471+ env->DeleteLocalRef (j_task);
504472 } else {
505- AppCheckToken empty_token;
506- future ()-> CompleteWithResult (handle, kAppCheckErrorUnknown , error. c_str (),
507- empty_token );
473+ // Fall back to the standard getAppCheckToken() if
474+ // getLimitedUseAppCheckToken() is missing.
475+ return GetAppCheckToken ( false );
508476 }
509- env->DeleteLocalRef (j_task);
510477 return MakeFuture (future (), handle);
511478}
512479
0 commit comments