diff --git a/lib/core/cache/image_cache.dart b/lib/core/cache/image_cache.dart index 2370cf9a2..c489b019c 100644 --- a/lib/core/cache/image_cache.dart +++ b/lib/core/cache/image_cache.dart @@ -1,15 +1,16 @@ -import 'dart:io' as io; + +import "dart:io"; import 'package:photos/core/cache/lru_map.dart'; class FileLruCache { - static final LRUMap _map = LRUMap(25); + static final LRUMap _map = LRUMap(25); - static io.File? get(String key) { + static File? get(String key) { return _map.get(key); } - static void put(String key, io.File value) { + static void put(String key, File value) { _map.put(key, value); } } diff --git a/lib/core/cache/thumbnail_in_memory_cache.dart b/lib/core/cache/thumbnail_in_memory_cache.dart index 18b3728dd..281c8fcba 100644 --- a/lib/core/cache/thumbnail_in_memory_cache.dart +++ b/lib/core/cache/thumbnail_in_memory_cache.dart @@ -2,7 +2,7 @@ import 'dart:typed_data'; import 'package:photos/core/cache/lru_map.dart'; import 'package:photos/core/constants.dart'; -import 'package:photos/models/ente_file.dart'; +import "package:photos/models/file.dart"; class ThumbnailInMemoryLruCache { static final LRUMap _map = LRUMap(1000); diff --git a/lib/core/configuration.dart b/lib/core/configuration.dart index 66897896a..b61945ac7 100644 --- a/lib/core/configuration.dart +++ b/lib/core/configuration.dart @@ -1,5 +1,5 @@ import 'dart:convert'; -import 'dart:io' as io; +import "dart:io"; import 'dart:typed_data'; import 'package:bip39/bip39.dart' as bip39; @@ -97,7 +97,7 @@ class Configuration { _secureStorage = const FlutterSecureStorage(); _documentsDirectory = (await getApplicationDocumentsDirectory()).path; _tempDirectory = _documentsDirectory + "/temp/"; - final tempDirectory = io.Directory(_tempDirectory); + final tempDirectory = Directory(_tempDirectory); try { final currentTime = DateTime.now().microsecondsSinceEpoch; if (tempDirectory.existsSync() && @@ -115,11 +115,11 @@ class Configuration { tempDirectory.createSync(recursive: true); final tempDirectoryPath = (await getTemporaryDirectory()).path; _thumbnailCacheDirectory = tempDirectoryPath + "/thumbnail-cache"; - io.Directory(_thumbnailCacheDirectory).createSync(recursive: true); + Directory(_thumbnailCacheDirectory).createSync(recursive: true); _sharedTempMediaDirectory = tempDirectoryPath + "/ente-shared-media"; - io.Directory(_sharedTempMediaDirectory).createSync(recursive: true); + Directory(_sharedTempMediaDirectory).createSync(recursive: true); _sharedDocumentsMediaDirectory = _documentsDirectory + "/ente-shared-media"; - io.Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true); + Directory(_sharedDocumentsMediaDirectory).createSync(recursive: true); if (!_preferences.containsKey(tokenKey)) { await _secureStorage.deleteAll(iOptions: _secureStorageOptionsIOS); } else { diff --git a/lib/db/device_files_db.dart b/lib/db/device_files_db.dart index 3eac173f8..71d9f2042 100644 --- a/lib/db/device_files_db.dart +++ b/lib/db/device_files_db.dart @@ -375,7 +375,7 @@ extension DeviceFiles on FilesDB { ); try { final db = await database; - final coverFiles = []; + final coverFiles = []; if (includeCoverThumbnail) { final fileRows = await db.rawQuery( '''SELECT * FROM FILES where local_id in (select cover_id from device_collections) group by local_id; @@ -403,7 +403,7 @@ extension DeviceFiles on FilesDB { (element) => element.localID == deviceCollection.coverId, ); if (deviceCollection.thumbnail == null) { - final File? result = + final EnteFile? result = await getDeviceCollectionThumbnail(deviceCollection.id); if (result == null) { _logger.finest( @@ -430,7 +430,7 @@ extension DeviceFiles on FilesDB { } } - Future getDeviceCollectionThumbnail(String pathID) async { + Future getDeviceCollectionThumbnail(String pathID) async { debugPrint("Call fallback method to get potential thumbnail"); final db = await database; final fileRows = await db.rawQuery( diff --git a/lib/db/files_db.dart b/lib/db/files_db.dart index fcab6625e..1a4948b83 100644 --- a/lib/db/files_db.dart +++ b/lib/db/files_db.dart @@ -1,4 +1,4 @@ -import 'dart:io' as io; +import "dart:io"; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; @@ -107,7 +107,7 @@ class FilesDB { // this opens the database (and creates it if it doesn't exist) Future _initDatabase() async { - final io.Directory documentsDirectory = + final Directory documentsDirectory = await getApplicationDocumentsDirectory(); final String path = join(documentsDirectory.path, _databaseName); _logger.info("DB path " + path); @@ -391,23 +391,23 @@ class FilesDB { Future deleteDB() async { if (kDebugMode) { debugPrint("Deleting files db"); - final io.Directory documentsDirectory = + final Directory documentsDirectory = await getApplicationDocumentsDirectory(); final String path = join(documentsDirectory.path, _databaseName); - io.File(path).deleteSync(recursive: true); + File(path).deleteSync(recursive: true); _dbFuture = null; } } Future insertMultiple( - List files, { + List files, { ConflictAlgorithm conflictAlgorithm = ConflictAlgorithm.replace, }) async { final startTime = DateTime.now(); final db = await database; var batch = db.batch(); int batchCounter = 0; - for (File file in files) { + for (EnteFile file in files) { if (batchCounter == 400) { await batch.commit(noResult: true); batch = db.batch(); @@ -435,7 +435,7 @@ class FilesDB { ); } - Future insert(File file) async { + Future insert(EnteFile file) async { final db = await instance.database; return db.insert( filesTable, @@ -444,7 +444,7 @@ class FilesDB { ); } - Future getFile(int generatedID) async { + Future getFile(int generatedID) async { final db = await instance.database; final results = await db.query( filesTable, @@ -457,7 +457,7 @@ class FilesDB { return convertToFiles(results)[0]; } - Future getUploadedFile(int uploadedID, int collectionID) async { + Future getUploadedFile(int uploadedID, int collectionID) async { final db = await instance.database; final results = await db.query( filesTable, @@ -580,13 +580,13 @@ class FilesDB { limit: limit, ); final files = convertToFiles(results); - final List filteredFiles = await applyDBFilters(files, filterOptions); + final List filteredFiles = await applyDBFilters(files, filterOptions); return FileLoadResult(filteredFiles, files.length == limit); } - List deduplicateByLocalID(List files) { + List deduplicateByLocalID(List files) { final localIDs = {}; - final List deduplicatedFiles = []; + final List deduplicatedFiles = []; for (final file in files) { final id = file.localID; if (id == null) { @@ -627,7 +627,7 @@ class FilesDB { return FileLoadResult(files, files.length == limit); } - Future> getAllFilesCollection(int collectionID) async { + Future> getAllFilesCollection(int collectionID) async { final db = await instance.database; const String whereClause = '$columnCollectionID = ?'; final List whereArgs = [collectionID]; @@ -640,7 +640,7 @@ class FilesDB { return files; } - Future> getNewFilesInCollection( + Future> getNewFilesInCollection( int collectionID, int addedTime, ) async { @@ -666,7 +666,7 @@ class FilesDB { bool? asc, }) async { if (collectionIDs.isEmpty) { - return FileLoadResult([], false); + return FileLoadResult([], false); } String inParam = ""; for (final id in collectionIDs) { @@ -695,13 +695,13 @@ class FilesDB { return FileLoadResult(files, files.length == limit); } - Future> getFilesCreatedWithinDurations( + Future> getFilesCreatedWithinDurations( List> durations, Set ignoredCollectionIDs, { String order = 'ASC', }) async { if (durations.isEmpty) { - return []; + return []; } final db = await instance.database; String whereClause = "( "; @@ -730,7 +730,7 @@ class FilesDB { // Files which user added to a collection manually but they are not // uploaded yet or files belonging to a collection which is marked for backup - Future> getFilesPendingForUpload() async { + Future> getFilesPendingForUpload() async { final db = await instance.database; final results = await db.query( filesTable, @@ -753,7 +753,7 @@ class FilesDB { return files; } - Future> getUnUploadedLocalFiles() async { + Future> getUnUploadedLocalFiles() async { final db = await instance.database; final results = await db.query( filesTable, @@ -785,7 +785,7 @@ class FilesDB { return uploadedFileIDs; } - Future getUploadedLocalFileInAnyCollection( + Future getUploadedLocalFileInAnyCollection( int uploadedFileID, int userID, ) async { @@ -911,7 +911,7 @@ class FilesDB { This method should only return localIDs which are not uploaded yet and can be mapped to incoming remote entry */ - Future> getUnlinkedLocalMatchesForRemoteFile( + Future> getUnlinkedLocalMatchesForRemoteFile( int ownerID, String localID, FileType fileType, { @@ -930,7 +930,7 @@ class FilesDB { getInt(fileType), title, ]; - if (io.Platform.isAndroid) { + if (Platform.isAndroid) { whereClause = ''' ($columnOwnerID = ? OR $columnOwnerID IS NULL) AND $columnLocalID = ? AND $columnFileType = ? AND $columnTitle=? AND $columnDeviceFolder= ? '''; @@ -952,7 +952,7 @@ class FilesDB { return convertToFiles(rows); } - Future> getUploadedFilesWithHashes( + Future> getUploadedFilesWithHashes( FileHashData hashData, FileType fileType, int ownerID, @@ -976,7 +976,7 @@ class FilesDB { return convertToFiles(rows); } - Future update(File file) async { + Future update(EnteFile file) async { final db = await instance.database; return await db.update( filesTable, @@ -986,7 +986,7 @@ class FilesDB { ); } - Future updateUploadedFileAcrossCollections(File file) async { + Future updateUploadedFileAcrossCollections(EnteFile file) async { final db = await instance.database; return await db.update( filesTable, @@ -1043,7 +1043,7 @@ class FilesDB { ); } - Future deleteLocalFile(File file) async { + Future deleteLocalFile(EnteFile file) async { final db = await instance.database; if (file.localID != null) { // delete all files with same local ID @@ -1077,7 +1077,7 @@ class FilesDB { ); } - Future> getLocalFiles(List localIDs) async { + Future> getLocalFiles(List localIDs) async { String inParam = ""; for (final localID in localIDs) { inParam += "'" + localID + "',"; @@ -1173,7 +1173,7 @@ class FilesDB { ); } - Future> getPendingUploadForCollection(int collectionID) async { + Future> getPendingUploadForCollection(int collectionID) async { final db = await instance.database; final results = await db.query( filesTable, @@ -1185,7 +1185,7 @@ class FilesDB { } Future> getLocalIDsPresentInEntries( - List existingFiles, + List existingFiles, int collectionID, ) async { String inParam = ""; @@ -1237,7 +1237,7 @@ class FilesDB { // getCollectionFileFirstOrLast returns the first or last uploaded file in // the collection based on the given collectionID and the order. - Future getCollectionFileFirstOrLast( + Future getCollectionFileFirstOrLast( int collectionID, bool sortAsc, ) async { @@ -1292,8 +1292,8 @@ class FilesDB { return rows.isNotEmpty; } - Future> getFilesFromIDs(List ids) async { - final result = {}; + Future> getFilesFromIDs(List ids) async { + final result = {}; if (ids.isEmpty) { return result; } @@ -1314,8 +1314,8 @@ class FilesDB { return result; } - Future> getFilesFromGeneratedIDs(List ids) async { - final result = {}; + Future> getFilesFromGeneratedIDs(List ids) async { + final result = {}; if (ids.isEmpty) { return result; } @@ -1336,10 +1336,10 @@ class FilesDB { return result; } - Future>> getAllFilesGroupByCollectionID( + Future>> getAllFilesGroupByCollectionID( List ids, ) async { - final result = >{}; + final result = >{}; if (ids.isEmpty) { return result; } @@ -1354,9 +1354,9 @@ class FilesDB { where: '$columnUploadedFileID IN ($inParam)', ); final files = convertToFiles(results); - for (File eachFile in files) { + for (EnteFile eachFile in files) { if (!result.containsKey(eachFile.collectionID)) { - result[eachFile.collectionID as int] = []; + result[eachFile.collectionID as int] = []; } result[eachFile.collectionID]!.add(eachFile); } @@ -1381,8 +1381,8 @@ class FilesDB { return collectionIDsOfFile; } - List convertToFiles(List> results) { - final List files = []; + List convertToFiles(List> results) { + final List files = []; for (final result in results) { files.add(_getFileFromRow(result)); } @@ -1467,12 +1467,12 @@ class FilesDB { await batch.commit(noResult: true); } - Future> getAllFilesFromDB(Set collectionsToIgnore) async { + Future> getAllFilesFromDB(Set collectionsToIgnore) async { final db = await instance.database; final List> result = await db.query(filesTable, orderBy: '$columnCreationTime DESC'); - final List files = convertToFiles(result); - final List deduplicatedFiles = await applyDBFilters( + final List files = convertToFiles(result); + final List deduplicatedFiles = await applyDBFilters( files, DBFilterOptions(ignoredCollectionIDs: collectionsToIgnore), ); @@ -1515,11 +1515,11 @@ class FilesDB { limit: limit, ); final files = convertToFiles(results); - final List filteredFiles = await applyDBFilters(files, filterOptions); + final List filteredFiles = await applyDBFilters(files, filterOptions); return FileLoadResult(filteredFiles, files.length == limit); } - Map _getRowForFile(File file) { + Map _getRowForFile(EnteFile file) { final row = {}; if (file.generatedID != null) { row[columnGeneratedID] = file.generatedID; @@ -1574,7 +1574,7 @@ class FilesDB { return row; } - Map _getRowForFileWithoutCollection(File file) { + Map _getRowForFileWithoutCollection(EnteFile file) { final row = {}; row[columnLocalID] = file.localID; row[columnUploadedFileID] = file.uploadedFileID ?? -1; @@ -1615,8 +1615,8 @@ class FilesDB { return row; } - File _getFileFromRow(Map row) { - final file = File(); + EnteFile _getFileFromRow(Map row) { + final file = EnteFile(); file.generatedID = row[columnGeneratedID]; file.localID = row[columnLocalID]; file.uploadedFileID = diff --git a/lib/events/collection_updated_event.dart b/lib/events/collection_updated_event.dart index 49f2c4a21..7c8d0abf4 100644 --- a/lib/events/collection_updated_event.dart +++ b/lib/events/collection_updated_event.dart @@ -6,7 +6,7 @@ class CollectionUpdatedEvent extends FilesUpdatedEvent { CollectionUpdatedEvent( this.collectionID, - List updatedFiles, + List updatedFiles, String? source, { EventType? type, }) : super( diff --git a/lib/events/files_updated_event.dart b/lib/events/files_updated_event.dart index e9bfe6027..1acb20da8 100644 --- a/lib/events/files_updated_event.dart +++ b/lib/events/files_updated_event.dart @@ -2,7 +2,7 @@ import 'package:photos/events/event.dart'; import 'package:photos/models/file.dart'; class FilesUpdatedEvent extends Event { - final List updatedFiles; + final List updatedFiles; final EventType type; final String source; diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 69381aca6..db1981b00 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -1,7 +1,6 @@ // GENERATED CODE - DO NOT MODIFY BY HAND import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; - import 'intl/messages_all.dart'; // ************************************************************************** diff --git a/lib/models/collection_items.dart b/lib/models/collection_items.dart index 9c54cd839..1a05a392a 100644 --- a/lib/models/collection_items.dart +++ b/lib/models/collection_items.dart @@ -3,7 +3,7 @@ import 'package:photos/models/file.dart'; class CollectionWithThumbnail { final Collection collection; - final File? thumbnail; + final EnteFile? thumbnail; CollectionWithThumbnail( this.collection, diff --git a/lib/models/device_collection.dart b/lib/models/device_collection.dart index 337290bfb..34505401d 100644 --- a/lib/models/device_collection.dart +++ b/lib/models/device_collection.dart @@ -9,7 +9,7 @@ class DeviceCollection { UploadStrategy uploadStrategy; final String? coverId; int? collectionID; - File? thumbnail; + EnteFile? thumbnail; bool hasCollectionID() { return collectionID != null && collectionID! != -1; diff --git a/lib/models/duplicate_files.dart b/lib/models/duplicate_files.dart index 8ba971501..37e2c047b 100644 --- a/lib/models/duplicate_files.dart +++ b/lib/models/duplicate_files.dart @@ -42,7 +42,7 @@ class DuplicateItems { } class DuplicateFiles { - final List files; + final List files; final int size; static final collectionsService = CollectionsService.instance; diff --git a/lib/models/ente_file.dart b/lib/models/ente_file.dart deleted file mode 100644 index 5025bc4d6..000000000 --- a/lib/models/ente_file.dart +++ /dev/null @@ -1,8 +0,0 @@ -// EnteFile is base file entry for various type of files -// like DeviceFile,RemoteFile or TrashedFile - -abstract class EnteFile { - // returns cacheKey which should be used while caching entry related to - // this file. - String cacheKey(); -} diff --git a/lib/models/file.dart b/lib/models/file.dart index fa48a5338..74b1e0da0 100644 --- a/lib/models/file.dart +++ b/lib/models/file.dart @@ -6,7 +6,6 @@ import 'package:path/path.dart'; import 'package:photo_manager/photo_manager.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; -import 'package:photos/models/ente_file.dart'; import 'package:photos/models/file_type.dart'; import 'package:photos/models/location/location.dart'; import "package:photos/models/metadata/file_magic.dart"; @@ -15,7 +14,7 @@ import 'package:photos/utils/date_time_util.dart'; import 'package:photos/utils/exif_util.dart'; import 'package:photos/utils/file_uploader_util.dart'; -class File extends EnteFile { +class EnteFile { int? generatedID; int? uploadedFileID; int? ownerID; @@ -66,10 +65,10 @@ class File extends EnteFile { static final _logger = Logger('File'); - File(); + EnteFile(); - static Future fromAsset(String pathName, AssetEntity asset) async { - final File file = File(); + static Future fromAsset(String pathName, AssetEntity asset) async { + final EnteFile file = EnteFile(); file.localID = asset.id; file.title = asset.title; file.deviceFolder = pathName; @@ -304,7 +303,7 @@ class File extends EnteFile { bool operator ==(Object o) { if (identical(this, o)) return true; - return o is File && + return o is EnteFile && o.generatedID == generatedID && o.uploadedFileID == uploadedFileID && o.localID == localID; @@ -324,7 +323,6 @@ class File extends EnteFile { generatedID.toString(); } - @override String cacheKey() { // todo: Neeraj: 19thJuly'22: evaluate and add fileHash as the key? return localID ?? uploadedFileID?.toString() ?? generatedID.toString(); diff --git a/lib/models/file_load_result.dart b/lib/models/file_load_result.dart index 5c0d55486..b98d05a5b 100644 --- a/lib/models/file_load_result.dart +++ b/lib/models/file_load_result.dart @@ -1,7 +1,7 @@ import 'package:photos/models/file.dart'; class FileLoadResult { - final List files; + final List files; final bool hasMore; FileLoadResult(this.files, this.hasMore); diff --git a/lib/models/files_split.dart b/lib/models/files_split.dart index 5d51c8596..b4bd2e516 100644 --- a/lib/models/files_split.dart +++ b/lib/models/files_split.dart @@ -1,9 +1,9 @@ import 'package:photos/models/file.dart'; class FilesSplit { - final List pendingUploads; - final List ownedByCurrentUser; - final List ownedByOtherUsers; + final List pendingUploads; + final List ownedByCurrentUser; + final List ownedByOtherUsers; FilesSplit({ required this.pendingUploads, @@ -14,8 +14,8 @@ class FilesSplit { int get totalFileOwnedCount => pendingUploads.length + ownedByCurrentUser.length; - static FilesSplit split(Iterable files, int currentUserID) { - final List ownedByCurrentUser = [], + static FilesSplit split(Iterable files, int currentUserID) { + final List ownedByCurrentUser = [], ownedByOtherUsers = [], pendingUploads = []; for (var f in files) { diff --git a/lib/models/filters/gallery_items_filter.dart b/lib/models/filters/gallery_items_filter.dart index f0e643aea..408d35433 100644 --- a/lib/models/filters/gallery_items_filter.dart +++ b/lib/models/filters/gallery_items_filter.dart @@ -1,7 +1,7 @@ import 'package:photos/models/file.dart'; class GalleryItemsFilter { - bool shouldInclude(File file) { + bool shouldInclude(EnteFile file) { return true; } } diff --git a/lib/models/filters/important_items_filter.dart b/lib/models/filters/important_items_filter.dart index 473149810..3e4431d4a 100644 --- a/lib/models/filters/important_items_filter.dart +++ b/lib/models/filters/important_items_filter.dart @@ -9,7 +9,7 @@ class ImportantItemsFilter implements GalleryItemsFilter { final _importantPaths = Configuration.instance.getPathsToBackUp(); @override - bool shouldInclude(File file) { + bool shouldInclude(EnteFile file) { if (file.uploadedFileID != null) { return true; } diff --git a/lib/models/memory.dart b/lib/models/memory.dart index 21e503ab9..aed89c3e2 100644 --- a/lib/models/memory.dart +++ b/lib/models/memory.dart @@ -1,7 +1,7 @@ import 'package:photos/models/file.dart'; class Memory { - final File file; + final EnteFile file; int _seenTime; Memory(this.file, this._seenTime); diff --git a/lib/models/search/album_search_result.dart b/lib/models/search/album_search_result.dart index fcdc8b47a..0c20e3528 100644 --- a/lib/models/search/album_search_result.dart +++ b/lib/models/search/album_search_result.dart @@ -18,12 +18,12 @@ class AlbumSearchResult extends SearchResult { } @override - File? previewThumbnail() { + EnteFile? previewThumbnail() { return collectionWithThumbnail.thumbnail; } @override - List resultFiles() { + List resultFiles() { // for album search result, we should open the album page directly throw UnimplementedError(); } diff --git a/lib/models/search/file_search_result.dart b/lib/models/search/file_search_result.dart index 076e9eacf..0954a12f8 100644 --- a/lib/models/search/file_search_result.dart +++ b/lib/models/search/file_search_result.dart @@ -2,7 +2,7 @@ import 'package:photos/models/file.dart'; import 'package:photos/models/search/search_result.dart'; class FileSearchResult extends SearchResult { - final File file; + final EnteFile file; FileSearchResult(this.file); @@ -17,12 +17,12 @@ class FileSearchResult extends SearchResult { } @override - File previewThumbnail() { + EnteFile previewThumbnail() { return file; } @override - List resultFiles() { + List resultFiles() { // for fileSearchResult, the file detailed page view will be opened throw UnimplementedError(); } diff --git a/lib/models/search/generic_search_result.dart b/lib/models/search/generic_search_result.dart index 9bb35e327..afa3eac44 100644 --- a/lib/models/search/generic_search_result.dart +++ b/lib/models/search/generic_search_result.dart @@ -4,7 +4,7 @@ import 'package:photos/models/search/search_result.dart'; class GenericSearchResult extends SearchResult { final String _name; - final List _files; + final List _files; final ResultType _type; final Function(BuildContext context)? onResultTap; @@ -21,12 +21,12 @@ class GenericSearchResult extends SearchResult { } @override - File? previewThumbnail() { + EnteFile? previewThumbnail() { return _files.first; } @override - List resultFiles() { + List resultFiles() { return _files; } } diff --git a/lib/models/search/search_result.dart b/lib/models/search/search_result.dart index 94063b0d2..37b4dff78 100644 --- a/lib/models/search/search_result.dart +++ b/lib/models/search/search_result.dart @@ -5,13 +5,13 @@ abstract class SearchResult { String name(); - File? previewThumbnail(); + EnteFile? previewThumbnail(); String heroTag() { return '${type().toString()}_${name()}'; } - List resultFiles(); + List resultFiles(); } enum ResultType { diff --git a/lib/models/selected_files.dart b/lib/models/selected_files.dart index 3119b074c..81f5a47fe 100644 --- a/lib/models/selected_files.dart +++ b/lib/models/selected_files.dart @@ -5,19 +5,19 @@ import 'package:photos/events/clear_selections_event.dart'; import 'package:photos/models/file.dart'; class SelectedFiles extends ChangeNotifier { - final files = {}; + final files = {}; ///This variable is used to track the files that were involved in last selection ///operation (select/unselect). Each [LazyGridView] checks this variable on ///change in [SelectedFiles] to see if any of it's files were involved in last ///select/unselect operation. If yes, then it will rebuild itself. - final lastSelectionOperationFiles = {}; + final lastSelectionOperationFiles = {}; - void toggleSelection(File fileToToggle) { + void toggleSelection(EnteFile fileToToggle) { // 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 - final File? alreadySelected = files.firstWhereOrNull( + final EnteFile? alreadySelected = files.firstWhereOrNull( (element) => _isMatch(fileToToggle, element), ); if (alreadySelected != null) { @@ -30,7 +30,7 @@ class SelectedFiles extends ChangeNotifier { notifyListeners(); } - void toggleGroupSelection(Set filesToToggle) { + void toggleGroupSelection(Set filesToToggle) { if (files.containsAll(filesToToggle)) { unSelectAll(filesToToggle); } else { @@ -38,14 +38,14 @@ class SelectedFiles extends ChangeNotifier { } } - void selectAll(Set filesToSelect) { + void selectAll(Set filesToSelect) { files.addAll(filesToSelect); lastSelectionOperationFiles.clear(); lastSelectionOperationFiles.addAll(filesToSelect); notifyListeners(); } - void unSelectAll(Set filesToUnselect, {bool skipNotify = false}) { + void unSelectAll(Set filesToUnselect, {bool skipNotify = false}) { files.removeWhere((file) => filesToUnselect.contains(file)); lastSelectionOperationFiles.clear(); lastSelectionOperationFiles.addAll(filesToUnselect); @@ -54,21 +54,21 @@ class SelectedFiles extends ChangeNotifier { } } - bool isFileSelected(File file) { - final File? alreadySelected = files.firstWhereOrNull( + bool isFileSelected(EnteFile file) { + final EnteFile? alreadySelected = files.firstWhereOrNull( (element) => _isMatch(file, element), ); return alreadySelected != null; } - bool isPartOfLastSelected(File file) { - final File? matchedFile = lastSelectionOperationFiles.firstWhereOrNull( + bool isPartOfLastSelected(EnteFile file) { + final EnteFile? matchedFile = lastSelectionOperationFiles.firstWhereOrNull( (element) => _isMatch(file, element), ); return matchedFile != null; } - bool _isMatch(File first, File second) { + bool _isMatch(EnteFile first, EnteFile second) { if (first.generatedID != null && second.generatedID != null) { if (first.generatedID == second.generatedID) { return true; @@ -88,7 +88,7 @@ class SelectedFiles extends ChangeNotifier { ///Retains only the files that are present in the [filesToRetain] set in ///[files]. Takes the intersection of the two sets. - void retainFiles(Set filesToRetain) { + void retainFiles(Set filesToRetain) { files.retainAll(filesToRetain); notifyListeners(); } diff --git a/lib/models/trash_file.dart b/lib/models/trash_file.dart index 6dcc89d07..f311e4c2e 100644 --- a/lib/models/trash_file.dart +++ b/lib/models/trash_file.dart @@ -1,6 +1,6 @@ import 'package:photos/models/file.dart'; -class TrashFile extends File { +class TrashFile extends EnteFile { // time when file was put in the trash for first time late int createdAt; diff --git a/lib/services/collections_service.dart b/lib/services/collections_service.dart index 9d3efb5b4..d1b4cc5d0 100644 --- a/lib/services/collections_service.dart +++ b/lib/services/collections_service.dart @@ -60,7 +60,7 @@ class CollectionsService { Collection? cachedDefaultHiddenCollection; Future>? _collectionIDToNewestFileTime; Collection? cachedUncategorizedCollection; - final Map _coverCache = {}; + final Map _coverCache = {}; final Map _countCache = {}; CollectionsService._privateConstructor() { @@ -141,7 +141,7 @@ class CollectionsService { if (shouldFireDeleteEvent) { Bus.instance.fire( LocalPhotosUpdatedEvent( - List.empty(), + List.empty(), source: "syncCollectionDeleted", ), ); @@ -158,7 +158,7 @@ class CollectionsService { Bus.instance.fire( CollectionUpdatedEvent( null, - List.empty(), + List.empty(), "collections_updated", ), ); @@ -236,7 +236,7 @@ class CollectionsService { return _collectionIDToNewestFileTime!; } - Future getCover(Collection c) async { + Future getCover(Collection c) async { final int localSyncTime = getCollectionSyncTime(c.id); final String coverKey = '${c.id}_${localSyncTime}_${c.updationTime}'; if (_coverCache.containsKey(coverKey)) { @@ -247,7 +247,7 @@ class CollectionsService { } if (c.hasCover) { final coverID = c.pubMagicMetadata.coverID ?? 0; - final File? cover = await filesDB.getUploadedFile(coverID, c.id); + final EnteFile? cover = await filesDB.getUploadedFile(coverID, c.id); if (cover != null) { _coverCache[coverKey] = cover; return Future.value(cover); @@ -264,7 +264,7 @@ class CollectionsService { return null; } - File? getCoverCache(Collection c) { + EnteFile? getCoverCache(Collection c) { final int localSyncTime = getCollectionSyncTime(c.id); final String coverKey = '${c.id}_${localSyncTime}_${c.updationTime}'; return _coverCache[coverKey]; @@ -579,7 +579,7 @@ class CollectionsService { Bus.instance.fire( CollectionUpdatedEvent( collection.id, - [], + [], "delete_collection", type: EventType.deletedFromRemote, ), @@ -874,7 +874,7 @@ class CollectionsService { await _db.insert(List.from([collection])); _collectionIDToCollections[collection.id] = collection; Bus.instance.fire( - CollectionUpdatedEvent(collection.id, [], "shareUrL"), + CollectionUpdatedEvent(collection.id, [], "shareUrL"), ); } on DioError catch (e) { if (e.response?.statusCode == 402) { @@ -903,7 +903,7 @@ class CollectionsService { await _db.insert(List.from([collection])); _collectionIDToCollections[collection.id] = collection; Bus.instance - .fire(CollectionUpdatedEvent(collection.id, [], "updateUrl")); + .fire(CollectionUpdatedEvent(collection.id, [], "updateUrl")); } on DioError catch (e) { if (e.response?.statusCode == 402) { throw SharingNotPermittedForFreeAccountsError(); @@ -926,7 +926,7 @@ class CollectionsService { Bus.instance.fire( CollectionUpdatedEvent( collection.id, - [], + [], "disableShareUrl", ), ); @@ -1100,7 +1100,7 @@ class CollectionsService { return collection; } - Future addToCollection(int collectionID, List files) async { + Future addToCollection(int collectionID, List files) async { final containsUploadedFile = files.firstWhereOrNull( (element) => element.uploadedFileID != null, ) != @@ -1157,10 +1157,10 @@ class CollectionsService { } } - Future linkLocalFileToExistingUploadedFileInAnotherCollection( + Future linkLocalFileToExistingUploadedFileInAnotherCollection( int destCollectionID, { - required File localFileToUpload, - required File existingUploadedFile, + required EnteFile localFileToUpload, + required EnteFile existingUploadedFile, }) async { final params = {}; params["collectionID"] = destCollectionID; @@ -1199,7 +1199,7 @@ class CollectionsService { } } - Future restore(int toCollectionID, List files) async { + Future restore(int toCollectionID, List files) async { final params = {}; params["collectionID"] = toCollectionID; final toCollectionKey = getCollectionKey(toCollectionID); @@ -1268,7 +1268,7 @@ class CollectionsService { Future move( int toCollectionID, int fromCollectionID, - List files, + List files, ) async { _validateMoveRequest(toCollectionID, fromCollectionID, files); files.removeWhere((element) => element.uploadedFileID == null); @@ -1335,7 +1335,7 @@ class CollectionsService { void _validateMoveRequest( int toCollectionID, int fromCollectionID, - List files, + List files, ) { if (toCollectionID == fromCollectionID) { throw AssertionError("Can't move to same album"); @@ -1353,7 +1353,7 @@ class CollectionsService { } } - Future removeFromCollection(int collectionID, List files) async { + Future removeFromCollection(int collectionID, List files) async { final params = {}; params["collectionID"] = collectionID; final batchedFiles = files.chunks(batchSize); diff --git a/lib/services/deduplication_service.dart b/lib/services/deduplication_service.dart index acabcafb0..c06c72dcf 100644 --- a/lib/services/deduplication_service.dart +++ b/lib/services/deduplication_service.dart @@ -33,7 +33,7 @@ class DeduplicationService { final result = []; final missingFileIDs = []; for (final dupe in dupes.duplicates) { - final files = []; + final files = []; for (final id in dupe.fileIDs) { final file = fileMap[id]; if (file != null) { @@ -76,18 +76,18 @@ class DeduplicationService { List clubDuplicates( List dupesBySize, { - required String? Function(File) clubbingKey, + required String? Function(EnteFile) clubbingKey, }) { final dupesBySizeAndClubKey = []; for (final sizeBasedDupe in dupesBySize) { - final Map> clubKeyToFilesMap = {}; + final Map> clubKeyToFilesMap = {}; for (final file in sizeBasedDupe.files) { final String? clubKey = clubbingKey(file); if (clubKey == null || clubKey.isEmpty) { continue; } if (!clubKeyToFilesMap.containsKey(clubKey)) { - clubKeyToFilesMap[clubKey] = []; + clubKeyToFilesMap[clubKey] = []; } clubKeyToFilesMap[clubKey]!.add(file); } @@ -104,7 +104,7 @@ class DeduplicationService { } Future> _getDuplicateFilesFromLocal() async { - final List allFiles = await FilesDB.instance.getAllFilesFromDB( + final List allFiles = await FilesDB.instance.getAllFilesFromDB( CollectionsService.instance.getHiddenCollectionIds(), ); final int ownerID = Configuration.instance.getUserID()!; @@ -114,16 +114,16 @@ class DeduplicationService { (f.ownerID ?? 0) != ownerID || (f.fileSize ?? 0) <= 0, ); - final Map> sizeToFilesMap = {}; + final Map> sizeToFilesMap = {}; for (final file in allFiles) { if (!sizeToFilesMap.containsKey(file.fileSize)) { - sizeToFilesMap[file.fileSize!] = []; + sizeToFilesMap[file.fileSize!] = []; } sizeToFilesMap[file.fileSize]!.add(file); } final List dupesBySize = []; for (final size in sizeToFilesMap.keys) { - final List files = sizeToFilesMap[size]!; + final List files = sizeToFilesMap[size]!; if (files.length > 1) { dupesBySize.add(DuplicateFiles(files, size)); } diff --git a/lib/services/favorites_service.dart b/lib/services/favorites_service.dart index 74148c662..7f26c3fe8 100644 --- a/lib/services/favorites_service.dart +++ b/lib/services/favorites_service.dart @@ -76,7 +76,7 @@ class FavoritesService { _cachedFavoritesCollectionID = null; } - bool isFavoriteCache(File file, {bool checkOnlyAlbum = false}) { + bool isFavoriteCache(EnteFile file, {bool checkOnlyAlbum = false}) { if (file.collectionID != null && _cachedFavoritesCollectionID != null && file.collectionID == _cachedFavoritesCollectionID) { @@ -94,7 +94,7 @@ class FavoritesService { return false; } - Future isFavorite(File file) async { + Future isFavorite(EnteFile file) async { final collection = await _getFavoritesCollection(); if (collection == null || file.uploadedFileID == null) { return false; @@ -105,7 +105,7 @@ class FavoritesService { ); } - void _updateFavoriteFilesCache(List files, {required bool favFlag}) { + void _updateFavoriteFilesCache(List files, {required bool favFlag}) { final Set updatedIDs = {}; final Set localIDs = {}; for (var file in files) { @@ -126,9 +126,9 @@ class FavoritesService { } } - Future addToFavorites(BuildContext context, File file) async { + Future addToFavorites(BuildContext context, EnteFile file) async { final collectionID = await _getOrCreateFavoriteCollectionID(); - final List files = [file]; + final List files = [file]; if (file.uploadedFileID == null) { file.collectionID = collectionID; await _filesDB.insert(file); @@ -142,7 +142,7 @@ class FavoritesService { Future updateFavorites( BuildContext context, - List files, + List files, bool favFlag, ) async { final int currentUserID = Configuration.instance.getUserID()!; @@ -166,7 +166,7 @@ class FavoritesService { _updateFavoriteFilesCache(files, favFlag: favFlag); } - Future removeFromFavorites(BuildContext context, File file) async { + Future removeFromFavorites(BuildContext context, EnteFile file) async { final fileID = file.uploadedFileID; if (fileID == null) { // Do nothing, ignore diff --git a/lib/services/file_magic_service.dart b/lib/services/file_magic_service.dart index 713e423ac..48066488b 100644 --- a/lib/services/file_magic_service.dart +++ b/lib/services/file_magic_service.dart @@ -32,7 +32,7 @@ class FileMagicService { static final FileMagicService instance = FileMagicService._privateConstructor(); - Future changeVisibility(List files, int visibility) async { + Future changeVisibility(List files, int visibility) async { final Map update = {magicKeyVisibility: visibility}; await _updateMagicData(files, update); if (visibility == visibleVisibility) { @@ -57,7 +57,7 @@ class FileMagicService { } Future updatePublicMagicMetadata( - List files, + List files, Map? newMetadataUpdate, { Map>? metadataUpdateMap, }) async { @@ -129,7 +129,7 @@ class FileMagicService { } Future _updateMagicData( - List files, + List files, Map newMetadataUpdate, ) async { final params = {}; diff --git a/lib/services/files_service.dart b/lib/services/files_service.dart index ffa3deb83..82f59a8aa 100644 --- a/lib/services/files_service.dart +++ b/lib/services/files_service.dart @@ -84,16 +84,16 @@ class FilesService { // Note: this method is not used anywhere, but it is kept for future // reference when we add bulk EditTime feature Future bulkEditTime( - List files, + List files, EditTimeSource source, ) async { - final ListMatch result = files.splitMatch( + final ListMatch result = files.splitMatch( (element) => element.isUploaded, ); - final List uploadedFiles = result.matched; + final List uploadedFiles = result.matched; // editTime For LocalFiles - final List localOnlyFiles = result.unmatched; - for (File localFile in localOnlyFiles) { + final List localOnlyFiles = result.unmatched; + for (EnteFile localFile in localOnlyFiles) { final timeResult = _parseTime(localFile, source); if (timeResult != null) { localFile.creationTime = timeResult; @@ -101,9 +101,9 @@ class FilesService { } await _filesDB.insertMultiple(localOnlyFiles); - final List remoteFilesToUpdate = []; + final List remoteFilesToUpdate = []; final Map> fileIDToUpdateMetadata = {}; - for (File remoteFile in uploadedFiles) { + for (EnteFile remoteFile in uploadedFiles) { // discard files not owned by user and also dedupe already processed // files if (remoteFile.ownerID != _config.getUserID()! || @@ -127,7 +127,7 @@ class FilesService { } } - int? _parseTime(File file, EditTimeSource source) { + int? _parseTime(EnteFile file, EditTimeSource source) { assert( source == EditTimeSource.fileName, "edit source ${source.name} is not supported yet", diff --git a/lib/services/filter/collection_ignore.dart b/lib/services/filter/collection_ignore.dart index 2320e097a..dad1355ae 100644 --- a/lib/services/filter/collection_ignore.dart +++ b/lib/services/filter/collection_ignore.dart @@ -9,11 +9,11 @@ class CollectionsIgnoreFilter extends Filter { Set? _ignoredUploadIDs; - CollectionsIgnoreFilter(this.collectionIDs, List files) : super() { + CollectionsIgnoreFilter(this.collectionIDs, List files) : super() { init(files); } - void init(List files) { + void init(List files) { _ignoredUploadIDs = {}; if (collectionIDs.isEmpty) return; for (var file in files) { @@ -26,7 +26,7 @@ class CollectionsIgnoreFilter extends Filter { } @override - bool filter(File file) { + bool filter(EnteFile file) { if (!file.isUploaded) { // if file is in one of the ignored collections, filter it out. This check // avoids showing un-uploaded files that are going to be uploaded to one of diff --git a/lib/services/filter/db_filters.dart b/lib/services/filter/db_filters.dart index b82861445..e5b125ee6 100644 --- a/lib/services/filter/db_filters.dart +++ b/lib/services/filter/db_filters.dart @@ -24,8 +24,8 @@ class DBFilterOptions { ); } -Future> applyDBFilters( - List files, +Future> applyDBFilters( + List files, DBFilterOptions? options, ) async { if (options == null) { @@ -48,7 +48,7 @@ Future> applyDBFilters( CollectionsIgnoreFilter(options.ignoredCollectionIDs!, files); filters.add(collectionIgnoreFilter); } - final List filterFiles = []; + final List filterFiles = []; for (final file in files) { if (filters.every((f) => f.filter(file))) { filterFiles.add(file); diff --git a/lib/services/filter/dedupe_by_upload_id.dart b/lib/services/filter/dedupe_by_upload_id.dart index 7e9282a8a..46222f8c5 100644 --- a/lib/services/filter/dedupe_by_upload_id.dart +++ b/lib/services/filter/dedupe_by_upload_id.dart @@ -7,7 +7,7 @@ class DedupeUploadIDFilter extends Filter { final Set trackedUploadIDs = {}; @override - bool filter(File file) { + bool filter(EnteFile file) { if (!file.isUploaded) { return true; } diff --git a/lib/services/filter/filter.dart b/lib/services/filter/filter.dart index dd39fbb8c..d7dbf4c97 100644 --- a/lib/services/filter/filter.dart +++ b/lib/services/filter/filter.dart @@ -1,5 +1,5 @@ import "package:photos/models/file.dart"; abstract class Filter { - bool filter(File file); + bool filter(EnteFile file); } diff --git a/lib/services/filter/type_filter.dart b/lib/services/filter/type_filter.dart index e2c30444b..f5d03fe5c 100644 --- a/lib/services/filter/type_filter.dart +++ b/lib/services/filter/type_filter.dart @@ -12,7 +12,7 @@ class TypeFilter extends Filter { }); @override - bool filter(File file) { + bool filter(EnteFile file) { return reverse ? file.fileType != type : file.fileType == type; } } diff --git a/lib/services/filter/upload_ignore.dart b/lib/services/filter/upload_ignore.dart index 584246f74..2d052e2d8 100644 --- a/lib/services/filter/upload_ignore.dart +++ b/lib/services/filter/upload_ignore.dart @@ -10,7 +10,7 @@ class UploadIgnoreFilter extends Filter { UploadIgnoreFilter(this.idToReasonMap) : super(); @override - bool filter(File file) { + bool filter(EnteFile file) { // Already uploaded files pass the filter if (file.isUploaded) return true; return !IgnoredFilesService.instance.shouldSkipUpload(idToReasonMap, file); diff --git a/lib/services/hidden_service.dart b/lib/services/hidden_service.dart index 23dadcc0c..750c92cc5 100644 --- a/lib/services/hidden_service.dart +++ b/lib/services/hidden_service.dart @@ -106,7 +106,7 @@ extension HiddenService on CollectionsService { Future hideFiles( BuildContext context, - List filesToHide, { + List filesToHide, { bool forceHide = false, }) async { final int userID = config.getUserID()!; @@ -117,7 +117,7 @@ extension HiddenService on CollectionsService { ); await dialog.show(); try { - for (File file in filesToHide) { + for (EnteFile file in filesToHide) { if (file.uploadedFileID == null) { throw AssertionError("Can only hide uploaded files"); } @@ -128,9 +128,9 @@ extension HiddenService on CollectionsService { } final defaultHiddenCollection = await getDefaultHiddenCollection(); - final Map> collectionToFilesMap = + final Map> collectionToFilesMap = await filesDB.getAllFilesGroupByCollectionID(uploadedIDs); - for (MapEntry> entry in collectionToFilesMap.entries) { + for (MapEntry> entry in collectionToFilesMap.entries) { if (entry.key == defaultHiddenCollection.id) { _logger.finest('file already part of hidden collection'); continue; diff --git a/lib/services/ignored_files_service.dart b/lib/services/ignored_files_service.dart index dd451cc46..4ab732dbe 100644 --- a/lib/services/ignored_files_service.dart +++ b/lib/services/ignored_files_service.dart @@ -39,7 +39,7 @@ class IgnoredFilesService { // to avoid making it async in nature. // This syntax is intentional as we want to ensure that ignoredIDs are loaded // from the DB before calling this method. - bool shouldSkipUpload(Map idToReasonMap, File file) { + bool shouldSkipUpload(Map idToReasonMap, EnteFile file) { final id = _getIgnoreID(file.localID, file.deviceFolder, file.title); if (id != null && id.isNotEmpty) { return idToReasonMap.containsKey(id); @@ -47,7 +47,7 @@ class IgnoredFilesService { return false; } - String? getUploadSkipReason(Map idToReasonMap, File file) { + String? getUploadSkipReason(Map idToReasonMap, EnteFile file) { final id = _getIgnoreID(file.localID, file.deviceFolder, file.title); if (id != null && id.isNotEmpty) { return idToReasonMap[id]; @@ -55,14 +55,14 @@ class IgnoredFilesService { return null; } - Future shouldSkipUploadAsync(File file) async { + Future shouldSkipUploadAsync(EnteFile file) async { final ignoredID = await idToIgnoreReasonMap; return shouldSkipUpload(ignoredID, file); } // removeIgnoredMappings is used to remove the ignore mapping for the given // set of files so that they can be uploaded. - Future removeIgnoredMappings(List files) async { + Future removeIgnoredMappings(List files) async { final List ignoredFiles = []; final Set idsToRemoveFromCache = {}; final Map currentlyIgnoredIDs = await idToIgnoreReasonMap; @@ -114,7 +114,7 @@ class IgnoredFilesService { ); } - String? getIgnoredIDForFile(File file) { + String? getIgnoredIDForFile(EnteFile file) { return _getIgnoreID( file.localID, file.deviceFolder, diff --git a/lib/services/local/local_sync_util.dart b/lib/services/local/local_sync_util.dart index 9589d2ca4..072b22c89 100644 --- a/lib/services/local/local_sync_util.dart +++ b/lib/services/local/local_sync_util.dart @@ -13,7 +13,7 @@ final _logger = Logger("FileSyncUtil"); const ignoreSizeConstraint = SizeConstraint(ignoreSize: true); const assetFetchPageSize = 2000; -Future, List>> getLocalPathAssetsAndFiles( +Future, List>> getLocalPathAssetsAndFiles( int fromTime, int toTime, ) async { @@ -27,10 +27,10 @@ Future, List>> getLocalPathAssetsAndFiles( // localID if it's already present in another album. This only impacts iOS // devices where a file can belong to multiple final Set alreadySeenLocalIDs = {}; - final List uniqueFiles = []; + final List uniqueFiles = []; for (AssetPathEntity pathEntity in pathEntities) { final List assetsInPath = await _getAllAssetLists(pathEntity); - late Tuple2, List> result; + late Tuple2, List> result; if (assetsInPath.isEmpty) { result = const Tuple2({}, []); } else { @@ -191,11 +191,11 @@ LocalDiffResult _getLocalAssetsDiff(Map args) { ); } -Future> _convertLocalAssetsToUniqueFiles( +Future> _convertLocalAssetsToUniqueFiles( List assets, ) async { final Set alreadySeenLocalIDs = {}; - final List files = []; + final List files = []; for (LocalPathAsset localPathAsset in assets) { final String localPathName = localPathAsset.pathName; for (final String localID in localPathAsset.localIDs) { @@ -206,7 +206,7 @@ Future> _convertLocalAssetsToUniqueFiles( continue; } files.add( - await File.fromAsset(localPathName, assetEntity), + await EnteFile.fromAsset(localPathName, assetEntity), ); alreadySeenLocalIDs.add(localID); } @@ -285,14 +285,14 @@ Future> _getAllAssetLists(AssetPathEntity pathEntity) async { // review: do we need to run this inside compute, after making File.FromAsset // sync. If yes, update the method documentation with reason. -Future, List>> _getLocalIDsAndFilesFromAssets( +Future, List>> _getLocalIDsAndFilesFromAssets( Map args, ) async { final pathEntity = args["pathEntity"] as AssetPathEntity; final assetList = args["assetList"]; final fromTime = args["fromTime"]; final alreadySeenLocalIDs = args["alreadySeenLocalIDs"] as Set; - final List files = []; + final List files = []; final Set localIDs = {}; for (AssetEntity entity in assetList) { localIDs.add(entity.id); @@ -304,7 +304,7 @@ Future, List>> _getLocalIDsAndFilesFromAssets( if (!alreadySeenLocalIDs.contains(entity.id) && assetCreatedOrUpdatedAfterGivenTime) { try { - final file = await File.fromAsset(pathEntity.name, entity); + final file = await EnteFile.fromAsset(pathEntity.name, entity); files.add(file); } catch (e) { _logger.severe(e); @@ -331,7 +331,7 @@ class LocalDiffResult { final List? localPathAssets; // set of File object created from localPathAssets - List? uniqueLocalFiles; + List? uniqueLocalFiles; // newPathToLocalIDs represents new entries which needs to be synced to // the local db diff --git a/lib/services/local_file_update_service.dart b/lib/services/local_file_update_service.dart index f77221536..4d635de2e 100644 --- a/lib/services/local_file_update_service.dart +++ b/lib/services/local_file_update_service.dart @@ -7,7 +7,7 @@ import "package:photos/core/configuration.dart"; import 'package:photos/core/errors.dart'; import 'package:photos/db/file_updation_db.dart'; import 'package:photos/db/files_db.dart'; -import 'package:photos/models/file.dart' as ente; +import 'package:photos/models/file.dart'; import "package:photos/models/file_type.dart"; import 'package:photos/utils/file_uploader_util.dart'; import 'package:photos/utils/file_util.dart'; @@ -116,16 +116,16 @@ class LocalFileUpdateService { ) async { _logger.info("files to process ${localIDsToProcess.length} for reupload"); final int userID = Configuration.instance.getUserID()!; - final List result = + final List result = await FilesDB.instance.getLocalFiles(localIDsToProcess); - final List localFilesForUser = []; - for (ente.File file in result) { + final List localFilesForUser = []; + for (EnteFile file in result) { if (file.ownerID == null || file.ownerID == userID) { localFilesForUser.add(file); } } final Set processedIDs = {}; - for (ente.File file in localFilesForUser) { + for (EnteFile file in localFilesForUser) { if (processedIDs.contains(file.localID)) { continue; } @@ -188,7 +188,7 @@ class LocalFileUpdateService { ); } - Future getUploadData(ente.File file) async { + Future getUploadData(EnteFile file) async { final mediaUploadData = await getUploadDataFromEnteFile(file); // delete the file from app's internal cache if it was copied to app // for upload. Shared Media should only be cleared when the upload diff --git a/lib/services/local_sync_service.dart b/lib/services/local_sync_service.dart index 81fef9c6f..e37084dc5 100644 --- a/lib/services/local_sync_service.dart +++ b/lib/services/local_sync_service.dart @@ -204,7 +204,7 @@ class LocalSyncService { return hasUnsyncedFiles; } - Future ignoreUpload(File file, InvalidFileError error) async { + Future ignoreUpload(EnteFile file, InvalidFileError error) async { if (file.localID == null || file.deviceFolder == null || file.title == null) { @@ -276,10 +276,10 @@ class LocalSyncService { required int fromTime, required int toTime, }) async { - final Tuple2, List> result = + final Tuple2, List> result = await getLocalPathAssetsAndFiles(fromTime, toTime); - final List files = result.item2; + final List files = result.item2; if (files.isNotEmpty) { // Update the mapping for device path_id to local file id. Also, keep track // of newly discovered device paths @@ -297,7 +297,7 @@ class LocalSyncService { ); await _trackUpdatedFiles(files, existingLocalDs); // keep reference of all Files for firing LocalPhotosUpdatedEvent - final List allFiles = []; + final List allFiles = []; allFiles.addAll(files); // remove existing files and insert newly imported files in the table files.removeWhere((file) => existingLocalDs.contains(file.localID)); @@ -314,7 +314,7 @@ class LocalSyncService { } Future _trackUpdatedFiles( - List files, + List files, Set existingLocalFileIDs, ) async { final List updatedLocalIDs = files diff --git a/lib/services/remote_sync_service.dart b/lib/services/remote_sync_service.dart index d4800b811..ecd9fffcf 100644 --- a/lib/services/remote_sync_service.dart +++ b/lib/services/remote_sync_service.dart @@ -357,7 +357,7 @@ class RemoteSyncService { ); final filesWithCollectionID = await _db.getLocalFiles(localIDsToSync.toList()); - final List newFilesToInsert = []; + final List newFilesToInsert = []; final Set fileFoundForLocalIDs = {}; for (var existingFile in filesWithCollectionID) { final String localID = existingFile.localID!; @@ -401,7 +401,7 @@ class RemoteSyncService { Configuration.instance.setSelectAllFoldersForBackup(false).ignore(); } Bus.instance.fire( - LocalPhotosUpdatedEvent([], source: "deviceFolderSync"), + LocalPhotosUpdatedEvent([], source: "deviceFolderSync"), ); Bus.instance.fire(BackupFoldersUpdatedEvent()); } @@ -415,7 +415,7 @@ class RemoteSyncService { */ _logger.info("Removing files for collections $collectionIDs"); for (int collectionID in collectionIDs) { - final List pendingUploads = + final List pendingUploads = await _db.getPendingUploadForCollection(collectionID); if (pendingUploads.isEmpty) { continue; @@ -434,9 +434,9 @@ class RemoteSyncService { "RemovingFiles $collectionIDs: filesInOtherCollection " "${localIDsInOtherFileEntries.length}", ); - final List entriesToUpdate = []; + final List entriesToUpdate = []; final List entriesToDelete = []; - for (File pendingUpload in pendingUploads) { + for (EnteFile pendingUpload in pendingUploads) { if (localIDsInOtherFileEntries.contains(pendingUpload.localID)) { entriesToDelete.add(pendingUpload.generatedID!); } else { @@ -486,19 +486,19 @@ class RemoteSyncService { return collection.id; } - Future> _getFilesToBeUploaded() async { - final List originalFiles = await _db.getFilesPendingForUpload(); + Future> _getFilesToBeUploaded() async { + final List originalFiles = await _db.getFilesPendingForUpload(); if (originalFiles.isEmpty) { return originalFiles; } final bool shouldRemoveVideos = !_config.shouldBackupVideos() || _shouldThrottleSync(); final ignoredIDs = await IgnoredFilesService.instance.idToIgnoreReasonMap; - bool shouldSkipUploadFunc(File file) { + bool shouldSkipUploadFunc(EnteFile file) { return IgnoredFilesService.instance.shouldSkipUpload(ignoredIDs, file); } - final List filesToBeUploaded = []; + final List filesToBeUploaded = []; int ignoredForUpload = 0; int skippedVideos = 0; for (var file in originalFiles) { @@ -521,7 +521,7 @@ class RemoteSyncService { return filesToBeUploaded; } - Future _uploadFiles(List filesToBeUploaded) async { + Future _uploadFiles(List filesToBeUploaded) async { final int ownerID = _config.getUserID()!; final updatedFileIDs = await _db.getUploadedFileIDsToBeUpdated(ownerID); if (updatedFileIDs.isNotEmpty) { @@ -590,14 +590,14 @@ class RemoteSyncService { return _completedUploads > 0; } - void _uploadFile(File file, int collectionID, List futures) { + void _uploadFile(EnteFile file, int collectionID, List futures) { final future = _uploader .upload(file, collectionID) .then((uploadedFile) => _onFileUploaded(uploadedFile)); futures.add(future); } - Future _onFileUploaded(File file) async { + Future _onFileUploaded(EnteFile file) async { Bus.instance.fire( CollectionUpdatedEvent(file.collectionID, [file], "fileUpload"), ); @@ -643,7 +643,7 @@ class RemoteSyncService { [Existing] ] */ - Future _storeDiff(List diff, int collectionID) async { + Future _storeDiff(List diff, int collectionID) async { int sharedFileNew = 0, sharedFileUpdated = 0, localUploadedFromDevice = 0, @@ -657,11 +657,11 @@ class RemoteSyncService { // as we update the generatedID for remoteFile to local file's genID final Set alreadyClaimedLocalFilesGenID = {}; - final List toBeInserted = []; - for (File remoteFile in diff) { + final List toBeInserted = []; + for (EnteFile remoteFile in diff) { // existingFile will be either set to existing collectionID+localID or // to the unclaimed aka not already linked to any uploaded file. - File? existingFile; + EnteFile? existingFile; if (remoteFile.generatedID != null) { // Case [1] Check and clear local cache when uploadedFile already exist // Note: Existing file can be null here if it's replaced by the time we @@ -785,14 +785,14 @@ class RemoteSyncService { } } - bool _shouldClearCache(File remoteFile, File existingFile) { + bool _shouldClearCache(EnteFile remoteFile, EnteFile existingFile) { if (remoteFile.hash != null && existingFile.hash != null) { return remoteFile.hash != existingFile.hash; } return remoteFile.updationTime != (existingFile.updationTime ?? 0); } - bool _shouldReloadHomeGallery(File remoteFile, File existingFile) { + bool _shouldReloadHomeGallery(EnteFile remoteFile, EnteFile existingFile) { int remoteCreationTime = remoteFile.creationTime!; if (remoteFile.pubMmdVersion > 0 && (remoteFile.pubMagicMetadata?.editedTime ?? 0) != 0) { @@ -841,7 +841,7 @@ class RemoteSyncService { // _sortByTimeAndType moves videos to end and sort by creation time (desc). // This is done to upload most recent photo first. - void _sortByTimeAndType(List file) { + void _sortByTimeAndType(List file) { file.sort((first, second) { if (first.fileType == second.fileType) { return second.creationTime!.compareTo(first.creationTime!); diff --git a/lib/services/search_service.dart b/lib/services/search_service.dart index ae23db6d5..28d882390 100644 --- a/lib/services/search_service.dart +++ b/lib/services/search_service.dart @@ -23,7 +23,7 @@ import "package:photos/utils/navigation_util.dart"; import 'package:tuple/tuple.dart'; class SearchService { - Future>? _cachedFilesFuture; + Future>? _cachedFilesFuture; final _logger = Logger((SearchService).toString()); final _collectionService = CollectionsService.instance; static const _maximumResultsLimit = 20; @@ -43,7 +43,7 @@ class SearchService { return CollectionsService.instance.getHiddenCollectionIds(); } - Future> getAllFiles() async { + Future> getAllFiles() async { if (_cachedFilesFuture != null) { return _cachedFilesFuture!; } @@ -78,7 +78,7 @@ class SearchService { c.displayName.toLowerCase().contains( query.toLowerCase(), )) { - final File? thumbnail = await _collectionService.getCover(c); + final EnteFile? thumbnail = await _collectionService.getCover(c); collectionSearchResults .add(AlbumSearchResult(CollectionWithThumbnail(c, thumbnail))); } @@ -93,7 +93,7 @@ class SearchService { final List searchResults = []; for (var yearData in YearsData.instance.yearsData) { if (yearData.year.startsWith(yearFromQuery)) { - final List filesInYear = await _getFilesInYear(yearData.duration); + final List filesInYear = await _getFilesInYear(yearData.duration); if (filesInYear.isNotEmpty) { searchResults.add( GenericSearchResult( @@ -135,7 +135,7 @@ class SearchService { String query, ) async { final List searchResults = []; - final List allFiles = await getAllFiles(); + final List allFiles = await getAllFiles(); for (var fileType in FileType.values) { final String fileTypeString = getHumanReadableString(fileType); if (fileTypeString.toLowerCase().startsWith(query.toLowerCase())) { @@ -163,10 +163,10 @@ class SearchService { return searchResults; } final RegExp pattern = RegExp(query, caseSensitive: false); - final List allFiles = await getAllFiles(); - final List captionMatch = []; - final List displayNameMatch = []; - for (File eachFile in allFiles) { + final List allFiles = await getAllFiles(); + final List captionMatch = []; + final List displayNameMatch = []; + for (EnteFile eachFile in allFiles) { if (eachFile.caption != null && pattern.hasMatch(eachFile.caption!)) { captionMatch.add(eachFile); } @@ -203,20 +203,20 @@ class SearchService { return searchResults; } - final List allFiles = await getAllFiles(); - final Map> resultMap = >{}; + final List allFiles = await getAllFiles(); + final Map> resultMap = >{}; - for (File eachFile in allFiles) { + for (EnteFile eachFile in allFiles) { final String fileName = eachFile.displayName; if (fileName.contains(query)) { final String exnType = fileName.split(".").last.toUpperCase(); if (!resultMap.containsKey(exnType)) { - resultMap[exnType] = []; + resultMap[exnType] = []; } resultMap[exnType]!.add(eachFile); } } - for (MapEntry> entry in resultMap.entries) { + for (MapEntry> entry in resultMap.entries) { searchResults.add( GenericSearchResult( ResultType.fileExtension, @@ -233,7 +233,7 @@ class SearchService { ) async { final locationTagEntities = (await LocationService.instance.getLocationTags()); - final Map, List> result = {}; + final Map, List> result = {}; final bool showNoLocationTag = query.length > 2 && "No Location Tag".toLowerCase().startsWith(query.toLowerCase()); @@ -248,7 +248,7 @@ class SearchService { return searchResults; } final allFiles = await getAllFiles(); - for (File file in allFiles) { + for (EnteFile file in allFiles) { if (file.hasLocation) { for (LocalEntity tag in result.keys) { if (LocationService.instance.isFileInsideLocationTag( @@ -290,7 +290,7 @@ class SearchService { ); } } - for (MapEntry, List> entry + for (MapEntry, List> entry in result.entries) { if (entry.value.isNotEmpty) { searchResults.add( @@ -374,7 +374,7 @@ class SearchService { .toList(); } - Future> _getFilesInYear(List durationOfYear) async { + Future> _getFilesInYear(List durationOfYear) async { return await FilesDB.instance.getFilesCreatedWithinDurations( [durationOfYear], ignoreCollections(), diff --git a/lib/services/trash_sync_service.dart b/lib/services/trash_sync_service.dart index 4178331bd..9858463d9 100644 --- a/lib/services/trash_sync_service.dart +++ b/lib/services/trash_sync_service.dart @@ -74,7 +74,7 @@ class TrashSyncService { Bus.instance.fire( CollectionUpdatedEvent( 0, - [], + [], "trash_change", ), ); @@ -132,7 +132,7 @@ class TrashSyncService { ); } - Future deleteFromTrash(List files) async { + Future deleteFromTrash(List files) async { final params = {}; final uniqueFileIds = files.map((e) => e.uploadedFileID!).toSet().toList(); final batchedFileIDs = uniqueFileIds.chunks(batchSize); diff --git a/lib/ui/account/recovery_key_page.dart b/lib/ui/account/recovery_key_page.dart index 3db0a6e79..cc33bf8e0 100644 --- a/lib/ui/account/recovery_key_page.dart +++ b/lib/ui/account/recovery_key_page.dart @@ -1,4 +1,4 @@ -import 'dart:io' as io; +import 'dart:io'; import 'package:bip39/bip39.dart' as bip39; import 'package:dotted_border/dotted_border.dart'; @@ -43,7 +43,7 @@ class RecoveryKeyPage extends StatefulWidget { class _RecoveryKeyPageState extends State { bool _hasTriedToSave = false; - final _recoveryKeyFile = io.File( + final _recoveryKeyFile = File( Configuration.instance.getTempDirectory() + "ente-recovery-key.txt", ); diff --git a/lib/ui/actions/collection/collection_file_actions.dart b/lib/ui/actions/collection/collection_file_actions.dart index e5530e7b5..1586cfaaf 100644 --- a/lib/ui/actions/collection/collection_file_actions.dart +++ b/lib/ui/actions/collection/collection_file_actions.dart @@ -81,7 +81,7 @@ extension CollectionFileActions on CollectionActions { BuildContext context, int collectionID, bool showProgressDialog, { - List? selectedFiles, + List? selectedFiles, List? sharedFiles, List? picketAssets, }) async { @@ -94,8 +94,8 @@ extension CollectionFileActions on CollectionActions { : null; await dialog?.show(); try { - final List files = []; - final List filesPendingUpload = []; + final List files = []; + final List filesPendingUpload = []; final int currentUserID = Configuration.instance.getUserID()!; if (sharedFiles != null) { filesPendingUpload.addAll( @@ -113,7 +113,7 @@ extension CollectionFileActions on CollectionActions { ); } else { for (final file in selectedFiles!) { - File? currentFile; + EnteFile? currentFile; if (file.uploadedFileID != null) { currentFile = file; } else if (file.generatedID != null) { @@ -151,7 +151,7 @@ extension CollectionFileActions on CollectionActions { } final Collection uncat = await CollectionsService.instance.getUncategorizedCollection(); - for (File unuploadedFile in filesPendingUpload) { + for (EnteFile unuploadedFile in filesPendingUpload) { final uploadedFile = await FileUploader.instance.forceUpload( unuploadedFile, uncat.id, @@ -192,7 +192,7 @@ extension CollectionFileActions on CollectionActions { Future updateFavorites( BuildContext context, - List files, + List files, bool markAsFavorite, ) async { final ProgressDialog dialog = createProgressDialog( diff --git a/lib/ui/actions/collection/collection_sharing_actions.dart b/lib/ui/actions/collection/collection_sharing_actions.dart index 3bb987af8..9e2cfa43a 100644 --- a/lib/ui/actions/collection/collection_sharing_actions.dart +++ b/lib/ui/actions/collection/collection_sharing_actions.dart @@ -103,7 +103,7 @@ class CollectionActions { Future createSharedCollectionLink( BuildContext context, - List files, + List files, ) async { final dialog = createProgressDialog( context, @@ -115,10 +115,10 @@ class CollectionActions { // create album with emptyName, use collectionCreationTime on UI to // show name logger.finest("creating album for sharing files"); - final File fileWithMinCreationTime = files.reduce( + final EnteFile fileWithMinCreationTime = files.reduce( (a, b) => (a.creationTime ?? 0) < (b.creationTime ?? 0) ? a : b, ); - final File fileWithMaxCreationTime = files.reduce( + final EnteFile fileWithMaxCreationTime = files.reduce( (a, b) => (a.creationTime ?? 0) > (b.creationTime ?? 0) ? a : b, ); final String dummyName = getNameForDateRange( @@ -365,7 +365,7 @@ class CollectionActions { } Future trashCollectionKeepingPhotos(Collection collection, BuildContext bContext) async { - final List files = + final List files = await FilesDB.instance.getAllFilesCollection(collection.id); await moveFilesFromCurrentCollection(bContext, collection, files); // collection should be empty on server now @@ -409,7 +409,7 @@ class CollectionActions { Future moveFilesFromCurrentCollection( BuildContext context, Collection collection, - Iterable files, + Iterable files, ) async { final int currentUserID = Configuration.instance.getUserID()!; final isCollectionOwner = collection.owner!.id == currentUserID; @@ -439,38 +439,38 @@ class CollectionActions { // pendingAssignMap keeps a track of files which are yet to be assigned to // to destination collection. - final Map pendingAssignMap = {}; + final Map pendingAssignMap = {}; // destCollectionToFilesMap contains the destination collection and // files entry which needs to be moved in destination. // After the end of mapping logic, the number of files entries in // pendingAssignMap should be equal to files in destCollectionToFilesMap - final Map> destCollectionToFilesMap = {}; + final Map> destCollectionToFilesMap = {}; final List uploadedIDs = []; - for (File f in split.ownedByCurrentUser) { + for (EnteFile f in split.ownedByCurrentUser) { if (f.uploadedFileID != null) { pendingAssignMap[f.uploadedFileID!] = f; uploadedIDs.add(f.uploadedFileID!); } } - final Map> collectionToFilesMap = + final Map> collectionToFilesMap = await FilesDB.instance.getAllFilesGroupByCollectionID(uploadedIDs); // Find and map the files from current collection to to entries in other // collections. This mapping is done to avoid moving all the files to // uncategorized during remove from album. - for (MapEntry> entry in collectionToFilesMap.entries) { + for (MapEntry> entry in collectionToFilesMap.entries) { if (!_isAutoMoveCandidate(collection.id, entry.key, currentUserID)) { continue; } final targetCollection = collectionsService.getCollectionByID(entry.key)!; // for each file which already exist in the destination collection // add entries in the moveDestCollectionToFiles map - for (File file in entry.value) { + for (EnteFile file in entry.value) { // Check if the uploaded file is still waiting to be mapped if (pendingAssignMap.containsKey(file.uploadedFileID)) { if (!destCollectionToFilesMap.containsKey(targetCollection.id)) { - destCollectionToFilesMap[targetCollection.id] = []; + destCollectionToFilesMap[targetCollection.id] = []; } destCollectionToFilesMap[targetCollection.id]! .add(pendingAssignMap[file.uploadedFileID!]!); @@ -483,11 +483,11 @@ class CollectionActions { final Collection uncategorizedCollection = await collectionsService.getUncategorizedCollection(); final int toCollectionID = uncategorizedCollection.id; - for (MapEntry entry in pendingAssignMap.entries) { + for (MapEntry entry in pendingAssignMap.entries) { final file = entry.value; if (pendingAssignMap.containsKey(file.uploadedFileID)) { if (!destCollectionToFilesMap.containsKey(toCollectionID)) { - destCollectionToFilesMap[toCollectionID] = []; + destCollectionToFilesMap[toCollectionID] = []; } destCollectionToFilesMap[toCollectionID]! .add(pendingAssignMap[file.uploadedFileID!]!); @@ -507,7 +507,7 @@ class CollectionActions { ); } - for (MapEntry> entry in destCollectionToFilesMap.entries) { + for (MapEntry> entry in destCollectionToFilesMap.entries) { await collectionsService.move(entry.key, collection.id, entry.value); } } diff --git a/lib/ui/actions/file/file_actions.dart b/lib/ui/actions/file/file_actions.dart index 337628e06..868e83049 100644 --- a/lib/ui/actions/file/file_actions.dart +++ b/lib/ui/actions/file/file_actions.dart @@ -15,8 +15,8 @@ import "package:photos/utils/toast_util.dart"; Future showSingleFileDeleteSheet( BuildContext context, - File file, { - Function(File)? onFileRemoved, + EnteFile file, { + Function(EnteFile)? onFileRemoved, }) async { final List buttons = []; final String fileType = file.fileType == FileType.video @@ -129,7 +129,7 @@ Future showSingleFileDeleteSheet( } } -Future showDetailsSheet(BuildContext context, File file) async { +Future showDetailsSheet(BuildContext context, EnteFile file) async { final colorScheme = getEnteColorScheme(context); return showBarModalBottomSheet( topControl: const SizedBox.shrink(), diff --git a/lib/ui/collections/album/column_item.dart b/lib/ui/collections/album/column_item.dart index 5e81148ad..685063e7e 100644 --- a/lib/ui/collections/album/column_item.dart +++ b/lib/ui/collections/album/column_item.dart @@ -37,7 +37,7 @@ class AlbumColumnItemWidget extends StatelessWidget { child: SizedBox( height: sideOfThumbnail, width: sideOfThumbnail, - child: FutureBuilder( + child: FutureBuilder( future: CollectionsService.instance.getCover(collection), builder: (context, snapshot) { if (snapshot.hasData) { diff --git a/lib/ui/collections/album/row_item.dart b/lib/ui/collections/album/row_item.dart index 05fb2a554..ba83ab490 100644 --- a/lib/ui/collections/album/row_item.dart +++ b/lib/ui/collections/album/row_item.dart @@ -57,10 +57,10 @@ class AlbumRowItemWidget extends StatelessWidget { width: sideOfThumbnail, child: Stack( children: [ - FutureBuilder( + FutureBuilder( future: CollectionsService.instance.getCover(c), builder: (context, snapshot) { - File? thumbnail; + EnteFile? thumbnail; if (snapshot.hasData) { thumbnail = snapshot.data!; } else { diff --git a/lib/ui/collections/album/vertical_list.dart b/lib/ui/collections/album/vertical_list.dart index ef06c74de..4a47b8a27 100644 --- a/lib/ui/collections/album/vertical_list.dart +++ b/lib/ui/collections/album/vertical_list.dart @@ -340,8 +340,8 @@ class AlbumVerticalListWidget extends StatelessWidget { : null; await dialog?.show(); try { - final List files = []; - final List filesPendingUpload = []; + final List files = []; + final List filesPendingUpload = []; final int currentUserID = Configuration.instance.getUserID()!; if (sharedFiles != null) { filesPendingUpload.addAll( @@ -352,7 +352,7 @@ class AlbumVerticalListWidget extends StatelessWidget { ); } else { for (final file in selectedFiles!.files) { - File? currentFile; + EnteFile? currentFile; if (file.uploadedFileID != null) { currentFile = file; } else if (file.generatedID != null) { diff --git a/lib/ui/home/memories/full_screen_memory.dart b/lib/ui/home/memories/full_screen_memory.dart index 1f6f2f460..47e6bfa51 100644 --- a/lib/ui/home/memories/full_screen_memory.dart +++ b/lib/ui/home/memories/full_screen_memory.dart @@ -207,7 +207,7 @@ class _FullScreenMemoryState extends State { } Widget _buildBottomIcons() { - final File currentFile = widget.memories[_index].file; + final EnteFile currentFile = widget.memories[_index].file; final List rowChildren = [ IconButton( icon: Icon( diff --git a/lib/ui/map/image_marker.dart b/lib/ui/map/image_marker.dart index 53a56e933..53767d323 100644 --- a/lib/ui/map/image_marker.dart +++ b/lib/ui/map/image_marker.dart @@ -1,7 +1,7 @@ import "package:photos/models/file.dart"; class ImageMarker { - final File imageFile; + final EnteFile imageFile; final double latitude; final double longitude; diff --git a/lib/ui/map/map_pull_up_gallery.dart b/lib/ui/map/map_pull_up_gallery.dart index e9dc88830..809980519 100644 --- a/lib/ui/map/map_pull_up_gallery.dart +++ b/lib/ui/map/map_pull_up_gallery.dart @@ -17,7 +17,7 @@ import "package:photos/ui/viewer/actions/file_selection_overlay_bar.dart"; import "package:photos/ui/viewer/gallery/gallery.dart"; class MapPullUpGallery extends StatefulWidget { - final StreamController> visibleImages; + final StreamController> visibleImages; final double bottomUnsafeArea; final double bottomSheetDraggableAreaHeight; static const gridCrossAxisSpacing = 4.0; @@ -104,11 +104,11 @@ class _MapPullUpGalleryState extends State { duration: const Duration(milliseconds: 200), switchInCurve: Curves.easeInOutExpo, switchOutCurve: Curves.easeInOutExpo, - child: StreamBuilder>( + child: StreamBuilder>( stream: widget.visibleImages.stream, builder: ( BuildContext context, - AsyncSnapshot> snapshot, + AsyncSnapshot> snapshot, ) { if (!snapshot.hasData) { return SizedBox( diff --git a/lib/ui/map/map_screen.dart b/lib/ui/map/map_screen.dart index 8934f2808..3a8eae786 100644 --- a/lib/ui/map/map_screen.dart +++ b/lib/ui/map/map_screen.dart @@ -20,7 +20,7 @@ import "package:photos/utils/toast_util.dart"; class MapScreen extends StatefulWidget { // Add a function parameter where the function returns a Future> - final Future> Function() filesFutureFn; + final Future> Function() filesFutureFn; const MapScreen({ super.key, @@ -35,9 +35,9 @@ class MapScreen extends StatefulWidget { class _MapScreenState extends State { List imageMarkers = []; - List allImages = []; - StreamController> visibleImages = - StreamController>.broadcast(); + List allImages = []; + StreamController> visibleImages = + StreamController>.broadcast(); MapController mapController = MapController(); bool isLoading = true; double initialZoom = 4.5; @@ -49,7 +49,7 @@ class _MapScreenState extends State { StreamSubscription? _mapMoveSubscription; Isolate? isolate; static const bottomSheetDraggableAreaHeight = 32.0; - List? prevMessage; + List? prevMessage; @override void initState() { @@ -73,10 +73,10 @@ class _MapScreenState extends State { } } - Future processFiles(List files) async { + Future processFiles(List files) async { final List tempMarkers = []; bool hasAnyLocation = false; - File? mostRecentFile; + EnteFile? mostRecentFile; for (var file in files) { if (file.hasLocation && file.location != null) { hasAnyLocation = true; @@ -141,7 +141,7 @@ class _MapScreenState extends State { ); _mapMoveSubscription = receivePort.listen((dynamic message) async { - if (message is List) { + if (message is List) { if (!message.equals(prevMessage ?? [])) { visibleImages.sink.add(message); } @@ -160,7 +160,7 @@ class _MapScreenState extends State { final imageMarkers = message.imageMarkers; final SendPort sendPort = message.sendPort; try { - final List visibleFiles = []; + final List visibleFiles = []; for (var imageMarker in imageMarkers) { final point = LatLng(imageMarker.latitude, imageMarker.longitude); if (bounds.contains(point)) { diff --git a/lib/ui/map/marker_image.dart b/lib/ui/map/marker_image.dart index e9c018b65..16a440f63 100644 --- a/lib/ui/map/marker_image.dart +++ b/lib/ui/map/marker_image.dart @@ -5,7 +5,7 @@ import "package:photos/theme/ente_theme.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart"; class MarkerImage extends StatelessWidget { - final File file; + final EnteFile file; final double seperator; const MarkerImage({super.key, required this.file, required this.seperator}); diff --git a/lib/ui/settings/backup/backup_folder_selection_page.dart b/lib/ui/settings/backup/backup_folder_selection_page.dart index 6326af208..e6034f9e5 100644 --- a/lib/ui/settings/backup/backup_folder_selection_page.dart +++ b/lib/ui/settings/backup/backup_folder_selection_page.dart @@ -407,7 +407,7 @@ class _BackupFolderSelectionPageState extends State { }); } - Widget _getThumbnail(File file, bool isSelected) { + Widget _getThumbnail(EnteFile file, bool isSelected) { return ClipRRect( borderRadius: BorderRadius.circular(8), child: SizedBox( diff --git a/lib/ui/tabs/shared/quick_link_album_item.dart b/lib/ui/tabs/shared/quick_link_album_item.dart index 9f3ab2f1a..d1612c927 100644 --- a/lib/ui/tabs/shared/quick_link_album_item.dart +++ b/lib/ui/tabs/shared/quick_link_album_item.dart @@ -31,7 +31,7 @@ class QuickLinkAlbumItem extends StatelessWidget { child: SizedBox( height: 60, width: 60, - child: FutureBuilder( + child: FutureBuilder( future: CollectionsService.instance.getCover(c), builder: (context, snapshot) { if (snapshot.hasData) { diff --git a/lib/ui/tools/collage/collage_creator_page.dart b/lib/ui/tools/collage/collage_creator_page.dart index e90b5f98e..dca8a7d1a 100644 --- a/lib/ui/tools/collage/collage_creator_page.dart +++ b/lib/ui/tools/collage/collage_creator_page.dart @@ -12,7 +12,7 @@ class CollageCreatorPage extends StatelessWidget { static const int collageItemsMin = 2; static const int collageItemsMax = 6; - final List files; + final List files; const CollageCreatorPage(this.files, {super.key}); diff --git a/lib/ui/tools/collage/collage_item_widget.dart b/lib/ui/tools/collage/collage_item_widget.dart index 095bb0c0b..9baa4c41e 100644 --- a/lib/ui/tools/collage/collage_item_widget.dart +++ b/lib/ui/tools/collage/collage_item_widget.dart @@ -9,7 +9,7 @@ class CollageItemWidget extends StatelessWidget { super.key, }); - final File file; + final EnteFile file; @override Widget build(BuildContext context) { diff --git a/lib/ui/tools/collage/collage_save_button.dart b/lib/ui/tools/collage/collage_save_button.dart index 12ab34832..f5992cc48 100644 --- a/lib/ui/tools/collage/collage_save_button.dart +++ b/lib/ui/tools/collage/collage_save_button.dart @@ -53,7 +53,7 @@ class SaveCollageButton extends StatelessWidget { showShortToast(context, S.of(context).fileFailedToSaveToGallery); return; } - final newFile = await File.fromAsset("ente Collages", newAsset); + final newFile = await EnteFile.fromAsset("ente Collages", newAsset); SyncService.instance.sync(); showShortToast(context, S.of(context).collageSaved); replacePage( diff --git a/lib/ui/tools/collage/collage_with_five_items.dart b/lib/ui/tools/collage/collage_with_five_items.dart index 6fc536dc2..ae374ebde 100644 --- a/lib/ui/tools/collage/collage_with_five_items.dart +++ b/lib/ui/tools/collage/collage_with_five_items.dart @@ -22,7 +22,7 @@ class CollageWithFiveItems extends StatefulWidget { super.key, }); - final File first, second, third, fourth, fifth; + final EnteFile first, second, third, fourth, fifth; @override State createState() => _CollageWithFiveItemsState(); diff --git a/lib/ui/tools/collage/collage_with_four_items.dart b/lib/ui/tools/collage/collage_with_four_items.dart index cf432a3b0..3e328d381 100644 --- a/lib/ui/tools/collage/collage_with_four_items.dart +++ b/lib/ui/tools/collage/collage_with_four_items.dart @@ -21,7 +21,7 @@ class CollageWithFourItems extends StatefulWidget { super.key, }); - final File first, second, third, fourth; + final EnteFile first, second, third, fourth; @override State createState() => _CollageWithFourItemsState(); diff --git a/lib/ui/tools/collage/collage_with_six_items.dart b/lib/ui/tools/collage/collage_with_six_items.dart index 25bb6051b..7209b4172 100644 --- a/lib/ui/tools/collage/collage_with_six_items.dart +++ b/lib/ui/tools/collage/collage_with_six_items.dart @@ -23,7 +23,7 @@ class CollageWithSixItems extends StatefulWidget { super.key, }); - final File first, second, third, fourth, fifth, sixth; + final EnteFile first, second, third, fourth, fifth, sixth; @override State createState() => _CollageWithSixItemsState(); diff --git a/lib/ui/tools/collage/collage_with_three_items.dart b/lib/ui/tools/collage/collage_with_three_items.dart index 47f5125f2..96fbc8fe9 100644 --- a/lib/ui/tools/collage/collage_with_three_items.dart +++ b/lib/ui/tools/collage/collage_with_three_items.dart @@ -21,7 +21,7 @@ class CollageWithThreeItems extends StatefulWidget { super.key, }); - final File first, second, third; + final EnteFile first, second, third; @override State createState() => _CollageWithThreeItemsState(); diff --git a/lib/ui/tools/collage/collage_with_two_items.dart b/lib/ui/tools/collage/collage_with_two_items.dart index 421c83b36..ad2e431e1 100644 --- a/lib/ui/tools/collage/collage_with_two_items.dart +++ b/lib/ui/tools/collage/collage_with_two_items.dart @@ -19,7 +19,7 @@ class CollageWithTwoItems extends StatefulWidget { super.key, }); - final File first, second; + final EnteFile first, second; @override State createState() => _CollageWithTwoItemsState(); diff --git a/lib/ui/tools/deduplicate_page.dart b/lib/ui/tools/deduplicate_page.dart index 97b9e99b5..505de3cb7 100644 --- a/lib/ui/tools/deduplicate_page.dart +++ b/lib/ui/tools/deduplicate_page.dart @@ -45,7 +45,7 @@ class _DeduplicatePageState extends State { ), ); - final Set _selectedFiles = {}; + final Set _selectedFiles = {}; final Map _fileSizeMap = {}; late List _duplicates; bool _shouldClubByCaptureTime = false; @@ -58,7 +58,7 @@ class _DeduplicatePageState extends State { void initState() { _duplicates = DeduplicationService.instance.clubDuplicates( widget.duplicates, - clubbingKey: (File f) => f.hash, + clubbingKey: (EnteFile f) => f.hash, ); _selectAllFilesButFirst(); @@ -268,13 +268,13 @@ class _DeduplicatePageState extends State { void _resetEntriesAndSelection() { _duplicates = widget.duplicates; - late String? Function(File) clubbingKeyFn; + late String? Function(EnteFile) clubbingKeyFn; if (_shouldClubByCaptureTime) { - clubbingKeyFn = (File f) => f.creationTime?.toString() ?? ''; + clubbingKeyFn = (EnteFile f) => f.creationTime?.toString() ?? ''; } else if (_shouldClubByFileName) { - clubbingKeyFn = (File f) => f.displayName; + clubbingKeyFn = (EnteFile f) => f.displayName; } else { - clubbingKeyFn = (File f) => f.hash; + clubbingKeyFn = (EnteFile f) => f.hash; } _duplicates = DeduplicationService.instance.clubDuplicates( _duplicates, @@ -442,7 +442,7 @@ class _DeduplicatePageState extends State { ); } - Widget _buildFile(BuildContext context, File file, int index) { + Widget _buildFile(BuildContext context, EnteFile file, int index) { return GestureDetector( onTap: () { if (_selectedFiles.contains(file)) { diff --git a/lib/ui/tools/editor/image_editor_page.dart b/lib/ui/tools/editor/image_editor_page.dart index 04b97eee5..d58f896a3 100644 --- a/lib/ui/tools/editor/image_editor_page.dart +++ b/lib/ui/tools/editor/image_editor_page.dart @@ -31,7 +31,7 @@ import 'package:syncfusion_flutter_sliders/sliders.dart'; class ImageEditorPage extends StatefulWidget { final ImageProvider imageProvider; final DetailPageConfiguration detailPageConfig; - final ente.File originalFile; + final ente.EnteFile originalFile; const ImageEditorPage( this.imageProvider, @@ -351,7 +351,7 @@ class _ImageEditorPageState extends State { PhotoManager.stopChangeNotify(); final AssetEntity? newAsset = await (PhotoManager.editor.saveImage(result, title: fileName)); - final newFile = await ente.File.fromAsset( + final newFile = await ente.EnteFile.fromAsset( widget.originalFile.deviceFolder ?? '', newAsset!, ); diff --git a/lib/ui/viewer/actions/delete_empty_albums.dart b/lib/ui/viewer/actions/delete_empty_albums.dart index a6c77d5b2..875b68ec9 100644 --- a/lib/ui/viewer/actions/delete_empty_albums.dart +++ b/lib/ui/viewer/actions/delete_empty_albums.dart @@ -90,7 +90,7 @@ class _DeleteEmptyAlbumsState extends State { Bus.instance.fire( CollectionUpdatedEvent( 0, - [], + [], "empty_albums_deleted", ), ); diff --git a/lib/ui/viewer/actions/file_selection_actions_widget.dart b/lib/ui/viewer/actions/file_selection_actions_widget.dart index 803c35666..2ea649b77 100644 --- a/lib/ui/viewer/actions/file_selection_actions_widget.dart +++ b/lib/ui/viewer/actions/file_selection_actions_widget.dart @@ -63,7 +63,7 @@ class _FileSelectionActionsWidgetState @override void initState() { currentUserID = Configuration.instance.getUserID()!; - split = FilesSplit.split([], currentUserID); + split = FilesSplit.split([], currentUserID); widget.selectedFiles.addListener(_selectFileChangeListener); collectionActions = CollectionActions(CollectionsService.instance); isCollectionOwner = diff --git a/lib/ui/viewer/file/detail_page.dart b/lib/ui/viewer/file/detail_page.dart index 79fc9206f..1c7df8981 100644 --- a/lib/ui/viewer/file/detail_page.dart +++ b/lib/ui/viewer/file/detail_page.dart @@ -8,8 +8,8 @@ import 'package:photos/core/errors.dart'; import "package:photos/generated/l10n.dart"; import 'package:photos/models/file.dart'; import 'package:photos/ui/tools/editor/image_editor_page.dart'; -import 'package:photos/ui/viewer/file/fading_app_bar.dart'; -import 'package:photos/ui/viewer/file/fading_bottom_bar.dart'; +import "package:photos/ui/viewer/file/file_app_bar.dart"; +import "package:photos/ui/viewer/file/file_bottom_bar.dart"; import 'package:photos/ui/viewer/file/file_widget.dart'; import 'package:photos/ui/viewer/gallery/gallery.dart'; import 'package:photos/utils/dialog_util.dart'; @@ -23,7 +23,7 @@ enum DetailPageMode { } class DetailPageConfiguration { - final List files; + final List files; final GalleryLoader? asyncLoader; final int selectedIndex; final String tagPrefix; @@ -40,7 +40,7 @@ class DetailPageConfiguration { }); DetailPageConfiguration copyWith({ - List? files, + List? files, GalleryLoader? asyncLoader, int? selectedIndex, String? tagPrefix, @@ -69,7 +69,7 @@ class _DetailPageState extends State { static const kLoadLimit = 100; final _logger = Logger("DetailPageState"); bool _shouldDisableScroll = false; - List? _files; + List? _files; late PageController _pageController; final _selectedIndexNotifier = ValueNotifier(0); bool _hasLoadedTillStart = false; @@ -116,7 +116,7 @@ class _DetailPageState extends State { preferredSize: const Size.fromHeight(80), child: ValueListenableBuilder( builder: (BuildContext context, int selectedIndex, _) { - return FadingAppBar( + return FileAppBar( _files![selectedIndex], _onFileRemoved, Configuration.instance.getUserID(), @@ -136,7 +136,7 @@ class _DetailPageState extends State { _buildPageView(context), ValueListenableBuilder( builder: (BuildContext context, int selectedIndex, _) { - return FadingBottomBar( + return FileBottomBar( _files![_selectedIndexNotifier.value], _onEditFileRequested, widget.config.mode == DetailPageMode.minimalistic, @@ -253,7 +253,7 @@ class _DetailPageState extends State { setState(() { // Returned result could be a subtype of File // ignore: unnecessary_cast - final files = result.files.reversed.map((e) => e as File).toList(); + final files = result.files.reversed.map((e) => e as EnteFile).toList(); if (!result.hasMore) { _hasLoadedTillStart = true; } @@ -296,7 +296,7 @@ class _DetailPageState extends State { } } - Future _onFileRemoved(File file) async { + Future _onFileRemoved(EnteFile file) async { final totalFiles = _files!.length; if (totalFiles == 1) { // Deleted the only file @@ -324,7 +324,7 @@ class _DetailPageState extends State { } } - Future _onEditFileRequested(File file) async { + Future _onEditFileRequested(EnteFile file) async { if (file.uploadedFileID != null && file.ownerID != Configuration.instance.getUserID()) { _logger.severe( diff --git a/lib/ui/viewer/file/exif_info_dialog.dart b/lib/ui/viewer/file/exif_info_dialog.dart index d090b8f68..db56bf36d 100644 --- a/lib/ui/viewer/file/exif_info_dialog.dart +++ b/lib/ui/viewer/file/exif_info_dialog.dart @@ -8,7 +8,7 @@ import 'package:photos/ui/common/loading_widget.dart'; import 'package:photos/utils/exif_util.dart'; class ExifInfoDialog extends StatelessWidget { - final File file; + final EnteFile file; const ExifInfoDialog(this.file, {Key? key}) : super(key: key); @override diff --git a/lib/ui/viewer/file/fading_app_bar.dart b/lib/ui/viewer/file/file_app_bar.dart similarity index 95% rename from lib/ui/viewer/file/fading_app_bar.dart rename to lib/ui/viewer/file/file_app_bar.dart index 35431917a..908cd9472 100644 --- a/lib/ui/viewer/file/fading_app_bar.dart +++ b/lib/ui/viewer/file/file_app_bar.dart @@ -1,5 +1,4 @@ import 'dart:io'; -import 'dart:io' as io; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -30,15 +29,15 @@ import 'package:photos/utils/file_util.dart'; import "package:photos/utils/magic_util.dart"; import 'package:photos/utils/toast_util.dart'; -class FadingAppBar extends StatefulWidget { - final File file; - final Function(File) onFileRemoved; +class FileAppBar extends StatefulWidget { + final EnteFile file; + final Function(EnteFile) onFileRemoved; final double height; final bool shouldShowActions; final int? userID; final ValueNotifier enableFullScreenNotifier; - const FadingAppBar( + const FileAppBar( this.file, this.onFileRemoved, this.userID, @@ -49,10 +48,10 @@ class FadingAppBar extends StatefulWidget { }) : super(key: key); @override - FadingAppBarState createState() => FadingAppBarState(); + FileAppBarState createState() => FileAppBarState(); } -class FadingAppBarState extends State { +class FileAppBarState extends State { final _logger = Logger("FadingAppBar"); @override @@ -277,7 +276,7 @@ class FadingAppBarState extends State { ); } - Future _toggleFileArchiveStatus(File file) async { + Future _toggleFileArchiveStatus(EnteFile file) async { final bool isArchived = widget.file.magicMetadata.visibility == archiveVisibility; await changeVisibility( @@ -290,7 +289,7 @@ class FadingAppBarState extends State { } } - Future _download(File file) async { + Future _download(EnteFile file) async { final dialog = createProgressDialog(context, "Downloading..."); await dialog.show(); try { @@ -298,7 +297,7 @@ class FadingAppBarState extends State { final bool downloadLivePhotoOnDroid = type == FileType.livePhoto && Platform.isAndroid; AssetEntity? savedAsset; - final io.File? fileToSave = await getFile(file); + final File? fileToSave = await getFile(file); //Disabling notifications for assets changing to insert the file into //files db before triggering a sync. PhotoManager.stopChangeNotify(); @@ -309,7 +308,7 @@ class FadingAppBarState extends State { savedAsset = await PhotoManager.editor .saveVideo(fileToSave!, title: file.title!); } else if (type == FileType.livePhoto) { - final io.File? liveVideoFile = + final File? liveVideoFile = await getFileFromServer(file, liveVideo: true); if (liveVideoFile == null) { throw AssertionError("Live video can not be null"); @@ -350,9 +349,9 @@ class FadingAppBarState extends State { } Future _saveLivePhotoOnDroid( - io.File image, - io.File video, - File enteFile, + File image, + File video, + EnteFile enteFile, ) async { debugPrint("Downloading LivePhoto on Droid"); AssetEntity? savedAsset = await (PhotoManager.editor @@ -386,11 +385,11 @@ class FadingAppBarState extends State { await IgnoredFilesService.instance.cacheAndInsert([ignoreVideoFile]); } - Future _setAs(File file) async { + Future _setAs(EnteFile file) async { final dialog = createProgressDialog(context, S.of(context).pleaseWait); await dialog.show(); try { - final io.File? fileToSave = await (getFile(file)); + final File? fileToSave = await (getFile(file)); if (fileToSave == null) { throw Exception("Fail to get file for setAs operation"); } diff --git a/lib/ui/viewer/file/fading_bottom_bar.dart b/lib/ui/viewer/file/file_bottom_bar.dart similarity index 95% rename from lib/ui/viewer/file/fading_bottom_bar.dart rename to lib/ui/viewer/file/file_bottom_bar.dart index fb796a238..7f5dd5d68 100644 --- a/lib/ui/viewer/file/fading_bottom_bar.dart +++ b/lib/ui/viewer/file/file_bottom_bar.dart @@ -14,15 +14,15 @@ import 'package:photos/ui/collections/collection_action_sheet.dart'; import 'package:photos/utils/delete_file_util.dart'; import 'package:photos/utils/share_util.dart'; -class FadingBottomBar extends StatefulWidget { - final File file; - final Function(File) onEditRequested; - final Function(File) onFileRemoved; +class FileBottomBar extends StatefulWidget { + final EnteFile file; + final Function(EnteFile) onEditRequested; + final Function(EnteFile) onFileRemoved; final bool showOnlyInfoButton; final int? userID; final ValueNotifier enableFullScreenNotifier; - const FadingBottomBar( + const FileBottomBar( this.file, this.onEditRequested, this.showOnlyInfoButton, { @@ -33,10 +33,10 @@ class FadingBottomBar extends StatefulWidget { }) : super(key: key); @override - FadingBottomBarState createState() => FadingBottomBarState(); + FileBottomBarState createState() => FileBottomBarState(); } -class FadingBottomBarState extends State { +class FileBottomBarState extends State { final GlobalKey shareButtonKey = GlobalKey(); @override @@ -206,7 +206,7 @@ class FadingBottomBarState extends State { ); } - Future _showSingleFileDeleteSheet(File file) async { + Future _showSingleFileDeleteSheet(EnteFile file) async { await showSingleFileDeleteSheet( context, file, @@ -262,7 +262,7 @@ class FadingBottomBarState extends State { ); } - Future _displayDetails(File file) async { + Future _displayDetails(EnteFile file) async { await showDetailsSheet(context, file); } } diff --git a/lib/ui/viewer/file/file_caption_widget.dart b/lib/ui/viewer/file/file_caption_widget.dart index 3a57713be..5288ab6d7 100644 --- a/lib/ui/viewer/file/file_caption_widget.dart +++ b/lib/ui/viewer/file/file_caption_widget.dart @@ -46,7 +46,7 @@ class FileCaptionReadyOnly extends StatelessWidget { } class FileCaptionWidget extends StatefulWidget { - final File file; + final EnteFile file; const FileCaptionWidget({required this.file, super.key}); diff --git a/lib/ui/viewer/file/file_details_widget.dart b/lib/ui/viewer/file/file_details_widget.dart index 9b6905da0..6c134b1a7 100644 --- a/lib/ui/viewer/file/file_details_widget.dart +++ b/lib/ui/viewer/file/file_details_widget.dart @@ -24,7 +24,7 @@ import "package:photos/ui/viewer/file_details/objects_item_widget.dart"; import "package:photos/utils/exif_util.dart"; class FileDetailsWidget extends StatefulWidget { - final File file; + final EnteFile file; const FileDetailsWidget( this.file, { diff --git a/lib/ui/viewer/file/file_widget.dart b/lib/ui/viewer/file/file_widget.dart index b7647e6af..00876d7b4 100644 --- a/lib/ui/viewer/file/file_widget.dart +++ b/lib/ui/viewer/file/file_widget.dart @@ -6,7 +6,7 @@ import 'package:photos/ui/viewer/file/video_widget.dart'; import 'package:photos/ui/viewer/file/zoomable_live_image.dart'; class FileWidget extends StatelessWidget { - final File file; + final EnteFile file; final String? tagPrefix; final Function(bool)? shouldDisableScroll; final Function(bool)? playbackCallback; diff --git a/lib/ui/viewer/file/thumbnail_widget.dart b/lib/ui/viewer/file/thumbnail_widget.dart index 62fbb3894..63722dc40 100644 --- a/lib/ui/viewer/file/thumbnail_widget.dart +++ b/lib/ui/viewer/file/thumbnail_widget.dart @@ -20,7 +20,7 @@ import 'package:photos/utils/file_util.dart'; import 'package:photos/utils/thumbnail_util.dart'; class ThumbnailWidget extends StatefulWidget { - final File? file; + final EnteFile? file; final BoxFit fit; final bool shouldShowSyncStatus; final bool shouldShowArchiveStatus; diff --git a/lib/ui/viewer/file/video_widget.dart b/lib/ui/viewer/file/video_widget.dart index 3685d448d..023783214 100644 --- a/lib/ui/viewer/file/video_widget.dart +++ b/lib/ui/viewer/file/video_widget.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import 'dart:io' as io; +import 'dart:io'; import 'package:chewie/chewie.dart'; import 'package:flutter/cupertino.dart'; @@ -21,7 +21,7 @@ import 'package:visibility_detector/visibility_detector.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; class VideoWidget extends StatefulWidget { - final File file; + final EnteFile file; final bool? autoPlay; final String? tagPrefix; final Function(bool)? playbackCallback; @@ -53,7 +53,7 @@ class _VideoWidgetState extends State { _loadNetworkVideo(); _setFileSizeIfNull(); } else if (widget.file.isSharedMediaToAppSandbox) { - final localFile = io.File(getSharedMediaFilePath(widget.file)); + final localFile = File(getSharedMediaFilePath(widget.file)); if (localFile.existsSync()) { _logger.fine("loading from app cache"); _setVideoPlayerController(file: localFile); @@ -125,7 +125,7 @@ class _VideoWidgetState extends State { void _setVideoPlayerController({ String? url, - io.File? file, + File? file, }) { if (!mounted) { // Note: Do not initiale video player if widget is not mounted. diff --git a/lib/ui/viewer/file/zoomable_image.dart b/lib/ui/viewer/file/zoomable_image.dart index 7066279c0..e7d436969 100644 --- a/lib/ui/viewer/file/zoomable_image.dart +++ b/lib/ui/viewer/file/zoomable_image.dart @@ -21,7 +21,7 @@ import 'package:photos/utils/image_util.dart'; import 'package:photos/utils/thumbnail_util.dart'; class ZoomableImage extends StatefulWidget { - final File photo; + final EnteFile photo; final Function(bool)? shouldDisableScroll; final String? tagPrefix; final Decoration? backgroundDecoration; @@ -43,7 +43,7 @@ class ZoomableImage extends StatefulWidget { class _ZoomableImageState extends State with SingleTickerProviderStateMixin { late Logger _logger; - late File _photo; + late EnteFile _photo; ImageProvider? _imageProvider; bool _loadedSmallThumbnail = false; bool _loadingLargeThumbnail = false; diff --git a/lib/ui/viewer/file/zoomable_live_image.dart b/lib/ui/viewer/file/zoomable_live_image.dart index 283930a42..5b12dd909 100644 --- a/lib/ui/viewer/file/zoomable_live_image.dart +++ b/lib/ui/viewer/file/zoomable_live_image.dart @@ -1,4 +1,3 @@ -import 'dart:io' as io; import "dart:io"; import 'package:chewie/chewie.dart'; @@ -19,7 +18,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:video_player/video_player.dart'; class ZoomableLiveImage extends StatefulWidget { - final File file; + final EnteFile file; final Function(bool)? shouldDisableScroll; final String? tagPrefix; final Decoration? backgroundDecoration; @@ -39,7 +38,7 @@ class ZoomableLiveImage extends StatefulWidget { class _ZoomableLiveImageState extends State with SingleTickerProviderStateMixin { final Logger _logger = Logger("ZoomableLiveImage"); - late File _file; + late EnteFile _file; bool _showVideo = false; bool _isLoadingVideoPlayer = false; @@ -125,7 +124,7 @@ class _ZoomableLiveImageState extends State return; } _isLoadingVideoPlayer = true; - final io.File? videoFile = _file.fileType == FileType.livePhoto + final File? videoFile = _file.fileType == FileType.livePhoto ? await _getLivePhotoVideo() : await _getMotionPhotoVideo(); @@ -137,12 +136,12 @@ class _ZoomableLiveImageState extends State _isLoadingVideoPlayer = false; } - Future _getLivePhotoVideo() async { + Future _getLivePhotoVideo() async { if (_file.isRemoteFile && !(await isFileCached(_file, liveVideo: true))) { showShortToast(context, S.of(context).downloading); } - io.File? videoFile = await getFile(widget.file, liveVideo: true) + File? videoFile = await getFile(widget.file, liveVideo: true) .timeout(const Duration(seconds: 15)) .onError((dynamic e, s) { _logger.info("getFile failed ${_file.tag}", e); @@ -164,12 +163,12 @@ class _ZoomableLiveImageState extends State return videoFile; } - Future _getMotionPhotoVideo() async { + Future _getMotionPhotoVideo() async { if (_file.isRemoteFile && !(await isFileCached(_file))) { showShortToast(context, S.of(context).downloading); } - final io.File? imageFile = await getFile( + final File? imageFile = await getFile( widget.file, isOrigin: !Platform.isAndroid, ).timeout(const Duration(seconds: 15)).onError((dynamic e, s) { @@ -196,7 +195,7 @@ class _ZoomableLiveImageState extends State return null; } - VideoPlayerController _setVideoPlayerController({required io.File file}) { + VideoPlayerController _setVideoPlayerController({required File file}) { final videoPlayerController = VideoPlayerController.file(file); return _videoPlayerController = videoPlayerController ..initialize().whenComplete(() { diff --git a/lib/ui/viewer/file_details/added_by_widget.dart b/lib/ui/viewer/file_details/added_by_widget.dart index 304999566..b6e319c1b 100644 --- a/lib/ui/viewer/file_details/added_by_widget.dart +++ b/lib/ui/viewer/file_details/added_by_widget.dart @@ -5,7 +5,7 @@ import "package:photos/services/collections_service.dart"; import "package:photos/theme/ente_theme.dart"; class AddedByWidget extends StatelessWidget { - final File file; + final EnteFile file; final int currentUserID; const AddedByWidget(this.file, this.currentUserID, {super.key}); diff --git a/lib/ui/viewer/file_details/albums_item_widget.dart b/lib/ui/viewer/file_details/albums_item_widget.dart index 899f04ce0..158a26366 100644 --- a/lib/ui/viewer/file_details/albums_item_widget.dart +++ b/lib/ui/viewer/file_details/albums_item_widget.dart @@ -12,7 +12,7 @@ import "package:photos/ui/viewer/gallery/collection_page.dart"; import "package:photos/utils/navigation_util.dart"; class AlbumsItemWidget extends StatelessWidget { - final File file; + final EnteFile file; final int currentUserID; const AlbumsItemWidget( this.file, diff --git a/lib/ui/viewer/file_details/backed_up_time_item_widget.dart b/lib/ui/viewer/file_details/backed_up_time_item_widget.dart index c82469e79..12afaea82 100644 --- a/lib/ui/viewer/file_details/backed_up_time_item_widget.dart +++ b/lib/ui/viewer/file_details/backed_up_time_item_widget.dart @@ -6,7 +6,7 @@ import "package:photos/ui/components/info_item_widget.dart"; import "package:photos/utils/date_time_util.dart"; class BackedUpTimeItemWidget extends StatelessWidget { - final File file; + final EnteFile file; const BackedUpTimeItemWidget(this.file, {super.key}); @override diff --git a/lib/ui/viewer/file_details/creation_time_item_widget.dart b/lib/ui/viewer/file_details/creation_time_item_widget.dart index b8ec8444d..ced525aba 100644 --- a/lib/ui/viewer/file_details/creation_time_item_widget.dart +++ b/lib/ui/viewer/file_details/creation_time_item_widget.dart @@ -9,7 +9,7 @@ import "package:photos/utils/date_time_util.dart"; import "package:photos/utils/magic_util.dart"; class CreationTimeItem extends StatefulWidget { - final File file; + final EnteFile file; final int currentUserID; const CreationTimeItem(this.file, this.currentUserID, {super.key}); @@ -45,7 +45,7 @@ class _CreationTimeItemState extends State { ); } - void _showDateTimePicker(File file) async { + void _showDateTimePicker(EnteFile file) async { final dateResult = await DatePickerBdaya.showDatePicker( context, minTime: DateTime(1800, 1, 1), diff --git a/lib/ui/viewer/file_details/exif_item_widgets.dart b/lib/ui/viewer/file_details/exif_item_widgets.dart index 8b4bb882b..221036ae6 100644 --- a/lib/ui/viewer/file_details/exif_item_widgets.dart +++ b/lib/ui/viewer/file_details/exif_item_widgets.dart @@ -46,7 +46,7 @@ class BasicExifItemWidget extends StatelessWidget { } class AllExifItemWidget extends StatefulWidget { - final File file; + final EnteFile file; final Map? exif; const AllExifItemWidget( this.file, @@ -78,7 +78,7 @@ class _AllExifItemWidgetState extends State { Future> _exifButton( BuildContext context, - File file, + EnteFile file, Map? exif, ) async { late final String label; diff --git a/lib/ui/viewer/file_details/favorite_widget.dart b/lib/ui/viewer/file_details/favorite_widget.dart index de2cb37b0..b741ad838 100644 --- a/lib/ui/viewer/file_details/favorite_widget.dart +++ b/lib/ui/viewer/file_details/favorite_widget.dart @@ -9,7 +9,7 @@ import "package:photos/utils/dialog_util.dart"; import "package:photos/utils/toast_util.dart"; class FavoriteWidget extends StatefulWidget { - final File file; + final EnteFile file; const FavoriteWidget( this.file, { diff --git a/lib/ui/viewer/file_details/file_properties_item_widget.dart b/lib/ui/viewer/file_details/file_properties_item_widget.dart index 903f4d3ff..1b9daeb73 100644 --- a/lib/ui/viewer/file_details/file_properties_item_widget.dart +++ b/lib/ui/viewer/file_details/file_properties_item_widget.dart @@ -9,7 +9,7 @@ import "package:photos/utils/file_util.dart"; import "package:photos/utils/magic_util.dart"; class FilePropertiesItemWidget extends StatefulWidget { - final File file; + final EnteFile file; final bool isImage; final Map exifData; final int currentUserID; diff --git a/lib/ui/viewer/file_details/objects_item_widget.dart b/lib/ui/viewer/file_details/objects_item_widget.dart index 035fb6153..c234a6a13 100644 --- a/lib/ui/viewer/file_details/objects_item_widget.dart +++ b/lib/ui/viewer/file_details/objects_item_widget.dart @@ -9,7 +9,7 @@ import "package:photos/ui/components/info_item_widget.dart"; import "package:photos/utils/thumbnail_util.dart"; class ObjectsItemWidget extends StatelessWidget { - final File file; + final EnteFile file; const ObjectsItemWidget(this.file, {super.key}); @override @@ -24,7 +24,7 @@ class ObjectsItemWidget extends StatelessWidget { Future> _objectTags( BuildContext context, - File file, + EnteFile file, ) async { try { final chipButtons = []; diff --git a/lib/ui/viewer/file_details/upload_icon_widget.dart b/lib/ui/viewer/file_details/upload_icon_widget.dart index 56dad4b91..8d8dcb03d 100644 --- a/lib/ui/viewer/file_details/upload_icon_widget.dart +++ b/lib/ui/viewer/file_details/upload_icon_widget.dart @@ -17,7 +17,7 @@ import "package:photos/ui/common/loading_widget.dart"; import "package:photos/utils/toast_util.dart"; class UploadIconWidget extends StatefulWidget { - final File file; + final EnteFile file; const UploadIconWidget({super.key, required this.file}); diff --git a/lib/ui/viewer/gallery/collection_page.dart b/lib/ui/viewer/gallery/collection_page.dart index 667fa895c..e15758a11 100644 --- a/lib/ui/viewer/gallery/collection_page.dart +++ b/lib/ui/viewer/gallery/collection_page.dart @@ -43,7 +43,7 @@ class CollectionPage extends StatelessWidget { c.collection, Configuration.instance.getUserID()!, ); - final List? initialFiles = + final List? initialFiles = c.thumbnail != null ? [c.thumbnail!] : null; final gallery = Gallery( asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) async { diff --git a/lib/ui/viewer/gallery/component/gallery_file_widget.dart b/lib/ui/viewer/gallery/component/gallery_file_widget.dart index b549c31a7..e154e0800 100644 --- a/lib/ui/viewer/gallery/component/gallery_file_widget.dart +++ b/lib/ui/viewer/gallery/component/gallery_file_widget.dart @@ -15,13 +15,13 @@ import "package:photos/utils/file_util.dart"; import "package:photos/utils/navigation_util.dart"; class GalleryFileWidget extends StatelessWidget { - final File file; + final EnteFile file; final SelectedFiles? selectedFiles; final bool limitSelectionToOne; final String tag; final int photoGridSize; final int? currentUserID; - final List filesInGroup; + final List filesInGroup; final GalleryLoader asyncLoader; const GalleryFileWidget({ required this.file, @@ -103,18 +103,18 @@ class GalleryFileWidget extends StatelessWidget { ); } - void _toggleFileSelection(File file) { + void _toggleFileSelection(EnteFile file) { selectedFiles!.toggleSelection(file); } - void _onTapWithSelectionLimit(File file) { + void _onTapWithSelectionLimit(EnteFile file) { if (selectedFiles!.files.isNotEmpty && selectedFiles!.files.first != file) { selectedFiles!.clearAll(); } _toggleFileSelection(file); } - void _onTapNoSelectionLimit(BuildContext context, File file) async { + void _onTapNoSelectionLimit(BuildContext context, EnteFile file) async { final bool shouldToggleSelection = (selectedFiles?.files.isNotEmpty ?? false) || GalleryContextState.of(context)!.inSelectionMode; @@ -131,7 +131,7 @@ class GalleryFileWidget extends StatelessWidget { } } - void _onLongPressNoSelectionLimit(BuildContext context, File file) { + void _onLongPressNoSelectionLimit(BuildContext context, EnteFile file) { if (selectedFiles!.files.isNotEmpty) { _routeToDetailPage(file, context); } else if (AppLifecycleService.instance.mediaExtensionAction.action == @@ -143,7 +143,7 @@ class GalleryFileWidget extends StatelessWidget { Future _onLongPressWithSelectionLimit( BuildContext context, - File file, + EnteFile file, ) async { if (AppLifecycleService.instance.mediaExtensionAction.action == IntentAction.pick) { @@ -154,7 +154,7 @@ class GalleryFileWidget extends StatelessWidget { } } - void _routeToDetailPage(File file, BuildContext context) { + void _routeToDetailPage(EnteFile file, BuildContext context) { final page = DetailPage( DetailPageConfiguration( List.unmodifiable(filesInGroup), diff --git a/lib/ui/viewer/gallery/component/grid/gallery_grid_view_widget.dart b/lib/ui/viewer/gallery/component/grid/gallery_grid_view_widget.dart index d06240024..a88f1412b 100644 --- a/lib/ui/viewer/gallery/component/grid/gallery_grid_view_widget.dart +++ b/lib/ui/viewer/gallery/component/grid/gallery_grid_view_widget.dart @@ -6,7 +6,7 @@ import "package:photos/ui/viewer/gallery/component/gallery_file_widget.dart"; import "package:photos/ui/viewer/gallery/gallery.dart"; class GalleryGridViewWidget extends StatelessWidget { - final List filesInGroup; + final List filesInGroup; final int photoGridSize; final SelectedFiles? selectedFiles; final bool limitSelectionToOne; diff --git a/lib/ui/viewer/gallery/component/grid/lazy_grid_view.dart b/lib/ui/viewer/gallery/component/grid/lazy_grid_view.dart index 5e9cde322..e273aa580 100644 --- a/lib/ui/viewer/gallery/component/grid/lazy_grid_view.dart +++ b/lib/ui/viewer/gallery/component/grid/lazy_grid_view.dart @@ -13,7 +13,7 @@ import "package:photos/ui/viewer/gallery/gallery.dart"; class LazyGridView extends StatefulWidget { final String tag; - final List filesInGroup; + final List filesInGroup; final GalleryLoader asyncLoader; final SelectedFiles? selectedFiles; final bool shouldRender; diff --git a/lib/ui/viewer/gallery/component/grid/non_recyclable_grid_view_widget.dart b/lib/ui/viewer/gallery/component/grid/non_recyclable_grid_view_widget.dart index 6e5170802..dcbf57ba0 100644 --- a/lib/ui/viewer/gallery/component/grid/non_recyclable_grid_view_widget.dart +++ b/lib/ui/viewer/gallery/component/grid/non_recyclable_grid_view_widget.dart @@ -8,7 +8,7 @@ import "package:visibility_detector/visibility_detector.dart"; class NonRecyclableGridViewWidget extends StatefulWidget { final bool shouldRender; - final List filesInGroup; + final List filesInGroup; final int photoGridSize; final bool limitSelectionToOne; final String tag; diff --git a/lib/ui/viewer/gallery/component/grid/recyclable_grid_view_widget.dart b/lib/ui/viewer/gallery/component/grid/recyclable_grid_view_widget.dart index 739fc6f62..71663f6a3 100644 --- a/lib/ui/viewer/gallery/component/grid/recyclable_grid_view_widget.dart +++ b/lib/ui/viewer/gallery/component/grid/recyclable_grid_view_widget.dart @@ -8,7 +8,7 @@ import "package:visibility_detector/visibility_detector.dart"; class RecyclableGridViewWidget extends StatefulWidget { final bool shouldRender; - final List filesInGroup; + final List filesInGroup; final int photoGridSize; final bool limitSelectionToOne; final String tag; diff --git a/lib/ui/viewer/gallery/component/group/group_gallery.dart b/lib/ui/viewer/gallery/component/group/group_gallery.dart index 671c8f8fd..5dba3ab46 100644 --- a/lib/ui/viewer/gallery/component/group/group_gallery.dart +++ b/lib/ui/viewer/gallery/component/group/group_gallery.dart @@ -9,7 +9,7 @@ import 'package:photos/ui/viewer/gallery/gallery.dart'; class GroupGallery extends StatelessWidget { final int photoGridSize; - final List files; + final List files; final String tag; final GalleryLoader asyncLoader; final SelectedFiles? selectedFiles; diff --git a/lib/ui/viewer/gallery/component/group/lazy_group_gallery.dart b/lib/ui/viewer/gallery/component/group/lazy_group_gallery.dart index 8276589e6..716b50eec 100644 --- a/lib/ui/viewer/gallery/component/group/lazy_group_gallery.dart +++ b/lib/ui/viewer/gallery/component/group/lazy_group_gallery.dart @@ -15,7 +15,7 @@ import 'package:photos/ui/viewer/gallery/gallery.dart'; import "package:photos/ui/viewer/gallery/state/gallery_context_state.dart"; class LazyGroupGallery extends StatefulWidget { - final List files; + final List files; final int index; final Stream? reloadEvent; final Set removalEventTypes; @@ -56,8 +56,8 @@ class _LazyGroupGalleryState extends State { late Logger _logger; - late List _files; - Set? _filesAsSet; + late List _files; + Set? _filesAsSet; late StreamSubscription? _reloadEventSubscription; late StreamSubscription _currentIndexSubscription; bool? _shouldRender; @@ -90,7 +90,7 @@ class _LazyGroupGalleryState extends State { }); } - Set get _setOfFiles { + Set get _setOfFiles { _filesAsSet ??= _files.toSet(); return _filesAsSet!; } diff --git a/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart b/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart index 5020d23d8..ebd5f9281 100644 --- a/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart +++ b/lib/ui/viewer/gallery/component/multiple_groups_gallery_view.dart @@ -23,7 +23,7 @@ group into multiple grid views during rendering. */ class MultipleGroupsGalleryView extends StatelessWidget { final ItemScrollController itemScroller; - final List> groupedFiles; + final List> groupedFiles; final bool disableScroll; final Widget? header; final Widget? footer; @@ -65,7 +65,7 @@ class MultipleGroupsGalleryView extends StatelessWidget { @override Widget build(BuildContext context) { - return HugeListView>( + return HugeListView>( controller: itemScroller, startIndex: 0, totalCount: groupedFiles.length, diff --git a/lib/ui/viewer/gallery/device_folder_page.dart b/lib/ui/viewer/gallery/device_folder_page.dart index 11a3023fe..08b4e7e79 100644 --- a/lib/ui/viewer/gallery/device_folder_page.dart +++ b/lib/ui/viewer/gallery/device_folder_page.dart @@ -90,7 +90,7 @@ class BackupHeaderWidget extends StatefulWidget { } class _BackupHeaderWidgetState extends State { - late Future> filesInDeviceCollection; + late Future> filesInDeviceCollection; late ValueNotifier shouldBackup; final Logger _logger = Logger("_BackupHeaderWidgetState"); @override @@ -191,7 +191,7 @@ class _BackupHeaderWidgetState extends State { ); } - Future> _filesInDeviceCollection() async { + Future> _filesInDeviceCollection() async { return (await FilesDB.instance.getFilesInDeviceCollection( widget.deviceCollection, Configuration.instance.getUserID(), @@ -202,15 +202,15 @@ class _BackupHeaderWidgetState extends State { } Future _hasIgnoredFiles( - Future> filesInDeviceCollection, + Future> filesInDeviceCollection, ) async { - final List deviceCollectionFiles = await filesInDeviceCollection; + final List deviceCollectionFiles = await filesInDeviceCollection; final allIgnoredIDs = await IgnoredFilesService.instance.idToIgnoreReasonMap; if (allIgnoredIDs.isEmpty) { return false; } - for (File file in deviceCollectionFiles) { + for (EnteFile file in deviceCollectionFiles) { final String? ignoreID = IgnoredFilesService.instance.getIgnoredIDForFile(file); if (ignoreID != null && allIgnoredIDs.containsKey(ignoreID!)) { @@ -222,7 +222,7 @@ class _BackupHeaderWidgetState extends State { } class ResetIgnoredFilesWidget extends StatefulWidget { - final Future> filesInDeviceCollection; + final Future> filesInDeviceCollection; final VoidCallback parentSetState; const ResetIgnoredFilesWidget( this.filesInDeviceCollection, @@ -268,9 +268,9 @@ class _ResetIgnoredFilesWidgetState extends State { } Future _removeFilesFromIgnoredFiles( - Future> filesInDeviceCollection, + Future> filesInDeviceCollection, ) async { - final List deviceCollectionFiles = await filesInDeviceCollection; + final List deviceCollectionFiles = await filesInDeviceCollection; await IgnoredFilesService.instance .removeIgnoredMappings(deviceCollectionFiles); } diff --git a/lib/ui/viewer/gallery/gallery.dart b/lib/ui/viewer/gallery/gallery.dart index 1a1304706..99c11cb4a 100644 --- a/lib/ui/viewer/gallery/gallery.dart +++ b/lib/ui/viewer/gallery/gallery.dart @@ -29,7 +29,7 @@ typedef SortAscFn = bool Function(); class Gallery extends StatefulWidget { final GalleryLoader asyncLoader; - final List? initialFiles; + final List? initialFiles; final Stream? reloadEvent; final List>? forceReloadEvents; final Set removalEventTypes; @@ -91,7 +91,7 @@ class _GalleryState extends State { static const int kInitialLoadLimit = 100; late Logger _logger; - List> _currentGroupedFiles = []; + List> _currentGroupedFiles = []; bool _hasLoadedFiles = false; late ItemScrollController _itemScroller; StreamSubscription? _reloadEventSubscription; @@ -159,7 +159,7 @@ class _GalleryState extends State { super.initState(); } - void _setFilesAndReload(List files) { + void _setFilesAndReload(List files) { final hasReloaded = _onFilesLoaded(files); if (!hasReloaded && mounted) { setState(() {}); @@ -194,7 +194,7 @@ class _GalleryState extends State { // group files into multiple groups and returns `true` if it resulted in a // gallery reload - bool _onFilesLoaded(List files) { + bool _onFilesLoaded(List files) { final updatedGroupedFiles = widget.enableFileGrouping ? _groupFiles(files) : [files]; if (_currentGroupedFiles.length != updatedGroupedFiles.length || @@ -254,9 +254,9 @@ class _GalleryState extends State { ); } - List> _groupFiles(List files) { - List dailyFiles = []; - final List> resultGroupedFiles = []; + List> _groupFiles(List files) { + List dailyFiles = []; + final List> resultGroupedFiles = []; for (int index = 0; index < files.length; index++) { if (index > 0 && !areFromSameDay( diff --git a/lib/ui/viewer/location/dynamic_location_gallery_widget.dart b/lib/ui/viewer/location/dynamic_location_gallery_widget.dart index 6cba8f178..d6b4ad2e5 100644 --- a/lib/ui/viewer/location/dynamic_location_gallery_widget.dart +++ b/lib/ui/viewer/location/dynamic_location_gallery_widget.dart @@ -60,7 +60,7 @@ class _DynamicLocationGalleryWidgetState Future filterFiles() async { final FileLoadResult result = await fileLoadResult; final stopWatch = Stopwatch()..start(); - final copyOfFiles = List.from(result.files); + final copyOfFiles = List.from(result.files); copyOfFiles.removeWhere((f) { return !LocationService.instance.isFileInsideLocationTag( InheritedLocationTagData.of(context).centerPoint, diff --git a/lib/ui/viewer/location/edit_center_point_tile_widget.dart b/lib/ui/viewer/location/edit_center_point_tile_widget.dart index c9e9af853..3ea2a3c1c 100644 --- a/lib/ui/viewer/location/edit_center_point_tile_widget.dart +++ b/lib/ui/viewer/location/edit_center_point_tile_widget.dart @@ -50,7 +50,7 @@ class EditCenterPointTileWidget extends StatelessWidget { ), IconButtonWidget( onTap: () async { - final File? centerPointFile = await showPickCenterPointSheet( + final EnteFile? centerPointFile = await showPickCenterPointSheet( context, InheritedLocationTagData.of(context).locationTagEntity!, ); diff --git a/lib/ui/viewer/location/location_screen.dart b/lib/ui/viewer/location/location_screen.dart index 8184f6153..6dcde2562 100644 --- a/lib/ui/viewer/location/location_screen.dart +++ b/lib/ui/viewer/location/location_screen.dart @@ -174,7 +174,7 @@ class _LocationGalleryWidgetState extends State { final FileLoadResult result = await fileLoadResult; //wait for ignored files to be removed after init final stopWatch = Stopwatch()..start(); - final copyOfFiles = List.from(result.files); + final copyOfFiles = List.from(result.files); copyOfFiles.removeWhere((f) { return !LocationService.instance.isFileInsideLocationTag( centerPoint, diff --git a/lib/ui/viewer/location/pick_center_point_widget.dart b/lib/ui/viewer/location/pick_center_point_widget.dart index 424265fb2..6069df7c1 100644 --- a/lib/ui/viewer/location/pick_center_point_widget.dart +++ b/lib/ui/viewer/location/pick_center_point_widget.dart @@ -22,7 +22,7 @@ import "package:photos/ui/components/models/button_type.dart"; import "package:photos/ui/components/title_bar_title_widget.dart"; import "package:photos/ui/viewer/gallery/gallery.dart"; -Future showPickCenterPointSheet( +Future showPickCenterPointSheet( BuildContext context, LocalEntity locationTagEntity, ) async { diff --git a/lib/ui/viewer/search/result/file_result_widget.dart b/lib/ui/viewer/search/result/file_result_widget.dart index be25b8a56..505336f78 100644 --- a/lib/ui/viewer/search/result/file_result_widget.dart +++ b/lib/ui/viewer/search/result/file_result_widget.dart @@ -64,7 +64,7 @@ class FileSearchResultWidget extends StatelessWidget { ); } - void _routeToDetailPage(File file, BuildContext context) { + void _routeToDetailPage(EnteFile file, BuildContext context) { final page = DetailPage( DetailPageConfiguration( List.unmodifiable([file]), diff --git a/lib/ui/viewer/search/result/search_result_page.dart b/lib/ui/viewer/search/result/search_result_page.dart index ff26061db..5d20b7973 100644 --- a/lib/ui/viewer/search/result/search_result_page.dart +++ b/lib/ui/viewer/search/result/search_result_page.dart @@ -25,7 +25,7 @@ class SearchResultPage extends StatelessWidget { @override Widget build(BuildContext context) { - final List files = searchResult.resultFiles(); + final List files = searchResult.resultFiles(); final gallery = Gallery( asyncLoader: (creationStartTime, creationEndTime, {limit, asc}) { final result = files diff --git a/lib/ui/viewer/search/result/search_thumbnail_widget.dart b/lib/ui/viewer/search/result/search_thumbnail_widget.dart index 124c66bd4..066bded02 100644 --- a/lib/ui/viewer/search/result/search_thumbnail_widget.dart +++ b/lib/ui/viewer/search/result/search_thumbnail_widget.dart @@ -4,7 +4,7 @@ import 'package:photos/ui/viewer/file/no_thumbnail_widget.dart'; import 'package:photos/ui/viewer/file/thumbnail_widget.dart'; class SearchThumbnailWidget extends StatelessWidget { - final File? file; + final EnteFile? file; final String tagPrefix; const SearchThumbnailWidget( diff --git a/lib/utils/crypto_util.dart b/lib/utils/crypto_util.dart index 8e5b814a6..c2f02b59b 100644 --- a/lib/utils/crypto_util.dart +++ b/lib/utils/crypto_util.dart @@ -1,5 +1,5 @@ import "dart:convert"; -import 'dart:io' as io; +import "dart:io"; import 'dart:typed_data'; import 'package:computer/computer.dart'; @@ -54,9 +54,9 @@ Uint8List cryptoKdfDeriveFromKey( // Returns the hash for a given file, chunking it in batches of hashChunkSize Future cryptoGenericHash(Map args) async { - final sourceFile = io.File(args["sourceFilePath"]); + final sourceFile = File(args["sourceFilePath"]); final sourceFileLength = await sourceFile.length(); - final inputFile = sourceFile.openSync(mode: io.FileMode.read); + final inputFile = sourceFile.openSync(mode: FileMode.read); final state = Sodium.cryptoGenerichashInit(null, Sodium.cryptoGenerichashBytesMax); var bytesRead = 0; @@ -94,12 +94,12 @@ EncryptionResult chachaEncryptData(Map args) { Future chachaEncryptFile(Map args) async { final encryptionStartTime = DateTime.now().millisecondsSinceEpoch; final logger = Logger("ChaChaEncrypt"); - final sourceFile = io.File(args["sourceFilePath"]); - final destinationFile = io.File(args["destinationFilePath"]); + final sourceFile = File(args["sourceFilePath"]); + final destinationFile = File(args["destinationFilePath"]); final sourceFileLength = await sourceFile.length(); logger.info("Encrypting file of size " + sourceFileLength.toString()); - final inputFile = sourceFile.openSync(mode: io.FileMode.read); + final inputFile = sourceFile.openSync(mode: FileMode.read); final key = args["key"] ?? Sodium.cryptoSecretstreamXchacha20poly1305Keygen(); final initPushResult = Sodium.cryptoSecretstreamXchacha20poly1305InitPush(key); @@ -119,7 +119,7 @@ Future chachaEncryptFile(Map args) async { null, tag, ); - await destinationFile.writeAsBytes(encryptedData, mode: io.FileMode.append); + await destinationFile.writeAsBytes(encryptedData, mode: FileMode.append); } await inputFile.close(); @@ -135,12 +135,12 @@ Future chachaEncryptFile(Map args) async { Future chachaDecryptFile(Map args) async { final logger = Logger("ChaChaDecrypt"); final decryptionStartTime = DateTime.now().millisecondsSinceEpoch; - final sourceFile = io.File(args["sourceFilePath"]); - final destinationFile = io.File(args["destinationFilePath"]); + final sourceFile = File(args["sourceFilePath"]); + final destinationFile = File(args["destinationFilePath"]); final sourceFileLength = await sourceFile.length(); logger.info("Decrypting file of size " + sourceFileLength.toString()); - final inputFile = sourceFile.openSync(mode: io.FileMode.read); + final inputFile = sourceFile.openSync(mode: FileMode.read); final pullState = Sodium.cryptoSecretstreamXchacha20poly1305InitPull( args["header"], args["key"], @@ -157,7 +157,7 @@ Future chachaDecryptFile(Map args) async { bytesRead += chunkSize; final pullResult = Sodium.cryptoSecretstreamXchacha20poly1305Pull(pullState, buffer, null); - await destinationFile.writeAsBytes(pullResult.m, mode: io.FileMode.append); + await destinationFile.writeAsBytes(pullResult.m, mode: FileMode.append); tag = pullResult.tag; } inputFile.closeSync(); @@ -478,7 +478,7 @@ class CryptoUtil { } // Computes and returns the hash of the source file - static Future getHash(io.File source) { + static Future getHash(File source) { return _computer.compute( cryptoGenericHash, param: { diff --git a/lib/utils/delete_file_util.dart b/lib/utils/delete_file_util.dart index 029e5d750..98a4ad206 100644 --- a/lib/utils/delete_file_util.dart +++ b/lib/utils/delete_file_util.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:io' as io; import 'dart:io'; import 'dart:math'; @@ -33,7 +32,7 @@ final _logger = Logger("DeleteFileUtil"); Future deleteFilesFromEverywhere( BuildContext context, - List files, + List files, ) async { _logger.info("Trying to deleteFilesFromEverywhere " + files.toString()); final List localAssetIDs = []; @@ -71,7 +70,7 @@ Future deleteFilesFromEverywhere( deletedIDs.addAll(await _tryDeleteSharedMediaFiles(localSharedMediaIDs)); final updatedCollectionIDs = {}; final List uploadedFilesToBeTrashed = []; - final List deletedFiles = []; + final List deletedFiles = []; for (final file in files) { if (file.localID != null) { // Remove only those files that have already been removed from disk @@ -139,7 +138,7 @@ Future deleteFilesFromEverywhere( Future deleteFilesFromRemoteOnly( BuildContext context, - List files, + List files, ) async { files.removeWhere((element) => element.uploadedFileID == null); if (files.isEmpty) { @@ -189,7 +188,7 @@ Future deleteFilesFromRemoteOnly( Future deleteFilesOnDeviceOnly( BuildContext context, - List files, + List files, ) async { _logger.info("Trying to deleteFilesOnDeviceOnly" + files.toString()); final List localAssetIDs = []; @@ -225,7 +224,7 @@ Future deleteFilesOnDeviceOnly( _logger.severe("Could not delete file", e, s); } deletedIDs.addAll(await _tryDeleteSharedMediaFiles(localSharedMediaIDs)); - final List deletedFiles = []; + final List deletedFiles = []; for (final file in files) { // Remove only those files that have been removed from disk if (deletedIDs.contains(file.localID) || @@ -246,7 +245,7 @@ Future deleteFilesOnDeviceOnly( } } -Future deleteFromTrash(BuildContext context, List files) async { +Future deleteFromTrash(BuildContext context, List files) async { bool didDeletionStart = false; final actionResult = await showChoiceActionSheet( context, @@ -444,9 +443,9 @@ Future> deleteLocalFilesInBatches( return deletedIDs; } -Future _localFileExist(File file) { +Future _localFileExist(EnteFile file) { if (file.isSharedMediaToAppSandbox) { - final localFile = io.File(getSharedMediaFilePath(file)); + final localFile = File(getSharedMediaFilePath(file)); return localFile.exists(); } else { return file.getAsset.then((asset) { @@ -465,8 +464,8 @@ Future> _tryDeleteSharedMediaFiles(List localIDs) { 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()) { - await io.File(localPath).delete(); + if (File(localPath).existsSync()) { + await File(localPath).delete(); } actuallyDeletedIDs.add(id); } catch (e, s) { diff --git a/lib/utils/diff_fetcher.dart b/lib/utils/diff_fetcher.dart index 27dceaf6f..2d6226762 100644 --- a/lib/utils/diff_fetcher.dart +++ b/lib/utils/diff_fetcher.dart @@ -30,11 +30,11 @@ class DiffFetcher { if(diff.isNotEmpty) { existingUploadIDs = await FilesDB.instance.getUploadedFileIDs(collectionID); } - final deletedFiles = []; - final updatedFiles = []; + final deletedFiles = []; + final updatedFiles = []; for (final item in diff) { - final file = File(); + final file = EnteFile(); file.uploadedFileID = item["id"]; file.collectionID = item["collectionID"]; file.updationTime = item["updationTime"]; @@ -107,8 +107,8 @@ class DiffFetcher { } class Diff { - final List updatedFiles; - final List deletedFiles; + final List updatedFiles; + final List deletedFiles; final bool hasMore; final int latestUpdatedAtTime; diff --git a/lib/utils/exif_util.dart b/lib/utils/exif_util.dart index f794eb1de..33b157dd3 100644 --- a/lib/utils/exif_util.dart +++ b/lib/utils/exif_util.dart @@ -1,4 +1,4 @@ -import 'dart:io' as io; +import "dart:io"; import "package:computer/computer.dart"; import 'package:exif/exif.dart'; @@ -16,14 +16,14 @@ const kEmptyExifDateTime = "0000:00:00 00:00:00"; final _logger = Logger("ExifUtil"); -Future> getExif(File file) async { +Future> getExif(EnteFile file) async { try { - final io.File? originFile = await getFile(file, isOrigin: true); + final File? originFile = await getFile(file, isOrigin: true); if (originFile == null) { throw Exception("Failed to fetch origin file"); } final exif = await readExifAsync(originFile); - if (!file.isRemoteFile && io.Platform.isIOS) { + if (!file.isRemoteFile && Platform.isIOS) { await originFile.delete(); } return exif; @@ -33,7 +33,7 @@ Future> getExif(File file) async { } } -Future?> getExifFromSourceFile(io.File originFile) async { +Future?> getExifFromSourceFile(File originFile) async { try { final exif = await readExifAsync(originFile); return exif; @@ -44,7 +44,7 @@ Future?> getExifFromSourceFile(io.File originFile) async { } Future getCreationTimeFromEXIF( - io.File? file, + File? file, Map? exifData, ) async { try { @@ -77,7 +77,7 @@ Future> _readExifArgs(Map args) { return readExifFromFile(args["file"]); } -Future> readExifAsync(io.File file) async { +Future> readExifAsync(File file) async { return await Computer.shared().compute( _readExifArgs, param: {"file": file}, diff --git a/lib/utils/file_download_util.dart b/lib/utils/file_download_util.dart index 316fc781a..eb7381efb 100644 --- a/lib/utils/file_download_util.dart +++ b/lib/utils/file_download_util.dart @@ -1,4 +1,4 @@ -import 'dart:io' as io; +import 'dart:io'; import 'dart:typed_data'; import "package:computer/computer.dart"; @@ -6,15 +6,15 @@ import 'package:dio/dio.dart'; import 'package:logging/logging.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/network/network.dart'; -import 'package:photos/models/file.dart' as ente; +import 'package:photos/models/file.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/utils/crypto_util.dart'; import "package:photos/utils/data_util.dart"; final _logger = Logger("file_download_util"); -Future downloadAndDecrypt( - ente.File file, { +Future downloadAndDecrypt( + EnteFile file, { ProgressCallback? progressCallback, }) { final String logPrefix = 'File-${file.uploadedFileID}:'; @@ -22,7 +22,7 @@ Future downloadAndDecrypt( final encryptedFilePath = Configuration.instance.getTempDirectory() + file.generatedID.toString() + ".encrypted"; - final encryptedFile = io.File(encryptedFilePath); + final encryptedFile = File(encryptedFilePath); final startTime = DateTime.now().millisecondsSinceEpoch; return NetworkClient.instance .getDio() @@ -68,11 +68,11 @@ Future downloadAndDecrypt( } _logger.info('$logPrefix decryption completed'); await encryptedFile.delete(); - return io.File(decryptedFilePath); + return File(decryptedFilePath); }); } -Uint8List getFileKey(ente.File file) { +Uint8List getFileKey(EnteFile file) { final encryptedKey = CryptoUtil.base642bin(file.encryptedKey!); final nonce = CryptoUtil.base642bin(file.keyDecryptionNonce!); final collectionKey = @@ -80,7 +80,7 @@ Uint8List getFileKey(ente.File file) { return CryptoUtil.decryptSync(encryptedKey, collectionKey, nonce); } -Future getFileKeyUsingBgWorker(ente.File file) async { +Future getFileKeyUsingBgWorker(EnteFile file) async { final collectionKey = CollectionsService.instance.getCollectionKey(file.collectionID!); return await Computer.shared().compute( diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index 3775e4ff3..e304b5d16 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:collection'; import 'dart:convert'; -import 'dart:io' as io; +import 'dart:io'; import 'dart:math'; import 'package:collection/collection.dart'; @@ -122,14 +122,14 @@ class FileUploader { // upload future will return null as File when the file entry is deleted // locally because it's already present in the destination collection. - Future upload(File file, int collectionID) { + Future upload(EnteFile file, int collectionID) { if (file.localID == null || file.localID!.isEmpty) { return Future.error(Exception("file's localID can not be null or empty")); } // If the file hasn't been queued yet, queue it _totalCountInUploadSession++; if (!_queue.containsKey(file.localID)) { - final completer = Completer(); + final completer = Completer(); _queue[file.localID] = FileUploadItem(file, collectionID, completer); _pollQueue(); return completer.future; @@ -163,7 +163,7 @@ class FileUploader { } return CollectionsService.instance .addToCollection(collectionID, [uploadedFile]).then((aVoid) { - return uploadedFile as File; + return uploadedFile as EnteFile; }); }); } @@ -189,7 +189,10 @@ class FileUploader { _uploadURLs.clear(); } - void removeFromQueueWhere(final bool Function(File) fn, final Error reason) { + void removeFromQueueWhere( + final bool Function(EnteFile) fn, + final Error reason, + ) { final List uploadsToBeRemoved = []; _queue.entries .where((entry) => entry.value.status == UploadStatus.notStarted) @@ -245,8 +248,8 @@ class FileUploader { } } - Future _encryptAndUploadFileToCollection( - File file, + Future _encryptAndUploadFileToCollection( + EnteFile file, int collectionID, { bool forcedUpload = false, }) async { @@ -301,12 +304,12 @@ class FileUploader { } } - Future forceUpload(File file, int collectionID) async { + Future forceUpload(EnteFile file, int collectionID) async { return _tryToUpload(file, collectionID, true); } - Future _tryToUpload( - File file, + Future _tryToUpload( + EnteFile file, int collectionID, bool forcedUpload, ) async { @@ -389,11 +392,11 @@ class FileUploader { } } - if (io.File(encryptedFilePath).existsSync()) { - await io.File(encryptedFilePath).delete(); + if (File(encryptedFilePath).existsSync()) { + await File(encryptedFilePath).delete(); } await _checkIfWithinStorageLimit(mediaUploadData!.sourceFile!); - final encryptedFile = io.File(encryptedFilePath); + final encryptedFile = File(encryptedFilePath); final EncryptionResult fileAttributes = await CryptoUtil.encryptFile( mediaUploadData.sourceFile!.path, encryptedFilePath, @@ -406,10 +409,10 @@ class FileUploader { thumbnailData!, fileAttributes.key!, ); - if (io.File(encryptedThumbnailPath).existsSync()) { - await io.File(encryptedThumbnailPath).delete(); + if (File(encryptedThumbnailPath).existsSync()) { + await File(encryptedThumbnailPath).delete(); } - final encryptedThumbnailFile = io.File(encryptedThumbnailPath); + final encryptedThumbnailFile = File(encryptedThumbnailPath); await encryptedThumbnailFile .writeAsBytes(encryptedThumbnailData.encryptedData!); @@ -437,7 +440,7 @@ class FileUploader { if (SyncService.instance.shouldStopSync()) { throw SyncStopRequestedError(); } - File remoteFile; + EnteFile remoteFile; if (isUpdatedFile) { remoteFile = await _updateFile( file, @@ -555,9 +558,9 @@ class FileUploader { different from the {fileToUpload}, then most probably device has duplicate files. */ - Future> _mapToExistingUploadWithSameHash( + Future> _mapToExistingUploadWithSameHash( MediaUploadData mediaUploadData, - File fileToUpload, + EnteFile fileToUpload, int toCollectionID, ) async { if (fileToUpload.uploadedFileID != null) { @@ -569,7 +572,7 @@ class FileUploader { return Tuple2(false, fileToUpload); } - final List existingUploadedFiles = + final List existingUploadedFiles = await FilesDB.instance.getUploadedFilesWithHashes( mediaUploadData.hashData!, fileToUpload.fileType, @@ -581,7 +584,7 @@ class FileUploader { } // case a - final File? sameLocalSameCollection = + final EnteFile? sameLocalSameCollection = existingUploadedFiles.firstWhereOrNull( (e) => e.collectionID == toCollectionID && e.localID == fileToUpload.localID, @@ -607,7 +610,7 @@ class FileUploader { } // case b - final File? fileMissingLocal = existingUploadedFiles.firstWhereOrNull( + final EnteFile? fileMissingLocal = existingUploadedFiles.firstWhereOrNull( (e) => e.localID == null, ); if (fileMissingLocal != null) { @@ -639,7 +642,7 @@ class FileUploader { } // case c - final File? fileExistsButDifferentCollection = + final EnteFile? fileExistsButDifferentCollection = existingUploadedFiles.firstWhereOrNull( (e) => e.collectionID != toCollectionID && e.localID == fileToUpload.localID, @@ -675,7 +678,7 @@ class FileUploader { MediaUploadData? mediaUploadData, bool uploadCompleted, bool uploadHardFailure, - File file, + EnteFile file, String encryptedFilePath, String encryptedThumbnailPath, { required String lockKey, @@ -686,16 +689,16 @@ class FileUploader { // when upload is either completed or there's a tempFailure // Shared Media should only be cleared when the upload // succeeds. - if ((io.Platform.isIOS && (uploadCompleted || uploadHardFailure)) || + if ((Platform.isIOS && (uploadCompleted || uploadHardFailure)) || (uploadCompleted && file.isSharedMediaToAppSandbox)) { await mediaUploadData.sourceFile?.delete(); } } - if (io.File(encryptedFilePath).existsSync()) { - await io.File(encryptedFilePath).delete(); + if (File(encryptedFilePath).existsSync()) { + await File(encryptedFilePath).delete(); } - if (io.File(encryptedThumbnailPath).existsSync()) { - await io.File(encryptedThumbnailPath).delete(); + if (File(encryptedThumbnailPath).existsSync()) { + await File(encryptedThumbnailPath).delete(); } await _uploadLocks.releaseLock(lockKey, _processType.toString()); } @@ -709,7 +712,7 @@ class FileUploader { Note: Local storageBuffer is 20MB, server storageBuffer is 50MB, and an additional 30MB is reserved for thumbnails and encryption overhead. */ - Future _checkIfWithinStorageLimit(io.File fileToBeUploaded) async { + Future _checkIfWithinStorageLimit(File fileToBeUploaded) async { try { final UserDetails? userDetails = UserService.instance.getCachedUserDetails(); @@ -733,7 +736,7 @@ class FileUploader { } } - Future _onInvalidFileError(File file, InvalidFileError e) async { + Future _onInvalidFileError(EnteFile file, InvalidFileError e) async { final bool canIgnoreFile = file.localID != null && file.deviceFolder != null && file.title != null && @@ -754,8 +757,8 @@ class FileUploader { throw e; } - Future _uploadFile( - File file, + Future _uploadFile( + EnteFile file, int collectionID, String encryptedKey, String keyDecryptionNonce, @@ -836,8 +839,8 @@ class FileUploader { } } - Future _updateFile( - File file, + Future _updateFile( + EnteFile file, String fileObjectKey, String fileDecryptionHeader, int fileSize, @@ -959,7 +962,7 @@ class FileUploader { Future _putFile( UploadURL uploadURL, - io.File file, { + File file, { int? contentLength, int attempt = 1, }) async { @@ -1048,9 +1051,9 @@ class FileUploader { } class FileUploadItem { - final File file; + final EnteFile file; final int collectionID; - final Completer completer; + final Completer completer; UploadStatus status; FileUploadItem( diff --git a/lib/utils/file_uploader_util.dart b/lib/utils/file_uploader_util.dart index 8ddb21f92..5e369f4a7 100644 --- a/lib/utils/file_uploader_util.dart +++ b/lib/utils/file_uploader_util.dart @@ -1,10 +1,10 @@ import 'dart:async'; import "dart:convert"; -import 'dart:io' as io; +import "dart:io"; import 'dart:typed_data'; import 'dart:ui' as ui; -import 'package:archive/archive_io.dart'; +import "package:archive/archive_io.dart"; import 'package:logging/logging.dart'; import "package:motion_photos/motion_photos.dart"; import 'package:motionphoto/motionphoto.dart'; @@ -14,7 +14,7 @@ import 'package:photo_manager/photo_manager.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; import 'package:photos/core/errors.dart'; -import 'package:photos/models/file.dart' as ente; +import 'package:photos/models/file.dart'; import 'package:photos/models/file_type.dart'; import "package:photos/models/location/location.dart"; import "package:photos/models/metadata/file_magic.dart"; @@ -28,7 +28,7 @@ const kMaximumThumbnailCompressionAttempts = 2; const kLivePhotoHashSeparator = ':'; class MediaUploadData { - final io.File? sourceFile; + final File? sourceFile; final Uint8List? thumbnail; final bool isDeleted; final FileHashData? hashData; @@ -61,7 +61,7 @@ class FileHashData { FileHashData(this.fileHash, {this.zipHash}); } -Future getUploadDataFromEnteFile(ente.File file) async { +Future getUploadDataFromEnteFile(EnteFile file) async { if (file.isSharedMediaToAppSandbox) { return await _getMediaUploadDataFromAppCache(file); } else { @@ -69,8 +69,8 @@ Future getUploadDataFromEnteFile(ente.File file) async { } } -Future _getMediaUploadDataFromAssetFile(ente.File file) async { - io.File? sourceFile; +Future _getMediaUploadDataFromAssetFile(EnteFile file) async { + File? sourceFile; Uint8List? thumbnailData; bool isDeleted; String? zipHash; @@ -111,8 +111,8 @@ Future _getMediaUploadDataFromAssetFile(ente.File file) async { await _decorateEnteFileData(file, asset); fileHash = CryptoUtil.bin2base64(await CryptoUtil.getHash(sourceFile)); - if (file.fileType == FileType.livePhoto && io.Platform.isIOS) { - final io.File? videoUrl = await Motionphoto.getLivePhotoFile(file.localID!); + if (file.fileType == FileType.livePhoto && Platform.isIOS) { + final File? videoUrl = await Motionphoto.getLivePhotoFile(file.localID!); if (videoUrl == null || !videoUrl.existsSync()) { final String errMsg = "missing livePhoto url for ${file.toString()} with subType ${file.fileSubType}"; @@ -133,11 +133,11 @@ Future _getMediaUploadDataFromAssetFile(ente.File file) async { encoder.addFile(sourceFile, "image" + extension(sourceFile.path)); encoder.close(); // delete the temporary video and image copy (only in IOS) - if (io.Platform.isIOS) { + if (Platform.isIOS) { await sourceFile.delete(); } // new sourceFile which needs to be uploaded - sourceFile = io.File(livePhotoPath); + sourceFile = File(livePhotoPath); zipHash = CryptoUtil.bin2base64(await CryptoUtil.getHash(sourceFile)); } @@ -149,7 +149,7 @@ Future _getMediaUploadDataFromAssetFile(ente.File file) async { w = asset.width; } int? motionPhotoStartingIndex; - if (io.Platform.isAndroid && asset.type == AssetType.image) { + if (Platform.isAndroid && asset.type == AssetType.image) { try { motionPhotoStartingIndex = (await MotionPhotos(sourceFile.path).getMotionVideoIndex())?.start; @@ -170,7 +170,7 @@ Future _getMediaUploadDataFromAssetFile(ente.File file) async { Future _getThumbnailForUpload( AssetEntity asset, - ente.File file, + EnteFile file, ) async { try { Uint8List? thumbnailData = await asset.thumbnailDataWithSize( @@ -203,12 +203,12 @@ Future _getThumbnailForUpload( // check if the assetType is still the same. This can happen for livePhotos // if the user turns off the video using native photos app -void _assertFileType(AssetEntity asset, ente.File file) { +void _assertFileType(AssetEntity asset, EnteFile file) { final assetType = fileTypeFromAsset(asset); if (assetType == file.fileType) { return; } - if (io.Platform.isIOS || io.Platform.isMacOS) { + if (Platform.isIOS || Platform.isMacOS) { if (assetType == FileType.image && file.fileType == FileType.livePhoto) { throw InvalidFileError( 'id ${asset.id}', @@ -228,7 +228,7 @@ void _assertFileType(AssetEntity asset, ente.File file) { ); } -Future _decorateEnteFileData(ente.File file, AssetEntity asset) async { +Future _decorateEnteFileData(EnteFile file, AssetEntity asset) async { // h4ck to fetch location data if missing (thank you Android Q+) lazily only during uploads if (file.location == null || (file.location!.latitude == 0 && file.location!.longitude == 0)) { @@ -244,7 +244,7 @@ Future _decorateEnteFileData(ente.File file, AssetEntity asset) async { } Future getPubMetadataRequest( - ente.File file, + EnteFile file, Map newData, Uint8List fileKey, ) async { @@ -269,12 +269,12 @@ Future getPubMetadataRequest( ); } -Future _getMediaUploadDataFromAppCache(ente.File file) async { - io.File sourceFile; +Future _getMediaUploadDataFromAppCache(EnteFile file) async { + File sourceFile; Uint8List? thumbnailData; const bool isDeleted = false; final localPath = getSharedMediaFilePath(file); - sourceFile = io.File(localPath); + sourceFile = File(localPath); if (!sourceFile.existsSync()) { _logger.warning("File doesn't exist in app sandbox"); throw InvalidFileError( @@ -326,7 +326,7 @@ Future?> getImageHeightAndWith({ try { late Uint8List bytes; if (imagePath != null) { - final io.File imageFile = io.File(imagePath); + final File imageFile = File(imagePath); bytes = await imageFile.readAsBytes(); } else { bytes = imageBytes!; @@ -347,8 +347,8 @@ Future?> getImageHeightAndWith({ } } -Future getThumbnailFromInAppCacheFile(ente.File file) async { - var localFile = io.File(getSharedMediaFilePath(file)); +Future getThumbnailFromInAppCacheFile(EnteFile file) async { + var localFile = File(getSharedMediaFilePath(file)); if (!localFile.existsSync()) { return null; } @@ -360,7 +360,7 @@ Future getThumbnailFromInAppCacheFile(ente.File file) async { maxWidth: thumbnailLargeSize, quality: 80, ); - localFile = io.File(thumbnailFilePath!); + localFile = File(thumbnailFilePath!); } var thumbnailData = await localFile.readAsBytes(); int compressionAttempts = 0; diff --git a/lib/utils/file_util.dart b/lib/utils/file_util.dart index e632ed32c..d816f4f69 100644 --- a/lib/utils/file_util.dart +++ b/lib/utils/file_util.dart @@ -1,9 +1,8 @@ import 'dart:async'; -import 'dart:io' as io; import 'dart:io'; import 'package:archive/archive.dart'; -import 'package:dio/dio.dart'; +import "package:dio/dio.dart"; import 'package:flutter/foundation.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; @@ -15,14 +14,14 @@ import 'package:photos/core/cache/thumbnail_in_memory_cache.dart'; import 'package:photos/core/cache/video_cache_manager.dart'; import 'package:photos/core/configuration.dart'; import 'package:photos/core/constants.dart'; -import 'package:photos/models/file.dart' as ente; +import 'package:photos/models/file.dart'; import 'package:photos/models/file_type.dart'; import 'package:photos/utils/file_download_util.dart'; import 'package:photos/utils/thumbnail_util.dart'; final _logger = Logger("FileUtil"); -void preloadFile(ente.File file) { +void preloadFile(EnteFile file) { if (file.fileType == FileType.video) { return; } @@ -31,8 +30,8 @@ void preloadFile(ente.File file) { // IMPORTANT: Delete the returned file if `isOrigin` is set to true // https://github.com/CaiJingLong/flutter_photo_manager#cache-problem-of-ios -Future getFile( - ente.File file, { +Future getFile( + EnteFile file, { bool liveVideo = false, bool isOrigin = false, } // only relevant for live photos @@ -59,17 +58,17 @@ Future getFile( } } -Future doesLocalFileExist(ente.File file) async { +Future doesLocalFileExist(EnteFile file) async { return await _getLocalDiskFile(file) != null; } -Future _getLocalDiskFile( - ente.File file, { +Future _getLocalDiskFile( + EnteFile file, { bool liveVideo = false, bool isOrigin = false, }) async { if (file.isSharedMediaToAppSandbox) { - final localFile = io.File(getSharedMediaFilePath(file)); + final localFile = File(getSharedMediaFilePath(file)); return localFile.exists().then((exist) { return exist ? localFile : null; }); @@ -85,7 +84,7 @@ Future _getLocalDiskFile( } } -String getSharedMediaFilePath(ente.File file) { +String getSharedMediaFilePath(EnteFile file) { return getSharedMediaPathFromLocalID(file.localID!); } @@ -101,7 +100,7 @@ String getSharedMediaPathFromLocalID(String localID) { } } -void preloadThumbnail(ente.File file) { +void preloadThumbnail(EnteFile file) { if (file.isRemoteFile) { getThumbnailFromServer(file); } else { @@ -109,11 +108,11 @@ void preloadThumbnail(ente.File file) { } } -final Map> fileDownloadsInProgress = - >{}; +final Map> fileDownloadsInProgress = + >{}; -Future getFileFromServer( - ente.File file, { +Future getFileFromServer( + EnteFile file, { ProgressCallback? progressCallback, bool liveVideo = false, // only needed in case of live photos }) async { @@ -149,7 +148,7 @@ Future getFileFromServer( return fileDownloadsInProgress[downloadID]; } -Future isFileCached(ente.File file, {bool liveVideo = false}) async { +Future isFileCached(EnteFile file, {bool liveVideo = false}) async { final cacheManager = (file.fileType == FileType.video || liveVideo) ? VideoCacheManager.instance : DefaultCacheManager(); @@ -160,8 +159,8 @@ Future isFileCached(ente.File file, {bool liveVideo = false}) async { final Map> _livePhotoDownloadsTracker = >{}; -Future _getLivePhotoFromServer( - ente.File file, { +Future _getLivePhotoFromServer( + EnteFile file, { ProgressCallback? progressCallback, required bool needLiveVideo, }) async { @@ -185,7 +184,7 @@ Future _getLivePhotoFromServer( } Future<_LivePhoto?> _downloadLivePhoto( - ente.File file, { + EnteFile file, { ProgressCallback? progressCallback, }) async { return downloadAndDecrypt(file, progressCallback: progressCallback) @@ -194,7 +193,7 @@ Future<_LivePhoto?> _downloadLivePhoto( return null; } _logger.fine("Decoded zipped live photo from " + decryptedFile.path); - io.File? imageFileCache, videoFileCache; + File? imageFileCache, videoFileCache; final List bytes = await decryptedFile.readAsBytes(); final Archive archive = ZipDecoder().decodeBytes(bytes); final tempPath = Configuration.instance.getTempDirectory(); @@ -207,12 +206,12 @@ Future<_LivePhoto?> _downloadLivePhoto( tempPath + file.uploadedFileID.toString() + filename; final List data = archiveFile.content; if (filename.startsWith("image")) { - final imageFile = io.File(decodePath); + final imageFile = File(decodePath); await imageFile.create(recursive: true); await imageFile.writeAsBytes(data); - io.File imageConvertedFile = imageFile; + File imageConvertedFile = imageFile; if ((fileExtension == "unknown") || - (io.Platform.isAndroid && fileExtension == "heic")) { + (Platform.isAndroid && fileExtension == "heic")) { final compressResult = await FlutterImageCompress.compressAndGetFile( decodePath, @@ -235,7 +234,7 @@ Future<_LivePhoto?> _downloadLivePhoto( ); await imageConvertedFile.delete(); } else if (filename.startsWith("video")) { - final videoFile = io.File(decodePath); + final videoFile = File(decodePath); await videoFile.create(recursive: true); await videoFile.writeAsBytes(data); videoFileCache = await VideoCacheManager.instance.putFile( @@ -261,8 +260,8 @@ Future<_LivePhoto?> _downloadLivePhoto( }); } -Future _downloadAndCache( - ente.File file, +Future _downloadAndCache( + EnteFile file, BaseCacheManager cacheManager, { ProgressCallback? progressCallback, }) async { @@ -273,9 +272,9 @@ Future _downloadAndCache( } final decryptedFilePath = decryptedFile.path; final String fileExtension = getExtension(file.title ?? ''); - io.File outputFile = decryptedFile; + File outputFile = decryptedFile; if ((fileExtension == "unknown" && file.fileType == FileType.image) || - (io.Platform.isAndroid && fileExtension == "heic")) { + (Platform.isAndroid && fileExtension == "heic")) { final compressResult = await FlutterImageCompress.compressAndGetFile( decryptedFilePath, decryptedFilePath + ".jpg", @@ -322,13 +321,13 @@ Future compressThumbnail(Uint8List thumbnail) { ); } -Future clearCache(ente.File file) async { +Future clearCache(EnteFile file) async { if (file.fileType == FileType.video) { VideoCacheManager.instance.removeFile(file.downloadUrl); } else { DefaultCacheManager().removeFile(file.downloadUrl); } - final cachedThumbnail = io.File( + final cachedThumbnail = File( Configuration.instance.getThumbnailCacheDirectory() + "/" + file.uploadedFileID.toString(), @@ -340,8 +339,8 @@ Future clearCache(ente.File file) async { } class _LivePhoto { - final io.File image; - final io.File video; + final File image; + final File video; _LivePhoto(this.image, this.video); } diff --git a/lib/utils/magic_util.dart b/lib/utils/magic_util.dart index cbf5fa17b..e0b0ae1dc 100644 --- a/lib/utils/magic_util.dart +++ b/lib/utils/magic_util.dart @@ -24,7 +24,7 @@ enum _VisibilityAction { hide, unHide, archive, unarchive } Future changeVisibility( BuildContext context, - List files, + List files, int newVisibility, ) async { final dialog = createProgressDialog( @@ -153,7 +153,7 @@ Future changeCoverPhoto( Bus.instance.fire( CollectionUpdatedEvent( collection.id, - [], + [], "cover_change", type: EventType.coverChanged, ), @@ -167,7 +167,7 @@ Future changeCoverPhoto( Future editTime( BuildContext context, - List files, + List files, int editedTime, ) async { try { @@ -186,7 +186,7 @@ Future editTime( Future editFilename( BuildContext context, - File file, + EnteFile file, ) async { final fileName = file.displayName; final nameWithoutExt = basenameWithoutExtension(fileName); @@ -224,7 +224,7 @@ Future editFilename( Future editFileCaption( BuildContext? context, - File file, + EnteFile file, String caption, ) async { try { @@ -246,7 +246,7 @@ Future editFileCaption( Future _updatePublicMetadata( BuildContext? context, - List files, + List files, String key, dynamic value, { bool showDoneToast = true, diff --git a/lib/utils/share_util.dart b/lib/utils/share_util.dart index 3740a9fb1..54ed3d517 100644 --- a/lib/utils/share_util.dart +++ b/lib/utils/share_util.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import 'dart:io' as dartio; +import "dart:io"; import 'package:flutter/widgets.dart'; import 'package:logging/logging.dart'; @@ -32,7 +32,7 @@ final _videoExtension = { // share is used to share media/files from ente to other apps Future share( BuildContext context, - List files, { + List files, { GlobalKey? shareButtonKey, }) async { final remoteFileCount = files.where((element) => element.isRemoteFile).length; @@ -44,7 +44,7 @@ Future share( await dialog.show(); try { final List> pathFutures = []; - for (File file in files) { + for (EnteFile file in files) { // Note: We are requesting the origin file for performance reasons on iOS. // This will eat up storage, which will be reset only when the app restarts. // We could have cleared the cache had there been a callback to the share API. @@ -102,11 +102,11 @@ Future shareText(String text) async { return Share.share(text); } -Future> convertIncomingSharedMediaToFile( +Future> convertIncomingSharedMediaToFile( List sharedMedia, int collectionID, ) async { - final List localFiles = []; + final List localFiles = []; for (var media in sharedMedia) { if (!(media.type == SharedMediaType.IMAGE || media.type == SharedMediaType.VIDEO)) { @@ -115,10 +115,10 @@ Future> convertIncomingSharedMediaToFile( ); continue; } - final enteFile = File(); + final enteFile = EnteFile(); // fileName: img_x.jpg enteFile.title = basename(media.path); - var ioFile = dartio.File(media.path); + var ioFile = File(media.path); ioFile = ioFile.renameSync( Configuration.instance.getSharedMediaDirectory() + "/" + enteFile.title!, ); @@ -149,13 +149,13 @@ Future> convertIncomingSharedMediaToFile( return localFiles; } -Future> convertPicketAssets( +Future> convertPicketAssets( List pickedAssets, int collectionID, ) async { - final List localFiles = []; + final List localFiles = []; for (var asset in pickedAssets) { - final enteFile = await File.fromAsset('', asset); + final enteFile = await EnteFile.fromAsset('', asset); localFiles.add(enteFile); } return localFiles; @@ -184,7 +184,7 @@ DateTime? parseDateFromFileNam1e(String fileName) { void shareSelected( BuildContext context, GlobalKey shareButtonKey, - List selectedFiles, + List selectedFiles, ) { share( context, diff --git a/lib/utils/thumbnail_util.dart b/lib/utils/thumbnail_util.dart index c625f5265..ae74cda7f 100644 --- a/lib/utils/thumbnail_util.dart +++ b/lib/utils/thumbnail_util.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:collection'; -import 'dart:io' as io; +import 'dart:io'; import 'dart:typed_data'; import 'package:dio/dio.dart'; @@ -23,7 +23,7 @@ final _downloadQueue = Queue(); const int kMaximumConcurrentDownloads = 500; class FileDownloadItem { - final File file; + final EnteFile file; final Completer completer; final CancelToken cancelToken; int counter = 0; // number of times file download was requested @@ -31,7 +31,7 @@ class FileDownloadItem { FileDownloadItem(this.file, this.completer, this.cancelToken, this.counter); } -Future getThumbnail(File file) async { +Future getThumbnail(EnteFile file) async { if (file.isRemoteFile) { return getThumbnailFromServer(file); } else { @@ -42,7 +42,7 @@ Future getThumbnail(File file) async { } } -Future getThumbnailFromServer(File file) async { +Future getThumbnailFromServer(EnteFile file) async { final cachedThumbnail = cachedThumbnailPath(file); if (await cachedThumbnail.exists()) { final data = await cachedThumbnail.readAsBytes(); @@ -71,7 +71,7 @@ Future getThumbnailFromServer(File file) async { } Future getThumbnailFromLocal( - File file, { + EnteFile file, { int size = thumbnailSmallSize, int quality = thumbnailQuality, }) async { @@ -108,7 +108,7 @@ Future getThumbnailFromLocal( } } -void removePendingGetThumbnailRequestIfAny(File file) { +void removePendingGetThumbnailRequestIfAny(EnteFile file) { if (_uploadIDToDownloadItem.containsKey(file.uploadedFileID)) { final item = _uploadIDToDownloadItem[file.uploadedFileID]!; item.counter--; @@ -192,10 +192,10 @@ Future _downloadAndDecryptThumbnail(FileDownloadItem item) async { } } -io.File cachedThumbnailPath(File file) { +File cachedThumbnailPath(EnteFile file) { final thumbnailCacheDirectory = Configuration.instance.getThumbnailCacheDirectory(); - return io.File( + return File( thumbnailCacheDirectory + "/" + file.uploadedFileID.toString(), ); }