[mob] App start perf improvement 3/x (#3753)

## Description

## Tests
This commit is contained in:
Neeraj Gupta
2024-10-19 10:48:48 +05:30
committed by GitHub
31 changed files with 163 additions and 145 deletions

View File

@@ -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());

View File

@@ -13,4 +13,5 @@ enum LocTagEventType {
add,
update,
delete,
dataSetLoaded,
}

View File

@@ -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<void> _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<void> _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<void> _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<void> _init(bool isBackground, {String via = ''}) async {
MLDataDB.instance,
preferences,
);
MagicCacheService.instance.init(preferences);
initComplete = true;
_logger.info("Initialization done $tlog");
} catch (e, s) {

View File

@@ -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!;
}

View File

@@ -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<BillingPlans>? _future;
BillingService(this._enteDio) {
_logger.finest("BillingService constructor");
init();
}
void init() {
// if (Platform.isIOS && kDebugMode) {

View File

@@ -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<City> _cities = [];
void init(SharedPreferences preferences) {
prefs = preferences;
_loadCities();
LocationService(this.prefs) {
debugPrint('LocationService constructor');
Future.delayed(const Duration(seconds: 3), () {
_loadCities();
});
}
Future<Iterable<LocalEntity<LocationTag>>> _getStoredLocationTags() async {
@@ -46,6 +49,9 @@ class LocationService {
List<EnteFile> 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);
}

View File

@@ -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)",

View File

@@ -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<List<MagicCache>>? _magicCacheFuture;
Future<List<Prompt>>? _promptFuture;
final Set<String> _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<FileUploadedEvent>().listen((event) {
queueUpdate("File uploaded");
});
Future.delayed(_kCacheUpdateDelay, () {
_updateCacheIfTheTimeHasCome();
});
}
Future<void> _resetLastMagicCacheUpdateTime() async {
await _prefs.setInt(
_lastMagicCacheUpdateTime,

View File

@@ -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();

View File

@@ -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 <GenericSearchResult>[];
}
@@ -634,8 +633,7 @@ class SearchService {
}
Future<List<GenericSearchResult>> getLocationResults(String query) async {
final locationTagEntities =
(await LocationService.instance.getLocationTags());
final locationTagEntities = (await locationService.getLocationTags());
final Map<LocalEntity<LocationTag>, List<EnteFile>> 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<City> 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<LocalEntity<LocationTag>, List<EnteFile>> tagToItemsMap = {};
final List<GenericSearchResult> tagSearchResults = [];
final locationTagEntities =
(await LocationService.instance.getLocationTags());
final locationTagEntities = (await locationService.getLocationTags());
final allFiles = await getAllFiles();
final List<EnteFile> 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<City> sortedByResultCount = results.keys.toList()
..sort((a, b) => results[b]!.length.compareTo(results[a]!.length));
for (final city in sortedByResultCount) {

View File

@@ -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;

View File

@@ -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<void> init() async {
_prefs = await SharedPreferences.getInstance();
UserRemoteFlagService(this._enteDio, this._prefs) {
debugPrint("UserRemoteFlagService constructor");
}
bool shouldShowRecoveryVerification() {

View File

@@ -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<VerifyRecoveryPage> {
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) {

View File

@@ -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<StatusBarWidget> {
_showErrorBanner
? HeaderErrorWidget(error: _syncError)
: const SizedBox.shrink(),
UserRemoteFlagService.instance.shouldShowRecoveryVerification() &&
userRemoteFlagService.shouldShowRecoveryVerification() &&
!_showErrorBanner
? Padding(
padding:

View File

@@ -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<bool> 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<bool> 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<bool> requestForMapEnable(BuildContext context) async {
//For debugging.
void disableMap() {
UserRemoteFlagService.instance
.setBoolValue(UserRemoteFlagService.mapEnabled, false);
userRemoteFlagService.setBoolValue(UserRemoteFlagService.mapEnabled, false);
}

View File

@@ -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<PaymentWebPage> {
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<PaymentWebPage> {
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,

View File

@@ -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<StoreSubscriptionPage> {
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<StoreSubscriptionPage> {
(route) => false,
);
unawaited(
BillingService.instance.verifySubscription(
_billingService.verifySubscription(
freeProductID,
"",
paymentProvider: "ente",
@@ -501,7 +501,7 @@ class _StoreSubscriptionPageState extends State<StoreSubscriptionPage> {
(route) => false,
);
unawaited(
BillingService.instance.verifySubscription(
_billingService.verifySubscription(
freeProductID,
"",
paymentProvider: "ente",
@@ -625,7 +625,7 @@ class _StoreSubscriptionPageState extends State<StoreSubscriptionPage> {
(route) => false,
);
unawaited(
BillingService.instance.verifySubscription(
_billingService.verifySubscription(
freeProductID,
"",
paymentProvider: "ente",

View File

@@ -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<StripeSubscriptionPage> {
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<StripeSubscriptionPage> {
(route) => false,
);
unawaited(
BillingService.instance.verifySubscription(
_billingService.verifySubscription(
freeProductID,
"",
paymentProvider: "ente",
@@ -609,7 +609,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
(route) => false,
);
unawaited(
BillingService.instance.verifySubscription(
_billingService.verifySubscription(
freeProductID,
"",
paymentProvider: "ente",

View File

@@ -173,19 +173,17 @@ class _AdvancedSettingsScreenState extends State<AdvancedSettingsScreen> {
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,
);

View File

@@ -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<MLDebugSectionWidget> {
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);

View File

@@ -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) {

View File

@@ -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<void> enableMlConsent(BuildContext context) async {
try {
await UserRemoteFlagService.instance.setBoolValue(
await userRemoteFlagService.setBoolValue(
UserRemoteFlagService.mlEnabled,
true,
);

View File

@@ -210,7 +210,7 @@ class _MachineLearningSettingsPageState
}
Future<void> 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(() {});

View File

@@ -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<LocationTagsWidget> {
Future<List<Widget>> _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<InfoMap> {
@override
void initState() {
super.initState();
_hasEnabledMap = UserRemoteFlagService.instance
_hasEnabledMap = userRemoteFlagService
.getCachedBoolValue(UserRemoteFlagService.mapEnabled);
_fileLat = widget.file.location!.latitude!;
_fileLng = widget.file.location!.longitude!;

View File

@@ -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<AddLocationSheet> {
final coordinates = locationData.centerPoint;
final radius = locationData.selectedRadius;
await LocationService.instance.addLocation(
await locationService.addLocation(
_textEditingController.text.trim(),
coordinates,
radius,

View File

@@ -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(

View File

@@ -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<EditLocationSheet> {
Future<void> _editLocation() async {
final locationTagState = InheritedLocationTagData.of(context);
await LocationService.instance.updateLocationTag(
await locationService.updateLocationTag(
locationTagEntity: locationTagState.locationTagEntity!,
newRadius: locationTagState.selectedRadius,
newName: _textEditingController.text.trim(),

View File

@@ -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();

View File

@@ -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<UpdateLocationDataWidget> {
child: ValueListenableBuilder(
valueListenable: selectedLocation,
builder: (context, value, _) {
final locationInDMS =
LocationService.instance.convertLocationToDMS(
final locationInDMS = locationService.convertLocationToDMS(
Location(
latitude: value?.latitude,
longitude: value?.longitude,

View File

@@ -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<void> 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<void> 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<bool> deleteFromTrash(BuildContext context, List<EnteFile> 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<bool> 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;

View File

@@ -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<Diff> getTrashFilesDiff(int sinceTime) async {
try {