diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md index 8a9adcfb9b3e..62ca4d6177af 100644 --- a/packages/firebase_auth/CHANGELOG.md +++ b/packages/firebase_auth/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.11.2 + +* Exposed user's additional information (`isNewUser`, `getUsername`, `getProfile`) + ## 0.11.1+10 * On Android, `providerData` now includes `UserInfo` for the phone authentication provider. 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 8b0ac80f3a53..5328885511de 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 @@ -16,6 +16,7 @@ import com.google.firebase.FirebaseNetworkException; import com.google.firebase.FirebaseTooManyRequestsException; import com.google.firebase.auth.ActionCodeSettings; +import com.google.firebase.auth.AdditionalUserInfo; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.EmailAuthProvider; @@ -293,7 +294,7 @@ private void handleCurrentUser( return; } Map userMap = mapFromUser(user); - result.success(userMap); + result.success(Collections.unmodifiableMap(userMap)); } private void handleSignInAnonymously( @@ -490,8 +491,8 @@ private void handleReauthenticateWithCredential( AuthCredential credential = getCredential((Map) call.arguments()); currentUser - .reauthenticate(credential) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); + .reauthenticateAndRetrieveData(credential) + .addOnCompleteListener(new SignInCompleteListener(result)); } private void handleUnlinkFromProvider(MethodCall call, Result result, FirebaseAuth firebaseAuth) { @@ -670,8 +671,11 @@ public void onComplete(@NonNull Task task) { reportException(result, task.getException()); } else { FirebaseUser user = task.getResult().getUser(); - Map userMap = Collections.unmodifiableMap(mapFromUser(user)); - result.success(userMap); + Map userMap = mapFromUser(user); + Map additionalMap = + mapFromAdditionalUserInfo(task.getResult().getAdditionalUserInfo()); + userMap.put("additionalUserInfo", Collections.unmodifiableMap(additionalMap)); + result.success(Collections.unmodifiableMap(userMap)); } } } @@ -746,12 +750,21 @@ private Map mapFromUser(FirebaseUser user) { userMap.put("isAnonymous", user.isAnonymous()); userMap.put("isEmailVerified", user.isEmailVerified()); userMap.put("providerData", Collections.unmodifiableList(providerData)); - return Collections.unmodifiableMap(userMap); + return userMap; } else { return null; } } + private Map mapFromAdditionalUserInfo(AdditionalUserInfo additionalUserInfo) { + Map map = new HashMap<>(); + map.put("providerId", additionalUserInfo.getProviderId()); + map.put("profile", additionalUserInfo.getProfile()); + map.put("username", additionalUserInfo.getUsername()); + map.put("isNewUser", additionalUserInfo.isNewUser()); + return map; + } + private void markUserRequired(Result result) { result.error("USER_REQUIRED", "Please authenticate with Firebase first", null); } diff --git a/packages/firebase_auth/example/test/firebase_auth.dart b/packages/firebase_auth/example/test/firebase_auth.dart index 2c4f4c8ede32..b3f9b257d3c9 100644 --- a/packages/firebase_auth/example/test/firebase_auth.dart +++ b/packages/firebase_auth/example/test/firebase_auth.dart @@ -19,6 +19,7 @@ void main() { final FirebaseUser user = await auth.signInAnonymously(); expect(user.uid, isNotNull); expect(user.isAnonymous, isTrue); + expect(user.additionalUserInfo.isNewUser, isNotNull); }); test('isSignInWithEmailLink', () async { diff --git a/packages/firebase_auth/lib/firebase_auth.dart b/packages/firebase_auth/lib/firebase_auth.dart index 1f31ead02dc0..f4fdf1fa7892 100755 --- a/packages/firebase_auth/lib/firebase_auth.dart +++ b/packages/firebase_auth/lib/firebase_auth.dart @@ -10,14 +10,15 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; +part 'src/additional_user_info.dart'; +part 'src/auth_credential.dart'; +part 'src/auth_exception.dart'; part 'src/auth_provider/email_auth_provider.dart'; part 'src/auth_provider/facebook_auth_provider.dart'; part 'src/auth_provider/github_auth_provider.dart'; part 'src/auth_provider/google_auth_provider.dart'; part 'src/auth_provider/phone_auth_provider.dart'; part 'src/auth_provider/twitter_auth_provider.dart'; -part 'src/auth_credential.dart'; -part 'src/auth_exception.dart'; part 'src/firebase_auth.dart'; part 'src/firebase_user.dart'; part 'src/user_info.dart'; diff --git a/packages/firebase_auth/lib/src/additional_user_info.dart b/packages/firebase_auth/lib/src/additional_user_info.dart new file mode 100644 index 000000000000..267b284efd40 --- /dev/null +++ b/packages/firebase_auth/lib/src/additional_user_info.dart @@ -0,0 +1,17 @@ +part of firebase_auth; + +/// Interface representing a user's additional information +class AdditionalUserInfo { + AdditionalUserInfo._(this._data); + + final Map _data; + + /// Returns whether the user is new or existing + bool get isNewUser => _data['isNewUser']; + + /// Returns the username if the provider is GitHub or Twitter + String get getUsername => _data['getUsername']; + + /// Returns a Map containing IDP-specific user data if the provider is one of Facebook, GitHub, Google, Twitter, Microsoft, or Yahoo. + Map get getProfile => _data['getProfile']; +} diff --git a/packages/firebase_auth/lib/src/firebase_user.dart b/packages/firebase_auth/lib/src/firebase_user.dart index 60e341648d44..6aa898bef578 100644 --- a/packages/firebase_auth/lib/src/firebase_user.dart +++ b/packages/firebase_auth/lib/src/firebase_user.dart @@ -11,16 +11,24 @@ class FirebaseUser extends UserInfo { .map((dynamic item) => UserInfo._(item, app)) .toList(), _metadata = FirebaseUserMetadata._(data), + _additionalUserInfo = data.containsKey('additionalUserInfo') + ? AdditionalUserInfo._(data['additionalUserInfo']) + : null, super._(data, app); final List providerData; final FirebaseUserMetadata _metadata; + final AdditionalUserInfo _additionalUserInfo; // Returns true if the user is anonymous; that is, the user account was // created with signInAnonymously() and has not been linked to another // account. FirebaseUserMetadata get metadata => _metadata; + /// Object that contains additional user information as a result of a successful sign-in, link, or re-authentication operation. + /// Available information contained within depends on the provider with which a sign-in, link, or re-authenticate operation was most recently done. + AdditionalUserInfo get additionalUserInfo => _additionalUserInfo; + bool get isAnonymous => _data['isAnonymous']; /// Returns true if the user's email is verified. diff --git a/packages/firebase_auth/pubspec.yaml b/packages/firebase_auth/pubspec.yaml index 3b5904d0a0e9..a5501f498bfc 100755 --- a/packages/firebase_auth/pubspec.yaml +++ b/packages/firebase_auth/pubspec.yaml @@ -4,7 +4,7 @@ description: Flutter plugin for Firebase Auth, enabling Android and iOS like Google, Facebook and Twitter. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_auth -version: "0.11.1+10" +version: "0.11.2" flutter: plugin: