diff --git a/lib/app.dart b/lib/app.dart index 7699fcf2..e6091da9 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -4,7 +4,6 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; import 'package:twonly/globals.dart'; import 'package:twonly/src/localization/generated/app_localizations.dart'; -import 'package:twonly/src/providers/connection.provider.dart'; import 'package:twonly/src/providers/purchases.provider.dart'; import 'package:twonly/src/providers/routing.provider.dart'; import 'package:twonly/src/providers/settings.provider.dart'; @@ -36,29 +35,16 @@ class _AppState extends State with WidgetsBindingObserver { globalIsAppInBackground = false; WidgetsBinding.instance.addObserver(this); - globalCallbackConnectionState = ({required isConnected}) async { - await context.read().updateConnectionState( - isConnected, - ); - await setUserPlan(); - }; - unawaited(initAsync()); } - Future setUserPlan() async { + Future initAsync() async { final user = await getUser(); if (user != null && mounted) { - if (mounted) { - context.read().updatePlan( - planFromString(user.subscriptionPlan), - ); - } + context.read().updatePlan( + planFromString(user.subscriptionPlan), + ); } - } - - Future initAsync() async { - await setUserPlan(); await apiService.connect(); await apiService.listenToNetworkChanges(); } @@ -81,7 +67,6 @@ class _AppState extends State with WidgetsBindingObserver { @override void dispose() { WidgetsBinding.instance.removeObserver(this); - globalCallbackConnectionState = ({required isConnected}) {}; super.dispose(); } diff --git a/lib/globals.dart b/lib/globals.dart index a44d104d..68b756a1 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -31,10 +31,6 @@ late UserData gUser; // App widget. // This callback called by the apiProvider -void Function({required bool isConnected}) globalCallbackConnectionState = - ({ - required isConnected, - }) {}; void Function() globalCallbackAppIsOutdated = () {}; void Function() globalCallbackNewDeviceRegistered = () {}; diff --git a/lib/src/providers/connection.provider.dart b/lib/src/providers/connection.provider.dart index 1b004aeb..d81b3d07 100644 --- a/lib/src/providers/connection.provider.dart +++ b/lib/src/providers/connection.provider.dart @@ -1,8 +1,23 @@ +import 'dart:async'; import 'package:flutter/foundation.dart'; +import 'package:twonly/globals.dart'; class CustomChangeProvider with ChangeNotifier, DiagnosticableTreeMixin { + CustomChangeProvider() { + _connSub = apiService.onConnectionStateUpdated.listen( + updateConnectionState, + ); + } bool _isConnected = false; bool get isConnected => _isConnected; + late StreamSubscription _connSub; + + @override + void dispose() { + _connSub.cancel(); + super.dispose(); + } + Future updateConnectionState(bool update) async { _isConnected = update; notifyListeners(); diff --git a/lib/src/providers/purchases.provider.dart b/lib/src/providers/purchases.provider.dart index 71e8c04b..c71685c1 100644 --- a/lib/src/providers/purchases.provider.dart +++ b/lib/src/providers/purchases.provider.dart @@ -39,6 +39,12 @@ class PurchasesProvider with ChangeNotifier, DiagnosticableTreeMixin { ); _planSub = apiService.onPlanUpdated.listen(updatePlan); + _connSub = apiService.onConnectionStateUpdated.listen((_) async { + final user = await getUser(); + if (user != null) { + updatePlan(planFromString(user.subscriptionPlan)); + } + }); loadPurchases(); } @@ -51,6 +57,7 @@ class PurchasesProvider with ChangeNotifier, DiagnosticableTreeMixin { final InAppPurchase iapConnection = IAPConnection.instance; late StreamSubscription _planSub; + late StreamSubscription _connSub; bool _userTriggeredBuyButton = false; void updatePlan(SubscriptionPlan newPlan) { @@ -229,6 +236,7 @@ class PurchasesProvider with ChangeNotifier, DiagnosticableTreeMixin { @override void dispose() { _planSub.cancel(); + _connSub.cancel(); _subscription.cancel(); super.dispose(); } diff --git a/lib/src/services/api.service.dart b/lib/src/services/api.service.dart index e0c62fd4..7e47f6f2 100644 --- a/lib/src/services/api.service.dart +++ b/lib/src/services/api.service.dart @@ -61,6 +61,9 @@ class ApiService { final _planUpdateController = StreamController.broadcast(); Stream get onPlanUpdated => _planUpdateController.stream; + final _connectionStateController = StreamController.broadcast(); + Stream get onConnectionStateUpdated => _connectionStateController.stream; + bool appIsOutdated = false; bool isAuthenticated = false; @@ -92,7 +95,7 @@ class ApiService { // Function is called after the user is authenticated at the server Future onAuthenticated() async { await initFCMAfterAuthenticated(); - globalCallbackConnectionState(isConnected: true); + _connectionStateController.add(true); if (globalIsInBackgroundTask) { await retransmitRawBytes(); @@ -125,13 +128,13 @@ class ApiService { Future onConnected() async { await authenticate(); _reconnectionDelay = 1; - globalCallbackConnectionState(isConnected: true); + _connectionStateController.add(true); } Future onClosed() async { _channel = null; isAuthenticated = false; - globalCallbackConnectionState(isConnected: false); + _connectionStateController.add(false); await twonlyDB.mediaFilesDao.resetPendingDownloadState(); await startReconnectionTimer(); }