3030import com .facebook .react .bridge .WritableArray ;
3131import com .facebook .react .bridge .WritableMap ;
3232import com .google .android .gms .tasks .OnCompleteListener ;
33+ import com .google .android .gms .tasks .OnFailureListener ;
34+ import com .google .android .gms .tasks .OnSuccessListener ;
35+ import com .google .android .gms .tasks .Task ;
3336import com .google .firebase .FirebaseApp ;
3437import com .google .firebase .FirebaseException ;
3538import com .google .firebase .FirebaseNetworkException ;
5659import com .google .firebase .auth .MultiFactorResolver ;
5760import com .google .firebase .auth .MultiFactorSession ;
5861import com .google .firebase .auth .OAuthProvider ;
62+ import com .google .firebase .auth .OAuthCredential ;
5963import com .google .firebase .auth .PhoneAuthCredential ;
6064import com .google .firebase .auth .PhoneAuthOptions ;
6165import com .google .firebase .auth .PhoneAuthProvider ;
@@ -203,7 +207,6 @@ public void addIdTokenListener(final String appName) {
203207
204208 FirebaseApp firebaseApp = FirebaseApp .getInstance (appName );
205209 FirebaseAuth firebaseAuth = FirebaseAuth .getInstance (firebaseApp );
206-
207210 if (!mIdTokenListeners .containsKey (appName )) {
208211 FirebaseAuth .IdTokenListener newIdTokenListener =
209212 firebaseAuth1 -> {
@@ -839,6 +842,87 @@ private void signInWithCredential(
839842 }
840843 }
841844
845+ @ ReactMethod
846+ public void signInWithProvider (String appName , String providerId , @ Nullable String email , Promise promise ){
847+ OAuthProvider .Builder provider = OAuthProvider .newBuilder (providerId );
848+ if (email != null ){
849+ provider .addCustomParameter ("login_hint" , email );
850+ }
851+ Activity activity = getCurrentActivity ();
852+ FirebaseApp firebaseApp = FirebaseApp .getInstance (appName );
853+ FirebaseAuth firebaseAuth = FirebaseAuth .getInstance (firebaseApp );
854+
855+ OnSuccessListener onSuccess = new OnSuccessListener <AuthResult >(){
856+ @ Override
857+ public void onSuccess (AuthResult authResult ) {
858+ Log .d (TAG , "signInWithProvider:onComplete:success" );
859+ promiseWithAuthResult (authResult , promise );
860+ }
861+ };
862+
863+ OnFailureListener onFailure = new OnFailureListener (){
864+ @ Override
865+ public void onFailure (@ NonNull Exception e ) {
866+ Log .w (TAG , "signInWithProvider:onComplete:failure" , e );
867+ promiseRejectAuthException (promise , e );
868+ }
869+ };
870+
871+
872+ Task <AuthResult > pendingResultTask = firebaseAuth .getPendingAuthResult ();
873+ if (pendingResultTask != null ){
874+ pendingResultTask
875+ .addOnSuccessListener (onSuccess )
876+ .addOnFailureListener (onFailure );
877+ } else {
878+ firebaseAuth
879+ .startActivityForSignInWithProvider (activity , provider .build ())
880+ .addOnSuccessListener (onSuccess )
881+ .addOnFailureListener (onFailure );
882+ }
883+ }
884+
885+ @ ReactMethod
886+ public void linkWithProvider (String appName , String providerId , @ Nullable String email , Promise promise ){
887+ OAuthProvider .Builder provider = OAuthProvider .newBuilder (providerId );
888+ if (email != null ){
889+ provider .addCustomParameter ("login_hint" , email );
890+ }
891+ Activity activity = getCurrentActivity ();
892+ FirebaseApp firebaseApp = FirebaseApp .getInstance (appName );
893+ FirebaseAuth firebaseAuth = FirebaseAuth .getInstance (firebaseApp );
894+ FirebaseUser firebaseUser = firebaseAuth .getCurrentUser ();
895+
896+ OnSuccessListener onSuccess = new OnSuccessListener <AuthResult >(){
897+ @ Override
898+ public void onSuccess (AuthResult authResult ) {
899+ Log .d (TAG , "linkWithProvider:onComplete:success" );
900+ promiseWithAuthResult (authResult , promise );
901+ }
902+ };
903+
904+ OnFailureListener onFailure = new OnFailureListener (){
905+ @ Override
906+ public void onFailure (@ NonNull Exception e ) {
907+ Log .w (TAG , "linkInWithProvider:onComplete:failure" , e );
908+ promiseRejectAuthException (promise , e );
909+ }
910+ };
911+
912+
913+ Task <AuthResult > pendingResultTask = firebaseAuth .getPendingAuthResult ();
914+ if (pendingResultTask != null ){
915+ pendingResultTask
916+ .addOnSuccessListener (onSuccess )
917+ .addOnFailureListener (onFailure );
918+ } else {
919+ firebaseUser
920+ .startActivityForLinkWithProvider (activity , provider .build ())
921+ .addOnSuccessListener (onSuccess )
922+ .addOnFailureListener (onFailure );
923+ }
924+ }
925+
842926 /**
843927 * signInWithPhoneNumber
844928 *
@@ -1866,6 +1950,30 @@ private void promiseWithAuthResult(AuthResult authResult, Promise promise) {
18661950 WritableMap authResultMap = Arguments .createMap ();
18671951 WritableMap userMap = firebaseUserToMap (authResult .getUser ());
18681952
1953+ if (authResult .getCredential () != null ){
1954+ if (authResult .getCredential () instanceof OAuthCredential ){
1955+ OAuthCredential creds = (OAuthCredential ) authResult .getCredential ();
1956+ WritableMap credentialMap = Arguments .createMap ();
1957+
1958+ credentialMap .putString ("providerId" , creds .getProvider ());
1959+ credentialMap .putString ("signInMethod" , creds .getSignInMethod ());
1960+
1961+ if (creds .getIdToken () != null ){
1962+ credentialMap .putString ("idToken" , creds .getIdToken ());
1963+ }
1964+
1965+ if (creds .getAccessToken () != null ){
1966+ credentialMap .putString ("accessToken" , creds .getAccessToken ());
1967+ }
1968+
1969+ if (creds .getSecret () != null ){
1970+ credentialMap .putString ("secret" , creds .getSecret ());
1971+ }
1972+
1973+ authResultMap .putMap ("credential" , credentialMap );
1974+ }
1975+ }
1976+
18691977 if (authResult .getAdditionalUserInfo () != null ) {
18701978 WritableMap additionalUserInfoMap = Arguments .createMap ();
18711979
@@ -1906,6 +2014,7 @@ private void promiseWithAuthResult(AuthResult authResult, Promise promise) {
19062014 */
19072015 private void promiseRejectAuthException (Promise promise , Exception exception ) {
19082016 WritableMap error = getJSError (exception );
2017+
19092018 final String sessionId = error .getString ("sessionId" );
19102019 final MultiFactorResolver multiFactorResolver = mCachedResolvers .get (sessionId );
19112020 WritableMap resolverAsMap = Arguments .createMap ();
@@ -1927,6 +2036,8 @@ private WritableMap getJSError(Exception exception) {
19272036 String message = exception .getMessage ();
19282037 String invalidEmail = "The email address is badly formatted." ;
19292038
2039+ System .out .print (exception );
2040+
19302041 try {
19312042 FirebaseAuthException authException = (FirebaseAuthException ) exception ;
19322043 code = authException .getErrorCode ();
0 commit comments