diff --git a/lib/ui/shared_collections_gallery.dart b/lib/ui/shared_collections_gallery.dart index 9966dfaf6..0775f2df5 100644 --- a/lib/ui/shared_collections_gallery.dart +++ b/lib/ui/shared_collections_gallery.dart @@ -251,7 +251,7 @@ class _SharedCollectionGalleryState extends State onTap: () async { await showToast( context, - "Select an album and tap the share button on the top right to share.", + "Open an album and tap the share button on the top right to share.", toastLength: Toast.LENGTH_LONG, ); Bus.instance.fire( diff --git a/lib/utils/file_uploader.dart b/lib/utils/file_uploader.dart index eb58d5e8b..8082ca80b 100644 --- a/lib/utils/file_uploader.dart +++ b/lib/utils/file_uploader.dart @@ -22,6 +22,7 @@ import 'package:photos/events/subscription_purchased_event.dart'; import 'package:photos/main.dart'; import 'package:photos/models/encryption_result.dart'; import 'package:photos/models/file.dart'; +import 'package:photos/models/file_type.dart'; import 'package:photos/models/upload_url.dart'; import 'package:photos/services/collections_service.dart'; import 'package:photos/services/local_sync_service.dart'; @@ -33,6 +34,7 @@ import 'package:shared_preferences/shared_preferences.dart'; class FileUploader { static const kMaximumConcurrentUploads = 4; + static const kMaximumConcurrentVideoUploads = 2; static const kMaximumThumbnailCompressionAttempts = 2; static const kMaximumUploadAttempts = 4; static const kBlockedUploadsPollFrequency = Duration(seconds: 2); @@ -49,7 +51,9 @@ class FileUploader { // Maintains the count of files in the current upload session. // Upload session is the period between the first entry into the _queue and last entry out of the _queue int _totalCountInUploadSession = 0; - int _currentlyUploading = 0; + // _uploadCounter indicates number of uploads which are currently in progress + int _uploadCounter = 0; + int _videoUploadCounter = 0; ProcessType _processType; bool _isBackground; SharedPreferences _prefs; @@ -228,18 +232,32 @@ class FileUploader { _totalCountInUploadSession = 0; return; } - if (_currentlyUploading < kMaximumConcurrentUploads) { - final firstPendingEntry = _queue.entries + if (_uploadCounter < kMaximumConcurrentUploads) { + var pendingEntry = _queue.entries .firstWhere( (entry) => entry.value.status == UploadStatus.not_started, orElse: () => null, ) ?.value; - if (firstPendingEntry != null) { - firstPendingEntry.status = UploadStatus.in_progress; + + if (pendingEntry != null && + pendingEntry.file.fileType == FileType.video && + _videoUploadCounter >= kMaximumConcurrentVideoUploads) { + // check if there's any non-video entry which can be queued for upload + pendingEntry = _queue.entries + .firstWhere( + (entry) => + entry.value.status == UploadStatus.not_started && + entry.value.file.fileType != FileType.video, + orElse: () => null, + ) + ?.value; + } + if (pendingEntry != null) { + pendingEntry.status = UploadStatus.in_progress; _encryptAndUploadFileToCollection( - firstPendingEntry.file, - firstPendingEntry.collectionID, + pendingEntry.file, + pendingEntry.collectionID, ); } } @@ -250,7 +268,10 @@ class FileUploader { int collectionID, { bool forcedUpload = false, }) async { - _currentlyUploading++; + _uploadCounter++; + if (file.fileType == FileType.video) { + _videoUploadCounter++; + } final localID = file.localID; try { final uploadedFile = @@ -273,7 +294,10 @@ class FileUploader { return null; } } finally { - _currentlyUploading--; + _uploadCounter--; + if (file.fileType == FileType.video) { + _videoUploadCounter--; + } _pollQueue(); } } diff --git a/pubspec.yaml b/pubspec.yaml index 05bb2d0df..50db7cc66 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: ente photos application # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.5.43+323 +version: 0.5.45+325 environment: sdk: ">=2.10.0 <3.0.0"