[mob] ServiceLocator for updateService

This commit is contained in:
Neeraj Gupta
2024-10-17 15:31:28 +05:30
parent 230f0b63d6
commit 5cff4357ee
15 changed files with 59 additions and 55 deletions

View File

@@ -14,9 +14,8 @@ class NetworkClient {
late Dio _dio;
late Dio _enteDio;
Future<void> init() async {
Future<void> init(PackageInfo packageInfo) async {
await FkUserAgent.init();
final packageInfo = await PackageInfo.fromPlatform();
final endpoint = Configuration.instance.getHttpEndpoint();
_dio = Dio(
BaseOptions(

View File

@@ -12,6 +12,7 @@ import "package:flutter/services.dart";
import "package:flutter_displaymode/flutter_displaymode.dart";
import 'package:logging/logging.dart';
import "package:media_kit/media_kit.dart";
import "package:package_info_plus/package_info_plus.dart";
import 'package:path_provider/path_provider.dart';
import 'package:photos/app.dart';
import "package:photos/audio_session_handler.dart";
@@ -47,7 +48,6 @@ 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/update_service.dart';
import 'package:photos/services/user_remote_flag_service.dart';
import 'package:photos/services/user_service.dart';
import 'package:photos/ui/tools/app_lock.dart';
@@ -176,7 +176,7 @@ Future<void> _runInBackground(String taskId) async {
[
_homeWidgetSync(),
() async {
UpdateService.instance.showUpdateNotification().ignore();
updateService.showUpdateNotification().ignore();
await _sync('bgSync');
}(),
],
@@ -212,7 +212,8 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
_isProcessRunning = true;
_logger.info("Initializing... inBG =$isBackground via: $via");
final SharedPreferences preferences = await SharedPreferences.getInstance();
await _logFGHeartBeatInfo();
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
await _logFGHeartBeatInfo(preferences);
_logger.info("_logFGHeartBeatInfo done");
unawaited(_scheduleHeartBeat(preferences, isBackground));
NotificationService.instance.init(preferences);
@@ -234,10 +235,11 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
_logger.info("Configuration done");
_logger.info("NetworkClient init");
await NetworkClient.instance.init();
await NetworkClient.instance.init(packageInfo);
_logger.info("NetworkClient init done");
ServiceLocator.instance.init(preferences, NetworkClient.instance.enteDio);
ServiceLocator.instance
.init(preferences, NetworkClient.instance.enteDio, packageInfo);
_logger.info("UserService init");
await UserService.instance.init();
@@ -255,10 +257,6 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
await UserRemoteFlagService.instance.init();
_logger.info("UserRemoteFlagService init done");
_logger.info("UpdateService init");
await UpdateService.instance.init();
_logger.info("UpdateService init done");
_logger.info("BillingService init");
BillingService.instance.init();
_logger.info("BillingService init done");
@@ -459,9 +457,8 @@ Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
}
}
Future<void> _logFGHeartBeatInfo() async {
Future<void> _logFGHeartBeatInfo(SharedPreferences prefs) async {
final bool isRunningInFG = await _isRunningInForeground();
final prefs = await SharedPreferences.getInstance();
await prefs.reload();
final lastFGTaskHeartBeatTime = prefs.getInt(kLastFGTaskHeartBeatTime) ?? 0;
final String lastRun = lastFGTaskHeartBeatTime == 0

View File

@@ -2,22 +2,26 @@ import "package:dio/dio.dart";
import "package:ente_cast/ente_cast.dart";
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/services/storage_bonus_service.dart";
import "package:photos/services/update_service.dart";
import "package:photos/utils/local_settings.dart";
import "package:shared_preferences/shared_preferences.dart";
class ServiceLocator {
late final SharedPreferences prefs;
late final Dio enteDio;
late final PackageInfo packageInfo;
// instance
ServiceLocator._privateConstructor();
static final ServiceLocator instance = ServiceLocator._privateConstructor();
init(SharedPreferences prefs, Dio enteDio) {
init(SharedPreferences prefs, Dio enteDio, PackageInfo packageInfo) {
this.prefs = prefs;
this.enteDio = enteDio;
this.packageInfo = packageInfo;
}
}
@@ -50,3 +54,12 @@ StorageBonusService get storageBonusService {
);
return _storageBonusService!;
}
UpdateService? _updateService;
UpdateService get updateService {
_updateService ??= UpdateService(
ServiceLocator.instance.prefs,
ServiceLocator.instance.packageInfo,
);
return _updateService!;
}

View File

@@ -11,21 +11,19 @@ import 'package:tuple/tuple.dart';
import 'package:url_launcher/url_launcher_string.dart';
class UpdateService {
UpdateService._privateConstructor();
static final UpdateService instance = UpdateService._privateConstructor();
static const kUpdateAvailableShownTimeKey = "update_available_shown_time_key";
static const changeLogVersionKey = "update_change_log_key";
static const currentChangeLogVersion = 24;
LatestVersionInfo? _latestVersion;
final _logger = Logger("UpdateService");
late PackageInfo _packageInfo;
late SharedPreferences _prefs;
final PackageInfo _packageInfo;
final SharedPreferences _prefs;
Future<void> init() async {
_packageInfo = await PackageInfo.fromPlatform();
_prefs = await SharedPreferences.getInstance();
UpdateService(SharedPreferences prefs, PackageInfo packageInfo)
: _prefs = prefs,
_packageInfo = packageInfo {
debugPrint("UpdateService constructor called");
}
Future<bool> showChangeLog() async {

View File

@@ -9,7 +9,7 @@ import 'package:photos/core/configuration.dart';
import 'package:photos/ente_theme_data.dart';
import "package:photos/generated/l10n.dart";
import "package:photos/l10n/l10n.dart";
import 'package:photos/services/update_service.dart';
import "package:photos/service_locator.dart";
import 'package:photos/ui/account/email_entry_page.dart';
import 'package:photos/ui/account/login_page.dart';
import 'package:photos/ui/account/password_entry_page.dart';
@@ -224,7 +224,7 @@ class _LandingPageWidgetState extends State<LandingPageWidget> {
}
Future<void> _navigateToSignUpPage() async {
UpdateService.instance.hideChangeLog().ignore();
updateService.hideChangeLog().ignore();
Widget page;
if (Configuration.instance.getEncryptedToken() == null) {
page = const EmailEntryPage();
@@ -254,7 +254,7 @@ class _LandingPageWidgetState extends State<LandingPageWidget> {
}
void _navigateToSignInPage() {
UpdateService.instance.hideChangeLog().ignore();
updateService.hideChangeLog().ignore();
Widget page;
if (Configuration.instance.getEncryptedToken() == null) {
page = const LoginPage();

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import "package:photos/generated/l10n.dart";
import 'package:photos/services/update_service.dart';
import "package:photos/service_locator.dart";
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/buttons/button_widget.dart';
import 'package:photos/ui/components/divider_widget.dart';
@@ -64,7 +64,7 @@ class _ChangeLogPageState extends State<ChangeLogPage> {
labelText: S.of(context).continueLabel,
icon: Icons.arrow_forward_outlined,
onTap: () async {
await UpdateService.instance.hideChangeLog();
await updateService.hideChangeLog();
if (mounted && Navigator.of(context).canPop()) {
Navigator.of(context).pop();
}
@@ -80,7 +80,7 @@ class _ChangeLogPageState extends State<ChangeLogPage> {
icon: Icons.favorite_rounded,
iconColor: enteColorScheme.primary500,
onTap: () async {
await UpdateService.instance.launchReviewUrl();
await updateService.launchReviewUrl();
},
),
const SizedBox(height: 8),

View File

@@ -1,12 +1,11 @@
import 'package:flutter/cupertino.dart';
import 'package:photos/core/configuration.dart';
import "package:photos/service_locator.dart";
import 'package:photos/services/update_service.dart';
import "package:photos/ui/payment/store_subscription_page.dart";
import 'package:photos/ui/payment/stripe_subscription_page.dart';
StatefulWidget getSubscriptionPage({bool isOnBoarding = false}) {
if (UpdateService.instance.isIndependentFlavor()) {
if (updateService.isIndependentFlavor()) {
return StripeSubscriptionPage(isOnboarding: isOnBoarding);
}
if (flagService.enableStripe && _isUserCreatedPostStripeSupport()) {

View File

@@ -2,7 +2,7 @@ import "package:flutter/foundation.dart";
import 'package:flutter/material.dart';
import "package:flutter/scheduler.dart";
import "package:flutter_animate/flutter_animate.dart";
import "package:photos/services/update_service.dart";
import "package:photos/service_locator.dart";
import "package:photos/theme/colors.dart";
import "package:photos/theme/ente_theme.dart";
import 'package:photos/utils/data_util.dart';
@@ -163,7 +163,7 @@ class _Price extends StatelessWidget {
final priceDouble = double.parse(priceWithoutCurrency);
final pricePerMonth = priceDouble / 12;
final pricePerMonthString = pricePerMonth.toStringAsFixed(2);
final bool isPlayStore = UpdateService.instance.isPlayStoreFlavor();
final bool isPlayStore = updateService.isPlayStoreFlavor();
return Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import "package:photos/generated/l10n.dart";
import 'package:photos/services/update_service.dart';
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/common/web_page.dart';
import "package:photos/service_locator.dart";
import "package:photos/theme/ente_theme.dart";
import "package:photos/ui/common/web_page.dart";
import 'package:photos/ui/components/captioned_text_widget.dart';
import 'package:photos/ui/components/expandable_menu_item_widget.dart';
import 'package:photos/ui/components/menu_item_widget/menu_item_widget.dart';
@@ -51,7 +51,7 @@ class AboutSectionWidget extends StatelessWidget {
url: "https://ente.io/terms",
),
sectionOptionSpacing,
UpdateService.instance.isIndependent()
updateService.isIndependent()
? Column(
children: [
MenuItemWidget(
@@ -65,8 +65,7 @@ class AboutSectionWidget extends StatelessWidget {
final dialog =
createProgressDialog(context, S.of(context).checking);
await dialog.show();
final shouldUpdate =
await UpdateService.instance.shouldUpdate();
final shouldUpdate = await updateService.shouldUpdate();
await dialog.hide();
if (shouldUpdate) {
// ignore: unawaited_futures
@@ -75,7 +74,7 @@ class AboutSectionWidget extends StatelessWidget {
context: context,
builder: (BuildContext context) {
return AppUpdateDialog(
UpdateService.instance.getLatestVersionInfo(),
updateService.getLatestVersionInfo(),
);
},
barrierColor: Colors.black.withOpacity(0.85),

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/update_service.dart';
import 'package:photos/theme/ente_theme.dart';
import "package:photos/ui/components/buttons/button_widget.dart";
@@ -82,7 +83,7 @@ class _AppUpdateDialogState extends State<AppUpdateDialog> {
],
);
final shouldForceUpdate =
UpdateService.instance.shouldForceUpdate(widget.latestVersionInfo!);
updateService.shouldForceUpdate(widget.latestVersionInfo!);
return PopScope(
canPop: !shouldForceUpdate,
child: AlertDialog(

View File

@@ -8,7 +8,6 @@ import "package:photos/models/duplicate_files.dart";
import "package:photos/service_locator.dart";
import "package:photos/services/deduplication_service.dart";
import "package:photos/services/sync_service.dart";
import "package:photos/services/update_service.dart";
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/components/buttons/button_widget.dart';
import 'package:photos/ui/components/buttons/icon_button_widget.dart';
@@ -238,7 +237,7 @@ class _FreeUpSpaceOptionsScreenState extends State<FreeUpSpaceOptionsScreen> {
S.of(context).youHaveSuccessfullyFreedUp(formatBytes(status.size)),
firstButtonLabel: S.of(context).rateUs,
firstButtonOnTap: () async {
await UpdateService.instance.launchReviewUrl();
await updateService.launchReviewUrl();
},
firstButtonType: ButtonType.primary,
secondButtonLabel: S.of(context).ok,
@@ -282,7 +281,7 @@ class _FreeUpSpaceOptionsScreenState extends State<FreeUpSpaceOptionsScreen> {
),
firstButtonLabel: S.of(context).rateUs,
firstButtonOnTap: () async {
await UpdateService.instance.launchReviewUrl();
await updateService.launchReviewUrl();
},
firstButtonType: ButtonType.primary,
secondButtonLabel: S.of(context).ok,

View File

@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:photos/core/configuration.dart';
import "package:photos/service_locator.dart";
import 'package:photos/services/ignored_files_service.dart';
import 'package:photos/services/local_sync_service.dart';
import 'package:photos/services/sync_service.dart';
import 'package:photos/services/update_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';
@@ -36,7 +36,7 @@ class DebugSectionWidget extends StatelessWidget {
trailingIcon: Icons.chevron_right_outlined,
trailingIconIsMuted: true,
onTap: () async {
await UpdateService.instance.resetChangeLog();
await updateService.resetChangeLog();
_showKeyAttributesDialog(context);
},
),

View File

@@ -2,7 +2,7 @@ import "dart:io";
import 'package:flutter/material.dart';
import "package:photos/generated/l10n.dart";
import 'package:photos/services/update_service.dart';
import "package:photos/service_locator.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';
@@ -24,7 +24,7 @@ class SocialSectionWidget extends StatelessWidget {
Widget _getSectionOptions(BuildContext context) {
final List<Widget> options = [];
final result = UpdateService.instance.getRateDetails();
final result = updateService.getRateDetails();
final String ratePlace = result.item1;
final String rateUrl = result.item2;
options.addAll(

View File

@@ -26,12 +26,12 @@ import 'package:photos/events/user_logged_out_event.dart';
import "package:photos/generated/l10n.dart";
import 'package:photos/models/collection/collection_items.dart';
import 'package:photos/models/selected_files.dart';
import "package:photos/service_locator.dart";
import 'package:photos/services/app_lifecycle_service.dart';
import 'package:photos/services/collections_service.dart';
import "package:photos/services/entity_service.dart";
import 'package:photos/services/local_sync_service.dart';
import "package:photos/services/notification_service.dart";
import 'package:photos/services/update_service.dart';
import 'package:photos/services/user_service.dart';
import 'package:photos/states/user_details_state.dart';
import 'package:photos/theme/colors.dart';
@@ -194,7 +194,7 @@ class _HomeWidgetState extends State<HomeWidget> {
},
);
_initDeepLinks();
UpdateService.instance.shouldShowUpdateNotification().then((value) {
updateService.shouldShowUpdateNotification().then((value) {
Future.delayed(Duration.zero, () {
if (value) {
showDialog(
@@ -202,12 +202,12 @@ class _HomeWidgetState extends State<HomeWidget> {
context: context,
builder: (BuildContext context) {
return AppUpdateDialog(
UpdateService.instance.getLatestVersionInfo(),
updateService.getLatestVersionInfo(),
);
},
barrierColor: Colors.black.withOpacity(0.85),
);
UpdateService.instance.resetUpdateAvailableShownTime();
updateService.resetUpdateAvailableShownTime();
}
});
});
@@ -540,7 +540,7 @@ class _HomeWidgetState extends State<HomeWidget> {
}
showChangeLog(BuildContext context) async {
final bool show = await UpdateService.instance.showChangeLog();
final bool show = await updateService.showChangeLog();
if (!show || !Configuration.instance.isLoggedIn()) {
return;
}
@@ -566,7 +566,7 @@ class _HomeWidgetState extends State<HomeWidget> {
},
);
// Do not show change dialog again
UpdateService.instance.hideChangeLog().ignore();
updateService.hideChangeLog().ignore();
}
void _onDidReceiveNotificationResponse(

View File

@@ -24,7 +24,6 @@ import 'package:photos/models/selected_files.dart';
import 'package:photos/service_locator.dart';
import 'package:photos/services/collections_service.dart';
import 'package:photos/services/sync_service.dart';
import 'package:photos/services/update_service.dart';
import 'package:photos/ui/actions/collection/collection_sharing_actions.dart';
import "package:photos/ui/cast/auto.dart";
import "package:photos/ui/cast/choose.dart";
@@ -274,7 +273,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
body: S.of(context).youHaveSuccessfullyFreedUp(formatBytes(status.size)),
firstButtonLabel: S.of(context).rateUs,
firstButtonOnTap: () async {
await UpdateService.instance.launchReviewUrl();
await updateService.launchReviewUrl();
},
firstButtonType: ButtonType.primary,
secondButtonLabel: S.of(context).ok,