diff --git a/packages/firebase_auth/CHANGELOG.md b/packages/firebase_auth/CHANGELOG.md index 43ab971b889d..0d55deeffbd2 100644 --- a/packages/firebase_auth/CHANGELOG.md +++ b/packages/firebase_auth/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.13.0 + +* **Breaking change**: Replace `FirebaseUserMetadata.creationTimestamp` and + `FirebaseUserMetadata.lastSignInTimestamp` with `creationTime` and `lastSignInTime`. + Previously on iOS `creationTimestamp` and `lastSignInTimestamp` returned in + seconds and on Android in milliseconds. Now, both platforms provide values as a + `DateTime`. + ## 0.12.0+1 * Fixes iOS sign-in exceptions when `additionalUserInfo` is `nil` or has `nil` fields. diff --git a/packages/firebase_auth/example/test/firebase_auth.dart b/packages/firebase_auth/example/test/firebase_auth.dart index a2bd8e8dac22..6acf6e6d9b62 100644 --- a/packages/firebase_auth/example/test/firebase_auth.dart +++ b/packages/firebase_auth/example/test/firebase_auth.dart @@ -3,9 +3,10 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_driver/driver_extension.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_auth/firebase_auth.dart'; void main() { final Completer completer = Completer(); @@ -22,8 +23,6 @@ void main() { test('signInAnonymously', () async { final AuthResult result = await auth.signInAnonymously(); final FirebaseUser user = result.user; - expect(user.uid, isNotNull); - expect(user.isAnonymous, isTrue); final AdditionalUserInfo additionalUserInfo = result.additionalUserInfo; expect(additionalUserInfo.username, isNull); expect(additionalUserInfo.isNewUser, isNotNull); @@ -34,6 +33,17 @@ void main() { additionalUserInfo.providerId == null || additionalUserInfo.providerId == 'password', isTrue); + expect(user.uid, isNotNull); + expect(user.isAnonymous, isTrue); + expect(user.metadata.creationTime.isAfter(DateTime(2018, 1, 1)), isTrue); + expect(user.metadata.creationTime.isBefore(DateTime.now()), isTrue); + await auth.signOut(); + final FirebaseUser user2 = (await auth.signInAnonymously()).user; + expect(user2.uid, isNot(equals(user.uid))); + expect(user2.metadata.creationTime.isBefore(user.metadata.creationTime), + isFalse); + expect( + user2.metadata.lastSignInTime, equals(user2.metadata.creationTime)); }); test('isSignInWithEmailLink', () async { diff --git a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m index 5225d486d468..d6e469393314 100644 --- a/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m +++ b/packages/firebase_auth/ios/Classes/FirebaseAuthPlugin.m @@ -353,8 +353,8 @@ - (NSMutableDictionary *)dictionaryFromUser:(FIRUser *)user { [providerData addObject:toDictionary(userInfo)]; } - long creationDate = [user.metadata.creationDate timeIntervalSince1970]; - long lastSignInDate = [user.metadata.lastSignInDate timeIntervalSince1970]; + long creationDate = [user.metadata.creationDate timeIntervalSince1970] * 1000; + long lastSignInDate = [user.metadata.lastSignInDate timeIntervalSince1970] * 1000; NSMutableDictionary *userData = [toDictionary(user) mutableCopy]; userData[@"creationTimestamp"] = [NSNumber numberWithLong:creationDate]; diff --git a/packages/firebase_auth/lib/src/user_metadata.dart b/packages/firebase_auth/lib/src/user_metadata.dart index 66c1fedf4911..293d294b6ecb 100644 --- a/packages/firebase_auth/lib/src/user_metadata.dart +++ b/packages/firebase_auth/lib/src/user_metadata.dart @@ -10,7 +10,13 @@ class FirebaseUserMetadata { final Map _data; - int get creationTimestamp => _data['creationTimestamp']; + /// When this account was created as dictated by the server clock. + DateTime get creationTime => + DateTime.fromMillisecondsSinceEpoch(_data['creationTimestamp']); - int get lastSignInTimestamp => _data['lastSignInTimestamp']; + /// When the user last signed in as dictated by the server clock. + /// + /// This is only accurate up to a granularity of 2 minutes for consecutive sign-in attempts. + DateTime get lastSignInTime => + DateTime.fromMillisecondsSinceEpoch(_data['lastSignInTimestamp']); } diff --git a/packages/firebase_auth/pubspec.yaml b/packages/firebase_auth/pubspec.yaml index f3fd0520aff1..deabd4712be2 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.12.0+1" +version: 0.13.0 flutter: plugin: diff --git a/packages/firebase_auth/test/firebase_auth_test.dart b/packages/firebase_auth/test/firebase_auth_test.dart index a05cdec4adec..9acff316492d 100755 --- a/packages/firebase_auth/test/firebase_auth_test.dart +++ b/packages/firebase_auth/test/firebase_auth_test.dart @@ -25,15 +25,14 @@ const String kMockPhoneNumber = '5555555555'; const String kMockVerificationId = '12345'; const String kMockSmsCode = '123456'; const String kMockLanguage = 'en'; -const Map kMockAdditionalUserInfo = { - 'isNewUser': false, - 'username': 'flutterUser', - 'providerId': 'testProvider', - 'profile': {'foo': 'bar'}, -}; -const Map kMockUser = { +final int kMockCreationTimestamp = DateTime(2019, 1, 1).millisecondsSinceEpoch; +final int kMockLastSignInTimestamp = + DateTime.now().subtract(const Duration(days: 1)).millisecondsSinceEpoch; +final Map kMockUser = { 'isAnonymous': true, 'isEmailVerified': false, + 'creationTimestamp': kMockCreationTimestamp, + 'lastSignInTimestamp': kMockLastSignInTimestamp, 'providerData': >[ { 'providerId': kMockProviderId, @@ -44,6 +43,12 @@ const Map kMockUser = { }, ], }; +const Map kMockAdditionalUserInfo = { + 'isNewUser': false, + 'username': 'flutterUser', + 'providerId': 'testProvider', + 'profile': {'foo': 'bar'}, +}; void main() { group('$FirebaseAuth', () { @@ -103,6 +108,10 @@ void main() { expect(userInfo.displayName, kMockDisplayName); expect(userInfo.photoUrl, kMockPhotoUrl); expect(userInfo.email, kMockEmail); + expect(user.metadata.creationTime.millisecondsSinceEpoch, + kMockCreationTimestamp); + expect(user.metadata.lastSignInTime.millisecondsSinceEpoch, + kMockLastSignInTimestamp); } void verifyAuthResult(AuthResult result) {