Skip to content

Commit 45c380f

Browse files
Refactor analytics backend injection (#2135)
Remove direct calls to `Analytics(getBackend())` that instantiate `FirebaseAnalytics.instance` and make analytics backends injectable so tests can provide a mocked `FirebaseAnalytics` instance. Closes #1379 ------ [Codex Task](https://chatgpt.com/codex/tasks/task_e_6982616055c883229df96a2ea8383106)
1 parent 930ccab commit 45c380f

20 files changed

Lines changed: 76 additions & 55 deletions

app/integration_test/app_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void main() {
4242
dynamicLinkBloc: dependencies.dynamicLinkBloc,
4343
flavor: Flavor.dev,
4444
isIntegrationTest: true,
45+
analytics: dependencies.blocDependencies.analytics,
4546
),
4647
);
4748

app/integration_test/integration_test_old.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ void main() {
5353
dynamicLinkBloc: dependencies.dynamicLinkBloc,
5454
flavor: Flavor.dev,
5555
isIntegrationTest: true,
56+
analytics: dependencies.blocDependencies.analytics,
5657
),
5758
);
5859
}

app/lib/account/account_page_bloc.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,17 @@ class AccountPageBloc extends BlocBase {
2727
final GlobalKey<ScaffoldMessengerState> globalKey;
2828
final LinkProviderGateway linkProviderGateway;
2929
final UserGateway userGateway;
30-
31-
final _analytics = LinkProviderAnalytics(Analytics(getBackend()));
30+
final LinkProviderAnalytics _analytics;
3231

3332
late Stream<UserView> userViewStream;
3433

3534
AccountPageBloc({
3635
required this.userGateway,
3736
required this.linkProviderGateway,
3837
required this.globalKey,
38+
required Analytics analytics,
3939
required this.l10n,
40-
}) {
40+
}) : _analytics = LinkProviderAnalytics(analytics) {
4141
final userStream = userGateway.userStream;
4242
final authUserStream = userGateway.authUserStream;
4343

app/lib/account/account_page_bloc_factory.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
// SPDX-License-Identifier: EUPL-1.2
88

9+
import 'package:analytics/analytics.dart';
910
import 'package:authentification_base/authentification_gateways.dart';
1011
import 'package:bloc_base/bloc_base.dart';
1112
import 'package:flutter/material.dart';
@@ -15,17 +16,22 @@ import 'package:sharezone_localizations/sharezone_localizations.dart';
1516

1617
class AccountPageBlocFactory extends BlocBase {
1718
final UserGateway _userGateway;
19+
final Analytics _analytics;
1820

19-
AccountPageBlocFactory(this._userGateway);
21+
AccountPageBlocFactory(this._userGateway, this._analytics);
2022

2123
AccountPageBloc create(
2224
GlobalKey<ScaffoldMessengerState> scaffoldMessengerKey,
2325
SharezoneLocalizations l10n,
2426
) {
2527
return AccountPageBloc(
2628
globalKey: scaffoldMessengerKey,
27-
linkProviderGateway: LinkProviderGateway(_userGateway),
29+
linkProviderGateway: LinkProviderGateway(
30+
_userGateway,
31+
analytics: _analytics,
32+
),
2833
userGateway: _userGateway,
34+
analytics: _analytics,
2935
l10n: l10n,
3036
);
3137
}

app/lib/account/register_account_section.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:authentification_base/authentification_analytics.dart';
1111
import 'package:bloc_provider/bloc_provider.dart';
1212
import 'package:flutter/material.dart';
1313
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
14+
import 'package:provider/provider.dart';
1415
import 'package:sharezone/account/use_account_on_multiple_devices_instruction.dart';
1516
import 'package:sharezone/auth/email_and_password_link_page.dart';
1617
import 'package:sharezone/main/application_bloc.dart';
@@ -287,9 +288,7 @@ Future<void> showCredentialAlreadyInUseDialog(BuildContext context) async {
287288
);
288289

289290
if (showInstruction != null && showInstruction && context.mounted) {
290-
final LinkProviderAnalytics analytics = LinkProviderAnalytics(
291-
Analytics(getBackend()),
292-
);
291+
final analytics = LinkProviderAnalytics(context.read<Analytics>());
293292
analytics.logShowedUseMultipleDevicesInstruction();
294293
Navigator.pushNamed(context, UseAccountOnMultipleDevicesInstructions.tag);
295294
}

app/lib/auth/email_and_password_link_bloc.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ class EmailAndPasswordLinkBloc extends BlocBase
3131
final LinkProviderGateway linkProviderGateway;
3232
final UserEditBlocGateway userEditBlocGateway;
3333
final String initialName;
34-
35-
final LinkProviderAnalytics _analytics = LinkProviderAnalytics(
36-
Analytics(getBackend()),
37-
);
34+
final LinkProviderAnalytics _analytics;
3835

3936
final _emailController = BehaviorSubject<String>();
4037
final _passwordController = BehaviorSubject<String?>();
@@ -54,7 +51,8 @@ class EmailAndPasswordLinkBloc extends BlocBase
5451
this.initialName,
5552
this.scaffoldMessengerKey,
5653
this.l10n,
57-
) {
54+
Analytics analytics,
55+
) : _analytics = LinkProviderAnalytics(analytics) {
5856
_nameController.sink.add(initialName);
5957
}
6058

app/lib/auth/email_and_password_link_page.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
// SPDX-License-Identifier: EUPL-1.2
88

9+
import 'package:analytics/analytics.dart';
910
import 'package:authentification_base/authentification.dart';
1011
import 'package:bloc_provider/bloc_provider.dart';
1112
import 'package:flutter/material.dart';
@@ -70,12 +71,14 @@ class _EmailAndPasswordLinkPageState extends State<EmailAndPasswordLinkPage> {
7071
super.didChangeDependencies();
7172
if (_didInit) return;
7273
final api = BlocProvider.of<SharezoneContext>(context).api;
74+
final analytics = AnalyticsProvider.ofOrNullObject(context);
7375
bloc = EmailAndPasswordLinkBloc(
74-
LinkProviderGateway(api.user),
76+
LinkProviderGateway(api.user, analytics: analytics),
7577
UserEditBlocGateway(api.user, widget.user),
7678
widget.user.name,
7779
scaffoldKey,
7880
context.l10n,
81+
analytics,
7982
);
8083
delayKeyboard(context: context, focusNode: emailFocusNode);
8184
_didInit = true;

app/lib/auth/login_page.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ class _LoginPageState extends State<LoginPage> {
9999

100100
@override
101101
void initState() {
102-
final analytics = LoginAnalytics(Analytics(getBackend()));
103-
bloc = LoginBloc(analytics);
102+
bloc = LoginBloc(LoginAnalytics(context.read<Analytics>()));
104103
super.initState();
105104
showTipCardIfIsAvailable(context);
106105
}

app/lib/auth/sign_in_with_qr_code_page.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:cloud_firestore/cloud_firestore.dart';
1616
import 'package:cloud_functions/cloud_functions.dart';
1717
import 'package:crash_analytics/crash_analytics.dart';
1818
import 'package:flutter/material.dart' hide VerticalDivider;
19+
import 'package:provider/provider.dart';
1920
import 'package:qr_flutter/qr_flutter.dart';
2021
import 'package:sharezone/groups/src/widgets/contact_support.dart';
2122
import 'package:sharezone_widgets/sharezone_widgets.dart';
@@ -39,7 +40,7 @@ class SignInWithQrCodePage extends StatelessWidget {
3940
FirebaseFunctions.instanceFor(region: 'europe-west1'),
4041
),
4142
),
42-
loginAnalytics: LoginAnalytics(Analytics(getBackend())),
43+
loginAnalytics: LoginAnalytics(context.read<Analytics>()),
4344
crashAnalytics: getCrashAnalytics(),
4445
),
4546
child: _InnerSignInWithQrCodePage(),

app/lib/dashboard/widgets/dashboard_fab.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class _DashboardPageFAB extends StatelessWidget {
1414
const _DashboardPageFAB();
1515

1616
Future<void> openDashboardFabSheet(BuildContext context) async {
17-
final analytics = DashboardAnalytics(Analytics(getBackend()));
17+
final analytics = DashboardAnalytics(context.read<Analytics>());
1818
analytics.logOpenFabSheet();
1919

2020
final fabResult = await showModalBottomSheet<_DashboardFabResult>(

0 commit comments

Comments
 (0)