diff --git a/mobile/lib/core/configuration.dart b/mobile/lib/core/configuration.dart index 16a65d497f..f71256a61c 100644 --- a/mobile/lib/core/configuration.dart +++ b/mobile/lib/core/configuration.dart @@ -22,7 +22,6 @@ import 'package:photos/events/user_logged_out_event.dart'; import 'package:photos/models/key_attributes.dart'; import 'package:photos/models/key_gen_result.dart'; import 'package:photos/models/private_key_attributes.dart'; -import 'package:photos/services/billing_service.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/services/favorites_service.dart'; import "package:photos/services/home_widget_service.dart"; @@ -216,7 +215,6 @@ class Configuration { CollectionsService.instance.clearCache(); FavoritesService.instance.clearCache(); MemoriesService.instance.clearCache(); - BillingService.instance.clearCache(); SearchService.instance.clearCache(); unawaited(HomeWidgetService.instance.clearHomeWidget()); Bus.instance.fire(UserLoggedOutEvent()); diff --git a/mobile/lib/events/location_tag_updated_event.dart b/mobile/lib/events/location_tag_updated_event.dart index ae8db761c5..1d04c47c52 100644 --- a/mobile/lib/events/location_tag_updated_event.dart +++ b/mobile/lib/events/location_tag_updated_event.dart @@ -13,4 +13,5 @@ enum LocTagEventType { add, update, delete, + dataSetLoaded, } diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index c683ac950b..74ad7a99f4 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -28,28 +28,23 @@ import "package:photos/extensions/stop_watch.dart"; import "package:photos/l10n/l10n.dart"; import "package:photos/service_locator.dart"; import 'package:photos/services/app_lifecycle_service.dart'; -import 'package:photos/services/billing_service.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/services/favorites_service.dart'; import "package:photos/services/filedata/filedata_service.dart"; import 'package:photos/services/home_widget_service.dart'; import 'package:photos/services/local_file_update_service.dart'; import 'package:photos/services/local_sync_service.dart'; -import "package:photos/services/location_service.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import "package:photos/services/machine_learning/machine_learning_controller.dart"; import 'package:photos/services/machine_learning/ml_service.dart'; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; -import "package:photos/services/magic_cache_service.dart"; import 'package:photos/services/memories_service.dart'; import "package:photos/services/notification_service.dart"; import 'package:photos/services/push_service.dart'; import 'package:photos/services/remote_sync_service.dart'; import 'package:photos/services/search_service.dart'; -import 'package:photos/services/sync_service.dart'; -import 'package:photos/services/trash_sync_service.dart'; -import 'package:photos/services/user_remote_flag_service.dart'; -import 'package:photos/services/user_service.dart'; +import "package:photos/services/sync_service.dart"; +import "package:photos/services/user_service.dart"; import 'package:photos/ui/tools/app_lock.dart'; import 'package:photos/ui/tools/lock_screen.dart'; import 'package:photos/utils/crypto_util.dart'; @@ -246,18 +241,6 @@ Future _init(bool isBackground, {String via = ''}) async { await UserService.instance.init(); _logger.info("UserService init done $tlog"); - _logger.info("LocationService init $tlog"); - LocationService.instance.init(preferences); - _logger.info("LocationService init done $tlog"); - - _logger.info("UserRemoteFlagService init $tlog"); - await UserRemoteFlagService.instance.init(); - _logger.info("UserRemoteFlagService init done $tlog"); - - _logger.info("BillingService init $tlog"); - BillingService.instance.init(); - _logger.info("BillingService init done $tlog"); - _logger.info("CollectionsService init $tlog"); await CollectionsService.instance.init(preferences); _logger.info("CollectionsService init done $tlog"); @@ -272,7 +255,6 @@ Future _init(bool isBackground, {String via = ''}) async { await LocalSyncService.instance.init(preferences); _logger.info("LocalSyncService init done $tlog"); - TrashSyncService.instance.init(preferences); RemoteSyncService.instance.init(preferences); _logger.info("SyncService init $tlog"); @@ -301,7 +283,6 @@ Future _init(bool isBackground, {String via = ''}) async { _logger.info("PushService/HomeWidget done $tlog"); unawaited(SemanticSearchService.instance.init()); MachineLearningController.instance.init(); - _logger.info("MachineLearningController done $tlog"); unawaited(MLService.instance.init()); PersonService.init( @@ -309,8 +290,6 @@ Future _init(bool isBackground, {String via = ''}) async { MLDataDB.instance, preferences, ); - MagicCacheService.instance.init(preferences); - initComplete = true; _logger.info("Initialization done $tlog"); } catch (e, s) { diff --git a/mobile/lib/service_locator.dart b/mobile/lib/service_locator.dart index a1fd77ae93..2f023e229b 100644 --- a/mobile/lib/service_locator.dart +++ b/mobile/lib/service_locator.dart @@ -4,9 +4,14 @@ import "package:ente_cast_normal/ente_cast_normal.dart"; import "package:ente_feature_flag/ente_feature_flag.dart"; import "package:package_info_plus/package_info_plus.dart"; import "package:photos/gateways/entity_gw.dart"; +import "package:photos/services/billing_service.dart"; import "package:photos/services/entity_service.dart"; +import "package:photos/services/location_service.dart"; +import "package:photos/services/magic_cache_service.dart"; import "package:photos/services/storage_bonus_service.dart"; +import "package:photos/services/trash_sync_service.dart"; import "package:photos/services/update_service.dart"; +import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/utils/local_settings.dart"; import "package:shared_preferences/shared_preferences.dart"; @@ -78,3 +83,43 @@ EntityService get entityService { ); return _entityService!; } + +TrashSyncService? _trashSyncService; +TrashSyncService get trashSyncService { + _trashSyncService ??= TrashSyncService( + ServiceLocator.instance.prefs, + ServiceLocator.instance.enteDio, + ); + return _trashSyncService!; +} + +LocationService? _locationService; +LocationService get locationService { + _locationService ??= LocationService(ServiceLocator.instance.prefs); + return _locationService!; +} + +UserRemoteFlagService? _userRemoteFlagService; +UserRemoteFlagService get userRemoteFlagService { + _userRemoteFlagService ??= UserRemoteFlagService( + ServiceLocator.instance.enteDio, + ServiceLocator.instance.prefs, + ); + return _userRemoteFlagService!; +} + +MagicCacheService? _magicCacheService; +MagicCacheService get magicCacheService { + _magicCacheService ??= MagicCacheService( + ServiceLocator.instance.prefs, + ); + return _magicCacheService!; +} + +BillingService? _billingService; +BillingService get billingService { + _billingService ??= BillingService( + ServiceLocator.instance.enteDio, + ); + return _billingService!; +} diff --git a/mobile/lib/services/billing_service.dart b/mobile/lib/services/billing_service.dart index 1d67531cc9..2037cb8ad0 100644 --- a/mobile/lib/services/billing_service.dart +++ b/mobile/lib/services/billing_service.dart @@ -7,7 +7,6 @@ import 'package:flutter/material.dart'; import 'package:in_app_purchase/in_app_purchase.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/errors.dart'; -import 'package:photos/core/network/network.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/billing_plan.dart'; import 'package:photos/models/subscription.dart'; @@ -32,16 +31,16 @@ const kFamilyPlanManagementUrl = String.fromEnvironment( ); class BillingService { - BillingService._privateConstructor(); - - static final BillingService instance = BillingService._privateConstructor(); - - final _logger = Logger("BillingService"); - final _enteDio = NetworkClient.instance.enteDio; + late final _logger = Logger("BillingService"); + final Dio _enteDio; bool _isOnSubscriptionPage = false; Future? _future; + BillingService(this._enteDio) { + _logger.finest("BillingService constructor"); + init(); + } void init() { // if (Platform.isIOS && kDebugMode) { diff --git a/mobile/lib/services/location_service.dart b/mobile/lib/services/location_service.dart index 5fc2fc0777..6c90408950 100644 --- a/mobile/lib/services/location_service.dart +++ b/mobile/lib/services/location_service.dart @@ -3,6 +3,7 @@ import "dart:io"; import "dart:math"; import "package:computer/computer.dart"; +import "package:flutter/foundation.dart"; import "package:logging/logging.dart"; import "package:photos/core/constants.dart"; import "package:photos/core/event_bus.dart"; @@ -18,21 +19,23 @@ import "package:photos/services/remote_assets_service.dart"; import "package:shared_preferences/shared_preferences.dart"; class LocationService { - late SharedPreferences prefs; + final SharedPreferences prefs; final Logger _logger = Logger((LocationService).toString()); final Computer _computer = Computer.shared(); - LocationService._privateConstructor(); - - static final LocationService instance = LocationService._privateConstructor(); + // If the discovery section is loaded before the cities are loaded, then we + // need to refresh the discovery section after the cities are loaded. + bool reloadLocationDiscoverySection = false; static const kCitiesRemotePath = "https://static.ente.io/world_cities.json"; List _cities = []; - void init(SharedPreferences preferences) { - prefs = preferences; - _loadCities(); + LocationService(this.prefs) { + debugPrint('LocationService constructor'); + Future.delayed(const Duration(seconds: 3), () { + _loadCities(); + }); } Future>> _getStoredLocationTags() async { @@ -46,6 +49,9 @@ class LocationService { List allFiles, String query, ) async { + if (allFiles.isEmpty && query.isEmpty) { + reloadLocationDiscoverySection = true; + } final EnteWatch w = EnteWatch("cities_search")..start(); w.log('start for files ${allFiles.length} and query $query'); final result = await _computer.compute( @@ -223,9 +229,13 @@ class LocationService { await _computer.compute(parseCities, param: {"filePath": file.path}); final endTime = DateTime.now(); _logger.info( - "Loaded cities in ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms", + "Loaded cities in ${(endTime.millisecondsSinceEpoch - startTime.millisecondsSinceEpoch)}ms, reloadingDiscovery: $reloadLocationDiscoverySection", ); - _logger.info("Loaded cities"); + if (reloadLocationDiscoverySection) { + reloadLocationDiscoverySection = false; + Bus.instance + .fire(LocationTagUpdatedEvent(LocTagEventType.dataSetLoaded)); + } } catch (e, s) { _logger.severe("Failed to load cities", e, s); } diff --git a/mobile/lib/services/machine_learning/ml_service.dart b/mobile/lib/services/machine_learning/ml_service.dart index c09b6874bd..1c88f8641d 100644 --- a/mobile/lib/services/machine_learning/ml_service.dart +++ b/mobile/lib/services/machine_learning/ml_service.dart @@ -27,7 +27,6 @@ import "package:photos/services/machine_learning/ml_indexing_isolate.dart"; import 'package:photos/services/machine_learning/ml_result.dart'; import "package:photos/services/machine_learning/semantic_search/clip/clip_image_encoder.dart"; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; -import "package:photos/services/magic_cache_service.dart"; import "package:photos/utils/ml_util.dart"; import "package:photos/utils/network_util.dart"; import "package:synchronized/synchronized.dart"; @@ -133,7 +132,7 @@ class MLService { } if (_mlControllerStatus == true) { // refresh discover section - MagicCacheService.instance.updateCache(forced: force).ignore(); + magicCacheService.updateCache(forced: force).ignore(); } await indexAllImages(); if ((await MLDataDB.instance.getUnclusteredFaceCount()) > 0) { @@ -141,7 +140,7 @@ class MLService { } if (_mlControllerStatus == true) { // refresh discover section - MagicCacheService.instance.updateCache().ignore(); + magicCacheService.updateCache().ignore(); } } catch (e, s) { _logger.severe("runAllML failed", e, s); @@ -213,7 +212,7 @@ class MLService { fileAnalyzedCount += sumFutures; } if (fileAnalyzedCount > 0) { - MagicCacheService.instance.queueUpdate('fileIndexed'); + magicCacheService.queueUpdate('fileIndexed'); } _logger.info( "`indexAllImages()` finished. Analyzed $fileAnalyzedCount images, in ${stopwatch.elapsed.inSeconds} seconds (avg of ${stopwatch.elapsed.inSeconds / fileAnalyzedCount} seconds per image)", diff --git a/mobile/lib/services/magic_cache_service.dart b/mobile/lib/services/magic_cache_service.dart index ecb4c4629f..895db2061b 100644 --- a/mobile/lib/services/magic_cache_service.dart +++ b/mobile/lib/services/magic_cache_service.dart @@ -155,29 +155,26 @@ class MagicCacheService { /// lot of other things are happening. static const _kCacheUpdateDelay = Duration(seconds: 10); - late SharedPreferences _prefs; - final Logger _logger = Logger((MagicCacheService).toString()); - MagicCacheService._privateConstructor(); + final SharedPreferences _prefs; + late final Logger _logger = Logger((MagicCacheService).toString()); Future>? _magicCacheFuture; Future>? _promptFuture; final Set _pendingUpdateReason = {}; bool _isUpdateInProgress = false; - static final MagicCacheService instance = - MagicCacheService._privateConstructor(); - - void init(SharedPreferences preferences) { - _logger.info("Initializing MagicCacheService"); - _prefs = preferences; - Future.delayed(_kCacheUpdateDelay, () { - _updateCacheIfTheTimeHasCome(); - }); + MagicCacheService(this._prefs) { + _logger.fine("MagicCacheService constructor"); Bus.instance.on().listen((event) { queueUpdate("File uploaded"); }); + Future.delayed(_kCacheUpdateDelay, () { + _updateCacheIfTheTimeHasCome(); + }); } + + Future _resetLastMagicCacheUpdateTime() async { await _prefs.setInt( _lastMagicCacheUpdateTime, diff --git a/mobile/lib/services/remote_sync_service.dart b/mobile/lib/services/remote_sync_service.dart index b5f1fecd82..3de481fc95 100644 --- a/mobile/lib/services/remote_sync_service.dart +++ b/mobile/lib/services/remote_sync_service.dart @@ -30,7 +30,6 @@ import 'package:photos/services/ignored_files_service.dart'; import 'package:photos/services/local_file_update_service.dart'; import "package:photos/services/notification_service.dart"; import 'package:photos/services/sync_service.dart'; -import 'package:photos/services/trash_sync_service.dart'; import 'package:photos/utils/diff_fetcher.dart'; import 'package:photos/utils/file_uploader.dart'; import 'package:photos/utils/file_util.dart'; @@ -121,7 +120,7 @@ class RemoteSyncService { await syncDeviceCollectionFilesForUpload(); } await _pullDiff(); - await TrashSyncService.instance.syncTrash(); + await trashSyncService.syncTrash(); if (!hasSyncedBefore) { await _prefs.setBool(_isFirstRemoteSyncDone, true); await syncDeviceCollectionFilesForUpload(); diff --git a/mobile/lib/services/search_service.dart b/mobile/lib/services/search_service.dart index b1753ef845..22b02d953b 100644 --- a/mobile/lib/services/search_service.dart +++ b/mobile/lib/services/search_service.dart @@ -32,7 +32,6 @@ import "package:photos/services/location_service.dart"; import "package:photos/services/machine_learning/face_ml/face_filtering/face_filtering_constants.dart"; import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/semantic_search/semantic_search_service.dart'; -import "package:photos/services/magic_cache_service.dart"; import "package:photos/states/location_screen_state.dart"; import "package:photos/ui/viewer/location/add_location_sheet.dart"; import "package:photos/ui/viewer/location/location_screen.dart"; @@ -181,7 +180,7 @@ class SearchService { BuildContext context, ) async { if (localSettings.isMLIndexingEnabled) { - return MagicCacheService.instance.getMagicGenericSearchResult(context); + return magicCacheService.getMagicGenericSearchResult(context); } else { return []; } @@ -634,8 +633,7 @@ class SearchService { } Future> getLocationResults(String query) async { - final locationTagEntities = - (await LocationService.instance.getLocationTags()); + final locationTagEntities = (await locationService.getLocationTags()); final Map, List> result = {}; final bool showNoLocationTag = query.length > 2 && "No Location Tag".toLowerCase().startsWith(query.toLowerCase()); @@ -720,8 +718,7 @@ class SearchService { if (allCitiesSearch) { query = ''; } - final results = - await LocationService.instance.getFilesInCity(allFiles, query); + final results = await locationService.getFilesInCity(allFiles, query); final List sortedByResultCount = results.keys.toList() ..sort((a, b) => results[b]!.length.compareTo(results[a]!.length)); for (final city in sortedByResultCount) { @@ -912,8 +909,7 @@ class SearchService { try { final Map, List> tagToItemsMap = {}; final List tagSearchResults = []; - final locationTagEntities = - (await LocationService.instance.getLocationTags()); + final locationTagEntities = (await locationService.getLocationTags()); final allFiles = await getAllFiles(); final List filesWithNoLocTag = []; @@ -969,8 +965,8 @@ class SearchService { } } if (limit == null || tagSearchResults.length < limit) { - final results = await LocationService.instance - .getFilesInCity(filesWithNoLocTag, ''); + final results = + await locationService.getFilesInCity(filesWithNoLocTag, ''); final List sortedByResultCount = results.keys.toList() ..sort((a, b) => results[b]!.length.compareTo(results[a]!.length)); for (final city in sortedByResultCount) { diff --git a/mobile/lib/services/trash_sync_service.dart b/mobile/lib/services/trash_sync_service.dart index e5c3ed07fe..d1224ab25f 100644 --- a/mobile/lib/services/trash_sync_service.dart +++ b/mobile/lib/services/trash_sync_service.dart @@ -4,7 +4,6 @@ import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/event_bus.dart'; -import 'package:photos/core/network/network.dart'; import 'package:photos/db/trash_db.dart'; import 'package:photos/events/collection_updated_event.dart'; import 'package:photos/events/force_reload_trash_page_event.dart'; @@ -20,16 +19,16 @@ import 'package:shared_preferences/shared_preferences.dart'; class TrashSyncService { final _logger = Logger("TrashSyncService"); - final _diffFetcher = TrashDiffFetcher(); + final TrashDiffFetcher _diffFetcher; final _trashDB = TrashDB.instance; static const kLastTrashSyncTime = "last_trash_sync_time"; late SharedPreferences _prefs; + final Dio _enteDio; - TrashSyncService._privateConstructor(); - - static final TrashSyncService instance = - TrashSyncService._privateConstructor(); - final _enteDio = NetworkClient.instance.enteDio; + TrashSyncService(this._prefs, this._enteDio) + : _diffFetcher = TrashDiffFetcher(_enteDio) { + _logger.fine("TrashSyncService constructor"); + } void init(SharedPreferences preferences) { _prefs = preferences; diff --git a/mobile/lib/services/user_remote_flag_service.dart b/mobile/lib/services/user_remote_flag_service.dart index a3b1e5553c..7a49b38d53 100644 --- a/mobile/lib/services/user_remote_flag_service.dart +++ b/mobile/lib/services/user_remote_flag_service.dart @@ -2,23 +2,19 @@ import 'dart:async'; import 'dart:io'; import 'package:collection/collection.dart'; +import "package:dio/dio.dart"; +import "package:flutter/foundation.dart"; import 'package:logging/logging.dart'; import 'package:photos/core/event_bus.dart'; -import 'package:photos/core/network/network.dart'; import 'package:photos/events/notification_event.dart'; import "package:photos/service_locator.dart"; import 'package:photos/services/user_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; class UserRemoteFlagService { - final _enteDio = NetworkClient.instance.enteDio; - final _logger = Logger((UserRemoteFlagService).toString()); - late SharedPreferences _prefs; - - UserRemoteFlagService._privateConstructor(); - - static final UserRemoteFlagService instance = - UserRemoteFlagService._privateConstructor(); + final Dio _enteDio; + late final _logger = Logger((UserRemoteFlagService).toString()); + final SharedPreferences _prefs; static const String recoveryVerificationFlag = "recoveryKeyVerified"; static const String mapEnabled = "mapEnabled"; @@ -26,8 +22,8 @@ class UserRemoteFlagService { static const String needRecoveryKeyVerification = "needRecoveryKeyVerification"; - Future init() async { - _prefs = await SharedPreferences.getInstance(); + UserRemoteFlagService(this._enteDio, this._prefs) { + debugPrint("UserRemoteFlagService constructor"); } bool shouldShowRecoveryVerification() { diff --git a/mobile/lib/ui/account/verify_recovery_page.dart b/mobile/lib/ui/account/verify_recovery_page.dart index f4acc47385..ef6066b662 100644 --- a/mobile/lib/ui/account/verify_recovery_page.dart +++ b/mobile/lib/ui/account/verify_recovery_page.dart @@ -1,5 +1,3 @@ -import 'dart:ui'; - import 'package:bip39/bip39.dart' as bip39; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; @@ -8,8 +6,8 @@ import 'package:photos/core/event_bus.dart'; import 'package:photos/ente_theme_data.dart'; import 'package:photos/events/notification_event.dart'; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/services/local_authentication_service.dart'; -import 'package:photos/services/user_remote_flag_service.dart'; import 'package:photos/services/user_service.dart'; import "package:photos/theme/ente_theme.dart"; import 'package:photos/ui/account/recovery_key_page.dart'; @@ -42,7 +40,7 @@ class _VerifyRecoveryPageState extends State { final String recoveryKeyWords = bip39.entropyToMnemonic(recoveryKey); if (inputKey == recoveryKey || inputKey == recoveryKeyWords) { try { - await UserRemoteFlagService.instance.markRecoveryVerificationAsDone(); + await userRemoteFlagService.markRecoveryVerificationAsDone(); } catch (e) { await dialog.hide(); if (e is DioError && e.type == DioErrorType.other) { diff --git a/mobile/lib/ui/home/status_bar_widget.dart b/mobile/lib/ui/home/status_bar_widget.dart index d676a42945..df3efa0c1d 100644 --- a/mobile/lib/ui/home/status_bar_widget.dart +++ b/mobile/lib/ui/home/status_bar_widget.dart @@ -8,8 +8,8 @@ import 'package:photos/ente_theme_data.dart'; import 'package:photos/events/notification_event.dart'; import 'package:photos/events/sync_status_update_event.dart'; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/services/sync_service.dart'; -import 'package:photos/services/user_remote_flag_service.dart'; import "package:photos/theme/ente_theme.dart"; import 'package:photos/theme/text_style.dart'; import 'package:photos/ui/account/verify_recovery_page.dart'; @@ -112,7 +112,7 @@ class _StatusBarWidgetState extends State { _showErrorBanner ? HeaderErrorWidget(error: _syncError) : const SizedBox.shrink(), - UserRemoteFlagService.instance.shouldShowRecoveryVerification() && + userRemoteFlagService.shouldShowRecoveryVerification() && !_showErrorBanner ? Padding( padding: diff --git a/mobile/lib/ui/map/enable_map.dart b/mobile/lib/ui/map/enable_map.dart index 770137023e..335b362ae1 100644 --- a/mobile/lib/ui/map/enable_map.dart +++ b/mobile/lib/ui/map/enable_map.dart @@ -1,6 +1,7 @@ import "package:flutter/cupertino.dart"; import "package:photos/generated/l10n.dart"; import 'package:photos/models/button_result.dart'; +import "package:photos/service_locator.dart"; import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/ui/components/buttons/button_widget.dart"; import "package:photos/ui/components/dialog_widget.dart"; @@ -9,7 +10,7 @@ import "package:photos/utils/toast_util.dart"; Future requestForMapEnable(BuildContext context) async { const String flagName = UserRemoteFlagService.mapEnabled; - if (UserRemoteFlagService.instance.getCachedBoolValue(flagName)) { + if (userRemoteFlagService.getCachedBoolValue(flagName)) { return true; } @@ -25,7 +26,7 @@ Future requestForMapEnable(BuildContext context) async { labelText: S.of(context).enableMaps, isInAlert: true, onTap: () async { - await UserRemoteFlagService.instance.setBoolValue( + await userRemoteFlagService.setBoolValue( flagName, true, ); @@ -51,6 +52,5 @@ Future requestForMapEnable(BuildContext context) async { //For debugging. void disableMap() { - UserRemoteFlagService.instance - .setBoolValue(UserRemoteFlagService.mapEnabled, false); + userRemoteFlagService.setBoolValue(UserRemoteFlagService.mapEnabled, false); } diff --git a/mobile/lib/ui/payment/payment_web_page.dart b/mobile/lib/ui/payment/payment_web_page.dart index e3bf5cccd0..162aa99f6f 100644 --- a/mobile/lib/ui/payment/payment_web_page.dart +++ b/mobile/lib/ui/payment/payment_web_page.dart @@ -9,6 +9,7 @@ import "package:photos/core/constants.dart"; import 'package:photos/ente_theme_data.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/subscription.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/billing_service.dart'; import 'package:photos/services/user_service.dart'; import 'package:photos/ui/common/loading_widget.dart'; @@ -29,7 +30,7 @@ class PaymentWebPage extends StatefulWidget { class _PaymentWebPageState extends State { final _logger = Logger("PaymentWebPageState"); final UserService userService = UserService.instance; - final BillingService billingService = BillingService.instance; + late final BillingService billService = billingService; final String basePaymentUrl = kWebPaymentBaseEndpoint; InAppWebViewController? webView; double progress = 0; @@ -229,7 +230,7 @@ class _PaymentWebPageState extends State { final checkoutSessionID = queryParams['session_id'] ?? ''; try { // ignore: unused_local_variable - final response = await billingService.verifySubscription( + final response = await billService.verifySubscription( widget.planId, checkoutSessionID, paymentProvider: stripe, diff --git a/mobile/lib/ui/payment/store_subscription_page.dart b/mobile/lib/ui/payment/store_subscription_page.dart index 86d29fd715..e937af6a4d 100644 --- a/mobile/lib/ui/payment/store_subscription_page.dart +++ b/mobile/lib/ui/payment/store_subscription_page.dart @@ -12,7 +12,7 @@ import "package:photos/generated/l10n.dart"; import 'package:photos/models/billing_plan.dart'; import 'package:photos/models/subscription.dart'; import 'package:photos/models/user_details.dart'; -import 'package:photos/services/billing_service.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/user_service.dart'; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; @@ -46,7 +46,7 @@ class StoreSubscriptionPage extends StatefulWidget { class _StoreSubscriptionPageState extends State { final _logger = Logger("SubscriptionPage"); - final _billingService = BillingService.instance; + late final _billingService = billingService; final _userService = UserService.instance; Subscription? _currentSubscription; late StreamSubscription _purchaseUpdateSubscription; @@ -445,7 +445,7 @@ class _StoreSubscriptionPageState extends State { (route) => false, ); unawaited( - BillingService.instance.verifySubscription( + _billingService.verifySubscription( freeProductID, "", paymentProvider: "ente", @@ -501,7 +501,7 @@ class _StoreSubscriptionPageState extends State { (route) => false, ); unawaited( - BillingService.instance.verifySubscription( + _billingService.verifySubscription( freeProductID, "", paymentProvider: "ente", @@ -625,7 +625,7 @@ class _StoreSubscriptionPageState extends State { (route) => false, ); unawaited( - BillingService.instance.verifySubscription( + _billingService.verifySubscription( freeProductID, "", paymentProvider: "ente", diff --git a/mobile/lib/ui/payment/stripe_subscription_page.dart b/mobile/lib/ui/payment/stripe_subscription_page.dart index 93479b8038..eceefa4f36 100644 --- a/mobile/lib/ui/payment/stripe_subscription_page.dart +++ b/mobile/lib/ui/payment/stripe_subscription_page.dart @@ -9,7 +9,7 @@ import "package:photos/generated/l10n.dart"; import 'package:photos/models/billing_plan.dart'; import 'package:photos/models/subscription.dart'; import 'package:photos/models/user_details.dart'; -import 'package:photos/services/billing_service.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/user_service.dart'; import "package:photos/theme/colors.dart"; import 'package:photos/theme/ente_theme.dart'; @@ -46,7 +46,7 @@ class StripeSubscriptionPage extends StatefulWidget { } class _StripeSubscriptionPageState extends State { - final _billingService = BillingService.instance; + late final _billingService = billingService; final _userService = UserService.instance; Subscription? _currentSubscription; late ProgressDialog _dialog; @@ -484,7 +484,7 @@ class _StripeSubscriptionPageState extends State { (route) => false, ); unawaited( - BillingService.instance.verifySubscription( + _billingService.verifySubscription( freeProductID, "", paymentProvider: "ente", @@ -609,7 +609,7 @@ class _StripeSubscriptionPageState extends State { (route) => false, ); unawaited( - BillingService.instance.verifySubscription( + _billingService.verifySubscription( freeProductID, "", paymentProvider: "ente", diff --git a/mobile/lib/ui/settings/advanced_settings_screen.dart b/mobile/lib/ui/settings/advanced_settings_screen.dart index b2e5f5a488..ca95d931e2 100644 --- a/mobile/lib/ui/settings/advanced_settings_screen.dart +++ b/mobile/lib/ui/settings/advanced_settings_screen.dart @@ -173,19 +173,17 @@ class _AdvancedSettingsScreenState extends State { singleBorderRadius: 8, alignCaptionedTextToLeft: true, trailingWidget: ToggleSwitchWidget( - value: () => UserRemoteFlagService.instance - .getCachedBoolValue( + value: () => + userRemoteFlagService.getCachedBoolValue( UserRemoteFlagService.mapEnabled, ), onChanged: () async { - final isEnabled = UserRemoteFlagService - .instance - .getCachedBoolValue( + final isEnabled = + userRemoteFlagService.getCachedBoolValue( UserRemoteFlagService.mapEnabled, ); - await UserRemoteFlagService.instance - .setBoolValue( + await userRemoteFlagService.setBoolValue( UserRemoteFlagService.mapEnabled, !isEnabled, ); diff --git a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart index fa2682ec13..4037ece831 100644 --- a/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart +++ b/mobile/lib/ui/settings/debug/ml_debug_section_widget.dart @@ -11,7 +11,6 @@ import "package:photos/services/machine_learning/face_ml/face_recognition_servic import "package:photos/services/machine_learning/face_ml/person/person_service.dart"; import 'package:photos/services/machine_learning/ml_service.dart'; import "package:photos/services/machine_learning/semantic_search/semantic_search_service.dart"; -import "package:photos/services/magic_cache_service.dart"; import 'package:photos/theme/ente_theme.dart'; import 'package:photos/ui/components/captioned_text_widget.dart'; import 'package:photos/ui/components/expandable_menu_item_widget.dart'; @@ -239,7 +238,7 @@ class _MLDebugSectionWidgetState extends State { trailingIconIsMuted: true, onTap: () async { try { - await MagicCacheService.instance.updateCache(forced: true); + await magicCacheService.updateCache(forced: true); } catch (e, s) { logger.warning('Update discover failed', e, s); await showGenericErrorDialog(context: context, error: e); diff --git a/mobile/lib/ui/settings/general_section_widget.dart b/mobile/lib/ui/settings/general_section_widget.dart index c01db225d3..ccc941b4ee 100644 --- a/mobile/lib/ui/settings/general_section_widget.dart +++ b/mobile/lib/ui/settings/general_section_widget.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import "package:photos/app.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/l10n/l10n.dart"; -import 'package:photos/services/billing_service.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/user_service.dart'; import 'package:photos/theme/ente_theme.dart'; import "package:photos/ui/components/captioned_text_widget.dart"; @@ -118,7 +118,7 @@ class GeneralSectionWidget extends StatelessWidget { final userDetails = await UserService.instance.getUserDetailsV2(memoryCount: false); // ignore: unawaited_futures - BillingService.instance.launchFamilyPortal(context, userDetails); + billingService.launchFamilyPortal(context, userDetails); } void _onNotificationsTapped(BuildContext context) { diff --git a/mobile/lib/ui/settings/ml/enable_ml_consent.dart b/mobile/lib/ui/settings/ml/enable_ml_consent.dart index d156954e85..66ee553c81 100644 --- a/mobile/lib/ui/settings/ml/enable_ml_consent.dart +++ b/mobile/lib/ui/settings/ml/enable_ml_consent.dart @@ -1,5 +1,6 @@ import "package:flutter/material.dart"; import "package:photos/generated/l10n.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/common/web_page.dart"; @@ -140,7 +141,7 @@ class _EnableMachineLearningConsentState Future enableMlConsent(BuildContext context) async { try { - await UserRemoteFlagService.instance.setBoolValue( + await userRemoteFlagService.setBoolValue( UserRemoteFlagService.mlEnabled, true, ); diff --git a/mobile/lib/ui/settings/ml/machine_learning_settings_page.dart b/mobile/lib/ui/settings/ml/machine_learning_settings_page.dart index 44264d890e..67b8235421 100644 --- a/mobile/lib/ui/settings/ml/machine_learning_settings_page.dart +++ b/mobile/lib/ui/settings/ml/machine_learning_settings_page.dart @@ -210,7 +210,7 @@ class _MachineLearningSettingsPageState } Future toggleIndexingState() async { - final hasGivenConsent = UserRemoteFlagService.instance + final hasGivenConsent = userRemoteFlagService .getCachedBoolValue(UserRemoteFlagService.mlEnabled); if (!localSettings.isMLIndexingEnabled && !hasGivenConsent) { final result = await Navigator.push( @@ -232,8 +232,10 @@ class _MachineLearningSettingsPageState unawaited(MLService.instance.runAllML(force: true)); } else { MLService.instance.pauseIndexingAndClustering(); - await UserRemoteFlagService.instance - .setBoolValue(UserRemoteFlagService.mlEnabled, false); + await userRemoteFlagService.setBoolValue( + UserRemoteFlagService.mlEnabled, + false, + ); } if (mounted) { setState(() {}); diff --git a/mobile/lib/ui/viewer/file_details/location_tags_widget.dart b/mobile/lib/ui/viewer/file_details/location_tags_widget.dart index 3544eeb127..29bcee4da3 100644 --- a/mobile/lib/ui/viewer/file_details/location_tags_widget.dart +++ b/mobile/lib/ui/viewer/file_details/location_tags_widget.dart @@ -9,7 +9,7 @@ import "package:photos/core/event_bus.dart"; import "package:photos/events/location_tag_updated_event.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/file.dart"; -import "package:photos/services/location_service.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/search_service.dart"; import "package:photos/services/user_remote_flag_service.dart"; import "package:photos/states/location_screen_state.dart"; @@ -105,8 +105,8 @@ class _LocationTagsWidgetState extends State { Future> _getLocationTags() async { // await Future.delayed(const Duration(seconds: 1)); - final locationTags = await LocationService.instance - .enclosingLocationTags(widget.file.location!); + final locationTags = + await locationService.enclosingLocationTags(widget.file.location!); if (locationTags.isEmpty) { if (mounted) { setState(() { @@ -183,7 +183,7 @@ class _InfoMapState extends State { @override void initState() { super.initState(); - _hasEnabledMap = UserRemoteFlagService.instance + _hasEnabledMap = userRemoteFlagService .getCachedBoolValue(UserRemoteFlagService.mapEnabled); _fileLat = widget.file.location!.latitude!; _fileLng = widget.file.location!.longitude!; diff --git a/mobile/lib/ui/viewer/location/add_location_sheet.dart b/mobile/lib/ui/viewer/location/add_location_sheet.dart index 9e1345dc04..29c79babad 100644 --- a/mobile/lib/ui/viewer/location/add_location_sheet.dart +++ b/mobile/lib/ui/viewer/location/add_location_sheet.dart @@ -4,7 +4,7 @@ import "package:modal_bottom_sheet/modal_bottom_sheet.dart"; import "package:photos/core/constants.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/location/location.dart"; -import "package:photos/services/location_service.dart"; +import "package:photos/service_locator.dart"; import 'package:photos/states/location_state.dart'; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; @@ -255,7 +255,7 @@ class _AddLocationSheetState extends State { final coordinates = locationData.centerPoint; final radius = locationData.selectedRadius; - await LocationService.instance.addLocation( + await locationService.addLocation( _textEditingController.text.trim(), coordinates, radius, diff --git a/mobile/lib/ui/viewer/location/edit_center_point_tile_widget.dart b/mobile/lib/ui/viewer/location/edit_center_point_tile_widget.dart index f78009b87f..07fe0cf489 100644 --- a/mobile/lib/ui/viewer/location/edit_center_point_tile_widget.dart +++ b/mobile/lib/ui/viewer/location/edit_center_point_tile_widget.dart @@ -1,7 +1,7 @@ import "package:flutter/material.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/location/location.dart"; -import "package:photos/services/location_service.dart"; +import "package:photos/service_locator.dart"; import "package:photos/states/location_state.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/components/buttons/icon_button_widget.dart"; @@ -14,7 +14,7 @@ class EditCenterPointTileWidget extends StatelessWidget { Widget build(BuildContext context) { final textTheme = getEnteTextTheme(context); final colorScheme = getEnteColorScheme(context); - final centerPointInDMS = LocationService.instance.convertLocationToDMS( + final centerPointInDMS = locationService.convertLocationToDMS( InheritedLocationTagData.of(context).centerPoint, ); return Row( diff --git a/mobile/lib/ui/viewer/location/edit_location_sheet.dart b/mobile/lib/ui/viewer/location/edit_location_sheet.dart index 66df52e909..2aa071fb6d 100644 --- a/mobile/lib/ui/viewer/location/edit_location_sheet.dart +++ b/mobile/lib/ui/viewer/location/edit_location_sheet.dart @@ -5,7 +5,7 @@ import "package:photos/core/constants.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/local_entity_data.dart"; import "package:photos/models/location_tag/location_tag.dart"; -import "package:photos/services/location_service.dart"; +import "package:photos/service_locator.dart"; import "package:photos/states/location_state.dart"; import "package:photos/theme/colors.dart"; import "package:photos/theme/ente_theme.dart"; @@ -244,7 +244,7 @@ class _EditLocationSheetState extends State { Future _editLocation() async { final locationTagState = InheritedLocationTagData.of(context); - await LocationService.instance.updateLocationTag( + await locationService.updateLocationTag( locationTagEntity: locationTagState.locationTagEntity!, newRadius: locationTagState.selectedRadius, newName: _textEditingController.text.trim(), diff --git a/mobile/lib/ui/viewer/location/location_screen.dart b/mobile/lib/ui/viewer/location/location_screen.dart index 6755aa9223..e6dee31a38 100644 --- a/mobile/lib/ui/viewer/location/location_screen.dart +++ b/mobile/lib/ui/viewer/location/location_screen.dart @@ -13,6 +13,7 @@ import 'package:photos/models/file/file.dart'; import "package:photos/models/file_load_result.dart"; import "package:photos/models/gallery_type.dart"; import "package:photos/models/selected_files.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/collections_service.dart"; import "package:photos/services/filter/db_filters.dart"; import "package:photos/services/location_service.dart"; @@ -118,7 +119,7 @@ class LocationScreenPopUpMenu extends StatelessWidget { ); } else if (value == "delete") { try { - await LocationService.instance.deleteLocationTag( + await locationService.deleteLocationTag( InheritedLocationScreenState.of(context).locationTagEntity.id, ); Navigator.of(context).pop(); diff --git a/mobile/lib/ui/viewer/location/update_location_data_widget.dart b/mobile/lib/ui/viewer/location/update_location_data_widget.dart index 780cf432eb..edafccd0e4 100644 --- a/mobile/lib/ui/viewer/location/update_location_data_widget.dart +++ b/mobile/lib/ui/viewer/location/update_location_data_widget.dart @@ -7,8 +7,8 @@ import "package:logging/logging.dart"; import "package:photos/generated/l10n.dart"; import "package:photos/models/file/file.dart"; import "package:photos/models/location/location.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/files_service.dart"; -import "package:photos/services/location_service.dart"; import "package:photos/theme/effects.dart"; import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/map/map_button.dart"; @@ -97,8 +97,7 @@ class _UpdateLocationDataWidgetState extends State { child: ValueListenableBuilder( valueListenable: selectedLocation, builder: (context, value, _) { - final locationInDMS = - LocationService.instance.convertLocationToDMS( + final locationInDMS = locationService.convertLocationToDMS( Location( latitude: value?.latitude, longitude: value?.longitude, diff --git a/mobile/lib/utils/delete_file_util.dart b/mobile/lib/utils/delete_file_util.dart index 0e54be145b..2799f84b3c 100644 --- a/mobile/lib/utils/delete_file_util.dart +++ b/mobile/lib/utils/delete_file_util.dart @@ -17,9 +17,9 @@ import 'package:photos/models/file/file.dart'; import "package:photos/models/files_split.dart"; import 'package:photos/models/selected_files.dart'; import 'package:photos/models/trash_item_request.dart'; +import "package:photos/service_locator.dart"; import 'package:photos/services/remote_sync_service.dart'; import 'package:photos/services/sync_service.dart'; -import 'package:photos/services/trash_sync_service.dart'; import 'package:photos/ui/common/linear_progress_dialog.dart'; import 'package:photos/ui/components/action_sheet_widget.dart'; import 'package:photos/ui/components/buttons/button_widget.dart'; @@ -97,8 +97,7 @@ Future deleteFilesFromEverywhere( try { final fileIDs = uploadedFilesToBeTrashed.map((item) => item.fileID).toList(); - await TrashSyncService.instance - .trashFilesOnServer(uploadedFilesToBeTrashed); + await trashSyncService.trashFilesOnServer(uploadedFilesToBeTrashed); await FilesDB.instance.deleteMultipleUploadedFiles(fileIDs); } catch (e) { _logger.severe(e); @@ -160,7 +159,7 @@ Future deleteFilesFromRemoteOnly( trashRequests.add(TrashRequest(file.uploadedFileID!, file.collectionID!)); } try { - await TrashSyncService.instance.trashFilesOnServer(trashRequests); + await trashSyncService.trashFilesOnServer(trashRequests); await FilesDB.instance.deleteMultipleUploadedFiles(uploadedFileIDs); } catch (e, s) { _logger.severe("Failed to delete files from remote", e, s); @@ -260,7 +259,7 @@ Future deleteFromTrash(BuildContext context, List files) async { firstButtonOnTap: () async { try { didDeletionStart = true; - await TrashSyncService.instance.deleteFromTrash(files); + await trashSyncService.deleteFromTrash(files); Bus.instance.fire( FilesUpdatedEvent( files, @@ -301,7 +300,7 @@ Future emptyTrash(BuildContext context) async { isCritical: true, firstButtonOnTap: () async { try { - await TrashSyncService.instance.emptyTrash(); + await trashSyncService.emptyTrash(); } catch (e, s) { _logger.info("failed empty trash", e, s); rethrow; diff --git a/mobile/lib/utils/trash_diff_fetcher.dart b/mobile/lib/utils/trash_diff_fetcher.dart index 7095c92a3c..e525125a82 100644 --- a/mobile/lib/utils/trash_diff_fetcher.dart +++ b/mobile/lib/utils/trash_diff_fetcher.dart @@ -1,8 +1,8 @@ import 'dart:convert'; import 'dart:math'; +import "package:dio/dio.dart"; import 'package:logging/logging.dart'; -import 'package:photos/core/network/network.dart'; import 'package:photos/models/file/trash_file.dart'; import "package:photos/models/metadata/file_magic.dart"; import 'package:photos/utils/crypto_util.dart'; @@ -10,7 +10,9 @@ import "package:photos/utils/file_key.dart"; class TrashDiffFetcher { final _logger = Logger("TrashDiffFetcher"); - final _enteDio = NetworkClient.instance.enteDio; + final Dio _enteDio; + + TrashDiffFetcher(this._enteDio); Future getTrashFilesDiff(int sinceTime) async { try {