Browse Source

additional state

Alex Tran 1 year ago
parent
commit
07b27e3e64

+ 16 - 9
mobile/lib/modules/backup/models/backup_state.model.dart

@@ -1,10 +1,13 @@
+// ignore_for_file: public_member_api_docs, sort_constructors_first
+import 'dart:convert';
+
 import 'package:cancellation_token_http/http.dart';
 import 'package:cancellation_token_http/http.dart';
 import 'package:collection/collection.dart';
 import 'package:collection/collection.dart';
-import 'package:immich_mobile/shared/models/server_info/server_disk_info.model.dart';
 import 'package:photo_manager/photo_manager.dart';
 import 'package:photo_manager/photo_manager.dart';
 
 
 import 'package:immich_mobile/modules/backup/models/available_album.model.dart';
 import 'package:immich_mobile/modules/backup/models/available_album.model.dart';
 import 'package:immich_mobile/modules/backup/models/current_upload_asset.model.dart';
 import 'package:immich_mobile/modules/backup/models/current_upload_asset.model.dart';
+import 'package:immich_mobile/shared/models/server_info/server_disk_info.model.dart';
 
 
 enum BackUpProgressEnum {
 enum BackUpProgressEnum {
   idle,
   idle,
@@ -19,6 +22,7 @@ class BackUpState {
   final BackUpProgressEnum backupProgress;
   final BackUpProgressEnum backupProgress;
   final List<String> allAssetsInDatabase;
   final List<String> allAssetsInDatabase;
   final double progressInPercentage;
   final double progressInPercentage;
+  final double iCloudDownloadProgress;
   final CancellationToken cancelToken;
   final CancellationToken cancelToken;
   final ServerDiskInfo serverInfo;
   final ServerDiskInfo serverInfo;
   final bool autoBackup;
   final bool autoBackup;
@@ -45,6 +49,7 @@ class BackUpState {
     required this.backupProgress,
     required this.backupProgress,
     required this.allAssetsInDatabase,
     required this.allAssetsInDatabase,
     required this.progressInPercentage,
     required this.progressInPercentage,
+    required this.iCloudDownloadProgress,
     required this.cancelToken,
     required this.cancelToken,
     required this.serverInfo,
     required this.serverInfo,
     required this.autoBackup,
     required this.autoBackup,
@@ -64,6 +69,7 @@ class BackUpState {
     BackUpProgressEnum? backupProgress,
     BackUpProgressEnum? backupProgress,
     List<String>? allAssetsInDatabase,
     List<String>? allAssetsInDatabase,
     double? progressInPercentage,
     double? progressInPercentage,
+    double? iCloudDownloadProgress,
     CancellationToken? cancelToken,
     CancellationToken? cancelToken,
     ServerDiskInfo? serverInfo,
     ServerDiskInfo? serverInfo,
     bool? autoBackup,
     bool? autoBackup,
@@ -82,6 +88,8 @@ class BackUpState {
       backupProgress: backupProgress ?? this.backupProgress,
       backupProgress: backupProgress ?? this.backupProgress,
       allAssetsInDatabase: allAssetsInDatabase ?? this.allAssetsInDatabase,
       allAssetsInDatabase: allAssetsInDatabase ?? this.allAssetsInDatabase,
       progressInPercentage: progressInPercentage ?? this.progressInPercentage,
       progressInPercentage: progressInPercentage ?? this.progressInPercentage,
+      iCloudDownloadProgress:
+          iCloudDownloadProgress ?? this.iCloudDownloadProgress,
       cancelToken: cancelToken ?? this.cancelToken,
       cancelToken: cancelToken ?? this.cancelToken,
       serverInfo: serverInfo ?? this.serverInfo,
       serverInfo: serverInfo ?? this.serverInfo,
       autoBackup: autoBackup ?? this.autoBackup,
       autoBackup: autoBackup ?? this.autoBackup,
@@ -102,18 +110,18 @@ class BackUpState {
 
 
   @override
   @override
   String toString() {
   String toString() {
-    return 'BackUpState(backupProgress: $backupProgress, allAssetsInDatabase: $allAssetsInDatabase, progressInPercentage: $progressInPercentage, cancelToken: $cancelToken, serverInfo: $serverInfo, autoBackup: $autoBackup, backgroundBackup: $backgroundBackup, backupRequireWifi: $backupRequireWifi, backupRequireCharging: $backupRequireCharging, backupTriggerDelay: $backupTriggerDelay, availableAlbums: $availableAlbums, selectedBackupAlbums: $selectedBackupAlbums, excludedBackupAlbums: $excludedBackupAlbums, allUniqueAssets: $allUniqueAssets, selectedAlbumsBackupAssetsIds: $selectedAlbumsBackupAssetsIds, currentUploadAsset: $currentUploadAsset)';
+    return 'BackUpState(backupProgress: $backupProgress, allAssetsInDatabase: $allAssetsInDatabase, progressInPercentage: $progressInPercentage, iCloudDownloadProgress: $iCloudDownloadProgress, cancelToken: $cancelToken, serverInfo: $serverInfo, autoBackup: $autoBackup, backgroundBackup: $backgroundBackup, backupRequireWifi: $backupRequireWifi, backupRequireCharging: $backupRequireCharging, backupTriggerDelay: $backupTriggerDelay, availableAlbums: $availableAlbums, selectedBackupAlbums: $selectedBackupAlbums, excludedBackupAlbums: $excludedBackupAlbums, allUniqueAssets: $allUniqueAssets, selectedAlbumsBackupAssetsIds: $selectedAlbumsBackupAssetsIds, currentUploadAsset: $currentUploadAsset)';
   }
   }
 
 
   @override
   @override
-  bool operator ==(Object other) {
+  bool operator ==(covariant BackUpState other) {
     if (identical(this, other)) return true;
     if (identical(this, other)) return true;
     final collectionEquals = const DeepCollectionEquality().equals;
     final collectionEquals = const DeepCollectionEquality().equals;
 
 
-    return other is BackUpState &&
-        other.backupProgress == backupProgress &&
+    return other.backupProgress == backupProgress &&
         collectionEquals(other.allAssetsInDatabase, allAssetsInDatabase) &&
         collectionEquals(other.allAssetsInDatabase, allAssetsInDatabase) &&
         other.progressInPercentage == progressInPercentage &&
         other.progressInPercentage == progressInPercentage &&
+        other.iCloudDownloadProgress == iCloudDownloadProgress &&
         other.cancelToken == cancelToken &&
         other.cancelToken == cancelToken &&
         other.serverInfo == serverInfo &&
         other.serverInfo == serverInfo &&
         other.autoBackup == autoBackup &&
         other.autoBackup == autoBackup &&
@@ -125,10 +133,8 @@ class BackUpState {
         collectionEquals(other.selectedBackupAlbums, selectedBackupAlbums) &&
         collectionEquals(other.selectedBackupAlbums, selectedBackupAlbums) &&
         collectionEquals(other.excludedBackupAlbums, excludedBackupAlbums) &&
         collectionEquals(other.excludedBackupAlbums, excludedBackupAlbums) &&
         collectionEquals(other.allUniqueAssets, allUniqueAssets) &&
         collectionEquals(other.allUniqueAssets, allUniqueAssets) &&
-        collectionEquals(
-          other.selectedAlbumsBackupAssetsIds,
-          selectedAlbumsBackupAssetsIds,
-        ) &&
+        collectionEquals(other.selectedAlbumsBackupAssetsIds,
+            selectedAlbumsBackupAssetsIds) &&
         other.currentUploadAsset == currentUploadAsset;
         other.currentUploadAsset == currentUploadAsset;
   }
   }
 
 
@@ -137,6 +143,7 @@ class BackUpState {
     return backupProgress.hashCode ^
     return backupProgress.hashCode ^
         allAssetsInDatabase.hashCode ^
         allAssetsInDatabase.hashCode ^
         progressInPercentage.hashCode ^
         progressInPercentage.hashCode ^
+        iCloudDownloadProgress.hashCode ^
         cancelToken.hashCode ^
         cancelToken.hashCode ^
         serverInfo.hashCode ^
         serverInfo.hashCode ^
         autoBackup.hashCode ^
         autoBackup.hashCode ^

+ 27 - 19
mobile/lib/modules/backup/models/current_upload_asset.model.dart

@@ -1,3 +1,4 @@
+// ignore_for_file: public_member_api_docs, sort_constructors_first
 import 'dart:convert';
 import 'dart:convert';
 
 
 class CurrentUploadAsset {
 class CurrentUploadAsset {
@@ -5,12 +6,14 @@ class CurrentUploadAsset {
   final DateTime fileCreatedAt;
   final DateTime fileCreatedAt;
   final String fileName;
   final String fileName;
   final String fileType;
   final String fileType;
+  final bool? iCloudAsset;
 
 
   CurrentUploadAsset({
   CurrentUploadAsset({
     required this.id,
     required this.id,
     required this.fileCreatedAt,
     required this.fileCreatedAt,
     required this.fileName,
     required this.fileName,
     required this.fileType,
     required this.fileType,
+    this.iCloudAsset,
   });
   });
 
 
   CurrentUploadAsset copyWith({
   CurrentUploadAsset copyWith({
@@ -18,54 +21,58 @@ class CurrentUploadAsset {
     DateTime? fileCreatedAt,
     DateTime? fileCreatedAt,
     String? fileName,
     String? fileName,
     String? fileType,
     String? fileType,
+    bool? iCloudAsset,
   }) {
   }) {
     return CurrentUploadAsset(
     return CurrentUploadAsset(
       id: id ?? this.id,
       id: id ?? this.id,
       fileCreatedAt: fileCreatedAt ?? this.fileCreatedAt,
       fileCreatedAt: fileCreatedAt ?? this.fileCreatedAt,
       fileName: fileName ?? this.fileName,
       fileName: fileName ?? this.fileName,
       fileType: fileType ?? this.fileType,
       fileType: fileType ?? this.fileType,
+      iCloudAsset: iCloudAsset ?? this.iCloudAsset,
     );
     );
   }
   }
 
 
   Map<String, dynamic> toMap() {
   Map<String, dynamic> toMap() {
-    final result = <String, dynamic>{};
-
-    result.addAll({'id': id});
-    result.addAll({'fileCreatedAt': fileCreatedAt.millisecondsSinceEpoch});
-    result.addAll({'fileName': fileName});
-    result.addAll({'fileType': fileType});
-
-    return result;
+    return <String, dynamic>{
+      'id': id,
+      'fileCreatedAt': fileCreatedAt.millisecondsSinceEpoch,
+      'fileName': fileName,
+      'fileType': fileType,
+      'iCloudAsset': iCloudAsset,
+    };
   }
   }
 
 
   factory CurrentUploadAsset.fromMap(Map<String, dynamic> map) {
   factory CurrentUploadAsset.fromMap(Map<String, dynamic> map) {
     return CurrentUploadAsset(
     return CurrentUploadAsset(
-      id: map['id'] ?? '',
-      fileCreatedAt: DateTime.fromMillisecondsSinceEpoch(map['fileCreatedAt']),
-      fileName: map['fileName'] ?? '',
-      fileType: map['fileType'] ?? '',
+      id: map['id'] as String,
+      fileCreatedAt:
+          DateTime.fromMillisecondsSinceEpoch(map['fileCreatedAt'] as int),
+      fileName: map['fileName'] as String,
+      fileType: map['fileType'] as String,
+      iCloudAsset:
+          map['iCloudAsset'] != null ? map['iCloudAsset'] as bool : null,
     );
     );
   }
   }
 
 
   String toJson() => json.encode(toMap());
   String toJson() => json.encode(toMap());
 
 
   factory CurrentUploadAsset.fromJson(String source) =>
   factory CurrentUploadAsset.fromJson(String source) =>
-      CurrentUploadAsset.fromMap(json.decode(source));
+      CurrentUploadAsset.fromMap(json.decode(source) as Map<String, dynamic>);
 
 
   @override
   @override
   String toString() {
   String toString() {
-    return 'CurrentUploadAsset(id: $id, fileCreatedAt: $fileCreatedAt, fileName: $fileName, fileType: $fileType)';
+    return 'CurrentUploadAsset(id: $id, fileCreatedAt: $fileCreatedAt, fileName: $fileName, fileType: $fileType, iCloudAsset: $iCloudAsset)';
   }
   }
 
 
   @override
   @override
-  bool operator ==(Object other) {
+  bool operator ==(covariant CurrentUploadAsset other) {
     if (identical(this, other)) return true;
     if (identical(this, other)) return true;
 
 
-    return other is CurrentUploadAsset &&
-        other.id == id &&
+    return other.id == id &&
         other.fileCreatedAt == fileCreatedAt &&
         other.fileCreatedAt == fileCreatedAt &&
         other.fileName == fileName &&
         other.fileName == fileName &&
-        other.fileType == fileType;
+        other.fileType == fileType &&
+        other.iCloudAsset == iCloudAsset;
   }
   }
 
 
   @override
   @override
@@ -73,6 +80,7 @@ class CurrentUploadAsset {
     return id.hashCode ^
     return id.hashCode ^
         fileCreatedAt.hashCode ^
         fileCreatedAt.hashCode ^
         fileName.hashCode ^
         fileName.hashCode ^
-        fileType.hashCode;
+        fileType.hashCode ^
+        iCloudAsset.hashCode;
   }
   }
 }
 }

+ 6 - 1
mobile/lib/modules/backup/providers/backup.provider.dart

@@ -61,7 +61,9 @@ class BackupNotifier extends StateNotifier<BackUpState> {
               fileCreatedAt: DateTime.parse('2020-10-04'),
               fileCreatedAt: DateTime.parse('2020-10-04'),
               fileName: '...',
               fileName: '...',
               fileType: '...',
               fileType: '...',
+              iCloudAsset: false,
             ),
             ),
+            iCloudDownloadProgress: 0.0,
           ),
           ),
         );
         );
 
 
@@ -447,7 +449,10 @@ class BackupNotifier extends StateNotifier<BackUpState> {
 
 
       final pmProgressHandler = PMProgressHandler();
       final pmProgressHandler = PMProgressHandler();
 
 
-      pmProgressHandler.stream.listen((event) {});
+      pmProgressHandler.stream.listen((event) {
+        final double progress = event.progress;
+        state = state.copyWith(iCloudDownloadProgress: progress);
+      });
 
 
       await _backupService.backupAsset(
       await _backupService.backupAsset(
         assetsWillBeBackup,
         assetsWillBeBackup,

+ 13 - 0
mobile/lib/modules/backup/services/backup.service.dart

@@ -246,6 +246,18 @@ class BackupService {
 
 
         // Handle getting files from iCloud
         // Handle getting files from iCloud
         if (!isAvailableLocally && Platform.isIOS) {
         if (!isAvailableLocally && Platform.isIOS) {
+          setCurrentUploadAssetCb(
+            CurrentUploadAsset(
+              id: entity.id,
+              fileCreatedAt: entity.createDateTime.year == 1970
+                  ? entity.modifiedDateTime
+                  : entity.createDateTime,
+              fileName: "File from iCloud",
+              fileType: _getAssetType(entity.type),
+              iCloudAsset: true,
+            ),
+          );
+
           file = await entity.loadFile(progressHandler: pmProgressHandler);
           file = await entity.loadFile(progressHandler: pmProgressHandler);
         } else {
         } else {
           if (entity.type == AssetType.video) {
           if (entity.type == AssetType.video) {
@@ -294,6 +306,7 @@ class BackupService {
                   : entity.createDateTime,
                   : entity.createDateTime,
               fileName: originalFileName,
               fileName: originalFileName,
               fileType: _getAssetType(entity.type),
               fileType: _getAssetType(entity.type),
+              iCloudAsset: false,
             ),
             ),
           );
           );