refactor: yeet old timeline (#27666)

* refactor: yank old timeline

# Conflicts:
#	mobile/lib/presentation/pages/editing/drift_edit.page.dart
#	mobile/lib/providers/websocket.provider.dart
#	mobile/lib/routing/router.dart

* more cleanup

* remove native code

* chore: bump sqlite-data version

* remove old background tasks from BGTaskSchedulerPermittedIdentifiers

* rebase

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2026-04-15 23:00:27 +05:30
committed by GitHub
parent 6dd6053222
commit 79fccdbee0
367 changed files with 332 additions and 50870 deletions
@@ -5,28 +5,17 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/services/log.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/extensions/platform_extensions.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/app_settings.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/drift_backup.provider.dart';
import 'package:immich_mobile/providers/backup/ios_background_settings.provider.dart';
import 'package:immich_mobile/providers/backup/manual_upload.provider.dart';
import 'package:immich_mobile/providers/gallery_permission.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/memory.provider.dart';
import 'package:immich_mobile/providers/notification_permission.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/tab.provider.dart';
import 'package:immich_mobile/providers/websocket.provider.dart';
import 'package:immich_mobile/services/app_settings.service.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 { active, inactive, paused, resumed, detached, hidden }
@@ -87,43 +76,15 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
final endpoint = await _ref.read(authProvider.notifier).setOpenApiServiceEndpoint();
_log.info("Using server URL: $endpoint");
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();
}
if (!Store.isBetaTimelineEnabled) {
switch (_ref.read(tabProvider)) {
case TabEnum.home:
await _ref.read(assetProvider.notifier).getAllAsset();
case TabEnum.albums:
await _ref.read(albumProvider.notifier).refreshRemoteAlbums();
case TabEnum.library:
case TabEnum.search:
break;
}
} else {
_ref.read(websocketProvider.notifier).connect();
await _handleBetaTimelineResume();
}
_ref.read(websocketProvider.notifier).connect();
await _handleBetaTimelineResume();
await _ref.read(notificationPermissionProvider.notifier).getNotificationPermission();
await _ref.read(galleryPermissionNotifier.notifier).getGalleryPermissionStatus();
if (!Store.isBetaTimelineEnabled) {
await _ref.read(iOSBackgroundSettingsProvider.notifier).refresh();
_ref.invalidate(memoryFutureProvider);
}
}
Future<void> _safeRun(Future<void> action, String debugName) async {
@@ -139,7 +100,6 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
}
Future<void> _handleBetaTimelineResume() async {
_ref.read(backupProvider.notifier).cancelBackup();
unawaited(_ref.read(backgroundWorkerLockServiceProvider).lock());
// Give isolates time to complete any ongoing database transactions
@@ -218,9 +178,7 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
_pauseOperation = Completer<void>();
try {
if (Store.isBetaTimelineEnabled) {
unawaited(_ref.read(backgroundWorkerLockServiceProvider).unlock());
}
unawaited(_ref.read(backgroundWorkerLockServiceProvider).unlock());
await _performPause();
} catch (e, stackTrace) {
_log.severe("Error during app pause", e, stackTrace);
@@ -234,14 +192,7 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
Future<void> _performPause() {
if (_ref.read(authProvider).isAuthenticated) {
if (!Store.isBetaTimelineEnabled) {
// Do not cancel backup if manual upload is in progress
if (_ref.read(backupProvider.notifier).backupProgress != BackUpProgressEnum.manualInProgress) {
_ref.read(backupProvider.notifier).cancelBackup();
}
} else {
_ref.read(driftBackupProvider.notifier).stopForegroundBackup();
}
_ref.read(driftBackupProvider.notifier).stopForegroundBackup();
_ref.read(websocketProvider.notifier).disconnect();
}
@@ -252,31 +203,12 @@ class AppLifeCycleNotifier extends StateNotifier<AppLifeCycleEnum> {
Future<void> handleAppDetached() async {
state = AppLifeCycleEnum.detached;
if (Store.isBetaTimelineEnabled) {
unawaited(_ref.read(backgroundWorkerLockServiceProvider).unlock());
}
unawaited(_ref.read(backgroundWorkerLockServiceProvider).unlock());
// Flush logs before closing database
try {
await LogService.I.flush();
} catch (_) {}
// Close Isar database safely
try {
final isar = Isar.getInstance();
if (isar != null && isar.isOpen) {
await isar.close();
}
} catch (_) {}
if (Store.isBetaTimelineEnabled) {
return;
}
// no guarantee this is called at all
try {
_ref.read(manualUploadProvider.notifier).cancelBackup();
} catch (_) {}
}
void handleAppHidden() {