feat: add toggle to switch between Isar and Sqlite (#19953)
This commit is contained in:
@@ -3,10 +3,12 @@ import 'dart:async';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/domain/services/log.service.dart';
|
||||
import 'package:immich_mobile/entities/store.entity.dart';
|
||||
import 'package:immich_mobile/models/backup/backup_state.model.dart';
|
||||
import 'package:immich_mobile/providers/album/album.provider.dart';
|
||||
import 'package:immich_mobile/providers/asset.provider.dart';
|
||||
import 'package:immich_mobile/providers/auth.provider.dart';
|
||||
import 'package:immich_mobile/providers/background_sync.provider.dart';
|
||||
import 'package:immich_mobile/providers/backup/backup.provider.dart';
|
||||
import 'package:immich_mobile/providers/backup/ios_background_settings.provider.dart';
|
||||
import 'package:immich_mobile/providers/backup/manual_upload.provider.dart';
|
||||
@@ -18,6 +20,7 @@ import 'package:immich_mobile/providers/tab.provider.dart';
|
||||
import 'package:immich_mobile/providers/websocket.provider.dart';
|
||||
import 'package:immich_mobile/services/background.service.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
|
||||
enum AppLifeCycleEnum {
|
||||
@@ -57,29 +60,59 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
|
||||
debugPrint("Using server URL: $endpoint");
|
||||
}
|
||||
|
||||
final permission = _ref.watch(galleryPermissionNotifier);
|
||||
if (permission.isGranted || permission.isLimited) {
|
||||
await _ref.read(backupProvider.notifier).resumeBackup();
|
||||
await _ref.read(backgroundServiceProvider).resumeServiceIfEnabled();
|
||||
if (!Store.isBetaTimelineEnabled) {
|
||||
final permission = _ref.watch(galleryPermissionNotifier);
|
||||
if (permission.isGranted || permission.isLimited) {
|
||||
await _ref.read(backupProvider.notifier).resumeBackup();
|
||||
await _ref.read(backgroundServiceProvider).resumeServiceIfEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
await _ref.read(serverInfoProvider.notifier).getServerVersion();
|
||||
}
|
||||
|
||||
switch (_ref.read(tabProvider)) {
|
||||
case TabEnum.home:
|
||||
await _ref.read(assetProvider.notifier).getAllAsset();
|
||||
break;
|
||||
case TabEnum.search:
|
||||
// nothing to do
|
||||
break;
|
||||
if (!Store.isBetaTimelineEnabled) {
|
||||
switch (_ref.read(tabProvider)) {
|
||||
case TabEnum.home:
|
||||
await _ref.read(assetProvider.notifier).getAllAsset();
|
||||
break;
|
||||
case TabEnum.search:
|
||||
// nothing to do
|
||||
break;
|
||||
|
||||
case TabEnum.albums:
|
||||
await _ref.read(albumProvider.notifier).refreshRemoteAlbums();
|
||||
break;
|
||||
case TabEnum.library:
|
||||
// nothing to do
|
||||
break;
|
||||
case TabEnum.albums:
|
||||
await _ref.read(albumProvider.notifier).refreshRemoteAlbums();
|
||||
break;
|
||||
case TabEnum.library:
|
||||
// nothing to do
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
_ref.read(backupProvider.notifier).cancelBackup();
|
||||
|
||||
final backgroundManager = _ref.read(backgroundSyncProvider);
|
||||
// Ensure proper cleanup before starting new background tasks
|
||||
try {
|
||||
await Future.wait([
|
||||
backgroundManager.syncLocal().then(
|
||||
(_) {
|
||||
Logger("AppLifeCycleNotifier")
|
||||
.fine("Hashing assets after syncLocal");
|
||||
// Check if app is still active before hashing
|
||||
if (state == AppLifeCycleEnum.resumed) {
|
||||
backgroundManager.hashAssets();
|
||||
}
|
||||
},
|
||||
),
|
||||
backgroundManager.syncRemote(),
|
||||
]);
|
||||
} catch (e, stackTrace) {
|
||||
Logger("AppLifeCycleNotifier").severe(
|
||||
"Error during background sync",
|
||||
e,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
_ref.read(websocketProvider.notifier).connect();
|
||||
@@ -92,9 +125,11 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
|
||||
.read(galleryPermissionNotifier.notifier)
|
||||
.getGalleryPermissionStatus();
|
||||
|
||||
await _ref.read(iOSBackgroundSettingsProvider.notifier).refresh();
|
||||
if (!Store.isBetaTimelineEnabled) {
|
||||
await _ref.read(iOSBackgroundSettingsProvider.notifier).refresh();
|
||||
|
||||
_ref.invalidate(memoryFutureProvider);
|
||||
_ref.invalidate(memoryFutureProvider);
|
||||
}
|
||||
}
|
||||
|
||||
void handleAppInactivity() {
|
||||
@@ -106,7 +141,8 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
|
||||
state = AppLifeCycleEnum.paused;
|
||||
_wasPaused = true;
|
||||
|
||||
if (_ref.read(authProvider).isAuthenticated) {
|
||||
if (!Store.isBetaTimelineEnabled &&
|
||||
_ref.read(authProvider).isAuthenticated) {
|
||||
// Do not cancel backup if manual upload is in progress
|
||||
if (_ref.read(backupProvider.notifier).backupProgress !=
|
||||
BackUpProgressEnum.manualInProgress) {
|
||||
@@ -115,15 +151,43 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
|
||||
_ref.read(websocketProvider.notifier).disconnect();
|
||||
}
|
||||
|
||||
LogService.I.flush();
|
||||
try {
|
||||
LogService.I.flush();
|
||||
} catch (e) {
|
||||
// Ignore flush errors during pause
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> handleAppDetached() async {
|
||||
state = AppLifeCycleEnum.detached;
|
||||
LogService.I.flush();
|
||||
await Isar.getInstance()?.close();
|
||||
|
||||
// Flush logs before closing database
|
||||
try {
|
||||
LogService.I.flush();
|
||||
} catch (e) {
|
||||
// Ignore flush errors during shutdown
|
||||
}
|
||||
|
||||
// Close Isar database safely
|
||||
try {
|
||||
final isar = Isar.getInstance();
|
||||
if (isar != null && isar.isOpen) {
|
||||
await isar.close();
|
||||
}
|
||||
} catch (e) {
|
||||
// Ignore close errors during shutdown
|
||||
}
|
||||
|
||||
if (Store.isBetaTimelineEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
// no guarantee this is called at all
|
||||
_ref.read(manualUploadProvider.notifier).cancelBackup();
|
||||
try {
|
||||
_ref.read(manualUploadProvider.notifier).cancelBackup();
|
||||
} catch (e) {
|
||||
// Ignore errors during shutdown
|
||||
}
|
||||
}
|
||||
|
||||
void handleAppHidden() {
|
||||
|
||||
@@ -13,5 +13,6 @@ Isar isar(Ref ref) => throw UnimplementedError('isar');
|
||||
final driftProvider = Provider<Drift>((ref) {
|
||||
final drift = Drift();
|
||||
ref.onDispose(() => unawaited(drift.close()));
|
||||
ref.keepAlive();
|
||||
return drift;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user