瀏覽代碼

Merge branch 'master' into reupload_hash_check

Neeraj Gupta 2 年之前
父節點
當前提交
792dd67ade
共有 87 個文件被更改,包括 253 次插入250 次删除
  1. 1 0
      analysis_options.yaml
  2. 3 3
      lib/core/cache/lru_map.dart
  3. 1 1
      lib/core/configuration.dart
  4. 10 10
      lib/core/error-reporting/super_logging.dart
  5. 5 5
      lib/db/collections_db.dart
  6. 3 2
      lib/db/file_updation_db.dart
  7. 11 11
      lib/db/files_db.dart
  8. 2 2
      lib/db/ignored_files_db.dart
  9. 3 3
      lib/db/memories_db.dart
  10. 3 3
      lib/db/public_keys_db.dart
  11. 4 4
      lib/db/trash_db.dart
  12. 2 2
      lib/db/upload_locks_db.dart
  13. 6 6
      lib/main.dart
  14. 1 1
      lib/models/collection.dart
  15. 1 1
      lib/models/file.dart
  16. 3 3
      lib/models/selected_files.dart
  17. 1 1
      lib/models/subscription.dart
  18. 2 2
      lib/services/collections_service.dart
  19. 1 1
      lib/services/deduplication_service.dart
  20. 1 1
      lib/services/favorites_service.dart
  21. 1 1
      lib/services/feature_flag_service.dart
  22. 4 4
      lib/services/file_magic_service.dart
  23. 3 3
      lib/services/local_sync_service.dart
  24. 4 4
      lib/services/remote_sync_service.dart
  25. 2 2
      lib/services/user_service.dart
  26. 2 2
      lib/ui/account/delete_account_page.dart
  27. 1 1
      lib/ui/account/password_reentry_page.dart
  28. 1 1
      lib/ui/account/recovery_key_page.dart
  29. 2 2
      lib/ui/account/sessions_page.dart
  30. 2 2
      lib/ui/account/two_factor_setup_page.dart
  31. 4 4
      lib/ui/collections/collection_item_widget.dart
  32. 2 2
      lib/ui/collections/remote_collections_grid_view_widget.dart
  33. 1 1
      lib/ui/common/dialogs.dart
  34. 2 2
      lib/ui/create_collection_page.dart
  35. 1 1
      lib/ui/grant_permissions_widget.dart
  36. 3 3
      lib/ui/home_widget.dart
  37. 1 1
      lib/ui/huge_listview/draggable_scrollbar.dart
  38. 1 1
      lib/ui/huge_listview/huge_listview.dart
  39. 2 2
      lib/ui/huge_listview/lazy_loading_gallery.dart
  40. 2 2
      lib/ui/memories_widget.dart
  41. 1 1
      lib/ui/nav_bar.dart
  42. 8 8
      lib/ui/payment/payment_web_page.dart
  43. 6 6
      lib/ui/payment/stripe_subscription_page.dart
  44. 1 1
      lib/ui/payment/subscription_common_widgets.dart
  45. 2 2
      lib/ui/payment/subscription_plan_widget.dart
  46. 3 3
      lib/ui/settings/account_section_widget.dart
  47. 1 1
      lib/ui/settings/app_update_dialog.dart
  48. 1 1
      lib/ui/settings/app_version_widget.dart
  49. 6 6
      lib/ui/settings/backup_section_widget.dart
  50. 1 1
      lib/ui/settings/danger_section_widget.dart
  51. 1 1
      lib/ui/settings/debug_section_widget.dart
  52. 3 3
      lib/ui/settings/security_section_widget.dart
  53. 1 1
      lib/ui/settings/social_section_widget.dart
  54. 7 7
      lib/ui/shared_collections_gallery.dart
  55. 9 9
      lib/ui/sharing/manage_links_widget.dart
  56. 4 4
      lib/ui/sharing/share_collection_widget.dart
  57. 1 1
      lib/ui/status_bar_widget.dart
  58. 5 5
      lib/ui/tools/editor/filtered_image.dart
  59. 8 8
      lib/ui/tools/editor/image_editor_page.dart
  60. 1 0
      lib/ui/viewer/file/custom_app_bar.dart
  61. 1 1
      lib/ui/viewer/file/detail_page.dart
  62. 3 3
      lib/ui/viewer/file/fading_app_bar.dart
  63. 3 3
      lib/ui/viewer/file/fading_bottom_bar.dart
  64. 2 2
      lib/ui/viewer/file/file_info_dialog.dart
  65. 2 2
      lib/ui/viewer/file/thumbnail_widget.dart
  66. 1 1
      lib/ui/viewer/file/video_controls.dart
  67. 1 1
      lib/ui/viewer/file/zoomable_image.dart
  68. 3 3
      lib/ui/viewer/file/zoomable_live_image.dart
  69. 3 3
      lib/ui/viewer/gallery/gallery.dart
  70. 2 2
      lib/ui/viewer/gallery/gallery_app_bar_widget.dart
  71. 3 3
      lib/ui/viewer/gallery/gallery_overlay_widget.dart
  72. 1 1
      lib/ui/viewer/gallery/trash_page.dart
  73. 2 2
      lib/utils/data_util.dart
  74. 6 6
      lib/utils/date_time_util.dart
  75. 2 2
      lib/utils/delete_file_util.dart
  76. 2 2
      lib/utils/dialog_util.dart
  77. 1 1
      lib/utils/diff_fetcher.dart
  78. 6 6
      lib/utils/email_util.dart
  79. 1 1
      lib/utils/file_sync_util.dart
  80. 7 7
      lib/utils/file_uploader.dart
  81. 4 4
      lib/utils/file_uploader_util.dart
  82. 10 10
      lib/utils/file_util.dart
  83. 4 4
      lib/utils/hex.dart
  84. 2 2
      lib/utils/magic_util.dart
  85. 4 4
      lib/utils/share_util.dart
  86. 1 1
      lib/utils/trash_diff_fetcher.dart
  87. 1 1
      lib/utils/validator_util.dart

+ 1 - 0
analysis_options.yaml

@@ -15,6 +15,7 @@ linter:
     - prefer_const_constructors_in_immutables
     - prefer_const_declarations
     - prefer_const_literals_to_create_immutables
+    - prefer_final_locals
     - require_trailing_commas
     - sized_box_for_whitespace
     - use_full_hex_values_for_flutter_colors

+ 3 - 3
lib/core/cache/lru_map.dart

