@@ -47,6 +47,8 @@ namespace internal {
4747 " (Z)V" ), \
4848 X (GetToken, " getAppCheckToken" , \
4949 " (Z)Lcom/google/android/gms/tasks/Task;" ), \
50+ X (GetLimitedUseToken, " getLimitedUseAppCheckToken" , \
51+ " ()Lcom/google/android/gms/tasks/Task;" ), \
5052 X (AddAppCheckListener, " addAppCheckListener" , \
5153 " (Lcom/google/firebase/appcheck/FirebaseAppCheck$AppCheckListener;)V" ), \
5254 X (RemoveAppCheckListener, " removeAppCheckListener" , \
@@ -486,6 +488,33 @@ Future<AppCheckToken> AppCheckInternal::GetAppCheckTokenLastResult() {
486488 future ()->LastResult (kAppCheckFnGetAppCheckToken ));
487489}
488490
491+ Future<AppCheckToken> AppCheckInternal::GetLimitedUseAppCheckToken () {
492+ JNIEnv* env = app_->GetJNIEnv ();
493+ auto handle =
494+ 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 ());
504+ } else {
505+ AppCheckToken empty_token;
506+ future ()->CompleteWithResult (handle, kAppCheckErrorUnknown , error.c_str (),
507+ empty_token);
508+ }
509+ env->DeleteLocalRef (j_task);
510+ return MakeFuture (future (), handle);
511+ }
512+
513+ Future<AppCheckToken> AppCheckInternal::GetLimitedUseAppCheckTokenLastResult () {
514+ return static_cast <const Future<AppCheckToken>&>(
515+ future ()->LastResult (kAppCheckFnGetLimitedUseAppCheckToken ));
516+ }
517+
489518void AppCheckInternal::AddAppCheckListener (AppCheckListener* listener) {
490519 MutexLock lock (listeners_mutex_);
491520 auto it = std::find (listeners_.begin (), listeners_.end (), listener);
0 commit comments