Browse Source

Apply lint suggestions

Neeraj Gupta 2 năm trước cách đây
mục cha
commit
f3d8a13337
38 tập tin đã thay đổi với 258 bổ sung357 xóa
  1. 5 14
      ios/Runner.xcodeproj/project.pbxproj
  2. 1 1
      lib/core/error-reporting/super_logging.dart
  3. 3 3
      lib/db/trash_db.dart
  4. 1 3
      lib/services/billing_service.dart
  5. 19 23
      lib/services/collections_service.dart
  6. 0 1
      lib/services/local_sync_service.dart
  7. 1 2
      lib/services/remote_sync_service.dart
  8. 8 10
      lib/ui/account/email_entry_page.dart
  9. 1 4
      lib/ui/account/ott_verification_page.dart
  10. 6 8
      lib/ui/account/password_entry_page.dart
  11. 0 9
      lib/ui/account/password_reentry_page.dart
  12. 0 1
      lib/ui/actions/collection/collection_file_actions.dart
  13. 2 2
      lib/ui/backup_folder_selection_page.dart
  14. 0 1
      lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart
  15. 0 1
      lib/ui/components/keyboard/keyboard_top_button.dart
  16. 3 4
      lib/ui/create_collection_page.dart
  17. 1 5
      lib/ui/extents_page_view.dart
  18. 0 1
      lib/ui/home/home_bottom_nav_bar.dart
  19. 1 3
      lib/ui/home/status_bar_widget.dart
  20. 0 1
      lib/ui/notification/update/change_log_page.dart
  21. 4 8
      lib/ui/payment/payment_web_page.dart
  22. 4 6
      lib/ui/payment/stripe_subscription_page.dart
  23. 6 8
      lib/ui/payment/subscription_page.dart
  24. 0 2
      lib/ui/settings/settings_title_bar_widget.dart
  25. 0 27
      lib/ui/sharing/manage_links_widget.dart
  26. 0 1
      lib/ui/sharing/user_avator_widget.dart
  27. 9 7
      lib/ui/tools/debug/app_storage_viewer.dart
  28. 5 5
      lib/ui/tools/deduplicate_page.dart
  29. 3 1
      lib/ui/tools/editor/image_editor_page.dart
  30. 0 1
      lib/ui/viewer/actions/file_selection_actions_widget.dart
  31. 0 1
      lib/ui/viewer/actions/file_selection_overlay_bar.dart
  32. 3 7
      lib/ui/viewer/file/file_info_widget.dart
  33. 1 1
      lib/ui/viewer/file/thumbnail_widget.dart
  34. 6 12
      lib/ui/viewer/file/video_controls.dart
  35. 5 3
      lib/ui/viewer/file/video_widget.dart
  36. 74 79
      lib/utils/diff_fetcher.dart
  37. 12 14
      lib/utils/email_util.dart
  38. 74 77
      lib/utils/trash_diff_fetcher.dart

+ 5 - 14
ios/Runner.xcodeproj/project.pbxproj

