From 480a96bd0ed470fb6873a248ffd9faecfe4c72dd Mon Sep 17 00:00:00 2001 From: zarzet Date: Thu, 23 Jul 2026 09:57:02 +0700 Subject: [PATCH] fix(queue): clarify and coalesce verification progress --- lib/l10n/app_localizations.dart | 30 +++++++++++ lib/l10n/app_localizations_ar.dart | 15 ++++++ lib/l10n/app_localizations_de.dart | 15 ++++++ lib/l10n/app_localizations_en.dart | 15 ++++++ lib/l10n/app_localizations_es.dart | 15 ++++++ lib/l10n/app_localizations_fr.dart | 15 ++++++ lib/l10n/app_localizations_hi.dart | 15 ++++++ lib/l10n/app_localizations_id.dart | 16 ++++++ lib/l10n/app_localizations_ja.dart | 15 ++++++ lib/l10n/app_localizations_ko.dart | 15 ++++++ lib/l10n/app_localizations_nl.dart | 15 ++++++ lib/l10n/app_localizations_pt.dart | 15 ++++++ lib/l10n/app_localizations_ru.dart | 15 ++++++ lib/l10n/app_localizations_tr.dart | 15 ++++++ lib/l10n/app_localizations_uk.dart | 15 ++++++ lib/l10n/app_localizations_zh.dart | 15 ++++++ lib/l10n/arb/app_en.arb | 5 ++ lib/l10n/arb/app_id.arb | 5 ++ lib/models/download_item.dart | 4 ++ lib/models/download_item.g.dart | 2 + lib/providers/download_queue_provider.dart | 61 ++++++++++++++++------ lib/screens/queue_tab.dart | 15 ++++++ test/models_and_utils_test.dart | 4 ++ 23 files changed, 335 insertions(+), 17 deletions(-) diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index e1accb72..aa8230d9 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -6694,6 +6694,36 @@ abstract class AppLocalizations { /// **'Starting...'** String get queueDownloadStarting; + /// No description provided for @queueCheckingDownloadSession. + /// + /// In en, this message translates to: + /// **'Checking download session...'** + String get queueCheckingDownloadSession; + + /// No description provided for @queueResolvingDownloadMetadata. + /// + /// In en, this message translates to: + /// **'Resolving track metadata...'** + String get queueResolvingDownloadMetadata; + + /// No description provided for @queueResolvingDownloadStream. + /// + /// In en, this message translates to: + /// **'Preparing audio stream...'** + String get queueResolvingDownloadStream; + + /// No description provided for @queueWaitingForVerification. + /// + /// In en, this message translates to: + /// **'Waiting for verification...'** + String get queueWaitingForVerification; + + /// No description provided for @queueResumingAfterVerification. + /// + /// In en, this message translates to: + /// **'Resuming after verification...'** + String get queueResumingAfterVerification; + /// Accessibility label for selecting a track /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_ar.dart b/lib/l10n/app_localizations_ar.dart index 494ab072..5466aad2 100644 --- a/lib/l10n/app_localizations_ar.dart +++ b/lib/l10n/app_localizations_ar.dart @@ -4075,6 +4075,21 @@ class AppLocalizationsAr extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index d24a8ab0..f2569db1 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -4120,6 +4120,21 @@ class AppLocalizationsDe extends AppLocalizations { @override String get queueDownloadStarting => 'Starte...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Titel auswählen'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index e0af703c..413a5b5a 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -4075,6 +4075,21 @@ class AppLocalizationsEn extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 8fa91c95..34cd88b7 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -4069,6 +4069,21 @@ class AppLocalizationsEs extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 5d8de352..957f2390 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -4181,6 +4181,21 @@ class AppLocalizationsFr extends AppLocalizations { @override String get queueDownloadStarting => 'C\'est parti...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Sélectionner une piste'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 46b59f71..3ec398b3 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -4075,6 +4075,21 @@ class AppLocalizationsHi extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 033e0cd5..422bb66e 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -4078,6 +4078,22 @@ class AppLocalizationsId extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Memeriksa sesi unduhan...'; + + @override + String get queueResolvingDownloadMetadata => 'Mencari metadata lagu...'; + + @override + String get queueResolvingDownloadStream => 'Menyiapkan stream audio...'; + + @override + String get queueWaitingForVerification => 'Menunggu verifikasi...'; + + @override + String get queueResumingAfterVerification => + 'Melanjutkan setelah verifikasi...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index fc0dad6d..af77949e 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -4064,6 +4064,21 @@ class AppLocalizationsJa extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 020b06fc..2001391a 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -3954,6 +3954,21 @@ class AppLocalizationsKo extends AppLocalizations { @override String get queueDownloadStarting => '시작하는 중...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => '트랙 선택'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 9f924164..5b23c700 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -4075,6 +4075,21 @@ class AppLocalizationsNl extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index f8e6be61..f0b5be2f 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -4069,6 +4069,21 @@ class AppLocalizationsPt extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index a9f25deb..d5691fc2 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -4106,6 +4106,21 @@ class AppLocalizationsRu extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index f3731fd6..ddd613e3 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -4105,6 +4105,21 @@ class AppLocalizationsTr extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index 97c3251e..dd35d677 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -4123,6 +4123,21 @@ class AppLocalizationsUk extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 0992d093..0fd13c3e 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -4069,6 +4069,21 @@ class AppLocalizationsZh extends AppLocalizations { @override String get queueDownloadStarting => 'Starting...'; + @override + String get queueCheckingDownloadSession => 'Checking download session...'; + + @override + String get queueResolvingDownloadMetadata => 'Resolving track metadata...'; + + @override + String get queueResolvingDownloadStream => 'Preparing audio stream...'; + + @override + String get queueWaitingForVerification => 'Waiting for verification...'; + + @override + String get queueResumingAfterVerification => 'Resuming after verification...'; + @override String get a11ySelectTrack => 'Select track'; diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 88b5dc8c..a19f8fc8 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -5268,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index a73bb9c3..374020bb 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -5307,6 +5307,11 @@ "extensionHealthServiceUnknown": "Service status unknown", "navHome": "Beranda", "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Memeriksa sesi unduhan...", + "queueResolvingDownloadMetadata": "Mencari metadata lagu...", + "queueResolvingDownloadStream": "Menyiapkan stream audio...", + "queueWaitingForVerification": "Menunggu verifikasi...", + "queueResumingAfterVerification": "Melanjutkan setelah verifikasi...", "@dialogRemoveExtension": { "description": "Dialog title - uninstall extension" }, diff --git a/lib/models/download_item.dart b/lib/models/download_item.dart index 1cb677a8..f3fcaae6 100644 --- a/lib/models/download_item.dart +++ b/lib/models/download_item.dart @@ -34,6 +34,7 @@ class DownloadItem { final String? filePath; final String? error; final DownloadErrorType? errorType; + final String preparationStage; final DateTime createdAt; final String? qualityOverride; final String? playlistName; @@ -53,6 +54,7 @@ class DownloadItem { this.filePath, this.error, this.errorType, + this.preparationStage = '', required this.createdAt, this.qualityOverride, this.playlistName, @@ -73,6 +75,7 @@ class DownloadItem { String? filePath, String? error, DownloadErrorType? errorType, + String? preparationStage, DateTime? createdAt, String? qualityOverride, String? playlistName, @@ -92,6 +95,7 @@ class DownloadItem { filePath: filePath ?? this.filePath, error: error ?? this.error, errorType: errorType ?? this.errorType, + preparationStage: preparationStage ?? this.preparationStage, createdAt: createdAt ?? this.createdAt, qualityOverride: qualityOverride ?? this.qualityOverride, playlistName: playlistName ?? this.playlistName, diff --git a/lib/models/download_item.g.dart b/lib/models/download_item.g.dart index 1445f854..e6a16e69 100644 --- a/lib/models/download_item.g.dart +++ b/lib/models/download_item.g.dart @@ -20,6 +20,7 @@ DownloadItem _$DownloadItemFromJson(Map json) => DownloadItem( filePath: json['filePath'] as String?, error: json['error'] as String?, errorType: $enumDecodeNullable(_$DownloadErrorTypeEnumMap, json['errorType']), + preparationStage: json['preparationStage'] as String? ?? '', createdAt: DateTime.parse(json['createdAt'] as String), qualityOverride: json['qualityOverride'] as String?, playlistName: json['playlistName'] as String?, @@ -41,6 +42,7 @@ Map _$DownloadItemToJson(DownloadItem instance) => 'filePath': instance.filePath, 'error': instance.error, 'errorType': _$DownloadErrorTypeEnumMap[instance.errorType], + 'preparationStage': instance.preparationStage, 'createdAt': instance.createdAt.toIso8601String(), 'qualityOverride': instance.qualityOverride, 'playlistName': instance.playlistName, diff --git a/lib/providers/download_queue_provider.dart b/lib/providers/download_queue_provider.dart index 4321e236..55264a0d 100644 --- a/lib/providers/download_queue_provider.dart +++ b/lib/providers/download_queue_provider.dart @@ -145,6 +145,7 @@ class _ProgressUpdate { final double? speedMBps; final int? bytesReceived; final int? bytesTotal; + final String preparationStage; const _ProgressUpdate({ required this.status, @@ -152,6 +153,7 @@ class _ProgressUpdate { this.speedMBps, this.bytesReceived, this.bytesTotal, + this.preparationStage = '', }); } @@ -224,6 +226,7 @@ class DownloadQueueNotifier extends Notifier { final Set _locallyCancelledItemIds = {}; final Set _pausePendingItemIds = {}; final Set _verificationRetriedItemIds = {}; + final Map> _verificationFlowsByExtension = {}; final Set _rateLimitRetriedItemIds = {}; String? _activeNativeWorkerRunId; @@ -412,21 +415,42 @@ class DownloadQueueNotifier extends Notifier { } Future _openVerificationAndWait(String extensionId) { - return openVerificationAndAwaitGrant( - extensionId, - browserMode: ref.read(settingsProvider).extensionVerificationBrowserMode, - awaitForeground: (normalizedExtensionId) async { - if (WidgetsBinding.instance.lifecycleState != - AppLifecycleState.resumed) { - _log.i( - 'Verification required for $normalizedExtensionId while app is in ' - 'background; deferring challenge until the app is foregrounded', - ); - unawaited(_notificationService.showVerificationRequired()); - await _waitForForeground(); - } - }, - ); + final key = extensionId.trim().toLowerCase(); + final activeFlow = _verificationFlowsByExtension[key]; + if (activeFlow != null) { + _log.i( + 'Joining active verification flow for $extensionId instead of opening another challenge', + ); + return activeFlow; + } + + final flow = _runVerificationFlow(extensionId, key); + _verificationFlowsByExtension[key] = flow; + return flow; + } + + Future _runVerificationFlow(String extensionId, String key) async { + try { + return await openVerificationAndAwaitGrant( + extensionId, + browserMode: ref + .read(settingsProvider) + .extensionVerificationBrowserMode, + awaitForeground: (normalizedExtensionId) async { + if (WidgetsBinding.instance.lifecycleState != + AppLifecycleState.resumed) { + _log.i( + 'Verification required for $normalizedExtensionId while app is in ' + 'background; deferring challenge until the app is foregrounded', + ); + unawaited(_notificationService.showVerificationRequired()); + await _waitForForeground(); + } + }, + ); + } finally { + _verificationFlowsByExtension.remove(key); + } } Future _handleVerificationRequiredDownload( @@ -727,12 +751,13 @@ class DownloadQueueNotifier extends Notifier { } if (status == 'preparing') { - progressUpdates[itemId] = const _ProgressUpdate( + progressUpdates[itemId] = _ProgressUpdate( status: DownloadStatus.downloading, progress: 0.0, speedMBps: 0, bytesReceived: 0, bytesTotal: 0, + preparationStage: itemProgress['stage']?.toString() ?? '', ); if (LogBuffer.loggingEnabled) { @@ -801,12 +826,14 @@ class DownloadQueueNotifier extends Notifier { speedMBps: update.speedMBps ?? current.speedMBps, bytesReceived: update.bytesReceived ?? current.bytesReceived, bytesTotal: update.bytesTotal ?? current.bytesTotal, + preparationStage: update.preparationStage, ); if (current.status != next.status || current.progress != next.progress || current.speedMBps != next.speedMBps || current.bytesReceived != next.bytesReceived || - current.bytesTotal != next.bytesTotal) { + current.bytesTotal != next.bytesTotal || + current.preparationStage != next.preparationStage) { if (!changed) { updatedItems = List.from(updatedItems); changed = true; diff --git a/lib/screens/queue_tab.dart b/lib/screens/queue_tab.dart index b66d4e2f..442a58b2 100644 --- a/lib/screens/queue_tab.dart +++ b/lib/screens/queue_tab.dart @@ -93,6 +93,21 @@ String _formatDownloadProgressLabel(BuildContext context, DownloadItem item) { ); } + if (item.error == 'Waiting for verification') { + return context.l10n.queueWaitingForVerification; + } + switch (item.preparationStage) { + case 'checking_session': + return context.l10n.queueCheckingDownloadSession; + case 'resolving_metadata': + return context.l10n.queueResolvingDownloadMetadata; + case 'resolving_stream': + return context.l10n.queueResolvingDownloadStream; + } + if (item.error == 'Retrying after verification') { + return context.l10n.queueResumingAfterVerification; + } + return context.l10n.queueDownloadStarting; } diff --git a/test/models_and_utils_test.dart b/test/models_and_utils_test.dart index a3d72d99..398f15bb 100644 --- a/test/models_and_utils_test.dart +++ b/test/models_and_utils_test.dart @@ -213,6 +213,7 @@ void main() { bytesTotal: 1024, qualityOverride: 'HI_RES', playlistName: 'Favorites', + preparationStage: 'resolving_stream', preserveQualityVariant: true, ); @@ -227,6 +228,7 @@ void main() { expect(updated.bytesTotal, 1024); expect(updated.qualityOverride, 'HI_RES'); expect(updated.playlistName, 'Favorites'); + expect(updated.preparationStage, 'resolving_stream'); expect(updated.preserveQualityVariant, isTrue); }); @@ -279,9 +281,11 @@ void main() { expect(item.errorType, DownloadErrorType.network); expect(item.progress, 0); expect(item.bytesReceived, 0); + expect(item.preparationStage, isEmpty); expect(item.preserveQualityVariant, isFalse); expect(item.toJson()['status'], 'failed'); expect(item.toJson()['errorType'], 'network'); + expect(item.toJson()['preparationStage'], isEmpty); }); });