conflict resolution

This commit is contained in:
shenlong-tanwen
2025-09-17 16:57:16 +05:30
parent 379d9ab1e4
commit e8a9a2209d
10 changed files with 60 additions and 48 deletions
@@ -106,10 +106,10 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
} }
// Notify the host that the background worker service has been initialized and is ready to use // Notify the host that the background worker service has been initialized and is ready to use
_backgroundHostApi.onInitialized(); unawaited(_backgroundHostApi.onInitialized());
} catch (error, stack) { } catch (error, stack) {
_logger.severe("Failed to initialize background worker", error, stack); _logger.severe("Failed to initialize background worker", error, stack);
await _backgroundHostApi.close(); unawaited(_backgroundHostApi.close());
} }
} }
+34 -30
View File
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
@@ -53,39 +55,41 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
final backgroundManager = ref.read(backgroundSyncProvider); final backgroundManager = ref.read(backgroundSyncProvider);
final backupProvider = ref.read(driftBackupProvider.notifier); final backupProvider = ref.read(driftBackupProvider.notifier);
ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then( unawaited(
(_) async { ref.read(authProvider.notifier).saveAuthInfo(accessToken: accessToken).then(
try { (_) async {
wsProvider.connect(); try {
infoProvider.getServerInfo(); wsProvider.connect();
unawaited(infoProvider.getServerInfo());
if (Store.isBetaTimelineEnabled) { if (Store.isBetaTimelineEnabled) {
await Future.wait([backgroundManager.syncLocal(), backgroundManager.syncRemote()]); await Future.wait([backgroundManager.syncLocal(), backgroundManager.syncRemote()]);
await Future.wait([ await Future.wait([
backgroundManager.hashAssets().then((_) { backgroundManager.hashAssets().then((_) {
_resumeBackup(backupProvider); _resumeBackup(backupProvider);
}), }),
_resumeBackup(backupProvider), _resumeBackup(backupProvider),
]); ]);
if (Store.get(StoreKey.syncAlbums, false)) { if (Store.get(StoreKey.syncAlbums, false)) {
await backgroundManager.syncLinkedAlbum(); 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(),
onError: (exception) => { context.replaceRoute(const LoginRoute()),
log.severe('Failed to update auth info with access token: $accessToken'), },
ref.read(authProvider.notifier).logout(), ),
context.replaceRoute(const LoginRoute()),
},
); );
} else { } else {
log.severe('Missing crucial offline login info - Logging out completely'); log.severe('Missing crucial offline login info - Logging out completely');
ref.read(authProvider.notifier).logout(); unawaited(ref.read(authProvider.notifier).logout());
context.replaceRoute(const LoginRoute()); unawaited(context.replaceRoute(const LoginRoute()));
return; return;
} }
@@ -95,11 +99,11 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
final needBetaMigration = Store.get(StoreKey.needBetaMigration, false); final needBetaMigration = Store.get(StoreKey.needBetaMigration, false);
if (needBetaMigration) { if (needBetaMigration) {
await Store.put(StoreKey.needBetaMigration, false); await Store.put(StoreKey.needBetaMigration, false);
context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: true)]); unawaited(context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: true)]));
return; return;
} }
context.replaceRoute(Store.isBetaTimelineEnabled ? const TabShellRoute() : const TabControllerRoute()); unawaited(context.replaceRoute(Store.isBetaTimelineEnabled ? const TabShellRoute() : const TabControllerRoute()));
} }
if (Store.isBetaTimelineEnabled) { if (Store.isBetaTimelineEnabled) {
@@ -109,7 +113,7 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
final hasPermission = await ref.read(galleryPermissionNotifier.notifier).hasPermission; final hasPermission = await ref.read(galleryPermissionNotifier.notifier).hasPermission;
if (hasPermission) { if (hasPermission) {
// Resume backup (if enable) then navigate // Resume backup (if enable) then navigate
ref.watch(backupProvider.notifier).resumeBackup(); unawaited(ref.watch(backupProvider.notifier).resumeBackup());
} }
} }
@@ -119,7 +123,7 @@ class SplashScreenPageState extends ConsumerState<SplashScreenPage> {
if (isEnableBackup) { if (isEnableBackup) {
final currentUser = Store.tryGet(StoreKey.currentUser); final currentUser = Store.tryGet(StoreKey.currentUser);
if (currentUser != null) { if (currentUser != null) {
notifier.handleBackupResume(currentUser.id); unawaited(notifier.handleBackupResume(currentUser.id));
} }
} }
} }
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/constants/enums.dart';
@@ -15,7 +17,7 @@ class AdvancedInfoActionButton extends ConsumerWidget {
return; return;
} }
ref.read(actionProvider.notifier).troubleshoot(source, context); unawaited(ref.read(actionProvider.notifier).troubleshoot(source, context));
} }
@override @override
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:cancellation_token_http/http.dart'; import 'package:cancellation_token_http/http.dart';
@@ -26,11 +27,11 @@ import 'package:immich_mobile/services/backup.service.dart';
import 'package:immich_mobile/services/backup_album.service.dart'; import 'package:immich_mobile/services/backup_album.service.dart';
import 'package:immich_mobile/services/local_notification.service.dart'; import 'package:immich_mobile/services/local_notification.service.dart';
import 'package:immich_mobile/utils/backup_progress.dart'; import 'package:immich_mobile/utils/backup_progress.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:immich_mobile/widgets/common/immich_toast.dart'; import 'package:immich_mobile/widgets/common/immich_toast.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler; import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
import 'package:immich_mobile/utils/debug_print.dart';
final manualUploadProvider = StateNotifierProvider<ManualUploadNotifier, ManualUploadState>((ref) { final manualUploadProvider = StateNotifierProvider<ManualUploadNotifier, ManualUploadState>((ref) {
return ManualUploadNotifier( return ManualUploadNotifier(
@@ -294,7 +295,7 @@ class ManualUploadNotifier extends StateNotifier<ManualUploadState> {
); );
} }
} else { } else {
openAppSettings(); unawaited(openAppSettings());
dPrint(() => "[_startUpload] Do not have permission to the gallery"); dPrint(() => "[_startUpload] Do not have permission to the gallery");
} }
} catch (e) { } catch (e) {
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:background_downloader/background_downloader.dart'; import 'package:background_downloader/background_downloader.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -64,7 +66,7 @@ class ActionNotifier extends Notifier<void> {
void _downloadLivePhotoCallback(TaskStatusUpdate update) async { void _downloadLivePhotoCallback(TaskStatusUpdate update) async {
if (update.status == TaskStatus.complete) { if (update.status == TaskStatus.complete) {
final livePhotosId = LivePhotosMetadata.fromJson(update.task.metaData).id; final livePhotosId = LivePhotosMetadata.fromJson(update.task.metaData).id;
_downloadService.saveLivePhotos(update.task, livePhotosId); unawaited(_downloadService.saveLivePhotos(update.task, livePhotosId));
} }
} }
@@ -122,7 +124,7 @@ class ActionNotifier extends Notifier<void> {
if (assets.length > 1) { if (assets.length > 1) {
return ActionResult(count: assets.length, success: false, error: 'Cannot troubleshoot multiple assets'); 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); return ActionResult(count: assets.length, success: true);
} }
+3 -3
View File
@@ -6,11 +6,11 @@ import 'package:device_info_plus/device_info_plus.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.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/url_helper.dart';
import 'package:immich_mobile/utils/user_agent.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.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 { class ApiService implements Authentication {
late ApiClient _apiClient; late ApiClient _apiClient;
@@ -86,7 +86,7 @@ class ApiService implements Authentication {
setEndpoint(endpoint); setEndpoint(endpoint);
// Save in local database for next startup // Save in local database for next startup
Store.put(StoreKey.serverEndpoint, endpoint); unawaited(Store.put(StoreKey.serverEndpoint, endpoint));
return endpoint; return endpoint;
} }
@@ -1,11 +1,12 @@
import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:immich_mobile/domain/models/exif.model.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:immich_mobile/widgets/map/map_thumbnail.dart';
import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:maplibre_gl/maplibre_gl.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:immich_mobile/utils/debug_print.dart';
class ExifMap extends StatelessWidget { class ExifMap extends StatelessWidget {
final ExifInfo exifInfo; final ExifInfo exifInfo;
@@ -68,7 +69,7 @@ class ExifMap extends StatelessWidget {
} }
dPrint(() => 'Opening Map Uri: $uri'); dPrint(() => 'Opening Map Uri: $uri');
launchUrl(uri); unawaited(launchUrl(uri));
}, },
onCreated: onMapCreated, onCreated: onMapCreated,
); );
@@ -193,8 +193,8 @@ class LoginForm extends HookConsumerWidget {
final isBeta = Store.isBetaTimelineEnabled; final isBeta = Store.isBetaTimelineEnabled;
if (isBeta) { if (isBeta) {
await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission(); await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission();
handleSyncFlow(); unawaited(handleSyncFlow());
context.replaceRoute(const TabShellRoute()); unawaited(context.replaceRoute(const TabShellRoute()));
return; return;
} }
unawaited(context.replaceRoute(const TabControllerRoute())); unawaited(context.replaceRoute(const TabControllerRoute()));
@@ -291,8 +291,8 @@ class LoginForm extends HookConsumerWidget {
} }
if (isBeta) { if (isBeta) {
await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission(); await ref.read(galleryPermissionNotifier.notifier).requestGalleryPermission();
handleSyncFlow(); unawaited(handleSyncFlow());
context.replaceRoute(const TabShellRoute()); unawaited(context.replaceRoute(const TabShellRoute()));
return; return;
} }
unawaited(context.replaceRoute(const TabControllerRoute())); unawaited(context.replaceRoute(const TabControllerRoute()));
@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -45,7 +47,7 @@ class BetaTimelineListTile extends ConsumerWidget {
ElevatedButton( ElevatedButton(
onPressed: () async { onPressed: () async {
Navigator.of(context).pop(); Navigator.of(context).pop();
context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: value)]); unawaited(context.router.replaceAll([ChangeExperienceRoute(switchingToBeta: value)]));
}, },
child: Text("ok".t(context: context)), child: Text("ok".t(context: context)),
), ),
@@ -53,7 +53,7 @@ void main() {
}); });
tearDown(() async { tearDown(() async {
sut.dispose(); unawaited(sut.dispose());
await controller.close(); await controller.close();
}); });