@@ -16,7 +16,7 @@
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
-		DA6BE5E826B3BC8600656280 /* BuildFile in Resources */ = {isa = PBXBuildFile; };
+		DA6BE5E826B3BC8600656280 /* (null) in Resources */ = {isa = PBXBuildFile; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -213,7 +213,7 @@
 				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
 				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
 				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
-				DA6BE5E826B3BC8600656280 /* BuildFile in Resources */,
+				DA6BE5E826B3BC8600656280 /* (null) in Resources */,
 				277218A0270F596900FFE3CC /* GoogleService-Info.plist in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -501,10 +501,7 @@
 					"$(PROJECT_DIR)/Flutter",
 				);
 				INFOPLIST_FILE = Runner/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-				);
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
@@ -661,10 +658,7 @@
 					"$(PROJECT_DIR)/Flutter",
 				);
 				INFOPLIST_FILE = Runner/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-				);
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",
@@ -698,10 +692,7 @@
 					"$(PROJECT_DIR)/Flutter",
 				);
 				INFOPLIST_FILE = Runner/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-				);
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/Flutter",

+ 1 - 1
lib/core/error-reporting/super_logging.dart

@@ -239,7 +239,7 @@ class SuperLogging {
       extraLines = null;
     }
 
-    final str = (config.prefix ?? '') + " " + rec.toPrettyString(extraLines);
+    final str = (config.prefix) + " " + rec.toPrettyString(extraLines);
 
     // write to stdout
     printLog(str);

+ 3 - 3
lib/db/trash_db.dart

@@ -109,7 +109,7 @@ class TrashDB {
       orderBy: '$columnTrashDeleteBy DESC',
       limit: 1,
     );
-    if (rows == null || rows.isEmpty) {
+    if (rows.isEmpty) {
       return null;
     }
     return _getTrashFromRow(rows[0]);
@@ -264,10 +264,10 @@ class TrashDB {
     row[columnCreationTime] = trash.creationTime;
     row[columnFileMetadata] = jsonEncode(trash.metadata);
 
-    row[columnMMdVersion] = trash.mMdVersion ?? 0;
+    row[columnMMdVersion] = trash.mMdVersion;
     row[columnMMdEncodedJson] = trash.mMdEncodedJson ?? '{}';
 
-    row[columnPubMMdVersion] = trash.pubMmdVersion ?? 0;
+    row[columnPubMMdVersion] = trash.pubMmdVersion;
     row[columnPubMMdEncodedJson] = trash.pubMmdEncodedJson ?? '{}';
     return row;
   }

+ 1 - 3
lib/services/billing_service.dart

@@ -53,9 +53,7 @@ class BillingService {
             purchase.productID,
             purchase.verificationData.serverVerificationData,
           ).then((response) {
-            if (response != null) {
-              InAppPurchase.instance.completePurchase(purchase);
-            }
+            InAppPurchase.instance.completePurchase(purchase);
           });
         } else if (Platform.isIOS && purchase.pendingCompletePurchase) {
           InAppPurchase.instance.completePurchase(purchase);

+ 19 - 23
lib/services/collections_service.dart

@@ -454,9 +454,7 @@ class CollectionsService {
         _config.getSecretKey()!,
       );
     }
-    if (collectionKey != null) {
-      _cachedKeys[collection.id] = collectionKey;
-    }
+    _cachedKeys[collection.id] = collectionKey;
     return collectionKey;
   }
 
@@ -642,26 +640,24 @@ class CollectionsService {
         },
       );
       final List<Collection> collections = [];
-      if (response != null) {
-        final c = response.data["collections"];
-        for (final collectionData in c) {
-          final collection = Collection.fromMap(collectionData);
-          if (collectionData['magicMetadata'] != null) {
-            final decryptionKey =
-                _getAndCacheDecryptedKey(collection, source: "fetchCollection");
-            final utfEncodedMmd = await CryptoUtil.decryptChaCha(
-              Sodium.base642bin(collectionData['magicMetadata']['data']),
-              decryptionKey,
-              Sodium.base642bin(collectionData['magicMetadata']['header']),
-            );
-            collection.mMdEncodedJson = utf8.decode(utfEncodedMmd);
-            collection.mMdVersion = collectionData['magicMetadata']['version'];
-            collection.magicMetadata = CollectionMagicMetadata.fromEncodedJson(
-              collection.mMdEncodedJson,
-            );
-          }
-          collections.add(collection);
+      final c = response.data["collections"];
+      for (final collectionData in c) {
+        final collection = Collection.fromMap(collectionData);
+        if (collectionData['magicMetadata'] != null) {
+          final decryptionKey =
+              _getAndCacheDecryptedKey(collection, source: "fetchCollection");
+          final utfEncodedMmd = await CryptoUtil.decryptChaCha(
+            Sodium.base642bin(collectionData['magicMetadata']['data']),
+            decryptionKey,
+            Sodium.base642bin(collectionData['magicMetadata']['header']),
+          );
+          collection.mMdEncodedJson = utf8.decode(utfEncodedMmd);
+          collection.mMdVersion = collectionData['magicMetadata']['version'];
+          collection.magicMetadata = CollectionMagicMetadata.fromEncodedJson(
+            collection.mMdEncodedJson,
+          );
         }
+        collections.add(collection);
       }
       return collections;
     } catch (e) {
@@ -700,7 +696,7 @@ class CollectionsService {
       final response = await _enteDio.get(
         "/collections/$collectionID",
       );
-      assert(response != null && response.data != null);
+      assert(response.data != null);
       final collectionData = response.data["collection"];
       final collection = Collection.fromMap(collectionData);
       if (collectionData['magicMetadata'] != null) {

+ 0 - 1
lib/services/local_sync_service.dart

@@ -3,7 +3,6 @@ import 'dart:io';
 
 import 'package:computer/computer.dart';
 import 'package:flutter/foundation.dart';
-import 'package:flutter/widgets.dart';
 import 'package:logging/logging.dart';
 import 'package:photo_manager/photo_manager.dart';
 import 'package:photos/core/configuration.dart';

+ 1 - 2
lib/services/remote_sync_service.dart

@@ -97,8 +97,7 @@ class RemoteSyncService {
       // remote-sync is done. This is done to avoid adding existing files to
       // the same or different collection when user had already uploaded them
       // before.
-      final bool hasSyncedBefore =
-          _prefs.containsKey(_isFirstRemoteSyncDone) ?? false;
+      final bool hasSyncedBefore = _prefs.containsKey(_isFirstRemoteSyncDone);
       if (hasSyncedBefore) {
         await syncDeviceCollectionFilesForUpload();
       }

+ 8 - 10
lib/ui/account/email_entry_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'package:email_validator/email_validator.dart';
 import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
@@ -33,8 +31,8 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
   String _cnfPassword = '';
   double _passwordStrength = 0.0;
   bool _emailIsValid = false;
-  bool? _hasAgreedToTOS = true;
-  bool? _hasAgreedToE2E = false;
+  bool _hasAgreedToTOS = true;
+  bool _hasAgreedToE2E = false;
   bool _password1Visible = false;
   bool _password2Visible = false;
   bool _passwordsMatch = false;
@@ -352,7 +350,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
     return GestureDetector(
       onTap: () {
         setState(() {
-          _hasAgreedToTOS = !_hasAgreedToTOS!;
+          _hasAgreedToTOS = !_hasAgreedToTOS;
         });
       },
       behavior: HitTestBehavior.translucent,
@@ -363,7 +361,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
             side: CheckboxTheme.of(context).side,
             onChanged: (value) {
               setState(() {
-                _hasAgreedToTOS = value;
+                _hasAgreedToTOS = value!;
               });
             },
           ),
@@ -431,7 +429,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
     return GestureDetector(
       onTap: () {
         setState(() {
-          _hasAgreedToE2E = !_hasAgreedToE2E!;
+          _hasAgreedToE2E = !_hasAgreedToE2E;
         });
       },
       behavior: HitTestBehavior.translucent,
@@ -442,7 +440,7 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
             side: CheckboxTheme.of(context).side,
             onChanged: (value) {
               setState(() {
-                _hasAgreedToE2E = value;
+                _hasAgreedToE2E = value!;
               });
             },
           ),
@@ -491,8 +489,8 @@ class _EmailEntryPageState extends State<EmailEntryPage> {
   bool _isFormValid() {
     return _emailIsValid &&
         _passwordsMatch &&
-        _hasAgreedToTOS! &&
-        _hasAgreedToE2E! &&
+        _hasAgreedToTOS &&
+        _hasAgreedToE2E &&
         _passwordIsValid;
   }
 }

+ 1 - 4
lib/ui/account/ott_verification_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'package:flutter/material.dart';
 import 'package:photos/ente_theme_data.dart';
 import 'package:photos/services/user_service.dart';
@@ -65,8 +63,7 @@ class _OTTVerificationPageState extends State<OTTVerificationPage> {
       body: _getBody(),
       floatingActionButton: DynamicFAB(
         isKeypadOpen: isKeypadOpen,
-        isFormValid: !(_verificationCodeController.text == null ||
-            _verificationCodeController.text.isEmpty),
+        isFormValid: _verificationCodeController.text.isNotEmpty,
         buttonText: 'Verify',
         onPressedFunction: () {
           if (widget.isChangeEmail) {

+ 6 - 8
lib/ui/account/password_entry_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:logging/logging.dart';
@@ -187,10 +185,11 @@ class _PasswordEntryPageState extends State<PasswordEntryPage> {
                         ),
                         TextSpan(
                           text: "we cannot decrypt your data",
-                          style: Theme.of(context).textTheme.subtitle1!.copyWith(
-                                fontSize: 14,
-                                decoration: TextDecoration.underline,
-                              ),
+                          style:
+                              Theme.of(context).textTheme.subtitle1!.copyWith(
+                                    fontSize: 14,
+                                    decoration: TextDecoration.underline,
+                                  ),
                         ),
                       ],
                     ),
@@ -321,8 +320,7 @@ class _PasswordEntryPageState extends State<PasswordEntryPage> {
                     onChanged: (cnfPassword) {
                       setState(() {
                         _passwordInInputConfirmationBox = cnfPassword;
-                        if (_passwordInInputBox != null ||
-                            _passwordInInputBox != '') {
+                        if (_passwordInInputBox != '') {
                           _passwordsMatch = _passwordInInputBox ==
                               _passwordInInputConfirmationBox;
                         }

+ 0 - 9
lib/ui/account/password_reentry_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'dart:async';
 
 import 'package:flutter/material.dart';
@@ -8,7 +6,6 @@ import 'package:photos/core/configuration.dart';
 import 'package:photos/core/errors.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/events/subscription_purchased_event.dart';
-import 'package:photos/models/key_attributes.dart';
 import 'package:photos/ui/account/recovery_page.dart';
 import 'package:photos/ui/common/dialogs.dart';
 import 'package:photos/ui/common/dynamic_fab.dart';
@@ -284,10 +281,4 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
       ],
     );
   }
-
-  void validatePreVerificationState(KeyAttributes keyAttributes) {
-    if (keyAttributes == null) {
-      throw Exception("Key Attributes can not be null");
-    }
-  }
 }

+ 0 - 1
lib/ui/actions/collection/collection_file_actions.dart

@@ -1,5 +1,4 @@
 import 'package:flutter/cupertino.dart';
-import 'package:flutter/widgets.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/models/collection.dart';
 import 'package:photos/models/file.dart';

+ 2 - 2
lib/ui/backup_folder_selection_page.dart

@@ -358,9 +358,9 @@ class _BackupFolderSelectionPageState extends State<BackupFolderSelectionPage> {
                       const Padding(padding: EdgeInsets.only(top: 2)),
                       Text(
                         (kDebugMode ? 'inApp: $importedCount : device ' : '') +
-                            (deviceCollection.count ?? 0).toString() +
+                            (deviceCollection.count).toString() +
                             " item" +
-                            ((deviceCollection.count ?? 0) == 1 ? "" : "s"),
+                            ((deviceCollection.count) == 1 ? "" : "s"),
                         textAlign: TextAlign.left,
                         style: TextStyle(
                           fontSize: 12,

+ 0 - 1
lib/ui/components/bottom_action_bar/bottom_action_bar_widget.dart

@@ -107,7 +107,6 @@ class BottomActionBarWidget extends StatelessWidget {
       ...?iconButtons,
       ExpansionIconWidget(expandableController: _expandableController)
     ];
-    iconButtonsWithExpansionIcon.removeWhere((element) => element == null);
     return iconButtonsWithExpansionIcon;
   }
 

+ 0 - 1
lib/ui/components/keyboard/keyboard_top_button.dart

@@ -1,5 +1,4 @@
 import 'package:flutter/cupertino.dart';
-import 'package:flutter/material.dart';
 import 'package:photos/theme/ente_theme.dart';
 
 class KeyboardTopButton extends StatelessWidget {

+ 3 - 4
lib/ui/create_collection_page.dart

@@ -292,7 +292,6 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
       case CollectionActionType.restoreFiles:
         return _restoreFilesToCollection(collectionID);
     }
-    throw AssertionError("unexpected actionType ${widget.actionType}");
   }
 
   Future<bool> _moveFilesToCollection(int toCollectionID) async {
@@ -307,7 +306,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
       await CollectionsService.instance.move(
         toCollectionID,
         fromCollectionID,
-        widget.selectedFiles!.files?.toList() ?? <File>[],
+        widget.selectedFiles!.files.toList(),
       );
       await dialog.hide();
       RemoteSyncService.instance.sync(silently: true);
@@ -330,8 +329,8 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
     final dialog = createProgressDialog(context, "Restoring files...");
     await dialog.show();
     try {
-      await CollectionsService.instance.restore(
-          toCollectionID, widget.selectedFiles!.files?.toList() ?? <File>[]);
+      await CollectionsService.instance
+          .restore(toCollectionID, widget.selectedFiles!.files.toList());
       RemoteSyncService.instance.sync(silently: true);
       widget.selectedFiles?.clearAll();
       await dialog.hide();

+ 1 - 5
lib/ui/extents_page_view.dart

@@ -1,5 +1,3 @@
-
-
 import 'package:flutter/gestures.dart';
 import 'package:flutter/rendering.dart';
 import 'package:flutter/widgets.dart' hide PageView;
@@ -211,8 +209,7 @@ class ExtentsPageView extends StatefulWidget {
     required this.childrenDelegate,
     this.dragStartBehavior = DragStartBehavior.start,
     this.openDrawer,
-  })  : assert(childrenDelegate != null),
-        extents = 0,
+  })  : extents = 0,
         controller = controller ?? _defaultPageController,
         super(key: key);
 
@@ -317,7 +314,6 @@ class _PageViewState extends State<ExtentsPageView> {
       case Axis.vertical:
         return widget.reverse ? AxisDirection.up : AxisDirection.down;
     }
-    return null;
   }
 
   @override

+ 0 - 1
lib/ui/home/home_bottom_nav_bar.dart

@@ -2,7 +2,6 @@ import 'dart:async';
 import 'dart:ui';
 
 import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/ente_theme_data.dart';
 import 'package:photos/events/tab_changed_event.dart';

+ 1 - 3
lib/ui/home/status_bar_widget.dart

@@ -1,5 +1,3 @@
-
-
 import 'dart:async';
 
 import 'package:flutter/material.dart';
@@ -231,7 +229,7 @@ class RefreshIndicatorWidget extends StatelessWidget {
       return event!.reason;
     }
     if (event!.status == SyncStatus.error) {
-      return event!.reason ?? "Upload failed";
+      return event!.reason;
     }
     if (event!.status == SyncStatus.completedBackup) {
       if (event!.wasStopped) {

+ 0 - 1
lib/ui/notification/update/change_log_page.dart

@@ -1,4 +1,3 @@
-import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:photos/services/update_service.dart';
 import 'package:photos/theme/ente_theme.dart';

+ 4 - 8
lib/ui/payment/payment_web_page.dart

@@ -224,14 +224,10 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
         paymentProvider: stripe,
       );
       await _dialog.hide();
-      if (response != null) {
-        final content = widget.actionType == 'buy'
-            ? 'Your purchase was successful'
-            : 'Your subscription was updated successfully';
-        await _showExitPageDialog(title: 'Thank you', content: content);
-      } else {
-        throw Exception("verifySubscription api failed");
-      }
+      final content = widget.actionType == 'buy'
+          ? 'Your purchase was successful'
+          : 'Your subscription was updated successfully';
+      await _showExitPageDialog(title: 'Thank you', content: content);
     } catch (error) {
       _logger.severe(error);
       await _dialog.hide();

+ 4 - 6
lib/ui/payment/stripe_subscription_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'dart:async';
 
 import 'package:flutter/material.dart';
@@ -79,7 +77,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
     final billingPlans = await _billingService.getBillingPlans();
     _freePlan = billingPlans.freePlan;
     _plans = billingPlans.plans.where((plan) {
-      if (plan.stripeID == null || plan.stripeID.isEmpty) {
+      if (plan.stripeID.isEmpty) {
         return false;
       }
       final isYearlyPlan = plan.period == 'year';
@@ -393,11 +391,11 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
     bool foundActivePlan = false;
     for (final plan in _plans) {
       final productID = plan.stripeID;
-      if (productID == null || productID.isEmpty) {
+      if (productID.isEmpty) {
         continue;
       }
-      final isActive =
-          _hasActiveSubscription && _currentSubscription!.productID == productID;
+      final isActive = _hasActiveSubscription &&
+          _currentSubscription!.productID == productID;
       if (isActive) {
         foundActivePlan = true;
       }

+ 6 - 8
lib/ui/payment/subscription_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'dart:async';
 import 'dart:io';
 
@@ -166,7 +164,7 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
             : Platform.isAndroid
                 ? plan.androidID
                 : plan.iosID;
-        return productID != null && productID.isNotEmpty;
+        return productID.isNotEmpty;
       }).toList();
       _freePlan = billingPlans.freePlan;
       _hasLoadedData = true;
@@ -320,11 +318,11 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
     bool foundActivePlan = false;
     for (final plan in _plans) {
       final productID = plan.stripeID;
-      if (productID == null || productID.isEmpty) {
+      if (productID.isEmpty) {
         continue;
       }
-      final isActive =
-          _hasActiveSubscription && _currentSubscription!.productID == productID;
+      final isActive = _hasActiveSubscription &&
+          _currentSubscription!.productID == productID;
       if (isActive) {
         foundActivePlan = true;
       }
@@ -375,8 +373,8 @@ class _SubscriptionPageState extends State<SubscriptionPage> {
     }
     for (final plan in _plans) {
       final productID = Platform.isAndroid ? plan.androidID : plan.iosID;
-      final isActive =
-          _hasActiveSubscription && _currentSubscription!.productID == productID;
+      final isActive = _hasActiveSubscription &&
+          _currentSubscription!.productID == productID;
       if (isActive) {
         foundActivePlan = true;
       }

+ 0 - 2
lib/ui/settings/settings_title_bar_widget.dart

@@ -1,6 +1,5 @@
 import 'package:flutter/material.dart';
 import 'package:intl/intl.dart';
-import 'package:logging/logging.dart';
 import 'package:photos/models/user_details.dart';
 import 'package:photos/states/user_details_state.dart';
 import 'package:photos/theme/ente_theme.dart';
@@ -11,7 +10,6 @@ class SettingsTitleBarWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    final logger = Logger((SettingsTitleBarWidget).toString());
     final inheritedDetails = InheritedUserDetails.of(context);
     final userDetails = inheritedDetails?.userDetails;
     bool isCached = false;

+ 0 - 27
lib/ui/sharing/manage_links_widget.dart

@@ -499,33 +499,6 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
     }
   }
 
-  Text _getLinkExpiryTimeWidget() {
-    final int validTill =
-        widget.collection!.publicURLs?.firstOrNull?.validTill ?? 0;
-    if (validTill == 0) {
-      return const Text(
-        'Never',
-        style: TextStyle(
-          color: Colors.grey,
-        ),
-      );
-    }
-    if (validTill < DateTime.now().microsecondsSinceEpoch) {
-      return Text(
-        'Expired',
-        style: TextStyle(
-          color: Colors.orange[300],
-        ),
-      );
-    }
-    return Text(
-      getFormattedTime(DateTime.fromMicrosecondsSinceEpoch(validTill)),
-      style: const TextStyle(
-        color: Colors.grey,
-      ),
-    );
-  }
-
   Future<void> _showDeviceLimitPicker() async {
     final List<Text> options = [];
     for (int i = 50; i > 0; i--) {

+ 0 - 1
lib/ui/sharing/user_avator_widget.dart

@@ -22,7 +22,6 @@ class UserAvatarWidget extends StatelessWidget {
 
   @override
   Widget build(BuildContext context) {
-    final enteTextTheme = getEnteTextTheme(context);
     final colorScheme = getEnteColorScheme(context);
     final displayChar = (user.name == null || user.name!.isEmpty)
         ? ((user.email.isEmpty) ? " " : user.email.substring(0, 1))

+ 9 - 7
lib/ui/tools/debug/app_storage_viewer.dart

@@ -1,6 +1,5 @@
 import 'dart:io';
 
-import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 import 'package:path_provider/path_provider.dart';
@@ -78,13 +77,16 @@ class _AppStorageViewerState extends State<AppStorageViewer> {
         allowCacheClear: true,
       ),
     ]);
-    if (internalUser) {
-      paths.addAll([
-        PathStorageItem.name(appDocumentsDirectory.path, "App Documents Dir"),
-        PathStorageItem.name(appSupportDirectory.path, "App Support Dir"),
-        PathStorageItem.name(appTemporaryDirectory.path, "App Temp Dir"),
-      ]);
+    // if (internalUser) {
+    paths.addAll([
+      PathStorageItem.name(appDocumentsDirectory.path, "App Documents Dir"),
+      PathStorageItem.name(appSupportDirectory.path, "App Support Dir"),
+      PathStorageItem.name(appTemporaryDirectory.path, "App Temp Dir"),
+    ]);
+    if (!Platform.isAndroid) {
+      paths.add(PathStorageItem.name(iOSOnlyTempDirectory, "/tmp directory"));
     }
+    // }
     if (mounted) {
       setState(() => {});
     }

+ 5 - 5
lib/ui/tools/deduplicate_page.dart

@@ -1,5 +1,3 @@
-
-
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:photos/core/constants.dart';
@@ -138,7 +136,8 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
       } else if (sortKey == SortKey.count) {
         return second.files.length - first.files.length;
       } else {
-        return second.files.first.creationTime! - first.files.first.creationTime!;
+        return second.files.first.creationTime! -
+            first.files.first.creationTime!;
       }
     });
   }
@@ -273,7 +272,7 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
       children: [
         Container(),
         PopupMenuButton(
-          initialValue: sortKey?.index ?? 0,
+          initialValue: sortKey.index,
           child: Padding(
             padding: const EdgeInsets.fromLTRB(24, 6, 24, 6),
             child: Row(
@@ -473,7 +472,8 @@ class _DeduplicatePageState extends State<DeduplicatePage> {
               CollectionsService.instance
                   .getCollectionByID(file.collectionID!)!
                   .name!,
-              style: Theme.of(context).textTheme.caption!.copyWith(fontSize: 12),
+              style:
+                  Theme.of(context).textTheme.caption!.copyWith(fontSize: 12),
               overflow: TextOverflow.ellipsis,
             ),
           ),

+ 3 - 1
lib/ui/tools/editor/image_editor_page.dart

@@ -346,7 +346,9 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
       final AssetEntity? newAsset =
           await (PhotoManager.editor.saveImage(result, title: fileName));
       final newFile = await ente.File.fromAsset(
-          widget.originalFile.deviceFolder!, newAsset!);
+        widget.originalFile.deviceFolder!,
+        newAsset!,
+      );
       newFile.creationTime = widget.originalFile.creationTime;
       newFile.collectionID = widget.originalFile.collectionID;
       newFile.location = widget.originalFile.location;

+ 0 - 1
lib/ui/viewer/actions/file_selection_actions_widget.dart

@@ -1,5 +1,4 @@
 import 'package:fast_base58/fast_base58.dart';
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:page_transition/page_transition.dart';

+ 0 - 1
lib/ui/viewer/actions/file_selection_overlay_bar.dart

@@ -1,4 +1,3 @@
-import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:page_transition/page_transition.dart';
 import 'package:photos/models/collection.dart';

+ 3 - 7
lib/ui/viewer/file/file_info_widget.dart

@@ -1,5 +1,3 @@
-import 'dart:ui';
-
 import "package:exif/exif.dart";
 import "package:flutter/cupertino.dart";
 import "package:flutter/material.dart";
@@ -76,8 +74,8 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
     final bool isFileOwner =
         file.ownerID == null || file.ownerID == _currentUserID;
     late Future<Set<int>> allCollectionIDsOfFile;
-    ; //Typing this as Future<Set<T>> as it would be easier to implement showing multiple device folders for a file in the future
-    Future<Set<String>> allDeviceFoldersOfFile =
+    //Typing this as Future<Set<T>> as it would be easier to implement showing multiple device folders for a file in the future
+    final Future<Set<String>> allDeviceFoldersOfFile =
         Future.sync(() => {file.deviceFolder ?? ''});
     if (fileIsBackedup) {
       allCollectionIDsOfFile = FilesDB.instance.getAllCollectionIDsOfFile(
@@ -326,9 +324,7 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
     } else {
       final fileOwner = CollectionsService.instance
           .getFileOwner(file.ownerID!, file.collectionID);
-      if (fileOwner != null) {
-        addedBy = fileOwner.email;
-      }
+      addedBy = fileOwner.email;
     }
     if (addedBy == null || addedBy.isEmpty) {
       return const SizedBox.shrink();

+ 1 - 1
lib/ui/viewer/file/thumbnail_widget.dart

@@ -226,7 +226,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
         return;
       }
 
-      if (thumbData != null && mounted) {
+      if (mounted) {
         final imageProvider = Image.memory(thumbData).image;
         _cacheAndRender(imageProvider);
       }

+ 6 - 12
lib/ui/viewer/file/video_controls.dart

@@ -1,5 +1,3 @@
-
-
 import 'dart:async';
 
 import 'package:chewie/chewie.dart';
@@ -63,8 +61,7 @@ class _VideoControlsState extends State<VideoControls> {
               Column(
                 children: [
                   _latestValue != null &&
-                              !_latestValue!.isPlaying &&
-                              _latestValue!.duration == null ||
+                          !_latestValue!.isPlaying &&
                           _latestValue!.isBuffering
                       ? const Center(
                           child: CircularProgressIndicator(),
@@ -181,9 +178,8 @@ class _VideoControlsState extends State<VideoControls> {
   }
 
   Widget _buildCurrentPosition(Color? iconColor) {
-    final position = _latestValue != null && _latestValue!.position != null
-        ? _latestValue!.position
-        : Duration.zero;
+    final position =
+        _latestValue != null ? _latestValue!.position : Duration.zero;
 
     return Container(
       margin: const EdgeInsets.only(left: 20.0, right: 16.0),
@@ -198,9 +194,8 @@ class _VideoControlsState extends State<VideoControls> {
   }
 
   Widget _buildTotalDuration(Color? iconColor) {
-    final duration = _latestValue != null && _latestValue!.duration != null
-        ? _latestValue!.duration
-        : Duration.zero;
+    final duration =
+        _latestValue != null ? _latestValue!.duration : Duration.zero;
 
     return Padding(
       padding: const EdgeInsets.only(right: 20.0),
@@ -229,8 +224,7 @@ class _VideoControlsState extends State<VideoControls> {
 
     _updateState();
 
-    if ((controller.value != null && controller.value.isPlaying) ||
-        chewieController!.autoPlay) {
+    if ((controller.value.isPlaying) || chewieController!.autoPlay) {
       _startHideTimer();
     }
 

+ 5 - 3
lib/ui/viewer/file/video_widget.dart

@@ -124,8 +124,10 @@ class _VideoWidgetState extends State<VideoWidget> {
     super.dispose();
   }
 
-  VideoPlayerController _setVideoPlayerController(
-      {String? url, io.File? file}) {
+  VideoPlayerController _setVideoPlayerController({
+    String? url,
+    io.File? file,
+  }) {
     VideoPlayerController videoPlayerController;
     if (url != null) {
       videoPlayerController = VideoPlayerController.network(url);
@@ -230,7 +232,7 @@ class _VideoWidgetState extends State<VideoWidget> {
         if (widget.playbackCallback != null) {
           widget.playbackCallback!(_isPlaying);
         }
-        unawaited(_keepScreenAliveOnPlaying(_isPlaying!));
+        unawaited(_keepScreenAliveOnPlaying(_isPlaying));
       }
     });
     _chewieController = ChewieController(

+ 74 - 79
lib/utils/diff_fetcher.dart

@@ -31,93 +31,88 @@ class DiffFetcher {
       );
       final files = <File>[];
       int latestUpdatedAtTime = 0;
-      if (response != null) {
-        final diff = response.data["diff"] as List;
-        final bool hasMore = response.data["hasMore"] as bool;
-        final startTime = DateTime.now();
-        final existingFiles =
-            await FilesDB.instance.getUploadedFileIDs(collectionID);
-        final deletedFiles = <File>[];
-        for (final item in diff) {
-          final file = File();
-          file.uploadedFileID = item["id"];
-          file.collectionID = item["collectionID"];
-          file.updationTime = item["updationTime"];
-          latestUpdatedAtTime = max(latestUpdatedAtTime, file.updationTime!);
-          if (item["isDeleted"]) {
-            if (existingFiles.contains(file.uploadedFileID)) {
-              deletedFiles.add(file);
-            }
-            continue;
-          }
+      final diff = response.data["diff"] as List;
+      final bool hasMore = response.data["hasMore"] as bool;
+      final startTime = DateTime.now();
+      final existingFiles =
+          await FilesDB.instance.getUploadedFileIDs(collectionID);
+      final deletedFiles = <File>[];
+      for (final item in diff) {
+        final file = File();
+        file.uploadedFileID = item["id"];
+        file.collectionID = item["collectionID"];
+        file.updationTime = item["updationTime"];
+        latestUpdatedAtTime = max(latestUpdatedAtTime, file.updationTime!);
+        if (item["isDeleted"]) {
           if (existingFiles.contains(file.uploadedFileID)) {
-            final existingFile = await FilesDB.instance
-                .getUploadedFile(file.uploadedFileID!, file.collectionID!);
-            if (existingFile != null) {
-              file.generatedID = existingFile.generatedID;
-            }
+            deletedFiles.add(file);
           }
-          file.ownerID = item["ownerID"];
-          file.encryptedKey = item["encryptedKey"];
-          file.keyDecryptionNonce = item["keyDecryptionNonce"];
-          file.fileDecryptionHeader = item["file"]["decryptionHeader"];
-          file.thumbnailDecryptionHeader =
-              item["thumbnail"]["decryptionHeader"];
-          file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
-          if (item["info"] != null) {
-            file.fileSize = item["info"]["fileSize"];
+          continue;
+        }
+        if (existingFiles.contains(file.uploadedFileID)) {
+          final existingFile = await FilesDB.instance
+              .getUploadedFile(file.uploadedFileID!, file.collectionID!);
+          if (existingFile != null) {
+            file.generatedID = existingFile.generatedID;
           }
+        }
+        file.ownerID = item["ownerID"];
+        file.encryptedKey = item["encryptedKey"];
+        file.keyDecryptionNonce = item["keyDecryptionNonce"];
+        file.fileDecryptionHeader = item["file"]["decryptionHeader"];
+        file.thumbnailDecryptionHeader = item["thumbnail"]["decryptionHeader"];
+        file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
+        if (item["info"] != null) {
+          file.fileSize = item["info"]["fileSize"];
+        }
 
-          final fileDecryptionKey = decryptFileKey(file);
-          final encodedMetadata = await CryptoUtil.decryptChaCha(
-            Sodium.base642bin(item["metadata"]["encryptedData"]),
+        final fileDecryptionKey = decryptFileKey(file);
+        final encodedMetadata = await CryptoUtil.decryptChaCha(
+          Sodium.base642bin(item["metadata"]["encryptedData"]),
+          fileDecryptionKey,
+          Sodium.base642bin(file.metadataDecryptionHeader!),
+        );
+        final Map<String, dynamic> metadata =
+            jsonDecode(utf8.decode(encodedMetadata));
+        file.applyMetadata(metadata);
+        if (item['magicMetadata'] != null) {
+          final utfEncodedMmd = await CryptoUtil.decryptChaCha(
+            Sodium.base642bin(item['magicMetadata']['data']),
             fileDecryptionKey,
-            Sodium.base642bin(file.metadataDecryptionHeader!),
+            Sodium.base642bin(item['magicMetadata']['header']),
           );
-          final Map<String, dynamic> metadata =
-              jsonDecode(utf8.decode(encodedMetadata));
-          file.applyMetadata(metadata);
-          if (item['magicMetadata'] != null) {
-            final utfEncodedMmd = await CryptoUtil.decryptChaCha(
-              Sodium.base642bin(item['magicMetadata']['data']),
-              fileDecryptionKey,
-              Sodium.base642bin(item['magicMetadata']['header']),
-            );
-            file.mMdEncodedJson = utf8.decode(utfEncodedMmd);
-            file.mMdVersion = item['magicMetadata']['version'];
-            file.magicMetadata =
-                MagicMetadata.fromEncodedJson(file.mMdEncodedJson!);
-          }
-          if (item['pubMagicMetadata'] != null) {
-            final utfEncodedMmd = await CryptoUtil.decryptChaCha(
-              Sodium.base642bin(item['pubMagicMetadata']['data']),
-              fileDecryptionKey,
-              Sodium.base642bin(item['pubMagicMetadata']['header']),
-            );
-            file.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
-            file.pubMmdVersion = item['pubMagicMetadata']['version'];
-            file.pubMagicMetadata =
-                PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!);
-          }
-          files.add(file);
+          file.mMdEncodedJson = utf8.decode(utfEncodedMmd);
+          file.mMdVersion = item['magicMetadata']['version'];
+          file.magicMetadata =
+              MagicMetadata.fromEncodedJson(file.mMdEncodedJson!);
         }
-
-        final endTime = DateTime.now();
-        _logger.info(
-          "time for parsing " +
-              files.length.toString() +
-              " items within collection " +
-              collectionID.toString() +
-              ": " +
-              Duration(
-                microseconds: (endTime.microsecondsSinceEpoch -
-                    startTime.microsecondsSinceEpoch),
-              ).inMilliseconds.toString(),
-        );
-        return Diff(files, deletedFiles, hasMore, latestUpdatedAtTime);
-      } else {
-        return Diff(<File>[], <File>[], false, 0);
+        if (item['pubMagicMetadata'] != null) {
+          final utfEncodedMmd = await CryptoUtil.decryptChaCha(
+            Sodium.base642bin(item['pubMagicMetadata']['data']),
+            fileDecryptionKey,
+            Sodium.base642bin(item['pubMagicMetadata']['header']),
+          );
+          file.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
+          file.pubMmdVersion = item['pubMagicMetadata']['version'];
+          file.pubMagicMetadata =
+              PubMagicMetadata.fromEncodedJson(file.pubMmdEncodedJson!);
+        }
+        files.add(file);
       }
+
+      final endTime = DateTime.now();
+      _logger.info(
+        "time for parsing " +
+            files.length.toString() +
+            " items within collection " +
+            collectionID.toString() +
+            ": " +
+            Duration(
+              microseconds: (endTime.microsecondsSinceEpoch -
+                  startTime.microsecondsSinceEpoch),
+            ).inMilliseconds.toString(),
+      );
+      return Diff(files, deletedFiles, hasMore, latestUpdatedAtTime);
     } catch (e, s) {
       _logger.severe(e, s);
       rethrow;

+ 12 - 14
lib/utils/email_util.dart

@@ -191,7 +191,7 @@ Future<void> sendEmail(
 }) async {
   try {
     final String clientDebugInfo = await _clientInfo();
-    final EmailContent email = EmailContent(
+    final EmailContent emailContent = EmailContent(
       to: [
         to,
       ],
@@ -204,7 +204,7 @@ Future<void> sendEmail(
       final Uri params = Uri(
         scheme: 'mailto',
         path: to,
-        query: 'subject=${email.subject}&body=${email.body}',
+        query: 'subject=${emailContent.subject}&body=${emailContent.body}',
       );
       if (await canLaunchUrl(params)) {
         await launchUrl(params);
@@ -215,8 +215,8 @@ Future<void> sendEmail(
     } else {
       final OpenMailAppResult result =
           await OpenMailApp.composeNewEmailInMailApp(
-        nativePickerTitle: 'Select email app',
-        emailContent: email,
+        nativePickerTitle: 'Select emailContent app',
+        emailContent: emailContent,
       );
       if (!result.didOpen && !result.canOpen) {
         _showNoMailAppsDialog(context, to);
@@ -230,15 +230,13 @@ Future<void> sendEmail(
                 CupertinoActionSheetAction(
                   child: Text(app.name),
                   onPressed: () {
-                    final content = email;
-                    if (content != null) {
-                      OpenMailApp.composeNewEmailInSpecificMailApp(
-                        mailApp: app,
-                        emailContent: content,
-                      );
-                    } else {
-                      OpenMailApp.openSpecificMailApp(app);
-                    }
+                    final content = emailContent;
+
+                    OpenMailApp.composeNewEmailInSpecificMailApp(
+                      mailApp: app,
+                      emailContent: content,
+                    );
+
                     Navigator.of(context, rootNavigator: true).pop();
                   },
                 ),
@@ -254,7 +252,7 @@ Future<void> sendEmail(
       }
     }
   } catch (e) {
-    _logger.severe("Failed to send email to $to", e);
+    _logger.severe("Failed to send emailContent to $to", e);
     _showNoMailAppsDialog(context, to);
   }
 }

+ 74 - 77
lib/utils/trash_diff_fetcher.dart

@@ -25,88 +25,85 @@ class TrashDiffFetcher {
       final trashedFiles = <TrashFile>[];
       final deletedUploadIDs = <int>[];
       final restoredFiles = <TrashFile>[];
-      if (response != null) {
-        final diff = response.data["diff"] as List;
-        final bool hasMore = response.data["hasMore"] as bool;
-        final startTime = DateTime.now();
-        for (final item in diff) {
-          final trash = TrashFile();
-          trash.createdAt = item['createdAt'];
-          trash.updateAt = item['updatedAt'];
-          latestUpdatedAtTime = max(latestUpdatedAtTime, trash.updateAt);
-          if (item["isDeleted"]) {
-            deletedUploadIDs.add(item["file"]["id"]);
-            continue;
-          }
 
-          trash.deleteBy = item['deleteBy'];
-          trash.uploadedFileID = item["file"]["id"];
-          trash.collectionID = item["file"]["collectionID"];
-          trash.updationTime = item["file"]["updationTime"];
-          trash.ownerID = item["file"]["ownerID"];
-          trash.encryptedKey = item["file"]["encryptedKey"];
-          trash.keyDecryptionNonce = item["file"]["keyDecryptionNonce"];
-          trash.fileDecryptionHeader = item["file"]["file"]["decryptionHeader"];
-          trash.thumbnailDecryptionHeader =
-              item["file"]["thumbnail"]["decryptionHeader"];
-          trash.metadataDecryptionHeader =
-              item["file"]["metadata"]["decryptionHeader"];
-          final fileDecryptionKey = decryptFileKey(trash);
-          final encodedMetadata = await CryptoUtil.decryptChaCha(
-            Sodium.base642bin(item["file"]["metadata"]["encryptedData"]),
-            fileDecryptionKey,
-            Sodium.base642bin(trash.metadataDecryptionHeader!),
-          );
-          final Map<String, dynamic> metadata =
-              jsonDecode(utf8.decode(encodedMetadata));
-          trash.applyMetadata(metadata);
-          if (item["file"]['magicMetadata'] != null) {
-            final utfEncodedMmd = await CryptoUtil.decryptChaCha(
-              Sodium.base642bin(item["file"]['magicMetadata']['data']),
-              fileDecryptionKey,
-              Sodium.base642bin(item["file"]['magicMetadata']['header']),
-            );
-            trash.mMdEncodedJson = utf8.decode(utfEncodedMmd);
-            trash.mMdVersion = item["file"]['magicMetadata']['version'];
-          }
-          if (item["file"]['pubMagicMetadata'] != null) {
-            final utfEncodedMmd = await CryptoUtil.decryptChaCha(
-              Sodium.base642bin(item["file"]['pubMagicMetadata']['data']),
-              fileDecryptionKey,
-              Sodium.base642bin(item["file"]['pubMagicMetadata']['header']),
-            );
-            trash.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
-            trash.pubMmdVersion = item["file"]['pubMagicMetadata']['version'];
-            trash.pubMagicMetadata =
-                PubMagicMetadata.fromEncodedJson(trash.pubMmdEncodedJson!);
-          }
-          if (item['isRestored']) {
-            restoredFiles.add(trash);
-            continue;
-          }
-          trashedFiles.add(trash);
+      final diff = response.data["diff"] as List;
+      final bool hasMore = response.data["hasMore"] as bool;
+      final startTime = DateTime.now();
+      for (final item in diff) {
+        final trash = TrashFile();
+        trash.createdAt = item['createdAt'];
+        trash.updateAt = item['updatedAt'];
+        latestUpdatedAtTime = max(latestUpdatedAtTime, trash.updateAt);
+        if (item["isDeleted"]) {
+          deletedUploadIDs.add(item["file"]["id"]);
+          continue;
         }
 
-        final endTime = DateTime.now();
-        _logger.info(
-          "time for parsing " +
-              diff.length.toString() +
-              ": " +
-              Duration(
-                microseconds: (endTime.microsecondsSinceEpoch -
-                    startTime.microsecondsSinceEpoch),
-              ).inMilliseconds.toString(),
+        trash.deleteBy = item['deleteBy'];
+        trash.uploadedFileID = item["file"]["id"];
+        trash.collectionID = item["file"]["collectionID"];
+        trash.updationTime = item["file"]["updationTime"];
+        trash.ownerID = item["file"]["ownerID"];
+        trash.encryptedKey = item["file"]["encryptedKey"];
+        trash.keyDecryptionNonce = item["file"]["keyDecryptionNonce"];
+        trash.fileDecryptionHeader = item["file"]["file"]["decryptionHeader"];
+        trash.thumbnailDecryptionHeader =
+            item["file"]["thumbnail"]["decryptionHeader"];
+        trash.metadataDecryptionHeader =
+            item["file"]["metadata"]["decryptionHeader"];
+        final fileDecryptionKey = decryptFileKey(trash);
+        final encodedMetadata = await CryptoUtil.decryptChaCha(
+          Sodium.base642bin(item["file"]["metadata"]["encryptedData"]),
+          fileDecryptionKey,
+          Sodium.base642bin(trash.metadataDecryptionHeader!),
         );
-        return Diff(
-          trashedFiles,
-          restoredFiles,
-          deletedUploadIDs,
-          hasMore,
-          latestUpdatedAtTime,
-        );
-      } else {
-        return Diff(<TrashFile>[], <TrashFile>[], <int>[], false, 0);
+        final Map<String, dynamic> metadata =
+            jsonDecode(utf8.decode(encodedMetadata));
+        trash.applyMetadata(metadata);
+        if (item["file"]['magicMetadata'] != null) {
+          final utfEncodedMmd = await CryptoUtil.decryptChaCha(
+            Sodium.base642bin(item["file"]['magicMetadata']['data']),
+            fileDecryptionKey,
+            Sodium.base642bin(item["file"]['magicMetadata']['header']),
+          );
+          trash.mMdEncodedJson = utf8.decode(utfEncodedMmd);
+          trash.mMdVersion = item["file"]['magicMetadata']['version'];
+        }
+        if (item["file"]['pubMagicMetadata'] != null) {
+          final utfEncodedMmd = await CryptoUtil.decryptChaCha(
+            Sodium.base642bin(item["file"]['pubMagicMetadata']['data']),
+            fileDecryptionKey,
+            Sodium.base642bin(item["file"]['pubMagicMetadata']['header']),
+          );
+          trash.pubMmdEncodedJson = utf8.decode(utfEncodedMmd);
+          trash.pubMmdVersion = item["file"]['pubMagicMetadata']['version'];
+          trash.pubMagicMetadata =
+              PubMagicMetadata.fromEncodedJson(trash.pubMmdEncodedJson!);
+        }
+        if (item['isRestored']) {
+          restoredFiles.add(trash);
+          continue;
+        }
+        trashedFiles.add(trash);
       }
+
+      final endTime = DateTime.now();
+      _logger.info(
+        "time for parsing " +
+            diff.length.toString() +
+            ": " +
+            Duration(
+              microseconds: (endTime.microsecondsSinceEpoch -
+                  startTime.microsecondsSinceEpoch),
+            ).inMilliseconds.toString(),
+      );
+      return Diff(
+        trashedFiles,
+        restoredFiles,
+        deletedUploadIDs,
+        hasMore,
+        latestUpdatedAtTime,
+      );
     } catch (e, s) {
       _logger.severe(e, s);
       rethrow;