@@ -10,7 +10,7 @@ class LRUMap<K, V> {
   LRUMap(this._maxSize, [this._handler]);
 
   V get(K key) {
-    V value = _map.remove(key);
+    final V value = _map.remove(key);
     if (value != null) {
       _map[key] = value;
     }
@@ -21,8 +21,8 @@ class LRUMap<K, V> {
     _map.remove(key);
     _map[key] = value;
     if (_map.length > _maxSize) {
-      K evictedKey = _map.keys.first;
-      V evictedValue = _map.remove(evictedKey);
+      final K evictedKey = _map.keys.first;
+      final V evictedValue = _map.remove(evictedKey);
       if (_handler != null) {
         _handler(evictedKey, evictedValue);
       }

+ 1 - 1
lib/core/configuration.dart

@@ -112,7 +112,7 @@ class Configuration {
       _logger.warning(e);
     }
     tempDirectory.createSync(recursive: true);
-    var tempDirectoryPath = (await getTemporaryDirectory()).path;
+    final tempDirectoryPath = (await getTemporaryDirectory()).path;
     _thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache";
     io.Directory(_thumbnailCacheDirectory).createSync(recursive: true);
     _sharedTempMediaDirectory = tempDirectoryPath + "/ente-shared-media";

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

@@ -23,7 +23,7 @@ extension SuperString on String {
     var start = 0;
 
     while (true) {
-      var stop = start + chunkSize;
+      final stop = start + chunkSize;
       if (stop > length) break;
       yield substring(start, stop);
       start = stop;
@@ -37,7 +37,7 @@ extension SuperString on String {
 
 extension SuperLogRecord on LogRecord {
   String toPrettyString([String extraLines]) {
-    var header = "[$loggerName] [$level] [$time]";
+    final header = "[$loggerName] [$level] [$time]";
 
     var msg = "$header $message";
 
@@ -236,7 +236,7 @@ class SuperLogging {
       extraLines = null;
     }
 
-    var str = config.prefix + " " + rec.toPrettyString(extraLines);
+    final str = config.prefix + " " + rec.toPrettyString(extraLines);
 
     // write to stdout
     printLog(str);
@@ -316,21 +316,21 @@ class SuperLogging {
 
     // choose [logDir]
     if (dirPath.isEmpty) {
-      var root = await getExternalStorageDirectory();
+      final root = await getExternalStorageDirectory();
       dirPath = '${root.path}/logs';
     }
 
     // create [logDir]
-    var dir = Directory(dirPath);
+    final dir = Directory(dirPath);
     await dir.create(recursive: true);
 
-    var files = <File>[];
-    var dates = <File, DateTime>{};
+    final files = <File>[];
+    final dates = <File, DateTime>{};
 
     // collect all log files with valid names
     await for (final file in dir.list()) {
       try {
-        var date = config.dateFmt.parse(basename(file.path));
+        final date = config.dateFmt.parse(basename(file.path));
         dates[file as File] = date;
         files.add(file);
       } on FormatException {}
@@ -363,7 +363,7 @@ class SuperLogging {
   static String appVersion;
 
   static Future<String> getAppVersion() async {
-    var pkgInfo = await PackageInfo.fromPlatform();
+    final pkgInfo = await PackageInfo.fromPlatform();
     return "${pkgInfo.version}+${pkgInfo.buildNumber}";
   }
 
@@ -372,7 +372,7 @@ class SuperLogging {
     if (!Platform.isAndroid) {
       return false;
     }
-    var pkgName = (await PackageInfo.fromPlatform()).packageName;
+    final pkgName = (await PackageInfo.fromPlatform()).packageName;
     return pkgName.startsWith("io.ente.photos.fdroid");
   }
 }

+ 5 - 5
lib/db/collections_db.dart

@@ -60,8 +60,8 @@ class CollectionsDB {
   }
 
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     return await openDatabaseWithMigration(path, dbConfig);
   }
 
@@ -157,7 +157,7 @@ class CollectionsDB {
 
   Future<List<dynamic>> insert(List<Collection> collections) async {
     final db = await instance.database;
-    var batch = db.batch();
+    final batch = db.batch();
     for (final collection in collections) {
       batch.insert(
         table,
@@ -202,7 +202,7 @@ class CollectionsDB {
   }
 
   Map<String, dynamic> _getRowForCollection(Collection collection) {
-    var row = <String, dynamic>{};
+    final row = <String, dynamic>{};
     row[columnID] = collection.id;
     row[columnOwner] = collection.owner.toJson();
     row[columnEncryptedKey] = collection.encryptedKey;
@@ -230,7 +230,7 @@ class CollectionsDB {
   }
 
   Collection _convertToCollection(Map<String, dynamic> row) {
-    Collection result = Collection(
+    final Collection result = Collection(
       row[columnID],
       User.fromJson(row[columnOwner]),
       row[columnEncryptedKey],

+ 3 - 2
lib/db/file_updation_db.dart

@@ -64,8 +64,9 @@ class FileUpdationDB {
 
   // this opens the database (and creates it if it doesn't exist)
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory =
+        await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     debugPrint("DB path " + path);
     return await openDatabaseWithMigration(path, dbConfig);
   }

+ 11 - 11
lib/db/files_db.dart

@@ -96,8 +96,8 @@ class FilesDB {
 
   // this opens the database (and creates it if it doesn't exist)
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     _logger.info("DB path " + path);
     return await openDatabaseWithMigration(path, dbConfig);
   }
@@ -426,7 +426,7 @@ class FilesDB {
       limit: limit,
     );
     final files = _convertToFiles(results);
-    List<File> deduplicatedFiles =
+    final List<File> deduplicatedFiles =
         _deduplicatedAndFilterIgnoredFiles(files, ignoredCollectionIDs);
     return FileLoadResult(deduplicatedFiles, files.length == limit);
   }
@@ -452,7 +452,7 @@ class FilesDB {
       limit: limit,
     );
     final files = _convertToFiles(results);
-    List<File> deduplicatedFiles =
+    final List<File> deduplicatedFiles =
         _deduplicatedAndFilterIgnoredFiles(files, ignoredCollectionIDs);
     return FileLoadResult(deduplicatedFiles, files.length == limit);
   }
@@ -484,7 +484,7 @@ class FilesDB {
       limit: limit,
     );
     final files = _convertToFiles(results);
-    List<File> deduplicatedFiles =
+    final List<File> deduplicatedFiles =
         _deduplicatedAndFilterIgnoredFiles(files, ignoredCollectionIDs);
     return FileLoadResult(deduplicatedFiles, files.length == limit);
   }
@@ -675,7 +675,7 @@ class FilesDB {
       orderBy: '$columnCreationTime DESC',
       groupBy: columnLocalID,
     );
-    var files = _convertToFiles(results);
+    final files = _convertToFiles(results);
     // future-safe filter just to ensure that the query doesn't end up  returning files
     // which should not be backed up
     files.removeWhere(
@@ -972,7 +972,7 @@ class FilesDB {
 
   Future<int> collectionFileCount(int collectionID) async {
     final db = await instance.database;
-    var count = Sqflite.firstIntValue(
+    final count = Sqflite.firstIntValue(
       await db.rawQuery(
         'SELECT COUNT(*) FROM $table where $columnCollectionID = $collectionID',
       ),
@@ -982,7 +982,7 @@ class FilesDB {
 
   Future<int> fileCountWithVisibility(int visibility, int ownerID) async {
     final db = await instance.database;
-    var count = Sqflite.firstIntValue(
+    final count = Sqflite.firstIntValue(
       await db.rawQuery(
         'SELECT COUNT(*) FROM $table where $columnMMdVisibility = $visibility AND $columnOwnerID = $ownerID',
       ),
@@ -1171,9 +1171,9 @@ class FilesDB {
 
   Future<List<File>> getAllFilesFromDB() async {
     final db = await instance.database;
-    List<Map<String, dynamic>> result = await db.query(table);
-    List<File> files = _convertToFiles(result);
-    List<File> deduplicatedFiles =
+    final List<Map<String, dynamic>> result = await db.query(table);
+    final List<File> files = _convertToFiles(result);
+    final List<File> deduplicatedFiles =
         _deduplicatedAndFilterIgnoredFiles(files, null);
     return deduplicatedFiles;
   }

+ 2 - 2
lib/db/ignored_files_db.dart

@@ -52,8 +52,8 @@ class IgnoredFilesDB {
 
   // this opens the database (and creates it if it doesn't exist)
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     return await openDatabase(
       path,
       version: _databaseVersion,

+ 3 - 3
lib/db/memories_db.dart

@@ -25,8 +25,8 @@ class MemoriesDB {
   }
 
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     return await openDatabase(
       path,
       version: _databaseVersion,
@@ -74,7 +74,7 @@ class MemoriesDB {
   }
 
   Map<String, dynamic> _getRowForSeenMemory(Memory memory, int timestamp) {
-    var row = <String, dynamic>{};
+    final row = <String, dynamic>{};
     row[columnFileID] = memory.file.generatedID;
     row[columnSeenTime] = timestamp;
     return row;

+ 3 - 3
lib/db/public_keys_db.dart

@@ -26,8 +26,8 @@ class PublicKeysDB {
   }
 
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     return await openDatabase(
       path,
       version: _databaseVersion,
@@ -72,7 +72,7 @@ class PublicKeysDB {
   }
 
   Map<String, dynamic> _getRow(PublicKey key) {
-    var row = <String, dynamic>{};
+    final row = <String, dynamic>{};
     row[columnEmail] = key.email;
     row[columnPublicKey] = key.publicKey;
     return row;

+ 4 - 4
lib/db/trash_db.dart

@@ -85,8 +85,8 @@ class TrashDB {
 
   // this opens the database (and creates it if it doesn't exist)
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     _logger.info("DB path " + path);
     return await openDatabase(
       path,
@@ -103,7 +103,7 @@ class TrashDB {
   // getRecentlyTrashedFile returns the file which was trashed recently
   Future<TrashFile> getRecentlyTrashedFile() async {
     final db = await instance.database;
-    var rows = await db.query(
+    final rows = await db.query(
       tableName,
       orderBy: '$columnTrashDeleteBy DESC',
       limit: 1,
@@ -116,7 +116,7 @@ class TrashDB {
 
   Future<int> count() async {
     final db = await instance.database;
-    var count = Sqflite.firstIntValue(
+    final count = Sqflite.firstIntValue(
       await db.rawQuery('SELECT COUNT(*) FROM $tableName'),
     );
     return count;

+ 2 - 2
lib/db/upload_locks_db.dart

@@ -24,8 +24,8 @@ class UploadLocksDB {
   }
 
   Future<Database> _initDatabase() async {
-    Directory documentsDirectory = await getApplicationDocumentsDirectory();
-    String path = join(documentsDirectory.path, _databaseName);
+    final Directory documentsDirectory = await getApplicationDocumentsDirectory();
+    final String path = join(documentsDirectory.path, _databaseName);
     return await openDatabase(
       path,
       version: _databaseVersion,

+ 6 - 6
lib/main.dart

@@ -231,8 +231,8 @@ Future<void> _killBGTask([String taskId]) async {
 }
 
 Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
-  bool isRunningInFG = await _isRunningInForeground(); // hb
-  bool isInForeground = AppLifecycleService.instance.isForeground;
+  final bool isRunningInFG = await _isRunningInForeground(); // hb
+  final bool isInForeground = AppLifecycleService.instance.isForeground;
   if (_isProcessRunning) {
     _logger.info(
       "Background push received when app is alive and runningInFS: $isRunningInFG inForeground: $isInForeground",
@@ -259,18 +259,18 @@ Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
 }
 
 Future<void> _logFGHeartBeatInfo() async {
-  bool isRunningInFG = await _isRunningInForeground();
+  final bool isRunningInFG = await _isRunningInForeground();
   final prefs = await SharedPreferences.getInstance();
   await prefs.reload();
-  var lastFGTaskHeartBeatTime = prefs.getInt(kLastFGTaskHeartBeatTime) ?? 0;
-  String lastRun = lastFGTaskHeartBeatTime == 0
+  final lastFGTaskHeartBeatTime = prefs.getInt(kLastFGTaskHeartBeatTime) ?? 0;
+  final String lastRun = lastFGTaskHeartBeatTime == 0
       ? 'never'
       : DateTime.fromMicrosecondsSinceEpoch(lastFGTaskHeartBeatTime).toString();
   _logger.info('isAlreaduunningFG: $isRunningInFG, last Beat: $lastRun');
 }
 
 void _scheduleSuicide(Duration duration, [String taskID]) {
-  var taskIDVal = taskID ?? 'no taskID';
+  final taskIDVal = taskID ?? 'no taskID';
   _logger.warning("Schedule seppuku taskID: $taskIDVal");
   Future.delayed(duration, () {
     _logger.warning("TLE, committing seppuku for taskID: $taskIDVal");

+ 1 - 1
lib/models/collection.dart

@@ -85,7 +85,7 @@ class Collection {
     String mMdEncodedJson,
     int mMdVersion,
   }) {
-    Collection result = Collection(
+    final Collection result = Collection(
       id ?? this.id,
       owner ?? this.owner,
       encryptedKey ?? this.encryptedKey,

+ 1 - 1
lib/models/file.dart

@@ -60,7 +60,7 @@ class File extends EnteFile {
   File();
 
   static Future<File> fromAsset(String pathName, AssetEntity asset) async {
-    File file = File();
+    final File file = File();
     file.localID = asset.id;
     file.title = asset.title;
     file.deviceFolder = pathName;

+ 3 - 3
lib/models/selected_files.dart

@@ -9,7 +9,7 @@ class SelectedFiles extends ChangeNotifier {
     // To handle the cases, where the file might have changed due to upload
     // or any other update, using file.generatedID to track if this file was already
     // selected or not
-    File alreadySelected = files.firstWhere(
+    final File alreadySelected = files.firstWhere(
       (element) => element.generatedID == file.generatedID,
       orElse: () => null,
     );
@@ -24,7 +24,7 @@ class SelectedFiles extends ChangeNotifier {
   }
 
   bool isFileSelected(File file) {
-    File alreadySelected = files.firstWhere(
+    final File alreadySelected = files.firstWhere(
       (element) => element.generatedID == file.generatedID,
       orElse: () => null,
     );
@@ -32,7 +32,7 @@ class SelectedFiles extends ChangeNotifier {
   }
 
   bool isPartOfLastSection(File file) {
-    File alreadySelected = lastSelections.firstWhere(
+    final File alreadySelected = lastSelections.firstWhere(
       (element) => element.generatedID == file.generatedID,
       orElse: () => null,
     );

+ 1 - 1
lib/models/subscription.dart

@@ -144,7 +144,7 @@ class Attributes {
   }
 
   Map<String, dynamic> toJson() {
-    var map = <String, dynamic>{};
+    final map = <String, dynamic>{};
     map["isCancelled"] = isCancelled;
     map["customerID"] = customerID;
     return map;

+ 2 - 2
lib/services/collections_service.dart

@@ -308,7 +308,7 @@ class CollectionsService {
       // read the existing magic metadata and apply new updates to existing data
       // current update is simple replace. This will be enhanced in the future,
       // as required.
-      Map<String, dynamic> jsonToUpdate =
+      final Map<String, dynamic> jsonToUpdate =
           jsonDecode(collection.mMdEncodedJson ?? '{}');
       newMetadataUpdate.forEach((key, value) {
         jsonToUpdate[key] = value;
@@ -325,7 +325,7 @@ class CollectionsService {
       );
       // for required field, the json validator on golang doesn't treat 0 as valid
       // value. Instead of changing version to ptr, decided to start version with 1.
-      int currentVersion = max(collection.mMdVersion, 1);
+      final int currentVersion = max(collection.mMdVersion, 1);
       final params = UpdateMagicMetadataRequest(
         id: collection.id,
         magicMetadata: MetadataRequest(

+ 1 - 1
lib/services/deduplication_service.dart

@@ -18,7 +18,7 @@ class DeduplicationService {
 
   Future<List<DuplicateFiles>> getDuplicateFiles() async {
     try {
-      DuplicateFilesResponse dupes = await _fetchDuplicateFileIDs();
+      final DuplicateFilesResponse dupes = await _fetchDuplicateFileIDs();
       final ids = <int>[];
       for (final dupe in dupes.duplicates) {
         ids.addAll(dupe.fileIDs);

+ 1 - 1
lib/services/favorites_service.dart

@@ -53,7 +53,7 @@ class FavoritesService {
 
   Future<void> removeFromFavorites(File file) async {
     final collectionID = await _getOrCreateFavoriteCollectionID();
-    var fileID = file.uploadedFileID;
+    final fileID = file.uploadedFileID;
     if (fileID == null) {
       // Do nothing, ignore
     } else {

+ 1 - 1
lib/services/feature_flag_service.dart

@@ -94,7 +94,7 @@ class FeatureFlagService {
   }
 
   bool _isInternalUserOrDebugBuild() {
-    String email = Configuration.instance.getEmail();
+    final String email = Configuration.instance.getEmail();
     return (email != null && email.endsWith("@ente.io")) || kDebugMode;
   }
 

+ 4 - 4
lib/services/file_magic_service.dart

@@ -30,7 +30,7 @@ class FileMagicService {
       FileMagicService._privateConstructor();
 
   Future<void> changeVisibility(List<File> files, int visibility) async {
-    Map<String, dynamic> update = {kMagicKeyVisibility: visibility};
+    final Map<String, dynamic> update = {kMagicKeyVisibility: visibility};
     await _updateMagicData(files, update);
     if (visibility == kVisibilityVisible) {
       // Force reload home gallery to pull in the now unarchived files
@@ -62,7 +62,7 @@ class FileMagicService {
         // read the existing magic metadata and apply new updates to existing data
         // current update is simple replace. This will be enhanced in the future,
         // as required.
-        Map<String, dynamic> jsonToUpdate = jsonDecode(file.pubMmdEncodedJson);
+        final Map<String, dynamic> jsonToUpdate = jsonDecode(file.pubMmdEncodedJson);
         newMetadataUpdate.forEach((key, value) {
           jsonToUpdate[key] = value;
         });
@@ -132,7 +132,7 @@ class FileMagicService {
         // read the existing magic metadata and apply new updates to existing data
         // current update is simple replace. This will be enhanced in the future,
         // as required.
-        Map<String, dynamic> jsonToUpdate = jsonDecode(file.mMdEncodedJson);
+        final Map<String, dynamic> jsonToUpdate = jsonDecode(file.mMdEncodedJson);
         newMetadataUpdate.forEach((key, value) {
           jsonToUpdate[key] = value;
         });
@@ -224,7 +224,7 @@ class MetadataRequest {
   }
 
   Map<String, dynamic> toJson() {
-    var map = <String, dynamic>{};
+    final map = <String, dynamic>{};
     map['version'] = version;
     map['count'] = count;
     map['data'] = data;

+ 3 - 3
lib/services/local_sync_service.dart

@@ -164,7 +164,7 @@ class LocalSyncService {
     if (_prefs.containsKey(kEditedFileIDsKey)) {
       return _prefs.getStringList(kEditedFileIDsKey);
     } else {
-      List<String> editedIDs = [];
+      final List<String> editedIDs = [];
       return editedIDs;
     }
   }
@@ -179,7 +179,7 @@ class LocalSyncService {
     if (_prefs.containsKey(kDownloadedFileIDsKey)) {
       return _prefs.getStringList(kDownloadedFileIDsKey);
     } else {
-      List<String> downloadedIDs = [];
+      final List<String> downloadedIDs = [];
       return downloadedIDs;
     }
   }
@@ -194,7 +194,7 @@ class LocalSyncService {
     if (_prefs.containsKey(kInvalidFileIDsKey)) {
       return _prefs.getStringList(kInvalidFileIDsKey);
     } else {
-      List<String> invalidIDs = [];
+      final List<String> invalidIDs = [];
       return invalidIDs;
     }
   }

+ 4 - 4
lib/services/remote_sync_service.dart

@@ -262,7 +262,7 @@ class RemoteSyncService {
     _logger.info(editedFiles.length.toString() + " files edited.");
 
     _completedUploads = 0;
-    int toBeUploaded =
+    final int toBeUploaded =
         filesToBeUploaded.length + updatedFileIDs.length + editedFiles.length;
 
     if (toBeUploaded > 0) {
@@ -371,8 +371,8 @@ class RemoteSyncService {
         localButUpdatedOnRemote = 0,
         localButAddedToNewCollectionOnRemote = 0;
     bool hasAnyCreationTimeChanged = false;
-    List<File> toBeInserted = [];
-    int userID = Configuration.instance.getUserID();
+    final List<File> toBeInserted = [];
+    final int userID = Configuration.instance.getUserID();
     for (File file in diff) {
       final existingFiles = file.deviceFolder == null
           ? null
@@ -417,7 +417,7 @@ class RemoteSyncService {
         } else {
           file.localID = null;
         }
-        bool wasUploadedOnAPreviousInstallation =
+        final bool wasUploadedOnAPreviousInstallation =
             existingFiles.length == 1 && existingFiles[0].collectionID == null;
         if (wasUploadedOnAPreviousInstallation) {
           file.generatedID = existingFiles[0].generatedID;

+ 2 - 2
lib/services/user_service.dart

@@ -806,7 +806,7 @@ class UserService {
 
   Future<String> getPaymentToken() async {
     try {
-      var response = await _dio.get(
+      final response = await _dio.get(
         "${_config.getHttpEndpoint()}/users/payment-token",
         options: Options(
           headers: {
@@ -827,7 +827,7 @@ class UserService {
 
   Future<String> getFamiliesToken() async {
     try {
-      var response = await _dio.get(
+      final response = await _dio.get(
         "${_config.getHttpEndpoint()}/users/families-token",
         options: Options(
           headers: {

+ 2 - 2
lib/ui/account/delete_account_page.dart

@@ -145,7 +145,7 @@ class DeleteAccountPage extends StatelessWidget {
     DeleteChallengeResponse response,
   ) async {
     AppLock.of(context).setEnabled(false);
-    String reason = "Please authenticate to initiate account deletion";
+    const String reason = "Please authenticate to initiate account deletion";
     final result = await requestAuthentication(reason);
     AppLock.of(context).setEnabled(
       Configuration.instance.shouldShowLockScreen(),
@@ -177,7 +177,7 @@ class DeleteAccountPage extends StatelessWidget {
   }
 
   Future<void> _requestEmailForDeletion(BuildContext context) async {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text(
         "Delete account",
         style: TextStyle(

+ 1 - 1
lib/ui/account/password_reentry_page.dart

@@ -79,7 +79,7 @@ class _PasswordReentryPageState extends State<PasswordReentryPage> {
             _logger.severe("Password verification failed", e, s);
             await dialog.hide();
 
-            var dialogUserChoice = await showChoiceDialog(
+            final dialogUserChoice = await showChoiceDialog(
               context,
               "Incorrect password",
               "Please try again",

+ 1 - 1
lib/ui/account/recovery_key_page.dart

@@ -186,7 +186,7 @@ class _RecoveryKeyPageState extends State<RecoveryKeyPage> {
   }
 
   List<Widget> _saveOptions(BuildContext context, String recoveryKey) {
-    List<Widget> childrens = [];
+    final List<Widget> childrens = [];
     if (!_hasTriedToSave) {
       childrens.add(
         ElevatedButton(

+ 2 - 2
lib/ui/account/sessions_page.dart

@@ -41,7 +41,7 @@ class _SessionsPageState extends State<SessionsPage> {
     if (_sessions == null) {
       return const Center(child: EnteLoadingWidget());
     }
-    List<Widget> rows = [];
+    final List<Widget> rows = [];
     rows.add(const Padding(padding: EdgeInsets.all(4)));
     for (final session in _sessions.sessions) {
       rows.add(_getSessionWidget(session));
@@ -163,7 +163,7 @@ class _SessionsPageState extends State<SessionsPage> {
         ),
       );
     }
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("Terminate session?"),
       content: text,
       actions: [

+ 2 - 2
lib/ui/account/two_factor_setup_page.dart

@@ -116,7 +116,7 @@ class _TwoFactorSetupPageState extends State<TwoFactorSetupPage>
             Divider(
               height: 1,
               thickness: 1,
-              color: Theme.of(context).accentColor,
+              color: Theme.of(context).colorScheme.secondary,
             ),
             _getVerificationWidget(),
           ],
@@ -126,7 +126,7 @@ class _TwoFactorSetupPageState extends State<TwoFactorSetupPage>
   }
 
   Widget _getSecretCode() {
-    Color textColor = Theme.of(context).colorScheme.onSurface;
+    final Color textColor = Theme.of(context).colorScheme.onSurface;
     return GestureDetector(
       onTap: () async {
         await Clipboard.setData(ClipboardData(text: widget.secretCode));

+ 4 - 4
lib/ui/collections/collection_item_widget.dart

@@ -19,11 +19,11 @@ class CollectionItem extends StatelessWidget {
   Widget build(BuildContext context) {
     const double horizontalPaddingOfGridRow = 16;
     const double crossAxisSpacingOfGrid = 9;
-    Size size = MediaQuery.of(context).size;
-    int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
-    double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
+    final Size size = MediaQuery.of(context).size;
+    final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
+    final double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
         (albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
-    TextStyle albumTitleTextStyle =
+    final TextStyle albumTitleTextStyle =
         Theme.of(context).textTheme.subtitle1.copyWith(fontSize: 14);
     final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
         (totalWhiteSpaceOfRow / albumsCountInOneRow);

+ 2 - 2
lib/ui/collections/remote_collections_grid_view_widget.dart

@@ -17,8 +17,8 @@ class RemoteCollectionsGridViewWidget extends StatelessWidget {
   Widget build(BuildContext context) {
     const double horizontalPaddingOfGridRow = 16;
     const double crossAxisSpacingOfGrid = 9;
-    Size size = MediaQuery.of(context).size;
-    int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
+    final Size size = MediaQuery.of(context).size;
+    final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
     final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
         horizontalPaddingOfGridRow -
         ((crossAxisSpacingOfGrid / 2) * (albumsCountInOneRow - 1));

+ 1 - 1
lib/ui/common/dialogs.dart

@@ -19,7 +19,7 @@ Future<DialogUserChoice> showChoiceDialog<T>(
   Color secondActionColor,
   ActionType actionType = ActionType.confirm,
 }) {
-  AlertDialog alert = AlertDialog(
+  final AlertDialog alert = AlertDialog(
     title: Text(
       title,
       style: TextStyle(

+ 2 - 2
lib/ui/create_collection_page.dart

@@ -202,7 +202,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
   }
 
   void _showNameAlbumDialog() async {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("Album title"),
       content: TextFormField(
         decoration: const InputDecoration(
@@ -284,7 +284,7 @@ class _CreateCollectionPageState extends State<CreateCollectionPage> {
     final dialog = createProgressDialog(context, "Moving files to album...");
     await dialog.show();
     try {
-      int fromCollectionID = widget.selectedFiles.files?.first?.collectionID;
+      final int fromCollectionID = widget.selectedFiles.files?.first?.collectionID;
       await CollectionsService.instance.move(
         toCollectionID,
         fromCollectionID,

+ 1 - 1
lib/ui/grant_permissions_widget.dart

@@ -94,7 +94,7 @@ class GrantPermissionsWidget extends StatelessWidget {
                 state == PermissionState.limited) {
               await SyncService.instance.onPermissionGranted(state);
             } else if (state == PermissionState.denied) {
-              AlertDialog alert = AlertDialog(
+              final AlertDialog alert = AlertDialog(
                 title: const Text("Please grant permissions"),
                 content: const Text(
                   "ente can encrypt and preserve files only if you grant access to them",

+ 3 - 3
lib/ui/home_widget.dart

@@ -123,7 +123,7 @@ class _HomeWidgetState extends State<HomeWidget> {
     });
     _triggerLogoutEvent =
         Bus.instance.on<TriggerLogoutEvent>().listen((event) async {
-      AlertDialog alert = AlertDialog(
+      final AlertDialog alert = AlertDialog(
         title: const Text("Session expired"),
         content: const Text("Please login again"),
         actions: [
@@ -344,7 +344,7 @@ class _HomeWidgetState extends State<HomeWidget> {
   Future<bool> _initDeepLinks() async {
     // Platform messages may fail, so we use a try/catch PlatformException.
     try {
-      String initialLink = await getInitialLink();
+      final String initialLink = await getInitialLink();
       // Parse the link and warn the user, if it is not correct,
       // but keep in mind it could be `null`.
       if (initialLink != null) {
@@ -609,7 +609,7 @@ class _HomeBottomNavigationBarState extends State<HomeBottomNavigationBar> {
 
   @override
   Widget build(BuildContext context) {
-    bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
+    final bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
     return AnimatedContainer(
       duration: const Duration(milliseconds: 300),
       curve: Curves.easeInOut,

+ 1 - 1
lib/ui/huge_listview/draggable_scrollbar.dart

@@ -175,7 +175,7 @@ class DraggableScrollbarState extends State<DraggableScrollbar>
       if (isDragging && details.delta.dy != 0) {
         thumbOffset += details.delta.dy;
         thumbOffset = thumbOffset.clamp(thumbMin, thumbMax);
-        double position = thumbOffset / (thumbMax - thumbMin);
+        final double position = thumbOffset / (thumbMax - thumbMin);
         widget.onChange?.call(position);
       }
     });

+ 1 - 1
lib/ui/huge_listview/huge_listview.dart

@@ -97,7 +97,7 @@ class HugeListViewState<T> extends State<HugeListView<T>> {
   }
 
   void _sendScroll() {
-    int current = _currentFirst();
+    final int current = _currentFirst();
     widget.firstShown?.call(current);
     scrollKey.currentState?.setPosition(current / widget.totalCount, current);
   }

+ 2 - 2
lib/ui/huge_listview/lazy_loading_gallery.dart

@@ -71,7 +71,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
 
     _currentIndexSubscription =
         widget.currentIndexStream.listen((currentIndex) {
-      bool shouldRender = (currentIndex - widget.index).abs() <
+      final bool shouldRender = (currentIndex - widget.index).abs() <
           kNumberOfDaysToRenderBeforeAndAfter;
       if (mounted && shouldRender != _shouldRender) {
         setState(() {
@@ -163,7 +163,7 @@ class _LazyLoadingGalleryState extends State<LazyLoadingGallery> {
   }
 
   Widget _getGallery() {
-    List<Widget> childGalleries = [];
+    final List<Widget> childGalleries = [];
     for (int index = 0; index < _files.length; index += kSubGalleryItemLimit) {
       childGalleries.add(
         LazyLoadingGridView(

+ 2 - 2
lib/ui/memories_widget.dart

@@ -66,9 +66,9 @@ class MemoriesWidget extends StatelessWidget {
   }
 
   bool _areMemoriesFromSameYear(Memory first, Memory second) {
-    var firstDate =
+    final firstDate =
         DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime);
-    var secondDate =
+    final secondDate =
         DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime);
     return firstDate.year == secondDate.year;
   }

+ 1 - 1
lib/ui/nav_bar.dart

@@ -321,7 +321,7 @@ class _ButtonState extends State<Button> with TickerProviderStateMixin {
       expandController.forward();
     }
 
-    Widget icon = widget.leading ??
+    final Widget icon = widget.leading ??
         Icon(
           widget.icon,
           color: _expanded ? widget.iconColor : widget.iconActiveColor,

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

@@ -77,7 +77,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
                   ),
                 ),
                 shouldOverrideUrlLoading: (controller, navigationAction) async {
-                  var loadingUri = navigationAction.request.url;
+                  final loadingUri = navigationAction.request.url;
                   _logger.info("Loading url $loadingUri");
                   // handle the payment response
                   if (_isPaymentActionComplete(loadingUri)) {
@@ -130,7 +130,7 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
       'action': widget.actionType,
       'redirectURL': kWebPaymentRedirectUrl,
     };
-    var tryParse = Uri.tryParse(kWebPaymentBaseEndpoint);
+    final tryParse = Uri.tryParse(kWebPaymentBaseEndpoint);
     if (kDebugMode && kWebPaymentBaseEndpoint.startsWith("http://")) {
       return Uri.http(tryParse.authority, tryParse.path, queryParameters);
     } else {
@@ -173,13 +173,13 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
   }
 
   Future<void> _handlePaymentResponse(Uri uri) async {
-    var queryParams = uri.queryParameters;
-    var paymentStatus = uri.queryParameters['status'] ?? '';
+    final queryParams = uri.queryParameters;
+    final paymentStatus = uri.queryParameters['status'] ?? '';
     _logger.fine('handle payment response with status $paymentStatus');
     if (paymentStatus == 'success') {
       await _handlePaymentSuccess(queryParams);
     } else if (paymentStatus == 'fail') {
-      var reason = queryParams['reason'] ?? '';
+      final reason = queryParams['reason'] ?? '';
       await _handlePaymentFailure(reason);
     } else {
       // should never reach here
@@ -210,17 +210,17 @@ class _PaymentWebPageState extends State<PaymentWebPage> {
 
   // return true if verifySubscription didn't throw any exceptions
   Future<void> _handlePaymentSuccess(Map<String, String> queryParams) async {
-    var checkoutSessionID = queryParams['session_id'] ?? '';
+    final checkoutSessionID = queryParams['session_id'] ?? '';
     await _dialog.show();
     try {
-      var response = await billingService.verifySubscription(
+      final response = await billingService.verifySubscription(
         widget.planId,
         checkoutSessionID,
         paymentProvider: kStripe,
       );
       await _dialog.hide();
       if (response != null) {
-        var content = widget.actionType == 'buy'
+        final content = widget.actionType == 'buy'
             ? 'Your purchase was successful'
             : 'Your subscription was updated successfully';
         await _showExitPageDialog(title: 'Thank you', content: content);

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

@@ -307,7 +307,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
   Future<void> _launchStripePortal() async {
     await _dialog.show();
     try {
-      String url = await _billingService.getStripeCustomerPortalUrl();
+      final String url = await _billingService.getStripeCustomerPortalUrl();
       Navigator.of(context).push(
         MaterialPageRoute(
           builder: (BuildContext context) {
@@ -353,9 +353,9 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
   }
 
   Widget _stripeRenewOrCancelButton() {
-    bool isRenewCancelled =
+    final bool isRenewCancelled =
         _currentSubscription.attributes?.isCancelled ?? false;
-    String title =
+    final String title =
         isRenewCancelled ? "Renew subscription" : "Cancel subscription";
     return TextButton(
       child: Text(
@@ -370,7 +370,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
       onPressed: () async {
         bool confirmAction = false;
         if (isRenewCancelled) {
-          var choice = await showChoiceDialog(
+          final choice = await showChoiceDialog(
             context,
             title,
             "Are you sure you want to renew?",
@@ -379,7 +379,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
           );
           confirmAction = choice == DialogUserChoice.secondChoice;
         } else {
-          var choice = await showChoiceDialog(
+          final choice = await showChoiceDialog(
             context,
             title,
             'Are you sure you want to cancel?',
@@ -455,7 +455,7 @@ class _StripeSubscriptionPageState extends State<StripeSubscriptionPage> {
               String stripPurChaseAction = 'buy';
               if (_isStripeSubscriber && _hasActiveSubscription) {
                 // confirm if user wants to change plan or not
-                var result = await showChoiceDialog(
+                final result = await showChoiceDialog(
                   context,
                   "Confirm plan change",
                   "Are you sure you want to change your plan?",

+ 1 - 1
lib/ui/payment/subscription_common_widgets.dart

@@ -87,7 +87,7 @@ class ValidityWidget extends StatelessWidget {
     if (currentSubscription == null) {
       return Container();
     }
-    var endDate = getDateAndMonthAndYear(
+    final endDate = getDateAndMonthAndYear(
       DateTime.fromMicrosecondsSinceEpoch(currentSubscription.expiryTime),
     );
     var message = "Renews on $endDate";

+ 2 - 2
lib/ui/payment/subscription_plan_widget.dart

@@ -16,13 +16,13 @@ class SubscriptionPlanWidget extends StatelessWidget {
   final bool isActive;
 
   String _displayPrice() {
-    var result = price + (period.isNotEmpty ? " / " + period : "");
+    final result = price + (period.isNotEmpty ? " / " + period : "");
     return result.isNotEmpty ? result : "Trial plan";
   }
 
   @override
   Widget build(BuildContext context) {
-    Color textColor = isActive ? Colors.white : Colors.black;
+    final Color textColor = isActive ? Colors.white : Colors.black;
     return Container(
       width: double.infinity,
       color: Theme.of(context).colorScheme.onPrimary,

+ 3 - 3
lib/ui/settings/account_section_widget.dart

@@ -40,7 +40,7 @@ class AccountSectionWidgetState extends State<AccountSectionWidget> {
           behavior: HitTestBehavior.translucent,
           onTap: () async {
             AppLock.of(context).setEnabled(false);
-            String reason = "Please authenticate to view your recovery key";
+            const String reason = "Please authenticate to view your recovery key";
             final result = await requestAuthentication(reason);
             AppLock.of(context)
                 .setEnabled(Configuration.instance.shouldShowLockScreen());
@@ -76,7 +76,7 @@ class AccountSectionWidgetState extends State<AccountSectionWidget> {
           behavior: HitTestBehavior.translucent,
           onTap: () async {
             AppLock.of(context).setEnabled(false);
-            String reason = "Please authenticate to change your email";
+            const String reason = "Please authenticate to change your email";
             final result = await requestAuthentication(reason);
             AppLock.of(context)
                 .setEnabled(Configuration.instance.shouldShowLockScreen());
@@ -103,7 +103,7 @@ class AccountSectionWidgetState extends State<AccountSectionWidget> {
           behavior: HitTestBehavior.translucent,
           onTap: () async {
             AppLock.of(context).setEnabled(false);
-            String reason = "Please authenticate to change your password";
+            const String reason = "Please authenticate to change your password";
             final result = await requestAuthentication(reason);
             AppLock.of(context)
                 .setEnabled(Configuration.instance.shouldShowLockScreen());

+ 1 - 1
lib/ui/settings/app_update_dialog.dart

@@ -153,7 +153,7 @@ class _ApkDownloaderDialogState extends State<ApkDownloaderDialog> {
       OpenFile.open(_saveUrl);
     } catch (e) {
       Logger("ApkDownloader").severe(e);
-      AlertDialog alert = AlertDialog(
+      final AlertDialog alert = AlertDialog(
         title: const Text("Sorry"),
         content: const Text("The download could not be completed"),
         actions: [

+ 1 - 1
lib/ui/settings/app_version_widget.dart

@@ -25,7 +25,7 @@ class _AppVersionWidgetState extends State<AppVersionWidget> {
     return GestureDetector(
       behavior: HitTestBehavior.translucent,
       onTap: () async {
-        int now = DateTime.now().millisecondsSinceEpoch;
+        final int now = DateTime.now().millisecondsSinceEpoch;
         if (now - (_lastTap ?? now) < kConsecutiveTapTimeWindowInMilliseconds) {
           _consecutiveTaps++;
           if (_consecutiveTaps == kTapThresholdForInspector) {

+ 6 - 6
lib/ui/settings/backup_section_widget.dart

@@ -113,7 +113,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
                 value: Configuration.instance.shouldKeepDeviceAwake(),
                 onChanged: (value) async {
                   if (value) {
-                    var choice = await showChoiceDialog(
+                    final choice = await showChoiceDialog(
                       context,
                       "Disable automatic screen lock when ente is running?",
                       "This will ensure faster uploads by ensuring your device does not sleep when uploads are in progress.",
@@ -158,7 +158,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
                 "You've no files on this device that can be deleted",
               );
             } else {
-              bool result = await routeToPage(context, FreeSpacePage(status));
+              final bool result = await routeToPage(context, FreeSpacePage(status));
               if (result == true) {
                 _showSpaceFreedDialog(status);
               }
@@ -193,7 +193,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
                 "You've no duplicate files that can be cleared",
               );
             } else {
-              DeduplicationResult result =
+              final DeduplicationResult result =
                   await routeToPage(context, DeduplicatePage(duplicates));
               if (result != null) {
                 _showDuplicateFilesDeletedDialog(result);
@@ -213,7 +213,7 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
   }
 
   void _showSpaceFreedDialog(BackupStatus status) {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("Success"),
       content: Text(
         "You have successfully freed up " + formatBytes(status.size) + "!",
@@ -268,10 +268,10 @@ class BackupSectionWidgetState extends State<BackupSectionWidget> {
   }
 
   void _showDuplicateFilesDeletedDialog(DeduplicationResult result) {
-    String countText = result.count.toString() +
+    final String countText = result.count.toString() +
         " duplicate file" +
         (result.count == 1 ? "" : "s");
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("✨ Success"),
       content: Text(
         "You have cleaned up " +

+ 1 - 1
lib/ui/settings/danger_section_widget.dart

@@ -53,7 +53,7 @@ class _DangerSectionWidgetState extends State<DangerSectionWidget> {
   }
 
   Future<void> _onLogoutTapped() async {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text(
         "Logout",
         style: TextStyle(

+ 1 - 1
lib/ui/settings/debug_section_widget.dart

@@ -48,7 +48,7 @@ class DebugSectionWidget extends StatelessWidget {
 
   void _showKeyAttributesDialog(BuildContext context) {
     final keyAttributes = Configuration.instance.getKeyAttributes();
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("key attributes"),
       content: SingleChildScrollView(
         child: Column(

+ 3 - 3
lib/ui/settings/security_section_widget.dart

@@ -83,7 +83,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
                         value: snapshot.data,
                         onChanged: (value) async {
                           AppLock.of(context).setEnabled(false);
-                          String reason =
+                          const String reason =
                               "Please authenticate to configure two-factor authentication";
                           final result = await requestAuthentication(reason);
                           AppLock.of(context).setEnabled(
@@ -164,7 +164,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
                   value: _config.shouldHideFromRecents(),
                   onChanged: (value) async {
                     if (value) {
-                      AlertDialog alert = AlertDialog(
+                      final AlertDialog alert = AlertDialog(
                         title: const Text("Hide from recents?"),
                         content: SingleChildScrollView(
                           child: Column(
@@ -278,7 +278,7 @@ class _SecuritySectionWidgetState extends State<SecuritySectionWidget> {
   }
 
   void _disableTwoFactor() {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("Disable two-factor"),
       content: const Text(
         "Are you sure you want to disable two-factor authentication?",

+ 1 - 1
lib/ui/settings/social_section_widget.dart

@@ -22,7 +22,7 @@ class SocialSectionWidget extends StatelessWidget {
   }
 
   Widget _getSectionOptions(BuildContext context) {
-    List<Widget> options = [
+    final List<Widget> options = [
       GestureDetector(
         behavior: HitTestBehavior.translucent,
         onTap: () {

+ 7 - 7
lib/ui/shared_collections_gallery.dart

@@ -112,9 +112,9 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
   Widget _getSharedCollectionsGallery(SharedCollections collections) {
     const double horizontalPaddingOfGridRow = 16;
     const double crossAxisSpacingOfGrid = 9;
-    Size size = MediaQuery.of(context).size;
-    int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
-    double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
+    final Size size = MediaQuery.of(context).size;
+    final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
+    final double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
         (albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
     final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
         (totalWhiteSpaceOfRow / albumsCountInOneRow);
@@ -363,11 +363,11 @@ class IncomingCollectionItem extends StatelessWidget {
   Widget build(BuildContext context) {
     const double horizontalPaddingOfGridRow = 16;
     const double crossAxisSpacingOfGrid = 9;
-    TextStyle albumTitleTextStyle =
+    final TextStyle albumTitleTextStyle =
         Theme.of(context).textTheme.subtitle1.copyWith(fontSize: 14);
-    Size size = MediaQuery.of(context).size;
-    int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
-    double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
+    final Size size = MediaQuery.of(context).size;
+    final int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
+    final double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
         (albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
     final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
         (totalWhiteSpaceOfRow / albumsCountInOneRow);

+ 9 - 9
lib/ui/sharing/manage_links_widget.dart

@@ -131,12 +131,12 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
                               false,
                           onChanged: (enablePassword) async {
                             if (enablePassword) {
-                              var inputResult =
+                              final inputResult =
                                   await _displayLinkPasswordInput(context);
                               if (inputResult != null &&
                                   inputResult == 'ok' &&
                                   _textFieldController.text.trim().isNotEmpty) {
-                                var propToUpdate = await _getEncryptedPassword(
+                                final propToUpdate = await _getEncryptedPassword(
                                   _textFieldController.text,
                                 );
                                 await _updateUrlSettings(context, propToUpdate);
@@ -250,10 +250,10 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
                   CupertinoButton(
                     onPressed: () async {
                       int newValidTill = -1;
-                      int expireAfterInMicroseconds = _selectedExpiry.item3;
+                      final int expireAfterInMicroseconds = _selectedExpiry.item3;
                       // need to manually select time
                       if (expireAfterInMicroseconds < 0) {
-                        var timeInMicrosecondsFromEpoch =
+                        final timeInMicrosecondsFromEpoch =
                             await _showDateTimePicker();
                         if (timeInMicrosecondsFromEpoch != null) {
                           newValidTill = timeInMicrosecondsFromEpoch;
@@ -293,7 +293,7 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
                 backgroundColor:
                     Theme.of(context).backgroundColor.withOpacity(0.95),
                 onSelectedItemChanged: (value) {
-                  var firstWhere = _expiryOptions
+                  final firstWhere = _expiryOptions
                       .firstWhere((element) => element.item1 == value);
                   setState(() {
                     _selectedExpiry = firstWhere;
@@ -410,8 +410,8 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
       Sodium.cryptoPwhashAlgArgon2id13 == Sodium.cryptoPwhashAlgDefault,
       "mismatch in expected default pw hashing algo",
     );
-    int memLimit = Sodium.cryptoPwhashMemlimitInteractive;
-    int opsLimit = Sodium.cryptoPwhashOpslimitInteractive;
+    final int memLimit = Sodium.cryptoPwhashMemlimitInteractive;
+    final int opsLimit = Sodium.cryptoPwhashOpslimitInteractive;
     final kekSalt = CryptoUtil.getSaltToDeriveKey();
     final result = await CryptoUtil.deriveKey(
       utf8.encode(pass),
@@ -444,7 +444,7 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
   }
 
   Text _getLinkExpiryTimeWidget() {
-    int validTill = widget.collection.publicURLs?.first?.validTill ?? 0;
+    final int validTill = widget.collection.publicURLs?.first?.validTill ?? 0;
     if (validTill == 0) {
       return const Text(
         'Never',
@@ -470,7 +470,7 @@ class _ManageSharedLinkWidgetState extends State<ManageSharedLinkWidget> {
   }
 
   Future<void> _showDeviceLimitPicker() async {
-    List<Text> options = [];
+    final List<Text> options = [];
     for (int i = 50; i > 0; i--) {
       options.add(
         Text(i.toString(), style: Theme.of(context).textTheme.subtitle1),

+ 4 - 4
lib/ui/sharing/share_collection_widget.dart

@@ -91,7 +91,7 @@ class _SharingDialogState extends State<SharingDialog> {
     }
 
     if (!FeatureFlagService.instance.disableUrlSharing()) {
-      bool hasUrl = widget.collection.publicURLs?.isNotEmpty ?? false;
+      final bool hasUrl = widget.collection.publicURLs?.isNotEmpty ?? false;
       children.addAll([
         const Padding(padding: EdgeInsets.all(16)),
         const Divider(height: 1),
@@ -246,10 +246,10 @@ class _SharingDialogState extends State<SharingDialog> {
   }
 
   Widget _getShareableUrlWidget(BuildContext parentContext) {
-    String collectionKey = Base58Encode(
+    final String collectionKey = Base58Encode(
       CollectionsService.instance.getCollectionKey(widget.collection.id),
     );
-    String url = "${widget.collection.publicURLs.first.url}#$collectionKey";
+    final String url = "${widget.collection.publicURLs.first.url}#$collectionKey";
     return SingleChildScrollView(
       child: Column(
         mainAxisAlignment: MainAxisAlignment.start,
@@ -436,7 +436,7 @@ class _SharingDialogState extends State<SharingDialog> {
   }
 
   void _showUnSupportedAlert() {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("Sorry"),
       content: const Text(
         "Sharing is not permitted for free accounts, please subscribe",

+ 1 - 1
lib/ui/status_bar_widget.dart

@@ -135,7 +135,7 @@ class _SyncStatusWidgetState extends State<SyncStatusWidget> {
 
   @override
   Widget build(BuildContext context) {
-    bool isNotOutdatedEvent = _event != null &&
+    final bool isNotOutdatedEvent = _event != null &&
         (_event.status == SyncStatus.completedBackup ||
             _event.status == SyncStatus.completedFirstGalleryImport) &&
         (DateTime.now().microsecondsSinceEpoch - _event.timestamp >

+ 5 - 5
lib/ui/tools/editor/filtered_image.dart

@@ -70,11 +70,11 @@ class ColorFilterGenerator {
         0,
       ];
     }
-    double cosVal = cos(value);
-    double sinVal = sin(value);
-    double lumR = 0.213;
-    double lumG = 0.715;
-    double lumB = 0.072;
+    final double cosVal = cos(value);
+    final double sinVal = sin(value);
+    const double lumR = 0.213;
+    const double lumG = 0.715;
+    const double lumB = 0.072;
 
     return List<double>.from(<double>[
       (lumR + (cosVal * (1 - lumR))) + (sinVal * (-lumR)),

+ 8 - 8
lib/ui/tools/editor/image_editor_page.dart

@@ -157,7 +157,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Widget _buildFlipButton() {
-    TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
+    final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
 
     return GestureDetector(
       behavior: HitTestBehavior.translucent,
@@ -191,7 +191,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Widget _buildRotateLeftButton() {
-    TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
+    final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
 
     return GestureDetector(
       behavior: HitTestBehavior.translucent,
@@ -221,7 +221,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Widget _buildRotateRightButton() {
-    TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
+    final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
 
     return GestureDetector(
       behavior: HitTestBehavior.translucent,
@@ -251,7 +251,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Widget _buildSaveButton() {
-    TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
+    final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
 
     return GestureDetector(
       behavior: HitTestBehavior.translucent,
@@ -349,7 +349,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
       newFile.collectionID = widget.originalFile.collectionID;
       newFile.location = widget.originalFile.location;
       if (!newFile.hasLocation() && widget.originalFile.localID != null) {
-        var assetEntity = await widget.originalFile.getAsset();
+        final assetEntity = await widget.originalFile.getAsset();
         if (assetEntity != null) {
           final latLong = await assetEntity.latlngAsync();
           newFile.location = Location(latLong.latitude, latLong.longitude);
@@ -394,7 +394,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Widget _buildSat() {
-    TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
+    final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
 
     return Container(
       padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
@@ -440,7 +440,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Widget _buildBrightness() {
-    TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
+    final TextStyle subtitle2 = Theme.of(context).textTheme.subtitle2;
 
     return Container(
       padding: const EdgeInsets.fromLTRB(20, 0, 20, 0),
@@ -486,7 +486,7 @@ class _ImageEditorPageState extends State<ImageEditorPage> {
   }
 
   Future<void> _showExitConfirmationDialog() async {
-    AlertDialog alert = AlertDialog(
+    final AlertDialog alert = AlertDialog(
       title: const Text("Discard edits?"),
       actions: [
         TextButton(

+ 1 - 0
lib/ui/viewer/file/custom_app_bar.dart

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 
 class CustomAppBar extends PreferredSize {
+  @override
   final Widget child;
   final double height;
 

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

@@ -139,7 +139,7 @@ class _DetailPageState extends State<DetailPage> {
     return PageView.builder(
       itemBuilder: (context, index) {
         final file = _files[index];
-        Widget content = FileWidget(
+        final Widget content = FileWidget(
           file,
           autoPlay: !_hasPageChanged,
           tagPrefix: widget.config.tagPrefix,

+ 3 - 3
lib/ui/viewer/file/fading_app_bar.dart

@@ -300,9 +300,9 @@ class FadingAppBarState extends State<FadingAppBar> {
   Future<void> _download(File file) async {
     final dialog = createProgressDialog(context, "Downloading...");
     await dialog.show();
-    FileType type = file.fileType;
+    final FileType type = file.fileType;
     // save and track image for livePhoto/image and video for FileType.video
-    io.File fileToSave = await getFile(file);
+    final io.File fileToSave = await getFile(file);
     final savedAsset = type == FileType.video
         ? (await PhotoManager.editor.saveVideo(fileToSave, title: file.title))
         : (await PhotoManager.editor
@@ -313,7 +313,7 @@ class FadingAppBarState extends State<FadingAppBar> {
     await FilesDB.instance.insert(file);
 
     if (type == FileType.livePhoto) {
-      io.File liveVideo = await getFileFromServer(file, liveVideo: true);
+      final io.File liveVideo = await getFileFromServer(file, liveVideo: true);
       if (liveVideo == null) {
         _logger.warning("Failed to find live video" + file.tag());
       } else {

+ 3 - 3
lib/ui/viewer/file/fading_bottom_bar.dart

@@ -59,7 +59,7 @@ class FadingBottomBarState extends State<FadingBottomBar> {
   }
 
   Widget _getBottomBar() {
-    List<Widget> children = [];
+    final List<Widget> children = [];
     children.add(
       Tooltip(
         message: "Info",
@@ -103,7 +103,7 @@ class FadingBottomBarState extends State<FadingBottomBar> {
       }
       if (widget.file.uploadedFileID != null &&
           widget.file.ownerID == Configuration.instance.getUserID()) {
-        bool isArchived =
+        final bool isArchived =
             widget.file.magicMetadata.visibility == kVisibilityArchive;
         children.add(
           Tooltip(
@@ -151,7 +151,7 @@ class FadingBottomBarState extends State<FadingBottomBar> {
         ),
       );
     }
-    var safeAreaBottomPadding = MediaQuery.of(context).padding.bottom * .5;
+    final safeAreaBottomPadding = MediaQuery.of(context).padding.bottom * .5;
     return IgnorePointer(
       ignoring: _shouldHide,
       child: AnimatedOpacity(

+ 2 - 2
lib/ui/viewer/file/file_info_dialog.dart

@@ -76,7 +76,7 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
         _exifData["ISO"] != null;
     final bool showDimension =
         _exifData["resolution"] != null && _exifData["megaPixels"] != null;
-    var listTiles = <Widget>[
+    final listTiles = <Widget>[
       ListTile(
         leading: const Padding(
           padding: EdgeInsets.only(top: 8, left: 6),
@@ -207,7 +207,7 @@ class _FileInfoWidgetState extends State<FileInfoWidget> {
           onTap: () {
             if (file.collectionID != null) {
               Navigator.pop(context); // info dialog
-              Collection c = CollectionsService.instance
+              final Collection c = CollectionsService.instance
                   .getCollectionByID(file.collectionID);
               routeToPage(
                 context,

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

@@ -91,7 +91,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
     // If yes, parent thumbnail widget can be stateless
     Widget content;
     if (image != null) {
-      List<Widget> contentChildren = [image];
+      final List<Widget> contentChildren = [image];
       if (widget.file.fileType == FileType.video) {
         contentChildren.add(const VideoOverlayIcon());
       } else if (widget.file.fileType == FileType.livePhoto &&
@@ -105,7 +105,7 @@ class _ThumbnailWidgetState extends State<ThumbnailWidget> {
               children: contentChildren,
             );
     }
-    List<Widget> viewChildren = [
+    final List<Widget> viewChildren = [
       const ThumbnailPlaceHolder(),
       AnimatedOpacity(
         opacity: content == null ? 0 : 1.0,

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

@@ -242,7 +242,7 @@ class _VideoControlsState extends State<VideoControls> {
   }
 
   void _playPause() {
-    bool isFinished = _latestValue.position >= _latestValue.duration;
+    final bool isFinished = _latestValue.position >= _latestValue.duration;
 
     setState(() {
       if (controller.value.isPlaying) {

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

@@ -88,7 +88,7 @@ class _ZoomableImageState extends State<ZoomableImage>
       content = const EnteLoadingWidget();
     }
 
-    GestureDragUpdateCallback verticalDragCallback = _isZooming
+    final GestureDragUpdateCallback verticalDragCallback = _isZooming
         ? null
         : (d) => {
               if (!_isZooming && d.delta.dy > kDragSensitivity)

+ 3 - 3
lib/ui/viewer/file/zoomable_live_image.dart

@@ -152,7 +152,7 @@ class _ZoomableLiveImageState extends State<ZoomableLiveImage>
   }
 
   VideoPlayerController _setVideoPlayerController({io.File file}) {
-    var videoPlayerController = VideoPlayerController.file(file);
+    final videoPlayerController = VideoPlayerController.file(file);
     return _videoPlayerController = videoPlayerController
       ..initialize().whenComplete(() {
         if (mounted) {
@@ -164,8 +164,8 @@ class _ZoomableLiveImageState extends State<ZoomableLiveImage>
   }
 
   void _showLivePhotoToast() async {
-    var preferences = await SharedPreferences.getInstance();
-    int promptTillNow = preferences.getInt(kLivePhotoToastCounterKey) ?? 0;
+    final preferences = await SharedPreferences.getInstance();
+    final int promptTillNow = preferences.getInt(kLivePhotoToastCounterKey) ?? 0;
     if (promptTillNow < kMaxLivePhotoToastCount && mounted) {
       showToast(context, "Press and hold to play video");
       preferences.setInt(kLivePhotoToastCounterKey, promptTillNow + 1);

+ 3 - 3
lib/ui/viewer/gallery/gallery.dart

@@ -183,7 +183,7 @@ class _GalleryState extends State<Gallery> {
         return const EnteLoadingWidget();
       },
       emptyResultBuilder: (_) {
-        List<Widget> children = [];
+        final List<Widget> children = [];
         if (widget.header != null) {
           children.add(widget.header);
         }
@@ -269,8 +269,8 @@ class _GalleryState extends State<Gallery> {
   }
 
   bool _areFromSameDay(int firstCreationTime, int secondCreationTime) {
-    var firstDate = DateTime.fromMicrosecondsSinceEpoch(firstCreationTime);
-    var secondDate = DateTime.fromMicrosecondsSinceEpoch(secondCreationTime);
+    final firstDate = DateTime.fromMicrosecondsSinceEpoch(firstCreationTime);
+    final secondDate = DateTime.fromMicrosecondsSinceEpoch(secondCreationTime);
     return firstDate.year == secondDate.year &&
         firstDate.month == secondDate.month &&
         firstDate.day == secondDate.day;

+ 2 - 2
lib/ui/viewer/gallery/gallery_app_bar_widget.dart

@@ -118,7 +118,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
   }
 
   List<Widget> _getDefaultActions(BuildContext context) {
-    List<Widget> actions = <Widget>[];
+    final List<Widget> actions = <Widget>[];
     if (Configuration.instance.hasConfiguredAccount() &&
         widget.selectedFiles.files.isEmpty &&
         (widget.type == GalleryType.localFolder ||
@@ -156,7 +156,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
                 ),
               );
             }
-            bool isArchived = widget.collection.isArchived();
+            final bool isArchived = widget.collection.isArchived();
             items.add(
               PopupMenuItem(
                 value: 2,

+ 3 - 3
lib/ui/viewer/gallery/gallery_overlay_widget.dart

@@ -66,7 +66,7 @@ class _GalleryOverlayWidgetState extends State<GalleryOverlayWidget> {
 
   @override
   Widget build(BuildContext context) {
-    bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
+    final bool filesAreSelected = widget.selectedFiles.files.isNotEmpty;
     final bottomPadding = Platform.isAndroid ? 0.0 : 12.0;
     return Padding(
       padding: EdgeInsets.only(bottom: bottomPadding),
@@ -254,7 +254,7 @@ class _OverlayWidgetState extends State<OverlayWidget> {
   }
 
   List<Widget> _getActions(BuildContext context) {
-    List<Widget> actions = <Widget>[];
+    final List<Widget> actions = <Widget>[];
     if (widget.type == GalleryType.trash) {
       _addTrashAction(actions);
       return actions;
@@ -372,7 +372,7 @@ class _OverlayWidgetState extends State<OverlayWidget> {
 
     if (widget.type == GalleryType.homepage ||
         widget.type == GalleryType.archive) {
-      bool showArchive = widget.type == GalleryType.homepage;
+      final bool showArchive = widget.type == GalleryType.homepage;
       actions.add(
         Tooltip(
           message: showArchive ? "Hide" : "Unhide",

+ 1 - 1
lib/ui/viewer/gallery/trash_page.dart

@@ -48,7 +48,7 @@ class _TrashPageState extends State<TrashPage> {
 
   @override
   Widget build(Object context) {
-    bool filesAreSelected = widget._selectedFiles.files.isNotEmpty;
+    final bool filesAreSelected = widget._selectedFiles.files.isNotEmpty;
 
     final gallery = Gallery(
       asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) {

+ 2 - 2
lib/utils/data_util.dart

@@ -20,7 +20,7 @@ String convertBytesToReadableFormat(int bytes) {
 String formatBytes(int bytes, [int decimals = 2]) {
   if (bytes == 0) return '0 bytes';
   const k = 1024;
-  int dm = decimals < 0 ? 0 : decimals;
-  int i = (log(bytes) / log(k)).floor();
+  final int dm = decimals < 0 ? 0 : decimals;
+  final int i = (log(bytes) / log(k)).floor();
   return ((bytes / pow(k, i)).toStringAsFixed(dm)) + ' ' + kStorageUnits[i];
 }

+ 6 - 6
lib/utils/date_time_util.dart

@@ -131,7 +131,7 @@ String getFullDate(DateTime dateTime) {
 }
 
 String daysLeft(int futureTime) {
-  int daysLeft = ((futureTime - DateTime.now().microsecondsSinceEpoch) /
+  final int daysLeft = ((futureTime - DateTime.now().microsecondsSinceEpoch) /
           Duration.microsecondsPerDay)
       .ceil();
   return '$daysLeft day' + (daysLeft <= 1 ? "" : "s");
@@ -143,7 +143,7 @@ String formatDuration(Duration position) {
   int seconds = ms ~/ 1000;
   final int hours = seconds ~/ 3600;
   seconds = seconds % 3600;
-  var minutes = seconds ~/ 60;
+  final minutes = seconds ~/ 60;
   seconds = seconds % 60;
 
   final hoursString = hours >= 10
@@ -230,15 +230,15 @@ String secondsToHHMMSS(int value) {
   h = value ~/ 3600;
   m = ((value - h * 3600)) ~/ 60;
   s = value - (h * 3600) - (m * 60);
-  String hourLeft = h.toString().length < 2 ? "0" + h.toString() : h.toString();
+  final String hourLeft = h.toString().length < 2 ? "0" + h.toString() : h.toString();
 
-  String minuteLeft =
+  final String minuteLeft =
       m.toString().length < 2 ? "0" + m.toString() : m.toString();
 
-  String secondsLeft =
+  final String secondsLeft =
       s.toString().length < 2 ? "0" + s.toString() : s.toString();
 
-  String result = "$hourLeft:$minuteLeft:$secondsLeft";
+  final String result = "$hourLeft:$minuteLeft:$secondsLeft";
 
   return result;
 }

+ 2 - 2
lib/utils/delete_file_util.dart

@@ -418,7 +418,7 @@ Future<List<String>> _deleteLocalFilesInBatches(
 
 Future<bool> _localFileExist(File file) {
   if (file.isSharedMediaToAppSandbox()) {
-    var localFile = io.File(getSharedMediaFilePath(file));
+    final localFile = io.File(getSharedMediaFilePath(file));
     return localFile.exists();
   } else {
     return file.getAsset().then((asset) {
@@ -434,7 +434,7 @@ Future<List<String>> _tryDeleteSharedMediaFiles(List<String> localIDs) {
   final List<String> actuallyDeletedIDs = [];
   try {
     return Future.forEach(localIDs, (id) async {
-      String localPath = getSharedMediaPathFromLocalID(id);
+      final String localPath = getSharedMediaPathFromLocalID(id);
       try {
         // verify the file exists as the OS may have already deleted it from cache
         if (io.File(localPath).existsSync()) {

+ 2 - 2
lib/utils/dialog_util.dart

@@ -29,7 +29,7 @@ Future<dynamic> showErrorDialog(
   String title,
   String content,
 ) {
-  AlertDialog alert = AlertDialog(
+  final AlertDialog alert = AlertDialog(
     shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
     title: Text(
       title,
@@ -77,7 +77,7 @@ Future<T> showConfettiDialog<T>({
   final pageBuilder = Builder(
     builder: builder,
   );
-  ConfettiController confettiController =
+  final ConfettiController confettiController =
       ConfettiController(duration: const Duration(seconds: 1));
   confettiController.play();
   return showDialog(

+ 1 - 1
lib/utils/diff_fetcher.dart

@@ -76,7 +76,7 @@ class DiffFetcher {
             fileDecryptionKey,
             Sodium.base642bin(file.metadataDecryptionHeader),
           );
-          Map<String, dynamic> metadata =
+          final Map<String, dynamic> metadata =
               jsonDecode(utf8.decode(encodedMetadata));
           file.applyMetadata(metadata);
           if (item['magicMetadata'] != null) {

+ 6 - 6
lib/utils/email_util.dart

@@ -126,7 +126,7 @@ Future<void> _sendLogs(
   String subject,
   String body,
 ) async {
-  String zipFilePath = await getZippedLogsFile(context);
+  final String zipFilePath = await getZippedLogsFile(context);
   final Email email = Email(
     recipients: [toEmail],
     subject: subject,
@@ -150,7 +150,7 @@ Future<String> getZippedLogsFile(BuildContext context) async {
   final tempPath = (await getTemporaryDirectory()).path;
   final zipFilePath =
       tempPath + "/logs-${Configuration.instance.getUserID() ?? 0}.zip";
-  var encoder = ZipFileEncoder();
+  final encoder = ZipFileEncoder();
   encoder.create(zipFilePath);
   encoder.addDirectory(logsDirectory);
   encoder.close();
@@ -187,8 +187,8 @@ Future<void> sendEmail(
   String body,
 }) async {
   try {
-    String clientDebugInfo = await _clientInfo();
-    EmailContent email = EmailContent(
+    final String clientDebugInfo = await _clientInfo();
+    final EmailContent email = EmailContent(
       to: [
         to,
       ],
@@ -210,7 +210,7 @@ Future<void> sendEmail(
         throw Exception('Could not launch ${params.toString()}');
       }
     } else {
-      OpenMailAppResult result = await OpenMailApp.composeNewEmailInMailApp(
+      final OpenMailAppResult result = await OpenMailApp.composeNewEmailInMailApp(
         nativePickerTitle: 'Select email app',
         emailContent: email,
       );
@@ -257,7 +257,7 @@ Future<void> sendEmail(
 
 Future<String> _clientInfo() async {
   final packageInfo = await PackageInfo.fromPlatform();
-  String debugInfo = '\n\n\n\n ------------------- \nFollowing information can '
+  final String debugInfo = '\n\n\n\n ------------------- \nFollowing information can '
       'help us in debugging if you are facing any issue '
       '\nRegistered email: ${Configuration.instance.getEmail()}'
       '\nClient: ${packageInfo.packageName}'

+ 1 - 1
lib/utils/file_sync_util.dart

@@ -167,7 +167,7 @@ Future<List<File>> _computeFiles(
 }
 
 Future<List<AssetEntity>> _getAllAssetLists(AssetPathEntity pathEntity) async {
-  List<AssetEntity> result = [];
+  final List<AssetEntity> result = [];
   int currentPage = 0;
   List<AssetEntity> currentPageResult = [];
   do {

+ 7 - 7
lib/utils/file_uploader.dart

@@ -155,7 +155,7 @@ class FileUploader {
   }
 
   void removeFromQueueWhere(final bool Function(File) fn, final Error reason) {
-    List<String> uploadsToBeRemoved = [];
+    final List<String> uploadsToBeRemoved = [];
     _queue.entries
         .where((entry) => entry.value.status == UploadStatus.notStarted)
         .forEach((pendingUpload) {
@@ -254,7 +254,7 @@ class FileUploader {
     bool forcedUpload,
   ) async {
     final connectivityResult = await (Connectivity().checkConnectivity());
-    var canUploadUnderCurrentNetworkConditions =
+    final canUploadUnderCurrentNetworkConditions =
         (connectivityResult == ConnectivityResult.wifi ||
             Configuration.instance.shouldBackupOverMobileData());
     if (!canUploadUnderCurrentNetworkConditions && !forcedUpload) {
@@ -311,7 +311,7 @@ class FileUploader {
       }
 
       Uint8List key;
-      bool isUpdatedFile =
+      final bool isUpdatedFile =
           file.uploadedFileID != null && file.updationTime == -1;
       if (isUpdatedFile) {
         _logger.info("File was updated " + file.toString());
@@ -342,7 +342,7 @@ class FileUploader {
         encryptedFilePath,
         key: key,
       );
-      var thumbnailData = mediaUploadData.thumbnail;
+      final thumbnailData = mediaUploadData.thumbnail;
 
       final encryptedThumbnailData =
           await CryptoUtil.encryptChaCha(thumbnailData, fileAttributes.key);
@@ -354,11 +354,11 @@ class FileUploader {
           .writeAsBytes(encryptedThumbnailData.encryptedData);
 
       final thumbnailUploadURL = await _getUploadURL();
-      String thumbnailObjectKey =
+      final String thumbnailObjectKey =
           await _putFile(thumbnailUploadURL, encryptedThumbnailFile);
 
       final fileUploadURL = await _getUploadURL();
-      String fileObjectKey = await _putFile(fileUploadURL, encryptedFile);
+      final String fileObjectKey = await _putFile(fileUploadURL, encryptedFile);
 
       final metadata = await file.getMetadataForUpload(mediaUploadData);
       final encryptedMetadataData = await CryptoUtil.encryptChaCha(
@@ -571,7 +571,7 @@ class FileUploader {
   }
 
   Future _onInvalidFileError(File file, InvalidFileError e) async {
-    String ext = file.title == null ? "no title" : extension(file.title);
+    final String ext = file.title == null ? "no title" : extension(file.title);
     _logger.severe(
       "Invalid file: (ext: $ext) encountered: " + file.toString(),
       e,

+ 4 - 4
lib/utils/file_uploader_util.dart

@@ -98,7 +98,7 @@ Future<MediaUploadData> _getMediaUploadDataFromAssetFile(ente.File file) async {
   if (file.fileType == FileType.livePhoto && io.Platform.isIOS) {
     final io.File videoUrl = await Motionphoto.getLivePhotoFile(file.localID);
     if (videoUrl == null || !videoUrl.existsSync()) {
-      String errMsg =
+      final String errMsg =
           "missing livePhoto url for  ${file.toString()} with subType ${file.fileSubType}";
       _logger.severe(errMsg);
       throw InvalidFileUploadState(errMsg);
@@ -111,7 +111,7 @@ Future<MediaUploadData> _getMediaUploadDataFromAssetFile(ente.File file) async {
     // .elp -> ente live photo
     final livePhotoPath = tempPath + file.generatedID.toString() + ".elp";
     _logger.fine("Uploading zipped live photo from " + livePhotoPath);
-    var encoder = ZipFileEncoder();
+    final encoder = ZipFileEncoder();
     encoder.create(livePhotoPath);
     encoder.addFile(videoUrl, "video" + extension(videoUrl.path));
     encoder.addFile(sourceFile, "image" + extension(sourceFile.path));
@@ -168,8 +168,8 @@ Future<void> _decorateEnteFileData(ente.File file, AssetEntity asset) async {
 Future<MediaUploadData> _getMediaUploadDataFromAppCache(ente.File file) async {
   io.File sourceFile;
   Uint8List thumbnailData;
-  bool isDeleted = false;
-  var localPath = getSharedMediaFilePath(file);
+  const bool isDeleted = false;
+  final localPath = getSharedMediaFilePath(file);
   sourceFile = io.File(localPath);
   if (!sourceFile.existsSync()) {
     _logger.warning("File doesn't exist in app sandbox");

+ 10 - 10
lib/utils/file_util.dart

@@ -40,7 +40,7 @@ Future<io.File> getFile(
   if (file.isRemoteFile()) {
     return getFileFromServer(file, liveVideo: liveVideo);
   } else {
-    String key = file.tag() + liveVideo.toString() + isOrigin.toString();
+    final String key = file.tag() + liveVideo.toString() + isOrigin.toString();
     final cachedFile = FileLruCache.get(key);
     if (cachedFile == null) {
       final diskFile = await _getLocalDiskFile(
@@ -69,7 +69,7 @@ Future<io.File> _getLocalDiskFile(
   bool isOrigin = false,
 }) async {
   if (file.isSharedMediaToAppSandbox()) {
-    var localFile = io.File(getSharedMediaFilePath(file));
+    final localFile = io.File(getSharedMediaFilePath(file));
     return localFile.exists().then((exist) {
       return exist ? localFile : null;
     });
@@ -194,17 +194,17 @@ Future<_LivePhoto> _downloadLivePhoto(
     }
     _logger.fine("Decoded zipped live photo from " + decryptedFile.path);
     io.File imageFileCache, videoFileCache;
-    List<int> bytes = await decryptedFile.readAsBytes();
-    Archive archive = ZipDecoder().decodeBytes(bytes);
+    final List<int> bytes = await decryptedFile.readAsBytes();
+    final Archive archive = ZipDecoder().decodeBytes(bytes);
     final tempPath = Configuration.instance.getTempDirectory();
     // Extract the contents of Zip compressed archive to disk
     for (ArchiveFile archiveFile in archive) {
       if (archiveFile.isFile) {
-        String filename = archiveFile.name;
-        String fileExtension = getExtension(archiveFile.name);
-        String decodePath =
+        final String filename = archiveFile.name;
+        final String fileExtension = getExtension(archiveFile.name);
+        final String decodePath =
             tempPath + file.uploadedFileID.toString() + filename;
-        List<int> data = archiveFile.content;
+        final List<int> data = archiveFile.content;
         if (filename.startsWith("image")) {
           final imageFile = io.File(decodePath);
           await imageFile.create(recursive: true);
@@ -259,8 +259,8 @@ Future<io.File> _downloadAndCache(
     if (decryptedFile == null) {
       return null;
     }
-    var decryptedFilePath = decryptedFile.path;
-    String fileExtension = getExtension(file.title);
+    final decryptedFilePath = decryptedFile.path;
+    final String fileExtension = getExtension(file.title);
     var outputFile = decryptedFile;
     if ((fileExtension == "unknown" && file.fileType == FileType.image) ||
         (io.Platform.isAndroid && fileExtension == "heic")) {

+ 4 - 4
lib/utils/hex.dart

@@ -27,7 +27,7 @@ class HexEncoder extends Converter<List<int>, String> {
 
   @override
   String convert(List<int> bytes) {
-    StringBuffer buffer = StringBuffer();
+    final StringBuffer buffer = StringBuffer();
     for (int part in bytes) {
       if (part & 0xff != part) {
         throw const FormatException("Non-byte integer detected");
@@ -53,10 +53,10 @@ class HexDecoder extends Converter<String, List<int>> {
     if (str.length % 2 != 0) {
       str = "0" + str;
     }
-    Uint8List result = Uint8List(str.length ~/ 2);
+    final Uint8List result = Uint8List(str.length ~/ 2);
     for (int i = 0; i < result.length; i++) {
-      int firstDigit = _alphabet.indexOf(str[i * 2]);
-      int secondDigit = _alphabet.indexOf(str[i * 2 + 1]);
+      final int firstDigit = _alphabet.indexOf(str[i * 2]);
+      final int secondDigit = _alphabet.indexOf(str[i * 2 + 1]);
       if (firstDigit == -1 || secondDigit == -1) {
         throw FormatException("Non-hex character detected in $hex");
       }

+ 2 - 2
lib/utils/magic_util.dart

@@ -52,7 +52,7 @@ Future<void> changeCollectionVisibility(
   );
   await dialog.show();
   try {
-    Map<String, dynamic> update = {kMagicKeyVisibility: newVisibility};
+    final Map<String, dynamic> update = {kMagicKeyVisibility: newVisibility};
     await CollectionsService.instance.updateMagicMetadata(collection, update);
     // Force reload home gallery to pull in the now unarchived files
     Bus.instance.fire(ForceReloadHomeGalleryEvent());
@@ -135,7 +135,7 @@ Future<void> _updatePublicMetadata(
   final dialog = createProgressDialog(context, 'please wait...');
   await dialog.show();
   try {
-    Map<String, dynamic> update = {key: value};
+    final Map<String, dynamic> update = {key: value};
     await FileMagicService.instance.updatePublicMagicMetadata(files, update);
     showShortToast(context, 'done');
     await dialog.hide();

+ 4 - 4
lib/utils/share_util.dart

@@ -44,12 +44,12 @@ Future<void> share(
 
 Rect shareButtonRect(BuildContext context, GlobalKey shareButtonKey) {
   Size size = MediaQuery.of(context).size;
-  RenderBox renderBox = shareButtonKey?.currentContext?.findRenderObject();
+  final RenderBox renderBox = shareButtonKey?.currentContext?.findRenderObject();
   if (renderBox == null) {
     return Rect.fromLTWH(0, 0, size.width, size.height / 2);
   }
   size = renderBox.size;
-  Offset position = renderBox.localToGlobal(Offset.zero);
+  final Offset position = renderBox.localToGlobal(Offset.zero);
   return Rect.fromCenter(
     center: position + Offset(size.width / 2, size.height / 2),
     width: size.width,
@@ -65,7 +65,7 @@ Future<List<File>> convertIncomingSharedMediaToFile(
   List<SharedMediaFile> sharedMedia,
   int collectionID,
 ) async {
-  List<File> localFiles = [];
+  final List<File> localFiles = [];
   for (var media in sharedMedia) {
     if (!(media.type == SharedMediaType.IMAGE ||
         media.type == SharedMediaType.VIDEO)) {
@@ -74,7 +74,7 @@ Future<List<File>> convertIncomingSharedMediaToFile(
       );
       continue;
     }
-    var enteFile = File();
+    final enteFile = File();
     // fileName: img_x.jpg
     enteFile.title = basename(media.path);
     var ioFile = dartio.File(media.path);

+ 1 - 1
lib/utils/trash_diff_fetcher.dart

@@ -62,7 +62,7 @@ class TrashDiffFetcher {
             fileDecryptionKey,
             Sodium.base642bin(trash.metadataDecryptionHeader),
           );
-          Map<String, dynamic> metadata =
+          final Map<String, dynamic> metadata =
               jsonDecode(utf8.decode(encodedMetadata));
           trash.applyMetadata(metadata);
           if (item["file"]['magicMetadata'] != null) {

+ 1 - 1
lib/utils/validator_util.dart

@@ -30,7 +30,7 @@ void validatePreVerificationStateCheck(
   }
   // check password encoding issues
   try {
-    Uint8List passwordL = utf8.encode(password);
+    final Uint8List passwordL = utf8.encode(password);
     try {
       utf8.decode(passwordL);
     } catch (e) {