diff --git a/mobile/lib/domain/services/background_worker.service.dart b/mobile/lib/domain/services/background_worker.service.dart index f903305171..03bc057fac 100644 --- a/mobile/lib/domain/services/background_worker.service.dart +++ b/mobile/lib/domain/services/background_worker.service.dart @@ -114,10 +114,10 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi { configureFileDownloaderNotifications(); // Notify the host that the background worker service has been initialized and is ready to use - _backgroundHostApi.onInitialized(); + unawaited(_backgroundHostApi.onInitialized()); } catch (error, stack) { _logger.severe("Failed to initialize background worker", error, stack); - await _backgroundHostApi.close(); + unawaited(_backgroundHostApi.close()); } } diff --git a/mobile/lib/pages/common/splash_screen.page.dart b/mobile/lib/pages/common/splash_screen.page.dart index 754d8f1a1c..c1d621f474 100644 --- a/mobile/lib/pages/common/splash_screen.page.dart +++ b/mobile/lib/pages/common/splash_screen.page.dart @@ -55,43 +55,45 @@ class SplashScreenPageState extends ConsumerState { final backgroundManager = ref.read(backgroundSyncProvider); final backupProvider = ref.read(driftBackupProvider.notifier); - ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then( - (_) async { - try { - wsProvider.connect(); - infoProvider.getServerInfo(); + unawaited( + ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then( + (_) async { + try { + wsProvider.connect(); + unawaited(infoProvider.getServerInfo()); - if (Store.isBetaTimelineEnabled) { - bool syncSuccess = false; - await Future.wait([ - backgroundManager.syncLocal(), - backgroundManager.syncRemote().then((success) => syncSuccess = success), - ]); - - if (syncSuccess) { + if (Store.isBetaTimelineEnabled) { + bool syncSuccess = false; await Future.wait([ - backgroundManager.hashAssets().then((_) { - _resumeBackup(backupProvider); - }), - _resumeBackup(backupProvider), + backgroundManager.syncLocal(), + backgroundManager.syncRemote().then((success) => syncSuccess = success), ]); - } else { - await backgroundManager.hashAssets(); - } - if (Store.get(StoreKey.syncAlbums, false)) { - await backgroundManager.syncLinkedAlbum(); + if (syncSuccess) { + await Future.wait([ + backgroundManager.hashAssets().then((_) { + _resumeBackup(backupProvider); + }), + _resumeBackup(backupProvider), + ]); + } else { + await backgroundManager.hashAssets(); + } + + if (Store.get(StoreKey.syncAlbums, false)) { + await backgroundManager.syncLinkedAlbum(); + } } + } catch (e) { + log.severe('Failed establishing connection to the server: $e'); } - } catch (e) { - log.severe('Failed establishing connection to the server: $e'); - } - }, - onError: (exception) => { - log.severe('Failed to update auth info with access token: $accessToken'), - ref.read(authProvider.notifier).logout(), - context.replaceRoute(const LoginRoute()), - }, + }, + onError: (exception) => { + log.severe('Failed to update auth info with access token: $accessToken'), + ref.read(authProvider.notifier).logout(), + context.replaceRoute(const LoginRoute()), + }, + ), ); } else { log.severe('Missing crucial offline login info - Logging out completely'); @@ -106,11 +108,11 @@ class SplashScreenPageState extends ConsumerState { final needBetaMigration = Store.get(StoreKey.needBetaMigration, false); if (needBetaMigration) { await Store.put(StoreKey.needBetaMigration, false); - context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: true)]); + unawaited(context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: true)])); return; } - context.replaceRoute(Store.isBetaTimelineEnabled ? const TabShellRoute() : const TabControllerRoute()); + unawaited(context.replaceRoute(Store.isBetaTimelineEnabled ? const TabShellRoute() : const TabControllerRoute())); } if (Store.isBetaTimelineEnabled) { @@ -130,7 +132,7 @@ class SplashScreenPageState extends ConsumerState { if (isEnableBackup) { final currentUser = Store.tryGet(StoreKey.currentUser); if (currentUser != null) { - notifier.handleBackupResume(currentUser.id); + unawaited(notifier.handleBackupResume(currentUser.id)); } } } diff --git a/mobile/lib/presentation/pages/editing/drift_edit.page.dart b/mobile/lib/presentation/pages/editing/drift_edit.page.dart index e24a1967f2..f9903b6b94 100644 --- a/mobile/lib/presentation/pages/editing/drift_edit.page.dart +++ b/mobile/lib/presentation/pages/editing/drift_edit.page.dart @@ -70,7 +70,7 @@ class DriftEditImagePage extends ConsumerWidget { Logger("SaveEditedImage").warning("Failed to retrieve the saved image back from OS", e); } - ref.read(backgroundSyncProvider).syncLocal(full: true); + unawaited(ref.read(backgroundSyncProvider).syncLocal(full: true)); _exitEditing(context); ImmichToast.show(durationInSecond: 3, context: context, msg: 'Image Saved!'); diff --git a/mobile/lib/presentation/widgets/action_buttons/advanced_info_action_button.widget.dart b/mobile/lib/presentation/widgets/action_buttons/advanced_info_action_button.widget.dart index 170f827fdb..cb2581bc6d 100644 --- a/mobile/lib/presentation/widgets/action_buttons/advanced_info_action_button.widget.dart +++ b/mobile/lib/presentation/widgets/action_buttons/advanced_info_action_button.widget.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/enums.dart'; @@ -15,7 +17,7 @@ class AdvancedInfoActionButton extends ConsumerWidget { return; } - ref.read(actionProvider.notifier).troubleshoot(source, context); + unawaited(ref.read(actionProvider.notifier).troubleshoot(source, context)); } @override diff --git a/mobile/lib/presentation/widgets/images/local_image_provider.dart b/mobile/lib/presentation/widgets/images/local_image_provider.dart index 6f9ec27b31..c5dca57f9c 100644 --- a/mobile/lib/presentation/widgets/images/local_image_provider.dart +++ b/mobile/lib/presentation/widgets/images/local_image_provider.dart @@ -103,7 +103,7 @@ class LocalFullImageProvider extends CancellableImageProvider((ref) { return ManualUploadNotifier( @@ -295,7 +295,7 @@ class ManualUploadNotifier extends StateNotifier { ); } } else { - openAppSettings(); + unawaited(openAppSettings()); dPrint(() => "[_startUpload] Do not have permission to the gallery"); } } catch (e) { diff --git a/mobile/lib/providers/infrastructure/action.provider.dart b/mobile/lib/providers/infrastructure/action.provider.dart index 753667f5e0..e51d5508c1 100644 --- a/mobile/lib/providers/infrastructure/action.provider.dart +++ b/mobile/lib/providers/infrastructure/action.provider.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:auto_route/auto_route.dart'; import 'package:background_downloader/background_downloader.dart'; import 'package:flutter/material.dart'; import 'package:immich_mobile/constants/enums.dart'; @@ -131,7 +132,7 @@ class ActionNotifier extends Notifier { if (assets.length > 1) { return ActionResult(count: assets.length, success: false, error: 'Cannot troubleshoot multiple assets'); } - context.pushRoute(AssetTroubleshootRoute(asset: assets.first)); + unawaited(context.pushRoute(AssetTroubleshootRoute(asset: assets.first))); return ActionResult(count: assets.length, success: true); } diff --git a/mobile/lib/repositories/asset_media.repository.dart b/mobile/lib/repositories/asset_media.repository.dart index 0fb480e912..e20261aeea 100644 --- a/mobile/lib/repositories/asset_media.repository.dart +++ b/mobile/lib/repositories/asset_media.repository.dart @@ -138,15 +138,17 @@ class AssetMediaRepository { // we dont want to await the share result since the // "preparing" dialog will not disappear until final size = context.sizeData; - Share.shareXFiles( - downloadedXFiles, - sharePositionOrigin: Rect.fromPoints(Offset.zero, Offset(size.width / 3, size.height)), - ).then((result) async { - for (var file in tempFiles) { - try { - await file.delete(); - } catch (e) { - _log.warning("Failed to delete temporary file: ${file.path}", e); + unawaited( + Share.shareXFiles( + downloadedXFiles, + sharePositionOrigin: Rect.fromPoints(Offset.zero, Offset(size.width / 3, size.height)), + ).then((result) async { + for (var file in tempFiles) { + try { + await file.delete(); + } catch (e) { + _log.warning("Failed to delete temporary file: ${file.path}", e); + } } }), ); diff --git a/mobile/lib/services/api.service.dart b/mobile/lib/services/api.service.dart index f3df40b2c5..698ac3a159 100644 --- a/mobile/lib/services/api.service.dart +++ b/mobile/lib/services/api.service.dart @@ -6,12 +6,11 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:http/http.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/store.entity.dart'; +import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/utils/url_helper.dart'; import 'package:immich_mobile/utils/user_agent.dart'; import 'package:logging/logging.dart'; import 'package:openapi/api.dart'; -import 'package:immich_mobile/utils/user_agent.dart'; -import 'package:immich_mobile/utils/debug_print.dart'; class ApiService implements Authentication { late ApiClient _apiClient; diff --git a/mobile/lib/services/upload.service.dart b/mobile/lib/services/upload.service.dart index 93a1725783..389197d1fb 100644 --- a/mobile/lib/services/upload.service.dart +++ b/mobile/lib/services/upload.service.dart @@ -209,7 +209,7 @@ class UploadService { void _handleTaskStatusUpdate(TaskStatusUpdate update) async { switch (update.status) { case TaskStatus.complete: - _handleLivePhoto(update); + unawaited(_handleLivePhoto(update)); if (CurrentPlatform.isIOS) { try { diff --git a/mobile/lib/widgets/asset_viewer/detail_panel/exif_map.dart b/mobile/lib/widgets/asset_viewer/detail_panel/exif_map.dart index b05f1acbac..893e534084 100644 --- a/mobile/lib/widgets/asset_viewer/detail_panel/exif_map.dart +++ b/mobile/lib/widgets/asset_viewer/detail_panel/exif_map.dart @@ -3,10 +3,10 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:immich_mobile/domain/models/exif.model.dart'; +import 'package:immich_mobile/utils/debug_print.dart'; import 'package:immich_mobile/widgets/map/map_thumbnail.dart'; import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:url_launcher/url_launcher.dart'; -import 'package:immich_mobile/utils/debug_print.dart'; class ExifMap extends StatelessWidget { final ExifInfo exifInfo; @@ -69,7 +69,7 @@ class ExifMap extends StatelessWidget { } dPrint(() => 'Opening Map Uri: $uri'); - launchUrl(uri); + unawaited(launchUrl(uri)); }, onCreated: onMapCreated, ); diff --git a/mobile/lib/widgets/forms/login/login_form.dart b/mobile/lib/widgets/forms/login/login_form.dart index be9c680184..bb987d5bc0 100644 --- a/mobile/lib/widgets/forms/login/login_form.dart +++ b/mobile/lib/widgets/forms/login/login_form.dart @@ -194,9 +194,9 @@ class LoginForm extends HookConsumerWidget { final isBeta = Store.isBetaTimelineEnabled; if (isBeta) { await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission(); - handleSyncFlow(); + unawaited(handleSyncFlow()); ref.read(websocketProvider.notifier).connect(); - context.replaceRoute(const TabShellRoute()); + unawaited(context.replaceRoute(const TabShellRoute())); return; } unawaited(context.replaceRoute(const TabControllerRoute())); @@ -293,8 +293,8 @@ class LoginForm extends HookConsumerWidget { } if (isBeta) { await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission(); - handleSyncFlow(); - context.replaceRoute(const TabShellRoute()); + unawaited(handleSyncFlow()); + unawaited(context.replaceRoute(const TabShellRoute())); return; } unawaited(context.replaceRoute(const TabControllerRoute())); diff --git a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart index 1fefb3dcfa..480665e614 100644 --- a/mobile/lib/widgets/settings/beta_timeline_list_tile.dart +++ b/mobile/lib/widgets/settings/beta_timeline_list_tile.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -42,7 +44,7 @@ class BetaTimelineListTile extends ConsumerWidget { ElevatedButton( onPressed: () async { Navigator.of(context).pop(); - context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: value)]); + unawaited(context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: value)])); }, child: Text("ok".t(context: context)), ), diff --git a/mobile/test/domain/services/store_service_test.dart b/mobile/test/domain/services/store_service_test.dart index cd79afba60..996170b518 100644 --- a/mobile/test/domain/services/store_service_test.dart +++ b/mobile/test/domain/services/store_service_test.dart @@ -53,7 +53,7 @@ void main() { }); tearDown(() async { - sut.dispose(); + unawaited(sut.dispose()); await controller.close(); });