@@ -124,7 +124,12 @@ METHOD_LOOKUP_DEFINITION(twittercred,
124124 X (NewBuilder, " newBuilder" , \
125125 " (Ljava/lang/String;Lcom/google/firebase/auth/FirebaseAuth;)" \
126126 " Lcom/google/firebase/auth/OAuthProvider$Builder;" , \
127+ util::kMethodTypeStatic ), \
128+ X (NewCredentialBuilder, " newCredentialBuilder" , \
129+ " (Ljava/lang/String;)" \
130+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" , \
127131 util::kMethodTypeStatic )
132+
128133// clang-format on
129134METHOD_LOOKUP_DECLARATION (oauthprovider, OAUTHPROVIDER_METHODS)
130135METHOD_LOOKUP_DEFINITION (oauthprovider,
@@ -180,6 +185,29 @@ METHOD_LOOKUP_DEFINITION(oauthprovider_builder,
180185 PROGUARD_KEEP_CLASS
181186 " com/google/firebase/auth/OAuthProvider$Builder" ,
182187 OAUTHPROVIDER_BUILDER_METHODS)
188+
189+ // clang-format off
190+ #define OAUTHPROVIDER_CREDENTIALBUILDER_METHODS (X ) \
191+ X (SetAccessToken, " setAccessToken" , \
192+ " (Ljava/lang/String;)" \
193+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" ), \
194+ X (SetIdToken, " setIdToken" , \
195+ " (Ljava/lang/String;)" \
196+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" ), \
197+ X (SetIdTokenWithRawNonce, " setIdTokenWithRawNonce" , \
198+ " (Ljava/lang/String;Ljava/lang/String;)" \
199+ " Lcom/google/firebase/auth/OAuthProvider$CredentialBuilder;" ), \
200+ X (Build, " build" , " ()Lcom/google/firebase/auth/AuthCredential;" )
201+ // clang-format on
202+
203+ METHOD_LOOKUP_DECLARATION (oauthprovider_credentialbuilder,
204+ OAUTHPROVIDER_CREDENTIALBUILDER_METHODS)
205+ METHOD_LOOKUP_DEFINITION (
206+ oauthprovider_credentialbuilder,
207+ PROGUARD_KEEP_CLASS
208+ " com/google/firebase/auth/OAuthProvider$CredentialBuilder" ,
209+ OAUTHPROVIDER_CREDENTIALBUILDER_METHODS)
210+
183211// clang-format off
184212#define AUTH_IDP_METHODS (X ) \
185213 X (StartActivityForSignInWithProvider, " startActivityForSignInWithProvider" , \
@@ -275,19 +303,21 @@ bool CacheCredentialMethodIds(
275303 return false ;
276304 }
277305
278- g_methods_cached = credential::CacheMethodIds (env, activity) &&
279- emailcred::CacheMethodIds (env, activity) &&
280- facebookcred::CacheMethodIds (env, activity) &&
281- githubcred::CacheMethodIds (env, activity) &&
282- googlecred::CacheMethodIds (env, activity) &&
283- oauthprovider::CacheMethodIds (env, activity) &&
284- oauthprovider_builder::CacheMethodIds (env, activity) &&
285- auth_idp::CacheMethodIds (env, activity) &&
286- user_idp::CacheMethodIds (env, activity) &&
287- phonecred::CacheMethodIds (env, activity) &&
288- timeunit::CacheFieldIds (env, activity) &&
289- playgamescred::CacheMethodIds (env, activity) &&
290- twittercred::CacheMethodIds (env, activity);
306+ g_methods_cached =
307+ credential::CacheMethodIds (env, activity) &&
308+ emailcred::CacheMethodIds (env, activity) &&
309+ facebookcred::CacheMethodIds (env, activity) &&
310+ githubcred::CacheMethodIds (env, activity) &&
311+ googlecred::CacheMethodIds (env, activity) &&
312+ oauthprovider::CacheMethodIds (env, activity) &&
313+ oauthprovider_builder::CacheMethodIds (env, activity) &&
314+ oauthprovider_credentialbuilder::CacheMethodIds (env, activity) &&
315+ auth_idp::CacheMethodIds (env, activity) &&
316+ user_idp::CacheMethodIds (env, activity) &&
317+ phonecred::CacheMethodIds (env, activity) &&
318+ timeunit::CacheFieldIds (env, activity) &&
319+ playgamescred::CacheMethodIds (env, activity) &&
320+ twittercred::CacheMethodIds (env, activity);
291321
292322 return g_methods_cached;
293323}
@@ -303,6 +333,7 @@ void ReleaseCredentialClasses(JNIEnv* env) {
303333 jniphone::ReleaseClass (env);
304334 oauthprovider::ReleaseClass (env);
305335 oauthprovider_builder::ReleaseClass (env);
336+ oauthprovider_credentialbuilder::ReleaseClass (env);
306337 phonecred::ReleaseClass (env);
307338 timeunit::ReleaseClass (env);
308339 twittercred::ReleaseClass (env);
@@ -549,6 +580,76 @@ Credential OAuthProvider::GetCredential(const char* provider_id,
549580 return Credential (CredentialLocalToGlobalRef (j_cred));
550581}
551582
583+
584+ // static
585+ Credential OAuthProvider::GetCredential (const char * provider_id,
586+ const char * id_token,
587+ const char * raw_nonce,
588+ const char * access_token) {
589+ FIREBASE_ASSERT_RETURN (Credential (),
590+ provider_id && id_token && raw_nonce );
591+ FIREBASE_ASSERT_MESSAGE_RETURN (Credential (), g_methods_cached,
592+ kMethodsNotCachedError );
593+
594+ JNIEnv* env = GetJniEnv ();
595+ jstring j_provider_id = env->NewStringUTF (provider_id);
596+ jstring j_id_token = env->NewStringUTF (id_token);
597+ jstring j_raw_nonce = env->NewStringUTF (raw_nonce);
598+
599+ jobject j_cred_builder = env->CallStaticObjectMethod (
600+ oauthprovider::GetClass (),
601+ oauthprovider::GetMethodId (oauthprovider::kNewCredentialBuilder ),
602+ j_provider_id);
603+
604+ jobject j_cred = nullptr ;
605+ if (!firebase::util::CheckAndClearJniExceptions (env)) {
606+ jobject builder_return_ref = env->CallObjectMethod (
607+ j_cred_builder,
608+ oauthprovider_credentialbuilder::GetMethodId (
609+ oauthprovider_credentialbuilder::kSetIdTokenWithRawNonce ),
610+ j_id_token, j_raw_nonce);
611+
612+ if (!firebase::util::CheckAndClearJniExceptions (env)) {
613+ env->DeleteLocalRef (builder_return_ref);
614+ // add the access token, if it exists.
615+ if (access_token != nullptr ) {
616+ jobject j_access_token = env->NewStringUTF (access_token);
617+ builder_return_ref = env->CallObjectMethod (
618+ j_cred_builder,
619+ oauthprovider_credentialbuilder::GetMethodId (
620+ oauthprovider_credentialbuilder::kSetAccessToken ),
621+ j_access_token);
622+
623+ env->DeleteLocalRef (j_access_token);
624+ if (!firebase::util::CheckAndClearJniExceptions (env)) {
625+ env->DeleteLocalRef (builder_return_ref);
626+ } else {
627+ env->DeleteLocalRef (j_cred_builder);
628+ j_cred_builder = nullptr ;
629+ }
630+ }
631+ }
632+
633+ // If we have a valid credential builder, build a credential.
634+ if (j_cred_builder != nullptr ) {
635+ j_cred = env->CallObjectMethod (
636+ j_cred_builder, oauthprovider_credentialbuilder::GetMethodId (
637+ oauthprovider_credentialbuilder::kBuild ));
638+ if (firebase::util::CheckAndClearJniExceptions (env)) {
639+ j_cred = nullptr ;
640+ }
641+
642+ env->DeleteLocalRef (j_cred_builder);
643+ }
644+ }
645+
646+ env->DeleteLocalRef (j_provider_id);
647+ env->DeleteLocalRef (j_raw_nonce);
648+ env->DeleteLocalRef (j_id_token);
649+
650+ return Credential (CredentialLocalToGlobalRef (j_cred));
651+ }
652+
552653// static
553654Future<Credential> GameCenterAuthProvider::GetCredential () {
554655 // Game Center is not available on Android
0 commit comments