summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2020-10-25 17:31:47 +0100
committerByteHamster <info@bytehamster.com>2020-10-25 17:31:47 +0100
commitc8a2f20000032228226149500767ba903752e0a5 (patch)
tree0c56db9a3d01f6ce916d26d84a7ae9ca0ec5b60d
parent28ebbedbdf34b72b31c536a118bcf5108b3ea7e5 (diff)
parent3e4e6381bd39a40b210e5b6ab054e3adee371330 (diff)
downloadAntennaPod-c8a2f20000032228226149500767ba903752e0a5.zip
Merge branch 'develop' into add-local-feeds
-rw-r--r--.circleci/config.yml13
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md10
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md7
-rw-r--r--.github/workflows/android-emulator.yml2
-rw-r--r--.tx/config9
-rw-r--r--CONTRIBUTORS105
-rw-r--r--README.md6
-rw-r--r--app/build.gradle16
-rw-r--r--app/src/free/java/de/danoeh/antennapod/dialog/RatingDialog.java (renamed from app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java)2
-rw-r--r--app/src/main/AndroidManifest.xml7
-rw-r--r--app/src/main/assets/developers.csv18
-rw-r--r--app/src/main/assets/special_thanks.csv3
-rw-r--r--app/src/main/assets/translators.csv85
-rw-r--r--app/src/main/java/de/danoeh/antennapod/PodcastApp.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java57
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java88
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java65
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java38
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java82
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java44
-rw-r--r--app/src/main/java/de/danoeh/antennapod/discovery/PodcastIndexPodcastSearcher.java126
-rw-r--r--app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearchResult.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearcherRegistry.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/error/CrashReportWriter.java (renamed from app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java)11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/error/RxJavaErrorHandlerSetup.java36
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java18
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java110
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java13
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java31
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java16
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java14
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java33
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java79
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java23
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java19
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/GpodderPreferencesFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java30
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java (renamed from app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java)15
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java95
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java (renamed from app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutDevelopersFragment.java)12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java (renamed from app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutLicensesFragment.java)6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java58
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java (renamed from app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutTranslatorsFragment.java)12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/view/LockableBottomSheetBehavior.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/view/ToolbarIconTintManager.java24
-rw-r--r--app/src/main/play/listings/de-DE/full-description.txt4
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.pngbin1497812 -> 1073593 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.pngbin1412509 -> 975991 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.pngbin775545 -> 931300 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.pngbin1396778 -> 634159 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.pngbin1007155 -> 832513 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.pngbin1119328 -> 1057683 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/feature-graphic/feature-graphic.pngbin60183 -> 154355 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/icon/icon.pngbin25302 -> 211969 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/00.pngbin1469428 -> 1062876 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/01.pngbin609387 -> 953326 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/02.pngbin784201 -> 563909 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/03.pngbin1408825 -> 625108 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/04.pngbin902025 -> 791607 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/05.pngbin1129419 -> 951698 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/promo-graphic/promo-graphic.pngbin10717 -> 9775 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/tv-banner/tv-banner.pngbin81268 -> 290613 bytes
-rw-r--r--app/src/main/play/listings/es-ES/graphics/phone-screenshots/00.pngbin0 -> 1059048 bytes
-rw-r--r--app/src/main/play/listings/es-ES/graphics/phone-screenshots/01.pngbin0 -> 950880 bytes
-rw-r--r--app/src/main/play/listings/es-ES/graphics/phone-screenshots/02.pngbin0 -> 566507 bytes
-rw-r--r--app/src/main/play/listings/es-ES/graphics/phone-screenshots/03.pngbin0 -> 631537 bytes
-rw-r--r--app/src/main/play/listings/es-ES/graphics/phone-screenshots/04.pngbin0 -> 790678 bytes
-rw-r--r--app/src/main/play/listings/es-ES/graphics/phone-screenshots/05.pngbin0 -> 944519 bytes
-rw-r--r--app/src/main/play/listings/et/full-description.txt6
-rw-r--r--app/src/main/play/listings/fr-FR/full-description.txt4
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/00.pngbin0 -> 1059937 bytes
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/01.pngbin0 -> 958188 bytes
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/02.pngbin0 -> 558621 bytes
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/03.pngbin0 -> 627704 bytes
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/04.pngbin0 -> 800579 bytes
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/05.pngbin0 -> 950236 bytes
-rw-r--r--app/src/main/play/listings/gl-ES/full-description.txt12
-rw-r--r--app/src/main/play/listings/hu-HU/full-description.txt4
-rw-r--r--app/src/main/play/listings/it-IT/full-description.txt26
-rw-r--r--app/src/main/play/listings/it-IT/graphics/phone-screenshots/00.pngbin0 -> 1054112 bytes
-rw-r--r--app/src/main/play/listings/it-IT/graphics/phone-screenshots/01.pngbin0 -> 950751 bytes
-rw-r--r--app/src/main/play/listings/it-IT/graphics/phone-screenshots/02.pngbin0 -> 573414 bytes
-rw-r--r--app/src/main/play/listings/it-IT/graphics/phone-screenshots/03.pngbin0 -> 635544 bytes
-rw-r--r--app/src/main/play/listings/it-IT/graphics/phone-screenshots/04.pngbin0 -> 792202 bytes
-rw-r--r--app/src/main/play/listings/it-IT/graphics/phone-screenshots/05.pngbin0 -> 945111 bytes
-rw-r--r--app/src/main/play/listings/iw-IL/full-description.txt67
-rw-r--r--app/src/main/play/listings/lt/full-description.txt31
-rw-r--r--app/src/main/play/listings/lt/short-description.txt1
-rw-r--r--app/src/main/play/listings/lt/title.txt1
-rw-r--r--app/src/main/play/listings/nl-NL/full-description.txt4
-rw-r--r--app/src/main/play/listings/nl-NL/graphics/phone-screenshots/00.pngbin0 -> 1059430 bytes
-rw-r--r--app/src/main/play/listings/nl-NL/graphics/phone-screenshots/01.pngbin0 -> 963352 bytes
-rw-r--r--app/src/main/play/listings/nl-NL/graphics/phone-screenshots/02.pngbin0 -> 567202 bytes
-rw-r--r--app/src/main/play/listings/nl-NL/graphics/phone-screenshots/03.pngbin0 -> 631105 bytes
-rw-r--r--app/src/main/play/listings/nl-NL/graphics/phone-screenshots/04.pngbin0 -> 789348 bytes
-rw-r--r--app/src/main/play/listings/nl-NL/graphics/phone-screenshots/05.pngbin0 -> 952291 bytes
-rw-r--r--app/src/main/play/listings/pt-BR/full-description.txt31
-rw-r--r--app/src/main/play/listings/pt-BR/short-description.txt1
-rw-r--r--app/src/main/play/listings/pt-BR/title.txt1
-rw-r--r--app/src/main/play/listings/pt-PT/full-description.txt31
-rw-r--r--app/src/main/play/listings/pt-PT/short-description.txt1
-rw-r--r--app/src/main/play/listings/pt-PT/title.txt1
-rw-r--r--app/src/main/play/listings/ru-RU/full-description.txt18
-rw-r--r--app/src/main/play/listings/sv-SE/full-description.txt4
-rw-r--r--app/src/main/play/listings/zh-CN/full-description.txt4
-rw-r--r--app/src/main/play/listings/zh-TW/full-description.txt31
-rw-r--r--app/src/main/play/listings/zh-TW/short-description.txt1
-rw-r--r--app/src/main/play/listings/zh-TW/title.txt1
-rw-r--r--app/src/main/play/release-notes/en-US/default.txt4
-rw-r--r--app/src/main/res/layout/addfeed.xml46
-rw-r--r--app/src/main/res/layout/all_episodes_fragment.xml27
-rw-r--r--app/src/main/res/layout/audioplayer_fragment.xml3
-rw-r--r--app/src/main/res/layout/cover_fragment.xml17
-rw-r--r--app/src/main/res/layout/feed_item_list_fragment.xml19
-rw-r--r--app/src/main/res/layout/feeditemlist_header.xml2
-rw-r--r--app/src/main/res/layout/feeditemlist_item.xml5
-rw-r--r--app/src/main/res/layout/fragment_itunes_search.xml33
-rw-r--r--app/src/main/res/layout/fragment_subscriptions.xml29
-rw-r--r--app/src/main/res/layout/gpodnet_podcast_listitem.xml2
-rw-r--r--app/src/main/res/layout/itunes_podcast_listitem.xml2
-rw-r--r--app/src/main/res/layout/nav_list.xml7
-rw-r--r--app/src/main/res/layout/onlinefeedview_activity.xml2
-rw-r--r--app/src/main/res/layout/quick_feed_discovery.xml27
-rw-r--r--app/src/main/res/layout/search_fragment.xml11
-rw-r--r--app/src/main/res/layout/statistics_listitem.xml2
-rw-r--r--app/src/main/res/values-sw360dp/resource-overrides.xml4
-rw-r--r--app/src/main/res/values/integers.xml1
-rw-r--r--app/src/main/res/xml/preferences.xml5
-rw-r--r--app/src/main/res/xml/preferences_about.xml11
-rw-r--r--app/src/main/res/xml/preferences_gpodder.xml5
-rw-r--r--app/src/main/res/xml/preferences_network.xml12
-rw-r--r--app/src/main/res/xml/preferences_notifications.xml22
-rw-r--r--app/src/main/res/xml/preferences_user_interface.xml2
-rw-r--r--app/src/play/java/de/danoeh/antennapod/dialog/CustomMRControllerDialog.java6
-rw-r--r--app/src/play/java/de/danoeh/antennapod/dialog/RatingDialog.java122
-rw-r--r--artwork/feature-graphic.svg164
-rw-r--r--artwork/ic_launcher.svg75
-rw-r--r--artwork/screenshots/generateScreenshots.sh71
-rw-r--r--artwork/screenshots/raw/de-DE/00.pngbin988741 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/01.pngbin995809 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/02.pngbin254192 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/03a.pngbin393905 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/03b.pngbin395890 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/04.pngbin473491 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/05.pngbin704178 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/tablet.pngbin480806 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/texts.txt7
-rw-r--r--artwork/screenshots/raw/en-US/00.pngbin952560 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/01.pngbin97710 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/02.pngbin250923 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/03a.pngbin394632 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/03b.pngbin396605 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/04.pngbin380087 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/05.pngbin759276 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/tablet.pngbin215587 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/en-US/texts.txt7
-rw-r--r--artwork/screenshots/raw/fr-FR/00.pngbin951594 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/01.pngbin96555 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/02.pngbin254441 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/03a.pngbin396364 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/03b.pngbin398409 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/04.pngbin379047 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/05.pngbin726651 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/tablet.pngbin476990 -> 0 bytes
l---------artwork/screenshots/raw/nl-NL/00.png1
l---------artwork/screenshots/raw/nl-NL/01.png1
l---------artwork/screenshots/raw/nl-NL/02.png1
l---------artwork/screenshots/raw/nl-NL/03a.png1
l---------artwork/screenshots/raw/nl-NL/03b.png1
l---------artwork/screenshots/raw/nl-NL/04.png1
l---------artwork/screenshots/raw/nl-NL/05.png1
-rw-r--r--artwork/screenshots/raw/nl-NL/tablet.pngbin477148 -> 0 bytes
-rw-r--r--artwork/screenshots/raw/nl-NL/texts.txt7
-rw-r--r--artwork/screenshots/templates/phone.pngbin452645 -> 0 bytes
-rw-r--r--artwork/screenshots/templates/suggestions.pngbin561417 -> 0 bytes
-rw-r--r--artwork/screenshots/templates/tablet.pngbin165190 -> 0 bytes
-rw-r--r--artwork/screenshots/templates/twophones-a.pngbin544210 -> 0 bytes
-rw-r--r--artwork/screenshots/templates/twophones-b.pngbin478127 -> 0 bytes
-rw-r--r--artwork/screenshots/templates/twophones.pngbin3737 -> 0 bytes
-rw-r--r--build.gradle9
-rw-r--r--core/build.gradle13
-rw-r--r--core/src/debug/res/drawable/ic_launcher_background_debug.xml179
-rw-r--r--core/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml5
-rw-r--r--core/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml5
-rw-r--r--core/src/debug/res/mipmap-hdpi/ic_launcher.pngbin0 -> 8724 bytes
-rw-r--r--core/src/debug/res/mipmap-hdpi/ic_launcher_foreground.pngbin0 -> 20491 bytes
-rw-r--r--core/src/debug/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 8724 bytes
-rw-r--r--core/src/debug/res/mipmap-mdpi/ic_launcher.pngbin0 -> 4821 bytes
-rw-r--r--core/src/debug/res/mipmap-mdpi/ic_launcher_foreground.pngbin0 -> 9963 bytes
-rw-r--r--core/src/debug/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 4821 bytes
-rw-r--r--core/src/debug/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 13548 bytes
-rw-r--r--core/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.pngbin0 -> 34069 bytes
-rw-r--r--core/src/debug/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 13548 bytes
-rw-r--r--core/src/debug/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 25054 bytes
-rw-r--r--core/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.pngbin0 -> 75392 bytes
-rw-r--r--core/src/debug/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 25054 bytes
-rw-r--r--core/src/debug/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 38151 bytes
-rw-r--r--core/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.pngbin0 -> 117617 bytes
-rw-r--r--core/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 38151 bytes
-rw-r--r--core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java10
-rw-r--r--core/src/main/AndroidManifest.xml14
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/event/DiscoveryDefaultUpdateEvent.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java106
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilterGroup.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java19
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/ProviderInstallerInterceptor.java18
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java157
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java34
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java32
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ssl/BackportCaCerts.java73
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ssl/BackportTrustManager.java58
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ssl/CompositeX509TrustManager.java60
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ssl/NoV1SslSocketFactory.java100
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java39
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java111
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/StatisticsItem.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java172
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/comparator/FeedItemPubdateComparator.java22
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/exception/RxJavaErrorHandlerSetup.java24
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/gui/NotificationUtils.java10
-rw-r--r--core/src/main/res/color/filter_dialog_background_dark.xml5
-rw-r--r--core/src/main/res/color/filter_dialog_background_light.xml5
-rw-r--r--core/src/main/res/drawable-hdpi/ic_notification.pngbin0 -> 1016 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_notification.pngbin0 -> 618 bytes
-rw-r--r--core/src/main/res/drawable-nodpi/ic_launcher_foreground_no_finish.pngbin0 -> 74988 bytes
-rw-r--r--core/src/main/res/drawable-nodpi/teaser.pngbin60183 -> 208621 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_notification.pngbin0 -> 1441 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_notification.pngbin0 -> 2390 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_notification.pngbin0 -> 3121 bytes
-rw-r--r--core/src/main/res/drawable/bg_splash.xml12
-rw-r--r--core/src/main/res/drawable/filter_dialog_background_dark.xml5
-rw-r--r--core/src/main/res/drawable/filter_dialog_background_light.xml5
-rw-r--r--core/src/main/res/drawable/ic_antenna.xml6
-rw-r--r--core/src/main/res/drawable/ic_notifications_black.xml9
-rw-r--r--core/src/main/res/drawable/ic_notifications_white.xml5
-rw-r--r--core/src/main/res/drawable/notification_default_large_icon.xml15
-rw-r--r--core/src/main/res/layout/player_widget.xml8
-rw-r--r--core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml2
-rw-r--r--core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml2
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher.pngbin4628 -> 8596 bytes
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher_background.pngbin0 -> 7069 bytes
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher_foreground.pngbin4876 -> 20308 bytes
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin4628 -> 8596 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher.pngbin2752 -> 4783 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher_background.pngbin0 -> 3120 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher_foreground.pngbin2884 -> 10041 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin2752 -> 4783 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher.pngbin6709 -> 13307 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher_background.pngbin0 -> 13262 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.pngbin6980 -> 34640 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin6709 -> 13307 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin10809 -> 24321 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher_background.pngbin0 -> 35451 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.pngbin12641 -> 74736 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin10809 -> 24321 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin15604 -> 37255 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher_background.pngbin0 -> 64580 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.pngbin19600 -> 120501 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin15604 -> 37255 bytes
-rw-r--r--core/src/main/res/values-br/strings.xml821
-rw-r--r--core/src/main/res/values-ca/strings.xml118
-rw-r--r--core/src/main/res/values-cs/strings.xml288
-rw-r--r--core/src/main/res/values-da/strings.xml63
-rw-r--r--core/src/main/res/values-de/strings.xml7
-rw-r--r--core/src/main/res/values-es/strings.xml10
-rw-r--r--core/src/main/res/values-et/strings.xml103
-rw-r--r--core/src/main/res/values-eu/strings.xml7
-rw-r--r--core/src/main/res/values-fa/strings.xml10
-rw-r--r--core/src/main/res/values-fi/strings.xml216
-rw-r--r--core/src/main/res/values-fr/strings.xml9
-rw-r--r--core/src/main/res/values-gl/strings.xml11
-rw-r--r--core/src/main/res/values-hu/strings.xml40
-rw-r--r--core/src/main/res/values-it/strings.xml7
-rw-r--r--core/src/main/res/values-iw/strings.xml7
-rw-r--r--core/src/main/res/values-ja/strings.xml2
-rw-r--r--core/src/main/res/values-ko/strings.xml7
-rw-r--r--core/src/main/res/values-lt/strings.xml223
-rw-r--r--core/src/main/res/values-nb/strings.xml5
-rw-r--r--core/src/main/res/values-nl/strings.xml11
-rw-r--r--core/src/main/res/values-pl/strings.xml57
-rw-r--r--core/src/main/res/values-pt-rBR/strings.xml103
-rw-r--r--core/src/main/res/values-pt/strings.xml11
-rw-r--r--core/src/main/res/values-ru/strings.xml112
-rw-r--r--core/src/main/res/values-sv/strings.xml7
-rw-r--r--core/src/main/res/values-uk/strings.xml2
-rw-r--r--core/src/main/res/values-zh-rCN/strings.xml25
-rw-r--r--core/src/main/res/values-zh-rTW/strings.xml768
-rw-r--r--core/src/main/res/values/arrays.xml10
-rw-r--r--core/src/main/res/values/attrs.xml1
-rw-r--r--core/src/main/res/values/colors.xml3
-rw-r--r--core/src/main/res/values/strings.xml46
-rw-r--r--core/src/main/res/values/styles.xml20
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java19
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java4
-rw-r--r--ic_launcher-web.pngbin53849 -> 0 bytes
333 files changed, 5541 insertions, 1712 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 093954036..1a97e73c5 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -8,7 +8,7 @@ jobs:
type: steps
default: []
docker:
- - image: circleci/android:api-28
+ - image: circleci/android:api-30
working_directory: ~/AntennaPod
environment:
GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx1536m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError"'
@@ -90,7 +90,14 @@ workflows:
- run:
name: Lint app
command: ./gradlew app:lintPlayRelease
+ - run:
+ name: Lint core
+ command: ./gradlew core:lintPlayRelease
- store_artifacts:
- name: Uploading lint reports
+ name: Uploading app lint reports
path: app/build/reports/lint-results-playRelease.html
- destination: lint-results.html
+ destination: lint-results-app.html
+ - store_artifacts:
+ name: Uploading core lint reports
+ path: core/build/reports/lint-results-playRelease.html
+ destination: lint-results-core.html
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 25697186a..16a12484e 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -1,7 +1,7 @@
---
name: Bug report
about: Create a report to help us improve existing features
-
+labels: 'possible bug'
---
# Checklist
@@ -14,9 +14,12 @@ about: Create a report to help us improve existing features
# System info
<!-- The following information is very important to fill out because some bugs may only occur on certain devices or versions of Android. -->
-**App version**: x.y.z (Where did you download the app?)
+**App version**: x.y.z
<!-- The latest version may be different depending on your device. You can find the version in AntennaPod's settings. -->
+**App source**: Google Play / F-Droid / ...
+<!-- Please delete irrelevant answer or fill in the blank -->
+
**Android version**: 5.x (Please mention if you are using a custom rom!)
**Device model**:
@@ -37,7 +40,8 @@ about: Create a report to help us improve existing features
**First occurred**: (e.g. about x days/weeks ago)
-**Environment**: (Settings you have changed (e.g. Auto Download). "Unusual" devices you use (e.g. Bluetooth headphones). Did you select another media player?)
+**Environment**:
+<!-- Settings you have changed (e.g. Auto Download, changed media player). "Unusual" devices you use (e.g. Bluetooth headphones). -->
**Stacktrace/Logcat**:
<!-- If you are experiencing a crash, including the stacktrace will likely get it fixed sooner. AntennaPod has an `export logs` feature for this. -->
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index bb60476d6..24f2f5772 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -1,6 +1,6 @@
---
name: Feature request
-about: Request a new feature
+about: Request a new feature or enhancement
---
@@ -13,8 +13,11 @@ about: Request a new feature
# System info
+**App version**: x.y.z
<!-- The latest version may be different depending on your device. You can find the version in AntennaPod's settings. -->
-**App version**: x.y.z (state whether from Google Play/F-Droid/Custom built APK)
+
+**App source**: Google Play / F-Droid / ...
+<!-- Please delete irrelevant answer or fill in the blank -->
# Feature description
diff --git a/.github/workflows/android-emulator.yml b/.github/workflows/android-emulator.yml
index 2946b2be2..afff13f7f 100644
--- a/.github/workflows/android-emulator.yml
+++ b/.github/workflows/android-emulator.yml
@@ -16,7 +16,7 @@ jobs:
- name: Build with Gradle
run: ./gradlew assemblePlayDebugAndroidTest
- name: Android Emulator test
- uses: ReactiveCircus/android-emulator-runner@v2.2.0
+ uses: ReactiveCircus/android-emulator-runner@v2
with:
api-level: 28
disable-animations: true
diff --git a/.tx/config b/.tx/config
index 954c6150a..43e05555a 100644
--- a/.tx/config
+++ b/.tx/config
@@ -4,6 +4,7 @@ host = https://www.transifex.com
[antennapod.core-values]
source_file = core/src/main/res/values/strings.xml
source_lang = en
+trans.br = core/src/main/res/values-br/strings.xml
trans.ca = core/src/main/res/values-ca/strings.xml
trans.cs_CZ = core/src/main/res/values-cs/strings.xml
trans.da = core/src/main/res/values-da/strings.xml
@@ -42,7 +43,7 @@ trans.ar = app/src/main/play/listings/ar/full-description.txt
trans.az = app/src/main/play/listings/az-AZ/full-description.txt
trans.bg = app/src/main/play/listings/bg/full-description.txt
trans.ca = app/src/main/play/listings/ca/full-description.txt
-trans.cs = app/src/main/play/listings/cs-CZ/full-description.txt
+trans.cs_CZ = app/src/main/play/listings/cs-CZ/full-description.txt
trans.da = app/src/main/play/listings/da-DK/full-description.txt
trans.de = app/src/main/play/listings/de-DE/full-description.txt
trans.el = app/src/main/play/listings/el-GR/full-description.txt
@@ -64,7 +65,7 @@ trans.lt = app/src/main/play/listings/lt/full-description.txt
trans.nl = app/src/main/play/listings/nl-NL/full-description.txt
trans.pl_PL = app/src/main/play/listings/pl-PL/full-description.txt
trans.pt_BR = app/src/main/play/listings/pt-BR/full-description.txt
-trans.pt_PT = app/src/main/play/listings/pt-PT/full-description.txt
+trans.pt = app/src/main/play/listings/pt-PT/full-description.txt
trans.ro_RO = app/src/main/play/listings/ro/full-description.txt
trans.ru_RU = app/src/main/play/listings/ru-RU/full-description.txt
trans.sl_SI = app/src/main/play/listings/sl/full-description.txt
@@ -82,7 +83,7 @@ trans.ar = app/src/main/play/listings/ar/short-description.txt
trans.az = app/src/main/play/listings/az-AZ/short-description.txt
trans.bg = app/src/main/play/listings/bg/short-description.txt
trans.ca = app/src/main/play/listings/ca/short-description.txt
-trans.cs = app/src/main/play/listings/cs-CZ/short-description.txt
+trans.cs_CZ = app/src/main/play/listings/cs-CZ/short-description.txt
trans.da = app/src/main/play/listings/da-DK/short-description.txt
trans.de = app/src/main/play/listings/de-DE/short-description.txt
trans.el = app/src/main/play/listings/el-GR/short-description.txt
@@ -104,7 +105,7 @@ trans.lt = app/src/main/play/listings/lt/short-description.txt
trans.nl = app/src/main/play/listings/nl-NL/short-description.txt
trans.pl_PL = app/src/main/play/listings/pl-PL/short-description.txt
trans.pt_BR = app/src/main/play/listings/pt-BR/short-description.txt
-trans.pt_PT = app/src/main/play/listings/pt-PT/short-description.txt
+trans.pt = app/src/main/play/listings/pt-PT/short-description.txt
trans.ro_RO = app/src/main/play/listings/ro/short-description.txt
trans.ru_RU = app/src/main/play/listings/ru-RU/short-description.txt
trans.sl_SI = app/src/main/play/listings/sl/short-description.txt
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index dabd2911e..bd4a20cc4 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -5,38 +5,41 @@ TomHennen
orionlee
domingos86
andersonvom
+TacoTheDank
shortspider
ebraminio
spacecowboy
patheticpat
+tonytamsf
brad
Cj-Malone
maxbechtold
+asdoi
gaul
qkolj
-tonytamsf
pachecosf
+gerardolgvr
+bws9000
ahangarha
+damoasda
hannesa2
keunes
rharriso
xgouchet
-damoasda
sevenmaster
TheRealFalcon
jas14
+johnjohndoe
udif
malockin
dirkmueller
jatinkumarg
peschmae0
-TacoTheDank
orelogo
txtd
ydinath
CedricCabessa
mchelen
-johnjohndoe
dethstar
drabux
saqura
@@ -83,17 +86,18 @@ mr-intj
tuxayo
schlch
alimemonzx
+olivoto
alanorth
alexte
andrey-krutov
arantius
-bws9000
chrissicool
cszucko
CWftw
danielm5
ariedov
brettle
+edwinhere
eirikv
eerden
jklippel
@@ -104,13 +108,16 @@ kvithayathil
luiscruz
mlasson
M-arcel
+msoose
mo
mdeveloper20
+Slinger
mschuetz
MolarAmbiguity
mounirlamouri
ortylp
PtilopsisLeucotis
+ramzan
SamWhited
selivan
sonnayasomnambula
@@ -123,54 +130,56 @@ edent
atrus6
waylife
amhokies
+andrewc1
axq
fossterer
jmdouglas
lightonflux
minusf
-Arabic: abdelrahman.fahem93, abdunnasir, abuzar3.khalid, desha, iDemo, mohamedagamy, msahouli, nabilMaghura, rex07, shubbar
+
+
+Arabic: abuzar3.khalid, keunes, nabilMaghura, rex07
Asturian (ast_ES): enolp
-Azerbaijani: danieloeh, kotfenix
-Basque: gaztainalde, pospolos, zakurranputza
-Bulgarian: bozhkov, ByteHamster, solusitor
-Catalan: dvd1985, exort12, javiercoll, Kintu, lambdani, marcmetallextrem, xc70
-Chinese (zh_CN): bebeauties38, cyril3, domingos86, dudeG, ErlichLiu, Felix2yu, gaohongyuan, Guaidaodl, Huck0, iconteral, jhxie, jxj2zzz79pfp9bpo, kavdx, kyleehee, linxiangyu, molisiye, owen8877, RainSlide, Sak94664, spice2wolf, stellaxuyi, tonytamsf, tupunco, wi24rd, wongsyrone, xukeek, yangyang, yiqiok, YogaGuru
-Chinese (zh_TW): ByteHamster, Fei1Yang, gugod, ijliao, nigelinux, pggdt, Solomon, tonytamsf, ymhuang0808
-Czech (cs_CZ): anotheranonymoususer, elich, Hanzmeister, mcepl, petnek, svetlemodry
-Danish: danieloeh, jhertel
-Dutch: e2jk, glotzbach, rwv, Vistaus
-English: mfietz, sterylmreep
-Estonian: ByteHamster, Eraser, mahfiaz
-Finnish: danieloeh, elguitar, Sahtor
-French: cactux, ChaoticMind, clombion, e2jk, edewaele, glotzbach, lacouture, LouFex, Matth78, mfietz, Poussinou, repat, Sioul, sterylmreep, TacoTheDank, Tilwa, vcariven, whenrow
+Basque: gaztainalde, keunes, Osoitz, pospolos
+Breton: Belvar, keunes
+Bulgarian: keunes, solusitor
+Catalan: carles.llacer, dvd1985, exort12, javiercoll, keunes, Kintu, lambdani, marcmetallextrem, xc70
+Chinese (zh_CN): brnme, cyril3, Felix2yu, gaohongyuan, Guaidaodl, Huck0, iconteral, jhxie, jxj2zzz79pfp9bpo, keunes, kyleehee, molisiye, owen8877, RainSlide, Sak94664, spice2wolf, tupunco, wongsyrone, yangyang, yiqiok
+Chinese (zh_TW): bobchao, ijliao, keunes, mapobi, pggdt, ymhuang0808
+Czech (cs_CZ): anotheranonymoususer, elich, Hanzmeister, svetlemodry, Thomaash
+Danish: jhertel, keunes, SebastianKiwiDk, twikedk
+Dutch: e2jk, keunes, rwv, Vistaus
+Estonian: Eraser, keunes, mahfiaz
+Finnish: Ban3, keunes, Sahtor
+French: ChaoticMind, clombion, Cornegidouille, e2jk, keunes, lacouture, LouFex, Matth78, Poussinou, sterylmreep
Galician: antiparvos, pikamoku, Raichely
-German: 112358, altegedanken, barilla, benedikt.g, bitsunited, Buggi, ByteHamster, ceving, ChaoticMind, Chaquotay, csrichter, dab0015, dadosch, DerSilly, die_otto, DJaeger, elkangaroo, enz, f_grubm, fidel, finsterwalder, Foso, GNi33, hightower5, HolgerJeromin, kalei, Kenriec, lohmann, LostInWeb, mfietz, moasda, nilso, Quiss42, rakudave, repat, SAPlayer, schafia, Schroedingberg, sevenmaster, skyerjoe, sucaml, Teaspoon, theonlytruth, weltenwort, Wyrrrd, ypid
-Modern Greek (1453-): antonist, danieloeh, hua2016s, jack.ath92, MSavoritias, pavlosv
-Hebrew (he_IL): amir.dafnyman, E1i9, mongoose4004, pinkasey, rellieberman, Yaron, הלוי11
-Hindi (hi_IN): ankitiitb1069, Isaasu, nmabhinandan, purple.coder, realChakrawarti, siddhusengar
-Hungarian: glatz.balazs, hurrikan, lna91, marthynw, meskobalazs, naren93, tszauer, ttyborg42
-Icelandic: marthjod
-Indonesian: dbrw, jff, levirs565, luke137, rezafaiza, silvanael16
-Italian (it_IT): aalex70, allin, apanontin, Bonnee, buongiorgio, giuseppep, Guybrush88, ilmanzo, m.chinni, marco_pag, neonsoftware, niccord, nixxo, sevenmaster, theloca95
-Japanese: KotaKato, mamehacker, Naofumi, RACER1, sh3llc4t, TranslatorG
-Kannada (kn_IN): chiraag.nataraj, thejeshgn
-Korean: changwoo, libliboom, seungrye, skcha
-Lithuanian: naglis
+German: ByteHamster, ceving, dadosch, DerSilly, elkangaroo, enz, f_grubm, finsterwalder, HolgerJeromin, kalei, keunes, mfietz, Quiss42, repat, ypid
+Modern Greek (1453-): AnimaRain, antonist, keunes, pavlosv
+Hebrew (he_IL): amir.dafnyman, E1i9, mongoose4004, pinkasey, rellieberman, Yaron
+Hindi (hi_IN): keunes, purple.coder, siddhusengar
+Hungarian: hurrikan, keunes, lna91, marthynw, meskobalazs, naren93
+Icelandic: keunes, marthjod
+Indonesian: dbrw, keunes, levirs565
+Italian (it_IT): aalex70, allin, Bonnee, dontknowcris, giuseppep, Guybrush88, ilmanzo, keunes, m.chinni, marco_pag, neonsoftware, niccord, theloca95
+Japanese: keunes, KotaKato, Naofumi, sh3llc4t, TranslatorG
+Kannada (kn_IN): chiraag.nataraj, keunes, thejeshgn
+Korean: changwoo, keunes, libliboom
+Lithuanian: keunes, naglis
Macedonian: krisfremen
-Malayalam: joice, rashivkp, rubenroy
-Norwegian Bokmål (nb_NO): bablecopherye, corkie, Dexy2811, heraldo, jakobkg, kongk, sevenmaster, timbast
-Persian: ahangarha, danialbehzadi, ebraminio, F7D, hamidrezabayat76, sinamoghaddas, Twastica
-Polish (pl_PL): d6210809, hiro2020, Iwangelion, kRkk, lomapur, mandlus, maniexx, Mephistofeles, shark103, tyle
-Portuguese: andersonvom, domingos86, emansije, smarquespt
-Portuguese (pt_BR): alexupits, alysonborges, andersonvom, arua, caioau, carlo_valente, castrors, claudiofdasilva, deandreamatias, edman, Firmino, jackmiras, Junin, lipefire, lluccia, lucasmotacr, mbaltar, rogervezaro, RubeensVinicius, SamWilliam, silvanael16
-Romanian (ro_RO): corneliu.e, fuzzmz, ralienpp
-Russian (ru_RU): astra1, btimofeev, Duke_Raven, gammja, GaynullinDima, homocomputeris, IgorPolyakov, MegMasters98, mercutiy, null, overmind88, Platun0v, PtilopsisLeucotis, s.chebotar, shams4real, skvheadless, un_logic, Vladryyu, whereisthetea, zhenya97
-Slovak: ati3, ByteHamster, tiborepcek
-Slovenian (sl_SI): panter23
-Spanish: AleksSyntek, andersonvom, Atreyu94, coperfix, deandreamatias, domingos86, dvd1985, Fitoschido, frandavid100, hard_ware, javiercoll, Juanmuto, lambdani, LatinSuD, leogrignafini, palopezv, TacoTheDank, tres.14159, vfmatzkin, wakutiteo
-Swahili (macrolanguage): kmtra
-Swedish (sv_SE): albin.brantin, Bio, bpnilsson, ChaoticMind, jony08, nilso, SharpMelon, TiloWiklund, TwoD
-Telugu: Isaasu, veeven
-Turkish: abcmen, basarancaner, brsata, Erdy, golcuk, overbite, Slsdem
-Ukrainian (uk_UA): IndibidAbulya, older, paul_sm, sergiyr, zhenya97
-Vietnamese: abnvolk, nguyenvui, ppanhh, vietnamesel10n
+Malayalam: joice, keunes, rashivkp
+Norwegian Bokmål (nb_NO): abstrakct, bablecopherye, corkie, heraldo, jakobkg, keunes, kongk, sevenmaster, timbast
+Persian: ahangarha, danialbehzadi, ebraminio, F7D, hamidrezabayat76, keunes, sinamoghaddas
+Polish (pl_PL): hiro2020, Iwangelion, keunes, lomapur, mandlus, maniexx, Mephistofeles, shark103, tyle
+Portuguese: emansije, keunes, smarquespt
+Portuguese (pt_BR): alexupits, alysonborges, andersonvom, arua, caioau, carlo_valente, castrors, edman, keunes, lipefire, mbaltar, olivoto, rogervezaro, RubeensVinicius, SamWilliam
+Romanian (ro_RO): corneliu.e, fuzzmz, keunes, ralienpp
+Russian (ru_RU): btimofeev, Duke_Raven, gammja, homocomputeris, IgorPolyakov, keunes, mercutiy, null, overmind88, Platun0v, PtilopsisLeucotis, s.chebotar, un_logic, Vladryyu, whereisthetea
+Slovak: ati3, keunes, tiborepcek
+Slovenian (sl_SI): keunes, panter23
+Spanish: AleksSyntek, andersonvom, andrespelaezp, deandreamatias, dvd1985, Fitoschido, frandavid100, hard_ware, javiercoll, keunes, LatinSuD, leogrignafini, tres.14159, vfmatzkin, wakutiteo
+Swahili (macrolanguage): keunes, kmtra
+Swedish (sv_SE): bpnilsson, keunes, nilso, TwoD
+Telugu: keunes, veeven
+Turkish: brsata, Erdy, keunes, overbite, Slsdem
+Ukrainian (uk_UA): IndibidAbulya, keunes, older, paul_sm, sergiyr, zhenya97
+Vietnamese: abnvolk, keunes, ppanhh
diff --git a/README.md b/README.md
index 50b4f1d20..3a59b7974 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,8 @@ You can use the [AntennaPod Forum](https://forum.antennapod.org/) for discussion
Bug reports and feature requests can be submitted [here](https://github.com/AntennaPod/AntennaPod/issues) (please read the [instructions](https://github.com/AntennaPod/AntennaPod/blob/master/CONTRIBUTING.md) on how to report a bug and how to submit a feature request first!).
-## Help test AntennaPod
-AntennaPod has many users and we don't want them to run into trouble when we add a new feature. It's important that we have a significant group test our app, so that we know all possible combinations of phones, Android versions and use cases work as expected. Check out our wiki how to join our [Alpha and Beta testing programmes](https://github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod)!
+## Help to test AntennaPod
+AntennaPod has many users and we don't want them to run into trouble when we add a new feature. It's important that we have a significant group test our app, so that we know all possible combinations of phones, Android versions and use cases work as expected. Check out our wiki on how to join our [Alpha and Beta testing programmes](https://github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod)!
## License
@@ -30,5 +30,5 @@ If you want to translate AntennaPod into another language, you can visit the [Tr
## Building AntennaPod
-Information on how to build AntennaPod can be found in the [Wiki](https://github.com/AntennaPod/AntennaPod/wiki/Building-AntennaPod).
+Information on how to build AntennaPod can be found in the [wiki](https://github.com/AntennaPod/AntennaPod/wiki/Building-AntennaPod).
diff --git a/app/build.gradle b/app/build.gradle
index 4b44cf80c..84cb9d747 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -14,8 +14,8 @@ android {
// "1.2.3-SNAPSHOT" -> 1020300
// "1.2.3-RC4" -> 1020304
// "1.2.3" -> 1020395
- versionCode 2000007
- versionName "2.0.0-RC7"
+ versionCode 2000295
+ versionName "2.0.2"
multiDexEnabled false
vectorDrawables.useSupportLibrary true
@@ -31,6 +31,14 @@ android {
}
buildConfigField "String", "COMMIT_HASH", ('"' + commit + '"')
+ if (project.hasProperty("podcastindexApiKey")) {
+ buildConfigField "String", "PODCASTINDEX_API_KEY", '"' + podcastindexApiKey + '"'
+ buildConfigField "String", "PODCASTINDEX_API_SECRET", '"' + podcastindexApiSecret + '"'
+ } else {
+ buildConfigField "String", "PODCASTINDEX_API_KEY", '"XTMMQGA2YZ4WJUBYY4HK"'
+ buildConfigField "String", "PODCASTINDEX_API_SECRET", '"XAaAhk4^2YBsTE33vdbwbZNj82ZRLABDDqFdKe7x"'
+ }
+
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex: 'de.danoeh.antennapod.ApEventBusIndex']
@@ -40,6 +48,9 @@ android {
signingConfigs {
releaseConfig {
+ v1SigningEnabled true
+ v2SigningEnabled true
+
if (project.hasProperty("releaseStoreFile")) {
storeFile file(releaseStoreFile)
} else {
@@ -141,6 +152,7 @@ dependencies {
// free build hack: skip some dependencies
if (!doFreeBuild()) {
playImplementation project(":core")
+ implementation 'com.google.android.play:core:1.8.0'
} else {
System.out.println("app: free build hack, skipping some dependencies")
}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java b/app/src/free/java/de/danoeh/antennapod/dialog/RatingDialog.java
index 7cb274708..255da6eaf 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java
+++ b/app/src/free/java/de/danoeh/antennapod/dialog/RatingDialog.java
@@ -110,4 +110,4 @@ public class RatingDialog {
.setOnCancelListener(dialog1 -> resetStartDate())
.create();
}
-}
+} \ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e7829ebc5..fb205b1c3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -37,13 +37,14 @@
android:usesCleartextTraffic="true"
android:supportsRtl="true"
android:logo="@mipmap/ic_launcher"
- android:resizeableActivity="true">
+ android:resizeableActivity="true"
+ android:allowAudioPlaybackCapture="true">
<meta-data android:name="android.webkit.WebView.MetricsOptOut"
android:value="true"/>
<meta-data android:name="com.google.android.gms.car.notification.SmallIcon"
- android:resource="@drawable/ic_antenna"/>
+ android:resource="@drawable/ic_notification"/>
<meta-data
android:name="com.google.android.gms.car.application"
android:resource="@xml/automotive_app_desc"/>
@@ -80,7 +81,7 @@
<activity
android:name=".activity.MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|density|uiMode|keyboard|navigation"
- android:windowSoftInputMode="stateHidden"
+ android:windowSoftInputMode="stateAlwaysHidden"
android:launchMode="singleTask"
android:label="@string/app_name">
</activity>
diff --git a/app/src/main/assets/developers.csv b/app/src/main/assets/developers.csv
index ab8169eef..cff15ee38 100644
--- a/app/src/main/assets/developers.csv
+++ b/app/src/main/assets/developers.csv
@@ -5,38 +5,41 @@ TomHennen;5216560;Maintainer (retired)
orionlee;250644;Contributor
domingos86;9538859;Contributor
andersonvom;69922;Contributor
+TacoTheDank;32376686;Contributor
shortspider;5712543;Contributor
ebraminio;833473;Contributor
spacecowboy;223655;Contributor
patheticpat;16046;Contributor
+tonytamsf;149837;Contributor
brad;1614;Contributor
Cj-Malone;10121513;Contributor
maxbechtold;9162198;Contributor
+asdoi;36813904;Contributor
gaul;848247;Contributor
qkolj;6667105;Contributor
-tonytamsf;149837;Contributor
pachecosf;46357909;Contributor
+gerardolgvr;20119298;Contributor
+bws9000;262625;Contributor
ahangarha;11241315;Contributor
+damoasda;46045854;Contributor
hannesa2;3314607;Contributor
keunes;11229646;Contributor
rharriso;570910;Contributor
xgouchet;818706;Contributor
-damoasda;46045854;Contributor
sevenmaster;12869538;Contributor
TheRealFalcon;153674;Contributor
jas14;569991;Contributor
+johnjohndoe;144518;Contributor
udif;809640;Contributor
malockin;12814657;Contributor
dirkmueller;1029152;Contributor
jatinkumarg;20503830;Contributor
peschmae0;4450993;Contributor
-TacoTheDank;32376686;Contributor
orelogo;15976578;Contributor
txtd;7108931;Contributor
ydinath;4193331;Contributor
CedricCabessa;365097;Contributor
mchelen;30691;Contributor
-johnjohndoe;144518;Contributor
dethstar;1239177;Contributor
drabux;10663142;Contributor
saqura;1935380;Contributor
@@ -83,17 +86,18 @@ mr-intj;6268767;Contributor
tuxayo;2678215;Contributor
schlch;56929215;Contributor
alimemonzx;44647595;Contributor
+olivoto;15932680;Contributor
alanorth;191754;Contributor
alexte;7724992;Contributor
andrey-krutov;1488973;Contributor
arantius;84729;Contributor
-bws9000;262625;Contributor
chrissicool;232590;Contributor
cszucko;1810383;Contributor
CWftw;1498303;Contributor
danielm5;66779;Contributor
ariedov;958646;Contributor
brettle;118192;Contributor
+edwinhere;19705425;Contributor
eirikv;4076243;Contributor
eerden;277513;Contributor
jklippel;8657220;Contributor
@@ -104,13 +108,16 @@ kvithayathil;1056073;Contributor
luiscruz;1080714;Contributor
mlasson;5814258;Contributor
M-arcel;56698158;Contributor
+msoose;30473690;Contributor
mo;7117;Contributor
mdeveloper20;2319126;Contributor
+Slinger;75751;Contributor
mschuetz;108637;Contributor
MolarAmbiguity;10541979;Contributor
mounirlamouri;573590;Contributor
ortylp;470439;Contributor
PtilopsisLeucotis;54054883;Contributor
+ramzan;55637406;Contributor
SamWhited;512573;Contributor
selivan;1208989;Contributor
sonnayasomnambula;7716779;Contributor
@@ -123,6 +130,7 @@ edent;837136;Contributor
atrus6;357881;Contributor
waylife;3348620;Contributor
amhokies;3124968;Contributor
+andrewc1;19559401;Contributor
axq;5077221;Contributor
fossterer;4236021;Contributor
jmdouglas;10855634;Contributor
diff --git a/app/src/main/assets/special_thanks.csv b/app/src/main/assets/special_thanks.csv
new file mode 100644
index 000000000..348e3208e
--- /dev/null
+++ b/app/src/main/assets/special_thanks.csv
@@ -0,0 +1,3 @@
+221 Pixels;Logo design;https://avatars2.githubusercontent.com/u/58243143?s=60&v=4
+ByteHamster;Forum admin;https://avatars2.githubusercontent.com/u/5811634?s=60&v=4
+Keunes;Communications;https://avatars2.githubusercontent.com/u/11229646?s=60&v=4
diff --git a/app/src/main/assets/translators.csv b/app/src/main/assets/translators.csv
index 90b98f8db..a7d289963 100644
--- a/app/src/main/assets/translators.csv
+++ b/app/src/main/assets/translators.csv
@@ -1,46 +1,45 @@
-Arabic;abdelrahman.fahem93, abdunnasir, abuzar3.khalid, desha, iDemo, mohamedagamy, msahouli, nabilMaghura, rex07, shubbar
+Arabic;abuzar3.khalid, keunes, nabilMaghura, rex07
Asturian (ast_ES);enolp
-Azerbaijani;danieloeh, kotfenix
-Basque;gaztainalde, pospolos, zakurranputza
-Bulgarian;bozhkov, ByteHamster, solusitor
-Catalan;dvd1985, exort12, javiercoll, Kintu, lambdani, marcmetallextrem, xc70
-Chinese (zh_CN);bebeauties38, cyril3, domingos86, dudeG, ErlichLiu, Felix2yu, gaohongyuan, Guaidaodl, Huck0, iconteral, jhxie, jxj2zzz79pfp9bpo, kavdx, kyleehee, linxiangyu, molisiye, owen8877, RainSlide, Sak94664, spice2wolf, stellaxuyi, tonytamsf, tupunco, wi24rd, wongsyrone, xukeek, yangyang, yiqiok, YogaGuru
-Chinese (zh_TW);ByteHamster, Fei1Yang, gugod, ijliao, nigelinux, pggdt, Solomon, tonytamsf, ymhuang0808
-Czech (cs_CZ);anotheranonymoususer, elich, Hanzmeister, mcepl, petnek, svetlemodry
-Danish;danieloeh, jhertel
-Dutch;e2jk, glotzbach, rwv, Vistaus
-English;mfietz, sterylmreep
-Estonian;ByteHamster, Eraser, mahfiaz
-Finnish;danieloeh, elguitar, Sahtor
-French;cactux, ChaoticMind, clombion, e2jk, edewaele, glotzbach, lacouture, LouFex, Matth78, mfietz, Poussinou, repat, Sioul, sterylmreep, TacoTheDank, Tilwa, vcariven, whenrow
+Basque;gaztainalde, keunes, Osoitz, pospolos
+Breton;Belvar, keunes
+Bulgarian;keunes, solusitor
+Catalan;carles.llacer, dvd1985, exort12, javiercoll, keunes, Kintu, lambdani, marcmetallextrem, xc70
+Chinese (zh_CN);brnme, cyril3, Felix2yu, gaohongyuan, Guaidaodl, Huck0, iconteral, jhxie, jxj2zzz79pfp9bpo, keunes, kyleehee, molisiye, owen8877, RainSlide, Sak94664, spice2wolf, tupunco, wongsyrone, yangyang, yiqiok
+Chinese (zh_TW);bobchao, ijliao, keunes, mapobi, pggdt, ymhuang0808
+Czech (cs_CZ);anotheranonymoususer, elich, Hanzmeister, svetlemodry, Thomaash
+Danish;jhertel, keunes, SebastianKiwiDk, twikedk
+Dutch;e2jk, keunes, rwv, Vistaus
+Estonian;Eraser, keunes, mahfiaz
+Finnish;Ban3, keunes, Sahtor
+French;ChaoticMind, clombion, Cornegidouille, e2jk, keunes, lacouture, LouFex, Matth78, Poussinou, sterylmreep
Galician;antiparvos, pikamoku, Raichely
-German;112358, altegedanken, barilla, benedikt.g, bitsunited, Buggi, ByteHamster, ceving, ChaoticMind, Chaquotay, csrichter, dab0015, dadosch, DerSilly, die_otto, DJaeger, elkangaroo, enz, f_grubm, fidel, finsterwalder, Foso, GNi33, hightower5, HolgerJeromin, kalei, Kenriec, lohmann, LostInWeb, mfietz, moasda, nilso, Quiss42, rakudave, repat, SAPlayer, schafia, Schroedingberg, sevenmaster, skyerjoe, sucaml, Teaspoon, theonlytruth, weltenwort, Wyrrrd, ypid
-Modern Greek (1453-);antonist, danieloeh, hua2016s, jack.ath92, MSavoritias, pavlosv
-Hebrew (he_IL);amir.dafnyman, E1i9, mongoose4004, pinkasey, rellieberman, Yaron, הלוי11
-Hindi (hi_IN);ankitiitb1069, Isaasu, nmabhinandan, purple.coder, realChakrawarti, siddhusengar
-Hungarian;glatz.balazs, hurrikan, lna91, marthynw, meskobalazs, naren93, tszauer, ttyborg42
-Icelandic;marthjod
-Indonesian;dbrw, jff, levirs565, luke137, rezafaiza, silvanael16
-Italian (it_IT);aalex70, allin, apanontin, Bonnee, buongiorgio, giuseppep, Guybrush88, ilmanzo, m.chinni, marco_pag, neonsoftware, niccord, nixxo, sevenmaster, theloca95
-Japanese;KotaKato, mamehacker, Naofumi, RACER1, sh3llc4t, TranslatorG
-Kannada (kn_IN);chiraag.nataraj, thejeshgn
-Korean;changwoo, libliboom, seungrye, skcha
-Lithuanian;naglis
+German;ByteHamster, ceving, dadosch, DerSilly, elkangaroo, enz, f_grubm, finsterwalder, HolgerJeromin, kalei, keunes, mfietz, Quiss42, repat, ypid
+Modern Greek (1453-);AnimaRain, antonist, keunes, pavlosv
+Hebrew (he_IL);amir.dafnyman, E1i9, mongoose4004, pinkasey, rellieberman, Yaron
+Hindi (hi_IN);keunes, purple.coder, siddhusengar
+Hungarian;hurrikan, keunes, lna91, marthynw, meskobalazs, naren93
+Icelandic;keunes, marthjod
+Indonesian;dbrw, keunes, levirs565
+Italian (it_IT);aalex70, allin, Bonnee, dontknowcris, giuseppep, Guybrush88, ilmanzo, keunes, m.chinni, marco_pag, neonsoftware, niccord, theloca95
+Japanese;keunes, KotaKato, Naofumi, sh3llc4t, TranslatorG
+Kannada (kn_IN);chiraag.nataraj, keunes, thejeshgn
+Korean;changwoo, keunes, libliboom
+Lithuanian;keunes, naglis
Macedonian;krisfremen
-Malayalam;joice, rashivkp, rubenroy
-Norwegian Bokmål (nb_NO);bablecopherye, corkie, Dexy2811, heraldo, jakobkg, kongk, sevenmaster, timbast
-Persian;ahangarha, danialbehzadi, ebraminio, F7D, hamidrezabayat76, sinamoghaddas, Twastica
-Polish (pl_PL);d6210809, hiro2020, Iwangelion, kRkk, lomapur, mandlus, maniexx, Mephistofeles, shark103, tyle
-Portuguese;andersonvom, domingos86, emansije, smarquespt
-Portuguese (pt_BR);alexupits, alysonborges, andersonvom, arua, caioau, carlo_valente, castrors, claudiofdasilva, deandreamatias, edman, Firmino, jackmiras, Junin, lipefire, lluccia, lucasmotacr, mbaltar, rogervezaro, RubeensVinicius, SamWilliam, silvanael16
-Romanian (ro_RO);corneliu.e, fuzzmz, ralienpp
-Russian (ru_RU);astra1, btimofeev, Duke_Raven, gammja, GaynullinDima, homocomputeris, IgorPolyakov, MegMasters98, mercutiy, null, overmind88, Platun0v, PtilopsisLeucotis, s.chebotar, shams4real, skvheadless, un_logic, Vladryyu, whereisthetea, zhenya97
-Slovak;ati3, ByteHamster, tiborepcek
-Slovenian (sl_SI);panter23
-Spanish;AleksSyntek, andersonvom, Atreyu94, coperfix, deandreamatias, domingos86, dvd1985, Fitoschido, frandavid100, hard_ware, javiercoll, Juanmuto, lambdani, LatinSuD, leogrignafini, palopezv, TacoTheDank, tres.14159, vfmatzkin, wakutiteo
-Swahili (macrolanguage);kmtra
-Swedish (sv_SE);albin.brantin, Bio, bpnilsson, ChaoticMind, jony08, nilso, SharpMelon, TiloWiklund, TwoD
-Telugu;Isaasu, veeven
-Turkish;abcmen, basarancaner, brsata, Erdy, golcuk, overbite, Slsdem
-Ukrainian (uk_UA);IndibidAbulya, older, paul_sm, sergiyr, zhenya97
-Vietnamese;abnvolk, nguyenvui, ppanhh, vietnamesel10n
+Malayalam;joice, keunes, rashivkp
+Norwegian Bokmål (nb_NO);abstrakct, bablecopherye, corkie, heraldo, jakobkg, keunes, kongk, sevenmaster, timbast
+Persian;ahangarha, danialbehzadi, ebraminio, F7D, hamidrezabayat76, keunes, sinamoghaddas
+Polish (pl_PL);hiro2020, Iwangelion, keunes, lomapur, mandlus, maniexx, Mephistofeles, shark103, tyle
+Portuguese;emansije, keunes, smarquespt
+Portuguese (pt_BR);alexupits, alysonborges, andersonvom, arua, caioau, carlo_valente, castrors, edman, keunes, lipefire, mbaltar, olivoto, rogervezaro, RubeensVinicius, SamWilliam
+Romanian (ro_RO);corneliu.e, fuzzmz, keunes, ralienpp
+Russian (ru_RU);btimofeev, Duke_Raven, gammja, homocomputeris, IgorPolyakov, keunes, mercutiy, null, overmind88, Platun0v, PtilopsisLeucotis, s.chebotar, un_logic, Vladryyu, whereisthetea
+Slovak;ati3, keunes, tiborepcek
+Slovenian (sl_SI);keunes, panter23
+Spanish;AleksSyntek, andersonvom, andrespelaezp, deandreamatias, dvd1985, Fitoschido, frandavid100, hard_ware, javiercoll, keunes, LatinSuD, leogrignafini, tres.14159, vfmatzkin, wakutiteo
+Swahili (macrolanguage);keunes, kmtra
+Swedish (sv_SE);bpnilsson, keunes, nilso, TwoD
+Telugu;keunes, veeven
+Turkish;brsata, Erdy, keunes, overbite, Slsdem
+Ukrainian (uk_UA);IndibidAbulya, keunes, older, paul_sm, sergiyr, zhenya97
+Vietnamese;abnvolk, keunes, ppanhh
diff --git a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
index ed3f4e8f1..534d48479 100644
--- a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
+++ b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
@@ -12,6 +12,8 @@ import com.joanzapata.iconify.fonts.MaterialModule;
import de.danoeh.antennapod.activity.SplashActivity;
import de.danoeh.antennapod.core.ApCoreEventBusIndex;
import de.danoeh.antennapod.core.ClientConfig;
+import de.danoeh.antennapod.error.CrashReportWriter;
+import de.danoeh.antennapod.error.RxJavaErrorHandlerSetup;
import de.danoeh.antennapod.spa.SPAUtil;
import org.greenrobot.eventbus.EventBus;
@@ -38,6 +40,7 @@ public class PodcastApp extends Application {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(new CrashReportWriter());
+ RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
if (BuildConfig.DEBUG) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder()
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java
index b1a0ba2a2..bff11fa5e 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java
@@ -3,11 +3,22 @@ package de.danoeh.antennapod.activity;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.util.Log;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.content.FileProvider;
+
+
import android.widget.TextView;
-import de.danoeh.antennapod.CrashReportWriter;
+
+
+import de.danoeh.antennapod.error.CrashReportWriter;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.IntentUtils;
@@ -17,11 +28,13 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
+import java.util.List;
/**
* Displays the 'crash report' screen
*/
public class BugReportActivity extends AppCompatActivity {
+ private static final String TAG = "BugReportActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -30,17 +43,20 @@ public class BugReportActivity extends AppCompatActivity {
getSupportActionBar().setDisplayShowHomeEnabled(true);
setContentView(R.layout.bug_report);
- String crashDetailsText = CrashReportWriter.getSystemInfo() + "\n\n";
- TextView crashDetailsTextView = findViewById(R.id.crash_report_logs);
-
+ String stacktrace = "No crash report recorded";
try {
File crashFile = CrashReportWriter.getFile();
- crashDetailsText += IOUtils.toString(new FileInputStream(crashFile), Charset.forName("UTF-8"));
+ if (crashFile.exists()) {
+ stacktrace = IOUtils.toString(new FileInputStream(crashFile), Charset.forName("UTF-8"));
+ } else {
+ Log.d(TAG, stacktrace);
+ }
} catch (IOException e) {
e.printStackTrace();
- crashDetailsText += "No crash report recorded";
}
- crashDetailsTextView.setText(crashDetailsText);
+
+ TextView crashDetailsTextView = findViewById(R.id.crash_report_logs);
+ crashDetailsTextView.setText(CrashReportWriter.getSystemInfo() + "\n\n" + stacktrace);
findViewById(R.id.btn_open_bug_tracker).setOnClickListener(v -> IntentUtils.openInBrowser(
BugReportActivity.this, "https://github.com/AntennaPod/AntennaPod/issues"));
@@ -58,12 +74,35 @@ public class BugReportActivity extends AppCompatActivity {
filename.createNewFile();
String cmd = "logcat -d -f " + filename.getAbsolutePath();
Runtime.getRuntime().exec(cmd);
- Snackbar.make(findViewById(android.R.id.content),
- filename.getAbsolutePath(), Snackbar.LENGTH_SHORT).show();
+ //share file
+ try {
+ Intent i = new Intent(Intent.ACTION_SEND);
+ i.setType("text/*");
+ String authString = getString(de.danoeh.antennapod.core.R.string.provider_authority);
+ Uri fileUri = FileProvider.getUriForFile(this, authString, filename);
+ i.putExtra(Intent.EXTRA_STREAM, fileUri);
+ i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
+ PackageManager pm = getPackageManager();
+ List<ResolveInfo> resInfos = pm.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);
+ for (ResolveInfo resolveInfo : resInfos) {
+ String packageName = resolveInfo.activityInfo.packageName;
+ grantUriPermission(packageName, fileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ }
+ }
+ String chooserTitle = getString(de.danoeh.antennapod.core.R.string.share_file_label);
+ startActivity(Intent.createChooser(i, chooserTitle));
+ } catch (Exception e) {
+ e.printStackTrace();
+ int strResId = R.string.log_file_share_exception;
+ Snackbar.make(findViewById(android.R.id.content), strResId, Snackbar.LENGTH_LONG)
+ .show();
+ }
} catch (IOException e) {
e.printStackTrace();
Snackbar.make(findViewById(android.R.id.content), e.getMessage(), Snackbar.LENGTH_LONG).show();
}
});
}
+
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
index f772cb084..6f237e1aa 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
@@ -6,12 +6,15 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
+import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -22,6 +25,8 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
@@ -33,6 +38,8 @@ import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.event.MessageEvent;
import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.receiver.MediaButtonReceiver;
+import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.StorageUtils;
import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
@@ -71,6 +78,8 @@ public class MainActivity extends CastEnabledActivity {
public static final String EXTRA_FEED_ID = "fragment_feed_id";
public static final String EXTRA_OPEN_PLAYER = "open_player";
public static final String EXTRA_REFRESH_ON_START = "refresh_on_start";
+ public static final String EXTRA_STARTED_FROM_SEARCH = "started_from_search";
+ public static final String KEY_GENERATED_VIEW_ID = "generated_view_id";
private @Nullable DrawerLayout drawerLayout;
private @Nullable ActionBarDrawerToggle drawerToggle;
@@ -92,6 +101,9 @@ public class MainActivity extends CastEnabledActivity {
public void onCreate(Bundle savedInstanceState) {
lastTheme = UserPreferences.getNoTitleTheme();
setTheme(lastTheme);
+ if (savedInstanceState != null) {
+ ensureGeneratedViewIdGreaterThan(savedInstanceState.getInt(KEY_GENERATED_VIEW_ID, 0));
+ }
super.onCreate(savedInstanceState);
StorageUtils.checkStorageAvailability(this);
setContentView(R.layout.main);
@@ -143,6 +155,25 @@ public class MainActivity extends CastEnabledActivity {
sheetBehavior.setBottomSheetCallback(bottomSheetCallback);
}
+ /**
+ * ViewCompat.generateViewId stores the current ID in a static variable.
+ * When the process is killed, the variable gets reset.
+ * This makes sure that we do not get ID collisions
+ * and therefore errors when trying to restore state from another view.
+ */
+ @SuppressWarnings("StatementWithEmptyBody")
+ private void ensureGeneratedViewIdGreaterThan(int minimum) {
+ while (ViewCompat.generateViewId() <= minimum) {
+ // Generate new IDs
+ }
+ }
+
+ @Override
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(KEY_GENERATED_VIEW_ID, ViewCompat.generateViewId());
+ }
+
private BottomSheetBehavior.BottomSheetCallback bottomSheetCallback =
new BottomSheetBehavior.BottomSheetCallback() {
@Override
@@ -181,7 +212,7 @@ public class MainActivity extends CastEnabledActivity {
SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
if (prefs.getBoolean(PREF_IS_FIRST_LAUNCH, true)) {
loadFragment(AddFeedFragment.TAG, null);
- new Handler().postDelayed(() -> {
+ new Handler(Looper.getMainLooper()).postDelayed(() -> {
if (drawerLayout != null) { // Tablet layout does not have a drawer
drawerLayout.openDrawer(navDrawer);
}
@@ -477,7 +508,11 @@ public class MainActivity extends CastEnabledActivity {
if (tag != null) {
loadFragment(tag, args);
} else if (feedId > 0) {
- loadFeedFragmentById(feedId, args);
+ if (intent.getBooleanExtra(EXTRA_STARTED_FROM_SEARCH, false)) {
+ loadChildFragment(FeedItemlistFragment.newInstance(feedId));
+ } else {
+ loadFeedFragmentById(feedId, args);
+ }
}
sheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
} else if (intent.getBooleanExtra(EXTRA_OPEN_PLAYER, false)) {
@@ -511,4 +546,53 @@ public class MainActivity extends CastEnabledActivity {
public Snackbar showSnackbarAbovePlayer(int text, int duration) {
return showSnackbarAbovePlayer(getResources().getText(text), duration);
}
+
+ //Hardware keyboard support
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
+ Integer customKeyCode = null;
+
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_P:
+ customKeyCode = KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE;
+ break;
+ case KeyEvent.KEYCODE_J: //Fallthrough
+ case KeyEvent.KEYCODE_A:
+ case KeyEvent.KEYCODE_COMMA:
+ customKeyCode = KeyEvent.KEYCODE_MEDIA_REWIND;
+ break;
+ case KeyEvent.KEYCODE_K: //Fallthrough
+ case KeyEvent.KEYCODE_D:
+ case KeyEvent.KEYCODE_PERIOD:
+ customKeyCode = KeyEvent.KEYCODE_MEDIA_FAST_FORWARD;
+ break;
+ case KeyEvent.KEYCODE_PLUS: //Fallthrough
+ case KeyEvent.KEYCODE_W:
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
+ return true;
+ case KeyEvent.KEYCODE_MINUS: //Fallthrough
+ case KeyEvent.KEYCODE_S:
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
+ return true;
+ case KeyEvent.KEYCODE_M:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_TOGGLE_MUTE, AudioManager.FLAG_SHOW_UI);
+ return true;
+ }
+ break;
+ }
+
+ if (customKeyCode != null) {
+ Intent intent = new Intent(this, PlaybackService.class);
+ intent.putExtra(MediaButtonReceiver.EXTRA_KEYCODE, customKeyCode);
+ ContextCompat.startForegroundService(this, intent);
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
index f6623d5dc..3bacdc75f 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -508,6 +508,8 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
// feed.getId() is always 0, we have to retrieve the id from the feed list from
// the database
Intent intent = MainActivity.getIntentToOpenFeed(this, getFeedId(feed));
+ intent.putExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH,
+ getIntent().getBooleanExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH, false));
finish();
startActivity(intent);
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
index 4f6010b75..6e526911b 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
@@ -19,6 +19,7 @@ import de.danoeh.antennapod.fragment.preferences.GpodderPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.ImportExportPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.MainPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.NetworkPreferencesFragment;
+import de.danoeh.antennapod.fragment.preferences.NotificationPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.PlaybackPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.StoragePreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.UserInterfacePreferencesFragment;
@@ -70,6 +71,8 @@ public class PreferenceActivity extends AppCompatActivity implements SearchPrefe
prefFragment = new GpodderPreferencesFragment();
} else if (screen == R.xml.preferences_playback) {
prefFragment = new PlaybackPreferencesFragment();
+ } else if (screen == R.xml.preferences_notifications) {
+ prefFragment = new NotificationPreferencesFragment();
}
return prefFragment;
}
@@ -90,6 +93,8 @@ public class PreferenceActivity extends AppCompatActivity implements SearchPrefe
return R.string.user_interface_label;
case R.xml.preferences_gpodder:
return R.string.gpodnet_main_label;
+ case R.xml.preferences_notifications:
+ return R.string.notification_pref_fragment;
default:
return R.string.settings_label;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
index 8c66b6a4c..2d4510e8f 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
@@ -3,14 +3,18 @@ package de.danoeh.antennapod.activity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
+import android.media.AudioManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.animation.AlphaAnimation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
+
+import androidx.appcompat.view.menu.ActionMenuItem;
import androidx.core.view.WindowCompat;
import androidx.appcompat.app.ActionBar;
import android.text.TextUtils;
@@ -102,6 +106,7 @@ public class VideoplayerActivity extends MediaplayerActivity {
if (!PictureInPictureUtil.isInPictureInPictureMode(this)) {
videoControlsHider.stop();
}
+ progressIndicator.setVisibility(View.GONE); // Controller released; we will not receive buffering updates
}
@Override
@@ -187,7 +192,7 @@ public class VideoplayerActivity extends MediaplayerActivity {
videoControlsHider.stop();
if (System.currentTimeMillis() - lastScreenTap < 300) {
- if (event.getX() > v.getMeasuredWidth() / 2) {
+ if (event.getX() > v.getMeasuredWidth() / 2.0f) {
onFastForward();
showSkipAnimation(true);
} else {
@@ -480,4 +485,62 @@ public class VideoplayerActivity extends MediaplayerActivity {
}
+
+ //Hardware keyboard support
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
+
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_P: //Fallthrough
+ case KeyEvent.KEYCODE_SPACE:
+ onPlayPause();
+ toggleVideoControlsVisibility();
+ return true;
+ case KeyEvent.KEYCODE_J: //Fallthrough
+ case KeyEvent.KEYCODE_A:
+ case KeyEvent.KEYCODE_COMMA:
+ onRewind();
+ showSkipAnimation(false);
+ return true;
+ case KeyEvent.KEYCODE_K: //Fallthrough
+ case KeyEvent.KEYCODE_D:
+ case KeyEvent.KEYCODE_PERIOD:
+ onFastForward();
+ showSkipAnimation(true);
+ return true;
+ case KeyEvent.KEYCODE_F: //Fallthrough
+ case KeyEvent.KEYCODE_ESCAPE:
+ //Exit fullscreen mode
+ onBackPressed();
+ return true;
+ case KeyEvent.KEYCODE_I:
+ compatEnterPictureInPicture();
+ return true;
+ case KeyEvent.KEYCODE_PLUS: //Fallthrough
+ case KeyEvent.KEYCODE_W:
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
+ return true;
+ case KeyEvent.KEYCODE_MINUS: //Fallthrough
+ case KeyEvent.KEYCODE_S:
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
+ return true;
+ case KeyEvent.KEYCODE_M:
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
+ AudioManager.ADJUST_TOGGLE_MUTE, AudioManager.FLAG_SHOW_UI);
+ return true;
+ }
+ break;
+ }
+
+ //Go to x% of video:
+ if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
+ controller.seekTo((int) (0.1f * (keyCode - KeyEvent.KEYCODE_0) * controller.getDuration()));
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
index cb72a9150..002147071 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
@@ -63,7 +63,7 @@ public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapte
duration = media.getDuration() - sc.getStart();
}
holder.duration.setText(context.getString(R.string.chapter_duration,
- Converter.getDurationStringLong((int) duration)));
+ Converter.getDurationStringLocalized(context, (int) duration)));
if (sc.getLink() == null) {
holder.link.setVisibility(View.GONE);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java
index 721b720d1..3c4003125 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java
@@ -4,6 +4,7 @@ import android.content.Context;
import android.text.format.Formatter;
import java.util.List;
+import java.util.Locale;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.storage.StatisticsItem;
@@ -40,7 +41,10 @@ public class DownloadStatisticsListAdapter extends StatisticsListAdapter {
@Override
void onBindFeedViewHolder(StatisticsHolder holder, StatisticsItem item) {
- holder.value.setText(Formatter.formatShortFileSize(context, item.totalDownloadSize));
+ holder.value.setText(Formatter.formatShortFileSize(context, item.totalDownloadSize)
+ + " • "
+ + String.format(Locale.getDefault(), "%d%s",
+ item.episodesDownloadCount, context.getString(R.string.episodes_suffix)));
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
index a53adc719..92ed7b052 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
@@ -298,7 +298,7 @@ public class NavListAdapter extends BaseAdapter
convertView = inflater.inflate(R.layout.nav_section_item, parent, false);
TextView feedsFilteredMsg = convertView.findViewById(R.id.nav_feeds_filtered_message);
- if (UserPreferences.getFeedFilter() != UserPreferences.FEED_FILTER_NONE && showSubscriptionList) {
+ if (UserPreferences.getSubscriptionsFilter().isEnabled() && showSubscriptionList) {
convertView.setEnabled(true);
feedsFilteredMsg.setText("{md-info-outline} " + context.getString(R.string.subscriptions_are_filtered));
Iconify.addIcons(feedsFilteredMsg);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java
index 46712a666..7b8659968 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/VisitWebsiteActionButton.java
@@ -8,6 +8,7 @@ import androidx.annotation.AttrRes;
import androidx.annotation.StringRes;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.core.util.IntentUtils;
public class VisitWebsiteActionButton extends ItemActionButton {
@@ -29,8 +30,7 @@ public class VisitWebsiteActionButton extends ItemActionButton {
@Override
public void onClick(Context context) {
- Uri uri = Uri.parse(item.getLink());
- context.startActivity(new Intent(Intent.ACTION_VIEW, uri));
+ IntentUtils.openInBrowser(context, item.getLink());
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java
deleted file mode 100644
index 3b0e2d04b..000000000
--- a/app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package de.danoeh.antennapod.dialog;
-
-import android.content.Context;
-
-import androidx.appcompat.app.AlertDialog;
-
-import org.greenrobot.eventbus.EventBus;
-
-import java.util.Arrays;
-import java.util.List;
-
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent;
-import de.danoeh.antennapod.core.preferences.UserPreferences;
-
-public class FeedFilterDialog {
- public static void showDialog(Context context) {
- AlertDialog.Builder dialog = new AlertDialog.Builder(context);
- dialog.setTitle(context.getString(R.string.pref_filter_feed_title));
- dialog.setNegativeButton(android.R.string.cancel, (d, listener) -> d.dismiss());
-
- int selected = UserPreferences.getFeedFilter();
- List<String> entryValues =
- Arrays.asList(context.getResources().getStringArray(R.array.nav_drawer_feed_filter_values));
- final int selectedIndex = entryValues.indexOf("" + selected);
-
- String[] items = context.getResources().getStringArray(R.array.nav_drawer_feed_filter_options);
- dialog.setSingleChoiceItems(items, selectedIndex, (d, which) -> {
- if (selectedIndex != which) {
- UserPreferences.setFeedFilter(entryValues.get(which));
- //Update subscriptions
- EventBus.getDefault().post(new UnreadItemsUpdateEvent());
- }
- d.dismiss();
- });
- dialog.show();
- }
-}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java
index e45533826..98f6cc117 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java
@@ -3,6 +3,7 @@ package de.danoeh.antennapod.dialog;
import android.app.Dialog;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Looper;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
@@ -94,7 +95,7 @@ public class PlaybackControlsDialog extends DialogFragment {
barRightVolume.setEnabled(false);
}
- final CheckBox skipSilence = (CheckBox) dialog.findViewById(R.id.skipSilence);
+ final CheckBox skipSilence = dialog.findViewById(R.id.skipSilence);
skipSilence.setChecked(UserPreferences.isSkipSilence());
if (!UserPreferences.useExoplayer()) {
skipSilence.setEnabled(false);
@@ -159,7 +160,7 @@ public class PlaybackControlsDialog extends DialogFragment {
butAudioTracks.setText(audioTracks.get(selectedAudioTrack));
butAudioTracks.setOnClickListener(v -> {
controller.setAudioTrack((selectedAudioTrack + 1) % audioTracks.size());
- new Handler().postDelayed(this::setupAudioTracks, 500);
+ new Handler(Looper.getMainLooper()).postDelayed(this::setupAudioTracks, 500);
});
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java
index a9c54e879..274c3b7bd 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.dialog;
+import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -137,6 +138,7 @@ public class SleepTimerDialog extends DialogFragment {
if (controller != null) {
controller.setSleepTimer(time);
}
+ closeKeyboard(content);
} catch (NumberFormatException e) {
e.printStackTrace();
Snackbar.make(content, R.string.time_dialog_invalid_input, Snackbar.LENGTH_LONG).show();
@@ -153,4 +155,9 @@ public class SleepTimerDialog extends DialogFragment {
timeDisplay.setVisibility(controller.sleepTimerActive() ? View.VISIBLE : View.GONE);
time.setText(Converter.getDurationStringLong((int) controller.getSleepTimerTimeLeft()));
}
+
+ private void closeKeyboard(View content) {
+ InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(content.getWindowToken(), 0);
+ }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java
new file mode 100644
index 000000000..a8915480c
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java
@@ -0,0 +1,82 @@
+package de.danoeh.antennapod.dialog;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.RadioButton;
+
+import androidx.appcompat.app.AlertDialog;
+
+import org.greenrobot.eventbus.EventBus;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent;
+import de.danoeh.antennapod.core.feed.SubscriptionsFilter;
+import de.danoeh.antennapod.core.feed.SubscriptionsFilterGroup;
+import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.view.RecursiveRadioGroup;
+
+public class SubscriptionsFilterDialog {
+ public static void showDialog(Context context) {
+ SubscriptionsFilter subscriptionsFilter = UserPreferences.getSubscriptionsFilter();
+ final Set<String> filterValues = new HashSet<>(Arrays.asList(subscriptionsFilter.getValues()));
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle(context.getString(R.string.pref_filter_feed_title));
+
+ LayoutInflater inflater = LayoutInflater.from(context);
+ LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.filter_dialog, null, false);
+ builder.setView(layout);
+
+ for (SubscriptionsFilterGroup item : SubscriptionsFilterGroup.values()) {
+ RecursiveRadioGroup row = (RecursiveRadioGroup) inflater.inflate(R.layout.filter_dialog_row, null);
+ RadioButton filter1 = row.findViewById(R.id.filter_dialog_radioButton1);
+ RadioButton filter2 = row.findViewById(R.id.filter_dialog_radioButton2);
+ filter1.setText(item.values[0].displayName);
+ filter1.setTag(item.values[0].filterId);
+ if (item.values.length == 2) {
+ filter2.setText(item.values[1].displayName);
+ filter2.setTag(item.values[1].filterId);
+ } else {
+ filter2.setVisibility(View.GONE);
+ }
+ layout.addView(row);
+ }
+
+ for (String filterId : filterValues) {
+ if (!TextUtils.isEmpty(filterId)) {
+ ((RadioButton) layout.findViewWithTag(filterId)).setChecked(true);
+ }
+ }
+
+ builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> {
+ filterValues.clear();
+ for (int i = 0; i < layout.getChildCount(); i++) {
+ if (!(layout.getChildAt(i) instanceof RecursiveRadioGroup)) {
+ continue;
+ }
+ RecursiveRadioGroup group = (RecursiveRadioGroup) layout.getChildAt(i);
+ if (group.getCheckedButton() != null) {
+ String tag = (String) group.getCheckedButton().getTag();
+ if (tag != null) { // Clear buttons use no tag
+ filterValues.add((String) group.getCheckedButton().getTag());
+ }
+ }
+ }
+ updateFilter(filterValues);
+ });
+ builder.setNegativeButton(R.string.cancel_label, null);
+ builder.show();
+ }
+
+ private static void updateFilter(Set<String> filterValues) {
+ SubscriptionsFilter subscriptionsFilter = new SubscriptionsFilter(filterValues.toArray(new String[0]));
+ UserPreferences.setSubscriptionsFilter(subscriptionsFilter);
+ EventBus.getDefault().post(new UnreadItemsUpdateEvent());
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java
index ef8ed335d..1fc7a77b2 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java
@@ -45,9 +45,8 @@ public class VariableSpeedDialog extends DialogFragment {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(R.string.no_playback_plugin_title);
builder.setMessage(R.string.no_playback_plugin_or_sonic_msg);
- builder.setPositiveButton(R.string.enable_sonic, (dialog, which) -> {
- UserPreferences.enableSonic();
- });
+ builder.setPositiveButton(R.string.enable_sonic, (dialog, which) ->
+ UserPreferences.enableSonic());
builder.setNeutralButton(R.string.close_label, null);
builder.show();
}
diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java
index e93a89ef0..e1034f89b 100644
--- a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java
+++ b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.discovery;
import android.content.Context;
+import android.content.SharedPreferences;
import android.util.Log;
import de.danoeh.antennapod.R;
@@ -23,24 +24,46 @@ import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
+import static android.content.Context.MODE_PRIVATE;
+
public class ItunesTopListLoader {
private static final String TAG = "ITunesTopListLoader";
private final Context context;
+ public static final String PREF_KEY_COUNTRY_CODE = "country_code";
+ public static final String PREFS = "CountryRegionPrefs";
+ public static final String DISCOVER_HIDE_FAKE_COUNTRY_CODE = "00";
+ public static final String COUNTRY_CODE_UNSET = "99";
public ItunesTopListLoader(Context context) {
this.context = context;
}
- public Single<List<PodcastSearchResult>> loadToplist(int limit) {
+ public Single<List<PodcastSearchResult>> loadToplist() {
+ String defaultCountry = Locale.getDefault().getCountry();
+ SharedPreferences prefs = context.getSharedPreferences(PREFS, MODE_PRIVATE);
+ String countryCode = prefs.getString(PREF_KEY_COUNTRY_CODE, COUNTRY_CODE_UNSET);
+ return this.loadToplist(countryCode, 25);
+ }
+
+ public Single<List<PodcastSearchResult>> loadToplist(String country, int limit) {
return Single.create((SingleOnSubscribe<List<PodcastSearchResult>>) emitter -> {
- String country = Locale.getDefault().getCountry();
OkHttpClient client = AntennapodHttpClient.getHttpClient();
String feedString;
+ String loadCountry = country;
+ if (COUNTRY_CODE_UNSET.equals(country)) {
+ loadCountry = Locale.getDefault().getCountry();
+ }
try {
- feedString = getTopListFeed(client, country, limit);
+ feedString = getTopListFeed(client, loadCountry, limit);
} catch (IOException e) {
- feedString = getTopListFeed(client, "us", limit);
+ if (COUNTRY_CODE_UNSET.equals(country)) {
+ feedString = getTopListFeed(client, "US", limit);
+ } else {
+ emitter.onError(e);
+ return;
+ }
}
+
List<PodcastSearchResult> podcasts = parseFeed(feedString);
emitter.onSuccess(podcasts);
})
@@ -59,6 +82,9 @@ public class ItunesTopListLoader {
if (response.isSuccessful()) {
return response.body().string();
}
+ if (response.code() == 400) {
+ throw new IOException("iTunes does not have data for the selected country.");
+ }
String prefix = context.getString(R.string.error_msg_prefix);
throw new IOException(prefix + response);
}
@@ -66,8 +92,14 @@ public class ItunesTopListLoader {
private List<PodcastSearchResult> parseFeed(String jsonString) throws JSONException {
JSONObject result = new JSONObject(jsonString);
- JSONObject feed = result.getJSONObject("feed");
- JSONArray entries = feed.getJSONArray("entry");
+ JSONObject feed;
+ JSONArray entries;
+ try {
+ feed = result.getJSONObject("feed");
+ entries = feed.getJSONArray("entry");
+ } catch (JSONException e) {
+ return new ArrayList<>();
+ }
List<PodcastSearchResult> results = new ArrayList<>();
for (int i = 0; i < entries.length(); i++) {
diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/PodcastIndexPodcastSearcher.java b/app/src/main/java/de/danoeh/antennapod/discovery/PodcastIndexPodcastSearcher.java
new file mode 100644
index 000000000..c8e5dc4ef
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/discovery/PodcastIndexPodcastSearcher.java
@@ -0,0 +1,126 @@
+package de.danoeh.antennapod.discovery;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import de.danoeh.antennapod.BuildConfig;
+import de.danoeh.antennapod.core.ClientConfig;
+import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
+import io.reactivex.Single;
+import io.reactivex.SingleOnSubscribe;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+
+public class PodcastIndexPodcastSearcher implements PodcastSearcher {
+ private static final String PODCASTINDEX_API_URL = "https://api.podcastindex.org/api/1.0/search/byterm?q=%s";
+
+ public PodcastIndexPodcastSearcher() {
+ }
+
+ @Override
+ public Single<List<PodcastSearchResult>> search(String query) {
+ return Single.create((SingleOnSubscribe<List<PodcastSearchResult>>) subscriber -> {
+
+ Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ calendar.clear();
+ Date now = new Date();
+ calendar.setTime(now);
+ long secondsSinceEpoch = calendar.getTimeInMillis() / 1000L;
+ String apiHeaderTime = String.valueOf(secondsSinceEpoch);
+ String data4Hash = BuildConfig.PODCASTINDEX_API_KEY + BuildConfig.PODCASTINDEX_API_SECRET + apiHeaderTime;
+ String hashString = sha1(data4Hash);
+
+ String encodedQuery;
+ try {
+ encodedQuery = URLEncoder.encode(query, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ // this won't ever be thrown
+ encodedQuery = query;
+ }
+
+ String formattedUrl = String.format(PODCASTINDEX_API_URL, encodedQuery);
+
+ OkHttpClient client = AntennapodHttpClient.getHttpClient();
+ Request.Builder httpReq = new Request.Builder()
+ .addHeader("X-Auth-Date", apiHeaderTime)
+ .addHeader("X-Auth-Key", BuildConfig.PODCASTINDEX_API_KEY)
+ .addHeader("Authorization", hashString)
+ .addHeader("User-Agent", ClientConfig.USER_AGENT)
+ .url(formattedUrl);
+ List<PodcastSearchResult> podcasts = new ArrayList<>();
+ try {
+ Response response = client.newCall(httpReq.build()).execute();
+
+ if (response.isSuccessful()) {
+ String resultString = response.body().string();
+ JSONObject result = new JSONObject(resultString);
+ JSONArray j = result.getJSONArray("feeds");
+
+ for (int i = 0; i < j.length(); i++) {
+ JSONObject podcastJson = j.getJSONObject(i);
+ PodcastSearchResult podcast = PodcastSearchResult.fromPodcastIndex(podcastJson);
+ if (podcast.feedUrl != null) {
+ podcasts.add(podcast);
+ }
+ }
+ } else {
+ subscriber.onError(new IOException(response.toString()));
+ }
+ } catch (IOException | JSONException e) {
+ subscriber.onError(e);
+ }
+ subscriber.onSuccess(podcasts);
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread());
+ }
+
+ @Override
+ public Single<String> lookupUrl(String url) {
+ return Single.just(url);
+ }
+
+ @Override
+ public boolean urlNeedsLookup(String url) {
+ return false;
+ }
+
+ @Override
+ public String getName() {
+ return "Podcastindex.org";
+ }
+
+ private static String sha1(String clearString) {
+ try {
+ MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
+ messageDigest.update(clearString.getBytes("UTF-8"));
+ return toHex(messageDigest.digest());
+ } catch (Exception ignored) {
+ ignored.printStackTrace();
+ return null;
+ }
+ }
+
+ private static String toHex(byte[] bytes) {
+ StringBuilder buffer = new StringBuilder();
+ for (byte b : bytes) {
+ buffer.append(String.format(Locale.getDefault(), "%02x", b));
+ }
+ return buffer.toString();
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearchResult.java b/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearchResult.java
index 0f0c864b1..bba438d1d 100644
--- a/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearchResult.java
+++ b/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearchResult.java
@@ -103,4 +103,12 @@ public class PodcastSearchResult {
searchHit.getUrl(),
searchHit.getAuthor());
}
+
+ public static PodcastSearchResult fromPodcastIndex(JSONObject json) {
+ String title = json.optString("title", "");
+ String imageUrl = json.optString("image", null);
+ String feedUrl = json.optString("url", null);
+ String author = json.optString("author", null);
+ return new PodcastSearchResult(title, imageUrl, feedUrl, author);
+ }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearcherRegistry.java b/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearcherRegistry.java
index 3f738424b..ad574cab6 100644
--- a/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearcherRegistry.java
+++ b/app/src/main/java/de/danoeh/antennapod/discovery/PodcastSearcherRegistry.java
@@ -19,6 +19,7 @@ public class PodcastSearcherRegistry {
searchProviders.add(new SearcherInfo(new ItunesPodcastSearcher(), 1.f));
searchProviders.add(new SearcherInfo(new FyydPodcastSearcher(), 1.f));
searchProviders.add(new SearcherInfo(new GpodnetPodcastSearcher(), 0.0f));
+ searchProviders.add(new SearcherInfo(new PodcastIndexPodcastSearcher(), 0.0f));
}
return searchProviders;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java b/app/src/main/java/de/danoeh/antennapod/error/CrashReportWriter.java
index b5d0f6945..dc62863f9 100644
--- a/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java
+++ b/app/src/main/java/de/danoeh/antennapod/error/CrashReportWriter.java
@@ -1,8 +1,9 @@
-package de.danoeh.antennapod;
+package de.danoeh.antennapod.error;
import android.os.Build;
import android.util.Log;
+import de.danoeh.antennapod.BuildConfig;
import org.apache.commons.io.IOUtils;
import java.io.File;
@@ -31,6 +32,11 @@ public class CrashReportWriter implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
+ write(ex);
+ defaultHandler.uncaughtException(thread, ex);
+ }
+
+ public static void write(Throwable exception) {
File path = getFile();
PrintWriter out = null;
try {
@@ -41,14 +47,13 @@ public class CrashReportWriter implements Thread.UncaughtExceptionHandler {
out.println();
out.println("## StackTrace");
out.println("```");
- ex.printStackTrace(out);
+ exception.printStackTrace(out);
out.println("```");
} catch (IOException e) {
Log.e(TAG, Log.getStackTraceString(e));
} finally {
IOUtils.closeQuietly(out);
}
- defaultHandler.uncaughtException(thread, ex);
}
public static String getSystemInfo() {
diff --git a/app/src/main/java/de/danoeh/antennapod/error/RxJavaErrorHandlerSetup.java b/app/src/main/java/de/danoeh/antennapod/error/RxJavaErrorHandlerSetup.java
new file mode 100644
index 000000000..1c7f5f0b4
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/error/RxJavaErrorHandlerSetup.java
@@ -0,0 +1,36 @@
+package de.danoeh.antennapod.error;
+
+import android.util.Log;
+import de.danoeh.antennapod.BuildConfig;
+import io.reactivex.exceptions.UndeliverableException;
+import io.reactivex.plugins.RxJavaPlugins;
+
+public class RxJavaErrorHandlerSetup {
+ private static final String TAG = "RxJavaErrorHandler";
+
+ private RxJavaErrorHandlerSetup() {
+
+ }
+
+ public static void setupRxJavaErrorHandler() {
+ RxJavaPlugins.setErrorHandler(exception -> {
+ if (exception instanceof UndeliverableException) {
+ // Probably just disposed because the fragment was left
+ Log.d(TAG, "Ignored exception: " + Log.getStackTraceString(exception));
+ return;
+ }
+
+ // Usually, undeliverable exceptions are wrapped in an UndeliverableException.
+ // If an undeliverable exception is a NPE (or some others), wrapping does not happen.
+ // AntennaPod threads might throw NPEs after disposing because we set controllers to null.
+ // Just swallow all exceptions here.
+ Log.e(TAG, Log.getStackTraceString(exception));
+ CrashReportWriter.write(exception);
+
+ if (BuildConfig.DEBUG) {
+ Thread.currentThread().getUncaughtExceptionHandler()
+ .uncaughtException(Thread.currentThread(), exception);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
index 5e014db3f..fa0df9abb 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
@@ -33,6 +33,7 @@ import de.danoeh.antennapod.core.util.SortOrder;
import de.danoeh.antennapod.discovery.CombinedSearcher;
import de.danoeh.antennapod.discovery.FyydPodcastSearcher;
import de.danoeh.antennapod.discovery.ItunesPodcastSearcher;
+import de.danoeh.antennapod.discovery.PodcastIndexPodcastSearcher;
import de.danoeh.antennapod.fragment.gpodnet.GpodnetMainFragment;
import java.util.Collections;
@@ -65,6 +66,8 @@ public class AddFeedFragment extends Fragment {
-> activity.loadChildFragment(OnlineSearchFragment.newInstance(FyydPodcastSearcher.class)));
root.findViewById(R.id.btn_search_gpodder).setOnClickListener(v
-> activity.loadChildFragment(new GpodnetMainFragment()));
+ root.findViewById(R.id.btn_search_podcastindex).setOnClickListener(v
+ -> activity.loadChildFragment(OnlineSearchFragment.newInstance(PodcastIndexPodcastSearcher.class)));
combinedFeedSearchBox = root.findViewById(R.id.combinedFeedSearchBox);
combinedFeedSearchBox.setOnEditorActionListener((v, actionId, event) -> {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
index 4a1c12e0a..0c75b7eea 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
@@ -89,6 +89,18 @@ public class AllEpisodesFragment extends EpisodesListFragment {
filterDialog.openDialog();
}
+ @Override
+ protected boolean shouldUpdatedItemRemainInList(FeedItem item) {
+ SharedPreferences prefs = getActivity().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
+ FeedItemFilter feedItemFilter = new FeedItemFilter(prefs.getString(PREF_FILTER, ""));
+
+ if (feedItemFilter.isShowDownloaded() && (!item.hasMedia() || !item.getMedia().isDownloaded())) {
+ return false;
+ }
+
+ return true;
+ }
+
@NonNull
@Override
protected List<FeedItem> loadData() {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java
index 7eb749681..3129aa43c 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java
@@ -124,8 +124,6 @@ public class AudioPlayerFragment extends Fragment implements
setupLengthTextView();
setupControlButtons();
setupPlaybackSpeedButton();
- txtvRev.setText(NumberFormat.getInstance().format(UserPreferences.getRewindSecs()));
- txtvFF.setText(NumberFormat.getInstance().format(UserPreferences.getFastForwardSecs()));
sbPosition.setOnSeekBarChangeListener(this);
pager = root.findViewById(R.id.pager);
@@ -376,6 +374,8 @@ public class AudioPlayerFragment extends Fragment implements
controller.init();
loadMediaInfo();
EventBus.getDefault().register(this);
+ txtvRev.setText(NumberFormat.getInstance().format(UserPreferences.getRewindSecs()));
+ txtvFF.setText(NumberFormat.getInstance().format(UserPreferences.getFastForwardSecs()));
}
@Override
@@ -383,6 +383,7 @@ public class AudioPlayerFragment extends Fragment implements
super.onStop();
controller.release();
controller = null;
+ progressIndicator.setVisibility(View.GONE); // Controller released; we will not receive buffering updates
EventBus.getDefault().unregister(this);
if (disposable != null) {
disposable.dispose();
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
index 79f378249..648fc614a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
@@ -45,6 +45,7 @@ import org.greenrobot.eventbus.ThreadMode;
public class CoverFragment extends Fragment {
private static final String TAG = "CoverFragment";
+ static final double SIXTEEN_BY_NINE = 1.7;
private View root;
private TextView txtvPodcastTitle;
@@ -188,20 +189,31 @@ public class CoverFragment extends Fragment {
private void configureForOrientation(Configuration newConfig) {
LinearLayout mainContainer = getView().findViewById(R.id.cover_fragment);
- ViewGroup.LayoutParams params = imgvCover.getLayoutParams();
+ LinearLayout textContainer = getView().findViewById(R.id.cover_fragment_text_container);
+
+ LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imgvCover.getLayoutParams();
+ LinearLayout.LayoutParams textParams = (LinearLayout.LayoutParams) textContainer.getLayoutParams();
+ double ratio = (float) newConfig.screenHeightDp / (float) newConfig.screenWidthDp;
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
+ double percentageWidth = 0.8;
+ if (ratio <= SIXTEEN_BY_NINE) {
+ percentageWidth = (ratio / SIXTEEN_BY_NINE) * percentageWidth * 0.8;
+ }
mainContainer.setOrientation(LinearLayout.VERTICAL);
if (newConfig.screenWidthDp > 0) {
- params.width = (int) (convertDpToPixel(newConfig.screenWidthDp) * .80);
+ params.width = (int) (convertDpToPixel(newConfig.screenWidthDp) * percentageWidth);
params.height = params.width;
+ textParams.weight = 0;
imgvCover.setLayoutParams(params);
}
} else {
+ double percentageHeight = ratio * 0.8;
mainContainer.setOrientation(LinearLayout.HORIZONTAL);
if (newConfig.screenHeightDp > 0) {
- params.height = (int) (convertDpToPixel(newConfig.screenHeightDp) * .40);
+ params.height = (int) (convertDpToPixel(newConfig.screenHeightDp) * percentageHeight);
params.width = params.height;
+ textParams.weight = 1;
imgvCover.setLayoutParams(params);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
index 89d3c7af9..5bc950d50 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java
@@ -1,27 +1,41 @@
package de.danoeh.antennapod.fragment;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ProgressBar;
+import android.widget.Spinner;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
+
+import org.greenrobot.eventbus.EventBus;
+
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.adapter.itunes.ItunesAdapter;
+import de.danoeh.antennapod.core.event.DiscoveryDefaultUpdateEvent;
import de.danoeh.antennapod.discovery.ItunesTopListLoader;
import de.danoeh.antennapod.discovery.PodcastSearchResult;
import io.reactivex.disposables.Disposable;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+
+import static android.content.Context.MODE_PRIVATE;
/**
* Searches iTunes store for top podcasts and displays results in a list.
@@ -29,6 +43,7 @@ import java.util.List;
public class DiscoveryFragment extends Fragment {
private static final String TAG = "ItunesSearchFragment";
+ private SharedPreferences prefs;
/**
* Adapter responsible with the search results.
@@ -46,6 +61,7 @@ public class DiscoveryFragment extends Fragment {
private List<PodcastSearchResult> searchResults;
private List<PodcastSearchResult> topList;
private Disposable disposable;
+ private String countryCode = "US";
/**
* Replace adapter data with provided search results from SearchTask.
@@ -75,6 +91,8 @@ public class DiscoveryFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
+ prefs = getActivity().getSharedPreferences(ItunesTopListLoader.PREFS, MODE_PRIVATE);
+ countryCode = prefs.getString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE, Locale.getDefault().getCountry());
}
@Override
@@ -97,13 +115,64 @@ public class DiscoveryFragment extends Fragment {
intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, podcast.feedUrl);
startActivity(intent);
});
+
+ List<String> countryCodeArray = new ArrayList<String>(Arrays.asList(Locale.getISOCountries()));
+ HashMap<String, String> countryCodeNames = new HashMap<String, String>();
+ for (String code: countryCodeArray) {
+ Locale locale = new Locale("", code);
+ String countryName = locale.getDisplayCountry();
+ if (countryName != null) {
+ countryCodeNames.put(code, countryName);
+ }
+ }
+
+ List<String> countryNamesSort = new ArrayList<String>(countryCodeNames.values());
+ Collections.sort(countryNamesSort);
+ countryNamesSort.add(0, getResources().getString(R.string.discover_hide));
+
+ Spinner countrySpinner = root.findViewById(R.id.spinner_country);
+ ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this.getContext(),
+ android.R.layout.simple_spinner_item,
+ countryNamesSort);
+ dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ countrySpinner.setAdapter(dataAdapter);
+ int pos = countryNamesSort.indexOf(countryCodeNames.get(countryCode));
+ countrySpinner.setSelection(pos);
+
+ countrySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> countrySpinner, View view, int position, long id) {
+ String countryName = (String) countrySpinner.getItemAtPosition(position);
+
+ if (countryName.equals(getResources().getString(R.string.discover_hide))) {
+ countryCode = ItunesTopListLoader.DISCOVER_HIDE_FAKE_COUNTRY_CODE;
+ } else {
+ for (Object o : countryCodeNames.keySet()) {
+ if (countryCodeNames.get(o).equals(countryName)) {
+ countryCode = o.toString();
+ break;
+ }
+ }
+ }
+
+ prefs.edit()
+ .putString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE, countryCode)
+ .apply();
+
+ EventBus.getDefault().post(new DiscoveryDefaultUpdateEvent());
+ loadToplist(countryCode);
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
progressBar = root.findViewById(R.id.progressBar);
txtvError = root.findViewById(R.id.txtvError);
butRetry = root.findViewById(R.id.butRetry);
txtvEmpty = root.findViewById(android.R.id.empty);
- loadToplist();
-
+ loadToplist(countryCode);
return root;
}
@@ -116,28 +185,39 @@ public class DiscoveryFragment extends Fragment {
adapter = null;
}
- private void loadToplist() {
+ private void loadToplist(String country) {
if (disposable != null) {
disposable.dispose();
}
+
gridView.setVisibility(View.GONE);
txtvError.setVisibility(View.GONE);
butRetry.setVisibility(View.GONE);
txtvEmpty.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
- ItunesTopListLoader loader = new ItunesTopListLoader(getContext());
- disposable = loader.loadToplist(25).subscribe(podcasts -> {
+ if (country.equals(ItunesTopListLoader.DISCOVER_HIDE_FAKE_COUNTRY_CODE)) {
+ gridView.setVisibility(View.GONE);
+ txtvError.setVisibility(View.VISIBLE);
+ txtvError.setText(getResources().getString(R.string.discover_is_hidden));
+ butRetry.setVisibility(View.GONE);
+ txtvEmpty.setVisibility(View.GONE);
progressBar.setVisibility(View.GONE);
- topList = podcasts;
- updateData(topList);
- }, error -> {
- Log.e(TAG, Log.getStackTraceString(error));
- progressBar.setVisibility(View.GONE);
- txtvError.setText(error.toString());
- txtvError.setVisibility(View.VISIBLE);
- butRetry.setOnClickListener(v -> loadToplist());
- butRetry.setVisibility(View.VISIBLE);
- });
+ } else {
+ ItunesTopListLoader loader = new ItunesTopListLoader(getContext());
+ disposable = loader.loadToplist(country, 25).subscribe(
+ podcasts -> {
+ progressBar.setVisibility(View.GONE);
+ topList = podcasts;
+ updateData(topList);
+ }, error -> {
+ Log.e(TAG, Log.getStackTraceString(error));
+ progressBar.setVisibility(View.GONE);
+ txtvError.setText(error.getMessage());
+ txtvError.setVisibility(View.VISIBLE);
+ butRetry.setOnClickListener(v -> loadToplist(country));
+ butRetry.setVisibility(View.VISIBLE);
+ });
+ }
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
index c173bf8ee..bc2d85452 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
@@ -51,6 +51,7 @@ public class DownloadsFragment extends Fragment {
viewPager = root.findViewById(R.id.viewpager);
viewPager.setAdapter(new DownloadsPagerAdapter(this));
+ viewPager.setOffscreenPageLimit(2);
// Give the TabLayout the ViewPager
tabLayout = root.findViewById(R.id.sliding_tabs);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
index e98890627..afd027b3a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
@@ -51,6 +51,7 @@ public class EpisodesFragment extends Fragment {
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
viewPager = rootView.findViewById(R.id.viewpager);
viewPager.setAdapter(new EpisodesPagerAdapter(this));
+ viewPager.setOffscreenPageLimit(2);
// Give the TabLayout the ViewPager
tabLayout = rootView.findViewById(R.id.sliding_tabs);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
index 44f6c8827..62400d81d 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
@@ -6,6 +6,10 @@ import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import android.os.Handler;
+import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -126,7 +130,7 @@ public abstract class EpisodesListFragment extends Fragment {
}
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.episodes, menu);
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0);
+ MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0, "");
isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker);
}
@@ -214,6 +218,13 @@ public abstract class EpisodesListFragment extends Fragment {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
}
+ SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh);
+ swipeRefreshLayout.setOnRefreshListener(() -> {
+ AutoUpdateManager.runImmediate(requireContext());
+ new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false),
+ getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms));
+ });
+
progLoading = root.findViewById(R.id.progLoading);
progLoading.setVisibility(View.VISIBLE);
loadingMoreView = root.findViewById(R.id.loadingMore);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
index 94c9bd056..5d701472f 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
@@ -21,6 +21,7 @@ import de.danoeh.antennapod.core.feed.MediaType;
import de.danoeh.antennapod.core.feed.util.ImageResourceUtils;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
+import de.danoeh.antennapod.core.service.playback.PlayerStatus;
import de.danoeh.antennapod.core.util.playback.Playable;
import de.danoeh.antennapod.core.util.playback.PlaybackController;
import io.reactivex.Maybe;
@@ -79,8 +80,16 @@ public class ExternalPlayerFragment extends Fragment {
super.onActivityCreated(savedInstanceState);
butPlay.setOnClickListener(v -> {
if (controller != null) {
- controller.playPause();
+ if (controller.getMedia().getMediaType() == MediaType.VIDEO
+ && controller.getStatus() != PlayerStatus.PLAYING) {
+ controller.playPause();
+ getContext().startActivity(PlaybackService
+ .getPlayerActivityIntent(getContext(), controller.getMedia()));
+ } else {
+ controller.playPause();
+ }
}
+
});
loadMediaInfo();
}
@@ -200,7 +209,6 @@ public class ExternalPlayerFragment extends Fragment {
.into(imgvCover);
if (controller != null && controller.isPlayingVideoLocally()) {
- butPlay.setVisibility(View.GONE);
((MainActivity) getActivity()).getBottomSheet().setLocked(true);
((MainActivity) getActivity()).getBottomSheet().setState(BottomSheetBehavior.STATE_COLLAPSED);
} else {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
index 7b66a189f..b66f15c7e 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
@@ -6,6 +6,8 @@ import android.content.res.Configuration;
import android.content.Intent;
import android.graphics.LightingColorFilter;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -26,6 +28,8 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.material.appbar.AppBarLayout;
@@ -205,6 +209,18 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
});
EventBus.getDefault().register(this);
+
+ SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh);
+ swipeRefreshLayout.setOnRefreshListener(() -> {
+ try {
+ DBTasks.forceRefreshFeed(requireContext(), feed, true);
+ } catch (DownloadRequestException e) {
+ e.printStackTrace();
+ }
+ new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false),
+ getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms));
+ });
+
loadItems();
return root;
}
@@ -236,7 +252,11 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
optionsMenu = menu;
FeedMenuHandler.onCreateOptionsMenu(inflater, menu);
iconTintManager.updateTint();
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID);
+ if (feed != null) {
+ MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID, feed.getTitle());
+ } else {
+ MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID, "");
+ }
if (feed == null || feed.getLink() == null) {
menu.findItem(R.id.share_link_item).setVisible(false);
menu.findItem(R.id.visit_website_item).setVisible(false);
@@ -261,7 +281,12 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
- if (!super.onOptionsItemSelected(item)) {
+ if (item.getItemId() == R.id.action_search) {
+ item.getActionView().post(() -> iconTintManager.updateTint());
+ }
+ if (super.onOptionsItemSelected(item)) {
+ return true;
+ } else {
if (feed == null) {
((MainActivity) getActivity()).showSnackbarAbovePlayer(
R.string.please_wait_for_data, Toast.LENGTH_LONG);
@@ -320,8 +345,6 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem
DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage());
return true;
}
- } else {
- return true;
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java
index ed8697adb..fc3052e20 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java
@@ -11,6 +11,7 @@ import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.core.util.playback.Playable;
import de.danoeh.antennapod.core.util.playback.PlaybackController;
import de.danoeh.antennapod.core.util.playback.Timeline;
import de.danoeh.antennapod.view.ShownotesWebView;
@@ -82,8 +83,10 @@ public class ItemDescriptionFragment extends Fragment {
if (webViewLoader != null) {
webViewLoader.dispose();
}
- webViewLoader = Maybe.fromCallable(this::loadData)
- .subscribeOn(Schedulers.io())
+ webViewLoader = Maybe.<String>create(emitter -> {
+ Timeline timeline = new Timeline(getActivity(), controller.getMedia());
+ emitter.onSuccess(timeline.processShownotes());
+ }).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(data -> {
webvDescription.loadDataWithBaseURL("https://127.0.0.1", data, "text/html",
@@ -92,15 +95,6 @@ public class ItemDescriptionFragment extends Fragment {
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
}
- @Nullable
- private String loadData() {
- if (controller == null || controller.getMedia() == null) {
- return null;
- }
- Timeline timeline = new Timeline(getActivity(), controller.getMedia());
- return timeline.processShownotes();
- }
-
@Override
public void onPause() {
super.onPause();
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
index 3b1171df4..2425a174e 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
@@ -38,6 +38,8 @@ import io.reactivex.schedulers.Schedulers;
public class ItemPagerFragment extends Fragment {
private static final String ARG_FEEDITEMS = "feeditems";
private static final String ARG_FEEDITEM_POS = "feeditem_pos";
+ private static final String KEY_PAGER_ID = "pager_id";
+ private ViewPager2 pager;
/**
* Creates a new instance of an ItemPagerFragment.
@@ -77,12 +79,16 @@ public class ItemPagerFragment extends Fragment {
feedItems = getArguments().getLongArray(ARG_FEEDITEMS);
int feedItemPos = getArguments().getInt(ARG_FEEDITEM_POS);
- ViewPager2 pager = layout.findViewById(R.id.pager);
+ pager = layout.findViewById(R.id.pager);
// FragmentStatePagerAdapter documentation:
// > When using FragmentStatePagerAdapter the host ViewPager must have a valid ID set.
// When opening multiple ItemPagerFragments by clicking "item" -> "visit podcast" -> "item" -> etc,
// the ID is no longer unique and FragmentStatePagerAdapter does not display any pages.
int newId = ViewCompat.generateViewId();
+ if (savedInstanceState != null && savedInstanceState.getInt(KEY_PAGER_ID, 0) != 0) {
+ // Restore state by using the same ID as before. ID collisions are prevented in MainActivity.
+ newId = savedInstanceState.getInt(KEY_PAGER_ID, 0);
+ }
pager.setId(newId);
pager.setAdapter(new ItemPagerAdapter(this));
pager.setCurrentItem(feedItemPos, false);
@@ -100,6 +106,12 @@ public class ItemPagerFragment extends Fragment {
}
@Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(KEY_PAGER_ID, pager.getId());
+ }
+
+ @Override
public void onDestroyView() {
super.onDestroyView();
EventBus.getDefault().unregister(this);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java
index 8746793be..4f99e8130 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java
@@ -14,6 +14,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
+import android.widget.ProgressBar;
+
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
@@ -37,7 +39,7 @@ import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.util.FeedItemUtil;
import de.danoeh.antennapod.core.util.IntentUtils;
-import de.danoeh.antennapod.dialog.FeedFilterDialog;
+import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog;
import de.danoeh.antennapod.dialog.RenameFeedDialog;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -46,6 +48,7 @@ import io.reactivex.schedulers.Schedulers;
import org.apache.commons.lang3.StringUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
import java.util.List;
@@ -72,6 +75,7 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli
private int position = -1;
private NavListAdapter navAdapter;
private Disposable disposable;
+ private ProgressBar progressBar;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -79,6 +83,7 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli
super.onCreateView(inflater, container, savedInstanceState);
View root = inflater.inflate(R.layout.nav_list, container, false);
+ progressBar = root.findViewById(R.id.progressBar);
ListView navList = root.findViewById(R.id.nav_list);
navAdapter = new NavListAdapter(itemAccess, getActivity());
navList.setAdapter(navAdapter);
@@ -234,18 +239,18 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli
startActivity(intent);
}
- @Subscribe
+ @Subscribe(threadMode = ThreadMode.MAIN)
public void onUnreadItemsChanged(UnreadItemsUpdateEvent event) {
loadData();
}
- @Subscribe
+ @Subscribe(threadMode = ThreadMode.MAIN)
public void onFeedListChanged(FeedListUpdateEvent event) {
loadData();
}
- @Subscribe
+ @Subscribe(threadMode = ThreadMode.MAIN)
public void onQueueChanged(QueueEvent event) {
Log.d(TAG, "onQueueChanged(" + event + ")");
// we are only interested in the number of queue items, not download status or position
@@ -356,14 +361,20 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli
};
private void loadData() {
+ progressBar.setVisibility(View.VISIBLE);
disposable = Observable.fromCallable(DBReader::getNavDrawerData)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
- .subscribe(result -> {
- navDrawerData = result;
- updateSelection(); // Selected item might be a feed
- navAdapter.notifyDataSetChanged();
- }, error -> Log.e(TAG, Log.getStackTraceString(error)));
+ .subscribe(
+ result -> {
+ navDrawerData = result;
+ updateSelection(); // Selected item might be a feed
+ navAdapter.notifyDataSetChanged();
+ progressBar.setVisibility(View.GONE);
+ }, error -> {
+ Log.e(TAG, Log.getStackTraceString(error));
+ progressBar.setVisibility(View.GONE);
+ });
}
@Override
@@ -390,9 +401,9 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli
startActivity(intent);
}
}
- } else if (UserPreferences.getFeedFilter() != UserPreferences.FEED_FILTER_NONE
+ } else if (UserPreferences.getSubscriptionsFilter().isEnabled()
&& navAdapter.showSubscriptionList) {
- FeedFilterDialog.showDialog(requireContext());
+ SubscriptionsFilterDialog.showDialog(requireContext());
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
index e8bd5a1e1..435590a0c 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java
@@ -18,6 +18,7 @@ import android.widget.GridView;
import android.widget.ProgressBar;
import android.widget.TextView;
import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.adapter.itunes.ItunesAdapter;
import de.danoeh.antennapod.discovery.PodcastSearchResult;
@@ -28,6 +29,8 @@ import io.reactivex.disposables.Disposable;
import java.util.ArrayList;
import java.util.List;
+import static android.view.View.INVISIBLE;
+
public class OnlineSearchFragment extends Fragment {
private static final String TAG = "FyydSearchFragment";
@@ -92,6 +95,7 @@ public class OnlineSearchFragment extends Fragment {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar));
+ root.findViewById(R.id.spinner_country).setVisibility(INVISIBLE);
gridView = root.findViewById(R.id.gridView);
adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
gridView.setAdapter(adapter);
@@ -101,6 +105,7 @@ public class OnlineSearchFragment extends Fragment {
PodcastSearchResult podcast = searchResults.get(position);
Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, podcast.feedUrl);
+ intent.putExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH, true);
startActivity(intent);
});
progressBar = root.findViewById(R.id.progressBar);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
index 26216b375..122524b48 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -246,7 +246,7 @@ public class QueueFragment extends Fragment {
super.onCreateOptionsMenu(menu, inflater);
if (queue != null) {
inflater.inflate(R.menu.queue, menu);
- MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0);
+ MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0, "");
MenuItemUtils.refreshLockItem(getActivity(), menu);
// Show Lock Item only if queue is sorted manually
@@ -335,10 +335,8 @@ public class QueueFragment extends Fragment {
if (keepSortedNew) {
SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder();
DBWriter.reorderQueue(sortOrder, true);
- if (recyclerAdapter != null) {
- recyclerAdapter.updateDragDropEnabled();
- }
- } else if (recyclerAdapter != null) {
+ }
+ if (recyclerAdapter != null) {
recyclerAdapter.updateDragDropEnabled();
}
getActivity().invalidateOptionsMenu();
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java
index d6bcdd79c..c994b4d8b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QuickFeedDiscoveryFragment.java
@@ -1,27 +1,40 @@
package de.danoeh.antennapod.fragment;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.DisplayMetrics;
import androidx.fragment.app.Fragment;
+
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
+import android.widget.Button;
import android.widget.GridView;
+import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
import de.danoeh.antennapod.adapter.FeedDiscoverAdapter;
+import de.danoeh.antennapod.core.event.DiscoveryDefaultUpdateEvent;
import de.danoeh.antennapod.discovery.ItunesTopListLoader;
import de.danoeh.antennapod.discovery.PodcastSearchResult;
import io.reactivex.disposables.Disposable;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
+
+import static android.content.Context.MODE_PRIVATE;
public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView.OnItemClickListener {
@@ -33,6 +46,8 @@ public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView.
private FeedDiscoverAdapter adapter;
private GridView discoverGridLayout;
private TextView errorTextView;
+ private LinearLayout errorView;
+ private Button errorRetry;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@@ -44,7 +59,10 @@ public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView.
discoverGridLayout = root.findViewById(R.id.discover_grid);
progressBar = root.findViewById(R.id.discover_progress_bar);
- errorTextView = root.findViewById(R.id.discover_error);
+ errorView = root.findViewById(R.id.discover_error);
+ errorTextView = root.findViewById(R.id.discover_error_txtV);
+ errorRetry = root.findViewById(R.id.discover_error_retry_btn);
+ errorRetry.setOnClickListener((listener) -> loadToplist());
adapter = new FeedDiscoverAdapter((MainActivity) getActivity());
discoverGridLayout.setAdapter(adapter);
@@ -67,36 +85,67 @@ public class QuickFeedDiscoveryFragment extends Fragment implements AdapterView.
adapter.updateData(dummies);
loadToplist();
+
+ EventBus.getDefault().register(this);
return root;
}
@Override
public void onDestroy() {
super.onDestroy();
+ EventBus.getDefault().unregister(this);
if (disposable != null) {
disposable.dispose();
}
}
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ @SuppressWarnings("unused")
+ public void onDiscoveryDefaultUpdateEvent(DiscoveryDefaultUpdateEvent event) {
+ loadToplist();
+ }
+
private void loadToplist() {
progressBar.setVisibility(View.VISIBLE);
discoverGridLayout.setVisibility(View.INVISIBLE);
- errorTextView.setVisibility(View.GONE);
+ errorView.setVisibility(View.GONE);
+ errorRetry.setVisibility(View.INVISIBLE);
ItunesTopListLoader loader = new ItunesTopListLoader(getContext());
- disposable = loader.loadToplist(NUM_SUGGESTIONS)
- .subscribe(podcasts -> {
- errorTextView.setVisibility(View.GONE);
- progressBar.setVisibility(View.GONE);
- discoverGridLayout.setVisibility(View.VISIBLE);
- adapter.updateData(podcasts);
- }, error -> {
- Log.e(TAG, Log.getStackTraceString(error));
- errorTextView.setText(error.getLocalizedMessage());
- errorTextView.setVisibility(View.VISIBLE);
- progressBar.setVisibility(View.GONE);
- discoverGridLayout.setVisibility(View.INVISIBLE);
- });
+ SharedPreferences prefs = getActivity().getSharedPreferences(ItunesTopListLoader.PREFS, MODE_PRIVATE);
+ String countryCode = prefs.getString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE,
+ Locale.getDefault().getCountry());
+ if (countryCode.equals(ItunesTopListLoader.DISCOVER_HIDE_FAKE_COUNTRY_CODE)) {
+ errorTextView.setText(String.format(getResources().getString(R.string.discover_is_hidden),
+ getResources().getString(R.string.discover_hide)));
+ errorView.setVisibility(View.VISIBLE);
+ progressBar.setVisibility(View.GONE);
+ discoverGridLayout.setVisibility(View.INVISIBLE);
+ errorRetry.setVisibility(View.INVISIBLE);
+ return;
+ }
+
+ disposable = loader.loadToplist(countryCode, NUM_SUGGESTIONS)
+ .subscribe(
+ podcasts -> {
+ errorView.setVisibility(View.GONE);
+ progressBar.setVisibility(View.GONE);
+ discoverGridLayout.setVisibility(View.VISIBLE);
+ if (podcasts.size() == 0) {
+ errorTextView.setText(getResources().getText(R.string.search_status_no_results));
+ errorView.setVisibility(View.VISIBLE);
+ discoverGridLayout.setVisibility(View.INVISIBLE);
+ } else {
+ adapter.updateData(podcasts);
+ }
+ }, error -> {
+ Log.e(TAG, Log.getStackTraceString(error));
+ errorTextView.setText(error.getLocalizedMessage());
+ errorView.setVisibility(View.VISIBLE);
+ progressBar.setVisibility(View.GONE);
+ discoverGridLayout.setVisibility(View.INVISIBLE);
+ errorRetry.setVisibility(View.VISIBLE);
+ });
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
index 0c03d407e..2061a8ba4 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -17,6 +17,9 @@ import androidx.appcompat.widget.SearchView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+
+import com.google.android.material.chip.Chip;
+
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.adapter.EpisodeItemListAdapter;
@@ -43,6 +46,7 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
+import java.util.Collections;
import java.util.List;
/**
@@ -52,6 +56,7 @@ public class SearchFragment extends Fragment {
private static final String TAG = "SearchFragment";
private static final String ARG_QUERY = "query";
private static final String ARG_FEED = "feed";
+ private static final String ARG_FEED_NAME = "feedName";
private EpisodeItemListAdapter adapter;
private FeedSearchResultAdapter adapterFeeds;
@@ -60,6 +65,7 @@ public class SearchFragment extends Fragment {
private EmptyViewHandler emptyViewHandler;
private EpisodeItemListRecyclerView recyclerView;
private List<FeedItem> results;
+ private Chip chip;
/**
* Create a new SearchFragment that searches all feeds.
@@ -79,9 +85,10 @@ public class SearchFragment extends Fragment {
/**
* Create a new SearchFragment that searches one specific feed.
*/
- public static SearchFragment newInstance(String query, long feed) {
+ public static SearchFragment newInstance(String query, long feed, String feedTitle) {
SearchFragment fragment = newInstance(query);
fragment.getArguments().putLong(ARG_FEED, feed);
+ fragment.getArguments().putString(ARG_FEED_NAME, feedTitle);
return fragment;
}
@@ -132,6 +139,12 @@ public class SearchFragment extends Fragment {
emptyViewHandler.setIcon(R.attr.action_search);
emptyViewHandler.setTitle(R.string.search_status_no_results);
EventBus.getDefault().register(this);
+
+ chip = layout.findViewById(R.id.feed_title_chip);
+ chip.setOnCloseIconClickListener(v -> {
+ getArguments().putLong(ARG_FEED, 0);
+ search();
+ });
return layout;
}
@@ -259,7 +272,13 @@ public class SearchFragment extends Fragment {
progressBar.setVisibility(View.GONE);
this.results = results.first;
adapter.updateItems(results.first);
- adapterFeeds.updateData(results.second);
+ if (getArguments().getLong(ARG_FEED, 0) == 0) {
+ adapterFeeds.updateData(results.second);
+ chip.setVisibility(View.GONE);
+ } else {
+ adapterFeeds.updateData(Collections.emptyList());
+ chip.setText(getArguments().getString(ARG_FEED_NAME, ""));
+ }
String query = getArguments().getString(ARG_QUERY);
emptyViewHandler.setMessage(getString(R.string.no_results_for_query, query));
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
index 26145c064..3b2a72210 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
@@ -5,10 +5,14 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.widget.ProgressBar;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
@@ -45,7 +49,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequester;
import de.danoeh.antennapod.core.util.FeedItemUtil;
import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
-import de.danoeh.antennapod.dialog.FeedFilterDialog;
+import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog;
import de.danoeh.antennapod.dialog.FeedSortDialog;
import de.danoeh.antennapod.dialog.RenameFeedDialog;
import de.danoeh.antennapod.menuhandler.MenuItemUtils;
@@ -102,7 +106,14 @@ public class SubscriptionFragment extends Fragment {
progressBar = root.findViewById(R.id.progLoading);
feedsFilteredMsg = root.findViewById(R.id.feeds_filtered_message);
- feedsFilteredMsg.setOnClickListener((l) -> FeedFilterDialog.showDialog(requireContext()));
+ feedsFilteredMsg.setOnClickListener((l) -> SubscriptionsFilterDialog.showDialog(requireContext()));
+
+ SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh);
+ swipeRefreshLayout.setOnRefreshListener(() -> {
+ AutoUpdateManager.runImmediate(requireContext());
+ new Handler(Looper.getMainLooper()).postDelayed(() -> swipeRefreshLayout.setRefreshing(false),
+ getResources().getInteger(R.integer.swipe_to_refresh_duration_in_ms));
+ });
return root;
}
@@ -130,7 +141,7 @@ public class SubscriptionFragment extends Fragment {
AutoUpdateManager.runImmediate(requireContext());
return true;
case R.id.subscriptions_filter:
- FeedFilterDialog.showDialog(requireContext());
+ SubscriptionsFilterDialog.showDialog(requireContext());
return true;
case R.id.subscriptions_sort:
FeedSortDialog.showDialog(requireContext());
@@ -214,7 +225,7 @@ public class SubscriptionFragment extends Fragment {
progressBar.setVisibility(View.GONE);
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
- if (UserPreferences.getFeedFilter() != UserPreferences.FEED_FILTER_NONE) {
+ if (UserPreferences.getSubscriptionsFilter().isEnabled()) {
feedsFilteredMsg.setText("{md-info-outline} " + getString(R.string.subscriptions_are_filtered));
Iconify.addIcons(feedsFilteredMsg);
feedsFilteredMsg.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
index d5cac07f1..4cb50e2f4 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java
@@ -104,6 +104,7 @@ public abstract class PodcastListFragment extends Fragment {
Log.d(TAG, "Selected podcast: " + selection.toString());
Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class);
intent.putExtra(OnlineFeedViewActivity.ARG_FEEDURL, selection.getUrl());
+ intent.putExtra(MainActivity.EXTRA_STARTED_FROM_SEARCH, true);
startActivity(intent);
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java
index 064c4b3bc..0d6e79e84 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java
@@ -168,7 +168,7 @@ public class AutoDownloadPreferencesFragment extends PreferenceFragmentCompat {
private void buildEpisodeCleanupPreference() {
final Resources res = getActivity().getResources();
- ListPreference pref = (ListPreference) findPreference(UserPreferences.PREF_EPISODE_CLEANUP);
+ ListPreference pref = findPreference(UserPreferences.PREF_EPISODE_CLEANUP);
String[] values = res.getStringArray(
R.array.episode_cleanup_values);
String[] entries = new String[values.length];
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/GpodderPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/GpodderPreferencesFragment.java
index 546e12e65..bec73894c 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/GpodderPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/GpodderPreferencesFragment.java
@@ -30,7 +30,6 @@ public class GpodderPreferencesFragment extends PreferenceFragmentCompat {
private static final String PREF_GPODNET_FORCE_FULL_SYNC = "pref_gpodnet_force_full_sync";
private static final String PREF_GPODNET_LOGOUT = "pref_gpodnet_logout";
private static final String PREF_GPODNET_HOSTNAME = "pref_gpodnet_hostname";
- private static final String PREF_GPODNET_NOTIFICATIONS = "pref_gpodnet_notifications";
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -112,7 +111,6 @@ public class GpodderPreferencesFragment extends PreferenceFragmentCompat {
findPreference(PREF_GPODNET_SYNC).setEnabled(loggedIn);
findPreference(PREF_GPODNET_FORCE_FULL_SYNC).setEnabled(loggedIn);
findPreference(PREF_GPODNET_LOGOUT).setEnabled(loggedIn);
- findPreference(PREF_GPODNET_NOTIFICATIONS).setEnabled(loggedIn);
if (loggedIn) {
String format = getActivity().getString(R.string.pref_gpodnet_login_status);
String summary = String.format(format, GpodnetPreferences.getUsername(),
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
index 5eb4a3aea..106b9eef6 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
@@ -207,11 +207,12 @@ public class ImportExportPreferencesFragment extends PreferenceFragmentCompat {
}
private void showDatabaseImportSuccessDialog() {
- AlertDialog.Builder d = new AlertDialog.Builder(getContext());
- d.setMessage(R.string.import_ok);
- d.setCancelable(false);
- d.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> PodcastApp.forceRestart());
- d.show();
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+ builder.setTitle(R.string.successful_import_label);
+ builder.setMessage(R.string.import_ok);
+ builder.setCancelable(false);
+ builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> PodcastApp.forceRestart());
+ builder.show();
}
private void showExportSuccessDialog(final String path, final Uri streamUri) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java
index 3f1cec729..99fd12021 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java
@@ -10,6 +10,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.BugReportActivity;
import de.danoeh.antennapod.activity.PreferenceActivity;
import de.danoeh.antennapod.core.util.IntentUtils;
+import de.danoeh.antennapod.fragment.preferences.about.AboutFragment;
public class MainPreferencesFragment extends PreferenceFragmentCompat {
private static final String TAG = "MainPreferencesFragment";
@@ -25,6 +26,7 @@ public class MainPreferencesFragment extends PreferenceFragmentCompat {
private static final String PREF_CATEGORY_PROJECT = "project";
private static final String STATISTICS = "statistics";
private static final String PREF_ABOUT = "prefAbout";
+ private static final String PREF_NOTIFICATION = "notifications";
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -67,6 +69,10 @@ public class MainPreferencesFragment extends PreferenceFragmentCompat {
((PreferenceActivity) getActivity()).openScreen(R.xml.preferences_storage);
return true;
});
+ findPreference(PREF_NOTIFICATION).setOnPreferenceClickListener(preference -> {
+ ((PreferenceActivity) getActivity()).openScreen(R.xml.preferences_notifications);
+ return true;
+ });
findPreference(PREF_ABOUT).setOnPreferenceClickListener(
preference -> {
@@ -120,5 +126,7 @@ public class MainPreferencesFragment extends PreferenceFragmentCompat {
.addBreadcrumb(PreferenceActivity.getTitleOfPage(R.xml.preferences_autodownload));
config.index(R.xml.preferences_gpodder)
.addBreadcrumb(PreferenceActivity.getTitleOfPage(R.xml.preferences_gpodder));
+ config.index(R.xml.preferences_notifications)
+ .addBreadcrumb(PreferenceActivity.getTitleOfPage(R.xml.preferences_notifications));
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java
new file mode 100644
index 000000000..94e151f7a
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/NotificationPreferencesFragment.java
@@ -0,0 +1,30 @@
+package de.danoeh.antennapod.fragment.preferences;
+
+import android.os.Bundle;
+import androidx.preference.PreferenceFragmentCompat;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.PreferenceActivity;
+import de.danoeh.antennapod.core.preferences.GpodnetPreferences;
+
+public class NotificationPreferencesFragment extends PreferenceFragmentCompat {
+
+ private static final String TAG = "NotificationPrefFragment";
+ private static final String PREF_GPODNET_NOTIFICATIONS = "pref_gpodnet_notifications";
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ addPreferencesFromResource(R.xml.preferences_notifications);
+ setUpScreen();
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.notification_pref_fragment);
+ }
+
+ private void setUpScreen() {
+ final boolean loggedIn = GpodnetPreferences.loggedIn();
+ findPreference(PREF_GPODNET_NOTIFICATIONS).setEnabled(loggedIn);
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java
index f07e59afe..1fa1fed58 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java
@@ -109,7 +109,7 @@ public class PlaybackPreferencesFragment extends PreferenceFragmentCompat {
private void buildSmartMarkAsPlayedPreference() {
final Resources res = getActivity().getResources();
- ListPreference pref = (ListPreference) findPreference(UserPreferences.PREF_SMART_MARK_AS_PLAYED_SECS);
+ ListPreference pref = findPreference(UserPreferences.PREF_SMART_MARK_AS_PLAYED_SECS);
String[] values = res.getStringArray(R.array.smart_mark_as_played_values);
String[] entries = new String[values.length];
for (int x = 0; x < values.length; x++) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java
index 12be76ba7..689a72ba7 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java
@@ -1,7 +1,6 @@
package de.danoeh.antennapod.fragment.preferences;
import android.content.Context;
-import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import com.google.android.material.snackbar.Snackbar;
@@ -9,10 +8,9 @@ import androidx.appcompat.app.AlertDialog;
import androidx.preference.PreferenceFragmentCompat;
import android.widget.ListView;
import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.PreferenceActivity;
import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.dialog.FeedFilterDialog;
+import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog;
import de.danoeh.antennapod.dialog.FeedSortDialog;
import de.danoeh.antennapod.fragment.NavDrawerFragment;
import org.apache.commons.lang3.ArrayUtils;
@@ -79,7 +77,7 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat {
findPreference(UserPreferences.PREF_FILTER_FEED)
.setOnPreferenceClickListener((preference -> {
- FeedFilterDialog.showDialog(requireContext());
+ SubscriptionsFilterDialog.showDialog(requireContext());
return true;
}));
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java
index eb57972a1..b440d053b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/AboutFragment.java
@@ -1,4 +1,4 @@
-package de.danoeh.antennapod.fragment.preferences;
+package de.danoeh.antennapod.fragment.preferences.about;
import android.content.ClipData;
import android.content.ClipboardManager;
@@ -27,14 +27,9 @@ public class AboutFragment extends PreferenceFragmentCompat {
Snackbar.make(getView(), R.string.copied_to_clipboard, Snackbar.LENGTH_SHORT).show();
return true;
});
- findPreference("about_developers").setOnPreferenceClickListener((preference) -> {
- getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutDevelopersFragment())
- .addToBackStack(getString(R.string.developers)).commit();
- return true;
- });
- findPreference("about_translators").setOnPreferenceClickListener((preference) -> {
- getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutTranslatorsFragment())
- .addToBackStack(getString(R.string.translators)).commit();
+ findPreference("about_contributors").setOnPreferenceClickListener((preference) -> {
+ getParentFragmentManager().beginTransaction().replace(R.id.content, new ContributorsPagerFragment())
+ .addToBackStack(getString(R.string.contributors)).commit();
return true;
});
findPreference("about_privacy_policy").setOnPreferenceClickListener((preference) -> {
@@ -42,7 +37,7 @@ public class AboutFragment extends PreferenceFragmentCompat {
return true;
});
findPreference("about_licenses").setOnPreferenceClickListener((preference) -> {
- getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutLicensesFragment())
+ getParentFragmentManager().beginTransaction().replace(R.id.content, new LicensesFragment())
.addToBackStack(getString(R.string.translators)).commit();
return true;
});
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java
new file mode 100644
index 000000000..20cef1313
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/ContributorsPagerFragment.java
@@ -0,0 +1,95 @@
+package de.danoeh.antennapod.fragment.preferences.about;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+import androidx.viewpager2.widget.ViewPager2;
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.PreferenceActivity;
+
+/**
+ * Displays the 'about->Contributors' pager screen.
+ */
+public class ContributorsPagerFragment extends Fragment {
+
+ public static final String TAG = "StatisticsFragment";
+
+ private static final int POS_DEVELOPERS = 0;
+ private static final int POS_TRANSLATORS = 1;
+ private static final int POS_SPECIAL_THANKS = 2;
+ private static final int TOTAL_COUNT = 3;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+ setHasOptionsMenu(true);
+
+ View rootView = inflater.inflate(R.layout.pager_fragment, container, false);
+ ViewPager2 viewPager = rootView.findViewById(R.id.viewpager);
+ viewPager.setAdapter(new StatisticsPagerAdapter(this));
+ // Give the TabLayout the ViewPager
+ TabLayout tabLayout = rootView.findViewById(R.id.sliding_tabs);
+ new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
+ switch (position) {
+ case POS_DEVELOPERS:
+ tab.setText(R.string.developers);
+ break;
+ case POS_TRANSLATORS:
+ tab.setText(R.string.translators);
+ break;
+ case POS_SPECIAL_THANKS:
+ tab.setText(R.string.special_thanks);
+ break;
+ default:
+ break;
+ }
+ }).attach();
+
+ rootView.findViewById(R.id.toolbar).setVisibility(View.GONE);
+
+ return rootView;
+ }
+
+ @Override
+ public void onStart() {
+ super.onStart();
+ ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.contributors);
+ }
+
+ public static class StatisticsPagerAdapter extends FragmentStateAdapter {
+
+ StatisticsPagerAdapter(@NonNull Fragment fragment) {
+ super(fragment);
+ }
+
+ @NonNull
+ @Override
+ public Fragment createFragment(int position) {
+ switch (position) {
+ case POS_TRANSLATORS:
+ return new TranslatorsFragment();
+ case POS_SPECIAL_THANKS:
+ return new SpecialThanksFragment();
+ default:
+ case POS_DEVELOPERS:
+ return new DevelopersFragment();
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return TOTAL_COUNT;
+ }
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutDevelopersFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java
index 62a5eb306..60d9f95dd 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutDevelopersFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/DevelopersFragment.java
@@ -1,4 +1,4 @@
-package de.danoeh.antennapod.fragment.preferences;
+package de.danoeh.antennapod.fragment.preferences.about;
import android.os.Bundle;
import android.view.View;
@@ -19,7 +19,7 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
-public class AboutDevelopersFragment extends ListFragment {
+public class DevelopersFragment extends ListFragment {
private Disposable developersLoader;
@Override
@@ -44,7 +44,7 @@ public class AboutDevelopersFragment extends ListFragment {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
developers -> setListAdapter(new SimpleIconListAdapter<>(getContext(), developers)),
- error -> Toast.makeText(getContext(), "Error while loading developers", Toast.LENGTH_LONG).show()
+ error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
);
}
@@ -56,10 +56,4 @@ public class AboutDevelopersFragment extends ListFragment {
developersLoader.dispose();
}
}
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.developers);
- }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutLicensesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java
index 536d11e01..97565a613 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutLicensesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/LicensesFragment.java
@@ -1,4 +1,4 @@
-package de.danoeh.antennapod.fragment.preferences;
+package de.danoeh.antennapod.fragment.preferences.about;
import android.os.Bundle;
import android.view.View;
@@ -28,7 +28,7 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
-public class AboutLicensesFragment extends ListFragment {
+public class LicensesFragment extends ListFragment {
private Disposable licensesLoader;
private final ArrayList<LicenseItem> licenses = new ArrayList<>();
@@ -59,7 +59,7 @@ public class AboutLicensesFragment extends ListFragment {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
developers -> setListAdapter(new SimpleIconListAdapter<LicenseItem>(getContext(), developers)),
- error -> Toast.makeText(getContext(), "Error while loading licenses", Toast.LENGTH_LONG).show()
+ error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
);
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java
new file mode 100644
index 000000000..6db1389ea
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/SpecialThanksFragment.java
@@ -0,0 +1,58 @@
+package de.danoeh.antennapod.fragment.preferences.about;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Toast;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.ListFragment;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.activity.PreferenceActivity;
+import de.danoeh.antennapod.adapter.SimpleIconListAdapter;
+import io.reactivex.Single;
+import io.reactivex.SingleOnSubscribe;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+
+public class SpecialThanksFragment extends ListFragment {
+ private Disposable translatorsLoader;
+
+ @Override
+ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ getListView().setDivider(null);
+ getListView().setSelector(android.R.color.transparent);
+
+ translatorsLoader = Single.create((SingleOnSubscribe<ArrayList<SimpleIconListAdapter.ListItem>>) emitter -> {
+ ArrayList<SimpleIconListAdapter.ListItem> translators = new ArrayList<>();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(
+ getContext().getAssets().open("special_thanks.csv")));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ String[] info = line.split(";");
+ translators.add(new SimpleIconListAdapter.ListItem(info[0], info[1], info[2]));
+ }
+ emitter.onSuccess(translators);
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(
+ translators -> setListAdapter(new SimpleIconListAdapter<>(getContext(), translators)),
+ error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
+ );
+
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ if (translatorsLoader != null) {
+ translatorsLoader.dispose();
+ }
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutTranslatorsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java
index 914dbb9a2..e8d8e113b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutTranslatorsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/about/TranslatorsFragment.java
@@ -1,4 +1,4 @@
-package de.danoeh.antennapod.fragment.preferences;
+package de.danoeh.antennapod.fragment.preferences.about;
import android.os.Bundle;
import android.view.View;
@@ -19,7 +19,7 @@ import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
-public class AboutTranslatorsFragment extends ListFragment {
+public class TranslatorsFragment extends ListFragment {
private Disposable translatorsLoader;
@Override
@@ -43,7 +43,7 @@ public class AboutTranslatorsFragment extends ListFragment {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
translators -> setListAdapter(new SimpleIconListAdapter<>(getContext(), translators)),
- error -> Toast.makeText(getContext(), "Error while loading translators", Toast.LENGTH_LONG).show()
+ error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show()
);
}
@@ -55,10 +55,4 @@ public class AboutTranslatorsFragment extends ListFragment {
translatorsLoader.dispose();
}
}
-
- @Override
- public void onStart() {
- super.onStart();
- ((PreferenceActivity) getActivity()).getSupportActionBar().setTitle(R.string.translators);
- }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
index 76091327d..6b3c99975 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
@@ -8,6 +8,7 @@ import androidx.appcompat.widget.SearchView;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.fragment.SearchFragment;
/**
@@ -30,15 +31,16 @@ public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuIte
ta.recycle();
}
- public static void setupSearchItem(Menu menu, MainActivity activity, long feedId) {
+ public static void setupSearchItem(Menu menu, MainActivity activity, long feedId, String feedTitle) {
MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView sv = (SearchView) searchItem.getActionView();
+ sv.setBackgroundColor(ThemeUtils.getColorFromAttr(activity, android.R.attr.windowBackground));
sv.setQueryHint(activity.getString(R.string.search_label));
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
sv.clearFocus();
- activity.loadChildFragment(SearchFragment.newInstance(s, feedId));
+ activity.loadChildFragment(SearchFragment.newInstance(s, feedId, feedTitle));
searchItem.collapseActionView();
return true;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java
index 2a157c23b..64dd03b00 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java
@@ -5,12 +5,11 @@ import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import de.danoeh.antennapod.BuildConfig;
-import de.danoeh.antennapod.CrashReportWriter;
+import de.danoeh.antennapod.error.CrashReportWriter;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.preferences.UserPreferences.EnqueueLocation;
import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
-import de.danoeh.antennapod.core.util.gui.NotificationUtils;
public class PreferenceUpgrader {
private static final String PREF_CONFIGURED_VERSION = "version_code";
diff --git a/app/src/main/java/de/danoeh/antennapod/view/LockableBottomSheetBehavior.java b/app/src/main/java/de/danoeh/antennapod/view/LockableBottomSheetBehavior.java
index 8e8d98fc9..1b96c7c4f 100644
--- a/app/src/main/java/de/danoeh/antennapod/view/LockableBottomSheetBehavior.java
+++ b/app/src/main/java/de/danoeh/antennapod/view/LockableBottomSheetBehavior.java
@@ -47,11 +47,11 @@ public class LockableBottomSheetBehavior<V extends View> extends ViewPagerBottom
@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, V child, View directTargetChild,
- View target, int nestedScrollAxes) {
+ View target, int axes, int type) {
boolean handled = false;
if (!isLocked) {
- handled = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
+ handled = super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, axes, type);
}
return handled;
@@ -59,16 +59,16 @@ public class LockableBottomSheetBehavior<V extends View> extends ViewPagerBottom
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target,
- int dx, int dy, int[] consumed) {
+ int dx, int dy, int[] consumed, int type) {
if (!isLocked) {
- super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
+ super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
}
}
@Override
- public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target) {
+ public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, V child, View target, int type) {
if (!isLocked) {
- super.onStopNestedScroll(coordinatorLayout, child, target);
+ super.onStopNestedScroll(coordinatorLayout, child, target, type);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/view/ToolbarIconTintManager.java b/app/src/main/java/de/danoeh/antennapod/view/ToolbarIconTintManager.java
index 163100fff..37d8db03e 100644
--- a/app/src/main/java/de/danoeh/antennapod/view/ToolbarIconTintManager.java
+++ b/app/src/main/java/de/danoeh/antennapod/view/ToolbarIconTintManager.java
@@ -1,7 +1,9 @@
package de.danoeh.antennapod.view;
import android.content.Context;
-import android.graphics.PorterDuff;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.drawable.Drawable;
import android.view.ContextThemeWrapper;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.ViewCompat;
@@ -33,16 +35,20 @@ public abstract class ToolbarIconTintManager implements AppBarLayout.OnOffsetCha
public void updateTint() {
if (isTinted) {
doTint(new ContextThemeWrapper(context, R.style.Theme_AntennaPod_Dark));
- if (toolbar.getNavigationIcon() != null) { // Tablets do not show a navigation icon
- toolbar.getNavigationIcon().setColorFilter(0xffffffff, PorterDuff.Mode.SRC_ATOP);
- }
- toolbar.getOverflowIcon().setColorFilter(0xffffffff, PorterDuff.Mode.SRC_ATOP);
+ safeSetColorFilter(toolbar.getNavigationIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
+ safeSetColorFilter(toolbar.getOverflowIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
+ safeSetColorFilter(toolbar.getCollapseIcon(), new PorterDuffColorFilter(0xffffffff, Mode.SRC_ATOP));
} else {
doTint(context);
- if (toolbar.getNavigationIcon() != null) { // Tablets do not show a navigation icon
- toolbar.getNavigationIcon().clearColorFilter();
- }
- toolbar.getOverflowIcon().clearColorFilter();
+ safeSetColorFilter(toolbar.getNavigationIcon(), null);
+ safeSetColorFilter(toolbar.getOverflowIcon(), null);
+ safeSetColorFilter(toolbar.getCollapseIcon(), null);
+ }
+ }
+
+ private void safeSetColorFilter(Drawable icon, PorterDuffColorFilter filter) {
+ if (icon != null) {
+ icon.setColorFilter(filter);
}
}
diff --git a/app/src/main/play/listings/de-DE/full-description.txt b/app/src/main/play/listings/de-DE/full-description.txt
index 5365983bb..b342dcdee 100644
--- a/app/src/main/play/listings/de-DE/full-description.txt
+++ b/app/src/main/play/listings/de-DE/full-description.txt
@@ -24,8 +24,8 @@ AntennaPod ist von Podcast-Enthusiasten gemacht und frei im wahrsten Sinne des W
<b>Tritt der AntennaPod-Community bei!</b>
AntennaPod wird aktiv von Freiwilligen weiterentwickelt. Auch du kannst bei der Entwicklung mit Quellcode oder Kommentaren mitwirken!
-Wir verwenden GitHub für Funktionswünsche, Fehlerberichte und zur Beteiligung an der Entwicklung:
-https://www.github.com/AntennaPod/AntennaPod
+Unsere freundlichen Freiwilligen im Forum stehen dir bei allen Fragen zur Seite. Gerne kannst du dich dort auch über neue Funktionen und über Podcasting generell austauschen.
+https://forum.antennapod.org/
Mit Transifex kannst du uns beim Übersetzen helfen:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png
index 9fe34a151..b45199a32 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png
index 57528fe56..e7bfdc2d7 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png
index a7b6a35f2..1d7ec8bf7 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png
index 014920d27..7a7ede191 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png
index 88d5c89e2..2120934c9 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png
index 2708df498..1eedf13f9 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/feature-graphic/feature-graphic.png b/app/src/main/play/listings/en-US/graphics/feature-graphic/feature-graphic.png
index 3b5261b28..2e3f60b98 100644
--- a/app/src/main/play/listings/en-US/graphics/feature-graphic/feature-graphic.png
+++ b/app/src/main/play/listings/en-US/graphics/feature-graphic/feature-graphic.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/icon/icon.png b/app/src/main/play/listings/en-US/graphics/icon/icon.png
index 824346d21..bab31c2dd 100644
--- a/app/src/main/play/listings/en-US/graphics/icon/icon.png
+++ b/app/src/main/play/listings/en-US/graphics/icon/icon.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png
index 2ab1d595a..26779f5a1 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png
index e435dfd80..9877ebba6 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png
index eba177029..6f938629b 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png
index 586b10752..550c49031 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png
index dd13094c6..6d0585ff4 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png
index 2684f2a8b..ebdf4c832 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/promo-graphic/promo-graphic.png b/app/src/main/play/listings/en-US/graphics/promo-graphic/promo-graphic.png
index a12aab438..77a6e1c70 100644
--- a/app/src/main/play/listings/en-US/graphics/promo-graphic/promo-graphic.png
+++ b/app/src/main/play/listings/en-US/graphics/promo-graphic/promo-graphic.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/tv-banner/tv-banner.png b/app/src/main/play/listings/en-US/graphics/tv-banner/tv-banner.png
index b278213d5..142aa4839 100644
--- a/app/src/main/play/listings/en-US/graphics/tv-banner/tv-banner.png
+++ b/app/src/main/play/listings/en-US/graphics/tv-banner/tv-banner.png
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/graphics/phone-screenshots/00.png b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/00.png
new file mode 100644
index 000000000..6c3ed9122
--- /dev/null
+++ b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/graphics/phone-screenshots/01.png b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/01.png
new file mode 100644
index 000000000..7bd0730a4
--- /dev/null
+++ b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/graphics/phone-screenshots/02.png b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/02.png
new file mode 100644
index 000000000..2c02ee1d5
--- /dev/null
+++ b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/graphics/phone-screenshots/03.png b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/03.png
new file mode 100644
index 000000000..306de8f3b
--- /dev/null
+++ b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/graphics/phone-screenshots/04.png b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/04.png
new file mode 100644
index 000000000..c1a09170c
--- /dev/null
+++ b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/graphics/phone-screenshots/05.png b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/05.png
new file mode 100644
index 000000000..2698d5d27
--- /dev/null
+++ b/app/src/main/play/listings/es-ES/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/et/full-description.txt b/app/src/main/play/listings/et/full-description.txt
index 446d16ded..ebcc26476 100644
--- a/app/src/main/play/listings/et/full-description.txt
+++ b/app/src/main/play/listings/et/full-description.txt
@@ -1,4 +1,4 @@
-AntennaPod on taskuhäälingu haldur ja esitaja, millega saad kohese ligipääsu miljonitele tasuta ja tasulistele saadetele nii ise- kui suurtegijatelt nagu BBC, NPR ja CNN. Lisa, impordi ja ekspordi nende voogusid ilma muredeta kasutades iTunes'i taskuhäälingute andmebaasi, OPML fail või lihtsalt RSS URL-e.
+AntennaPod on taskuhäälingu haldur ja esitaja, millega saad kohe ligipääsu miljonitele tasuta ja tasulistele saadetele nii ise- kui suurtegijatelt nagu BBC, NPR ja CNN. Lisa, impordi ja ekspordi nende voogusid ilma probleemideta, kasutades iTunes'i taskuhäälingute andmebaasi, OPML faili või lihtsalt RSS URL-e.
Laadi alla, voogedasta või lisa kuulamise järjekorda saateid ning naudi neid täpselt nii, nagu sina tahad, kasutades muudetavat taasesituse kiirust, peatükkide tuge ja unetaimerit.
Säästa pingutuselt, aku kestuselt ja mobiilse andmeside kasutuselt võimekate automatiseerimise vahenditega saadete allalaadimiseks (määra millal, mis sagedusega ja millistest WiFi võrkudes) ning kustutamiseks (vastavalt sinu lemmikutele ja viivituse sätetele).
@@ -24,8 +24,8 @@ Kuna AntennaPod on tehtud taskuhäälingu entusiastide poolt, on AntennaPod vaba
<b>Liitu AntennaPodi kogukonnaga!</b>
AntennaPod on vabatahtlike poolt aktiivselt arendamisel. Ka sina võid anda oma osa, kirjutades koodi või andes tagasisidet!
-GitHub on koht, kus esitada uute võimaluste soove, vearaporteid ja kooditäiendusi:
-https://www.github.com/AntennaPod/AntennaPod
+Meie sõbralikud foorumi liikmed aitavad sind meeleldi leida vastuse kõigile küsimustele. Oled oodatud arutama nii äpi võimalusi kui taskuhäälinguid üldiselt.
+https://forum.antennapod.org/
Transifex on koht, kus saab aidata tõlgetega:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/fr-FR/full-description.txt b/app/src/main/play/listings/fr-FR/full-description.txt
index 7e763023b..911381a95 100644
--- a/app/src/main/play/listings/fr-FR/full-description.txt
+++ b/app/src/main/play/listings/fr-FR/full-description.txt
@@ -24,8 +24,8 @@ Conçu par des fans de podcast, AntennaPod est gratuit, open source et sans publ
<b>Rejoignez la communauté d'AntennaPod !</b>
AntennaPod est développé activement par des volontaires. Vous pouvez aussi contribuer avec du code, des traductions ou des commentaires !
-Rendez-vous sur GitHub pour demander de nouvelles options, signaler des bugs ou pour contribuer au développement :
-https://www.github.com/AntennaPod/AntennaPod
+Les utilisateurs de notre forum seront heureux de répondre à vos questions. Rejoignez-nous pour discuter des fonctionnalités et des podcasts.
+https://forum.antennapod.org/
Rendez-vous sur Transifex pour aider la traduction :
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/00.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/00.png
new file mode 100644
index 000000000..c51243a76
--- /dev/null
+++ b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/01.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/01.png
new file mode 100644
index 000000000..58e14b540
--- /dev/null
+++ b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/02.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/02.png
new file mode 100644
index 000000000..16d6d2f30
--- /dev/null
+++ b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/03.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/03.png
new file mode 100644
index 000000000..abbe2565e
--- /dev/null
+++ b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/04.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/04.png
new file mode 100644
index 000000000..884d91a66
--- /dev/null
+++ b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/05.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/05.png
new file mode 100644
index 000000000..14f04a323
--- /dev/null
+++ b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/gl-ES/full-description.txt b/app/src/main/play/listings/gl-ES/full-description.txt
index bf9471ad2..432677e8d 100644
--- a/app/src/main/play/listings/gl-ES/full-description.txt
+++ b/app/src/main/play/listings/gl-ES/full-description.txt
@@ -1,6 +1,6 @@
AntennaPod é un xestor de podcast e reprodutor que che permite acceder a millóns de contidos gratuítos e de pagamento, desde produtores independentes a grandes empresas de contidos como BBC, NPR ou CNN. Engade, importa e exporta as súas fontes sen complicacións utilizando a base de datos de iTunes, ficheiros OPML ou URL de RSS.
-Descarga, difunde ou pon e cola episodios e desfrutaos do xeito que prefiras, con velocidade de reprodución axustable, soporte de capítulos e apagado programable.
-De xeito doado, aforrando batería e datos móbiles e con ferramentas potentes para a automatización das descargas (indicando horarios, intervalos e redes WiFi) e borrado de ficheiros (baseado nos favoritos e axustes temporais).
+Descarga, difunde ou pon e cola episodios e desfrútaos do xeito que prefiras, con velocidade de reprodución axustable, soporte de capítulos e apagado programable.
+De xeito doado, aforrando batería e datos móbiles, con ferramentas potentes para a automatización das descargas (indicando horarios, intervalos e redes WiFi) e borrado de ficheiros (baseado nos favoritos e axustes temporais).
Feita por entusiastas do podcast, AntennaPod é libre en todos os sentidos da palabra: código aberto, gratuíto e sen anuncios.
@@ -17,15 +17,15 @@ Feita por entusiastas do podcast, AntennaPod é libre en todos os sentidos da pa
<b>Xestiona o sistema</b>
• Toma o control das descargas automáticas: escolle fontes, exclúe redes móbiles, redes Wifi específicas, que o móbil esté cargando ou establece horarios para a descarga
-• Xestiona o almacenaxe establecendo a número de episodios gardados, borrado intelixente e escollendo a localización preferida.
+• Xestiona a almacenaxe establecendo a número de episodios gardados, borrado intelixente e escollendo a localización preferida.
• Adáptase ao teu entorno utilizando os decorados claro ou escuro
• Respalda as túas subscricións con gPodder.net e a exportación OPML
<b>Participa na comunidade AntennaPod!</b>
-AntennaPod está baixo continuo desenvolvemento grazas a voluntarios. Vostede tamén pode contribuir, con código ou con comentarios!
+AntennaPod está baixo continuo desenvolvemento grazas a persoas voluntarias. Ti tamén podes contribuír, con código ou con comentarios!
-Podes solicitar novas características utilizando GitHub, así como informe de fallos ou contribuír ao código:
-https://www.github.com/AntennaPod/AntennaPod
+No noso foro estamos encantados de poder axudarche con calquera dúbida que teñas. Convidámoste a comentar a aplicación e o podcasting en xeral.
+https://forum.antennapod.org/
As traducións fanse en Transifex:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/hu-HU/full-description.txt b/app/src/main/play/listings/hu-HU/full-description.txt
index 708ad5b1e..09fd8d1ba 100644
--- a/app/src/main/play/listings/hu-HU/full-description.txt
+++ b/app/src/main/play/listings/hu-HU/full-description.txt
@@ -24,8 +24,8 @@ Podcast-rajongók készítésében, az AntennaPod teljesen szabad, nyílt forrá
<b>Csatlakozzon az AntennaPod közösséghez!</b>
Az AntennaPodot aktívan fejlesztik az önkéntesek. Ön is közreműködhet: kóddal vagy megjegyzésekkel!
-A GitHub a funkciókérések, hibajelentések és a kódbeküldés helye:
-https://www.github.com/AntennaPod/AntennaPod
+A barátságos fórumtagjaink örömmel segítenek minden felmerülő kérdésben. Meghívjuk, hogy beszélgessen a funkciókról, valamint általánosságban a podcastolásról.
+https://forum.antennapod.org/
A Transifexen segíthet a fordításokban:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/it-IT/full-description.txt b/app/src/main/play/listings/it-IT/full-description.txt
index 047a2278b..5e75f9420 100644
--- a/app/src/main/play/listings/it-IT/full-description.txt
+++ b/app/src/main/play/listings/it-IT/full-description.txt
@@ -1,14 +1,14 @@
-AntennaPod è un riproduttore e gestore di podcast che permette l'accesso immediato a milioni di podcast gratuiti e a pagamento, dai podcaster indipendenti alle più grandi emittenti come BBC, NPR e CNN. Aggiungi, importa e esporta in modo semplice usando il database di podcast di iTunes, un file OPML o i semplici URL RSS.
-Scarica, ascolta in streaming o accoda gli episodi e goditeli come preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli e al timer di spegnimento.
-Risparmia fatica, carica della batteria e dati con i potenti controlli automatizzati per il download degli episodi (orari specifici, intervalli di tempo e reti WiFi selezionate) e l'eliminazione degli episodi (gestione dei preferiti e i tempi di cancellazione).
+AntennaPod è un riproduttore e gestore di podcast che permette l'accesso immediato a milioni di podcast gratuiti e a pagamento, dai podcaster indipendenti alle grandi emittenti come BBC, NPR e CNN. Aggiungi, importa ed esporta i feed in modo semplice tramite il database di iTunes, i file OPML o i semplici indirizzi RSS.
+Scarica, accoda o ascolta in streaming gli episodi e goditeli come preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli e al timer di spegnimento.
+Risparmia fatica, carica della batteria e dati grazie ai potenti controlli automatizzati per il download degli episodi (orari specifici, intervalli di tempo e reti WiFi specifiche) e l'eliminazione degli episodi (gestione dei preferiti e tempi di cancellazione).
-Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open source, gratuito e senza pubblicità.
+Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open source, gratuito e senza pubblicità.
<b>Importa, organizza e riproduci</b>
-• Gestisci la riproduzione ovunque: widget nella schermata home, tendina delle notifiche, cuffie e controlli bluetooth.
+• Gestisci la riproduzione ovunque: widget nella schermata home, tendina delle notifiche, cuffie e controlli Bluetooth.
• Aggiungi e importa le sottoscrizioni tramite iTunes e gPodder, o anche tramite file OPML, collegamenti RSS o Atom.
-• Goditi l'ascolto nel modo che preferisci grazie alla velocità di riproduzione modificabile, il supporto ai capitoli, la memorizzazione dello stato di riproduzione e un timer di spegnimento avanzato (scuoti per riavviare o riduci il volume)
-• Accedi ai feed e agli episodi protetti tramite utente e password
+• Goditi l'ascolto nel modo che preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli, alla memorizzazione dello stato di riproduzione e al timer di spegnimento avanzato (scuoti per riavviare o riduci il volume)
+• Accedi tramite utente e password ai feed e agli episodi riservati
<b>Tieni traccia, condividi & ricerca</b>
• Tieni traccia dei migliori episodi di sempre segnandoli come preferiti
@@ -16,16 +16,16 @@ Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open
• Condividi gli episodi e i feed tramite opzioni avanzate di condivisione via social o email, i servizi di gPodder.net o l'esportazione OPML.
<b>Controlla il sistema</b>
-• Gestisci il download automatico: puoi selezionare i feed, escludere le reti mobili, utilizzare reti WiFi specifiche, impostare il download solo se in carica e scaricare in orari o intervalli selezionati.
-• Gestisci lo spazio impostando l'occupazione massima degli episodi, la cancellazione intelligente e il percorso in cui scaricare i file.
-• Adattati alle tue preferenze grazie ai temi chiaro o scuro.
-• Effettua il backup delle sottoscrizioni grazie all'integrazione di gPodder.net e all'esportazione in OPML
+• Gestisci il download automatico: puoi selezionare i feed, escludere le reti mobili, utilizzare reti WiFi specifiche, impostare il download solo quando in carica e scaricare ad orari o intervalli selezionati.
+• Gestisci lo spazio impostando il numero massimo di episodi da tenere, la cancellazione intelligente e il percorso in cui scaricare i file.
+• Adattalo alle tue preferenze grazie ai temi chiaro o scuro.
+• Effettua il backup delle sottoscrizioni grazie all'integrazione con gPodder.net e all'esportazione in OPML.
<b>Partecipa alla community di AntennaPod!</b>
AntennaPod è sviluppato da volontari. Anche tu puoi contribuire, con il codice o con dei commenti!
-GitHub è la piattaforma usata per le richieste di funzionalità, le segnalazioni di bug o i contributi al codice:
-https://www.github.com/AntennaPod/AntennaPod
+I simpatici membri del nostro forum sono felici di rispondere a qualsiasi domanda tu possa avere. Ti invitiamo anche a discutere di funzionalità e podcasting.
+https://forum.antennapod.org/
Transifex è dove puoi contribuire alla traduzione:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/it-IT/graphics/phone-screenshots/00.png b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/00.png
new file mode 100644
index 000000000..a860cc8c7
--- /dev/null
+++ b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/it-IT/graphics/phone-screenshots/01.png b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/01.png
new file mode 100644
index 000000000..b28200a86
--- /dev/null
+++ b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/it-IT/graphics/phone-screenshots/02.png b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/02.png
new file mode 100644
index 000000000..5fd46f51f
--- /dev/null
+++ b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/it-IT/graphics/phone-screenshots/03.png b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/03.png
new file mode 100644
index 000000000..1fcaaba69
--- /dev/null
+++ b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/it-IT/graphics/phone-screenshots/04.png b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/04.png
new file mode 100644
index 000000000..f77490481
--- /dev/null
+++ b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/it-IT/graphics/phone-screenshots/05.png b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/05.png
new file mode 100644
index 000000000..14259aa8c
--- /dev/null
+++ b/app/src/main/play/listings/it-IT/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/iw-IL/full-description.txt b/app/src/main/play/listings/iw-IL/full-description.txt
index 58895c50e..20cc56675 100644
--- a/app/src/main/play/listings/iw-IL/full-description.txt
+++ b/app/src/main/play/listings/iw-IL/full-description.txt
@@ -1,42 +1,31 @@
-היישומון אנטנה־פּוֹד הוא נגן ומנהל פודקאסטים שמעניק לך גישה ישירה למיליונים של פודקאסטים בחינם ובתשלום, החל ממגישי פודקאסטים עצמאיים ועד למפיצים גדולים כגון BBC,‏ NPR ו־CNN. ניתן להוסיף, לייבא ולייצא את ההזנות שלהם בקלות יחסית באמצעות מסד נתוני הפודקאסטים של iTunes, קובצי OPML או כתובות של RSS. מאפשר לך לחסוך במאמץ, סוללה ותקשורת נתונים עם פקדי אוטומציה להורדה של פרקים (לפי זמנים, הפרשי זמן ורשתות אלחוטיות) ומחיקה של פרקים (על בסיס הגדרות המועדפים וההשהיה שלך).<br>
-אבל הכי חשוב: ניתן להוריד, להזרים או לסדר רשימות של פרקים וליהנות מהם בכל דרך שמתאימה לך עם מהירויות נגינה משתנות, תמיכה במקטעים ומתזמן שינה
-
-מיוצרת על ידי חובבי פודקאסטים, אנטנהפוד הינה תוכנה חינמית בכל מובן המילה: קוד פתוח, ללא עלות וללא פרסומות.
-
-<b>כל התכונות:</b><br>
-ייבוא, ארגון ונגינה<br>
-&#8226; ניתן להוסיף ולייבא הזנות דרך הספריות של iTunes ושל gPodder.net, קובצי OPML וקישורי RSS או Atom<br>
-&#8226; ניתן לנהל את הנגינה מכל מקום: וידג׳ט על מסך הבית, התרעות המערכת ופקדי שקע אוזניות ובלוטות׳<br>
-&#8226; פשוט ליהנות בדרך שלך עם מהירות נגינה משתנה, תמיכה במקטעים (MP3, VorbisComment ו־Podlove), שמירת מיקום הנגינה ומתזמן שינה מתקדם (ניתן לנער כדי לאפס, להנמיך את עצמך השמע ולהאט את מהירות הנגינה)<br>
-&#8226; גישה להזנות ולפרקים המוגנים בססמה<br>
-&#8226; ניתן להשתמש בעימודי ההזנות שלנו (www.podlove.org/paged-feeds)
-
-מעקב, שיתוף והבעת הערכה<br>
-&#8226; מעקב אחר הטובים שבטובים על ידי סימון פרקים כמועדפים<br>
-&#8226; ניתן לאתר פרק אחד דרך היסטוריית הנגינה או על ידי חיפוש (כותרות והערות פרק)<br>
-&#8226; ניתן לשתף פרקים והזנות דרך אפשרויות מתקדמות ברשתות חברתיות ודוא״ל, שירותי gPodder.net ודרך ייצוא OPML<br>
-
-שליטה במערכת<br>
-&#8226; ניתן לשלוט על הורדה אוטומטית: לבחור הזנות, להחריג רשתות סלולריות, לבחור רשתות אלחוטיות מסוימות, לדרוש מהטלפון להיות בטעינה ולהגדיר מועדים או מרווחי זמן<br>
-&#8226; ניתן לנהל את האחסון על ידי הגדרת כמות הפרקים שנשמרים במטמון, מחיקה חכמה (בהתבסס על המועדפים ומצב הנגינה שלך) ובחירת המיקום המועדף עליך<br>
-&#8226; ניתן להשתמש באנטנה־פּוֹד בשפה שלך (HE, EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH)<br>
-&#8226; התאמה לסביבה שלך באמצעות ערכות עיצוב בהירה וכהה<br>
-&#8226; גיבוי התמיכה שלך עם שילוב מול gPodder.net וייצוא של OPML
-
-<b>מזמינים אותך להצטרף לקהילת אנטנה־פּוֹד!</b><br>
+היישומון אנטנה־פּוֹד הוא נגן ומנהל פודקאסטים שמעניק לך גישה ישירה למיליונים של פודקאסטים בחינם ובתשלום, החל ממגישי פודקאסטים עצמאיים ועד למפיצים גדולים כגון BBC,‏ NPR ו־CNN. ניתן להוסיף, לייבא ולייצא את ההזנות שלהם בקלות יחסית באמצעות מסד נתוני הפודקאסטים של iTunes, קובצי OPML או כתובות של RSS.
+ניתן להוריד, להזרים או לסדר רשימות של פרקים וליהנות מהם בכל דרך שמתאימה לך עם מהירויות נגינה משתנות, תמיכה במקטעים ומתזמן שינה
+ניתן לחסוך במאמץ, סוללה וניצולת חבילת נתונים עם בקרת אוטומציה מתקדמת להורדת פרקים (תוך הגדרת זמנים, מרווחים ורשתות אלחוטיות) ומחיקת פרקים (על בסיס המועדפים והגדרות ההשהיה שלך).
+
+היישומון אנטנהפּוֹד, שנוצר על ידי חובבי פודקאסטים, הוא חופשי במלוא מובן המילה: קוד פתוח, ללא עלות, ללא פרסומות.
+
+<b>ייבוא, ארגון והשמעה</b>
+• ניתן לנהל את הנגינה מכל מקום: וידג׳ט על מסך הבית, התרעות המערכת ופקדי שקע אוזניות ובלוטות׳
+• ניתן להוסיף ולייבא הזנות דרך הספריות של iTunes ושל gPodder.net, קובצי OPML וקישורי RSS או Atom
+• פשוט ליהנות בדרך שלך עם מהירות נגינה משתנה, תמיכה במקטעים, שמירת מיקום הנגינה ומתזמן שינה מתקדם (ניתן לנער כדי לאפס, להנמיך את עצמת השמע)
+• גישה להזנות ולפרקים המוגנים בססמה
+
+<b>מעקב, שיתוף והערכה</b>
+• מעקב אחר הטובים שבטובים על ידי סימון פרקים כמועדפים
+• ניתן לאתר פרק אחד דרך היסטוריית הנגינה או על ידי חיפוש כותרות והערות פרק
+• ניתן לשתף פרקים והזנות דרך אפשרויות מתקדמות ברשתות חברתיות ודוא״ל, שירותי gPodder.net ודרך ייצוא OPML
+
+<b>שליטה במערכת</b>
+• ניתן לשלוט על הורדה אוטומטית: לבחור הזנות, להחריג רשתות סלולריות, לבחור רשתות אלחוטיות מסוימות, לדרוש מהטלפון להיות בטעינה ולהגדיר מועדים או מרווחי זמן
+• ניתן לנהל את האחסון על ידי הגדרת כמות הפרקים שנשמרים במטמון, מחיקה חכמה (בהתבסס על המועדפים ומצב הנגינה שלך) ובחירת המיקום המועדף עליך
+• התאמה לסביבה שלך באמצעות ערכות עיצוב בהירה וכהה
+• גיבוי המינויים שלך עם שילוב מול gPodder.net וייצוא של OPML
+
+<b>מזמינים אותך להצטרף עוד היום לקהילת אנטנהפּוֹד!</b>
את תהליכי הפיתוח הפעילים של אנטנה־פּוֹד מובילים מתנדבים. ניתן לתרום גם כן, עם קוד או עם הערה!
-GitHub הוא המקום בו אנו מרכזים את בקשות התכונות, דיווחי התקלות ותרומות הקוד:<br>
-https://www.github.com/AntennaPod/AntennaPod
-
-הקבוצה שלנו ב־Google היא המקום לשתף את הרעיונות שלך, רגעי הפודקאסט המועדפים עליך ואת הערכתך לכל המתנדבים:<br>
-https://groups.google.com/forum/#!forum/antennapod
-
-יש לך שאלה או שמעניין אותך לתת לנו משוב?
-https://twitter.com/@AntennaPod
-
-Transifex הוא המקום לסייע בתרגומים:<br>
-https://www.transifex.com/antennapod/antennapod
+חברי הפורום החביבים שלנו שמחים לסייע בכל שאלה שעשויה לצוץ לך. מזמינים אותך לדון בתכונות של היישומון ועל פודקאסטים בכלל.
+https://forum.antennapod.org/
-מזמינים אותך לחקור את תכנית הבדיקות שלנו כדי לקבל את התכונות העדכניות ביותר לפני כולם:<br>
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+Transifex הוא המקום לסייע עם התרגומים:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/lt/full-description.txt b/app/src/main/play/listings/lt/full-description.txt
new file mode 100644
index 000000000..161322aa2
--- /dev/null
+++ b/app/src/main/play/listings/lt/full-description.txt
@@ -0,0 +1,31 @@
+„AntennaPod“ yra tinklalaidžių tvarkytuvė ir leistuvė, įgalinanti prieigą prie milijonų nemokamų ir mokamų tinklalaidžių, nuo nepriklausomų kūrėjų iki didžiųjų leidyklų, tokių kaip „BBC“, „NPR“ ir „CNN“. Be vargo pridėkite, importuokite ir eksportuokite sklaidos kanalus naudodamiesi „iTunes“ tinklalaidžių duomenų baze, OPML failais ar RSS kanalais.
+Atsisiųskite, klausykitės iš karto ar dėkite epizodus į eilę ir mėgaukitės jais pasirinkę atkūrimo spartą, naudodamiesi skyrių palaikymu bei miego laikmačiu.
+Sutaupykite pastangų, baterijos energijos ir suvartotų mobiliųjų duomenų naudodamiesi galingais automatizacijos valdikliais epizodų atsiuntimui (nurodykite laiką, intervalą ir „WiFi“ tinklus) ir epizodų trynimui (remiantis Jūsų mėgstamaisiais ir atidėjimo nustatymais).
+
+Sukurtas tinklalaidžių entuziastų, „AntennaPod“ yra laisvas visomis prasmėmis: atvirojo kodo, be mokesčių, be reklamų.
+
+<b>Importuokite, tvarkykite ir atkurkite</b>
+• Valdykite atkūrimą bet kur: pradžios ekrane, programų pranešimuose, ausinių ar „Bluetooth“ valdikliu
+• Pridėkite ar importuokite sklaidos kanalus iš „iTunes“ ir „gPodder.net“, OPML failų, RSS ar Atom nuorodų
+• Mėgaukitės klausydamiesi taip, kaip Jums patinka, naudodamiesi derinama atkūrimo sparta, skyrių palaikymu, išsaugota atkūrimo pozicija ir miego laikmačiu (pakračius nustatomas iš naujo, mažinamas garsis)
+• Pasiekite slaptažodžiu apsaugotus sklaidos kanalus ir epizodus
+
+<b>Sekite, dalinkitės ir branginkite</b>
+• Kaupkite geriausius žymėdami epizodus kaip mėgstamus
+• Raskite norimą epizodą pasinaudoję atkūrimo istorija ar paieška pavadinimuose ir laidų užrašuose
+• Dalinkitės epizodais ir sklaidos kanalais per socialinius tinklus, el. paštu, „gPodder.net“ ir OPML failus
+
+<b>Valdykite sistemą</b>
+• Valdykite automatinį atsiuntimą: pasirinkite sklaidos kanalus, neleiskite atsiuntimų mobiliuoju ryšiu, apibrėžkite leistinus belaidžius tinklus, reikalaukite, jog atsiuntimai būtų vykdomi įkrovos metu, nurodykite atsiuntimų dienos metą ar intervalą
+• Valdykite laikmenos naudojimą nurodant podėlyje laikomų epizodų kiekį, išmanų trynimą ir nurodant norimą saugojimo vietą
+• Pritaikykite savo aplinkai pasirinkę šviesią ar tamsią temą
+• Kurkite prenumeratų atsargines kopijas „gPodder.net“ ar OPML failais
+
+<b>Prisijunkite prie AntennaPod bendruomenės!</b>
+„AntennaPod“ vysto savanoriai. Ir Jūs galite prisidėti, nuo atsiliepimų iki programinio kodo!
+
+Draugiški mūsų forumo nariai pasiruošę padėti visais turimais klausimais. Kviečiame diskutuoti apie programėlės funkcijas bei bendrai apie tinklalaides.
+https://forum.antennapod.org/
+
+Prie vertimų galite prisidėti „Transifex“:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/lt/short-description.txt b/app/src/main/play/listings/lt/short-description.txt
new file mode 100644
index 000000000..0a0752647
--- /dev/null
+++ b/app/src/main/play/listings/lt/short-description.txt
@@ -0,0 +1 @@
+Patogi naudoti, lanksti atvirojo kodo tinklalaidžių tvarkytuvė bei leistuvė \ No newline at end of file
diff --git a/app/src/main/play/listings/lt/title.txt b/app/src/main/play/listings/lt/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/lt/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/nl-NL/full-description.txt b/app/src/main/play/listings/nl-NL/full-description.txt
index 851f0b34e..9fedfaffe 100644
--- a/app/src/main/play/listings/nl-NL/full-description.txt
+++ b/app/src/main/play/listings/nl-NL/full-description.txt
@@ -24,8 +24,8 @@ AntennaPod is gemaakt door podcast-enthousiastelingen. Het team van vrijwilliger
<b>Doe mee met de AntennaPod-gemeenschap!</b>
AntennaPod wordt regelmatig geüpdatet door vrijwilligers. En jij kan ook helpen, met code of commentaar!
-Je kunt op GitHub terecht voor foutmeldingen, verzoekjes voor nieuwe functies en bijdragen aan de code:
-https://www.github.com/AntennaPod/AntennaPod
+De vriendelijke leden van ons forum helpen je graag met welke vraag dan ook. Deel gerust ook ideëen voor nieuwe functies of podcasts in het algemeen.
+https://forum.antennapod.org/
Transifex is de beste plek om te helpen met vertalen:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/00.png b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/00.png
new file mode 100644
index 000000000..df59503e6
--- /dev/null
+++ b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/01.png b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/01.png
new file mode 100644
index 000000000..c9a93bb17
--- /dev/null
+++ b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/02.png b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/02.png
new file mode 100644
index 000000000..ac6f2d65d
--- /dev/null
+++ b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/03.png b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/03.png
new file mode 100644
index 000000000..464efedc4
--- /dev/null
+++ b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/04.png b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/04.png
new file mode 100644
index 000000000..4db1bdfa5
--- /dev/null
+++ b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/05.png b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/05.png
new file mode 100644
index 000000000..95cee64e3
--- /dev/null
+++ b/app/src/main/play/listings/nl-NL/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/pt-BR/full-description.txt b/app/src/main/play/listings/pt-BR/full-description.txt
new file mode 100644
index 000000000..2c852b464
--- /dev/null
+++ b/app/src/main/play/listings/pt-BR/full-description.txt
@@ -0,0 +1,31 @@
+AntennaPod é um tocador e gerenciador de podcasts que lhe oferece acesso a milhões de podcasts gratuitos ou pagos, de podcasters independentes ou dos principais publicadores de conteúdo como BBC, NPR e CNN. Adicione, importe e exporte seus feeds facilmente usando a biblioteca do iTunes, arquivos OPML ou URLs RSS.
+Baixe, transmita ou enfileire episódios e curta-os como quiser com velocidades de reprodução ajustáveis, suporte a capítulos e um temporizador.
+Economize esforço, bateria e uso de dados móveis com avançados recursos para automatizar o download de episódios (especificar horários, intervalos e redes WiFi) e a sua remoção (com base em seus favoritos e configurações de atraso).
+
+Feito por entusiastas de podcast, o AntennaPod é gratuito em todos os sentidos da palavra: código aberto, sem custos, sem anúncios.
+
+Importe, organize e toque
+&#8226; Gerencie suas reproduções de qualquer lugar: widget da tela inicial, notificações de sistema e fone de ouvido e controles bluetooth<br>
+&#8226; Adicione and importe feeds pelo iTunes e diretorios gPodder.net, arquivos OPML e links RSS ou Atom<br>
+&#8226; Ouça do seu jeito com velocidade de reprodução ajustável, suporte a capítulos (MP3, VorbisComment e Podlove), marcador da posição de reprodução e um despertador avançado (chacoalhe para reiniciar, volume reduzido e reprodução desacelerada)<br>
+&#8226; Acesse feeds e episódios protegidos por senha
+
+Acompanhe, compartilhe e aprecie
+&#8226; Guarde o melhor do melhor marcando episódios como favoritos<br>
+&#8226; Encontre aquele episódio específico através do histórico de execução ou pelo sistema de busca (através de títulos e anotações)<br>
+&#8226; Compartilhe episódios e <i>feeds</i> através de opções em redes sociais, email, os serviços da gPodder.net e exportação OPML<br>
+
+Controle o sistema
+&#8226; Tenha controle sobre a automação dos <i>downloads</i>: escolha <i>feeds</i>, exclua redes móveis, selecione redes específicas de WiFi, exija que o telefone esteja sendo carregado e defina horários ou intervalos<br>
+&#8226; Gerencie o armazenamento configurando a quantidade de episódios em cache, exclusão inteligente dos episódios (baseada nos seus favoritos e status de reprodução)<br>
+&#8226; Adapte-se ao ambiente utilizando os temas claro ou escuro<br>
+&#8226; Faça <i>backup</i> das suas inscrições com a integração ao gPodder.net e exportação de OPML
+
+Junte-se à comunidade do AntennaPod!
+O AntennaPod está sob constante desenvolvimento através de voluntários. Você também pode contribuir, com código ou um comentário!
+
+Nossos simpáticos membros do fórum ficarão felizes em ajudar com todas as perguntas que você tiver. Você está convidado a discutir sobre funcionalidades e podcasts em geral também.
+https://forum.antennapod.org/
+
+Transifex é o lugar para ajudar com as traduções:<br>
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/pt-BR/short-description.txt b/app/src/main/play/listings/pt-BR/short-description.txt
new file mode 100644
index 000000000..8f3301cc3
--- /dev/null
+++ b/app/src/main/play/listings/pt-BR/short-description.txt
@@ -0,0 +1 @@
+Um player de podcasts fácil de usar, flexível e de código aberto \ No newline at end of file
diff --git a/app/src/main/play/listings/pt-BR/title.txt b/app/src/main/play/listings/pt-BR/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/pt-BR/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/pt-PT/full-description.txt b/app/src/main/play/listings/pt-PT/full-description.txt
new file mode 100644
index 000000000..6774d87f8
--- /dev/null
+++ b/app/src/main/play/listings/pt-PT/full-description.txt
@@ -0,0 +1,31 @@
+AntennaPod é um gestor de podcasts que lhe permite aceder a milhões de podcasts, gratuitos ou pagos, sejam eles publicadores independentes ou grandes cadeias tais como as estações BBC, NPR e CNN. A adição de fontes é muito fácil através do serviço iTunes, ficheiros OPML e fontes RSS.
+Pode descarregar, emitir ou colocar episódios na fila de reprodução ao seu gosto, pode utilizar velocidades variáveis de reprodução, tem suporte a capítulos e um temporizador.
+Poupe tempo, economize bateria e dados móveis através dos mecanismos de controlo de descargas de episódios (possibilidade de especificar intervalos ou horas para as descargas e redes Wi-Fi) e de eliminação de episódios (de acordo com as suas preferências).
+
+Criado por entusiastas de podcasts, AntennaPod é livre em todos os sentidos da palavra: open source, gratuito e sem publicidade.
+
+<b>Importação, organização e reprodução</b>
+• Gestão de podcasts através do widget, barra de notificações e controlos de auriculares ou bluetooth
+• Adicione e importe fontes existentes nos diretórios iTunes e gPodder.net, ficheiros OPML e ligações ATOM e RSS
+• Velocidade variável de reprodução, suporte a capítulos, memorização da posição de reprodução e um temporizador avançado (agite para repor, baixar e aumentar o volume)
+• Acesso a fontes e episódios protegidos por palavra-passe
+
+<b>Monitorizar, partilhar e apreciar</b>
+• Monitorize os seus episódio preferidos marcando-os como favoritos
+• Localize um episódio no histórico de reprodução ou através de uma pesquisa por título ou notas
+• Partilhe episódios e fontes nas redes sociais, por e-mail, no diretório gPodder.net ou através de ficheiros OPML
+
+<b>Controlo de sistema</b>
+• Controle todas as descargas automáticas: escolha as fontes, exclua redes móveis, especifique as redes Wi-Fi, indique se o telefone deve estar a ser carregado e defina as horas ou intervalos das descargas
+• Gestão do armazenamento através da cache de episódios, da eliminação inteligente e selecionando a localização dos dados
+• Adapte-se ao seu ambiente através dos temas claro ou escuro
+• Guarde as suas subscrições com a integração gPodder.net ou através da exportação OPML
+
+<b>Integrar a comunidade AntennaPod!</b>
+O AntennaPod é desenvolvido por voluntários. Você também pode contribuir na programação ou reportando os erros encontrados!
+
+Os membros do nosso fórum podem ajudar-vos em relação às vossas dúvidas. Sinta-se à vontade para propor funcionalidades ou simplesmente falar connosco.
+https://forum.antennapod.org/
+
+Transifex é o local certo para ajudar a traduzir a aplicação:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/pt-PT/short-description.txt b/app/src/main/play/listings/pt-PT/short-description.txt
new file mode 100644
index 000000000..c558abaca
--- /dev/null
+++ b/app/src/main/play/listings/pt-PT/short-description.txt
@@ -0,0 +1 @@
+Gestor e reprodutor de podcasts simples, flexível e open souce \ No newline at end of file
diff --git a/app/src/main/play/listings/pt-PT/title.txt b/app/src/main/play/listings/pt-PT/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/pt-PT/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/ru-RU/full-description.txt b/app/src/main/play/listings/ru-RU/full-description.txt
index d3d8f2d8f..5efe8f284 100644
--- a/app/src/main/play/listings/ru-RU/full-description.txt
+++ b/app/src/main/play/listings/ru-RU/full-description.txt
@@ -1,4 +1,4 @@
-AntennaPod — менеджер и проигрыватель подкастов, который обеспечит Вас мгновенным доступом к миллионам бесплатных и платных подкастов, как от независимых подкастеров, так и крупных издательских домов. С лёгкостью добавляйте, импортируйте и экспортируйте их каналы используя каталог подкастов iTunes, файлы OPML или адреса каналов RSS.
+AntennaPod — менеджер и проигрыватель подкастов, который обеспечит вас мгновенным доступом к миллионам бесплатных и платных подкастов, как от независимых подкастеров, так и крупных издательских домов. С легкостью добавляйте, импортируйте и экспортируйте их каналы используя каталог подкастов iTunes, файлы OPML или адреса каналов RSS.
Загружайте, транслируйте по сети или добавляйте выпуски в очередь и наслаждайтесь ими так, как вам нравится, с регулируемой скоростью воспроизведения, поддержкой оглавления и таймером сна.
Экономьте время, заряд батареи и мобильный трафик при помощи мощных средств автоматизации загрузки выпусков (фильтрация, указание времени и интервалов, а также сетей WiFi) и их удаления (избранные и настройки хранения).
@@ -7,8 +7,8 @@ AntennaPod — менеджер и проигрыватель подкастов
<b>Импортируйте, систематизируйте и слушайте</b>
• Всевозможное управление воспроизведением: виджетом, системным уведомлением и кнопками проводных и беспроводных гарнитур
• Добавление и импорт каналов через каталоги iTunes и gPodder.net, файлы OPML и ссылки на каналы в RSS или Atom
-• Приятное Вам прослушивание с регулировкой скорости воспроизведения, оглавлениями, запоминанием места воспроизведения и продвинутым таймером сна (со сбросом при встряхивании, снижением громкости)
-• Доступ к каналам и выпускам защищённым паролем
+• Приятное вам прослушивание с регулировкой скорости воспроизведения, оглавлениями, запоминанием места воспроизведения и продвинутым таймером сна (со сбросом при встряхивании, снижением громкости)
+• Доступ к каналам и выпускам, защищенным паролем
<b>Отслеживайте, делитесь и благодарите</b>
• Отслеживайте лучших из лучших, помещая выпуски в избранное
@@ -16,16 +16,16 @@ AntennaPod — менеджер и проигрыватель подкастов
• Разнообразие способов поделиться выпусками и каналами через социальные сети и e-mail, услуги gPodder.net и экспорт в OPML
<b>Управляйте системой</b>
-• Управление автоматической загрузкой: выбор отдельных каналов, запрет на использование мобильных сетей, выбор определённых точек доступа WiFi, только во время зарядки телефона и в заданное время или интервалы
-• Управление хранением путём задания количества выпусков в кэше, автоудаление и выбор предпочтительного размещения
-• Приспосабливается к Вашему окружению посредством светлого или тёмного оформления
-• Резервирование Ваших подписок путём интеграции с gPodder.net и экпорта в OPML
+• Управление автоматической загрузкой: выбор отдельных каналов, запрет на использование мобильных сетей, выбор определенных точек доступа WiFi, только во время зарядки телефона и в заданное время или интервалы
+• Управление хранением: ограничение количества кешируемых выпусков, автоудаление и выбор расположения файлов
+• Приспосабливается к вашему окружению посредством светлого или темного оформления
+• Резервирование ваших подписок путем интеграции с gPodder.net и экпорта в OPML
<b>Присоединяйтесь к сообществу AntennaPod!</b>
AntennaPod постоянно развивается силами добровольцев. Вы тоже можете сделать свой вклад при помощи кода или комментария!
-Посещайте GitHub для запроса новых возможностей, уведомления об ошибках и внесения кода:
-https://www.github.com/AntennaPod/AntennaPod
+Участники нашего дружелюбного форума рады помочь вам с любым вопросом. Мы приглашаем вас обсудить возможности приложения и подкастинг вообще.
+https://forum.antennapod.org/
Помогайте с переводом приложения на Transifex:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/sv-SE/full-description.txt b/app/src/main/play/listings/sv-SE/full-description.txt
index 5965f45bc..2846f4c22 100644
--- a/app/src/main/play/listings/sv-SE/full-description.txt
+++ b/app/src/main/play/listings/sv-SE/full-description.txt
@@ -24,8 +24,8 @@ Gjord av podcastenthusiaster, AntennaPod är fri i alla ordets bemärkelser: öp
<b>Gå med i AntennaPods gemenskap!</b>
AntennaPod är under aktiv utveckling av volontärer. Du kan också bidra, med kod eller kommentarer!
-GitHub är platsen att gå till för att be om funktioner, skapa buggrapporter eller bidra med kod:
-https://www.github.com/AntennaPod/AntennaPod
+Våra vänliga forummedlemmar hjälper glatt till med alla frågor du har. Du inbjuds också att diskutera funktioner och podcasting generellt.
+https://forum.antennapod.org/
Transifex är platsen att gå till för att hjälpa till med översättningen:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/zh-CN/full-description.txt b/app/src/main/play/listings/zh-CN/full-description.txt
index 993e7e18c..f467bc671 100644
--- a/app/src/main/play/listings/zh-CN/full-description.txt
+++ b/app/src/main/play/listings/zh-CN/full-description.txt
@@ -24,8 +24,8 @@ AntennaPod是一个播客管理器和播放器,可以让你即时访问数以
<b>加入AntennaPod社区</b>
志愿者正在积极开发 AntennaPod 。您也可以通过代码或评论做出贡献!
-前往Github请求功能、报告错误和贡献代码
-https://www.github.com/AntennaPod/AntennaPod
+我们友好的论坛成员乐意为您的每个问题提供帮助。 我们还邀请您讨论功能和播客。
+https://forum.antennapod.org/
要帮忙翻译请前往Transifex
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/zh-TW/full-description.txt b/app/src/main/play/listings/zh-TW/full-description.txt
new file mode 100644
index 000000000..97144018e
--- /dev/null
+++ b/app/src/main/play/listings/zh-TW/full-description.txt
@@ -0,0 +1,31 @@
+AntennaPod 是 Podcast 訂閱管理工具。從百家爭鳴的獨立 Postcasters 到各立山頭的大廠如 BBC、CNN、NPR 等,讓數百萬免費或付費的 Podcast 唾手可得。您可以使用 iTunes 的 Podcast 資料庫、OPML 檔或RSS 網址等方式,輕鬆新增、匯入或匯出資料來源。
+將各 Podcast 劇集下載、串流播放或放入隊列,然後可以調整播放速度、跳躍章節、設定睡眠時間等等,用您喜愛的方式聆聽享受。
+用強大的自動下載設定指定時間、頻率、WiFi 下載,並且可以依據最愛劇集與延遲設定等方式刪除已經聽過的劇集。省力、省電、省數據。
+
+AntennaPod 由 Podcast 愛好者鼎力製作,免費、無廣告、開放原始碼,給您最全面的自由。
+
+<b>匯入、管理、播放</b>
+• 從主畫面小工具、系統通知、耳機或藍牙控制器隨處播放
+• 利用 iTunes、gPodder.net 目錄、OPML 檔、RSS 或 Atom 連結匯入、新增 Podcast
+• 擁有自訂播放速度、支援章節、記憶播放進度、設定睡眠時間等功能,享受自由聆聽的樂趣
+• 支援以密碼保護的 Podcast
+
+<b>保留、分享</b>
+• 將特定一集設定為最愛,永久留存
+• 自播放紀錄、標題或附註等處搜尋特定一集
+• 以社群網站、電子郵件、gPodder.net 或匯出 OPML 等方式分享 Podcast
+
+<b>一手掌控</b>
+• 選擇特定 Podcast、只用特定 WiFi 下載、僅在充電時下載、設定更新頻率與次數等等機制,完整控制自動下載功能
+• 設定暫存集數上限、智慧刪除、設定儲存位置等機制,方便管理設備空間
+• 根據系統環境採用明亮或暗夜佈景
+• 以整合的 gPodder.net 服務或匯出 OPML 來備份訂閱清單
+
+<b>加入 AntennaPod 社群!</b>
+AntennaPod 由志工熱情製作,您也可以加入 -- 幫忙寫程式或給意見都非常歡迎!
+
+若您遇上使用問題,論壇上的社群成員都樂意提供協助。您也可以加入討論未來功能、其他 Podcast 相關的事情。
+https://forum.antennapod.org/
+
+協助翻譯請至 Transifex:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/zh-TW/short-description.txt b/app/src/main/play/listings/zh-TW/short-description.txt
new file mode 100644
index 000000000..2606389d1
--- /dev/null
+++ b/app/src/main/play/listings/zh-TW/short-description.txt
@@ -0,0 +1 @@
+易用、靈活的開源 podcast 管理及播放器 \ No newline at end of file
diff --git a/app/src/main/play/listings/zh-TW/title.txt b/app/src/main/play/listings/zh-TW/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/zh-TW/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/release-notes/en-US/default.txt b/app/src/main/play/release-notes/en-US/default.txt
index 8c69a50aa..b44fd22bd 100644
--- a/app/src/main/play/release-notes/en-US/default.txt
+++ b/app/src/main/play/release-notes/en-US/default.txt
@@ -1,6 +1,6 @@
-This is a beta release for version 2.0.0. We would love to read your thoughts in our forum (link on the settings screen).
+We are proud to release version 2.0.0 with a new logo and refreshed user interface.
+Thank you to 6420 users who participated in the vote for the new logo!
-- Brand new user interface (by @ByteHamster)
- Support for chapter images (only new episodes, by @ByteHamster)
- Skip intro and ending per feed (by @tonytamsf)
- Option to show notifications after episodes have been auto-downloaded (by @shortspider)
diff --git a/app/src/main/res/layout/addfeed.xml b/app/src/main/res/layout/addfeed.xml
index 92569552a..be262094c 100644
--- a/app/src/main/res/layout/addfeed.xml
+++ b/app/src/main/res/layout/addfeed.xml
@@ -90,14 +90,9 @@
android:id="@+id/btn_add_via_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawablePadding="8dp"
app:drawableStartCompat="?attr/feed"
app:drawableLeftCompat="?attr/feed"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:background="?android:attr/selectableItemBackground"
- android:textColor="?android:attr/textColorPrimary"
- android:clickable="true"
+ style="@style/AddPodcastTextView"
android:text="@string/add_podcast_by_url"/>
<TextView
@@ -118,57 +113,46 @@
android:id="@+id/btn_search_itunes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawablePadding="8dp"
app:drawableStartCompat="?attr/action_search"
app:drawableLeftCompat="?attr/action_search"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:background="?android:attr/selectableItemBackground"
- android:textColor="?android:attr/textColorPrimary"
- android:clickable="true"
+ style="@style/AddPodcastTextView"
android:text="@string/search_itunes_label"/>
<TextView
android:id="@+id/btn_search_fyyd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawablePadding="8dp"
app:drawableStartCompat="?attr/action_search"
app:drawableLeftCompat="?attr/action_search"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:background="?android:attr/selectableItemBackground"
- android:textColor="?android:attr/textColorPrimary"
- android:clickable="true"
+ style="@style/AddPodcastTextView"
android:text="@string/search_fyyd_label"/>
<TextView
android:id="@+id/btn_search_gpodder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawablePadding="8dp"
app:drawableStartCompat="?attr/action_search"
app:drawableLeftCompat="?attr/action_search"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:background="?android:attr/selectableItemBackground"
- android:textColor="?android:attr/textColorPrimary"
- android:clickable="true"
+ style="@style/AddPodcastTextView"
android:text="@string/browse_gpoddernet_label"/>
<TextView
+ android:id="@+id/btn_search_podcastindex"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:drawableStartCompat="?attr/action_search"
+ app:drawableLeftCompat="?attr/action_search"
+ style="@style/AddPodcastTextView"
+ android:text="@string/search_podcastindex_label"/>
+
+ <TextView
android:id="@+id/btn_opml_import"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:drawablePadding="8dp"
app:drawableStartCompat="?attr/av_download"
app:drawableLeftCompat="?attr/av_download"
- android:paddingTop="8dp"
- android:paddingBottom="8dp"
- android:background="?android:attr/selectableItemBackground"
- android:textColor="?android:attr/textColorPrimary"
- android:clickable="true"
- android:text="@string/opml_import_label"/>
+ style="@style/AddPodcastTextView"
+ android:text="@string/opml_add_podcast_label"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
diff --git a/app/src/main/res/layout/all_episodes_fragment.xml b/app/src/main/res/layout/all_episodes_fragment.xml
index 353e4f1d0..3b560967c 100644
--- a/app/src/main/res/layout/all_episodes_fragment.xml
+++ b/app/src/main/res/layout/all_episodes_fragment.xml
@@ -16,19 +16,26 @@
android:visibility="gone"
tools:text="(i) Information" />
- <de.danoeh.antennapod.view.EpisodeItemListRecyclerView
- android:id="@android:id/list"
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/txtvInformation"
- android:layout_marginTop="0dp"
- android:layout_marginBottom="0dp"
- android:paddingTop="@dimen/list_vertical_padding"
- android:paddingBottom="@dimen/list_vertical_padding"
- android:paddingHorizontal="@dimen/additional_horizontal_spacing"
- android:layout_above="@id/loadingMore"
- tools:itemCount="13"
- tools:listitem="@layout/feeditemlist_item" />
+ android:layout_above="@id/loadingMore">
+
+ <de.danoeh.antennapod.view.EpisodeItemListRecyclerView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="0dp"
+ android:layout_marginBottom="0dp"
+ android:paddingTop="@dimen/list_vertical_padding"
+ android:paddingBottom="@dimen/list_vertical_padding"
+ android:paddingHorizontal="@dimen/additional_horizontal_spacing"
+ tools:itemCount="13"
+ tools:listitem="@layout/feeditemlist_item" />
+
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/progLoading"
diff --git a/app/src/main/res/layout/audioplayer_fragment.xml b/app/src/main/res/layout/audioplayer_fragment.xml
index 1c2866a1b..225fdd98c 100644
--- a/app/src/main/res/layout/audioplayer_fragment.xml
+++ b/app/src/main/res/layout/audioplayer_fragment.xml
@@ -67,7 +67,8 @@
android:max="500"
tools:progress="100"
android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp" />
+ android:layout_marginRight="8dp"
+ android:clickable="true"/>
<RelativeLayout
android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/cover_fragment.xml b/app/src/main/res/layout/cover_fragment.xml
index a66a5f5d7..5460d0609 100644
--- a/app/src/main/res/layout/cover_fragment.xml
+++ b/app/src/main/res/layout/cover_fragment.xml
@@ -15,8 +15,9 @@
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_gravity="center"
- android:layout_marginLeft="64dp"
- android:layout_marginRight="64dp"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:layout_marginTop="8dp"
android:layout_weight="0"
android:foreground="?attr/selectableItemBackgroundBorderless"
android:importantForAccessibility="no"
@@ -29,16 +30,17 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:layout_marginTop="16dp"
+ android:layout_marginTop="8dp"
android:layout_marginBottom="8dp">
<TextView
android:id="@+id/txtvPodcastTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:ellipsize="end"
- android:gravity="center"
+ android:ellipsize="none"
+ android:gravity="center_horizontal"
android:maxLines="2"
+ android:textSize="@dimen/text_size_small"
android:textColor="?android:attr/textColorSecondary"
android:textIsSelectable="true"
tools:text="Podcast" />
@@ -47,8 +49,9 @@
android:id="@+id/txtvEpisodeTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:ellipsize="end"
- android:gravity="center"
+ android:ellipsize="none"
+ android:gravity="center_horizontal"
+ android:textSize="@dimen/text_size_small"
android:maxLines="2"
android:textColor="?android:attr/textColorPrimary"
android:textIsSelectable="true"
diff --git a/app/src/main/res/layout/feed_item_list_fragment.xml b/app/src/main/res/layout/feed_item_list_fragment.xml
index b995ff28f..6dc484e2f 100644
--- a/app/src/main/res/layout/feed_item_list_fragment.xml
+++ b/app/src/main/res/layout/feed_item_list_fragment.xml
@@ -48,12 +48,19 @@
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
- <de.danoeh.antennapod.view.EpisodeItemListRecyclerView
- android:id="@+id/recyclerView"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingHorizontal="@dimen/additional_horizontal_spacing"
- app:layout_behavior="@string/appbar_scrolling_view_behavior" />
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:id="@+id/swipeRefresh"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+ <de.danoeh.antennapod.view.EpisodeItemListRecyclerView
+ android:id="@+id/recyclerView"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingHorizontal="@dimen/additional_horizontal_spacing" />
+
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/progLoading"
diff --git a/app/src/main/res/layout/feeditemlist_header.xml b/app/src/main/res/layout/feeditemlist_header.xml
index a8845ec27..005702c59 100644
--- a/app/src/main/res/layout/feeditemlist_header.xml
+++ b/app/src/main/res/layout/feeditemlist_header.xml
@@ -24,7 +24,7 @@
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp"
android:importantForAccessibility="no"
- tools:src="@drawable/ic_antenna"
+ tools:src="@tools:sample/avatars"
tools:background="@android:color/holo_green_dark"/>
<LinearLayout
diff --git a/app/src/main/res/layout/feeditemlist_item.xml b/app/src/main/res/layout/feeditemlist_item.xml
index c2bcced6f..7083365e7 100644
--- a/app/src/main/res/layout/feeditemlist_item.xml
+++ b/app/src/main/res/layout/feeditemlist_item.xml
@@ -45,11 +45,12 @@
android:id="@+id/coverHolder"
app:cardBackgroundColor="@color/non_square_icon_background"
app:cardCornerRadius="4dp"
+ app:cardPreventCornerOverlap="false"
app:cardElevation="0dp">
<RelativeLayout
- android:layout_width="@dimen/thumbnail_length_queue_item"
- android:layout_height="@dimen/thumbnail_length_queue_item">
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
<TextView
android:id="@+id/txtvPlaceholder"
diff --git a/app/src/main/res/layout/fragment_itunes_search.xml b/app/src/main/res/layout/fragment_itunes_search.xml
index d82051867..6e00bdf0d 100644
--- a/app/src/main/res/layout/fragment_itunes_search.xml
+++ b/app/src/main/res/layout/fragment_itunes_search.xml
@@ -4,18 +4,35 @@
android:layout_width="match_parent"
android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto">
- <androidx.appcompat.widget.Toolbar
+ <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?attr/actionBarSize"
- android:theme="?attr/actionBarTheme"
- android:layout_alignParentTop="true"
- app:navigationIcon="?homeAsUpIndicator"
- app:title="@string/discover"
- android:id="@+id/toolbar"/>
+ android:orientation="horizontal"
+ android:id="@+id/browsing"
+ android:layout_alignParentTop="true">
+ <androidx.appcompat.widget.Toolbar
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minHeight="?attr/actionBarSize"
+ android:theme="?attr/actionBarTheme"
+ app:navigationIcon="?homeAsUpIndicator"
+ app:title="@string/discover"
+ android:id="@+id/toolbar"/>
+
+ <android.widget.Spinner
+ android:id="@+id/spinner_country"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="right|end"
+ android:gravity="right|end"
+ android:isScrollContainer="true"
+ android:minHeight="?attr/actionBarSize"
+ android:spinnerMode="dropdown"
+ android:textAlignment="textEnd" />
+ </LinearLayout>
<GridView
- android:layout_below="@id/toolbar"
+ android:layout_below="@id/browsing"
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/app/src/main/res/layout/fragment_subscriptions.xml b/app/src/main/res/layout/fragment_subscriptions.xml
index a1a5a26f2..d08e0c501 100644
--- a/app/src/main/res/layout/fragment_subscriptions.xml
+++ b/app/src/main/res/layout/fragment_subscriptions.xml
@@ -28,17 +28,24 @@
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/text_size_small" />
- <GridView
- android:layout_below="@id/feeds_filtered_message"
- android:id="@+id/subscriptions_grid"
- android:layout_width="match_parent"
- android:numColumns="3"
- android:horizontalSpacing="2dp"
- android:verticalSpacing="2dp"
- android:layout_height="match_parent"
- android:layout_gravity="center_horizontal"
- android:paddingBottom="88dp"
- android:clipToPadding="false"/>
+ <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+ android:id="@+id/swipeRefresh"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@id/feeds_filtered_message">
+
+ <GridView
+ android:id="@+id/subscriptions_grid"
+ android:layout_width="match_parent"
+ android:numColumns="3"
+ android:horizontalSpacing="2dp"
+ android:verticalSpacing="2dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_horizontal"
+ android:paddingBottom="88dp"
+ android:clipToPadding="false"/>
+
+ </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<ProgressBar
android:id="@+id/progLoading"
diff --git a/app/src/main/res/layout/gpodnet_podcast_listitem.xml b/app/src/main/res/layout/gpodnet_podcast_listitem.xml
index 9821f6e17..99991e919 100644
--- a/app/src/main/res/layout/gpodnet_podcast_listitem.xml
+++ b/app/src/main/res/layout/gpodnet_podcast_listitem.xml
@@ -23,7 +23,7 @@
android:importantForAccessibility="no"
android:cropToPadding="true"
android:scaleType="fitXY"
- tools:src="@drawable/ic_antenna"
+ tools:src="@tools:sample/avatars"
tools:background="@android:color/holo_green_dark"/>
diff --git a/app/src/main/res/layout/itunes_podcast_listitem.xml b/app/src/main/res/layout/itunes_podcast_listitem.xml
index dcf2face6..fe53e1944 100644
--- a/app/src/main/res/layout/itunes_podcast_listitem.xml
+++ b/app/src/main/res/layout/itunes_podcast_listitem.xml
@@ -23,7 +23,7 @@
android:cropToPadding="true"
android:scaleType="fitXY"
tools:background="@android:color/holo_green_dark"
- tools:src="@drawable/ic_antenna" />
+ tools:src="@tools:sample/avatars" />
<LinearLayout
android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/nav_list.xml b/app/src/main/res/layout/nav_list.xml
index c26d0b8ed..ed850cc86 100644
--- a/app/src/main/res/layout/nav_list.xml
+++ b/app/src/main/res/layout/nav_list.xml
@@ -71,4 +71,11 @@
android:paddingTop="8dp"
android:scrollbarStyle="outsideOverlay"
tools:listitem="@layout/nav_listitem" />
+
+ <ProgressBar
+ style="?android:attr/progressBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/progressBar"
+ android:layout_centerVertical="true"/>
</RelativeLayout>
diff --git a/app/src/main/res/layout/onlinefeedview_activity.xml b/app/src/main/res/layout/onlinefeedview_activity.xml
index 812933fb1..996db7d36 100644
--- a/app/src/main/res/layout/onlinefeedview_activity.xml
+++ b/app/src/main/res/layout/onlinefeedview_activity.xml
@@ -57,7 +57,7 @@
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:importantForAccessibility="no"
- tools:src="@drawable/ic_antenna"/>
+ tools:src="@tools:sample/avatars"/>
<TextView
android:id="@+id/txtvTitle"
diff --git a/app/src/main/res/layout/quick_feed_discovery.xml b/app/src/main/res/layout/quick_feed_discovery.xml
index b125206c1..0c55311e3 100644
--- a/app/src/main/res/layout/quick_feed_discovery.xml
+++ b/app/src/main/res/layout/quick_feed_discovery.xml
@@ -4,6 +4,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
<LinearLayout
@@ -54,12 +55,32 @@
android:layout_centerInParent="true"
android:layout_marginTop="30dp"/>
- <TextView
+ <LinearLayout
android:id="@+id/discover_error"
- android:textColor="@color/download_failed_red"
android:layout_width="match_parent"
+ android:layout_height="wrap_content"
android:layout_centerInParent="true"
- android:layout_height="wrap_content"/>
+ android:gravity="center"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/discover_error_txtV"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:layout_margin="16dp"
+ android:textSize="@dimen/text_size_small"
+ tools:text="Error message"
+ tools:background="@android:color/holo_red_light" />
+
+ <Button
+ android:id="@+id/discover_error_retry_btn"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ android:text="@string/retry_label"
+ tools:background="@android:color/holo_red_light" />
+ </LinearLayout>
</RelativeLayout>
diff --git a/app/src/main/res/layout/search_fragment.xml b/app/src/main/res/layout/search_fragment.xml
index 0bc663db1..28d4778f7 100644
--- a/app/src/main/res/layout/search_fragment.xml
+++ b/app/src/main/res/layout/search_fragment.xml
@@ -14,6 +14,15 @@
app:title="@string/search_label"
android:id="@+id/toolbar"/>
+ <com.google.android.material.chip.Chip
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/toolbar"
+ android:id="@+id/feed_title_chip"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="0dp"
+ app:closeIconVisible="true"/>
+
<ProgressBar
android:layout_centerInParent="true"
android:id="@+id/progressBar"
@@ -23,7 +32,7 @@
android:layout_gravity="center"/>
<androidx.recyclerview.widget.RecyclerView
- android:layout_below="@id/toolbar"
+ android:layout_below="@id/feed_title_chip"
android:id="@+id/recyclerViewFeeds"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/app/src/main/res/layout/statistics_listitem.xml b/app/src/main/res/layout/statistics_listitem.xml
index c41ace58b..5989595e1 100644
--- a/app/src/main/res/layout/statistics_listitem.xml
+++ b/app/src/main/res/layout/statistics_listitem.xml
@@ -21,7 +21,7 @@
android:adjustViewBounds="true"
android:cropToPadding="true"
android:scaleType="fitCenter"
- tools:src="@drawable/ic_antenna"
+ tools:src="@tools:sample/avatars"
tools:background="@android:color/holo_green_dark"/>
<TextView
diff --git a/app/src/main/res/values-sw360dp/resource-overrides.xml b/app/src/main/res/values-sw360dp/resource-overrides.xml
new file mode 100644
index 000000000..9d7caaf30
--- /dev/null
+++ b/app/src/main/res/values-sw360dp/resource-overrides.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources, MissingDefaultResource">
+ <bool name="config_materialPreferenceIconSpaceReserved" tools:override="true">false</bool>
+</resources> \ No newline at end of file
diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml
index a7a7ead7b..cb8f9e082 100644
--- a/app/src/main/res/values/integers.xml
+++ b/app/src/main/res/values/integers.xml
@@ -2,4 +2,5 @@
<resources>
<integer name="subscriptions_default_num_of_columns">3</integer>
<integer name="nav_drawer_screen_size_percent">80</integer>
+ <integer name="swipe_to_refresh_duration_in_ms">750</integer>
</resources> \ No newline at end of file
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 0a19a36b1..1630dc2f9 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -40,6 +40,11 @@
android:icon="?attr/storage" />
<Preference
+ android:key="notifications"
+ android:title="@string/notification_pref_fragment"
+ android:icon="?attr/ic_notifications"/>
+
+ <Preference
android:key="statistics"
android:title="@string/statistics_label"
android:icon="?attr/statistics" />
diff --git a/app/src/main/res/xml/preferences_about.xml b/app/src/main/res/xml/preferences_about.xml
index 9b8d744e1..475a1152f 100644
--- a/app/src/main/res/xml/preferences_about.xml
+++ b/app/src/main/res/xml/preferences_about.xml
@@ -10,15 +10,10 @@
android:icon="?attr/ic_unfav"
android:summary="1.7.2 (asd8qs)"/>
<Preference
- android:key="about_developers"
+ android:key="about_contributors"
android:icon="?attr/ic_settings"
- android:summary="@string/developers_summary"
- android:title="@string/developers"/>
- <Preference
- android:key="about_translators"
- android:icon="?attr/ic_chat"
- android:summary="@string/translators_summary"
- android:title="@string/translators"/>
+ android:summary="@string/contributors_summary"
+ android:title="@string/contributors"/>
<Preference
android:key="about_privacy_policy"
android:icon="?attr/ic_questionmark"
diff --git a/app/src/main/res/xml/preferences_gpodder.xml b/app/src/main/res/xml/preferences_gpodder.xml
index d8478faf2..7bddbf245 100644
--- a/app/src/main/res/xml/preferences_gpodder.xml
+++ b/app/src/main/res/xml/preferences_gpodder.xml
@@ -26,10 +26,5 @@
<Preference
android:key="pref_gpodnet_hostname"
android:title="@string/pref_gpodnet_sethostname_title"/>
- <SwitchPreferenceCompat
- android:key="pref_gpodnet_notifications"
- android:title="@string/pref_gpodnet_notifications_title"
- android:summary="@string/pref_gpodnet_notifications_sum"
- android:defaultValue="true"/>
</PreferenceScreen>
diff --git a/app/src/main/res/xml/preferences_network.xml b/app/src/main/res/xml/preferences_network.xml
index f51b9561e..0dbd1acee 100644
--- a/app/src/main/res/xml/preferences_network.xml
+++ b/app/src/main/res/xml/preferences_network.xml
@@ -29,18 +29,6 @@
numberpicker:maxValue="50"
android:key="prefParallelDownloads"
android:title="@string/pref_parallel_downloads_title"/>
- <SwitchPreferenceCompat
- android:defaultValue="true"
- android:enabled="true"
- android:key="prefShowDownloadReport"
- android:summary="@string/pref_showDownloadReport_sum"
- android:title="@string/pref_showDownloadReport_title"/>
- <SwitchPreferenceCompat
- android:defaultValue="false"
- android:enabled="true"
- android:key="prefShowAutoDownloadReport"
- android:summary="@string/pref_showAutoDownloadReport_sum"
- android:title="@string/pref_showAutoDownloadReport_title"/>
<Preference
android:key="prefProxy"
android:summary="@string/pref_proxy_sum"
diff --git a/app/src/main/res/xml/preferences_notifications.xml b/app/src/main/res/xml/preferences_notifications.xml
new file mode 100644
index 000000000..3aa907ca8
--- /dev/null
+++ b/app/src/main/res/xml/preferences_notifications.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <SwitchPreferenceCompat
+ android:defaultValue="true"
+ android:enabled="true"
+ android:key="prefShowDownloadReport"
+ android:summary="@string/pref_showDownloadReport_sum"
+ android:title="@string/pref_showDownloadReport_title" />
+ <SwitchPreferenceCompat
+ android:defaultValue="false"
+ android:enabled="true"
+ android:key="prefShowAutoDownloadReport"
+ android:summary="@string/pref_showAutoDownloadReport_sum"
+ android:title="@string/pref_showAutoDownloadReport_title" />
+ <SwitchPreferenceCompat
+ android:defaultValue="true"
+ android:key="pref_gpodnet_notifications"
+ android:summary="@string/pref_gpodnet_notifications_sum"
+ android:title="@string/pref_gpodnet_notifications_title" />
+</PreferenceScreen> \ No newline at end of file
diff --git a/app/src/main/res/xml/preferences_user_interface.xml b/app/src/main/res/xml/preferences_user_interface.xml
index c1db2dc1e..203e14d42 100644
--- a/app/src/main/res/xml/preferences_user_interface.xml
+++ b/app/src/main/res/xml/preferences_user_interface.xml
@@ -35,7 +35,7 @@
android:defaultValue="1"/>
<Preference
android:title="@string/pref_filter_feed_title"
- android:key="prefFeedFilter"
+ android:key="prefSubscriptionsFilter"
android:summary="@string/pref_filter_feed_sum" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/external_elements">
diff --git a/app/src/play/java/de/danoeh/antennapod/dialog/CustomMRControllerDialog.java b/app/src/play/java/de/danoeh/antennapod/dialog/CustomMRControllerDialog.java
index bf5b85c82..6d8450a18 100644
--- a/app/src/play/java/de/danoeh/antennapod/dialog/CustomMRControllerDialog.java
+++ b/app/src/play/java/de/danoeh/antennapod/dialog/CustomMRControllerDialog.java
@@ -290,10 +290,10 @@ public class CustomMRControllerDialog extends MediaRouteControllerDialog {
View playbackControlLayout = View.inflate(getContext(), R.layout.media_router_controller, wrapper);
- titleView = (TextView) playbackControlLayout.findViewById(R.id.mrc_control_title);
- subtitleView = (TextView) playbackControlLayout.findViewById(R.id.mrc_control_subtitle);
+ titleView = playbackControlLayout.findViewById(R.id.mrc_control_title);
+ subtitleView = playbackControlLayout.findViewById(R.id.mrc_control_subtitle);
playbackControlLayout.findViewById(R.id.mrc_control_title_container).setOnClickListener(onClickListener);
- playPauseButton = (ImageButton) playbackControlLayout.findViewById(R.id.mrc_control_play_pause);
+ playPauseButton = playbackControlLayout.findViewById(R.id.mrc_control_play_pause);
playPauseButton.setOnClickListener(v -> {
PlaybackStateCompat state;
if (mediaController != null && (state = mediaController.getPlaybackState()) != null) {
diff --git a/app/src/play/java/de/danoeh/antennapod/dialog/RatingDialog.java b/app/src/play/java/de/danoeh/antennapod/dialog/RatingDialog.java
new file mode 100644
index 000000000..cfadf0772
--- /dev/null
+++ b/app/src/play/java/de/danoeh/antennapod/dialog/RatingDialog.java
@@ -0,0 +1,122 @@
+package de.danoeh.antennapod.dialog;
+
+import android.app.Activity;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import androidx.annotation.VisibleForTesting;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.lang.ref.WeakReference;
+import java.util.concurrent.TimeUnit;
+
+import com.google.android.play.core.review.ReviewInfo;
+import com.google.android.play.core.review.ReviewManager;
+import com.google.android.play.core.review.ReviewManagerFactory;
+import com.google.android.play.core.tasks.Task;
+
+public class RatingDialog {
+
+ private RatingDialog() {
+ }
+
+ private static final String TAG = RatingDialog.class.getSimpleName();
+ private static final int AFTER_DAYS = 14;
+
+ private static WeakReference<Context> mContext;
+ private static SharedPreferences mPreferences;
+
+ private static final String PREFS_NAME = "RatingPrefs";
+ private static final String KEY_RATED = "KEY_WAS_RATED";
+ private static final String KEY_FIRST_START_DATE = "KEY_FIRST_HIT_DATE";
+ private static final String KEY_NUMBER_OF_REVIEWS = "NUMBER_OF_REVIEW_ATTEMPTS";
+
+ public static void init(Context context) {
+ mContext = new WeakReference<>(context);
+ mPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
+
+ long firstDate = mPreferences.getLong(KEY_FIRST_START_DATE, 0);
+ if (firstDate == 0) {
+ resetStartDate();
+ }
+ }
+
+ public static void check() {
+ if (shouldShow()) {
+ try {
+ showInAppReview();
+ } catch (Exception e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ }
+ }
+ }
+
+ private static void showInAppReview() {
+ Context context = mContext.get();
+ if (context == null) {
+ return;
+ }
+
+ ReviewManager manager = ReviewManagerFactory.create(context);
+ Task<ReviewInfo> request = manager.requestReviewFlow();
+
+ request.addOnCompleteListener(task -> {
+ if (task.isSuccessful()) {
+ ReviewInfo reviewInfo = task.getResult();
+ Task<Void> flow = manager.launchReviewFlow((Activity) context, reviewInfo);
+ flow.addOnCompleteListener(task1 -> {
+ int previousAttempts = mPreferences.getInt(KEY_NUMBER_OF_REVIEWS, 0);
+ if (previousAttempts >= 3) {
+ saveRated();
+ } else {
+ resetStartDate();
+ mPreferences
+ .edit()
+ .putInt(KEY_NUMBER_OF_REVIEWS, previousAttempts + 1)
+ .apply();
+ }
+ Log.i("ReviewDialog", "Successfully finished in-app review");
+ })
+ .addOnFailureListener(error -> {
+ Log.i("ReviewDialog", "failed in reviewing process");
+ });
+ }
+ })
+ .addOnFailureListener(error -> {
+ Log.i("ReviewDialog", "failed to get in-app review request");
+ });
+ }
+
+ private static boolean rated() {
+ return mPreferences.getBoolean(KEY_RATED, false);
+ }
+
+ @VisibleForTesting
+ public static void saveRated() {
+ mPreferences
+ .edit()
+ .putBoolean(KEY_RATED, true)
+ .apply();
+ }
+
+ private static void resetStartDate() {
+ mPreferences
+ .edit()
+ .putLong(KEY_FIRST_START_DATE, System.currentTimeMillis())
+ .apply();
+ }
+
+ private static boolean shouldShow() {
+ if (rated()) {
+ return false;
+ }
+
+ long now = System.currentTimeMillis();
+ long firstDate = mPreferences.getLong(KEY_FIRST_START_DATE, now);
+ long diff = now - firstDate;
+ long diffDays = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
+ return diffDays >= AFTER_DAYS;
+ }
+}
diff --git a/artwork/feature-graphic.svg b/artwork/feature-graphic.svg
deleted file mode 100644
index c8ed16012..000000000
--- a/artwork/feature-graphic.svg
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="1024"
- height="500"
- viewBox="0 0 270.93333 132.29167"
- version="1.1"
- id="svg8"
- inkscape:version="0.92.4 5da689c313, 2019-01-14"
- sodipodi:docname="feature-graphic.svg"
- inkscape:export-filename="/tmp/antennapod.png"
- inkscape:export-xdpi="96"
- inkscape:export-ydpi="96">
- <defs
- id="defs2" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#000000"
- borderopacity="1"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="0.31246662"
- inkscape:cx="546.85547"
- inkscape:cy="197.36023"
- inkscape:document-units="mm"
- inkscape:current-layer="layer1"
- showgrid="false"
- units="px"
- inkscape:window-width="1676"
- inkscape:window-height="982"
- inkscape:window-x="0"
- inkscape:window-y="30"
- inkscape:window-maximized="0"
- borderlayer="true"
- inkscape:showpageshadow="false" />
- <metadata
- id="metadata5">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Ebene 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-164.70832)">
- <path
- style="fill:#42a5f5;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 755.81836 -67.398438 L 488.57227 274.28516 L 579.80078 591.48633 L 583.5957 591.48633 L 836.03125 -67.398438 L 755.81836 -67.398438 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4549" />
- <path
- style="fill:#90caf9;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 366.28125 -67.398438 L 488.57227 274.28516 L 802.67383 -67.398438 L 366.28125 -67.398438 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4547" />
- <path
- style="fill:#0277bd;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 1232.6035 -67.398438 L 1099.5723 82.640625 L 1016.1719 591.48633 L 1272.8418 591.48633 L 1272.8418 -67.398438 L 1232.6035 -67.398438 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4537-2" />
- <path
- style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 1110 28.572266 L 821.42773 387.14258 L 1024.4629 591.48633 L 1044.9961 591.48633 L 1110 28.572266 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4553" />
- <path
- style="fill:#64b5f6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 1162.877 -67.398438 L 697.85742 272.85742 L 821.42773 387.14258 L 1247.082 -67.398438 L 1162.877 -67.398438 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4555" />
- <path
- style="fill:#1565c0;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.60962572"
- d="M 697.85742 272.85742 L 583.23438 591.48633 L 1047.2734 591.48633 L 697.85742 272.85742 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4551" />
- <path
- style="fill:#64b5f6;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 422.85742 -55.714844 L 255.71484 170 L 541.55078 591.48633 L 617.12695 591.48633 L 422.85742 -55.714844 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4545" />
- <path
- style="fill:#42a5f5;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M -246.42578 20.019531 L -246.42578 591.48633 L -21.724609 591.48633 L -45.671875 175.87891 L -246.42578 20.019531 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4549-3" />
- <path
- style="fill:#0277bd;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M -45.671875 189.48047 L -166.46875 591.48633 L 500.89258 591.48633 L -45.671875 189.48047 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4537" />
- <path
- style="fill:#90caf9;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 255.71484 170 L -45.671875 189.48047 L 484.89258 591.48633 L 546.49219 591.48633 L 268.57227 172.85742 L 255.71484 170 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4539" />
- <path
- style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M -246.42578 -67.398438 L -246.42578 204.35742 L 268.57227 172.85742 L 434.69922 -67.398438 L -246.42578 -67.398438 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4541" />
- <path
- style="fill:#1976d2;fill-opacity:1;stroke:none;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 819.36914 -67.398438 L 697.85742 272.85742 L 1168.3574 -67.398438 L 819.36914 -67.398438 z "
- transform="matrix(0.26458333,0,0,0.26458333,0,164.70832)"
- id="path4557" />
- <path
- id="path4603"
- d="m 131.14882,195.24411 c -6.94441,0 -12.5,5.55559 -12.5,12.5 v 9.72225 a 4.1666667,4.1666667 0 0 0 4.16667,4.16667 h 4.16666 V 210.5219 h -5.55553 v -2.77779 a 9.722222,9.722222 0 0 1 9.7222,-9.72221 9.722222,9.722222 0 0 1 9.72226,9.72221 v 2.77779 h -5.55559 v 11.11113 h 4.16666 a 4.1666667,4.1666667 0 0 0 4.16667,-4.16667 v -9.72225 c 0,-6.94441 -5.59722,-12.5 -12.5,-12.5 z"
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.38888884" />
- <path
- id="path4614"
- d="m 131.1488,253.95301 a 3.9473708,3.9473708 0 0 1 3.94736,3.94737 v 7.89475 a 3.9473708,3.9473708 0 0 1 -3.94736,3.94736 3.9473708,3.9473708 0 0 1 -3.94737,-3.94736 v -7.89475 a 3.9473708,3.9473708 0 0 1 3.94737,-3.94737 m 9.21056,11.84212 c 0,4.64474 -3.43425,8.47365 -7.89474,9.11841 v 4.03947 h -2.6316 v -4.03947 c -4.46054,-0.64476 -7.89474,-4.47367 -7.89474,-9.11841 h 2.6316 a 6.5789516,6.5789516 0 0 0 6.57892,6.57891 6.5789516,6.5789516 0 0 0 6.57896,-6.57891 z"
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.31579018" />
- <path
- id="path4625"
- d="m 211.96825,213.93341 a 3.5025768,3.5025768 0 0 1 3.50256,3.50257 c 0,1.8959 -1.57454,3.50263 -3.50256,3.50263 -1.89591,0 -3.50257,-1.60673 -3.50257,-3.50263 a 3.5025768,3.5025768 0 0 1 3.50257,-3.50257 m -3.50257,-17.99487 a 25.000044,25.000044 0 0 1 25,25.00007 h -4.54692 a 20.45312,20.45312 0 0 0 -20.45308,-20.45315 v -4.54692 m 0,9.09384 a 15.906197,15.906197 0 0 1 15.90617,15.90623 h -4.54692 A 11.359274,11.359274 0 0 0 208.46568,209.5793 Z"
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.60668647" />
- <path
- id="path4655"
- d="m 163.79069,220.93857 h 20.58824 v -2.94119 h -20.58824 m 20.58824,-13.23528 h -5.88239 v -8.82353 h -8.82352 v 8.82353 h -5.88233 l 10.29409,10.29408 z"
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.47058702" />
- <path
- id="path4636"
- d="m 227.91014,264.36965 v -4.8611 a 1.3888889,1.3888889 0 0 0 -1.38887,-1.38887 H 209.8546 a 1.3888889,1.3888889 0 0 0 -1.38892,1.38887 v 13.88893 a 1.3888889,1.3888889 0 0 0 1.38892,1.38887 h 16.66667 a 1.3888889,1.3888889 0 0 0 1.38887,-1.38887 v -4.86116 l 5.55554,5.55559 v -15.27779 z"
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.38888884" />
- <path
- id="path4666"
- d="m 174.08479,263.04394 a 3.4090929,3.4090929 0 0 0 -3.40909,3.40909 3.4090929,3.4090929 0 0 0 3.40909,3.40909 3.4090929,3.4090929 0 0 0 3.40909,-3.40909 3.4090929,3.4090929 0 0 0 -3.40909,-3.40909 m 0,9.09093 a 5.6818216,5.6818216 0 0 1 -5.68179,-5.68184 5.6818216,5.6818216 0 0 1 5.68179,-5.68184 5.6818216,5.6818216 0 0 1 5.68183,5.68184 5.6818216,5.6818216 0 0 1 -5.68183,5.68184 m 0,-14.20459 c -5.68179,0 -10.53407,3.53411 -12.49998,8.52275 1.96591,4.98863 6.81819,8.52271 12.49998,8.52271 5.68183,0 10.53411,-3.53408 12.50002,-8.52271 -1.96591,-4.98864 -6.81819,-8.52275 -12.50002,-8.52275 z"
- inkscape:connector-curvature="0"
- style="opacity:0.5;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.13636422;stroke-opacity:1" />
- <g
- transform="matrix(10.48853,0,0,10.48853,9.606285,-2891.1165)"
- id="layer1-3"
- inkscape:label="Ebene 1">
- <path
- sodipodi:nodetypes="ccsccscccsccscccsccsccccccccccccccccccccccccccccc"
- inkscape:connector-curvature="0"
- id="path845"
- d="m 4.3909501,292.40513 v 0.28377 c 1.0037008,0.0216 1.6560447,0.3661 2.2523926,0.96964 0.5963478,0.60354 0.9467125,1.47696 0.9641258,2.5345 h 0.2782303 c 0.00673,-1.19521 -0.4584817,-2.15822 -1.0382469,-2.73639 -0.5797652,-0.57816 -1.3486655,-1.05093 -2.4565018,-1.05152 z m 0,0.82805 v 0.29924 c 0.7443971,0.0312 1.1668558,0.18401 1.6809974,0.70029 0.5141415,0.51628 0.7305748,1.18454 0.7450816,1.96033 h 0.2948245 c -0.00762,-1.06881 -0.4691861,-1.81182 -0.8291591,-2.17052 -0.3599732,-0.35872 -0.8621337,-0.78563 -1.8917444,-0.78934 z m -5.665e-4,0.87009 5.665e-4,0.27491 c 0.3438797,0.006 0.7199551,0.1209 1.0476503,0.48898 0.3276951,0.36807 0.4289716,0.88778 0.4419601,1.32588 h 0.282102 c -0.00135,-0.57972 -0.2415301,-1.20375 -0.5332283,-1.51395 -0.2916983,-0.31021 -0.6385502,-0.57378 -1.2390371,-0.57582 z m 0.024339,1.16492 c -0.3517826,1.2e-4 -0.6368407,0.28543 -0.636666,0.63722 1.22e-4,0.23202 0.1264212,0.44563 0.3296724,0.55757 l -2.6086157,5.39256 0.4463853,0.29041 0.5260374,-1.08194 4.6640899,1.33914 0.071908,0.13941 0.496721,-0.21739 -3.0267779,-5.84062 c 0.2273717,-0.10308 0.3735565,-0.3295 0.3739235,-0.57914 1.749e-4,-0.35179 -0.2848831,-0.6371 -0.6366657,-0.63722 z m -0.022127,1.80822 0.4574483,0.88834 -1.1306216,0.50944 z m 0.5481634,1.06479 0.7876737,1.52889 -2.1401047,-0.9138 z m -1.4486778,0.80427 2.2402234,0.95196 -3.1020179,0.83801 z m 2.438262,1.11679 1.0758604,2.08978 -4.2741251,-1.22466 z"
- style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.28320846;stroke-opacity:1" />
- </g>
- </g>
-</svg>
diff --git a/artwork/ic_launcher.svg b/artwork/ic_launcher.svg
deleted file mode 100644
index cd65ace03..000000000
--- a/artwork/ic_launcher.svg
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="48"
- height="48"
- viewBox="0 0 12.7 12.7"
- version="1.1"
- id="svg8"
- inkscape:version="0.92.2 2405546, 2018-03-11"
- sodipodi:docname="ic_launcher_foreground.svg">
- <defs
- id="defs2" />
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="11.313709"
- inkscape:cx="23.22737"
- inkscape:cy="21.198035"
- inkscape:document-units="mm"
- inkscape:current-layer="layer1"
- showgrid="false"
- units="px"
- inkscape:window-width="1600"
- inkscape:window-height="835"
- inkscape:window-x="0"
- inkscape:window-y="0"
- inkscape:window-maximized="1"
- borderlayer="true"
- inkscape:showpageshadow="false"
- inkscape:measure-start="22.5502,25.5372"
- inkscape:measure-end="22.0529,26.5828" />
- <metadata
- id="metadata5">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title></dc:title>
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Ebene 1"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-284.29998)">
- <circle
- style="opacity:1;fill:#008ab8;fill-opacity:1;stroke:none;stroke-width:0.00865707;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path905"
- cx="6.2915349"
- cy="290.91675"
- r="5.4972386" />
- <path
- style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.99999994;stroke-opacity:1"
- d="m 21.751953,8.4707031 v 1.0019531 c 3.544035,0.076347 5.84744,1.2927418 7.953125,3.4238278 2.105685,2.131087 3.342811,5.215084 3.404297,8.949219 h 0.982422 C 34.11557,17.625445 32.472913,14.225068 30.425781,12.183594 28.378649,10.14212 25.663687,8.4727819 21.751953,8.4707031 Z m 0,2.9238279 v 1.056641 c 2.628442,0.110362 4.12013,0.649714 5.935547,2.472656 1.815417,1.822942 2.579636,4.182587 2.630859,6.921875 h 1.041016 c -0.02691,-3.773934 -1.656681,-6.397467 -2.927734,-7.664062 -1.271054,-1.266596 -3.044166,-2.773995 -6.679688,-2.78711 z m -0.002,3.072266 0.002,0.970703 c 1.214228,0.02268 2.542138,0.426896 3.699219,1.726562 1.157081,1.299667 1.514685,3.134718 1.560547,4.681641 h 0.996093 C 28.003013,19.798749 27.154977,17.595307 26.125,16.5 25.095023,15.404693 23.8703,14.474016 21.75,14.466797 Z m 0.08594,4.113281 c -1.242133,4.62e-4 -2.248664,1.007867 -2.248047,2.25 4.31e-4,0.819298 0.446389,1.573535 1.164062,1.96875 l -9.210937,19.041016 1.576172,1.02539 1.857421,-3.820312 16.46875,4.728516 0.253907,0.492187 1.753906,-0.767578 L 22.763672,22.875 c 0.802842,-0.363971 1.319016,-1.16343 1.320312,-2.044922 6.17e-4,-1.242133 -1.005913,-2.249537 -2.248046,-2.25 z m -0.07813,6.384766 1.615235,3.136718 -3.992188,1.798829 z m 1.935547,3.759765 2.78125,5.398438 -7.55664,-3.226563 z m -5.115234,2.839844 7.910156,3.361328 -10.953125,2.958985 z M 27.1875,35.507812 30.986328,42.886719 15.894531,38.5625 Z"
- id="path845"
- transform="matrix(0.26458333,0,0,0.26458333,0,284.29998)"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="ccsccscccsccscccsccsccccccccccccccccccccccccccccc" />
- </g>
-</svg>
diff --git a/artwork/screenshots/generateScreenshots.sh b/artwork/screenshots/generateScreenshots.sh
deleted file mode 100644
index 5b1d7f7e8..000000000
--- a/artwork/screenshots/generateScreenshots.sh
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/sh
-
-function generateText() {
- echo "$1"
- convert -size 1698x750 xc:none -gravity Center -pointsize 130 -fill white -font Lato-Regular \
- -annotate 0 "$1" /tmp/text.png
-}
-
-function generateTabletText() {
- echo "$1"
- convert -size 1730x350 xc:none -gravity Center -pointsize 80 -fill white -font Lato-Regular \
- -annotate 0 "$1" /tmp/text.png
-}
-
-function simplePhone() {
- generateText "$1"
- convert templates/phone.png \
- $2 -geometry +306+992 -composite \
- /tmp/text.png -geometry +0+0 -composite \
- $3
-}
-
-function simpleTablet() {
- generateTabletText "$1"
- convert $2 -resize 1280 "/tmp/resized-image.png"
- convert templates/tablet.png \
- /tmp/resized-image.png -geometry +227+459 -composite \
- /tmp/text.png -geometry +0+0 -composite \
- $3
-}
-
-function addLayer() {
- convert $2 $1 -composite $2
-}
-
-function generateScreenshots() {
- language=$1
- mkdir output/$1 2>/dev/null
- text0=`cat raw/$language/texts.txt | head -1 | tail -1`
- text1=`cat raw/$language/texts.txt | head -2 | tail -1`
- text2=`cat raw/$language/texts.txt | head -3 | tail -1`
- text3=`cat raw/$language/texts.txt | head -4 | tail -1`
- text4=`cat raw/$language/texts.txt | head -5 | tail -1`
- text5=`cat raw/$language/texts.txt | head -6 | tail -1`
- text6=`cat raw/$language/texts.txt | head -7 | tail -1`
-
- simplePhone "$text0" raw/$language/00.png output/$language/00.png
- simplePhone "$text1" raw/$language/01.png output/$language/01.png
- simplePhone "$text2" raw/$language/02.png output/$language/03.png
- generateText "$text3"
- convert templates/twophones.png \
- templates/twophones-a.png -geometry +0+10 -composite \
- raw/$language/03a.png -geometry +119+992 -composite \
- templates/twophones-b.png -geometry +0+0 -composite \
- raw/$language/03b.png -geometry +479+1540 -composite \
- /tmp/text.png -geometry +0+0 -composite \
- output/$language/02.png
- simplePhone "$text4" raw/$language/04.png output/$language/04.png
- simplePhone "$text5" raw/$language/05.png output/$language/05.png
- addLayer templates/suggestions.png output/$language/05.png
- simpleTablet "$text6" raw/$language/tablet.png output/$language/tablet.png
- mogrify -resize 1120 "output/$language/0*.png"
-}
-
-mkdir output 2>/dev/null
-
-generateScreenshots "de-DE"
-generateScreenshots "en-US"
-generateScreenshots "nl-NL"
-
-rm /tmp/text.png
diff --git a/artwork/screenshots/raw/de-DE/00.png b/artwork/screenshots/raw/de-DE/00.png
deleted file mode 100644
index f5f7a463b..000000000
--- a/artwork/screenshots/raw/de-DE/00.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/01.png b/artwork/screenshots/raw/de-DE/01.png
deleted file mode 100644
index eac002341..000000000
--- a/artwork/screenshots/raw/de-DE/01.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/02.png b/artwork/screenshots/raw/de-DE/02.png
deleted file mode 100644
index f189d11f2..000000000
--- a/artwork/screenshots/raw/de-DE/02.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/03a.png b/artwork/screenshots/raw/de-DE/03a.png
deleted file mode 100644
index 9681a8586..000000000
--- a/artwork/screenshots/raw/de-DE/03a.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/03b.png b/artwork/screenshots/raw/de-DE/03b.png
deleted file mode 100644
index 28868ecc1..000000000
--- a/artwork/screenshots/raw/de-DE/03b.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/04.png b/artwork/screenshots/raw/de-DE/04.png
deleted file mode 100644
index 03467f768..000000000
--- a/artwork/screenshots/raw/de-DE/04.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/05.png b/artwork/screenshots/raw/de-DE/05.png
deleted file mode 100644
index 4d687d88b..000000000
--- a/artwork/screenshots/raw/de-DE/05.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/tablet.png b/artwork/screenshots/raw/de-DE/tablet.png
deleted file mode 100644
index 592238234..000000000
--- a/artwork/screenshots/raw/de-DE/tablet.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/texts.txt b/artwork/screenshots/raw/de-DE/texts.txt
deleted file mode 100644
index 7c85b8df2..000000000
--- a/artwork/screenshots/raw/de-DE/texts.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Abonniere deine\nLieblings-Podcasts
-Höre in beliebiger\nGeschwindigkeit
-Spare Zeit mit\nautomatischen Downloads
-Wähle dein\nLieblings-Theme
-Passe AntennaPod\nan deine Wünsche an
-Entdecke tausende\nneuer Podcasts
-Genieße deine Podcasts. Überall. Jederzeit.
diff --git a/artwork/screenshots/raw/en-US/00.png b/artwork/screenshots/raw/en-US/00.png
deleted file mode 100644
index f201567a1..000000000
--- a/artwork/screenshots/raw/en-US/00.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/01.png b/artwork/screenshots/raw/en-US/01.png
deleted file mode 100644
index 1c0cd9e8d..000000000
--- a/artwork/screenshots/raw/en-US/01.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/02.png b/artwork/screenshots/raw/en-US/02.png
deleted file mode 100644
index c7812c099..000000000
--- a/artwork/screenshots/raw/en-US/02.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/03a.png b/artwork/screenshots/raw/en-US/03a.png
deleted file mode 100644
index 153344671..000000000
--- a/artwork/screenshots/raw/en-US/03a.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/03b.png b/artwork/screenshots/raw/en-US/03b.png
deleted file mode 100644
index 464c4f9fb..000000000
--- a/artwork/screenshots/raw/en-US/03b.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/04.png b/artwork/screenshots/raw/en-US/04.png
deleted file mode 100644
index 65fe711a6..000000000
--- a/artwork/screenshots/raw/en-US/04.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/05.png b/artwork/screenshots/raw/en-US/05.png
deleted file mode 100644
index 35a1d3b08..000000000
--- a/artwork/screenshots/raw/en-US/05.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/tablet.png b/artwork/screenshots/raw/en-US/tablet.png
deleted file mode 100644
index 6593bd625..000000000
--- a/artwork/screenshots/raw/en-US/tablet.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/texts.txt b/artwork/screenshots/raw/en-US/texts.txt
deleted file mode 100644
index e946bb27c..000000000
--- a/artwork/screenshots/raw/en-US/texts.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Subscribe to all of your\nfavorite podcasts
-Play smart with\nyour speed of choice
-Save time with\nautomatic downloads
-Select the theme\nthat fits best to you
-Adapt AntennaPod\nto your needs
-Discover thousands\nof great podcasts
-Enjoy your podcasts. Anywhere. Anytime.
diff --git a/artwork/screenshots/raw/fr-FR/00.png b/artwork/screenshots/raw/fr-FR/00.png
deleted file mode 100644
index e32664902..000000000
--- a/artwork/screenshots/raw/fr-FR/00.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/01.png b/artwork/screenshots/raw/fr-FR/01.png
deleted file mode 100644
index f1119dd11..000000000
--- a/artwork/screenshots/raw/fr-FR/01.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/02.png b/artwork/screenshots/raw/fr-FR/02.png
deleted file mode 100644
index 17cae455a..000000000
--- a/artwork/screenshots/raw/fr-FR/02.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/03a.png b/artwork/screenshots/raw/fr-FR/03a.png
deleted file mode 100644
index 4944f4f3d..000000000
--- a/artwork/screenshots/raw/fr-FR/03a.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/03b.png b/artwork/screenshots/raw/fr-FR/03b.png
deleted file mode 100644
index c4cf5f058..000000000
--- a/artwork/screenshots/raw/fr-FR/03b.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/04.png b/artwork/screenshots/raw/fr-FR/04.png
deleted file mode 100644
index 2d7572b65..000000000
--- a/artwork/screenshots/raw/fr-FR/04.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/05.png b/artwork/screenshots/raw/fr-FR/05.png
deleted file mode 100644
index cdf2cac38..000000000
--- a/artwork/screenshots/raw/fr-FR/05.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/tablet.png b/artwork/screenshots/raw/fr-FR/tablet.png
deleted file mode 100644
index a86766ba3..000000000
--- a/artwork/screenshots/raw/fr-FR/tablet.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/nl-NL/00.png b/artwork/screenshots/raw/nl-NL/00.png
deleted file mode 120000
index e0bfea551..000000000
--- a/artwork/screenshots/raw/nl-NL/00.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/00.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/01.png b/artwork/screenshots/raw/nl-NL/01.png
deleted file mode 120000
index 3fd528c1c..000000000
--- a/artwork/screenshots/raw/nl-NL/01.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/01.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/02.png b/artwork/screenshots/raw/nl-NL/02.png
deleted file mode 120000
index b885756ff..000000000
--- a/artwork/screenshots/raw/nl-NL/02.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/02.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/03a.png b/artwork/screenshots/raw/nl-NL/03a.png
deleted file mode 120000
index 1a8941b2e..000000000
--- a/artwork/screenshots/raw/nl-NL/03a.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/03a.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/03b.png b/artwork/screenshots/raw/nl-NL/03b.png
deleted file mode 120000
index 060f855ae..000000000
--- a/artwork/screenshots/raw/nl-NL/03b.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/03b.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/04.png b/artwork/screenshots/raw/nl-NL/04.png
deleted file mode 120000
index ce90b2129..000000000
--- a/artwork/screenshots/raw/nl-NL/04.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/04.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/05.png b/artwork/screenshots/raw/nl-NL/05.png
deleted file mode 120000
index 3ea218d4d..000000000
--- a/artwork/screenshots/raw/nl-NL/05.png
+++ /dev/null
@@ -1 +0,0 @@
-../en-US/05.png \ No newline at end of file
diff --git a/artwork/screenshots/raw/nl-NL/tablet.png b/artwork/screenshots/raw/nl-NL/tablet.png
deleted file mode 100644
index 54463f161..000000000
--- a/artwork/screenshots/raw/nl-NL/tablet.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/raw/nl-NL/texts.txt b/artwork/screenshots/raw/nl-NL/texts.txt
deleted file mode 100644
index 9f3651ca6..000000000
--- a/artwork/screenshots/raw/nl-NL/texts.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Abonneer je op al\nje favoriete podcasts
-Speel slim met\nafspeelsnelheid naar keuze
-Bespaar tijd met\nautomatische downloads
-Selecteer het thema\ndat het best bij je past
-Pas AntennaPod aan\naan jouw wensen
-Ontdek honderden\ninteressante podcasts
-Enjoy your podcasts. Anywhere. Anytime.
diff --git a/artwork/screenshots/templates/phone.png b/artwork/screenshots/templates/phone.png
deleted file mode 100644
index 70df4736e..000000000
--- a/artwork/screenshots/templates/phone.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/templates/suggestions.png b/artwork/screenshots/templates/suggestions.png
deleted file mode 100644
index 00d761ef6..000000000
--- a/artwork/screenshots/templates/suggestions.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/templates/tablet.png b/artwork/screenshots/templates/tablet.png
deleted file mode 100644
index 0a757ab1d..000000000
--- a/artwork/screenshots/templates/tablet.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/templates/twophones-a.png b/artwork/screenshots/templates/twophones-a.png
deleted file mode 100644
index bb10550e8..000000000
--- a/artwork/screenshots/templates/twophones-a.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/templates/twophones-b.png b/artwork/screenshots/templates/twophones-b.png
deleted file mode 100644
index ffe3dddf6..000000000
--- a/artwork/screenshots/templates/twophones-b.png
+++ /dev/null
Binary files differ
diff --git a/artwork/screenshots/templates/twophones.png b/artwork/screenshots/templates/twophones.png
deleted file mode 100644
index ea532f1d9..000000000
--- a/artwork/screenshots/templates/twophones.png
+++ /dev/null
Binary files differ
diff --git a/build.gradle b/build.gradle
index 0a5695377..b0d59f24c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -42,13 +42,13 @@ subprojects {
}
project.ext {
- compileSdkVersion = 28
+ compileSdkVersion = 30
minSdkVersion = 16
- targetSdkVersion = 28
+ targetSdkVersion = 30
// AndroidX
annotationVersion = "1.1.0"
- appcompatVersion = "1.1.0"
+ appcompatVersion = "1.2.0"
mediaVersion = "1.1.0"
preferenceVersion = "1.1.1"
workManagerVersion = "2.3.4"
@@ -67,6 +67,9 @@ project.ext {
iconifyVersion = "2.2.2"
audioPlayerVersion = "v2.0.0"
+ // Only used for free builds. This version should be updated regularly.
+ conscryptVersion = "2.4.0"
+
// Google Play build
wearableSupportVersion = "2.6.0"
diff --git a/core/build.gradle b/core/build.gradle
index 96f0f7f04..ada62faa8 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -58,6 +58,16 @@ android {
includeAndroidResources = true
}
}
+
+ lintOptions {
+ disable "InvalidPeriodicWorkRequestInterval", "ObsoleteLintCustomCheck", "DefaultLocale", "UnusedAttribute",
+ "GradleDependency", "ParcelClassLoader", "Typos", "ExtraTranslation", "ImpliedQuantity",
+ "PluralsCandidate", "UnusedQuantity", "StringFormatCount", "TrustAllX509TrustManager",
+ "StaticFieldLeak", "TypographyEllipsis", "IconDensities", "IconDuplicates", "CheckResult"
+
+ warningsAsErrors true
+ abortOnError true
+ }
}
dependencies {
@@ -98,6 +108,9 @@ dependencies {
System.out.println("core: free build hack, skipping some dependencies")
}
+ // bundle conscrypt with free builds
+ freeImplementation "org.conscrypt:conscrypt-android:$conscryptVersion"
+
testImplementation "org.awaitility:awaitility:$awaitilityVersion"
testImplementation 'junit:junit:4.13'
testImplementation 'org.mockito:mockito-inline:3.5.13'
diff --git a/core/src/debug/res/drawable/ic_launcher_background_debug.xml b/core/src/debug/res/drawable/ic_launcher_background_debug.xml
deleted file mode 100644
index 3bc445a92..000000000
--- a/core/src/debug/res/drawable/ic_launcher_background_debug.xml
+++ /dev/null
@@ -1,179 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="108dp"
- android:height="108dp"
- android:viewportWidth="19.242424"
- android:viewportHeight="19.242424">
- <group android:translateX="3.271212"
- android:translateY="3.271212">
- <path
- android:pathData="M-5.2197,-5.2361h23.5693v23.3376h-23.5693z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.1750972"
- android:fillColor="#008ab8"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:fillAlpha="1"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M19.0258,11.307l0.0086,0.1205l-24.1082,1.7194l-0.0086,-0.1205z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M18.8452,8.7757l0.0258,0.3616l-24.1082,1.7194l-0.0258,-0.3616z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.1376536"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M18.6819,6.4854l0.0086,0.1205l-24.1082,1.7194l-0.0086,-0.1205z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M18.5099,4.0746l0.0086,0.1205l-24.1082,1.7194l-0.0086,-0.1205z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M18.3294,1.5432l0.0258,0.3616l-24.1082,1.7194l-0.0258,-0.3616z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.13765359"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M18.166,-0.7471l0.0086,0.1205l-24.1082,1.7194l-0.0086,-0.1205z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M19.1977,13.7179l0.0086,0.1205l-24.1082,1.7194l-0.0086,-0.1205z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M17.9941,-3.1579l0.0086,0.1205l-24.1082,1.7194l-0.0086,-0.1205z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M11.6532,-6.2797l0.1205,-0.0086l1.7194,24.1082l-0.1205,0.0086z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M9.1218,-6.0991l0.3616,-0.0258l1.7194,24.1082l-0.3616,0.0258z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.1376536"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M6.8315,-5.9358l0.1205,-0.0086l1.7194,24.1082l-0.1205,0.0086z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M4.4207,-5.7638l0.1205,-0.0086l1.7194,24.1082l-0.1205,0.0086z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M1.8893,-5.5833l0.3616,-0.0258l1.7194,24.1082l-0.3616,0.0258z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.13765359"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M-0.4009,-5.42l0.1205,-0.0086l1.7194,24.1082l-0.1205,0.0086z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M14.064,-6.4516l0.1205,-0.0086l1.7194,24.1082l-0.1205,0.0086z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- <path
- android:pathData="M-2.8118,-5.248l0.1205,-0.0086l1.7194,24.1082l-0.1205,0.0086z"
- android:strokeAlpha="1"
- android:strokeLineJoin="round"
- android:strokeWidth="0.07947434"
- android:fillColor="#0079a1"
- android:fillAlpha="1"
- android:strokeColor="#00000000"
- android:fillType="nonZero"
- android:strokeLineCap="round"/>
- </group>
-</vector>
diff --git a/core/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/core/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml
deleted file mode 100644
index 74ad49784..000000000
--- a/core/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@drawable/ic_launcher_background_debug"/>
- <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
-</adaptive-icon> \ No newline at end of file
diff --git a/core/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/core/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml
deleted file mode 100644
index 74ad49784..000000000
--- a/core/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@drawable/ic_launcher_background_debug"/>
- <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
-</adaptive-icon> \ No newline at end of file
diff --git a/core/src/debug/res/mipmap-hdpi/ic_launcher.png b/core/src/debug/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..6f8022e25
--- /dev/null
+++ b/core/src/debug/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png b/core/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..d2a3c3206
--- /dev/null
+++ b/core/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/core/src/debug/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 000000000..6f8022e25
--- /dev/null
+++ b/core/src/debug/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-mdpi/ic_launcher.png b/core/src/debug/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..d542d555f
--- /dev/null
+++ b/core/src/debug/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png b/core/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..69c0a3433
--- /dev/null
+++ b/core/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-mdpi/ic_launcher_round.png b/core/src/debug/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 000000000..d542d555f
--- /dev/null
+++ b/core/src/debug/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xhdpi/ic_launcher.png b/core/src/debug/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..a02ec4ca8
--- /dev/null
+++ b/core/src/debug/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png b/core/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..5653dad7c
--- /dev/null
+++ b/core/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/core/src/debug/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..a02ec4ca8
--- /dev/null
+++ b/core/src/debug/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/core/src/debug/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..066f9e5a5
--- /dev/null
+++ b/core/src/debug/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png b/core/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..cd30be7a5
--- /dev/null
+++ b/core/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/core/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..066f9e5a5
--- /dev/null
+++ b/core/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/core/src/debug/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..7dbab284c
--- /dev/null
+++ b/core/src/debug/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/core/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..fe1e7df8f
--- /dev/null
+++ b/core/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/core/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..7dbab284c
--- /dev/null
+++ b/core/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java
index 3c1eda242..04d74f2a2 100644
--- a/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java
+++ b/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java
@@ -1,6 +1,8 @@
package de.danoeh.antennapod.core;
import android.content.Context;
+import java.security.Security;
+import org.conscrypt.Conscrypt;
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
@@ -9,7 +11,6 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.danoeh.antennapod.core.util.NetworkUtils;
-import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup;
import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import java.io.File;
@@ -45,15 +46,16 @@ public class ClientConfig {
UserPreferences.init(context);
UsageStatistics.init(context);
PlaybackPreferences.init(context);
+ installSslProvider(context);
NetworkUtils.init(context);
AntennapodHttpClient.setCacheDirectory(new File(context.getCacheDir(), "okhttp"));
SleepTimerPreferences.init(context);
- RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
NotificationUtils.createChannels(context);
initialized = true;
}
- public static void installSslProvider(Context context) {
- // ProviderInstaller is a closed-source Google library
+ private static void installSslProvider(Context context) {
+ // Insert bundled conscrypt as highest security provider (overrides OS version).
+ Security.insertProviderAt(Conscrypt.newProvider(), 1);
}
}
diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml
index 1f6c36c40..ae5e56e55 100644
--- a/core/src/main/AndroidManifest.xml
+++ b/core/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="de.danoeh.antennapod.core">
+ xmlns:tools="http://schemas.android.com/tools" package="de.danoeh.antennapod.core">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -12,15 +12,19 @@
<application
android:allowBackup="true"
- android:icon="@mipmap/ic_launcher">
+ android:icon="@mipmap/ic_launcher"
+ android:supportsRtl="true">
<service
android:name=".service.download.DownloadService"
android:enabled="true" />
+
<service android:name=".service.playback.PlaybackService"
android:label="@string/app_name"
android:enabled="true"
- android:exported="true">
+ android:exported="true"
+ tools:ignore="ExportedService">
+
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService"/>
</intent-filter>
@@ -39,8 +43,8 @@
<receiver android:name=".receiver.FeedUpdateReceiver"
android:label="@string/feed_update_receiver_name"
- android:exported="true"> <!-- allow feeds update to be triggered by external apps -->
- </receiver>
+ android:exported="true"
+ tools:ignore="ExportedReceiver" /> <!-- allow feeds update to be triggered by external apps -->
</application>
</manifest>
diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/DiscoveryDefaultUpdateEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/DiscoveryDefaultUpdateEvent.java
new file mode 100644
index 000000000..f7757935a
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/event/DiscoveryDefaultUpdateEvent.java
@@ -0,0 +1,6 @@
+package de.danoeh.antennapod.core.event;
+
+public class DiscoveryDefaultUpdateEvent {
+ public DiscoveryDefaultUpdateEvent() {
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java
index 9c1c55d76..a3b66c951 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java
@@ -353,7 +353,7 @@ public class Feed extends FeedFile implements ImageResource {
Date mostRecentDate = new Date(0);
FeedItem mostRecentItem = null;
for (FeedItem item : items) {
- if (item.getPubDate().after(mostRecentDate)) {
+ if (item.getPubDate() != null && item.getPubDate().after(mostRecentDate)) {
mostRecentDate = item.getPubDate();
mostRecentItem = item;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java
index d34e23506..e8e478a86 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java
@@ -129,4 +129,8 @@ public class FeedItemFilter {
return mProperties.clone();
}
+ public boolean isShowDownloaded() {
+ return showDownloaded;
+ }
+
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java
index 2a2568f28..5ffee0d62 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java
@@ -38,11 +38,8 @@ public class FeedPreferences {
private int feedSkipEnding;
public FeedPreferences(long feedID, boolean autoDownload, AutoDeleteAction auto_delete_action, VolumeAdaptionSetting volumeAdaptionSetting, String username, String password) {
- this(feedID, autoDownload, true, auto_delete_action, volumeAdaptionSetting, username, password, new FeedFilter(), SPEED_USE_GLOBAL);
- }
-
- private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, VolumeAdaptionSetting volumeAdaptionSetting, String username, String password, @NonNull FeedFilter filter, float feedPlaybackSpeed) {
- this(feedID, autoDownload, true, auto_delete_action, volumeAdaptionSetting, username, password, new FeedFilter(), feedPlaybackSpeed, 0, 0);
+ this(feedID, autoDownload, true, auto_delete_action, volumeAdaptionSetting,
+ username, password, new FeedFilter(), SPEED_USE_GLOBAL, 0, 0);
}
private FeedPreferences(long feedID, boolean autoDownload, boolean keepUpdated, AutoDeleteAction auto_delete_action, VolumeAdaptionSetting volumeAdaptionSetting, String username, String password, @NonNull FeedFilter filter, float feedPlaybackSpeed, int feedSkipIntro, int feedSkipEnding) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java b/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java
new file mode 100644
index 000000000..93f098ecf
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilter.java
@@ -0,0 +1,106 @@
+package de.danoeh.antennapod.core.feed;
+
+import android.text.TextUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.danoeh.antennapod.core.util.LongIntMap;
+
+public class SubscriptionsFilter {
+ private static final String divider = ",";
+
+ private final String[] properties;
+
+ private boolean showIfCounterGreaterZero = false;
+
+ private boolean showAutoDownloadEnabled = false;
+ private boolean showAutoDownloadDisabled = false;
+
+ private boolean showUpdatedEnabled = false;
+ private boolean showUpdatedDisabled = false;
+
+ public SubscriptionsFilter(String properties) {
+ this(TextUtils.split(properties, divider));
+ }
+
+
+ public SubscriptionsFilter(String[] properties) {
+ this.properties = properties;
+ for (String property : properties) {
+ // see R.arrays.feed_filter_values
+ switch (property) {
+ case "counter_greater_zero":
+ showIfCounterGreaterZero = true;
+ break;
+ case "enabled_auto_download":
+ showAutoDownloadEnabled = true;
+ break;
+ case "disabled_auto_download":
+ showAutoDownloadDisabled = true;
+ break;
+ case "enabled_updates":
+ showUpdatedEnabled = true;
+ break;
+ case "disabled_updates":
+ showUpdatedDisabled = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public boolean isEnabled() {
+ return properties.length > 0;
+ }
+
+ /**
+ * Run a list of feed items through the filter.
+ */
+ public List<Feed> filter(List<Feed> items, LongIntMap feedCounters) {
+ if (properties.length == 0) {
+ return items;
+ }
+
+ List<Feed> result = new ArrayList<>();
+
+ for (Feed item : items) {
+ FeedPreferences itemPreferences = item.getPreferences();
+
+ // If the item does not meet a requirement, skip it.
+ if (showAutoDownloadEnabled && !itemPreferences.getAutoDownload()) {
+ continue;
+ } else if (showAutoDownloadDisabled && itemPreferences.getAutoDownload()) {
+ continue;
+ }
+
+ if (showUpdatedEnabled && !itemPreferences.getKeepUpdated()) {
+ continue;
+ } else if (showUpdatedDisabled && itemPreferences.getKeepUpdated()) {
+ continue;
+ }
+
+ // If the item reaches here, it meets all criteria (except counter > 0)
+ result.add(item);
+ }
+
+ if (showIfCounterGreaterZero) {
+ for (int i = result.size() - 1; i >= 0; i--) {
+ if (feedCounters.get(result.get(i).getId()) <= 0) {
+ result.remove(i);
+ }
+ }
+ }
+
+ return result;
+ }
+
+ public String[] getValues() {
+ return properties.clone();
+ }
+
+ public String serialize() {
+ return TextUtils.join(divider, getValues());
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilterGroup.java b/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilterGroup.java
new file mode 100644
index 000000000..7db0456a0
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/SubscriptionsFilterGroup.java
@@ -0,0 +1,30 @@
+package de.danoeh.antennapod.core.feed;
+
+import de.danoeh.antennapod.core.R;
+
+public enum SubscriptionsFilterGroup {
+ COUNTER_GREATER_ZERO(new ItemProperties(R.string.subscriptions_counter_greater_zero, "counter_greater_zero")),
+ AUTO_DOWNLOAD(new ItemProperties(R.string.auto_downloaded, "enabled_auto_download"),
+ new ItemProperties(R.string.not_auto_downloaded, "disabled_auto_download")),
+ UPDATED(new ItemProperties(R.string.kept_updated, "enabled_updates"),
+ new ItemProperties(R.string.not_kept_updated, "disabled_updates"));
+
+
+ public final ItemProperties[] values;
+
+ SubscriptionsFilterGroup(ItemProperties... values) {
+ this.values = values;
+ }
+
+ public static class ItemProperties {
+
+ public final int displayName;
+ public final String filterId;
+
+ public ItemProperties(int displayName, String filterId) {
+ this.displayName = displayName;
+ this.filterId = filterId;
+ }
+
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
index bcbc041a6..1dc4b6093 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
@@ -32,6 +32,7 @@ import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.feed.MediaType;
+import de.danoeh.antennapod.core.feed.SubscriptionsFilter;
import de.danoeh.antennapod.core.service.download.ProxyConfig;
import de.danoeh.antennapod.core.storage.APCleanupAlgorithm;
import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm;
@@ -66,7 +67,7 @@ public class UserPreferences {
private static final String PREF_SHOW_AUTO_DOWNLOAD_REPORT = "prefShowAutoDownloadReport";
public static final String PREF_BACK_BUTTON_BEHAVIOR = "prefBackButtonBehavior";
private static final String PREF_BACK_BUTTON_GO_TO_PAGE = "prefBackButtonGoToPage";
- public static final String PREF_FILTER_FEED = "prefFeedFilter";
+ public static final String PREF_FILTER_FEED = "prefSubscriptionsFilter";
public static final String PREF_QUEUE_KEEP_SORTED = "prefQueueKeepSorted";
public static final String PREF_QUEUE_KEEP_SORTED_ORDER = "prefQueueKeepSortedOrder";
@@ -149,8 +150,6 @@ public class UserPreferences {
public static final int FEED_COUNTER_SHOW_UNPLAYED = 2;
public static final int FEED_COUNTER_SHOW_NONE = 3;
public static final int FEED_COUNTER_SHOW_DOWNLOADED = 4;
- public static final int FEED_FILTER_NONE = 0;
- public static final int FEED_FILTER_COUNTER_ZERO = 1;
private static Context context;
private static SharedPreferences prefs;
@@ -249,7 +248,7 @@ public class UserPreferences {
public static void setFeedOrder(String selected) {
prefs.edit()
.putString(PREF_DRAWER_FEED_ORDER, selected)
- .commit();
+ .apply();
}
public static int getFeedCounterSetting() {
@@ -1046,15 +1045,15 @@ public class UserPreferences {
.apply();
}
- public static int getFeedFilter() {
- String value = prefs.getString(PREF_FILTER_FEED, "" + FEED_FILTER_NONE);
- return Integer.parseInt(value);
+ public static SubscriptionsFilter getSubscriptionsFilter() {
+ String value = prefs.getString(PREF_FILTER_FEED, "");
+ return new SubscriptionsFilter(value);
}
- public static void setFeedFilter(String value) {
+ public static void setSubscriptionsFilter(SubscriptionsFilter value) {
prefs.edit()
- .putString(PREF_FILTER_FEED, value)
- .commit();
+ .putString(PREF_FILTER_FEED, value.serialize())
+ .apply();
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java
index b683f849c..abee9d8d3 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java
@@ -15,6 +15,7 @@ public class MediaButtonReceiver extends BroadcastReceiver {
private static final String TAG = "MediaButtonReceiver";
public static final String EXTRA_KEYCODE = "de.danoeh.antennapod.core.service.extra.MediaButtonReceiver.KEYCODE";
public static final String EXTRA_SOURCE = "de.danoeh.antennapod.core.service.extra.MediaButtonReceiver.SOURCE";
+ public static final String EXTRA_HARDWAREBUTTON = "de.danoeh.antennapod.core.service.extra.MediaButtonReceiver.HARDWAREBUTTON";
public static final String NOTIFY_BUTTON_RECEIVER = "de.danoeh.antennapod.NOTIFY_BUTTON_RECEIVER";
@@ -30,6 +31,12 @@ public class MediaButtonReceiver extends BroadcastReceiver {
Intent serviceIntent = new Intent(context, PlaybackService.class);
serviceIntent.putExtra(EXTRA_KEYCODE, event.getKeyCode());
serviceIntent.putExtra(EXTRA_SOURCE, event.getSource());
+ //detect if this is a hardware button press
+ if (event.getEventTime() > 0 || event.getDownTime() > 0) {
+ serviceIntent.putExtra(EXTRA_HARDWAREBUTTON, true);
+ } else {
+ serviceIntent.putExtra(EXTRA_HARDWAREBUTTON, false);
+ }
ContextCompat.startForegroundService(context, serviceIntent);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java b/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java
index 7585e9d33..74735a264 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java
@@ -132,7 +132,7 @@ public class PlayerWidgetJobService extends SafeJobIntentService {
views.setImageViewBitmap(R.id.imgvCover, icon);
} catch (Throwable tr) {
Log.e(TAG, "Error loading the media icon for the widget", tr);
- views.setImageViewResource(R.id.imgvCover, R.mipmap.ic_launcher_foreground);
+ views.setImageViewResource(R.id.imgvCover, R.mipmap.ic_launcher_round);
}
views.setTextViewText(R.id.txtvTitle, media.getEpisodeTitle());
@@ -171,7 +171,7 @@ public class PlayerWidgetJobService extends SafeJobIntentService {
views.setViewVisibility(R.id.txtvProgress, View.GONE);
views.setViewVisibility(R.id.txtvTitle, View.GONE);
views.setViewVisibility(R.id.txtNoPlaying, View.VISIBLE);
- views.setImageViewResource(R.id.imgvCover, R.mipmap.ic_launcher_foreground);
+ views.setImageViewResource(R.id.imgvCover, R.mipmap.ic_launcher_round);
views.setImageViewResource(R.id.butPlay, R.drawable.ic_av_play_white_48dp);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/ProviderInstallerInterceptor.java b/core/src/main/java/de/danoeh/antennapod/core/service/ProviderInstallerInterceptor.java
deleted file mode 100644
index 4fa1fc3d7..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/service/ProviderInstallerInterceptor.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.danoeh.antennapod.core.service;
-
-import androidx.annotation.NonNull;
-import okhttp3.Interceptor;
-import okhttp3.Response;
-
-import java.io.IOException;
-
-public class ProviderInstallerInterceptor implements Interceptor {
- public static Runnable installer = () -> { };
-
- @Override
- @NonNull
- public Response intercept(Chain chain) throws IOException {
- installer.run();
- return chain.proceed(chain.request());
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java
index 9d0b3c5ad..a01b3cb52 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java
@@ -1,40 +1,16 @@
package de.danoeh.antennapod.core.service.download;
import android.os.Build;
-import androidx.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;
-
-import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.CookieManager;
-import java.net.CookiePolicy;
-import java.net.HttpURLConnection;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.Proxy;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocket;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.net.ssl.X509TrustManager;
-
+import androidx.annotation.NonNull;
import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.core.service.ProviderInstallerInterceptor;
+import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
import de.danoeh.antennapod.core.service.UserAgentInterceptor;
+import de.danoeh.antennapod.core.ssl.BackportTrustManager;
+import de.danoeh.antennapod.core.ssl.NoV1SslSocketFactory;
import de.danoeh.antennapod.core.storage.DBWriter;
+import de.danoeh.antennapod.core.util.Flavors;
import okhttp3.Cache;
import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
@@ -46,6 +22,19 @@ import okhttp3.Request;
import okhttp3.Response;
import okhttp3.internal.http.StatusLine;
+import javax.net.ssl.X509TrustManager;
+import java.io.File;
+import java.net.CookieManager;
+import java.net.CookiePolicy;
+import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.SocketAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
/**
* Provides access to a HttpClient singleton.
*/
@@ -117,7 +106,6 @@ public class AntennapodHttpClient {
}
return response;
});
- builder.interceptors().add(new ProviderInstallerInterceptor());
builder.interceptors().add(new BasicAuthorizationInterceptor());
builder.networkInterceptors().add(new UserAgentInterceptor());
@@ -151,13 +139,20 @@ public class AntennapodHttpClient {
});
}
}
- if (Build.VERSION.SDK_INT < 21) {
- builder.sslSocketFactory(new CustomSslSocketFactory(), trustManager());
+
+ if (Flavors.FLAVOR == Flavors.FREE) {
+ // The Free flavor bundles a modern conscrypt (security provider), so CustomSslSocketFactory
+ // is only used to make sure that modern protocols (TLSv1.3 and TLSv1.2) are enabled and
+ // that old, deprecated, protocols (like SSLv3, TLSv1.0 and TLSv1.1) are disabled.
+ X509TrustManager trustManager = BackportTrustManager.create();
+ builder.sslSocketFactory(new NoV1SslSocketFactory(trustManager), trustManager);
+ } else if (Build.VERSION.SDK_INT < 21) {
+ X509TrustManager trustManager = BackportTrustManager.create();
+ builder.sslSocketFactory(new NoV1SslSocketFactory(trustManager), trustManager);
// workaround for Android 4.x for certain web sites.
// see: https://github.com/square/okhttp/issues/4053#issuecomment-402579554
- List<CipherSuite> cipherSuites = new ArrayList<>(
- ConnectionSpec.MODERN_TLS.cipherSuites());
+ List<CipherSuite> cipherSuites = new ArrayList<>(ConnectionSpec.MODERN_TLS.cipherSuites());
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
@@ -170,101 +165,7 @@ public class AntennapodHttpClient {
return builder;
}
- /**
- * Closes expired connections. This method should be called by the using class once has finished its work with
- * the HTTP client.
- */
- public static synchronized void cleanup() {
- if (httpClient != null) {
- // does nothing at the moment
- }
- }
-
- private static X509TrustManager trustManager() {
- try {
- TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
- TrustManagerFactory.getDefaultAlgorithm());
- trustManagerFactory.init((KeyStore) null);
- TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
- if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
- throw new IllegalStateException("Unexpected default trust managers:"
- + Arrays.toString(trustManagers));
- }
- return (X509TrustManager) trustManagers[0];
- } catch (Exception e) {
- Log.e(TAG, Log.getStackTraceString(e));
- return null;
- }
- }
-
public static void setCacheDirectory(File cacheDirectory) {
AntennapodHttpClient.cacheDirectory = cacheDirectory;
}
-
- private static class CustomSslSocketFactory extends SSLSocketFactory {
-
- private SSLSocketFactory factory;
-
- public CustomSslSocketFactory() {
- try {
- SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
- sslContext.init(null, null, null);
- factory= sslContext.getSocketFactory();
- } catch(GeneralSecurityException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public String[] getDefaultCipherSuites() {
- return factory.getDefaultCipherSuites();
- }
-
- @Override
- public String[] getSupportedCipherSuites() {
- return factory.getSupportedCipherSuites();
- }
-
- public Socket createSocket() throws IOException {
- SSLSocket result = (SSLSocket) factory.createSocket();
- configureSocket(result);
- return result;
- }
-
- public Socket createSocket(String var1, int var2) throws IOException {
- SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
- configureSocket(result);
- return result;
- }
-
- public Socket createSocket(Socket var1, String var2, int var3, boolean var4) throws IOException {
- SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
- configureSocket(result);
- return result;
- }
-
- public Socket createSocket(InetAddress var1, int var2) throws IOException {
- SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
- configureSocket(result);
- return result;
- }
-
- public Socket createSocket(String var1, int var2, InetAddress var3, int var4) throws IOException {
- SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
- configureSocket(result);
- return result;
- }
-
- public Socket createSocket(InetAddress var1, int var2, InetAddress var3, int var4) throws IOException {
- SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
- configureSocket(result);
- return result;
- }
-
- private void configureSocket(SSLSocket s) {
- s.setEnabledProtocols(new String[] { "TLSv1.2", "TLSv1.1", "TLSv1" } );
- }
-
- }
-
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
index e44aa716a..f1b35fe23 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
@@ -10,6 +10,7 @@ import android.content.IntentFilter;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
@@ -178,7 +179,7 @@ public class DownloadService extends Service {
public void onCreate() {
Log.d(TAG, "Service started");
isRunning = true;
- handler = new Handler();
+ handler = new Handler(Looper.getMainLooper());
notificationManager = new DownloadServiceNotification(this);
IntentFilter cancelDownloadReceiverFilter = new IntentFilter();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java
index 64666d25d..975bc3cb3 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceNotification.java
@@ -153,7 +153,11 @@ public class DownloadServiceNotification {
iconId = R.drawable.ic_notification_sync_error;
intent = ClientConfig.downloadServiceCallbacks.getReportNotificationContentIntent(context);
id = R.id.notification_download_report;
- content = String.format(context.getString(R.string.download_report_content), successfulDownloads, failedDownloads);
+ content = context.getResources()
+ .getQuantityString(R.plurals.download_report_content,
+ successfulDownloads,
+ successfulDownloads,
+ failedDownloads);
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
index 61608992b..65b7ed7d1 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
@@ -71,6 +71,7 @@ public class HttpDownloader extends Downloader {
// set header explicitly so that okhttp doesn't do transparent gzip
Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")");
httpReq.addHeader("Accept-Encoding", "identity");
+ httpReq.cacheControl(new CacheControl.Builder().noCache().build()); // noStore breaks CDNs
}
if (!TextUtils.isEmpty(request.getLastModified())) {
@@ -259,7 +260,6 @@ public class HttpDownloader extends Downloader {
onFail(DownloadError.ERROR_CONNECTION_ERROR, request.getSource());
} finally {
IOUtils.closeQuietly(out);
- AntennapodHttpClient.cleanup();
IOUtils.closeQuietly(responseBody);
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java
index c50162788..18c5fce27 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/handler/FeedParserTask.java
@@ -18,7 +18,6 @@ import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
-import java.util.Date;
import java.util.concurrent.Callable;
public class FeedParserTask implements Callable<FeedHandlerResult> {
@@ -104,13 +103,6 @@ public class FeedParserTask implements Callable<FeedHandlerResult> {
if (item.getTitle() == null) {
throw new InvalidFeedException("Item has no title: " + item);
}
- if (item.getPubDate() == null) {
- Log.e(TAG, "Item has no pubDate. Using current time as pubDate");
- if (item.getTitle() != null) {
- Log.e(TAG, "Title of invalid item: " + item.getTitle());
- }
- item.setPubDate(new Date());
- }
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
index bf485e55f..9f53c6da0 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
@@ -3,6 +3,7 @@ package de.danoeh.antennapod.core.service.playback;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
+import android.app.UiModeManager;
import android.bluetooth.BluetoothA2dp;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -10,6 +11,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
+import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.MediaPlayer;
@@ -83,6 +85,7 @@ import io.reactivex.Observable;
import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -314,7 +317,10 @@ public class PlaybackService extends MediaBrowserServiceCompat {
}
}
emitter.onSuccess(queueItems);
- }).subscribe(queueItems -> mediaSession.setQueue(queueItems), Throwable::printStackTrace);
+ })
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(queueItems -> mediaSession.setQueue(queueItems), Throwable::printStackTrace);
flavorHelper.initializeMediaPlayer(PlaybackService.this);
mediaSession.setActive(true);
@@ -451,6 +457,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
notificationManager.cancel(R.id.notification_streaming_confirmation);
final int keycode = intent.getIntExtra(MediaButtonReceiver.EXTRA_KEYCODE, -1);
+ final boolean hardwareButton = intent.getBooleanExtra(MediaButtonReceiver.EXTRA_HARDWAREBUTTON, false);
final boolean castDisconnect = intent.getBooleanExtra(EXTRA_CAST_DISCONNECT, false);
Playable playable = intent.getParcelableExtra(EXTRA_PLAYABLE);
if (keycode == -1 && playable == null && !castDisconnect) {
@@ -464,8 +471,15 @@ public class PlaybackService extends MediaBrowserServiceCompat {
stateManager.stopForeground(true);
} else {
if (keycode != -1) {
- Log.d(TAG, "Received media button event");
- boolean handled = handleKeycode(keycode, true);
+ boolean notificationButton;
+ if (hardwareButton) {
+ Log.d(TAG, "Received hardware button event");
+ notificationButton = false;
+ } else {
+ Log.d(TAG, "Received media button event");
+ notificationButton = true;
+ }
+ boolean handled = handleKeycode(keycode, notificationButton);
if (!handled && !stateManager.hasReceivedValidStartCommand()) {
stateManager.stopService();
return Service.START_NOT_STICKY;
@@ -1179,6 +1193,20 @@ public class PlaybackService extends MediaBrowserServiceCompat {
capabilities = capabilities | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;
}
+ UiModeManager uiModeManager = (UiModeManager) getApplicationContext().getSystemService(Context.UI_MODE_SERVICE);
+ if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_CAR) {
+ sessionState.addCustomAction(
+ new PlaybackStateCompat.CustomAction.Builder(
+ CUSTOM_ACTION_REWIND,
+ getString(R.string.rewind_label), R.drawable.ic_notification_fast_rewind)
+ .build());
+ sessionState.addCustomAction(
+ new PlaybackStateCompat.CustomAction.Builder(
+ CUSTOM_ACTION_FAST_FORWARD,
+ getString(R.string.fast_forward_label), R.drawable.ic_notification_fast_forward)
+ .build());
+ }
+
sessionState.setActions(capabilities);
flavorHelper.sessionStateAddActionForWear(sessionState,
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java
index 3239f3378..632ac07ea 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java
@@ -85,7 +85,7 @@ public class PlaybackServiceNotificationBuilder {
private Bitmap getDefaultIcon() {
if (defaultIcon == null) {
- defaultIcon = getBitmap(context, R.drawable.notification_default_large_icon);
+ defaultIcon = getBitmap(context, R.mipmap.ic_launcher);
}
return defaultIcon;
}
@@ -136,9 +136,10 @@ public class PlaybackServiceNotificationBuilder {
notification.setContentIntent(getPlayerActivityPendingIntent());
notification.setWhen(0);
- notification.setSmallIcon(R.drawable.ic_antenna);
+ notification.setSmallIcon(R.drawable.ic_notification);
notification.setOngoing(false);
notification.setOnlyAlertOnce(true);
+ notification.setShowWhen(false);
notification.setPriority(UserPreferences.getNotifyPriority());
notification.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
notification.setColor(NotificationCompat.COLOR_DEFAULT);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
index 55212cd46..05d64ea3e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
@@ -8,6 +8,7 @@ import androidx.annotation.NonNull;
import android.util.Log;
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
+import io.reactivex.disposables.Disposable;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -57,7 +58,7 @@ public class PlaybackServiceTaskManager {
private ScheduledFuture<?> widgetUpdaterFuture;
private ScheduledFuture<?> sleepTimerFuture;
private volatile Future<List<FeedItem>> queueFuture;
- private volatile Future<?> chapterLoaderFuture;
+ private volatile Disposable chapterLoaderFuture;
private SleepTimer sleepTimer;
@@ -102,7 +103,7 @@ public class PlaybackServiceTaskManager {
private synchronized void loadQueue() {
if (!isQueueLoaderActive()) {
- queueFuture = schedExecutor.submit(DBReader::getQueue);
+ queueFuture = schedExecutor.submit(() -> DBReader.getQueue());
}
}
@@ -289,28 +290,19 @@ public class PlaybackServiceTaskManager {
}
}
- private synchronized void cancelChapterLoader() {
- if (isChapterLoaderActive()) {
- chapterLoaderFuture.cancel(true);
- }
- }
-
- private synchronized boolean isChapterLoaderActive() {
- return chapterLoaderFuture != null && !chapterLoaderFuture.isDone();
- }
-
/**
* Starts a new thread that loads the chapter marks from a playable object. If another chapter loader is already active,
* it will be cancelled first.
* On completion, the callback's onChapterLoaded method will be called.
*/
public synchronized void startChapterLoader(@NonNull final Playable media) {
- if (isChapterLoaderActive()) {
- cancelChapterLoader();
+ if (chapterLoaderFuture != null) {
+ chapterLoaderFuture.dispose();
+ chapterLoaderFuture = null;
}
if (media.getChapters() == null) {
- Completable.create(emitter -> {
+ chapterLoaderFuture = Completable.create(emitter -> {
media.loadChapterMarks(context);
emitter.onComplete();
})
@@ -330,7 +322,11 @@ public class PlaybackServiceTaskManager {
cancelWidgetUpdater();
disableSleepTimer();
cancelQueueLoader();
- cancelChapterLoader();
+
+ if (chapterLoaderFuture != null) {
+ chapterLoaderFuture.dispose();
+ chapterLoaderFuture = null;
+ }
}
/**
@@ -347,7 +343,7 @@ public class PlaybackServiceTaskManager {
if (Looper.myLooper() == Looper.getMainLooper()) {
// Called in main thread => ExoPlayer is used
// Run on ui thread even if called from schedExecutor
- Handler handler = new Handler();
+ Handler handler = new Handler(Looper.getMainLooper());
return () -> handler.post(runnable);
} else {
return runnable;
@@ -374,7 +370,7 @@ public class PlaybackServiceTaskManager {
if (UserPreferences.useExoplayer() && Looper.myLooper() == Looper.getMainLooper()) {
// Run callbacks in main thread so they can call ExoPlayer methods themselves
- this.handler = new Handler();
+ this.handler = new Handler(Looper.getMainLooper());
} else {
this.handler = null;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ssl/BackportCaCerts.java b/core/src/main/java/de/danoeh/antennapod/core/ssl/BackportCaCerts.java
new file mode 100644
index 000000000..720d6a9d9
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/ssl/BackportCaCerts.java
@@ -0,0 +1,73 @@
+package de.danoeh.antennapod.core.ssl;
+
+public class BackportCaCerts {
+ public static final String SECTIGO_USER_TRUST = "-----BEGIN CERTIFICATE-----\n"
+ + "MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\n"
+ + "iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
+ + "cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
+ + "BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\n"
+ + "MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV\n"
+ + "BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU\n"
+ + "aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy\n"
+ + "dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK\n"
+ + "AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B\n"
+ + "3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY\n"
+ + "tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/\n"
+ + "Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2\n"
+ + "VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT\n"
+ + "79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6\n"
+ + "c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT\n"
+ + "Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l\n"
+ + "c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee\n"
+ + "UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE\n"
+ + "Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd\n"
+ + "BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G\n"
+ + "A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF\n"
+ + "Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO\n"
+ + "VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3\n"
+ + "ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs\n"
+ + "8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR\n"
+ + "iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze\n"
+ + "Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ\n"
+ + "XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/\n"
+ + "qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\n"
+ + "VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\n"
+ + "L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\n"
+ + "jjxDah2nGN59PRbxYvnKkKj9\n"
+ + "-----END CERTIFICATE-----\n";
+
+ public static final String COMODO = "-----BEGIN CERTIFICATE-----\n"
+ + "MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB\n"
+ + "hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n"
+ + "A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n"
+ + "BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5\n"
+ + "MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n"
+ + "EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n"
+ + "Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh\n"
+ + "dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR\n"
+ + "6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X\n"
+ + "pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC\n"
+ + "9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV\n"
+ + "/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf\n"
+ + "Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z\n"
+ + "+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w\n"
+ + "qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah\n"
+ + "SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC\n"
+ + "u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf\n"
+ + "Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq\n"
+ + "crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E\n"
+ + "FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB\n"
+ + "/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl\n"
+ + "wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM\n"
+ + "4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV\n"
+ + "2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna\n"
+ + "FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ\n"
+ + "CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK\n"
+ + "boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke\n"
+ + "jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL\n"
+ + "S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb\n"
+ + "QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl\n"
+ + "0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB\n"
+ + "NVOFBkpdn627G190\n"
+ + "-----END CERTIFICATE-----";
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ssl/BackportTrustManager.java b/core/src/main/java/de/danoeh/antennapod/core/ssl/BackportTrustManager.java
new file mode 100644
index 000000000..b8fe950b2
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/ssl/BackportTrustManager.java
@@ -0,0 +1,58 @@
+package de.danoeh.antennapod.core.ssl;
+
+import android.util.Log;
+
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+import java.io.ByteArrayInputStream;
+import java.nio.charset.Charset;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateFactory;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * SSL trust manager that allows old Android systems to use modern certificates.
+ */
+public class BackportTrustManager {
+ private static final String TAG = "BackportTrustManager";
+
+ private static X509TrustManager getSystemTrustManager(KeyStore keystore) {
+ TrustManagerFactory factory;
+ try {
+ factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+ factory.init(keystore);
+ for (TrustManager manager : factory.getTrustManagers()) {
+ if (manager instanceof X509TrustManager) {
+ return (X509TrustManager) manager;
+ }
+ }
+ } catch (NoSuchAlgorithmException | KeyStoreException e) {
+ e.printStackTrace();
+ }
+ throw new IllegalStateException("Unexpected default trust managers");
+ }
+
+ public static X509TrustManager create() {
+ try {
+ KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
+ keystore.load(null); // Clear
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ keystore.setCertificateEntry("BACKPORT_COMODO_ROOT_CA", cf.generateCertificate(
+ new ByteArrayInputStream(BackportCaCerts.COMODO.getBytes(Charset.forName("UTF-8")))));
+ keystore.setCertificateEntry("SECTIGO_USER_TRUST_CA", cf.generateCertificate(
+ new ByteArrayInputStream(BackportCaCerts.SECTIGO_USER_TRUST.getBytes(Charset.forName("UTF-8")))));
+
+ List<X509TrustManager> managers = new ArrayList<>();
+ managers.add(getSystemTrustManager(keystore));
+ managers.add(getSystemTrustManager(null));
+ return new CompositeX509TrustManager(managers);
+ } catch (Exception e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ return null;
+ }
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ssl/CompositeX509TrustManager.java b/core/src/main/java/de/danoeh/antennapod/core/ssl/CompositeX509TrustManager.java
new file mode 100644
index 000000000..7af96a492
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/ssl/CompositeX509TrustManager.java
@@ -0,0 +1,60 @@
+package de.danoeh.antennapod.core.ssl;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Represents an ordered list of {@link X509TrustManager}s with additive trust. If any one of the composed managers
+ * trusts a certificate chain, then it is trusted by the composite manager.
+ * Based on https://stackoverflow.com/a/16229909
+ */
+public class CompositeX509TrustManager implements X509TrustManager {
+ private final List<X509TrustManager> trustManagers;
+
+ public CompositeX509TrustManager(List<X509TrustManager> trustManagers) {
+ this.trustManagers = trustManagers;
+ }
+
+ @Override
+ public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ CertificateException reason = null;
+ for (X509TrustManager trustManager : trustManagers) {
+ try {
+ trustManager.checkClientTrusted(chain, authType);
+ return; // someone trusts them. success!
+ } catch (CertificateException e) {
+ // maybe someone else will trust them
+ reason = e;
+ }
+ }
+ throw reason;
+ }
+
+ @Override
+ public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+ CertificateException reason = null;
+ for (X509TrustManager trustManager : trustManagers) {
+ try {
+ trustManager.checkServerTrusted(chain, authType);
+ return; // someone trusts them. success!
+ } catch (CertificateException e) {
+ // maybe someone else will trust them
+ reason = e;
+ }
+ }
+ throw reason;
+ }
+
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ List<X509Certificate> certificates = new ArrayList<>();
+ for (X509TrustManager trustManager : trustManagers) {
+ certificates.addAll(Arrays.asList(trustManager.getAcceptedIssuers()));
+ }
+ return certificates.toArray(new X509Certificate[0]);
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ssl/NoV1SslSocketFactory.java b/core/src/main/java/de/danoeh/antennapod/core/ssl/NoV1SslSocketFactory.java
new file mode 100644
index 000000000..96a42f22d
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/ssl/NoV1SslSocketFactory.java
@@ -0,0 +1,100 @@
+package de.danoeh.antennapod.core.ssl;
+
+import de.danoeh.antennapod.core.util.Flavors;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.security.GeneralSecurityException;
+
+/**
+ * SSLSocketFactory that does not use TLS 1.0
+ * This fixes issues with old Android versions that abort if the server does not know TLS 1.0
+ */
+public class NoV1SslSocketFactory extends SSLSocketFactory {
+ private SSLSocketFactory factory;
+
+ public NoV1SslSocketFactory(TrustManager trustManager) {
+ try {
+ SSLContext sslContext;
+
+ if (Flavors.FLAVOR == Flavors.FREE) {
+ // Free flavor (bundles modern conscrypt): support for TLSv1.3 is guaranteed.
+ sslContext = SSLContext.getInstance("TLSv1.3");
+ } else {
+ // Play flavor (security provider can vary): only TLSv1.2 is guaranteed.
+ sslContext = SSLContext.getInstance("TLSv1.2");
+ }
+
+ sslContext.init(null, new TrustManager[] {trustManager}, null);
+ factory = sslContext.getSocketFactory();
+ } catch (GeneralSecurityException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public String[] getDefaultCipherSuites() {
+ return factory.getDefaultCipherSuites();
+ }
+
+ @Override
+ public String[] getSupportedCipherSuites() {
+ return factory.getSupportedCipherSuites();
+ }
+
+ public Socket createSocket() throws IOException {
+ SSLSocket result = (SSLSocket) factory.createSocket();
+ configureSocket(result);
+ return result;
+ }
+
+ public Socket createSocket(String var1, int var2) throws IOException {
+ SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
+ configureSocket(result);
+ return result;
+ }
+
+ public Socket createSocket(Socket var1, String var2, int var3, boolean var4) throws IOException {
+ SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
+ configureSocket(result);
+ return result;
+ }
+
+ public Socket createSocket(InetAddress var1, int var2) throws IOException {
+ SSLSocket result = (SSLSocket) factory.createSocket(var1, var2);
+ configureSocket(result);
+ return result;
+ }
+
+ public Socket createSocket(String var1, int var2, InetAddress var3, int var4) throws IOException {
+ SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
+ configureSocket(result);
+ return result;
+ }
+
+ public Socket createSocket(InetAddress var1, int var2, InetAddress var3, int var4) throws IOException {
+ SSLSocket result = (SSLSocket) factory.createSocket(var1, var2, var3, var4);
+ configureSocket(result);
+ return result;
+ }
+
+ private void configureSocket(SSLSocket s) {
+ if (Flavors.FLAVOR == Flavors.FREE) {
+ // Free flavor (bundles modern conscrypt): TLSv1.3 and modern cipher suites are
+ // guaranteed. Protocols older than TLSv1.2 are now deprecated and can be disabled.
+ s.setEnabledProtocols(new String[] { "TLSv1.3", "TLSv1.2" });
+ } else {
+ // Play flavor (security provider can vary): only TLSv1.2 is guaranteed, supported
+ // cipher suites may vary. Old protocols might be necessary to keep things working.
+
+ // TLS 1.0 is enabled by default on some old systems, which causes connection errors.
+ // This disables that.
+ s.setEnabledProtocols(new String[] { "TLSv1.2", "TLSv1.1", "TLSv1" });
+ }
+ }
+} \ No newline at end of file
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index 0de67b306..892254507 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -19,6 +19,7 @@ import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.feed.FeedPreferences;
+import de.danoeh.antennapod.core.feed.SubscriptionsFilter;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.util.LongIntMap;
@@ -143,6 +144,7 @@ public final class DBReader {
Feed feed = feedIndex.get(item.getFeedId());
if (feed == null) {
Log.w(TAG, "No match found for item with ID " + item.getId() + ". Feed ID was " + item.getFeedId());
+ feed = new Feed("", "", "Error: Item without feed");
}
item.setFeed(feed);
}
@@ -744,6 +746,7 @@ public final class DBReader {
long episodesStarted = 0;
long episodesStartedIncludingMarked = 0;
long totalDownloadSize = 0;
+ long episodesDownloadCount = 0;
List<FeedItem> items = getFeed(feed.getId()).getItems();
for (FeedItem item : items) {
FeedMedia media = item.getMedia();
@@ -771,13 +774,14 @@ public final class DBReader {
if (media.isDownloaded()) {
totalDownloadSize = totalDownloadSize + media.getSize();
+ episodesDownloadCount++;
}
episodes++;
}
feedTime.add(new StatisticsItem(
feed, feedTotalTime, feedPlayedTime, feedPlayedTimeCountAll, episodes,
- episodesStarted, episodesStartedIncludingMarked, totalDownloadSize));
+ episodesStarted, episodesStartedIncludingMarked, totalDownloadSize, episodesDownloadCount));
}
adapter.close();
@@ -794,6 +798,7 @@ public final class DBReader {
Log.d(TAG, "getNavDrawerData() called with: " + "");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
+
List<Feed> feeds = getFeedList(adapter);
long[] feedIds = new long[feeds.size()];
for (int i = 0; i < feeds.size(); i++) {
@@ -801,15 +806,8 @@ public final class DBReader {
}
final LongIntMap feedCounters = adapter.getFeedCounters(feedIds);
- int feedFilter = UserPreferences.getFeedFilter();
- if (feedFilter == UserPreferences.FEED_FILTER_COUNTER_ZERO) {
- for (int i = feeds.size() - 1; i >= 0; i--) {
- if (feedCounters.get(feeds.get(i).getId()) <= 0) {
- feedCounters.delete(feeds.get(i).getId());
- feeds.remove(i);
- }
- }
- }
+ SubscriptionsFilter subscriptionsFilter = UserPreferences.getSubscriptionsFilter();
+ feeds = subscriptionsFilter.filter(getFeedList(adapter), feedCounters);
Comparator<Feed> comparator;
int feedOrder = UserPreferences.getFeedOrder();
@@ -854,24 +852,11 @@ public final class DBReader {
}
};
} else {
+ final Map<Long, Long> recentPubDates = adapter.getMostRecentItemDates();
comparator = (lhs, rhs) -> {
- if (lhs.getItems() == null || lhs.getItems().size() == 0) {
- List<FeedItem> items = DBReader.getFeedItemList(lhs);
- lhs.setItems(items);
- }
- if (rhs.getItems() == null || rhs.getItems().size() == 0) {
- List<FeedItem> items = DBReader.getFeedItemList(rhs);
- rhs.setItems(items);
- }
- if (lhs.getMostRecentItem() == null) {
- return 1;
- } else if (rhs.getMostRecentItem() == null) {
- return -1;
- } else {
- Date d1 = lhs.getMostRecentItem().getPubDate();
- Date d2 = rhs.getMostRecentItem().getPubDate();
- return d2.compareTo(d1);
- }
+ long dateLhs = recentPubDates.containsKey(lhs.getId()) ? recentPubDates.get(lhs.getId()) : 0;
+ long dateRhs = recentPubDates.containsKey(rhs.getId()) ? recentPubDates.get(rhs.getId()) : 0;
+ return Long.compare(dateRhs, dateLhs);
};
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
index 477a39968..c059e696a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
@@ -263,7 +263,6 @@ public final class DBTasks {
EventBus.getDefault().post(new MessageEvent(context.getString(R.string.error_file_not_found)));
}
- @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public static List<? extends FeedItem> enqueueFeedItemsToDownload(final Context context,
List<? extends FeedItem> items) throws InterruptedException, ExecutionException {
List<FeedItem> itemsToEnqueue = new ArrayList<>();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java
index 234c01b20..271babc6e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java
@@ -5,6 +5,7 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
+import android.text.format.Formatter;
import android.util.Log;
import de.danoeh.antennapod.core.R;
import org.apache.commons.io.FileUtils;
@@ -53,7 +54,16 @@ public class DatabaseExporter {
if (currentDB.exists()) {
src = new FileInputStream(currentDB).getChannel();
dst = outFileStream.getChannel();
- dst.transferFrom(src, 0, src.size());
+ long srcSize = src.size();
+ dst.transferFrom(src, 0, srcSize);
+
+ long newDstSize = dst.size();
+ if (newDstSize != srcSize) {
+ throw new IOException(String.format(
+ "Unable to write entire database. Expected to write %s, but wrote %s.",
+ Formatter.formatShortFileSize(context, srcSize),
+ Formatter.formatShortFileSize(context, newDstSize)));
+ }
} else {
throw new IOException("Can not access current database");
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index 4c594783a..935b06cd6 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -21,9 +21,11 @@ import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
-import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
import java.util.Set;
import de.danoeh.antennapod.core.feed.Chapter;
@@ -609,6 +611,11 @@ public class PodDBAdapter {
* @return the id of the entry
*/
private long setFeedItem(FeedItem item, boolean saveFeed) {
+ if (item.getId() == 0 && item.getPubDate() == null) {
+ Log.e(TAG, "Newly saved item has no pubDate. Using current date as pubDate");
+ item.setPubDate(new Date());
+ }
+
ContentValues values = new ContentValues();
values.put(KEY_TITLE, item.getTitle());
values.put(KEY_LINK, item.getLink());
@@ -1217,6 +1224,25 @@ public class PodDBAdapter {
return conditionalFeedCounterRead(whereRead, feedIds);
}
+ public final Map<Long, Long> getMostRecentItemDates() {
+ final String query = "SELECT " + KEY_FEED + ","
+ + " MAX(" + TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE + ") AS most_recent_pubdate"
+ + " FROM " + TABLE_NAME_FEED_ITEMS
+ + " GROUP BY " + KEY_FEED;
+
+ Cursor c = db.rawQuery(query, null);
+ Map<Long, Long> result = new HashMap<>();
+ if (c.moveToFirst()) {
+ do {
+ long feedId = c.getLong(0);
+ long date = c.getLong(1);
+ result.put(feedId, date);
+ } while (c.moveToNext());
+ }
+ c.close();
+ return result;
+ }
+
public final int getNumberOfDownloadedEpisodes() {
final String query = "SELECT COUNT(DISTINCT " + KEY_ID + ") AS count FROM " + TABLE_NAME_FEED_MEDIA +
" WHERE " + KEY_DOWNLOADED + " > 0";
@@ -1234,12 +1260,17 @@ public class PodDBAdapter {
* Uses DatabaseUtils to escape a search query and removes ' at the
* beginning and the end of the string returned by the escape method.
*/
- private String prepareSearchQuery(String query) {
- StringBuilder builder = new StringBuilder();
- DatabaseUtils.appendEscapedSQLString(builder, query);
- builder.deleteCharAt(0);
- builder.deleteCharAt(builder.length() - 1);
- return builder.toString();
+ private String[] prepareSearchQuery(String query) {
+ String[] queryWords = query.split("\\s+");
+ for (int i = 0; i < queryWords.length; ++i) {
+ StringBuilder builder = new StringBuilder();
+ DatabaseUtils.appendEscapedSQLString(builder, queryWords[i]);
+ builder.deleteCharAt(0);
+ builder.deleteCharAt(builder.length() - 1);
+ queryWords[i] = builder.toString();
+ }
+
+ return queryWords;
}
/**
@@ -1249,7 +1280,7 @@ public class PodDBAdapter {
* @return A cursor with all search results in SEL_FI_EXTRA selection.
*/
public Cursor searchItems(long feedID, String searchQuery) {
- String preparedQuery = prepareSearchQuery(searchQuery);
+ String[] queryWords = prepareSearchQuery(searchQuery);
String queryFeedId;
if (feedID != 0) {
@@ -1260,14 +1291,28 @@ public class PodDBAdapter {
queryFeedId = "1 = 1";
}
- String query = SELECT_FEED_ITEMS_AND_MEDIA_WITH_DESCRIPTION
- + " WHERE " + queryFeedId + " AND ("
- + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' OR "
- + KEY_CONTENT_ENCODED + " LIKE '%" + preparedQuery + "%' OR "
- + KEY_TITLE + " LIKE '%" + preparedQuery + "%'"
- + ") ORDER BY " + KEY_PUBDATE + " DESC "
- + "LIMIT 300";
- return db.rawQuery(query, null);
+ String queryStart = SELECT_FEED_ITEMS_AND_MEDIA_WITH_DESCRIPTION
+ + " WHERE " + queryFeedId + " AND (";
+ StringBuilder sb = new StringBuilder(queryStart);
+
+ for (int i = 0; i < queryWords.length; i++) {
+ sb
+ .append("(")
+ .append(KEY_DESCRIPTION + " LIKE '%").append(queryWords[i])
+ .append("%' OR ")
+ .append(KEY_CONTENT_ENCODED).append(" LIKE '%").append(queryWords[i])
+ .append("%' OR ")
+ .append(KEY_TITLE).append(" LIKE '%").append(queryWords[i])
+ .append("%') ");
+
+ if (i != queryWords.length - 1) {
+ sb.append("AND ");
+ }
+ }
+
+ sb.append(") ORDER BY " + KEY_PUBDATE + " DESC LIMIT 300");
+
+ return db.rawQuery(sb.toString(), null);
}
/**
@@ -1276,15 +1321,31 @@ public class PodDBAdapter {
* @return A cursor with all search results in SEL_FI_EXTRA selection.
*/
public Cursor searchFeeds(String searchQuery) {
- String preparedQuery = prepareSearchQuery(searchQuery);
- String query = "SELECT * FROM " + TABLE_NAME_FEEDS + " WHERE "
- + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR "
- + KEY_CUSTOM_TITLE + " LIKE '%" + preparedQuery + "%' OR "
- + KEY_AUTHOR + " LIKE '%" + preparedQuery + "%' OR "
- + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' "
- + "ORDER BY " + KEY_TITLE + " ASC "
- + "LIMIT 300";
- return db.rawQuery(query, null);
+ String[] queryWords = prepareSearchQuery(searchQuery);
+
+ String queryStart = "SELECT * FROM " + TABLE_NAME_FEEDS + " WHERE ";
+ StringBuilder sb = new StringBuilder(queryStart);
+
+ for (int i = 0; i < queryWords.length; i++) {
+ sb
+ .append("(")
+ .append(KEY_TITLE).append(" LIKE '%").append(queryWords[i])
+ .append("%' OR ")
+ .append(KEY_CUSTOM_TITLE).append(" LIKE '%").append(queryWords[i])
+ .append("%' OR ")
+ .append(KEY_AUTHOR).append(" LIKE '%").append(queryWords[i])
+ .append("%' OR ")
+ .append(KEY_DESCRIPTION).append(" LIKE '%").append(queryWords[i])
+ .append("%') ");
+
+ if (i != queryWords.length - 1) {
+ sb.append("AND ");
+ }
+ }
+
+ sb.append("ORDER BY " + KEY_TITLE + " ASC LIMIT 300");
+
+ return db.rawQuery(sb.toString(), null);
}
/**
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/StatisticsItem.java b/core/src/main/java/de/danoeh/antennapod/core/storage/StatisticsItem.java
index f96af185b..18a5403a7 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/StatisticsItem.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/StatisticsItem.java
@@ -36,9 +36,14 @@ public class StatisticsItem {
*/
public final long totalDownloadSize;
+ /**
+ * Stores the number of episodes downloaded.
+ */
+ public final long episodesDownloadCount;
+
public StatisticsItem(Feed feed, long time, long timePlayed, long timePlayedCountAll,
long episodes, long episodesStarted, long episodesStartedIncludingMarked,
- long totalDownloadSize) {
+ long totalDownloadSize, long episodesDownloadCount) {
this.feed = feed;
this.time = time;
this.timePlayed = timePlayed;
@@ -47,5 +52,6 @@ public class StatisticsItem {
this.episodesStarted = episodesStarted;
this.episodesStartedIncludingMarked = episodesStartedIncludingMarked;
this.totalDownloadSize = totalDownloadSize;
+ this.episodesDownloadCount = episodesDownloadCount;
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java b/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java
index 4c89ebc19..1f5d9b75f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/sync/SyncService.java
@@ -39,6 +39,7 @@ import de.danoeh.antennapod.core.sync.model.ISyncService;
import de.danoeh.antennapod.core.sync.model.SubscriptionChanges;
import de.danoeh.antennapod.core.sync.model.SyncServiceException;
import de.danoeh.antennapod.core.sync.model.UploadChangesResponse;
+import de.danoeh.antennapod.core.util.LongList;
import de.danoeh.antennapod.core.util.URLChecker;
import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import io.reactivex.Completable;
@@ -456,7 +457,7 @@ public class SyncService extends Worker {
break;
}
}
-
+ LongList queueToBeRemoved = new LongList();
List<FeedItem> updatedItems = new ArrayList<>();
for (EpisodeAction action : mostRecentPlayAction.values()) {
FeedItem playItem = DBReader.getFeedItemByUrl(action.getPodcast(), action.getEpisode());
@@ -467,10 +468,12 @@ public class SyncService extends Worker {
if (playItem.getMedia().hasAlmostEnded()) {
Log.d(TAG, "Marking as played");
playItem.setPlayed(true);
+ queueToBeRemoved.add(playItem.getId());
}
updatedItems.add(playItem);
}
}
+ DBWriter.removeQueueItem(getApplicationContext(), false, queueToBeRemoved.toArray());
DBWriter.setItemList(updatedItems);
}
@@ -491,7 +494,7 @@ public class SyncService extends Worker {
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
R.id.pending_intent_sync_error, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new NotificationCompat.Builder(getApplicationContext(),
- NotificationUtils.CHANNEL_ID_ERROR)
+ NotificationUtils.CHANNEL_ID_SYNC_ERROR)
.setContentTitle(getApplicationContext().getString(R.string.gpodnetsync_error_title))
.setContentText(description)
.setContentIntent(pendingIntent)
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java
index a9e46e42c..8cca2f28f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java
@@ -2,9 +2,12 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
+import android.os.Build;
import androidx.core.net.ConnectivityManagerCompat;
import android.text.TextUtils;
import android.util.Log;
@@ -29,65 +32,65 @@ import okhttp3.Response;
public class NetworkUtils {
private NetworkUtils(){}
- private static final String TAG = NetworkUtils.class.getSimpleName();
-
- private static Context context;
-
- public static void init(Context context) {
- NetworkUtils.context = context;
- }
-
- /**
- * Returns true if the device is connected to Wi-Fi and the Wi-Fi filter for
- * automatic downloads is disabled or the device is connected to a Wi-Fi
- * network that is on the 'selected networks' list of the Wi-Fi filter for
- * automatic downloads and false otherwise.
- * */
- public static boolean autodownloadNetworkAvailable() {
- ConnectivityManager cm = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo networkInfo = cm.getActiveNetworkInfo();
- if (networkInfo != null) {
- if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
- Log.d(TAG, "Device is connected to Wi-Fi");
- if (networkInfo.isConnected()) {
- if (!UserPreferences.isEnableAutodownloadWifiFilter()) {
- Log.d(TAG, "Auto-dl filter is disabled");
- return true;
- } else {
- WifiManager wm = (WifiManager) context.getApplicationContext()
- .getSystemService(Context.WIFI_SERVICE);
- WifiInfo wifiInfo = wm.getConnectionInfo();
- List<String> selectedNetworks = Arrays
- .asList(UserPreferences
- .getAutodownloadSelectedNetworks());
- if (selectedNetworks.contains(Integer.toString(wifiInfo
- .getNetworkId()))) {
- Log.d(TAG, "Current network is on the selected networks list");
- return true;
- }
- }
- }
- } else if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
- Log.d(TAG, "Device is connected to Ethernet");
- if (networkInfo.isConnected()) {
- return true;
- }
- } else {
- if (!UserPreferences.isAllowMobileAutoDownload()) {
- Log.d(TAG, "Auto Download not enabled on Mobile");
- return false;
- }
- if (networkInfo.isRoaming()) {
- Log.d(TAG, "Roaming on foreign network");
- return false;
- }
- return true;
- }
- }
- Log.d(TAG, "Network for auto-dl is not available");
- return false;
- }
+ private static final String TAG = NetworkUtils.class.getSimpleName();
+
+ private static Context context;
+
+ public static void init(Context context) {
+ NetworkUtils.context = context;
+ }
+
+ /**
+ * Returns true if the device is connected to Wi-Fi and the Wi-Fi filter for
+ * automatic downloads is disabled or the device is connected to a Wi-Fi
+ * network that is on the 'selected networks' list of the Wi-Fi filter for
+ * automatic downloads and false otherwise.
+ * */
+ public static boolean autodownloadNetworkAvailable() {
+ ConnectivityManager cm = (ConnectivityManager) context
+ .getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo networkInfo = cm.getActiveNetworkInfo();
+ if (networkInfo != null) {
+ if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
+ Log.d(TAG, "Device is connected to Wi-Fi");
+ if (networkInfo.isConnected()) {
+ if (!UserPreferences.isEnableAutodownloadWifiFilter()) {
+ Log.d(TAG, "Auto-dl filter is disabled");
+ return true;
+ } else {
+ WifiManager wm = (WifiManager) context.getApplicationContext()
+ .getSystemService(Context.WIFI_SERVICE);
+ WifiInfo wifiInfo = wm.getConnectionInfo();
+ List<String> selectedNetworks = Arrays
+ .asList(UserPreferences
+ .getAutodownloadSelectedNetworks());
+ if (selectedNetworks.contains(Integer.toString(wifiInfo
+ .getNetworkId()))) {
+ Log.d(TAG, "Current network is on the selected networks list");
+ return true;
+ }
+ }
+ }
+ } else if (networkInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
+ Log.d(TAG, "Device is connected to Ethernet");
+ if (networkInfo.isConnected()) {
+ return true;
+ }
+ } else {
+ if (!UserPreferences.isAllowMobileAutoDownload()) {
+ Log.d(TAG, "Auto Download not enabled on Mobile");
+ return false;
+ }
+ if (networkInfo.isRoaming()) {
+ Log.d(TAG, "Roaming on foreign network");
+ return false;
+ }
+ return true;
+ }
+ }
+ Log.d(TAG, "Network for auto-dl is not available");
+ return false;
+ }
public static boolean networkAvailable() {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
@@ -96,7 +99,7 @@ public class NetworkUtils {
}
public static boolean isEpisodeDownloadAllowed() {
- return UserPreferences.isAllowMobileEpisodeDownload() || !NetworkUtils.isNetworkMetered();
+ return UserPreferences.isAllowMobileEpisodeDownload() || !NetworkUtils.isNetworkRestricted();
}
public static boolean isEpisodeHeadDownloadAllowed() {
@@ -106,22 +109,53 @@ public class NetworkUtils {
}
public static boolean isImageAllowed() {
- return UserPreferences.isAllowMobileImages() || !NetworkUtils.isNetworkMetered();
+ return UserPreferences.isAllowMobileImages() || !NetworkUtils.isNetworkRestricted();
}
public static boolean isStreamingAllowed() {
- return UserPreferences.isAllowMobileStreaming() || !NetworkUtils.isNetworkMetered();
+ return UserPreferences.isAllowMobileStreaming() || !NetworkUtils.isNetworkRestricted();
}
public static boolean isFeedRefreshAllowed() {
- return UserPreferences.isAllowMobileFeedRefresh() || !NetworkUtils.isNetworkMetered();
+ return UserPreferences.isAllowMobileFeedRefresh() || !NetworkUtils.isNetworkRestricted();
+ }
+
+ public static boolean isNetworkRestricted() {
+ return isNetworkMetered() || isNetworkCellular();
}
- private static boolean isNetworkMetered() {
- ConnectivityManager connManager = (ConnectivityManager) context
- .getSystemService(Context.CONNECTIVITY_SERVICE);
+ private static boolean isNetworkMetered() {
+ ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return ConnectivityManagerCompat.isActiveNetworkMetered(connManager);
- }
+ }
+
+ private static boolean isNetworkCellular() {
+ ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ if (Build.VERSION.SDK_INT >= 23) {
+ Network network = connManager.getActiveNetwork();
+ if (network == null) {
+ return false; // Nothing connected
+ }
+ NetworkInfo info = connManager.getNetworkInfo(network);
+ if (info == null) {
+ return true; // Better be safe than sorry
+ }
+ NetworkCapabilities capabilities = connManager.getNetworkCapabilities(network);
+ if (capabilities == null) {
+ return true; // Better be safe than sorry
+ }
+ return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
+ } else {
+ // if the default network is a VPN,
+ // this method will return the NetworkInfo for one of its underlying networks
+ NetworkInfo info = connManager.getActiveNetworkInfo();
+ if (info == null) {
+ return false; // Nothing connected
+ }
+ //noinspection deprecation
+ return info.getType() == ConnectivityManager.TYPE_MOBILE;
+ }
+ }
/**
* Returns the SSID of the wifi connection, or <code>null</code> if there is no wifi.
@@ -135,7 +169,7 @@ public class NetworkUtils {
return null;
}
- public static Single<Long> getFeedMediaSizeObservable(FeedMedia media) {
+ public static Single<Long> getFeedMediaSizeObservable(FeedMedia media) {
return Single.create((SingleOnSubscribe<Long>) emitter -> {
if (!NetworkUtils.isEpisodeHeadDownloadAllowed()) {
emitter.onSuccess(0L);
@@ -188,7 +222,7 @@ public class NetworkUtils {
DBWriter.setFeedMedia(media);
})
.subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread());
+ .observeOn(AndroidSchedulers.mainThread());
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/FeedItemPubdateComparator.java b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/FeedItemPubdateComparator.java
index 51fe2da78..ad81a1d17 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/FeedItemPubdateComparator.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/FeedItemPubdateComparator.java
@@ -4,16 +4,20 @@ import java.util.Comparator;
import de.danoeh.antennapod.core.feed.FeedItem;
-/** Compares the pubDate of two FeedItems for sorting*/
+/**
+ * Compares the pubDate of two FeedItems for sorting.
+ */
public class FeedItemPubdateComparator implements Comparator<FeedItem> {
- /** Returns a new instance of this comparator in reverse order.
- public static FeedItemPubdateComparator newInstance() {
- FeedItemPubdateComparator
- }*/
- @Override
- public int compare(FeedItem lhs, FeedItem rhs) {
- return rhs.getPubDate().compareTo(lhs.getPubDate());
- }
+ /**
+ * Returns a new instance of this comparator in reverse order.
+ */
+ @Override
+ public int compare(FeedItem lhs, FeedItem rhs) {
+ if (rhs.getPubDate() == null || lhs.getPubDate() == null) {
+ return 0;
+ }
+ return rhs.getPubDate().compareTo(lhs.getPubDate());
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/exception/RxJavaErrorHandlerSetup.java b/core/src/main/java/de/danoeh/antennapod/core/util/exception/RxJavaErrorHandlerSetup.java
deleted file mode 100644
index 223104d2e..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/exception/RxJavaErrorHandlerSetup.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package de.danoeh.antennapod.core.util.exception;
-
-import android.util.Log;
-import io.reactivex.exceptions.UndeliverableException;
-import io.reactivex.plugins.RxJavaPlugins;
-
-public class RxJavaErrorHandlerSetup {
-
- private RxJavaErrorHandlerSetup() {
-
- }
-
- public static void setupRxJavaErrorHandler() {
- RxJavaPlugins.setErrorHandler(e -> {
- if (e instanceof UndeliverableException) {
- // Probably just disposed because the fragment was left
- Log.d("RxJavaErrorHandler", "Ignored exception: " + Log.getStackTraceString(e));
- return;
- }
- Thread.currentThread().getUncaughtExceptionHandler()
- .uncaughtException(Thread.currentThread(), e);
- });
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/NotificationUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/NotificationUtils.java
index f546ca019..ddbe68938 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/gui/NotificationUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/gui/NotificationUtils.java
@@ -14,6 +14,7 @@ public class NotificationUtils {
public static final String CHANNEL_ID_DOWNLOADING = "downloading";
public static final String CHANNEL_ID_PLAYING = "playing";
public static final String CHANNEL_ID_ERROR = "error";
+ public static final String CHANNEL_ID_SYNC_ERROR = "sync_error";
public static final String CHANNEL_ID_AUTO_DOWNLOAD = "auto_download";
public static void createChannels(Context context) {
@@ -27,6 +28,7 @@ public class NotificationUtils {
mNotificationManager.createNotificationChannel(createChannelDownloading(context));
mNotificationManager.createNotificationChannel(createChannelPlaying(context));
mNotificationManager.createNotificationChannel(createChannelError(context));
+ mNotificationManager.createNotificationChannel(createChannelSyncError(context));
mNotificationManager.createNotificationChannel(createChannelAutoDownload(context));
}
}
@@ -66,6 +68,14 @@ public class NotificationUtils {
}
@RequiresApi(api = Build.VERSION_CODES.O)
+ private static NotificationChannel createChannelSyncError(Context c) {
+ NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID_SYNC_ERROR,
+ c.getString(R.string.notification_channel_sync_error), NotificationManager.IMPORTANCE_HIGH);
+ notificationChannel.setDescription(c.getString(R.string.notification_channel_sync_error_description));
+ return notificationChannel;
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.O)
private static NotificationChannel createChannelAutoDownload(Context c) {
NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID_AUTO_DOWNLOAD,
c.getString(R.string.notification_channel_auto_download), NotificationManager.IMPORTANCE_DEFAULT);
diff --git a/core/src/main/res/color/filter_dialog_background_dark.xml b/core/src/main/res/color/filter_dialog_background_dark.xml
deleted file mode 100644
index 3df2a80dc..000000000
--- a/core/src/main/res/color/filter_dialog_background_dark.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="@color/accent_dark" android:state_checked="true"/>
- <item android:color="@color/dialog_filter_inactive_dark" />
-</selector> \ No newline at end of file
diff --git a/core/src/main/res/color/filter_dialog_background_light.xml b/core/src/main/res/color/filter_dialog_background_light.xml
deleted file mode 100644
index 930325629..000000000
--- a/core/src/main/res/color/filter_dialog_background_light.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="@color/accent_light" android:state_checked="true" />
- <item android:color="@color/dialog_filter_inactive_light" />
-</selector> \ No newline at end of file
diff --git a/core/src/main/res/drawable-hdpi/ic_notification.png b/core/src/main/res/drawable-hdpi/ic_notification.png
new file mode 100644
index 000000000..e0b0f7f18
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_notification.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_notification.png b/core/src/main/res/drawable-mdpi/ic_notification.png
new file mode 100644
index 000000000..42943c7f0
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_notification.png
Binary files differ
diff --git a/core/src/main/res/drawable-nodpi/ic_launcher_foreground_no_finish.png b/core/src/main/res/drawable-nodpi/ic_launcher_foreground_no_finish.png
new file mode 100644
index 000000000..33a5b3fe4
--- /dev/null
+++ b/core/src/main/res/drawable-nodpi/ic_launcher_foreground_no_finish.png
Binary files differ
diff --git a/core/src/main/res/drawable-nodpi/teaser.png b/core/src/main/res/drawable-nodpi/teaser.png
index 3b5261b28..d339ed512 100644
--- a/core/src/main/res/drawable-nodpi/teaser.png
+++ b/core/src/main/res/drawable-nodpi/teaser.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_notification.png b/core/src/main/res/drawable-xhdpi/ic_notification.png
new file mode 100644
index 000000000..2c633ba6b
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_notification.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_notification.png b/core/src/main/res/drawable-xxhdpi/ic_notification.png
new file mode 100644
index 000000000..16cc2aaf4
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_notification.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_notification.png b/core/src/main/res/drawable-xxxhdpi/ic_notification.png
new file mode 100644
index 000000000..fbbb94cd0
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_notification.png
Binary files differ
diff --git a/core/src/main/res/drawable/bg_splash.xml b/core/src/main/res/drawable/bg_splash.xml
index 32241ec22..929fe411a 100644
--- a/core/src/main/res/drawable/bg_splash.xml
+++ b/core/src/main/res/drawable/bg_splash.xml
@@ -1,13 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:drawable="@color/ic_launcher_background"/>
+ <item>
+ <shape android:shape="rectangle" >
+ <gradient
+ android:angle="-90"
+ android:startColor="@color/icon_background_gradient_start"
+ android:endColor="@color/icon_background_gradient_end" />
+ </shape>
+ </item>
<item>
<bitmap
android:gravity="center"
- android:src="@mipmap/ic_launcher_foreground"/>
+ android:src="@drawable/ic_launcher_foreground_no_finish"/>
</item>
</layer-list> \ No newline at end of file
diff --git a/core/src/main/res/drawable/filter_dialog_background_dark.xml b/core/src/main/res/drawable/filter_dialog_background_dark.xml
new file mode 100644
index 000000000..9ea827147
--- /dev/null
+++ b/core/src/main/res/drawable/filter_dialog_background_dark.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@color/accent_dark" android:state_checked="true"/>
+ <item android:drawable="@color/dialog_filter_inactive_dark" />
+</selector> \ No newline at end of file
diff --git a/core/src/main/res/drawable/filter_dialog_background_light.xml b/core/src/main/res/drawable/filter_dialog_background_light.xml
new file mode 100644
index 000000000..e0a80737c
--- /dev/null
+++ b/core/src/main/res/drawable/filter_dialog_background_light.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@color/accent_light" android:state_checked="true" />
+ <item android:drawable="@color/dialog_filter_inactive_light" />
+</selector> \ No newline at end of file
diff --git a/core/src/main/res/drawable/ic_antenna.xml b/core/src/main/res/drawable/ic_antenna.xml
deleted file mode 100644
index 9fcfab000..000000000
--- a/core/src/main/res/drawable/ic_antenna.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="12.7"
- android:viewportWidth="12.7" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillAlpha="1" android:fillColor="#ffffff"
- android:pathData="m6.0631,0.4728v0.3274c1.1582,0.0249 1.911,0.4225 2.5991,1.1189 0.6881,0.6964 1.0924,1.7043 1.1125,2.9246h0.3211c0.0078,-1.3792 -0.5291,-2.4905 -1.1981,-3.1576C8.2288,1.019 7.3415,0.4734 6.0631,0.4728ZM6.0631,1.4283v0.3453c0.859,0.0361 1.3465,0.2123 1.9398,0.8081 0.5933,0.5957 0.843,1.3669 0.8598,2.2621L9.2029,4.8438c-0.0088,-1.2333 -0.5414,-2.0907 -0.9568,-2.5047 -0.4154,-0.4139 -0.9948,-0.9065 -2.183,-0.9108zM6.0625,2.4323 L6.0631,2.7495c0.3968,0.007 0.8308,0.1395 1.2089,0.5642 0.3781,0.4247 0.495,1.0244 0.51,1.53h0.3255c-0.0016,-0.669 -0.2787,-1.3891 -0.6153,-1.747 -0.3366,-0.358 -0.7368,-0.6621 -1.4298,-0.6645zM6.0906,3.7766c-0.4059,0.0002 -0.7349,0.3294 -0.7347,0.7353 0.0001,0.2677 0.1459,0.5142 0.3804,0.6434l-3.0102,6.2227 0.5151,0.3351 0.607,-1.2485 5.3821,1.5453 0.083,0.1609 0.5732,-0.2508 -3.4927,-6.7397c0.2624,-0.1189 0.4311,-0.3802 0.4315,-0.6683 0.0002,-0.4059 -0.3287,-0.7352 -0.7347,-0.7353zM6.065,5.8631 L6.5929,6.8882 5.2882,7.4761zM6.6976,7.0918 L7.6065,8.8561 5.137,7.8016zM5.0259,8.0199 L7.611,9.1184 4.0314,10.0854zM7.8395,9.3086 L9.081,11.7201 4.1489,10.3069z"
- android:strokeAlpha="1" android:strokeColor="#00000000" android:strokeWidth="0.32680494"/>
-</vector>
diff --git a/core/src/main/res/drawable/ic_notifications_black.xml b/core/src/main/res/drawable/ic_notifications_black.xml
new file mode 100644
index 000000000..7009a6763
--- /dev/null
+++ b/core/src/main/res/drawable/ic_notifications_black.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z"/>
+</vector>
diff --git a/core/src/main/res/drawable/ic_notifications_white.xml b/core/src/main/res/drawable/ic_notifications_white.xml
new file mode 100644
index 000000000..10239aadd
--- /dev/null
+++ b/core/src/main/res/drawable/ic_notifications_white.xml
@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:tint="#FFFFFF"
+ android:viewportHeight="24.0" android:viewportWidth="24.0"
+ android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FFFFFFFF" android:pathData="M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z"/>
+</vector>
diff --git a/core/src/main/res/drawable/notification_default_large_icon.xml b/core/src/main/res/drawable/notification_default_large_icon.xml
deleted file mode 100644
index 6da31b1bb..000000000
--- a/core/src/main/res/drawable/notification_default_large_icon.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:viewportHeight="12.7"
- android:viewportWidth="12.7"
- android:height="64dp"
- android:width="64dp">
-
- <path
- android:fillColor="#ff007DBA"
- android:pathData="M 0,0 L 12.7,0 12.7,12.7 0,12.7 z"/>
-
- <path
- android:fillColor="#ffffffff"
- android:pathData="m5.7552,2.2412l0,0.2651c0.9377,0.0202 1.5471,0.342 2.1043,0.9059 0.5571,0.5639 0.8845,1.3798 0.9007,2.3678l0.2599,0C9.0264,4.6634 8.5918,3.7637 8.0502,3.2236 7.5085,2.6834 6.7902,2.2418 5.7552,2.2412ZM5.7552,3.0148l0,0.2796c0.6954,0.0292 1.0901,0.1719 1.5704,0.6542 0.4803,0.4823 0.6825,1.1066 0.6961,1.8314l0.2754,0c-0.0071,-0.9985 -0.4383,-1.6927 -0.7746,-2.0278 -0.3363,-0.3351 -0.8054,-0.734 -1.7673,-0.7374zM5.7547,3.8277 L5.7552,4.0845c0.3213,0.006 0.6726,0.1129 0.9788,0.4568 0.3061,0.3439 0.4008,0.8294 0.4129,1.2387l0.2635,0C7.4091,5.2384 7.1848,4.6554 6.9122,4.3656 6.6397,4.0758 6.3157,3.8296 5.7547,3.8277ZM5.7774,4.916c-0.3286,0.0001 -0.595,0.2667 -0.5948,0.5953 0.0001,0.2168 0.1181,0.4163 0.308,0.5209l-2.4371,5.0379 0.417,0.2713 0.4914,-1.0108 4.3574,1.2511 0.0672,0.1302 0.4641,-0.2031L6.0229,6.0523c0.2124,-0.0963 0.349,-0.3078 0.3493,-0.5411 0.0002,-0.3286 -0.2661,-0.5952 -0.5948,-0.5953zM5.7567,6.6053 L6.1841,7.4352 5.1278,7.9111zM6.2689,7.6001 L7.0047,9.0284 5.0054,8.1747zM4.9154,8.3514 L7.0083,9.2408 4.1103,10.0237zM7.1934,9.3948 L8.1985,11.3471 4.2054,10.203Z" />
-
-</vector>
diff --git a/core/src/main/res/layout/player_widget.xml b/core/src/main/res/layout/player_widget.xml
index b0e5e0fd8..8e38d7f6e 100644
--- a/core/src/main/res/layout/player_widget.xml
+++ b/core/src/main/res/layout/player_widget.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/widget_margin" >
@@ -8,8 +9,8 @@
android:id="@+id/widgetLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="#262C31" >
-
+ android:background="#262C31"
+ tools:ignore="UselessParent">
<ImageButton
android:id="@+id/butPlay"
@@ -40,7 +41,8 @@
android:id="@+id/imgvCover"
android:layout_width="@android:dimen/app_icon_size"
android:layout_height="match_parent"
- android:src="@drawable/ic_antenna"
+ android:src="@mipmap/ic_launcher_round"
+ android:importantForAccessibility="no"
android:layout_margin="12dp" />
<LinearLayout
diff --git a/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index 036d09bc5..4ae7d1237 100644
--- a/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/ic_launcher_background"/>
+ <background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
index 036d09bc5..4ae7d1237 100644
--- a/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ b/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/ic_launcher_background"/>
+ <background android:drawable="@mipmap/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher.png b/core/src/main/res/mipmap-hdpi/ic_launcher.png
index 12e9b3395..9c922ce1c 100644
--- a/core/src/main/res/mipmap-hdpi/ic_launcher.png
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher_background.png b/core/src/main/res/mipmap-hdpi/ic_launcher_background.png
new file mode 100644
index 000000000..92b669f3e
--- /dev/null
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher_background.png
Binary files differ
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index d687f94bb..b487de37d 100644
--- a/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher_round.png b/core/src/main/res/mipmap-hdpi/ic_launcher_round.png
index 12e9b3395..9c922ce1c 100644
--- a/core/src/main/res/mipmap-hdpi/ic_launcher_round.png
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher.png b/core/src/main/res/mipmap-mdpi/ic_launcher.png
index 1da13d374..ef741cee7 100644
--- a/core/src/main/res/mipmap-mdpi/ic_launcher.png
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher_background.png b/core/src/main/res/mipmap-mdpi/ic_launcher_background.png
new file mode 100644
index 000000000..7f16ee8ba
--- /dev/null
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher_background.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index 2e7a4b74d..4003de0ea 100644
--- a/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher_round.png b/core/src/main/res/mipmap-mdpi/ic_launcher_round.png
index 1da13d374..ef741cee7 100644
--- a/core/src/main/res/mipmap-mdpi/ic_launcher_round.png
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher.png b/core/src/main/res/mipmap-xhdpi/ic_launcher.png
index 32b022ada..b05c50d44 100644
--- a/core/src/main/res/mipmap-xhdpi/ic_launcher.png
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/core/src/main/res/mipmap-xhdpi/ic_launcher_background.png
new file mode 100644
index 000000000..170e2f72e
--- /dev/null
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher_background.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index 5f90a1d11..0cd7ee47a 100644
--- a/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 32b022ada..b05c50d44 100644
--- a/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher.png
index 321600e15..9d0116d26 100644
--- a/core/src/main/res/mipmap-xxhdpi/ic_launcher.png
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
new file mode 100644
index 000000000..adf055c06
--- /dev/null
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index d72ffedbb..fb39d3c71 100644
--- a/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 321600e15..9d0116d26 100644
--- a/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index ff2870dca..3c61e7dfc 100644
--- a/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
new file mode 100644
index 000000000..f0be130f2
--- /dev/null
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index 0af16fadf..c3fd1eb5a 100644
--- a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index ff2870dca..3c61e7dfc 100644
--- a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/values-br/strings.xml b/core/src/main/res/values-br/strings.xml
new file mode 100644
index 000000000..12fbbdb23
--- /dev/null
+++ b/core/src/main/res/values-br/strings.xml
@@ -0,0 +1,821 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activity and fragment titles-->
+ <string name="feed_update_receiver_name">Hizivaat ar c\'houmanantoù</string>
+ <string name="feeds_label">Podskignadoù</string>
+ <string name="statistics_label">Stadegoù</string>
+ <string name="add_feed_label">Ouzhpennañ ur podskignad</string>
+ <string name="episodes_label">Rannoù</string>
+ <string name="all_episodes_short_label">An holl</string>
+ <string name="new_episodes_label">Nevez</string>
+ <string name="favorite_episodes_label">Sinedoù</string>
+ <string name="new_label">Nevez</string>
+ <string name="settings_label">Gwellvezioù</string>
+ <string name="downloads_label">Pellgargadennoù</string>
+ <string name="downloads_running_label">Oc\'h erounit</string>
+ <string name="downloads_completed_label">Echuet</string>
+ <string name="downloads_log_label">Kerzhlevr</string>
+ <string name="subscriptions_label">Koumanantoù</string>
+ <string name="subscriptions_list_label">Roll ar c\'houmanantoù</string>
+ <string name="cancel_download_label">Nullañ ar pellgargadennoù</string>
+ <string name="playback_history_label">Roll istor seniñ</string>
+ <string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_auth_label">Titouroù kennaskañ gpodder.net</string>
+ <string name="episode_cache_full_title">Leun eo al lec\'h evit enrollañ rannoù</string>
+ <string name="episode_cache_full_message">Tizhet eo bet bevenn pellgargadurioù ar rannoù. Gallout a rit kreskaat ment ar c\'hrubuilh en arventennoù.</string>
+ <string name="playback_statistics_label">Lenn</string>
+ <string name="download_statistics_label">Pellgargadurioù</string>
+ <!--Statistics fragment-->
+ <string name="total_time_listened_to_podcasts">Padelezh selaouet hollek</string>
+ <string name="statistics_details_dialog">%1$d war %2$d rann kroget.\n\nLennet %3$s war %4$s.</string>
+ <string name="statistics_mode">Doareoù stadegoù</string>
+ <string name="statistics_mode_normal">Jediñ ar padelezh selaouet e gwirionez. Ar rannoù selaouet div wech a gont doubl hag ar re merket evel anlennet ne gontont ket</string>
+ <string name="statistics_mode_count_all">Sammañ an holl bodskignadoù merket evel lennet</string>
+ <string name="statistics_speed_not_counted">Evezhiadenn: tizh al lenn n\'eo morse kemeret e kont.</string>
+ <string name="statistics_reset_data">Adderaouekaat ar roadennoù stadegoù</string>
+ <string name="statistics_reset_data_msg">Dilemel a raio roll istor ar padelezh lennet evit an holl rannoù. Sur oc\'h e fell deoc\'h kenderc\'hel?</string>
+ <!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Ment pellgarget hollek</string>
+ <!--Main activity-->
+ <string name="drawer_open">Digeriñ al lañser</string>
+ <string name="drawer_close">Serriñ al lañser</string>
+ <string name="drawer_preferences">Gwellvezioù ar stalaf</string>
+ <string name="drawer_feed_order_unplayed_episodes">Rummañ dre gonter</string>
+ <string name="drawer_feed_order_alphabetical">Rummañ dre urzh al lizherenneg</string>
+ <string name="drawer_feed_order_last_update">Rummañ dre an deiziad embann</string>
+ <string name="drawer_feed_order_most_played">Rummañ dre an niver a rannoù lennet</string>
+ <string name="drawer_feed_counter_new_unplayed">Niver a rannoù nevez n\'int ket bet lennet</string>
+ <string name="drawer_feed_counter_new">Niver a rannoù nevez</string>
+ <string name="drawer_feed_counter_unplayed">Niver a rannoù n\'int ket bet lennet</string>
+ <string name="drawer_feed_counter_downloaded">Niver a rannoù pelglarget</string>
+ <string name="drawer_feed_counter_none">Hini ebet</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">Digeriñ er merdeer</string>
+ <string name="copy_url_label">Eilañ an URL</string>
+ <string name="share_url_label">Rannañ an URL</string>
+ <string name="copied_url_msg">URL eilet er golver</string>
+ <string name="go_to_position_label">Mont d\'al lec\'hiadur</string>
+ <!--Playback history-->
+ <string name="clear_history_label">Dilemel ar roll istor</string>
+ <!--Other-->
+ <string name="confirm_label">Kadarnaat</string>
+ <string name="cancel_label">Nullañ</string>
+ <string name="yes">Ya</string>
+ <string name="no">Ket</string>
+ <string name="reset">Adderaouekaat</string>
+ <string name="author_label">Aozer(ien.ezed)</string>
+ <string name="language_label">Yezh</string>
+ <string name="url_label">URL</string>
+ <string name="cover_label">Skeudenn</string>
+ <string name="error_label">Fazi</string>
+ <string name="error_msg_prefix">Degouezhet ez eus bet ur fazi:</string>
+ <string name="needs_storage_permission">Ret eo kaout an aotre kadaviñ evit ober se</string>
+ <string name="refresh_label">Azgrenaat</string>
+ <string name="external_storage_error_msg">N\'eus bet kavet kadaviñ diavaez ebet. Gwiriekait ez eo kennasket ar c\'hadaviñ diavaez evit ma c\'hallfe an arload mont en-dro.</string>
+ <string name="chapters_label">Chabistroù</string>
+ <string name="chapter_duration">Padelezh: %1$s</string>
+ <string name="description_label">Deskrivadur</string>
+ <string name="episodes_suffix">\u0020rannoù</string>
+ <string name="processing_label">O keweriañ</string>
+ <string name="save_username_password_label">Enrollañ ho titouroù kennaskañ</string>
+ <string name="close_label">Serriñ</string>
+ <string name="retry_label">Klask en-dro</string>
+ <string name="auto_download_label">Pellgargañ emgefreek</string>
+ <string name="auto_download_apply_to_items_title">Arloañ d\'ar rannoù kent</string>
+ <string name="auto_download_apply_to_items_message">An arventenn nevez <i>Pellgargañ Emgefreek</i> a vo arloet d\'ar rannoù nevez ent emgefreek.\nHa fellout a rafe deoc\'h e lakaat war ar rannoù kent ivez?</string>
+ <string name="auto_delete_label">Dilemel ar rannoù ent emgefreek</string>
+ <string name="feed_volume_reduction">Izelaat an ampled</string>
+ <string name="feed_volume_reduction_summary">Izelaat ampled ar rannoù da-heul: %1$s</string>
+ <string name="feed_volume_reduction_off">hini ebet</string>
+ <string name="feed_volume_reduction_light">izel</string>
+ <string name="feed_volume_reduction_heavy">pounner</string>
+ <string name="parallel_downloads_suffix">\u0020pellgargadurioù kenstur</string>
+ <string name="feed_auto_download_global">Dre ziouer</string>
+ <string name="feed_auto_download_always">Bepred</string>
+ <string name="feed_auto_download_never">Morse</string>
+ <string name="send_label">Kas...</string>
+ <string name="episode_cleanup_never">Morse</string>
+ <string name="episode_cleanup_queue_removal">Pa n\'emañ ket el lost</string>
+ <string name="episode_cleanup_after_listening">Goude bezañ echuet</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">%d eur goude bezañ selaouet</item>
+ <item quantity="two">%d eur goude bezañ selaouet</item>
+ <item quantity="few">%d eur goude bezañ selaouet</item>
+ <item quantity="many">%d eur goude bezañ selaouet</item>
+ <item quantity="other">%d eur goude bezañ selaouet</item>
+ </plurals>
+ <plurals name="episode_cleanup_days_after_listening">
+ <item quantity="one">%d devezh goude vefe echuet </item>
+ <item quantity="two">%d zevezh goude vefe echuet </item>
+ <item quantity="few">%d devezh goude vefe echuet </item>
+ <item quantity="many">%d a zevezhioù goude vefe echuet </item>
+ <item quantity="other">%d devezh goude vefe echuet </item>
+ </plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d diuzet</item>
+ <item quantity="two">%d diuzet</item>
+ <item quantity="few">%d diuzet</item>
+ <item quantity="many">%d diuzet</item>
+ <item quantity="other">%d diuzet</item>
+ </plurals>
+ <string name="loading_more">O kargañ...</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Merkañ an holl evel lennet</string>
+ <string name="mark_all_read_msg">Merket eo bet an holl rannoù evel lennet</string>
+ <string name="mark_all_read_confirmation_msg">Kadarnait e fell deoc\'h merkañ an holl rannoù evel lennet.</string>
+ <string name="mark_all_read_feed_confirmation_msg">Kadarnait e fell deoc\'h merkañ an holl rannoù er podskignad evel lennet.</string>
+ <string name="remove_all_new_flags_label">Tennañ an holl verkoù \"nevez\"</string>
+ <string name="removed_all_new_flags_msg">Tennet eo bet an holl verkoù \"nevez\"</string>
+ <string name="remove_all_new_flags_confirmation_msg">Kadarnait e fell deoc\'h tennañ ar merk \"nevez\" eus an holl rannoù.</string>
+ <string name="show_info_label">Diskouez ar munudoù</string>
+ <string name="show_feed_settings_label">Arventennoù ar podksignad...</string>
+ <string name="feed_info_label">Titouroù ar podskignad</string>
+ <string name="feed_settings_label">Arventennoù ar podskignad</string>
+ <string name="rename_feed_label">Adenvel ar podskignad</string>
+ <string name="remove_feed_label">Dilemel ar podskignad</string>
+ <string name="share_label">Rannañ...</string>
+ <string name="share_link_label">Rannañ an ere</string>
+ <string name="share_link_with_position_label">Rannañ an ere gant al lec\'hiadur</string>
+ <string name="share_file_label">Rannañ ar restr</string>
+ <string name="share_website_url_label">Rannañ ere al lec\'hienn</string>
+ <string name="share_feed_url_label">Rannañ ere ar podskignad</string>
+ <string name="share_item_url_label">Rannañ ere ar restr</string>
+ <string name="share_item_url_with_position_label">Rannañ ere ar restr gant al lec\'hiadur</string>
+ <string name="feed_delete_confirmation_msg">Kadarnait e fell deoc\'h dilemel ar podskignad \"%1$s\" hag e holl rannoù pellgarget.</string>
+ <string name="feed_remover_msg">O tilemel ar podskignad</string>
+ <string name="load_complete_feed">Hizivaat ar podskignad a-bezh</string>
+ <string name="multi_select">Diuzañ meur a elfenn</string>
+ <string name="select_all_above">Diuzañ gant ar re a-us</string>
+ <string name="select_all_below">Diuzañ gant ar re dindan</string>
+ <string name="hide_unplayed_episodes_label">Amlennet</string>
+ <string name="hide_paused_episodes_label">Ehanet</string>
+ <string name="hide_played_episodes_label">Lennet</string>
+ <string name="hide_queued_episodes_label">El lost</string>
+ <string name="hide_not_queued_episodes_label">N\'emañ ket el lost</string>
+ <string name="hide_downloaded_episodes_label">Pellgarget</string>
+ <string name="hide_not_downloaded_episodes_label">N\'eo ket pellgarget</string>
+ <string name="hide_has_media_label">Gant ur media</string>
+ <string name="hide_is_favorite_label">Ur sined eo</string>
+ <string name="filtered_label">Silet</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} C\'hwitet war an azgrenaat diwezhañ</string>
+ <string name="open_podcast">Digeriñ ar podskignad</string>
+ <string name="please_wait_for_data">Gortozit dibenn pellgargadur ar roadennoù</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Pellgargañ</string>
+ <plurals name="downloading_batch_label">
+ <item quantity="one">O pellgargañ %d rann</item>
+ <item quantity="two">O pellgargañ %d rann</item>
+ <item quantity="few">O pellgargañ %d rann</item>
+ <item quantity="many">O pellgargañ %d rann</item>
+ <item quantity="other">O pellgargañ %d rann</item>
+ </plurals>
+ <string name="play_label">Len</string>
+ <string name="pause_label">Ehan</string>
+ <string name="stream_label">Streaming</string>
+ <string name="delete_label">Dilemel</string>
+ <string name="delete_failed">N\'haller ket dilemel ar restr. Gallout a rit klask adloc\'hañ.</string>
+ <string name="delete_episode_label">Dilemel ar rann</string>
+ <plurals name="deleted_episode_batch_label">
+ <item quantity="one">%d rann dilamet </item>
+ <item quantity="two">%d rann dilamet </item>
+ <item quantity="few">%d rann dilamet </item>
+ <item quantity="many">%d rann dilamet </item>
+ <item quantity="other">%d rann dilamet </item>
+ </plurals>
+ <string name="remove_new_flag_label">Tennañ ar merk \"nevez\"</string>
+ <string name="removed_new_flag_label">Tennet eo bet ar merk \"nevez\"</string>
+ <string name="mark_read_label">Merkañ evel lennet</string>
+ <string name="marked_as_read_label">Merkañ evel lennet</string>
+ <string name="mark_read_no_media_label">Merkañ evel lennet</string>
+ <string name="marked_as_read_no_media_label">Merket evel lennet</string>
+ <string name="play_this_to_seek_position">Evit kemmañ al lec\'hiadur e rankit lenn ar rann</string>
+ <plurals name="marked_read_batch_label">
+ <item quantity="one">%d rann merket evel lennet</item>
+ <item quantity="two">%d rann merket evel lennet</item>
+ <item quantity="few">%d rann merket evel lennet</item>
+ <item quantity="many">%d rann merket evel lennet</item>
+ <item quantity="other">%d rann merket evel lennet</item>
+ </plurals>
+ <string name="mark_unread_label">Merkañ evel anlennet</string>
+ <string name="mark_unread_label_no_media">Merkañ evel anlennet</string>
+ <plurals name="marked_unread_batch_label">
+ <item quantity="one">%d rann merket evel anlennet. </item>
+ <item quantity="two">%d rann merket evel anlennet. </item>
+ <item quantity="few">%d rann merket evel anlennet. </item>
+ <item quantity="many">%d rann merket evel anlennet.</item>
+ <item quantity="other">%d rann merket evel anlennet. </item>
+ </plurals>
+ <string name="add_to_queue_label">Ouzhpennañ el lost</string>
+ <string name="added_to_queue_label">Ouzhpennet el lost</string>
+ <plurals name="added_to_queue_batch_label">
+ <item quantity="one">%d rann ouzhpennet el lost</item>
+ <item quantity="two">%d rann ouzhpennet el lost</item>
+ <item quantity="few">%d rann ouzhpennet el lost</item>
+ <item quantity="many">%d rann ouzhpennet el lost</item>
+ <item quantity="other">%d rann ouzhpennet el lost</item>
+ </plurals>
+ <string name="remove_from_queue_label">Dilemel eus al lost</string>
+ <plurals name="removed_from_queue_batch_label">
+ <item quantity="one">%d rann tennet eus al lost</item>
+ <item quantity="two">%d rann tennet eus al lost</item>
+ <item quantity="few">%d rann tennet eus al lost</item>
+ <item quantity="many">%d rann tennet eus al lost</item>
+ <item quantity="other">%d rann tennet eus al lost</item>
+ </plurals>
+ <string name="add_to_favorite_label">Ouzhpennañ er sinedoù</string>
+ <string name="added_to_favorites">Ouzhpennet er sinedoù</string>
+ <string name="remove_from_favorite_label">Dilemel eus ar sindeoù</string>
+ <string name="removed_from_favorites">Dilamet eus ar sinedoù</string>
+ <string name="visit_website_label">Gweladenniñ al lec\'hienn</string>
+ <string name="skip_episode_label">Tremen a rann</string>
+ <string name="activate_auto_download">Gweredekaat ar pellgargañ emgefreek</string>
+ <string name="deactivate_auto_download">Diweredekaat ar pellgargañ emgefreek</string>
+ <string name="reset_position">Adderaouekaat al lec\'hiadur lenn</string>
+ <string name="removed_item">Elfenn dilamet</string>
+ <string name="no_items_selected">N\'eus bet diuzet netra</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">echuet</string>
+ <string name="download_pending">Pellgargadur war c\'hortoz</string>
+ <string name="download_running">O pellgargañ</string>
+ <string name="download_error_details">Munudoù</string>
+ <string name="download_error_details_message">%1$s \n\nURL ar restr:\n%2$s</string>
+ <string name="download_error_device_not_found">N\'eo ket bet kavet ar c\'hadaviñ</string>
+ <string name="download_error_insufficient_space">N\'eus ket trawalc\'h a blas</string>
+ <string name="download_error_http_data_error">Fazi roadennoù HTTP</string>
+ <string name="download_error_error_unknown">Fazi dianav</string>
+ <string name="download_error_parser_exception">Kemennadenn Fazi</string>
+ <string name="download_error_unsupported_type">Doare lanv anskor</string>
+ <string name="download_error_connection_error">Fazi kennaskañ</string>
+ <string name="download_error_unknown_host">Ostiz dianav</string>
+ <string name="download_error_unauthorized">Fazi dilesa</string>
+ <string name="download_error_file_type_type">Fazi rizh ar restr</string>
+ <string name="download_error_forbidden">Difennet</string>
+ <string name="download_canceled_msg">Pellgargadur nullet</string>
+ <string name="download_canceled_autodownload_enabled_msg">Pellgargadur nullet\nDiweredekaet ar <i>pellgargadur emgefreek</i> evit an elfenn-mañ</string>
+ <string name="download_report_title">Pellgargañ echuet gant fazi(où)</string>
+ <string name="auto_download_report_title">Pellgargañ emgefreek echuet</string>
+ <string name="download_report_content_title">Danevell ar pellgargadurioù</string>
+ <string name="download_error_malformed_url">URL direizh</string>
+ <string name="download_error_io_error">Fazi lenn/skrivañ</string>
+ <string name="download_error_request_error">Fazi azgoulenn</string>
+ <string name="download_error_db_access">Fazi Haeziñ ar Stlennvon</string>
+ <plurals name="downloads_left">
+ <item quantity="one">%d pellgargadur a chom</item>
+ <item quantity="two">%d bellgargadur a chom</item>
+ <item quantity="few">%d fellgargadur a chom</item>
+ <item quantity="many">%d a bellgargadurioù a chom</item>
+ <item quantity="other">%d pellgargadur a chom</item>
+ </plurals>
+ <string name="downloads_processing">O keweriañ ar pellgargadennoù</string>
+ <string name="download_notification_title">O pellgargañ roadennoù ar podskignad</string>
+ <string name="download_report_content">%1$d rann pellgarget gant berzh, %2$d c\'hwitet</string>
+ <string name="download_log_title_unknown">Titl dianav</string>
+ <string name="download_type_feed">Lanv</string>
+ <string name="download_type_media">Restr media</string>
+ <string name="download_request_error_dialog_message_prefix">Degouezhet ez eus bet ur fazi en ur glask pellgargañ ar restr:\u0020</string>
+ <string name="null_value_podcast_error">N\'eus podskignad ebet a glot.</string>
+ <string name="authentication_notification_title">Dilesa rekiz</string>
+ <string name="authentication_notification_msg">Un anv arveriad hag ur ger-tremen a zo dleet gant al loaz goulennet</string>
+ <string name="confirm_mobile_download_dialog_title">Kadarnaat ar pellgargadur hezoug</string>
+ <string name="confirm_mobile_download_dialog_message_not_in_queue">Diweredekaet eo ar pellgargadur war ar c\'hennask hezoug en arventennoù.\n\nGallout a rit dibab ouzhpennañ ar rann el lost pe aotren ar pellgargadur ent padennek.\n\n<small>Dalc\'het vo soñj eus ho tibab e-pad 10 munutenn.</small></string>
+ <string name="confirm_mobile_download_dialog_message">Diweredekaet eo ar pellgargadur war ar c\'hennask hezoug en arventennoù.\n\nFellout a ra deoc\'h aotren ent padennek?\n\n<small>Dalc\'het vo soñj eus ho tibab e-pad 10 munutenn.</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Kadarnaat ar streaming hezoug</string>
+ <string name="confirm_mobile_streaming_notification_message">Diweredekaet eo ar streaming war ar c\'hennask hezoug en arventennoù. Stokit da lenn e streaming memestra.</string>
+ <string name="confirm_mobile_streaming_button_always">Aotren atav</string>
+ <string name="confirm_mobile_download_dialog_only_add_to_queue">Lakaat el lost</string>
+ <string name="confirm_mobile_download_dialog_enable_temporarily">Aotren ent padennek</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Fazi!</string>
+ <string name="player_stopped_msg">N\'eus netra o vezañ lennet</string>
+ <string name="player_preparing_msg">O prientiñ</string>
+ <string name="player_ready_msg">Prest</string>
+ <string name="player_seeking_msg">O klask</string>
+ <string name="playback_error_server_died">An dafariad na respont ket</string>
+ <string name="playback_error_unsupported">Rizh media anskor</string>
+ <string name="playback_error_timeout">Gwezhiadur diamzeret</string>
+ <string name="playback_error_source">N\'haller ket haeziñ ar restr</string>
+ <string name="playback_error_unknown">Fazi dianav</string>
+ <string name="no_media_playing_label">N\'eus netra o vezañ lennet</string>
+ <string name="player_buffering_msg">O skurzañ</string>
+ <string name="player_go_to_picture_in_picture">Mod skeudenn-ouzh-skeudenn</string>
+ <string name="unknown_media_key">AntennaPod - stokell vedia dianav: %1$d</string>
+ <string name="error_file_not_found">N\'eo ket bet kavet ar restr</string>
+ <!--Queue operations-->
+ <string name="lock_queue">Prennañ al lost</string>
+ <string name="unlock_queue">Dibrennañ al lost</string>
+ <string name="queue_locked">Lost prennet</string>
+ <string name="queue_unlocked">Lost dibrennet</string>
+ <string name="queue_lock_warning">Ma prennit al lost ne vo ket tu deoc\'h riklañ pe adurzhiañ ar rannoù.</string>
+ <string name="checkbox_do_not_show_again">Na ziskouez ken</string>
+ <string name="clear_queue_label">Skarzhañ al lost</string>
+ <string name="undo">Nullañ</string>
+ <string name="move_to_top_label">Lakaat e penn ar roll</string>
+ <string name="move_to_bottom_label">Lakaat e dibenn ar roll</string>
+ <string name="sort">Rummañ</string>
+ <string name="keep_sorted">Mirout an urzh</string>
+ <string name="date">Deiziad</string>
+ <string name="duration">Padelezh</string>
+ <string name="episode_title">Titl ar rann</string>
+ <string name="feed_title">Titl ar podskignad</string>
+ <string name="random">Dre zegouezh</string>
+ <string name="smart_shuffle">Urzh emgefreek</string>
+ <string name="ascending">War-gresk</string>
+ <string name="descending">War zigresk</string>
+ <string name="clear_queue_confirmation_msg">Kadarnait e fell deoc\'h dilemel holl rannoù el lost </string>
+ <string name="time_left_label">Padelezh a chom:\u0020</string>
+ <!--Variable Speed-->
+ <string name="download_plugin_label">Pellgargañ un enlugellad</string>
+ <string name="no_playback_plugin_title">N\'eo ket bet staliet an enlugellad</string>
+ <string name="no_playback_plugin_or_sonic_msg">Evit gallout kemmañ tizh al lenn ez eo erbedet gweredekaat al lenner media diabarzh Sonic.</string>
+ <string name="set_playback_speed_label">Tizh lenn</string>
+ <string name="enable_sonic">Gweredekaat Sonic</string>
+ <!--Empty list labels-->
+ <string name="no_items_header_label">Rann ebet er roll len</string>
+ <string name="no_items_label">Gallout a rit ouzhpennañ ur rann en ur bellgargañ anezhi, pe gant ur stokadenn hir hag en ur zibab \"Ouzhpennañ el lost\"</string>
+ <string name="no_shownotes_label">N\'eus notenn evet evit ar rann-mañ.</string>
+ <string name="no_run_downloads_head_label">Pellgargadenn ebe</string>
+ <string name="no_run_downloads_label">Gallout a rit pellgargañ rannoù war skramm munudoù ar podskignad.</string>
+ <string name="no_comp_downloads_head_label">Rann ebet pellgarget</string>
+ <string name="no_comp_downloads_label">Gallout a rit pellgargañ rannoù war skramm munudoù ar podskignad.</string>
+ <string name="no_log_downloads_head_label">Pellgargadur ebet er roll istor</string>
+ <string name="no_log_downloads_label">Roll istor ar pellgargadennoù a vo diskouezet amañ pa ne vo ket goulo ken.</string>
+ <string name="no_history_head_label">Roll istor ebet</string>
+ <string name="no_history_label">Goude bezañ selaouet ur rann e vo diskouezet amañ</string>
+ <string name="no_all_episodes_head_label">Rann ebe</string>
+ <string name="no_all_episodes_label">Pa ouzhpennit ur podskignad e vo diskouezet ar rannoù amañ.</string>
+ <string name="no_new_episodes_head_label">Rann nevez ebe</string>
+ <string name="no_new_episodes_label">Pa vo rannoù nevez e vint skrammet amañ.</string>
+ <string name="no_fav_episodes_head_label">Rann ebet er sinedoù</string>
+ <string name="no_fav_episodes_label">Gallout a rit lakaat ur rann er sinedoù en ur stokañ hir warni</string>
+ <string name="no_chapters_head_label">Chabistr ebet</string>
+ <string name="no_chapters_label">N\'eus chabistr ebet er rann-mañ</string>
+ <string name="no_subscriptions_head_label">Koumanant ebet</string>
+ <string name="no_subscriptions_label">Evit koumanantiñ d\'ur podskignad, pouezit war an arlun mui.</string>
+ <!--Preferences-->
+ <string name="storage_pref">Kadaviñ</string>
+ <string name="storage_sum">Dilemel emgefreek ar rannoù, Enporzhiañ, Ezporzhiañ</string>
+ <string name="project_pref">Raktres</string>
+ <string name="queue_label">Lost</string>
+ <string name="synchronization_pref">Goubredañ</string>
+ <string name="synchronization_sum">Ober gant gpodder.net evit goubredañ gant binviji all</string>
+ <string name="automation">Emgefreekañ</string>
+ <string name="download_pref_details">Munudoù</string>
+ <string name="import_export_pref">Enporzhiadur / Ezporzhiadur</string>
+ <string name="import_export_search_keywords">gwarediñ, assav</string>
+ <string name="appearance">Neuz</string>
+ <string name="external_elements">Elfennoù diavaez</string>
+ <string name="interruptions"> Diskrogoù</string>
+ <string name="playback_control">Reoliadurioù lenn</string>
+ <string name="preference_search_hint">Klask...</string>
+ <string name="preference_search_no_results">Disoc\'h ebet</string>
+ <string name="preference_search_clear_history">Skarzhañ ar roll istor</string>
+ <string name="media_player">Lenner liesvedia</string>
+ <string name="pref_episode_cleanup_title">Naetaat ar rannoù</string>
+ <string name="pref_episode_cleanup_summary">Ar rannoù n\'int ket el lost nag er sinedoù a c\'hall bezañ dilamet ma vez ezhomm muioc\'h a egor dieub gant ar pellgargañ emgefreek.</string>
+ <string name="pref_pauseOnDisconnect_sum">Paouez gant al lenn pa vez diluget selaouelloù pe bluetooth</string>
+ <string name="pref_unpauseOnHeadsetReconnect_sum">Kenderc\'hel al lenn pa vez adluget ar selaouelloù</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">Adstagañ gant al lenn pa vez adkennasket ar bluetooth</string>
+ <string name="pref_hardwareForwardButtonSkips_title">An afell \'war-raok\' a dremen ar rann</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Tremen d\'ar rann da-heul kentoc\'h eget ober ul lamm en a-raok pa vez pouezet war \'lamm en a-raok\' war ur benveg bluetooth</string>
+ <string name="pref_hardwarePreviousButtonRestarts_title">An afell \'lamm a-dreñv\' a adloc\'h ar rann</string>
+ <string name="pref_hardwarePreviousButtonRestarts_sum">Adloc\'hañ adalek ar penn-kentañ pa vez pouezet war un afell \'lamm a-dreñv\' kentoc\'h eget mont war-gil</string>
+ <string name="pref_followQueue_sum">Tremen d\'ar rann goude ur wech echuet gant unan</string>
+ <string name="pref_auto_delete_sum">Dilemel ar rann p\'eo echuet gant al lenn</string>
+ <string name="pref_auto_delete_title">Dilemel ent emgefreek</string>
+ <string name="pref_smart_mark_as_played_sum">Merket e vo ar rannoù evel lennet zoken ma chom un nebeud eilennoù da echuiñ</string>
+ <string name="pref_smart_mark_as_played_title">Merkañ evel lennet speredek</string>
+ <string name="pref_skip_keeps_episodes_sum">Mirout ar rannoù pa vezont tremenet</string>
+ <string name="pref_skip_keeps_episodes_title">Mirout ar rannoù tremenet</string>
+ <string name="pref_favorite_keeps_episodes_sum">Mirout ar rannoù pa vezont lakaet er sinedoù</string>
+ <string name="pref_favorite_keeps_episodes_title">Mirout ar rannoù er sinedoù</string>
+ <string name="playback_pref">Lenn</string>
+ <string name="playback_pref_sum">Reoliadur ar selaouelloù, hirder al lammoù, lostoù</string>
+ <string name="network_pref">Rouedad</string>
+ <string name="network_pref_sum">Etremez an hizivadennoù, reoliadurioù pellgargañ, roadennoù hezoug</string>
+ <string name="pref_autoUpdateIntervallOrTime_title">Etremez pe eur hizivaat</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Despizañ un etremez pe un eur resis evit hizivaat ar podskignadoù ent emgefreek</string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Gallout a rit despizañ un <i>etremez</i> evel \"bep 2 eur\", pe un <i>eur</i> resis evel \"7 eur am\" pe <small>diweredekaat</small> an hizivadennoù emgefreek penn-da-benn.\n\n<small>Dalc\'hit soñj: n\'eo ket resis an eurioù hizivaat. Un daleig e c\'hallont kaout.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_Disable">Diweredekaat</string>
+ <string name="pref_autoUpdateIntervallOrTime_Interval">Dibab un etremez</string>
+ <string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Dibab un eur</string>
+ <string name="pref_autoUpdateIntervallOrTime_every">bep %1$s</string>
+ <string name="pref_autoUpdateIntervallOrTime_at">da %1$s</string>
+ <string name="pref_followQueue_title">Lenn kendalc\'hus</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Digennask ar selaouelloù</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">Lugañ ar selaouelloù</string>
+ <string name="pref_unpauseOnBluetoothReconnect_title">Adkennaskañ ar bluetooth</string>
+ <string name="pref_stream_over_download_title">Ober gant ar streaming da gentañ</string>
+ <string name="pref_stream_over_download_sum">Diskouez an afell stream e plas an afell pellgargañ er rolloù.</string>
+ <string name="pref_mobileUpdate_title">Hizivadennoù hezoug</string>
+ <string name="pref_mobileUpdate_sum">Dibab ar pezh a zo aotreet gant ar c\'hennask hezoug</string>
+ <string name="pref_mobileUpdate_refresh">Hizivaat ar podskignadoù</string>
+ <string name="pref_mobileUpdate_images">Skeudennoù golo</string>
+ <string name="pref_mobileUpdate_auto_download">Pellgargañ emgefreek</string>
+ <string name="pref_mobileUpdate_episode_download">Pellgargañ ar rann</string>
+ <string name="pref_mobileUpdate_streaming">Streaming</string>
+ <string name="user_interface_label">Ketal arveriad</string>
+ <string name="user_interface_sum">Neuz, urzh ar c\'houmanantoù, skramm prennañ</string>
+ <string name="pref_set_theme_title">Dibab un neuz</string>
+ <string name="pref_nav_drawer_items_title">Kemmañ elfennoù ar stalaf merdeiñ</string>
+ <string name="pref_nav_drawer_items_sum">Kemmañ an elfennoù diskouezet er stalaf merdeiñ</string>
+ <string name="pref_nav_drawer_feed_order_title">Despizañ urzh ar c\'houmanantoù</string>
+ <string name="pref_nav_drawer_feed_order_sum">Kemmañ urzh ar c\'houmanantoù</string>
+ <string name="pref_nav_drawer_feed_counter_title">Despizañ ar c\'honter koumanant</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Kemmañ an titour diskouezet war ar c\'honter koumanantoù. Kemmañ a ra ivez urzh ar podskignadoù mard eo urzh ar podskignadoù lakaet da \"Konter\".</string>
+ <string name="pref_set_theme_sum">Kemmañ neuz AntennaPod</string>
+ <string name="pref_automatic_download_title">Pellgargañ emgefreek</string>
+ <string name="pref_automatic_download_sum">Kefluniañ pellgargañ emgefreek ar rannoù.</string>
+ <string name="pref_autodl_wifi_filter_title">Gweredekaat ar sil Wi-Fi</string>
+ <string name="pref_autodl_wifi_filter_sum">Aotren ar pellgargañ emgefreek war ar rouedadoù Wi-Fi diuzet nemetken.</string>
+ <string name="pref_automatic_download_on_battery_title">Pellgargañ pa ne vez ket o kargañ</string>
+ <string name="pref_automatic_download_on_battery_sum">Aotren ar pellgargañ emgefreek pa ne vez ket ar benveg o kargañ</string>
+ <string name="pref_parallel_downloads_title">Pellgargadurioù kenstur</string>
+ <string name="pref_episode_cache_title">Niver a rannoù enrollet</string>
+ <string name="pref_episode_cache_summary">Niver hollek a rannoù pellgarget lakaet e krubuilh ar benveg. Diweredekaet e vo ar pellgargañ emgefreek mard eo tizhet an niver-mañ.</string>
+ <string name="pref_episode_cover_title">Skeudenn ar rannoù</string>
+ <string name="pref_episode_cover_summary">Ober gant golo ar rann pa vez dioutañ. Mard eo digevasket e vo graet gant golo ar podskignad.</string>
+ <string name="pref_theme_title_use_system">Neuz ar reizhiad</string>
+ <string name="pref_theme_title_light">Sklaer</string>
+ <string name="pref_theme_title_dark">Teñval</string>
+ <string name="pref_theme_title_trueblack">Du (evit ar skrammoù AMOLED)</string>
+ <string name="pref_episode_cache_unlimited">Divevenn</string>
+ <string name="pref_update_interval_hours_plural">eur</string>
+ <string name="pref_update_interval_hours_singular">eur</string>
+ <string name="pref_update_interval_hours_manual">Dre zorn</string>
+ <string name="pref_gpodnet_authenticate_title">Anv arveriad</string>
+ <string name="pref_gpodnet_authenticate_sum">Kennaskit gant ho kont gpodder evit goubredañ ho koumanantoù.</string>
+ <string name="pref_gpodnet_logout_title">Digennaskañ</string>
+ <string name="pref_gpodnet_logout_toast">Digennasket gant berzh</string>
+ <string name="pref_gpodnet_setlogin_information_title">Kemmañ an titouroù kennaskañ</string>
+ <string name="pref_gpodnet_setlogin_information_sum">Kemmañ ho titouroù kennaskañ evit ho kont gpodder.net.</string>
+ <string name="pref_gpodnet_sync_changes_title">Goubredañ bremañ</string>
+ <string name="pref_gpodnet_sync_changes_sum">Goubredañ stad ar c\'houmanantoù hag ar rannoù gant gpodder.net</string>
+ <string name="pref_gpodnet_full_sync_title">Rediañ ur goubredañ klok</string>
+ <string name="pref_gpodnet_full_sync_sum">Goubredañ an holl goumanantoù ha stadoù ar rannoù gant gpodder.net.</string>
+ <string name="pref_gpodnet_login_status"><![CDATA[Kennasket evel <i>%1$s</i> gant ar benveg <i>%2$s</i>]]></string>
+ <string name="pref_gpodnet_notifications_title">Diskouez ar rebuzadurioù fazioù goubredañ</string>
+ <string name="pref_gpodnet_notifications_sum">An arventenn-mañ na vez ket arloet d\'ar rebuzadurioù fazi.</string>
+ <string name="pref_playback_speed_title">Tizhioù lenn</string>
+ <string name="pref_playback_speed_sum">Dibab an tizhioù a c\'haller dibab pa vez lennet ar son</string>
+ <string name="pref_feed_playback_speed_sum">Tizh dre ziouer ar rannoù</string>
+ <string name="pref_feed_skip">Lamm emgefreek</string>
+ <string name="pref_feed_skip_sum">Tremen penn-kentañ ha dibenn ar rannoù</string>
+ <string name="pref_feed_skip_ending">Tremen an dibenn</string>
+ <string name="pref_feed_skip_intro">Tremen ar penn-kentañ</string>
+ <string name="pref_feed_skip_ending_toast">Tremenet an %d eilenn diwezhañ</string>
+ <string name="pref_feed_skip_intro_toast">Tremenet an %d eilenn kentañ</string>
+ <string name="pref_playback_time_respects_speed_title">Azasaat titouroù ar media hervez an tizh lenn</string>
+ <string name="pref_playback_time_respects_speed_sum">Al lec\'hiadur hag ar padelezh diskouezet a zo azasaet d\'an tizh lenn</string>
+ <string name="pref_fast_forward">Padelezh al lamm amzer</string>
+ <string name="pref_fast_forward_sum">Personelaat an niver a eilennoù da lammat war-raok pa vez pouezet war an afell war-raok.</string>
+ <string name="pref_rewind">Padelezh al lamm a-dreñv</string>
+ <string name="pref_rewind_sum">Dibabit ar c\'hementad a eilennoù da lammat an a-dreñv pa vez pouezet war \'lamm a-dreñv\'</string>
+ <string name="pref_gpodnet_sethostname_title">Dibab un anv ostiz</string>
+ <string name="pref_gpodnet_sethostname_use_default_host">Ober gant an ostiz dre ziouer</string>
+ <string name="pref_expandNotify_title">Tevet rebuzadurioù a live uhel</string>
+ <string name="pref_expandNotify_sum">Sañset e brasa ar rebuzadur evit diskouez an afelloù lenn.</string>
+ <string name="pref_persistNotify_title">Afelloù lenn peurzalc\'hus</string>
+ <string name="pref_persistNotify_sum">Mirout ar rebuzadur ha reoliadurioù ar skramm prennañ p\'eo ehanet al lenn.</string>
+ <string name="pref_compact_notification_buttons_title">Despizañ an afelloù war ar skramm-prennañ</string>
+ <string name="pref_compact_notification_buttons_sum">Kemmañ a ra an afelloù lenn war ar skramm-prennañ. An afell lenn/ehan a vo diskouezet bepred.</string>
+ <string name="pref_compact_notification_buttons_dialog_title">Dibab %1$d elfenn d\'ar muiañ</string>
+ <string name="pref_compact_notification_buttons_dialog_error">Gallout a rit dibab %1$d elfenn d\'ar muiañ.</string>
+ <string name="pref_lockscreen_background_title">Kemmañ skramm-prennañ an drekleur</string>
+ <string name="pref_lockscreen_background_sum">Lakaat skeudenn ar rann e plas skeudenn drekleur ar skramm-prennañ. Diskouez a raio ivez ar skeudenn en arloadoù all.</string>
+ <string name="pref_showDownloadReport_title">Diskouez danevell ar pellgargadurioù</string>
+ <string name="pref_showDownloadReport_sum">Ma c\'hwit ar pellgargadurioù, sevel un danevell a ziskouez munudoù ar c\'hwitadenn.</string>
+ <string name="pref_showAutoDownloadReport_title">Rentañ-kont ar pellgargañ emgefreek</string>
+ <string name="pref_showAutoDownloadReport_sum">Diskouez ur rebuzadur evit ar rannoù pellgarget ent emgefreek.</string>
+ <string name="pref_expand_notify_unsupport_toast">Handelvoù Android a-raok 4.1 na skoront ket ar rebuzadurioù astennet.</string>
+ <string name="pref_enqueue_location_title">Lec\'hiadur ar rannoù el lost</string>
+ <string name="pref_enqueue_location_sum">Ouzhpennañ ar rannoù da: %1$s</string>
+ <string name="enqueue_location_back">E dibenn ar roll</string>
+ <string name="enqueue_location_front">E penn ar roll</string>
+ <string name="enqueue_location_after_current">Goude ar rann bremanel</string>
+ <string name="pref_smart_mark_as_played_disabled">Diweredekaet</string>
+ <string name="pref_image_cache_size_title">Ment krubuilh ar skeudennoù</string>
+ <string name="pref_image_cache_size_sum">Ment ar c\'hrubuilh evit ar skeudennoù.</string>
+ <string name="visit_user_forum">Forom an implijerien</string>
+ <string name="bug_report_title">Danevellañ ur beug</string>
+ <string name="open_bug_tracker">Digeriñ heulier ar beugoù</string>
+ <string name="export_logs">Ezporzhiañ ar c\'herzhlevrioù</string>
+ <string name="copy_to_clipboard">Eilañ er golver</string>
+ <string name="copied_to_clipboard">Eilet er golver</string>
+ <string name="experimental_pref">Arnodel</string>
+ <string name="pref_media_player_message">Dibab al lenner da implij evit lenn ar restroù</string>
+ <string name="pref_current_value">Talvoud bremanel: %1$s</string>
+ <string name="pref_proxy_title">Proksi</string>
+ <string name="pref_proxy_sum">Arventennañ ur rouedad proksi</string>
+ <string name="pref_faq">Foar ar Goulennoù</string>
+ <string name="pref_no_browser_found">N\'eus bet kavet merdeer ebet.</string>
+ <string name="pref_cast_title">Skor Chromecast</string>
+ <string name="pref_cast_message_play_flavor">Gweredekaat al lenn a-bell war ar binviji Cast (evel ChromeCast, Audio Speaker pe Android TV)</string>
+ <string name="pref_cast_message_free_flavor">Chromecast a c\'houlenn levraouegoù diavaez a zo diweredekaet en handelv-mañ eus AntennaPod</string>
+ <string name="pref_enqueue_downloaded_title">Ouzhpennañ el lost ur wech pellgarget</string>
+ <string name="pref_enqueue_downloaded_summary">Ouzhpennañ ar rannoù pellgarget el lost</string>
+ <string name="media_player_builtin">Lenner genidik Android</string>
+ <string name="media_player_switch_to_exoplayer">Ober gant ExoPlayer</string>
+ <string name="media_player_switched_to_exoplayer">Kemmet eo bet al lenner evit ExoPlayer</string>
+ <string name="pref_skip_silence_title">Tremen ar mareoù didrouz en aodio</string>
+ <string name="pref_videoBehavior_title">Pa vez kuitaet ur video</string>
+ <string name="pref_videoBehavior_sum">Despizañ ar pezh a c\'hoarvez pa vez kuitaet ar video p\'emañ o vezañ lennet</string>
+ <string name="stop_playback">Paouez al len</string>
+ <string name="continue_playback">Kenderc\'hel gant al len</string>
+ <string name="behavior">Emzalc\'h</string>
+ <string name="pref_back_button_behavior_title">Emzalc\'h an afell Distreiñ</string>
+ <string name="pref_back_button_behavior_sum">Kemmañ a ra emzalc\'h an afell Distreiñ</string>
+ <string name="back_button_default">Dre ziouer</string>
+ <string name="back_button_open_drawer">Digeriñ ar stalaf merdeiñ</string>
+ <string name="back_button_double_tap">Stokit 2 wech da guitaat</string>
+ <string name="back_button_show_prompt">Kadarnaat e fell deoc\'h kuitaat</string>
+ <string name="close_prompt">Sur oc\'h e fell deoc\'h kuitaat AntennaPod?</string>
+ <string name="double_tap_toast">Stokañ ur wech ouzhpenn evit kuitaa</string>
+ <string name="back_button_go_to_page">Mont d\'ar bajenn...</string>
+ <string name="back_button_go_to_page_title">Diuzañ ur bajen</string>
+ <string name="pref_delete_removes_from_queue_title">Dilemel a denn eus al lost</string>
+ <string name="pref_delete_removes_from_queue_sum">Tennañ ur rann eus al lost ent emgefreek pa vez dilamet.</string>
+ <!--About screen-->
+ <string name="about_pref">A-zivout</string>
+ <string name="antennapod_version">Handelv AntennaPod</string>
+ <string name="contributors">Kendaolerien</string>
+ <string name="contributors_summary">An holl a c\'hall skoazellañ da wellaat AntennaPod - en ur c\'houleviñ, en ur dreiñ pe en ur sikour an implijerien en hor forom</string>
+ <string name="developers">Diorroerien</string>
+ <string name="translators">Troerien</string>
+ <string name="special_thanks">Trugarekadennoù ispisial</string>
+ <string name="privacy_policy">Reolenn a-fet buhez prevez</string>
+ <string name="licenses">Lañvazioù</string>
+ <string name="licenses_summary">AntennaPod a ra gant meziantoù all</string>
+ <!--Search-->
+ <string name="search_status_no_results">N\'eus bet kavet disoc\'h ebet</string>
+ <string name="search_label">Klask</string>
+ <string name="no_results_for_query">N\'eus bet kavet disoc\'h ebet evit \"%1$s\"</string>
+ <!--Synchronization-->
+ <string name="sync_status_started">Goubredañ loc\'het</string>
+ <string name="sync_status_episodes_upload">Oc\'h uskargañ kemmoù ar rannoù</string>
+ <string name="sync_status_episodes_download">O pellgargañ kemmoù ar rannoù</string>
+ <string name="sync_status_upload_played">Oc\'h uskargañ ar statudoù lenn...</string>
+ <string name="sync_status_subscriptions">O c\'houbredañ ar c\'houmanantoù...</string>
+ <string name="sync_status_success">Goubredet gant berzh</string>
+ <string name="sync_status_error">C\'hwitadenn en ur c\'houbredañ</string>
+ <!--import and export-->
+ <string name="import_export_summary">Dilec\'hiañ ar c\'houmanantoù ha lakaat e lost ur benveg all</string>
+ <string name="database">Stlennvon</string>
+ <string name="opml">OPML</string>
+ <string name="html">HTML</string>
+ <string name="html_export_summary">Diskouez ho koumanantoù d\'ur v⋅mignon⋅ez</string>
+ <string name="opml_export_summary">Treuzkas ho koumanantoù d\'un arload podskignad all</string>
+ <string name="opml_import_summary">Enporzhiañ ho koumanantoù adalek un arload podskignad all</string>
+ <string name="database_export_summary">Treuzkas ar c\'houmanantoù, ar rannoù lennet hag el lost da AntennaPod war ur benveg all</string>
+ <string name="database_import_summary">Enporzhiañ stlennvon AntennaPod adalek ur benveg all</string>
+ <string name="opml_import_label">Enporzhiañ ur restr OPML</string>
+ <string name="opml_reader_error">Degouezhet ez eus bet ur fazi en ul lenn ar restr OPML</string>
+ <string name="opml_import_error_no_file">Restr ebet diuzet!</string>
+ <string name="select_all_label">Diuzañ an holl</string>
+ <string name="deselect_all_label">Na zibab netra</string>
+ <string name="opml_export_label">Ezporzhiañ en ur restr OPML</string>
+ <string name="html_export_label">Ezporzh HTML</string>
+ <string name="database_export_label">Ezporzhiañ ar stlennvon</string>
+ <string name="database_import_label">Enporzhiañ ar stlennvon</string>
+ <string name="database_import_warning">Enporzhiañ ur stlennvon a amsavo ho holl goumanantoù ha roll istor lenn. Erbediñ a reomp ezporzhiañ ho stlennvon en a-raok. Fellout a ra deoc\'h enporzhiañ?</string>
+ <string name="please_wait">Gortozit un tamm...</string>
+ <string name="export_error_label">Fazi ezporzhiañ</string>
+ <string name="export_success_title">Ezporzhiet gant berzh</string>
+ <string name="export_success_sum">Ezporzhiet eo bet ar restr e:\n\n%1$s</string>
+ <string name="opml_import_ask_read_permission">Ret eo aotren haeziñ ar c\'hadaviñ diavaez evit lenn ar restr OPML</string>
+ <string name="import_select_file">Diuzit ar restr da enporzhiañ</string>
+ <string name="import_ok">Enporzhiet gant berzh.\n\nPouezit war OK evit adloc\'hañ AntennaPod</string>
+ <string name="import_no_downgrade">Enporzhiet eo bet ar stlennvon gant un handelv nevesoc\'h eus AntennPod. Ho staliadur bremanel na oar ket c\'hoazh penaos merañ ar restr-mañ.</string>
+ <string name="favorites_export_label">Ezporzhiañ ar sinedoù</string>
+ <string name="favorites_export_summary">Ezporzhiañ ar sinedoù en ur restr</string>
+ <!--Sleep timer-->
+ <string name="set_sleeptimer_label">Lakaat ar munuter</string>
+ <string name="disable_sleeptimer_label">Tennañ ar munuter</string>
+ <string name="sleep_timer_label">Munuter</string>
+ <string name="time_dialog_invalid_input">Enankañ didalvoudek: ret eo d\'ar padelezh bezañ un niveren anterin</string>
+ <string name="shake_to_reset_label">Hejañ evit adloc\'hañ</string>
+ <string name="timer_vibration_label">Froumal a-raok paouez</string>
+ <string name="time_seconds">eilennoù</string>
+ <string name="time_minutes">munutennoù</string>
+ <string name="time_hours">eurioù</string>
+ <plurals name="time_seconds_quantified">
+ <item quantity="one">%d eilenn</item>
+ <item quantity="two">%d eilenn</item>
+ <item quantity="few">%d eilenn</item>
+ <item quantity="many">%d a eilennoù</item>
+ <item quantity="other">%d eilenn</item>
+ </plurals>
+ <plurals name="time_minutes_quantified">
+ <item quantity="one">%d vunutenn</item>
+ <item quantity="two">%d munutenn</item>
+ <item quantity="few">%d munutenn</item>
+ <item quantity="many">%d a vunutennoù</item>
+ <item quantity="other">%d munutenn</item>
+ </plurals>
+ <plurals name="time_hours_quantified">
+ <item quantity="one">%d eur</item>
+ <item quantity="two">%d eur</item>
+ <item quantity="few">%d eur</item>
+ <item quantity="many">%d eur</item>
+ <item quantity="other">%d eur</item>
+ </plurals>
+ <string name="auto_enable_label">Gweredekaat emgefreek</string>
+ <string name="sleep_timer_enabled_label">Harzh emgefreek gweredekaet</string>
+ <!--gpodder.net-->
+ <string name="gpodnet_taglist_header">RUMMADOÙ</string>
+ <string name="gpodnet_toplist_header">PODSKIGNADOÙ BRUDET</string>
+ <string name="gpodnet_suggestions_header">ALIOÙ</string>
+ <string name="gpodnet_search_hint">Klask war gpodder.ner</string>
+ <string name="gpodnetauth_login_title">Kennaskañ</string>
+ <string name="gpodnetauth_login_descr">Donemat war an hentenn kennaskañ gpodder.net. Da gentañ penn, biziatait ho titouroù kennaskañ:</string>
+ <string name="gpodnetauth_login_butLabel">Kennaskañ</string>
+ <string name="gpodnetauth_login_register">Ma n\'ho peus ket a gont c\'hoazh e c\'hallit krouiñ unan amañ:\nhttps://gpodder.net/register/</string>
+ <string name="username_label">Anv arveriad</string>
+ <string name="password_label">Ger-tremen</string>
+ <string name="gpodnetauth_device_title">Dibab ar benveg</string>
+ <string name="gpodnetauth_device_descr">Krouiñ ur benveg nevez evit ho kont gpodder.net pe dibabit ur benveg a zo anezhañ:</string>
+ <string name="gpodnetauth_device_deviceID">Naoudi ar benveg:\u0020</string>
+ <string name="gpodnetauth_device_caption">Alc\'hwez</string>
+ <string name="gpodnetauth_device_butCreateNewDevice">Krouiñ ur benveg nevez</string>
+ <string name="gpodnetauth_device_chooseExistingDevice">Dibab ur benveg a zo anezhañ:</string>
+ <string name="gpodnetauth_device_errorEmpty">Ret eo deoc\'h leuniañ naoudi ar benveg</string>
+ <string name="gpodnetauth_device_errorAlreadyUsed">Implijet eo an naoudi-se endeo</string>
+ <string name="gpodnetauth_device_caption_errorEmpty">An anv n\'hall ket bezañ goullo</string>
+ <string name="gpodnetauth_device_butChoose">Dibab</string>
+ <string name="gpodnetauth_finish_title">Kennasket gant berzh!</string>
+ <string name="gpodnetauth_finish_descr">Gourc\'hemennoù! Liammet eo ho kont gpodder.net gant ho penveg. Goubredet e vo ent emgefreek ar c\'houmanantoù war ho penveg gant ho kont gpodder.net.</string>
+ <string name="gpodnetauth_finish_butsyncnow">Kregiñ gant ar goubredañ bremañ </string>
+ <string name="gpodnetauth_finish_butgomainscreen">Mont d\'ar skramm degemer</string>
+ <string name="gpodnetsync_auth_error_title">fazi dilesa gpodder.net</string>
+ <string name="gpodnetsync_auth_error_descr">Titouroù kennaskañ pe ger-tremen</string>
+ <string name="gpodnetsync_error_title">fazi goubredañ gpodder.net</string>
+ <string name="gpodnetsync_error_descr">Degouezhet ez eus bet ur fazi en ur c\'houbredañ:\u0020</string>
+ <string name="gpodnetsync_pref_report_successful">Berzh</string>
+ <string name="gpodnetsync_pref_report_failed">C\'hwitet</string>
+ <string name="gpodnetsync_username_characters_error">Gallout a rit lakaat lizherennoù, niveroù pe tiredoù en anv arveriad hepken.</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Teuliad dibabet:</string>
+ <string name="create_folder_label">Krouiñ un teuliad</string>
+ <string name="choose_data_directory">Dibab teuliad ar roadennoù</string>
+ <string name="choose_data_directory_message">Dibabit an teuliad lec\'h ma vo enrollet ar roadennoù. Krouet e vo an is-teuliadoù rekiz gant AntennaPod.</string>
+ <string name="choose_data_directory_permission_rationale">Ret eo aotren haeziñ ar c\'hadaviñ diavaez evit kemmañ teuliad ar roadennoù</string>
+ <string name="choose_data_directory_available_space">%1$s war %2$s dieub</string>
+ <string name="create_folder_msg">Krouiñ un teuliad nevez gant an anv \"%1$s\"?</string>
+ <string name="create_folder_success">Teuliad krouet</string>
+ <string name="create_folder_error_no_write_access">N\'haller ket skrivañ en teuliad-mañ</string>
+ <string name="create_folder_error_already_exists">Un teuliad gant an anv-mañ a zo endeo</string>
+ <string name="create_folder_error">N\'haller ket krouiñ an teuliad</string>
+ <string name="folder_does_not_exist_error">N\'eus ket eus \"%1$s\"</string>
+ <string name="folder_not_readable_error">N\'haller ket lenn \"%1$s\"</string>
+ <string name="folder_not_writable_error">N\'haller ket skrivañ e \"%1$s\"</string>
+ <string name="folder_not_empty_dialog_title">N\'eo ket goullo an teuliad</string>
+ <string name="folder_not_empty_dialog_msg">N\'eo ket goullo an teuliad dibabet ganeoc\'h. Ar pellgargadurioù media hag ar restroù all a vo lakaet en teuliad-mañ war-eeun. Kenderc\'hel memestra?</string>
+ <string name="set_to_default_folder">Dibab an teuliad dre ziouer</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">Ehaniñ al lenn kentoc\'h eget izelaat ar son pa fell d\'un arload all ober sonioù</string>
+ <string name="pref_pausePlaybackForFocusLoss_title">Ehaniñ pa vez arsavet</string>
+ <string name="pref_resumeAfterCall_sum">Adstagañ gant al lenn ur wech echu gant ur bellgomzadenn</string>
+ <string name="pref_resumeAfterCall_title">Adstagañ goude ur bellgomzadenn</string>
+ <string name="pref_restart_required">Ret eo adloc\'hañ AntennaPod evit ma vefe arloet ar c\'hemm.</string>
+ <!--Online feed view-->
+ <string name="subscribe_label">Koumanantiñ</string>
+ <string name="subscribing_label">O koumanantiñ...</string>
+ <string name="preview_episode">Raklenn</string>
+ <string name="stop_preview">Paouez ar raklen</string>
+ <!--Content descriptions for image buttons-->
+ <string name="rewind_label">Lamm war-gil</string>
+ <string name="fast_forward_label">Lamm en ar-raok</string>
+ <string name="increase_speed">Fonnusaat</string>
+ <string name="decrease_speed">Gorrekaat</string>
+ <string name="media_type_audio_label">Aodio</string>
+ <string name="media_type_video_label">Vdeo</string>
+ <string name="navigate_upwards_label">Merdeiñ en nec\'h</string>
+ <string name="status_downloading_label">War bellgargañ emañ ar ran</string>
+ <string name="in_queue_label">El lost emañ ar rann</string>
+ <string name="is_favorite_label">Ouzhpennet eo bet ar rann er sinedoù</string>
+ <string name="drag_handle_content_description">Lakait da riklañ evit kemmañ lec\'hiadur an elfenn-mañ</string>
+ <string name="load_next_page_label">Kargañ ar bajenn da-heul</string>
+ <string name="switch_pages">Kemmañ ar pajennoù</string>
+ <string name="position">Lec\'hiadur: %1$s</string>
+ <string name="apply_action">Arloañ ar gwezhiadur</string>
+ <!--Feed information screen-->
+ <string name="authentication_label">Dilesa</string>
+ <string name="authentication_descr">Kemmit hoc\'h anv arveriad hag ho ker-tremen evit ar podskignad-mañ hag e rannoù.</string>
+ <string name="auto_download_settings_label">Arventennoù ar pellgargañ emgefreek</string>
+ <string name="episode_filters_label">Sil ar rannoù</string>
+ <string name="episode_filters_description">Roll ar gerioù implijet evit dibab ma rank ur rann bezañ ebarzhet pe laosket a-gostez pa vez pellgarget ent emgefreek</string>
+ <string name="episode_filters_include">Ebarzhiñ</string>
+ <string name="episode_filters_exclude">Leuskel a-gostez</string>
+ <string name="episode_filters_hint">Gerioù o-unan \n\"Meur a c\'her\"</string>
+ <string name="keep_updated">Leuskel hizivaet</string>
+ <string name="keep_updated_summary">Ebarzhiñ ar podskignad pa vez hizivaet an holl bodskignadoù</string>
+ <string name="auto_download_disabled_globally">N\'eo ket gweredekaet al lenn emgefreek e arventennoù pennañ AntennaPod</string>
+ <!--Progress information-->
+ <string name="progress_upgrading_database">Oc\'h hizivaat ar stlennvon</string>
+ <!--AntennaPodSP-->
+ <string name="sp_apps_importing_feeds_msg">Oc\'h enporzhiañ ar c\'houmanantoù diwar arloadoù gant un arver unel...</string>
+ <!--Add podcast fragment-->
+ <string name="search_podcast_hint">Klask ur podskignad...</string>
+ <string name="search_itunes_label">Klask war iTunes</string>
+ <string name="search_fyyd_label">Klask war fydd</string>
+ <string name="advanced">Araokaet</string>
+ <string name="add_podcast_by_url">Ouzhpennañ ur podskignad gant e URL</string>
+ <string name="browse_gpoddernet_label">Klask war gpodder.net</string>
+ <string name="discover">Dizoloeiñ</string>
+ <string name="discover_more">muioc\'h »</string>
+ <string name="search_powered_by">Klask gant %1$s</string>
+ <string name="filter">Sil</string>
+ <!--Episodes apply actions-->
+ <string name="all_label">An holl</string>
+ <string name="selected_all_label">Diuzet eo bet an holl rannoù</string>
+ <string name="none_label">Hini ebet</string>
+ <string name="deselected_all_label">Diziuzet eo bet an holl rannoù</string>
+ <string name="played_label">Lennet</string>
+ <string name="selected_played_label">Rannoù lennet diuzet</string>
+ <string name="unplayed_label">Anlennet </string>
+ <string name="selected_unplayed_label">Rannoù anlennet diuzet</string>
+ <string name="downloaded_label">Pellgarget</string>
+ <string name="selected_downloaded_label">Rannoù pellgarget diuzet</string>
+ <string name="not_downloaded_label">N\'eo ket pellgarget</string>
+ <string name="selected_not_downloaded_label">Rannoù n\'int ket pellgarget diuzet</string>
+ <string name="queued_label">Lakaet el lost</string>
+ <string name="selected_queued_label">Rannoù diuzet el lost</string>
+ <string name="not_queued_label">N\'emañ ket el lost</string>
+ <string name="selected_not_queued_label">Rannoù diuzet n\'int ket el lost</string>
+ <string name="has_media">Gant ur media</string>
+ <string name="selected_has_media_label">Diuzañ ar rannoù gant media</string>
+ <!--Sort-->
+ <string name="sort_title_a_z">Titl (A \u2192 Z)</string>
+ <string name="sort_title_z_a">Titl (Z \u2192 A)</string>
+ <string name="sort_date_new_old">Deiziad (Nevez \u2192 Kozh)</string>
+ <string name="sort_date_old_new">Deiziad (Kozh \u2192 Nevez)</string>
+ <string name="sort_duration_short_long">Padelezh (Berr \u2192 Hir)</string>
+ <string name="sort_duration_long_short">Padelezh (Hir \u2192 Berr)</string>
+ <string name="sort_a_z">A \u2192 Z</string>
+ <string name="sort_z_a">Z \u2192 A</string>
+ <string name="sort_new_old">Nevez \u2192 Kozh</string>
+ <string name="sort_old_new">Kozh \u2192 Nevez</string>
+ <string name="sort_short_long">Berr \u2192 Hir</string>
+ <string name="sort_long_short">Hir \u2192 Berr</string>
+ <!--Rating dialog-->
+ <string name="rating_title">Plijout a ra AntennaPod deoc\'h?</string>
+ <string name="rating_message">Laouen e vefemp ma \'z afec\'h da notenniñ AntennaPod.</string>
+ <string name="rating_never_label">Laoskit ac\'hanon e peoc\'h</string>
+ <string name="rating_later_label">Adlakaat da soñj diwezhatoc\'h</string>
+ <string name="rating_now_label">Deomp dezhi!</string>
+ <!--Audio controls-->
+ <string name="audio_controls">Reoliadurioù aodio</string>
+ <string name="playback_speed">Tizh lenn</string>
+ <string name="volume">Ampled</string>
+ <string name="left_short">K</string>
+ <string name="right_short">D</string>
+ <string name="audio_effects">Efedoù aodio</string>
+ <string name="stereo_to_mono">Meskañ: stereo pe mono</string>
+ <string name="sonic_only">Sonic hepken</string>
+ <string name="exoplayer_only">ExoPlayer hepken</string>
+ <!--proxy settings-->
+ <string name="proxy_type_label">RIzh</string>
+ <string name="host_label">Ostiz</string>
+ <string name="port_label">Porzh</string>
+ <string name="optional_hint">(Diret)</string>
+ <string name="proxy_test_label">Amprouiñ</string>
+ <string name="proxy_checking">O wiriañ...</string>
+ <string name="proxy_test_successful">Amprouet gant berzh</string>
+ <string name="proxy_test_failed">C\'hwitet</string>
+ <string name="proxy_host_empty_error">N\'hall ket an ostiz bezañ goullo</string>
+ <string name="proxy_host_invalid_error">An ostiz n\'eo ket ur chomlec\'h IP pe un domani talvoudek </string>
+ <string name="proxy_port_invalid_error">Porzh didalvoudek</string>
+ <!--Subscriptions fragment-->
+ <string name="subscription_num_columns">Niver a vannoù</string>
+ <!--Casting-->
+ <string name="cast_media_route_menu_title">Lenn war...</string>
+ <string name="cast_disconnect_label">Digennaskañ an estez cas</string>
+ <string name="cast_not_castable">Ar benveg cast n\'eo ket keverlec\'h gant ar media diuzet</string>
+ <string name="cast_failed_to_play">Fazi en ul lenn ar media</string>
+ <string name="cast_failed_to_stop">C\'hwitadenn en ur baouez da lenn ar media</string>
+ <string name="cast_failed_to_pause">C\'hwitadenn en un ehanañ lenn ar media</string>
+ <string name="cast_failed_setting_volume">C\'hwitadenn en ur zibab an ampled</string>
+ <string name="cast_failed_no_connection">N\'eus kennask evet d\'ar benveg Cast</string>
+ <string name="cast_failed_no_connection_trans">Kollet eo bet ar c\'hennask d\'ar benveg cast. Emañ an arload o klask adkennaskañ mard eo posupl. Gortozit un nebeud eilennoù ha klaskit en-dro.</string>
+ <string name="cast_failed_status_request">C\'hwitadenn en ur c\'houbredañ ar benveg cast</string>
+ <string name="cast_failed_seek">C\'hwitadenn en ur glask al lec\'hiadur nevez war ar benveg cast</string>
+ <string name="cast_failed_receiver_player_error">Ur fazi grevus a zo degouezhet gant al lenner degemer</string>
+ <string name="cast_failed_media_error_skipping">Fazi en ul lenn ar media. O tremen...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Ober rekiz</string>
+ <string name="notification_channel_user_action_description">Skrammet e vo mard eo ret deoc\'h ober un dra bennak, enankañ ur ger-tremen da skouer.</string>
+ <string name="notification_channel_downloading">O pellgargañ</string>
+ <string name="notification_channel_downloading_description">Diskouezet eo pa vez o pellgargañ.</string>
+ <string name="notification_channel_playing">O lenn</string>
+ <string name="notification_channel_playing_description">Evit reoliañ al lenn. Ar rebuzadur pennañ an hini eo pa lennit ur podskignat.</string>
+ <string name="notification_channel_error">Fazioù</string>
+ <string name="notification_channel_error_description">Diskouezet eo pa vez ur gudenn, ma c\'hwit ur pellgargadur pe ur goubredañ.</string>
+ <string name="notification_channel_auto_download">Pellgargañ emgefreek</string>
+ <string name="notification_channel_episode_auto_download">Diskouezet eo pa vez pellgarget rannoù ent emgefreek</string>
+ <!--Widget settings-->
+ <string name="widget_settings">Gwellvezioù ar widjet</string>
+ <string name="widget_create_button">Krouiñ ur widjet</string>
+ <string name="widget_opacity">Demerez</string>
+ <!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Arventenn hizivaet</string>
+ <string name="on_demand_config_stream_text">War a-seblant e lennit e streaming kalz. Fellout a ra deoc\'h e vefe diskouezet an afelloù lenn e streaming er roll?</string>
+ <string name="on_demand_config_download_text">War a-seblant e pellgargit kalz. Fellout a ra deoc\'h e vefe diskouezet an afelloù pellgargañ er roll?</string>
+</resources>
diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml
index 1a72af232..30a71465a 100644
--- a/core/src/main/res/values-ca/strings.xml
+++ b/core/src/main/res/values-ca/strings.xml
@@ -2,6 +2,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activity and fragment titles-->
<string name="feed_update_receiver_name">Actualitzar subscripcions</string>
+ <string name="feeds_label">Podcasts</string>
<string name="statistics_label">Estadístiques</string>
<string name="add_feed_label">Afegeix podcast</string>
<string name="episodes_label">Episodis</string>
@@ -22,6 +23,8 @@
<string name="gpodnet_auth_label">Inici de sessió a gpodder.net</string>
<string name="episode_cache_full_title">La memòria cau d\'episodis és plena</string>
<string name="episode_cache_full_message">S\'ha arribat al límit de la memòria cau d\'episodis. Pots incrementar-ne la capacitat a la configuració.</string>
+ <string name="playback_statistics_label">Reproducció</string>
+ <string name="download_statistics_label">Baixades</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Temps total de podcasts reproduïts</string>
<string name="statistics_details_dialog">%1$d de %2$depisodis començats.\n\nReproduïts %3$s de %4$s.</string>
@@ -29,7 +32,10 @@
<string name="statistics_mode_normal">Calcula el temps que realment s\'ha reproduït. La reproducció repetida es comptarà repetides vegades, mentre que no es tindrà en compte si s\'ha marcat com a reproduït. </string>
<string name="statistics_mode_count_all">Suma tots els podcasts marcats com a reproduïts</string>
<string name="statistics_speed_not_counted">Avís: la velocitat de reproducció mai no es té en compte.</string>
+ <string name="statistics_reset_data">Resetejar dades estadístiques</string>
+ <string name="statistics_reset_data_msg">Açò esborrarà l\'històric de la duració reproduïda per a tots els episodis. ¿Segur que vols continuar?</string>
<!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Mida total dels podcasts baixats:</string>
<!--Main activity-->
<string name="drawer_open">Obre menú</string>
<string name="drawer_close">Tanca menú</string>
@@ -78,6 +84,11 @@
<string name="auto_download_apply_to_items_title">Aplica als episodis previs</string>
<string name="auto_download_apply_to_items_message">El nou ajustament de <i>baixada automàtica</i> s\'aplicarà als nous episodis.\nVols que també sigui aplicat als episodis publicats prèviament?</string>
<string name="auto_delete_label">Esborra episodi automàticament</string>
+ <string name="feed_volume_reduction">Reducció de volum</string>
+ <string name="feed_volume_reduction_summary">Baixa el volum per a episodis d\'aquest feed: %1$s</string>
+ <string name="feed_volume_reduction_off">Off</string>
+ <string name="feed_volume_reduction_light">Lleuger</string>
+ <string name="feed_volume_reduction_heavy">Fort</string>
<string name="parallel_downloads_suffix">\u0020baixades en paral·lel</string>
<string name="feed_auto_download_global">Valor predeterminat global</string>
<string name="feed_auto_download_always">Sempre</string>
@@ -86,15 +97,27 @@
<string name="episode_cleanup_never">Mai</string>
<string name="episode_cleanup_queue_removal">Quan no està a la cua</string>
<string name="episode_cleanup_after_listening">Després d\'acabar</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">1 hora després d\'acabar</item>
+ <item quantity="other">%d hours després d\'acabar</item>
+ </plurals>
<plurals name="episode_cleanup_days_after_listening">
<item quantity="one">1 dia després d\'acabar</item>
<item quantity="other">%d dies després d\'acabar</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d seleccionat</item>
+ <item quantity="other">%dseleccionats</item>
+ </plurals>
+ <string name="loading_more">Carregant més...</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Marca-ho tot com a llegit</string>
<string name="mark_all_read_msg">S\'han marcat tots els episodis com a llegits</string>
<string name="mark_all_read_confirmation_msg">Si us plau confirma que vols marcar tots els episodis com reproduits.</string>
<string name="mark_all_read_feed_confirmation_msg">Si us plau, confirmeu que voleu marcar tots els episodis d\'aquest podcast com a reproduïts.</string>
+ <string name="remove_all_new_flags_label">Retirar totes les banderes de \"nou\"</string>
+ <string name="removed_all_new_flags_msg">Retirades totes les banderes de \"nou\"</string>
+ <string name="remove_all_new_flags_confirmation_msg">Si us plau, confirma que vols retirar la bandera \"nou\" de tots els episodis.</string>
<string name="show_info_label">Mostra informació</string>
<string name="show_feed_settings_label">Mostrar configuració del podcast</string>
<string name="feed_info_label">Informació del podcast</string>
@@ -105,11 +128,16 @@
<string name="share_link_label">Comparteix l\'adreça de l\'episodi</string>
<string name="share_link_with_position_label">Comparteix l\'adreça de l\'episodi i la posició</string>
<string name="share_file_label">Comparteix el fitxer</string>
+ <string name="share_website_url_label">Comparteix URL de la pàgina </string>
+ <string name="share_feed_url_label">Comparteix URL de podcast</string>
<string name="share_item_url_label">Comparteix l\'adreça del fitxer multimèdia</string>
<string name="share_item_url_with_position_label">Comparteix l\'adreça del fitxer multimèdia i la posició</string>
<string name="feed_delete_confirmation_msg">Si us plau, confirmeu que voleu eliminar el podcast \"%1$s\" i tots els seus episodis (fins i tot els ja baixats).</string>
<string name="feed_remover_msg">Eliminant podcast</string>
<string name="load_complete_feed">Refrescar tot el podcast</string>
+ <string name="multi_select">Selecció múltiple</string>
+ <string name="select_all_above">Seleccionar tots cap amunt</string>
+ <string name="select_all_below">Seleccionar cap a baix</string>
<string name="hide_unplayed_episodes_label">Per reproduir</string>
<string name="hide_paused_episodes_label">Pausat</string>
<string name="hide_played_episodes_label">Reproduit</string>
@@ -122,19 +150,51 @@
<string name="filtered_label">Filtrat</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Darrera actualització fallida</string>
<string name="open_podcast">Obrir podcast</string>
+ <string name="please_wait_for_data">Per favor, espera fins a que les dades estiguen carregades</string>
<!--actions on feeditems-->
<string name="download_label">Baixa</string>
+ <plurals name="downloading_batch_label">
+ <item quantity="one">Baixant %d episodi.</item>
+ <item quantity="other">Baixant %d episodis.</item>
+ </plurals>
<string name="play_label">Reprodueix</string>
<string name="pause_label">Pausa</string>
<string name="stream_label">Reprodueix sense baixar</string>
<string name="delete_label">Esborrar</string>
<string name="delete_failed">No s\'ha pogut esborrar el fitxer. Reiniciar el dispositiu pot ajudar.</string>
+ <string name="delete_episode_label">Esborrar episodi.</string>
+ <plurals name="deleted_episode_batch_label">
+ <item quantity="one">%d episodi esborrat.</item>
+ <item quantity="other">%d episodis esborrats.</item>
+ </plurals>
+ <string name="remove_new_flag_label">Retirar bandera de \"nou\"</string>
+ <string name="removed_new_flag_label">Retirada bandera de \"nou\"</string>
<string name="mark_read_label">Marca com a llegit</string>
<string name="marked_as_read_label">Marcats com llegits</string>
+ <string name="mark_read_no_media_label">Marcar com a llegit</string>
+ <string name="marked_as_read_no_media_label">Marcar com a llegit</string>
+ <string name="play_this_to_seek_position">Per a botar a posicions deus reproduir l\'episodi.</string>
+ <plurals name="marked_read_batch_label">
+ <item quantity="one">%d episodi marcat com a reproduït.</item>
+ <item quantity="other">%d episodis marcats com a reproduïts. </item>
+ </plurals>
<string name="mark_unread_label">Marca com a pendent</string>
+ <string name="mark_unread_label_no_media">Marcar com a no llegit</string>
+ <plurals name="marked_unread_batch_label">
+ <item quantity="one">%d episodi marcat com a no llegit.</item>
+ <item quantity="other">%d episodis marcats com a no llegits.</item>
+ </plurals>
<string name="add_to_queue_label">Afegeix a la cua</string>
<string name="added_to_queue_label">Afegit a la cua</string>
+ <plurals name="added_to_queue_batch_label">
+ <item quantity="one">%d episodi afegit a la cua.</item>
+ <item quantity="other">%d episodis afegits a la cua.</item>
+ </plurals>
<string name="remove_from_queue_label">Suprimeix de la cua</string>
+ <plurals name="removed_from_queue_batch_label">
+ <item quantity="one">%d episodi retirat de la cua.</item>
+ <item quantity="other">%d episodis retirats de la cua.</item>
+ </plurals>
<string name="add_to_favorite_label">Afegit a preferits</string>
<string name="added_to_favorites">Afegit a preferits</string>
<string name="remove_from_favorite_label">Suprimeix de preferits</string>
@@ -145,6 +205,7 @@
<string name="deactivate_auto_download">Desactiva les baixades automàtiques</string>
<string name="reset_position">Restablir posició de reproducció</string>
<string name="removed_item">S\'ha suprimit l\'element</string>
+ <string name="no_items_selected">Cap item seleccionat.</string>
<!--Download messages and labels-->
<string name="download_successful">ha funcionat</string>
<string name="download_pending">Baixada pendent</string>
@@ -165,6 +226,7 @@
<string name="download_canceled_msg">S\'ha cancel·lat la baixada</string>
<string name="download_canceled_autodownload_enabled_msg">Baixada cancel·lada\nDesactivada les <i>baixades automàtiques</i> per aquest element</string>
<string name="download_report_title">Baixades completades amb error(s)</string>
+ <string name="auto_download_report_title">Auto-baixades completades.</string>
<string name="download_report_content_title">Registre de baixades</string>
<string name="download_error_malformed_url">URL mal formatada</string>
<string name="download_error_io_error">Error d\'E/S</string>
@@ -181,11 +243,15 @@
<string name="download_type_feed">Canal</string>
<string name="download_type_media">Fitxer</string>
<string name="download_request_error_dialog_message_prefix">S\'ha produït un error en intentar baixar el fitxer:\u0020</string>
+ <string name="null_value_podcast_error">No s\'ha proporcionat cap podcast que puga mostrar-se.</string>
<string name="authentication_notification_title">Cal autenticar-se</string>
<string name="authentication_notification_msg">Es necessita un usuari i una contrasenya per accedir al recurs</string>
<string name="confirm_mobile_download_dialog_title">Confirma baixada mòvil</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">La baixada amb connexió de dades mòbils està desactivada.\n\nPots escollir entre afegir l\'episodi a la cua, o permetre la descàrrega de forma temporal.\n\n<small>La teva tria es recordarà durant 10 minuts.</small></string>
<string name="confirm_mobile_download_dialog_message">La baixada amb connexió de dades mòbils està desactivada.\n\nVols permetre la descàrrega de forma temporal?\n\n<small>La teva tria es recordarà durant 10 minuts.</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Confirmar streaming per mòbil.</string>
+ <string name="confirm_mobile_streaming_notification_message">Streaming per xarxa mòbil està deshabilitat als ajustos. Toca la pantalla per a fer-ho de totes maners.</string>
+ <string name="confirm_mobile_streaming_button_always">Permet sempre.</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">En cua</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Permetre temporalment</string>
<!--Mediaplayer messages-->
@@ -195,21 +261,28 @@
<string name="player_ready_msg">Preparat</string>
<string name="player_seeking_msg">S\'està cercant</string>
<string name="playback_error_server_died">El servidor no està operatiu</string>
+ <string name="playback_error_unsupported">Tipus de medi no suportat.</string>
+ <string name="playback_error_timeout">La operació ha tardat massa.</string>
+ <string name="playback_error_source">No s\'ha pogut accedir al arxiu de media.</string>
<string name="playback_error_unknown">Error desconegut</string>
<string name="no_media_playing_label">No s\'està reproduint res</string>
<string name="player_buffering_msg">S\'està carregant</string>
<string name="player_go_to_picture_in_picture">Mode Picture-in-picture</string>
<string name="unknown_media_key">AntennaPod - Control desconegut: %1$d</string>
+ <string name="error_file_not_found">Arxiu no trobat</string>
<!--Queue operations-->
<string name="lock_queue">Bloqueja la cua</string>
<string name="unlock_queue">Desbloqueja la cua</string>
<string name="queue_locked">Cua bloquejada</string>
<string name="queue_unlocked">Cua no bloquejada</string>
+ <string name="queue_lock_warning">Si bloqueges la cua no podràs arrastrar o reordenar episodis.</string>
+ <string name="checkbox_do_not_show_again">No mostres més.</string>
<string name="clear_queue_label">Buida la cua</string>
<string name="undo">Desfés</string>
<string name="move_to_top_label">Mou al principi</string>
<string name="move_to_bottom_label">Mou al final</string>
<string name="sort">Ordena</string>
+ <string name="keep_sorted">Manté ordenats.</string>
<string name="date">Data</string>
<string name="duration">Durada</string>
<string name="episode_title">Títol de l\'episodi</string>
@@ -223,22 +296,49 @@
<!--Variable Speed-->
<string name="download_plugin_label">Baixa el connector</string>
<string name="no_playback_plugin_title">Connector no instal·lat</string>
+ <string name="no_playback_plugin_or_sonic_msg">Per a que la velocitat de reproducció variable funcione recomanem activar el reproductor de medis Sonic.</string>
<string name="set_playback_speed_label">Velocitats de reproducció</string>
<string name="enable_sonic">Activa Sonic</string>
<!--Empty list labels-->
+ <string name="no_items_header_label">No hi ha episodis a la cua.</string>
+ <string name="no_items_label">Afegeix un episodi baixant-lo, o polsa un episodi durant un moment i selecciona \"Afegir a la cua\"</string>
<string name="no_shownotes_label">Aquest episodi no té notes.</string>
+ <string name="no_run_downloads_head_label">No hi ha baixades en marxa.</string>
+ <string name="no_run_downloads_label">Pots baixar episodis a la pantalla de detalls del podcast</string>
+ <string name="no_comp_downloads_head_label">Cap episodi baixat.</string>
+ <string name="no_comp_downloads_label">Pots baixar episodis a la pantalla de detalls del podcast</string>
+ <string name="no_log_downloads_head_label">No hi ha registre de baixades</string>
+ <string name="no_log_downloads_label">Els registres de baixades apareixeran ací quan estiguen disponibles.</string>
+ <string name="no_history_head_label">No hi ha històric</string>
+ <string name="no_history_label">Després d\'haver escoltat un episodi apareixerà ací.</string>
+ <string name="no_all_episodes_head_label">No hi ha episodis</string>
+ <string name="no_all_episodes_label">Al afegir un podcast els episodis apareixeran ací.</string>
+ <string name="no_new_episodes_head_label">No hi ha episodis nous.</string>
+ <string name="no_new_episodes_label">Quan arriben nous episodis apareixeran ací. </string>
+ <string name="no_fav_episodes_head_label">No hi ha episodis favorits. </string>
+ <string name="no_fav_episodes_label">Pots afegir episodis a favorits tocant-los i mantenint.</string>
+ <string name="no_chapters_head_label">No hi ha capitols</string>
<string name="no_chapters_label">Aquest episodi no té capítols</string>
+ <string name="no_subscriptions_head_label">No hi ha subscripcions</string>
+ <string name="no_subscriptions_label">Per a subscriure\'t a un podcast, toca la icona + més avall.</string>
<!--Preferences-->
<string name="storage_pref">Emmagatzematge</string>
+ <string name="storage_sum">Auto-esborrat d\'episodis, Importar, Exportar</string>
<string name="project_pref">Projecte</string>
<string name="queue_label">Cua</string>
+ <string name="synchronization_pref">Sincronització</string>
+ <string name="synchronization_sum">Sincronitza amb altres dispositius usant gpodder.net</string>
<string name="automation">Automatització</string>
<string name="download_pref_details">Detalls</string>
<string name="import_export_pref">Importa/Exporta</string>
+ <string name="import_export_search_keywords">còpia de seguretat, restaurar</string>
<string name="appearance">Aparença</string>
<string name="external_elements">Elements externs</string>
<string name="interruptions">Interrupcions</string>
+ <string name="playback_control">Control de reproducció</string>
<string name="preference_search_hint">Cerca…</string>
+ <string name="preference_search_no_results">No hi ha resultats</string>
+ <string name="preference_search_clear_history">Esborra l\'historial</string>
<string name="media_player">Reproductor multimèdia</string>
<string name="pref_episode_cleanup_title">Neteja l\'episodi</string>
<string name="pref_episode_cleanup_summary">Els episodis que no es troben a la cua i no són preferits seran candidats a ser suprimits si l\'Auto Descàrrega necessita espai per a nous episodis</string>
@@ -246,6 +346,7 @@
<string name="pref_unpauseOnHeadsetReconnect_sum">Continua la reproducció en connectar novament els auriculars</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Continua la reproducció en connectar novament el bluetooth</string>
<string name="pref_hardwareForwardButtonSkips_title">Endavant per saltar</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">En prémer el botó d\'avançada en un dispositiu bluetooth bota al següent episodi en lloc d\'avançar.</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Endarrere per reiniciar</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">En prémer un botó físic, reinicieu l\'episodi actual en lloc de rebobinar-lo</string>
<string name="pref_followQueue_sum">Salta al següent element de la cua en acabar la reproducció</string>
@@ -258,8 +359,11 @@
<string name="pref_favorite_keeps_episodes_sum">Conserva els episodis marcats com a preferits.</string>
<string name="pref_favorite_keeps_episodes_title">Conserva els episodis preferits.</string>
<string name="playback_pref">Reproducció</string>
+ <string name="playback_pref_sum">Controls d\'auriculars, Intervals d\'avançada, Cua</string>
<string name="network_pref">Xarxa</string>
+ <string name="network_pref_sum">Interval d\'actualització, Controls de baixada, Dades mòbils</string>
<string name="pref_autoUpdateIntervallOrTime_title">Actualitza interval o horari del dia</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Especifica un interval o una hora del dia específica per a refrescar els podcasts automáticament</string>
<string name="pref_autoUpdateIntervallOrTime_message">Pots establir un <i>interval</i> com ara \"cada 2 hores\", establir una <i>hora del dia</i> com ara \"7:00 AM\" o <i>disactiva</i> l\'actualització automàtica del conjunt.\n\n<small>Tingues en compte que les actualitzacions no són exactes i pot donar-se una breu demora.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Desactivar</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Establir interval</string>
@@ -270,8 +374,17 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Desconnexió d\'auriculars</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Connexió d\'auriculars</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Connexió de bluetooth</string>
+ <string name="pref_stream_over_download_title">Preferir streaming</string>
+ <string name="pref_stream_over_download_sum">Mostra botó d\'streaming en compte de botó de descarrega a les llistes</string>
<string name="pref_mobileUpdate_title">Actualitzacions sobre xarxes mòbils</string>
+ <string name="pref_mobileUpdate_sum">Selecciona què és permès a la connexió de la xarxa mòbil</string>
+ <string name="pref_mobileUpdate_refresh">Refrescar podcast</string>
+ <string name="pref_mobileUpdate_images">Cobre images</string>
+ <string name="pref_mobileUpdate_auto_download">Baixada automática</string>
+ <string name="pref_mobileUpdate_episode_download">Baixada d\'episodis</string>
+ <string name="pref_mobileUpdate_streaming">Streaming</string>
<string name="user_interface_label">Interfície d\'usuari</string>
+ <string name="user_interface_sum">Aparença, Ordre de les subscripcions, pantalla de bloqueig</string>
<string name="pref_set_theme_title">Selecciona el tema</string>
<string name="pref_nav_drawer_items_title">Estableix els elements del calaix de navegació</string>
<string name="pref_nav_drawer_items_sum">Canvia els elements que apareixen al calaix de navegació.</string>
@@ -288,6 +401,10 @@
<string name="pref_automatic_download_on_battery_sum">Permet les baixades automàtiques mentre la bateria no es carrega</string>
<string name="pref_parallel_downloads_title">Baixades paral·leles</string>
<string name="pref_episode_cache_title">Memòria cau d\'episodis</string>
+ <string name="pref_episode_cache_summary">Nombre total d\'episodis baixats al dispositiu. La baixada automàtica serà suspesa si s\'arriba a aquest nombre.</string>
+ <string name="pref_episode_cover_title">Usa la coberta de l\'episodi</string>
+ <string name="pref_episode_cover_summary">Usa la coberta específica de l\'episodi quan siga possible. Si no es marca aquesta opció s\'usarà sempre la imatge del podcast com a coberta.</string>
+ <string name="pref_theme_title_use_system">Usa el tema del sistema</string>
<string name="pref_theme_title_light">Clar</string>
<string name="pref_theme_title_dark">Fosc</string>
<string name="pref_theme_title_trueblack">Negra (per AMOLED)</string>
@@ -301,6 +418,7 @@
<string name="pref_gpodnet_logout_toast">Heu sortit de la sessió</string>
<string name="pref_gpodnet_setlogin_information_title">Dades d\'inici de sessió</string>
<string name="pref_gpodnet_setlogin_information_sum">Canvia les dades d\'inici de sessió del vostre compte de gpodder.net</string>
+ <string name="pref_gpodnet_sync_changes_title">Sincronitza ara</string>
<string name="pref_gpodnet_sync_changes_sum">Sincronitza amb gpodder.net les subscripcions i els estats dels episodis.</string>
<string name="pref_gpodnet_full_sync_sum">Sincronitza amb gpodder.net totes les subscripcions i els estats dels episodis.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Connectat com a <i>%1$s</i> amb el dispositiu <i>%2$s</i>]]></string>
diff --git a/core/src/main/res/values-cs/strings.xml b/core/src/main/res/values-cs/strings.xml
index 01f5ad018..ec6f20941 100644
--- a/core/src/main/res/values-cs/strings.xml
+++ b/core/src/main/res/values-cs/strings.xml
@@ -2,6 +2,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activity and fragment titles-->
<string name="feed_update_receiver_name">Aktualizovat sbírky</string>
+ <string name="feeds_label">Podcasty</string>
<string name="statistics_label">Statistiky</string>
<string name="add_feed_label">Přidat podcast</string>
<string name="episodes_label">Epizody</string>
@@ -22,17 +23,27 @@
<string name="gpodnet_auth_label">Login pro gpodder.net</string>
<string name="episode_cache_full_title">Odkládací prostor pro epizody je plný</string>
<string name="episode_cache_full_message">Došlo k zaplnění limitu odkládacího prostoru pro epizody. Můžete navýšit vyhrazený prostor v Nastavení.</string>
+ <string name="playback_statistics_label">Přehrávání</string>
+ <string name="download_statistics_label">Stažené</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Celkový čas poslechnutých podcastů:</string>
<string name="statistics_details_dialog">%1$d z %2$d započatých epizod.\n\nPřehraných %3$s z %4$s.</string>
+ <string name="statistics_mode">Režim statistik</string>
+ <string name="statistics_mode_normal">Počítat skutečně přehraný čas. Tj. 5 minutová epizoda poslechnutá dvakrát je 10 minut, 7 minutová epizoda pouze označená jako poslechnutá je 0 minut.</string>
+ <string name="statistics_mode_count_all">Sečíst délky všech podcastů označených jako poslechnutých.</string>
+ <string name="statistics_speed_not_counted">Upozornění: Rychlost přehrávání se nikdy nebere v potaz.</string>
+ <string name="statistics_reset_data">Vynulovat statistiky</string>
+ <string name="statistics_reset_data_msg">Toto smaže veškerou historii přehrávání pro všechny epizody. Vážně chcete pokračovat?</string>
<!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Celková velikost stažených podcastů:</string>
<!--Main activity-->
<string name="drawer_open">Otevřít menu</string>
<string name="drawer_close">Zavřít menu</string>
<string name="drawer_preferences">Nastavení panelu</string>
- <string name="drawer_feed_order_unplayed_episodes">Řadit dle počtu</string>
+ <string name="drawer_feed_order_unplayed_episodes">Řadit dle čítače</string>
<string name="drawer_feed_order_alphabetical">Řadit abecedně</string>
<string name="drawer_feed_order_last_update">Řadit dle data zveřejnění</string>
+ <string name="drawer_feed_order_most_played">Řadit podle počtu poslechnutých epizod</string>
<string name="drawer_feed_counter_new_unplayed">Počet nových a nepřehraných epizod</string>
<string name="drawer_feed_counter_new">Počet nových epizod</string>
<string name="drawer_feed_counter_unplayed">Počet nepřehraných epizod</string>
@@ -59,6 +70,7 @@
<string name="cover_label">Obrázek</string>
<string name="error_label">Chyba</string>
<string name="error_msg_prefix">Došlo k chybě:</string>
+ <string name="needs_storage_permission">Tato operace vyžaduje oprávnění pro přístup do úložiště</string>
<string name="refresh_label">Obnovit</string>
<string name="external_storage_error_msg">Není dostupné žádné externí uložiště. Pro správnou funkci aplikace se prosím ujistěte, že je připojeno externí úložiště.</string>
<string name="chapters_label">Kapitoly</string>
@@ -73,6 +85,11 @@
<string name="auto_download_apply_to_items_title">Použít na předchozí epizody</string>
<string name="auto_download_apply_to_items_message">Nové nastavení <i>automatického stahování</i> bude použito pro nové epizody.\nChcete ho použít také na epizody zveřejněné dříve?</string>
<string name="auto_delete_label">Automatické mazání epizod</string>
+ <string name="feed_volume_reduction">Snížení hlasitosti</string>
+ <string name="feed_volume_reduction_summary">Snížení hlasitosti epizod tohoto podcastu: %1$s&lt;br&gt;</string>
+ <string name="feed_volume_reduction_off">Vypnuto</string>
+ <string name="feed_volume_reduction_light">Nízké</string>
+ <string name="feed_volume_reduction_heavy">Vysoké</string>
<string name="parallel_downloads_suffix">\u0020paralelních stahování</string>
<string name="feed_auto_download_global">Globální nastavení</string>
<string name="feed_auto_download_always">Vždy</string>
@@ -81,26 +98,53 @@
<string name="episode_cleanup_never">Nikdy</string>
<string name="episode_cleanup_queue_removal">Pokud není ve frontě</string>
<string name="episode_cleanup_after_listening">Po dokončení</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">%d hodinu po dokončení</item>
+ <item quantity="few">%d hodiny po dokončení</item>
+ <item quantity="many">%d hodin po dokončení</item>
+ <item quantity="other">%d hodin po dokončení</item>
+ </plurals>
<plurals name="episode_cleanup_days_after_listening">
<item quantity="one">1 den po dokončení</item>
<item quantity="few">%d dny po dokončení</item>
<item quantity="many">%d dnů po dokončení</item>
<item quantity="other">%d dnů po dokončení</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d vybrána</item>
+ <item quantity="few">%d vybrány</item>
+ <item quantity="many">%d vybráno</item>
+ <item quantity="other">%d vybráno</item>
+ </plurals>
+ <string name="loading_more">Načítají se další…</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Označit vše jako poslechnuté</string>
<string name="mark_all_read_msg">Všechny epizody označeny jako poslechnuté</string>
<string name="mark_all_read_confirmation_msg">Potvrďte prosím, že chcete označit všechny vybrané epizody jako poslechnuté.</string>
+ <string name="mark_all_read_feed_confirmation_msg">Potvrďte prosím, že chcete označit všechny epizody tohoto podcastu jako poslechnuté.</string>
+ <string name="remove_all_new_flags_label">Odstranit příznak „nová“ ze všech epizod</string>
+ <string name="removed_all_new_flags_msg">Příznak „nová“ odstraněn ze všech epizod</string>
+ <string name="remove_all_new_flags_confirmation_msg">Potvrďte prosím, že chcete odstranit příznak „nová“ ze všech epizod.</string>
<string name="show_info_label">Informace o zdroji</string>
+ <string name="show_feed_settings_label">Zobrazit nastavení podcastu</string>
+ <string name="feed_info_label">Informace o podcastu</string>
+ <string name="feed_settings_label">Nastavení podcastu</string>
<string name="rename_feed_label">Přejmenovat podcast</string>
<string name="remove_feed_label">Odstranit podcast</string>
<string name="share_label">Sdílet</string>
<string name="share_link_label">Sdílet URL epizody</string>
<string name="share_link_with_position_label">Sdílet URL epizody s časovou značkou</string>
<string name="share_file_label">Sdílet soubor</string>
+ <string name="share_website_url_label">Sdílet URL webu</string>
+ <string name="share_feed_url_label">Sdílet URL podcastu</string>
<string name="share_item_url_label">Sdílet URL souboru</string>
<string name="share_item_url_with_position_label">Sdílet URL souboru s časovou značkou</string>
+ <string name="feed_delete_confirmation_msg">Potvrďte prosím, že chcete smazat podcast „%1$s“ a VŠECHNY jeho epizody (včetně stažených epizod).</string>
<string name="feed_remover_msg">Odstraňování podcastu</string>
+ <string name="load_complete_feed">Aktualizovat celý podcast</string>
+ <string name="multi_select">Výběr více položek</string>
+ <string name="select_all_above">Vybrat všechny výše</string>
+ <string name="select_all_below">Vybrat všechny níže</string>
<string name="hide_unplayed_episodes_label">Neposlechnuté</string>
<string name="hide_paused_episodes_label">Pozastavené</string>
<string name="hide_played_episodes_label">Poslechnuté</string>
@@ -109,23 +153,67 @@
<string name="hide_downloaded_episodes_label">Stažené</string>
<string name="hide_not_downloaded_episodes_label">Nestažené</string>
<string name="hide_has_media_label">Obsahuje média</string>
+ <string name="hide_is_favorite_label">Je mezi oblíbenými</string>
<string name="filtered_label">Filtrované</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Poslední aktualizace selhala</string>
<string name="open_podcast">Otevřít podcast</string>
+ <string name="please_wait_for_data">Počkejte prosím na dokončení načítání</string>
<!--actions on feeditems-->
<string name="download_label">Stáhnout</string>
+ <plurals name="downloading_batch_label">
+ <item quantity="one">Stahuje se %d epizoda.</item>
+ <item quantity="few">Stahují se %d epizody.</item>
+ <item quantity="many">Stahuje se %d epizod.</item>
+ <item quantity="other">Stahuje se %d epizod.</item>
+ </plurals>
<string name="play_label">Přehrát</string>
<string name="pause_label">Pozastavit</string>
<string name="stream_label">Vysílat</string>
<string name="delete_label">Smazat</string>
<string name="delete_failed">Nelze smazat soubor. Restart přístroje může pomoci.</string>
<string name="delete_episode_label">Smazat epizodu</string>
+ <plurals name="deleted_episode_batch_label">
+ <item quantity="one">%d epizoda stažena.</item>
+ <item quantity="few">%d epizody staženy.</item>
+ <item quantity="many">%d epizod staženo.</item>
+ <item quantity="other">%d epizod staženo.</item>
+ </plurals>
+ <string name="remove_new_flag_label">Odstranit příznak „nová“</string>
+ <string name="removed_new_flag_label">Příznak „nová“ odstraněn</string>
<string name="mark_read_label">Označit jako poslechnuté</string>
<string name="marked_as_read_label">Označeno jako poslechnuté</string>
+ <string name="mark_read_no_media_label">Označit jako poslechnuté</string>
+ <string name="marked_as_read_no_media_label">Označeno jako poslechnuté</string>
+ <string name="play_this_to_seek_position">Pro přeskočení na pozice musíte epizodu přehrát</string>
+ <plurals name="marked_read_batch_label">
+ <item quantity="one">%d epizoda označena jako přehraná</item>
+ <item quantity="few">%d epizody označeny jako přehrané</item>
+ <item quantity="many">%d epizod označeno jako přehrané</item>
+ <item quantity="other">%d epizod označeno jako přehrané</item>
+ </plurals>
<string name="mark_unread_label">Označit jako neposlechnuté</string>
+ <string name="mark_unread_label_no_media">Označit jako nepřečtené</string>
+ <plurals name="marked_unread_batch_label">
+ <item quantity="one">%d epizoda označena jako neposlechnutá</item>
+ <item quantity="few">%d epizody označeny jako neposlechnuté</item>
+ <item quantity="many">%d epizod označeno jako neposlechnuté</item>
+ <item quantity="other">%d epizod označeno jako neposlechnuté</item>
+ </plurals>
<string name="add_to_queue_label">Přidat do fronty</string>
<string name="added_to_queue_label">Přidáno do fronty</string>
+ <plurals name="added_to_queue_batch_label">
+ <item quantity="one">%d epizoda přidána do fronty</item>
+ <item quantity="few">%d epizody přidány do fronty</item>
+ <item quantity="many">%d epizod přidáno do fronty</item>
+ <item quantity="other">%d epizod přidáno do fronty</item>
+ </plurals>
<string name="remove_from_queue_label">Odebrat z fronty</string>
+ <plurals name="removed_from_queue_batch_label">
+ <item quantity="one">%d epizoda odebrána z fronty</item>
+ <item quantity="few">%d epizody odebrány z fronty</item>
+ <item quantity="many">%d epizod odebráno z fronty</item>
+ <item quantity="other">%d epizod odebráno z fronty</item>
+ </plurals>
<string name="add_to_favorite_label">Přidat k oblíbeným</string>
<string name="added_to_favorites">Přidáno k oblíbeným</string>
<string name="remove_from_favorite_label">Odebrat z obíbených</string>
@@ -136,6 +224,7 @@
<string name="deactivate_auto_download">Deaktivovat automatické stahování</string>
<string name="reset_position">Vymazat pozici přehrávání</string>
<string name="removed_item">Položka odebrána</string>
+ <string name="no_items_selected">Nic není vybráno</string>
<!--Download messages and labels-->
<string name="download_successful">úspěšné</string>
<string name="download_pending">Čeká na stažení</string>
@@ -156,6 +245,7 @@
<string name="download_canceled_msg">Stahování zrušeno</string>
<string name="download_canceled_autodownload_enabled_msg">Stahování zrušeno\nVypnuto <i>automatické stahování</i> této položky</string>
<string name="download_report_title">Stahování dokončeno s chybou</string>
+ <string name="auto_download_report_title">Automatické stahování dokončeno</string>
<string name="download_report_content_title">Report stahování</string>
<string name="download_error_malformed_url">Chybné URL</string>
<string name="download_error_io_error">IO chyba</string>
@@ -174,11 +264,15 @@
<string name="download_type_feed">Kanál</string>
<string name="download_type_media">Soubor</string>
<string name="download_request_error_dialog_message_prefix">Nastala chyba při pokusu o stažení souboru:\u0020</string>
+ <string name="null_value_podcast_error">Nebyl poskytnut žádný podcast, co by mohl být zobrazen.</string>
<string name="authentication_notification_title">Vyžadováno ověření</string>
<string name="authentication_notification_msg">Zdroj který jste vybrali vyžaduje zadání uživatelského jména a hesla</string>
<string name="confirm_mobile_download_dialog_title">Potvrdit mobilní stahování</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">Stahování dat přes mobilní připojení je v nastavení vypnuto.\n\nDočasně povolit nebo pouze přidat do fronty?\n\n<small>Tato volba bude platná po dalších 10 minut.</small></string>
<string name="confirm_mobile_download_dialog_message">Stahování dat přes mobilní připojení je v nastavení vypnuto.\n\nDočasně povolit?\n\n<small>Tato volba bude platná po dalších 10 minut.</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Potvrďtě prosím streamování přes mobilní data</string>
+ <string name="confirm_mobile_streaming_notification_message">Streamování přes mobilní data je zakázáno v nastavení. Streamování můžete spustit dotykem, pokud i přesto chcete streamovat přes mobilní data.</string>
+ <string name="confirm_mobile_streaming_button_always">Vždy povolit</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Pouze přidat do fronty</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Dočasně povolit</string>
<!--Mediaplayer messages-->
@@ -188,20 +282,28 @@
<string name="player_ready_msg">Připraven</string>
<string name="player_seeking_msg">Přetáčím</string>
<string name="playback_error_server_died">Server nereaguje</string>
+ <string name="playback_error_unsupported">Nepodporovaný typ média</string>
+ <string name="playback_error_timeout">Vypršel časový limit operace</string>
+ <string name="playback_error_source">Není přístup k mediálnímu souboru</string>
<string name="playback_error_unknown">Neznámá chyba</string>
<string name="no_media_playing_label">Žádné probíhající přehrávání</string>
<string name="player_buffering_msg">Načítání</string>
+ <string name="player_go_to_picture_in_picture">Režim obraz v obraze</string>
<string name="unknown_media_key">AntennaPod - Neznámý klíč médií: %1$d</string>
+ <string name="error_file_not_found">Soubor nebyl nalezen</string>
<!--Queue operations-->
<string name="lock_queue">Zamknout frontu</string>
<string name="unlock_queue">Odemknout frontu</string>
<string name="queue_locked">Fronta zamknuta</string>
<string name="queue_unlocked">Fronta odemknuta</string>
+ <string name="queue_lock_warning">Pokud zamknete frontu, tak nemůžete měnit pořadí epizod tažením.</string>
+ <string name="checkbox_do_not_show_again">Znovu již nezobrazovat</string>
<string name="clear_queue_label">Vyprázdnit frontu</string>
<string name="undo">Zpět</string>
<string name="move_to_top_label">Posunout na začátek</string>
<string name="move_to_bottom_label">Posunout na konec</string>
<string name="sort">Řazení</string>
+ <string name="keep_sorted">Udržovat seřazené</string>
<string name="date">Datum</string>
<string name="duration">Délka</string>
<string name="episode_title">Název epizody</string>
@@ -215,27 +317,57 @@
<!--Variable Speed-->
<string name="download_plugin_label">Stáhnout modul</string>
<string name="no_playback_plugin_title">Modul není nainstalován</string>
+ <string name="no_playback_plugin_or_sonic_msg">Pro správnou funkci proměnlivé rychlosti přehrávání je doporučeno povolit vestavěný přehrávač Sonic.</string>
<string name="set_playback_speed_label">Rychlosti přehrávání</string>
<string name="enable_sonic">Povolit Sonic</string>
<!--Empty list labels-->
+ <string name="no_items_header_label">Žádné epizody ve frontě</string>
+ <string name="no_items_label">Přidejte epizodu stažením nebo dlouhým dotykem a volbou „Přidat do fronty“.</string>
<string name="no_shownotes_label">Tato epizoda neobsahuje žádné poznámky.</string>
<string name="no_run_downloads_head_label">Neběží žádná stahování</string>
+ <string name="no_run_downloads_label">Můžete stáhnout epizody tohoto podcastu z obrazovky s jeho detaily.</string>
+ <string name="no_comp_downloads_head_label">Žádné stažené epizody</string>
+ <string name="no_comp_downloads_label">Můžete stáhnout epizody tohoto podcastu z obrazovky s jeho detaily.</string>
+ <string name="no_log_downloads_head_label">Žádné záznamy o stahování</string>
+ <string name="no_log_downloads_label">Až proběhnou nějaká stahování, tak se záznamy o nich objeví zde.</string>
<string name="no_history_head_label">Žádná historie</string>
+ <string name="no_history_label">Až si poslechnete nějakou epizodu, tak se objeví zde.</string>
<string name="no_all_episodes_head_label">Žádné epizody</string>
+ <string name="no_all_episodes_label">Až si přidáte nějaký podcast, tak se objeví zde.</string>
<string name="no_new_episodes_head_label">Žádné nové epizody</string>
+ <string name="no_new_episodes_label">Až budou zveřejněny nové epizody, tak se objeví zde.</string>
<string name="no_fav_episodes_head_label">Žádné oblíbené epizody</string>
+ <string name="no_fav_episodes_label">Epizody si můžete přidat mezi oblíbené dlouhým dotykem.</string>
+ <string name="no_chapters_head_label">Žádné kapitoly</string>
<string name="no_chapters_label">Tato epizoda nemá žádné kapitoly.</string>
+ <string name="no_subscriptions_head_label">Žádené sbírky</string>
+ <string name="no_subscriptions_label">Pro přidání podcastu do sbírky se dotkněte ikonky plus níže.</string>
<!--Preferences-->
<string name="storage_pref">Úložiště</string>
+ <string name="storage_sum">Automatické mazání epizod, Import, Export</string>
<string name="project_pref">Projekt</string>
<string name="queue_label">Fronta</string>
+ <string name="synchronization_pref">Synchronizace</string>
+ <string name="synchronization_sum">Synchronizace s dalšími zařízeními pomocí služby gpodder.net</string>
+ <string name="automation">Automatizace</string>
+ <string name="download_pref_details">Detaily</string>
<string name="import_export_pref">Importovat/Exportovat</string>
+ <string name="import_export_search_keywords">zálohovat, obnovit</string>
<string name="appearance">Vzhled</string>
+ <string name="external_elements">Externí elementy</string>
+ <string name="interruptions">Přerušení</string>
+ <string name="playback_control">Ovládání přehrávání</string>
+ <string name="preference_search_hint">Vyhledávání…</string>
+ <string name="preference_search_no_results">Žádné výsledky</string>
+ <string name="preference_search_clear_history">Vymazat historii</string>
+ <string name="media_player">Přehrávač médií</string>
<string name="pref_episode_cleanup_title">Vyčistit epizody</string>
<string name="pref_episode_cleanup_summary">Epizody, které nejsou ve frontě a nejsou označeny za oblíbené by mělo být možné smazat, pokud bude funkce automatického stahování potřebovat místo pro nové epizody</string>
<string name="pref_pauseOnDisconnect_sum">Při odpojení sluchátek nebo bluetooth připojení pozastavit přehrávání.</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Pokračovat v přehrávání po připojení sluchátek</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Pokračovat v přehrávání po připojení bluetooth</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Tlačítko rychle vpřed přeskakuje</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Stisk tlačítka rychle vpřed (FF) na připojeném zařízení Bluetooth přeskočí na další epizodu místo rychlého přetočení vpřed.</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Tlačítko zpět restartuje</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Po stlačení hardwarového tlačítka pro posun zpět místo přetočení vpřed restartovat přehrávání aktuální epizody</string>
<string name="pref_followQueue_sum">Po přehrání položky z fronty přejít automaticky na další</string>
@@ -245,10 +377,14 @@
<string name="pref_smart_mark_as_played_title">Chytré označování jako poslechnuté</string>
<string name="pref_skip_keeps_episodes_sum">Neodstraňovat epizody při jejich přeskočení</string>
<string name="pref_skip_keeps_episodes_title">Nemazat přeskočené epizody</string>
+ <string name="pref_favorite_keeps_episodes_sum">Nemazat epizody, které jsou mezi oblíbenými.</string>
<string name="pref_favorite_keeps_episodes_title">Nemazat oblíbené epizody</string>
<string name="playback_pref">Přehrávání</string>
+ <string name="playback_pref_sum">Ovládání tlačítky sluchátek, přeskakování, fronta</string>
<string name="network_pref">Síť</string>
+ <string name="network_pref_sum">Četnost aktualizací, ovládání stahování, mobilní data</string>
<string name="pref_autoUpdateIntervallOrTime_title">Aktualizovat interval nebo čas v průběhu dne</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Zvolte čas mezi aktualizacemi nebo čas v rámci dne, kdy proběhne automatická aktualizace podcastů</string>
<string name="pref_autoUpdateIntervallOrTime_message">Můžete nastavit <i>interval</i> jako třeba \"každé 2 hodiny\", nastavit specifický <i>čas v průběhu dne</i> jako \"7:00\" nebo úplně <i>vypnout</i> automatické aktualizace.\n\n<small>Mějte na paměti: Časy aktualizací nejsou přesné. Možná zaznamenáte krátká zpoždění.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Vypnout</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Nastavit interval</string>
@@ -259,14 +395,24 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Sluchátka odpojena</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Sluchátka připojena</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth připojeno</string>
+ <string name="pref_stream_over_download_title">Upřednostnit streamování</string>
+ <string name="pref_stream_over_download_sum">Zobrazit tlačítko streamovat místo tlačítka stáhnout v seznamech.</string>
<string name="pref_mobileUpdate_title">Mobilní aktualizace</string>
+ <string name="pref_mobileUpdate_sum">Vyberte, co by mělo být povoleno přes mobilní data</string>
+ <string name="pref_mobileUpdate_refresh">Obnovit podcast</string>
+ <string name="pref_mobileUpdate_images">Obrázky podcastů/epizod</string>
+ <string name="pref_mobileUpdate_auto_download">Automatické stahování</string>
+ <string name="pref_mobileUpdate_episode_download">Stahování epizod</string>
+ <string name="pref_mobileUpdate_streaming">Streamování</string>
<string name="user_interface_label">Uživatelské rozhraní</string>
+ <string name="user_interface_sum">Vzhled, poradí ve sbírce, uzamčená obrazovka</string>
<string name="pref_set_theme_title">Vybrat motiv</string>
<string name="pref_nav_drawer_items_title">Změnit navigační panel</string>
<string name="pref_nav_drawer_items_sum">Upravit zobrazení položek v navigačním panelu.</string>
<string name="pref_nav_drawer_feed_order_title">Nastavit pořadí sbírek</string>
<string name="pref_nav_drawer_feed_order_sum">Upravit pořadí vašich sbírek</string>
- <string name="pref_nav_drawer_feed_counter_title">Nastavit počítadlo sbírek</string>
+ <string name="pref_nav_drawer_feed_counter_title">Nastavit čítač sbírek</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Změnit informaci zobrazenou čítačem sbírek. Též ovlivňuje řazení, je-li nastaveno na „podle čítače“.</string>
<string name="pref_set_theme_sum">Změnit vzhled AntennaPod.</string>
<string name="pref_automatic_download_title">Automatické stahování</string>
<string name="pref_automatic_download_sum">Nastavení automatického stahování epizod.</string>
@@ -276,8 +422,13 @@
<string name="pref_automatic_download_on_battery_sum">Povolit automatické stahování i pokud není baterie nabíjena</string>
<string name="pref_parallel_downloads_title">Paralelní stahování</string>
<string name="pref_episode_cache_title">Historie epizod</string>
+ <string name="pref_episode_cache_summary">Celkový počet epizod stažených na zařízení. Automatické stahování se zastaví při dosažení této hodnoty.</string>
+ <string name="pref_episode_cover_title">Použít obrázek epizody</string>
+ <string name="pref_episode_cover_summary">Použít obrázek přímo z epizody, pokud je k dispozici. Není-li tato možnost zaškrtnuta, tak se vžy použije obrázek podcastu.</string>
+ <string name="pref_theme_title_use_system">Použít systémové téma</string>
<string name="pref_theme_title_light">Světlý</string>
<string name="pref_theme_title_dark">Tmavý</string>
+ <string name="pref_theme_title_trueblack">Černá (vhodná pro AMOLED)</string>
<string name="pref_episode_cache_unlimited">Bez omezení</string>
<string name="pref_update_interval_hours_plural">hodin</string>
<string name="pref_update_interval_hours_singular">hodina</string>
@@ -288,21 +439,34 @@
<string name="pref_gpodnet_logout_toast">Úspěšně odhlášeno</string>
<string name="pref_gpodnet_setlogin_information_title">Změna přihlašovacích údajů</string>
<string name="pref_gpodnet_setlogin_information_sum">Změní přihlašovací údaje k vašemu gpodder.net účtu.</string>
+ <string name="pref_gpodnet_sync_changes_title">Synchronizovat ihned</string>
<string name="pref_gpodnet_sync_changes_sum">Synchronizovat odběr a změny stavu epizody s gpodder.net.</string>
+ <string name="pref_gpodnet_full_sync_title">Synchronizovat vše ihned</string>
<string name="pref_gpodnet_full_sync_sum">Synchronizovat všechny odběry a stav epizod s gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Přihlášen jako <i>%1$s</i> z přístroje <i>%2$s</i>]]></string>
- <string name="pref_gpodnet_notifications_title">Zobrazovat upozornění na chyby synchronizace</string>
+ <string name="pref_gpodnet_notifications_title">Zobrazovat oznámení o chybách synchronizace</string>
<string name="pref_gpodnet_notifications_sum">Toto nastavení se netýká chyb přihlášení.</string>
<string name="pref_playback_speed_title">Rychlosti přehrávání</string>
<string name="pref_playback_speed_sum">Přizpůsobení rychlosti je dostupné pro přehrávání zvuku různými rychlostmi</string>
+ <string name="pref_feed_playback_speed_sum">Rychlost, která bude použita při zahájení přehrávání epizod tohoto podcastu</string>
+ <string name="pref_feed_skip">Automatické přeskočení</string>
+ <string name="pref_feed_skip_sum">Přeskočit úvod a závěr.</string>
+ <string name="pref_feed_skip_ending">Přeskočit posledních</string>
+ <string name="pref_feed_skip_intro">Přeskočit prvních</string>
+ <string name="pref_feed_skip_ending_toast">Přeskočeno posledních %d sekund</string>
+ <string name="pref_feed_skip_intro_toast">Přeskočeno prvních %d sekund</string>
+ <string name="pref_playback_time_respects_speed_title">Upravit informace o médiu vzhledem k rychlosti přehrávání.</string>
+ <string name="pref_playback_time_respects_speed_sum">Zobrazené délka a pozice jsou upravené vzhledem k rychlosti přehrávání</string>
<string name="pref_fast_forward">Délka času posunu vpřed</string>
+ <string name="pref_fast_forward_sum">Upravit o kolik sekund se přeskočí dopředu při stisku tlačítka rychle vpřed (FF).</string>
<string name="pref_rewind">Délka času posunu zpět</string>
+ <string name="pref_rewind_sum">Upravit o kolik sekund se přeskočí zpět při stisku tlačítka přetočit zpět (RW).</string>
<string name="pref_gpodnet_sethostname_title">Nastavit hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Použít přednastaveného hosta</string>
- <string name="pref_expandNotify_title">Vysoká priorita pro upozornění</string>
+ <string name="pref_expandNotify_title">Vysoká priorita pro oznámení</string>
<string name="pref_expandNotify_sum">Toto obvykle přidá tlačítka ovládání přehrávání do zpráv upozornění</string>
<string name="pref_persistNotify_title">Pevné ovládání přehrávání</string>
- <string name="pref_persistNotify_sum">Zachovat upozornění a ovládání na obrazovce uzamčení i při pozastaveném přehrávání.</string>
+ <string name="pref_persistNotify_sum">Zachovat oznámení a ovládání na obrazovce uzamčení i při pozastaveném přehrávání.</string>
<string name="pref_compact_notification_buttons_title">Nastavení tlačítek uzamčené obrazovky</string>
<string name="pref_compact_notification_buttons_sum">Změnit tlačítka ovládání na obrazovce uzamčení. Tlačítka přehrát/pozastavit jsou vždy zobrazena.</string>
<string name="pref_compact_notification_buttons_dialog_title">Vybrat maximálně %1$d položek</string>
@@ -311,27 +475,89 @@
<string name="pref_lockscreen_background_sum">Nastavit pozadí uzamčené obrazovky na obrázek aktuální epizody. Jako vedlejší efekt zobrazí toto nastavení obrázek i v aplikacích třetích stran. </string>
<string name="pref_showDownloadReport_title">Zobrazit report stahování</string>
<string name="pref_showDownloadReport_sum">Pokud selže stahování, vygenerovat report zobrazující detaily o chybě.</string>
- <string name="pref_expand_notify_unsupport_toast">Verze Androidu nižší než 4.1 nepodporují rozšířená upozornění.</string>
+ <string name="pref_showAutoDownloadReport_title">Zobrazovat hlášení automatického stahování</string>
+ <string name="pref_showAutoDownloadReport_sum">Zobrazovat oznámení o automaticky stažených epizodách.</string>
+ <string name="pref_expand_notify_unsupport_toast">Verze Androidu nižší než 4.1 nepodporují rozšířená oznámení.</string>
+ <string name="pref_enqueue_location_title">Pozice přidávání do fronty</string>
+ <string name="pref_enqueue_location_sum">Přidávat epizody na: %1$s</string>
+ <string name="enqueue_location_back">konec</string>
+ <string name="enqueue_location_front">začátek</string>
+ <string name="enqueue_location_after_current">za hrající epizodu</string>
<string name="pref_smart_mark_as_played_disabled">Vypnuto</string>
<string name="pref_image_cache_size_title">Velikost odkládací paměti obrázků</string>
<string name="pref_image_cache_size_sum">Velikost diskové paměti pro obrázky.</string>
+ <string name="visit_user_forum">Uživatelské fórum</string>
+ <string name="bug_report_title">Nahlásit chybu</string>
+ <string name="open_bug_tracker">Otevřít systém pro sledování a hlášení chyb (bug tracker)</string>
+ <string name="export_logs">Exportovat záznamy</string>
+ <string name="copy_to_clipboard">Zkopírovat do schránky</string>
+ <string name="copied_to_clipboard">Zkopírováno do schránky</string>
<string name="experimental_pref">Experimentální</string>
+ <string name="pref_media_player_message">Vybrat přehrávač pro přehrávání souborů</string>
<string name="pref_current_value">Aktuální hodnota: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Nastavit síťovou proxy</string>
+ <string name="pref_faq">Často kladené otázky</string>
<string name="pref_no_browser_found">Webový prohlížeč nenalezen.</string>
<string name="pref_cast_title">Chromecast podpora</string>
<string name="pref_cast_message_play_flavor">Povolit podporu vzdáleného přehrávání médií na Cast přístrojích (jako třeba Chromecast, Audio Speakers nebo Android TV)</string>
<string name="pref_cast_message_free_flavor">Chromecast vyžaduje proprietární knihovny třetích stran, které jsou vypnuty v této verzi AntennaPod</string>
+ <string name="pref_enqueue_downloaded_title">Zařadit stažené</string>
+ <string name="pref_enqueue_downloaded_summary">Přidat stažené epizody do fronty</string>
+ <string name="media_player_builtin">Vestavěný přehrávač Androidu</string>
+ <string name="media_player_switch_to_exoplayer">Přepnout na ExoPlayer</string>
+ <string name="media_player_switched_to_exoplayer">Přepnuto na ExoPlayer</string>
<string name="pref_skip_silence_title">Přeskočit ticho v audio souboru</string>
+ <string name="pref_videoBehavior_title">Při opuštění videa</string>
+ <string name="pref_videoBehavior_sum">Chování při opuštění videa</string>
+ <string name="stop_playback">Zastavit přehrávání</string>
+ <string name="continue_playback">Pokračovat v přehrávání zvuku</string>
+ <string name="behavior">Chování</string>
+ <string name="pref_back_button_behavior_title">Chování tlačítka zpět</string>
+ <string name="pref_back_button_behavior_sum">Změnit chování tlačítka zpět.</string>
+ <string name="back_button_default">Výchozí</string>
+ <string name="back_button_open_drawer">Otevřít hamburgrové menu</string>
+ <string name="back_button_double_tap">Zavřít aplikaci dvojitým dotykem</string>
+ <string name="back_button_show_prompt">Potvrdit ukončení aplikace</string>
+ <string name="close_prompt">Skutečně chcete zavřít AntennaPod?</string>
+ <string name="double_tap_toast">Znovu se dotkněte tlačítka zpět pro ukončení aplikace</string>
+ <string name="back_button_go_to_page">Přejít na stránku…</string>
+ <string name="back_button_go_to_page_title">Vybrat stránku</string>
+ <string name="pref_delete_removes_from_queue_title">Mazání také odstraňuje epizody z fronty</string>
+ <string name="pref_delete_removes_from_queue_sum">Automaticky odstraní epizodu z fronty poté, co je smazána.</string>
<!--About screen-->
<string name="about_pref">O aplikaci</string>
+ <string name="antennapod_version">Verze aplikace AntennaPod</string>
+ <string name="contributors">Přispěvatelé</string>
+ <string name="contributors_summary">Kdokoli může pomoct vylepšit AntennaPod – kódem, překlady nebo pomáháním ostatním v našem fóru</string>
+ <string name="developers">Vývojáři</string>
+ <string name="translators">Překladatelé</string>
+ <string name="special_thanks">Zvláštní poděkování</string>
+ <string name="privacy_policy">Zásady ochrany osobních údajů</string>
+ <string name="licenses">Licence</string>
+ <string name="licenses_summary">AntennaPod používá další skvělý software</string>
<!--Search-->
<string name="search_status_no_results">Žádné výsledky</string>
<string name="search_label">Vyhledat</string>
<string name="no_results_for_query">Nebyly nalezeny žádné výsledky pro \"%1$s\"</string>
<!--Synchronization-->
+ <string name="sync_status_started">Synchronizace započala</string>
+ <string name="sync_status_episodes_upload">Nahrávají se změny epizod…</string>
+ <string name="sync_status_episodes_download">Stahují se změny epizod…</string>
+ <string name="sync_status_upload_played">Nahrává se stav poslechnutí…</string>
+ <string name="sync_status_subscriptions">Synchronizují se sbírky…</string>
+ <string name="sync_status_success">Synchronizace proběhla úspěšně</string>
+ <string name="sync_status_error">Synchronizace selhala</string>
<!--import and export-->
+ <string name="import_export_summary">Přesunout zbírky a frontu do jiného zařízení</string>
+ <string name="database">Databáze</string>
+ <string name="opml">OPML</string>
+ <string name="html">HTML</string>
+ <string name="html_export_summary">Ukažte své sbírky přátelům</string>
+ <string name="opml_export_summary">Přenést sbírky do jiné podcastové aplikace</string>
+ <string name="opml_import_summary">Importovat vaše sbírky z jiné podcastové aplikace</string>
+ <string name="database_export_summary">Přenést sbírky, poslechnuté epizody a frontu do aplikace AntennaPod na jiném zařízení</string>
+ <string name="database_import_summary">Importovat AntennaPod databázi z jiného zařízení</string>
<string name="opml_import_label">OPML import</string>
<string name="opml_reader_error">Došlo k chybě při čtení OPML dokumentu:</string>
<string name="opml_import_error_no_file">Nebyl vybrán žádný soubor!</string>
@@ -339,17 +565,26 @@
<string name="deselect_all_label">Zrušit výběr</string>
<string name="opml_export_label">OPML export</string>
<string name="html_export_label">HTML export</string>
+ <string name="database_export_label">Export databáze</string>
+ <string name="database_import_label">Import databáze</string>
+ <string name="database_import_warning">Importem databáze nahradíte všechny svoje sbírky a historii poslechu. Doporučujeme nejdřív zvážit exportování současné databáze pro případnou obnovu. Vážně chcete databázi nahradit?</string>
+ <string name="please_wait">Čekejte prosím…</string>
<string name="export_error_label">Chyba exportu</string>
<string name="export_success_title">Export úspěšný</string>
<string name="export_success_sum">Exportovaný soubor zapsán do:\n\n%1$s</string>
<string name="opml_import_ask_read_permission">Pro přečtení OPML souboru je vyžadován přístup k externímu úložišti</string>
<string name="import_select_file">Vybrat soubor pro import</string>
<string name="import_ok">Import úspěšný.\n\nPotvrďte restart AntennaPod tlačítkem OK</string>
+ <string name="import_no_downgrade">Tato databáze byla exportována z novější verze aplikace AntennaPod. Vaše instalovaná verze není schopná ji zpracovat.</string>
+ <string name="favorites_export_label">Export oblíbených</string>
+ <string name="favorites_export_summary">Exportovat oblíbené do souboru</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Nastavit časovač vypnutí</string>
<string name="disable_sleeptimer_label">Deaktivovat časovač vypnutí</string>
<string name="sleep_timer_label">Časovač vypnutí</string>
<string name="time_dialog_invalid_input">Neplatný vstup, musí být zadáno celé číslo</string>
+ <string name="shake_to_reset_label">Restartujte zatřesením</string>
+ <string name="timer_vibration_label">Krátce zavibrovat před koncem</string>
<string name="time_seconds">sekund</string>
<string name="time_minutes">minut</string>
<string name="time_hours">hodin</string>
@@ -404,12 +639,14 @@
<string name="gpodnetsync_error_descr">V průběhu synchronizace nastala chyba:\u0020</string>
<string name="gpodnetsync_pref_report_successful">Úspěšné</string>
<string name="gpodnetsync_pref_report_failed">Selhalo</string>
+ <string name="gpodnetsync_username_characters_error">Uživatelské jméno může obsahovat pouze písmena, čísla, pomlčky a podtržítka.</string>
<!--Directory chooser-->
<string name="selected_folder_label">Vybraný adresář:</string>
<string name="create_folder_label">Vytvořit adresář</string>
<string name="choose_data_directory">Vybrat umístění dat</string>
<string name="choose_data_directory_message">Vyberte prosím váš výchozí datový adresář. AntennaPod vytvoří všechny potřebné podadresáře.</string>
<string name="choose_data_directory_permission_rationale">Ke změně datového adresáře je vyžadován přístup k externímu úložišti</string>
+ <string name="choose_data_directory_available_space">%1$s z %2$s zdarma</string>
<string name="create_folder_msg">Vytvořit adresář \"%1$s\"?</string>
<string name="create_folder_success">Nový adresář vytvořen</string>
<string name="create_folder_error_no_write_access">Nelze zapisovat do adresáře</string>
@@ -428,16 +665,25 @@
<string name="pref_restart_required">Pro aktivování změn nastavení bylo třeba restartovat aplikaci AntennaPod.</string>
<!--Online feed view-->
<string name="subscribe_label">Odebírat</string>
+ <string name="subscribing_label">Přidává se do sbírky…</string>
+ <string name="preview_episode">Spustit ukázku</string>
+ <string name="stop_preview">Zastavit ukázku</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Posunout zpět</string>
<string name="fast_forward_label">Posunout vpřed</string>
+ <string name="increase_speed">Zvýšit rychlost</string>
+ <string name="decrease_speed">Snížit rychlost</string>
<string name="media_type_audio_label">Audio</string>
<string name="media_type_video_label">Video</string>
<string name="navigate_upwards_label">Navigovat vzhůru</string>
<string name="status_downloading_label">Epizoda je právě stahována</string>
<string name="in_queue_label">Epizoda je ve frontě</string>
+ <string name="is_favorite_label">Epizoda je označená jako oblíbená</string>
<string name="drag_handle_content_description">Tahem změnit pozici této položky</string>
<string name="load_next_page_label">Načíst další stranu</string>
+ <string name="switch_pages">Přehodit stránku</string>
+ <string name="position">Pozice: %1$s</string>
+ <string name="apply_action">Vykonat</string>
<!--Feed information screen-->
<string name="authentication_label">Ověření</string>
<string name="authentication_descr">Změnit uživatelské jméno a heslo pro tento podcast a jeho epizody.</string>
@@ -448,15 +694,22 @@
<string name="episode_filters_exclude">Vyřadit</string>
<string name="episode_filters_hint">Jednoslovné \n\"Víceslovné\"</string>
<string name="keep_updated">Udržovat aktuální</string>
+ <string name="keep_updated_summary">Zahrnout tento podcast při (automatickém) obnovování všech podcastů</string>
+ <string name="auto_download_disabled_globally">Automatické stahování je zakázané v hlavním nastavení AntennaPodu</string>
<!--Progress information-->
<string name="progress_upgrading_database">Probíhá aktualizace databáze</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Importuji odběry z jednoúčelových aplikací...</string>
<!--Add podcast fragment-->
+ <string name="search_podcast_hint">Vyhledat podcast…</string>
<string name="search_itunes_label">Prohledat iTunes</string>
<string name="search_fyyd_label">Prohledat fyyd</string>
+ <string name="advanced">Pokročilé</string>
+ <string name="add_podcast_by_url">Přidat podcast pomocí URL</string>
<string name="browse_gpoddernet_label">Prohledávat gpodder.net</string>
+ <string name="discover">Objevit</string>
<string name="discover_more">více »</string>
+ <string name="search_powered_by">Vyhledávání poskytuje %1$s</string>
<string name="filter">Filtr</string>
<!--Episodes apply actions-->
<string name="all_label">Vše</string>
@@ -484,6 +737,12 @@
<string name="sort_date_old_new">Data (Staré \u2192 Nové)</string>
<string name="sort_duration_short_long">Délka (Krátké \u2192 Dlouhé)</string>
<string name="sort_duration_long_short">Délka (Dlouhé \u2192 Krátké)</string>
+ <string name="sort_a_z">A \u2192 Ž</string>
+ <string name="sort_z_a">Ž \u2192 A</string>
+ <string name="sort_new_old">Nové \u2192 Staré</string>
+ <string name="sort_old_new">Staré \u2192 Nové</string>
+ <string name="sort_short_long">Krátké \u2192 Dlouhé</string>
+ <string name="sort_long_short">Dlouhé \u2192 Krátké</string>
<!--Rating dialog-->
<string name="rating_title">Líbí se vám AntennaPod?</string>
<string name="rating_message">Oceníme, pokud věnujete chvíli času ohodnocení AntennaPod.</string>
@@ -499,6 +758,7 @@
<string name="audio_effects">Audio efekty</string>
<string name="stereo_to_mono">Downmix: Stereo na mono</string>
<string name="sonic_only">Pouze Sonic</string>
+ <string name="exoplayer_only">Pouze pro ExoPlayer</string>
<!--proxy settings-->
<string name="proxy_type_label">Typ</string>
<string name="host_label">Host</string>
@@ -512,6 +772,7 @@
<string name="proxy_host_invalid_error">Host není platná IP nebo doména</string>
<string name="proxy_port_invalid_error">Neplatný port</string>
<!--Subscriptions fragment-->
+ <string name="subscription_num_columns">Počet sloupců</string>
<!--Casting-->
<string name="cast_media_route_menu_title">Přehrát na...</string>
<string name="cast_disconnect_label">Odpojit sezení vysílání</string>
@@ -527,7 +788,22 @@
<string name="cast_failed_receiver_player_error">Přijímač zaznamenal závažnou chybu</string>
<string name="cast_failed_media_error_skipping">Chyba přehrávání médií. Přeskakuji...</string>
<!--Notification channels-->
+ <string name="notification_channel_user_action">Je vyžadována činnost z vaší strany</string>
+ <string name="notification_channel_user_action_description">Zobrazuje se, pokud je požadována činnost z vaší strany. Například je-li potřeba zadat heslo.</string>
<string name="notification_channel_downloading">Stahuji</string>
+ <string name="notification_channel_downloading_description">Zobrazuje se v průběhu stahování.</string>
+ <string name="notification_channel_playing">Přehrává se</string>
+ <string name="notification_channel_playing_description">Umožňuje ovládat přehrávání. Toto je to hlavní oznámení, které uvidité při přehrávání podcastu.</string>
+ <string name="notification_channel_error">Chyby</string>
+ <string name="notification_channel_error_description">Zobrazuje se, když se něco nepovedlo. Například pokud selhalo stahování anebo synchronizace gpodder.</string>
+ <string name="notification_channel_auto_download">Automatické stahování</string>
+ <string name="notification_channel_episode_auto_download">Zobrazuje se po automatickém stažení epizod.</string>
<!--Widget settings-->
+ <string name="widget_settings">Nastavení widgetu</string>
+ <string name="widget_create_button">Vytvořit widget</string>
+ <string name="widget_opacity">Průhlednost</string>
<!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Nastavení úspěšně aktualizováno</string>
+ <string name="on_demand_config_stream_text"> Vypadá to, že častěji streamujete než stahujete. Chcete zobrazovat tlačítko streamovat v seznamu epizod? </string>
+ <string name="on_demand_config_download_text">Vypadá to, že častěji stahujete než streamujete. Chcete zobrazovat tlačítko stáhnout v seznamu epizod?</string>
</resources>
diff --git a/core/src/main/res/values-da/strings.xml b/core/src/main/res/values-da/strings.xml
index 479492a7f..01026e021 100644
--- a/core/src/main/res/values-da/strings.xml
+++ b/core/src/main/res/values-da/strings.xml
@@ -85,7 +85,7 @@
<string name="auto_download_apply_to_items_message">Den nye <i>Automatisk overførsel</i>-indstilling vil automatisk blive anvendt på nye udsendelser.\nVil du også anvende den på tidligere udsendelser?</string>
<string name="auto_delete_label">Slet udsendelser automatisk</string>
<string name="feed_volume_reduction">Lydstyrkereduktion</string>
- <string name="feed_volume_reduction_summary">Skru lyd ned for episoder i dette feed</string>
+ <string name="feed_volume_reduction_summary">Skrug lyd ned for episoder i dette feed</string>
<string name="feed_volume_reduction_off">Fra</string>
<string name="feed_volume_reduction_light">Lidt</string>
<string name="feed_volume_reduction_heavy">Meget</string>
@@ -296,6 +296,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Hent plugin</string>
<string name="no_playback_plugin_title">Plugin er ikke installeret</string>
+ <string name="no_playback_plugin_or_sonic_msg">For ændring af afspilningshastighed, vi forslår at bruge den indbyggede Sonic medie afspiller.</string>
<string name="set_playback_speed_label">Afspilningshastigheder</string>
<string name="enable_sonic">Slå Sonic til</string>
<!--Empty list labels-->
@@ -305,6 +306,7 @@
<string name="no_run_downloads_head_label">Ingen overførsler i gang</string>
<string name="no_run_downloads_label">Du kan downloade episode ved podcastens beskrivelse</string>
<string name="no_comp_downloads_head_label">Ingen overførte udsendelser</string>
+ <string name="no_comp_downloads_label">Du kan downloade episoden på podcastens detaljerede skærm. </string>
<string name="no_log_downloads_head_label">Ingen overførselslog</string>
<string name="no_log_downloads_label">Download raport vil blive vist her når muligt</string>
<string name="no_history_head_label">Ingen historik</string>
@@ -333,6 +335,7 @@
<string name="appearance">Udseende</string>
<string name="external_elements">Externe elementer</string>
<string name="interruptions">Afbrydelser</string>
+ <string name="playback_control">Afspilningskontrol</string>
<string name="preference_search_hint">Søg...</string>
<string name="preference_search_no_results">Ingen resultater</string>
<string name="preference_search_clear_history">Slet historik</string>
@@ -343,6 +346,7 @@
<string name="pref_unpauseOnHeadsetReconnect_sum">Genoptag afspilning når hovedtelefonerne tilsluttes igen</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Genoptag afspilning når bluetooth forbinder igen</string>
<string name="pref_hardwareForwardButtonSkips_title">Fremadknap springer over</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Når der trykkes på næste knappen på de tilsluttede høretelefoner, skift til næste episode istedet for at springe frem.</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Tilbageknap genstarter</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Når der trykkes på en fysisk tilbageknap, skal den aktuelle udsendelse afspilles forfra i stedet for at der spoles tilbage.</string>
<string name="pref_followQueue_sum">Spring til næste element i køen når afspilningen er færdig</string>
@@ -355,8 +359,11 @@
<string name="pref_favorite_keeps_episodes_sum">Behold udsendelser, som er markeret som foretrukne</string>
<string name="pref_favorite_keeps_episodes_title">Behold foretrukne udsendelser</string>
<string name="playback_pref">Afspilning</string>
+ <string name="playback_pref_sum">Hovedtelefon kontrol, Overspring intervaller, Kø</string>
<string name="network_pref">Netværk</string>
+ <string name="network_pref_sum">Opdateringsinterval, hente kontroller, mobildata</string>
<string name="pref_autoUpdateIntervallOrTime_title">Opdateringsinterval eller -klokkeslæt</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Spicifik interval, eller spicifik tid på dagen, genindlæs podcasts automatisk</string>
<string name="pref_autoUpdateIntervallOrTime_message">Du kan indstille et <i>interval</i> som \"hver anden time\", indstille et bestemt <i>klokkeslæt</i> som \"7:00\", eller <i>slå</i> automatiske opdateringer helt <i>fra</i>.\n\n<small>Bemærk: Opdateringstider er ikke eksakte. Du kan opleve en kort forsinkelse.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Slå fra</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Indstil interval</string>
@@ -368,19 +375,23 @@
<string name="pref_unpauseOnHeadsetReconnect_title">Tilslutning af hovedtelefoner igen</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth forbundet igen</string>
<string name="pref_stream_over_download_title">Foretræk streaming</string>
+ <string name="pref_stream_over_download_sum">Vis stream knap, i stedet for download knap i listen.</string>
<string name="pref_mobileUpdate_title">Mobile opdateringer</string>
+ <string name="pref_mobileUpdate_sum">Vælg hvad der skal være tilladt via mobil data forbindelse</string>
<string name="pref_mobileUpdate_refresh">Opdatere podcast</string>
<string name="pref_mobileUpdate_images">Omslag billeder</string>
<string name="pref_mobileUpdate_auto_download">Hent automatisk</string>
<string name="pref_mobileUpdate_episode_download">Download af udsendelser</string>
<string name="pref_mobileUpdate_streaming">Streaming</string>
<string name="user_interface_label">Brugergrænseflade</string>
+ <string name="user_interface_sum">Udseende, abonnements ordre, låseskærm</string>
<string name="pref_set_theme_title">Vælg tema</string>
<string name="pref_nav_drawer_items_title">Vælg elementer i navigationspanelet</string>
<string name="pref_nav_drawer_items_sum">Vælg hvilke elementer, der skal vises i navigationspanelet.</string>
<string name="pref_nav_drawer_feed_order_title">Vælg abonnementsorden</string>
<string name="pref_nav_drawer_feed_order_sum">Ændr rækkefølgen af dine abonnementer</string>
<string name="pref_nav_drawer_feed_counter_title">Indstil abonnementstæller</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Ændre informationen vist af abonnoment tæller. Ændre også ved abonnement rækkefølge, hvis abonnement rækkefølge er sat til \'Tæller\'</string>
<string name="pref_set_theme_sum">Ændr AntennaPods udseende.</string>
<string name="pref_automatic_download_title">Automatisk overførsel</string>
<string name="pref_automatic_download_sum">Konfigurer automatisk overførsel af udsendelser</string>
@@ -390,7 +401,9 @@
<string name="pref_automatic_download_on_battery_sum">Tillad automatisk overførsel, når batteriet ikke oplades</string>
<string name="pref_parallel_downloads_title">Parallelle overførsler</string>
<string name="pref_episode_cache_title">Mellemlager for udsendelser</string>
+ <string name="pref_episode_cache_summary">Total nummer af episoder downloades på din enhed. Stop automatisk download, når dette nummer nåes.</string>
<string name="pref_episode_cover_title">Brug afsnit omslag</string>
+ <string name="pref_episode_cover_summary">Brug det specifikke episode cover, når muligt. Hvis tændt, vil app\'en altid bruge podcast cover billedet.</string>
<string name="pref_theme_title_use_system">Brug systemtema</string>
<string name="pref_theme_title_light">Lys</string>
<string name="pref_theme_title_dark">Mørk</string>
@@ -407,13 +420,22 @@
<string name="pref_gpodnet_setlogin_information_sum">Ændr din gpodder.net-kontos loginoplysninger.</string>
<string name="pref_gpodnet_sync_changes_title">Synkroniser nu</string>
<string name="pref_gpodnet_sync_changes_sum">Synkroniser tilstandsændringer for abonnementer og udsendelser med gpodder.net.</string>
+ <string name="pref_gpodnet_full_sync_title">Tving fuld synkronisering</string>
<string name="pref_gpodnet_full_sync_sum">Synkroniser tilstande for alle abonnementer og udsendelser med gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Logget ind som <i>%1$s</i> med enheden <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Vis notifikationer med synkroniseringsfejl</string>
<string name="pref_gpodnet_notifications_sum">Denne indstilling vedrører ikke godkendelsesfejl.</string>
<string name="pref_playback_speed_title">Afspilningshastigheder</string>
<string name="pref_playback_speed_sum">Tilpas tilgængelige hastigheder for lydafspilning med variabel hastighed</string>
+ <string name="pref_feed_playback_speed_sum">Hastighed, der skal bruges, når lydafspilning startes til afsnit i denne podcast</string>
<string name="pref_feed_skip">Overspring automatisk</string>
+ <string name="pref_feed_skip_sum">Overspring introduktioner og slut kreditter.</string>
+ <string name="pref_feed_skip_ending">Overspring sidste</string>
+ <string name="pref_feed_skip_intro">Overspring første</string>
+ <string name="pref_feed_skip_ending_toast">Overspring sidste %d sekunder</string>
+ <string name="pref_feed_skip_intro_toast">Overspring første %d sekunder</string>
+ <string name="pref_playback_time_respects_speed_title">Justere medie information for afspilningshastighed</string>
+ <string name="pref_playback_time_respects_speed_sum">Vist position og varighed er tilpasset afspilningshastighed</string>
<string name="pref_fast_forward">Tidshop for fremadspoling</string>
<string name="pref_fast_forward_sum">Indstil antallet af sekunder, der skal springes fremad, når der trykkes på fremadspolingsknappen</string>
<string name="pref_rewind">Tidshop for tilbagespoling</string>
@@ -450,9 +472,11 @@
<string name="copy_to_clipboard">Kopier til udklipsholder</string>
<string name="copied_to_clipboard">Kopieret til udklipsholder</string>
<string name="experimental_pref">Eksperimentelt</string>
+ <string name="pref_media_player_message">Vlg hvilken medieafspiller der skal bruges for at afspille filer</string>
<string name="pref_current_value">Nuværende værdi: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Indstil en netværksproxy</string>
+ <string name="pref_faq">Ofte Stillede Spørgsmål</string>
<string name="pref_no_browser_found">Ingen webbrowser fundet</string>
<string name="pref_cast_title">Chromecast-understøttelse</string>
<string name="pref_cast_message_play_flavor">Aktiver understøttelse af fjernafspilning på Cast-enheder (såsom Chromecast, højttalere med indbygget Chromecast, eller Android TV)</string>
@@ -462,6 +486,7 @@
<string name="media_player_builtin">Indbygget Android-afspiller</string>
<string name="media_player_switch_to_exoplayer">Skift til ExoPlayer</string>
<string name="media_player_switched_to_exoplayer">Skiftet til ExoPlayer.</string>
+ <string name="pref_skip_silence_title">Overspring stilhed i lyd</string>
<string name="pref_videoBehavior_title">Når videoen forlades</string>
<string name="pref_videoBehavior_sum">Opførsel når videoafspilning forlades</string>
<string name="stop_playback">Stop afspilning</string>
@@ -477,24 +502,41 @@
<string name="double_tap_toast">Tryk på tilbageknappen igen for at afslutte</string>
<string name="back_button_go_to_page">Gå til side ...</string>
<string name="back_button_go_to_page_title">Vælg side</string>
+ <string name="pref_delete_removes_from_queue_title">Slet fjernet fra kø</string>
+ <string name="pref_delete_removes_from_queue_sum">Fjern automatisk afsnit fra køen, når den slettes.</string>
<!--About screen-->
<string name="about_pref">Om</string>
<string name="antennapod_version">AntennaPod version</string>
+ <string name="contributors">Bidragere</string>
+ <string name="contributors_summary">Alle kan hjælpe med at lave AntennaPod bedre - med kode, oversættelse eller hjælpe brugere i vores forum</string>
<string name="developers">Udviklere</string>
<string name="translators">Oversættere</string>
+ <string name="special_thanks">Særlig tak</string>
<string name="privacy_policy">Privatlivspolitik</string>
<string name="licenses">Licenser</string>
+ <string name="licenses_summary">AntennaPod bruger anden fantastisk software</string>
<!--Search-->
<string name="search_status_no_results">Fandt ingen resultater</string>
<string name="search_label">Søg</string>
<string name="no_results_for_query">Ingen resultater fundet for \"%1$s\"</string>
<!--Synchronization-->
<string name="sync_status_started">Synkronisering startet</string>
+ <string name="sync_status_episodes_upload">Overfører udsendelse ændringer...</string>
+ <string name="sync_status_episodes_download">Henter udsendelse ændringer...</string>
+ <string name="sync_status_upload_played">Overfører afspillet status...</string>
+ <string name="sync_status_subscriptions">Synkroniserer abonnementer...</string>
+ <string name="sync_status_success">Synkroniseret</string>
<string name="sync_status_error">Synkronisering mislykkedes</string>
<!--import and export-->
+ <string name="import_export_summary">Flyt abonnementer og kø til anden enhed</string>
<string name="database">Database</string>
<string name="opml">OPML</string>
<string name="html">HTML</string>
+ <string name="html_export_summary">Vis abonnementer</string>
+ <string name="opml_export_summary">Flyt abonnementer til anden podcast program</string>
+ <string name="opml_import_summary">Importerer abonnementer fra anden podcast program</string>
+ <string name="database_export_summary">Flyt abonnementer, aflyttede afsnit og kø til AntennaPod på en anden enhed</string>
+ <string name="database_import_summary">Importere AntennaPod database fra anden enhed</string>
<string name="opml_import_label">OPML-import</string>
<string name="opml_reader_error">Der opstod en fejl, da OPML-dokumentet blev forsøgt indlæst</string>
<string name="opml_import_error_no_file">Ingen fil valgt!</string>
@@ -504,6 +546,7 @@
<string name="html_export_label">HTML-eksport</string>
<string name="database_export_label">Eksportere database</string>
<string name="database_import_label">Importere database</string>
+ <string name="database_import_warning">Importerong af ny database vil overskrive alle dine nuværende abonnenter og lytte historik. Du burde exportere din nuværende database som en backup. Vil du overskrive?</string>
<string name="please_wait">Vent...</string>
<string name="export_error_label">Eksportfejl</string>
<string name="export_success_title">Eksport lykkedes</string>
@@ -511,12 +554,16 @@
<string name="opml_import_ask_read_permission">Adgang til eksternt lager er påkrævet for at læse OPML-filen</string>
<string name="import_select_file">Vælg fil til import</string>
<string name="import_ok">Importen lykkedes.\n\nTryk venligst OK for at genstarte AntennaPod</string>
+ <string name="import_no_downgrade">Databasen var exporteret af en nyere version af AntennaPod. Din nuværende installation ved ikke endnu hvordan den skal håndtere denne fil.</string>
+ <string name="favorites_export_label">Foretrukne eksport</string>
+ <string name="favorites_export_summary">Eksportere gemte foretrukne til fil</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Indstil søvntimer</string>
<string name="disable_sleeptimer_label">Slå søvntimer fra</string>
<string name="sleep_timer_label">Søvn timer</string>
<string name="time_dialog_invalid_input">Ugyldig indtastning: tid skal være et heltal</string>
<string name="shake_to_reset_label">Ryst for at nulstille</string>
+ <string name="timer_vibration_label">Vibrere kort før afslutning</string>
<string name="time_seconds">sekunder</string>
<string name="time_minutes">minutter</string>
<string name="time_hours">timer</string>
@@ -565,6 +612,7 @@
<string name="gpodnetsync_error_descr">En fejl opstod under synkronisering:\u0020</string>
<string name="gpodnetsync_pref_report_successful">Lykkedes</string>
<string name="gpodnetsync_pref_report_failed">Fejlede</string>
+ <string name="gpodnetsync_username_characters_error">Brugernavne kan kun indeholde bogstaver, tal, bindestreger og understreger.</string>
<!--Directory chooser-->
<string name="selected_folder_label">Valgt mappe:</string>
<string name="create_folder_label">Opret mappe</string>
@@ -603,9 +651,11 @@
<string name="navigate_upwards_label">Naviger opad</string>
<string name="status_downloading_label">Udsendelse overføres</string>
<string name="in_queue_label">Udsendelse er i køen</string>
+ <string name="is_favorite_label">Afsnit er markeret som favorit</string>
<string name="drag_handle_content_description">Træk for at ændre dette elements placering</string>
<string name="load_next_page_label">Indlæs næste side</string>
<string name="switch_pages">Skift sider</string>
+ <string name="position">Position: %1$s</string>
<string name="apply_action">Anvend handling</string>
<!--Feed information screen-->
<string name="authentication_label">Godkendelse</string>
@@ -617,6 +667,8 @@
<string name="episode_filters_exclude">Udelad</string>
<string name="episode_filters_hint">Enkelte ord\n\"Flere ord\"</string>
<string name="keep_updated">Hold opdateret</string>
+ <string name="keep_updated_summary">Inkludere denne podcast når alle podcast genindlæses</string>
+ <string name="auto_download_disabled_globally">Automatisk download slået fra i de generelle AntennaPod indstilinger</string>
<!--Progress information-->
<string name="progress_upgrading_database">Opgraderer databasen</string>
<!--AntennaPodSP-->
@@ -626,9 +678,11 @@
<string name="search_itunes_label">Søg i iTunes</string>
<string name="search_fyyd_label">Søg i fyyd</string>
<string name="advanced">Avanceret</string>
+ <string name="add_podcast_by_url">Tilføje podcast ved URL</string>
<string name="browse_gpoddernet_label">Gennemse gpodder.net</string>
<string name="discover">Opdag</string>
<string name="discover_more">mere »</string>
+ <string name="search_powered_by">Søgning drevet af %1$s</string>
<string name="filter">Filtrér</string>
<!--Episodes apply actions-->
<string name="all_label">Alle</string>
@@ -708,14 +762,21 @@
<string name="cast_failed_media_error_skipping">Fejl ved afspilning af medie. Springer over…</string>
<!--Notification channels-->
<string name="notification_channel_user_action">Handling påkrævet</string>
+ <string name="notification_channel_user_action_description">Vist hvis din handling er nødvendig, for eksempel hvis du skal skrive et kodeord.</string>
<string name="notification_channel_downloading">Henter</string>
<string name="notification_channel_downloading_description">Vises samtidig med den hentes.</string>
<string name="notification_channel_playing">Spiller nu</string>
+ <string name="notification_channel_playing_description">Giver adgang til at kontrollere afspilning. Dette er den mest normale notifikation du vil se, mens du afspiller en podcast.</string>
<string name="notification_channel_error">Fejl</string>
+ <string name="notification_channel_error_description">Vist hvis noget gik galt, for eksempel ved download eller gpodder synkroniserings fejl.</string>
<string name="notification_channel_auto_download">Automatisk hentninger</string>
+ <string name="notification_channel_episode_auto_download">Vist når episoder automatisk var blevet downloaded.</string>
<!--Widget settings-->
<string name="widget_settings">Kontrol opsætning</string>
<string name="widget_create_button">Opret kontrol</string>
<string name="widget_opacity">Ugennemsigtighed</string>
<!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Indstilling opdateret.</string>
+ <string name="on_demand_config_stream_text">Det ser ud til at du streamer en del. Vil du have vist stream knappen i episode lister?</string>
+ <string name="on_demand_config_download_text">Det ser ud til at du har overført meget. Vil du have overfør knappen til at blive vist i episode lister?</string>
</resources>
diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml
index 2ba6a9d72..c9fd04079 100644
--- a/core/src/main/res/values-de/strings.xml
+++ b/core/src/main/res/values-de/strings.xml
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Über</string>
<string name="antennapod_version">AntennaPod-Version</string>
+ <string name="contributors">Beitragende</string>
+ <string name="contributors_summary">Jeder kann helfen, AntennaPod besser zu machen - durch Code, Übersetzungen oder durch Unterstützen anderer Nutzer in unserem Forum.</string>
<string name="developers">Entwickler</string>
- <string name="developers_summary">Jeder kann helfen, AntennaPod besser zu machen</string>
<string name="translators">Übersetzer</string>
- <string name="translators_summary">Übersetzungen werden von Nutzern auf Transifex erstellt</string>
+ <string name="special_thanks">Besonderen Dank</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="licenses">Lizenzen</string>
<string name="licenses_summary">AntennaPod verwendet nützliche andere Software</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Zu importierende Datei auswählen</string>
<string name="import_ok">Import erfolgreich.\n\nBitte OK drücken, um AntennaPod neuzustarten</string>
<string name="import_no_downgrade">Diese Datenbank wurde mit einer neueren Version von AntennaPod exportiert. Deine im Moment installierte Version kann die Datei leider nicht bearbeiten.</string>
+ <string name="favorites_export_label">Favoriten exportieren</string>
+ <string name="favorites_export_summary">Speichere Favoriten in einer Datei</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Timer einstellen</string>
<string name="disable_sleeptimer_label">Schlummerfunktion deaktivieren</string>
diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml
index b8f1f0b25..5f956d839 100644
--- a/core/src/main/res/values-es/strings.xml
+++ b/core/src/main/res/values-es/strings.xml
@@ -2,7 +2,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activity and fragment titles-->
<string name="feed_update_receiver_name">Actualizar suscripciones</string>
- <string name="feeds_label">Podcasts</string>
+ <string name="feeds_label">Pódcast</string>
<string name="statistics_label">Estadísticas</string>
<string name="add_feed_label">Añadir pódcast</string>
<string name="episodes_label">Episodios</string>
@@ -33,9 +33,9 @@
<string name="statistics_mode_count_all">Suma de todos los pódcast marcados como reproducidos</string>
<string name="statistics_speed_not_counted">Aviso: La velocidad de reproducción nunca se tiene en cuenta.</string>
<string name="statistics_reset_data">Borrar estadísticas</string>
- <string name="statistics_reset_data_msg">Esto borrará el historial de duración de todos los episodios. ¿Estás seguro de que quieres hacerlo?</string>
+ <string name="statistics_reset_data_msg">Esto borrará el historial de duración reproducida de todos los episodios. ¿Confirma que quiere hacerlo?</string>
<!--Download Statistics fragment-->
- <string name="total_size_downloaded_podcasts">Tamaño total de podcast descargados:</string>
+ <string name="total_size_downloaded_podcasts">Tamaño total de pódcast descargados:</string>
<!--Main activity-->
<string name="drawer_open">Abrir menú</string>
<string name="drawer_close">Cerrar menú</string>
@@ -53,7 +53,7 @@
<string name="open_in_browser_label">Abrir en el navegador</string>
<string name="copy_url_label">Copiar URL</string>
<string name="share_url_label">Compartir URL</string>
- <string name="copied_url_msg">URL copiada al portapapeles</string>
+ <string name="copied_url_msg">URL copiado en el portapapeles</string>
<string name="go_to_position_label">Ir a esa posición</string>
<!--Playback history-->
<string name="clear_history_label">Vaciar el historial</string>
@@ -508,9 +508,7 @@
<string name="about_pref">Acerca de</string>
<string name="antennapod_version">Versión de AntennaPod</string>
<string name="developers">Desarrolladores</string>
- <string name="developers_summary">Todos pueden ayudar a mejorar AntennaPod</string>
<string name="translators">Traductores</string>
- <string name="translators_summary">Las traducciones las crean los usuarios de AntennaPod usando Transifex</string>
<string name="privacy_policy">Política de privacidad</string>
<string name="licenses">Licencias</string>
<string name="licenses_summary">AntennaPod usa otros software estupendos</string>
diff --git a/core/src/main/res/values-et/strings.xml b/core/src/main/res/values-et/strings.xml
index 8d6c6347b..db10f6ca4 100644
--- a/core/src/main/res/values-et/strings.xml
+++ b/core/src/main/res/values-et/strings.xml
@@ -2,6 +2,7 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activity and fragment titles-->
<string name="feed_update_receiver_name">Uuenda tellimusi</string>
+ <string name="feeds_label">Taskuhäälingud</string>
<string name="statistics_label">Statistika</string>
<string name="add_feed_label">Lisa taskuhääling</string>
<string name="episodes_label">Saated</string>
@@ -22,6 +23,8 @@
<string name="gpodnet_auth_label">gpodder.net kasutajanimi</string>
<string name="episode_cache_full_title">Saadete vahemälu on täis</string>
<string name="episode_cache_full_message">Saadete vahemälu limiit on täis. Vahemälu limiiti saab suurendada seadete alt.</string>
+ <string name="playback_statistics_label">Esitamine</string>
+ <string name="download_statistics_label">Allalaadimised</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Kuulatud taskuhäälingute kogupikkus:</string>
<string name="statistics_details_dialog">%1$d %2$d-st saatest on alustatud.\n\nKuulatud on %3$s saadet %4$s-st.</string>
@@ -32,6 +35,7 @@
<string name="statistics_reset_data">Lähtesta statistika andmed</string>
<string name="statistics_reset_data_msg">See lähtestab kõigi esitatud saadete kuulamise pikkuse ajaloo. Kas oled kindel, et tahad jätkata?</string>
<!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Allalaaditud taskuhäälingute kogumaht:</string>
<!--Main activity-->
<string name="drawer_open">Ava menüü</string>
<string name="drawer_close">Sulge menüü</string>
@@ -80,6 +84,11 @@
<string name="auto_download_apply_to_items_title">Rakenda eelmistele saadetele</string>
<string name="auto_download_apply_to_items_message">Uus <i>Automaatse allalaadimise</i> säte rakendatakse uutele saadetele.\nKas tahad seda rakendada ka varem avaldatud saadetele?</string>
<string name="auto_delete_label">Saadete automaatne kustutamine</string>
+ <string name="feed_volume_reduction">Valjuse vähendamine</string>
+ <string name="feed_volume_reduction_summary">See voo saadete valjuse vähendamine: %1$s</string>
+ <string name="feed_volume_reduction_off">Väljas</string>
+ <string name="feed_volume_reduction_light">Kerge</string>
+ <string name="feed_volume_reduction_heavy">Tugev</string>
<string name="parallel_downloads_suffix">\u0020samaaegset allalaadimist</string>
<string name="feed_auto_download_global">Üldine vaikeväärtus</string>
<string name="feed_auto_download_always">Alati</string>
@@ -96,6 +105,11 @@
<item quantity="one">1 päev pärast lõpetamist</item>
<item quantity="other">%d päeva pärast lõpetamist</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d valitud</item>
+ <item quantity="other">%d valitud</item>
+ </plurals>
+ <string name="loading_more">Laadimine…</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Märgi kuulatuks</string>
<string name="mark_all_read_msg">Märgi kõik saated kuulatuks</string>
@@ -115,11 +129,13 @@
<string name="share_link_with_position_label">Jaga saate linki koos asukohaga</string>
<string name="share_file_label">Jaga faili</string>
<string name="share_website_url_label">Jaga veebilehe linki</string>
+ <string name="share_feed_url_label">Jaga taskuhäälingu linki</string>
<string name="share_item_url_label">Jaga meediafaili linki</string>
<string name="share_item_url_with_position_label">Jaga meediafaili linki koos asukohaga</string>
<string name="feed_delete_confirmation_msg">Palun kinnita, et tahad kustutada taskuhäälingu \"%1$s\" ja KÕIK selle saated (ka allalaaditud saated).</string>
<string name="feed_remover_msg">Taskuhäälingu eemaldamine</string>
<string name="load_complete_feed">Värskenda kogu taskuhääling</string>
+ <string name="multi_select">Mitme valimine</string>
<string name="select_all_above">Vali kõik ülemised</string>
<string name="select_all_below">Vali kõik alumised</string>
<string name="hide_unplayed_episodes_label">Esitamata</string>
@@ -134,6 +150,7 @@
<string name="filtered_label">Filtreeritud</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Viimane värskendamine ebaõnnestus</string>
<string name="open_podcast">Ava taskuhääling</string>
+ <string name="please_wait_for_data">Palun oota andmete laadimist</string>
<!--actions on feeditems-->
<string name="download_label">Laadi alla</string>
<plurals name="downloading_batch_label">
@@ -154,11 +171,15 @@
<string name="removed_new_flag_label">Eemaldati silt \"uus\"</string>
<string name="mark_read_label">Märgi kuulatuks</string>
<string name="marked_as_read_label">Märgitud kuulatuks</string>
+ <string name="mark_read_no_media_label">Märgi loetuks</string>
+ <string name="marked_as_read_no_media_label">Märgiti loetuks</string>
+ <string name="play_this_to_seek_position">Asukohale hüppamiseks pead saadet esitama</string>
<plurals name="marked_read_batch_label">
<item quantity="one">%d saade märgiti kuulatuks.</item>
<item quantity="other">%d saadet märgiti kuulatuks.</item>
</plurals>
<string name="mark_unread_label">Märgitud kui kuulamata</string>
+ <string name="mark_unread_label_no_media">Märgi mitteloetuks</string>
<plurals name="marked_unread_batch_label">
<item quantity="one">%d saade märgiti kui kuulamata.</item>
<item quantity="other">%d saadet märgiti kui kuulamata.</item>
@@ -184,6 +205,7 @@
<string name="deactivate_auto_download">Lülita automaatne allalaadimine välja</string>
<string name="reset_position">Nulli esitamise asukoht</string>
<string name="removed_item">Kirje on eemaldatud</string>
+ <string name="no_items_selected">Ühtegi pole valitud</string>
<!--Download messages and labels-->
<string name="download_successful">korras</string>
<string name="download_pending">Ootel allalaadimine</string>
@@ -204,6 +226,7 @@
<string name="download_canceled_msg">Allalaadimine on tühistatud</string>
<string name="download_canceled_autodownload_enabled_msg">Allalaadimine tühistati\nKeelati selle saate <i>automaatne allalaadimine</i></string>
<string name="download_report_title">Allalaadimised lõpetati veaga (vigadega)</string>
+ <string name="auto_download_report_title">Automaatsed allalaadimised lõpetatud</string>
<string name="download_report_content_title">Allalaadimise aruanne</string>
<string name="download_error_malformed_url">Vigane URL-i vorming</string>
<string name="download_error_io_error">IO viga</string>
@@ -240,11 +263,13 @@
<string name="playback_error_server_died">Server suri ära</string>
<string name="playback_error_unsupported">Toetamata meedia liik</string>
<string name="playback_error_timeout">Tegevus aegus</string>
+ <string name="playback_error_source">Puudub ligipääs meediafailile</string>
<string name="playback_error_unknown">Tundmatu tõrge</string>
<string name="no_media_playing_label">Mingit faili ei esitata</string>
<string name="player_buffering_msg">Puhverdamine</string>
<string name="player_go_to_picture_in_picture">Pilt-pildis režiim</string>
<string name="unknown_media_key">AntennaPod - Tundmatu meedia võti: %1$d</string>
+ <string name="error_file_not_found">Faili ei leitud</string>
<!--Queue operations-->
<string name="lock_queue">Lukusta järjekord</string>
<string name="unlock_queue">Eemalda järjekorra lukustus</string>
@@ -271,6 +296,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Laadi plugin alla</string>
<string name="no_playback_plugin_title">Pluginat pole paigaldatud</string>
+ <string name="no_playback_plugin_or_sonic_msg">Muutuva kiirusega taasesituse jaoks soovitame lubada sisseehitatud Sonic meediaesitaja.</string>
<string name="set_playback_speed_label">Esitamise kiirused</string>
<string name="enable_sonic">Luba Sonicu kasutamine</string>
<!--Empty list labels-->
@@ -297,8 +323,11 @@
<string name="no_subscriptions_label">Taskuhäälingu tellimiseks vajuta all plussmärgil.</string>
<!--Preferences-->
<string name="storage_pref">Salvestusruum</string>
+ <string name="storage_sum">Saate automaatne kustutamine, importimine, eksportimine</string>
<string name="project_pref">Projekt</string>
<string name="queue_label">Järjekord</string>
+ <string name="synchronization_pref">Sünkroonimine</string>
+ <string name="synchronization_sum">Sünkrooni teiste seadmetega gpodder.net abil</string>
<string name="automation">Automaatika</string>
<string name="download_pref_details">Üksikasjad</string>
<string name="import_export_pref">Import/eksport</string>
@@ -330,8 +359,11 @@
<string name="pref_favorite_keeps_episodes_sum">Saadete säilitamine, kui need on märgitud lemmikuks</string>
<string name="pref_favorite_keeps_episodes_title">Säilita lemmikosad</string>
<string name="playback_pref">Esitamine</string>
+ <string name="playback_pref_sum">Kõrvaklappide juhtimine, vahelejätmine, ootejärjekord</string>
<string name="network_pref">Võrk</string>
+ <string name="network_pref_sum">Uuendamise sagedus, allalaadimine, mobiilinett</string>
<string name="pref_autoUpdateIntervallOrTime_title">Uuendamise intervall või kellaaeg</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Määra ajavahemik või täpne aeg, millal taskuhäälinguid automaatselt värskendada</string>
<string name="pref_autoUpdateIntervallOrTime_message">Sa võid määrata <i>intervalli</i>, näiteks \"iga 2 tunni järel\", või määrata <i>millal päeva jooksul</i>, näiteks \"7:00\" või <i>keelata</i> automaatsed uuendused täielikult.\n\n<small>Pane tähele: uuendamise ajad ei ole täpsed. Võib esineda väike viivitus.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Lülita välja</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Määra intervall</string>
@@ -346,11 +378,13 @@
<string name="pref_stream_over_download_sum">Loeteludes kuvatakse allalaadimise asemel voogedastuse nuppu.</string>
<string name="pref_mobileUpdate_title">Uuendamine üle andmeside</string>
<string name="pref_mobileUpdate_sum">Vali, mis peaks olema lubatud andmeside kaudu</string>
+ <string name="pref_mobileUpdate_refresh">Taskuhäälingu värskendamine</string>
<string name="pref_mobileUpdate_images">Kaanepildid</string>
<string name="pref_mobileUpdate_auto_download">Automaatne allalaadimine</string>
<string name="pref_mobileUpdate_episode_download">Saate allalaadimine</string>
<string name="pref_mobileUpdate_streaming">Voogedastus</string>
<string name="user_interface_label">Kasutajaliides</string>
+ <string name="user_interface_sum">Välimus, tellimuste järjekord, lukuekraan</string>
<string name="pref_set_theme_title">Vali teema</string>
<string name="pref_nav_drawer_items_title">Määra peamenüü osad</string>
<string name="pref_nav_drawer_items_sum">Määra, mis osad on peamenüüs.</string>
@@ -384,13 +418,22 @@
<string name="pref_gpodnet_logout_toast">Väljalogimine oli edukas</string>
<string name="pref_gpodnet_setlogin_information_title">Muuda kasutajakonto infot</string>
<string name="pref_gpodnet_setlogin_information_sum">Muuda oma gpodder.net konto sisselogimise andmeid.</string>
+ <string name="pref_gpodnet_sync_changes_title">Sünkroniseeri kohe</string>
<string name="pref_gpodnet_sync_changes_sum">Sünkroniseeri oma tellimuste ja saadete olekute muutuseid gpodder.net-iga</string>
+ <string name="pref_gpodnet_full_sync_title">Nõua täielikku sünkroonimist</string>
<string name="pref_gpodnet_full_sync_sum">Sünkroniseeri kõiki tellimusi ja saate olekuid gpodder.net-iga.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Sisseloginud kui <i>%1$s</i> seadmega <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Kuva sünkroniseerimise vigu teadaannetena</string>
<string name="pref_gpodnet_notifications_sum">See seadistus ei rakendu autentimise vigadele.</string>
<string name="pref_playback_speed_title">Esitamise kiirused</string>
<string name="pref_playback_speed_sum">Muuda, millised valikud on audio esitamisel kiiruste loendis</string>
+ <string name="pref_feed_playback_speed_sum">Millise kiirusega esitatakse selle tellimuse saadete heli</string>
+ <string name="pref_feed_skip">Automaatne vahelejätmine</string>
+ <string name="pref_feed_skip_sum">Sissejuhatuse ja lõputänu vahele jätmine.</string>
+ <string name="pref_feed_skip_ending">Jäta vahele lõpust</string>
+ <string name="pref_feed_skip_intro">Jäta vahele algusest</string>
+ <string name="pref_feed_skip_ending_toast">Lõpust jäeti vahele %d sekundit</string>
+ <string name="pref_feed_skip_intro_toast">Algusest jäeti vahele %d sekundit</string>
<string name="pref_playback_time_respects_speed_title">Meedia info kohandamine esituse kiirusega</string>
<string name="pref_playback_time_respects_speed_sum">Kuvatav asukoht ja kestus kohandatakse esituse kiiruse järgi</string>
<string name="pref_fast_forward">Edasi kerimise hüpe</string>
@@ -411,6 +454,8 @@
<string name="pref_lockscreen_background_sum">Määra lukuekraani taustaks selle saate pilt. Kõrvalmõjuna kuvab see pilti ka teistes rakendustes.</string>
<string name="pref_showDownloadReport_title">Näita allalaadimise aruannet</string>
<string name="pref_showDownloadReport_sum">Kui allalaadimised nurjuvad, genereeri raport, mis kuvab vea üksikasju.</string>
+ <string name="pref_showAutoDownloadReport_title">Kuva automaatse allalaadimise raportit</string>
+ <string name="pref_showAutoDownloadReport_sum">Teate kuvamine automaatselt allalaaditud saadete kohta.</string>
<string name="pref_expand_notify_unsupport_toast">Vanemad Androidi versioonid kui 4.1 ei toeta laiendatud teavitusi.</string>
<string name="pref_enqueue_location_title">Järjekorra asukoht</string>
<string name="pref_enqueue_location_sum">Saated lisatakse: %1$s</string>
@@ -420,8 +465,10 @@
<string name="pref_smart_mark_as_played_disabled">Välja lülitatud</string>
<string name="pref_image_cache_size_title">Piltide vahemälu suurus</string>
<string name="pref_image_cache_size_sum">Piltide jaoks kasutatava vahemälu suurus</string>
+ <string name="visit_user_forum">Kasutajate foorum</string>
<string name="bug_report_title">Raporteeri veast</string>
<string name="open_bug_tracker">Ava vigade loetelu</string>
+ <string name="export_logs">Ekspordi logid</string>
<string name="copy_to_clipboard">Kopeeri lõikelauale</string>
<string name="copied_to_clipboard">Kopeeritud lõikelauale</string>
<string name="experimental_pref">Katsetamisel</string>
@@ -437,6 +484,8 @@
<string name="pref_enqueue_downloaded_title">Järjekord allalaaditud</string>
<string name="pref_enqueue_downloaded_summary">Allalaaditud saadete lisamine järjekorda</string>
<string name="media_player_builtin">Sisseehitatud Androidi esitaja</string>
+ <string name="media_player_switch_to_exoplayer">Vaheta ExoPlayerile</string>
+ <string name="media_player_switched_to_exoplayer">Vahetati ExoPlayerile.</string>
<string name="pref_skip_silence_title">Audios vaikuse vahele jätmine</string>
<string name="pref_videoBehavior_title">Videost väljumisel</string>
<string name="pref_videoBehavior_sum">Mida tehakse video esitamisest lahkumisel</string>
@@ -458,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Info</string>
<string name="antennapod_version">AntennaPodi versioon</string>
+ <string name="contributors">Kaastöölised</string>
+ <string name="contributors_summary">Igaüks võib aidata teha AntennaPodi paremaks - kirjutades koodi, tõlkides või aidates foorumis teisi kasutajaid</string>
<string name="developers">Arendajad</string>
- <string name="developers_summary">Igaüks võib aidata AntennaPodi paremaks teha</string>
<string name="translators">Tõlkijad</string>
- <string name="translators_summary">Tõlkeid lisavad AntennaPodi kasutajad Transifex keskkonnas</string>
+ <string name="special_thanks">Eritänu</string>
<string name="privacy_policy">Privaatsus</string>
<string name="licenses">Litsentsid</string>
<string name="licenses_summary">AntennaPod kasutab teiste suurepärast tarkvara</string>
@@ -470,7 +520,23 @@
<string name="search_label">Otsi</string>
<string name="no_results_for_query">\"%1$s\" otsimine ei andnud tulemusi</string>
<!--Synchronization-->
+ <string name="sync_status_started">Sünkroonimine algas</string>
+ <string name="sync_status_episodes_upload">Saadete muudatuse üleslaadimine…</string>
+ <string name="sync_status_episodes_download">Saadete muudatuste allalaadimine…</string>
+ <string name="sync_status_upload_played">Esitamise oleku uuendamine…</string>
+ <string name="sync_status_subscriptions">Tellimuste sünkroonimine…</string>
+ <string name="sync_status_success">Sünkroonimine õnnestus</string>
+ <string name="sync_status_error">Sünkroonimine nurjus</string>
<!--import and export-->
+ <string name="import_export_summary">Tellimuste ja ootejärjekorra liigutamine teise seadmesse</string>
+ <string name="database">Andmebaas</string>
+ <string name="opml">OPML</string>
+ <string name="html">HTML</string>
+ <string name="html_export_summary">Näita oma tellimusi sõbrale</string>
+ <string name="opml_export_summary">Tellimuste liigutamine teise taskuhäälingu äppi</string>
+ <string name="opml_import_summary">Tellimuste importimine teisest taskuhäälingu äpist</string>
+ <string name="database_export_summary">Tellimuste, kuulatud saadete ja ooterjärjekorra liigutamine AntennaPodi mõnes teises seadmes</string>
+ <string name="database_import_summary">AntennaPodi andmebaasi import teisest seadmest</string>
<string name="opml_import_label">OPML import</string>
<string name="opml_reader_error">OPML dokumendi lugemisel tekkis tõrge:</string>
<string name="opml_import_error_no_file">Ühtegi faili pole valitud!</string>
@@ -478,17 +544,26 @@
<string name="deselect_all_label">Ära vali midagi</string>
<string name="opml_export_label">OPML eksport</string>
<string name="html_export_label">HTML eksport</string>
+ <string name="database_export_label">Andmebaasi eksport</string>
+ <string name="database_import_label">Andmebaasi import</string>
+ <string name="database_import_warning">Andmebaasi importimine asendab kõik sinu praegused tellimused ja kuulamiste ajaloo. Peaksid oma praeguse andmebaasi varundamise eesmärgil enne eksportima. Kas soovid andmed asendada?</string>
+ <string name="please_wait">Palun oota…</string>
<string name="export_error_label">Viga eksportimisel</string>
<string name="export_success_title">Eksportimine edukas</string>
<string name="export_success_sum">Eksporditud fail salvestati asukohta:\n\n%1$s</string>
<string name="opml_import_ask_read_permission">OPML faili lugemiseks on vajalik ligipääs välisele salvestusruumile</string>
<string name="import_select_file">Vali fail, mida importida</string>
<string name="import_ok">Importimine edukas.\n\nAntennaPodi taaskäivitamiseks vajuta OK</string>
+ <string name="import_no_downgrade">See andmebaas on eksporditud AntennaPodi uuemast versioonist. Sinu praegune äpp ei oska seda faili käsitseda.</string>
+ <string name="favorites_export_label">Lemmikute eksport</string>
+ <string name="favorites_export_summary">Ekspordi salvestatud lemmikud faili</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Määra unetaimer</string>
<string name="disable_sleeptimer_label">Keela unetaimer</string>
<string name="sleep_timer_label">Unetaimer</string>
<string name="time_dialog_invalid_input">Vigane sisend, aeg peab olema täisarv</string>
+ <string name="shake_to_reset_label">Raputa uuesti alustamiseks</string>
+ <string name="timer_vibration_label">Enne lõppu lühike värin</string>
<string name="time_seconds">sekundit</string>
<string name="time_minutes">minutit</string>
<string name="time_hours">tundi</string>
@@ -564,16 +639,24 @@
<!--Online feed view-->
<string name="subscribe_label">Telli</string>
<string name="subscribing_label">Tellimine...</string>
+ <string name="preview_episode">Eelvaade</string>
+ <string name="stop_preview">Lõpeta eelvaade</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Keri tagasi</string>
<string name="fast_forward_label">Keri edasi</string>
+ <string name="increase_speed">Suurenda kiirust</string>
+ <string name="decrease_speed">Vähenda kiirust</string>
<string name="media_type_audio_label">Heli</string>
<string name="media_type_video_label">Video</string>
<string name="navigate_upwards_label">Liigu ülespoole</string>
<string name="status_downloading_label">Saade laaditakse alla</string>
<string name="in_queue_label">Saade on järjekorras</string>
+ <string name="is_favorite_label">Saade on märgitud lemmikuks</string>
<string name="drag_handle_content_description">Kirje asukoha muutmiseks lohista</string>
<string name="load_next_page_label">Laadi järgmine lehekülg</string>
+ <string name="switch_pages">Vaheta lehti</string>
+ <string name="position">Asukoht: %1$s</string>
+ <string name="apply_action">Vii ellu</string>
<!--Feed information screen-->
<string name="authentication_label">Autentimine</string>
<string name="authentication_descr">Muuda kasutajanime ja parooli selle taskuhäälingu ja saadete jaoks.</string>
@@ -584,6 +667,7 @@
<string name="episode_filters_exclude">Jäta välja</string>
<string name="episode_filters_hint">Üksikud sõnad \n\"Mitu sõna\"</string>
<string name="keep_updated">Hoia uuendatuna</string>
+ <string name="keep_updated_summary">Uuenda koos teiste taskuhäälingute (automaatse) värskendamisega ka seda</string>
<string name="auto_download_disabled_globally">Automaatne allalaadimine on keelatud AntennaPodi peamistes seadetes</string>
<!--Progress information-->
<string name="progress_upgrading_database">Andmebaasi uuendamine</string>
@@ -593,9 +677,12 @@
<string name="search_podcast_hint">Otsi taskuhäälingut...</string>
<string name="search_itunes_label">Otsi iTunest</string>
<string name="search_fyyd_label">Search fyyd-ist</string>
+ <string name="advanced">Täpsem</string>
+ <string name="add_podcast_by_url">Lisa taskuhääling URL abil</string>
<string name="browse_gpoddernet_label">Sirvi gpodder.net-i</string>
<string name="discover">Avasta</string>
<string name="discover_more">veel »</string>
+ <string name="search_powered_by">Otsingut pakub %1$s</string>
<string name="filter">Filter</string>
<!--Episodes apply actions-->
<string name="all_label">Kõik</string>
@@ -623,6 +710,12 @@
<string name="sort_date_old_new">Kuupäev (vana \u2192 uus)</string>
<string name="sort_duration_short_long">Kestus (lühike \u2192 pikk)</string>
<string name="sort_duration_long_short">Kestus (pikk \u2192 lühike)</string>
+ <string name="sort_a_z">A \u2192 Z</string>
+ <string name="sort_z_a">Z \u2192 A</string>
+ <string name="sort_new_old">Uus \u2192 vana</string>
+ <string name="sort_old_new">Vana \u2192 uus</string>
+ <string name="sort_short_long">Lühike \u2192 pikk</string>
+ <string name="sort_long_short">Pikk \u2192 lühike</string>
<!--Rating dialog-->
<string name="rating_title">Kas sulle meeldib AntennaPod?</string>
<string name="rating_message">Oleks suur asi, kui sa saaksid võtta aega, et anda AntennaPodile hinnang.</string>
@@ -676,8 +769,14 @@
<string name="notification_channel_playing_description">Võimaldab esitust juhtida. See on saate kuulamise ajal peamine teade.</string>
<string name="notification_channel_error">Vead</string>
<string name="notification_channel_error_description">Näidatakse, kui miski läks valesti, näiteks allalaadimine või gpodderiga sükroonimine nurjus.</string>
+ <string name="notification_channel_auto_download">Automaatsed allalaadimised</string>
+ <string name="notification_channel_episode_auto_download">Näita, kui saateid laaditi automaatselt alla.</string>
<!--Widget settings-->
+ <string name="widget_settings">Vidina seaded</string>
<string name="widget_create_button">Lisa vidin</string>
<string name="widget_opacity">Läbipaistvus</string>
<!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Seade uuendati edukalt.</string>
+ <string name="on_demand_config_stream_text">Paistab, et striimid palju. Kas soovid, et saadete loetelus oleks striimimise nupud?</string>
+ <string name="on_demand_config_download_text">Paistab, et laadid tihti saated alla. Kas soovid, et saadete loetelus oleks allalaadimise nupud?</string>
</resources>
diff --git a/core/src/main/res/values-eu/strings.xml b/core/src/main/res/values-eu/strings.xml
index 2536b2d3c..e4b4fe4b6 100644
--- a/core/src/main/res/values-eu/strings.xml
+++ b/core/src/main/res/values-eu/strings.xml
@@ -509,10 +509,11 @@
<!--About screen-->
<string name="about_pref">Honi buruz</string>
<string name="antennapod_version">AntennaPod bertsioa</string>
+ <string name="contributors">Laguntzaileak</string>
+ <string name="contributors_summary">Denek lagun dezakete gure foroan kodea, itzulpenak edo erabiltzaileei laguntza emanez.</string>
<string name="developers">Garatzaileak</string>
- <string name="developers_summary">Edonork lagun dezake AntennaPod hobetzen</string>
<string name="translators">Itzultzaileak</string>
- <string name="translators_summary">Itzulpenek AntennaPod erabiltzaile berriak sortzen dituzte Transifex erabiliz</string>
+ <string name="special_thanks">Esker bereziak</string>
<string name="privacy_policy">Pribatutasun politika</string>
<string name="licenses">Baimenak</string>
<string name="licenses_summary">AntennaPod-ek beste software ezin hobeak erabiltzen ditu</string>
@@ -556,6 +557,8 @@
<string name="import_select_file">Aukeratu inportatzeko fitxategia</string>
<string name="import_ok">Inportazio arrakastatsua.\n\nSakatu OK, AntennaPod berrabiarazteko</string>
<string name="import_no_downgrade">Datu-basea AntennaPod-en bertsio berriago batekin esportatu zen. Uneko aplikazioak ez daki nola inportatu.</string>
+ <string name="favorites_export_label">Gogokoak esportatu</string>
+ <string name="favorites_export_summary">Gorde diren gogokoak esportatu artxibatzeko</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ezarri tenporizadore bat</string>
<string name="disable_sleeptimer_label">Desgaitu tenporizadorea</string>
diff --git a/core/src/main/res/values-fa/strings.xml b/core/src/main/res/values-fa/strings.xml
index f060ee338..0ac3b684d 100644
--- a/core/src/main/res/values-fa/strings.xml
+++ b/core/src/main/res/values-fa/strings.xml
@@ -85,6 +85,7 @@
<string name="auto_download_apply_to_items_message">تنظیمات جدید <i>بارگیری خودکار</i> به طور خودکار بر قسمت‌های جدید اعمال خواهد شد.\nآیا می‌خواهید بر قسمت‌هایی قبلاً منتشر شده هم اعمال شود؟</string>
<string name="auto_delete_label">حذف خودکار قسمت</string>
<string name="feed_volume_reduction">کم کردن صدا</string>
+ <string name="feed_volume_reduction_summary">برای قسمت‌های این خوراک، صدا کم شود: %1$s</string>
<string name="feed_volume_reduction_off">خاموش</string>
<string name="feed_volume_reduction_light">سبک</string>
<string name="feed_volume_reduction_heavy">سنگین</string>
@@ -104,6 +105,10 @@
<item quantity="one">%dروز بعد از اتمام</item>
<item quantity="other">%dروز بعد از اتمام</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d گزیده</item>
+ <item quantity="other">%dگزیده</item>
+ </plurals>
<string name="loading_more">بارگیری بیشتر…</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">علامت‌گذاری همه به‌عنوان پخش‌شده</string>
@@ -200,6 +205,7 @@
<string name="deactivate_auto_download">غیر فعال کردن بارگیری خودکار</string>
<string name="reset_position">تنظیم مجدد موقعیت پخش</string>
<string name="removed_item">مورد حذف شده است</string>
+ <string name="no_items_selected">چیزی انتخاب نشده است</string>
<!--Download messages and labels-->
<string name="download_successful">موفقیت‌آمیز</string>
<string name="download_pending">بارگیری معوق</string>
@@ -320,6 +326,8 @@
<string name="storage_sum">حذف خودکار قسمت، درون‌ریزی، برون‌ریزی</string>
<string name="project_pref">پروژه</string>
<string name="queue_label">صف</string>
+ <string name="synchronization_pref">هم‌گام‌سازی</string>
+ <string name="synchronization_sum">با کمک gpodder.net با دستگاه‌های دیگر هم‌گام کنید</string>
<string name="automation">اتوماسیون</string>
<string name="download_pref_details">جزئیات</string>
<string name="import_export_pref">وارد/صادر کرد</string>
@@ -346,6 +354,7 @@
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">تنظیم زمان روز</string>
<string name="user_interface_label">رابط کاربری</string>
<string name="pref_set_theme_title">انتخاب پوسته</string>
+ <string name="pref_episode_cover_title">استفاده از عکس قسمت</string>
<string name="pref_theme_title_light">روشن</string>
<string name="pref_theme_title_dark">تاریک</string>
<string name="pref_theme_title_trueblack">سیاه (مناسب AMOLED)</string>
@@ -380,7 +389,6 @@
<string name="antennapod_version">نسخه AntennaPod</string>
<string name="developers">توسعه‌دهندگان</string>
<string name="translators">مترجمان</string>
- <string name="translators_summary">ترجمه‌ها به کمک کاربران AntennaPod و با استفاده از Transifex انجام شده‌اند</string>
<string name="privacy_policy">سیاست حریم شخصی</string>
<string name="licenses">پروانه‌ها</string>
<!--Search-->
diff --git a/core/src/main/res/values-fi/strings.xml b/core/src/main/res/values-fi/strings.xml
index 3b94dbe85..f30824d7a 100644
--- a/core/src/main/res/values-fi/strings.xml
+++ b/core/src/main/res/values-fi/strings.xml
@@ -14,7 +14,7 @@
<string name="downloads_label">Lataukset</string>
<string name="downloads_running_label">Ajossa</string>
<string name="downloads_completed_label">Valmis</string>
- <string name="downloads_log_label">Logi</string>
+ <string name="downloads_log_label">Loki</string>
<string name="subscriptions_label">Tilaukset</string>
<string name="subscriptions_list_label">Tilauslista</string>
<string name="cancel_download_label">Peruuta\nLataus</string>
@@ -35,6 +35,7 @@
<string name="statistics_reset_data">Nollaa tilastotiedot</string>
<string name="statistics_reset_data_msg">Tämä poistaa kaikkien jaksojen soiton keston historian. Haluatko varmasti jatkaa?</string>
<!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Ladattujen podcastien yhteiskoko</string>
<!--Main activity-->
<string name="drawer_open">Avaa menu</string>
<string name="drawer_close">Sulje menu</string>
@@ -83,6 +84,11 @@
<string name="auto_download_apply_to_items_title">Aseta edellisiin jaksoihin</string>
<string name="auto_download_apply_to_items_message">Uusi <i>Automaattinen lataus</i> asetus tullaan asettamaan uusiin jaksoihin.\nHaluatko asettaa myös aikaisemmin julkaistuihin jaksoihin?</string>
<string name="auto_delete_label">Auto deletoi jakso</string>
+ <string name="feed_volume_reduction">Äänenvoimakkuuden vähentäminen</string>
+ <string name="feed_volume_reduction_summary">Vähennä äänenvoimakkuutta jaksoille syötteestä: %1$s</string>
+ <string name="feed_volume_reduction_off">Pois käytöstä</string>
+ <string name="feed_volume_reduction_light">Kevyt</string>
+ <string name="feed_volume_reduction_heavy">Voimakas</string>
<string name="parallel_downloads_suffix">\u0020yhtäaikaiset lataukset</string>
<string name="feed_auto_download_global">Globaali oletus</string>
<string name="feed_auto_download_always">Aina</string>
@@ -99,6 +105,11 @@
<item quantity="one">1 päivä lataamisen jälkeen</item>
<item quantity="other">%d päivää lataamisen jälkeen</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d valittu</item>
+ <item quantity="other">%d valittua</item>
+ </plurals>
+ <string name="loading_more">Ladataan lisää...</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Merkkaa kaikki soitetuksi</string>
<string name="mark_all_read_msg">Merkkaa kaikki episodit soitetuiksi</string>
@@ -117,11 +128,14 @@
<string name="share_link_label">Jaa jakson URL</string>
<string name="share_link_with_position_label">Jaa jakson URL soittoajan kanssa</string>
<string name="share_file_label">Jaa tietodosto</string>
- <string name="share_item_url_label">Jaa Media tiedoston URL</string>
- <string name="share_item_url_with_position_label">Jaa Media tiedoston URL soittoajan kanssa</string>
- <string name="feed_delete_confirmation_msg">Varmista, että haluat poistaa podcastin \"%1$s\" ja KAIKKI sen jaksot (mukaanlukien ladatut jaksot).</string>
+ <string name="share_website_url_label">Jaa verkkosivuston URL</string>
+ <string name="share_feed_url_label">Jaa podcastin URL</string>
+ <string name="share_item_url_label">Jaa mediatiedoston URL</string>
+ <string name="share_item_url_with_position_label">Jaa mediatiedoston URL toistosijainnin kanssa</string>
+ <string name="feed_delete_confirmation_msg">Vahvista, että haluat poistaa podcastin \"%1$s\" ja KAIKKI sen jaksot (mukaan lukien ladatut jaksot).</string>
<string name="feed_remover_msg">Poistetaan podcast</string>
<string name="load_complete_feed">Päivitä podcast</string>
+ <string name="multi_select">Monivalinta</string>
<string name="select_all_above">Valitse kaikki yllä</string>
<string name="select_all_below">Valitse kaikki alla</string>
<string name="hide_unplayed_episodes_label">Soittamaton</string>
@@ -133,37 +147,42 @@
<string name="hide_not_downloaded_episodes_label">Ei ladattu</string>
<string name="hide_has_media_label">Sisältää mediaa</string>
<string name="hide_is_favorite_label">On suosikki</string>
- <string name="filtered_label">Filteröity</string>
+ <string name="filtered_label">Suodatettu</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Viimeisin päivitys epäonnistui</string>
<string name="open_podcast">Avaa podcast</string>
+ <string name="please_wait_for_data">Odota kunnes tiedot ovat ladattu</string>
<!--actions on feeditems-->
<string name="download_label">Lataa</string>
<plurals name="downloading_batch_label">
- <item quantity="one">Lataa %d jakso</item>
- <item quantity="other">Lataa %d jaksoja.</item>
+ <item quantity="one">Ladataan %d jaksoa.</item>
+ <item quantity="other">Ladataan %d jaksoa.</item>
</plurals>
<string name="play_label">Soita</string>
- <string name="pause_label">Pause</string>
- <string name="stream_label">Striimaa</string>
- <string name="delete_label">Deletoi</string>
+ <string name="pause_label">Tauko</string>
+ <string name="stream_label">Suoratoista</string>
+ <string name="delete_label">Poista</string>
<string name="delete_failed">Ei voida poistaa tiedostoa. Laitteen uudelleenkäynnistys saattaa auttaa.</string>
- <string name="delete_episode_label">Deletoi jakso</string>
+ <string name="delete_episode_label">Poista jakso</string>
<plurals name="deleted_episode_batch_label">
- <item quantity="one">%d jakso deletoitu.</item>
- <item quantity="other">%d jaksoa deletoitu.</item>
+ <item quantity="one">%d jakso poistettu.</item>
+ <item quantity="other">%d jaksoa poistettu.</item>
</plurals>
- <string name="remove_new_flag_label">Poista \"uusi\" lippu</string>
- <string name="removed_new_flag_label">Poistettiin \"uusi\" lippu</string>
+ <string name="remove_new_flag_label">Poista \"uusi\"-lippu</string>
+ <string name="removed_new_flag_label">Poistettiin \"uusi\"-lippu</string>
<string name="mark_read_label">Merkitse soitetuksi</string>
- <string name="marked_as_read_label">Merkattu soitetuksi</string>
+ <string name="marked_as_read_label">Merkitty soitetuksi</string>
+ <string name="mark_read_no_media_label">Merkitse luetuksi</string>
+ <string name="marked_as_read_no_media_label">Merkitty luetuksi</string>
+ <string name="play_this_to_seek_position">Jaksoa pitää toistaa siirtyäksesi kohtiin</string>
<plurals name="marked_read_batch_label">
- <item quantity="one">%d jakso merkattu soitetuksi.</item>
- <item quantity="other">%d jaksoa merkattu soitetuksi</item>
+ <item quantity="one">%d jakso merkitty soitetuksi.</item>
+ <item quantity="other">%d jaksoa merkitty soitetuksi</item>
</plurals>
- <string name="mark_unread_label">Merkkaa soittamattomaksi</string>
+ <string name="mark_unread_label">Merkitse soittamattomaksi</string>
+ <string name="mark_unread_label_no_media">Merkitse lukemattomaksi</string>
<plurals name="marked_unread_batch_label">
- <item quantity="one">%d jakso merkattu soittamattomaksi.</item>
- <item quantity="other">%d jaksoa merkattu soittamattomaksi.</item>
+ <item quantity="one">%d jakso merkitty soittamattomaksi.</item>
+ <item quantity="other">%d jaksoa merkitty soittamattomaksi.</item>
</plurals>
<string name="add_to_queue_label">Lisää jonoon</string>
<string name="added_to_queue_label">Lisätty jonoon</string>
@@ -180,12 +199,13 @@
<string name="added_to_favorites">Lisätty suosikkeihin</string>
<string name="remove_from_favorite_label">Poista suosikeista</string>
<string name="removed_from_favorites">Poistettu suosikeista</string>
- <string name="visit_website_label">Selaa Web-sivustoa</string>
- <string name="skip_episode_label">Skippaa jakso</string>
- <string name="activate_auto_download">Aktivoi autolataukset</string>
- <string name="deactivate_auto_download">Deaktivoi automaattinen lataus</string>
- <string name="reset_position">Resetoi soittoaika</string>
- <string name="removed_item">Asia poistettu</string>
+ <string name="visit_website_label">Vieraile verkkosivustolla</string>
+ <string name="skip_episode_label">Ohita jakso</string>
+ <string name="activate_auto_download">Aktivoi automaattiset lataukset</string>
+ <string name="deactivate_auto_download">Poista automaattinen lataus käytöstä</string>
+ <string name="reset_position">Nollaa toistosijainti</string>
+ <string name="removed_item">Nimike poistettu</string>
+ <string name="no_items_selected">Ei valittuja nimikkeitä</string>
<!--Download messages and labels-->
<string name="download_successful">onnistui</string>
<string name="download_pending">Lataus odottamassa</string>
@@ -195,17 +215,18 @@
<string name="download_error_device_not_found">Tallennuslaitetta ei löytynyt</string>
<string name="download_error_insufficient_space">Ei tarpeeksi tilaa</string>
<string name="download_error_http_data_error">HTTP Data virhe</string>
- <string name="download_error_error_unknown">Odottamaton virhe</string>
- <string name="download_error_parser_exception">Parserin virhe</string>
- <string name="download_error_unsupported_type">Ei tuettu tiedostotyyppi</string>
- <string name="download_error_connection_error">Yhteysongelma</string>
- <string name="download_error_unknown_host">Tuntematon Host</string>
- <string name="download_error_unauthorized">Autentikaatio virhe</string>
+ <string name="download_error_error_unknown">Tuntematon virhe</string>
+ <string name="download_error_parser_exception">Jäsenninpoikkeus</string>
+ <string name="download_error_unsupported_type">Ei tuettu syötetyyppi</string>
+ <string name="download_error_connection_error">Yhteysvirhe</string>
+ <string name="download_error_unknown_host">Tuntematon isäntä</string>
+ <string name="download_error_unauthorized">Todentamisvirhe</string>
<string name="download_error_file_type_type">Tiedostotyyppivirhe</string>
<string name="download_error_forbidden">Ei sallittu</string>
<string name="download_canceled_msg">Lataus peruutettu</string>
<string name="download_canceled_autodownload_enabled_msg">Lataus peruutettu\nPoistettu <i>Automaattinen lataus</i> tälle tiedolle </string>
- <string name="download_report_title">Lataukset valmistuivat virhe(ide)n kanssa</string>
+ <string name="download_report_title">Lataukset valmistuivat virhe(id)en kanssa</string>
+ <string name="auto_download_report_title">Automaattiset lataukset valmistuivat</string>
<string name="download_report_content_title">Latausraportti</string>
<string name="download_error_malformed_url">Huonosti koostettu URL</string>
<string name="download_error_io_error">IO virhe</string>
@@ -215,43 +236,53 @@
<item quantity="one">%d lataus jäljellä</item>
<item quantity="other">%d latausta jäljellä</item>
</plurals>
- <string name="downloads_processing">Prosessoi latauksia</string>
- <string name="download_notification_title">Lataa podcastin tietoja</string>
+ <string name="downloads_processing">Käsitellään latauksia</string>
+ <string name="download_notification_title">Ladataan podcastin tietoja</string>
<string name="download_report_content">%1$d latausta onnistui, %2$d epäonnistui</string>
<string name="download_log_title_unknown">Tuntematon otsikko</string>
<string name="download_type_feed">Syöte</string>
<string name="download_type_media">Mediatiedosto</string>
<string name="download_request_error_dialog_message_prefix">Tiedoston latauksen aikana tapahtui virhe:\u0020</string>
<string name="null_value_podcast_error">Ei voida näyttää olematonta podcastia</string>
- <string name="authentication_notification_title">Vaaditaan autentikaatio</string>
+ <string name="authentication_notification_title">Todentaminen vaaditaan</string>
<string name="authentication_notification_msg">Pyytämäsi resurssi vaatii käyttäjätunnuksen ja salasanan</string>
<string name="confirm_mobile_download_dialog_title">Varmista mobiililataus</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">Lataaminen mobiilidatayhteydellä on estettu asetuksissa.\n\nVoit lisätä yhden jakson jonoon tai sallia lataamisen väliaikaisesti.\n\n<small>Valinta muistetaan 10 minuutin ajan.</small></string>
- <string name="confirm_mobile_download_dialog_message">Lataamienn mobiilidatayhteydellä on estettu asetuksissa.\n\nHaluatko sallia lataamisen väliaikaisesti?\n\n<small>Valinta muistetaan 10 minuutin ajan.</small></string>
+ <string name="confirm_mobile_download_dialog_message">Lataaminen mobiilidatayhteydellä on estetty asetuksissa.\n\nHaluatko sallia lataamisen väliaikaisesti?\n\n<small>Valinta muistetaan 10 minuutin ajan.</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Vahvista suoratoisto mobiilidatayhteydellä</string>
+ <string name="confirm_mobile_streaming_notification_message">Suoratoisto mobiilidatayhteydellä on estetty asetuksissa. Napsauta suoratoistaaksesi silti.</string>
+ <string name="confirm_mobile_streaming_button_always">Salli aina</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Lisää jonoon</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Salli väliaikaisesti</string>
<!--Mediaplayer messages-->
<string name="player_error_msg">Virhe!</string>
- <string name="player_stopped_msg">Media ei soi</string>
- <string name="player_preparing_msg">Valmistelee</string>
+ <string name="player_stopped_msg">Mediaa ei toisteta</string>
+ <string name="player_preparing_msg">Valmistellaan</string>
<string name="player_ready_msg">Valmis</string>
- <string name="player_seeking_msg">Hakee</string>
- <string name="playback_error_server_died">Palvelin tipahti</string>
+ <string name="player_seeking_msg">Haetaan</string>
+ <string name="playback_error_server_died">Palvelin lakkasi toimimasta</string>
+ <string name="playback_error_unsupported">Ei tuettu mediatyyppi</string>
+ <string name="playback_error_timeout">Toiminto aikakatkaistiin</string>
+ <string name="playback_error_source">Mediatiedostoa ei voida käyttää</string>
<string name="playback_error_unknown">Tuntematon virhe</string>
- <string name="no_media_playing_label">Media ei soi</string>
- <string name="player_buffering_msg">Bufferoi</string>
+ <string name="no_media_playing_label">Mediaa ei toisteta</string>
+ <string name="player_buffering_msg">Puskuroidaan</string>
<string name="player_go_to_picture_in_picture">Kuva-kuvassa-tila</string>
<string name="unknown_media_key">AntennaPod - Tuntematon media avain: %1$d</string>
+ <string name="error_file_not_found">Tiedostoa ei löytynyt</string>
<!--Queue operations-->
<string name="lock_queue">Lukitse jono</string>
<string name="unlock_queue">Avaa jono</string>
<string name="queue_locked">Jono lukittu</string>
<string name="queue_unlocked">Jono avattu</string>
+ <string name="queue_lock_warning">Jos lukitset jonon, et voi enää sipaista tai lajitella jaksoja uudelleen.</string>
+ <string name="checkbox_do_not_show_again">Älä näytä uudestaan</string>
<string name="clear_queue_label">Tyhjennä jono</string>
<string name="undo">Peruuta</string>
<string name="move_to_top_label">Siirrä ylimmäiseksi</string>
<string name="move_to_bottom_label">Siirrä alimmaikseksi</string>
<string name="sort">Lajittele</string>
+ <string name="keep_sorted">Pidä lajiteltuna</string>
<string name="date">Päivä</string>
<string name="duration">Kesto</string>
<string name="episode_title">Jakson otsikko</string>
@@ -260,96 +291,119 @@
<string name="smart_shuffle">Älykäs sekoitus</string>
<string name="ascending">Nouseva</string>
<string name="descending">Laskeva</string>
- <string name="clear_queue_confirmation_msg">Varmista että haluat tyhjentää jonon KAIKISTA jaksoista</string>
+ <string name="clear_queue_confirmation_msg">Vahvista, että haluat tyhjentää jonon KAIKISTA jaksoista</string>
<string name="time_left_label">Aikaa jäljellä:\u0020</string>
<!--Variable Speed-->
- <string name="download_plugin_label">Lataa plugin</string>
- <string name="no_playback_plugin_title">Plugin ei asennettu</string>
+ <string name="download_plugin_label">Lataa laajennus</string>
+ <string name="no_playback_plugin_title">Laajennus ei asennettu</string>
+ <string name="no_playback_plugin_or_sonic_msg">Vaihtelevan nopeuden toiston toimimiseksi suosittelemme ottamaan käyttöön sisäänrakennetun Sonic-mediasoittimen.</string>
<string name="set_playback_speed_label">Soittonopeudet</string>
- <string name="enable_sonic">Aloita Sonic</string>
+ <string name="enable_sonic">Ota Sonic käyttöön</string>
<!--Empty list labels-->
<string name="no_items_header_label">Ei jaksoja jonossa</string>
- <string name="no_items_label">Lisää jakso lataamalla ja painamalla pitkään jaksoa ja valitse \"Lisää jonoon\".</string>
+ <string name="no_items_label">Lisää jakso lataamalla se, tai painamalla sitä pitkään ja valitsemalla \"Lisää jonoon\".</string>
<string name="no_shownotes_label">Jaksolla ei ole jaksomuistiota</string>
<string name="no_run_downloads_head_label">Ei latauksia</string>
<string name="no_run_downloads_label">Voit ladata jakson podcastin lisätietosivulla.</string>
<string name="no_comp_downloads_head_label">Ei ladattuja jaksoja</string>
<string name="no_comp_downloads_label">Voit ladata jakson podcastin listätietosivulla.</string>
- <string name="no_log_downloads_head_label">Ei latauksien logia</string>
- <string name="no_log_downloads_label">Latauslogi ilmestyy tänne kun se on saatavilla.</string>
+ <string name="no_log_downloads_head_label">Ei latauslokia</string>
+ <string name="no_log_downloads_label">Latausloki ilmestyy tänne, kun se on saatavilla.</string>
<string name="no_history_head_label">Ei historiaa</string>
<string name="no_history_label">Jakson kuuntelun jälkeen se ilmestyy tänne.</string>
<string name="no_all_episodes_head_label">Ei jaksoja</string>
- <string name="no_all_episodes_label">Kun lisää podcastin sen jaksot näkyvät täällä.</string>
+ <string name="no_all_episodes_label">Kun lisää podcastin, sen jaksot näkyvät täällä.</string>
<string name="no_new_episodes_head_label">Ei uusia jaksoja</string>
- <string name="no_new_episodes_label">Kun uusia jaksoja ilmestyy ne näkyvät täällä.</string>
+ <string name="no_new_episodes_label">Kun uusia jaksoja ilmestyy, ne näkyvät täällä.</string>
<string name="no_fav_episodes_head_label">Ei suosikkijaksoja</string>
<string name="no_fav_episodes_label">Voit lisätä jaksoja suosikkeihin painamalla niitä pitkään.</string>
<string name="no_chapters_head_label">Ei kappaleita</string>
<string name="no_chapters_label">Jaksolla ei ole kappaleita.</string>
+ <string name="no_subscriptions_head_label">Ei tilauksia</string>
+ <string name="no_subscriptions_label">Tilataksesi podcastin, paina plus-kuvaketta alla</string>
<!--Preferences-->
<string name="storage_pref">Tallennus</string>
+ <string name="storage_sum">Jakson automaattinen poisto, tuonti, vienti</string>
<string name="project_pref">Projekti</string>
<string name="queue_label">Jono</string>
+ <string name="synchronization_pref">Synkronointi</string>
+ <string name="synchronization_sum">Synkronoi muiden laitteiden kanssa käyttäen gpodder.net-palvelua</string>
<string name="automation">Automaatio</string>
<string name="download_pref_details">Tietoja</string>
<string name="import_export_pref">Tuo/Vie</string>
- <string name="import_export_search_keywords">backup, palautus</string>
+ <string name="import_export_search_keywords">varmuuskopiointi, palautus</string>
<string name="appearance">Näkymä</string>
<string name="external_elements">Ulkoiset elementit</string>
<string name="interruptions">Keskeytykset</string>
- <string name="playback_control">Soiton kontrollit</string>
- <string name="media_player">Mediasoitto</string>
+ <string name="playback_control">Toistonhallinta</string>
+ <string name="preference_search_hint">Hae...</string>
+ <string name="preference_search_no_results">Ei tuloksia</string>
+ <string name="preference_search_clear_history">Tyhjennä historia</string>
+ <string name="media_player">Mediasoitin</string>
<string name="pref_episode_cleanup_title">Jakson siivous</string>
<string name="pref_episode_cleanup_summary">Jaksot, jotka eivät ole jonossa ja eivät ole suosikkeja tulisi olla valmiita poistoon jos Automaattiinen lataus tarvitsee tilaa uusille jaksoille</string>
<string name="pref_pauseOnDisconnect_sum">Pysäytä soitto kun kuulokkeet tai bluetooth katkaistaan</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Jatka soittoa kun kuulokkeet yhdistetään uudestaan</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Jatka soittoa kun bluetooth yhdistyy uudestaan</string>
- <string name="pref_hardwareForwardButtonSkips_title">Seuraava nappi skippaa</string>
- <string name="pref_hardwareForwardButtonSkips_sum">Kun painetaan seuraava nappia bluetooth-laitteessa, hyppää seuraavaan jaksoon etuhaun sijasta.</string>
- <string name="pref_hardwarePreviousButtonRestarts_title">Edellinen nappi uudelleenaloittaa</string>
- <string name="pref_hardwarePreviousButtonRestarts_sum">Kun painetaan edellinen nappia, uudelleenkäynnistä nykyinen jakso takaisinhaun sijasta</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Seuraava nappi ohittaa</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Kun painetaan seuraava-nappia bluetooth-laitteessa, hyppää seuraavaan jaksoon eteenpäin siirtymisen sijasta.</string>
+ <string name="pref_hardwarePreviousButtonRestarts_title">Edellinen-nappi aloittaa alusta</string>
+ <string name="pref_hardwarePreviousButtonRestarts_sum">Kun painetaan edellinen-nappia, aloita nykyinen jakso alusta taaksepäin siirtymisen sijasta</string>
<string name="pref_followQueue_sum">Hyppää seuraavaan jonossa kun soitto valmistuu</string>
- <string name="pref_auto_delete_sum">Deletoi jakso kun soitto valmistuu</string>
- <string name="pref_auto_delete_title">Autodeletoi</string>
- <string name="pref_smart_mark_as_played_sum">Merkkaa jaksot soitetuiksi jos tietty määrä sekunteja soittoajasta on vielä jäljellä</string>
- <string name="pref_smart_mark_as_played_title">Älykäs soitetuksi merkkaus</string>
- <string name="pref_skip_keeps_episodes_sum">Säilytä jaksot kun ne skiptaaan</string>
- <string name="pref_skip_keeps_episodes_title">Säilytä skiptatut jaksot</string>
- <string name="pref_favorite_keeps_episodes_sum">Säilytä jaksot jotka on merkattu suosikeiksi</string>
+ <string name="pref_auto_delete_sum">Poista jakso toiston loputtua</string>
+ <string name="pref_auto_delete_title">Automaattinen poisto</string>
+ <string name="pref_smart_mark_as_played_sum">Merkitse jaksot soitetuiksi, vaikka vähemmän kuin tietty määrä sekunteja soittoajasta on vielä jäljellä</string>
+ <string name="pref_smart_mark_as_played_title">Älykäs soitetuksi merkitseminen</string>
+ <string name="pref_skip_keeps_episodes_sum">Säilytä jaksot, kun ne ohitetaan</string>
+ <string name="pref_skip_keeps_episodes_title">Säilytä ohitetut jaksot</string>
+ <string name="pref_favorite_keeps_episodes_sum">Säilytä suosikeiksi merkityt jaksot</string>
<string name="pref_favorite_keeps_episodes_title">Säilytä suosikkijaksot</string>
- <string name="playback_pref">Soitto</string>
+ <string name="playback_pref">Toisto</string>
+ <string name="playback_pref_sum">Kuulokkeiden ohjaimet, ohitusaikavälit, jono</string>
<string name="network_pref">Verkko</string>
- <string name="pref_autoUpdateIntervallOrTime_title">Päivitysintervalli tai ajankohta</string>
- <string name="pref_autoUpdateIntervallOrTime_message">Voit asettaa <i>intervallin</i> kuten \"joka 2 tuntia\", asettaa tietyn <i>ajankohdan</i> kuten \"7:00 AM\" tai <i>disabloida</i> automaattiset päivitykset.\n\n<small>Huomio: Päivitysajankohdat ovat epätarkkoja. Saatat huomata lyhyen välin.</small></string>
- <string name="pref_autoUpdateIntervallOrTime_Disable">Disabloi</string>
- <string name="pref_autoUpdateIntervallOrTime_Interval">Aseta intervalli</string>
+ <string name="network_pref_sum">Päivitysaikaväli, latauksen ohjaimet, mobiilidata</string>
+ <string name="pref_autoUpdateIntervallOrTime_title">Päivitysaikaväli tai -ajankohta</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Määritä aikaväli tai tietty ajankohta podcastien automaattiselle päivitykselle</string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Voit asettaa <i>aikavälin</i>, kuten \"2 tunnin välein\", tietyn <i>ajankohdan</i> kuten \"7.00\", tai <i>poistaa käytöstä</i> automaattiset päivitykset.\n\n<small>Huomio: Päivitysajankohdat ovat epätarkkoja. Lyhyt viive saattaa esiintyä.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_Disable">Poista käytöstä</string>
+ <string name="pref_autoUpdateIntervallOrTime_Interval">Aseta aikaväli</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Aseta ajankohta</string>
<string name="pref_autoUpdateIntervallOrTime_every">joka %1$s</string>
<string name="pref_autoUpdateIntervallOrTime_at">aika %1$s</string>
- <string name="pref_followQueue_title">Jatkuva soitto</string>
+ <string name="pref_followQueue_title">Jatkuva toisto</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Kuulokkeiden irrotus</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Kuulokkeiden uudelleenyhdistyminen</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth uudelleenyhdistyminen</string>
+ <string name="pref_stream_over_download_title">Suosi suoratoistoa</string>
+ <string name="pref_stream_over_download_sum">Näytä suoratoistonappi latausnapin sijaan listauksissa</string>
<string name="pref_mobileUpdate_title">Mobiilipäivitykset</string>
+ <string name="pref_mobileUpdate_sum">Valitse, mikä on sallittua mobiiliyhteydellä</string>
+ <string name="pref_mobileUpdate_refresh">Podcastien päivitys</string>
+ <string name="pref_mobileUpdate_images">Kansikuvat</string>
+ <string name="pref_mobileUpdate_auto_download">Automaattinen lataus</string>
+ <string name="pref_mobileUpdate_episode_download">Jaksojen lataus</string>
+ <string name="pref_mobileUpdate_streaming">Suoratoisto</string>
<string name="user_interface_label">Käyttöliittymä</string>
+ <string name="user_interface_sum">Ulkonäkö, tilausten järjestys, lukitusnäyttö</string>
<string name="pref_set_theme_title">Valitse teema</string>
<string name="pref_nav_drawer_items_title">Aseta navigointihyllyn asiat</string>
<string name="pref_nav_drawer_items_sum">Vaihda navigointihyllyssä esiintyviä asioita.</string>
<string name="pref_nav_drawer_feed_order_title">Aseta tilauksien järjestys</string>
<string name="pref_nav_drawer_feed_order_sum">Vaihda tilauksiesi järjestystä</string>
- <string name="pref_nav_drawer_feed_counter_title">Aseta tilauksien laskuri</string>
- <string name="pref_nav_drawer_feed_counter_sum">Vaihta tilauksien laskurin näyttämää informaatiota. Tämä vaikuttaa tilauksien järjestykseen jos \"Tilausjärjestys\" on asetettu \"Laskuri\".</string>
- <string name="pref_set_theme_sum">Vaihda AntennaPodin näkymää</string>
+ <string name="pref_nav_drawer_feed_counter_title">Aseta tilauslaskuri</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Vaihda tilauslaskurin näyttämiä tietoja. Tämä vaikuttaa myös tilauksien järjestykseen, jos \"Tilausjärjestys\" on \"Laskuri\".</string>
+ <string name="pref_set_theme_sum">Muuta AntennaPodin ulkonäköä</string>
<string name="pref_automatic_download_title">Automaattinen lataus</string>
<string name="pref_automatic_download_sum">Aseta jaksojen automaattinen lataus</string>
- <string name="pref_autodl_wifi_filter_title">Aseta Wi-Fi filtteri</string>
- <string name="pref_autodl_wifi_filter_sum">Salli automaatiset lataukset vain sallittujen Wi-Fi verkkojen kautta.</string>
- <string name="pref_automatic_download_on_battery_title">Lataa kun ei ladata akkua</string>
- <string name="pref_automatic_download_on_battery_sum">Salli automaattiset lataukset kun akku ei ole latautumassa</string>
+ <string name="pref_autodl_wifi_filter_title">Aseta Wi-Fi-suodatin</string>
+ <string name="pref_autodl_wifi_filter_sum">Salli automaattiset lataukset vain sallittujen Wi-Fi-verkkojen kautta.</string>
+ <string name="pref_automatic_download_on_battery_title">Lataa, kun akkua ei ladata</string>
+ <string name="pref_automatic_download_on_battery_sum">Salli automaattiset lataukset, kun akku ei ole latautumassa</string>
<string name="pref_parallel_downloads_title">Yhtäaikaiset lataukset</string>
<string name="pref_episode_cache_title">Jaksojen välimuisti</string>
- <string name="pref_episode_cache_summary">Ladattuja jaksoja yhteensä välimuistissa tällä laitteella. Automaattinen lataaminen pysäytetään jos tämä raja ylittyy.</string>
+ <string name="pref_episode_cache_summary">Ladattuja jaksoja yhteensä välimuistissa tällä laitteella. Automaattinen lataaminen pysäytetään, jos tämä raja ylittyy.</string>
+ <string name="pref_episode_cover_title">Käytä jakson kansikuvaa</string>
+ <string name="pref_episode_cover_summary">Käytä jaksokohtaista kansikuvaa, kun se on saatavilla. Jos tämä ei ole valittuna, sovellus käyttää aina podcastin kansikuvaa.</string>
<string name="pref_theme_title_light">Vaalea</string>
<string name="pref_theme_title_dark">Tumma</string>
<string name="pref_theme_title_trueblack">Musta (AMOLED valmis)</string>
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index 85423fb8a..c602960c3 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -487,7 +487,7 @@
<string name="media_player_switch_to_exoplayer">Utiliser ExoPlayer pour la lecture</string>
<string name="media_player_switched_to_exoplayer">Lecteur changé pour ExoPlayer</string>
<string name="pref_skip_silence_title">Supprimer les silences audios</string>
- <string name="pref_videoBehavior_title">Sorti du lecteur pendant une vidéo</string>
+ <string name="pref_videoBehavior_title">Sortie du lecteur pendant une vidéo</string>
<string name="pref_videoBehavior_sum">Définir ce qu\'il se passe si une vidéo est quittée pendant sa lecture</string>
<string name="stop_playback">Arrêter la lecture</string>
<string name="continue_playback">Continuer la lecture</string>
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">À propos</string>
<string name="antennapod_version">Version d\'AntennaPod</string>
+ <string name="contributors">Contributeurs</string>
+ <string name="contributors_summary">Tout le monde peut contribuer à l\'amélioration d\'AntennaPod - avec du code, des traductions ou en aidant les utilisateurs dans notre forum.</string>
<string name="developers">Développeurs</string>
- <string name="developers_summary">Tout le monde peut améliorer AntennaPod</string>
<string name="translators">Traducteurs</string>
- <string name="translators_summary">La traduction est faite par les utilisateurs d\'AntennaPod sur Transifex</string>
+ <string name="special_thanks">Remerciements spéciaux</string>
<string name="privacy_policy">Politique de confidentialité</string>
<string name="licenses">Licences</string>
<string name="licenses_summary">AntennaPod utilise le code d\'autres logiciels</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Sélectionner le fichier à importer</string>
<string name="import_ok">Import réussi.\n\nAppuyer sur OK pour redémarrer AntennaPod</string>
<string name="import_no_downgrade">La base de données a été exportée avec une version plus récente d\'AntennaPod. L\'application actuelle ne sait pas comment l\'importer.</string>
+ <string name="favorites_export_label">Exporter les favoris</string>
+ <string name="favorites_export_summary">Exporter les favoris dans un fichier</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Activer le minuteur</string>
<string name="disable_sleeptimer_label">Désactiver le minuteur</string>
diff --git a/core/src/main/res/values-gl/strings.xml b/core/src/main/res/values-gl/strings.xml
index 7ae7d4767..5b8278bbe 100644
--- a/core/src/main/res/values-gl/strings.xml
+++ b/core/src/main/res/values-gl/strings.xml
@@ -145,7 +145,7 @@
<string name="hide_not_queued_episodes_label">Fora da cola</string>
<string name="hide_downloaded_episodes_label">Descargado</string>
<string name="hide_not_downloaded_episodes_label">Non descargado</string>
- <string name="hide_has_media_label">Ten medios</string>
+ <string name="hide_has_media_label">Ten multimedia</string>
<string name="hide_is_favorite_label">É favorito</string>
<string name="filtered_label">Filtrado</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Erro na última actualización</string>
@@ -487,7 +487,7 @@
<string name="media_player_switch_to_exoplayer">Cambiar a ExoPlayer</string>
<string name="media_player_switched_to_exoplayer">Cambiaches a ExoPlayer.</string>
<string name="pref_skip_silence_title">Saltar silencio no Audio</string>
- <string name="pref_videoBehavior_title">Ao saír do vídeo</string>
+ <string name="pref_videoBehavior_title">Ó saír do vídeo</string>
<string name="pref_videoBehavior_sum">Comportamento cando saia do vídeo</string>
<string name="stop_playback">Para a reprodución</string>
<string name="continue_playback">Continuar a reprodución de audio</string>
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Sobre</string>
<string name="antennapod_version">Versión AntennaPod</string>
+ <string name="contributors">Colaboradoras</string>
+ <string name="contributors_summary">Calquera persoa pode axudar a mellorar AntennaPod - con código, traducións ou botando unha man no foro</string>
<string name="developers">Desenvolvedoras</string>
- <string name="developers_summary">Todas podemos axudar a mellorar AntennaPod</string>
<string name="translators">Tradutores</string>
- <string name="translators_summary">As traducións de AntennaPod realízanse utilizando Transifex</string>
+ <string name="special_thanks">Grazas especialmente a</string>
<string name="privacy_policy">Política de privacidade</string>
<string name="licenses">Licenzas</string>
<string name="licenses_summary">AntennaPod toma como fonte outro software</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Escolle o ficheiro a importar</string>
<string name="import_ok">Importación correcta.\n\nPulse OK para reiniciar AntennaPod</string>
<string name="import_no_downgrade">A base de datos foi exportada cunha versión máis recente de AntennaPod. A instalación actual non sabe como xestionar este ficheiro.</string>
+ <string name="favorites_export_label">Exportar favoritos</string>
+ <string name="favorites_export_summary">Exportar os favoritos a un ficheiro</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Establecer apagado automático</string>
<string name="disable_sleeptimer_label">Desactivar o apagado automático</string>
diff --git a/core/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml
index 23cf5df9f..55f7a5dbd 100644
--- a/core/src/main/res/values-hu/strings.xml
+++ b/core/src/main/res/values-hu/strings.xml
@@ -430,6 +430,8 @@
<string name="pref_feed_playback_speed_sum">A podcast epizódjainak indításakor használandó lejátszási sebesség</string>
<string name="pref_feed_skip">Automatikus kihagyás</string>
<string name="pref_feed_skip_sum">Bevezetők és lezárások kihagyása</string>
+ <string name="pref_feed_skip_ending">Utolsó másodpercek átugrása</string>
+ <string name="pref_feed_skip_intro">Első másodpercek átugrása</string>
<string name="pref_feed_skip_ending_toast">Utolsó %d másodperc kihagyvas</string>
<string name="pref_feed_skip_intro_toast">Első %d másodperc kihagyva</string>
<string name="pref_playback_time_respects_speed_title">Médiainformáció hozzáigazítása a lejátszási sebességhez</string>
@@ -505,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Névjegy</string>
<string name="antennapod_version">AntennaPod verzió</string>
+ <string name="contributors">Közreműködők</string>
+ <string name="contributors_summary">Mindenki, aki segített az AntennaPod még jobbá tételében – kóddal, fordítással vagy a felhasználók segítésével a fórumon.</string>
<string name="developers">Fejlesztők</string>
- <string name="developers_summary">Bárki segíthet az AntennaPod jobbá tételében</string>
<string name="translators">Fordítók</string>
- <string name="translators_summary">A fordításokat AntennaPod felhasználók készítik a Transifex segítségével</string>
+ <string name="special_thanks">Külön köszönet</string>
<string name="privacy_policy">Adatvédelmi nyilatkozat</string>
<string name="licenses">Licencek</string>
<string name="licenses_summary">Az AntennaPod más remek szoftvereket használ</string>
@@ -517,6 +520,13 @@
<string name="search_label">Keresés</string>
<string name="no_results_for_query">Nincs találat a következőre: „%1$s”</string>
<!--Synchronization-->
+ <string name="sync_status_started">Szinkronizálás elindítva</string>
+ <string name="sync_status_episodes_upload">Epizódváltozások feltöltése…</string>
+ <string name="sync_status_episodes_download">Epizódváltozások letöltése…</string>
+ <string name="sync_status_upload_played">Lejátszott állapot feltöltése…</string>
+ <string name="sync_status_subscriptions">Feliratkozások szinkronizálása…</string>
+ <string name="sync_status_success">Szinkronizálás sikeres</string>
+ <string name="sync_status_error">Szinkronizálás sikertelen</string>
<!--import and export-->
<string name="import_export_summary">Feliratkozások áthelyezése, és sorbaállítás egy másik eszközön</string>
<string name="database">Adatbázis</string>
@@ -536,6 +546,7 @@
<string name="html_export_label">HTML exportálása</string>
<string name="database_export_label">Adatbázis exportálása</string>
<string name="database_import_label">Adatbázis importálása</string>
+ <string name="database_import_warning">Az adatbázis importálása lecseréli a jelenlegi feliratkozásait és lejátszási előzményeit. Célszerű biztonsági mentésként exportálni a jelenlegi adatbázist. Biztos, hogy lecseréli?</string>
<string name="please_wait">Várjon…</string>
<string name="export_error_label">Exportálási hiba</string>
<string name="export_success_title">Exportálás sikeres</string>
@@ -544,13 +555,15 @@
<string name="import_select_file">Importálandó fájl kiválasztása</string>
<string name="import_ok">Importálás sikeres.\n\nNyomja meg az OK gombot az AntennaPod újraindításához</string>
<string name="import_no_downgrade">Az adatbázis az AntennaPod egy újabb verziójából lett exportálva. A jelenlegi telepítése még nem tudja, hogyan kezelje ezt a fájlt.</string>
+ <string name="favorites_export_label">Kedvencek exportálása</string>
+ <string name="favorites_export_summary">Mentett kedvencek fájlba exportálása</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Alvási időzítő beállítása</string>
<string name="disable_sleeptimer_label">Alvási időzítő letiltása</string>
<string name="sleep_timer_label">Alvási időzít</string>
<string name="time_dialog_invalid_input">Érvénytelen bemenet, az időnek egész számnak kell lennie</string>
<string name="shake_to_reset_label">Rázás a visszaállításához</string>
- <string name="timer_vibration_label">Rövid vibrálás a befejezés előtt</string>
+ <string name="timer_vibration_label">Rövid rezgés a befejezés előtt</string>
<string name="time_seconds">másodperc</string>
<string name="time_minutes">perc</string>
<string name="time_hours">óra</string>
@@ -589,7 +602,7 @@
<string name="gpodnetauth_device_errorAlreadyUsed">Az eszközazonosító már használatban van</string>
<string name="gpodnetauth_device_caption_errorEmpty">A felirat nem lehet üres</string>
<string name="gpodnetauth_device_butChoose">Kiválasztás</string>
- <string name="gpodnetauth_finish_title">Bejelentkezés sikertelen</string>
+ <string name="gpodnetauth_finish_title">Bejelentkezés sikeres!</string>
<string name="gpodnetauth_finish_descr">Gratulálunk! A gpodder.net fiókja most már össze van kapcsolva az eszközével. Az AntennaPod automatikusan szinkronizálja az eszközén lévő feliratkozásait a gpodder.net fiókjával.</string>
<string name="gpodnetauth_finish_butsyncnow">Szinkronizálás indítása most</string>
<string name="gpodnetauth_finish_butgomainscreen">Ugrás a főképernyőre</string>
@@ -627,16 +640,23 @@
<string name="subscribe_label">Feliratkozás</string>
<string name="subscribing_label">Feliratkozás…</string>
<string name="preview_episode">Előnézet</string>
+ <string name="stop_preview">Előnézet leállítása</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Visszatekerés</string>
<string name="fast_forward_label">Előretekerés</string>
+ <string name="increase_speed">Sebesség növelése</string>
+ <string name="decrease_speed">Sebesség csökkentése</string>
<string name="media_type_audio_label">Hang</string>
<string name="media_type_video_label">Videó</string>
<string name="navigate_upwards_label">Navigálás felfelé</string>
<string name="status_downloading_label">Az epizód letöltés alatt van</string>
<string name="in_queue_label">Az epizód sorba van állítva </string>
+ <string name="is_favorite_label">Epizód megjelölve kedvencként</string>
<string name="drag_handle_content_description">Húzza az elem pozíciójának módosításához</string>
<string name="load_next_page_label">Következő oldal betöltése</string>
+ <string name="switch_pages">Lapok váltása</string>
+ <string name="position">Pozíció: %1$s</string>
+ <string name="apply_action">Művelet alkalmazása</string>
<!--Feed information screen-->
<string name="authentication_label">Hitelesítés</string>
<string name="authentication_descr">A felhasználónév és jelszó módosítása ennél a podcastnál és az epizódoknál.</string>
@@ -662,6 +682,7 @@
<string name="browse_gpoddernet_label">A gpodder.net böngészése</string>
<string name="discover">Felfedezés</string>
<string name="discover_more">több »</string>
+ <string name="search_powered_by">Keresés a(z) %1$s segítségével</string>
<string name="filter">Szűrő</string>
<!--Episodes apply actions-->
<string name="all_label">Összes</string>
@@ -689,6 +710,12 @@
<string name="sort_date_old_new">Dátum (régi \u2192 új)</string>
<string name="sort_duration_short_long">Hossz (rövid \u2192 hosszú)</string>
<string name="sort_duration_long_short">Hossz (hosszú \u2192 rövid)</string>
+ <string name="sort_a_z">A \u2192 Z</string>
+ <string name="sort_z_a">Z \u2192 A</string>
+ <string name="sort_new_old">Új \u2192 régi</string>
+ <string name="sort_old_new">Régi \u2192 új</string>
+ <string name="sort_short_long">Rövid \u2192 hosszú</string>
+ <string name="sort_long_short">Hosszú \u2192 rövid</string>
<!--Rating dialog-->
<string name="rating_title">Kedveli az AntennaPodot?</string>
<string name="rating_message">Értékelnénk, ha időt szánna az AntennaPod értékelésére.</string>
@@ -726,7 +753,7 @@
<string name="cast_failed_to_play">A médialejátszás indítása sikertelen</string>
<string name="cast_failed_to_stop">A médialejátszás leállítása sikertelen</string>
<string name="cast_failed_to_pause">A médialejátszás szüneteltetése sikertelen</string>
- <string name="cast_failed_setting_volume">Hiba a hangerő beállításakor</string>
+ <string name="cast_failed_setting_volume">A hangerő beállítása sikertelen</string>
<string name="cast_failed_no_connection">Nincs kapcsolat a továbbításhoz használandó eszközzel</string>
<string name="cast_failed_no_connection_trans">A kapcsolat megszakadt a továbbításhoz használandó eszközzel. Az alkalmazás próbál újrakapcsolódni, ha lehetséges. Várjon néhány másodpercet, és próbálja újra.</string>
<string name="cast_failed_status_request">Nem sikerült szinkronizálni a továbbításhoz használt eszközön</string>
@@ -749,4 +776,7 @@
<string name="widget_create_button">Widget létrehozása</string>
<string name="widget_opacity">Átlátszatlanság</string>
<!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Beállítás sikeresen frissítve.</string>
+ <string name="on_demand_config_stream_text">Úgy néz ki, hogy sokszor használja a közvetítést. Szeretné megjeleníteni a közvetítési gombokat az epizódlistákban?</string>
+ <string name="on_demand_config_download_text">Úgy néz ki, hogy sokszor tölt le. Szeretné megjeleníteni a letöltési gombokat az epizódlistákban?</string>
</resources>
diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml
index 988e5472b..abd08d2cc 100644
--- a/core/src/main/res/values-it/strings.xml
+++ b/core/src/main/res/values-it/strings.xml
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Informazioni</string>
<string name="antennapod_version">Versione di AntennaPod</string>
+ <string name="contributors">Contributori</string>
+ <string name="contributors_summary">Tutti possono contribuire a rendere AntennaPod migliore - programmando, traducendo o aiutando gli utenti nel nostro forum</string>
<string name="developers">Sviluppatori</string>
- <string name="developers_summary">Chiunque può contribuire a rendere AntennaPod migliore</string>
<string name="translators">Traduttori</string>
- <string name="translators_summary">Le traduzioni sono create dagli utenti di AntennaPod grazie a Transifex</string>
+ <string name="special_thanks">Ringraziamenti speciali</string>
<string name="privacy_policy">Privacy policy</string>
<string name="licenses">Licenze</string>
<string name="licenses_summary">AntennaPod usa altri ottimi software</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Scegli file da importare</string>
<string name="import_ok">Importazione eseguita.\n\nPremi OK per riavviare AntennaPod</string>
<string name="import_no_downgrade">Questo database è stato esportato da una versione più recente di AntennaPod. La tua applicazione attuale non sa ancora come gestire questo file.</string>
+ <string name="favorites_export_label">Esporta preferiti</string>
+ <string name="favorites_export_summary">Esporta preferiti su file</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Imposta timer</string>
<string name="disable_sleeptimer_label">Disabilita il timer di spegnimento</string>
diff --git a/core/src/main/res/values-iw/strings.xml b/core/src/main/res/values-iw/strings.xml
index 2b9f57f52..1e9f3f246 100644
--- a/core/src/main/res/values-iw/strings.xml
+++ b/core/src/main/res/values-iw/strings.xml
@@ -527,10 +527,11 @@
<!--About screen-->
<string name="about_pref">על אודות</string>
<string name="antennapod_version">גרסת אנטנה־פּוֹד</string>
+ <string name="contributors">מתנדבים</string>
+ <string name="contributors_summary">כל אחד ואחת יכולים לסייע בשיפור AntennaPod באמצעות תרומת קוד, תרגום או באמצעות סיוע למשתמשים שלנו בפורום</string>
<string name="developers">מפתחים</string>
- <string name="developers_summary">כולם יכולים לסייע בשיפור אנטנה־פּוֹד</string>
<string name="translators">מתרגמים</string>
- <string name="translators_summary">תרגומים נוצרים על ידי משתמשים של אנטנה־פּוֹד בעזרת Transifex</string>
+ <string name="special_thanks">תודות מיוחדות</string>
<string name="privacy_policy">מדיניות פרטיות</string>
<string name="licenses">רישיונות</string>
<string name="licenses_summary">היישומון אנטנה־פּוֹד משתמש בתכניות נהדרות נוספות</string>
@@ -574,6 +575,8 @@
<string name="import_select_file">בחירת קובץ לייבוא</string>
<string name="import_ok">הייבוא הצליח.\n\nנא ללחוץ על אישור כדי להפעיל את אנטנה־פּוֹד מחדש</string>
<string name="import_no_downgrade">מסד נתונים זה ייוצא עם גרסה עדכנית יותר של אנטנה־פ‎וֹד</string>
+ <string name="favorites_export_label">ייצוא מועדפים</string>
+ <string name="favorites_export_summary">ייצור המועדפים השמורים לקובץ</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">הגדרת מתזמן שינה</string>
<string name="disable_sleeptimer_label">השבתת מתזמן שינה</string>
diff --git a/core/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml
index b1d14e9d4..ac9c49a2e 100644
--- a/core/src/main/res/values-ja/strings.xml
+++ b/core/src/main/res/values-ja/strings.xml
@@ -481,9 +481,7 @@
<string name="about_pref">AntennaPodについて</string>
<string name="antennapod_version">AntennaPod バージョン</string>
<string name="developers">開発者</string>
- <string name="developers_summary">誰でも AntennaPod の改善に貢献できます</string>
<string name="translators">翻訳者</string>
- <string name="translators_summary">翻訳は、Transifex を使用してAntennaPod のユーザーが作成します</string>
<string name="privacy_policy">プライバシーポリシー</string>
<string name="licenses">ライセンス</string>
<string name="licenses_summary">AntennaPod は他の優れたソフトウェアを使用しています</string>
diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml
index 04e732a3c..28f79aca7 100644
--- a/core/src/main/res/values-ko/strings.xml
+++ b/core/src/main/res/values-ko/strings.xml
@@ -497,10 +497,11 @@
<!--About screen-->
<string name="about_pref">정보</string>
<string name="antennapod_version">안테나팟 버전</string>
+ <string name="contributors">기여한 분들</string>
+ <string name="contributors_summary">코드, 번역, 포럼에서 사용자를 돕는 일 등, 안테나팟을 더 좋게 만드는데 누구나 도움을 주실 수 있습니다. </string>
<string name="developers">개발자</string>
- <string name="developers_summary">안테나팟을 더 낫게 만드는데 도움을 준 모든 분</string>
<string name="translators">번역자</string>
- <string name="translators_summary">번역은 안테나팟 사용자들이 Transifex를 사용해 만듭니다.</string>
+ <string name="special_thanks">특별히 감사</string>
<string name="privacy_policy">개인 정보 정책</string>
<string name="licenses">라이선스</string>
<string name="licenses_summary">안테나팟은 여러가지 위대한 소프트웨어를 사용하고 있습니다</string>
@@ -544,6 +545,8 @@
<string name="import_select_file">가져올 파일을 선택하십시오</string>
<string name="import_ok">내보내기 성공.\n\n안테나팟을 다시 시작하려면 확인을 누르십시오</string>
<string name="import_no_downgrade">이 데이터베이스는 더 새로운 버전의 안테나팟에서 내보낸 데이터베이스입니다. 현재 설치된 버전의 안테나팟에서는 이 파일을 제대로 처리하지 못할 수도 있습니다.</string>
+ <string name="favorites_export_label">즐겨찾기 내보내기</string>
+ <string name="favorites_export_summary">저장한 즐겨찾기를 파일로 내보내기</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">취침 타이머 설정</string>
<string name="disable_sleeptimer_label">취침 타이머 사용 않음</string>
diff --git a/core/src/main/res/values-lt/strings.xml b/core/src/main/res/values-lt/strings.xml
index ad6f4bc71..380a68120 100644
--- a/core/src/main/res/values-lt/strings.xml
+++ b/core/src/main/res/values-lt/strings.xml
@@ -2,13 +2,14 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activity and fragment titles-->
<string name="feed_update_receiver_name">Atnaujinti prenumeratas</string>
+ <string name="feeds_label">Tinklalaidės</string>
<string name="statistics_label">Statistika</string>
<string name="add_feed_label">Pridėti tinklalaidę</string>
<string name="episodes_label">Epizodai</string>
<string name="all_episodes_short_label">Visi</string>
<string name="new_episodes_label">Nauji</string>
- <string name="favorite_episodes_label">Mėgiami</string>
- <string name="new_label">Nauji</string>
+ <string name="favorite_episodes_label">Mėgstami</string>
+ <string name="new_label">Naujas</string>
<string name="settings_label">Nustatymai</string>
<string name="downloads_label">Atsiuntimai</string>
<string name="downloads_running_label">Vykdomi</string>
@@ -22,6 +23,8 @@
<string name="gpodnet_auth_label">gpodder.net prisijungimas</string>
<string name="episode_cache_full_title">Epizodų podėlis pilnas</string>
<string name="episode_cache_full_message">Pasiektas epizodų podėlio dydžio limitas. Nustatymuose galite padidinti podėlio dydį.</string>
+ <string name="playback_statistics_label">Atkūrimas</string>
+ <string name="download_statistics_label">Atsiuntimai</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Bendra perklausytų tinklalaidžių trukmė:</string>
<string name="statistics_details_dialog">Paleisti %1$d iš %2$d epizodų.\n\nPerklausyta %3$s iš %4$s.</string>
@@ -30,7 +33,9 @@
<string name="statistics_mode_count_all">Sumuoti visas tinklalaides, pažymėtas kaip perklausytas</string>
<string name="statistics_speed_not_counted">Atkreipkite dėmesį: į atkūrimo spartą neatsižvelgiama.</string>
<string name="statistics_reset_data">Nustatyti statistikos duomenis iš naujo</string>
+ <string name="statistics_reset_data_msg">Bus išvalyta visų epizodų perklausytos trukmės istorija. Ar tikrai norite tęsti?</string>
<!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Bendras atsiųstų tinklalaidžių dydis:</string>
<!--Main activity-->
<string name="drawer_open">Atverti meniu</string>
<string name="drawer_close">Užverti meniu</string>
@@ -38,7 +43,7 @@
<string name="drawer_feed_order_unplayed_episodes">Rikiuoti pagal skaitiklio reikšmę</string>
<string name="drawer_feed_order_alphabetical">Rikiuoti pagal abėcėlę</string>
<string name="drawer_feed_order_last_update">Rikiuoti pagal publikavimo datą</string>
- <string name="drawer_feed_order_most_played">Rikiuoti pagal perklausytų epizodų kiekį</string>
+ <string name="drawer_feed_order_most_played">Rikiuoti pagal perklausytų epizodų skaičių</string>
<string name="drawer_feed_counter_new_unplayed">Naujų, dar neperklausytų epizodų skaičius</string>
<string name="drawer_feed_counter_new">Naujų epizodų skaičius</string>
<string name="drawer_feed_counter_unplayed">Neperklausytų epizodų skaičius</string>
@@ -79,6 +84,11 @@
<string name="auto_download_apply_to_items_title">Pritaikyti ankstesniems epizodams</string>
<string name="auto_download_apply_to_items_message">Naujieji <i>Automatinio atsiuntimo</i> nustatymai bus automatiškai pritaikyti naujiems epizodams.\nAr norite šiuos nustatymus taip pat pritaikyti ir anksčiau išleistiems epizodams?</string>
<string name="auto_delete_label">Automatiškai trinti epizodus</string>
+ <string name="feed_volume_reduction">Garsio mažinimas</string>
+ <string name="feed_volume_reduction_summary">Sumažinti garsį šio sklaidos kanalo epizodams: %1$s</string>
+ <string name="feed_volume_reduction_off">Išjungta</string>
+ <string name="feed_volume_reduction_light">Švelniai</string>
+ <string name="feed_volume_reduction_heavy">Gausiai</string>
<string name="parallel_downloads_suffix">\u0020lygiagretūs atsiuntimai</string>
<string name="feed_auto_download_global">Globali numatytoji</string>
<string name="feed_auto_download_always">Visada</string>
@@ -87,17 +97,33 @@
<string name="episode_cleanup_never">Niekada</string>
<string name="episode_cleanup_queue_removal">Jei nėra eilėje</string>
<string name="episode_cleanup_after_listening">Pabaigus klausyti</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">Praėjus 1 valandai po perklausymo</item>
+ <item quantity="few">Praėjus %d valandoms po perklausymo</item>
+ <item quantity="many">Praėjus %d valandoms po perklausymo</item>
+ <item quantity="other">Praėjus %d valandoms po perklausymo</item>
+ </plurals>
<plurals name="episode_cleanup_days_after_listening">
<item quantity="one">Praėjus 1 dienai nuo perklausymo</item>
<item quantity="few">Praėjus %d dienoms nuo perklausymo</item>
<item quantity="many">Praėjus %d dienų nuo perklausymo</item>
<item quantity="other">Praėjus %d dienų nuo perklausymo</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d pažymėtas</item>
+ <item quantity="few">%d pažymėti</item>
+ <item quantity="many">%d pažymėti</item>
+ <item quantity="other">%d pažymėti</item>
+ </plurals>
+ <string name="loading_more">Įkeliama daugiau...</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Pažymėti visus kaip perklausytus</string>
<string name="mark_all_read_msg">Visi epizodai pažymėti kaip perklausyti</string>
<string name="mark_all_read_confirmation_msg">Patvirtinkite, jog norite pažymėti visus epizodus kaip perklausytus.</string>
<string name="mark_all_read_feed_confirmation_msg">Patvirtinkite, jog norite pažymėti visus šios tinklalaidės epizodus kaip perklausytus.</string>
+ <string name="remove_all_new_flags_label">Pašalinti visas „naujas“ gaireles</string>
+ <string name="removed_all_new_flags_msg">Visos „naujas“ gairelės pašalintos</string>
+ <string name="remove_all_new_flags_confirmation_msg">Patvirtinkite, jog norite pašalinti „naujas“ gairelę visiems epizodams.</string>
<string name="show_info_label">Rodyti informaciją</string>
<string name="show_feed_settings_label">Rodyti tinklalaidės nustatymus</string>
<string name="feed_info_label">Tinklalaidės informacija</string>
@@ -108,11 +134,14 @@
<string name="share_link_label">Dalintis epizodo URL</string>
<string name="share_link_with_position_label">Dalintis epizodo URL su pozicija</string>
<string name="share_file_label">Dalintis failu</string>
+ <string name="share_website_url_label">Dalintis svetainės URL</string>
+ <string name="share_feed_url_label">Dalintis tinklalaidės URL</string>
<string name="share_item_url_label">Dalintis medijos failo URL</string>
<string name="share_item_url_with_position_label">Dalintis medijos failo adresu su pozicija</string>
<string name="feed_delete_confirmation_msg">Patvirtinkite, jog norite ištrinti tinklalaidę „%1$s“ ir VISUS jos epizodus (įskaitant atsiųstus epizodus).</string>
<string name="feed_remover_msg">Tinklalaidė šalinama</string>
<string name="load_complete_feed">Atnaujinti visą tinklalaidę</string>
+ <string name="multi_select">Pažymėti keletą</string>
<string name="select_all_above">Pažymėti visus aukščiau</string>
<string name="select_all_below">Pažymėti visus žemiau</string>
<string name="hide_unplayed_episodes_label">Neperklausyti</string>
@@ -123,10 +152,11 @@
<string name="hide_downloaded_episodes_label">Atsiųsti</string>
<string name="hide_not_downloaded_episodes_label">Neatsiųsti</string>
<string name="hide_has_media_label">Turintys medijos failų</string>
- <string name="hide_is_favorite_label">Yra mėgiamas</string>
+ <string name="hide_is_favorite_label">Mėgstami</string>
<string name="filtered_label">Filtruota</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Paskutinis atnaujinimas nepavyko</string>
<string name="open_podcast">Atverti tinklalaidę</string>
+ <string name="please_wait_for_data">Prašome luktelėti, kol duomenys bus įkelti</string>
<!--actions on feeditems-->
<string name="download_label">Atsisiųsti</string>
<plurals name="downloading_batch_label">
@@ -147,22 +177,53 @@
<item quantity="many">%d epizodai ištrinti.</item>
<item quantity="other">%d epizodai ištrinti.</item>
</plurals>
+ <string name="remove_new_flag_label">Pašalinti „naujas“ gairelę</string>
+ <string name="removed_new_flag_label">„naujas“ gairelė pašalinta</string>
<string name="mark_read_label">Pažymėti kaip perklausytą</string>
<string name="marked_as_read_label">Pažymėtas kaip perklausytas</string>
+ <string name="mark_read_no_media_label">Pažymėti kaip perskaitytą</string>
+ <string name="marked_as_read_no_media_label">Pažymėtas kaip perskaitytas</string>
+ <string name="play_this_to_seek_position">Norint peršokti į poziciją reikia pradėti epizodo atkūrimą</string>
+ <plurals name="marked_read_batch_label">
+ <item quantity="one">%d epizodas pažymėtas kaip perklausytas.</item>
+ <item quantity="few">%d epizodai pažymėti kaip perklausyti.</item>
+ <item quantity="many">%d epizodai pažymėti kaip perklausyti.</item>
+ <item quantity="other">%d epizodai pažymėti kaip perklausyti.</item>
+ </plurals>
<string name="mark_unread_label">Pažymėti kaip neperklausytą</string>
+ <string name="mark_unread_label_no_media">Pažymėti kaip neperskaitytą</string>
+ <plurals name="marked_unread_batch_label">
+ <item quantity="one">%d epizodas pažymėtas kaip neperklausytas.</item>
+ <item quantity="few">%d epizodai pažymėti kaip neperklausyti.</item>
+ <item quantity="many">%d epizodai pažymėti kaip neperklausyti.</item>
+ <item quantity="other">%d epizodai pažymėti kaip neperklausyti.</item>
+ </plurals>
<string name="add_to_queue_label">Pridėti į eilę</string>
<string name="added_to_queue_label">Pridėtas į eilę</string>
+ <plurals name="added_to_queue_batch_label">
+ <item quantity="one">%d epizodas pridėtas į eilę.</item>
+ <item quantity="few">%d epizodai pridėti į eilę.</item>
+ <item quantity="many">%d epizodai pridėti į eilę.</item>
+ <item quantity="other">%d epizodai pridėti į eilę.</item>
+ </plurals>
<string name="remove_from_queue_label">Pašalinti iš eilės</string>
- <string name="add_to_favorite_label">Pridėti prie mėgiamų</string>
- <string name="added_to_favorites">Pridėtas prie mėgiamų</string>
- <string name="remove_from_favorite_label">Pašalinti iš mėgiamų</string>
- <string name="removed_from_favorites">Pašalintas iš mėgiamų</string>
+ <plurals name="removed_from_queue_batch_label">
+ <item quantity="one">%d epizodas pašalintas iš eilės.</item>
+ <item quantity="few">%d epizodai pašalinti iš eilės.</item>
+ <item quantity="many">%d epizodai pašalinti iš eilės.</item>
+ <item quantity="other">%d epizodai pašalinti iš eilės.</item>
+ </plurals>
+ <string name="add_to_favorite_label">Pridėti prie mėgstamų</string>
+ <string name="added_to_favorites">Pridėtas prie mėgstamų</string>
+ <string name="remove_from_favorite_label">Pašalinti iš mėgstamų</string>
+ <string name="removed_from_favorites">Pašalintas iš mėgstamų</string>
<string name="visit_website_label">Aplankyti svetainę</string>
<string name="skip_episode_label">Praleisti epizodą</string>
<string name="activate_auto_download">Įjungti automatinį atsiuntimą</string>
<string name="deactivate_auto_download">Išjungti automatinį atsiuntimą</string>
<string name="reset_position">Nustatyti atkūrimo poziciją iš naujo</string>
<string name="removed_item">Elementas pašalintas</string>
+ <string name="no_items_selected">Nėra pažymėtų elementų</string>
<!--Download messages and labels-->
<string name="download_successful">sėkmingi</string>
<string name="download_pending">Laukia atsiuntimo</string>
@@ -183,6 +244,7 @@
<string name="download_canceled_msg">Atsiuntimas atšauktas</string>
<string name="download_canceled_autodownload_enabled_msg">Atsiuntimas atšauktas\n<i>Automatinis atsiuntimas</i> šiam elementui išjungtas</string>
<string name="download_report_title">Atsiuntimai užbaigti su klaida (-omis)</string>
+ <string name="auto_download_report_title">Automatiniai atsiuntimai užbaigti</string>
<string name="download_report_content_title">Atsiuntimų ataskaita</string>
<string name="download_error_malformed_url">Netvarkingas URL</string>
<string name="download_error_io_error">Įvesties/išvesties klaida</string>
@@ -201,11 +263,14 @@
<string name="download_type_feed">Sklaidos kanalas</string>
<string name="download_type_media">Medijos failas</string>
<string name="download_request_error_dialog_message_prefix">Įvyko klaida bandant atsisiųsti failą:\u0020</string>
+ <string name="null_value_podcast_error">Nėra pateiktų tinklalaidžių, kurios galėtų būti rodomos.</string>
<string name="authentication_notification_title">Reikalingas tapatumo nustatymas</string>
<string name="authentication_notification_msg">Šis išteklius reikalauja vartotojo vardo bei slaptažodžio</string>
<string name="confirm_mobile_download_dialog_title">Patvirtinkite atsiuntimą mobiliuoju internetu</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">Atsiuntimas mobiliuoju internetu išjungtas nustatymuose.\n\nGalite pasirinkti tik pridėti epizodą į eilę arba laikinai leisti atsiuntimą.\n\n<small>Jūsų pasirinkimas bus prisimenamas 10 minučių.</small></string>
<string name="confirm_mobile_download_dialog_message">Atsiuntimas mobiliuoju internetu išjungtas nustatymuose.\n\nAr norite laikinai leisti atsiuntimą?\n\n<small>Jūsų pasirinkimas bus prisimenamas 10 minučių.</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Patvirtinkite tiesioginį klausymąsi mobiliuoju internetu</string>
+ <string name="confirm_mobile_streaming_notification_message">Tiesioginis klausymasis mobiliuoju internetu išjungtas nustatymuose. Spustelėkite, jei vis tiek norite klausytis tiesiogiai.</string>
<string name="confirm_mobile_streaming_button_always">Leisti visada</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Pridėti į eilę</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Laikinai leisti</string>
@@ -216,22 +281,28 @@
<string name="player_ready_msg">Pasiruošęs</string>
<string name="player_seeking_msg">Ieškoma</string>
<string name="playback_error_server_died">Serveris nepasiekiamas</string>
+ <string name="playback_error_unsupported">Nepalaikomas medijos tipas</string>
+ <string name="playback_error_timeout">Baigėsi operacijai skirtas laikas</string>
+ <string name="playback_error_source">Prieiga prie medijos failo negalima</string>
<string name="playback_error_unknown">Nežinoma klaida</string>
<string name="no_media_playing_label">Atkūrimas nevyksta</string>
<string name="player_buffering_msg">Buferizuojama</string>
<string name="player_go_to_picture_in_picture">„Picture-in-picture“ režimas</string>
<string name="unknown_media_key">„AntennaPod“ – nežinomas medijos klavišas: %1$d</string>
+ <string name="error_file_not_found">Failas nerastas</string>
<!--Queue operations-->
<string name="lock_queue">Užrakinti eilę</string>
<string name="unlock_queue">Atrakinti eilę</string>
<string name="queue_locked">Eilė užrakinta</string>
<string name="queue_unlocked">Eilė atrakinta</string>
+ <string name="queue_lock_warning">Užrakinus eilę negalima mostelėti ar pertvarkyti epizodų.</string>
<string name="checkbox_do_not_show_again">Daugiau neberodyti</string>
<string name="clear_queue_label">Išvalyti eilę</string>
<string name="undo">Atšaukti</string>
<string name="move_to_top_label">Perkelti į viršų</string>
<string name="move_to_bottom_label">Perkelti į apačią</string>
<string name="sort">Rikiuoti</string>
+ <string name="keep_sorted">Išlaikyti rikiavimą</string>
<string name="date">Data</string>
<string name="duration">Trukmė</string>
<string name="episode_title">Epizodo pavadinimas</string>
@@ -245,34 +316,52 @@
<!--Variable Speed-->
<string name="download_plugin_label">Atsiųsti įskiepį</string>
<string name="no_playback_plugin_title">Įskiepis neįdiegtas</string>
+ <string name="no_playback_plugin_or_sonic_msg">Tinkamam kintamos atkūrimo spartos veikimui rekomenduojame įjungti įtaisytąją „Sonic“ medijos leistuvę.</string>
<string name="set_playback_speed_label">Atkūrimo spartos</string>
<string name="enable_sonic">Įjungti „Sonic“</string>
<!--Empty list labels-->
+ <string name="no_items_header_label">Epizodų eilėje nėra</string>
+ <string name="no_items_label">Pridėkite epizodą jį atsisiųsdami arba ilgai paspausdami ant epizodo ir pasirinkdami „Pridėti į eilę“.</string>
<string name="no_shownotes_label">Šis epizodas neturi užrašų.</string>
<string name="no_run_downloads_head_label">Nėra vykstančių atsiuntimų</string>
+ <string name="no_run_downloads_label">Atsisiųsti epizodų galite tinklalaidės informacijos ekrane.</string>
<string name="no_comp_downloads_head_label">Atsisiųstų epizodų nėra</string>
+ <string name="no_comp_downloads_label">Atsisiųsti epizodų galite tinklalaidės informacijos ekrane.</string>
+ <string name="no_log_downloads_head_label">Nėra atsiuntimo žurnalų</string>
+ <string name="no_log_downloads_label">Prieinami atsiuntimo žurnalai bus rodomi čia.</string>
<string name="no_history_head_label">Istorijos nėra</string>
+ <string name="no_history_label">Perklausius epizodą jis atsiras čia.</string>
<string name="no_all_episodes_head_label">Epizodų nėra</string>
+ <string name="no_all_episodes_label">Pridėjus tinklalaidę čia bus rodomi epizodai.</string>
<string name="no_new_episodes_head_label">Naujų epizodų nėra</string>
- <string name="no_fav_episodes_head_label">Mėgiamų epizodų nėra</string>
+ <string name="no_new_episodes_label">Čia bus rodomi naujai atkeliavę epizodai.</string>
+ <string name="no_fav_episodes_head_label">Mėgstamų epizodų nėra</string>
+ <string name="no_fav_episodes_label">Ilgai paspausdami ant epizodų pridėsite juos prie mėgstamų.</string>
<string name="no_chapters_head_label">Skyrių nėra</string>
<string name="no_chapters_label">Šis epizodas neturi skyrių.</string>
<string name="no_subscriptions_head_label">Prenumeratų nėra</string>
+ <string name="no_subscriptions_label">Jei norite prenumeruoti tinklalaidę, paspauskite žemiau esančią pliuso piktogramą.</string>
<!--Preferences-->
<string name="storage_pref">Laikmena</string>
+ <string name="storage_sum">Automatinis epizodų trynimas, importas, eksportas</string>
<string name="project_pref">Projektas</string>
<string name="queue_label">Eilė</string>
+ <string name="synchronization_pref">Sinchronizavimas</string>
+ <string name="synchronization_sum">Sinchronizuoti su kitais įrenginiais naudojantis „gpodder.net“</string>
<string name="automation">Automatizacija</string>
<string name="download_pref_details">Išsamiau</string>
<string name="import_export_pref">Importas/Eksportas</string>
+ <string name="import_export_search_keywords">atsarginės kopijos, atkūrimas</string>
<string name="appearance">Išvaizda</string>
<string name="external_elements">Išoriniai elementai</string>
<string name="interruptions">Pertraukimai</string>
<string name="playback_control">Atkūrimo valdymas</string>
+ <string name="preference_search_hint">Ieškoti...</string>
+ <string name="preference_search_no_results">Rezultatų nėra</string>
<string name="preference_search_clear_history">Išvalyti istoriją</string>
<string name="media_player">Medijos grotuvas</string>
<string name="pref_episode_cleanup_title">Epizodų valymas</string>
- <string name="pref_episode_cleanup_summary">Epizodai, nesantys eilėje ar tarp mėgiamųjų, gali būti ištrinti automatinio atsiuntimo metu pritrūkus laisvos vietos naujiems epizodams </string>
+ <string name="pref_episode_cleanup_summary">Epizodai, nesantys eilėje ar tarp mėgstamųjų, gali būti ištrinti automatinio atsiuntimo metu pritrūkus laisvos vietos naujiems epizodams </string>
<string name="pref_pauseOnDisconnect_sum">Pristabdyti atkūrimą, kai atjungiamos ausinės ar „Bluetooth“</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Pratęsti atkūrimą, kai ausinės pakartotinai prijungiamos</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Pratęsti atkūrimą, kai pakartotinai prisijungiama prie „Bluetooth“</string>
@@ -287,11 +376,14 @@
<string name="pref_smart_mark_as_played_title">Išmanus perklausų žymėjimas</string>
<string name="pref_skip_keeps_episodes_sum">Palikti epizodus, kai šie praleidžiami</string>
<string name="pref_skip_keeps_episodes_title">Palikti praleistus epizodus</string>
- <string name="pref_favorite_keeps_episodes_sum">Palikti epizodus, kurie yra pažymėti kaip mėgiami</string>
- <string name="pref_favorite_keeps_episodes_title">Palikti mėgiamus epizodus</string>
+ <string name="pref_favorite_keeps_episodes_sum">Palikti epizodus, kurie yra pažymėti kaip mėgstami</string>
+ <string name="pref_favorite_keeps_episodes_title">Palikti mėgstamus epizodus</string>
<string name="playback_pref">Atkūrimas</string>
+ <string name="playback_pref_sum">Ausinių valdikliai, praleidimo intervalai, eilė</string>
<string name="network_pref">Tinklas</string>
+ <string name="network_pref_sum">Atnaujinimų intervalas, atsiuntimų valdymas, mobilieji duomenys</string>
<string name="pref_autoUpdateIntervallOrTime_title">Atnaujinimų intervalas ar dienos metas</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Nurodykite automatinio tinklalaidžių atnaujinimo intervalą ar tikslų dienos metą</string>
<string name="pref_autoUpdateIntervallOrTime_message">Galite nustatyti <i>intervalą</i>, pvz. „kas 2 valandas“, nurodyti tikslų <i>dienos metą</i>, pvz. „07:00“ arba visiškai <i>išjungti</i> automatinius atnaujinimus.\n\n<small>Atkreipkite dėmesį: atnaujinimo laikas nėra tikslus, galimas trumpas uždelsimas.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Išjungti</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Nustatyti intervalą</string>
@@ -302,8 +394,17 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Ausinių atjungimas</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Pakartotinai prijungus ausines</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Pakartotinai prisijungus prie „Bluetooth“</string>
+ <string name="pref_stream_over_download_title">Teikti pirmenybę klausymuisi tiesiogiai</string>
+ <string name="pref_stream_over_download_sum">Vietoje atsiuntimo mygtuko sąrašuose atvaizduoti tiesioginio klausymosi mygtuką.</string>
<string name="pref_mobileUpdate_title">Atnaujinimai mobiliuoju internetu</string>
+ <string name="pref_mobileUpdate_sum">Pasirinkite, kas bus leidžiama naudojantis mobiliuoju internetu</string>
+ <string name="pref_mobileUpdate_refresh">Tinklalaidžių atnaujinimas</string>
+ <string name="pref_mobileUpdate_images">Viršelio paveikslėliai</string>
+ <string name="pref_mobileUpdate_auto_download">Automatinis atsiuntimas</string>
+ <string name="pref_mobileUpdate_episode_download">Epizodų atsiuntimas</string>
+ <string name="pref_mobileUpdate_streaming">Klausymasis tiesiogiai</string>
<string name="user_interface_label">Vartotojo sąsaja</string>
+ <string name="user_interface_sum">Išvaizda, prenumeratų tvarka, ekrano užraktas</string>
<string name="pref_set_theme_title">Pasirinkti temą</string>
<string name="pref_nav_drawer_items_title">Nustatyti naršymo stalčiaus elementus</string>
<string name="pref_nav_drawer_items_sum">Keisti naršymo stalčiuje rodomus elementus.</string>
@@ -320,6 +421,10 @@
<string name="pref_automatic_download_on_battery_sum">Leisti automatinį atsiuntimą kai baterija nėra įkraunama</string>
<string name="pref_parallel_downloads_title">Lygiagretūs atsiuntimai</string>
<string name="pref_episode_cache_title">Epizodų podėlis</string>
+ <string name="pref_episode_cache_summary">Bendras podėlyje atsiųstų epizodų skaičius šiame įrenginyje. Pasiekus šį skaičių automatinis atsiuntimas bus pristabdytas.</string>
+ <string name="pref_episode_cover_title">Naudoti epizodo viršelį</string>
+ <string name="pref_episode_cover_summary">Naudoti epizodo viršelį, kai prieinama. Nepažymėjus, programėlė visada naudos tinklalaidės viršelio paveikslėlį.</string>
+ <string name="pref_theme_title_use_system">Naudoti sistemos temą</string>
<string name="pref_theme_title_light">Šviesi</string>
<string name="pref_theme_title_dark">Tamsi</string>
<string name="pref_theme_title_trueblack">Juoda (paruošta AMOLED)</string>
@@ -333,13 +438,24 @@
<string name="pref_gpodnet_logout_toast">Sėkmingai atsijungta</string>
<string name="pref_gpodnet_setlogin_information_title">Keisti prisijungimo duomenis</string>
<string name="pref_gpodnet_setlogin_information_sum">Keisti prisijungimo prie „gpodder.net“ paskyros duomenis.</string>
+ <string name="pref_gpodnet_sync_changes_title">Sinchronizuoti dabar</string>
<string name="pref_gpodnet_sync_changes_sum">Sinchronizuoti prenumeratų bei epizodų būsenų pasikeitimus su „gpodder.net“.</string>
+ <string name="pref_gpodnet_full_sync_title">Priverstinis pilnas sinchronizavimas</string>
<string name="pref_gpodnet_full_sync_sum">Sinchronizuoti visas prenumeratas bei epizodų būsenas su „gpodder.net“.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Prisijungta kaip <i>%1$s</i> naudojant įrenginį <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Rodyti sinchronizavimo klaidų pranešimus</string>
<string name="pref_gpodnet_notifications_sum">Šis nustatymas negalioja tapatumo nustatymo klaidoms.</string>
<string name="pref_playback_speed_title">Atkūrimo sparta</string>
<string name="pref_playback_speed_sum">Derinkite prieinamas garso atkūrimo spartas</string>
+ <string name="pref_feed_playback_speed_sum">Atkūrimo sparta, naudojama pradedant šios tinklalaidės epizodų atkūrimą</string>
+ <string name="pref_feed_skip">Automatinis praleidimas</string>
+ <string name="pref_feed_skip_sum">Praleisti įvadą ir pabaigos žodį.</string>
+ <string name="pref_feed_skip_ending">Praleisti pirmas</string>
+ <string name="pref_feed_skip_intro">Praleisti paskutines</string>
+ <string name="pref_feed_skip_ending_toast">Praleistos paskutinės %d sekundžių</string>
+ <string name="pref_feed_skip_intro_toast">Praleistos pirmos %d sekundžių</string>
+ <string name="pref_playback_time_respects_speed_title">Derinti medijos informaciją pagal atkūrimo spartą</string>
+ <string name="pref_playback_time_respects_speed_sum">Atvaizduojama pozicija ir trukmė yra pritakyta prie atkūrimo spartos</string>
<string name="pref_fast_forward">Persukimo į priekį trukmė</string>
<string name="pref_fast_forward_sum">Derinkite, per kiek sekundžių šoktelėti į priekį kai paspaudžiamas persukimo į priekį mygtukas</string>
<string name="pref_rewind">Atsukimo atgal trukmė</string>
@@ -358,10 +474,21 @@
<string name="pref_lockscreen_background_sum">Atkuriamo epizodo paveikslėlį naudoti kaip ekrano užrakto foną. Paveikslėlis taip pat bus matomas trečiųjų šalių programėlėse.</string>
<string name="pref_showDownloadReport_title">Rodyti atsiuntimų ataskaitą</string>
<string name="pref_showDownloadReport_sum">Atsiuntimui nepavykus, sukurti ataskaitą su išsamiu klaidų aprašymu.</string>
+ <string name="pref_showAutoDownloadReport_title">Rodyti automatinių atsiuntimų ataskaitą</string>
+ <string name="pref_showAutoDownloadReport_sum">Rodyti pranešimą automatiškai atsiuntus epizodus.</string>
<string name="pref_expand_notify_unsupport_toast">Ankstesnės nei 4.1 „Android“ versijos nepalaiko išplėstų programos pranešimų.</string>
+ <string name="pref_enqueue_location_title">Pridėjimo į eilę vieta</string>
+ <string name="pref_enqueue_location_sum">Epizodus pridėti: %1$s</string>
+ <string name="enqueue_location_back">Į galą</string>
+ <string name="enqueue_location_front">Į pradžią</string>
+ <string name="enqueue_location_after_current">Po dabartinio epizodo</string>
<string name="pref_smart_mark_as_played_disabled">Išjungtas</string>
<string name="pref_image_cache_size_title">Paveikslėlių podėlio dydis</string>
<string name="pref_image_cache_size_sum">Paveikslėlių podėlio diske dydis.</string>
+ <string name="visit_user_forum">Naudotojų forumas</string>
+ <string name="bug_report_title">Pranešti apie klaidą</string>
+ <string name="open_bug_tracker">Atverti klaidų sekimo sistemą</string>
+ <string name="export_logs">Eksportuoti žurnalus</string>
<string name="copy_to_clipboard">Kopijuoti į iškarpinę</string>
<string name="copied_to_clipboard">Nukopijuotas į iškarpinę</string>
<string name="experimental_pref">Eksperimentinis</string>
@@ -377,6 +504,9 @@
<string name="pref_enqueue_downloaded_title">Atsiuntimus pridėti į eilę</string>
<string name="pref_enqueue_downloaded_summary">Parsiuntus epizodus, pridėti juos į eilę</string>
<string name="media_player_builtin">Įtaisytoji „Android“ leistuvė</string>
+ <string name="media_player_switch_to_exoplayer">Perjungti į „ExoPlayer“</string>
+ <string name="media_player_switched_to_exoplayer">Perjungta į „ExoPlayer“.</string>
+ <string name="pref_skip_silence_title">Praleisti tylą</string>
<string name="pref_videoBehavior_title">Uždarant vaizdo atkūrimą</string>
<string name="pref_videoBehavior_sum">Elgsena paliekant vaizdo atkūrimą</string>
<string name="stop_playback">Stabdyti atkūrimą</string>
@@ -392,14 +522,41 @@
<string name="double_tap_toast">Jei norite išeiti, dar kartą paspauskite grįžimo mygtuką</string>
<string name="back_button_go_to_page">Eiti į puslapį…</string>
<string name="back_button_go_to_page_title">Pažymėti puslapį</string>
+ <string name="pref_delete_removes_from_queue_title">Ištrynus pašalinti iš eilės</string>
+ <string name="pref_delete_removes_from_queue_sum">Ištrynus epizodą automatiškai pašalinti jį iš eilės</string>
<!--About screen-->
<string name="about_pref">Apie</string>
+ <string name="antennapod_version">„AntennaPod“ versija</string>
+ <string name="contributors">Autoriai</string>
+ <string name="contributors_summary">Visi gali padėti padaryti „AntennaPod“ geresnę - programiniu kodu, vertimais ar pagalba naudotojams mūsų forume</string>
+ <string name="developers">Kūrėjai</string>
+ <string name="translators">Vertėjai</string>
+ <string name="special_thanks">Ypatinga padėka</string>
+ <string name="privacy_policy">Privatumo politika</string>
+ <string name="licenses">Licencijos</string>
+ <string name="licenses_summary">„AntennaPod“ naudojama kita puiki programinė įranga</string>
<!--Search-->
<string name="search_status_no_results">Nieko nerasta</string>
<string name="search_label">Paieška</string>
<string name="no_results_for_query">Rezultatų paieškai \"%1$s\" nėra.</string>
<!--Synchronization-->
+ <string name="sync_status_started">Sinchronizavimas pradėtas</string>
+ <string name="sync_status_episodes_upload">Išsiunčiami epizodų pasikeitimai...</string>
+ <string name="sync_status_episodes_download">Atsiunčiami epizodų pasikeitimai...</string>
+ <string name="sync_status_upload_played">Išsiunčiama atkūrimo būsena...</string>
+ <string name="sync_status_subscriptions">Sinchronizuojamos prenumeratos...</string>
+ <string name="sync_status_success">Sinchronizavimas sėkmingas</string>
+ <string name="sync_status_error">Sinchronizavimas nepavyko</string>
<!--import and export-->
+ <string name="import_export_summary">Perkelti prenumeratas ir eilę į kitą įrenginį</string>
+ <string name="database">Duomenų bazė</string>
+ <string name="opml">OPML</string>
+ <string name="html">HTML</string>
+ <string name="html_export_summary">Parodyti prenumeratas draugui</string>
+ <string name="opml_export_summary">Perkelti prenumeratas į kitą tinklalaidžių programėlę</string>
+ <string name="opml_import_summary">Importuoti prenumeratas iš kitos tinklalaidžių programėlės</string>
+ <string name="database_export_summary">Perkelti prenumeratas, perklausytus epizodus ir eilę į „AntennaPod“ kitame įrenginyje</string>
+ <string name="database_import_summary">Importuoti „AntennaPod“ duomenų bazę iš kito įrenginio</string>
<string name="opml_import_label">OPML importas</string>
<string name="opml_reader_error">Skaitant OPML failą įvyko klaida:</string>
<string name="opml_import_error_no_file">Nepasirinktas failas!</string>
@@ -407,6 +564,10 @@
<string name="deselect_all_label">Nepažymėti nieko</string>
<string name="opml_export_label">OPML eksportas</string>
<string name="html_export_label">HTML eksportas</string>
+ <string name="database_export_label">Duomenų bazės eksportas</string>
+ <string name="database_import_label">Duomenų bazės importas</string>
+ <string name="database_import_warning">Importuojant duomenų bazę bus pakeistos visos dabartinės jūsų prenumeratos ir atkūrimo istorija. Rekomenduojame eksportuoti dabartinę duomenų bazę kaip atsarginę kopiją. Ar norite pakeisti?</string>
+ <string name="please_wait">Prašome luktelėti...</string>
<string name="export_error_label">Eksporto klaida</string>
<string name="export_success_title">Sėkmingai eksportuota</string>
<string name="export_success_sum">Eksporto failas išsaugotas:\n\n%1$s</string>
@@ -415,11 +576,16 @@
<string name="import_ok">Importuota sėkmingai.
Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
+ <string name="import_no_downgrade">Ši duomenų bazė buvo eksportuota naudojant naujesnę „AntennaPod“ versija. Dabartinė įdiegtis nežino, kaip apdorotį šį failą.</string>
+ <string name="favorites_export_label">Mėgstamųjų eksportas</string>
+ <string name="favorites_export_summary">Mėgstamieji išsaugoti faile</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Nustatyti miego laikmatį</string>
<string name="disable_sleeptimer_label">Išjungti miego laikmatį</string>
<string name="sleep_timer_label">Miego laikmatis</string>
<string name="time_dialog_invalid_input">Netinkama įvestis, laikas turi būti sveikasis skaičius</string>
+ <string name="shake_to_reset_label">Pakratykite, kad nustatyti iš naujo</string>
+ <string name="timer_vibration_label">Vibruoti prieš pat pabaigą</string>
<string name="time_seconds">sekundės</string>
<string name="time_minutes">minutės</string>
<string name="time_hours">valandos</string>
@@ -474,12 +640,14 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="gpodnetsync_error_descr">Sinchronizavimo metu įvyko klaida:\u0020</string>
<string name="gpodnetsync_pref_report_successful">Pavyko</string>
<string name="gpodnetsync_pref_report_failed">Nepavyko</string>
+ <string name="gpodnetsync_username_characters_error">Naudotojo vardą sudaryti gali tik raidės, skaitmenys, brūkšniai ir pabraukimo brūkšniai.</string>
<!--Directory chooser-->
<string name="selected_folder_label">Pasirinktas aplankas:</string>
<string name="create_folder_label">Sukurti aplanką</string>
<string name="choose_data_directory">Pasirinkite duomenų aplanką</string>
<string name="choose_data_directory_message">Prašome pasirinkti pamatinį duomenų aplanką. „AntennaPod“ sukurs reikiamus poaplankius.</string>
<string name="choose_data_directory_permission_rationale">Norinti pakeisti duomenų aplanką reikalinga prieiga prie išorinės laikmenos</string>
+ <string name="choose_data_directory_available_space">%1$s iš %2$s laisva</string>
<string name="create_folder_msg">Sukurti naują aplanką pavadinimu \"%1$s\"?</string>
<string name="create_folder_success">Sukurtas naujas aplankas</string>
<string name="create_folder_error_no_write_access">Nepavyksta rašyti šiame aplanke</string>
@@ -498,16 +666,25 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="pref_restart_required">Kad pakeitimas įsigaliotų, reikia paleisti „AntennaPod“ iš naujo.</string>
<!--Online feed view-->
<string name="subscribe_label">Prenumeruoti</string>
+ <string name="subscribing_label">Prenumeruojama...</string>
+ <string name="preview_episode">Peržiūra</string>
+ <string name="stop_preview">Stabdyti peržiūrą</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Atsukti</string>
<string name="fast_forward_label">Persukti į priekį</string>
+ <string name="increase_speed">Padidinti spartą</string>
+ <string name="decrease_speed">Sumažinti spartą</string>
<string name="media_type_audio_label">Garsas</string>
<string name="media_type_video_label">Vaizdas</string>
<string name="navigate_upwards_label">Eiti aukštyn</string>
<string name="status_downloading_label">Epizodas atsiunčiamas</string>
<string name="in_queue_label">Epizodas yra eilėje</string>
+ <string name="is_favorite_label">Epizodas pažymėtas kaip mėgstamas</string>
<string name="drag_handle_content_description">Tempkite norėdami pakeisti šio elemento poziciją</string>
<string name="load_next_page_label">Įkelti kitą puslapį</string>
+ <string name="switch_pages">Perjungti puslapius</string>
+ <string name="position">Pozicija: %1$s</string>
+ <string name="apply_action">Pritaikyti veiksmą</string>
<!--Feed information screen-->
<string name="authentication_label">Tapatumo nustatymas</string>
<string name="authentication_descr">Keisti vartotojo vardą ir slaptažodį šiai tinklalaidei ir jos epizodams.</string>
@@ -518,16 +695,22 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="episode_filters_exclude">Išbraukti</string>
<string name="episode_filters_hint">Pavieniai žodžiai\n\"frazės kabutėse\"</string>
<string name="keep_updated">Pastoviai atnaujinti</string>
+ <string name="keep_updated_summary">Įtraukti šią tinklalaidę į (automatinį) visų tinklalaidžių atnaujinimą</string>
+ <string name="auto_download_disabled_globally">Automatinis atsiuntimas išjungtas pagrindiniuose „AntennaPod“ nustatymuose</string>
<!--Progress information-->
<string name="progress_upgrading_database">Atnaujinama duomenų bazė</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Įkeliamos prenumeratos iš specializuotų programėlių...</string>
<!--Add podcast fragment-->
+ <string name="search_podcast_hint">Ieškoti tinklalaidės...</string>
<string name="search_itunes_label">Ieškoti „iTunes“</string>
<string name="search_fyyd_label">Ieškoti „fyyd“</string>
+ <string name="advanced">Išplėstinis</string>
+ <string name="add_podcast_by_url">Pridėti tinklalaidę pagal URL adresą</string>
<string name="browse_gpoddernet_label">Naršyti gpodder.net svetainėje</string>
<string name="discover">Atraskite</string>
<string name="discover_more">daugiau »</string>
+ <string name="search_powered_by">Paiešką įgalina %1$s</string>
<string name="filter">Filtruoti</string>
<!--Episodes apply actions-->
<string name="all_label">Visi</string>
@@ -555,6 +738,12 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="sort_date_old_new">Data (Seni \u2192 Nauji)</string>
<string name="sort_duration_short_long">Trukmė (Trumpi \u2192 Ilgi)</string>
<string name="sort_duration_long_short">Trukmė (Ilgi \u2192 Trumpi)</string>
+ <string name="sort_a_z">A \u2192 Z</string>
+ <string name="sort_z_a">Z \u2192 A</string>
+ <string name="sort_new_old">Nauji \u2192 Seni</string>
+ <string name="sort_old_new">Seni \u2192 Nauji</string>
+ <string name="sort_short_long">Trumpi \u2192 Ilgi</string>
+ <string name="sort_long_short">Ilgi \u2192 Trumpi</string>
<!--Rating dialog-->
<string name="rating_title">Patinka „AntennaPod“?</string>
<string name="rating_message">Būtume dėkingi, jei skirtumėte laiko įvertinti „AntennaPod“.</string>
@@ -570,6 +759,7 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="audio_effects">Garso efektai</string>
<string name="stereo_to_mono">Kanalų mažinimas: iš stereo į mono</string>
<string name="sonic_only">Tik „Sonic“</string>
+ <string name="exoplayer_only">Tik „ExoPlayer“</string>
<!--proxy settings-->
<string name="proxy_type_label">Tipas</string>
<string name="host_label">Serveris</string>
@@ -583,6 +773,7 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="proxy_host_invalid_error">Serverio laukelyje nurodytas netaisyklingas IP adresas ar sritis</string>
<string name="proxy_port_invalid_error">Netinkamas prievadas</string>
<!--Subscriptions fragment-->
+ <string name="subscription_num_columns">Stulpelių skaičius</string>
<!--Casting-->
<string name="cast_media_route_menu_title">Atkurti naudojant...</string>
<string name="cast_disconnect_label">Atjungti „Chromecast“ sesiją</string>
@@ -606,6 +797,14 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="notification_channel_playing_description">Leidžia valdyti atkūrimą. Tai pagrindinis pranešimas matomas tinklalaidės atkūrimo metu.</string>
<string name="notification_channel_error">Klaidos</string>
<string name="notification_channel_error_description">Rodomas, kai įvykstą kažkas nenumatyto, pavyzdžiui, nepavykus atsiuntimui ar „gpodder“ sinchronizavimui.</string>
+ <string name="notification_channel_auto_download">Automatiniai atsiuntimai</string>
+ <string name="notification_channel_episode_auto_download">Rodomas automatiškai atsiuntus epizodus.</string>
<!--Widget settings-->
+ <string name="widget_settings">Valdiklio nustatymai</string>
+ <string name="widget_create_button">Sukurti valdiklį</string>
+ <string name="widget_opacity">Dengiamumas</string>
<!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Nustatymas sėkmingai atnaujintas.</string>
+ <string name="on_demand_config_stream_text">Panašu, jog dažnai klausotės tiesiogiai. Ar norite, jog epizodų sąraše būtų rodomi tiesioginio klausymosi mygtukai?</string>
+ <string name="on_demand_config_download_text">Panašu, jog dažnai atsisiunčiate epizodus. Ar norite, jog epizodų sąraše būtų rodomi atsiuntimo mygtukai?</string>
</resources>
diff --git a/core/src/main/res/values-nb/strings.xml b/core/src/main/res/values-nb/strings.xml
index fd2c927b9..ccdc9a28c 100644
--- a/core/src/main/res/values-nb/strings.xml
+++ b/core/src/main/res/values-nb/strings.xml
@@ -28,7 +28,7 @@
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Sum av tid i avspilte podkaster:</string>
<string name="statistics_details_dialog">Startet %1$d av %2$d episoder.\n\nAvspilt %3$s av %4$s.</string>
- <string name="statistics_mode">Statistikk modus</string>
+ <string name="statistics_mode">Statistikkmodus</string>
<string name="statistics_mode_normal">Beregn faktisk avspilt varighet. Dobbel avspilling telles to ganger, mens markering som avspilt telles ikke</string>
<string name="statistics_mode_count_all">Oppsummer alle podkaster merket som avspilt</string>
<string name="statistics_speed_not_counted">Merk: Avspillingshastighet tas aldri med i betraktningen.</string>
@@ -320,6 +320,7 @@
<string name="storage_sum">Auto-slett episoder, importer, eksporter</string>
<string name="project_pref">Prosjekt</string>
<string name="queue_label">Kø</string>
+ <string name="synchronization_pref">Synkronisering</string>
<string name="automation">Automasjon</string>
<string name="download_pref_details">Detaljer</string>
<string name="import_export_pref">Importer/Eksporter</string>
@@ -490,9 +491,7 @@
<string name="about_pref">Om</string>
<string name="antennapod_version">AntennaPod versjon</string>
<string name="developers">Utviklere</string>
- <string name="developers_summary">Alle kan hjelpe til med å gjøre AntennaPod bedre</string>
<string name="translators">Oversettere</string>
- <string name="translators_summary">Oversettelser er laget av brukere av AntennaPod ved hjelp av Transifex</string>
<string name="privacy_policy">Personvern</string>
<string name="licenses">Lisenser</string>
<string name="licenses_summary">AntennaPod bruker annen flott programvare</string>
diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml
index 8ca668dd8..6e7f08ddf 100644
--- a/core/src/main/res/values-nl/strings.xml
+++ b/core/src/main/res/values-nl/strings.xml
@@ -452,9 +452,9 @@
<string name="pref_compact_notification_buttons_dialog_error">Je kunt maximaal %1$d knoppen kiezen.</string>
<string name="pref_lockscreen_background_title">Achtergrondafbeelding vergrendelscherm</string>
<string name="pref_lockscreen_background_sum">Toon de afbeelding van de huidige aflevering op het vergrendelscherm. Hierdoor is de afbeelding ook beschikbaar voor andere apps.</string>
- <string name="pref_showDownloadReport_title">Downloadverslag tonen</string>
+ <string name="pref_showDownloadReport_title">Toon downloadverslag</string>
<string name="pref_showDownloadReport_sum">Stel een verslag op met foutdetails als downloads mislukken.</string>
- <string name="pref_showAutoDownloadReport_title">Downloadverslag tonen</string>
+ <string name="pref_showAutoDownloadReport_title">Toon verslag automatische downloads</string>
<string name="pref_showAutoDownloadReport_sum">Toon een melding bij automatisch gedownloade afleveringen.</string>
<string name="pref_expand_notify_unsupport_toast">Android-versies lager dan 4.1 ondersteunen geen knoppen op meldingen.</string>
<string name="pref_enqueue_location_title">Wachtrijlocatie</string>
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Over AntennaPod</string>
<string name="antennapod_version">AntennaPod-versie</string>
+ <string name="contributors">Bijdragers</string>
+ <string name="contributors_summary">Iedereen kan helpen AntennaPod te verbeteren middels programmeren, vertalen of het helpen van gebruikers op het forum</string>
<string name="developers">Ontwikkelaars</string>
- <string name="developers_summary">Iedereen kan helpen AntennaPod te verbeteren</string>
<string name="translators">Vertalers</string>
- <string name="translators_summary">De vertalingen zijn gedaan door AntennaPod-gebruikers op Transifex</string>
+ <string name="special_thanks">Met dank aan</string>
<string name="privacy_policy">Privacybeleid</string>
<string name="licenses">Licenties</string>
<string name="licenses_summary">AntennaPod maakt gebruik van andere geweldige software</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Kies een te importeren bestand</string>
<string name="import_ok">Geïmporteerd.\n\nDruk op Oké om AntennaPod opnieuw te starten.</string>
<string name="import_no_downgrade">Deze databank is geëxporteerd door een nieuwere versie van Antennapod. Je huidige versie weet nog niet hoe daar mee om te gaan.</string>
+ <string name="favorites_export_label">Favorieten exporteren</string>
+ <string name="favorites_export_summary">Exporteer opgeslagen favorieten naar een bestand</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Slaaptimer instellen</string>
<string name="disable_sleeptimer_label">Slaaptimer uitschakelen</string>
diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml
index b06ca5fd1..f5fa5e310 100644
--- a/core/src/main/res/values-pl/strings.xml
+++ b/core/src/main/res/values-pl/strings.xml
@@ -27,7 +27,7 @@
<string name="download_statistics_label">Pobrane</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Całkowity czas odtwarzania podcastów:</string>
- <string name="statistics_details_dialog">%1$d z %2$d odcinków rozpoczęto.\n\nZagrano %3$s z %4$s.</string>
+ <string name="statistics_details_dialog">%1$d z %2$d odcinków rozpoczęto.\n\nOdtworzono %3$s z %4$s.</string>
<string name="statistics_mode">Tryb statystyk</string>
<string name="statistics_mode_normal">Oblicz łączny czas rzeczywistego odtwarzania. Dwukrotne odtworzenie będzie policzone ale zaznaczenie jako odtworzone nie będzie policzone.</string>
<string name="statistics_mode_count_all">Podsumuj wszystkie podcasty oznaczone jako odtworzone</string>
@@ -85,6 +85,7 @@
<string name="auto_download_apply_to_items_message">Nowe ustawienie <i>automatycznego pobierania</i> zostanie zastosowane do nowych odcinków.\n Czy chcesz zastosować je także do odcinków opublikowanych wcześniej?</string>
<string name="auto_delete_label">Automatyczne usuwanie odcinków</string>
<string name="feed_volume_reduction">Redukcja głośności</string>
+ <string name="feed_volume_reduction_summary">Zmniejsz głośność dla odcinków z tego kanału: %1$s</string>
<string name="feed_volume_reduction_off">Wyłączona</string>
<string name="feed_volume_reduction_light">Średnia</string>
<string name="feed_volume_reduction_heavy">Silna</string>
@@ -108,6 +109,12 @@
<item quantity="many">%d dni po odtworzeniu</item>
<item quantity="other">%d dni po odtworzeniu</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d zaznaczono</item>
+ <item quantity="few"> %d zaznaczono</item>
+ <item quantity="many">%d zaznaczono</item>
+ <item quantity="other">%d zaznaczono</item>
+ </plurals>
<string name="loading_more">Ładowanie więcej...</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Oznacz wszystkie jako odtworzone</string>
@@ -207,7 +214,7 @@
<item quantity="other">%d odcinki(ów) usunięto z kolejki.</item>
</plurals>
<string name="add_to_favorite_label">Dodaj do Ulubionych</string>
- <string name="added_to_favorites">Dodaj do ulubionych</string>
+ <string name="added_to_favorites">Dodano do ulubionych</string>
<string name="remove_from_favorite_label">Usuń z Ulubionych</string>
<string name="removed_from_favorites">Usunięto z ulubionych</string>
<string name="visit_website_label">Odwiedź stronę</string>
@@ -216,6 +223,7 @@
<string name="deactivate_auto_download">Wyłącz automatyczne pobieranie</string>
<string name="reset_position">Zresetuj pozycję odtwarzania</string>
<string name="removed_item">Pozycja usunięta</string>
+ <string name="no_items_selected">Nie zaznaczono żadnego elementu</string>
<!--Download messages and labels-->
<string name="download_successful">Operacja zakończona sukcesem</string>
<string name="download_pending">Pobieranie w toku</string>
@@ -315,7 +323,7 @@
<!--Empty list labels-->
<string name="no_items_header_label">Brak odcinków w kolejce</string>
<string name="no_items_label">Dodaj odcinek, pobierając go, lub przytrzymaj dłużej na odcinku i wybierz \"Dodaj do kolejki\".</string>
- <string name="no_shownotes_label">Ten epizod nie ma notatek.</string>
+ <string name="no_shownotes_label">Ten odcinek nie ma notatek.</string>
<string name="no_run_downloads_head_label">Brak aktywnych pobierań</string>
<string name="no_run_downloads_label">Możesz pobrać odcinki z ekranu informacji o podcaście</string>
<string name="no_comp_downloads_head_label">Brak pobranych odcinków</string>
@@ -339,6 +347,8 @@
<string name="storage_sum">Automatyczne kasowanie odcinków, Import, Eksport</string>
<string name="project_pref">Projekt</string>
<string name="queue_label">Kolejka</string>
+ <string name="synchronization_pref">Synchronizacja</string>
+ <string name="synchronization_sum">Synchronizuj z innymi urządzeniami za pomocą gpodder.net</string>
<string name="automation">Automatyzacja</string>
<string name="download_pref_details">Szczegóły</string>
<string name="import_export_pref">Import/Eksport</string>
@@ -429,7 +439,9 @@
<string name="pref_gpodnet_logout_toast">Wylogowanie się powiodło</string>
<string name="pref_gpodnet_setlogin_information_title">Zmień informacje logowania</string>
<string name="pref_gpodnet_setlogin_information_sum">Zmień dane logowania konta gpodder.net.</string>
+ <string name="pref_gpodnet_sync_changes_title">Synchronizuj teraz</string>
<string name="pref_gpodnet_sync_changes_sum">Synchronizuj subskrypcje oraz stan odcinków z pomocą gpodder.net.</string>
+ <string name="pref_gpodnet_full_sync_title">Wymuś pełną synchronizację</string>
<string name="pref_gpodnet_full_sync_sum">Synchronizuj wszystkie subskrypcje oraz stan odcinków z pomocą gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Zalogowano jako <i>%1$s</i> na urządzeniu <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Pokaż powiadomienia błędów synchronizacji</string>
@@ -437,6 +449,12 @@
<string name="pref_playback_speed_title">Prędkość odtwarzania</string>
<string name="pref_playback_speed_sum">Dostosuj prędkości dostępne dla odtwarzania audio o zmiennej prędkości</string>
<string name="pref_feed_playback_speed_sum">Prędkość używana podczas odtwarzania odcinków z tego kanału</string>
+ <string name="pref_feed_skip">Automatyczne pomijanie</string>
+ <string name="pref_feed_skip_sum">Pomijaj wstęp i napisy końcowe</string>
+ <string name="pref_feed_skip_ending">Pomijaj na końcu</string>
+ <string name="pref_feed_skip_intro">Pomijaj na początku</string>
+ <string name="pref_feed_skip_ending_toast">Pominięto ostatnie %d sekund(y)</string>
+ <string name="pref_feed_skip_intro_toast">Pominięto pierwsze %d sekund(y)</string>
<string name="pref_playback_time_respects_speed_title">Dostosuj informacje do prędkości odtwarzania</string>
<string name="pref_playback_time_respects_speed_sum">Wyświetlana pozycja i czas trwania są dostosowane do prędkości odtwarzania</string>
<string name="pref_fast_forward">Szybkie przewijanie do przodu</string>
@@ -487,6 +505,8 @@
<string name="pref_enqueue_downloaded_title">Kolejkuj pobrane</string>
<string name="pref_enqueue_downloaded_summary">Dodaj pobrane odcinki do kolejki</string>
<string name="media_player_builtin">Wbudowany odtwarzacz Androida</string>
+ <string name="media_player_switch_to_exoplayer">Zmień na ExoPlayer</string>
+ <string name="media_player_switched_to_exoplayer">Zmieniono na ExoPlayer</string>
<string name="pref_skip_silence_title">Pomiń ciszę w plikach audio</string>
<string name="pref_videoBehavior_title">Kończenie odtwarzania wideo</string>
<string name="pref_videoBehavior_sum">Zachowanie przy wyjściu z odtwarzania wideo</string>
@@ -508,10 +528,10 @@
<!--About screen-->
<string name="about_pref">O...</string>
<string name="antennapod_version">Wersja AntennaPod</string>
+ <string name="contributors">Kontrybutorzy</string>
<string name="developers">Twórcy</string>
- <string name="developers_summary">Każdy może pomóc ulepszyć AntennaPod</string>
<string name="translators">Tłumacze</string>
- <string name="translators_summary">Tłumaczenie tworzone przez użytkowników AntennaPod używających Transifex</string>
+ <string name="special_thanks">Specjalne podziękowania</string>
<string name="privacy_policy">Polityka prywatności</string>
<string name="licenses">Licencje</string>
<string name="licenses_summary">AntennaPod używa różnego świetnego oprogramowania/bibliotek</string>
@@ -520,6 +540,13 @@
<string name="search_label">Szukaj</string>
<string name="no_results_for_query">Brak wyników dla \"%1$s\"</string>
<!--Synchronization-->
+ <string name="sync_status_started">Rozpoczęto synchronizację</string>
+ <string name="sync_status_episodes_upload">Wysyłanie zmian odcinków...</string>
+ <string name="sync_status_episodes_download">Pobieranie zmian odcinków...</string>
+ <string name="sync_status_upload_played">Wysyłanie statusu odtworzeń...</string>
+ <string name="sync_status_subscriptions">Synchronizowanie subskrypcji...</string>
+ <string name="sync_status_success">Synchronizacja udana</string>
+ <string name="sync_status_error">Synchronizacja nie powiodła się</string>
<!--import and export-->
<string name="import_export_summary">Przenieś subskrypcje i kolejkę na inne urządzenie</string>
<string name="database">Baza danych</string>
@@ -539,6 +566,7 @@
<string name="html_export_label">Eksport HTML</string>
<string name="database_export_label">Eksport bazy danych</string>
<string name="database_import_label">Import bazy danych</string>
+ <string name="database_import_warning">Import bazy danych nadpisze wszystkie twoje aktualne subskrypcje i historię odtworzeń. Zalecany jest eksport aktualnej bazy danych jako kopia zapasowa. Czy chcesz zamienić?</string>
<string name="please_wait">Proszę czekać...</string>
<string name="export_error_label">Błąd eksportu</string>
<string name="export_success_title">Export zakończony powodzeniem</string>
@@ -547,6 +575,8 @@
<string name="import_select_file">Wybierz plik do Importowania</string>
<string name="import_ok">Import zakończony powodzeniem.\n\nNaciśnij OK aby zrestartować AntennaPod</string>
<string name="import_no_downgrade">Baza danych została eksportowana z nowszej wersji AntennaPod. Twoja wersja nie potrafi obsłużyć tego pliku. </string>
+ <string name="favorites_export_label">Eksport ulubionych</string>
+ <string name="favorites_export_summary">Ulubione wyeksportowano do pliku</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ustaw czas do wyłączenia</string>
<string name="disable_sleeptimer_label">Wyłącz wyłącznik czasowy</string>
@@ -637,16 +667,23 @@ https://gpodder.net/register/</string>
<string name="subscribe_label">Subskrybuj</string>
<string name="subscribing_label">Subskrybuję...</string>
<string name="preview_episode">Podgląd</string>
+ <string name="stop_preview">Zakończ podgląd</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Cofnij</string>
<string name="fast_forward_label">Przewiń</string>
+ <string name="increase_speed">Zwiększ prędkość</string>
+ <string name="decrease_speed">Zmniejsz prędkość</string>
<string name="media_type_audio_label">Audio</string>
<string name="media_type_video_label">Wideo</string>
<string name="navigate_upwards_label">Przesuń w górę</string>
<string name="status_downloading_label">Odcinek jest pobierany</string>
<string name="in_queue_label">Odcinek jest w kolejce</string>
+ <string name="is_favorite_label">Odcinek oznaczony jako ulubiony</string>
<string name="drag_handle_content_description">Przeciągnij aby zmienić pozycję elementu</string>
<string name="load_next_page_label">Załaduj następną stronę</string>
+ <string name="switch_pages">Zamień strony</string>
+ <string name="position">Pozycja: %1$s</string>
+ <string name="apply_action">Zastosuj</string>
<!--Feed information screen-->
<string name="authentication_label">Autoryzacja</string>
<string name="authentication_descr">Zmień swoją nazwę użytkownika oraz hasło dla tego podcastu i jego odcinków</string>
@@ -672,6 +709,7 @@ https://gpodder.net/register/</string>
<string name="browse_gpoddernet_label">Przeglądaj gpodder.net</string>
<string name="discover">Odkryj</string>
<string name="discover_more">więcej »</string>
+ <string name="search_powered_by">Wyszukiwanie przy pomocy %1$s</string>
<string name="filter">Filtruj</string>
<!--Episodes apply actions-->
<string name="all_label">Wszystkie</string>
@@ -699,6 +737,12 @@ https://gpodder.net/register/</string>
<string name="sort_date_old_new">Data (Stare \u2192 Nowe)</string>
<string name="sort_duration_short_long">Długość (Krótkie \u2192 Długie)</string>
<string name="sort_duration_long_short">Długość (Długie \u2192 Krótkie)</string>
+ <string name="sort_a_z">A \u2192 Z</string>
+ <string name="sort_z_a">Z \u2192 A</string>
+ <string name="sort_new_old">Nowe \u2192 Stare</string>
+ <string name="sort_old_new">Stare \u2192 Nowe</string>
+ <string name="sort_short_long">Krótkie \u2192 Długie</string>
+ <string name="sort_long_short">Długie \u2192 Krótkie</string>
<!--Rating dialog-->
<string name="rating_title">Podoba Ci się AntennaPod?</string>
<string name="rating_message">Bylibyśmy wdzięczni, jeśli poświęciłbyś chwilę aby ocenić AntennaPod.</string>
@@ -759,4 +803,7 @@ https://gpodder.net/register/</string>
<string name="widget_create_button">Dodaj widżet</string>
<string name="widget_opacity">Nieprzezroczystość</string>
<!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">Ustawienia uaktualnione pomyślnie.</string>
+ <string name="on_demand_config_stream_text">Wygląda na to, że dużo streamujesz. Czy chcesz, aby na listach odcinków pokazywać przyciski do stermowania.</string>
+ <string name="on_demand_config_download_text">Wygląda na to, że dużo pobierasz. Czy chcesz, aby na listach odcinków pokazywać przyciski do pobierania.</string>
</resources>
diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml
index 24f89aa4d..59e3af044 100644
--- a/core/src/main/res/values-pt-rBR/strings.xml
+++ b/core/src/main/res/values-pt-rBR/strings.xml
@@ -23,6 +23,7 @@
<string name="gpodnet_auth_label">gpodder.net login</string>
<string name="episode_cache_full_title">Cache de episódios cheio</string>
<string name="episode_cache_full_message">O limite de cache de episódios foi alcançado. Você pode aumentar o tamanho do cache em Configurações.</string>
+ <string name="playback_statistics_label">Reprodução</string>
<string name="download_statistics_label">Downloads</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Tempo total de podcasts reproduzidos:</string>
@@ -31,7 +32,10 @@
<string name="statistics_mode_normal">Calcular a duração que já foi tocada. Tocar das vezes é contado o dobro, enquanto marcar como tocada não é contado</string>
<string name="statistics_mode_count_all">Somar todos os podcasts marcados como tocados</string>
<string name="statistics_speed_not_counted">Nota: A velocidade de reprodução nunca é levada em conta.</string>
+ <string name="statistics_reset_data">Limpar dados de estatísticas</string>
+ <string name="statistics_reset_data_msg">Isso ira apagar o histórico de reprodução de todos os episódios. Tem certeza que deseja continuar?</string>
<!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Tamanho total dos episódios baixados.</string>
<!--Main activity-->
<string name="drawer_open">Abrir menu</string>
<string name="drawer_close">Fechar menu</string>
@@ -41,7 +45,7 @@
<string name="drawer_feed_order_last_update">Ordenar por data de publicação</string>
<string name="drawer_feed_order_most_played">Ordenar pelo número de episódios reproduzidos</string>
<string name="drawer_feed_counter_new_unplayed">Número de episódios novos e não reproduzidos</string>
- <string name="drawer_feed_counter_new">Numero de novos episódios</string>
+ <string name="drawer_feed_counter_new">Número de novos episódios</string>
<string name="drawer_feed_counter_unplayed">Número de episódios não reproduzidos</string>
<string name="drawer_feed_counter_downloaded">Número de episódios baixados</string>
<string name="drawer_feed_counter_none">Nenhum</string>
@@ -80,6 +84,9 @@
<string name="auto_download_apply_to_items_title">Aplicar aos episódios anteriores</string>
<string name="auto_download_apply_to_items_message">A nova configuração de <i>Download Automático</i> será aplicada automaticamente a novos episódios.\nVocê deseja aplicá-la aos episódios anteriores?</string>
<string name="auto_delete_label">Apagar episódio automaticamente</string>
+ <string name="feed_volume_reduction">Redução de Volume</string>
+ <string name="feed_volume_reduction_summary">Diminuir o volume para episódios deste feed: %1$s</string>
+ <string name="feed_volume_reduction_off">Desligar</string>
<string name="feed_volume_reduction_light">Leve</string>
<string name="feed_volume_reduction_heavy">Forte</string>
<string name="parallel_downloads_suffix">\u0020 downloads paralelos</string>
@@ -90,10 +97,18 @@
<string name="episode_cleanup_never">Nunca</string>
<string name="episode_cleanup_queue_removal">Quando não está na fila</string>
<string name="episode_cleanup_after_listening">Depois de concluído</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">1 hora após finalizar</item>
+ <item quantity="other">%d horas após finalizar</item>
+ </plurals>
<plurals name="episode_cleanup_days_after_listening">
<item quantity="one">1 dia depois de concluído</item>
<item quantity="other">%d dias depois de concluído</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">%d selecionado</item>
+ <item quantity="other">%d selecionados</item>
+ </plurals>
<string name="loading_more">Carregando...</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Marcar todos como reproduzidos</string>
@@ -135,11 +150,12 @@
<string name="filtered_label">Filtrado</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Última Atualização falhou</string>
<string name="open_podcast">Abrir Podcast</string>
+ <string name="please_wait_for_data">Por favor, aguarde até que os dados sejam carregados</string>
<!--actions on feeditems-->
<string name="download_label">Download</string>
<plurals name="downloading_batch_label">
- <item quantity="one">Baixar %d episódio.</item>
- <item quantity="other">Baixar %d episódios.</item>
+ <item quantity="one">Baixando %d episódio.</item>
+ <item quantity="other">Baixando %d episódios.</item>
</plurals>
<string name="play_label">Reproduzir</string>
<string name="pause_label">Pausar</string>
@@ -157,6 +173,7 @@
<string name="marked_as_read_label">Marcado como reproduzido</string>
<string name="mark_read_no_media_label">Marcar como reproduzido</string>
<string name="marked_as_read_no_media_label">Marcado como reproduzido</string>
+ <string name="play_this_to_seek_position">Para pular para as posições, você precisa reproduzir o episódio</string>
<plurals name="marked_read_batch_label">
<item quantity="one">%d episódio marcado como reproduzido.</item>
<item quantity="other">%d episódios marcados como reproduzidos.</item>
@@ -209,6 +226,7 @@
<string name="download_canceled_msg">Download cancelado</string>
<string name="download_canceled_autodownload_enabled_msg">Download cancelado\nDesabilitado <i>Download Automático</i> para este item</string>
<string name="download_report_title">Downloads finalizados com erro(s)</string>
+ <string name="auto_download_report_title">Download automático finalizado</string>
<string name="download_report_content_title">Reportar Download</string>
<string name="download_error_malformed_url">URL inválida</string>
<string name="download_error_io_error">Erro de IO</string>
@@ -225,11 +243,14 @@
<string name="download_type_feed">Feed</string>
<string name="download_type_media">Arquivo de mídia</string>
<string name="download_request_error_dialog_message_prefix">Ocorreu um erro durante download do arquivo:\u0020</string>
+ <string name="null_value_podcast_error">Nenhum podcast foi fornecido para ser exibido.</string>
<string name="authentication_notification_title">Autenticação requerida</string>
<string name="authentication_notification_msg">O recurso que você solicitou requer um usuário e uma senha</string>
<string name="confirm_mobile_download_dialog_title">Confirmar Download utilizando dados móveis</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">O download utilizando plano de dados foi desabilitado nas configurações.\n\nVocê pode escolher entre apenas adicionar o episódio na fila ou você pode permitir o download temporáriamente.\n\n<small>Sua escolha será lembrada por 10 minutos.</small></string>
<string name="confirm_mobile_download_dialog_message">O download sobre plano de dados foi desabilitado nas configurações.\n\n Você deseja permitir o download temporáriamente?\n\n<small>Sua escolha será lembrada por 10 minutos</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Confirmar streaming móvel</string>
+ <string name="confirm_mobile_streaming_notification_message">O streaming pela conexão de dados móveis está desativado nas configurações. Toque para transmitir de qualquer maneira.</string>
<string name="confirm_mobile_streaming_button_always">Sempre permitir</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Adicionar à fila</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Permitir temporariamente</string>
@@ -240,6 +261,9 @@
<string name="player_ready_msg">Pronto</string>
<string name="player_seeking_msg">Buscando</string>
<string name="playback_error_server_died">Servidor morreu</string>
+ <string name="playback_error_unsupported">Tipo de mídia não suportado</string>
+ <string name="playback_error_timeout">Tempo da operação expirou</string>
+ <string name="playback_error_source">Não foi possível acessar o arquivo de mídia</string>
<string name="playback_error_unknown">Erro desconhecido</string>
<string name="no_media_playing_label">Nenhuma mídia tocando</string>
<string name="player_buffering_msg">Armazenando</string>
@@ -251,6 +275,7 @@
<string name="unlock_queue">Desbloquear Fila</string>
<string name="queue_locked">Fila bloqueada</string>
<string name="queue_unlocked">Fila desbloqueada</string>
+ <string name="queue_lock_warning">Se você bloquear a fila, não poderá mais deslizar ou reorganizar os episódios.</string>
<string name="checkbox_do_not_show_again">Não mostrar novamente</string>
<string name="clear_queue_label">Limpar fila</string>
<string name="undo">Desfazer</string>
@@ -271,22 +296,49 @@
<!--Variable Speed-->
<string name="download_plugin_label">Download Plugin</string>
<string name="no_playback_plugin_title">Plugin Não Instalado</string>
+ <string name="no_playback_plugin_or_sonic_msg">Para que a reprodução de velocidade variável funcione, recomendamos habilitar o reprodutor de mídia Sonic integrado.</string>
<string name="set_playback_speed_label">Velocidades de Reprodução</string>
<string name="enable_sonic">Habilitar Sonic</string>
<!--Empty list labels-->
<string name="no_items_header_label">Nenhum episódio na fila</string>
+ <string name="no_items_label">Adicione um episódio baixando-o ou mantenha pressionado um episódio e selecione \"Adicionar à fila\".</string>
<string name="no_shownotes_label">Este episódio não possui notas.</string>
+ <string name="no_run_downloads_head_label">Nenhum download em andamento</string>
+ <string name="no_run_downloads_label">Você pode baixar episódios na tela de detalhes do podcast.</string>
+ <string name="no_comp_downloads_head_label">Nenhum episódios baixado</string>
+ <string name="no_comp_downloads_label">Você pode baixar episódios na tela de detalhes do podcast.</string>
+ <string name="no_log_downloads_head_label">Sem registro de download</string>
+ <string name="no_log_downloads_label">Os logs de download aparecerão aqui quando disponíveis.</string>
+ <string name="no_history_head_label">Sem Histórico</string>
+ <string name="no_history_label">Depois de ouvir um episódio, ele aparecerá aqui.</string>
+ <string name="no_all_episodes_head_label">Nenhum Episódio</string>
+ <string name="no_all_episodes_label">Quando você adiciona um podcast, os episódios são mostrados aqui.</string>
+ <string name="no_new_episodes_head_label">Nenhum episódio novo</string>
+ <string name="no_new_episodes_label">Quando novos episódios chegarem, eles serão mostrados aqui.</string>
+ <string name="no_fav_episodes_head_label">Nenhum episódio favorito</string>
+ <string name="no_fav_episodes_label">Você pode adicionar episódios aos favoritos mantendo-os pressionados.</string>
+ <string name="no_chapters_head_label">Nenhum capítulo</string>
<string name="no_chapters_label">Este episódio não possui capítulos</string>
+ <string name="no_subscriptions_head_label">Nenhuma assinatura</string>
+ <string name="no_subscriptions_label">Para assinar um podcast, pressione o ícone de adição abaixo.</string>
<!--Preferences-->
<string name="storage_pref">Armazenamento</string>
+ <string name="storage_sum">Exclusão automática de episódio, importação, exportação</string>
<string name="project_pref">Projeto</string>
<string name="queue_label">Fila</string>
+ <string name="synchronization_pref">Sincronização</string>
+ <string name="synchronization_sum">Sincroniza com outros dispositivos usando gpodder.net</string>
<string name="automation">Automação</string>
<string name="download_pref_details">Detalhes</string>
<string name="import_export_pref">Importar/Exportar</string>
+ <string name="import_export_search_keywords">backup, cópia, restore, restaurar</string>
<string name="appearance">Aparência</string>
<string name="external_elements">Elementos externos</string>
<string name="interruptions">Interrupções</string>
+ <string name="playback_control">Controle de reprodução</string>
+ <string name="preference_search_hint">Procurar...</string>
+ <string name="preference_search_no_results">Nenhum resultado</string>
+ <string name="preference_search_clear_history">Limpar histórico</string>
<string name="media_player">Reprodutor de mídia</string>
<string name="pref_episode_cleanup_title">Limpar Episódio</string>
<string name="pref_episode_cleanup_summary">Episódios que não estão na fila e não estão nos favoritos podem ser removidos se o Download Automático precisar de espaço para novos episódios</string>
@@ -298,7 +350,7 @@
<string name="pref_hardwarePreviousButtonRestarts_title">Botão anterior reinicia</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Reinicia a reprodução atual ao pressionar o botão físico anterior ao invés de retroceder</string>
<string name="pref_followQueue_sum">Pular para próximo item da fila quando a reprodução terminar</string>
- <string name="pref_auto_delete_sum">Apagar os episódios quando a reprodução for concluída</string>
+ <string name="pref_auto_delete_sum">Remover episódio quando a reprodução for concluída</string>
<string name="pref_auto_delete_title">Deletar automaticamente</string>
<string name="pref_smart_mark_as_played_sum">Marcar episódios como reproduzidos mesmo que restem alguns segundos de reprodução</string>
<string name="pref_smart_mark_as_played_title">Marcar automaticamente como reproduzido</string>
@@ -307,8 +359,11 @@
<string name="pref_favorite_keeps_episodes_sum">Manter episódios marcados como Favoritos</string>
<string name="pref_favorite_keeps_episodes_title">Manter episódios favoritos</string>
<string name="playback_pref">Reprodução</string>
+ <string name="playback_pref_sum">Controles de fone de ouvido, intervalos para saltar, Fila</string>
<string name="network_pref">Rede</string>
+ <string name="network_pref_sum">Intervalo de atualização, Controles de download, Dados móveis</string>
<string name="pref_autoUpdateIntervallOrTime_title">Atualizar intervalo ou momento do dia</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Especifique um intervalo ou uma hora específica do dia para atualizar os podcasts automaticamente</string>
<string name="pref_autoUpdateIntervallOrTime_message">Você pode configurar um <i>intervalo</i> como \"cada 2 horas\", configurar um <i>horário do dia</i> específico como \"7:00 AM\" ou <i>desabilitar</i> atualizações automaticas completamente.\n\n<small>Observe: Horários de atualização não são precisos. Você deve considar um possível atraso.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Desabilitar</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Configurar Intervalo</string>
@@ -319,8 +374,17 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Fones de ouvido desconectados</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Fones de ouvido reconectados</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth reconectado</string>
+ <string name="pref_stream_over_download_title">Preferir streaming</string>
+ <string name="pref_stream_over_download_sum">Mostrar o botão de streaming ao invés do botão de download nas listas.</string>
<string name="pref_mobileUpdate_title">Atualizações via Rede de Dados Celular</string>
+ <string name="pref_mobileUpdate_sum">Selecione o que deve ser permitido na conexão de dados móveis</string>
+ <string name="pref_mobileUpdate_refresh">Atualizar podcast</string>
+ <string name="pref_mobileUpdate_images">Imagens de capa</string>
+ <string name="pref_mobileUpdate_auto_download">Download automático</string>
+ <string name="pref_mobileUpdate_episode_download">Download de episódios</string>
+ <string name="pref_mobileUpdate_streaming">Streaming</string>
<string name="user_interface_label">Interface com usuário</string>
+ <string name="user_interface_sum">Aparência, pedidos de assinatura, tela de bloqueio</string>
<string name="pref_set_theme_title">Selecionar tema</string>
<string name="pref_nav_drawer_items_title">Configurar itens da Gaveta de Navegação</string>
<string name="pref_nav_drawer_items_sum">Escolher quais itens irão aparecer na gaveta de navegação.</string>
@@ -337,6 +401,10 @@
<string name="pref_automatic_download_on_battery_sum">Permitir download automático enquanto a bateria não está carregando</string>
<string name="pref_parallel_downloads_title">Downloads paralelos</string>
<string name="pref_episode_cache_title">Cache de episódios</string>
+ <string name="pref_episode_cache_summary">Número total de episódios baixados em cache no dispositivo. O download automático será suspenso se esse número for atingido.</string>
+ <string name="pref_episode_cover_title">Usar capa do episódio</string>
+ <string name="pref_episode_cover_summary">Use a capa específica do episódio sempre que disponível. Se desmarcado, o aplicativo sempre usará a imagem da capa do podcast.</string>
+ <string name="pref_theme_title_use_system">Usar tema do sistema</string>
<string name="pref_theme_title_light">Claro</string>
<string name="pref_theme_title_dark">Escuro</string>
<string name="pref_theme_title_trueblack">Preto (preparado para AMOLED)</string>
@@ -350,13 +418,24 @@
<string name="pref_gpodnet_logout_toast">Saiu com sucesso</string>
<string name="pref_gpodnet_setlogin_information_title">Alterar informações de login</string>
<string name="pref_gpodnet_setlogin_information_sum">Alterar informações de login da sua conta gpodder.net</string>
+ <string name="pref_gpodnet_sync_changes_title">Sincronizar agora</string>
<string name="pref_gpodnet_sync_changes_sum">Sincronizar as alterações de estado da inscrição e de episódios com o gpodder.net.</string>
+ <string name="pref_gpodnet_full_sync_title">Forçar sincronização completa</string>
<string name="pref_gpodnet_full_sync_sum">Sincronizar os estados das inscrições e episódios com o gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Entrou como <i>%1$s</i> com o dispositivo <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Exibir notificações de erros de sincronismo</string>
<string name="pref_gpodnet_notifications_sum">Essa configuração não se aplica a erros de autenticação.</string>
<string name="pref_playback_speed_title">Velocidades de Reprodução</string>
<string name="pref_playback_speed_sum">Personalize as velocidades variáveis de reprodução de áudio.</string>
+ <string name="pref_feed_playback_speed_sum">A velocidade a ser usada ao iniciar a reprodução de áudio para episódios neste podcast</string>
+ <string name="pref_feed_skip">Salto automático</string>
+ <string name="pref_feed_skip_sum">Pule as introduções e os créditos finais.</string>
+ <string name="pref_feed_skip_ending">Pular últimos</string>
+ <string name="pref_feed_skip_intro">Pular primeiros</string>
+ <string name="pref_feed_skip_ending_toast">Pulou últimos %d segundos</string>
+ <string name="pref_feed_skip_intro_toast">Pulou os primeiros %d segundos</string>
+ <string name="pref_playback_time_respects_speed_title">Ajuste as informações da mídia para a velocidade de reprodução</string>
+ <string name="pref_playback_time_respects_speed_sum">A posição exibida e a duração são adaptadas à velocidade de reprodução</string>
<string name="pref_fast_forward">Tempo de avanço rápido</string>
<string name="pref_fast_forward_sum">Personalize os segundos para avançar quando o botão avanço rápido for clicado</string>
<string name="pref_rewind">Tempo de retroceder</string>
@@ -375,15 +454,29 @@
<string name="pref_lockscreen_background_sum">Configurar o plano de fundo da tela de bloqueio para a imagem do episódio atual. Como um efeito colateral, também ira mostrar imagens de aplicativos de terceiros.</string>
<string name="pref_showDownloadReport_title">Mostrar Relatório de Downloads</string>
<string name="pref_showDownloadReport_sum">Se os downloads falharem, gerar um relatório que mostra os detalhes da falha.</string>
+ <string name="pref_showAutoDownloadReport_title">Mostrar relatório de downloads automáticos</string>
+ <string name="pref_showAutoDownloadReport_sum">Mostra uma notificação para episódios baixados automaticamente.</string>
<string name="pref_expand_notify_unsupport_toast">Versões do Android inferiores a 4.1 não suportam notificações expansíveis</string>
+ <string name="pref_enqueue_location_title">Local da fila</string>
+ <string name="pref_enqueue_location_sum">Adicionar episódios para: %1$s</string>
+ <string name="enqueue_location_back">Final</string>
+ <string name="enqueue_location_front">Início</string>
+ <string name="enqueue_location_after_current">Depois do episódio atual</string>
<string name="pref_smart_mark_as_played_disabled">Desabilitado</string>
<string name="pref_image_cache_size_title">Tamanho da Imagem em Cache</string>
<string name="pref_image_cache_size_sum">Tamanho do cache de disco para imagens.</string>
+ <string name="visit_user_forum">Fórum de usuários</string>
+ <string name="bug_report_title">Reportar um bug</string>
+ <string name="open_bug_tracker">Abrir registro de bugs</string>
+ <string name="export_logs">Exportar logs</string>
+ <string name="copy_to_clipboard">Copiar para clipboard</string>
+ <string name="copied_to_clipboard">Copiado para clipboard</string>
<string name="experimental_pref">Experimental</string>
<string name="pref_media_player_message">Selecione qual reprodutor de mídia usar para reproduzir os arquivos</string>
<string name="pref_current_value">Valor atual: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Configurar um proxy da rede</string>
+ <string name="pref_faq">Perguntas mais frequentes</string>
<string name="pref_no_browser_found">Nenhum navegador web encontrado.</string>
<string name="pref_cast_title">Suporte ao Chromecast</string>
<string name="pref_cast_message_play_flavor">Habilitar o suporte para reprodução remota de mídia em dispositivos Cast (como Chromecast, Caixa de som ou Android TV)</string>
@@ -391,6 +484,8 @@
<string name="pref_enqueue_downloaded_title">Enfileirar os baixados</string>
<string name="pref_enqueue_downloaded_summary">Adicionar episódios baixados à fila</string>
<string name="media_player_builtin">Reprodutor próprio do Android</string>
+ <string name="media_player_switch_to_exoplayer">Alterar para ExoPlayer</string>
+ <string name="media_player_switched_to_exoplayer">Alterado para ExoPlayer</string>
<string name="pref_skip_silence_title">Pular silêncio no áudio</string>
<string name="pref_videoBehavior_title">Após fechar vídeo</string>
<string name="pref_videoBehavior_sum">Comportamento ao parar a reprodução de vídeo</string>
diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml
index 375fa5426..64a381953 100644
--- a/core/src/main/res/values-pt/strings.xml
+++ b/core/src/main/res/values-pt/strings.xml
@@ -33,7 +33,7 @@
<string name="statistics_mode_count_all">Somar todos os podcasts marcados como reproduzidos</string>
<string name="statistics_speed_not_counted">Aviso: a velocidade de reprodução nunca será considerada.</string>
<string name="statistics_reset_data">Reiniciar estatísticas dos dados</string>
- <string name="statistics_reset_data_msg">Isto irá apagar o histórico do tempo de reprodução pata todos os episódios. Tem a certeza de que deseja continuar?</string>
+ <string name="statistics_reset_data_msg">Isto irá apagar o histórico do tempo de reprodução para todos os episódios. Tem a certeza de que deseja continuar?</string>
<!--Download Statistics fragment-->
<string name="total_size_downloaded_podcasts">Tamanho total dos podcasts descarregados:</string>
<!--Main activity-->
@@ -176,7 +176,7 @@
<string name="play_this_to_seek_position">Se quiser ir para uma posição, tem que reproduzir o episódio</string>
<plurals name="marked_read_batch_label">
<item quantity="one">%d episódio marcado como reproduzido.</item>
- <item quantity="other">%depisódios marcados como reproduzido. </item>
+ <item quantity="other">%depisódios marcados como reproduzidos. </item>
</plurals>
<string name="mark_unread_label">Marcar como não reproduzido</string>
<string name="mark_unread_label_no_media">Marcar como não lida</string>
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Acerca</string>
<string name="antennapod_version">Versão do AntennaPod</string>
+ <string name="contributors">Contributos</string>
+ <string name="contributors_summary">Todos podem ajudar a melhorar o AntennaPod - com código, com traduções ou até mesmo auxiliando os utilizadores do nosso fórum</string>
<string name="developers">Programadores</string>
- <string name="developers_summary">Todos podem ajudar a tornar o AntennaPod melhor</string>
<string name="translators">Tradutores</string>
- <string name="translators_summary">As traduções são criadas pelos utilizadores do AntennaPod, através da plataforma Transifex</string>
+ <string name="special_thanks">Especial agradecimento</string>
<string name="privacy_policy">Política de privacidade</string>
<string name="licenses">Licenças</string>
<string name="licenses_summary">AntennaPod utiliza outro software grandioso</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Selecione o ficheiro a importar</string>
<string name="import_ok">Importação bem sucedida.\n\nPor favor prima OK para reiniciar o AntennaPod</string>
<string name="import_no_downgrade">A base de dados foi exportada de uma versão mais recente do AntennaPod. A sua versão da aplicação não sabe como manipular este ficheiro.</string>
+ <string name="favorites_export_label">Exportação de favoritos</string>
+ <string name="favorites_export_summary">Exportar favoritos para um ficheiro</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Definir temporizador</string>
<string name="disable_sleeptimer_label">Desativar temporizador</string>
diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml
index fc01e6bad..58c177f95 100644
--- a/core/src/main/res/values-ru/strings.xml
+++ b/core/src/main/res/values-ru/strings.xml
@@ -22,13 +22,13 @@
<string name="gpodnet_main_label">gpodder.net</string>
<string name="gpodnet_auth_label">Войти на gpodder.net</string>
<string name="episode_cache_full_title">Кэш выпусков заполнен</string>
- <string name="episode_cache_full_message">Достигнут предел кэша выпусков. Объём кэша можно увеличить в Настройках.</string>
+ <string name="episode_cache_full_message">Достигнут предел кэша выпусков. Объем кэша можно увеличить в настройках.</string>
<string name="playback_statistics_label">Воспроизведение</string>
<string name="download_statistics_label">Загрузки</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Общее время прослушивания подкастов:</string>
<string name="statistics_details_dialog">%1$d из %2$d выпусков начато.\n\nПрослушано %3$s из %4$s.</string>
- <string name="statistics_mode">Режим подсчёта статистики</string>
+ <string name="statistics_mode">Режим подсчета статистики</string>
<string name="statistics_mode_normal">Рассчитывать длительность действительного воспроизведения. Повторное воспроизведение засчитывается, а отметка о прослушивании — нет</string>
<string name="statistics_mode_count_all">Прибавлять также все подкасты, отмеченные как прослушанные</string>
<string name="statistics_speed_not_counted">Замечание: Скорость воспроизведения не учитывается никогда.</string>
@@ -85,6 +85,7 @@
<string name="auto_download_apply_to_items_message">Новые настройки <i>Автозагрузки</i> будут автоматически применены к новым выпускам. \nХотите ли вы применить их к ранее опубликованным выпускам?</string>
<string name="auto_delete_label">Автоматически удалить выпуск</string>
<string name="feed_volume_reduction">Уменьшение громкости</string>
+ <string name="feed_volume_reduction_summary">Уменьшать громкость выпусков этого канала: %1$s</string>
<string name="feed_volume_reduction_off">Выключено</string>
<string name="feed_volume_reduction_light">Слабое</string>
<string name="feed_volume_reduction_heavy">Сильное</string>
@@ -108,6 +109,12 @@
<item quantity="many">%d дней после прослушивания</item>
<item quantity="other">%d дней после прослушивания</item>
</plurals>
+ <plurals name="num_selected_label">
+ <item quantity="one">Выбрано: %d</item>
+ <item quantity="few">Выбрано: %d</item>
+ <item quantity="many">Выбрано: %d</item>
+ <item quantity="other">Выбрано: %d</item>
+ </plurals>
<string name="loading_more">Загружается...</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Отметить как прослушанное</string>
@@ -165,10 +172,10 @@
<string name="delete_failed">Невозможно удалить файл. Попробуйте перезагрузить устройство.</string>
<string name="delete_episode_label">Удалить выпуск</string>
<plurals name="deleted_episode_batch_label">
- <item quantity="one">%d выпуск удалён</item>
- <item quantity="few">%d выпуска удалены</item>
- <item quantity="many">%d выпусков удалены</item>
- <item quantity="other">%d выпусков удалено</item>
+ <item quantity="one">%d выпуск удален.</item>
+ <item quantity="few">%d выпуска удалены.</item>
+ <item quantity="many">%d выпусков удалены.</item>
+ <item quantity="other">%d выпусков удалено.</item>
</plurals>
<string name="remove_new_flag_label">Убрать пометку «Новый»</string>
<string name="removed_new_flag_label">Пометка «Новый» убрана</string>
@@ -201,7 +208,7 @@
</plurals>
<string name="remove_from_queue_label">Удалить из очереди</string>
<plurals name="removed_from_queue_batch_label">
- <item quantity="one">%d выпуск удалён из очереди.</item>
+ <item quantity="one">%d выпуск удален из очереди.</item>
<item quantity="few">%d выпуска удалены из очереди.</item>
<item quantity="many">%d выпусков удалены из очереди.</item>
<item quantity="other">%d выпусков удалено из очереди.</item>
@@ -216,6 +223,7 @@
<string name="deactivate_auto_download">Отключить автоматическую загрузку</string>
<string name="reset_position">Сбросить время воспроизведения</string>
<string name="removed_item">Удалено</string>
+ <string name="no_items_selected">Ничего не выбрано</string>
<!--Download messages and labels-->
<string name="download_successful">успешно</string>
<string name="download_pending">Загрузка в ожидании</string>
@@ -232,12 +240,12 @@
<string name="download_error_unknown_host">Неизвестный узел</string>
<string name="download_error_unauthorized">Ошибка авторизации</string>
<string name="download_error_file_type_type">Ошибка типа файла</string>
- <string name="download_error_forbidden">Доступ запрещён</string>
+ <string name="download_error_forbidden">Запрещено</string>
<string name="download_canceled_msg">Загрузка отменена</string>
<string name="download_canceled_autodownload_enabled_msg">Загрузка отменена\n <i>Автозагрузка</i> отключена для этого выпуска</string>
<string name="download_report_title">Загрузки завершились с ошибкой</string>
<string name="auto_download_report_title">Автозагрузка завершена</string>
- <string name="download_report_content_title">Отчёт о загрузках</string>
+ <string name="download_report_content_title">Отчет о загрузках</string>
<string name="download_error_malformed_url">Неправильная ссылка</string>
<string name="download_error_io_error">Ошибка ввода-вывода</string>
<string name="download_error_request_error">Ошибка запроса</string>
@@ -332,13 +340,14 @@
<string name="no_chapters_head_label">Без оглавления</string>
<string name="no_chapters_label">Этот выпуск не содержит оглавления.</string>
<string name="no_subscriptions_head_label">Подписки не оформлены</string>
- <string name="no_subscriptions_label">Чтобы подписаться на подкаст, нажмите значок \"плюс\" внизу.</string>
+ <string name="no_subscriptions_label">Чтобы подписаться на подкаст, нажмите значок «плюс» внизу.</string>
<!--Preferences-->
<string name="storage_pref">Хранилище</string>
<string name="storage_sum">Автоматическое удаление выпусков, импорт, экспорт</string>
<string name="project_pref">Проект</string>
<string name="queue_label">Очередь</string>
<string name="synchronization_pref">Синхронизация</string>
+ <string name="synchronization_sum">Синхронизация с другими устройствами с помощью gpodder.net</string>
<string name="automation">Автоматизация</string>
<string name="download_pref_details">Подробнее</string>
<string name="import_export_pref">Импорт/экспорт</string>
@@ -356,14 +365,14 @@
<string name="pref_pauseOnDisconnect_sum">Поставить на паузу, когда наушники или Bluetooth отключены</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Продолжать воспроизведение после подключения наушников</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Возобновить, когда восстановится Bluetooth-соединение</string>
- <string name="pref_hardwareForwardButtonSkips_title">Пропускать кнопкой перемотки вперёд</string>
- <string name="pref_hardwareForwardButtonSkips_sum">При нажатии кнопки перемотки вперёд на Bluetooth-устройстве включить следующий выпуск</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Пропускать кнопкой перемотки вперед</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">При нажатии кнопки перемотки вперед на Bluetooth-устройстве включить следующий выпуск</string>
<string name="pref_hardwarePreviousButtonRestarts_title">В начало кнопкой перемотки назад</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">При нажатии на физическую кнопку перемотки назад переходить к началу выпуска вместо перемотки назад</string>
<string name="pref_followQueue_sum">После завершения воспроизведения перейти к следующему в очереди</string>
<string name="pref_auto_delete_sum">Удалять выпуск после воспроизведения</string>
<string name="pref_auto_delete_title">Автоматическое удаление</string>
- <string name="pref_smart_mark_as_played_sum">Отмечать выпуски как прослушанные, даже если до завершения остаётся некоторое время</string>
+ <string name="pref_smart_mark_as_played_sum">Отмечать выпуски как прослушанные, даже если до завершения остается некоторое время</string>
<string name="pref_smart_mark_as_played_title">Отметка «Прослушанное» до окончания</string>
<string name="pref_skip_keeps_episodes_sum">Сохранять выпуски, помеченные как пропущенные</string>
<string name="pref_skip_keeps_episodes_title">Сохранять пропущенные выпуски</string>
@@ -401,8 +410,8 @@
<string name="pref_nav_drawer_items_sum">Изменение отображения пунктов меню боковой панели</string>
<string name="pref_nav_drawer_feed_order_title">Упорядочить подписки</string>
<string name="pref_nav_drawer_feed_order_sum">Выбрать порядок отображения подписок</string>
- <string name="pref_nav_drawer_feed_counter_title">Выбрать счётчик подписок</string>
- <string name="pref_nav_drawer_feed_counter_sum">Какую информацию показывать в счётчике подписок. Влияет также на очерёдность подписок, если сортировка подписок производится по счётчику.</string>
+ <string name="pref_nav_drawer_feed_counter_title">Выбрать счетчик подписок</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Какую информацию показывать в счетчике подписок. Влияет также на очередность подписок, если сортировка подписок производится по счетчику.</string>
<string name="pref_set_theme_sum">Изменить тему оформления AntennaPod</string>
<string name="pref_automatic_download_title">Автоматическая загрузка</string>
<string name="pref_automatic_download_sum">Настроить автоматическую загрузку выпусков.</string>
@@ -417,8 +426,8 @@
<string name="pref_episode_cover_summary">Отображать вместо обложки подкаста обложку выпуска, если она доступна.</string>
<string name="pref_theme_title_use_system">Использовать системное оформление</string>
<string name="pref_theme_title_light">Светлая</string>
- <string name="pref_theme_title_dark">Тёмная</string>
- <string name="pref_theme_title_trueblack">Чёрная (для AMOLED)</string>
+ <string name="pref_theme_title_dark">Темная</string>
+ <string name="pref_theme_title_trueblack">Черная (для AMOLED)</string>
<string name="pref_episode_cache_unlimited">Неограничен</string>
<string name="pref_update_interval_hours_plural">ч.</string>
<string name="pref_update_interval_hours_singular">ч.</string>
@@ -426,10 +435,12 @@
<string name="pref_gpodnet_authenticate_title">Войти</string>
<string name="pref_gpodnet_authenticate_sum">Вход в ваш аккаунт gpodder.net для синхронизации подписок.</string>
<string name="pref_gpodnet_logout_title">Выход из gpodder.net</string>
- <string name="pref_gpodnet_logout_toast">Выход произведён успешно</string>
+ <string name="pref_gpodnet_logout_toast">Выход успешно выполнен</string>
<string name="pref_gpodnet_setlogin_information_title">Изменить информацию авторизации</string>
<string name="pref_gpodnet_setlogin_information_sum">Изменить информацию авторизации для аккаунта gpodder.net</string>
+ <string name="pref_gpodnet_sync_changes_title">Синхронизировать сейчас</string>
<string name="pref_gpodnet_sync_changes_sum">Синхронизировать изменения подписок и выпусков при помощи gpodder.net.</string>
+ <string name="pref_gpodnet_full_sync_title">Выполнить полную синхронизацию</string>
<string name="pref_gpodnet_full_sync_sum">Синхронизировать состояния всех подписок и выпусков при помощи gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Вход как <i>%1$s</i> с устройства <i>%2$s</i>]]></string>
<string name="pref_gpodnet_notifications_title">Показывать уведомления об ошибках синхронизации</string>
@@ -437,11 +448,16 @@
<string name="pref_playback_speed_title">Скорости воспроизведения</string>
<string name="pref_playback_speed_sum">Выбрать значения скорости, доступные при воспроизведении</string>
<string name="pref_feed_playback_speed_sum">Скорость, с которой будут изначально воспроизводиться выпуски этого подкаста</string>
- <string name="pref_feed_skip_intro_toast">Пропусить первые %d секунд</string>
+ <string name="pref_feed_skip">Автоматический пропуск</string>
+ <string name="pref_feed_skip_sum">Пропускать вступительную и заключительную часть.</string>
+ <string name="pref_feed_skip_ending">Пропуск в конце</string>
+ <string name="pref_feed_skip_intro">Пропуск в начале</string>
+ <string name="pref_feed_skip_ending_toast">Пропущено %d сек. в конце</string>
+ <string name="pref_feed_skip_intro_toast">Пропущено %d сек. в начале</string>
<string name="pref_playback_time_respects_speed_title">Подстройка метаданных под скорость воспроизведения</string>
<string name="pref_playback_time_respects_speed_sum">Значения позиции и длительности зависят от скорости воспроизведения</string>
<string name="pref_fast_forward">Интервал быстрой перемотки вперед</string>
- <string name="pref_fast_forward_sum">Настройте длину шага в секундах при нажатии кнопки перемотки вперёд</string>
+ <string name="pref_fast_forward_sum">Настройте длину шага в секундах при нажатии кнопки перемотки вперед</string>
<string name="pref_rewind">Интервал быстрой перемотки назад</string>
<string name="pref_rewind_sum">Настройте длину шага в секундах при нажатии кнопки перемотки назад</string>
<string name="pref_gpodnet_sethostname_title">Задать имя узла</string>
@@ -456,8 +472,8 @@
<string name="pref_compact_notification_buttons_dialog_error">Нельзя выбрать больше %1$d элементов.</string>
<string name="pref_lockscreen_background_title">Менять фон экрана блокировки</string>
<string name="pref_lockscreen_background_sum">Изменяет фон экрана блокировки на обложку выпуска. Кроме того показывает обложку в сторонних приложениях.</string>
- <string name="pref_showDownloadReport_title">Показывать отчёт о загрузках</string>
- <string name="pref_showDownloadReport_sum">Если загрузка не удаётся, показывать отчёт с подробностями об ошибке.</string>
+ <string name="pref_showDownloadReport_title">Показывать отчет о загрузках</string>
+ <string name="pref_showDownloadReport_sum">Если загрузка не удается, показывать отчет с подробностями об ошибке.</string>
<string name="pref_showAutoDownloadReport_title">Показывать результаты автозагрузки</string>
<string name="pref_showAutoDownloadReport_sum">Показывать уведомление при автоматической загрузке выпусков</string>
<string name="pref_expand_notify_unsupport_toast">Версии Android ниже 4.1 не поддерживают расширенные уведомления.</string>
@@ -488,6 +504,8 @@
<string name="pref_enqueue_downloaded_title">Добавлять загруженные в очередь</string>
<string name="pref_enqueue_downloaded_summary">Добавлять загруженные выпуски в очередь</string>
<string name="media_player_builtin">Встроенный в Android</string>
+ <string name="media_player_switch_to_exoplayer">Переключить на ExoPlayer</string>
+ <string name="media_player_switched_to_exoplayer">Переключено на ExoPlayer.</string>
<string name="pref_skip_silence_title">Пропускать участки тишины</string>
<string name="pref_videoBehavior_title">При завершении видео</string>
<string name="pref_videoBehavior_sum">При сворачивании проигрывателя видео</string>
@@ -501,7 +519,7 @@
<string name="back_button_double_tap">Выход двойным касанием</string>
<string name="back_button_show_prompt">Подтверджение выхода</string>
<string name="close_prompt">Уверены, что хотите закрыть AntennaPod?</string>
- <string name="double_tap_toast">Нажмите кнопку «Назад» ещё раз, чтобы выйти</string>
+ <string name="double_tap_toast">Нажмите кнопку «Назад» еще раз, чтобы выйти</string>
<string name="back_button_go_to_page">Перейти к странице…</string>
<string name="back_button_go_to_page_title">Выберите страницу</string>
<string name="pref_delete_removes_from_queue_title">Убирать удаленные из очереди</string>
@@ -509,10 +527,11 @@
<!--About screen-->
<string name="about_pref">О программе</string>
<string name="antennapod_version">Версия AntennaPod</string>
+ <string name="contributors">Участники</string>
+ <string name="contributors_summary">Каждый может сделать свой вклад в улучшение AntennaPod — с помощью кода, перевода или помогая пользователям на форуме</string>
<string name="developers">Разработчики</string>
- <string name="developers_summary">Любой может помочь улучшить AntennaPod</string>
<string name="translators">Переводчики</string>
- <string name="translators_summary">Перевод выполнен пользователями AntennaPod при помощи Transifex</string>
+ <string name="special_thanks">Особая благодарность</string>
<string name="privacy_policy">Политика конфиденциальности</string>
<string name="licenses">Лицензии</string>
<string name="licenses_summary">В AntennaPod используется другое отличное ПО</string>
@@ -522,7 +541,12 @@
<string name="no_results_for_query">По запросу «%1$s» ничего не найдено</string>
<!--Synchronization-->
<string name="sync_status_started">Синхронизация запущена</string>
+ <string name="sync_status_episodes_upload">Отправка изменений выпуска…</string>
+ <string name="sync_status_episodes_download">Загрузка изменений выпуска…</string>
+ <string name="sync_status_upload_played">Отправка состояния прослушивания…</string>
<string name="sync_status_subscriptions">Синхронизация подписок ...</string>
+ <string name="sync_status_success">Синхронизация выполнена</string>
+ <string name="sync_status_error">Сбой синхронизации</string>
<!--import and export-->
<string name="import_export_summary">Перенести подписку и очередь на другое устройство</string>
<string name="database">База данных</string>
@@ -542,16 +566,17 @@
<string name="html_export_label">Экспорт в HTML</string>
<string name="database_export_label">Экспорт базы данных</string>
<string name="database_import_label">Импорт базы данных</string>
+ <string name="database_import_warning">Импорт базы данных приведет к замене всех текущих подписок и истории воспроизведения. Рекомендуется экспортировать текущую базу данных, чтобы иметь резервную копию. Хотите заменить?</string>
<string name="please_wait">Подождите…</string>
<string name="export_error_label">Ошибка экспорта</string>
- <string name="export_success_title">Экспорт завершён успешно</string>
- <string name="export_success_sum">Экспорт осуществлён в файл:
-
-%1$s</string>
+ <string name="export_success_title">Экспорт выполнен</string>
+ <string name="export_success_sum">Файл экспорта был сохранен в папку:\n\n%1$s</string>
<string name="opml_import_ask_read_permission">Для чтения файла OPML необходим доступ к внешнему хранилищу</string>
<string name="import_select_file">Выбрать файл для импорта</string>
<string name="import_ok">Успешно импортировано.\n\nНажмите OK, чтобы перезапустить AntennaPod</string>
<string name="import_no_downgrade">Выбранная база данных экспортирована из более поздней версии AntennaPod. Установленная версия не сможет воспользоваться этой базой.</string>
+ <string name="favorites_export_label">Экспорт избранного</string>
+ <string name="favorites_export_summary">Экспортировать сохраненное избранное в файл</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Установить таймер сна</string>
<string name="disable_sleeptimer_label">Отключить таймер сна</string>
@@ -581,7 +606,7 @@
<item quantity="other">%d часа</item>
</plurals>
<string name="auto_enable_label">Запускать автоматически</string>
- <string name="sleep_timer_enabled_label">Таймер сна включён</string>
+ <string name="sleep_timer_enabled_label">Таймер сна включен</string>
<!--gpodder.net-->
<string name="gpodnet_taglist_header">Категории</string>
<string name="gpodnet_toplist_header">Лучшее</string>
@@ -590,7 +615,7 @@
<string name="gpodnetauth_login_title">Войти</string>
<string name="gpodnetauth_login_descr">Добро пожаловать в процесс авторизации на gpodder.net. Сначала введите вашу информацию для авторизации:</string>
<string name="gpodnetauth_login_butLabel">Войти</string>
- <string name="gpodnetauth_login_register">Если у вас ещё нет аккаунта, вы можете создать его здесь:\nhttps://gpodder.net/register/</string>
+ <string name="gpodnetauth_login_register">Если у вас еще нет аккаунта, вы можете создать его здесь:\nhttps://gpodder.net/register/</string>
<string name="username_label">Имя пользователя</string>
<string name="password_label">Пароль</string>
<string name="gpodnetauth_device_title">Выбор устройства</string>
@@ -641,9 +666,10 @@
<string name="subscribe_label">Подписаться</string>
<string name="subscribing_label">Подписка оформляется…</string>
<string name="preview_episode">Предпросмотр</string>
+ <string name="stop_preview">Остановить предпросмотр</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Назад</string>
- <string name="fast_forward_label">Вперёд</string>
+ <string name="fast_forward_label">Вперед</string>
<string name="increase_speed">Увеличить скорость</string>
<string name="decrease_speed">Уменьшить скорость</string>
<string name="media_type_audio_label">Аудио</string>
@@ -654,6 +680,9 @@
<string name="is_favorite_label">Эпизод отмечен как избранный</string>
<string name="drag_handle_content_description">Перетяните чтобы изменить позицию этого элемента</string>
<string name="load_next_page_label">Загрузить следующую страницу</string>
+ <string name="switch_pages">Переключить страницу</string>
+ <string name="position">Позиция: %1$s</string>
+ <string name="apply_action">Применить действие</string>
<!--Feed information screen-->
<string name="authentication_label">Авторизация</string>
<string name="authentication_descr">Изменить имя пользователя и пароль для этого подкаста и его выпусков.</string>
@@ -662,7 +691,7 @@
<string name="episode_filters_description">Перечень условий по включению или исключению выпуска из списков автоматической загрузки</string>
<string name="episode_filters_include">Включить</string>
<string name="episode_filters_exclude">Исключить</string>
- <string name="episode_filters_hint">По одному слову \n\"По фразе\"</string>
+ <string name="episode_filters_hint">По одному слову \n«По фразе»</string>
<string name="keep_updated">Постоянно обновлять</string>
<string name="keep_updated_summary">Обновлять подкаст при (авто)обновлении всех подкастов</string>
<string name="auto_download_disabled_globally">Автоматическая загрузка отключена в основных настройках AntennaPod</string>
@@ -678,7 +707,8 @@
<string name="add_podcast_by_url">Добавить подкаст по адресу</string>
<string name="browse_gpoddernet_label">Просмотр gpodder.net</string>
<string name="discover">Ознакомиться</string>
- <string name="discover_more">ещё »</string>
+ <string name="discover_more">еще »</string>
+ <string name="search_powered_by">Для поиска используется %1$s</string>
<string name="filter">Фильтровать</string>
<!--Episodes apply actions-->
<string name="all_label">Все</string>
@@ -706,10 +736,16 @@
<string name="sort_date_old_new">от старых к новым</string>
<string name="sort_duration_short_long">от коротких к длинным</string>
<string name="sort_duration_long_short">от длинных к коротким</string>
+ <string name="sort_a_z">от А к Я</string>
+ <string name="sort_z_a">от Я к А</string>
+ <string name="sort_new_old">от новых к старым</string>
+ <string name="sort_old_new">от старых к новым</string>
+ <string name="sort_short_long">от коротких к длинным</string>
+ <string name="sort_long_short">от длинных к коротким</string>
<!--Rating dialog-->
<string name="rating_title">Нравится AntennaPod?</string>
- <string name="rating_message">Мы будем Вам благодарны за оценку AntennaPod.</string>
- <string name="rating_never_label">Не дождётесь</string>
+ <string name="rating_message">Мы будем рады, если вы поставите оценку AntennaPod.</string>
+ <string name="rating_never_label">Не дождетесь</string>
<string name="rating_later_label">Позже, не сейчас</string>
<string name="rating_now_label">Конечно, давай!</string>
<!--Audio controls-->
@@ -748,7 +784,7 @@
<string name="cast_failed_no_connection_trans">Соединение с устройством Google Cast потеряно. Соединение восстанавливается. Попробуйте снова через несколько секунд.</string>
<string name="cast_failed_status_request">Не удалось синхронизироваться с устройством Google cast</string>
<string name="cast_failed_seek">Не удалось выполнить перемотку на устройстве Google cast</string>
- <string name="cast_failed_receiver_player_error">Серьёзная ошибка воспроизведения в устройстве Google cast</string>
+ <string name="cast_failed_receiver_player_error">Серьезная ошибка воспроизведения в устройстве Google cast</string>
<string name="cast_failed_media_error_skipping">Ошибка воспроизведения. Пропускаю…</string>
<!--Notification channels-->
<string name="notification_channel_user_action">Требуется действие</string>
@@ -767,4 +803,6 @@
<string name="widget_opacity">Непрозрачность</string>
<!--On-Demand configuration-->
<string name="on_demand_config_setting_changed">Настройки успешно обновлены.</string>
+ <string name="on_demand_config_stream_text">Похоже, вы часто слушаете по сети. Хотите, чтобы в списке выпусков отображались кнопки для потокового воспроизведения?</string>
+ <string name="on_demand_config_download_text">Похоже, вы часто слушаете загружаете выпуски. Хотите, чтобы в списке выпусков отображались кнопки для загрузки?</string>
</resources>
diff --git a/core/src/main/res/values-sv/strings.xml b/core/src/main/res/values-sv/strings.xml
index f5d85e18c..632d5f94a 100644
--- a/core/src/main/res/values-sv/strings.xml
+++ b/core/src/main/res/values-sv/strings.xml
@@ -507,10 +507,11 @@
<!--About screen-->
<string name="about_pref">Om</string>
<string name="antennapod_version">AntennaPod version</string>
+ <string name="contributors">Medverkare</string>
+ <string name="contributors_summary">Alla kan hjälpa till att göra AntennaPod bättre - med kod, översättningar eller genom att hjälpa användare i vårt forum.</string>
<string name="developers">Utvecklare</string>
- <string name="developers_summary">Alla kan hjälpa till att göra AntennaPod bättre</string>
<string name="translators">Översättare</string>
- <string name="translators_summary">Översättningar skapas av AntennaPods användare med hjälp av Transifex</string>
+ <string name="special_thanks">Speciellt tack</string>
<string name="privacy_policy">Integritetspolicy</string>
<string name="licenses">Licenser</string>
<string name="licenses_summary">AntennaPod förlitar sig på annan bra programvara</string>
@@ -554,6 +555,8 @@
<string name="import_select_file">Välj fil att importera</string>
<string name="import_ok">Importen lyckades.\n\nTryck OK för att starta om AntennaPod</string>
<string name="import_no_downgrade">Denna databas var exporterad med en nyare version av AntennaPod. Din nuvarande installation vet inte hur den ska hantera filen än.</string>
+ <string name="favorites_export_label">Favoritexport</string>
+ <string name="favorites_export_summary">Exportera sparade favoriter till fil</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ställ in sömntimer</string>
<string name="disable_sleeptimer_label">Stäng av sömntimer</string>
diff --git a/core/src/main/res/values-uk/strings.xml b/core/src/main/res/values-uk/strings.xml
index 24a405e45..d61cb5977 100644
--- a/core/src/main/res/values-uk/strings.xml
+++ b/core/src/main/res/values-uk/strings.xml
@@ -453,9 +453,7 @@
<string name="about_pref">Про програму</string>
<string name="antennapod_version">Версія AntennaPod</string>
<string name="developers">Розробники</string>
- <string name="developers_summary">Кожен може допомогти AntennaPod стати краще</string>
<string name="translators">Перекладачі</string>
- <string name="translators_summary">Переклади створюються користувачами AntennaPod за допомогою Transifex</string>
<string name="privacy_policy">Політика конфіденційності</string>
<string name="licenses">Ліцензії</string>
<string name="licenses_summary">AntennaPod використовує інше чудове програмне забезпечення</string>
diff --git a/core/src/main/res/values-zh-rCN/strings.xml b/core/src/main/res/values-zh-rCN/strings.xml
index 6b02a07e6..829f63846 100644
--- a/core/src/main/res/values-zh-rCN/strings.xml
+++ b/core/src/main/res/values-zh-rCN/strings.xml
@@ -129,7 +129,7 @@
<string name="share_feed_url_label">分享播客URL</string>
<string name="share_item_url_label">分享媒体文件地址</string>
<string name="share_item_url_with_position_label">分享带播放位置的媒体文件地址</string>
- <string name="feed_delete_confirmation_msg">请确认您想删除播客“1%1$s” 及其所有节目(包括已经下载的)</string>
+ <string name="feed_delete_confirmation_msg">请确认您想删除播客“%1$s” 及其所有节目(包括已经下载的)</string>
<string name="feed_remover_msg">正在移除播客</string>
<string name="load_complete_feed">刷新所有播客</string>
<string name="multi_select">多选</string>
@@ -151,7 +151,7 @@
<!--actions on feeditems-->
<string name="download_label">下载</string>
<plurals name="downloading_batch_label">
- <item quantity="other">正下载1%d个音频节目</item>
+ <item quantity="other">正下载%d个音频节目</item>
</plurals>
<string name="play_label">播放</string>
<string name="pause_label">暂停</string>
@@ -160,7 +160,7 @@
<string name="delete_failed">无法删除文件。重启可能解决该问题。</string>
<string name="delete_episode_label">删除节目</string>
<plurals name="deleted_episode_batch_label">
- <item quantity="other">已删除1%d个节目</item>
+ <item quantity="other">已删除%d个节目</item>
</plurals>
<string name="remove_new_flag_label">移除“新的”标签</string>
<string name="removed_new_flag_label">已移除“新的”标签</string>
@@ -170,21 +170,21 @@
<string name="marked_as_read_no_media_label">已标为已读</string>
<string name="play_this_to_seek_position">要跳转到某处,你需要播放这一集</string>
<plurals name="marked_read_batch_label">
- <item quantity="other">已将1%d个节目标记为已播放</item>
+ <item quantity="other">已将%d个节目标记为已播放</item>
</plurals>
<string name="mark_unread_label">标记未播放</string>
<string name="mark_unread_label_no_media">标为未读</string>
<plurals name="marked_unread_batch_label">
- <item quantity="other">已将1%d个节目标记为未播放</item>
+ <item quantity="other">已将%d个节目标记为未播放</item>
</plurals>
<string name="add_to_queue_label">添加到播放列表</string>
<string name="added_to_queue_label">已添加到播放列表</string>
<plurals name="added_to_queue_batch_label">
- <item quantity="other">已将1%d个节目添加到序列中</item>
+ <item quantity="other">已将%d个节目添加到序列中</item>
</plurals>
<string name="remove_from_queue_label">从播放列表中删除</string>
<plurals name="removed_from_queue_batch_label">
- <item quantity="other">已从序列中移除1%d个节目</item>
+ <item quantity="other">已从序列中移除%d个节目</item>
</plurals>
<string name="add_to_favorite_label">加入收藏</string>
<string name="added_to_favorites">添加到收藏</string>
@@ -498,10 +498,11 @@
<!--About screen-->
<string name="about_pref">关于</string>
<string name="antennapod_version">AntennaPod版本</string>
+ <string name="contributors">贡献者</string>
+ <string name="contributors_summary">每个人都可以通过代码,翻译或通过帮助我们论坛中的用户来让AntennaPod变得更好</string>
<string name="developers">开发者</string>
- <string name="developers_summary">每个人都可以帮助改进AntennaPod</string>
<string name="translators">译者</string>
- <string name="translators_summary">翻译由AntennPod用户使用Transifex创建</string>
+ <string name="special_thanks">特别感谢</string>
<string name="privacy_policy">隐私政策</string>
<string name="licenses">许可证</string>
<string name="licenses_summary">AntennaPod使用其他伟大的软件</string>
@@ -540,11 +541,13 @@
<string name="please_wait">请等待...</string>
<string name="export_error_label">导出出错</string>
<string name="export_success_title">成功导出</string>
- <string name="export_success_sum">导出文件被写入:\n\n 1%1$s</string>
+ <string name="export_success_sum">导出文件被写入:\n\n %1$s</string>
<string name="opml_import_ask_read_permission">读取 OPML 文件需要访问外部存储的权限</string>
<string name="import_select_file">选择导入文件</string>
<string name="import_ok">成功导入,请按OK重启AntennaPod</string>
<string name="import_no_downgrade">该数据库是使用较新版本的AntennaPod导出的。您当前安装的版本尚不知如何处理该文件。</string>
+ <string name="favorites_export_label">收藏导出</string>
+ <string name="favorites_export_summary">将保存的收藏夹导出到文件</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">设置休眠计时器</string>
<string name="disable_sleeptimer_label">禁用休眠计时器</string>
@@ -661,7 +664,7 @@
<!--Add podcast fragment-->
<string name="search_podcast_hint">搜索播客……</string>
<string name="search_itunes_label">搜索 iTunes</string>
- <string name="search_fyyd_label">搜索 fydd</string>
+ <string name="search_fyyd_label">搜索 fyyd</string>
<string name="advanced">高级</string>
<string name="add_podcast_by_url">通过URL添加播客</string>
<string name="browse_gpoddernet_label">浏览 gpodder.net</string>
diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000..0b3f88797
--- /dev/null
+++ b/core/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,768 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activity and fragment titles-->
+ <string name="feed_update_receiver_name">更新訂閱</string>
+ <string name="feeds_label">Podcast</string>
+ <string name="statistics_label">統計</string>
+ <string name="add_feed_label">新增 Podcast</string>
+ <string name="episodes_label">單集</string>
+ <string name="all_episodes_short_label">全部</string>
+ <string name="new_episodes_label">最新</string>
+ <string name="favorite_episodes_label">最愛</string>
+ <string name="new_label">新</string>
+ <string name="settings_label">設定</string>
+ <string name="downloads_label">下載</string>
+ <string name="downloads_running_label">進行中</string>
+ <string name="downloads_completed_label">已完成</string>
+ <string name="downloads_log_label">日誌</string>
+ <string name="subscriptions_label">訂閱</string>
+ <string name="subscriptions_list_label">訂閱列表</string>
+ <string name="cancel_download_label">取消下載</string>
+ <string name="playback_history_label">播放歷史</string>
+ <string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_auth_label">gpodder.net 登錄</string>
+ <string name="episode_cache_full_title">暫存集數已達上限</string>
+ <string name="episode_cache_full_message">暫存集數已達上限,您可以在設定中調整限制。</string>
+ <string name="playback_statistics_label">播放</string>
+ <string name="download_statistics_label">下載</string>
+ <!--Statistics fragment-->
+ <string name="total_time_listened_to_podcasts">Podcast 總播放時長:</string>
+ <string name="statistics_details_dialog">聽過 %1$d/%2$d集。\n\n播過%3$s/%4$s集。</string>
+ <string name="statistics_mode">統計模式</string>
+ <string name="statistics_mode_normal">計算真實的播放時長。如果播放同一劇集兩遍,則會記錄兩遍的市場。如果只是標記為已播放,則不會被計入播放時長。</string>
+ <string name="statistics_mode_count_all">累加所有標記為已播放的 Podcast</string>
+ <string name="statistics_speed_not_counted">注意:播放速度不被計入。</string>
+ <string name="statistics_reset_data">重設統計數據</string>
+ <string name="statistics_reset_data_msg">這會清除過去的播放紀錄,您確定要進行嗎?</string>
+ <!--Download Statistics fragment-->
+ <string name="total_size_downloaded_podcasts">Podcast 總下載容量:</string>
+ <!--Main activity-->
+ <string name="drawer_open">打開選單</string>
+ <string name="drawer_close">關閉選單</string>
+ <string name="drawer_preferences">側邊選單設定</string>
+ <string name="drawer_feed_order_unplayed_episodes">按計數器排序</string>
+ <string name="drawer_feed_order_alphabetical">按字母排序</string>
+ <string name="drawer_feed_order_last_update">按發布日期排序</string>
+ <string name="drawer_feed_order_most_played">按已播放的集數排序</string>
+ <string name="drawer_feed_counter_new_unplayed">新增及未播放集數</string>
+ <string name="drawer_feed_counter_new">新集數</string>
+ <string name="drawer_feed_counter_unplayed">未播放集數</string>
+ <string name="drawer_feed_counter_downloaded">已下載集數</string>
+ <string name="drawer_feed_counter_none">沒有</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">在瀏覽器中打開</string>
+ <string name="copy_url_label">複製鏈接</string>
+ <string name="share_url_label">分析鏈接</string>
+ <string name="copied_url_msg">複製鏈接到剪貼板</string>
+ <string name="go_to_position_label">跳至此處</string>
+ <!--Playback history-->
+ <string name="clear_history_label">清除歷史</string>
+ <!--Other-->
+ <string name="confirm_label">確定</string>
+ <string name="cancel_label">取消</string>
+ <string name="yes">是</string>
+ <string name="no">否</string>
+ <string name="reset">重置</string>
+ <string name="author_label">作者</string>
+ <string name="language_label">語言</string>
+ <string name="url_label">鏈接</string>
+ <string name="cover_label">圖片</string>
+ <string name="error_label">錯誤</string>
+ <string name="error_msg_prefix">發生錯誤:</string>
+ <string name="needs_storage_permission">此操作需要儲存空間權限</string>
+ <string name="refresh_label">刷新</string>
+ <string name="external_storage_error_msg">找不到外部儲存空間。請確保您已掛載外部儲存空間,這樣本軟體才能正常運行。</string>
+ <string name="chapters_label">章節</string>
+ <string name="chapter_duration">時長: %1$s</string>
+ <string name="description_label">描述</string>
+ <string name="episodes_suffix">\u0020單集</string>
+ <string name="processing_label">處理中</string>
+ <string name="save_username_password_label">保存帳號及密碼</string>
+ <string name="close_label">關閉</string>
+ <string name="retry_label">重試</string>
+ <string name="auto_download_label">加入自動下載</string>
+ <string name="auto_download_apply_to_items_title">套用至先前的單集</string>
+ <string name="auto_download_apply_to_items_message">往後各集將採用新的 <i>自動下載</i> 設定,\n您希望先前已經發佈的各集也使用同樣的設定嗎?</string>
+ <string name="auto_delete_label">自動刪除單集</string>
+ <string name="feed_volume_reduction">降低音量</string>
+ <string name="feed_volume_reduction_summary">將此單集的音量調降:%1$s</string>
+ <string name="feed_volume_reduction_off">關閉</string>
+ <string name="feed_volume_reduction_light">輕</string>
+ <string name="feed_volume_reduction_heavy">重</string>
+ <string name="parallel_downloads_suffix">\u0020同時下載</string>
+ <string name="feed_auto_download_global">預設值</string>
+ <string name="feed_auto_download_always">總是</string>
+ <string name="feed_auto_download_never">不予下載</string>
+ <string name="send_label">發送中…</string>
+ <string name="episode_cleanup_never">不予刪除</string>
+ <string name="episode_cleanup_queue_removal">若未列入待播清單</string>
+ <string name="episode_cleanup_after_listening">聽完後</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="other">聽完後 %d 小時</item>
+ </plurals>
+ <plurals name="episode_cleanup_days_after_listening">
+ <item quantity="other">聽完後 %d 天</item>
+ </plurals>
+ <plurals name="num_selected_label">
+ <item quantity="other">選取了 %d 集</item>
+ </plurals>
+ <string name="loading_more">載入更多…</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">全部標記為已播放</string>
+ <string name="mark_all_read_msg">全部標記為已播放</string>
+ <string name="mark_all_read_confirmation_msg">請確認您要將每一集都標記為已播放。</string>
+ <string name="mark_all_read_feed_confirmation_msg">請確定您是否要將此 Podcast 的每一集都標為已播放。</string>
+ <string name="remove_all_new_flags_label">移除所有「新的」標籤</string>
+ <string name="removed_all_new_flags_msg">移除所有「新的」標記</string>
+ <string name="remove_all_new_flags_confirmation_msg">請確定您是否要將每一集的「new」標記移除。</string>
+ <string name="show_info_label">顯示資料</string>
+ <string name="show_feed_settings_label">顯示 Podcast 設定</string>
+ <string name="feed_info_label">Podcast 資訊</string>
+ <string name="feed_settings_label">Podcast 設定</string>
+ <string name="rename_feed_label">重新命名 Podcast</string>
+ <string name="remove_feed_label">移除 Podcast</string>
+ <string name="share_label">分享</string>
+ <string name="share_link_label">分享這一集的網址</string>
+ <string name="share_link_with_position_label">分享這一集網址及當前播放進度</string>
+ <string name="share_file_label">分享文件</string>
+ <string name="share_website_url_label">分享網站網址</string>
+ <string name="share_feed_url_label">分享 Podcast 的網址</string>
+ <string name="share_item_url_label">分享該媒體網址</string>
+ <string name="share_item_url_with_position_label">分享此媒體網址及當前播放進度</string>
+ <string name="feed_delete_confirmation_msg">請確認您是否要刪除「%1$s」這個 Podcast 及當中下載的每一集。</string>
+ <string name="feed_remover_msg">移除 Podcast</string>
+ <string name="load_complete_feed">重新整理 Podcast</string>
+ <string name="multi_select">多重選取</string>
+ <string name="select_all_above">選取以上全部</string>
+ <string name="select_all_below">選取以下全部</string>
+ <string name="hide_unplayed_episodes_label">未播放</string>
+ <string name="hide_paused_episodes_label">暫停</string>
+ <string name="hide_played_episodes_label">已播放</string>
+ <string name="hide_queued_episodes_label">已列入待播清單</string>
+ <string name="hide_not_queued_episodes_label">未列入待播清單</string>
+ <string name="hide_downloaded_episodes_label">已下載</string>
+ <string name="hide_not_downloaded_episodes_label">未下載</string>
+ <string name="hide_has_media_label">包含媒體</string>
+ <string name="hide_is_favorite_label">為最愛</string>
+ <string name="filtered_label">已過濾</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} 上次刷新失敗</string>
+ <string name="open_podcast">打開 Podcast</string>
+ <string name="please_wait_for_data">資料載入中,請稍候</string>
+ <!--actions on feeditems-->
+ <string name="download_label">下載</string>
+ <plurals name="downloading_batch_label">
+ <item quantity="other">正在下載 %d 集</item>
+ </plurals>
+ <string name="play_label">播放</string>
+ <string name="pause_label">暫停</string>
+ <string name="stream_label">流</string>
+ <string name="delete_label">刪除</string>
+ <string name="delete_failed">刪除文件失敗。重啟設備試試看。</string>
+ <string name="delete_episode_label">刪除這一集</string>
+ <plurals name="deleted_episode_batch_label">
+ <item quantity="other">已刪除 %d 集。</item>
+ </plurals>
+ <string name="remove_new_flag_label">移除「新」的標記</string>
+ <string name="removed_new_flag_label">已移除「新」的標記</string>
+ <string name="mark_read_label">標記為已播放</string>
+ <string name="marked_as_read_label">已標記為已播放</string>
+ <string name="mark_read_no_media_label">標示為已讀</string>
+ <string name="marked_as_read_no_media_label">已標示為已讀</string>
+ <string name="play_this_to_seek_position">若想指定播放位置,請先播放該單集</string>
+ <plurals name="marked_read_batch_label">
+ <item quantity="other">共有 %d 集標示為已播放。</item>
+ </plurals>
+ <string name="mark_unread_label">標記為未播放</string>
+ <string name="mark_unread_label_no_media">標示為未讀</string>
+ <plurals name="marked_unread_batch_label">
+ <item quantity="other">共有 %d 集標示為未播放。</item>
+ </plurals>
+ <string name="add_to_queue_label">加入待播清單</string>
+ <string name="added_to_queue_label">已列入待播清單</string>
+ <plurals name="added_to_queue_batch_label">
+ <item quantity="other">已將 %d 集加入待播清單。</item>
+ </plurals>
+ <string name="remove_from_queue_label">從待播清單中移除</string>
+ <plurals name="removed_from_queue_batch_label">
+ <item quantity="other">已將 %d 集自待播清單中移除</item>
+ </plurals>
+ <string name="add_to_favorite_label">加入最愛</string>
+ <string name="added_to_favorites">已加入最愛</string>
+ <string name="remove_from_favorite_label">移出最愛</string>
+ <string name="removed_from_favorites">已從最愛移除</string>
+ <string name="visit_website_label">訪問網站</string>
+ <string name="skip_episode_label">跳過這一集</string>
+ <string name="activate_auto_download">啟用自動下載</string>
+ <string name="deactivate_auto_download">停用自動下載</string>
+ <string name="reset_position">重置播放進度</string>
+ <string name="removed_item">項目已移除</string>
+ <string name="no_items_selected">未選擇任何項目</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">成功</string>
+ <string name="download_pending">下載等待中</string>
+ <string name="download_running">下載中</string>
+ <string name="download_error_details">詳情</string>
+ <string name="download_error_details_message">%1$s \n\n檔案 URL:\n%2$s</string>
+ <string name="download_error_device_not_found">沒找到儲存空間</string>
+ <string name="download_error_insufficient_space">儲存空間不足</string>
+ <string name="download_error_http_data_error">HTTP數據錯誤</string>
+ <string name="download_error_error_unknown">位置錯誤</string>
+ <string name="download_error_parser_exception">解析器異常</string>
+ <string name="download_error_unsupported_type">不支援此來源類型</string>
+ <string name="download_error_connection_error">鏈接錯誤</string>
+ <string name="download_error_unknown_host">不明主機</string>
+ <string name="download_error_unauthorized">驗證失敗</string>
+ <string name="download_error_file_type_type">文件格式錯誤</string>
+ <string name="download_error_forbidden">禁止存取</string>
+ <string name="download_canceled_msg">下載已取消</string>
+ <string name="download_canceled_autodownload_enabled_msg">下載已取消\n此項目的 <i>自動下載</i> 已停用</string>
+ <string name="download_report_title">下載已完成,但可能有錯誤</string>
+ <string name="auto_download_report_title">自動下載完畢</string>
+ <string name="download_report_content_title">下載報告</string>
+ <string name="download_error_malformed_url">鏈接格式不正確</string>
+ <string name="download_error_io_error">IO 錯誤</string>
+ <string name="download_error_request_error">請求錯誤</string>
+ <string name="download_error_db_access">資料庫存取錯誤</string>
+ <plurals name="downloads_left">
+ <item quantity="other">剩餘%d 個下載</item>
+ </plurals>
+ <string name="downloads_processing">正在下載</string>
+ <string name="download_notification_title">Podcast 資料下載中</string>
+ <string name="download_report_content">%1$d 個成功下載, %2$d 個失敗</string>
+ <string name="download_log_title_unknown">標題不明</string>
+ <string name="download_type_feed">資料來源</string>
+ <string name="download_type_media">媒體檔案</string>
+ <string name="download_request_error_dialog_message_prefix">下載此檔案時出錯:\u0020</string>
+ <string name="null_value_podcast_error">無法顯示 Podcast</string>
+ <string name="authentication_notification_title">需要驗證</string>
+ <string name="authentication_notification_msg">這項資源需要帳號及密碼</string>
+ <string name="confirm_mobile_download_dialog_title">確定使用行動網路下載</string>
+ <string name="confirm_mobile_download_dialog_message_not_in_queue">您目前設定為不以行動網路下載。\n\n您可以僅將這一集加入待播清單,或暫時允許以行動網路下載。\n\n<small>暫時允許的效期為10分鐘</small></string>
+ <string name="confirm_mobile_download_dialog_message">您目前設定為不以行動網路下載單集。\n\n是否要暫時允許以行動網路下載呢?\n\n1<small>暫時允許的效期為 10 分鐘</small></string>
+ <string name="confirm_mobile_streaming_notification_title">確認以行動網路串流播放</string>
+ <string name="confirm_mobile_streaming_notification_message">目前您設定為不可使用行動網路串流播放,輕觸後可強制以串流播放。</string>
+ <string name="confirm_mobile_streaming_button_always">永遠允許</string>
+ <string name="confirm_mobile_download_dialog_only_add_to_queue">列入待播清單</string>
+ <string name="confirm_mobile_download_dialog_enable_temporarily">臨時允許</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">錯誤!</string>
+ <string name="player_stopped_msg">播放完畢</string>
+ <string name="player_preparing_msg">準備中</string>
+ <string name="player_ready_msg">準備</string>
+ <string name="player_seeking_msg">搜索中</string>
+ <string name="playback_error_server_died">服務器未響應</string>
+ <string name="playback_error_unsupported">不支援的媒體格式</string>
+ <string name="playback_error_timeout">操作逾時</string>
+ <string name="playback_error_source">無法取得該媒體檔案</string>
+ <string name="playback_error_unknown">不明錯誤</string>
+ <string name="no_media_playing_label">播放完畢</string>
+ <string name="player_buffering_msg">緩衝中</string>
+ <string name="player_go_to_picture_in_picture">子母畫面模式</string>
+ <string name="unknown_media_key">AntennaPod - 媒體按鍵無法辨識:%1$d</string>
+ <string name="error_file_not_found">找不到檔案</string>
+ <!--Queue operations-->
+ <string name="lock_queue">鎖定待播清單</string>
+ <string name="unlock_queue">解鎖待播清單</string>
+ <string name="queue_locked">待播清單已鎖定</string>
+ <string name="queue_unlocked">待播清單已解鎖</string>
+ <string name="queue_lock_warning">一旦鎖定待播清單,就無法調整各集次序或使用滑動選單</string>
+ <string name="checkbox_do_not_show_again">不再顯示</string>
+ <string name="clear_queue_label">清空待播清單</string>
+ <string name="undo">返回</string>
+ <string name="move_to_top_label">移動到頂部</string>
+ <string name="move_to_bottom_label">移動的底部</string>
+ <string name="sort">排序</string>
+ <string name="keep_sorted">維持排序</string>
+ <string name="date">日期</string>
+ <string name="duration">時長</string>
+ <string name="episode_title">單集標題</string>
+ <string name="feed_title">Podcast 標題</string>
+ <string name="random">隨機</string>
+ <string name="smart_shuffle">智慧隨機</string>
+ <string name="ascending">升序</string>
+ <string name="descending">降序</string>
+ <string name="clear_queue_confirmation_msg">請確認您要清除待播清單中的每一集</string>
+ <string name="time_left_label">時間尚餘:\u0020</string>
+ <!--Variable Speed-->
+ <string name="download_plugin_label">已下載的插件</string>
+ <string name="no_playback_plugin_title">插件未安裝</string>
+ <string name="no_playback_plugin_or_sonic_msg">為了方便您以不同速度聆聽節目,我們建議您啟用內建的 Sonic 播放器。</string>
+ <string name="set_playback_speed_label">播放速度</string>
+ <string name="enable_sonic">啟用Sonic</string>
+ <!--Empty list labels-->
+ <string name="no_items_header_label">待播清單裡沒有任何單集</string>
+ <string name="no_items_label">下載或長按後選擇「加入待播清單」即可將這一集放入待播清單。</string>
+ <string name="no_shownotes_label">本集沒有附註</string>
+ <string name="no_run_downloads_head_label">當前並未下載任何劇集</string>
+ <string name="no_run_downloads_label">您可以到 Podcast 詳情畫面下載各單集。</string>
+ <string name="no_comp_downloads_head_label">尚未下載任何一集</string>
+ <string name="no_comp_downloads_label">您可以到 Podcast 詳情畫面下載各單集。</string>
+ <string name="no_log_downloads_head_label">無下載紀錄</string>
+ <string name="no_log_downloads_label">有下載紀錄時,將顯示於此</string>
+ <string name="no_history_head_label">無歷史紀錄</string>
+ <string name="no_history_label">聽過的每一集都會顯示在此。</string>
+ <string name="no_all_episodes_head_label">什麼也沒有</string>
+ <string name="no_all_episodes_label">當您添增 Podcast 後,其中的各單集會顯示於此。</string>
+ <string name="no_new_episodes_head_label">沒有新一集</string>
+ <string name="no_new_episodes_label">一旦新集數上線,就會顯示在這裡。</string>
+ <string name="no_fav_episodes_head_label">沒有設定最愛</string>
+ <string name="no_fav_episodes_label">您可以在特定一集上長按,將其設定為最愛</string>
+ <string name="no_chapters_head_label">無章節</string>
+ <string name="no_chapters_label">本集沒有章節資訊。</string>
+ <string name="no_subscriptions_head_label">無訂閱</string>
+ <string name="no_subscriptions_label">請按下方加號以訂閱 Podcast</string>
+ <!--Preferences-->
+ <string name="storage_pref">儲存空間</string>
+ <string name="storage_sum">自動刪除、匯入、匯出</string>
+ <string name="project_pref">項目</string>
+ <string name="queue_label">待播清單</string>
+ <string name="synchronization_pref">同步</string>
+ <string name="synchronization_sum">利用 gpodder.net 與其他裝置同步</string>
+ <string name="automation">自動化</string>
+ <string name="download_pref_details">細節</string>
+ <string name="import_export_pref">匯入/匯出</string>
+ <string name="import_export_search_keywords">備份, 還原, backup, restore, export, import, 匯出, 匯入</string>
+ <string name="appearance">外觀</string>
+ <string name="external_elements">外部元素</string>
+ <string name="interruptions">中斷</string>
+ <string name="playback_control">播放控制</string>
+ <string name="preference_search_hint">搜尋…</string>
+ <string name="preference_search_no_results">無結果</string>
+ <string name="preference_search_clear_history">清除歷史紀錄</string>
+ <string name="media_player">媒體播放器</string>
+ <string name="pref_episode_cleanup_title">刪除單集時機</string>
+ <string name="pref_episode_cleanup_summary">在暫存集數已滿、自動下載功能需要更多空間的情形下,不在待播清單也未設定為最愛的各單集將被刪除。</string>
+ <string name="pref_pauseOnDisconnect_sum">耳機或藍牙斷開連接時暫停播放</string>
+ <string name="pref_unpauseOnHeadsetReconnect_sum">當耳機再次連接時繼續播放</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">當藍牙再次連接時繼續播放</string>
+ <string name="pref_hardwareForwardButtonSkips_title">快進按鈕跳過</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">當按下藍牙連接裝置上的快轉鈕時,不要快轉,而是播放下一集</string>
+ <string name="pref_hardwarePreviousButtonRestarts_title">後退鍵重新播放</string>
+ <string name="pref_hardwarePreviousButtonRestarts_sum">當按下實體的倒轉鈕時,不要倒轉,而是重新播放本集。</string>
+ <string name="pref_followQueue_sum">當播放完畢時自動跳至待播清單中的下一集</string>
+ <string name="pref_auto_delete_sum">播放完畢後刪除該集</string>
+ <string name="pref_auto_delete_title">自動刪除</string>
+ <string name="pref_smart_mark_as_played_sum">若離開時還剩下特定秒數以內,也將該集標記為已播放。</string>
+ <string name="pref_smart_mark_as_played_title">智慧標記為已播放過</string>
+ <string name="pref_skip_keeps_episodes_sum">當跳過時,保留該集</string>
+ <string name="pref_skip_keeps_episodes_title">保留跳過</string>
+ <string name="pref_favorite_keeps_episodes_sum">保留標記為最愛的各單集</string>
+ <string name="pref_favorite_keeps_episodes_title">保留最愛單集</string>
+ <string name="playback_pref">播放</string>
+ <string name="playback_pref_sum">耳機線控、快轉時間、待播清單</string>
+ <string name="network_pref">網路</string>
+ <string name="network_pref_sum">更新週期、下載控制、行動網路</string>
+ <string name="pref_autoUpdateIntervallOrTime_title">更新週期</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">設定 Podcast 節目清單的更新週期</string>
+ <string name="pref_autoUpdateIntervallOrTime_message">您可以設定「每 2 小時」這類的<i>週期</i>或指定「每天早上 7 點」這種<i>每日定時</i>,也可以<i>停用</i> 自動更新。\n\n<small>請注意:這裡的時間並非十分精準,可能會有些許延遲。</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_Disable">停用</string>
+ <string name="pref_autoUpdateIntervallOrTime_Interval">設定週期</string>
+ <string name="pref_autoUpdateIntervallOrTime_TimeOfDay">設定每日定時</string>
+ <string name="pref_autoUpdateIntervallOrTime_every">每 %1$s</string>
+ <string name="pref_autoUpdateIntervallOrTime_at">於 %1$s</string>
+ <string name="pref_followQueue_title">連續播放</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">拔除耳機時暫停播放</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">接上耳機時繼續播放</string>
+ <string name="pref_unpauseOnBluetoothReconnect_title">連上藍牙時繼續播放</string>
+ <string name="pref_stream_over_download_title">偏好串流</string>
+ <string name="pref_stream_over_download_sum">在清單中顯示串流播放按鈕取代下載鈕</string>
+ <string name="pref_mobileUpdate_title">允許以行動網路…</string>
+ <string name="pref_mobileUpdate_sum">選擇以行動網路連線時可以做的事</string>
+ <string name="pref_mobileUpdate_refresh">更新 Podcast</string>
+ <string name="pref_mobileUpdate_images">更新封面圖</string>
+ <string name="pref_mobileUpdate_auto_download">自動下載</string>
+ <string name="pref_mobileUpdate_episode_download">下載單集</string>
+ <string name="pref_mobileUpdate_streaming">串流播放</string>
+ <string name="user_interface_label">使用者介面</string>
+ <string name="user_interface_sum">外觀、訂閱排序、鎖定畫面</string>
+ <string name="pref_set_theme_title">選擇主題</string>
+ <string name="pref_nav_drawer_items_title">設定側邊選單</string>
+ <string name="pref_nav_drawer_items_sum">調整側邊選單裡要顯示的項目</string>
+ <string name="pref_nav_drawer_feed_order_title">設定訂閱排序方式</string>
+ <string name="pref_nav_drawer_feed_order_sum">更改您訂閱頻道的排序方式</string>
+ <string name="pref_nav_drawer_feed_counter_title">設定訂閱計數器</string>
+ <string name="pref_nav_drawer_feed_counter_sum">調整訂閱計數器中要顯示的東西,同時也會在排序方式設定為「計數」時影響排序。</string>
+ <string name="pref_set_theme_sum">更改 AntennaPod 的外觀</string>
+ <string name="pref_automatic_download_title">自動下載</string>
+ <string name="pref_automatic_download_sum">設定單集自動下載機制</string>
+ <string name="pref_autodl_wifi_filter_title">限定 Wi-Fi</string>
+ <string name="pref_autodl_wifi_filter_sum">限定於特定 Wi-Fi 連線時自動下載</string>
+ <string name="pref_automatic_download_on_battery_title">未充電時下載</string>
+ <string name="pref_automatic_download_on_battery_sum">允許未充電時也自動下載</string>
+ <string name="pref_parallel_downloads_title">平行下載</string>
+ <string name="pref_episode_cache_title">暫存集數</string>
+ <string name="pref_episode_cache_summary">在本機中可以暫存的集數,若達上限則將停止自動下載。</string>
+ <string name="pref_episode_cover_title">使用單集的封面圖</string>
+ <string name="pref_episode_cover_summary">在單集有專屬封面的情況下使用該封面圖。如果取消,則一律使用 Podcast 的封面圖。</string>
+ <string name="pref_theme_title_use_system">依據系統設定</string>
+ <string name="pref_theme_title_light">淡色</string>
+ <string name="pref_theme_title_dark">深色</string>
+ <string name="pref_theme_title_trueblack">黑色 (適用 AMOLED 螢幕)</string>
+ <string name="pref_episode_cache_unlimited">無限</string>
+ <string name="pref_update_interval_hours_plural">小時</string>
+ <string name="pref_update_interval_hours_singular">小時</string>
+ <string name="pref_update_interval_hours_manual">手動</string>
+ <string name="pref_gpodnet_authenticate_title">登入</string>
+ <string name="pref_gpodnet_authenticate_sum">登入您的 gpodder.net 帳戶以同步訂閱資訊</string>
+ <string name="pref_gpodnet_logout_title">登出</string>
+ <string name="pref_gpodnet_logout_toast">成功登出</string>
+ <string name="pref_gpodnet_setlogin_information_title">變更登入資訊</string>
+ <string name="pref_gpodnet_setlogin_information_sum">修改您的 gpodder.net 帳號登入資訊</string>
+ <string name="pref_gpodnet_sync_changes_title">馬上同步</string>
+ <string name="pref_gpodnet_sync_changes_sum">與 gpodder.net 同步訂閱及聆聽狀態。</string>
+ <string name="pref_gpodnet_full_sync_title">強制全部同步</string>
+ <string name="pref_gpodnet_full_sync_sum">與 gpodder.net 同步所有的訂閱及聆聽狀態。</string>
+ <string name="pref_gpodnet_login_status"><![CDATA[以 <i>%1$s</i> 登入,設備為 <i>%2$s</i>]]></string>
+ <string name="pref_gpodnet_notifications_title">顯示同步錯誤通知</string>
+ <string name="pref_gpodnet_notifications_sum">此設定不影響登入驗證錯誤。</string>
+ <string name="pref_playback_speed_title">播放速度</string>
+ <string name="pref_playback_speed_sum">自訂可選用的播放速度</string>
+ <string name="pref_feed_playback_speed_sum">播放此 Podcast 中各單集時的播放速度</string>
+ <string name="pref_feed_skip">自動跳過</string>
+ <string name="pref_feed_skip_sum">跳過開場和結尾鳴謝</string>
+ <string name="pref_feed_skip_ending">跳過最後幾秒</string>
+ <string name="pref_feed_skip_intro">跳過最初幾秒</string>
+ <string name="pref_feed_skip_ending_toast">跳過最後 %d 秒</string>
+ <string name="pref_feed_skip_intro_toast">跳過最初 %d 秒</string>
+ <string name="pref_playback_time_respects_speed_title">依據播放速度調整媒體資訊</string>
+ <string name="pref_playback_time_respects_speed_sum">根據播放速度調整播放進度、時長等資訊</string>
+ <string name="pref_fast_forward">快轉時間</string>
+ <string name="pref_fast_forward_sum">自訂快轉鈕要往前快轉多少時間</string>
+ <string name="pref_rewind">倒轉時間</string>
+ <string name="pref_rewind_sum">自訂倒轉鈕要往後倒轉多少時間</string>
+ <string name="pref_gpodnet_sethostname_title">設定主機</string>
+ <string name="pref_gpodnet_sethostname_use_default_host">使用預設主機</string>
+ <string name="pref_expandNotify_title">優先通知</string>
+ <string name="pref_expandNotify_sum">此功能通常會加大通知訊息以便顯示控制鈕</string>
+ <string name="pref_persistNotify_title">保留播放控制鈕</string>
+ <string name="pref_persistNotify_sum">暫停播放時,在通知列及鎖定畫面上保留播放控制鈕。</string>
+ <string name="pref_compact_notification_buttons_title">設定鎖定畫面按鈕</string>
+ <string name="pref_compact_notification_buttons_sum">設定鎖定畫面上的播放控制鈕。「暫停/播放」鈕一定會出現。</string>
+ <string name="pref_compact_notification_buttons_dialog_title">最多可選擇 %1$d 項</string>
+ <string name="pref_compact_notification_buttons_dialog_error">您最多只能選擇 %1$d 項。</string>
+ <string name="pref_lockscreen_background_title">設定鎖定畫面背景</string>
+ <string name="pref_lockscreen_background_sum">在鎖定畫面背景採用本單集的圖片,同時也會在第三方 App 裡顯示圖片。</string>
+ <string name="pref_showDownloadReport_title">顯示下載報告</string>
+ <string name="pref_showDownloadReport_sum">如果下載失敗,產生錯誤相關細節的報告。</string>
+ <string name="pref_showAutoDownloadReport_title">顯示自動下載報告</string>
+ <string name="pref_showAutoDownloadReport_sum">顯示自動下載通知。</string>
+ <string name="pref_expand_notify_unsupport_toast">Android 4.1 以前尚未支援延伸通知工具。</string>
+ <string name="pref_enqueue_location_title">待播清單新增位置</string>
+ <string name="pref_enqueue_location_sum">將這幾集加到:%1$s</string>
+ <string name="enqueue_location_back">放到清單最後</string>
+ <string name="enqueue_location_front">放到清單最前</string>
+ <string name="enqueue_location_after_current">當前這集以後</string>
+ <string name="pref_smart_mark_as_played_disabled">停用</string>
+ <string name="pref_image_cache_size_title">圖片快取容量</string>
+ <string name="pref_image_cache_size_sum">設定圖片的快取容量</string>
+ <string name="visit_user_forum">使用者論壇</string>
+ <string name="bug_report_title">回報錯誤</string>
+ <string name="open_bug_tracker">開啟錯誤追蹤</string>
+ <string name="export_logs">匯出紀錄</string>
+ <string name="copy_to_clipboard">複製到剪貼簿</string>
+ <string name="copied_to_clipboard">已複製到剪貼簿</string>
+ <string name="experimental_pref">實驗功能</string>
+ <string name="pref_media_player_message">設定用以播放檔案的媒體播放器</string>
+ <string name="pref_current_value">當前設定:%1$s</string>
+ <string name="pref_proxy_title">代理伺服器</string>
+ <string name="pref_proxy_sum">設定代理伺服器</string>
+ <string name="pref_faq">常見問題</string>
+ <string name="pref_no_browser_found">找不到任何瀏覽器</string>
+ <string name="pref_cast_title">支援 Chromecast</string>
+ <string name="pref_cast_message_play_flavor">啟用 Cast 設備(如 Chromecast、Audio Speakers、Google TV 等)遙控播放</string>
+ <string name="pref_cast_message_free_flavor">Chromecast 相關支援需要其他第三方的私權軟體,所以在此版 AntennaPod 中停用。</string>
+ <string name="pref_enqueue_downloaded_title">下載後加入待播清單</string>
+ <string name="pref_enqueue_downloaded_summary">下載單集以後自動加入待播清單</string>
+ <string name="media_player_builtin">Android 內建播放器</string>
+ <string name="media_player_switch_to_exoplayer">切換至 ExoPlayer</string>
+ <string name="media_player_switched_to_exoplayer">已切換至 ExoPlayer</string>
+ <string name="pref_skip_silence_title">跳過沒有聲音的部分</string>
+ <string name="pref_videoBehavior_title">離開影片時</string>
+ <string name="pref_videoBehavior_sum">離開影片播放時的行為</string>
+ <string name="stop_playback">停止播放</string>
+ <string name="continue_playback">繼續播放聲音</string>
+ <string name="behavior">操作行為</string>
+ <string name="pref_back_button_behavior_title">返回鍵行為</string>
+ <string name="pref_back_button_behavior_sum">調整按下返回鍵時的行為</string>
+ <string name="back_button_default">預設</string>
+ <string name="back_button_open_drawer">開啟側邊選單</string>
+ <string name="back_button_double_tap">按兩下後離開 App</string>
+ <string name="back_button_show_prompt">離開前需要確認</string>
+ <string name="close_prompt">確定關閉 AntennaPod?</string>
+ <string name="double_tap_toast">重按返回鍵以離開</string>
+ <string name="back_button_go_to_page">前往頁面…</string>
+ <string name="back_button_go_to_page_title">選擇頁面</string>
+ <string name="pref_delete_removes_from_queue_title">刪除時同步自待播清單中移除</string>
+ <string name="pref_delete_removes_from_queue_sum">刪除某單集後,也自動將其從待播清單中移除</string>
+ <!--About screen-->
+ <string name="about_pref">關於</string>
+ <string name="antennapod_version">AntennaPod 版本</string>
+ <string name="contributors">貢獻者</string>
+ <string name="contributors_summary">無論寫程式、翻譯或幫助其他使用者,每個人都能讓 AntennaPod 更加完美!</string>
+ <string name="developers">開發人員</string>
+ <string name="translators">譯者</string>
+ <string name="special_thanks">特別感謝</string>
+ <string name="privacy_policy">隱私條款</string>
+ <string name="licenses">授權條款</string>
+ <string name="licenses_summary">AntennaPod 中也用了其他很棒的軟體</string>
+ <!--Search-->
+ <string name="search_status_no_results">搜尋無結果</string>
+ <string name="search_label">搜尋</string>
+ <string name="no_results_for_query">找不到「%1$s」</string>
+ <!--Synchronization-->
+ <string name="sync_status_started">已開始同步</string>
+ <string name="sync_status_episodes_upload">上傳本集變更中…</string>
+ <string name="sync_status_episodes_download">下載本集變更中…</string>
+ <string name="sync_status_upload_played">上傳播放狀態…</string>
+ <string name="sync_status_subscriptions">同步訂閱中</string>
+ <string name="sync_status_success">同步成功</string>
+ <string name="sync_status_error">同步失敗</string>
+ <!--import and export-->
+ <string name="import_export_summary">將訂閱及待播清單移到另一台設備</string>
+ <string name="database">資料庫</string>
+ <string name="opml">OPML</string>
+ <string name="html">HTML</string>
+ <string name="html_export_summary">顯示您的訂閱給朋友</string>
+ <string name="opml_export_summary">將您的訂閱清單移到另一個 Podcast 軟體</string>
+ <string name="opml_import_summary">從其他 Podcast 軟體匯入訂閱清單</string>
+ <string name="database_export_summary">將訂閱、聆聽紀錄、待播清單等資訊傳送到其他設備上的 AntennaPod</string>
+ <string name="database_import_summary">自其他設備匯入 AntennaPod 資料庫</string>
+ <string name="opml_import_label">OPML 匯入</string>
+ <string name="opml_reader_error">讀取 OPML 時發生錯誤:</string>
+ <string name="opml_import_error_no_file">未選擇任何檔案!</string>
+ <string name="select_all_label">全選</string>
+ <string name="deselect_all_label">取消選取</string>
+ <string name="opml_export_label">匯出 OPML</string>
+ <string name="html_export_label">匯出 HTML</string>
+ <string name="database_export_label">資料庫匯出</string>
+ <string name="database_import_label">資料庫匯入</string>
+ <string name="database_import_warning">匯入的資料將取代您目前的訂閱清單與播放歷史紀錄,您最好先匯出當前的資料庫以便備份。要取代目前的資料嗎?</string>
+ <string name="please_wait">請稍候…</string>
+ <string name="export_error_label">匯出錯誤</string>
+ <string name="export_success_title">匯出成功</string>
+ <string name="export_success_sum">檔案已匯出至:\n\n%1$s</string>
+ <string name="opml_import_ask_read_permission">讀取 OPML 檔需要存取外部儲存空間的權限</string>
+ <string name="import_select_file">選取要匯入的檔案</string>
+ <string name="import_ok">匯入成功。\n\n請按下 OK 重新啟動 AntennaPod</string>
+ <string name="import_no_downgrade">此資料庫是以新版 AntennaPod 匯出的,您目前使用的版本無法使用這份資料。</string>
+ <string name="favorites_export_label">匯出我的最愛</string>
+ <string name="favorites_export_summary">將儲存的我的最愛清單匯出為檔案</string>
+ <!--Sleep timer-->
+ <string name="set_sleeptimer_label">設定睡眠定時</string>
+ <string name="disable_sleeptimer_label">停用睡眠定時</string>
+ <string name="sleep_timer_label">睡眠定時</string>
+ <string name="time_dialog_invalid_input">輸入無效,請輸入數值</string>
+ <string name="shake_to_reset_label">晃動手機以重置計時</string>
+ <string name="timer_vibration_label">在時間到之前短暫震動手機</string>
+ <string name="time_seconds">秒</string>
+ <string name="time_minutes">分鐘</string>
+ <string name="time_hours">小時</string>
+ <plurals name="time_seconds_quantified">
+ <item quantity="other">%d 秒</item>
+ </plurals>
+ <plurals name="time_minutes_quantified">
+ <item quantity="other">%d 分鐘</item>
+ </plurals>
+ <plurals name="time_hours_quantified">
+ <item quantity="other">%d 小時</item>
+ </plurals>
+ <string name="auto_enable_label">自動啟用</string>
+ <string name="sleep_timer_enabled_label">已設定睡眠定時</string>
+ <!--gpodder.net-->
+ <string name="gpodnet_taglist_header">分類</string>
+ <string name="gpodnet_toplist_header">最夯 Podcast</string>
+ <string name="gpodnet_suggestions_header">建議</string>
+ <string name="gpodnet_search_hint">搜尋 gpodder.net</string>
+ <string name="gpodnetauth_login_title">登入</string>
+ <string name="gpodnetauth_login_descr">歡迎登入 gpodder.net,請先輸入您的登入資訊:</string>
+ <string name="gpodnetauth_login_butLabel">登入</string>
+ <string name="gpodnetauth_login_register">如果您還沒有帳號,可以先註冊一個:\nhttps://gpodder.net/register/</string>
+ <string name="username_label">帳號</string>
+ <string name="password_label">密碼</string>
+ <string name="gpodnetauth_device_title">裝置選擇</string>
+ <string name="gpodnetauth_device_descr">為您的 gpodder.net 帳號建立新設備或選取既有設備:</string>
+ <string name="gpodnetauth_device_deviceID">設備代號:\u0020</string>
+ <string name="gpodnetauth_device_caption">標題</string>
+ <string name="gpodnetauth_device_butCreateNewDevice">新增新裝置</string>
+ <string name="gpodnetauth_device_chooseExistingDevice">選擇現存裝置:</string>
+ <string name="gpodnetauth_device_errorEmpty">設備代號不能留白</string>
+ <string name="gpodnetauth_device_errorAlreadyUsed">已經使用此設備代號</string>
+ <string name="gpodnetauth_device_caption_errorEmpty">標題不能留白</string>
+ <string name="gpodnetauth_device_butChoose">選擇</string>
+ <string name="gpodnetauth_finish_title">登入成功!</string>
+ <string name="gpodnetauth_finish_descr">恭喜,您的 gpodder.net 帳號已經成功連結到當前的設備!AntennaPod 今後將自動與 gpodder.net 同步此設備的訂閱清單。</string>
+ <string name="gpodnetauth_finish_butsyncnow">現在開始同步</string>
+ <string name="gpodnetauth_finish_butgomainscreen">進入主螢幕</string>
+ <string name="gpodnetsync_auth_error_title">gpodder.net 驗證錯誤</string>
+ <string name="gpodnetsync_auth_error_descr">帳號或密碼錯誤</string>
+ <string name="gpodnetsync_error_title">gpodder.net 同步錯誤</string>
+ <string name="gpodnetsync_error_descr">更新時發生錯誤:\u0020</string>
+ <string name="gpodnetsync_pref_report_successful">成功</string>
+ <string name="gpodnetsync_pref_report_failed">失敗</string>
+ <string name="gpodnetsync_username_characters_error">帳號中只能包含英文字母、數字、橫線及底線</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">選擇資料夾:</string>
+ <string name="create_folder_label">新增資料夾</string>
+ <string name="choose_data_directory">選擇儲存資料夾</string>
+ <string name="choose_data_directory_message">請選擇您儲存檔案用的資料夾,AntennaPod 會自動建立相應的子資料夾。</string>
+ <string name="choose_data_directory_permission_rationale">更動資料夾需要存取外部儲存空間的權限</string>
+ <string name="choose_data_directory_available_space">可用空間 %1$s/%2$s</string>
+ <string name="create_folder_msg">建立一個「%1$s」資料夾?</string>
+ <string name="create_folder_success">新資料夾已建立完畢</string>
+ <string name="create_folder_error_no_write_access">無法寫入此資料夾</string>
+ <string name="create_folder_error_already_exists">資料夾已經存在</string>
+ <string name="create_folder_error">無法新增資料夾</string>
+ <string name="folder_does_not_exist_error">找不到「%1$s」</string>
+ <string name="folder_not_readable_error">無法讀取「%1$s」</string>
+ <string name="folder_not_writable_error">無法寫入「%1$s」</string>
+ <string name="folder_not_empty_dialog_title">資料夾並非空白</string>
+ <string name="folder_not_empty_dialog_msg">您所選的資料夾裡已經存在其他檔案,AntennaPod 下載的媒體及其他檔案將直接放進此資料夾裡,確定要繼續嗎?</string>
+ <string name="set_to_default_folder">選擇預設資料夾</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">有其他 App 也要播放聲音時,停止播放 Podcast(而非降低音量)</string>
+ <string name="pref_pausePlaybackForFocusLoss_title">其他音訊介入時暫停播放</string>
+ <string name="pref_resumeAfterCall_sum">通話結束後,繼續播放 Podcast</string>
+ <string name="pref_resumeAfterCall_title">通話後繼續播放</string>
+ <string name="pref_restart_required">此更動需要重新啟動 AntennaPod。</string>
+ <!--Online feed view-->
+ <string name="subscribe_label">訂閱</string>
+ <string name="subscribing_label">訂閱中</string>
+ <string name="preview_episode">預覽</string>
+ <string name="stop_preview">停止預覽</string>
+ <!--Content descriptions for image buttons-->
+ <string name="rewind_label">倒轉</string>
+ <string name="fast_forward_label">快轉</string>
+ <string name="increase_speed">加速</string>
+ <string name="decrease_speed">放慢</string>
+ <string name="media_type_audio_label">聲音</string>
+ <string name="media_type_video_label">影片</string>
+ <string name="status_downloading_label">正在下載這集</string>
+ <string name="in_queue_label">單集已在待播清單中</string>
+ <string name="is_favorite_label">已將此單集標為最愛</string>
+ <string name="drag_handle_content_description">拖曳以更動此項目的位置</string>
+ <string name="load_next_page_label">載入下一頁</string>
+ <string name="switch_pages">切換不同頁面</string>
+ <string name="position">播放進度:%1$s</string>
+ <string name="apply_action">套用</string>
+ <!--Feed information screen-->
+ <string name="authentication_label">驗證</string>
+ <string name="authentication_descr">修改此 Podcast 的帳號與密碼。</string>
+ <string name="auto_download_settings_label">自動下載設定</string>
+ <string name="episode_filters_label">篩選</string>
+ <string name="episode_filters_description">自動下載時要列入或排除的條件清單</string>
+ <string name="episode_filters_include">包含</string>
+ <string name="episode_filters_exclude">排除</string>
+ <string name="episode_filters_hint">Single words \n\"Multiple Words\"</string>
+ <string name="keep_updated">維持更新</string>
+ <string name="keep_updated_summary">自動更新所有 Podcast 時,也包括此 Podcast</string>
+ <string name="auto_download_disabled_globally">AntennaPod 的主設定中已停用自動下載功能</string>
+ <!--Progress information-->
+ <string name="progress_upgrading_database">更新資料庫</string>
+ <!--AntennaPodSP-->
+ <string name="sp_apps_importing_feeds_msg">從 AntennaPodSP 匯入訂閱清單</string>
+ <!--Add podcast fragment-->
+ <string name="search_podcast_hint">搜尋 Podcast…</string>
+ <string name="search_itunes_label">搜尋 iTunes</string>
+ <string name="search_fyyd_label">搜尋 fyyd</string>
+ <string name="advanced">進階</string>
+ <string name="add_podcast_by_url">以 URL 新增 Podcast</string>
+ <string name="browse_gpoddernet_label">瀏覽gpodder.net</string>
+ <string name="discover">探索</string>
+ <string name="discover_more">更多 »</string>
+ <string name="search_powered_by">搜尋內容來自 %1$s</string>
+ <string name="filter">篩選</string>
+ <!--Episodes apply actions-->
+ <string name="all_label">全部</string>
+ <string name="selected_all_label">全選</string>
+ <string name="none_label">無</string>
+ <string name="deselected_all_label">不選</string>
+ <string name="played_label">播過的</string>
+ <string name="selected_played_label">選擇播放過的單集</string>
+ <string name="unplayed_label">未播過的</string>
+ <string name="selected_unplayed_label">選擇沒播過的單集</string>
+ <string name="downloaded_label">已下載的</string>
+ <string name="selected_downloaded_label">選擇下載過的單集</string>
+ <string name="not_downloaded_label">未下載的</string>
+ <string name="selected_not_downloaded_label">選擇沒下載過的單集</string>
+ <string name="queued_label">已列入待播清單</string>
+ <string name="selected_queued_label">選擇待播清單中的單集</string>
+ <string name="not_queued_label">未列入待播清單</string>
+ <string name="selected_not_queued_label">選擇不在待播清單中的單集</string>
+ <string name="has_media">有額外媒體檔</string>
+ <string name="selected_has_media_label">選擇包含額外媒體的單集</string>
+ <!--Sort-->
+ <string name="sort_title_a_z">標題 (A \u2192 Z)</string>
+ <string name="sort_title_z_a">標題 (Z \u2192 A)</string>
+ <string name="sort_date_new_old">日期 (新 \u2192 舊)</string>
+ <string name="sort_date_old_new">日期 (舊 \u2192 新)</string>
+ <string name="sort_duration_short_long">單集時間 (短 \u2192 長)</string>
+ <string name="sort_duration_long_short">單集時間 (長 \u2192 短)</string>
+ <string name="sort_a_z">A \u2192 Z</string>
+ <string name="sort_z_a">Z \u2192 A</string>
+ <string name="sort_new_old">新 \u2192 舊</string>
+ <string name="sort_old_new">舊 \u2192 新</string>
+ <string name="sort_short_long">短 \u2192 長</string>
+ <string name="sort_long_short">長 \u2192 短</string>
+ <!--Rating dialog-->
+ <string name="rating_title">喜歡 AntennaPod 嗎?</string>
+ <string name="rating_message">如果您能花點時間為 AntennaPod 評個分,就太感謝啦!</string>
+ <string name="rating_never_label">別吵我</string>
+ <string name="rating_later_label">以後再說</string>
+ <string name="rating_now_label">好啊,這就去!</string>
+ <!--Audio controls-->
+ <string name="audio_controls">聲音控制</string>
+ <string name="playback_speed">播放速度</string>
+ <string name="volume">音量</string>
+ <string name="left_short">左</string>
+ <string name="right_short">右</string>
+ <string name="audio_effects">音效調整</string>
+ <string name="stereo_to_mono">將雙聲道降混為單聲道</string>
+ <string name="sonic_only">僅用 Sonic</string>
+ <string name="exoplayer_only">僅用 ExoPlayer</string>
+ <!--proxy settings-->
+ <string name="proxy_type_label">類型</string>
+ <string name="host_label">主機</string>
+ <string name="port_label">埠號</string>
+ <string name="optional_hint">(選填)</string>
+ <string name="proxy_test_label">測試</string>
+ <string name="proxy_checking">檢查中…</string>
+ <string name="proxy_test_successful">測試成功</string>
+ <string name="proxy_test_failed">測試失敗</string>
+ <string name="proxy_host_empty_error">主機不可留白</string>
+ <string name="proxy_host_invalid_error">主機並非有效的 IP 或網域名稱</string>
+ <string name="proxy_port_invalid_error">埠號無效</string>
+ <!--Subscriptions fragment-->
+ <string name="subscription_num_columns">顯示欄數</string>
+ <!--Casting-->
+ <string name="cast_media_route_menu_title">播放到…</string>
+ <string name="cast_disconnect_label">中止 Cast 連線</string>
+ <string name="cast_not_castable">此 Cast 設備不支援所選的媒體</string>
+ <string name="cast_failed_to_play">媒體播放失敗</string>
+ <string name="cast_failed_to_stop">媒體停止播放失敗</string>
+ <string name="cast_failed_to_pause">媒體暫停播放失敗</string>
+ <string name="cast_failed_setting_volume">音量設定失敗</string>
+ <string name="cast_failed_no_connection">沒有連結到任何 Cast 設備</string>
+ <string name="cast_failed_no_connection_trans">與 Cast 設備的連線中斷了,App 將試著重新連線。請稍候幾秒後再試一次。</string>
+ <string name="cast_failed_status_request">與 Cast 設備同步時發生錯誤</string>
+ <string name="cast_failed_seek">Cast 設備的播放進度調整失敗</string>
+ <string name="cast_failed_receiver_player_error">Cast 播放器發生錯誤</string>
+ <string name="cast_failed_media_error_skipping">播放錯誤,跳過此項…</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">需要介入</string>
+ <string name="notification_channel_user_action_description">需要您有進一步行動(比方說輸入密碼)時顯示。</string>
+ <string name="notification_channel_downloading">下載資訊</string>
+ <string name="notification_channel_downloading_description">下載時顯示</string>
+ <string name="notification_channel_playing">現正播放</string>
+ <string name="notification_channel_playing_description">允許播放控制。這是您在播放 Podcast 時會看到的主要通知。</string>
+ <string name="notification_channel_error">錯誤通知</string>
+ <string name="notification_channel_error_description">如果有任何錯誤(比方說下載或 gpodder 同步出錯)時顯示</string>
+ <string name="notification_channel_auto_download">自動下載</string>
+ <string name="notification_channel_episode_auto_download">自動下載後顯示</string>
+ <!--Widget settings-->
+ <string name="widget_settings">小工具設定</string>
+ <string name="widget_create_button">建立小工具</string>
+ <string name="widget_opacity">透明度</string>
+ <!--On-Demand configuration-->
+ <string name="on_demand_config_setting_changed">設定更新成功</string>
+ <string name="on_demand_config_stream_text">看來您常常用串流方式聆聽,您希望在單集清單中顯示串流按鈕嗎?</string>
+ <string name="on_demand_config_download_text">看來您常常用下載方式聆聽,您希望在單集清單中顯示下載按鈕嗎?</string>
+</resources>
diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml
index ba6c2f196..13ff092b0 100644
--- a/core/src/main/res/values/arrays.xml
+++ b/core/src/main/res/values/arrays.xml
@@ -233,16 +233,6 @@
<item>3</item>
</string-array>
- <string-array name="nav_drawer_feed_filter_values">
- <item>0</item>
- <item>1</item>
- </string-array>
-
- <string-array name="nav_drawer_feed_filter_options">
- <item>@string/no_filter_label</item>
- <item>@string/hide_subscriptions_where_counter_is_zero</item>
- </string-array>
-
<string-array name="media_player_options">
<item>@string/media_player_builtin</item>
<item>@string/media_player_sonic</item>
diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml
index 4a18f6ae6..a78f837bf 100644
--- a/core/src/main/res/values/attrs.xml
+++ b/core/src/main/res/values/attrs.xml
@@ -60,6 +60,7 @@
<attr name="background_elevated" format="color"/>
<attr name="filter_dialog_clear" format="reference"/>
<attr name="filter_dialog_button_background" format="reference"/>
+ <attr name="ic_notifications" format="reference"/>
<declare-styleable name="SquareImageView">
<attr name="direction" format="enum">
diff --git a/core/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml
index ed0b239a5..d09f53d64 100644
--- a/core/src/main/res/values/colors.xml
+++ b/core/src/main/res/values/colors.xml
@@ -24,7 +24,8 @@
<color name="accent_light">#0078C2</color>
<color name="accent_dark">#3D8BFF</color>
- <color name="ic_launcher_background">#008AB8</color>
+ <color name="icon_background_gradient_start">#0ba2ff</color>
+ <color name="icon_background_gradient_end">#0878ff</color>
<color name="master_switch_background_light">#DDDDDD</color>
<color name="master_switch_background_dark">#191919</color>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index f2f8b5bec..8cb369961 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -30,6 +30,7 @@
<string name="episode_cache_full_message">The episode cache limit has been reached. You can increase the cache size in the Settings.</string>
<string name="playback_statistics_label">Playback</string>
<string name="download_statistics_label">Downloads</string>
+ <string name="notification_pref_fragment">Notifications</string>
<!-- Statistics fragment -->
<string name="total_time_listened_to_podcasts">Total time of podcasts played:</string>
@@ -42,7 +43,7 @@
<string name="statistics_reset_data_msg">This will erase the history of duration played for all episodes. Are you sure you want to proceed?</string>
<!-- Download Statistics fragment -->
- <string name="total_size_downloaded_podcasts">Total size of downloaded podcasts:</string>
+ <string name="total_size_downloaded_podcasts">Total size of episodes on the device:</string>
<!-- Main activity -->
<string name="drawer_open">Open menu</string>
@@ -58,6 +59,9 @@
<string name="drawer_feed_counter_downloaded">Number of downloaded episodes</string>
<string name="drawer_feed_counter_none">None</string>
+ <!-- Bug report activity -->
+ <string name="log_file_share_exception">No compatible apps found</string>
+
<!-- Webview actions -->
<string name="open_in_browser_label">Open in Browser</string>
<string name="copy_url_label">Copy URL</string>
@@ -249,7 +253,10 @@
</plurals>
<string name="downloads_processing">Processing downloads</string>
<string name="download_notification_title">Downloading podcast data</string>
- <string name="download_report_content">%1$d downloads succeeded, %2$d failed</string>
+ <plurals name="download_report_content">
+ <item quantity="one">%d download succeeded, %d failed</item>
+ <item quantity="other">%d downloads succeeded, %d failed</item>
+ </plurals>
<string name="download_log_title_unknown">Unknown Title</string>
<string name="download_type_feed">Feed</string>
<string name="download_type_media">Media file</string>
@@ -441,7 +448,7 @@
<string name="pref_gpodnet_full_sync_title">Force full synchronization</string>
<string name="pref_gpodnet_full_sync_sum">Sync all subscriptions and episode states with gpodder.net.</string>
<string name="pref_gpodnet_login_status"><![CDATA[Logged in as <i>%1$s</i> with device <i>%2$s</i>]]></string>
- <string name="pref_gpodnet_notifications_title">Show sync error notifications</string>
+ <string name="pref_gpodnet_notifications_title">Synchronization failed</string>
<string name="pref_gpodnet_notifications_sum">This setting does not apply to authentication errors.</string>
<string name="pref_playback_speed_sum">Customize the speeds available for variable speed playback</string>
<string name="pref_feed_playback_speed_sum">The speed to use when starting audio playback for episodes in this podcast</string>
@@ -463,15 +470,15 @@
<string name="pref_expandNotify_sum">This usually expands the notification to show playback buttons.</string>
<string name="pref_persistNotify_title">Persistent Playback Controls</string>
<string name="pref_persistNotify_sum">Keep notification and lockscreen controls when playback is paused.</string>
- <string name="pref_compact_notification_buttons_title">Set Lockscreen Buttons</string>
- <string name="pref_compact_notification_buttons_sum">Change the playback buttons on the lockscreen. The play/pause button is always included.</string>
+ <string name="pref_compact_notification_buttons_title">Set Compact Notification Buttons</string>
+ <string name="pref_compact_notification_buttons_sum">Change the playback buttons when the notification is collapsed. The play/pause button is always included.</string>
<string name="pref_compact_notification_buttons_dialog_title">Select a maximum of %1$d items</string>
<string name="pref_compact_notification_buttons_dialog_error">You can only select a maximum of %1$d items.</string>
<string name="pref_lockscreen_background_title">Set Lockscreen Background</string>
<string name="pref_lockscreen_background_sum">Set the lockscreen background to the current episode\'s image. As a side effect, this will also show the image in third party apps.</string>
- <string name="pref_showDownloadReport_title">Show Download Report</string>
+ <string name="pref_showDownloadReport_title">Download failed</string>
<string name="pref_showDownloadReport_sum">If downloads fail, generate a report that shows the details of the failure.</string>
- <string name="pref_showAutoDownloadReport_title">Show Auto Download Report</string>
+ <string name="pref_showAutoDownloadReport_title">Automatic download completed</string>
<string name="pref_showAutoDownloadReport_sum">Show a notification for automatically downloaded episodes.</string>
<string name="pref_expand_notify_unsupport_toast">Android versions before 4.1 do not support expanded notifications.</string>
<string name="pref_enqueue_location_title">Enqueue Location</string>
@@ -525,17 +532,22 @@
<string name="pref_delete_removes_from_queue_sum">Automatically remove an episode from the queue when it is deleted.</string>
<string name="pref_filter_feed_title">Subscription Filter</string>
<string name="pref_filter_feed_sum">Filter your subscriptions in navigation drawer and subscriptions screen.</string>
- <string name="hide_subscriptions_where_counter_is_zero">Hide if counter is zero</string>
<string name="no_filter_label">None</string>
<string name="subscriptions_are_filtered">Subscriptions are filtered.</string>
+ <string name="subscriptions_counter_greater_zero">Counter greater zero</string>
+ <string name="auto_downloaded">Auto downloaded</string>
+ <string name="not_auto_downloaded">Not auto downloaded</string>
+ <string name="kept_updated">Kept updated</string>
+ <string name="not_kept_updated">Not kept updated</string>
<!-- About screen -->
<string name="about_pref">About</string>
<string name="antennapod_version">AntennaPod version</string>
+ <string name="contributors">Contributors</string>
+ <string name="contributors_summary">Everyone can help to make AntennaPod better - with code, translations or by helping users in our forum</string>
<string name="developers">Developers</string>
- <string name="developers_summary">Everyone can help to make AntennaPod better</string>
<string name="translators">Translators</string>
- <string name="translators_summary">Translations are created by users of AntennaPod using Transifex</string>
+ <string name="special_thanks">Special thanks</string>
<string name="privacy_policy">Privacy policy</string>
<string name="licenses">Licenses</string>
<string name="licenses_summary">AntennaPod uses other great software</string>
@@ -565,6 +577,7 @@
<string name="database_export_summary">Transfer subscriptions, listened episodes and queue to AntennaPod on another device</string>
<string name="database_import_summary">Import AntennaPod database from another device</string>
<string name="opml_import_label">OPML Import</string>
+ <string name="opml_add_podcast_label">Import podcast list (OPML)</string>
<string name="opml_reader_error">An error has occurred while reading the OPML document:</string>
<string name="opml_import_error_no_file">No file selected!</string>
<string name="select_all_label">Select all</string>
@@ -580,7 +593,8 @@
<string name="export_success_sum">The exported file was written to:\n\n%1$s</string>
<string name="opml_import_ask_read_permission">Access to external storage is required to read the OPML file</string>
<string name="import_select_file">Select file to import</string>
- <string name="import_ok">Import successful.\n\nPlease press OK to restart AntennaPod</string>
+ <string name="successful_import_label">Import successful</string>
+ <string name="import_ok">Please press OK to restart AntennaPod</string>
<string name="import_no_downgrade">This database was exported with a newer version of AntennaPod. Your current installation does not yet know how to handle this file.</string>
<string name="favorites_export_label">Favorites export</string>
<string name="favorites_export_summary">Export saved favorites to file</string>
@@ -682,7 +696,6 @@
<string name="decrease_speed">Decrease speed</string>
<string name="media_type_audio_label">Audio</string>
<string name="media_type_video_label">Video</string>
- <string name="navigate_upwards_label">Navigate upwards</string>
<string name="status_downloading_label">Episode is being downloaded</string>
<string name="in_queue_label">Episode is in the queue</string>
<string name="is_favorite_label">Episode is marked as favorite</string>
@@ -714,12 +727,15 @@
<!-- Add podcast fragment -->
<string name="search_podcast_hint">Search podcast…</string>
<string name="search_itunes_label">Search iTunes</string>
+ <string name="search_podcastindex_label">Search Podcastindex.org</string>
<string name="search_fyyd_label">Search fyyd</string>
<string name="advanced">Advanced</string>
<string name="add_podcast_by_url">Add Podcast by RSS address</string>
<string name="add_podcast_by_url_hint" translatable="false">www.example.com/feed</string>
<string name="browse_gpoddernet_label">Browse gpodder.net</string>
<string name="discover">Discover</string>
+ <string name="discover_hide">Hide</string>
+ <string name="discover_is_hidden">You selected to hide suggestions.</string>
<string name="discover_more">more »</string>
<string name="discover_powered_by_itunes">Suggestions by iTunes</string>
<string name="search_powered_by">Results by %1$s</string>
@@ -728,7 +744,7 @@
<string name="local_feed_description">This virtual podcast was created by adding a folder to AntennaPod.</string>
<string name="filter">Filter</string>
-
+
<!-- Episodes apply actions -->
<string name="all_label">All</string>
<string name="selected_all_label">Selected all Episodes</string>
@@ -837,7 +853,9 @@
<string name="notification_channel_playing">Currently playing</string>
<string name="notification_channel_playing_description">Allows to control playback. This is the main notification you see while playing a podcast.</string>
<string name="notification_channel_error">Errors</string>
- <string name="notification_channel_error_description">Shown if something went wrong, for example if download or gpodder sync fails.</string>
+ <string name="notification_channel_error_description">Shown if something went wrong, for example if download or feed update fails.</string>
+ <string name="notification_channel_sync_error">Synchronization Errors</string>
+ <string name="notification_channel_sync_error_description">Shown when gpodder synchronization fails.</string>
<string name="notification_channel_auto_download">Auto Downloads</string>
<string name="notification_channel_episode_auto_download">Shown when episodes have been automatically downloaded.</string>
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index 972174da5..9ec82215a 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -74,7 +74,8 @@
<item name="ic_volume_adaption">@drawable/ic_volume_adaption_black</item>
<item name="scrollbar_thumb">@drawable/scrollbar_thumb_light</item>
<item name="filter_dialog_clear">@color/filter_dialog_clear_light</item>
- <item name="filter_dialog_button_background">@color/filter_dialog_background_light</item>
+ <item name="filter_dialog_button_background">@drawable/filter_dialog_background_light</item>
+ <item name="ic_notifications">@drawable/ic_notifications_black</item>
</style>
<style name="Theme.AntennaPod.Dark" parent="Theme.Base.AntennaPod.Dark">
@@ -151,7 +152,8 @@
<item name="ic_volume_adaption">@drawable/ic_volume_adaption_white</item>
<item name="scrollbar_thumb">@drawable/scrollbar_thumb_dark</item>
<item name="filter_dialog_clear">@color/filter_dialog_clear_dark</item>
- <item name="filter_dialog_button_background">@color/filter_dialog_background_dark</item>
+ <item name="filter_dialog_button_background">@drawable/filter_dialog_background_dark</item>
+ <item name="ic_notifications">@drawable/ic_notifications_white</item>
</style>
<style name="Theme.AntennaPod.TrueBlack" parent="Theme.Base.AntennaPod.TrueBlack">
@@ -228,8 +230,8 @@
<style name="Theme.AntennaPod.Splash" parent="Theme.MaterialComponents.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
- <item name="colorPrimary">@color/ic_launcher_background</item>
- <item name="colorPrimaryDark">@color/ic_launcher_background</item>
+ <item name="colorPrimary">@color/icon_background_gradient_start</item>
+ <item name="colorPrimaryDark">@color/icon_background_gradient_start</item>
</style>
<style name="Theme.AntennaPod.VideoPlayer" parent="@style/Theme.AntennaPod.Dark">
@@ -306,4 +308,14 @@
<style name="Widget.AntennaPod.ActionBar.Black" parent="Widget.MaterialComponents.Light.ActionBar.Solid">
<item name="background">@color/black</item>
</style>
+
+ <style name="AddPodcastTextView">
+ <item name="android:drawablePadding">8dp</item>
+ <item name="android:paddingTop">8dp</item>
+ <item name="android:paddingBottom">8dp</item>
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ <item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:clickable">true</item>
+ </style>
+
</resources>
diff --git a/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java
index 09d9f4623..41e95d99e 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java
@@ -1,7 +1,6 @@
package de.danoeh.antennapod.core;
import android.content.Context;
-import android.content.Intent;
import android.util.Log;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
@@ -12,11 +11,9 @@ import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
import de.danoeh.antennapod.core.preferences.UsageStatistics;
import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.core.service.ProviderInstallerInterceptor;
import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.danoeh.antennapod.core.util.NetworkUtils;
-import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup;
import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import java.io.File;
@@ -55,6 +52,7 @@ public class ClientConfig {
UserPreferences.init(context);
UsageStatistics.init(context);
PlaybackPreferences.init(context);
+ installSslProvider(context);
NetworkUtils.init(context);
// Don't initialize Cast-related logic unless it is enabled, to avoid the unnecessary
// Google Play Service usage.
@@ -65,26 +63,13 @@ public class ClientConfig {
} else {
Log.v(TAG, "Cast is disabled. All Cast-related initialization will be skipped.");
}
- ProviderInstaller.installIfNeededAsync(context, new ProviderInstaller.ProviderInstallListener() {
- @Override
- public void onProviderInstalled() {
- Log.e(TAG, "onProviderInstalled");
- }
-
- @Override
- public void onProviderInstallFailed(int i, Intent intent) {
- Log.e(TAG, "onProviderInstallFailed");
- }
- });
- ProviderInstallerInterceptor.installer = () -> installSslProvider(context);
AntennapodHttpClient.setCacheDirectory(new File(context.getCacheDir(), "okhttp"));
SleepTimerPreferences.init(context);
- RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
NotificationUtils.createChannels(context);
initialized = true;
}
- public static void installSslProvider(Context context) {
+ private static void installSslProvider(Context context) {
try {
ProviderInstaller.installIfNeeded(context);
} catch (GooglePlayServicesRepairableException e) {
diff --git a/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java b/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java
index 527a652e3..8d0e40116 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java
@@ -3,7 +3,7 @@ package de.danoeh.antennapod.core.cast;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
-import androidx.core.view.MenuItemCompat;
+
import de.danoeh.antennapod.core.R;
public class CastButtonVisibilityManager {
@@ -115,6 +115,6 @@ public class CastButtonVisibilityManager {
Log.e(TAG, "setShowAsAction(), but cast button not inflated");
return;
}
- MenuItemCompat.setShowAsAction(item, connected ? MenuItem.SHOW_AS_ACTION_ALWAYS : showAsAction);
+ item.setShowAsAction(connected ? MenuItem.SHOW_AS_ACTION_ALWAYS : showAsAction);
}
}
diff --git a/ic_launcher-web.png b/ic_launcher-web.png
deleted file mode 100644
index 3868fc03b..000000000
--- a/ic_launcher-web.png
+++ /dev/null
Binary files differ