Skip to content

Commit 77ed75d

Browse files
authored
fix(ui_auth): add showPasswordVisibilityToggle to the SignInScreen (firebase#114)
* fix(ui_auth): add showPasswordVisibilityToggle to the SignInScreen * add license header
1 parent 0f0fa80 commit 77ed75d

File tree

12 files changed

+110
-3
lines changed

12 files changed

+110
-3
lines changed

Diff for: packages/firebase_ui_auth/doc/README.md

+28-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,34 @@ Future<void> main() async {
4242

4343
## macOS entitlements
4444

45-
If you're building for macOS, make sure to add necessary entitlements. Learn more [from the official Flutter documentation](https://docs.flutter.dev/development/platform-integration/macos/building).
45+
If you're building for macOS, make sure to add necessary entitlements. Learn more [from the official Flutter documentation](https://docs.flutter.dev/platform-integration/macos/building#setting-up-entitlements).
46+
47+
## Writing widget unit tests
48+
49+
If you're writing widget unit tests, you'll need to add the following to your `setUpAll` method:
50+
51+
```dart
52+
setUpAll(() {
53+
setFirebaseUiIsTestMode(true);
54+
});
55+
```
56+
57+
Also, you will likely want to mock the `FirebaseAuth` instance:
58+
59+
```dart
60+
class MockFirebaseAuth extends Mock implements FirebaseAuth {
61+
/// mock necessary methods
62+
}
63+
```
64+
65+
An instance of `MockFirebaseAuth` can then be passed to Firebase UI widgets:
66+
67+
```dart
68+
SignInScreen(
69+
auth: MockFirebaseAuth(),
70+
/// ... other props
71+
)
72+
```
4673

4774
## Next steps
4875

Diff for: packages/firebase_ui_auth/example/windows/flutter/generated_plugin_registrant.cc

+3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
#include "generated_plugin_registrant.h"
88

99
#include <desktop_webview_auth/desktop_webview_auth_plugin.h>
10+
#include <firebase_auth/firebase_auth_plugin_c_api.h>
1011
#include <firebase_core/firebase_core_plugin_c_api.h>
1112
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
1213

1314
void RegisterPlugins(flutter::PluginRegistry* registry) {
1415
DesktopWebviewAuthPluginRegisterWithRegistrar(
1516
registry->GetRegistrarForPlugin("DesktopWebviewAuthPlugin"));
17+
FirebaseAuthPluginCApiRegisterWithRegistrar(
18+
registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi"));
1619
FirebaseCorePluginCApiRegisterWithRegistrar(
1720
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
1821
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(

Diff for: packages/firebase_ui_auth/example/windows/flutter/generated_plugins.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
list(APPEND FLUTTER_PLUGIN_LIST
66
desktop_webview_auth
7+
firebase_auth
78
firebase_core
89
flutter_secure_storage_windows
910
)

Diff for: packages/firebase_ui_auth/lib/firebase_ui_auth.dart

+9-1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ export 'src/widgets/sign_out_button.dart';
9595
export 'src/widgets/sms_code_input.dart' show SMSCodeInputState, SMSCodeInput;
9696
export 'src/widgets/user_avatar.dart';
9797

98+
bool _isTestMode = false;
99+
100+
@visibleForTesting
101+
void setFirebaseUiIsTestMode(bool isTestMode) {
102+
_isTestMode = isTestMode;
103+
}
104+
98105
class FirebaseUIAuth {
99106
static final _providers = <FirebaseApp, List<AuthProvider>>{};
100107
static final _configuredApps = <FirebaseApp, bool>{};
@@ -104,14 +111,15 @@ class FirebaseUIAuth {
104111
}
105112

106113
static bool isAppConfigured(FirebaseApp app) {
114+
if (_isTestMode) return true;
107115
return _providers.containsKey(app);
108116
}
109117

110118
static void configureProviders(
111119
List<AuthProvider> configs, {
112120
FirebaseApp? app,
113121
}) {
114-
if (Firebase.apps.isEmpty) {
122+
if (!_isTestMode && Firebase.apps.isEmpty) {
115123
throw Exception(
116124
'You must call Firebase.initializeApp() '
117125
'before calling configureProviders()',

Diff for: packages/firebase_ui_auth/lib/src/screens/sign_in_screen.dart

+5
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ class SignInScreen extends MultiProviderScreen {
9595
/// * [EmailFormStyle]
9696
final Set<FirebaseUIStyle>? styles;
9797

98+
/// {@macro ui.auth.widgets.email_form.showPasswordVisibilityToggle}
99+
final bool showPasswordVisibilityToggle;
100+
98101
/// {@macro ui.auth.screens.sign_in_screen}
99102
const SignInScreen({
100103
super.key,
@@ -114,6 +117,7 @@ class SignInScreen extends MultiProviderScreen {
114117
this.actions = const [],
115118
this.breakpoint = 800,
116119
this.styles,
120+
this.showPasswordVisibilityToggle = false,
117121
});
118122

119123
Future<void> _signInWithDifferentProvider(
@@ -165,6 +169,7 @@ class SignInScreen extends MultiProviderScreen {
165169
subtitleBuilder: subtitleBuilder,
166170
footerBuilder: footerBuilder,
167171
breakpoint: breakpoint,
172+
showPasswordVisibilityToggle: showPasswordVisibilityToggle,
168173
),
169174
);
170175
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright 2023, the Chromium project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:firebase_ui_auth/firebase_ui_auth.dart';
6+
import 'package:flutter/material.dart';
7+
import 'package:flutter_test/flutter_test.dart';
8+
9+
import '../test_utils.dart';
10+
11+
void main() {
12+
group("$SignInScreen", () {
13+
setUpAll(() {
14+
setFirebaseUiIsTestMode(true);
15+
});
16+
17+
testWidgets(
18+
"doesn't have password visibility toggle by default",
19+
(tester) async {
20+
await tester.pumpWidget(
21+
TestMaterialApp(
22+
child: SignInScreen(
23+
auth: MockAuth(),
24+
providers: [EmailAuthProvider()],
25+
),
26+
),
27+
);
28+
29+
expect(find.byIcon(Icons.visibility), findsNothing);
30+
},
31+
);
32+
33+
testWidgets('allows to add password visibility toggle', (tester) async {
34+
await tester.pumpWidget(
35+
TestMaterialApp(
36+
child: SignInScreen(
37+
auth: MockAuth(),
38+
providers: [EmailAuthProvider()],
39+
showPasswordVisibilityToggle: true,
40+
),
41+
),
42+
);
43+
44+
expect(find.byIcon(Icons.visibility), findsOneWidget);
45+
});
46+
});
47+
}

Diff for: packages/firebase_ui_auth/test/test_utils.dart

+8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:firebase_auth/firebase_auth.dart';
6+
import 'package:firebase_core/firebase_core.dart';
67
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
78
import 'package:flutter/material.dart';
89
import 'package:mockito/mockito.dart';
@@ -60,12 +61,19 @@ class MockDynamicLinks extends Mock implements FirebaseDynamicLinks {
6061
Stream<PendingDynamicLinkData> get onLink => _linkStream;
6162
}
6263

64+
class MockApp extends Mock implements FirebaseApp {}
65+
6366
class MockAuth extends Mock implements FirebaseAuth {
6467
MockUser? user;
6568

6669
@override
6770
User? get currentUser => user;
6871

72+
@override
73+
FirebaseApp get app => MockApp();
74+
75+
List<FirebaseApp> get apps => [app];
76+
6977
@override
7078
Future<UserCredential> signInWithCredential(
7179
AuthCredential? credential,

Diff for: packages/firebase_ui_auth/test/src/views/login_view_test.dart renamed to packages/firebase_ui_auth/test/views/login_view_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
88
import 'package:flutter/rendering.dart';
99
import 'package:flutter_test/flutter_test.dart';
1010

11-
import '../../test_utils.dart';
11+
import '../test_utils.dart';
1212

1313
void main() {
1414
group("$LoginView", () {

Diff for: packages/firebase_ui_localizations/example/windows/flutter/generated_plugin_registrant.cc

+3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
#include "generated_plugin_registrant.h"
88

99
#include <desktop_webview_auth/desktop_webview_auth_plugin.h>
10+
#include <firebase_auth/firebase_auth_plugin_c_api.h>
1011
#include <firebase_core/firebase_core_plugin_c_api.h>
1112

1213
void RegisterPlugins(flutter::PluginRegistry* registry) {
1314
DesktopWebviewAuthPluginRegisterWithRegistrar(
1415
registry->GetRegistrarForPlugin("DesktopWebviewAuthPlugin"));
16+
FirebaseAuthPluginCApiRegisterWithRegistrar(
17+
registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi"));
1518
FirebaseCorePluginCApiRegisterWithRegistrar(
1619
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
1720
}

Diff for: packages/firebase_ui_localizations/example/windows/flutter/generated_plugins.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
list(APPEND FLUTTER_PLUGIN_LIST
66
desktop_webview_auth
7+
firebase_auth
78
firebase_core
89
)
910

Diff for: packages/firebase_ui_oauth/example/windows/flutter/generated_plugin_registrant.cc

+3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
#include "generated_plugin_registrant.h"
88

99
#include <desktop_webview_auth/desktop_webview_auth_plugin.h>
10+
#include <firebase_auth/firebase_auth_plugin_c_api.h>
1011
#include <firebase_core/firebase_core_plugin_c_api.h>
1112
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
1213

1314
void RegisterPlugins(flutter::PluginRegistry* registry) {
1415
DesktopWebviewAuthPluginRegisterWithRegistrar(
1516
registry->GetRegistrarForPlugin("DesktopWebviewAuthPlugin"));
17+
FirebaseAuthPluginCApiRegisterWithRegistrar(
18+
registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi"));
1619
FirebaseCorePluginCApiRegisterWithRegistrar(
1720
registry->GetRegistrarForPlugin("FirebaseCorePluginCApi"));
1821
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(

Diff for: packages/firebase_ui_oauth/example/windows/flutter/generated_plugins.cmake

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
list(APPEND FLUTTER_PLUGIN_LIST
66
desktop_webview_auth
7+
firebase_auth
78
firebase_core
89
flutter_secure_storage_windows
910
)

0 commit comments

Comments
 (0)