diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md index 104de5398129..2bcf576459f5 100644 --- a/packages/firebase_auth/CHANGELOG.md +++ b/packages/firebase_auth/CHANGELOG.md @@ -9,6 +9,7 @@ ## 0.6.3 * Add multi app support. +* Adding support for FirebaseUser.unlink(providerId) ## 0.6.2+1 diff --git a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java index 38b3d7df555b..5276275d4b85 100755 --- a/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java +++ b/packages/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java @@ -121,6 +121,8 @@ public void onMethodCall(MethodCall call, Result result) { break; case "linkWithTwitterCredential": handleLinkWithTwitterCredential(call, result, getAuth(call)); + case "unlink": + handleUnlink(call, result, getAuth(call)); break; case "linkWithGithubCredential": handleLinkWithGithubCredential(call, result, getAuth(call)); @@ -461,6 +463,15 @@ private void handleSignInWithCustomToken( .addOnCompleteListener(new SignInCompleteListener(result)); } + private void handleUnlink(MethodCall call, final Result result, FirebaseAuth firebaseAuth) { + Map<String, String> arguments = call.arguments(); + String providerId = arguments.get("providerId"); + firebaseAuth + .getCurrentUser() + .unlink(providerId) + .addOnCompleteListener(new SignInCompleteListener(result)); + } + private void handleSignOut(MethodCall call, final Result result, FirebaseAuth firebaseAuth) { firebaseAuth.signOut(); result.success(null); diff --git a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m index 0ae2d2307269..2cf9138f49ff 100644 --- a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m +++ b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m @@ -220,6 +220,14 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result forUser:user error:error]; }]; + } else if ([@"unlink" isEqualToString:call.method]) { + NSString *providerId = call.arguments[@"providerId"]; + [[self getAuth:call.arguments].currentUser unlinkFromProvider:providerId + completion:^(FIRUser *user, NSError *error) { + [self sendResult:result + forUser:user + error:error]; + }]; } else if ([@"updateEmail" isEqualToString:call.method]) { NSString *email = call.arguments[@"email"]; [[self getAuth:call.arguments].currentUser updateEmail:email diff --git a/packages/firebase_auth/lib/firebase_auth.dart b/packages/firebase_auth/lib/firebase_auth.dart index 9c4353a7dce2..2689b026e56c 100755 --- a/packages/firebase_auth/lib/firebase_auth.dart +++ b/packages/firebase_auth/lib/firebase_auth.dart @@ -16,6 +16,7 @@ class FirebaseUserMetadata { final Map<dynamic, dynamic> _data; int get creationTimestamp => _data['creationTimestamp']; + int get lastSignInTimestamp => _data['lastSignInTimestamp']; } @@ -490,6 +491,20 @@ class FirebaseAuth { return currentUser; } + Future<FirebaseUser> unlink({ + @required String providerId, + }) async { + final Map<dynamic, dynamic> data = await channel.invokeMethod( + 'unlink', + <String, String>{ + 'app': app.name, + 'providerId': providerId, + }, + ); + final FirebaseUser currentUser = FirebaseUser._(data, app); + return currentUser; + } + /// Sets the user-facing language code for auth operations that can be /// internationalized, such as [sendEmailVerification]. This language /// code should follow the conventions defined by the IETF in BCP47. diff --git a/packages/firebase_auth/test/firebase_auth_test.dart b/packages/firebase_auth/test/firebase_auth_test.dart index c84edf0431fa..9cfab3c6d1e7 100755 --- a/packages/firebase_auth/test/firebase_auth_test.dart +++ b/packages/firebase_auth/test/firebase_auth_test.dart @@ -288,6 +288,25 @@ void main() { ); }); + test('unlink', () async { + final FirebaseUser user = await auth.unlink( + providerId: kMockProviderId, + ); + verifyUser(user); + expect( + log, + <Matcher>[ + isMethodCall( + 'unlink', + arguments: <String, String>{ + 'app': auth.app.name, + 'providerId': kMockProviderId, + }, + ), + ], + ); + }); + test('signInWithFacebook', () async { final FirebaseUser user = await auth.signInWithFacebook( accessToken: kMockAccessToken,