diff --git a/lib/bloc/podcast/podcast_bloc.dart b/lib/bloc/podcast/podcast_bloc.dart index f915cf33..e88a269d 100644 --- a/lib/bloc/podcast/podcast_bloc.dart +++ b/lib/bloc/podcast/podcast_bloc.dart @@ -29,6 +29,7 @@ enum PodcastEvent { episodeFilterStarted, episodeFilterNotFinished, episodeFilterFinished, + episodeFilterDownloaded, // Sort episodeSortDefault, episodeSortLatest, @@ -320,6 +321,13 @@ class PodcastBloc extends Bloc { void _listenPodcastStateEvents() async { _podcastEvent.listen((event) async { switch (event) { + case PodcastEvent.episodeFilterDownloaded: + if (_podcast != null) { + _podcast!.filter = PodcastEpisodeFilter.downloaded; + _podcast = await podcastService.save(_podcast!, withEpisodes: false); + await _loadFilteredEpisodes(); + } + break; case PodcastEvent.subscribe: if (_podcast != null) { _podcast = await podcastService.subscribe(_podcast!); @@ -435,6 +443,30 @@ class PodcastBloc extends Bloc { }); } + List applyEpisodeFilter(List episodes) { + List filtered = episodes; + + switch (_podcast?.filter) { + case PodcastEpisodeFilter.started: + filtered = filtered.where((e) => e.position > 0 && !e.played).toList(); + break; + case PodcastEpisodeFilter.played: + filtered = filtered.where((e) => e.played).toList(); + break; + case PodcastEpisodeFilter.notPlayed: + filtered = filtered.where((e) => !e.played).toList(); + break; + case PodcastEpisodeFilter.downloaded: + filtered = filtered.where((e) => e.downloadState == DownloadState.downloaded).toList(); + break; + case PodcastEpisodeFilter.none: + default: + break; + } + + return filtered; + } + void applySearchFilter() { if (_searchTerm.isEmpty) { _episodesStream.add(_episodes); diff --git a/lib/entities/podcast.dart b/lib/entities/podcast.dart index 17b597d4..c9ed6ab2 100644 --- a/lib/entities/podcast.dart +++ b/lib/entities/podcast.dart @@ -13,7 +13,8 @@ enum PodcastEpisodeFilter { none(id: 0), started(id: 1), played(id: 2), - notPlayed(id: 3); + notPlayed(id: 3), + downloaded(id: 4); const PodcastEpisodeFilter({required this.id}); @@ -210,6 +211,7 @@ class Podcast { 1 => PodcastEpisodeFilter.started, 2 => PodcastEpisodeFilter.played, 3 => PodcastEpisodeFilter.notPlayed, + 4 => PodcastEpisodeFilter.downloaded, _ => PodcastEpisodeFilter.none, }; } diff --git a/lib/l10n/L.dart b/lib/l10n/L.dart index 5e1dd23c..2b6cb62e 100644 --- a/lib/l10n/L.dart +++ b/lib/l10n/L.dart @@ -1498,6 +1498,16 @@ class L { ); } + String get episode_filter_downloaded_label { + return message('episode_filter_downloaded_label') ?? + Intl.message( + 'Downloaded', + name: 'episode_filter_downloaded_label', + desc: 'Only show episodes that have been downloaded', + locale: localeName, + ); + } + String get episode_filter_no_episodes_title_label { return message('episode_filter_no_episodes_title_label') ?? Intl.message( diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 9f781a71..2c6f9286 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -108,6 +108,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Heruntergeladen", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Sind Sie sicher, dass Sie diese Episode löschen möchten?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index 1fe794f3..b92636cc 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -108,6 +108,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Downloaded", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Are you sure you wish to delete this episode?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index 094ceb40..73adefa3 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -108,6 +108,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Descargado", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "¿Estás seguro de que deseas eliminar este episodio?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_gl.arb b/lib/l10n/intl_gl.arb index aaba45ed..da8fc16a 100644 --- a/lib/l10n/intl_gl.arb +++ b/lib/l10n/intl_gl.arb @@ -89,6 +89,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Descargado", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Tes certeza de querer eliminar este episodio?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index 83b982d8..aca412bc 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -108,6 +108,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Scaricato", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Sicura/o di voler eliminare questo episodio?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index 4b2ec3b5..0d4ab651 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2025-07-04T06:40:38.603197", + "@@last_modified": "2025-08-05T01:00:20.230759", "app_title": "Anytime Podcast Player", "@app_title": { "description": "Full title for the application", @@ -878,6 +878,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Downloaded", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "episode_filter_no_episodes_title_label": "No Episodes Found", "@episode_filter_no_episodes_title_label": { "description": "No Episodes title", diff --git a/lib/l10n/intl_nl.arb b/lib/l10n/intl_nl.arb index a73cd385..cd9dc6c4 100644 --- a/lib/l10n/intl_nl.arb +++ b/lib/l10n/intl_nl.arb @@ -108,6 +108,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Gedownload", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Weet je zeker dat je deze aflevering wilt verwijderen?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index 407e5aa7..3d7667ff 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -172,6 +172,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Скачано", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Вы уверены, что хотите удалить этот выпуск?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/intl_vi.arb b/lib/l10n/intl_vi.arb index 6fa2b92d..21fad57a 100644 --- a/lib/l10n/intl_vi.arb +++ b/lib/l10n/intl_vi.arb @@ -108,6 +108,12 @@ "type": "text", "placeholders": {} }, + "episode_filter_downloaded_label": "Đã tải xuống", + "@episode_filter_downloaded_label": { + "description": "Only show episodes that have been downloaded", + "type": "text", + "placeholders": {} + }, "delete_episode_confirmation": "Bạn có chắc chắn muốn xóa tập này không?", "@delete_episode_confirmation": { "description": "User is asked to confirm when they attempt to delete an episode", diff --git a/lib/l10n/messages_all_locales.dart b/lib/l10n/messages_all_locales.dart index 730194e7..e584815d 100644 --- a/lib/l10n/messages_all_locales.dart +++ b/lib/l10n/messages_all_locales.dart @@ -12,50 +12,50 @@ import 'package:intl/intl.dart'; import 'package:intl/message_lookup_by_library.dart'; import 'package:intl/src/intl_helpers.dart'; - -import 'messages_de.dart' as messages_de; -import 'messages_en.dart' as messages_en; import 'messages_es.dart' as messages_es; -import 'messages_gl.dart' as messages_gl; import 'messages_it.dart' as messages_it; import 'messages_messages.dart' as messages_messages; + +import 'messages_en.dart' as messages_en; +import 'messages_de.dart' as messages_de; +import 'messages_gl.dart' as messages_gl; import 'messages_nl.dart' as messages_nl; -import 'messages_ru.dart' as messages_ru; import 'messages_vi.dart' as messages_vi; +import 'messages_ru.dart' as messages_ru; typedef Future LibraryLoader(); Map _deferredLibraries = { - 'de': () => Future.value(null), 'en': () => Future.value(null), + 'de': () => Future.value(null), 'es': () => Future.value(null), 'gl': () => Future.value(null), - 'it': () => Future.value(null), - 'messages': () => Future.value(null), + 'it': () => Future.value(null), + 'messages': () => Future.value(null), 'nl': () => Future.value(null), - 'ru': () => Future.value(null), 'vi': () => Future.value(null), + 'ru': () => Future.value(null), }; MessageLookupByLibrary? _findExact(String localeName) { switch (localeName) { - case 'de': - return messages_de.messages; case 'en': return messages_en.messages; + case 'de': + return messages_de.messages; case 'es': - return messages_es.messages; + return messages_es.messages; case 'gl': return messages_gl.messages; case 'it': - return messages_it.messages; - case 'messages': - return messages_messages.messages; + return messages_it.messages; + case 'messages': + return messages_messages.messages; case 'nl': return messages_nl.messages; - case 'ru': - return messages_ru.messages; case 'vi': return messages_vi.messages; + case 'ru': + return messages_ru.messages; default: return null; } @@ -64,9 +64,8 @@ MessageLookupByLibrary? _findExact(String localeName) { /// User programs should call this before using [localeName] for messages. Future initializeMessages(String? localeName) async { var availableLocale = Intl.verifiedLocale( - localeName, - (locale) => _deferredLibraries[locale] != null, - onFailure: (_) => null); + localeName, (locale) => _deferredLibraries[locale] != null, + onFailure: (_) => null); if (availableLocale == null) { return Future.value(false); } @@ -86,8 +85,8 @@ bool _messagesExistFor(String locale) { } MessageLookupByLibrary? _findGeneratedMessagesFor(String locale) { - var actualLocale = Intl.verifiedLocale(locale, _messagesExistFor, - onFailure: (_) => null); + var actualLocale = + Intl.verifiedLocale(locale, _messagesExistFor, onFailure: (_) => null); if (actualLocale == null) return null; return _findExact(actualLocale); } diff --git a/lib/l10n/messages_de.dart b/lib/l10n/messages_de.dart index ce361473..78b67e6a 100644 --- a/lib/l10n/messages_de.dart +++ b/lib/l10n/messages_de.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Ihre Warteschlange ist leer'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Episodeninformationen anzeigen'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Filter zurücksetzen'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Heruntergeladen'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('Dieser Podcast hat keine Episoden, die Ihren Suchkriterien und Filtern entsprechen'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Keine Episoden Gefunden'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Keiner'), diff --git a/lib/l10n/messages_en.dart b/lib/l10n/messages_en.dart index ad5d7e5e..e8f61a7e 100644 --- a/lib/l10n/messages_en.dart +++ b/lib/l10n/messages_en.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Your queue is empty'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Show episode information'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Clear Filters'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Downloaded'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('This podcast has no episodes matching your search criteria and filter'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('No Episodes Found'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('None'), diff --git a/lib/l10n/messages_es.dart b/lib/l10n/messages_es.dart index 4db68968..c32c7213 100644 --- a/lib/l10n/messages_es.dart +++ b/lib/l10n/messages_es.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Tu lista de reproducción está vacia'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Mostrar información del episodio'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Limpiar filtros'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Downloaded'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('Este podcast no tiene episodios que coincidan con tus criterios de búsqueda y filtro'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Episodios no encontrados'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Sin filtro'), diff --git a/lib/l10n/messages_gl.dart b/lib/l10n/messages_gl.dart index 64912eba..b28db31a 100644 --- a/lib/l10n/messages_gl.dart +++ b/lib/l10n/messages_gl.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('A lista está baleira'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Mostrar información do episodio'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Limpar filtros'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Descargado'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('Este podcast non ten episodios que sigan os criterios do teu filtro'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Non hai episodios'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Ningún'), diff --git a/lib/l10n/messages_it.dart b/lib/l10n/messages_it.dart index 2113321b..9dc2e2b8 100644 --- a/lib/l10n/messages_it.dart +++ b/lib/l10n/messages_it.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('La tua coda è vuota'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Mostra le informazioni sull\'episodio'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Pulisci i Filtri'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Downloaded'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('Questo podcast non ha episodi che corrispondono ai tuoi criteri di ricerca e filtro'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Nessun episodio trovato'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Nessuno'), diff --git a/lib/l10n/messages_messages.dart b/lib/l10n/messages_messages.dart index 738eeba0..1465399d 100644 --- a/lib/l10n/messages_messages.dart +++ b/lib/l10n/messages_messages.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Your queue is empty'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Show episode information'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Clear Filters'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Downloaded'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('No Episodes Found'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('No Episodes Found'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('None'), diff --git a/lib/l10n/messages_nl.dart b/lib/l10n/messages_nl.dart index 5940b251..a1f6f59e 100644 --- a/lib/l10n/messages_nl.dart +++ b/lib/l10n/messages_nl.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Je wachtrij is leeg'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Toon afleveringinformatie'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Filters wissen'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Gedownload'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('Er zijn geen afleveringen van deze podcast die voldoen aan uw zoekcriteria en filter.'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Geen Afleveringen Gevonden'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Geen'), diff --git a/lib/l10n/messages_ru.dart b/lib/l10n/messages_ru.dart index 1107eb24..b9a58ec8 100644 --- a/lib/l10n/messages_ru.dart +++ b/lib/l10n/messages_ru.dart @@ -89,6 +89,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Ваша очередь пуста'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Показать информацию выпуска'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Очистить фильтры'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Скачано'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('В этом подкасте нет выпусков по вашим критериям поиска и фильтру'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Не найдено выпусков'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Никаких'), diff --git a/lib/l10n/messages_vi.dart b/lib/l10n/messages_vi.dart index e34cfeaf..ad1a93fc 100644 --- a/lib/l10n/messages_vi.dart +++ b/lib/l10n/messages_vi.dart @@ -57,6 +57,7 @@ class MessageLookup extends MessageLookupByLibrary { 'empty_queue_message': MessageLookupByLibrary.simpleMessage('Hàng chờ của bạn đang trống'), 'episode_details_button_label': MessageLookupByLibrary.simpleMessage('Hiển thị thông tin tập'), 'episode_filter_clear_filters_button_label': MessageLookupByLibrary.simpleMessage('Xóa bộ lọc'), + 'episode_filter_downloaded_label': MessageLookupByLibrary.simpleMessage('Đã tải xuống'), 'episode_filter_no_episodes_title_description': MessageLookupByLibrary.simpleMessage('Podcast này không có tập nào khớp với tiêu chí tìm kiếm và bộ lọc của bạn'), 'episode_filter_no_episodes_title_label': MessageLookupByLibrary.simpleMessage('Không tìm thấy tập nào'), 'episode_filter_none_label': MessageLookupByLibrary.simpleMessage('Không'), diff --git a/lib/repository/sembast/sembast_repository.dart b/lib/repository/sembast/sembast_repository.dart index 91e6ae88..a5960773 100644 --- a/lib/repository/sembast/sembast_repository.dart +++ b/lib/repository/sembast/sembast_repository.dart @@ -518,6 +518,9 @@ class SembastRepository extends Repository { case PodcastEpisodeFilter.notPlayed: episodeFilter = Filter.and([Filter.equals('pguid', pguid), Filter.equals('played', 'false')]); break; + case PodcastEpisodeFilter.downloaded: + episodeFilter = Filter.and([Filter.equals('pguid', pguid), Filter.equals('downloaded', '100')]); + break; } return episodeFilter; } diff --git a/lib/services/podcast/mobile_podcast_service.dart b/lib/services/podcast/mobile_podcast_service.dart index 157fbdf4..84964e48 100644 --- a/lib/services/podcast/mobile_podcast_service.dart +++ b/lib/services/podcast/mobile_podcast_service.dart @@ -764,6 +764,8 @@ class MobilePodcastService extends PodcastService { case PodcastEpisodeFilter.notPlayed: filteredEpisodes = podcast.episodes.where((e) => e.highlight || !e.played).toList(); break; + case PodcastEpisodeFilter.downloaded: + filteredEpisodes = podcast.episodes.where((e) => e.highlight || e.downloaded).toList(); } switch (podcast.sort) { diff --git a/lib/ui/widgets/episode_filter_selector.dart b/lib/ui/widgets/episode_filter_selector.dart index 095bb2ea..8787247a 100644 --- a/lib/ui/widgets/episode_filter_selector.dart +++ b/lib/ui/widgets/episode_filter_selector.dart @@ -140,6 +140,12 @@ class _EpisodeFilterSliderState extends State { selectedFilter: widget.podcast.filter, ), const Divider(), + EpisodeFilterSelectorEntry( + label: L.of(context)!.episode_filter_downloaded_label, + filter: PodcastEpisodeFilter.downloaded, + selectedFilter: widget.podcast.filter, + ), + const Divider(), ], ), ) @@ -179,6 +185,9 @@ class EpisodeFilterSelectorEntry extends StatelessWidget { case PodcastEpisodeFilter.notPlayed: podcastBloc.podcastEvent(PodcastEvent.episodeFilterNotFinished); break; + case PodcastEpisodeFilter.downloaded: + podcastBloc.podcastEvent(PodcastEvent.episodeFilterDownloaded); + break; } Navigator.pop(context);