conflict resolution
This commit is contained in:
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user