summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <info@bytehamster.com>2018-12-26 08:40:40 +0100
committerByteHamster <info@bytehamster.com>2018-12-26 08:40:40 +0100
commitbb4b4655d25713dfddca7a52c5088938c604114b (patch)
tree29546dd59b232b0843cd52e80d950111aefddb81
parent20328dbd97c0ff561b815efe3cc088884f7378eb (diff)
parent9a92e66ffdcb7648ad641fa4f17ffe11d4d72298 (diff)
downloadAntennaPod-bb4b4655d25713dfddca7a52c5088938c604114b.zip
Merge branch 'develop' into rxjava2
-rw-r--r--.tx/config1
-rw-r--r--CHANGELOG.md10
-rw-r--r--CONTRIBUTORS125
-rw-r--r--app/build.gradle12
-rw-r--r--app/proguard.cfg13
-rw-r--r--app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java18
-rw-r--r--app/src/androidTest/java/de/test/antennapod/NthMatcher.java38
-rw-r--r--app/src/androidTest/java/de/test/antennapod/feed/FeedItemTest.java1
-rw-r--r--app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java34
-rw-r--r--app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java1
-rw-r--r--app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java1
-rw-r--r--app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java1
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java206
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/PlaybackSonicTest.java2
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java272
-rw-r--r--app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java1
-rw-r--r--app/src/main/AndroidManifest.xml4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/PodcastApp.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/AboutActivity.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/DirectoryChooserActivity.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java20
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java24
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java43
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java28
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java18
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java18
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OpmlFeedChooserActivity.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java14
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OpmlImportHolder.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/StatisticsActivity.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/StorageErrorActivity.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java17
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java32
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java40
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java5
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java16
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java16
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java22
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/config/ClientConfigurator.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/AuthenticationDialog.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/AutoFlattrPreferenceDialog.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java35
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/GpodnetSetHostnameDialog.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java30
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FyydSearchFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java24
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java22
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java17
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/MasterSwitchPreference.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java1
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java27
-rw-r--r--app/src/main/java/de/danoeh/antennapod/spa/SPAUtil.java2
-rw-r--r--app/src/main/play/de/listing/fulldescription4
-rw-r--r--app/src/main/play/el/listing/fulldescription26
-rw-r--r--app/src/main/play/es/listing/fulldescription2
-rw-r--r--app/src/main/res/layout/all_episodes_fragment.xml8
-rw-r--r--app/src/main/res/layout/audio_controls.xml7
-rw-r--r--app/src/main/res/layout/authentication_dialog.xml4
-rw-r--r--app/src/main/res/layout/directory_chooser.xml8
-rw-r--r--app/src/main/res/layout/download_authentication_activity.xml4
-rw-r--r--app/src/main/res/layout/downloaded_episodeslist_item.xml4
-rw-r--r--app/src/main/res/layout/downloadlist_item.xml3
-rw-r--r--app/src/main/res/layout/downloadlog_item.xml12
-rw-r--r--app/src/main/res/layout/ellipsize_start_listitem.xml20
-rw-r--r--app/src/main/res/layout/feedinfo.xml4
-rw-r--r--app/src/main/res/layout/feeditem_fragment.xml10
-rw-r--r--app/src/main/res/layout/feeditemlist_header.xml12
-rw-r--r--app/src/main/res/layout/feeditemlist_item.xml21
-rw-r--r--app/src/main/res/layout/feedsettings.xml5
-rw-r--r--app/src/main/res/layout/gpodnet_podcast_listitem.xml7
-rw-r--r--app/src/main/res/layout/gpodnet_tag_listitem.xml3
-rw-r--r--app/src/main/res/layout/gpodnetauth_credentials.xml6
-rw-r--r--app/src/main/res/layout/gpodnetauth_device.xml17
-rw-r--r--app/src/main/res/layout/itemdescription_listitem.xml4
-rw-r--r--app/src/main/res/layout/itunes_podcast_listitem.xml3
-rw-r--r--app/src/main/res/layout/mediaplayerinfo_activity.xml22
-rw-r--r--app/src/main/res/layout/nav_feedlistitem.xml12
-rw-r--r--app/src/main/res/layout/nav_list.xml2
-rw-r--r--app/src/main/res/layout/nav_listitem.xml8
-rw-r--r--app/src/main/res/layout/new_episodes_listitem.xml17
-rw-r--r--app/src/main/res/layout/onlinefeedview_header.xml10
-rw-r--r--app/src/main/res/layout/opml_selection.xml4
-rw-r--r--app/src/main/res/layout/queue_listitem.xml15
-rw-r--r--app/src/main/res/layout/searchlist_item.xml5
-rw-r--r--app/src/main/res/layout/simplechapter_item.xml3
-rw-r--r--app/src/main/res/layout/statistics_listitem.xml10
-rw-r--r--app/src/main/res/layout/videoplayer_activity.xml10
-rw-r--r--app/src/main/res/xml/preferences.xml15
-rw-r--r--app/src/main/res/xml/preferences_user_interface.xml10
-rw-r--r--build.gradle3
-rwxr-xr-xcontributers.template.py11
-rw-r--r--core/build.gradle6
-rw-r--r--core/src/androidTest/java/de/danoeh/antennapod/core/AntennaPodTestRunner.java16
-rw-r--r--core/src/main/java/android/support/v4/app/SafeJobIntentService.java118
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrStatusFetcher.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideSettings.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/FeedUpdateJobService.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java29
-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/playback/ExoPlayerWrapper.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java19
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlayerStatus.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java34
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/Namespace.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/Converter.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java20
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/LangUtils.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ThemeUtils.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrUtils.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/gui/NotificationUtils.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackServiceStarter.java2
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_baseline_question_answer_white_24dp.pngbin0 -> 187 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_bug_grey600_24dp.pngbin0 -> 813 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_bug_white_24dp.pngbin0 -> 653 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_cellphone_text_grey600_24dp.pngbin0 -> 649 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_cellphone_text_white_24dp.pngbin0 -> 592 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_format_list_bulleted_grey600_24dp.pngbin0 -> 492 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_format_list_bulleted_white_24dp.pngbin0 -> 459 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_forum_grey600_24dp.pngbin0 -> 601 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_baseline_question_answer_white_24dp.pngbin0 -> 139 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_bug_grey600_24dp.pngbin0 -> 663 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_bug_white_24dp.pngbin0 -> 529 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_cellphone_text_grey600_24dp.pngbin0 -> 471 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_cellphone_text_white_24dp.pngbin0 -> 440 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_format_list_bulleted_grey600_24dp.pngbin0 -> 423 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_format_list_bulleted_white_24dp.pngbin0 -> 406 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_forum_grey600_24dp.pngbin0 -> 488 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_baseline_question_answer_white_24dp.pngbin0 -> 212 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_bug_grey600_24dp.pngbin0 -> 960 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_bug_white_24dp.pngbin0 -> 710 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_cellphone_text_grey600_24dp.pngbin0 -> 614 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_cellphone_text_white_24dp.pngbin0 -> 564 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_grey600_24dp.pngbin0 -> 504 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_white_24dp.pngbin0 -> 462 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_forum_grey600_24dp.pngbin0 -> 602 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_baseline_question_answer_white_24dp.pngbin0 -> 276 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_bug_grey600_24dp.pngbin0 -> 1270 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_bug_white_24dp.pngbin0 -> 926 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_cellphone_text_grey600_24dp.pngbin0 -> 801 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_cellphone_text_white_24dp.pngbin0 -> 739 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_grey600_24dp.pngbin0 -> 631 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_white_24dp.pngbin0 -> 594 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_forum_grey600_24dp.pngbin0 -> 766 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxxhdpi/ic_baseline_question_answer_white_24db.pngbin0 -> 310 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_bug_grey600_24dp.pngbin0 -> 1577 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_bug_white_24dp.pngbin0 -> 1180 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_grey600_24dp.pngbin0 -> 971 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_white_24dp.pngbin0 -> 902 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_grey600_24dp.pngbin0 -> 738 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_white_24dp.pngbin0 -> 666 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_forum_grey600_24dp.pngbin0 -> 900 bytes
-rw-r--r--core/src/main/res/drawable/overlay_drawable_dark_trueblack.xml15
-rw-r--r--core/src/main/res/values-ar/strings.xml73
-rw-r--r--core/src/main/res/values-az/strings.xml2
-rw-r--r--core/src/main/res/values-b+ast/strings.xml3
-rw-r--r--core/src/main/res/values-bg/strings.xml2
-rw-r--r--core/src/main/res/values-ca-rES/strings.xml1
-rw-r--r--core/src/main/res/values-ca/strings.xml8
-rw-r--r--core/src/main/res/values-cs-rCZ/strings.xml11
-rw-r--r--core/src/main/res/values-da/strings.xml7
-rw-r--r--core/src/main/res/values-de/strings.xml65
-rw-r--r--core/src/main/res/values-el/strings.xml48
-rw-r--r--core/src/main/res/values-es-rES/strings.xml2
-rw-r--r--core/src/main/res/values-es/strings.xml41
-rw-r--r--core/src/main/res/values-et/strings.xml3
-rw-r--r--core/src/main/res/values-fa/strings.xml3
-rw-r--r--core/src/main/res/values-fi/strings.xml1
-rw-r--r--core/src/main/res/values-fr/strings.xml53
-rw-r--r--core/src/main/res/values-gl-rES/strings.xml41
-rw-r--r--core/src/main/res/values-hi-rIN/strings.xml3
-rw-r--r--core/src/main/res/values-hu/strings.xml3
-rw-r--r--core/src/main/res/values-id/strings.xml1
-rw-r--r--core/src/main/res/values-is-rIS/strings.xml1
-rw-r--r--core/src/main/res/values-it-rIT/strings.xml77
-rw-r--r--core/src/main/res/values-it/strings.xml3
-rw-r--r--core/src/main/res/values-iw-rIL/strings.xml5
-rw-r--r--core/src/main/res/values-ja/strings.xml41
-rw-r--r--core/src/main/res/values-kn-rIN/strings.xml1
-rw-r--r--core/src/main/res/values-ko-rKR/strings.xml1
-rw-r--r--core/src/main/res/values-ko/strings.xml5
-rw-r--r--core/src/main/res/values-lt/strings.xml13
-rw-r--r--core/src/main/res/values-mk/strings.xml54
-rw-r--r--core/src/main/res/values-nb/strings.xml5
-rw-r--r--core/src/main/res/values-nl/strings.xml63
-rw-r--r--core/src/main/res/values-no-rNB/strings.xml7
-rw-r--r--core/src/main/res/values-no/strings.xml1
-rw-r--r--core/src/main/res/values-pl-rPL/strings.xml6
-rw-r--r--core/src/main/res/values-pl/strings.xml2
-rw-r--r--core/src/main/res/values-pt-rBR/strings.xml7
-rw-r--r--core/src/main/res/values-pt/strings.xml41
-rw-r--r--core/src/main/res/values-ro-rRO/strings.xml2
-rw-r--r--core/src/main/res/values-ru/strings.xml41
-rw-r--r--core/src/main/res/values-sv-rSE/strings.xml41
-rw-r--r--core/src/main/res/values-sw-rKE/strings.xml1
-rw-r--r--core/src/main/res/values-te/strings.xml2
-rw-r--r--core/src/main/res/values-tr/strings.xml5
-rw-r--r--core/src/main/res/values-uk-rUA/strings.xml5
-rw-r--r--core/src/main/res/values-vi-rVN/strings.xml1
-rw-r--r--core/src/main/res/values-vi/strings.xml2
-rw-r--r--core/src/main/res/values-zh-rCN/strings.xml7
-rw-r--r--core/src/main/res/values-zh-rHK/strings.xml1
-rw-r--r--core/src/main/res/values-zh-rTW/strings.xml3
-rw-r--r--core/src/main/res/values/arrays.xml35
-rw-r--r--core/src/main/res/values/attrs.xml4
-rw-r--r--core/src/main/res/values/colors.xml2
-rw-r--r--core/src/main/res/values/strings.xml20
-rw-r--r--core/src/main/res/values/styles.xml26
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java1
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/cast/CastManager.java6
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/cast/CastUtils.java2
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/cast/RemoteMedia.java1
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java2
278 files changed, 2208 insertions, 976 deletions
diff --git a/.tx/config b/.tx/config
index 0659eaff4..5b9066e64 100644
--- a/.tx/config
+++ b/.tx/config
@@ -33,6 +33,7 @@ trans.kn_IN = core/src/main/res/values-kn-rIN/strings.xml
trans.ko = core/src/main/res/values-ko/strings.xml
trans.ko_KR = core/src/main/res/values-ko-rKR/strings.xml
trans.lt = core/src/main/res/values-lt/strings.xml
+trans.mk = core/src/main/res/values-mk/strings.xml
trans.nb = core/src/main/res/values-nb/strings.xml
trans.no = core/src/main/res/values-no/strings.xml
trans.nl = core/src/main/res/values-nl/strings.xml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6be6ab82..2899d1fd2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,16 @@
Change Log
==========
-Version 1.6.6
+
+Version 1.7.1
+-------------
+
+* Fix for database corruption
+
+Version 1.7.0
-------------
-* Experimental new media player (ExoPlayer)
+* NEW ExoPlayer (experimental)
* Fix for Bluetooth Forward (Oreo)
* Preference redesign + search
* Notification improvements
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 837c412c5..891a9784c 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -1,107 +1,168 @@
DEVELOPERS
==========
+Alan Orth
Alexander Terczka
+alifeflow
+amhokies
+Anders Bo Rasmussen
Andrew Gaul
Andrey Krutov
Anthony Lieuallen
axq
+brad
ByteHamster
+Cameron Banga
Christian Ludwig
Christopher Szucko
+Cj Malone
Colin Willson
+Cédric Cabessa
+Danial Klimkin
Daniel Oeh
David Carver
David Reiss
Dean Brettle
dethstar
+Dirk Mueller
Domingos Lopes
drabux
+egsavage
+EirikV
Eoin Mcloughlin
+eraymond
Ercan Erden
+Falko Lehmann
+Hannes Achleitner
+hannesa2
Hanno Zulla
heckler01
Holger Jeromin
+Humberto Fraga
+InsidE
James Falcon
+Jan Niehusmann
+Jens Klingenberg
Jens Müller
Johan Liesén
+Kaligule
Katrin Leinweber
-keunes
+Kevin Dalley
Koen Glotzbach
+kroegerama
+Kurian Vithayathil
LatinSuD
Lee Yeong Khang
lightonflux
ligi
+Luis Cruz
+Marc Lasson
Martin Fietz
Martin Olsson
mat tso
+mateoeh
+Matthew Gaffen
Matthias Schütz
+Maurice Gilden
+Meir Schwarz
Michael Kaiser
Michael Scarito
Mike Chelen
+minusf
+MolarAmbiguity
Mounir Lamouri
+mr-intj
Nis Wechselberg
+Oliver Crow
+orelogo
Paul Ortyl
+Raghul
+Raghul Jagannathan
recalculated
Ross Harrison
+Sam Lee
Sam Whited
+saqura
+Selivanov Pavel
+Serge
Seth Golub
+sevenmaster
+Shantana Hardy
Simon Danner
Simon Rutishauser
Simon Schubert
+Soso Tughushi
+Spencer Visick
Stefan Mitrik
Terence Eden
Tim Butram
Tobias Preuss
Tom Hennen
+Tom Tom
tommy watson
+tuxayo
twiceyuan
Udi Finkelstein
+VarunBarad
volhol
Volker Hollich
WangYun
William Seemann
+ydinath
TRANSLATORS
===========
-Arabic: abuzar3.khalid, iDemo
-Azerbaijani: phoenixar
-Catalan: dvd1985, javiercoll, xc70
-Catalan (Spain): javiercoll
-Chinese (China): bebeauties38, dudeG, Felix2yu, gaohongyuan, Guaidaodl, linxiangyu, molisiye, tupunco, wongsyrone, yangyang, YogaGuru
+Arabic: abdelrahman.fahem93, abdunnasir, abuzar3.khalid, desha, iDemo, mohamedagamy, msahouli, nabilMaghura
+Asturian (Spain): enolp
+Azerbaijani: danieloeh, kotfenix
+Bulgarian: solusitor
+Catalan: dvd1985, exort12, javiercoll, lambdani, marcmetallextrem, xc70
+Catalan (Spain): 00c0c0, javiercoll
+Chinese: dillonbecker, RainSlide, xukeek, yangyang
+Chinese (China): bebeauties38, domingos86, dudeG, ErlichLiu, Felix2yu, gaohongyuan, Guaidaodl, Huck0, iconteral, jhxie, kavdx, kyleehee, linxiangyu, molisiye, owen8877, RainSlide, stellaxuyi, tupunco, wi24rd, wongsyrone, xukeek, yangyang, yiqiok, YogaGuru
+Chinese (Taiwan): gugod, nigelinux, pggdt, ymhuang0808
Czech (Czech Republic): elich, Hanzmeister, mcepl, petnek, svetlemodry
-Danish: CasperHN
-Dutch: e2jk, glotzbach, rwv
+Danish: CasperHN, jhertel
+Dutch: e2jk, glotzbach, rwv, Vistaus
English: mfietz, sterylmreep
+Estonian: Eraser
Finnish: danieloeh
-French: cactux, ChaoticMind, clombion, e2jk, lacouture, Matth78, mfietz, repat, sterylmreep, vcariven
-German: 112358, altegedanken, bitsunited, ChaoticMind, Chaquotay, dab0015, DJaeger, HolgerJeromin, kalei, lohmann, mfietz, nilso, picsel2, repat, SAPlayer, schafia, ypid
-Greek: AlexanderKanetakis
-Hebrew (Israel): amir.dafnyman
-Hindi (India): purple.coder, siddhusengar
-Hungarian: glatz.balazs, naren93
-Indonesian: luke137, silvanael16
-Italian: aalex70, apanontin, Guybrush88, theloca95
-Italian (Italy): aalex70, apanontin, Guybrush88, m.chinni, theloca95
+French: cactux, ChaoticMind, clombion, e2jk, lacouture, Matth78, mfietz, Poussinou, PRIMOKORN, repat, sterylmreep, TacoTheDank, Tilwa, vcariven, whenrow
+Galician: antiparvos, pikamoku, Raichely
+German: 112358, altegedanken, barilla, bitsunited, Buggi, ceving, ChaoticMind, Chaquotay, dab0015, dadosch, DerSilly, DJaeger, elkangaroo, enz, fidel, finsterwalder, Foso, GNi33, HolgerJeromin, kalei, lohmann, LostInWeb, mfietz, nilso, repat, SAPlayer, schafia, Schroedingberg, sevenmaster, sucaml, Teaspoon, theonlytruth, weltenwort, Wyrrrd, ypid
+Greek: antonist, danieloeh, hua2016s, MSavoritias, pavlosv
+Hebrew (Israel): amir.dafnyman, E1i9, mongoose4004, pinkasey, rellieberman, Yaron, הלוי11
+Hindi (India): nmabhinandan, purple.coder, siddhusengar
+Hungarian: glatz.balazs, lna91, naren93, tszauer, ttyborg42
+Icelandic: marthjod
+Indonesian: jff, luke137, rezafaiza, silvanael16
+Italian: aalex70, allin, apanontin, Bonnee, giuseppep, Guybrush88, marco_pag, neonsoftware, sevenmaster, theloca95
+Italian (Italy): aalex70, allin, apanontin, Bonnee, buongiorgio, giuseppep, Guybrush88, m.chinni, neonsoftware, nixxo, sevenmaster, theloca95
Japanese: Naofumi, RACER1, sh3llc4t, TranslatorG
Kannada (India): thejeshgn
-Korean: changwoo, halcyonest, seungrye, skcha
+Korean: changwoo, seungrye, skcha
Korean (South Korea): changwoo, seungrye
+Lithuanian: naglis
+Macedonian: krisfremen
Norwegian: hakonanes, timbast
-Norwegian Bokmål: hakonanes
-Norwegian Bokmål (Norway): hakonanes, kongk, swordfighter, timbast
-Polish: Iwangelion, maniexx, thedead4fun
-Polish (Poland): Iwangelion, lomapur, maniexx, Mephistofeles, shark103, tyle
-Portuguese: emansije, smarquespt
-Portuguese (Brazil): alexupits, edman, Firmino, lipefire, lucasmotacr, mbaltar, rogervezaro, SamWilliam, silvanael16
-Romanian (Romania): corneliu.e, fuzzmz
-Russian (Russia): astra1, Duke_Raven, mercutiy, null, overmind88, phoenixar, s.chebotar, skvheadless, whereisthetea, zhenya97
-Spanish: coperfix, dvd1985, Fitoschido, frandavid100, javiercoll, LatinSuD, tres.14159
-Spanish (Spain): dvd1985, e2jk, frandavid100
-Swedish (Sweden): albin.brantin, Bio, bpnilsson, ChaoticMind, Lumen, nilso, SharpMelon, TwoD
-Turkish: basarancaner, brsata, overbite
-Ukrainian (Ukraine): older, zhenya97
-Vietnamese: ppanhh, vietnamesel10n
+Norwegian Bokmål: corkie, hakonanes
+Norwegian Bokmål (Norway): corkie, hakonanes, kongk, timbast
+Persian: ahangarha, F7D
+Polish: Iwangelion, maniexx, mfloryan, thedead4fun
+Polish (Poland): d6210809, Iwangelion, lomapur, mandlus, maniexx, Mephistofeles, shark103, tyle
+Portuguese: domingos86, emansije, smarquespt
+Portuguese (Brazil): alexupits, alysonborges, arua, caioau, carlo_valente, castrors, deandreamatias, edman, Firmino, jackmiras, Junin, lipefire, lluccia, lucasmotacr, mbaltar, rogervezaro, RubeensVinicius, SamWilliam, silvanael16
+Romanian (Romania): corneliu.e, fuzzmz, ralienpp
+Russian (Russia): astra1, btimofeev, Duke_Raven, GaynullinDima, MegMasters98, mercutiy, null, overmind88, s.chebotar, shams4real, skvheadless, un_logic, whereisthetea, zhenya97
+Slovenian (Slovenia): panter23
+Spanish: AleksSyntek, coperfix, deandreamatias, domingos86, dvd1985, Fitoschido, frandavid100, hard_ware, javiercoll, Juanmuto, lambdani, LatinSuD, leogrignafini, palopezv, TacoTheDank, tres.14159, wakutiteo
+Spanish (Spain): dvd1985, e2jk, frandavid100, hard_ware, palopezv, Raichely, TacoTheDank
+Swahili (Kenya): BonfaceKilz
+Swedish (Sweden): albin.brantin, Bio, bpnilsson, ChaoticMind, jony08, nilso, SharpMelon, TwoD
+Telugu: veeven
+Turkish: basarancaner, brsata, Erdy, golcuk, overbite
+Ukrainian (Ukraine): older, sergiyr, zhenya97
+Vietnamese: abnvolk, nguyenvui, ppanhh, vietnamesel10n
Vietnamese (Vietnam): bizover
diff --git a/app/build.gradle b/app/build.gradle
index f4153f21f..97a6ff835 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -43,7 +43,7 @@ android {
versionCode getMyVersionCode()
versionName "${getMyVersionName()}"
testApplicationId "de.test.antennapod"
- testInstrumentationRunner "de.test.antennapod.AntennaPodTestRunner"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
generatedDensities = []
}
@@ -120,6 +120,10 @@ android {
additionalParameters "--no-version-vectors"
}
+ testOptions {
+ animationsDisabled = true
+ }
+
flavorDimensions "market"
productFlavors {
free {
@@ -150,6 +154,7 @@ dependencies {
implementation "com.android.support:gridlayout-v7:$supportVersion"
implementation "com.android.support:percent:$supportVersion"
implementation "com.android.support:recyclerview-v7:$supportVersion"
+ compileOnly 'com.google.android.wearable:wearable:2.2.0'
implementation "org.apache.commons:commons-lang3:$commonslangVersion"
implementation("org.shredzone.flattr4j:flattr4j-core:$flattr4jVersion") {
exclude group: "org.json", module: "json"
@@ -182,6 +187,11 @@ dependencies {
implementation 'com.github.ByteHamster:SearchPreference:v1.0.8'
androidTestImplementation "com.jayway.android.robotium:robotium-solo:$robotiumSoloVersion"
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-intents:3.0.2'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test:rules:1.0.2'
}
play {
diff --git a/app/proguard.cfg b/app/proguard.cfg
index 01b1708f7..6bb98dc9e 100644
--- a/app/proguard.cfg
+++ b/app/proguard.cfg
@@ -71,8 +71,6 @@
-dontwarn android.support.v7.**
-dontwarn com.google.android.wearable.**
--keepattributes *Annotation*
-
-keep class org.shredzone.flattr4j.** { *; }
-dontwarn org.shredzone.flattr4j.**
@@ -94,6 +92,7 @@
-keepclassmembers class ** {
public void onEvent*(**);
}
+-keep class de.danoeh.antennapod.core.event.*
# android-iconify
-keep class com.joanzapata.** { *; }
@@ -125,3 +124,13 @@
-keep class com.squareup.moshi.** { *; }
-keep interface com.squareup.moshi.** { *; }
-keep public class retrofit2.adapter.rxjava.RxJavaCallAdapterFactory { *; }
+
+# awaitility
+-dontwarn java.beans.BeanInfo
+-dontwarn java.beans.Introspector
+-dontwarn java.beans.IntrospectionException
+-dontwarn java.beans.PropertyDescriptor
+-dontwarn java.lang.management.ManagementFactory
+-dontwarn java.lang.management.ThreadInfo
+-dontwarn java.lang.management.ThreadMXBean
+
diff --git a/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java b/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java
deleted file mode 100644
index c321e6494..000000000
--- a/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.test.antennapod;
-
-import android.test.InstrumentationTestRunner;
-import android.test.suitebuilder.TestSuiteBuilder;
-
-import junit.framework.TestSuite;
-
-public class AntennaPodTestRunner extends InstrumentationTestRunner {
-
- @Override
- public TestSuite getAllTests() {
- return new TestSuiteBuilder(AntennaPodTestRunner.class)
- .includeAllPackagesUnderHere()
- .excludePackages("de.test.antennapod.gpodnet")
- .build();
- }
-
-}
diff --git a/app/src/androidTest/java/de/test/antennapod/NthMatcher.java b/app/src/androidTest/java/de/test/antennapod/NthMatcher.java
new file mode 100644
index 000000000..f9ecacda5
--- /dev/null
+++ b/app/src/androidTest/java/de/test/antennapod/NthMatcher.java
@@ -0,0 +1,38 @@
+package de.test.antennapod;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class NthMatcher {
+ public static <T> Matcher<T> first(final Matcher<T> matcher) {
+ return nth(matcher, 1);
+ }
+
+ public static <T> Matcher<T> second(final Matcher<T> matcher) {
+ return nth(matcher, 2);
+ }
+
+ private static <T> Matcher<T> nth(final Matcher<T> matcher, final int index) {
+ return new BaseMatcher<T>() {
+ AtomicInteger count = new AtomicInteger(0);
+
+ @Override
+ public boolean matches(final Object item) {
+ if (matcher.matches(item)) {
+ if (count.incrementAndGet() == index) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(final Description description) {
+ description.appendText("should return first matching item");
+ }
+ };
+ }
+}
diff --git a/app/src/androidTest/java/de/test/antennapod/feed/FeedItemTest.java b/app/src/androidTest/java/de/test/antennapod/feed/FeedItemTest.java
index db463132d..ced0d7a28 100644
--- a/app/src/androidTest/java/de/test/antennapod/feed/FeedItemTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/feed/FeedItemTest.java
@@ -1,6 +1,7 @@
package de.test.antennapod.feed;
import android.test.AndroidTestCase;
+
import de.danoeh.antennapod.core.feed.FeedItem;
public class FeedItemTest extends AndroidTestCase {
diff --git a/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java b/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java
index a880c330b..91e31e73c 100644
--- a/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java
@@ -1,43 +1,43 @@
package de.test.antennapod.gpodnet;
-import android.test.AndroidTestCase;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import android.support.test.runner.AndroidJUnit4;
import de.danoeh.antennapod.core.gpoddernet.GpodnetService;
import de.danoeh.antennapod.core.gpoddernet.GpodnetServiceException;
import de.danoeh.antennapod.core.gpoddernet.model.GpodnetDevice;
import de.danoeh.antennapod.core.gpoddernet.model.GpodnetTag;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import static java.util.Collections.singletonList;
/**
* Test class for GpodnetService
*/
-public class GPodnetServiceTest extends AndroidTestCase {
+@Ignore
+@RunWith(AndroidJUnit4.class)
+public class GPodnetServiceTest {
private GpodnetService service;
private static final String USER = "";
private static final String PW = "";
- @Override
- protected void setUp() throws Exception {
- super.setUp();
+ @Before
+ protected void setUp() {
service = new GpodnetService();
}
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
private void authenticate() throws GpodnetServiceException {
service.authenticate(USER, PW);
}
+ @Test
public void testUploadSubscription() throws GpodnetServiceException {
authenticate();
ArrayList<String> l = new ArrayList<>();
@@ -45,6 +45,7 @@ public class GPodnetServiceTest extends AndroidTestCase {
service.uploadSubscriptions(USER, "radio", l);
}
+ @Test
public void testUploadSubscription2() throws GpodnetServiceException {
authenticate();
ArrayList<String> l = new ArrayList<>();
@@ -53,6 +54,7 @@ public class GPodnetServiceTest extends AndroidTestCase {
service.uploadSubscriptions(USER, "radio", l);
}
+ @Test
public void testUploadChanges() throws GpodnetServiceException {
authenticate();
String[] URLS = {"http://bitsundso.de/feed", "http://gamesundso.de/feed", "http://cre.fm/feed/mp3/", "http://freakshow.fm/feed/m4a/"};
@@ -63,53 +65,63 @@ public class GPodnetServiceTest extends AndroidTestCase {
service.uploadChanges(USER, "radio", added, removed);
}
+ @Test
public void testGetSubscriptionChanges() throws GpodnetServiceException {
authenticate();
service.getSubscriptionChanges(USER, "radio", 1362322610L);
}
+ @Test
public void testGetSubscriptionsOfUser()
throws GpodnetServiceException {
authenticate();
service.getSubscriptionsOfUser(USER);
}
+ @Test
public void testGetSubscriptionsOfDevice()
throws GpodnetServiceException {
authenticate();
service.getSubscriptionsOfDevice(USER, "radio");
}
+ @Test
public void testConfigureDevices() throws GpodnetServiceException {
authenticate();
service.configureDevice(USER, "foo", "This is an updated caption",
GpodnetDevice.DeviceType.LAPTOP);
}
+ @Test
public void testGetDevices() throws GpodnetServiceException {
authenticate();
service.getDevices(USER);
}
+ @Test
public void testGetSuggestions() throws GpodnetServiceException {
authenticate();
service.getSuggestions(10);
}
+ @Test
public void testTags() throws GpodnetServiceException {
service.getTopTags(20);
}
+ @Test
public void testPodcastForTags() throws GpodnetServiceException {
List<GpodnetTag> tags = service.getTopTags(20);
service.getPodcastsForTag(tags.get(1),
10);
}
+ @Test
public void testSearch() throws GpodnetServiceException {
service.searchPodcasts("linux", 64);
}
+ @Test
public void testToplist() throws GpodnetServiceException {
service.getPodcastToplist(10);
}
diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java
index 93a9408b7..9cd7689ba 100644
--- a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java
@@ -5,7 +5,6 @@ import android.test.FlakyTest;
import android.test.InstrumentationTestCase;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.List;
diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java
index c9c715a86..a577e5e36 100644
--- a/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java
+++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java
@@ -21,6 +21,7 @@ import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
*/
class DBTestUtils {
+ private DBTestUtils(){}
/**
* Use this method when tests don't involve chapters.
*/
diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java
index 387ab91b3..427cc8ddd 100644
--- a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java
@@ -18,7 +18,6 @@ import java.util.concurrent.TimeoutException;
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.SimpleChapter;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java
index 6156da926..9a60b04b8 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java
@@ -2,16 +2,14 @@ package de.test.antennapod.ui;
import android.content.Context;
import android.content.SharedPreferences;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.FlakyTest;
+import android.support.test.espresso.contrib.DrawerActions;
+import android.support.test.espresso.intent.Intents;
+import android.support.test.filters.FlakyTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
import android.widget.ListView;
-
import com.robotium.solo.Solo;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
+import com.robotium.solo.Timeout;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.activity.OnlineFeedViewActivity;
@@ -23,25 +21,46 @@ import de.danoeh.antennapod.fragment.DownloadsFragment;
import de.danoeh.antennapod.fragment.EpisodesFragment;
import de.danoeh.antennapod.fragment.PlaybackHistoryFragment;
import de.danoeh.antennapod.fragment.QueueFragment;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static android.support.test.InstrumentationRegistry.getInstrumentation;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.action.ViewActions.longClick;
+import static android.support.test.espresso.intent.Intents.intended;
+import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static de.test.antennapod.NthMatcher.first;
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertEquals;
/**
* User interface tests for MainActivity
*/
-public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
+@RunWith(AndroidJUnit4.class)
+public class MainActivityTest {
private Solo solo;
private UITestUtils uiTestUtils;
-
private SharedPreferences prefs;
- public MainActivityTest() {
- super(MainActivity.class);
- }
+ @Rule
+ public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- Context context = getInstrumentation().getTargetContext();
+ @Before
+ public void setUp() throws IOException {
+ Intents.init();
+ Context context = mActivityRule.getActivity();
uiTestUtils = new UITestUtils(context);
uiTestUtils.setup();
@@ -54,30 +73,26 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
// override first launch preference
// do this BEFORE calling getActivity()!
- prefs = getInstrumentation().getTargetContext().getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE);
+ prefs = context.getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE);
prefs.edit().putBoolean(MainActivity.PREF_IS_FIRST_LAUNCH, false).commit();
- solo = new Solo(getInstrumentation(), getActivity());
+ solo = new Solo(getInstrumentation(), mActivityRule.getActivity());
}
- @Override
- protected void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
uiTestUtils.tearDown();
solo.finishOpenedActivities();
-
+ Intents.release();
PodDBAdapter.deleteDatabase();
-
- // reset preferences
prefs.edit().clear().commit();
-
- super.tearDown();
}
private void openNavDrawer() {
- solo.clickOnImageButton(0);
- getInstrumentation().waitForIdleSync();
+ onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
}
+ @Test
public void testAddFeed() throws Exception {
uiTestUtils.addHostedFeedData();
final Feed feed = uiTestUtils.hostedFeeds.get(0);
@@ -89,10 +104,12 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
solo.waitForView(R.id.butSubscribe);
assertEquals(solo.getString(R.string.subscribe_label), solo.getButton(0).getText().toString());
solo.clickOnButton(0);
- solo.waitForText(solo.getString(R.string.subscribed_label));
+ assertTrue(solo.waitForText(solo.getString(R.string.open_podcast), 0, Timeout.getLargeTimeout(), false));
}
- @FlakyTest(tolerance = 3)
+
+ @Test
+ @FlakyTest
public void testClickNavDrawer() throws Exception {
uiTestUtils.addLocalFeedData(false);
@@ -150,57 +167,60 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
return ((MainActivity) solo.getCurrentActivity()).getSupportActionBar().getTitle().toString();
}
- @SuppressWarnings("unchecked")
- @FlakyTest(tolerance = 3)
+
+ @Test
+ @FlakyTest
public void testGoToPreferences() {
openNavDrawer();
- solo.clickOnText(solo.getString(R.string.settings_label));
- solo.waitForActivity(PreferenceActivity.class);
+ onView(withText(R.string.settings_label)).perform(click());
+ intended(hasComponent(PreferenceActivity.class.getName()));
}
+ @Test
public void testDrawerPreferencesHideSomeElements() {
UserPreferences.setHiddenDrawerItems(new ArrayList<>());
openNavDrawer();
- solo.clickLongOnText(solo.getString(R.string.queue_label));
- solo.waitForDialogToOpen();
- solo.clickOnText(solo.getString(R.string.episodes_label));
- solo.clickOnText(solo.getString(R.string.playback_history_label));
- solo.clickOnText(solo.getString(R.string.confirm_label));
- solo.waitForDialogToClose();
+ onView(first(withText(R.string.queue_label))).perform(longClick());
+ onView(withText(R.string.episodes_label)).perform(click());
+ onView(withText(R.string.playback_history_label)).perform(click());
+ onView(withText(R.string.confirm_label)).perform(click());
+
List<String> hidden = UserPreferences.getHiddenDrawerItems();
assertEquals(2, hidden.size());
assertTrue(hidden.contains(EpisodesFragment.TAG));
assertTrue(hidden.contains(PlaybackHistoryFragment.TAG));
}
+ @Test
public void testDrawerPreferencesUnhideSomeElements() {
List<String> hidden = Arrays.asList(PlaybackHistoryFragment.TAG, DownloadsFragment.TAG);
UserPreferences.setHiddenDrawerItems(hidden);
openNavDrawer();
- solo.clickLongOnText(solo.getString(R.string.queue_label));
- solo.waitForDialogToOpen();
- solo.clickOnText(solo.getString(R.string.downloads_label));
- solo.clickOnText(solo.getString(R.string.queue_label));
- solo.clickOnText(solo.getString(R.string.confirm_label));
- solo.waitForDialogToClose();
+ onView(first(withText(R.string.queue_label))).perform(longClick());
+
+ onView(withText(R.string.downloads_label)).perform(click());
+ onView(withText(R.string.queue_label)).perform(click());
+ onView(withText(R.string.confirm_label)).perform(click());
+
hidden = UserPreferences.getHiddenDrawerItems();
assertEquals(2, hidden.size());
assertTrue(hidden.contains(QueueFragment.TAG));
assertTrue(hidden.contains(PlaybackHistoryFragment.TAG));
}
+
+ @Test
public void testDrawerPreferencesHideAllElements() {
UserPreferences.setHiddenDrawerItems(new ArrayList<>());
- String[] titles = getInstrumentation().getTargetContext().getResources().getStringArray(R.array.nav_drawer_titles);
+ String[] titles = mActivityRule.getActivity().getResources().getStringArray(R.array.nav_drawer_titles);
openNavDrawer();
- solo.clickLongOnText(solo.getString(R.string.queue_label));
- solo.waitForDialogToOpen();
+ onView(first(withText(R.string.queue_label))).perform(longClick());
for (String title : titles) {
- solo.clickOnText(title);
+ onView(first(withText(title))).perform(click());
}
- solo.clickOnText(solo.getString(R.string.confirm_label));
- solo.waitForDialogToClose();
+ onView(withText(R.string.confirm_label)).perform(click());
+
List<String> hidden = UserPreferences.getHiddenDrawerItems();
assertEquals(titles.length, hidden.size());
for (String tag : MainActivity.NAV_DRAWER_TAGS) {
@@ -208,21 +228,85 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv
}
}
+ @Test
public void testDrawerPreferencesHideCurrentElement() {
UserPreferences.setHiddenDrawerItems(new ArrayList<>());
-
openNavDrawer();
- String downloads = solo.getString(R.string.downloads_label);
- solo.clickOnText(downloads);
- solo.waitForView(android.R.id.list);
+ onView(withText(R.string.downloads_label)).perform(click());
openNavDrawer();
- solo.clickLongOnText(downloads);
- solo.waitForDialogToOpen();
- solo.clickOnText(downloads);
- solo.clickOnText(solo.getString(R.string.confirm_label));
- solo.waitForDialogToClose();
+
+ onView(first(withText(R.string.queue_label))).perform(longClick());
+ onView(first(withText(R.string.downloads_label))).perform(click());
+ onView(withText(R.string.confirm_label)).perform(click());
+
List<String> hidden = UserPreferences.getHiddenDrawerItems();
assertEquals(1, hidden.size());
assertTrue(hidden.contains(DownloadsFragment.TAG));
}
+
+ @Test
+ public void testBackButtonBehaviorGoToPage() {
+ openNavDrawer();
+ solo.clickOnText(solo.getString(R.string.settings_label));
+ solo.clickOnText(solo.getString(R.string.user_interface_label));
+ solo.clickOnText(solo.getString(R.string.pref_back_button_behavior_title));
+ solo.clickOnText(solo.getString(R.string.back_button_go_to_page));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.subscriptions_label));
+ solo.clickOnText(solo.getString(R.string.confirm_label));
+ solo.goBackToActivity(MainActivity.class.getSimpleName());
+ solo.goBack();
+ assertEquals(solo.getString(R.string.subscriptions_label), getActionbarTitle());
+ }
+
+ @Test
+ public void testBackButtonBehaviorOpenDrawer() {
+ openNavDrawer();
+ solo.clickOnText(solo.getString(R.string.settings_label));
+ solo.clickOnText(solo.getString(R.string.user_interface_label));
+ solo.clickOnText(solo.getString(R.string.pref_back_button_behavior_title));
+ solo.clickOnText(solo.getString(R.string.back_button_open_drawer));
+ solo.goBackToActivity(MainActivity.class.getSimpleName());
+ solo.goBack();
+ assertTrue(((MainActivity)solo.getCurrentActivity()).isDrawerOpen());
+ }
+
+ @Test
+ public void testBackButtonBehaviorDoubleTap() {
+ openNavDrawer();
+ solo.clickOnText(solo.getString(R.string.settings_label));
+ solo.clickOnText(solo.getString(R.string.user_interface_label));
+ solo.clickOnText(solo.getString(R.string.pref_back_button_behavior_title));
+ solo.clickOnText(solo.getString(R.string.back_button_double_tap));
+ solo.goBackToActivity(MainActivity.class.getSimpleName());
+ solo.goBack();
+ solo.goBack();
+ assertTrue(solo.getCurrentActivity().isFinishing());
+ }
+
+ @Test
+ public void testBackButtonBehaviorPrompt() {
+ openNavDrawer();
+ solo.clickOnText(solo.getString(R.string.settings_label));
+ solo.clickOnText(solo.getString(R.string.user_interface_label));
+ solo.clickOnText(solo.getString(R.string.pref_back_button_behavior_title));
+ solo.clickOnText(solo.getString(R.string.back_button_show_prompt));
+ solo.goBackToActivity(MainActivity.class.getSimpleName());
+ solo.goBack();
+ solo.clickOnText(solo.getString(R.string.yes));
+ solo.waitForDialogToClose();
+ assertTrue(solo.getCurrentActivity().isFinishing());
+ }
+
+ @Test
+ public void testBackButtonBehaviorDefault() {
+ openNavDrawer();
+ solo.clickOnText(solo.getString(R.string.settings_label));
+ solo.clickOnText(solo.getString(R.string.user_interface_label));
+ solo.clickOnText(solo.getString(R.string.pref_back_button_behavior_title));
+ solo.clickOnText(solo.getString(R.string.back_button_default));
+ solo.goBackToActivity(MainActivity.class.getSimpleName());
+ solo.goBack();
+ assertTrue(solo.getCurrentActivity().isFinishing());
+ }
}
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackSonicTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackSonicTest.java
index 293ed2848..55ed998bb 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackSonicTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackSonicTest.java
@@ -59,7 +59,7 @@ public class PlaybackSonicTest extends ActivityInstrumentationTestCase2<MainActi
.clear()
.putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false)
.putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false)
- .putBoolean(UserPreferences.PREF_SONIC, true)
+ .putString(UserPreferences.PREF_MEDIA_PLAYER, "sonic")
.commit();
solo = new Solo(getInstrumentation(), getActivity());
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java
index 9a5ea437c..f217ecffa 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/PreferencesTest.java
@@ -1,15 +1,14 @@
package de.test.antennapod.ui;
-import android.content.Context;
+import android.content.SharedPreferences;
import android.content.res.Resources;
-import android.test.ActivityInstrumentationTestCase2;
-
+import android.preference.PreferenceManager;
+import android.support.test.espresso.contrib.RecyclerViewActions;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.View;
import com.robotium.solo.Solo;
import com.robotium.solo.Timeout;
-
-import java.util.Arrays;
-import java.util.concurrent.TimeUnit;
-
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.PreferenceActivity;
import de.danoeh.antennapod.core.preferences.UserPreferences;
@@ -17,36 +16,58 @@ import de.danoeh.antennapod.core.storage.APCleanupAlgorithm;
import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm;
import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm;
import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm;
+import de.danoeh.antennapod.fragment.EpisodesFragment;
+import de.danoeh.antennapod.fragment.QueueFragment;
+import de.danoeh.antennapod.fragment.SubscriptionFragment;
-public class PreferencesTest extends ActivityInstrumentationTestCase2<PreferenceActivity> {
+import org.hamcrest.Matcher;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
- private static final String TAG = "PreferencesTest";
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+import static android.support.test.InstrumentationRegistry.getInstrumentation;
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+
+@RunWith(AndroidJUnit4.class)
+public class PreferencesTest {
private Solo solo;
- private Context context;
private Resources res;
+ private SharedPreferences prefs;
- public PreferencesTest() {
- super(PreferenceActivity.class);
- }
+ @Rule
+ public ActivityTestRule<PreferenceActivity> mActivityRule = new ActivityTestRule<>(PreferenceActivity.class);
- @Override
- public void setUp() throws Exception {
- super.setUp();
- solo = new Solo(getInstrumentation(), getActivity());
+ @Before
+ public void setUp() {
+ solo = new Solo(getInstrumentation(), mActivityRule.getActivity());
Timeout.setSmallTimeout(500);
Timeout.setLargeTimeout(1000);
- context = getInstrumentation().getTargetContext();
- res = getActivity().getResources();
- UserPreferences.init(context);
+ res = mActivityRule.getActivity().getResources();
+ UserPreferences.init(mActivityRule.getActivity());
+
+ prefs = PreferenceManager.getDefaultSharedPreferences(mActivityRule.getActivity());
+ prefs.edit().clear();
+ prefs.edit().putBoolean(UserPreferences.PREF_ENABLE_AUTODL, true).commit();
}
- @Override
- public void tearDown() throws Exception {
+ @After
+ public void tearDown() {
solo.finishOpenedActivities();
- super.tearDown();
+ prefs.edit().clear();
}
+ @Test
public void testSwitchTheme() {
final int theme = UserPreferences.getTheme();
int otherTheme;
@@ -55,13 +76,13 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
} else {
otherTheme = R.string.pref_theme_title_light;
}
- solo.clickOnText(solo.getString(R.string.user_interface_label));
- solo.clickOnText(solo.getString(R.string.pref_set_theme_title));
- solo.waitForDialogToOpen();
- solo.clickOnText(solo.getString(otherTheme));
+ clickPreference(withText(R.string.user_interface_label));
+ clickPreference(withText(R.string.pref_set_theme_title));
+ onView(withText(otherTheme)).perform(click());
assertTrue(solo.waitForCondition(() -> UserPreferences.getTheme() != theme, Timeout.getLargeTimeout()));
}
+ @Test
public void testSwitchThemeBack() {
final int theme = UserPreferences.getTheme();
int otherTheme;
@@ -70,33 +91,23 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
} else {
otherTheme = R.string.pref_theme_title_light;
}
- solo.clickOnText(solo.getString(R.string.user_interface_label));
- solo.clickOnText(solo.getString(R.string.pref_set_theme_title));
- solo.waitForDialogToOpen(1000);
- solo.clickOnText(solo.getString(otherTheme));
+ clickPreference(withText(R.string.user_interface_label));
+ clickPreference(withText(R.string.pref_set_theme_title));
+ onView(withText(otherTheme)).perform(click());
assertTrue(solo.waitForCondition(() -> UserPreferences.getTheme() != theme, Timeout.getLargeTimeout()));
}
- public void testExpandNotification() {
- solo.clickOnText(solo.getString(R.string.user_interface_label));
- final int priority = UserPreferences.getNotifyPriority();
- solo.clickOnText(solo.getString(R.string.pref_expandNotify_title));
- assertTrue(solo.waitForCondition(() -> priority != UserPreferences.getNotifyPriority(), Timeout.getLargeTimeout()));
- solo.clickOnText(solo.getString(R.string.pref_expandNotify_title));
- assertTrue(solo.waitForCondition(() -> priority == UserPreferences.getNotifyPriority(), Timeout.getLargeTimeout()));
- }
-
+ @Test
public void testEnablePersistentPlaybackControls() {
- solo.clickOnText(solo.getString(R.string.user_interface_label));
final boolean persistNotify = UserPreferences.isPersistNotify();
- solo.scrollDown();
- solo.scrollDown();
- solo.clickOnText(solo.getString(R.string.pref_persistNotify_title));
+ clickPreference(withText(R.string.user_interface_label));
+ clickPreference(withText(R.string.pref_persistNotify_title));
assertTrue(solo.waitForCondition(() -> persistNotify != UserPreferences.isPersistNotify(), Timeout.getLargeTimeout()));
- solo.clickOnText(solo.getString(R.string.pref_persistNotify_title));
+ clickPreference(withText(R.string.pref_persistNotify_title));
assertTrue(solo.waitForCondition(() -> persistNotify == UserPreferences.isPersistNotify(), Timeout.getLargeTimeout()));
}
+ @Test
public void testSetLockscreenButtons() {
solo.clickOnText(solo.getString(R.string.user_interface_label));
solo.scrollDown();
@@ -123,6 +134,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> !UserPreferences.showSkipOnCompactNotification(), Timeout.getLargeTimeout()));
}
+ @Test
public void testEnqueueAtFront() {
solo.clickOnText(solo.getString(R.string.playback_pref));
final boolean enqueueAtFront = UserPreferences.enqueueAtFront();
@@ -134,6 +146,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> enqueueAtFront == UserPreferences.enqueueAtFront(), Timeout.getLargeTimeout()));
}
+ @Test
public void testHeadPhonesDisconnect() {
solo.clickOnText(solo.getString(R.string.playback_pref));
final boolean pauseOnHeadsetDisconnect = UserPreferences.isPauseOnHeadsetDisconnect();
@@ -143,6 +156,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> pauseOnHeadsetDisconnect == UserPreferences.isPauseOnHeadsetDisconnect(), Timeout.getLargeTimeout()));
}
+ @Test
public void testHeadPhonesReconnect() {
solo.clickOnText(solo.getString(R.string.playback_pref));
if(UserPreferences.isPauseOnHeadsetDisconnect() == false) {
@@ -156,6 +170,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> unpauseOnHeadsetReconnect == UserPreferences.isUnpauseOnHeadsetReconnect(), Timeout.getLargeTimeout()));
}
+ @Test
public void testBluetoothReconnect() {
solo.clickOnText(solo.getString(R.string.playback_pref));
if(UserPreferences.isPauseOnHeadsetDisconnect() == false) {
@@ -169,6 +184,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> unpauseOnBluetoothReconnect == UserPreferences.isUnpauseOnBluetoothReconnect(), Timeout.getLargeTimeout()));
}
+ @Test
public void testContinuousPlayback() {
solo.clickOnText(solo.getString(R.string.playback_pref));
final boolean continuousPlayback = UserPreferences.isFollowQueue();
@@ -180,6 +196,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> continuousPlayback == UserPreferences.isFollowQueue(), Timeout.getLargeTimeout()));
}
+ @Test
public void testAutoDelete() {
solo.clickOnText(solo.getString(R.string.storage_pref));
final boolean autoDelete = UserPreferences.isAutoDelete();
@@ -189,17 +206,15 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> autoDelete == UserPreferences.isAutoDelete(), Timeout.getLargeTimeout()));
}
+ @Test
public void testPlaybackSpeeds() {
- solo.clickOnText(solo.getString(R.string.playback_pref));
- solo.scrollDown();
- solo.scrollDown();
- solo.clickOnText(solo.getString(R.string.pref_playback_speed_title));
- solo.waitForDialogToOpen(1000);
+ clickPreference(withText(R.string.playback_pref));
+ clickPreference(withText(R.string.pref_playback_speed_title));
assertTrue(solo.searchText(res.getStringArray(R.array.playback_speed_values)[0]));
- solo.clickOnText(solo.getString(R.string.cancel_label));
- solo.waitForDialogToClose(1000);
+ onView(withText(R.string.cancel_label)).perform(click());
}
+ @Test
public void testPauseForInterruptions() {
solo.clickOnText(solo.getString(R.string.playback_pref));
final boolean pauseForFocusLoss = UserPreferences.shouldPauseForFocusLoss();
@@ -209,6 +224,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> pauseForFocusLoss == UserPreferences.shouldPauseForFocusLoss(), Timeout.getLargeTimeout()));
}
+ @Test
public void testDisableUpdateInterval() {
solo.clickOnText(solo.getString(R.string.network_pref));
solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervallOrTime_sum));
@@ -217,31 +233,31 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> UserPreferences.getUpdateInterval() == 0, 1000));
}
+ @Test
public void testSetUpdateInterval() {
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervallOrTime_title));
- solo.waitForDialogToOpen();
- solo.clickOnText(solo.getString(R.string.pref_autoUpdateIntervallOrTime_Interval));
- solo.waitForDialogToOpen();
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_autoUpdateIntervallOrTime_title));
+ onView(withText(R.string.pref_autoUpdateIntervallOrTime_Interval)).perform(click());
String search = "12 " + solo.getString(R.string.pref_update_interval_hours_plural);
- solo.clickOnText(search);
- solo.waitForDialogToClose();
+ onView(withText(search)).perform(click());
assertTrue(solo.waitForCondition(() -> UserPreferences.getUpdateInterval() ==
TimeUnit.HOURS.toMillis(12), Timeout.getLargeTimeout()));
}
+ @Test
public void testMobileUpdates() {
- solo.clickOnText(solo.getString(R.string.network_pref));
+ clickPreference(withText(R.string.network_pref));
final boolean mobileUpdates = UserPreferences.isAllowMobileUpdate();
- solo.clickOnText(solo.getString(R.string.pref_mobileUpdate_title));
+ clickPreference(withText(R.string.pref_mobileUpdate_title));
assertTrue(solo.waitForCondition(() -> mobileUpdates != UserPreferences.isAllowMobileUpdate(), Timeout.getLargeTimeout()));
- solo.clickOnText(solo.getString(R.string.pref_mobileUpdate_title));
+ clickPreference(withText(R.string.pref_mobileUpdate_title));
assertTrue(solo.waitForCondition(() -> mobileUpdates == UserPreferences.isAllowMobileUpdate(), Timeout.getLargeTimeout()));
}
+ @Test
public void testSetSequentialDownload() {
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_parallel_downloads_title));
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_parallel_downloads_title));
solo.waitForDialogToOpen();
solo.clearEditText(0);
solo.enterText(0, "1");
@@ -249,9 +265,10 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> UserPreferences.getParallelDownloads() == 1, Timeout.getLargeTimeout()));
}
+ @Test
public void testSetParallelDownloads() {
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_parallel_downloads_title));
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_parallel_downloads_title));
solo.waitForDialogToOpen();
solo.clearEditText(0);
solo.enterText(0, "10");
@@ -259,50 +276,50 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> UserPreferences.getParallelDownloads() == 10, Timeout.getLargeTimeout()));
}
+ @Test
public void testSetParallelDownloadsInvalidInput() {
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_parallel_downloads_title));
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_parallel_downloads_title));
solo.waitForDialogToOpen();
solo.clearEditText(0);
solo.enterText(0, "0");
- assertEquals("1", solo.getEditText(0).getText().toString());
+ assertEquals("", solo.getEditText(0).getText().toString());
solo.clearEditText(0);
solo.enterText(0, "100");
- assertEquals("50", solo.getEditText(0).getText().toString());
+ assertEquals("", solo.getEditText(0).getText().toString());
}
+ @Test
public void testSetEpisodeCache() {
String[] entries = res.getStringArray(R.array.episode_cache_size_entries);
String[] values = res.getStringArray(R.array.episode_cache_size_values);
String entry = entries[entries.length/2];
final int value = Integer.valueOf(values[values.length/2]);
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
- solo.waitForText(solo.getString(R.string.pref_automatic_download_title));
- solo.clickOnText(solo.getString(R.string.pref_episode_cache_title));
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_automatic_download_title));
+ clickPreference(withText(R.string.pref_episode_cache_title));
solo.waitForDialogToOpen();
solo.clickOnText(entry);
assertTrue(solo.waitForCondition(() -> UserPreferences.getEpisodeCacheSize() == value, Timeout.getLargeTimeout()));
}
+ @Test
public void testSetEpisodeCacheMin() {
String[] entries = res.getStringArray(R.array.episode_cache_size_entries);
String[] values = res.getStringArray(R.array.episode_cache_size_values);
String minEntry = entries[0];
final int minValue = Integer.valueOf(values[0]);
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
- solo.waitForText(solo.getString(R.string.pref_automatic_download_title));
- if(!UserPreferences.isEnableAutodownload()) {
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
- }
- solo.clickOnText(solo.getString(R.string.pref_episode_cache_title));
+
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_automatic_download_title));
+ clickPreference(withText(R.string.pref_episode_cache_title));
solo.waitForDialogToOpen(1000);
solo.scrollUp();
solo.clickOnText(minEntry);
assertTrue(solo.waitForCondition(() -> UserPreferences.getEpisodeCacheSize() == minValue, Timeout.getLargeTimeout()));
}
+ @Test
public void testSetEpisodeCacheMax() {
String[] entries = res.getStringArray(R.array.episode_cache_size_entries);
String[] values = res.getStringArray(R.array.episode_cache_size_values);
@@ -311,24 +328,22 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
solo.clickOnText(solo.getString(R.string.network_pref));
solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
solo.waitForText(solo.getString(R.string.pref_automatic_download_title));
- if(!UserPreferences.isEnableAutodownload()) {
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
- }
solo.clickOnText(solo.getString(R.string.pref_episode_cache_title));
solo.waitForDialogToOpen();
solo.clickOnText(maxEntry);
assertTrue(solo.waitForCondition(() -> UserPreferences.getEpisodeCacheSize() == maxValue, Timeout.getLargeTimeout()));
}
+ @Test
public void testAutomaticDownload() {
final boolean automaticDownload = UserPreferences.isEnableAutodownload();
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
- solo.waitForText(solo.getString(R.string.pref_automatic_download_title));
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_automatic_download_title));
+ clickPreference(withText(R.string.pref_automatic_download_title));
+
assertTrue(solo.waitForCondition(() -> automaticDownload != UserPreferences.isEnableAutodownload(), Timeout.getLargeTimeout()));
if(UserPreferences.isEnableAutodownload() == false) {
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
+ clickPreference(withText(R.string.pref_automatic_download_title));
}
assertTrue(solo.waitForCondition(() -> UserPreferences.isEnableAutodownload() == true, Timeout.getLargeTimeout()));
final boolean enableAutodownloadOnBattery = UserPreferences.isEnableAutodownloadOnBattery();
@@ -343,6 +358,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
assertTrue(solo.waitForCondition(() -> enableWifiFilter == UserPreferences.isEnableAutodownloadWifiFilter(), Timeout.getLargeTimeout()));
}
+ @Test
public void testEpisodeCleanupQueueOnly() {
solo.clickOnText(solo.getString(R.string.network_pref));
solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
@@ -356,6 +372,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
Timeout.getLargeTimeout()));
}
+ @Test
public void testEpisodeCleanupNeverAlg() {
solo.clickOnText(solo.getString(R.string.network_pref));
solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
@@ -369,6 +386,7 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
Timeout.getLargeTimeout()));
}
+ @Test
public void testEpisodeCleanupClassic() {
solo.clickOnText(solo.getString(R.string.network_pref));
solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
@@ -386,12 +404,14 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
Timeout.getLargeTimeout()));
}
+ @Test
public void testEpisodeCleanupNumDays() {
- solo.clickOnText(solo.getString(R.string.network_pref));
- solo.clickOnText(solo.getString(R.string.pref_automatic_download_title));
- solo.clickOnText(solo.getString(R.string.pref_episode_cleanup_title));
- solo.waitForText(solo.getString(R.string.episode_cleanup_after_listening));
- solo.clickOnText("5");
+ clickPreference(withText(R.string.network_pref));
+ clickPreference(withText(R.string.pref_automatic_download_title));
+ clickPreference(withText(R.string.pref_episode_cleanup_title));
+ solo.waitForDialogToOpen();
+ String search = res.getQuantityString(R.plurals.episode_cleanup_days_after_listening, 5, 5);
+ onView(withText(search)).perform(click());
assertTrue(solo.waitForCondition(() -> {
EpisodeCleanupAlgorithm alg = UserPreferences.getEpisodeCleanupAlgorithm();
if (alg instanceof APCleanupAlgorithm) {
@@ -403,15 +423,13 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
Timeout.getLargeTimeout()));
}
-
+ @Test
public void testRewindChange() {
int seconds = UserPreferences.getRewindSecs();
int deltas[] = res.getIntArray(R.array.seek_delta_values);
- solo.clickOnText(solo.getString(R.string.playback_pref));
- solo.scrollDown();
- solo.scrollDown();
- solo.clickOnText(solo.getString(R.string.pref_rewind));
+ clickPreference(withText(R.string.playback_pref));
+ clickPreference(withText(R.string.pref_rewind));
solo.waitForDialogToOpen();
int currentIndex = Arrays.binarySearch(deltas, seconds);
@@ -419,24 +437,22 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
// Find next value (wrapping around to next)
int newIndex = (currentIndex + 1) % deltas.length;
-
- solo.clickOnText(String.valueOf(deltas[newIndex]) + " seconds");
- solo.clickOnButton("Confirm");
+ onView(withText(String.valueOf(deltas[newIndex]) + " seconds")).perform(click());
+ onView(withText("Confirm")).perform(click());
solo.waitForDialogToClose();
assertTrue(solo.waitForCondition(() -> UserPreferences.getRewindSecs() == deltas[newIndex],
Timeout.getLargeTimeout()));
}
+ @Test
public void testFastForwardChange() {
- solo.clickOnText(solo.getString(R.string.playback_pref));
- solo.scrollDown();
- solo.scrollDown();
+ clickPreference(withText(R.string.playback_pref));
for (int i = 2; i > 0; i--) { // repeat twice to catch any error where fastforward is tracking rewind
int seconds = UserPreferences.getFastForwardSecs();
int deltas[] = res.getIntArray(R.array.seek_delta_values);
- solo.clickOnText(solo.getString(R.string.pref_fast_forward));
+ clickPreference(withText(R.string.pref_fast_forward));
solo.waitForDialogToOpen();
int currentIndex = Arrays.binarySearch(deltas, seconds);
@@ -445,12 +461,52 @@ public class PreferencesTest extends ActivityInstrumentationTestCase2<Preference
// Find next value (wrapping around to next)
int newIndex = (currentIndex + 1) % deltas.length;
- solo.clickOnText(String.valueOf(deltas[newIndex]) + " seconds");
- solo.clickOnButton("Confirm");
+ onView(withText(String.valueOf(deltas[newIndex]) + " seconds")).perform(click());
+ onView(withText("Confirm")).perform(click());
solo.waitForDialogToClose();
assertTrue(solo.waitForCondition(() -> UserPreferences.getFastForwardSecs() == deltas[newIndex],
Timeout.getLargeTimeout()));
}
}
+
+ @Test
+ public void testBackButtonBehaviorGoToPageSelector() {
+ clickPreference(withText(R.string.user_interface_label));
+ clickPreference(withText(R.string.pref_back_button_behavior_title));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.back_button_go_to_page));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.queue_label));
+ solo.clickOnText(solo.getString(R.string.confirm_label));
+ assertTrue(solo.waitForCondition(() -> UserPreferences.getBackButtonBehavior() == UserPreferences.BackButtonBehavior.GO_TO_PAGE,
+ Timeout.getLargeTimeout()));
+ assertTrue(solo.waitForCondition(() -> UserPreferences.getBackButtonGoToPage().equals(QueueFragment.TAG),
+ Timeout.getLargeTimeout()));
+ clickPreference(withText(R.string.pref_back_button_behavior_title));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.back_button_go_to_page));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.episodes_label));
+ solo.clickOnText(solo.getString(R.string.confirm_label));
+ assertTrue(solo.waitForCondition(() -> UserPreferences.getBackButtonBehavior() == UserPreferences.BackButtonBehavior.GO_TO_PAGE,
+ Timeout.getLargeTimeout()));
+ assertTrue(solo.waitForCondition(() -> UserPreferences.getBackButtonGoToPage().equals(EpisodesFragment.TAG),
+ Timeout.getLargeTimeout()));
+ clickPreference(withText(R.string.pref_back_button_behavior_title));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.back_button_go_to_page));
+ solo.waitForDialogToOpen();
+ solo.clickOnText(solo.getString(R.string.subscriptions_label));
+ solo.clickOnText(solo.getString(R.string.confirm_label));
+ assertTrue(solo.waitForCondition(() -> UserPreferences.getBackButtonBehavior() == UserPreferences.BackButtonBehavior.GO_TO_PAGE,
+ Timeout.getLargeTimeout()));
+ assertTrue(solo.waitForCondition(() -> UserPreferences.getBackButtonGoToPage().equals(SubscriptionFragment.TAG),
+ Timeout.getLargeTimeout()));
+ }
+
+ private void clickPreference(Matcher<View> matcher) {
+ onView(withId(R.id.list))
+ .perform(RecyclerViewActions.actionOnItem(hasDescendant(matcher), click()));
+ }
}
diff --git a/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java b/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java
index 7f6f0fb0f..89542d222 100644
--- a/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java
+++ b/app/src/androidTest/java/de/test/antennapod/util/syndication/feedgenerator/GeneratorUtil.java
@@ -8,6 +8,7 @@ import java.io.IOException;
* Utility methods for FeedGenerator
*/
class GeneratorUtil {
+ private GeneratorUtil(){}
public static void addPaymentLink(XmlSerializer xml, String paymentLink, boolean withNamespace) throws IOException {
String ns = (withNamespace) ? "http://www.w3.org/2005/Atom" : null;
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8cbbc4cbf..c3310721f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.danoeh.antennapod"
android:installLocation="auto"
- android:versionCode="1060690"
- android:versionName="1.6.6-RC1">
+ android:versionCode="1070195"
+ android:versionName="1.7.1">
<!--
Version code schema:
"1.2.3-SNAPSHOT" -> 1020300
diff --git a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
index 3abf7557a..fde9af16f 100644
--- a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
+++ b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java
@@ -20,7 +20,7 @@ public class PodcastApp extends Application {
try {
Class.forName("de.danoeh.antennapod.config.ClientConfigurator");
} catch (Exception e) {
- throw new RuntimeException("ClientConfigurator not found");
+ throw new RuntimeException("ClientConfigurator not found", e);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/AboutActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/AboutActivity.java
index 6cbfbc6a7..2270c144c 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/AboutActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/AboutActivity.java
@@ -43,8 +43,8 @@ public class AboutActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayShowHomeEnabled(true);
setContentView(R.layout.about);
- webViewContainer = (LinearLayout) findViewById(R.id.webViewContainer);
- webView = (WebView) findViewById(R.id.webViewAbout);
+ webViewContainer = findViewById(R.id.webViewContainer);
+ webView = findViewById(R.id.webViewAbout);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
if (UserPreferences.getTheme() == R.style.Theme_AntennaPod_Dark) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/DirectoryChooserActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/DirectoryChooserActivity.java
index 390d4cef8..33def125e 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/DirectoryChooserActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/DirectoryChooserActivity.java
@@ -64,11 +64,11 @@ public class DirectoryChooserActivity extends AppCompatActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.directory_chooser);
- butConfirm = (Button) findViewById(R.id.butConfirm);
- butCancel = (Button) findViewById(R.id.butCancel);
- butNavUp = (ImageButton) findViewById(R.id.butNavUp);
- txtvSelectedFolder = (TextView) findViewById(R.id.txtvSelectedFolder);
- listDirectories = (ListView) findViewById(R.id.directory_list);
+ butConfirm = findViewById(R.id.butConfirm);
+ butCancel = findViewById(R.id.butCancel);
+ butNavUp = findViewById(R.id.butNavUp);
+ txtvSelectedFolder = findViewById(R.id.txtvSelectedFolder);
+ listDirectories = findViewById(R.id.directory_list);
butConfirm.setOnClickListener(new OnClickListener() {
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java
index e726afaec..5e04d743d 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/DownloadAuthenticationActivity.java
@@ -49,11 +49,11 @@ public class DownloadAuthenticationActivity extends AppCompatActivity {
}
setContentView(R.layout.download_authentication_activity);
- TextView txtvDescription = (TextView) findViewById(R.id.txtvDescription);
- etxtUsername = (EditText) findViewById(R.id.etxtUsername);
- etxtPassword = (EditText) findViewById(R.id.etxtPassword);
- Button butConfirm = (Button) findViewById(R.id.butConfirm);
- Button butCancel = (Button) findViewById(R.id.butCancel);
+ TextView txtvDescription = findViewById(R.id.txtvDescription);
+ etxtUsername = findViewById(R.id.etxtUsername);
+ etxtPassword = findViewById(R.id.etxtPassword);
+ Button butConfirm = findViewById(R.id.butConfirm);
+ Button butCancel = findViewById(R.id.butCancel);
Validate.isTrue(getIntent().hasExtra(ARG_DOWNLOAD_REQUEST), "Download request missing");
DownloadRequest request = getIntent().getParcelableExtra(ARG_DOWNLOAD_REQUEST);
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java
index ebb826287..f6a878873 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java
@@ -86,22 +86,22 @@ public class FeedInfoActivity extends AppCompatActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
long feedId = getIntent().getLongExtra(EXTRA_FEED_ID, -1);
- imgvCover = (ImageView) findViewById(R.id.imgvCover);
- txtvTitle = (TextView) findViewById(R.id.txtvTitle);
- TextView txtvAuthorHeader = (TextView) findViewById(R.id.txtvAuthor);
- ImageView imgvBackground = (ImageView) findViewById(R.id.imgvBackground);
+ imgvCover = findViewById(R.id.imgvCover);
+ txtvTitle = findViewById(R.id.txtvTitle);
+ TextView txtvAuthorHeader = findViewById(R.id.txtvAuthor);
+ ImageView imgvBackground = findViewById(R.id.imgvBackground);
findViewById(R.id.butShowInfo).setVisibility(View.INVISIBLE);
findViewById(R.id.butShowSettings).setVisibility(View.INVISIBLE);
// https://github.com/bumptech/glide/issues/529
imgvBackground.setColorFilter(new LightingColorFilter(0xff828282, 0x000000));
- txtvDescription = (TextView) findViewById(R.id.txtvDescription);
- lblLanguage = (TextView) findViewById(R.id.lblLanguage);
- txtvLanguage = (TextView) findViewById(R.id.txtvLanguage);
- lblAuthor = (TextView) findViewById(R.id.lblAuthor);
- txtvAuthor = (TextView) findViewById(R.id.txtvDetailsAuthor);
- txtvUrl = (TextView) findViewById(R.id.txtvUrl);
+ txtvDescription = findViewById(R.id.txtvDescription);
+ lblLanguage = findViewById(R.id.lblLanguage);
+ txtvLanguage = findViewById(R.id.txtvLanguage);
+ lblAuthor = findViewById(R.id.lblAuthor);
+ txtvAuthor = findViewById(R.id.txtvDetailsAuthor);
+ txtvUrl = findViewById(R.id.txtvUrl);
txtvUrl.setOnClickListener(copyUrlToClipboard);
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java
index 0a724d149..fcda186ad 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java
@@ -112,27 +112,27 @@ public class FeedSettingsActivity extends AppCompatActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
long feedId = getIntent().getLongExtra(EXTRA_FEED_ID, -1);
- imgvCover = (ImageView) findViewById(R.id.imgvCover);
- txtvTitle = (TextView) findViewById(R.id.txtvTitle);
- TextView txtvAuthorHeader = (TextView) findViewById(R.id.txtvAuthor);
- ImageView imgvBackground = (ImageView) findViewById(R.id.imgvBackground);
+ imgvCover = findViewById(R.id.imgvCover);
+ txtvTitle = findViewById(R.id.txtvTitle);
+ TextView txtvAuthorHeader = findViewById(R.id.txtvAuthor);
+ ImageView imgvBackground = findViewById(R.id.imgvBackground);
findViewById(R.id.butShowInfo).setVisibility(View.INVISIBLE);
findViewById(R.id.butShowSettings).setVisibility(View.INVISIBLE);
// https://github.com/bumptech/glide/issues/529
imgvBackground.setColorFilter(new LightingColorFilter(0xff828282, 0x000000));
- cbxAutoDownload = (CheckBox) findViewById(R.id.cbxAutoDownload);
- cbxKeepUpdated = (CheckBox) findViewById(R.id.cbxKeepUpdated);
- spnAutoDelete = (Spinner) findViewById(R.id.spnAutoDelete);
- etxtUsername = (EditText) findViewById(R.id.etxtUsername);
- etxtPassword = (EditText) findViewById(R.id.etxtPassword);
- etxtFilterText = (EditText) findViewById(R.id.etxtEpisodeFilterText);
- rdoFilterInclude = (RadioButton) findViewById(R.id.radio_filter_include);
+ cbxAutoDownload = findViewById(R.id.cbxAutoDownload);
+ cbxKeepUpdated = findViewById(R.id.cbxKeepUpdated);
+ spnAutoDelete = findViewById(R.id.spnAutoDelete);
+ etxtUsername = findViewById(R.id.etxtUsername);
+ etxtPassword = findViewById(R.id.etxtPassword);
+ etxtFilterText = findViewById(R.id.etxtEpisodeFilterText);
+ rdoFilterInclude = findViewById(R.id.radio_filter_include);
rdoFilterInclude.setOnClickListener(v -> {
filterInclude = true;
filterTextChanged = true;
});
- rdoFilterExclude = (RadioButton) findViewById(R.id.radio_filter_exclude);
+ rdoFilterExclude = findViewById(R.id.radio_filter_exclude);
rdoFilterExclude.setOnClickListener(v -> {
filterInclude = false;
filterTextChanged = true;
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java
index 26352f58f..2b4384a02 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java
@@ -41,9 +41,9 @@ public class FlattrAuthActivity extends AppCompatActivity {
if (BuildConfig.DEBUG) Log.d(TAG, "Activity created");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.flattr_auth);
- txtvExplanation = (TextView) findViewById(R.id.txtvExplanation);
- butAuthenticate = (Button) findViewById(R.id.but_authenticate);
- butReturn = (Button) findViewById(R.id.but_return_home);
+ txtvExplanation = findViewById(R.id.txtvExplanation);
+ butAuthenticate = findViewById(R.id.but_authenticate);
+ butReturn = findViewById(R.id.but_return_home);
butReturn.setOnClickListener(v -> {
Intent intent = new Intent(FlattrAuthActivity.this, MainActivity.class);
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java
index 91462bce9..e6c9c37cc 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java
@@ -13,9 +13,7 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MenuItem;
-import de.danoeh.antennapod.R;
-import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.core.storage.PodDBAdapter;
+
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
@@ -26,6 +24,10 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.storage.PodDBAdapter;
+
/**
* Displays the 'import/export' screen
*/
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 71f18ec01..35c468b53 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java
@@ -27,6 +27,7 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
+import android.widget.Toast;
import com.bumptech.glide.Glide;
@@ -123,6 +124,8 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi
private Disposable disposable;
+ private long lastBackButtonPressTime = 0;
+
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(UserPreferences.getNoTitleTheme());
@@ -130,7 +133,7 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi
StorageUtils.checkStorageAvailability(this);
setContentView(R.layout.main);
- toolbar = (Toolbar) findViewById(R.id.toolbar);
+ toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@@ -142,8 +145,8 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi
currentTitle = getTitle();
- drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
- navList = (ListView) findViewById(R.id.nav_list);
+ drawerLayout = findViewById(R.id.drawer_layout);
+ navList = findViewById(R.id.nav_list);
navDrawer = findViewById(R.id.nav_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close);
@@ -643,10 +646,40 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi
@Override
public void onBackPressed() {
- if(isDrawerOpen()) {
+ if (isDrawerOpen()) {
drawerLayout.closeDrawer(navDrawer);
- } else {
+ } else if (getSupportFragmentManager().getBackStackEntryCount() != 0) {
super.onBackPressed();
+ } else {
+ switch (UserPreferences.getBackButtonBehavior()) {
+ case OPEN_DRAWER:
+ drawerLayout.openDrawer(navDrawer);
+ break;
+ case SHOW_PROMPT:
+ new AlertDialog.Builder(this)
+ .setMessage(R.string.close_prompt)
+ .setPositiveButton(R.string.yes, (dialogInterface, i) -> MainActivity.super.onBackPressed())
+ .setNegativeButton(R.string.no, null)
+ .setCancelable(false)
+ .show();
+ break;
+ case DOUBLE_TAP:
+ if (lastBackButtonPressTime < System.currentTimeMillis() - 2000) {
+ Toast.makeText(this, R.string.double_tap_toast, Toast.LENGTH_SHORT).show();
+ lastBackButtonPressTime = System.currentTimeMillis();
+ } else {
+ super.onBackPressed();
+ }
+ break;
+ case GO_TO_PAGE:
+ if (getLastNavFragment().equals(UserPreferences.getBackButtonGoToPage())) {
+ super.onBackPressed();
+ } else {
+ loadFragment(UserPreferences.getBackButtonGoToPage(), null);
+ }
+ break;
+ default: super.onBackPressed();
+ }
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java
index 09d2c447d..165cb7679 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java
@@ -234,7 +234,6 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
Log.d(TAG, "onCreate()");
StorageUtils.checkStorageAvailability(this);
- orientation = getResources().getConfiguration().orientation;
getWindow().setFormat(PixelFormat.TRANSPARENT);
}
@@ -268,15 +267,10 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
private void onBufferUpdate(float progress) {
if (sbPosition != null) {
- sbPosition.setSecondaryProgress((int) progress * sbPosition.getMax());
+ sbPosition.setSecondaryProgress((int) (progress * sbPosition.getMax()));
}
}
- /**
- * Current screen orientation.
- */
- private int orientation;
-
@Override
protected void onStart() {
super.onStart();
@@ -808,13 +802,13 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
void setupGUI() {
setContentView(getContentViewResourceId());
- sbPosition = (SeekBar) findViewById(R.id.sbPosition);
- txtvPosition = (TextView) findViewById(R.id.txtvPosition);
+ sbPosition = findViewById(R.id.sbPosition);
+ txtvPosition = findViewById(R.id.txtvPosition);
SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
showTimeLeft = prefs.getBoolean(PREF_SHOW_TIME_LEFT, false);
Log.d("timeleft", showTimeLeft ? "true" : "false");
- txtvLength = (TextView) findViewById(R.id.txtvLength);
+ txtvLength = findViewById(R.id.txtvLength);
if (txtvLength != null) {
txtvLength.setOnClickListener(v -> {
showTimeLeft = !showTimeLeft;
@@ -838,18 +832,18 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
});
}
- butRev = (ImageButton) findViewById(R.id.butRev);
- txtvRev = (TextView) findViewById(R.id.txtvRev);
+ butRev = findViewById(R.id.butRev);
+ txtvRev = findViewById(R.id.txtvRev);
if (txtvRev != null) {
txtvRev.setText(String.valueOf(UserPreferences.getRewindSecs()));
}
- butPlay = (ImageButton) findViewById(R.id.butPlay);
- butFF = (ImageButton) findViewById(R.id.butFF);
- txtvFF = (TextView) findViewById(R.id.txtvFF);
+ butPlay = findViewById(R.id.butPlay);
+ butFF = findViewById(R.id.butFF);
+ txtvFF = findViewById(R.id.txtvFF);
if (txtvFF != null) {
txtvFF.setText(String.valueOf(UserPreferences.getFastForwardSecs()));
}
- butSkip = (ImageButton) findViewById(R.id.butSkip);
+ butSkip = findViewById(R.id.butSkip);
// SEEKBAR SETUP
@@ -1002,7 +996,7 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
}
@Override
- public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+ public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_STORAGE) {
if (grantResults.length <= 0 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, R.string.needs_storage_permission, Toast.LENGTH_LONG).show();
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
index feac289cc..e549f0115 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
@@ -227,18 +227,18 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem
@Override
protected void setupGUI() {
super.setupGUI();
- Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
findViewById(R.id.shadow).setVisibility(View.GONE);
- AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.appBar);
+ AppBarLayout appBarLayout = findViewById(R.id.appBar);
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics());
appBarLayout.setElevation(px);
}
- drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
- navList = (ListView) findViewById(R.id.nav_list);
+ drawerLayout = findViewById(R.id.drawer_layout);
+ navList = findViewById(R.id.nav_list);
navDrawer = findViewById(R.id.nav_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.drawer_open, R.string.drawer_close);
@@ -274,14 +274,14 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem
startActivity(new Intent(MediaplayerInfoActivity.this, PreferenceActivity.class));
});
- butPlaybackSpeed = (Button) findViewById(R.id.butPlaybackSpeed);
- butCastDisconnect = (ImageButton) findViewById(R.id.butCastDisconnect);
+ butPlaybackSpeed = findViewById(R.id.butPlaybackSpeed);
+ butCastDisconnect = findViewById(R.id.butCastDisconnect);
- pager = (ViewPager) findViewById(R.id.pager);
+ pager = findViewById(R.id.pager);
pagerAdapter = new MediaplayerInfoPagerAdapter(getSupportFragmentManager(), media);
pagerAdapter.setController(controller);
pager.setAdapter(pagerAdapter);
- CirclePageIndicator pageIndicator = (CirclePageIndicator) findViewById(R.id.page_indicator);
+ CirclePageIndicator pageIndicator = findViewById(R.id.page_indicator);
pageIndicator.setViewPager(pager);
loadLastFragment();
pager.onSaveInstanceState();
@@ -357,7 +357,7 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- return drawerToggle != null && drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
+ return (drawerToggle != null && drawerToggle.onOptionsItemSelected(item)) || super.onOptionsItemSelected(item);
}
@Override
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 ea063e47d..55128e1fe 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -144,7 +144,7 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
feedUrl = getIntent().getStringExtra(ARG_FEEDURL);
} else if (TextUtils.equals(getIntent().getAction(), Intent.ACTION_SEND)
|| TextUtils.equals(getIntent().getAction(), Intent.ACTION_VIEW)) {
- feedUrl = (TextUtils.equals(getIntent().getAction(), Intent.ACTION_SEND))
+ feedUrl = TextUtils.equals(getIntent().getAction(), Intent.ACTION_SEND)
? getIntent().getStringExtra(Intent.EXTRA_TEXT) : getIntent().getDataString();
if (actionBar != null) {
actionBar.setTitle(R.string.add_feed_label);
@@ -306,7 +306,7 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
}
private void parseFeed() {
- if (feed == null || feed.getFile_url() == null && feed.isDownloaded()) {
+ if (feed == null || (feed.getFile_url() == null && feed.isDownloaded())) {
throw new IllegalStateException("feed must be non-null and downloaded when parseFeed is called");
}
Log.d(TAG, "Parsing feed");
@@ -379,20 +379,20 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
this.feed = feed;
this.selectedDownloadUrl = feed.getDownload_url();
EventDistributor.getInstance().register(listener);
- ListView listView = (ListView) findViewById(R.id.listview);
+ ListView listView = findViewById(R.id.listview);
LayoutInflater inflater = LayoutInflater.from(this);
View header = inflater.inflate(R.layout.onlinefeedview_header, listView, false);
listView.addHeaderView(header);
listView.setAdapter(new FeedItemlistDescriptionAdapter(this, 0, feed.getItems()));
- ImageView cover = (ImageView) header.findViewById(R.id.imgvCover);
- TextView title = (TextView) header.findViewById(R.id.txtvTitle);
- TextView author = (TextView) header.findViewById(R.id.txtvAuthor);
- TextView description = (TextView) header.findViewById(R.id.txtvDescription);
- Spinner spAlternateUrls = (Spinner) header.findViewById(R.id.spinnerAlternateUrls);
+ ImageView cover = header.findViewById(R.id.imgvCover);
+ TextView title = header.findViewById(R.id.txtvTitle);
+ TextView author = header.findViewById(R.id.txtvAuthor);
+ TextView description = header.findViewById(R.id.txtvDescription);
+ Spinner spAlternateUrls = header.findViewById(R.id.spinnerAlternateUrls);
- subscribeButton = (Button) header.findViewById(R.id.butSubscribe);
+ subscribeButton = header.findViewById(R.id.butSubscribe);
if (StringUtils.isNotBlank(feed.getImageUrl())) {
Glide.with(this)
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlFeedChooserActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlFeedChooserActivity.java
index cd375a65a..72759c59c 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlFeedChooserActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlFeedChooserActivity.java
@@ -39,9 +39,9 @@ public class OpmlFeedChooserActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.opml_selection);
- butConfirm = (Button) findViewById(R.id.butConfirm);
- butCancel = (Button) findViewById(R.id.butCancel);
- feedlist = (ListView) findViewById(R.id.feedlist);
+ butConfirm = findViewById(R.id.butConfirm);
+ butCancel = findViewById(R.id.butCancel);
+ feedlist = findViewById(R.id.feedlist);
feedlist.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listAdapter = new ArrayAdapter<>(this,
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java
index ed7ab5d34..a63d3b735 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java
@@ -36,16 +36,16 @@ public class OpmlImportFromPathActivity extends OpmlImportBaseActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.opml_import);
- final TextView txtvHeaderExplanation1 = (TextView) findViewById(R.id.txtvHeadingExplanation1);
- final TextView txtvExplanation1 = (TextView) findViewById(R.id.txtvExplanation1);
- final TextView txtvHeaderExplanation2 = (TextView) findViewById(R.id.txtvHeadingExplanation2);
- final TextView txtvExplanation2 = (TextView) findViewById(R.id.txtvExplanation2);
- final TextView txtvHeaderExplanation3 = (TextView) findViewById(R.id.txtvHeadingExplanation3);
+ final TextView txtvHeaderExplanation1 = findViewById(R.id.txtvHeadingExplanation1);
+ final TextView txtvExplanation1 = findViewById(R.id.txtvExplanation1);
+ final TextView txtvHeaderExplanation2 = findViewById(R.id.txtvHeadingExplanation2);
+ final TextView txtvExplanation2 = findViewById(R.id.txtvExplanation2);
+ final TextView txtvHeaderExplanation3 = findViewById(R.id.txtvHeadingExplanation3);
- Button butChooseFilesystem = (Button) findViewById(R.id.butChooseFileFromFilesystem);
+ Button butChooseFilesystem = findViewById(R.id.butChooseFileFromFilesystem);
butChooseFilesystem.setOnClickListener(v -> chooseFileFromFilesystem());
- Button butChooseExternal = (Button) findViewById(R.id.butChooseFileFromExternal);
+ Button butChooseExternal = findViewById(R.id.butChooseFileFromExternal);
butChooseExternal.setOnClickListener(v -> chooseFileFromExternal());
int nextOption = 1;
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportHolder.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportHolder.java
index b01cf43e4..dc5570dc0 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportHolder.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportHolder.java
@@ -14,6 +14,8 @@ import de.danoeh.antennapod.core.export.opml.OpmlElement;
*/
public class OpmlImportHolder {
+ private OpmlImportHolder(){}
+
private static ArrayList<OpmlElement> readElements;
public static ArrayList<OpmlElement> getReadElements() {
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 3f005fe36..452e91bd3 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
@@ -12,11 +12,11 @@ import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.FrameLayout;
-import java.lang.ref.WeakReference;
-
-import com.bytehamster.lib.preferencesearch.SearchPreference;
import com.bytehamster.lib.preferencesearch.SearchPreferenceResult;
import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener;
+
+import java.lang.ref.WeakReference;
+
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.preferences.PreferenceController;
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/StatisticsActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/StatisticsActivity.java
index 0ed4be906..37199ccf7 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/StatisticsActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/StatisticsActivity.java
@@ -53,9 +53,9 @@ public class StatisticsActivity extends AppCompatActivity
prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
countAll = prefs.getBoolean(PREF_COUNT_ALL, false);
- totalTimeTextView = (TextView) findViewById(R.id.total_time);
- feedStatisticsList = (ListView) findViewById(R.id.statistics_list);
- progressBar = (ProgressBar) findViewById(R.id.progressBar);
+ totalTimeTextView = findViewById(R.id.total_time);
+ feedStatisticsList = findViewById(R.id.statistics_list);
+ progressBar = findViewById(R.id.progressBar);
listAdapter = new StatisticsListAdapter(this);
listAdapter.setCountAll(countAll);
feedStatisticsList.setAdapter(listAdapter);
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/StorageErrorActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/StorageErrorActivity.java
index a2a49f54e..20e34cc52 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/StorageErrorActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/StorageErrorActivity.java
@@ -42,7 +42,7 @@ public class StorageErrorActivity extends AppCompatActivity {
setContentView(R.layout.storage_error);
- Button btnChooseDataFolder = (Button) findViewById(R.id.btnChooseDataFolder);
+ Button btnChooseDataFolder = findViewById(R.id.btnChooseDataFolder);
btnChooseDataFolder.setOnClickListener(v -> {
if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT &&
Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
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 ea408c650..78cc15b2c 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
@@ -23,6 +23,10 @@ import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.SeekBar;
+
+import java.lang.ref.WeakReference;
+import java.util.concurrent.atomic.AtomicBoolean;
+
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.MediaType;
import de.danoeh.antennapod.core.preferences.UserPreferences;
@@ -32,9 +36,6 @@ import de.danoeh.antennapod.core.util.gui.PictureInPictureUtil;
import de.danoeh.antennapod.core.util.playback.Playable;
import de.danoeh.antennapod.view.AspectRatioVideoView;
-import java.lang.ref.WeakReference;
-import java.util.concurrent.atomic.AtomicBoolean;
-
/**
* Activity for playing video files.
*/
@@ -142,11 +143,11 @@ public class VideoplayerActivity extends MediaplayerActivity {
}
super.setupGUI();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
- controls = (LinearLayout) findViewById(R.id.controls);
- videoOverlay = (LinearLayout) findViewById(R.id.overlay);
- videoview = (AspectRatioVideoView) findViewById(R.id.videoview);
- videoframe = (FrameLayout) findViewById(R.id.videoframe);
- progressIndicator = (ProgressBar) findViewById(R.id.progressIndicator);
+ controls = findViewById(R.id.controls);
+ videoOverlay = findViewById(R.id.overlay);
+ videoview = findViewById(R.id.videoview);
+ videoframe = findViewById(R.id.videoframe);
+ progressIndicator = findViewById(R.id.progressIndicator);
videoview.getHolder().addCallback(surfaceHolderCallback);
videoframe.setOnTouchListener(onVideoviewTouched);
videoOverlay.setOnTouchListener((view, motionEvent) -> true); // To suppress touches directly below the slider
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java
index 8f447ac90..8fcdb4371 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java
@@ -45,8 +45,6 @@ import de.danoeh.antennapod.core.service.GpodnetSyncService;
public class GpodnetAuthenticationActivity extends AppCompatActivity {
private static final String TAG = "GpodnetAuthActivity";
- private static final String CURRENT_STEP = "current_step";
-
private ViewFlipper viewFlipper;
private static final int STEP_DEFAULT = -1;
@@ -72,7 +70,7 @@ public class GpodnetAuthenticationActivity extends AppCompatActivity {
setContentView(R.layout.gpodnetauth_activity);
service = new GpodnetService();
- viewFlipper = (ViewFlipper) findViewById(R.id.viewflipper);
+ viewFlipper = findViewById(R.id.viewflipper);
LayoutInflater inflater = (LayoutInflater)
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
views = new View[]{
@@ -109,11 +107,11 @@ public class GpodnetAuthenticationActivity extends AppCompatActivity {
}
private void setupLoginView(View view) {
- final EditText username = (EditText) view.findViewById(R.id.etxtUsername);
- final EditText password = (EditText) view.findViewById(R.id.etxtPassword);
- final Button login = (Button) view.findViewById(R.id.butLogin);
- final TextView txtvError = (TextView) view.findViewById(R.id.txtvError);
- final ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.progBarLogin);
+ final EditText username = view.findViewById(R.id.etxtUsername);
+ final EditText password = view.findViewById(R.id.etxtPassword);
+ final Button login = view.findViewById(R.id.butLogin);
+ final TextView txtvError = view.findViewById(R.id.txtvError);
+ final ProgressBar progressBar = view.findViewById(R.id.progBarLogin);
password.setOnEditorActionListener((v, actionID, event) ->
actionID == EditorInfo.IME_ACTION_GO && login.performClick());
@@ -177,13 +175,13 @@ public class GpodnetAuthenticationActivity extends AppCompatActivity {
}
private void setupDeviceView(View view) {
- final EditText deviceID = (EditText) view.findViewById(R.id.etxtDeviceID);
- final EditText caption = (EditText) view.findViewById(R.id.etxtCaption);
- final Button createNewDevice = (Button) view.findViewById(R.id.butCreateNewDevice);
- final Button chooseDevice = (Button) view.findViewById(R.id.butChooseExistingDevice);
- final TextView txtvError = (TextView) view.findViewById(R.id.txtvError);
- final ProgressBar progBarCreateDevice = (ProgressBar) view.findViewById(R.id.progbarCreateDevice);
- final Spinner spinnerDevices = (Spinner) view.findViewById(R.id.spinnerChooseDevice);
+ final EditText deviceID = view.findViewById(R.id.etxtDeviceID);
+ final EditText caption = view.findViewById(R.id.etxtCaption);
+ final Button createNewDevice = view.findViewById(R.id.butCreateNewDevice);
+ final Button chooseDevice = view.findViewById(R.id.butChooseExistingDevice);
+ final TextView txtvError = view.findViewById(R.id.txtvError);
+ final ProgressBar progBarCreateDevice = view.findViewById(R.id.progbarCreateDevice);
+ final Spinner spinnerDevices = view.findViewById(R.id.spinnerChooseDevice);
// load device list
@@ -348,8 +346,8 @@ public class GpodnetAuthenticationActivity extends AppCompatActivity {
}
private void setupFinishView(View view) {
- final Button sync = (Button) view.findViewById(R.id.butSyncNow);
- final Button back = (Button) view.findViewById(R.id.butGoMainscreen);
+ final Button sync = view.findViewById(R.id.butSyncNow);
+ final Button back = view.findViewById(R.id.butGoMainscreen);
sync.setOnClickListener(v -> {
GpodnetSyncService.sendSyncIntent(GpodnetAuthenticationActivity.this);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
index 9739b999b..da1ce7670 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/AllEpisodesRecycleAdapter.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.adapter;
import android.os.Build;
+import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
@@ -51,7 +52,7 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
private final ActionButtonUtils actionButtonUtils;
private final boolean showOnlyNewEpisodes;
- private int position = -1;
+ private FeedItem selectedItem;
private final int playingBackGroundColor;
private final int normalBackGroundColor;
@@ -76,24 +77,24 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.new_episodes_listitem, parent, false);
Holder holder = new Holder(view);
- holder.container = (FrameLayout) view.findViewById(R.id.container);
- holder.content = (LinearLayout) view.findViewById(R.id.content);
- holder.placeholder = (TextView) view.findViewById(R.id.txtvPlaceholder);
- holder.title = (TextView) view.findViewById(R.id.txtvTitle);
+ holder.container = view.findViewById(R.id.container);
+ holder.content = view.findViewById(R.id.content);
+ holder.placeholder = view.findViewById(R.id.txtvPlaceholder);
+ holder.title = view.findViewById(R.id.txtvTitle);
if(Build.VERSION.SDK_INT >= 23) {
holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- holder.pubDate = (TextView) view
+ holder.pubDate = view
.findViewById(R.id.txtvPublished);
holder.statusUnread = view.findViewById(R.id.statusUnread);
- holder.butSecondary = (ImageButton) view
+ holder.butSecondary = view
.findViewById(R.id.butSecondaryAction);
- holder.queueStatus = (ImageView) view
+ holder.queueStatus = view
.findViewById(R.id.imgvInPlaylist);
- holder.progress = (ProgressBar) view
+ holder.progress = view
.findViewById(R.id.pbar_progress);
- holder.cover = (ImageView) view.findViewById(R.id.imgvCover);
- holder.txtvDuration = (TextView) view.findViewById(R.id.txtvDuration);
+ holder.cover = view.findViewById(R.id.imgvCover);
+ holder.txtvDuration = view.findViewById(R.id.txtvDuration);
holder.item = null;
holder.mainActivityRef = mainActivityRef;
// so we can grab this later
@@ -107,7 +108,7 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
final FeedItem item = itemAccess.getItem(position);
if (item == null) return;
holder.itemView.setOnLongClickListener(v -> {
- this.position = holder.getAdapterPosition();
+ this.selectedItem = item;
return false;
});
holder.item = item;
@@ -200,6 +201,11 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
.into(new CoverTarget(item.getFeed().getImageLocation(), holder.placeholder, holder.cover, mainActivityRef.get()));
}
+ @Nullable
+ public FeedItem getSelectedItem() {
+ return selectedItem;
+ }
+
@Override
public long getItemId(int position) {
FeedItem item = itemAccess.getItem(position);
@@ -211,16 +217,6 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
return itemAccess.getCount();
}
- public FeedItem getItem(int position) {
- return itemAccess.getItem(position);
- }
-
- public int getPosition() {
- int pos = position;
- position = -1; // reset
- return pos;
- }
-
private final View.OnClickListener secondaryActionListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
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 cbd089d4c..c3fac7e18 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/ChaptersListAdapter.java
@@ -57,12 +57,12 @@ public class ChaptersListAdapter extends ArrayAdapter<Chapter> {
convertView = inflater.inflate(R.layout.simplechapter_item, parent, false);
holder.view = convertView;
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
defaultTextColor = holder.title.getTextColors().getDefaultColor();
- holder.start = (TextView) convertView.findViewById(R.id.txtvStart);
- holder.link = (TextView) convertView.findViewById(R.id.txtvLink);
- holder.duration = (TextView) convertView.findViewById(R.id.txtvDuration);
- holder.butPlayChapter = (ImageButton) convertView.findViewById(R.id.butPlayChapter);
+ holder.start = convertView.findViewById(R.id.txtvStart);
+ holder.link = convertView.findViewById(R.id.txtvLink);
+ holder.duration = convertView.findViewById(R.id.txtvDuration);
+ holder.butPlayChapter = convertView.findViewById(R.id.butPlayChapter);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java
index 08b2908ac..1286d9dc7 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java
@@ -1,13 +1,12 @@
package de.danoeh.antennapod.adapter;
import android.content.Context;
+import android.support.annotation.NonNull;
import android.content.Intent;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
-import de.danoeh.antennapod.core.util.IntentUtils;
-import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter;
import org.apache.commons.lang3.Validate;
import de.danoeh.antennapod.R;
@@ -21,8 +20,10 @@ import de.danoeh.antennapod.core.storage.DBTasks;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.DownloadRequestException;
import de.danoeh.antennapod.core.storage.DownloadRequester;
+import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.LongList;
import de.danoeh.antennapod.core.util.NetworkUtils;
+import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter;
/**
* Default implementation of an ActionButtonCallback
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
index 163366c3c..789c01a26 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
@@ -49,15 +49,15 @@ public class DownloadLogAdapter extends BaseAdapter {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.downloadlog_item, parent, false);
- holder.icon = (IconTextView) convertView.findViewById(R.id.txtvIcon);
- holder.retry = (IconButton) convertView.findViewById(R.id.btnRetry);
- holder.date = (TextView) convertView.findViewById(R.id.txtvDate);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
+ holder.icon = convertView.findViewById(R.id.txtvIcon);
+ holder.retry = convertView.findViewById(R.id.btnRetry);
+ holder.date = convertView.findViewById(R.id.txtvDate);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
if(Build.VERSION.SDK_INT >= 23) {
holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- holder.type = (TextView) convertView.findViewById(R.id.txtvType);
- holder.reason = (TextView) convertView.findViewById(R.id.txtvReason);
+ holder.type = convertView.findViewById(R.id.txtvType);
+ holder.reason = convertView.findViewById(R.id.txtvReason);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
index 51e1271d9..014e43ee7 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
@@ -61,16 +61,16 @@ public class DownloadedEpisodesListAdapter extends BaseAdapter {
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.downloaded_episodeslist_item,
parent, false);
- holder.imageView = (ImageView) convertView.findViewById(R.id.imgvImage);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
+ holder.imageView = convertView.findViewById(R.id.imgvImage);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
if(Build.VERSION.SDK_INT >= 23) {
holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- holder.txtvSize = (TextView) convertView.findViewById(R.id.txtvSize);
- holder.queueStatus = (ImageView) convertView.findViewById(R.id.imgvInPlaylist);
- holder.pubDate = (TextView) convertView
+ holder.txtvSize = convertView.findViewById(R.id.txtvSize);
+ holder.queueStatus = convertView.findViewById(R.id.imgvInPlaylist);
+ holder.pubDate = convertView
.findViewById(R.id.txtvPublished);
- holder.butSecondary = (ImageButton) convertView
+ holder.butSecondary = convertView
.findViewById(R.id.butSecondaryAction);
convertView.setTag(holder);
} else {
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java
index a8c60c19e..b85d1d35d 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadlistAdapter.java
@@ -59,14 +59,14 @@ public class DownloadlistAdapter extends BaseAdapter {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.downloadlist_item, parent, false);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.downloaded = (TextView) convertView
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.downloaded = convertView
.findViewById(R.id.txtvDownloaded);
- holder.percent = (TextView) convertView
+ holder.percent = convertView
.findViewById(R.id.txtvPercent);
- holder.progbar = (ProgressBar) convertView
+ holder.progbar = convertView
.findViewById(R.id.progProgress);
- holder.butSecondary = (ImageButton) convertView
+ holder.butSecondary = convertView
.findViewById(R.id.butSecondaryAction);
convertView.setTag(holder);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
index cf3dd8b09..738a0a636 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistAdapter.java
@@ -90,24 +90,24 @@ public class FeedItemlistAdapter extends BaseAdapter {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.feeditemlist_item, parent, false);
- holder.container = (LinearLayout) convertView
+ holder.container = convertView
.findViewById(R.id.container);
- holder.title = (TextView) convertView.findViewById(R.id.txtvItemname);
+ holder.title = convertView.findViewById(R.id.txtvItemname);
if(Build.VERSION.SDK_INT >= 23) {
holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- holder.lenSize = (TextView) convertView
+ holder.lenSize = convertView
.findViewById(R.id.txtvLenSize);
- holder.butAction = (ImageButton) convertView
+ holder.butAction = convertView
.findViewById(R.id.butSecondaryAction);
- holder.published = (TextView) convertView
+ holder.published = convertView
.findViewById(R.id.txtvPublished);
- holder.inPlaylist = (ImageView) convertView
+ holder.inPlaylist = convertView
.findViewById(R.id.imgvInPlaylist);
- holder.type = (ImageView) convertView.findViewById(R.id.imgvType);
+ holder.type = convertView.findViewById(R.id.imgvType);
holder.statusUnread = convertView
.findViewById(R.id.statusUnread);
- holder.episodeProgress = (ProgressBar) convertView
+ holder.episodeProgress = convertView
.findViewById(R.id.pbar_episode_progress);
convertView.setTag(holder);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java
index 5b205e91f..c10bb7638 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java
@@ -34,9 +34,9 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.itemdescription_listitem, parent, false);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.pubDate = (TextView) convertView.findViewById(R.id.txtvPubDate);
- holder.description = (TextView) convertView.findViewById(R.id.txtvDescription);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.pubDate = convertView.findViewById(R.id.txtvPubDate);
+ holder.description = convertView.findViewById(R.id.txtvDescription);
convertView.setTag(holder);
} else {
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 2daa5e70f..5adf662b3 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java
@@ -212,7 +212,7 @@ public class NavListAdapter extends BaseAdapter
v = getFeedView(position, convertView, parent);
}
if (v != null && viewType != VIEW_TYPE_SECTION_DIVIDER) {
- TextView txtvTitle = (TextView) v.findViewById(R.id.txtvTitle);
+ TextView txtvTitle = v.findViewById(R.id.txtvTitle);
if (position == itemAccess.getSelectedItemIndex()) {
txtvTitle.setTypeface(null, Typeface.BOLD);
} else {
@@ -235,9 +235,9 @@ public class NavListAdapter extends BaseAdapter
convertView = inflater.inflate(R.layout.nav_listitem, parent, false);
- holder.image = (ImageView) convertView.findViewById(R.id.imgvCover);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.count = (TextView) convertView.findViewById(R.id.txtvCount);
+ holder.image = convertView.findViewById(R.id.imgvCover);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.count = convertView.findViewById(R.id.txtvCount);
convertView.setTag(holder);
} else {
holder = (NavHolder) convertView.getTag();
@@ -325,10 +325,10 @@ public class NavListAdapter extends BaseAdapter
convertView = inflater.inflate(R.layout.nav_feedlistitem, parent, false);
- holder.image = (ImageView) convertView.findViewById(R.id.imgvCover);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.failure = (IconTextView) convertView.findViewById(R.id.itxtvFailure);
- holder.count = (TextView) convertView.findViewById(R.id.txtvCount);
+ holder.image = convertView.findViewById(R.id.imgvCover);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.failure = convertView.findViewById(R.id.itxtvFailure);
+ holder.count = convertView.findViewById(R.id.txtvCount);
convertView.setTag(holder);
} else {
holder = (FeedHolder) convertView.getTag();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
index ee14cb70a..3ad9dc79c 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java
@@ -25,7 +25,6 @@ import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.joanzapata.iconify.Iconify;
-import de.danoeh.antennapod.core.util.ThemeUtils;
import org.apache.commons.lang3.ArrayUtils;
import java.lang.ref.WeakReference;
@@ -41,6 +40,7 @@ import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.DateUtils;
import de.danoeh.antennapod.core.util.LongList;
import de.danoeh.antennapod.core.util.NetworkUtils;
+import de.danoeh.antennapod.core.util.ThemeUtils;
import de.danoeh.antennapod.fragment.ItemFragment;
import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler;
@@ -134,19 +134,19 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
public ViewHolder(View v) {
super(v);
- container = (FrameLayout) v.findViewById(R.id.container);
- dragHandle = (ImageView) v.findViewById(R.id.drag_handle);
- placeholder = (TextView) v.findViewById(R.id.txtvPlaceholder);
- cover = (ImageView) v.findViewById(R.id.imgvCover);
- title = (TextView) v.findViewById(R.id.txtvTitle);
+ container = v.findViewById(R.id.container);
+ dragHandle = v.findViewById(R.id.drag_handle);
+ placeholder = v.findViewById(R.id.txtvPlaceholder);
+ cover = v.findViewById(R.id.imgvCover);
+ title = v.findViewById(R.id.txtvTitle);
if(Build.VERSION.SDK_INT >= 23) {
title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- pubDate = (TextView) v.findViewById(R.id.txtvPubDate);
- progressLeft = (TextView) v.findViewById(R.id.txtvProgressLeft);
- progressRight = (TextView) v.findViewById(R.id.txtvProgressRight);
- butSecondary = (ImageButton) v.findViewById(R.id.butSecondaryAction);
- progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
+ pubDate = v.findViewById(R.id.txtvPubDate);
+ progressLeft = v.findViewById(R.id.txtvProgressLeft);
+ progressRight = v.findViewById(R.id.txtvProgressRight);
+ butSecondary = v.findViewById(R.id.butSecondaryAction);
+ progressBar = v.findViewById(R.id.progressBar);
v.setTag(this);
v.setOnClickListener(this);
v.setOnCreateContextMenuListener(this);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java
index beb62b3bb..74c0d6473 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java
@@ -61,13 +61,13 @@ public class SearchlistAdapter extends BaseAdapter {
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.searchlist_item, parent, false);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
if(Build.VERSION.SDK_INT >= 23) {
holder.title.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- holder.cover = (ImageView) convertView
+ holder.cover = convertView
.findViewById(R.id.imgvFeedimage);
- holder.subtitle = (TextView) convertView
+ holder.subtitle = convertView
.findViewById(R.id.txtvSubtitle);
convertView.setTag(holder);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java
index 50255c11f..d1f1d85bc 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java
@@ -62,9 +62,9 @@ public class StatisticsListAdapter extends BaseAdapter {
convertView = inflater.inflate(R.layout.statistics_listitem, parent, false);
- holder.image = (ImageView) convertView.findViewById(R.id.imgvCover);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.time = (TextView) convertView.findViewById(R.id.txtvTime);
+ holder.image = convertView.findViewById(R.id.imgvCover);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.time = convertView.findViewById(R.id.txtvTime);
convertView.setTag(holder);
} else {
holder = (StatisticsHolder) convertView.getTag();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
index bb76ab501..9230967ab 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/SubscriptionsAdapter.java
@@ -89,9 +89,9 @@ public class SubscriptionsAdapter extends BaseAdapter implements AdapterView.OnI
LayoutInflater layoutInflater =
(LayoutInflater) mainActivityRef.get().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.subscription_item, parent, false);
- holder.feedTitle = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.imageView = (ImageView) convertView.findViewById(R.id.imgvCover);
- holder.count = (TriangleLabelView) convertView.findViewById(R.id.triangleCountView);
+ holder.feedTitle = convertView.findViewById(R.id.txtvTitle);
+ holder.imageView = convertView.findViewById(R.id.imgvCover);
+ holder.count = convertView.findViewById(R.id.triangleCountView);
convertView.setTag(holder);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
index aea3d583f..9cc0e36cf 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
@@ -40,10 +40,10 @@ public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> {
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.gpodnet_podcast_listitem, parent, false);
- holder.image = (ImageView) convertView.findViewById(R.id.imgvCover);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.subscribers = (TextView) convertView.findViewById(R.id.txtvSubscribers);
- holder.url = (TextView) convertView.findViewById(R.id.txtvUrl);
+ holder.image = convertView.findViewById(R.id.imgvCover);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.subscribers = convertView.findViewById(R.id.txtvSubscribers);
+ holder.url = convertView.findViewById(R.id.txtvUrl);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
index b4eadefb5..52fca792e 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/gpodnet/TagListAdapter.java
@@ -34,8 +34,8 @@ public class TagListAdapter extends ArrayAdapter<GpodnetTag> {
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.gpodnet_tag_listitem, parent, false);
- holder.title = (TextView) convertView.findViewById(R.id.txtvTitle);
- holder.usage = (TextView) convertView.findViewById(R.id.txtvUsage);
+ holder.title = convertView.findViewById(R.id.txtvTitle);
+ holder.usage = convertView.findViewById(R.id.txtvUsage);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
index 4a941275d..b103026dc 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
@@ -182,9 +182,9 @@ public class ItunesAdapter extends ArrayAdapter<ItunesAdapter.Podcast> {
* @param view GridView cell
*/
PodcastViewHolder(View view){
- coverView = (ImageView) view.findViewById(R.id.imgvCover);
- titleView = (TextView) view.findViewById(R.id.txtvTitle);
- urlView = (TextView) view.findViewById(R.id.txtvUrl);
+ coverView = view.findViewById(R.id.imgvCover);
+ titleView = view.findViewById(R.id.txtvTitle);
+ urlView = view.findViewById(R.id.txtvUrl);
}
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/config/ClientConfigurator.java b/app/src/main/java/de/danoeh/antennapod/config/ClientConfigurator.java
index d2498955c..4138738f6 100644
--- a/app/src/main/java/de/danoeh/antennapod/config/ClientConfigurator.java
+++ b/app/src/main/java/de/danoeh/antennapod/config/ClientConfigurator.java
@@ -8,6 +8,8 @@ import de.danoeh.antennapod.core.ClientConfig;
*/
class ClientConfigurator {
+ private ClientConfigurator(){}
+
static {
ClientConfig.USER_AGENT = "AntennaPod/" + BuildConfig.VERSION_NAME;
ClientConfig.applicationCallbacks = new ApplicationCallbacksImpl();
diff --git a/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java b/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java
index 83dd3fe9c..eb70d8e0b 100644
--- a/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java
+++ b/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java
@@ -2,7 +2,6 @@ package de.danoeh.antennapod.config;
import android.content.Context;
import android.content.Intent;
-
import android.os.Build;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.AudioplayerActivity;
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/AuthenticationDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/AuthenticationDialog.java
index 6f9e221ec..2c41b8cb8 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/AuthenticationDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/AuthenticationDialog.java
@@ -35,11 +35,11 @@ public abstract class AuthenticationDialog extends Dialog {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.authentication_dialog);
- final EditText etxtUsername = (EditText) findViewById(R.id.etxtUsername);
- final EditText etxtPassword = (EditText) findViewById(R.id.etxtPassword);
- final CheckBox saveUsernamePassword = (CheckBox) findViewById(R.id.chkSaveUsernamePassword);
- final Button butConfirm = (Button) findViewById(R.id.butConfirm);
- final Button butCancel = (Button) findViewById(R.id.butCancel);
+ final EditText etxtUsername = findViewById(R.id.etxtUsername);
+ final EditText etxtPassword = findViewById(R.id.etxtPassword);
+ final CheckBox saveUsernamePassword = findViewById(R.id.chkSaveUsernamePassword);
+ final Button butConfirm = findViewById(R.id.butConfirm);
+ final Button butCancel = findViewById(R.id.butCancel);
if (titleRes != 0) {
setTitle(titleRes);
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/AutoFlattrPreferenceDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/AutoFlattrPreferenceDialog.java
index 93425949c..c28342374 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/AutoFlattrPreferenceDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/AutoFlattrPreferenceDialog.java
@@ -29,9 +29,9 @@ public class AutoFlattrPreferenceDialog {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
@SuppressLint("InflateParams") View view = activity.getLayoutInflater().inflate(R.layout.autoflattr_preference_dialog, null);
- final CheckBox chkAutoFlattr = (CheckBox) view.findViewById(R.id.chkAutoFlattr);
- final SeekBar skbPercent = (SeekBar) view.findViewById(R.id.skbPercent);
- final TextView txtvStatus = (TextView) view.findViewById(R.id.txtvStatus);
+ final CheckBox chkAutoFlattr = view.findViewById(R.id.chkAutoFlattr);
+ final SeekBar skbPercent = view.findViewById(R.id.skbPercent);
+ final TextView txtvStatus = view.findViewById(R.id.txtvStatus);
chkAutoFlattr.setChecked(UserPreferences.isAutoFlattr());
skbPercent.setEnabled(chkAutoFlattr.isChecked());
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
index d1ee926ac..07a64cde8 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.dialog;
+import android.app.AlertDialog;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -84,7 +85,7 @@ public class EpisodesApplyActionFragment extends Fragment {
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.episodes_apply_action_fragment, container, false);
- mListView = (ListView) view.findViewById(android.R.id.list);
+ mListView = view.findViewById(android.R.id.list);
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mListView.setOnItemClickListener((ListView, view1, position, rowId) -> {
long id = episodes.get(position).getId();
@@ -95,6 +96,28 @@ public class EpisodesApplyActionFragment extends Fragment {
}
refreshCheckboxes();
});
+ mListView.setOnItemLongClickListener((adapterView, view12, position, id) -> {
+ new AlertDialog.Builder(getActivity())
+ .setItems(R.array.batch_long_press_options, (dialogInterface, item) -> {
+ int direction;
+ if (item == 0) {
+ direction = -1;
+ } else {
+ direction = 1;
+ }
+
+ int currentPosition = position + direction;
+ while (currentPosition >= 0 && currentPosition < episodes.size()) {
+ long id1 = episodes.get(currentPosition).getId();
+ if (!checkedIds.contains(id1)) {
+ checkedIds.add(id1);
+ }
+ currentPosition += direction;
+ }
+ refreshCheckboxes();
+ }).show();
+ return true;
+ });
for(FeedItem episode : episodes) {
titles.add(episode.getTitle());
@@ -106,7 +129,7 @@ public class EpisodesApplyActionFragment extends Fragment {
checkAll();
int lastVisibleDiv = 0;
- btnAddToQueue = (Button) view.findViewById(R.id.btnAddToQueue);
+ btnAddToQueue = view.findViewById(R.id.btnAddToQueue);
if((actions & ACTION_QUEUE) != 0) {
btnAddToQueue.setOnClickListener(v -> queueChecked());
lastVisibleDiv = R.id.divider1;
@@ -114,7 +137,7 @@ public class EpisodesApplyActionFragment extends Fragment {
btnAddToQueue.setVisibility(View.GONE);
view.findViewById(R.id.divider1).setVisibility(View.GONE);
}
- btnMarkAsPlayed = (Button) view.findViewById(R.id.btnMarkAsPlayed);
+ btnMarkAsPlayed = view.findViewById(R.id.btnMarkAsPlayed);
if((actions & ACTION_MARK_PLAYED) != 0) {
btnMarkAsPlayed.setOnClickListener(v -> markedCheckedPlayed());
lastVisibleDiv = R.id.divider2;
@@ -122,7 +145,7 @@ public class EpisodesApplyActionFragment extends Fragment {
btnMarkAsPlayed.setVisibility(View.GONE);
view.findViewById(R.id.divider2).setVisibility(View.GONE);
}
- btnMarkAsUnplayed = (Button) view.findViewById(R.id.btnMarkAsUnplayed);
+ btnMarkAsUnplayed = view.findViewById(R.id.btnMarkAsUnplayed);
if((actions & ACTION_MARK_UNPLAYED) != 0) {
btnMarkAsUnplayed.setOnClickListener(v -> markedCheckedUnplayed());
lastVisibleDiv = R.id.divider3;
@@ -130,7 +153,7 @@ public class EpisodesApplyActionFragment extends Fragment {
btnMarkAsUnplayed.setVisibility(View.GONE);
view.findViewById(R.id.divider3).setVisibility(View.GONE);
}
- btnDownload = (Button) view.findViewById(R.id.btnDownload);
+ btnDownload = view.findViewById(R.id.btnDownload);
if((actions & ACTION_DOWNLOAD) != 0) {
btnDownload.setOnClickListener(v -> downloadChecked());
lastVisibleDiv = R.id.divider4;
@@ -138,7 +161,7 @@ public class EpisodesApplyActionFragment extends Fragment {
btnDownload.setVisibility(View.GONE);
view.findViewById(R.id.divider4).setVisibility(View.GONE);
}
- btnDelete = (Button) view.findViewById(R.id.btnDelete);
+ btnDelete = view.findViewById(R.id.btnDelete);
if((actions & ACTION_REMOVE) != 0) {
btnDelete.setOnClickListener(v -> deleteChecked());
} else {
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/GpodnetSetHostnameDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/GpodnetSetHostnameDialog.java
index e64f1e08b..933ced0f9 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/GpodnetSetHostnameDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/GpodnetSetHostnameDialog.java
@@ -17,6 +17,9 @@ import de.danoeh.antennapod.core.preferences.GpodnetPreferences;
* Creates a dialog that lets the user change the hostname for the gpodder.net service.
*/
public class GpodnetSetHostnameDialog {
+
+ private GpodnetSetHostnameDialog(){}
+
private static final String TAG = "GpodnetSetHostnameDialog";
public static AlertDialog createDialog(final Context context) {
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java
index f5632cad3..cc331e24a 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java
@@ -102,7 +102,7 @@ public class ProxyDialog {
.autoDismiss(false)
.build();
View view = dialog.getCustomView();
- spType = (Spinner) view.findViewById(R.id.spType);
+ spType = view.findViewById(R.id.spType);
String[] types = { Proxy.Type.DIRECT.name(), Proxy.Type.HTTP.name() };
ArrayAdapter<String> adapter = new ArrayAdapter<>(context,
android.R.layout.simple_spinner_item, types);
@@ -110,22 +110,22 @@ public class ProxyDialog {
spType.setAdapter(adapter);
ProxyConfig proxyConfig = UserPreferences.getProxyConfig();
spType.setSelection(adapter.getPosition(proxyConfig.type.name()));
- etHost = (EditText) view.findViewById(R.id.etHost);
+ etHost = view.findViewById(R.id.etHost);
if(!TextUtils.isEmpty(proxyConfig.host)) {
etHost.setText(proxyConfig.host);
}
etHost.addTextChangedListener(requireTestOnChange);
- etPort = (EditText) view.findViewById(R.id.etPort);
+ etPort = view.findViewById(R.id.etPort);
if(proxyConfig.port > 0) {
etPort.setText(String.valueOf(proxyConfig.port));
}
etPort.addTextChangedListener(requireTestOnChange);
- etUsername = (EditText) view.findViewById(R.id.etUsername);
+ etUsername = view.findViewById(R.id.etUsername);
if(!TextUtils.isEmpty(proxyConfig.username)) {
etUsername.setText(proxyConfig.username);
}
etUsername.addTextChangedListener(requireTestOnChange);
- etPassword = (EditText) view.findViewById(R.id.etPassword);
+ etPassword = view.findViewById(R.id.etPassword);
if(!TextUtils.isEmpty(proxyConfig.password)) {
etPassword.setText(proxyConfig.username);
}
@@ -146,7 +146,7 @@ public class ProxyDialog {
enableSettings(false);
}
});
- txtvMessage = (TextView) view.findViewById(R.id.txtvMessage);
+ txtvMessage = view.findViewById(R.id.txtvMessage);
checkValidity();
return dialog;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java
index 72000170e..ece184035 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/RatingDialog.java
@@ -17,6 +17,8 @@ import de.danoeh.antennapod.R;
public class RatingDialog {
+ private RatingDialog(){}
+
private static final String TAG = RatingDialog.class.getSimpleName();
private static final int AFTER_DAYS = 7;
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 be7850495..4b8601ec6 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java
@@ -61,11 +61,11 @@ public abstract class SleepTimerDialog {
dialog = builder.build();
View view = dialog.getView();
- etxtTime = (EditText) view.findViewById(R.id.etxtTime);
- spTimeUnit = (Spinner) view.findViewById(R.id.spTimeUnit);
- cbShakeToReset = (CheckBox) view.findViewById(R.id.cbShakeToReset);
- cbVibrate = (CheckBox) view.findViewById(R.id.cbVibrate);
- chAutoEnable = (CheckBox) view.findViewById(R.id.chAutoEnable);
+ etxtTime = view.findViewById(R.id.etxtTime);
+ spTimeUnit = view.findViewById(R.id.spTimeUnit);
+ cbShakeToReset = view.findViewById(R.id.cbShakeToReset);
+ cbVibrate = view.findViewById(R.id.cbVibrate);
+ chAutoEnable = view.findViewById(R.id.chAutoEnable);
etxtTime.setText(SleepTimerPreferences.lastTimerValue());
etxtTime.addTextChangedListener(new TextWatcher() {
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 a243ddcdc..ee2373da8 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java
@@ -32,18 +32,18 @@ public class AddFeedFragment extends Fragment {
super.onCreateView(inflater, container, savedInstanceState);
View root = inflater.inflate(R.layout.addfeed, container, false);
- final EditText etxtFeedurl = (EditText) root.findViewById(R.id.etxtFeedurl);
+ final EditText etxtFeedurl = root.findViewById(R.id.etxtFeedurl);
Bundle args = getArguments();
if (args != null && args.getString(ARG_FEED_URL) != null) {
etxtFeedurl.setText(args.getString(ARG_FEED_URL));
}
- Button butSearchITunes = (Button) root.findViewById(R.id.butSearchItunes);
- Button butBrowserGpoddernet = (Button) root.findViewById(R.id.butBrowseGpoddernet);
- Button butSearchFyyd = (Button) root.findViewById(R.id.butSearchFyyd);
- Button butOpmlImport = (Button) root.findViewById(R.id.butOpmlImport);
- Button butConfirm = (Button) root.findViewById(R.id.butConfirm);
+ Button butSearchITunes = root.findViewById(R.id.butSearchItunes);
+ Button butBrowserGpoddernet = root.findViewById(R.id.butBrowseGpoddernet);
+ Button butSearchFyyd = root.findViewById(R.id.butSearchFyyd);
+ Button butOpmlImport = root.findViewById(R.id.butOpmlImport);
+ Button butConfirm = root.findViewById(R.id.butConfirm);
final MainActivity activity = (MainActivity) getActivity();
activity.getSupportActionBar().setTitle(R.string.add_feed_label);
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 e98265a82..485ae25fd 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java
@@ -275,14 +275,10 @@ public class AllEpisodesFragment extends Fragment {
if(item.getItemId() == R.id.share_item) {
return true; // avoids that the position is reset when we need it in the submenu
}
- int pos = listAdapter.getPosition();
- if(pos < 0) {
- return false;
- }
- FeedItem selectedItem = itemAccess.getItem(pos);
+ FeedItem selectedItem = listAdapter.getSelectedItem();
if (selectedItem == null) {
- Log.i(TAG, "Selected item at position " + pos + " was null, ignoring selection");
+ Log.i(TAG, "Selected item was null, ignoring selection");
return super.onContextItemSelected(item);
}
@@ -313,7 +309,7 @@ public class AllEpisodesFragment extends Fragment {
View root = inflater.inflate(fragmentResource, container, false);
- recyclerView = (RecyclerView) root.findViewById(android.R.id.list);
+ recyclerView = root.findViewById(android.R.id.list);
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
@@ -323,7 +319,7 @@ public class AllEpisodesFragment extends Fragment {
recyclerView.setHasFixedSize(true);
recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity()).build());
- progLoading = (ProgressBar) root.findViewById(R.id.progLoading);
+ progLoading = root.findViewById(R.id.progLoading);
if (!itemsLoaded) {
progLoading.setVisibility(View.VISIBLE);
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 1d3fcefba..0230c9036 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/CoverFragment.java
@@ -22,7 +22,6 @@ import de.danoeh.antennapod.core.util.playback.Playable;
public class CoverFragment extends Fragment implements MediaplayerInfoContentFragment {
private static final String TAG = "CoverFragment";
- private static final String ARG_PLAYABLE = "arg.playable";
private Playable media;
@@ -49,9 +48,9 @@ public class CoverFragment extends Fragment implements MediaplayerInfoContentFra
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
root = inflater.inflate(R.layout.cover_fragment, container, false);
- txtvPodcastTitle = (TextView) root.findViewById(R.id.txtvPodcastTitle);
- txtvEpisodeTitle = (TextView) root.findViewById(R.id.txtvEpisodeTitle);
- imgvCover = (ImageView) root.findViewById(R.id.imgvCover);
+ txtvPodcastTitle = root.findViewById(R.id.txtvPodcastTitle);
+ txtvEpisodeTitle = root.findViewById(R.id.txtvEpisodeTitle);
+ imgvCover = root.findViewById(R.id.imgvCover);
return root;
}
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 9c4d00e31..aa6029c84 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
@@ -38,12 +38,12 @@ public class DownloadsFragment extends Fragment {
super.onCreateView(inflater, container, savedInstanceState);
View root = inflater.inflate(R.layout.pager_fragment, container, false);
- viewPager = (ViewPager)root.findViewById(R.id.viewpager);
+ viewPager = root.findViewById(R.id.viewpager);
DownloadsPagerAdapter pagerAdapter = new DownloadsPagerAdapter(getChildFragmentManager(), getResources());
viewPager.setAdapter(pagerAdapter);
// Give the TabLayout the ViewPager
- tabLayout = (TabLayout) root.findViewById(R.id.sliding_tabs);
+ tabLayout = root.findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);
return root;
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 417ecff89..0610bfd24 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java
@@ -46,11 +46,11 @@ public class EpisodesFragment extends Fragment {
((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.episodes_label);
View rootView = inflater.inflate(R.layout.pager_fragment, container, false);
- viewPager = (ViewPager)rootView.findViewById(R.id.viewpager);
+ viewPager = rootView.findViewById(R.id.viewpager);
viewPager.setAdapter(new EpisodesPagerAdapter(getChildFragmentManager(), getResources()));
// Give the TabLayout the ViewPager
- tabLayout = (TabLayout) rootView.findViewById(R.id.sliding_tabs);
+ tabLayout = rootView.findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);
return rootView;
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 0f4d6b6eb..4e010f184 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
@@ -20,7 +20,6 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.MediaType;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
-import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.playback.Playable;
import de.danoeh.antennapod.core.util.playback.PlaybackController;
import io.reactivex.Maybe;
@@ -53,12 +52,12 @@ public class ExternalPlayerFragment extends Fragment {
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.external_player_fragment,
container, false);
- fragmentLayout = (ViewGroup) root.findViewById(R.id.fragmentLayout);
- imgvCover = (ImageView) root.findViewById(R.id.imgvCover);
- txtvTitle = (TextView) root.findViewById(R.id.txtvTitle);
- butPlay = (ImageButton) root.findViewById(R.id.butPlay);
- mFeedName = (TextView) root.findViewById(R.id.txtvAuthor);
- mProgressBar = (ProgressBar) root.findViewById(R.id.episodeProgress);
+ fragmentLayout = root.findViewById(R.id.fragmentLayout);
+ imgvCover = root.findViewById(R.id.imgvCover);
+ txtvTitle = root.findViewById(R.id.txtvTitle);
+ butPlay = root.findViewById(R.id.butPlay);
+ mFeedName = root.findViewById(R.id.txtvAuthor);
+ mProgressBar = root.findViewById(R.id.episodeProgress);
fragmentLayout.setOnClickListener(v -> {
Log.d(TAG, "layoutInfo was clicked");
@@ -83,7 +82,7 @@ public class ExternalPlayerFragment extends Fragment {
super.onActivityCreated(savedInstanceState);
controller = setupPlaybackController();
butPlay.setOnClickListener(v -> {
- if(controller != null) {
+ if (controller != null) {
controller.playPause();
}
});
@@ -144,6 +143,9 @@ public class ExternalPlayerFragment extends Fragment {
if (controller != null) {
controller.release();
}
+ if (disposable != null) {
+ disposable.dispose();
+ }
}
@Override
@@ -164,7 +166,7 @@ public class ExternalPlayerFragment extends Fragment {
controller = setupPlaybackController();
if (butPlay != null) {
butPlay.setOnClickListener(v -> {
- if(controller != null) {
+ if (controller != null) {
controller.playPause();
}
});
@@ -179,6 +181,9 @@ public class ExternalPlayerFragment extends Fragment {
return false;
}
+ if (disposable != null) {
+ disposable.dispose();
+ }
disposable = Maybe.create(emitter -> {
Playable media = controller.getMedia();
if(media != null) {
@@ -216,15 +221,10 @@ public class ExternalPlayerFragment extends Fragment {
butPlay.setVisibility(View.VISIBLE);
}
} else {
- Log.w(TAG, "loadMediaInfo was called while the media object of playbackService was null!");
+ Log.w(TAG, "loadMediaInfo was called while the media object of playbackService was null!");
}
}
- private String getPositionString(int position, int duration) {
- return Converter.getDurationStringLong(position) + " / "
- + Converter.getDurationStringLong(duration);
- }
-
public PlaybackController getPlaybackControllerTestingOnly() {
return controller;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FyydSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FyydSearchFragment.java
index a5fd467a7..dadc596e2 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FyydSearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FyydSearchFragment.java
@@ -75,7 +75,7 @@ public class FyydSearchFragment extends Fragment {
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
- gridView = (GridView) root.findViewById(R.id.gridView);
+ gridView = root.findViewById(R.id.gridView);
adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
gridView.setAdapter(adapter);
@@ -87,10 +87,10 @@ public class FyydSearchFragment extends Fragment {
intent.putExtra(OnlineFeedViewActivity.ARG_TITLE, podcast.title);
startActivity(intent);
});
- progressBar = (ProgressBar) root.findViewById(R.id.progressBar);
- txtvError = (TextView) root.findViewById(R.id.txtvError);
- butRetry = (Button) root.findViewById(R.id.butRetry);
- txtvEmpty = (TextView) root.findViewById(android.R.id.empty);
+ 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);
return root;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
index cfcc99171..ea480a7fb 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
@@ -165,25 +165,25 @@ public class ItemFragment extends Fragment implements OnSwipeGesture {
super.onCreateView(inflater, container, savedInstanceState);
View layout = inflater.inflate(R.layout.feeditem_fragment, container, false);
- root = (ViewGroup) layout.findViewById(R.id.content_root);
+ root = layout.findViewById(R.id.content_root);
- LinearLayout header = (LinearLayout) root.findViewById(R.id.header);
+ LinearLayout header = root.findViewById(R.id.header);
if(feedItems.length > 0) {
header.setOnTouchListener((v, event) -> headerGestureDetector.onTouchEvent(event));
}
- txtvPodcast = (TextView) layout.findViewById(R.id.txtvPodcast);
+ txtvPodcast = layout.findViewById(R.id.txtvPodcast);
txtvPodcast.setOnClickListener(v -> openPodcast());
- txtvTitle = (TextView) layout.findViewById(R.id.txtvTitle);
+ txtvTitle = layout.findViewById(R.id.txtvTitle);
if(Build.VERSION.SDK_INT >= 23) {
txtvTitle.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL);
}
- txtvDuration = (TextView) layout.findViewById(R.id.txtvDuration);
- txtvPublished = (TextView) layout.findViewById(R.id.txtvPublished);
+ txtvDuration = layout.findViewById(R.id.txtvDuration);
+ txtvPublished = layout.findViewById(R.id.txtvPublished);
if (Build.VERSION.SDK_INT >= 14) { // ellipsize is causing problems on old versions, see #448
txtvTitle.setEllipsize(TextUtils.TruncateAt.END);
}
- webvDescription = (WebView) layout.findViewById(R.id.webvDescription);
+ webvDescription = layout.findViewById(R.id.webvDescription);
if (UserPreferences.getTheme() == R.style.Theme_AntennaPod_Dark ||
UserPreferences.getTheme() == R.style.Theme_AntennaPod_TrueBlack) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
@@ -215,12 +215,12 @@ public class ItemFragment extends Fragment implements OnSwipeGesture {
});
registerForContextMenu(webvDescription);
- imgvCover = (ImageView) layout.findViewById(R.id.imgvCover);
+ imgvCover = layout.findViewById(R.id.imgvCover);
imgvCover.setOnClickListener(v -> openPodcast());
- progbarDownload = (ProgressBar) layout.findViewById(R.id.progbarDownload);
- progbarLoading = (ProgressBar) layout.findViewById(R.id.progbarLoading);
- butAction1 = (IconButton) layout.findViewById(R.id.butAction1);
- butAction2 = (IconButton) layout.findViewById(R.id.butAction2);
+ progbarDownload = layout.findViewById(R.id.progbarDownload);
+ progbarLoading = layout.findViewById(R.id.progbarLoading);
+ butAction1 = layout.findViewById(R.id.butAction1);
+ butAction2 = layout.findViewById(R.id.butAction2);
butAction1.setOnClickListener(v -> {
if (item == null) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java
index d5dc851fb..e5fda97ce 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java
@@ -412,13 +412,10 @@ public class ItemlistFragment extends ListFragment {
}
- private boolean insideOnFragmentLoaded = false;
-
private void onFragmentLoaded() {
if(!isVisible()) {
return;
}
- insideOnFragmentLoaded = true;
if (adapter == null) {
setListAdapter(null);
setupHeaderView();
@@ -435,9 +432,6 @@ public class ItemlistFragment extends ListFragment {
if (feed != null && feed.getNextPageLink() == null && listFooter != null) {
getListView().removeFooterView(listFooter.getRoot());
}
-
- insideOnFragmentLoaded = false;
-
}
private void refreshHeaderView() {
@@ -481,14 +475,14 @@ public class ItemlistFragment extends ListFragment {
View header = inflater.inflate(R.layout.feeditemlist_header, lv, false);
lv.addHeaderView(header);
- txtvTitle = (TextView) header.findViewById(R.id.txtvTitle);
- TextView txtvAuthor = (TextView) header.findViewById(R.id.txtvAuthor);
- imgvBackground = (ImageView) header.findViewById(R.id.imgvBackground);
- imgvCover = (ImageView) header.findViewById(R.id.imgvCover);
- ImageButton butShowInfo = (ImageButton) header.findViewById(R.id.butShowInfo);
- ImageButton butShowSettings = (ImageButton) header.findViewById(R.id.butShowSettings);
- txtvInformation = (TextView) header.findViewById(R.id.txtvInformation);
- txtvFailure = (IconTextView) header.findViewById(R.id.txtvFailure);
+ txtvTitle = header.findViewById(R.id.txtvTitle);
+ TextView txtvAuthor = header.findViewById(R.id.txtvAuthor);
+ imgvBackground = header.findViewById(R.id.imgvBackground);
+ imgvCover = header.findViewById(R.id.imgvCover);
+ ImageButton butShowInfo = header.findViewById(R.id.butShowInfo);
+ ImageButton butShowSettings = header.findViewById(R.id.butShowSettings);
+ txtvInformation = header.findViewById(R.id.txtvInformation);
+ txtvFailure = header.findViewById(R.id.txtvFailure);
txtvTitle.setText(feed.getTitle());
txtvAuthor.setText(feed.getAuthor());
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java
index 51054abc0..a0e2ca22a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItunesSearchFragment.java
@@ -110,7 +110,7 @@ public class ItunesSearchFragment extends Fragment {
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_itunes_search, container, false);
- gridView = (GridView) root.findViewById(R.id.gridView);
+ gridView = root.findViewById(R.id.gridView);
adapter = new ItunesAdapter(getActivity(), new ArrayList<>());
gridView.setAdapter(adapter);
@@ -170,10 +170,10 @@ public class ItunesSearchFragment extends Fragment {
});
}
});
- progressBar = (ProgressBar) root.findViewById(R.id.progressBar);
- txtvError = (TextView) root.findViewById(R.id.txtvError);
- butRetry = (Button) root.findViewById(R.id.butRetry);
- txtvEmpty = (TextView) root.findViewById(android.R.id.empty);
+ 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();
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 6a44e917e..faeabf75c 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -380,8 +380,8 @@ public class QueueFragment extends Fragment {
((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.queue_label);
View root = inflater.inflate(R.layout.queue_fragment, container, false);
- infoBar = (TextView) root.findViewById(R.id.info_bar);
- recyclerView = (RecyclerView) root.findViewById(R.id.recyclerView);
+ infoBar = root.findViewById(R.id.info_bar);
+ recyclerView = root.findViewById(R.id.recyclerView);
RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator();
if (animator instanceof SimpleItemAnimator) {
((SimpleItemAnimator) animator).setSupportsChangeAnimations(false);
@@ -487,16 +487,16 @@ public class QueueFragment extends Fragment {
private void reallyMoved(int from, int to) {
// Write drag operation to database
- Log.d(TAG, "Write to database move(" + dragFrom + ", " + dragTo + ")");
- DBWriter.moveQueueItem(dragFrom, dragTo, true);
+ Log.d(TAG, "Write to database move(" + from + ", " + to + ")");
+ DBWriter.moveQueueItem(from, to, true);
}
}
);
itemTouchHelper.attachToRecyclerView(recyclerView);
- txtvEmpty = (TextView) root.findViewById(android.R.id.empty);
+ txtvEmpty = root.findViewById(android.R.id.empty);
txtvEmpty.setVisibility(View.GONE);
- progLoading = (ProgressBar) root.findViewById(R.id.progLoading);
+ progLoading = root.findViewById(R.id.progLoading);
progLoading.setVisibility(View.VISIBLE);
return root;
@@ -533,9 +533,12 @@ public class QueueFragment extends Fragment {
String info = queue.size() + getString(R.string.episodes_suffix);
if(queue.size() > 0) {
long timeLeft = 0;
+ float playbackSpeed = Float.valueOf(UserPreferences.getPlaybackSpeed());
for(FeedItem item : queue) {
if(item.getMedia() != null) {
- timeLeft += item.getMedia().getDuration() - item.getMedia().getPosition();
+ timeLeft +=
+ (long) ((item.getMedia().getDuration() - item.getMedia().getPosition())
+ / playbackSpeed);
}
}
info += " \u2022 ";
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 6a1dd4c2d..5f09be8ce 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
@@ -68,7 +68,7 @@ public class SubscriptionFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_subscriptions, container, false);
- subscriptionGridLayout = (GridView) root.findViewById(R.id.subscriptions_grid);
+ subscriptionGridLayout = root.findViewById(R.id.subscriptions_grid);
registerForContextMenu(subscriptionGridLayout);
return root;
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
index b48027668..4dc114f9b 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java
@@ -31,12 +31,12 @@ public class GpodnetMainFragment extends Fragment {
super.onCreateView(inflater, container, savedInstanceState);
View root = inflater.inflate(R.layout.pager_fragment, container, false);
- viewPager = (ViewPager)root.findViewById(R.id.viewpager);
+ viewPager = root.findViewById(R.id.viewpager);
GpodnetPagerAdapter pagerAdapter = new GpodnetPagerAdapter(getChildFragmentManager(), getResources());
viewPager.setAdapter(pagerAdapter);
// Give the TabLayout the ViewPager
- tabLayout = (TabLayout) root.findViewById(R.id.sliding_tabs);
+ tabLayout = root.findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);
return root;
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 055358c64..49851ebb4 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
@@ -78,10 +78,10 @@ public abstract class PodcastListFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false);
- gridView = (GridView) root.findViewById(R.id.gridView);
- progressBar = (ProgressBar) root.findViewById(R.id.progressBar);
- txtvError = (TextView) root.findViewById(R.id.txtvError);
- butRetry = (Button) root.findViewById(R.id.butRetry);
+ gridView = root.findViewById(R.id.gridView);
+ progressBar = root.findViewById(R.id.progressBar);
+ txtvError = root.findViewById(R.id.txtvError);
+ butRetry = root.findViewById(R.id.butRetry);
gridView.setOnItemClickListener((parent, view, position, id) ->
onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position)));
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
index ab7d0e7c6..bd4fe9bcf 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java
@@ -30,6 +30,9 @@ import de.danoeh.antennapod.core.util.ShareUtils;
* Handles interactions with the FeedItemMenu.
*/
public class FeedMenuHandler {
+
+ private FeedMenuHandler(){ }
+
private static final String TAG = "FeedMenuHandler";
public static boolean onCreateOptionsMenu(MenuInflater inflater, Menu menu) {
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 66e229bdd..7b9fcad9b 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java
@@ -19,7 +19,7 @@ public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuIte
public static void adjustTextColor(Context context, SearchView sv) {
if(Build.VERSION.SDK_INT < 14) {
- EditText searchEditText = (EditText) sv.findViewById(R.id.search_src_text);
+ EditText searchEditText = sv.findViewById(R.id.search_src_text);
if (UserPreferences.getTheme() == de.danoeh.antennapod.R.style.Theme_AntennaPod_Dark
|| UserPreferences.getTheme() == R.style.Theme_AntennaPod_TrueBlack) {
searchEditText.setTextColor(Color.WHITE);
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/MasterSwitchPreference.java b/app/src/main/java/de/danoeh/antennapod/preferences/MasterSwitchPreference.java
index e500267fe..b810cbfa6 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/MasterSwitchPreference.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/MasterSwitchPreference.java
@@ -9,6 +9,7 @@ import android.support.v7.preference.PreferenceViewHolder;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.TextView;
+
import de.danoeh.antennapod.R;
public class MasterSwitchPreference extends SwitchPreference {
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java b/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java
index 20b07e486..50e76838c 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/NumberPickerPreference.java
@@ -8,6 +8,7 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
+
import de.danoeh.antennapod.R;
public class NumberPickerPreference extends Preference {
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
index ca70d9594..31b2cbcb2 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
@@ -227,6 +227,33 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
return true;
});
+ ui.findPreference(UserPreferences.PREF_BACK_BUTTON_BEHAVIOR)
+ .setOnPreferenceChangeListener((preference, newValue) -> {
+ if (newValue.equals("page")) {
+ final Context context = ui.getActivity();
+ final String[] navTitles = context.getResources().getStringArray(R.array.back_button_go_to_pages);
+ final String[] navTags = context.getResources().getStringArray(R.array.back_button_go_to_pages_tags);
+ final String choice[] = { UserPreferences.getBackButtonGoToPage() };
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle(R.string.back_button_go_to_page_title);
+ builder.setSingleChoiceItems(navTitles, ArrayUtils.indexOf(navTags, UserPreferences.getBackButtonGoToPage()), (dialogInterface, i) -> {
+ if (i >= 0) {
+ choice[0] = navTags[i];
+ }
+ });
+ builder.setPositiveButton(R.string.confirm_label, (dialogInterface, i) -> UserPreferences.setBackButtonGoToPage(choice[0]));
+ builder.setNegativeButton(R.string.cancel_label, null);
+ builder.create().show();
+ return true;
+ } else {
+ return true;
+ }
+ });
+
+ if (Build.VERSION.SDK_INT >= 26) {
+ ui.findPreference(UserPreferences.PREF_EXPANDED_NOTIFICATION).setVisible(false);
+ }
}
private void setupStorageScreen() {
diff --git a/app/src/main/java/de/danoeh/antennapod/spa/SPAUtil.java b/app/src/main/java/de/danoeh/antennapod/spa/SPAUtil.java
index 75cbd8b5a..03958508d 100644
--- a/app/src/main/java/de/danoeh/antennapod/spa/SPAUtil.java
+++ b/app/src/main/java/de/danoeh/antennapod/spa/SPAUtil.java
@@ -33,7 +33,7 @@ public class SPAUtil {
* sent before.
*/
public static synchronized boolean sendSPAppsQueryFeedsIntent(Context context) {
- if (context == null) throw new IllegalArgumentException("context = null");
+ assert context != null : "context = null";
final Context appContext = context.getApplicationContext();
if (appContext == null) {
Log.wtf(TAG, "Unable to get application context");
diff --git a/app/src/main/play/de/listing/fulldescription b/app/src/main/play/de/listing/fulldescription
index e5d7ec72a..0e09c5c29 100644
--- a/app/src/main/play/de/listing/fulldescription
+++ b/app/src/main/play/de/listing/fulldescription
@@ -1,4 +1,4 @@
-AntennaPod ist ein Podcast-Manager und -Player, der Dir unmittelbar Zugriff auf Millionen von freien und bezahlten Podcasts ermöglicht, angefangen von unabhängigen Podcastern zu großen Rundfunkanstalten oder Hörfunksendern wie BBC, NPR und CNN. Abonniere, importiere und exportiere deine Feeds mühelos mit Hilfe des iTunes-Verzeichnisses, OPML-Dateien oder einfachen RSS-URLs. Reduziere Aufwand, Stromverbrauch und Datenverbrauch durch die Kontrolle der Downloads (bestimmte Uhrzeiten, Intervalle, WiFi-Netze) und des Löschens von Episoden (basierend auf deinen Favoriten und weiteren Einstellungen).<br>
+AntennaPod ist ein Podcast-Manager und -Player, der Dir unmittelbar Zugriff auf Millionen von freien und kostenpflichtigen Podcasts ermöglicht, angefangen von unabhängigen Podcastern bis hin zu großen Rundfunkanstalten wie BBC, NPR und CNN. Abonniere, importiere und exportiere deine Feeds mühelos mit Hilfe des iTunes-Verzeichnisses, OPML-Dateien oder einfachen RSS-URLs. Reduziere Aufwand, Stromverbrauch und Datenverbrauch durch die Kontrolle der Downloads (bestimmte Uhrzeiten, Intervalle, WiFi-Netze) und des Löschens von Episoden (basierend auf deinen Favoriten und weiteren Einstellungen).<br>
Aber am wichtigsten: Downloade, streame oder füge Episoden zur Abspielliste hinzu und genieße sie mit einstellbarer Abspielgeschwindigkeit, Unterstützung von Kapiteln und Schlummerfunktion. Mit Flattr kannst du den Podcastern sogar deine Wertschätzung zeigen.
AntennaPod ist, von Podcast-Enthusiasten gemacht, frei im Sinne des Wortes: Open Source, keine Kosten, keine Werbung.
@@ -24,7 +24,7 @@ STEUER DAS SYSTEM<br>
&#8226; Passe das Aussehen mit dem hellen oder dunklen Theme an<br>
&#8226; Sichere deine Abonnements mit gPodder.net oder über den OPML-Export
-<b>Trete der AntennaPod-Community bei!</b><br>
+<b>Tritt der AntennaPod-Community bei!</b><br>
AntennaPod wird aktiv von Freiwilligen weiterentwickelt. Auch du kannst bei der Entwicklung mit Quellcode oder Kommentaren mitwirken!
Wir verwenden GitHub für Funktionswünsche (Feature Requests), Fehlerberichte (Bug Reports) und zum Beisteuern von Code (Code Contributions).
diff --git a/app/src/main/play/el/listing/fulldescription b/app/src/main/play/el/listing/fulldescription
index 87b477fdc..f0ec3ae38 100644
--- a/app/src/main/play/el/listing/fulldescription
+++ b/app/src/main/play/el/listing/fulldescription
@@ -1,11 +1,11 @@
-AntennaPod is a podcast manager and player that gives you instant access to millions of free and paid podcasts, from independent podcasters to large publishing houses such as the BBC, NPR and CNN. Add, import and export their feeds hassle-free using the iTunes podcast database, OPML files or simple RSS URLs. Save effort, battery power and mobile data usage with powerful automation controls for downloading episodes (specify times, intervals and WiFi networks) and deleting episodes (based your favourites and delay settings).<br>
-But most importantly: Download, stream or queue episodes and enjoy them the way you like with adjustable playback speeds, chapter support and a sleep timer. You can even show your love to the content creators with our Flattr integration.
+Το Antennapod είναι μία εφαρμογή διαχείρισης και εκτέλεσης podcasts που σας δίνει άμεση πρόσβαση σε εκατομμύρια δωρεάν και επί πληρωμή podcasts, από ανεξάρτητους podcasters έως μεγάλους εκδοτικούς οίκους όπως το BBC, NPR και CNN. Μπορείτε εύκολα να προσθέσετε, να εισάγετε και να εξάγετε τις ροές τους χρησιμοποιώντας τη βάση δεδομένων podcast του iTunes, αρχεία OPML ή απλά RSS URLs. Γλυτώστε προσπάθεια, μπαταρία και χρήση δεδομένων κινητής τηλεφωνίας με ισχυρές ρυθμίσεις αυτοματισμών για λήψη επεισοδίων (ορίστε τους χρόνους, τα διαστήματα και τα δίκτυα WiFi) και σβήστε επεισόδια (με βάση τα αγαπημένα σας και τις ρυθμίσεις καθυστέρησης).<br>
+Αλλά το πλέον σημαντικό: Κατεβάστε, κάντε stream ή βάλτε στη σειρά επεισόδια και απολαύστε τα όπως επιθυμήτε με ρυθμιζόμενη ταχύτητα αναπαραγωγής, υποστήριξη κεφάλαιων και χρονόμετρο απενεργοποίησης. Μπορείτε ακόμη και να δείξετε την αγάπη σας στους δημιουργούς περιεχομένου μέσω της ενσωμάτωσης του Flattr.
-Made by podcast-enthousiast, AntennaPod is free in all senses of the word: open source, no costs, no ads.
+Φτιαγμένο από λάτρη των podcast, το AntennaPod είναι ελεύθερο με όλες τις έννοιες της λέξης: ανοικτού λογισμικού, χωρίς κόστη, χωρίς διαφημίσεις.
-<b>All features:</b><br>
-IMPORT, ORGANIZE AND PLAY<br>
-&#8226; Add and import feeds via the iTunes and gPodder.net directories, OPML files and RSS or Atom links<br>
+<b>Όλα τα χαρακτηριστικά:</b><br>
+ΕΙΣΑΓΩΓΉ, ΟΡΓΆΝΩΣΗ ΚΑΙ ΕΚΤΈΛΕΣΗ<br>
+&#8226; Προσθέστε και εισάγετε ροές μέσω των φακέλων του iTunes και του gPodder.net, αρχείων OPML και RSS ή συνδέσμους Atom<br>
&#8226; Manage playback from anywhere: homescreen widget, system notification and earplug and bluetooth controls<br>
&#8226; Enjoy listening your way with adjustable playback speed, chapter support (MP3, VorbisComment and Podlove), remembered playback position and an advanced sleep timer (shake to reset, lower volume and slow down playback)<br>
&#8226; Access password-protected feeds and episodes<br>
@@ -24,20 +24,20 @@ CONTROL THE SYSTEM<br>
&#8226; Adapt to your environment using the light and dark theme<br>
&#8226; Back-up your subscriptions with the gPodder.net integration and OPML export
-<b>Join the AntennaPod community!</b><br>
-AntennaPod is under active development by volunteers. You can contribute too, with code or with comment!
+<b>Ενταχθείτε στη κοινότητα του AntennaPod!</b><br>
+Το AntennaPod βρίσκεται υπό ενεργή ανάπτυξη από εθελοντές. Μπορείτε και εσείς να συνεισφέρετε, με κώδικα ή με κάποιο σχόλιο.
-GitHub is the place to go for feature requests, bug reports and code contributions:<br>
+Το Github είναι το μέρος να επισκεφθείτε για να ζητήσετε καινούρια χαρακτηριστικά, να αναφέρετε σφάλματα και για συνεισφορά κώδικα:<br>
https://www.github.com/AntennaPod/AntennaPod
-Our Google Group is the place to share your ideas, favourite podcasting moments and gratitude to all the volunteers:<br>
+Το Google Group μας είναι το μέρος να μοιραστείτε τις ιδέες σας, τις αγαπημένες σας στιγμές ενασχόλησης με τα podcasts και ευγνωμοσύνη σε όλους τους εθελοντές:<br>
https://groups.google.com/forum/#!forum/antennapod
-Have a question or want to give us feedback?
+Έχετε κάποια ερώτηση ή θέλετε να μας δώσετε κάποια ανατροφοδότηση;
https://twitter.com/@AntennaPod
-Transifex is the place to help with translations:<br>
+Το Transifex είναι το μέρος για να βοηθήσετε με τις μεταφράσεις:<br>
https://www.transifex.com/antennapod/antennapod
-Check out our Beta Testing programme to get the latest features first:<br>
+Ελέγξτε το πρόγραμμά μας Beta Testing για να λαμβάνετε τα τελευταία χαρακτηριστικά πρώτοι:<br>
https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/es/listing/fulldescription b/app/src/main/play/es/listing/fulldescription
index 2f1c8861a..96f914f26 100644
--- a/app/src/main/play/es/listing/fulldescription
+++ b/app/src/main/play/es/listing/fulldescription
@@ -1,4 +1,4 @@
-AntennaPod is un gestor y reproductor de podcast que te da acceso instantáneo a millones de podcast gratuitos y de pago, desde podcasters independientes a grandes estaciones como la BBC, NPR y CNN. Agrega, importa y exporta las fuentes de manera sencilla usando el listado de iTunes, archivos OPML o las URL de tipo RSS. Ahorra esfuerzo, batería y datos con los controles de descarga (a horas o intervalos específicos, o redes WiFi) y de borrado de episodios (basado en favoritos y ajustes de tiempo).<br>
+AntennaPod es un gestor y reproductor de podcast que te da acceso instantáneo a millones de podcast gratuitos y pagos, desde podcasters independientes a grandes estaciones como la BBC, NPR y CNN. Agrega, importa y exporta las fuentes de manera sencilla usando el listado de iTunes, archivos OPML o las URL de tipo RSS. Ahorre esfuerzo, energía de la batería y uso de datos móviles con potentes controles de automatización para descargar episodios (especifique horarios, intervalos y redes WiFi) y elimine episodios (según sus preferencias y configuraciones de demora).<br>
Y lo más importante: descarga, escucha en stream y disfrutalos como quieras con velocidad de reproducción variable, soporte para capítulos y temporizador de sueño. Incluso puedes mostrar tu gratitud a los creadores de contenido mediante Flattr.
Hecho por entusiastas del podcasting, AntennaPod es libre, gratuito y sin publicidad.
diff --git a/app/src/main/res/layout/all_episodes_fragment.xml b/app/src/main/res/layout/all_episodes_fragment.xml
index 7dd447bb2..89f900a1f 100644
--- a/app/src/main/res/layout/all_episodes_fragment.xml
+++ b/app/src/main/res/layout/all_episodes_fragment.xml
@@ -10,12 +10,12 @@
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:scrollbarStyle="outsideOverlay"
+ android:clipToPadding="false"
android:paddingTop="@dimen/list_vertical_padding"
android:paddingBottom="@dimen/list_vertical_padding"
- android:clipToPadding="false"
- tools:listitem="@layout/new_episodes_listitem"
- tools:itemCount="13"/>
+ android:scrollbarStyle="outsideOverlay"
+ tools:itemCount="13"
+ tools:listitem="@layout/new_episodes_listitem" />
<ProgressBar
android:id="@+id/progLoading"
diff --git a/app/src/main/res/layout/audio_controls.xml b/app/src/main/res/layout/audio_controls.xml
index 852b6e922..f03e4c03f 100644
--- a/app/src/main/res/layout/audio_controls.xml
+++ b/app/src/main/res/layout/audio_controls.xml
@@ -21,6 +21,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:text="1.00x"/>
</LinearLayout>
@@ -35,6 +36,7 @@
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:gravity="center"
android:text="-"
android:textStyle="bold"
@@ -48,6 +50,7 @@
android:layout_height="32dp"
android:minWidth="0dp"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:gravity="center"
android:text="+"
android:textStyle="bold"
@@ -60,7 +63,9 @@
android:layout_width="match_parent"
android:layout_height="32dp"
android:layout_toRightOf="@id/butDecSpeed"
+ android:layout_toEndOf="@id/butDecSpeed"
android:layout_toLeftOf="@id/butIncSpeed"
+ android:layout_toStartOf="@id/butIncSpeed"
android:layout_centerVertical="true"
android:max="40"/>
@@ -79,6 +84,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="-12dp"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:orientation="horizontal"
android:gravity="center">
@@ -101,6 +107,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:orientation="horizontal"
android:gravity="center">
diff --git a/app/src/main/res/layout/authentication_dialog.xml b/app/src/main/res/layout/authentication_dialog.xml
index 00e74c9e1..187045c63 100644
--- a/app/src/main/res/layout/authentication_dialog.xml
+++ b/app/src/main/res/layout/authentication_dialog.xml
@@ -67,8 +67,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/horizontal_divider"
+ android:layout_toStartOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/cancel_label" />
@@ -78,8 +80,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/horizontal_divider"
+ android:layout_toEndOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/confirm_label" />
</RelativeLayout>
diff --git a/app/src/main/res/layout/directory_chooser.xml b/app/src/main/res/layout/directory_chooser.xml
index 14e2f6a38..5b9269607 100644
--- a/app/src/main/res/layout/directory_chooser.xml
+++ b/app/src/main/res/layout/directory_chooser.xml
@@ -33,8 +33,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/horizontal_divider"
+ android:layout_toStartOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/cancel_label" />
@@ -44,8 +46,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/horizontal_divider"
+ android:layout_toEndOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/confirm_label" />
</RelativeLayout>
@@ -62,6 +66,7 @@
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="?attr/selectableItemBackground"
android:src="?attr/navigation_up"
@@ -77,6 +82,7 @@
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:layout_toRightOf="@id/butNavUp"
+ android:layout_toEndOf="@id/butNavUp"
android:text="@string/selected_folder_label"
android:textStyle="bold"
tools:background="@android:color/holo_green_dark">
@@ -87,9 +93,11 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_below="@id/txtvSelectedFolderLabel"
android:layout_margin="8dp"
android:layout_toRightOf="@id/butNavUp"
+ android:layout_toEndOf="@id/butNavUp"
android:ellipsize="start"
android:scrollHorizontally="true"
android:singleLine="true"
diff --git a/app/src/main/res/layout/download_authentication_activity.xml b/app/src/main/res/layout/download_authentication_activity.xml
index f6925dc3a..3414a5e00 100644
--- a/app/src/main/res/layout/download_authentication_activity.xml
+++ b/app/src/main/res/layout/download_authentication_activity.xml
@@ -77,8 +77,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/horizontal_divider"
+ android:layout_toStartOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/cancel_label"/>
@@ -88,8 +90,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/horizontal_divider"
+ android:layout_toEndOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/confirm_label"/>
</RelativeLayout>
diff --git a/app/src/main/res/layout/downloaded_episodeslist_item.xml b/app/src/main/res/layout/downloaded_episodeslist_item.xml
index 770b88c7e..66ae6c180 100644
--- a/app/src/main/res/layout/downloaded_episodeslist_item.xml
+++ b/app/src/main/res/layout/downloaded_episodeslist_item.xml
@@ -13,6 +13,7 @@
android:layout_gravity="center_vertical"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:contentDescription="@string/cover_label"
android:scaleType="centerCrop"
@@ -24,7 +25,9 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/listitem_threeline_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_textleftpadding"
android:layout_marginRight="@dimen/listitem_threeline_textrightpadding"
+ android:layout_marginEnd="@dimen/listitem_threeline_textrightpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:layout_weight="1"
@@ -74,6 +77,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
tools:text="Jan 23"
tools:background="@android:color/holo_green_dark"/>
diff --git a/app/src/main/res/layout/downloadlist_item.xml b/app/src/main/res/layout/downloadlist_item.xml
index 97f3ac1a1..668ec817a 100644
--- a/app/src/main/res/layout/downloadlist_item.xml
+++ b/app/src/main/res/layout/downloadlist_item.xml
@@ -17,6 +17,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:ellipsize="end"
android:lines="1"
@@ -48,6 +49,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:ellipsize="end"
android:lines="1"
android:textColor="?android:attr/textColorPrimary"
@@ -60,6 +62,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:ellipsize="end"
android:lines="1"
android:textColor="?android:attr/textColorPrimary"
diff --git a/app/src/main/res/layout/downloadlog_item.xml b/app/src/main/res/layout/downloadlog_item.xml
index 712dda63e..505102ea4 100644
--- a/app/src/main/res/layout/downloadlog_item.xml
+++ b/app/src/main/res/layout/downloadlog_item.xml
@@ -17,6 +17,7 @@
android:layout_height="48sp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:textSize="48sp"
android:gravity="center" />
@@ -26,7 +27,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/txtvIcon"
android:layout_alignLeft="@id/txtvIcon"
+ android:layout_alignStart="@id/txtvIcon"
android:layout_alignRight="@id/txtvIcon"
+ android:layout_alignEnd="@id/txtvIcon"
android:layout_marginTop="8dp"
android:text="{fa-repeat}"
tools:text="↻" />
@@ -38,7 +41,9 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
tools:text="Media file"
tools:background="@android:color/holo_green_dark" />
@@ -50,8 +55,11 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/txtvIcon"
+ android:layout_toEndOf="@id/txtvIcon"
android:layout_toLeftOf="@id/txtvType"
+ android:layout_toStartOf="@id/txtvType"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
android:minLines="1"
android:maxLines="2"
@@ -64,8 +72,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/txtvIcon"
+ android:layout_toEndOf="@id/txtvIcon"
android:layout_below="@id/txtvTitle"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
tools:text="January 23"
tools:background="@android:color/holo_green_dark" />
@@ -76,7 +86,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/txtvDate"
android:layout_toRightOf="@id/txtvIcon"
+ android:layout_toEndOf="@id/txtvIcon"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:textColor="?android:attr/textColorTertiary"
android:textSize="@dimen/text_size_micro"
tools:text="@string/design_time_downloaded_log_failure_reason"
diff --git a/app/src/main/res/layout/ellipsize_start_listitem.xml b/app/src/main/res/layout/ellipsize_start_listitem.xml
index 4a70ff982..1b6c48152 100644
--- a/app/src/main/res/layout/ellipsize_start_listitem.xml
+++ b/app/src/main/res/layout/ellipsize_start_listitem.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:background="@android:color/darker_gray">
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ tools:background="@android:color/darker_gray">
<TextView
android:id="@+id/txtvTitle"
- android:textColor="?android:attr/textColorPrimary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textSize="@dimen/text_size_small"
- android:singleLine="true"
android:layout_margin="16dp"
android:ellipsize="start"
- tools:text="List item title"
- tools:background="@android:color/holo_green_dark"/>
+ android:singleLine="true"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="@dimen/text_size_small"
+ tools:background="@android:color/holo_green_dark"
+ tools:text="List item title" />
</LinearLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/feedinfo.xml b/app/src/main/res/layout/feedinfo.xml
index bb544d289..50061c4d8 100644
--- a/app/src/main/res/layout/feedinfo.xml
+++ b/app/src/main/res/layout/feedinfo.xml
@@ -36,7 +36,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_row="0"
app:layout_column="0"
@@ -60,6 +62,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_row="1"
app:layout_column="0"
@@ -83,6 +86,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
app:layout_row="2"
app:layout_column="0"
android:lines="1"
diff --git a/app/src/main/res/layout/feeditem_fragment.xml b/app/src/main/res/layout/feeditem_fragment.xml
index a6ce221db..78c0b3b16 100644
--- a/app/src/main/res/layout/feeditem_fragment.xml
+++ b/app/src/main/res/layout/feeditem_fragment.xml
@@ -32,6 +32,7 @@
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:contentDescription="@string/cover_label"
android:gravity="center_vertical"
@@ -45,6 +46,7 @@
android:layout_height="wrap_content"
android:layout_alignTop="@id/imgvCover"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
tools:text="Podcast title"
tools:background="@android:color/holo_green_dark" />
@@ -54,6 +56,7 @@
android:layout_height="wrap_content"
android:layout_below="@id/txtvPodcast"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:textSize="16sp"
android:textColor="?android:attr/textColorPrimary"
android:ellipsize="end"
@@ -67,6 +70,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:layout_below="@id/txtvTitle"
tools:text="00:42:23"
tools:background="@android:color/holo_green_dark"/>
@@ -77,8 +81,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_below="@id/txtvTitle"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
tools:text="Jan 23"
tools:background="@android:color/holo_green_dark" />
@@ -98,7 +104,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:orientation="horizontal"
tools:background="@android:color/holo_blue_bright">
@@ -108,6 +116,7 @@
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackground"
android:ellipsize="end"
@@ -123,6 +132,7 @@
android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="?attr/selectableItemBackground"
android:ellipsize="end"
diff --git a/app/src/main/res/layout/feeditemlist_header.xml b/app/src/main/res/layout/feeditemlist_header.xml
index 1478e35d7..e1f451e9e 100644
--- a/app/src/main/res/layout/feeditemlist_header.xml
+++ b/app/src/main/res/layout/feeditemlist_header.xml
@@ -19,10 +19,12 @@
android:layout_width="@dimen/thumbnail_length_onlinefeedview"
android:layout_height="@dimen/thumbnail_length_onlinefeedview"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_centerVertical="true"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:contentDescription="@string/cover_label"
tools:src="@drawable/ic_stat_antenna_default"
@@ -33,8 +35,10 @@
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/show_info_label"
@@ -62,9 +66,12 @@
android:layout_alignParentTop="true"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_toLeftOf="@id/butShowInfo"
+ android:layout_toStartOf="@id/butShowInfo"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:ellipsize="end"
android:maxLines="2"
android:shadowColor="@color/black"
@@ -80,8 +87,13 @@
android:layout_below="@id/txtvTitle"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:layout_toLeftOf="@id/butShowSettings"
+ android:layout_toStartOf="@id/butShowSettings"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:ellipsize="end"
android:lines="1"
android:shadowColor="@color/black"
diff --git a/app/src/main/res/layout/feeditemlist_item.xml b/app/src/main/res/layout/feeditemlist_item.xml
index 5a2f091ec..adf0748eb 100644
--- a/app/src/main/res/layout/feeditemlist_item.xml
+++ b/app/src/main/res/layout/feeditemlist_item.xml
@@ -13,6 +13,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:layout_weight="1"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
@@ -24,6 +25,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
@@ -36,9 +38,11 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="4dp"
android:layout_toLeftOf="@id/statusUnread"
+ android:layout_toStartOf="@id/statusUnread"
tools:text="Episode title"
tools:background="@android:color/holo_green_dark" />
@@ -48,6 +52,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_below="@id/txtvItemname"
tools:text="00:42:23"
tools:background="@android:color/holo_green_dark" />
@@ -57,8 +62,10 @@
android:layout_width="@dimen/enc_icons_size"
android:layout_height="@dimen/enc_icons_size"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_below="@id/txtvItemname"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:contentDescription="@string/in_queue_label"
android:src="?attr/stat_playlist"
android:visibility="visible"
@@ -71,7 +78,9 @@
android:layout_height="@dimen/enc_icons_size"
android:layout_below="@id/txtvItemname"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_toLeftOf="@id/imgvInPlaylist"
+ android:layout_toStartOf="@id/imgvInPlaylist"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_hearing_white_18dp"
tools:background="@android:color/holo_red_light" />
@@ -83,7 +92,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/txtvItemname"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_toLeftOf="@id/imgvType"
+ android:layout_toStartOf="@id/imgvType"
tools:text="Jan 23"
tools:background="@android:color/holo_green_dark" />
@@ -92,16 +103,18 @@
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="0dp"
android:layout_height="wrap_content"
+ android:layout_alignBottom="@id/txtvPublished"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
+ android:layout_toStartOf="@id/txtvPublished"
android:layout_toLeftOf="@id/txtvPublished"
+ android:layout_toEndOf="@id/txtvLenSize"
android:layout_toRightOf="@id/txtvLenSize"
- android:layout_alignTop="@id/txtvPublished"
- android:layout_alignBottom="@id/txtvPublished"
- tools:background="@android:color/holo_blue_light"
+ android:layoutDirection="ltr"
+ android:indeterminate="false"
android:max="100"
android:progress="42"
- android:indeterminate="false" />
+ tools:background="@android:color/holo_blue_light" />
</RelativeLayout>
diff --git a/app/src/main/res/layout/feedsettings.xml b/app/src/main/res/layout/feedsettings.xml
index 23d116d4c..9e5f2245b 100644
--- a/app/src/main/res/layout/feedsettings.xml
+++ b/app/src/main/res/layout/feedsettings.xml
@@ -39,7 +39,8 @@
app:layout_row="0"
app:layout_column="0"
app:layout_gravity="center_vertical"
- android:layout_marginRight="10dp" />
+ android:layout_marginRight="10dp"
+ android:layout_marginEnd="10dp" />
<Spinner
android:layout_width="wrap_content"
@@ -97,6 +98,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_row="0"
app:layout_column="0"
@@ -119,6 +121,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_row="1"
app:layout_column="0"
diff --git a/app/src/main/res/layout/gpodnet_podcast_listitem.xml b/app/src/main/res/layout/gpodnet_podcast_listitem.xml
index bbe8e65d6..27a8bbdca 100644
--- a/app/src/main/res/layout/gpodnet_podcast_listitem.xml
+++ b/app/src/main/res/layout/gpodnet_podcast_listitem.xml
@@ -15,8 +15,10 @@
android:layout_width="@dimen/thumbnail_length_itemlist"
android:layout_height="@dimen/thumbnail_length_itemlist"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:adjustViewBounds="true"
android:contentDescription="@string/cover_label"
android:cropToPadding="true"
@@ -30,6 +32,7 @@
android:layout_height="wrap_content"
android:layout_alignTop="@id/txtvTitle"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:orientation="horizontal">
<ImageView
@@ -37,6 +40,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="-4dp"
+ android:layout_marginEnd="-4dp"
android:src="?attr/feed" />
<TextView
@@ -56,7 +60,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:layout_toLeftOf="@id/subscribers_container"
+ android:layout_toStartOf="@id/subscribers_container"
android:layout_alignTop="@id/imgvCover"
android:maxLines="2"
android:includeFontPadding="false"
@@ -69,6 +75,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:layout_below="@id/txtvTitle"
android:textSize="14sp"
android:textColor="?android:attr/textColorSecondary"
diff --git a/app/src/main/res/layout/gpodnet_tag_listitem.xml b/app/src/main/res/layout/gpodnet_tag_listitem.xml
index 9e545e59d..a377f9ba1 100644
--- a/app/src/main/res/layout/gpodnet_tag_listitem.xml
+++ b/app/src/main/res/layout/gpodnet_tag_listitem.xml
@@ -13,6 +13,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:lines="1"
@@ -25,7 +26,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_marginRight="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginEnd="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
tools:text="301"
diff --git a/app/src/main/res/layout/gpodnetauth_credentials.xml b/app/src/main/res/layout/gpodnetauth_credentials.xml
index a290b682b..f995ae4cc 100644
--- a/app/src/main/res/layout/gpodnetauth_credentials.xml
+++ b/app/src/main/res/layout/gpodnetauth_credentials.xml
@@ -59,6 +59,7 @@
android:layout_height="wrap_content"
android:layout_below="@id/etxtPassword"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:text="@string/gpodnetauth_login_butLabel"
android:layout_margin="8dp"/>
@@ -68,7 +69,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/etxtPassword"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_toLeftOf="@id/butLogin"
+ android:layout_toStartOf="@id/butLogin"
android:textColor="@color/download_failed_red"
android:textSize="@dimen/text_size_small"
android:maxLines="2"
@@ -84,7 +87,8 @@
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_alignTop="@+id/butLogin"
- android:layout_toLeftOf="@+id/butLogin"/>
+ android:layout_toLeftOf="@+id/butLogin"
+ android:layout_toStartOf="@+id/butLogin"/>
<TextView
android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/gpodnetauth_device.xml b/app/src/main/res/layout/gpodnetauth_device.xml
index 38455f02c..5840fe955 100644
--- a/app/src/main/res/layout/gpodnetauth_device.xml
+++ b/app/src/main/res/layout/gpodnetauth_device.xml
@@ -41,7 +41,8 @@
android:textColor="?android:attr/textColorSecondary"
android:layout_margin="8dp"
android:layout_alignTop="@+id/etxtDeviceID"
- android:layout_alignLeft="@+id/etxtCaption"/>
+ android:layout_alignLeft="@+id/etxtCaption"
+ android:layout_alignStart="@+id/etxtCaption"/>
<EditText
android:id="@+id/etxtDeviceID"
@@ -49,7 +50,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/etxtCaption"
android:layout_toRightOf="@id/txtvDeviceID"
+ android:layout_toEndOf="@id/txtvDeviceID"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_margin="8dp"/>
<Button
@@ -58,6 +61,7 @@
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_below="@id/etxtDeviceID"
android:text="@string/gpodnetauth_device_butCreateNewDevice"/>
@@ -66,8 +70,10 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_below="@id/etxtDeviceID"
android:layout_toLeftOf="@id/butCreateNewDevice"
+ android:layout_toStartOf="@id/butCreateNewDevice"
android:textColor="@color/download_failed_red"
android:layout_margin="16dp"
android:textSize="@dimen/text_size_small"
@@ -80,6 +86,7 @@
android:layout_height="wrap_content"
android:layout_alignTop="@id/butCreateNewDevice"
android:layout_toLeftOf="@id/butCreateNewDevice"
+ android:layout_toStartOf="@id/butCreateNewDevice"
android:textColor="@color/download_failed_red"
android:textSize="@dimen/text_size_medium"
android:visibility="gone"
@@ -102,7 +109,9 @@
android:text="@string/gpodnetauth_device_butChoose"
android:layout_below="@+id/spinnerChooseDevice"
android:layout_alignLeft="@+id/butCreateNewDevice"
- android:layout_alignRight="@+id/butCreateNewDevice"/>
+ android:layout_alignStart="@+id/butCreateNewDevice"
+ android:layout_alignRight="@+id/butCreateNewDevice"
+ android:layout_alignEnd="@+id/butCreateNewDevice"/>
<Spinner
android:id="@+id/spinnerChooseDevice"
@@ -110,7 +119,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/txtvChooseExistingDevice"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_margin="8dp"
- android:layout_alignParentRight="true"/>
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"/>
</RelativeLayout> \ No newline at end of file
diff --git a/app/src/main/res/layout/itemdescription_listitem.xml b/app/src/main/res/layout/itemdescription_listitem.xml
index 51bc9a5eb..9d03e30a3 100644
--- a/app/src/main/res/layout/itemdescription_listitem.xml
+++ b/app/src/main/res/layout/itemdescription_listitem.xml
@@ -17,8 +17,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:textSize="14sp"
android:textColor="?android:textColorSecondary"
android:ellipsize="end"
@@ -31,8 +33,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/txtvPubDate"
+ android:layout_toStartOf="@id/txtvPubDate"
android:textSize="16sp"
android:textColor="?android:attr/textColorPrimary"
android:ellipsize="end"
diff --git a/app/src/main/res/layout/itunes_podcast_listitem.xml b/app/src/main/res/layout/itunes_podcast_listitem.xml
index 1e6e5a836..4848563b1 100644
--- a/app/src/main/res/layout/itunes_podcast_listitem.xml
+++ b/app/src/main/res/layout/itunes_podcast_listitem.xml
@@ -16,8 +16,10 @@
android:layout_width="@dimen/thumbnail_length_itemlist"
android:layout_height="@dimen/thumbnail_length_itemlist"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:adjustViewBounds="true"
android:contentDescription="@string/cover_label"
android:cropToPadding="true"
@@ -29,6 +31,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:layout_centerVertical="true"
android:orientation="vertical">
diff --git a/app/src/main/res/layout/mediaplayerinfo_activity.xml b/app/src/main/res/layout/mediaplayerinfo_activity.xml
index 21c4940b5..c9e93e149 100644
--- a/app/src/main/res/layout/mediaplayerinfo_activity.xml
+++ b/app/src/main/res/layout/mediaplayerinfo_activity.xml
@@ -47,6 +47,7 @@
android:paddingTop="8dp"
android:layout_alignParentBottom="true"
android:background="?attr/overlay_drawable"
+ android:layoutDirection="ltr"
android:orientation="vertical">
@@ -59,8 +60,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:text="@string/position_default_label"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/text_size_micro"
@@ -71,8 +74,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:text="@string/position_default_label"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/text_size_micro"
@@ -84,9 +89,13 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_toLeftOf="@id/txtvLength"
+ android:layout_toStartOf="@id/txtvLength"
android:layout_toRightOf="@id/txtvPosition"
+ android:layout_toEndOf="@id/txtvPosition"
android:max="500"
tools:background="@android:color/holo_green_dark" />
@@ -106,7 +115,9 @@
android:layout_width="@dimen/audioplayer_playercontrols_length"
android:layout_height="@dimen/audioplayer_playercontrols_length"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:layout_centerHorizontal="true"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/pause_label"
@@ -120,7 +131,9 @@
android:layout_width="@dimen/audioplayer_playercontrols_length"
android:layout_height="@dimen/audioplayer_playercontrols_length"
android:layout_toLeftOf="@id/butPlay"
+ android:layout_toStartOf="@id/butPlay"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/rewind_label"
android:src="?attr/av_rew_big"
@@ -134,7 +147,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/butRev"
android:layout_alignLeft="@id/butRev"
+ android:layout_alignStart="@id/butRev"
android:layout_alignRight="@id/butRev"
+ android:layout_alignEnd="@id/butRev"
android:layout_marginTop="-8dp"
android:gravity="center"
android:text="30"
@@ -147,6 +162,7 @@
android:layout_width="@dimen/audioplayer_playercontrols_length"
android:layout_height="@dimen/audioplayer_playercontrols_length"
android:layout_toLeftOf="@id/butRev"
+ android:layout_toStartOf="@id/butRev"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/set_playback_speed_label"
android:src="?attr/av_fast_forward"
@@ -161,6 +177,7 @@
android:layout_width="@dimen/audioplayer_playercontrols_length"
android:layout_height="@dimen/audioplayer_playercontrols_length"
android:layout_toLeftOf="@id/butRev"
+ android:layout_toStartOf="@id/butRev"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/cast_disconnect_label"
android:src="?attr/ic_cast_disconnect"
@@ -175,7 +192,9 @@
android:layout_width="@dimen/audioplayer_playercontrols_length"
android:layout_height="@dimen/audioplayer_playercontrols_length"
android:layout_toRightOf="@id/butPlay"
+ android:layout_toEndOf="@id/butPlay"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:background="?attr/selectableItemBackground"
android:contentDescription="@string/fast_forward_label"
android:src="?attr/av_ff_big"
@@ -189,7 +208,9 @@
android:layout_height="wrap_content"
android:layout_below="@id/butFF"
android:layout_alignLeft="@id/butFF"
+ android:layout_alignStart="@id/butFF"
android:layout_alignRight="@id/butFF"
+ android:layout_alignEnd="@id/butFF"
android:layout_marginTop="-8dp"
android:gravity="center"
android:text="30"
@@ -202,6 +223,7 @@
android:layout_width="@dimen/audioplayer_playercontrols_length"
android:layout_height="@dimen/audioplayer_playercontrols_length"
android:layout_toRightOf="@id/butFF"
+ android:layout_toEndOf="@id/butFF"
android:background="?attr/selectableItemBackground"
android:scaleType="fitCenter"
android:src="?attr/av_skip_big"
diff --git a/app/src/main/res/layout/nav_feedlistitem.xml b/app/src/main/res/layout/nav_feedlistitem.xml
index 18b5255aa..9f19157fc 100644
--- a/app/src/main/res/layout/nav_feedlistitem.xml
+++ b/app/src/main/res/layout/nav_feedlistitem.xml
@@ -5,7 +5,6 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="@dimen/listitem_iconwithtext_height"
- android:paddingRight="@dimen/listitem_threeline_verticalpadding"
tools:background="@android:color/darker_gray">
<ImageView
@@ -14,6 +13,7 @@
android:layout_width="@dimen/thumbnail_length_navlist"
android:layout_height="@dimen/thumbnail_length_navlist"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:cropToPadding="true"
@@ -21,6 +21,7 @@
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_marginLeft="@dimen/listitem_icon_leftpadding"
+ android:layout_marginStart="@dimen/listitem_icon_leftpadding"
tools:src="@drawable/ic_stat_antenna_default"
tools:background="@android:color/holo_green_dark"/>
@@ -29,10 +30,14 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/list_vertical_padding"
+ android:layout_marginStart="@dimen/list_vertical_padding"
+ android:layout_marginRight="@dimen/listitem_icon_rightpadding"
+ android:layout_marginEnd="@dimen/listitem_icon_rightpadding"
android:lines="1"
android:textColor="?android:attr/textColorTertiary"
android:textSize="@dimen/text_size_navdrawer"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
tools:text="23"
tools:background="@android:color/holo_green_dark"/>
@@ -42,7 +47,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/txtvCount"
+ android:layout_toStartOf="@id/txtvCount"
android:layout_marginLeft="@dimen/list_vertical_padding"
+ android:layout_marginStart="@dimen/list_vertical_padding"
android:layout_alignWithParentIfMissing="true"
android:lines="1"
android:text="{fa-exclamation-circle}"
@@ -63,8 +70,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/listitem_iconwithtext_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_iconwithtext_textleftpadding"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:layout_toLeftOf="@id/itxtvFailure"
+ android:layout_toStartOf="@id/itxtvFailure"
android:layout_alignWithParentIfMissing="true"
tools:text="Navigation feed item title"
tools:background="@android:color/holo_green_dark"/>
diff --git a/app/src/main/res/layout/nav_list.xml b/app/src/main/res/layout/nav_list.xml
index e2fe61e28..2d044f548 100644
--- a/app/src/main/res/layout/nav_list.xml
+++ b/app/src/main/res/layout/nav_list.xml
@@ -24,6 +24,7 @@
android:layout_height="@dimen/thumbnail_length_navlist"
android:layout_marginBottom="4dp"
android:layout_marginLeft="@dimen/listitem_icon_leftpadding"
+ android:layout_marginStart="@dimen/listitem_icon_leftpadding"
android:layout_marginTop="4dp"
android:adjustViewBounds="true"
android:contentDescription="@string/cover_label"
@@ -39,6 +40,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="@string/settings_label"
diff --git a/app/src/main/res/layout/nav_listitem.xml b/app/src/main/res/layout/nav_listitem.xml
index d62672c34..c140533e6 100644
--- a/app/src/main/res/layout/nav_listitem.xml
+++ b/app/src/main/res/layout/nav_listitem.xml
@@ -13,12 +13,14 @@
android:layout_width="@dimen/thumbnail_length_navlist"
android:layout_height="@dimen/thumbnail_length_navlist"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:cropToPadding="true"
android:scaleType="centerInside"
android:padding="4dp"
android:layout_marginLeft="@dimen/listitem_icon_leftpadding"
+ android:layout_marginStart="@dimen/listitem_icon_leftpadding"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
tools:src="@drawable/ic_new_releases_white_24dp"
@@ -36,8 +38,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/listitem_iconwithtext_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_iconwithtext_textleftpadding"
android:layout_marginRight="48dp"
+ android:layout_marginEnd="48dp"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
tools:text="Navigation item title"
tools:background="@android:color/holo_green_dark"
/>
@@ -50,8 +55,11 @@
android:textColor="?android:attr/textColorTertiary"
android:textSize="@dimen/text_size_navdrawer"
android:layout_marginLeft="12dp"
+ android:layout_marginStart="12dp"
android:layout_marginRight="@dimen/listitem_icon_rightpadding"
+ android:layout_marginEnd="@dimen/listitem_icon_rightpadding"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
tools:text="23"
tools:background="@android:color/holo_green_dark"/>
diff --git a/app/src/main/res/layout/new_episodes_listitem.xml b/app/src/main/res/layout/new_episodes_listitem.xml
index 5e0d7451b..150d692e7 100644
--- a/app/src/main/res/layout/new_episodes_listitem.xml
+++ b/app/src/main/res/layout/new_episodes_listitem.xml
@@ -26,6 +26,7 @@
android:layout_gravity="center_vertical"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:background="@color/light_gray"
android:ellipsize="end"
@@ -37,8 +38,10 @@
android:layout_height="64dp"
android:layout_width="64dp"
android:layout_alignLeft="@id/txtvPlaceholder"
+ android:layout_alignStart="@id/txtvPlaceholder"
android:layout_alignTop="@id/txtvPlaceholder"
android:layout_alignRight="@id/txtvPlaceholder"
+ android:layout_alignEnd="@id/txtvPlaceholder"
android:layout_alignBottom="@id/txtvPlaceholder"
android:contentDescription="@string/cover_label"
tools:src="@tools:sample/avatars" />
@@ -50,7 +53,9 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:layout_marginLeft="@dimen/listitem_threeline_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_textleftpadding"
android:layout_marginRight="@dimen/listitem_threeline_textrightpadding"
+ android:layout_marginEnd="@dimen/listitem_threeline_textrightpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_weight="1">
@@ -61,8 +66,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
tools:text="@sample/episodes.json/data/status_label"/>
<TextView
@@ -71,8 +78,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/statusUnread"
+ android:layout_toStartOf="@id/statusUnread"
tools:text="@sample/episodes.json/data/title" />
<RelativeLayout
@@ -82,7 +91,9 @@
android:layout_below="@id/txtvTitle"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true">
+ android:layout_alignParentStart="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true">
<TextView
android:id="@+id/txtvDuration"
@@ -90,6 +101,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
tools:text="@sample/episodes.json/data/duration" />
<ImageView
@@ -97,7 +109,9 @@
android:layout_width="@dimen/enc_icons_size"
android:layout_height="@dimen/enc_icons_size"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:contentDescription="@string/in_queue_label"
android:src="?attr/stat_playlist"
tools:src="@sample/inplaylist" />
@@ -109,6 +123,7 @@
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/imgvInPlaylist"
+ android:layout_toStartOf="@id/imgvInPlaylist"
android:ellipsize="end"
tools:text="@sample/episodes.json/data/published_at" />
diff --git a/app/src/main/res/layout/onlinefeedview_header.xml b/app/src/main/res/layout/onlinefeedview_header.xml
index 491d955fb..4217322e4 100644
--- a/app/src/main/res/layout/onlinefeedview_header.xml
+++ b/app/src/main/res/layout/onlinefeedview_header.xml
@@ -10,6 +10,7 @@
android:layout_width="@dimen/thumbnail_length_onlinefeedview"
android:layout_height="@dimen/thumbnail_length_onlinefeedview"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
@@ -24,10 +25,13 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_marginBottom="8dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="2"
@@ -41,7 +45,9 @@
android:layout_below="@id/txtvTitle"
android:layout_marginBottom="8dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:ellipsize="end"
android:lines="1"
android:textColor="?android:attr/textColorSecondary"
@@ -61,7 +67,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:layout_marginTop="8dp"
android:textColor="?android:attr/textColorPrimary"
android:textSize="@dimen/text_size_micro" />
@@ -80,7 +88,9 @@
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
android:textColor="?android:attr/textColorSecondary"
android:textSize="@dimen/text_size_small"
tools:text="@string/design_time_lorem_ipsum"
diff --git a/app/src/main/res/layout/opml_selection.xml b/app/src/main/res/layout/opml_selection.xml
index 3133debd1..f8f37b5ac 100644
--- a/app/src/main/res/layout/opml_selection.xml
+++ b/app/src/main/res/layout/opml_selection.xml
@@ -32,8 +32,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@id/horizontal_divider"
+ android:layout_toStartOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/cancel_label" />
@@ -43,8 +45,10 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_toRightOf="@id/horizontal_divider"
+ android:layout_toEndOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
android:text="@string/confirm_label" />
</RelativeLayout>
diff --git a/app/src/main/res/layout/queue_listitem.xml b/app/src/main/res/layout/queue_listitem.xml
index 7d18b386d..6b41b68d5 100644
--- a/app/src/main/res/layout/queue_listitem.xml
+++ b/app/src/main/res/layout/queue_listitem.xml
@@ -60,7 +60,9 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:layout_marginLeft="@dimen/listitem_threeline_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_textleftpadding"
android:layout_marginRight="@dimen/listitem_threeline_textrightpadding"
+ android:layout_marginEnd="@dimen/listitem_threeline_textrightpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_weight="1"
tools:background="@android:color/holo_red_dark">
@@ -73,9 +75,11 @@
android:layout_height="wrap_content"
android:lines="2"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="8dp"
- android:gravity="right|top"
+ android:layout_marginStart="8dp"
+ android:gravity="end|top"
android:text="Feb\n12"
tools:background="@android:color/holo_blue_light" />
@@ -85,7 +89,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/txtvPubDate"
+ android:layout_toStartOf="@id/txtvPubDate"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:text="Queue item title"
android:ellipsize="end"
@@ -98,7 +104,9 @@
android:layout_below="@id/txtvTitle"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
- android:layout_alignParentRight="true">
+ android:layout_alignParentStart="true"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true">
<TextView
android:id="@+id/txtvProgressLeft"
@@ -106,6 +114,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_marginBottom="0dp"
android:text="00:42:23"
tools:background="@android:color/holo_blue_light"/>
@@ -116,6 +125,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_marginBottom="0dp"
tools:text="Jan 23"
tools:background="@android:color/holo_green_dark" />
@@ -126,6 +136,7 @@
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_below="@id/txtvProgressLeft"
+ android:layoutDirection="ltr"
android:max="100"
tools:background="@android:color/holo_blue_light" />
diff --git a/app/src/main/res/layout/searchlist_item.xml b/app/src/main/res/layout/searchlist_item.xml
index 83ba39cd5..50374c737 100644
--- a/app/src/main/res/layout/searchlist_item.xml
+++ b/app/src/main/res/layout/searchlist_item.xml
@@ -12,8 +12,10 @@
android:layout_width="@dimen/thumbnail_length_itemlist"
android:layout_height="@dimen/thumbnail_length_itemlist"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:contentDescription="@string/cover_label"
android:scaleType="centerCrop"
tools:src="@drawable/ic_stat_antenna_default"
@@ -23,8 +25,11 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/listitem_iconwithtext_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_iconwithtext_textleftpadding"
android:layout_marginRight="@dimen/listitem_threeline_verticalpadding"
+ android:layout_marginEnd="@dimen/listitem_threeline_verticalpadding"
android:layout_toRightOf="@id/imgvFeedimage"
+ android:layout_toEndOf="@id/imgvFeedimage"
android:orientation="vertical"
tools:background="@android:color/holo_red_dark">
diff --git a/app/src/main/res/layout/simplechapter_item.xml b/app/src/main/res/layout/simplechapter_item.xml
index 28cdb08c3..0d02eac1a 100644
--- a/app/src/main/res/layout/simplechapter_item.xml
+++ b/app/src/main/res/layout/simplechapter_item.xml
@@ -13,6 +13,7 @@
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:gravity="center_vertical"
tools:text="Start"
tools:background="@android:color/holo_green_dark" />
@@ -22,7 +23,9 @@
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/listitem_threeline_verticalpadding"
android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginRight="@dimen/listitem_threeline_horizontalpadding"
+ android:layout_marginEnd="@dimen/listitem_threeline_horizontalpadding"
android:layout_marginTop="@dimen/listitem_threeline_verticalpadding"
android:layout_weight="1"
android:gravity="center_vertical"
diff --git a/app/src/main/res/layout/statistics_listitem.xml b/app/src/main/res/layout/statistics_listitem.xml
index 20e01bf32..b186add9e 100644
--- a/app/src/main/res/layout/statistics_listitem.xml
+++ b/app/src/main/res/layout/statistics_listitem.xml
@@ -4,7 +4,10 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="@dimen/listitem_iconwithtext_height"
+ android:paddingLeft="@dimen/listitem_threeline_verticalpadding"
+ android:paddingStart="@dimen/listitem_threeline_verticalpadding"
android:paddingRight="@dimen/listitem_threeline_verticalpadding"
+ android:paddingEnd="@dimen/listitem_threeline_verticalpadding"
tools:background="@android:color/darker_gray">
<ImageView
@@ -13,13 +16,13 @@
android:layout_width="@dimen/thumbnail_length_navlist"
android:layout_height="@dimen/thumbnail_length_navlist"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:adjustViewBounds="true"
android:cropToPadding="true"
android:scaleType="centerCrop"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
- android:layout_marginLeft="@dimen/listitem_icon_leftpadding"
tools:src="@drawable/ic_stat_antenna_default"
tools:background="@android:color/holo_green_dark"/>
@@ -28,10 +31,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/list_vertical_padding"
+ android:layout_marginStart="@dimen/list_vertical_padding"
android:lines="1"
android:textColor="?android:attr/textColorTertiary"
android:textSize="@dimen/text_size_navdrawer"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
tools:text="23"
tools:background="@android:color/holo_green_dark"/>
@@ -47,8 +52,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/listitem_iconwithtext_textleftpadding"
+ android:layout_marginStart="@dimen/listitem_iconwithtext_textleftpadding"
android:layout_toRightOf="@id/imgvCover"
+ android:layout_toEndOf="@id/imgvCover"
android:layout_toLeftOf="@id/txtvTime"
+ android:layout_toStartOf="@id/txtvTime"
android:layout_alignWithParentIfMissing="true"
tools:text="Navigation feed item title"
tools:background="@android:color/holo_green_dark"/>
diff --git a/app/src/main/res/layout/videoplayer_activity.xml b/app/src/main/res/layout/videoplayer_activity.xml
index 10fbf8f49..ebea0c618 100644
--- a/app/src/main/res/layout/videoplayer_activity.xml
+++ b/app/src/main/res/layout/videoplayer_activity.xml
@@ -25,6 +25,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
+ android:layoutDirection="ltr"
android:orientation="horizontal">
<ImageButton
@@ -68,6 +69,7 @@
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#80000000"
+ android:layoutDirection="ltr"
android:paddingTop="8dp">
<TextView
@@ -75,10 +77,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginTop="4dp"
android:text="@string/position_default_label"
android:textColor="@color/white"
@@ -89,10 +94,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
android:layout_marginRight="8dp"
+ android:layout_marginEnd="8dp"
android:layout_marginTop="4dp"
android:text="@string/position_default_label"
android:textColor="@color/white"
@@ -103,7 +111,9 @@
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/txtvLength"
+ android:layout_toStartOf="@+id/txtvLength"
android:layout_toRightOf="@+id/txtvPosition"
+ android:layout_toEndOf="@+id/txtvPosition"
android:layout_centerInParent="true"
android:max="500" />
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index d3b72e17c..f45847e54 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -8,7 +8,7 @@
<Preference
android:key="prefScreenInterface"
android:title="@string/user_interface_label"
- android:icon="?attr/type_video" />
+ android:icon="?attr/ic_cellphone_text" />
<Preference
android:key="prefScreenPlayback"
@@ -38,16 +38,21 @@
<PreferenceCategory android:title="@string/project_pref">
<Preference
android:key="prefFaq"
- android:title="@string/pref_faq"/>
+ android:title="@string/pref_faq"
+ android:icon="?attr/ic_question_answer" />
+
<Preference
android:key="prefKnownIssues"
- android:title="@string/pref_known_issues"/>
+ android:title="@string/pref_known_issues"
+ android:icon="?attr/ic_known_issues" />
<Preference
android:key="prefSendCrashReport"
android:title="@string/crash_report_title"
- android:summary="@string/crash_report_sum"/>
+ android:summary="@string/crash_report_sum"
+ android:icon="?attr/ic_bug" />
<Preference
android:key="prefAbout"
- android:title="@string/about_pref"/>
+ android:title="@string/about_pref"
+ android:icon="?attr/action_about" />
</PreferenceCategory>
</PreferenceScreen>
diff --git a/app/src/main/res/xml/preferences_user_interface.xml b/app/src/main/res/xml/preferences_user_interface.xml
index da694b844..1d970a5f7 100644
--- a/app/src/main/res/xml/preferences_user_interface.xml
+++ b/app/src/main/res/xml/preferences_user_interface.xml
@@ -57,4 +57,14 @@
android:summary="@string/pref_lockscreen_background_sum"
android:title="@string/pref_lockscreen_background_title"/>
</PreferenceCategory>
+ <PreferenceCategory android:title="@string/behavior">
+ <ListPreference
+ android:entryValues="@array/back_button_behavior_values"
+ android:entries="@array/back_button_behavior_options"
+ android:key="prefBackButtonBehavior"
+ android:title="@string/pref_back_button_behavior_title"
+ android:summary="@string/pref_back_button_behavior_sum"
+ android:defaultValue="default"
+ app:useStockLayout="true"/>
+ </PreferenceCategory>
</PreferenceScreen>
diff --git a/build.gradle b/build.gradle
index 154c00ac3..a1140581e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -42,7 +42,8 @@ project.ext {
minSdkVersion = 14
targetSdkVersion = 26
- supportVersion = "26.1.0"
+ supportVersion = "27.1.1"
+ awaitilityVersion = "3.1.2"
commonsioVersion = "2.5"
commonslangVersion = "3.6"
commonstextVersion = "1.3"
diff --git a/contributers.template.py b/contributers.template.py
index 3127baa0c..0f4d78698 100755
--- a/contributers.template.py
+++ b/contributers.template.py
@@ -6,7 +6,15 @@ TRANSIFEX_USER = ""
TRANSIFEX_PW = ""
print('DEVELOPERS\n==========\n')
-p = subprocess.Popen("git log --format='%aN' | sort -fu", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+p = subprocess.Popen("git log --format='%aN' --no-merges "
+ +"| grep -v '@' " # No email adresses
+ +"| grep -v 'no.reply' " # no.reply
+ +"| sed -e 's/^\(Daniel\|daniel oeh\|danieloeh\)$/Daniel Oeh/I'" # Duplicate name
+ +"| sed -e 's/^keunes$/Koen Glotzbach/'" # Duplicate name
+ +"| sed -e 's/^H. Lehmann$/ByteHamster/'" # Duplicate name
+ +"| sed -e 's/^domingos86$/Domingos Lopes/'" # Duplicate name
+ +"| sed -e 's/^orionlee$/Sam Lee/'" # Duplicate name
+ +"| sort -fu", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
output = line.decode()
print(output, end='')
@@ -17,6 +25,7 @@ language_codes = {
"af": "Afrikaans",
"ak_GH": "Akan (Ghana)",
"ak": "Akan",
+ "ast_ES": "Asturian (Spain)",
"sq_AL": "Albanian (Albania)",
"sq": "Albanian",
"am_ET": "Amharic (Ethiopia)",
diff --git a/core/build.gradle b/core/build.gradle
index 4dc52767a..95b9db35a 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -10,7 +10,7 @@ android {
versionCode 1
versionName "1.0"
testApplicationId "de.danoeh.antennapod.core.tests"
- testInstrumentationRunner "de.danoeh.antennapod.core.AntennaPodTestRunner"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
@@ -67,6 +67,7 @@ dependencies {
implementation "de.greenrobot:eventbus:$eventbusVersion"
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
implementation "io.reactivex.rxjava2:rxjava:$rxJavaVersion"
+ implementation "org.awaitility:awaitility:$awaitilityVersion"
implementation "com.google.android.exoplayer:exoplayer:$exoPlayerVersion"
implementation "com.github.AntennaPod:AntennaPod-AudioPlayer:$audioPlayerVersion"
@@ -83,6 +84,9 @@ dependencies {
}
testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test:rules:1.0.2'
}
diff --git a/core/src/androidTest/java/de/danoeh/antennapod/core/AntennaPodTestRunner.java b/core/src/androidTest/java/de/danoeh/antennapod/core/AntennaPodTestRunner.java
deleted file mode 100644
index 5d086c054..000000000
--- a/core/src/androidTest/java/de/danoeh/antennapod/core/AntennaPodTestRunner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package de.danoeh.antennapod.core;
-
-import android.test.InstrumentationTestRunner;
-import android.test.suitebuilder.TestSuiteBuilder;
-
-import junit.framework.TestSuite;
-
-public class AntennaPodTestRunner extends InstrumentationTestRunner {
-
- @Override
- public TestSuite getAllTests() {
- return new TestSuiteBuilder(AntennaPodTestRunner.class)
- .includeAllPackagesUnderHere()
- .build();
- }
-} \ No newline at end of file
diff --git a/core/src/main/java/android/support/v4/app/SafeJobIntentService.java b/core/src/main/java/android/support/v4/app/SafeJobIntentService.java
new file mode 100644
index 000000000..c07c409ee
--- /dev/null
+++ b/core/src/main/java/android/support/v4/app/SafeJobIntentService.java
@@ -0,0 +1,118 @@
+package android.support.v4.app;
+
+import android.app.job.JobParameters;
+import android.app.job.JobServiceEngine;
+import android.app.job.JobWorkItem;
+import android.content.Intent;
+import android.os.Build;
+import android.os.IBinder;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+
+
+public abstract class SafeJobIntentService extends JobIntentService {
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ if (Build.VERSION.SDK_INT >= 26) {
+ mJobImpl = new SafeJobServiceEngineImpl(this);
+ }
+ }
+
+ /**
+ * Implementation of a safe JobServiceEngine for interaction with JobIntentService.
+ */
+ @RequiresApi(26)
+ static final class SafeJobServiceEngineImpl extends JobServiceEngine
+ implements JobIntentService.CompatJobEngine {
+ static final String TAG = "JobServiceEngineImpl";
+
+ static final boolean DEBUG = false;
+
+ final JobIntentService mService;
+ final Object mLock = new Object();
+ JobParameters mParams;
+
+ final class WrapperWorkItem implements JobIntentService.GenericWorkItem {
+ final JobWorkItem mJobWork;
+
+ WrapperWorkItem(JobWorkItem jobWork) {
+ mJobWork = jobWork;
+ }
+
+ @Override
+ public Intent getIntent() {
+ return mJobWork.getIntent();
+ }
+
+ @Override
+ public void complete() {
+ synchronized (mLock) {
+ if (mParams != null) {
+ try {
+ mParams.completeWork(mJobWork);
+ } catch (SecurityException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ }
+ }
+ }
+ }
+ }
+
+ SafeJobServiceEngineImpl(JobIntentService service) {
+ super(service);
+ mService = service;
+ }
+
+ @Override
+ public IBinder compatGetBinder() {
+ return getBinder();
+ }
+
+ @Override
+ public boolean onStartJob(JobParameters params) {
+ if (DEBUG) Log.d(TAG, "onStartJob: " + params);
+ mParams = params;
+ // We can now start dequeuing work!
+ mService.ensureProcessorRunningLocked(false);
+ return true;
+ }
+
+ @Override
+ public boolean onStopJob(JobParameters params) {
+ if (DEBUG) Log.d(TAG, "onStartJob: " + params);
+ boolean result = mService.doStopCurrentWork();
+ synchronized (mLock) {
+ // Once we return, the job is stopped, so its JobParameters are no
+ // longer valid and we should not be doing anything with them.
+ mParams = null;
+ }
+ return result;
+ }
+
+ /**
+ * Dequeue some work.
+ */
+ @Override
+ public JobIntentService.GenericWorkItem dequeueWork() {
+ JobWorkItem work = null;
+ synchronized (mLock) {
+ if (mParams == null) {
+ return null;
+ }
+ try {
+ work = mParams.dequeueWork();
+ } catch (SecurityException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ }
+ }
+ if (work != null) {
+ work.getIntent().setExtrasClassLoader(mService.getClassLoader());
+ return new WrapperWorkItem(work);
+ } else {
+ return null;
+ }
+ }
+ }
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
index ea07fc76e..8ad70c328 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
@@ -10,20 +10,15 @@ import android.util.Log;
import org.antennapod.audio.MediaPlayer;
-import java.io.File;
-import java.util.List;
-
-import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.core.storage.DBReader;
-import de.danoeh.antennapod.core.storage.DBWriter;
/*
* This class's job is do perform maintenance tasks whenever the app has been updated
*/
class UpdateManager {
+ private UpdateManager(){}
+
private static final String TAG = UpdateManager.class.getSimpleName();
private static final String PREF_NAME = "app_version";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java
index 74693cf21..4504b2e7f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java
@@ -2,14 +2,12 @@ package de.danoeh.antennapod.core.asynctask;
import android.app.ProgressDialog;
import android.content.Context;
-import android.content.Intent;
import android.os.AsyncTask;
import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.feed.Feed;
-import de.danoeh.antennapod.core.service.download.DownloadService;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.util.IntentUtils;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java
index f4c99011a..318e404c8 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java
@@ -10,7 +10,6 @@ import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
-import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import org.shredzone.flattr4j.exception.FlattrException;
import java.util.LinkedList;
@@ -27,6 +26,7 @@ import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.util.NetworkUtils;
import de.danoeh.antennapod.core.util.flattr.FlattrThing;
import de.danoeh.antennapod.core.util.flattr.FlattrUtils;
+import de.danoeh.antennapod.core.util.gui.NotificationUtils;
/**
* Performs a click action in a background thread.
diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrStatusFetcher.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrStatusFetcher.java
index 420a60469..6d9ab2bd3 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrStatusFetcher.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrStatusFetcher.java
@@ -19,11 +19,9 @@ import de.danoeh.antennapod.core.util.flattr.FlattrUtils;
public class FlattrStatusFetcher extends Thread {
private static final String TAG = "FlattrStatusFetcher";
- private final Context context;
public FlattrStatusFetcher(Context context) {
super();
- this.context = context;
}
@Override
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java
index a3f91b1c9..2610d253f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java
@@ -50,7 +50,7 @@ public abstract class FeedComponent {
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (o == null || !(o instanceof FeedComponent)) return false;
FeedComponent that = (FeedComponent) o;
@@ -62,4 +62,4 @@ public abstract class FeedComponent {
public int hashCode() {
return (int) (id ^ (id >>> 32));
}
-} \ No newline at end of file
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java
index b0a87c885..0f0343f25 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java
@@ -2,9 +2,8 @@ package de.danoeh.antennapod.core.feed;
import android.database.Cursor;
import android.support.annotation.Nullable;
-
import android.text.TextUtils;
-import de.danoeh.antennapod.core.asynctask.ImageResource;
+
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
@@ -15,6 +14,7 @@ import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;
+import de.danoeh.antennapod.core.asynctask.ImageResource;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.PodDBAdapter;
import de.danoeh.antennapod.core.util.ShownotesProvider;
@@ -194,7 +194,7 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
if (other.link != null) {
link = other.link;
}
- if (other.pubDate != null && other.pubDate != pubDate) {
+ if (other.pubDate != null && other.pubDate.equals(pubDate)) {
pubDate = other.pubDate;
}
if (other.media != null) {
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 200153876..719383d23 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
@@ -8,6 +8,8 @@ import java.util.List;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.util.LongList;
+import static de.danoeh.antennapod.core.feed.FeedItem.TAG_FAVORITE;
+
public class FeedItemFilter {
private final String[] mProperties;
@@ -19,6 +21,7 @@ public class FeedItemFilter {
private boolean showDownloaded = false;
private boolean showNotDownloaded = false;
private boolean showHasMedia = false;
+ private boolean showIsFavorite = false;
public FeedItemFilter(String properties) {
this(TextUtils.split(properties, ","));
@@ -53,6 +56,9 @@ public class FeedItemFilter {
case "has_media":
showHasMedia = true;
break;
+ case "is_favorite":
+ showIsFavorite = true;
+ break;
}
}
}
@@ -88,6 +94,8 @@ public class FeedItemFilter {
if (showHasMedia && !item.hasMedia()) continue;
+ if (showIsFavorite && !item.isTagged(TAG_FAVORITE)) continue;
+
// If the item reaches here, it meets all criteria
result.add(item);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
index 73d2bb34d..39994ec16 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
@@ -532,8 +532,8 @@ public class FeedMedia extends FeedFile implements Playable {
UserPreferences.isAutoFlattr() &&
item.getPaymentLink() != null &&
item.getFlattrStatus().getUnflattred() &&
- (completed && autoFlattrThreshold <= 1.0f ||
- played_duration >= autoFlattrThreshold * duration)) {
+ ((completed && autoFlattrThreshold <= 1.0f) ||
+ (played_duration >= autoFlattrThreshold * duration))) {
DBTasks.flattrItemIfLoggedIn(context, item);
}
}
@@ -626,6 +626,9 @@ public class FeedMedia extends FeedFile implements Playable {
@Override
public boolean equals(Object o) {
+ if (o == null) {
+ return false;
+ }
if (FeedMediaFlavorHelper.instanceOfRemoteMedia(o)) {
return o.equals(this);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideSettings.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideSettings.java
index fc1acd0e1..d0061af99 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideSettings.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideSettings.java
@@ -6,6 +6,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
* The settings that AntennaPod will use for various Glide options
*/
public class ApGlideSettings {
+ private ApGlideSettings(){}
public static final DiskCacheStrategy AP_DISK_CACHE_STRATEGY = DiskCacheStrategy.ALL;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java
index b76988fd8..330cde525 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java
@@ -169,7 +169,7 @@ public class GpodnetEpisodeAction {
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (o == null || !(o instanceof GpodnetEpisodeAction)) return false;
GpodnetEpisodeAction that = (GpodnetEpisodeAction) o;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java
index b51b8d996..5b17dd338 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java
@@ -24,6 +24,8 @@ import de.danoeh.antennapod.core.service.GpodnetSyncService;
*/
public class GpodnetPreferences {
+ private GpodnetPreferences(){}
+
private static final String TAG = "GpodnetPreferences";
private static final String PREF_NAME = "gpodder.net";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java
index b7ed890f5..0f3a9fcb3 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java
@@ -23,7 +23,6 @@ public class SleepTimerPreferences {
private static final String DEFAULT_VALUE = "15";
private static final int DEFAULT_TIME_UNIT = 1;
- private static Context context;
private static SharedPreferences prefs;
/**
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 58071495a..049dd120d 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
@@ -36,6 +36,7 @@ import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
* when called.
*/
public class UserPreferences {
+ private UserPreferences(){}
private static final String IMPORT_DIR = "import/";
@@ -46,11 +47,13 @@ public class UserPreferences {
public static final String PREF_HIDDEN_DRAWER_ITEMS = "prefHiddenDrawerItems";
private static final String PREF_DRAWER_FEED_ORDER = "prefDrawerFeedOrder";
private static final String PREF_DRAWER_FEED_COUNTER = "prefDrawerFeedIndicator";
- private static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify";
+ public static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify";
private static final String PREF_PERSISTENT_NOTIFICATION = "prefPersistNotify";
public static final String PREF_COMPACT_NOTIFICATION_BUTTONS = "prefCompactNotificationButtons";
public static final String PREF_LOCKSCREEN_BACKGROUND = "prefLockscreenBackground";
private static final String PREF_SHOW_DOWNLOAD_REPORT = "prefShowDownloadReport";
+ public static final String PREF_BACK_BUTTON_BEHAVIOR = "prefBackButtonBehavior";
+ private static final String PREF_BACK_BUTTON_GO_TO_PAGE = "prefBackButtonGoToPage";
// Queue
private static final String PREF_QUEUE_ADD_TO_FRONT = "prefQueueAddToFront";
@@ -809,4 +812,29 @@ public class UserPreferences {
public enum VideoBackgroundBehavior {
STOP, PICTURE_IN_PICTURE, CONTINUE_PLAYING
}
+
+ public enum BackButtonBehavior {
+ DEFAULT, OPEN_DRAWER, DOUBLE_TAP, SHOW_PROMPT, GO_TO_PAGE
+ }
+
+ public static BackButtonBehavior getBackButtonBehavior() {
+ switch (prefs.getString(PREF_BACK_BUTTON_BEHAVIOR, "default")) {
+ case "default": return BackButtonBehavior.DEFAULT;
+ case "drawer": return BackButtonBehavior.OPEN_DRAWER;
+ case "doubletap": return BackButtonBehavior.DOUBLE_TAP;
+ case "prompt": return BackButtonBehavior.SHOW_PROMPT;
+ case "page": return BackButtonBehavior.GO_TO_PAGE;
+ default: return BackButtonBehavior.DEFAULT;
+ }
+ }
+
+ public static String getBackButtonGoToPage() {
+ return prefs.getString(PREF_BACK_BUTTON_GO_TO_PAGE, "QueueFragment");
+ }
+
+ public static void setBackButtonGoToPage(String tag) {
+ prefs.edit()
+ .putString(PREF_BACK_BUTTON_GO_TO_PAGE, tag)
+ .apply();
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java
index edc2ea3e0..7663cdbe4 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/PlayerWidget.java
@@ -6,10 +6,11 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
-import de.danoeh.antennapod.core.service.PlayerWidgetJobService;
import java.util.Arrays;
+import de.danoeh.antennapod.core.service.PlayerWidgetJobService;
+
public class PlayerWidget extends AppWidgetProvider {
private static final String TAG = "PlayerWidget";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/FeedUpdateJobService.java b/core/src/main/java/de/danoeh/antennapod/core/service/FeedUpdateJobService.java
index 55a8d6b86..7d80d4e7c 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/FeedUpdateJobService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/FeedUpdateJobService.java
@@ -5,6 +5,7 @@ import android.app.job.JobService;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
+
import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.FeedUpdateUtils;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java
index fe6e8c400..5584991ca 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java
@@ -6,8 +6,8 @@ import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
-import android.support.v4.app.JobIntentService;
import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.SafeJobIntentService;
import android.support.v4.util.ArrayMap;
import android.util.Log;
import android.util.Pair;
@@ -44,7 +44,7 @@ import de.danoeh.antennapod.core.util.gui.NotificationUtils;
* Synchronizes local subscriptions with gpodder.net service. The service should be started with ACTION_SYNC as an action argument.
* This class also provides static methods for starting the GpodnetSyncService.
*/
-public class GpodnetSyncService extends JobIntentService {
+public class GpodnetSyncService extends SafeJobIntentService {
private static final String TAG = "GpodnetSyncService";
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 d2214cac8..6dab9a561 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
@@ -9,23 +9,24 @@ import android.content.ServiceConnection;
import android.os.Build;
import android.os.IBinder;
import android.support.annotation.NonNull;
-import android.support.v4.app.JobIntentService;
+import android.support.v4.app.SafeJobIntentService;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.RemoteViews;
+
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.receiver.MediaButtonReceiver;
+import de.danoeh.antennapod.core.receiver.PlayerWidget;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.service.playback.PlayerStatus;
import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.playback.Playable;
-import de.danoeh.antennapod.core.receiver.PlayerWidget;
/**
* Updates the state of the player widget
*/
-public class PlayerWidgetJobService extends JobIntentService {
+public class PlayerWidgetJobService extends SafeJobIntentService {
private static final String TAG = "PlayerWidgetJobService";
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 57d099dfc..97007a214 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
@@ -40,6 +40,9 @@ import okhttp3.internal.http.StatusLine;
* Provides access to a HttpClient singleton.
*/
public class AntennapodHttpClient {
+
+ private AntennapodHttpClient(){}
+
private static final String TAG = "AntennapodHttpClient";
private static final int CONNECTION_TIMEOUT = 30000;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java
index 75c28564e..48234c387 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java
@@ -124,7 +124,7 @@ public class DownloadRequest implements Parcelable {
@Override
public boolean equals(Object o) {
if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
+ if (o == null || !(o instanceof DownloadRequest)) return false;
DownloadRequest that = (DownloadRequest) o;
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 4bd2d8f19..ae1e9de86 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
@@ -13,15 +13,12 @@ import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.NonNull;
-import android.support.annotation.VisibleForTesting;
import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.webkit.URLUtil;
-import de.danoeh.antennapod.core.storage.PodDBAdapter;
-import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import org.apache.commons.io.FileUtils;
import org.xml.sax.SAXException;
@@ -31,10 +28,8 @@ import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
-import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
@@ -75,6 +70,7 @@ import de.danoeh.antennapod.core.syndication.handler.UnsupportedFeedtypeExceptio
import de.danoeh.antennapod.core.util.ChapterUtils;
import de.danoeh.antennapod.core.util.DownloadError;
import de.danoeh.antennapod.core.util.InvalidFeedException;
+import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import de.greenrobot.event.EventBus;
/**
@@ -117,11 +113,6 @@ public class DownloadService extends Service {
private CompletionService<Downloader> downloadExecutor;
private FeedSyncThread feedSyncThread;
- /**
- * Number of threads of downloadExecutor.
- */
- private static final int NUM_PARALLEL_DOWNLOADS = 6;
-
private DownloadRequester requester;
@@ -257,7 +248,6 @@ public class DownloadService extends Service {
public void onCreate() {
Log.d(TAG, "Service started");
isRunning = true;
- PodDBAdapter.getInstance().open(); // Prevent thrashing the database by opening and closing rapidly
handler = new Handler();
reportQueue = Collections.synchronizedList(new ArrayList<>());
downloads = Collections.synchronizedList(new ArrayList<>());
@@ -337,7 +327,6 @@ public class DownloadService extends Service {
// start auto download in case anything new has shown up
DBTasks.autodownloadUndownloadedItems(getApplicationContext());
- PodDBAdapter.getInstance().close();
}
private void setupNotificationBuilders() {
@@ -862,22 +851,6 @@ public class DownloadService extends Service {
return true;
}
- /**
- * Delete files that aren't needed anymore
- */
- private void cleanup(Feed feed) {
- if (feed.getFile_url() != null) {
- if (new File(feed.getFile_url()).delete()) {
- Log.d(TAG, "Successfully deleted cache file.");
- } else {
- Log.e(TAG, "Failed to delete cache file.");
- }
- feed.setFile_url(null);
- } else {
- Log.d(TAG, "Didn't delete cache file: File url is not set.");
- }
- }
-
public void shutdown() {
isActive = false;
if (isCollectingRequests) {
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 8cce02155..842ad0c60 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
@@ -304,7 +304,7 @@ public class HttpDownloader extends Downloader {
String encoded = ByteString.of(bytes).base64();
return "Basic " + encoded;
} catch (UnsupportedEncodingException e) {
- throw new AssertionError();
+ throw new AssertionError(e);
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java
index cc9d2ce2d..e1d87e1d5 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java
@@ -3,6 +3,7 @@ package de.danoeh.antennapod.core.service.playback;
import android.content.Context;
import android.net.Uri;
import android.view.SurfaceHolder;
+
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
@@ -22,9 +23,11 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.Util;
-import de.danoeh.antennapod.core.util.playback.IPlayer;
+
import org.antennapod.audio.MediaPlayer;
+import de.danoeh.antennapod.core.util.playback.IPlayer;
+
public class ExoPlayerWrapper implements IPlayer {
private final Context mContext;
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 979857381..68c9ac0ce 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
@@ -24,13 +24,13 @@ import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
+import android.support.v4.app.NotificationCompat;
import android.support.v4.media.MediaBrowserCompat;
import android.support.v4.media.MediaBrowserServiceCompat;
import android.support.v4.media.MediaDescriptionCompat;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
-import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
@@ -66,8 +66,8 @@ import de.danoeh.antennapod.core.storage.DBWriter;
import de.danoeh.antennapod.core.storage.FeedSearcher;
import de.danoeh.antennapod.core.util.IntList;
import de.danoeh.antennapod.core.util.IntentUtils;
-import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import de.danoeh.antennapod.core.util.QueueAccess;
+import de.danoeh.antennapod.core.util.gui.NotificationUtils;
import de.danoeh.antennapod.core.util.playback.ExternalMedia;
import de.danoeh.antennapod.core.util.playback.Playable;
import de.greenrobot.event.EventBus;
@@ -602,14 +602,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
mediaPlayer.setVideoSurface(sh);
}
- /**
- * Called when the surface holder of the mediaplayer has to be changed.
- */
- private void resetVideoSurface() {
- taskManager.cancelPositionSaver();
- mediaPlayer.resetVideoSurface();
- }
-
public void notifyVideoSurfaceAbandoned() {
mediaPlayer.pause(true, false);
mediaPlayer.resetVideoSurface();
@@ -1104,7 +1096,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
} else {
state = PlaybackStateCompat.STATE_NONE;
}
- sessionState.setState(state, mediaPlayer.getPosition(), mediaPlayer.getPlaybackSpeed());
+ sessionState.setState(state, getCurrentPosition(), getCurrentPlaybackSpeed());
long capabilities = PlaybackStateCompat.ACTION_PLAY_PAUSE
| PlaybackStateCompat.ACTION_REWIND
| PlaybackStateCompat.ACTION_FAST_FORWARD
@@ -1644,6 +1636,9 @@ public class PlaybackService extends MediaBrowserServiceCompat {
}
public float getCurrentPlaybackSpeed() {
+ if(mediaPlayer == null) {
+ return 1.0f;
+ }
return mediaPlayer.getPlaybackSpeed();
}
@@ -1807,7 +1802,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
public boolean onMediaButtonEvent(final Intent mediaButton) {
Log.d(TAG, "onMediaButtonEvent(" + mediaButton + ")");
if (mediaButton != null) {
- KeyEvent keyEvent = (KeyEvent) mediaButton.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
+ KeyEvent keyEvent = mediaButton.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (keyEvent != null &&
keyEvent.getAction() == KeyEvent.ACTION_DOWN &&
keyEvent.getRepeatCount() == 0) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlayerStatus.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlayerStatus.java
index 8a222d7ec..4f2ae34f8 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlayerStatus.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlayerStatus.java
@@ -12,7 +12,7 @@ public enum PlayerStatus {
INITIALIZING(9), // playback service is loading the Playable's metadata
INITIALIZED(10); // playback service was started, data source of media player was set.
- private int statusValue;
+ private final int statusValue;
private static final PlayerStatus[] fromOrdinalLookup;
static {
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 9b574be47..83aa4c780 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
@@ -76,7 +76,7 @@ public final class DBReader {
cursor = adapter.getAllFeedsCursor();
List<Feed> feeds = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
- Feed feed = extractFeedFromCursorRow(adapter, cursor);
+ Feed feed = extractFeedFromCursorRow(cursor);
feeds.add(feed);
}
return feeds;
@@ -244,7 +244,7 @@ public final class DBReader {
return result;
}
- private static Feed extractFeedFromCursorRow(PodDBAdapter adapter, Cursor cursor) {
+ private static Feed extractFeedFromCursorRow(Cursor cursor) {
Feed feed = Feed.fromCursor(cursor);
FeedPreferences preferences = FeedPreferences.fromCursor(cursor);
feed.setPreferences(preferences);
@@ -582,7 +582,7 @@ public final class DBReader {
try {
cursor = adapter.getFeedCursor(feedId);
if (cursor.moveToNext()) {
- feed = extractFeedFromCursorRow(adapter, cursor);
+ feed = extractFeedFromCursorRow(cursor);
feed.setItems(getFeedItemList(feed));
} else {
Log.e(TAG, "getFeed could not find feed with id " + feedId);
@@ -1009,7 +1009,7 @@ public final class DBReader {
Cursor feedCursor = adapter.getFeedsInFlattrQueueCursor();
if (feedCursor.moveToFirst()) {
do {
- result.add(extractFeedFromCursorRow(adapter, feedCursor));
+ result.add(extractFeedFromCursorRow(feedCursor));
} while (feedCursor.moveToNext());
}
feedCursor.close();
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 8eed10cd7..ba7d4b47b 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
@@ -1,11 +1,9 @@
package de.danoeh.antennapod.core.storage;
import android.content.Context;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
import android.util.Log;
import java.util.ArrayList;
@@ -777,10 +775,8 @@ public final class DBTasks {
*/
abstract static class QueryTask<T> implements Callable<T> {
private T result;
- private final Context context;
public QueryTask(Context context) {
- this.context = context;
}
@Override
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java
index 29ed5f7f9..0beb765e7 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBUpgrader.java
@@ -5,6 +5,7 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.media.MediaMetadataRetriever;
import android.util.Log;
+
import de.danoeh.antennapod.core.feed.FeedItem;
class DBUpgrader {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
index 8bb5bc31a..bbe6145ea 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
@@ -7,7 +7,6 @@ import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
-import de.danoeh.antennapod.core.util.IntentUtils;
import org.shredzone.flattr4j.model.Flattr;
import java.io.File;
@@ -42,6 +41,7 @@ import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
+import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.LongList;
import de.danoeh.antennapod.core.util.Permutor;
import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java
index 827874f54..892a4675a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java
@@ -9,8 +9,6 @@ import android.text.TextUtils;
import android.util.Log;
import android.webkit.URLUtil;
-import de.danoeh.antennapod.core.service.playback.PlaybackService;
-import de.danoeh.antennapod.core.util.IntentUtils;
import org.apache.commons.io.FilenameUtils;
import java.io.File;
@@ -25,6 +23,7 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadRequest;
import de.danoeh.antennapod.core.service.download.DownloadService;
import de.danoeh.antennapod.core.util.FileNameGenerator;
+import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.URLChecker;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java
index aa5706ad0..f91e2ad08 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java
@@ -19,6 +19,8 @@ import de.danoeh.antennapod.core.util.comparator.SearchResultValueComparator;
* Performs search on Feeds and FeedItems
*/
public class FeedSearcher {
+ private FeedSearcher(){}
+
private static final String TAG = "FeedSearcher";
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 51b41d3b3..4566df2fc 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
@@ -12,8 +12,20 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.media.MediaMetadataRetriever;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
+
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.event.ProgressEvent;
import de.danoeh.antennapod.core.feed.Chapter;
@@ -26,14 +38,6 @@ import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.util.LongIntMap;
import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
import de.greenrobot.event.EventBus;
-import org.apache.commons.io.FileUtils;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
// TODO Remove media column from feeditem table
@@ -297,7 +301,6 @@ public class PodDBAdapter {
private static Context context;
private static volatile SQLiteDatabase db;
- private static int counter = 0;
public static void init(Context context) {
PodDBAdapter.context = context.getApplicationContext();
@@ -317,9 +320,6 @@ public class PodDBAdapter {
}
public synchronized PodDBAdapter open() {
- counter++;
- Log.v(TAG, "Opening DB #" + counter);
-
if (db == null || !db.isOpen() || db.isReadOnly()) {
db = openDb();
}
@@ -330,7 +330,6 @@ public class PodDBAdapter {
SQLiteDatabase newDb;
try {
newDb = SingletonHolder.dbHelper.getWritableDatabase();
- newDb.enableWriteAheadLogging();
} catch (SQLException ex) {
Log.e(TAG, Log.getStackTraceString(ex));
newDb = SingletonHolder.dbHelper.getReadableDatabase();
@@ -339,14 +338,7 @@ public class PodDBAdapter {
}
public synchronized void close() {
- counter--;
- Log.v(TAG, "Closing DB #" + counter);
-
- if (counter == 0) {
- Log.v(TAG, "Closing DB, really");
- db.close();
- db = null;
- }
+ // do nothing
}
public static boolean deleteDatabase() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
index a1100a976..e391af1b2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java
@@ -5,7 +5,6 @@ import android.util.Log;
import org.xml.sax.Attributes;
-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.syndication.handler.HandlerState;
@@ -22,9 +21,6 @@ public class NSRSS20 extends Namespace {
private static final String TAG = "NSRSS20";
- private static final String NSTAG = "rss";
- private static final String NSURI = "";
-
public static final String CHANNEL = "channel";
public static final String ITEM = "item";
private static final String GUID = "guid";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/Namespace.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/Namespace.java
index 1836bbec1..e5fbdb9bb 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/Namespace.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/Namespace.java
@@ -15,7 +15,6 @@ public abstract class Namespace {
public abstract SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes);
/** Called by a Feedhandler when in endElement and it detects a namespace element
- * @return true if namespace handled the element, false if it ignored it
* */
public abstract void handleElementEnd(String localName, HandlerState state);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java
index aab1b1a5b..83957456a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java
@@ -47,8 +47,6 @@ public class NSAtom extends Namespace {
private static final String LINK_REL_ARCHIVES = "archives";
private static final String LINK_REL_ENCLOSURE = "enclosure";
private static final String LINK_REL_PAYMENT = "payment";
- private static final String LINK_REL_RELATED = "related";
- private static final String LINK_REL_SELF = "self";
private static final String LINK_REL_NEXT = "next";
// type-values
private static final String LINK_TYPE_ATOM = "application/atom+xml";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
index b513fbe99..3cb226add 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
@@ -28,7 +28,6 @@ public final class Converter {
/** Determines the length of the number for best readability.*/
private static final int NUM_LENGTH = 1024;
- private static final int DAYS_MIL = 86400000;
private static final int HOURS_MIL = 3600000;
private static final int MINUTES_MIL = 60000;
private static final int SECONDS_MIL = 1000;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java
index e17d8de3e..5141e3a78 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java
@@ -17,7 +17,9 @@ import java.util.TimeZone;
*/
public class DateUtils {
- private static final String TAG = "DateUtils";
+ private DateUtils(){}
+
+ private static final String TAG = "DateUtils";
private static final TimeZone defaultTimezone = TimeZone.getTimeZone("GMT");
@@ -135,7 +137,7 @@ public class DateUtils {
if (parts.length >= 2) {
result += Integer.parseInt(parts[idx]) * 60000L;
idx++;
- result += (Float.parseFloat(parts[idx])) * 1000L;
+ result += (long) (Float.parseFloat(parts[idx]) * 1000L);
}
return result;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
index 76a6549ae..826c06822 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
@@ -5,6 +5,7 @@ import java.util.List;
import de.danoeh.antennapod.core.feed.FeedItem;
public class FeedItemUtil {
+ private FeedItemUtil(){}
public static int indexOfItemWithDownloadUrl(List<FeedItem> items, String downloadUrl) {
if(items == null) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java
index 24e0da9ed..afaf13390 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java
@@ -2,20 +2,30 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
import android.util.Log;
+
+import org.awaitility.core.ConditionTimeoutException;
+
+import java.util.concurrent.TimeUnit;
+
import de.danoeh.antennapod.core.storage.DBTasks;
+import static org.awaitility.Awaitility.with;
+
public class FeedUpdateUtils {
private static final String TAG = "FeedUpdateUtils";
- private FeedUpdateUtils() {
-
- }
+ private FeedUpdateUtils() {}
public static void startAutoUpdate(Context context, Runnable callback) {
- if (NetworkUtils.networkAvailable() && NetworkUtils.isDownloadAllowed()) {
+ try {
+ with().pollInterval(1, TimeUnit.SECONDS)
+ .await()
+ .atMost(10, TimeUnit.SECONDS)
+ .until(() -> NetworkUtils.networkAvailable() && NetworkUtils.isDownloadAllowed());
DBTasks.refreshAllFeeds(context, null, callback);
- } else {
+ } catch (ConditionTimeoutException ignore) {
Log.d(TAG, "Blocking automatic update: no wifi available / no mobile updates allowed");
}
}
+
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java
index aaaaf8f4d..e81ab47ed 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java
@@ -8,6 +8,7 @@ import android.content.pm.ResolveInfo;
import java.util.List;
public class IntentUtils {
+ private IntentUtils(){}
/*
* Checks if there is at least one exported activity that can be performed for the intent
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/LangUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/LangUtils.java
index 7ec7f84c4..90e0b0981 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/LangUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/LangUtils.java
@@ -5,6 +5,9 @@ import android.support.v4.util.ArrayMap;
import java.nio.charset.Charset;
public class LangUtils {
+
+ private LangUtils(){}
+
public static final Charset UTF_8 = Charset.forName("UTF-8");
private static final ArrayMap<String, String> languages;
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 3349ed176..b34ba196d 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
@@ -27,6 +27,7 @@ import okhttp3.Request;
import okhttp3.Response;
public class NetworkUtils {
+ private NetworkUtils(){}
private static final String TAG = NetworkUtils.class.getSimpleName();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java
index ee306a401..d1818aeef 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java
@@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit;
* Media file should be "rewinded" x seconds after user resumes the playback.
*/
public class RewindAfterPauseUtils {
+ private RewindAfterPauseUtils(){}
public static final long ELAPSED_TIME_FOR_SHORT_REWIND = TimeUnit.MINUTES.toMillis(1);
public static final long ELAPSED_TIME_FOR_MEDIUM_REWIND = TimeUnit.HOURS.toMillis(1);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java
index 1ef81bf64..3a6bf5755 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java
@@ -14,6 +14,8 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
* Utility functions for handling storage errors
*/
public class StorageUtils {
+ private StorageUtils(){}
+
private static final String TAG = "StorageUtils";
public static boolean storageAvailable() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ThemeUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/ThemeUtils.java
index 03d0f10ff..14f091249 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ThemeUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/ThemeUtils.java
@@ -3,14 +3,15 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
import android.support.annotation.AttrRes;
import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
import android.util.Log;
-
import android.util.TypedValue;
+
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
public class ThemeUtils {
+ private ThemeUtils(){}
+
private static final String TAG = "ThemeUtils";
public static int getSelectionBackgroundColor() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java
index ad723c685..3a2a4ac80 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java
@@ -11,12 +11,13 @@ import android.os.Build;
import android.os.SystemClock;
import android.support.annotation.RequiresApi;
import android.util.Log;
-import de.danoeh.antennapod.core.receiver.FeedUpdateReceiver;
-import de.danoeh.antennapod.core.service.FeedUpdateJobService;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
+import de.danoeh.antennapod.core.receiver.FeedUpdateReceiver;
+import de.danoeh.antennapod.core.service.FeedUpdateJobService;
+
public class AutoUpdateManager {
private static final int JOB_ID_FEED_UPDATE = 42;
private static final String TAG = "AutoUpdateManager";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java
index 45cb56988..d4d5843d2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java
@@ -11,7 +11,9 @@ import de.danoeh.antennapod.core.BuildConfig;
/** Ensures that only one instance of the FlattrService class exists at a time */
class FlattrServiceCreator {
- private static final String TAG = "FlattrServiceCreator";
+ private FlattrServiceCreator(){}
+
+ public static final String TAG = "FlattrServiceCreator";
private static volatile FlattrService flattrService;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrUtils.java
index 313d1c2f2..919fc82f2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrUtils.java
@@ -1,8 +1,6 @@
package de.danoeh.antennapod.core.util.flattr;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
@@ -36,6 +34,8 @@ import de.danoeh.antennapod.core.storage.DBWriter;
*/
public class FlattrUtils {
+ private FlattrUtils(){}
+
private static final String TAG = "FlattrUtils";
private static final String HOST_NAME = "de.danoeh.antennapod";
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java
index 386f46724..6e5c3e84b 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java
@@ -27,8 +27,8 @@ public class MoreContentListFooterUtil {
}
public void setLoadingState(boolean newState) {
- final ImageView imageView = (ImageView) root.findViewById(R.id.imgExpand);
- final ProgressBar progressBar = (ProgressBar) root.findViewById(R.id.progBar);
+ final ImageView imageView = root.findViewById(R.id.imgExpand);
+ final ProgressBar progressBar = root.findViewById(R.id.progBar);
if (newState) {
imageView.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
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 2a537dc62..52a43aab2 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
@@ -6,6 +6,7 @@ import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;
import android.support.annotation.RequiresApi;
+
import de.danoeh.antennapod.core.R;
public class NotificationUtils {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java
index a576dd497..b04c02075 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/MediaPlayerError.java
@@ -7,6 +7,7 @@ import de.danoeh.antennapod.core.R;
/** Utility class for MediaPlayer errors. */
public class MediaPlayerError {
+ private MediaPlayerError(){}
/** Get a human-readable string for a specific error code. */
public static String getErrorString(Context context, int code) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java
index ff7f5b79d..da9b96430 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java
@@ -176,6 +176,8 @@ public interface Playable extends Parcelable,
* Provides utility methods for Playable objects.
*/
class PlayableUtils {
+ private PlayableUtils(){}
+
private static final String TAG = "PlayableUtils";
/**
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
index 036ca446c..0555351d4 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
@@ -698,7 +698,7 @@ public abstract class PlaybackController {
return org.antennapod.audio.MediaPlayer.isPrestoLibraryInstalled(activity.getApplicationContext())
|| UserPreferences.useSonic()
|| Build.VERSION.SDK_INT >= 23
- || playbackService != null && playbackService.canSetSpeed();
+ || (playbackService != null && playbackService.canSetSpeed());
}
public void setPlaybackSpeed(float speed) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackServiceStarter.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackServiceStarter.java
index 3ba553d12..f7d2ee409 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackServiceStarter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackServiceStarter.java
@@ -3,7 +3,9 @@ package de.danoeh.antennapod.core.util.playback;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
+import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
+
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
diff --git a/core/src/main/res/drawable-hdpi/ic_baseline_question_answer_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_baseline_question_answer_white_24dp.png
new file mode 100755
index 000000000..67924a5a2
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_baseline_question_answer_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_bug_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_bug_grey600_24dp.png
new file mode 100644
index 000000000..daadfb35f
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_bug_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_bug_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_bug_white_24dp.png
new file mode 100644
index 000000000..549f67bf4
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_bug_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_cellphone_text_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_cellphone_text_grey600_24dp.png
new file mode 100644
index 000000000..71ccc26ea
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_cellphone_text_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_cellphone_text_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_cellphone_text_white_24dp.png
new file mode 100644
index 000000000..70e52c60b
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_cellphone_text_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_format_list_bulleted_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_format_list_bulleted_grey600_24dp.png
new file mode 100644
index 000000000..3668c9a00
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_format_list_bulleted_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_format_list_bulleted_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_format_list_bulleted_white_24dp.png
new file mode 100644
index 000000000..a1a2c5b68
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_format_list_bulleted_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_forum_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_forum_grey600_24dp.png
new file mode 100644
index 000000000..da5398d15
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_forum_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_baseline_question_answer_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_baseline_question_answer_white_24dp.png
new file mode 100755
index 000000000..e87df752e
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_baseline_question_answer_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_bug_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_bug_grey600_24dp.png
new file mode 100644
index 000000000..4b372a4e3
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_bug_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_bug_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_bug_white_24dp.png
new file mode 100644
index 000000000..9d7603552
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_bug_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_cellphone_text_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_cellphone_text_grey600_24dp.png
new file mode 100644
index 000000000..c26da2ce2
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_cellphone_text_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_cellphone_text_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_cellphone_text_white_24dp.png
new file mode 100644
index 000000000..8569a642d
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_cellphone_text_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_format_list_bulleted_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_format_list_bulleted_grey600_24dp.png
new file mode 100644
index 000000000..726eae499
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_format_list_bulleted_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_format_list_bulleted_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_format_list_bulleted_white_24dp.png
new file mode 100644
index 000000000..0cc401dff
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_format_list_bulleted_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_forum_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_forum_grey600_24dp.png
new file mode 100644
index 000000000..d3bcfe7b6
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_forum_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_baseline_question_answer_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_baseline_question_answer_white_24dp.png
new file mode 100755
index 000000000..731f89c83
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_baseline_question_answer_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_bug_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_bug_grey600_24dp.png
new file mode 100644
index 000000000..49e5deaa9
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_bug_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_bug_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_bug_white_24dp.png
new file mode 100644
index 000000000..7416bde03
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_bug_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_cellphone_text_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cellphone_text_grey600_24dp.png
new file mode 100644
index 000000000..fc8219fa9
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_cellphone_text_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_cellphone_text_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cellphone_text_white_24dp.png
new file mode 100644
index 000000000..9468fa9a9
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_cellphone_text_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_grey600_24dp.png
new file mode 100644
index 000000000..322adb6e0
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_white_24dp.png
new file mode 100644
index 000000000..c25860017
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_format_list_bulleted_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_forum_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_forum_grey600_24dp.png
new file mode 100644
index 000000000..ac6876140
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_forum_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_baseline_question_answer_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_baseline_question_answer_white_24dp.png
new file mode 100755
index 000000000..255b82707
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_baseline_question_answer_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_bug_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_bug_grey600_24dp.png
new file mode 100644
index 000000000..7bbf31c6b
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_bug_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_bug_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_bug_white_24dp.png
new file mode 100644
index 000000000..fe2c2bee3
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_bug_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_cellphone_text_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cellphone_text_grey600_24dp.png
new file mode 100644
index 000000000..82a453f05
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_cellphone_text_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_cellphone_text_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cellphone_text_white_24dp.png
new file mode 100644
index 000000000..d1f990a65
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_cellphone_text_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_grey600_24dp.png
new file mode 100644
index 000000000..87f8073ea
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_white_24dp.png
new file mode 100644
index 000000000..da3433c61
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_format_list_bulleted_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_forum_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_forum_grey600_24dp.png
new file mode 100644
index 000000000..7a3204693
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_forum_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_baseline_question_answer_white_24db.png b/core/src/main/res/drawable-xxxhdpi/ic_baseline_question_answer_white_24db.png
new file mode 100755
index 000000000..0d697e0f9
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_baseline_question_answer_white_24db.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_bug_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_bug_grey600_24dp.png
new file mode 100644
index 000000000..b612b2aa9
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_bug_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_bug_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_bug_white_24dp.png
new file mode 100644
index 000000000..32a3f5511
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_bug_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_grey600_24dp.png
new file mode 100644
index 000000000..829b15396
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_white_24dp.png
new file mode 100644
index 000000000..baa783a92
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_cellphone_text_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_grey600_24dp.png
new file mode 100644
index 000000000..c56590fe0
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_white_24dp.png
new file mode 100644
index 000000000..5deea3286
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_format_list_bulleted_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_forum_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_forum_grey600_24dp.png
new file mode 100644
index 000000000..0ae33696b
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_forum_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable/overlay_drawable_dark_trueblack.xml b/core/src/main/res/drawable/overlay_drawable_dark_trueblack.xml
new file mode 100644
index 000000000..5f58e8421
--- /dev/null
+++ b/core/src/main/res/drawable/overlay_drawable_dark_trueblack.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <item>
+ <shape android:shape="rectangle" >
+ <solid android:color="#45B3E1" />
+ </shape>
+ </item>
+ <item android:top="1dp">
+ <shape android:shape="rectangle" >
+ <solid android:color="@color/black" />
+ </shape>
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml
index 848a31add..5c29b5119 100644
--- a/core/src/main/res/values-ar/strings.xml
+++ b/core/src/main/res/values-ar/strings.xml
@@ -1,17 +1,34 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
- <string name="feeds_label">Feeds</string>
+ <string name="feed_update_receiver_name">تحديث التسجيل</string>
+ <string name="feeds_label">مغذيات</string>
+ <string name="statistics_label">إحصائيات</string>
+ <string name="add_feed_label">إضافة بودكاست</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="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_summary">تزامن مع أجهزة أخرى</string>
+ <string name="gpodnet_auth_label">تسجيل الدخول لموقع gpodder</string>
+ <string name="free_space_label"> %1$s مجانا</string>
+ <string name="episode_cache_full_title">ذاكرة تخزين الحلقات ممتلئة</string>
+ <string name="episode_cache_full_message">لقد تم تجاوز الحد الأقصى لتخزين الحلقات. المرجو الرفع من قيمة التخزين في قائمة الإعدادات.</string>
+ <string name="synchronizing">المزامنة...</string>
<!--Statistics fragment-->
+ <string name="total_time_listened_to_podcasts">مجموع وقت تشغيل البودكاستات:</string>
+ <string name="statistics_mode">نمط الإحصائيات</string>
<!--Main activity-->
<string name="drawer_open">قائمة الفتح</string>
<string name="drawer_close">قائمة الاغلاف</string>
@@ -27,11 +44,13 @@
<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>
@@ -61,7 +80,6 @@
<string name="show_info_label">اظهار المعلومات</string>
<string name="share_label">مشاركة</string>
<string name="share_link_label">مشاركة الرابط</string>
- <string name="episode_actions">تطبيق الاجراء</string>
<string name="hide_unplayed_episodes_label">لم يتم تشغيله</string>
<string name="hide_paused_episodes_label">ايقاف مؤقت</string>
<string name="hide_downloaded_episodes_label">تم التنزيل</string>
@@ -106,24 +124,73 @@
<!--Auto-Flattr dialog-->
<!--Search-->
<!--OPML import and export-->
+ <string name="opml_import_error_no_file">لم يتم اختيار أي ملف</string>
+ <string name="select_all_label">اختر الكل</string>
+ <string name="deselect_all_label">ألغ اختيار الكل</string>
+ <string name="select_options_label">اختر...</string>
+ <string name="choose_file_from_filesystem">عبر ملف نظام داخلي </string>
+ <string name="choose_file_from_external_application">إستخدام تطبيق خارجي</string>
+ <string name="opml_export_label">تصدير بصيغة OPML</string>
+ <string name="html_export_label">تصدير بصيغة HTML</string>
+ <string name="exporting_label">جار التصدير ...</string>
+ <string name="export_error_label">حدث خطأ أثناء التصدير</string>
+ <string name="export_success_title">تم التصدير بنجاح</string>
<!--Sleep timer-->
+ <string name="enter_time_here_label">أدخل التوقيت</string>
+ <string name="timer_vibration_label">تشغيل الهزاز</string>
+ <string name="time_seconds">ثواني</string>
+ <string name="time_minutes">دقائق</string>
+ <string name="time_hours">ساعات</string>
<!--gpodder.net-->
+ <string name="gpodnet_taglist_header">الفئات</string>
+ <string name="gpodnet_toplist_header">أقوى البودكاستات</string>
+ <string name="gpodnet_suggestions_header">إقتراحات</string>
+ <string name="gpodnetauth_login_title">تسجيل الدخول</string>
+ <string name="gpodnetauth_login_butLabel">تسجيل الدخول</string>
+ <string name="username_label">إسم المستخدم</string>
+ <string name="password_label">كلمة المرور</string>
+ <string name="gpodnetauth_device_title">اختيار الأجهزة:</string>
+ <string name="gpodnetauth_device_butCreateNewDevice">أدخل جهازا جديدا</string>
+ <string name="gpodnetauth_device_chooseExistingDevice">اختر جهازا من القائمة: </string>
+ <string name="gpodnetauth_device_butChoose">إختر</string>
+ <string name="gpodnetauth_finish_title">لقد تم تسجيل الدخول بنجاح!</string>
+ <string name="gpodnetauth_finish_butgomainscreen">إذهب إلى الصفحة الرئيسية</string>
+ <string name="gpodnetsync_auth_error_descr">خطأ في إسم المستخدم أو كلمة المرور</string>
+ <string name="gpodnetsync_pref_report_successful">تم بنجاح</string>
<!--Directory chooser-->
+ <string name="selected_folder_label">إختيار المستند:</string>
+ <string name="create_folder_label">أنشأ مستندا جديدا</string>
+ <string name="choose_data_directory">إختيار مستند البيانات</string>
<!--Online feed view-->
+ <string name="downloading_label">تحميل ...</string>
<!--Content descriptions for image buttons-->
+ <string name="media_type_audio_label">صوت</string>
+ <string name="media_type_video_label">فيديو</string>
+ <string name="load_next_page_label">تحميل الصفحة التالية</string>
<!--Feed information screen-->
+ <string name="authentication_label">تسجيل الدخول</string>
<!--Progress information-->
<!--AntennaPodSP-->
<!--Episodes apply actions-->
<string name="all_label">الكل</string>
+ <string name="selected_all_label">إختيار كل الحلقات</string>
<string name="unplayed_label">لم يتم تشغيله</string>
<string name="downloaded_label">تم التنزيل</string>
<string name="not_downloaded_label">لم يتم التنزيل</string>
<!--Sort-->
<!--Rating dialog-->
<!--Audio controls-->
+ <string name="volume">مستوى الصوت</string>
<!--proxy settings-->
+ <string name="proxy_type_label">النوع</string>
<!--Database import/export-->
+ <string name="label_import">استيراد</string>
+ <string name="label_export">تصدير</string>
+ <string name="export_ok">تم التصدير بنجاح</string>
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
+ <string name="notification_channel_downloading">تحميل</string>
+ <string name="notification_channel_playing">يشغل حاليا</string>
+ <string name="notification_channel_error">الأخطاء</string>
</resources>
diff --git a/core/src/main/res/values-az/strings.xml b/core/src/main/res/values-az/strings.xml
index c27aa54d2..92bfb7f44 100644
--- a/core/src/main/res/values-az/strings.xml
+++ b/core/src/main/res/values-az/strings.xml
@@ -165,7 +165,6 @@
<string name="deselect_all_label">Seçimi ləğv et</string>
<string name="opml_export_label">OPML ixraçı</string>
<string name="export_error_label">İxracın xətası</string>
- <string name="opml_export_success_sum">OPML fayl:\u0020 yazılıb</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Yuxu taymerini qoy</string>
<string name="disable_sleeptimer_label">Yuxu taymerini keçir</string>
@@ -200,4 +199,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-b+ast/strings.xml b/core/src/main/res/values-b+ast/strings.xml
index 5113a895e..421896086 100644
--- a/core/src/main/res/values-b+ast/strings.xml
+++ b/core/src/main/res/values-b+ast/strings.xml
@@ -109,7 +109,6 @@
<string name="feed_remover_msg">Desaniciando fees</string>
<string name="load_complete_feed">Completóse\'l refrescu\'l feed</string>
<string name="hide_episodes_title">Anubrir episodios</string>
- <string name="episode_actions">Aplicar aiciones</string>
<string name="hide_unplayed_episodes_label">Ensin reproducir</string>
<string name="hide_paused_episodes_label">Posóse</string>
<string name="hide_played_episodes_label">Reprodúxose</string>
@@ -243,7 +242,6 @@
<!--Preferences-->
<string name="storage_pref">Almacenamientu</string>
<string name="project_pref">Proyeutu</string>
- <string name="services_label">Servicios</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Llimpieza d\'episodios</string>
<string name="pref_pauseOnDisconnect_sum">Posa la reproducción al desconeutase los auriculares o Bluetooth</string>
@@ -378,4 +376,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-bg/strings.xml b/core/src/main/res/values-bg/strings.xml
index e06a2cca0..19dc2a971 100644
--- a/core/src/main/res/values-bg/strings.xml
+++ b/core/src/main/res/values-bg/strings.xml
@@ -118,7 +118,6 @@
<string name="other_pref">Други</string>
<string name="about_pref">Относно</string>
<string name="queue_label">Опашка</string>
- <string name="services_label">Услуги</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Почистване на епизодите</string>
<string name="pref_episode_cleanup_summary">Епизодите, които не са в опашката и не са в любими, отговарят на условията за премахване, ако автоматичното изтегляне се нуждае от място за нови епизоди</string>
@@ -253,4 +252,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-ca-rES/strings.xml b/core/src/main/res/values-ca-rES/strings.xml
index fe20ff5da..d9f216268 100644
--- a/core/src/main/res/values-ca-rES/strings.xml
+++ b/core/src/main/res/values-ca-rES/strings.xml
@@ -58,4 +58,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml
index 86fac02a5..dfd89ca0b 100644
--- a/core/src/main/res/values-ca/strings.xml
+++ b/core/src/main/res/values-ca/strings.xml
@@ -123,7 +123,6 @@
<string name="feed_remover_msg">S\'està esborrant el canal</string>
<string name="load_complete_feed">S\'ha actualitzat el canal</string>
<string name="hide_episodes_title">Amaga Episodis</string>
- <string name="episode_actions">Aplica accions</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>
@@ -281,7 +280,6 @@
<string name="other_pref">Altres</string>
<string name="about_pref">Quant a</string>
<string name="queue_label">Cua</string>
- <string name="services_label">Serveis</string>
<string name="flattr_label">Flattr</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 favorits haurien de ser candidats a ser esborrats si l\'Auto Descàrrega necessita espai per a nous episodis</string>
@@ -402,8 +400,6 @@
<string name="crash_report_sum">Envia l\'últim informe de tancament abrupte per e-mail</string>
<string name="send_email">Envia e-mail</string>
<string name="experimental_pref">Experimental</string>
- <string name="pref_sonic_title">Reproductor Sonic Media Player</string>
- <string name="pref_sonic_message">Fes servir el reproductor Sonic Media Player integrat en comptes del reproductor natiu d\'Android i Prestissimo</string>
<string name="pref_current_value">Valor actual: %1$s</string>
<string name="pref_proxy_title">Servidor intermediari</string>
<string name="pref_proxy_sum">Estableix un servidor intermediari</string>
@@ -451,8 +447,6 @@
<string name="html_export_label">Exporta HTML</string>
<string name="exporting_label">Exportant...</string>
<string name="export_error_label">Error d\'exportació</string>
- <string name="opml_export_success_title">S\'ha exportat l\'OPML correctament.</string>
- <string name="opml_export_success_sum">El fitxer OPML s\'ha escrit a:\u0020</string>
<string name="opml_import_ask_read_permission">Per llegir arxius OPML és necessari accés a la memòria externa</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Defineix un temporitzador</string>
@@ -625,7 +619,6 @@
<string name="label_import">Importa</string>
<string name="label_export">Exporta</string>
<string name="import_select_file">Tria un fitxer per a importar</string>
- <string name="export_ok">S\'ha exportat amb èxit. S\'ha escrit la base de dades a la targeta SD.</string>
<string name="import_ok">S\'ha importat amb èxit.\n\nPremeu D\'acord per a reiniciar l\'AntennaPod.</string>
<!--Casting-->
<string name="cast_media_route_menu_title">Reproduir a...</string>
@@ -643,4 +636,5 @@
<string name="cast_failed_seek">No s\'ha pogut cercar la nova posició al dispositiu de difusió</string>
<string name="cast_failed_receiver_player_error">El reproductor receptor ha trobat un error greu</string>
<string name="cast_failed_media_error_skipping">Error en la reproducció. Saltant...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-cs-rCZ/strings.xml b/core/src/main/res/values-cs-rCZ/strings.xml
index f7b1156de..1896381a1 100644
--- a/core/src/main/res/values-cs-rCZ/strings.xml
+++ b/core/src/main/res/values-cs-rCZ/strings.xml
@@ -88,6 +88,7 @@
<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>
<!--'Add Feed' Activity labels-->
@@ -117,7 +118,6 @@
<string name="feed_remover_msg">Odstranit kanál</string>
<string name="load_complete_feed">Obnovit kompletní kanál</string>
<string name="hide_episodes_title">Skrýt epizody</string>
- <string name="episode_actions">Provést akce</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>
@@ -185,6 +185,7 @@
<plurals name="downloads_left">
<item quantity="one">%d čekající na stažení</item>
<item quantity="few">%d čekající na stažení</item>
+ <item quantity="many">%d čekajících na stažení</item>
<item quantity="other">%d čekajících na stažení</item>
</plurals>
<string name="downloads_processing">Probíhá stahování</string>
@@ -275,7 +276,6 @@
<string name="other_pref">Ostatní</string>
<string name="about_pref">O aplikaci</string>
<string name="queue_label">Fronta</string>
- <string name="services_label">Služby</string>
<string name="flattr_label">Flattr</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>
@@ -386,7 +386,6 @@
<string name="crash_report_sum">Odesílat hlášení o posledním pádu aplikace emailem</string>
<string name="send_email">Poslat email</string>
<string name="experimental_pref">Experimentální</string>
- <string name="pref_sonic_message">Použít připojený sonic media player jako náhradu za výchozí přehrávač médií pro Android a Prestissimo</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>
@@ -430,8 +429,6 @@
<string name="html_export_label">HTML export</string>
<string name="exporting_label">Export</string>
<string name="export_error_label">Chyba exportu</string>
- <string name="opml_export_success_title">OPML export byl úspěšný.</string>
- <string name="opml_export_success_sum">OPML soubor byl zapsán do:\u0020</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>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Nastavit časovač vypnutí</string>
@@ -449,16 +446,19 @@
<plurals name="time_seconds_quantified">
<item quantity="one">1 sekunda</item>
<item quantity="few">%d sekundy</item>
+ <item quantity="many">%d sekund</item>
<item quantity="other">%d sekund</item>
</plurals>
<plurals name="time_minutes_quantified">
<item quantity="one">1 minuta</item>
<item quantity="few">%d minuty</item>
+ <item quantity="many">%d minut</item>
<item quantity="other">%d minut</item>
</plurals>
<plurals name="time_hours_quantified">
<item quantity="one">1 hodina</item>
<item quantity="few">%d hodiny</item>
+ <item quantity="many">%d hodin</item>
<item quantity="other">%d hodin</item>
</plurals>
<string name="auto_enable_label">Automaticky zapnout</string>
@@ -618,4 +618,5 @@
<string name="cast_failed_seek">Selhal posun na novou pozici na vysílači</string>
<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-->
</resources>
diff --git a/core/src/main/res/values-da/strings.xml b/core/src/main/res/values-da/strings.xml
index 6364ef099..9035054f1 100644
--- a/core/src/main/res/values-da/strings.xml
+++ b/core/src/main/res/values-da/strings.xml
@@ -123,7 +123,6 @@
<string name="feed_remover_msg">Fjerner feed</string>
<string name="load_complete_feed">Opdater hele feedet</string>
<string name="hide_episodes_title">Skjul udsendelser</string>
- <string name="episode_actions">Anvend handlinger</string>
<string name="hide_unplayed_episodes_label">Uafspillede</string>
<string name="hide_paused_episodes_label">Sat på pause</string>
<string name="hide_played_episodes_label">Afspillede</string>
@@ -281,7 +280,6 @@
<string name="other_pref">Andre</string>
<string name="about_pref">Om</string>
<string name="queue_label">Kø</string>
- <string name="services_label">Tjenester</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Oprydning i udsendelser</string>
<string name="pref_episode_cleanup_summary">Tillad at udsendelser, som ikke er i køen og som ikke er markeret som foretrukne, kan fjernes, hvis Automatisk overførsel har brug for plads til nye udsendelser</string>
@@ -402,8 +400,6 @@
<string name="crash_report_sum">Send den seneste nedbrudsrapport via e-mail</string>
<string name="send_email">Send e-mail</string>
<string name="experimental_pref">Eksperimentelt</string>
- <string name="pref_sonic_title">Sonic-medieafspiller</string>
- <string name="pref_sonic_message">Brug indbygget Sonic-medieafspiller i stedet for Androids indbyggede medieafspiller og Prestissimo</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>
@@ -451,8 +447,6 @@
<string name="html_export_label">HTML-eksport</string>
<string name="exporting_label">Eksporterer…</string>
<string name="export_error_label">Eksportfejl</string>
- <string name="opml_export_success_title">OPML-eksport lykkedes.</string>
- <string name="opml_export_success_sum">.opml-filen blev skrevet til:\u0020</string>
<string name="opml_import_ask_read_permission">Adgang til eksternt lager er påkrævet for at læse OPML-filen</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Indstil søvntimer</string>
@@ -637,4 +631,5 @@
<string name="cast_failed_seek">Det lykkedes ikke at søge til den nye position på cast-enheden</string>
<string name="cast_failed_receiver_player_error">Modtagerafspilleren er stødt på en alvorlig fejl</string>
<string name="cast_failed_media_error_skipping">Fejl ved afspilning af medie. Springer over…</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml
index be32e70eb..b8f4ffbab 100644
--- a/core/src/main/res/values-de/strings.xml
+++ b/core/src/main/res/values-de/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Abonnements aktualisieren</string>
<string name="feeds_label">Feeds</string>
<string name="statistics_label">Statistiken</string>
<string name="add_feed_label">Podcast hinzufügen</string>
<string name="episodes_label">Episoden</string>
<string name="all_episodes_short_label">Alle</string>
+ <string name="new_episodes_label">Neu</string>
<string name="favorite_episodes_label">Favoriten</string>
<string name="new_label">Neu</string>
<string name="settings_label">Einstellungen</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Download abbrechen</string>
<string name="playback_history_label">Zuletzt gespielt</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Mit anderen Geräten synchronisieren</string>
<string name="gpodnet_auth_label">gpodder.net Anmeldung</string>
<string name="free_space_label">%1$s frei</string>
<string name="episode_cache_full_title">Episodenspeicher voll</string>
<string name="episode_cache_full_message">Der Episodenspeicher ist voll. Du kannst die Größe des Episodenspeichers in den Einstellungen erhöhen.</string>
+ <string name="synchronizing">Synchronisiere...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Gesamtzeit gespielter Podcasts:</string>
<string name="statistics_details_dialog">%1$d von %2$d Episoden gestartet.\n\n%3$s von %4$s Episoden gespielt.</string>
@@ -56,15 +60,16 @@
<string name="yes">Ja</string>
<string name="no">Nein</string>
<string name="reset">Reset</string>
- <string name="author_label">Autor</string>
+ <string name="author_label">Autor(en)</string>
<string name="language_label">Sprache</string>
<string name="url_label">URL</string>
<string name="podcast_settings_label">Einstellungen</string>
<string name="cover_label">Bild</string>
<string name="error_label">Fehler</string>
<string name="error_msg_prefix">Ein Fehler ist aufgetreten:</string>
+ <string name="needs_storage_permission">Für diese Funktion wird die Speicher-Berechtigung benötigt</string>
<string name="refresh_label">Aktualisieren</string>
- <string name="external_storage_error_msg">Der externe Speicher ist nicht verfügbar. Bitte stelle sicher, dass das externe Speichermedium eingelegt ist, damit die Anwendung funktioniert.</string>
+ <string name="external_storage_error_msg">Der externe Speicher ist nicht verfügbar. Bitte stelle sicher, dass das externe Speichermedium eingelegt ist, damit die App funktioniert.</string>
<string name="chapters_label">Kapitel</string>
<string name="chapter_duration">Dauer: %1$s</string>
<string name="shownotes_label">Shownotizen</string>
@@ -110,20 +115,22 @@
<string name="mark_all_seen_msg">Alle Episoden als gesehen markiert</string>
<string name="mark_all_seen_confirmation_msg">Bitte bestätige, dass alle Episoden als gesehen markiert werden sollen.</string>
<string name="show_info_label">Informationen anzeigen</string>
- <string name="rename_feed_label">Podcast umbenennen</string>
+ <string name="show_feed_settings_label">Zeige Feed-Einstellungen</string>
+ <string name="feed_info_label">Feed-Informationen</string>
+ <string name="feed_settings_label">Feed-Einstellungen</string>
+ <string name="rename_feed_label">Feed umbenennen</string>
<string name="remove_feed_label">Podcast entfernen</string>
<string name="share_label">Teilen…</string>
- <string name="share_link_label">Teile Link</string>
- <string name="share_file_label">Teile Datei</string>
+ <string name="share_link_label">Episoden URL Teilen</string>
<string name="share_link_with_position_label">Teile Link mit Zeitmarke</string>
+ <string name="share_file_label">Teile Datei</string>
<string name="share_feed_url_label">Teile URL des Podcasts</string>
- <string name="share_item_url_label">Teile URL der Episode</string>
- <string name="share_item_url_with_position_label">Teile URL der Episode mit Zeitmarke</string>
- <string name="feed_delete_confirmation_msg">Bitte bestätige, dass du den Feed \"%1$s\" und ALLE heruntergeladenen Episoden löschen möchtest.</string>
- <string name="feed_remover_msg">Entferne Feed</string>
+ <string name="share_item_url_label">Teile URL der Episodendatei</string>
+ <string name="share_item_url_with_position_label">Teile URL der Episodendatei mit Zeitmarke</string>
+ <string name="feed_delete_confirmation_msg">Bitte bestätige, dass du den Podcast \"%1$s\" und ALLE heruntergeladenen Episoden dieses Feeds entfernen möchtest.</string>
<string name="load_complete_feed">Kompletten Feed aktualisieren</string>
<string name="hide_episodes_title">Episoden verbergen</string>
- <string name="episode_actions">Aktionen anwenden</string>
+ <string name="batch_edit">Stapelbearbeitung</string>
<string name="hide_unplayed_episodes_label">Ungespielt</string>
<string name="hide_paused_episodes_label">Pausiert</string>
<string name="hide_played_episodes_label">Gespielt</string>
@@ -132,6 +139,7 @@
<string name="hide_downloaded_episodes_label">Heruntergeladen</string>
<string name="hide_not_downloaded_episodes_label">Nicht heruntergeladen</string>
<string name="hide_has_media_label">Hat Medien</string>
+ <string name="hide_is_favorite_label">Favorit</string>
<string name="filtered_label">Gefiltert</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Aktualisierung fehlgeschlagen</string>
<string name="open_podcast">Podcast öffnen</string>
@@ -145,6 +153,7 @@
<string name="delete_label">Löschen</string>
<string name="delete_failed">Die Datei kann nicht gelöscht werden. Eventuell hilft es, das Gerät neu zu starten.</string>
<string name="remove_episode_lable">Episode entfernen</string>
+ <string name="mark_as_seen_label">Als gelesen markieren</string>
<string name="marked_as_seen_label">Als gesehen markiert</string>
<string name="mark_read_label">Als gespielt markieren</string>
<string name="marked_as_read_label">Als gespielt markiert</string>
@@ -220,6 +229,7 @@
<string name="playback_error_unknown">Unbekannter Fehler</string>
<string name="no_media_playing_label">Keine Medienwiedergabe</string>
<string name="player_buffering_msg">Puffert</string>
+ <string name="player_go_to_picture_in_picture">Bild-in-Bild-Modus</string>
<string name="playbackservice_notification_title">Spiele Podcast ab</string>
<string name="unknown_media_key">AntennaPod - Unbekannte Medientaste: %1$d</string>
<!--Queue operations-->
@@ -236,7 +246,9 @@
<string name="date">Datum</string>
<string name="duration">Dauer</string>
<string name="episode_title">Episodentitel</string>
- <string name="feed_title">Podcastname</string>
+ <string name="feed_title">Feedname</string>
+ <string name="random">Zufällig</string>
+ <string name="smart_shuffle">Schlaues Mischen</string>
<string name="ascending">Aufsteigend</string>
<string name="descending">Absteigend</string>
<string name="clear_queue_confirmation_msg">Bitte bestätige, dass ALLE Episoden aus der Abspielliste entfernt werden sollen</string>
@@ -283,8 +295,17 @@
<string name="other_pref">Anderes</string>
<string name="about_pref">Über</string>
<string name="queue_label">Abspielliste</string>
- <string name="services_label">Dienste</string>
+ <string name="integrations_label">Einbindungen</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Micropayment-Dienst</string>
+ <string name="automation">Automatisierung</string>
+ <string name="download_pref_details">Details</string>
+ <string name="import_export_pref">Import/Export</string>
+ <string name="appearance">Erscheinungsbild</string>
+ <string name="external_elements">Externe Elemente</string>
+ <string name="interruptions">Unterbrechungen</string>
+ <string name="buttons">Buttons zur Steuerung der Wiedergabe</string>
+ <string name="media_player">Medienabspieler</string>
<string name="pref_episode_cleanup_title">Automatisches Löschen</string>
<string name="pref_episode_cleanup_summary">Episoden, die weder in der Abspielliste noch Favoriten sind, können gelöscht werden, wenn beim automatischen Herunterladen Speicherplatz für neue Episoden gebraucht wird</string>
<string name="pref_pauseOnDisconnect_sum">Wiedergabe pausieren, wenn Kopfhörer ausgesteckt oder Bluetooth getrennt wird</string>
@@ -340,7 +361,6 @@
<string name="pref_nav_drawer_feed_order_title">Reihenfolge der Abonnements einstellen</string>
<string name="pref_nav_drawer_feed_order_sum">Ändere die Reihenfolge deiner Abonnements</string>
<string name="pref_nav_drawer_feed_counter_title">Abonnement-Zähler einstellen</string>
- <string name="pref_nav_drawer_feed_counter_sum">Ändere, welche Information der Abonnement-Zähler anzeigt</string>
<string name="pref_set_theme_sum">Ändere das Aussehen von AntennaPod.</string>
<string name="pref_automatic_download_title">Automatisches Herunterladen</string>
<string name="pref_automatic_download_sum">Konfiguriere das automatische Herunterladen von Episoden.</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Sende den aktuellen Absturzbericht per E-Mail</string>
<string name="send_email">E-Mail senden</string>
<string name="experimental_pref">Experimentell</string>
- <string name="pref_sonic_title">Sonic Media Player</string>
- <string name="pref_sonic_message">Benutze den integrierten Sonic Mediaplayer als Ersatz für Androids eigenen Mediaplayer und Prestissimo</string>
+ <string name="pref_media_player_message">Wähle, welcher Medienabspieler benutzt werden soll, um Dateien abzuspielen</string>
<string name="pref_current_value">Aktueller Wert: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Richte einen Netzwerk-Proxy ein</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Chromecast benötigt proprietäre Bibliotheken von Drittanbietern, die in dieser Version von AntennaPod deaktiviert sind</string>
<string name="pref_enqueue_downloaded_title">Downloads einreihen</string>
<string name="pref_enqueue_downloaded_summary">Füge heruntergeladene Episoden zur Abspielliste hinzu</string>
+ <string name="media_player_builtin">Androids eingebauter Abspieler</string>
+ <string name="pref_videoBehavior_title">Beim Beenden des Videos</string>
+ <string name="pref_videoBehavior_sum">Verhalten beim Verlassen der Video-Wiedergabe</string>
+ <string name="stop_playback">Wiedergabe anhalten</string>
+ <string name="continue_playback">Audiowiedergabe fortsetzen</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Automatisches Flattrn aktivieren</string>
<string name="auto_flattr_after_percent">Flattr eine Episode, sobald %d Prozent gespielt worden sind</string>
@@ -426,8 +450,6 @@
<string name="search_hint">Suche nach Episoden</string>
<string name="found_in_shownotes_label">In Shownotizen gefunden</string>
<string name="found_in_chapters_label">In Kapiteln gefunden</string>
- <string name="found_in_authors_label">In Autoren gefunden</string>
- <string name="found_in_feeds_label">In Feeds gefunden</string>
<string name="search_status_no_results">Keine Ergebnisse gefunden</string>
<string name="search_label">Suchen</string>
<string name="found_in_title_label">In Titel gefunden</string>
@@ -645,4 +667,13 @@
<string name="cast_failed_seek">Spulen zur neuen Position fehlgeschlagen</string>
<string name="cast_failed_receiver_player_error">Es wurde ein schwerer Fehler beim Empfangsgerät festgestellt</string>
<string name="cast_failed_media_error_skipping">Fehler bei Wiedergabe. Überspringe...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Handlung notwendig</string>
+ <string name="notification_channel_user_action_description">Wird gezeigt, wenn deine Handlung notwendig ist, zum Beispiel wenn du ein Passwort eingeben musst.</string>
+ <string name="notification_channel_downloading">Lädt herunter</string>
+ <string name="notification_channel_downloading_description">Wird gezeigt beim Herunterladen.</string>
+ <string name="notification_channel_playing">Jetzt spielt</string>
+ <string name="notification_channel_playing_description">Erlaubt es, die Wiedergabe zu steuern. Dies ist die Hauptbenachrichtigung, die du siehst, während ein Podcast abgespielt wird.</string>
+ <string name="notification_channel_error">Fehler</string>
+ <string name="notification_channel_error_description">Wird gezeigt, wenn etwas schief gegangen ist, etwa wenn das Herunterladen oder die gpodder-Synchronisierung fehlschlägt.</string>
</resources>
diff --git a/core/src/main/res/values-el/strings.xml b/core/src/main/res/values-el/strings.xml
index 152e73426..3438c9acc 100644
--- a/core/src/main/res/values-el/strings.xml
+++ b/core/src/main/res/values-el/strings.xml
@@ -1,16 +1,18 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Ανανέωση Συνδρομών</string>
<string name="feeds_label">Ροές</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_running_label">Εκτέλείται</string>
<string name="downloads_completed_label">Ολοκληρώθηκε</string>
<string name="downloads_log_label">Είσοδος</string>
<string name="subscriptions_label">Συνδρομές</string>
@@ -18,43 +20,59 @@
<string name="cancel_download_label">Ακύρωση\nΛήψης</string>
<string name="playback_history_label">Ιστορικό Αναπαραγωγής</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Συγχρονισμός με άλλες συσκευές</string>
<string name="gpodnet_auth_label">gpodder.net Σύνδεση</string>
+ <string name="synchronizing">Εκτελείται συγχρονισμός</string>
<!--Statistics fragment-->
+ <string name="total_time_listened_to_podcasts">Συνολικός χρόνος εκτελεσμένων podcasts:</string>
<!--Main activity-->
<string name="drawer_open">Άνοιγμα μενού</string>
<string name="drawer_close">Κλείσιμο μενού</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">Αντιγραφή διεύθυνσης URL</string>
- <string name="share_url_label">Μοιρασμα URL</string>
+ <string name="share_url_label">Μοίρασμα URL</string>
<string name="copied_url_msg">Αντιγραφή URL στο Πρόχειρο</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="author_label">Δημιουργος</string>
- <string name="language_label">Γλωσσα</string>
- <string name="podcast_settings_label">Ρυθμισεις</string>
- <string name="cover_label">Εικονα</string>
- <string name="error_label">Σφαλμα</string>
+ <string name="yes">Ναι</string>
+ <string name="no">Όχι</string>
+ <string name="author_label">Δημιουργός</string>
+ <string name="language_label">Γλώσσα</string>
+ <string name="url_label">URL</string>
+ <string name="podcast_settings_label">Ρυθμίσεις</string>
+ <string name="cover_label">Εικόνα</string>
+ <string name="error_label">Σφάλμα</string>
<string name="error_msg_prefix">Παρουσιάστηκε ένα σφάλμα:</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="shownotes_label">Εμφάνιση Σημειώσεων</string>
<string name="description_label">Περιγραφή</string>
- <string name="episodes_suffix">\u0020επεισοδια</string>
+ <string name="most_recent_prefix">Πιο πρόσφατο επεισόδιο:\u0020</string>
+ <string name="episodes_suffix">\u0020επεισόδια</string>
<string name="length_prefix">Μήκος:\u0020</string>
<string name="size_prefix">Μέγεθος:\u0020</string>
<string name="processing_label">Επεξεργασία</string>
- <string name="save_username_password_label">Αποθήκευση του όνοματος χρήστη και του κωδικόυ πρόσβασης</string>
+ <string name="save_username_password_label">Αποθήκευση του ονόματος χρήστη και του κωδικού πρόσβασης</string>
<string name="close_label">Κλείσιμο</string>
- <string name="retry_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_delete_label">Αυτόματη διαγραφή επεισοδίου</string>
<string name="parallel_downloads_suffix">\u0020παράλληλες λήψεις</string>
<string name="feed_auto_download_always">Πάντα</string>
<string name="feed_auto_download_never">Ποτέ</string>
@@ -63,9 +81,13 @@
<string name="feedurl_label">URL της Ροής</string>
<string name="etxtFeedurlHint">www.example.com/feed</string>
<string name="txtvfeedurl_label">Προσθήκη Podcast με τη διεύθυνση URL</string>
+ <string name="podcastdirectories_label">Εύρεση Podcast στο Φάκελο</string>
<string name="browse_gpoddernet_label">Περιήγηση στο gpodder.net</string>
<!--Actions on feeds-->
<string name="show_info_label">Εμφάνιση πληροφοριών</string>
+ <string name="feed_info_label">Πληροφορίες Ροής</string>
+ <string name="feed_settings_label">Ρυθμίσεις Ροής</string>
+ <string name="rename_feed_label">Μετονομασία podcast</string>
<string name="remove_feed_label">Κατάργηση Podcast</string>
<string name="hide_episodes_title">Απόκρυψη Επεισοδίων</string>
<string name="hide_downloaded_episodes_label">Ειλημμένα</string>
@@ -180,7 +202,6 @@
<string name="other_pref">Άλλα</string>
<string name="about_pref">Σχετικά με</string>
<string name="queue_label">Σειρά αναμονής</string>
- <string name="services_label">Υπηρεσίες</string>
<string name="flattr_label">Flattr</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Συνέχιση της αναπαραγωγής, όταν τα ακουστικά επανασυνδέονται</string>
<string name="pref_followQueue_sum">Μετάβαση στο επόμενο στοιχείο σειράς αναμονής όταν η αναπαραγωγή ολοκληρωθεί</string>
@@ -255,8 +276,6 @@
<string name="choose_file_from_external_application">Χρησιμοποιήστε εξωτερική εφαρμογή</string>
<string name="opml_export_label">OPML εξαγωγή</string>
<string name="export_error_label">Σφάλμα κατά την εξαγωγή</string>
- <string name="opml_export_success_title">Η Εξαγωγή OPML είναι επιτυχής</string>
- <string name="opml_export_success_sum">Το αρχείο .opml συντάχθηκε για:\u0020</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ρύθμιση του χρονοδιακόπτη ύπνου</string>
<string name="disable_sleeptimer_label">Απενεργοποίηση χρονοδιακόπτη ύπνου</string>
@@ -341,4 +360,7 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
+ <string name="notification_channel_downloading">Λήψη</string>
+ <string name="notification_channel_error">Σφάλματα</string>
</resources>
diff --git a/core/src/main/res/values-es-rES/strings.xml b/core/src/main/res/values-es-rES/strings.xml
index 8aa30231b..024989498 100644
--- a/core/src/main/res/values-es-rES/strings.xml
+++ b/core/src/main/res/values-es-rES/strings.xml
@@ -193,7 +193,6 @@
<string name="deselect_all_label">Deseleccionar todo</string>
<string name="opml_export_label">Exportar a OPML</string>
<string name="export_error_label">Error en la exportación</string>
- <string name="opml_export_success_sum">El archivo OPML se ha escrito en:\u0020</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Establecer un temporizador</string>
<string name="disable_sleeptimer_label">Desactivar el temporizador</string>
@@ -229,4 +228,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml
index ff16ff05d..7a421de59 100644
--- a/core/src/main/res/values-es/strings.xml
+++ b/core/src/main/res/values-es/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Actualizar suscripciones</string>
<string name="feeds_label">Canales</string>
<string name="statistics_label">Estadísticas</string>
<string name="add_feed_label">Añadir podcast</string>
<string name="episodes_label">Episodios</string>
<string name="all_episodes_short_label">Todos</string>
+ <string name="new_episodes_label">Nuevo</string>
<string name="favorite_episodes_label">Favoritos</string>
<string name="new_label">Nuevos</string>
<string name="settings_label">Ajustes</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Cancelar\ndescarga</string>
<string name="playback_history_label">Historial de reproducciones</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Sincronizar con otros dispositivos</string>
<string name="gpodnet_auth_label">Iniciar sesión en gpodder.net</string>
<string name="free_space_label">%1$s libre</string>
<string name="episode_cache_full_title">Caché de episodios completa</string>
<string name="episode_cache_full_message">Se ha alcanzado el límite de caché de episodios. Puedes aumentar el tamaño de la caché en las Opciones.</string>
+ <string name="synchronizing">Sincronizando...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Tiempo total reproducido:</string>
<string name="statistics_details_dialog">Empezados %1$d episodios de %2$d.\n\nReproducidos %3$s de %4$s.</string>
@@ -110,6 +114,9 @@
<string name="mark_all_seen_msg">Marcar todos los episodios como vistos</string>
<string name="mark_all_seen_confirmation_msg">Por favor confirma que quieres marcar todos los episodios como vistos.</string>
<string name="show_info_label">Información del programa</string>
+ <string name="show_feed_settings_label">Mostrar configuraciones del feed</string>
+ <string name="feed_info_label">Informaciones del feed</string>
+ <string name="feed_settings_label">Configuraciones del feed</string>
<string name="rename_feed_label">Renombrar Podcast</string>
<string name="remove_feed_label">Eliminar podcast</string>
<string name="share_label">Compartir…</string>
@@ -123,7 +130,7 @@
<string name="feed_remover_msg">Quitando el canal</string>
<string name="load_complete_feed">Actualizar el canal completo</string>
<string name="hide_episodes_title">Ocultar episodios</string>
- <string name="episode_actions">Aplicar acciones</string>
+ <string name="batch_edit">Edición por lotes</string>
<string name="hide_unplayed_episodes_label">No escuchados</string>
<string name="hide_paused_episodes_label">Pausados</string>
<string name="hide_played_episodes_label">Escuchados</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Error desconocido</string>
<string name="no_media_playing_label">No hay medios en reproducción</string>
<string name="player_buffering_msg">Almacenando</string>
+ <string name="player_go_to_picture_in_picture">Modo picture-in-picture</string>
<string name="playbackservice_notification_title">Reproduciendo el podcast</string>
<string name="unknown_media_key">AntennaPod - Tecla multimedia desconocida: %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Duración</string>
<string name="episode_title">Título del episodio</string>
<string name="feed_title">Título del feed</string>
+ <string name="random">Aleatorio</string>
+ <string name="smart_shuffle">Aleatorio inteligente</string>
<string name="ascending">Ascendente</string>
<string name="descending">Descendente</string>
<string name="clear_queue_confirmation_msg">Confirme que quiere borrar TODOS los episodios de la cola</string>
@@ -283,8 +293,17 @@
<string name="other_pref">Otros</string>
<string name="about_pref">Acerca de</string>
<string name="queue_label">Cola</string>
- <string name="services_label">Servicios</string>
+ <string name="integrations_label">Integraciones</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Servicio de micropagos</string>
+ <string name="automation">Automatización</string>
+ <string name="download_pref_details">Detalles</string>
+ <string name="import_export_pref">Importar/Exportar</string>
+ <string name="appearance">Apariencia</string>
+ <string name="external_elements">Elementos externos</string>
+ <string name="interruptions">Interrupciones</string>
+ <string name="buttons">Botones</string>
+ <string name="media_player">Reproductor multimedia</string>
<string name="pref_episode_cleanup_title">Limpieza de episodios</string>
<string name="pref_episode_cleanup_summary">Los episodios que no estén en la cola ni en Favoritos pueden eliminarse si Descarga automática necesita espacio para episodios nuevos</string>
<string name="pref_pauseOnDisconnect_sum">Pausar la reproducción al desconectar los auriculares o el bluetooth</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Caché de episodios</string>
<string name="pref_theme_title_light">Claro</string>
<string name="pref_theme_title_dark">Oscuro</string>
+ <string name="pref_theme_title_trueblack">Negro total</string>
<string name="pref_episode_cache_unlimited">Ilimitado</string>
<string name="pref_update_interval_hours_plural">horas</string>
<string name="pref_update_interval_hours_singular">hora</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Enviar el último informe de fallo por e-mail</string>
<string name="send_email">Enviar e-mail</string>
<string name="experimental_pref">Experimental</string>
- <string name="pref_sonic_title">Sonic media player</string>
- <string name="pref_sonic_message">Usar el reproductor Sonic Media incorporado en lugar del reproductor multimedia de Android y Prestissimo</string>
+ <string name="pref_media_player_message">Seleccione qué reproductor multimedia usar para reproducir archivos</string>
<string name="pref_current_value">Valor actual: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Configurar proxy de red</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Chromecast requiere librerías propietarias de terceros que están deshabilitadas en esta versión de AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Poner descargados en cola</string>
<string name="pref_enqueue_downloaded_summary">Agregar episodios descargados a la cola</string>
+ <string name="media_player_builtin">Reproductor Android integrado</string>
+ <string name="pref_videoBehavior_title">Funcionamiento del video</string>
+ <string name="pref_videoBehavior_sum">Funcionamiento al dejar la reproducción de video</string>
+ <string name="stop_playback">Parar reproducción</string>
+ <string name="continue_playback">Continuar reproducción</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Habilitar Flattr automático</string>
<string name="auto_flattr_after_percent">Hacer Flattr del episodio en cuanto se haya reproducido el %d por ciento</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Fallo al cambiar de posición en el dispositivo Cast</string>
<string name="cast_failed_receiver_player_error">El reproductor ha encontrado un error grave</string>
<string name="cast_failed_media_error_skipping">Error reproduciendo medio. Saltando...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Acción necesaria</string>
+ <string name="notification_channel_user_action_description">Se muestra si su acción es necesaria, por ejemplo, si necesita ingresar una contraseña.</string>
+ <string name="notification_channel_downloading">Descargando</string>
+ <string name="notification_channel_downloading_description">Se muestra mientras se está descargando.</string>
+ <string name="notification_channel_playing">Reproducción actual</string>
+ <string name="notification_channel_playing_description">Permite controlar la reproducción. Esta es la notificación principal que ves al reproducir un podcast.</string>
+ <string name="notification_channel_error">Errores</string>
+ <string name="notification_channel_error_description">Se muestra si algo salió mal, por ejemplo, si falla la descarga o la sincronización del gpodder.</string>
</resources>
diff --git a/core/src/main/res/values-et/strings.xml b/core/src/main/res/values-et/strings.xml
index cff276e09..912e4376a 100644
--- a/core/src/main/res/values-et/strings.xml
+++ b/core/src/main/res/values-et/strings.xml
@@ -105,7 +105,6 @@
<string name="feed_remover_msg">Uudisvoo eemaldamine</string>
<string name="load_complete_feed">Värskenda kogu uudisvoogu</string>
<string name="hide_episodes_title">Peida saated</string>
- <string name="episode_actions">Rakenda tegevused</string>
<string name="hide_unplayed_episodes_label">Esitamata</string>
<string name="hide_paused_episodes_label">Peatatud</string>
<string name="hide_played_episodes_label">Esitatud</string>
@@ -235,7 +234,6 @@
<string name="other_pref">Muud</string>
<string name="about_pref">Info</string>
<string name="queue_label">Järjekord</string>
- <string name="services_label">Teenused</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Saadete kustutamien</string>
<string name="pref_followQueue_sum">Kui saade lõpeb, siis esita kohe järgmine järjekorras olev saade.</string>
@@ -507,4 +505,5 @@
<string name="cast_media_route_menu_title">Esita...</string>
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
<string name="cast_failed_media_error_skipping">Tõrge meedia esitamisel. Jätame vahele...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-fa/strings.xml b/core/src/main/res/values-fa/strings.xml
index fb8bb5e7c..2e4f6d7aa 100644
--- a/core/src/main/res/values-fa/strings.xml
+++ b/core/src/main/res/values-fa/strings.xml
@@ -90,6 +90,7 @@
<string name="episode_cleanup_queue_removal">وقتی که در صف نیست</string>
<string name="episode_cleanup_after_listening">بعد از تمام شدن</string>
<plurals name="episode_cleanup_days_after_listening">
+ <item quantity="one">%dروز بعد از اتمام</item>
<item quantity="other">%dروز بعد از اتمام</item>
</plurals>
<!--'Add Feed' Activity labels-->
@@ -121,7 +122,6 @@
<string name="feed_remover_msg">حذف خوراک</string>
<string name="load_complete_feed">تازه کردن کامل خوراک</string>
<string name="hide_episodes_title">پنهان کردن قسمت ها</string>
- <string name="episode_actions">درخواست اعمال</string>
<string name="hide_unplayed_episodes_label">پخش نشده</string>
<string name="hide_paused_episodes_label">متوقف شد</string>
<string name="hide_played_episodes_label">پخش شد</string>
@@ -201,4 +201,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-fi/strings.xml b/core/src/main/res/values-fi/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-fi/strings.xml
+++ b/core/src/main/res/values-fi/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index f90bbd5fe..1a3fc9c1b 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Mettre à jour les abonnements</string>
<string name="feeds_label">Flux</string>
<string name="statistics_label">Statistiques</string>
<string name="add_feed_label">Ajouter un podcast</string>
<string name="episodes_label">Épisodes</string>
<string name="all_episodes_short_label">Tout</string>
+ <string name="new_episodes_label">Nouveaux</string>
<string name="favorite_episodes_label">Favoris</string>
<string name="new_label">Nouveau</string>
<string name="settings_label">Préférences</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Annuler les téléchargements</string>
<string name="playback_history_label">Journal de lecture</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Synchroniser avec d\'autres appareils</string>
<string name="gpodnet_auth_label">Identifiants gpodder.net</string>
<string name="free_space_label">%1$s d\'espace libre</string>
<string name="episode_cache_full_title">L\'emplacement pour stocker les épisodes est plein</string>
<string name="episode_cache_full_message">Le nombre maximal d\'épisodes téléchargés a été atteint. Vous pouvez changer ce nombre dans les paramètres.</string>
+ <string name="synchronizing">Synchronisation...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Temps d\'écoute total</string>
<string name="statistics_details_dialog">%1$d épisodes sur %2$d commencés.\n\nLu %3$s sur %4$s.</string>
@@ -83,7 +87,7 @@
<string name="auto_download_apply_to_items_message">Le nouveau paramètre <i>Téléchargement Automatique</i> sera automatiquement appliqué sur chaque nouvel épisode.\nVoulez-vous faire de même avec les épisodes précédents ?</string>
<string name="auto_delete_label">Suppression automatique de l\'épisode</string>
<string name="parallel_downloads_suffix">\u0020téléchargements parallèles</string>
- <string name="feed_auto_download_global">Param.par défaut</string>
+ <string name="feed_auto_download_global">Option par défaut</string>
<string name="feed_auto_download_always">Toujours</string>
<string name="feed_auto_download_never">Jamais</string>
<string name="send_label">Envoyer...</string>
@@ -110,6 +114,9 @@
<string name="mark_all_seen_msg">Tous les épisodes ont été marqués vus</string>
<string name="mark_all_seen_confirmation_msg">Merci de confirmer que vous voulez marquer tous les épisodes comme vus.</string>
<string name="show_info_label">Voir les détails</string>
+ <string name="show_feed_settings_label">Paramètres de flux...</string>
+ <string name="feed_info_label">Infos du flux</string>
+ <string name="feed_settings_label">Paramètres du flux</string>
<string name="rename_feed_label">Renommer le podcast</string>
<string name="remove_feed_label">Supprimer le podcast</string>
<string name="share_label">Partager...</string>
@@ -123,7 +130,7 @@
<string name="feed_remover_msg">Flux en cours de suppression</string>
<string name="load_complete_feed">Mettre à jour tout le flux</string>
<string name="hide_episodes_title">Cacher épisodes</string>
- <string name="episode_actions">Appliquer les actions</string>
+ <string name="batch_edit">Edition groupée</string>
<string name="hide_unplayed_episodes_label">Non lus</string>
<string name="hide_paused_episodes_label">En pause</string>
<string name="hide_played_episodes_label">Lus</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Erreur inconnue</string>
<string name="no_media_playing_label">Aucune lecture</string>
<string name="player_buffering_msg">Mise en mémoire</string>
+ <string name="player_go_to_picture_in_picture">Mode Picture-in-Picture</string>
<string name="playbackservice_notification_title">Lecture de podcast en cours</string>
<string name="unknown_media_key">AntennaPod - Touche média inconnue : %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Durée</string>
<string name="episode_title">Titre de l\'épisode</string>
<string name="feed_title">Nom du flux</string>
+ <string name="random">Aléatoire</string>
+ <string name="smart_shuffle">Tri intelligent</string>
<string name="ascending">Ordre croissant</string>
<string name="descending">Ordre décroissant</string>
<string name="clear_queue_confirmation_msg">Veuillez confirmer que vous voulez bien supprimer TOUS les épisodes de la liste de lecture</string>
@@ -283,13 +293,22 @@
<string name="other_pref">Autres</string>
<string name="about_pref">À propos</string>
<string name="queue_label">Liste</string>
- <string name="services_label">Services</string>
+ <string name="integrations_label">Intégrations</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Service de micropaiement</string>
+ <string name="automation">Automatisation</string>
+ <string name="download_pref_details">Détails</string>
+ <string name="import_export_pref">Importation / Exportation</string>
+ <string name="appearance">Apparence</string>
+ <string name="external_elements">Eléments externes</string>
+ <string name="interruptions">Interruptions</string>
+ <string name="buttons">Boutons</string>
+ <string name="media_player">Lecteur multimédia</string>
<string name="pref_episode_cleanup_title">Nettoyage des épisodes</string>
<string name="pref_episode_cleanup_summary">Les épisodes qui ne sont pas dans la liste de lecture et qui ne sont pas marqués comme favoris peuvent être supprimés si l\'espace est insuffisant pour le téléchargement automatique de nouveaux épisodes</string>
<string name="pref_pauseOnDisconnect_sum">Interrompre la lecture lorsque le casque ou le bluetooth sont déconnectés</string>
- <string name="pref_unpauseOnHeadsetReconnect_sum">Reprendre la lecture quand les écouteurs sont reconnectés</string>
- <string name="pref_unpauseOnBluetoothReconnect_sum">Reprendre la lecture quand le Bluetooth se reconnecte</string>
+ <string name="pref_unpauseOnHeadsetReconnect_sum">Reprendre la lecture quand les écouteurs sont connectés</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">Reprendre la lecture quand le Bluetooth se connecte</string>
<string name="pref_hardwareForwardButtonSkips_title">Le bouton \"saut avant\" saute l\'épisode</string>
<string name="pref_hardwareForwardButtonSkips_sum">Passer à l\'épisode suivant au lieu de faire un saut avant quand un bouton physique \"saut avant\" est pressé</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Le bouton \"saut arrière\" redémarre l\'épisode</string>
@@ -316,9 +335,9 @@
<string name="pref_downloadMediaOnWifiOnly_sum">Ne télécharger les épisodes que par Wi-Fi</string>
<string name="pref_followQueue_title">Lecture continue</string>
<string name="pref_downloadMediaOnWifiOnly_title">Téléchargement en Wi-Fi</string>
- <string name="pref_pauseOnHeadsetDisconnect_title">Déconnexion du casque</string>
- <string name="pref_unpauseOnHeadsetReconnect_title">Reconnexion du casque</string>
- <string name="pref_unpauseOnBluetoothReconnect_title">Reconnexion Bluetooth</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Déconnexion des écouteurs ou du Bluetooth</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">Connexion des écouteurs</string>
+ <string name="pref_unpauseOnBluetoothReconnect_title">Connexion du Bluetooth</string>
<string name="pref_mobileUpdate_title">Mises à jour mobile</string>
<string name="pref_mobileUpdate_sum">Autoriser les mises à jour avec la connexion mobile</string>
<string name="refreshing_label">Mise à jour en cours</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Épisodes stockés localement</string>
<string name="pref_theme_title_light">Clair</string>
<string name="pref_theme_title_dark">Sombre</string>
+ <string name="pref_theme_title_trueblack">Noir / True Black</string>
<string name="pref_episode_cache_unlimited">Illimité</string>
<string name="pref_update_interval_hours_plural">heures</string>
<string name="pref_update_interval_hours_singular">heure</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Envoyer le dernier rapport de crash par e-mail</string>
<string name="send_email">Envoyer e-mail</string>
<string name="experimental_pref">Expérimental</string>
- <string name="pref_sonic_title">Lecteur multimédia Sonic</string>
- <string name="pref_sonic_message">Utiliser le lecteur multimédia interne Sonic au lieu du lecteur natif d\'Android ou Prestissimo</string>
+ <string name="pref_media_player_message">Choisir le lecteur à utiliser pour lire les fichiers</string>
<string name="pref_current_value">Valeur actuelle : %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Paramétrer un réseau proxy</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Chromecast nécessite des bibliothèques tierces qui sont désactivées dans cette version d\'AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Ajouter à la liste après téléchargement</string>
<string name="pref_enqueue_downloaded_summary">Mettre les épisodes dans la la liste de lecture après téléchargement</string>
+ <string name="media_player_builtin">Lecteur natif d\'Android</string>
+ <string name="pref_videoBehavior_title">Sorti 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>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Activer le paiement flattr automatique</string>
<string name="auto_flattr_after_percent">Lancer un paiement flattr quand %d pourcent de l\'épisode a été lu</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Échec de la recherche de la nouvelle position sur l\'appareil cast</string>
<string name="cast_failed_receiver_player_error">Le lecteur de réception a rencontré une grave erreur</string>
<string name="cast_failed_media_error_skipping">Erreur de lecture du média. Passage au suivant...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Action requise</string>
+ <string name="notification_channel_user_action_description">S\'affiche si une action est requise. Par exemple, un mot de passe à saisir.</string>
+ <string name="notification_channel_downloading">Téléchargement en cours</string>
+ <string name="notification_channel_downloading_description">S\'affiche lorsqu\'un téléchargement est en cours.</string>
+ <string name="notification_channel_playing">Lecture en cours</string>
+ <string name="notification_channel_playing_description">Permet de contrôler la lecture. C\'est la notification principale pendant la lecture d\'un podcast.</string>
+ <string name="notification_channel_error">Erreurs</string>
+ <string name="notification_channel_error_description">S\'affiche en cas de problème. Par exemple, un téléchargement ou une synchronisation qui échoue.</string>
</resources>
diff --git a/core/src/main/res/values-gl-rES/strings.xml b/core/src/main/res/values-gl-rES/strings.xml
index 54a270312..555356f0f 100644
--- a/core/src/main/res/values-gl-rES/strings.xml
+++ b/core/src/main/res/values-gl-rES/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Actualizar suscricións</string>
<string name="feeds_label">Fontes</string>
<string name="statistics_label">Estatísticas</string>
<string name="add_feed_label">Engadir Podcast</string>
<string name="episodes_label">Episodios</string>
<string name="all_episodes_short_label">Todo</string>
+ <string name="new_episodes_label">Novo</string>
<string name="favorite_episodes_label">Favoritos</string>
<string name="new_label">Novo</string>
<string name="settings_label">Axustes</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Cancelar\nDescarga</string>
<string name="playback_history_label">Historial de reprodución</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Sincronizar con outros dispositivos</string>
<string name="gpodnet_auth_label">gpodder.net Conexión</string>
<string name="free_space_label">%1$s libre</string>
<string name="episode_cache_full_title">Caché de episodios chea</string>
<string name="episode_cache_full_message">Acadouse o límite de espazo na caché de episodios. Pode incrementalo nos Axustes do tamaño da caché.</string>
+ <string name="synchronizing">Sincronizando...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Tempo total dos podcast reproducidos:</string>
<string name="statistics_details_dialog">%1$d de %2$d episodios iniciados.\n\nReproducidos %3$s de %4$s.</string>
@@ -110,6 +114,9 @@
<string name="mark_all_seen_msg">Marcáronse todos os episodios como vistos</string>
<string name="mark_all_seen_confirmation_msg">Por favor confirme que quere marcar todos os episodios como vistos.</string>
<string name="show_info_label">Mostrar información</string>
+ <string name="show_feed_settings_label">Mostrar axustes da fonte</string>
+ <string name="feed_info_label">Info da fonte</string>
+ <string name="feed_settings_label">Axustes da fonte</string>
<string name="rename_feed_label">Mudar nome do podcast</string>
<string name="remove_feed_label">Quitar podcast</string>
<string name="share_label">Compartir...</string>
@@ -123,7 +130,7 @@
<string name="feed_remover_msg">Eliminando a fonte</string>
<string name="load_complete_feed">Actualizar completamente a fonte</string>
<string name="hide_episodes_title">Ocultar episodios</string>
- <string name="episode_actions">Aplicar accións</string>
+ <string name="batch_edit">Edición por lote</string>
<string name="hide_unplayed_episodes_label">Non reproducido</string>
<string name="hide_paused_episodes_label">En pausa</string>
<string name="hide_played_episodes_label">Reproducido</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Fallo descoñecido</string>
<string name="no_media_playing_label">Non reproducindo</string>
<string name="player_buffering_msg">Almacenando</string>
+ <string name="player_go_to_picture_in_picture">Modo imaxe-en-imaxe</string>
<string name="playbackservice_notification_title">Reproducindo podcast</string>
<string name="unknown_media_key">AntennaPod - chave de medios descoñecida: %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Duración</string>
<string name="episode_title">Título do episodio</string>
<string name="feed_title">Título da fonte</string>
+ <string name="random">Aleatorio</string>
+ <string name="smart_shuffle">Barallado intelixente</string>
<string name="ascending">Ascendente</string>
<string name="descending">Descendente</string>
<string name="clear_queue_confirmation_msg">Por favor confirme que quere limpar a cola e TODOS os episodios nela</string>
@@ -283,8 +293,17 @@
<string name="other_pref">Outro</string>
<string name="about_pref">Sobre</string>
<string name="queue_label">Cola</string>
- <string name="services_label">Servizos</string>
+ <string name="integrations_label">Integracións</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Servizo de micropagamentos</string>
+ <string name="automation">Automatizado</string>
+ <string name="download_pref_details">Detalles</string>
+ <string name="import_export_pref">Importar/Exportar</string>
+ <string name="appearance">Aspecto</string>
+ <string name="external_elements">Elementos externos</string>
+ <string name="interruptions">Interrupcións</string>
+ <string name="buttons">Botóns</string>
+ <string name="media_player">Reprodutor de medios</string>
<string name="pref_episode_cleanup_title">Limpeza de episodios</string>
<string name="pref_episode_cleanup_summary">Os episodios que non están na cola e tampouco son favoritos deberían poder ser candidatos a ser eliminados si a función Descarga Automática precisa espazo para novos episodios.</string>
<string name="pref_pauseOnDisconnect_sum">Deter a reprodución cando se desconectan os auriculares ou bluetooth</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Caché de episodios</string>
<string name="pref_theme_title_light">Claro</string>
<string name="pref_theme_title_dark">Oscuro</string>
+ <string name="pref_theme_title_trueblack">Negro lexítimo</string>
<string name="pref_episode_cache_unlimited">Ilimitado</string>
<string name="pref_update_interval_hours_plural">horas</string>
<string name="pref_update_interval_hours_singular">hora</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Enviar por email o informe de fallo xeral no aplicativo</string>
<string name="send_email">Enviar email</string>
<string name="experimental_pref">En probas</string>
- <string name="pref_sonic_title">Sonic Media Player</string>
- <string name="pref_sonic_message">Utilizar o sonic media player incluído no lugar do reprodutor nativo de Android e Prestissimo</string>
+ <string name="pref_media_player_message">Escolla o reprodutor de medios para reproducir ficheiros</string>
<string name="pref_current_value">Valor actual: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Establecer un proxy para a rede</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Chromecast precisa software propietario de terceiras partes que están deshabilitadas en esta versión de AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Foron descargados os elementos da cola</string>
<string name="pref_enqueue_downloaded_summary">Engadir os episodios descargados a cola</string>
+ <string name="media_player_builtin">Reprodutor android nativo</string>
+ <string name="pref_videoBehavior_title">Comportamento de video</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">Reprodución contínua</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Hablitar o flattring automático</string>
<string name="auto_flattr_after_percent">Flattr o episodio tan pronto como o %d por cento foi reproducido</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Non se puido cambiar a posición no dispositivo de emisión</string>
<string name="cast_failed_receiver_player_error">O reprodutor receptor atopou un fallo grave</string>
<string name="cast_failed_media_error_skipping">Fallo na reprodución de medios. Saltando...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Acción requerida</string>
+ <string name="notification_channel_user_action_description">Mostrado si a súa acción é requerida, por exemplo si precisa introducir o contrasinal.</string>
+ <string name="notification_channel_downloading">Descargando</string>
+ <string name="notification_channel_downloading_description">Mostrado durante a descarga actual.</string>
+ <string name="notification_channel_playing">Soando agora</string>
+ <string name="notification_channel_playing_description">Permite controlar a reprodución. Esta é a notificación principal que verá mentras reproduce un podcast.</string>
+ <string name="notification_channel_error">Fallos</string>
+ <string name="notification_channel_error_description">Mostrado si algo falla, por exemplo si a descarga ou a sincronización con gpodder fallan.</string>
</resources>
diff --git a/core/src/main/res/values-hi-rIN/strings.xml b/core/src/main/res/values-hi-rIN/strings.xml
index 7e3333a37..dc99bc9e1 100644
--- a/core/src/main/res/values-hi-rIN/strings.xml
+++ b/core/src/main/res/values-hi-rIN/strings.xml
@@ -140,7 +140,6 @@
<string name="other_pref">अन्य</string>
<string name="about_pref">के बारे में</string>
<string name="queue_label">पंक्ति</string>
- <string name="services_label">सेवाएं</string>
<string name="flattr_label">Flattr</string>
<string name="pref_followQueue_sum">प्लेबैक के पूरा होने पर अगली पंक्ति आइटम के लिए जाएँ</string>
<string name="playback_pref">प्लेबैक</string>
@@ -199,7 +198,6 @@
<string name="deselect_all_label">सभी का चयन रद्द करें</string>
<string name="opml_export_label">OPML निर्यात</string>
<string name="export_error_label">निर्यात त्रुटि</string>
- <string name="opml_export_success_sum">.ompl फ़ाइल लिखा गया था:\u0020</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">स्लीप टाइमर सेट</string>
<string name="disable_sleeptimer_label">स्लीप टाइमर अक्षम</string>
@@ -263,4 +261,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml
index 5d515b926..6d4018c25 100644
--- a/core/src/main/res/values-hu/strings.xml
+++ b/core/src/main/res/values-hu/strings.xml
@@ -119,7 +119,6 @@
<string name="feed_remover_msg">Idővonal eltávolítása</string>
<string name="load_complete_feed">Teljes idővonal frissítése</string>
<string name="hide_episodes_title">Epizódok elrejtése</string>
- <string name="episode_actions">Műveletek alkalmazása</string>
<string name="hide_unplayed_episodes_label">Nem lejátszott</string>
<string name="hide_paused_episodes_label">Szüneteltetett</string>
<string name="hide_played_episodes_label">Lejátszott</string>
@@ -295,7 +294,6 @@
<string name="pref_image_cache_size_sum">Kép gyorsítótár méretének a lemezen</string>
<string name="crash_report_title">Hibajelentés</string>
<string name="experimental_pref">Kísérleti</string>
- <string name="pref_sonic_title">Sonic Media Player</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Hálózati proxy beállítása</string>
<string name="pref_faq">GYIK</string>
@@ -387,4 +385,5 @@
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
<string name="cast_failed_setting_volume">Hiba a hangerő beállítása közben</string>
<string name="cast_failed_media_error_skipping">Hiba a lejátszás közben. Átugrás...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-id/strings.xml b/core/src/main/res/values-id/strings.xml
index e6ff6d1e7..62254518d 100644
--- a/core/src/main/res/values-id/strings.xml
+++ b/core/src/main/res/values-id/strings.xml
@@ -151,4 +151,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-is-rIS/strings.xml b/core/src/main/res/values-is-rIS/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-is-rIS/strings.xml
+++ b/core/src/main/res/values-is-rIS/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-it-rIT/strings.xml b/core/src/main/res/values-it-rIT/strings.xml
index 75c02130e..6aee5c314 100644
--- a/core/src/main/res/values-it-rIT/strings.xml
+++ b/core/src/main/res/values-it-rIT/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Aggiorna Sottoscrizioni</string>
<string name="feeds_label">Feed</string>
<string name="statistics_label">Statistiche</string>
<string name="add_feed_label">Aggiungi un podcast</string>
<string name="episodes_label">Episodi</string>
<string name="all_episodes_short_label">Tutti</string>
+ <string name="new_episodes_label">Novità</string>
<string name="favorite_episodes_label">Preferiti</string>
<string name="new_label">Nuovo</string>
<string name="settings_label">Impostazioni</string>
@@ -18,16 +20,18 @@
<string name="cancel_download_label">Annulla\nil Download</string>
<string name="playback_history_label">Cronologia delle riproduzioni</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Sincronizza con altri dispositivi</string>
<string name="gpodnet_auth_label">Accesso a gpodder.net</string>
<string name="free_space_label">%1$s disponibili</string>
<string name="episode_cache_full_title">Cache degli episodi piena</string>
<string name="episode_cache_full_message">Lo spazio di memoria della cache degli episodi è esaurito. Puoi aumentarlo nelle Impostazioni</string>
+ <string name="synchronizing">Sincronizzazione...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Tempo totale di riproduzione:</string>
<string name="statistics_details_dialog">%1$d di %2$d episodi iniziati.\n\nRiprodotti %3$s di %4$s.</string>
- <string name="statistics_mode">Modalità di statistica</string>
- <string name="statistics_mode_normal">Calcola l\'attuale tempo di riproduzione. Riprodurre un podcast due volte verrà contato due volte, mentre segnarlo come riprodotto no.</string>
- <string name="statistics_mode_count_all">Somma tutti i podcast segnati come riprodotti</string>
+ <string name="statistics_mode">Modalità di calcolo</string>
+ <string name="statistics_mode_normal">Calcola il tempo di riproduzione reale. Riprodurre un podcast due volte verrà contato due volte, segnarlo come riprodotto no.</string>
+ <string name="statistics_mode_count_all">Somma il tempo di riproduzione di tutti i podcast segnati come riprodotti</string>
<string name="statistics_speed_not_counted">Avviso: La velocità di riproduzione non viene considerata.</string>
<!--Main activity-->
<string name="drawer_open">Apri il menù</string>
@@ -83,7 +87,7 @@
<string name="auto_download_apply_to_items_message">L\'opzione <i>Download Automatico</i> verrà applicata ai nuovi episodi.\nVuoi anche applicarla agli episodi precedenti?</string>
<string name="auto_delete_label">Elimina Episodi Automaticamente</string>
<string name="parallel_downloads_suffix">\u0020download paralleli</string>
- <string name="feed_auto_download_global">Impostazione Globale</string>
+ <string name="feed_auto_download_global">Predefinita globale</string>
<string name="feed_auto_download_always">Sempre</string>
<string name="feed_auto_download_never">Mai</string>
<string name="send_label">Invia...</string>
@@ -110,20 +114,23 @@
<string name="mark_all_seen_msg">Segnati tutti gli episodi come visti</string>
<string name="mark_all_seen_confirmation_msg">Conferma che desideri segnare tutti gli episodi come visti.</string>
<string name="show_info_label">Informazioni</string>
- <string name="rename_feed_label">Rinomina Podcast</string>
+ <string name="show_feed_settings_label">Mostra le impostazioni del feed</string>
+ <string name="feed_info_label">Informazioni feed</string>
+ <string name="feed_settings_label">Impostazioni feed</string>
+ <string name="rename_feed_label">Rinomina podcast</string>
<string name="remove_feed_label">Rimuovi podcast</string>
<string name="share_label">Condividi...</string>
<string name="share_link_label">Condividi il link</string>
<string name="share_file_label">Condividi il file</string>
<string name="share_link_with_position_label">Condividi il Link con la Posizione</string>
- <string name="share_feed_url_label">Condividi URL del Feed</string>
+ <string name="share_feed_url_label">Condividi URL del feed</string>
<string name="share_item_url_label">Condividi l\'URL dell\'episodio</string>
- <string name="share_item_url_with_position_label">Condividi l\'URL del File dell\'epsiodio con la Posizione</string>
+ <string name="share_item_url_with_position_label">Condividi l\'URL del file dell\'epsiodio con la posizione</string>
<string name="feed_delete_confirmation_msg">Conferma che desideri cancellare il feed \"%1$s\" e TUTTI i suoi episodi scaricati.</string>
<string name="feed_remover_msg">Rimozione del Feed in corso</string>
<string name="load_complete_feed">Ricarica il feed completo</string>
<string name="hide_episodes_title">Nascondi gli episodi</string>
- <string name="episode_actions">Applica le azioni</string>
+ <string name="batch_edit">Modifica in gruppo</string>
<string name="hide_unplayed_episodes_label">Non riprodotti</string>
<string name="hide_paused_episodes_label">In pausa</string>
<string name="hide_played_episodes_label">Riprodotti</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Errore sconosciuto</string>
<string name="no_media_playing_label">Nessun elemento multimediale in riproduzione</string>
<string name="player_buffering_msg">Buffer in corso</string>
+ <string name="player_go_to_picture_in_picture">Modalità picture-in-picture</string>
<string name="playbackservice_notification_title">Riproduzione del podcast in corso</string>
<string name="unknown_media_key">AntennaPod - Chiave dell\'elemento multimediale sconosciuta: %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Per durata</string>
<string name="episode_title">Titolo dell\'episodio</string>
<string name="feed_title">Titolo del feed</string>
+ <string name="random">Casuale</string>
+ <string name="smart_shuffle">Casuale intelligente</string>
<string name="ascending">In ordine crescente</string>
<string name="descending">In ordine decrescente</string>
<string name="clear_queue_confirmation_msg">Per favore conferma che vuoi rimuovere dalla coda TUTTI gli episodi in essa presenti.</string>
@@ -283,13 +293,22 @@
<string name="other_pref">Altro</string>
<string name="about_pref">Informazioni</string>
<string name="queue_label">Coda</string>
- <string name="services_label">Servizi</string>
+ <string name="integrations_label">Integrazioni</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Servizio micropagamenti</string>
+ <string name="automation">Automazione</string>
+ <string name="download_pref_details">Dettagli</string>
+ <string name="import_export_pref">Importa/Esporta</string>
+ <string name="appearance">Aspetto</string>
+ <string name="external_elements">Elementi esterni</string>
+ <string name="interruptions">Interruzioni</string>
+ <string name="buttons">Pulsanti</string>
+ <string name="media_player">Media player</string>
<string name="pref_episode_cleanup_title">Pulizia episodi</string>
<string name="pref_episode_cleanup_summary">Gli episodi che non sono in coda e non sono tra i preferiti potrebbero essere rimossi se i Download Automatici richiedono maggiore spazio.</string>
- <string name="pref_pauseOnDisconnect_sum">Sospendi la riproduzione quando le cuffie o il bluetooth sono disconnessi</string>
+ <string name="pref_pauseOnDisconnect_sum">Sospendi la riproduzione quando le cuffie o il bluetooth vengono disconnessi</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Riprendi la riproduzione quando vengono riconnesse le cuffie</string>
- <string name="pref_unpauseOnBluetoothReconnect_sum">Riprendere la riproduzione quando il Bluetooth si riconnette</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">Riprendi la riproduzione quando il Bluetooth si riconnette</string>
<string name="pref_hardwareForwardButtonSkips_title">Il tasto Avanti salta la traccia</string>
<string name="pref_hardwareForwardButtonSkips_sum">Quando viene premuto un tasto Avanti fisico, viene saltata la traccia invece di andare avanti veloce</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Il tasto Indietro riavvia la traccia</string>
@@ -298,15 +317,15 @@
<string name="pref_auto_delete_sum">Elimina l\'episodio quando viene completata la riproduzione</string>
<string name="pref_auto_delete_title">Elimina automaticamente</string>
<string name="pref_smart_mark_as_played_sum">Contrassegna gli episodi come riprodotti anche se rimangono alcuni secondi da riprodurre</string>
- <string name="pref_smart_mark_as_played_title">Imposta come Riprodotto intelligente</string>
- <string name="pref_skip_keeps_episodes_sum">Mantieni gli episodi quando vengono saltati</string>
- <string name="pref_skip_keeps_episodes_title">Manteni gli Episodi Saltati</string>
+ <string name="pref_smart_mark_as_played_title">Segna come Riprodotto dopo</string>
+ <string name="pref_skip_keeps_episodes_sum">Mantieni in coda gli episodi quando vengono saltati</string>
+ <string name="pref_skip_keeps_episodes_title">Manteni gli episodi saltati</string>
<string name="pref_favorite_keeps_episodes_sum">Mantieni gli episodi quando sono segnati come Preferiti</string>
<string name="pref_favorite_keeps_episodes_title">Mantieni episodi preferiti</string>
<string name="playback_pref">Riproduzione</string>
<string name="network_pref">Rete</string>
<string name="pref_autoUpdateIntervallOrTime_title">Intervallo o orario di aggiornamento</string>
- <string name="pref_autoUpdateIntervallOrTime_sum">Imposta un intervallo di tempo o un orario specifico in cui le sottoscrizioni si aggiornano automaticamente</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Imposta un intervallo di tempo o un orario specifico in cui le sottoscrizioni vengono aggiornate automaticamente</string>
<string name="pref_autoUpdateIntervallOrTime_message">Puoi impostare un <i>intervallo</i> come \"ogni 2 ore\", impostare <i>un\'ora del giorno</i> specifica, come \"7:00\" oppure <i>disabilitare</i> gli aggiornamenti automatici del tutto.\n\n<small>Nota: I tempi di aggiornamento non sono perfetti. Potrai riscontrare dei brevi ritardi.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Disabilita</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Imposta Intervallo</string>
@@ -317,7 +336,7 @@
<string name="pref_followQueue_title">Riproduzione Continua</string>
<string name="pref_downloadMediaOnWifiOnly_title">Download dei media su WiFi</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Disconnessione cuffie</string>
- <string name="pref_unpauseOnHeadsetReconnect_title">Riconnetti le Cuffie</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">Riconnessione cuffie</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Riconnessione Bluetooth</string>
<string name="pref_mobileUpdate_title">Aggiornamenti su Reti a Consumo</string>
<string name="pref_mobileUpdate_sum">Permetti gli aggiornamenti tramite connessione dati mobile</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Cache degli Episodi</string>
<string name="pref_theme_title_light">Chiaro</string>
<string name="pref_theme_title_dark">Scuro</string>
+ <string name="pref_theme_title_trueblack">Nero</string>
<string name="pref_episode_cache_unlimited">Illimitato</string>
<string name="pref_update_interval_hours_plural">ore</string>
<string name="pref_update_interval_hours_singular">ora</string>
@@ -398,15 +418,14 @@
<string name="pref_queueAddToFront_sum">Aggiungi un nuovo episodio in testa alla coda.</string>
<string name="pref_queueAddToFront_title">Aggiungi in cima alla coda</string>
<string name="pref_smart_mark_as_played_disabled">Disabilitato</string>
- <string name="pref_image_cache_size_title">Dimensione Cache delle Immagini</string>
+ <string name="pref_image_cache_size_title">Dimensione cache delle immagini</string>
<string name="pref_image_cache_size_sum">Dimensione cache per le immagini</string>
<string name="crash_report_title">Report dei crash</string>
<string name="crash_report_sum">Invia il report dell\'ultimo crash via e-mail</string>
<string name="send_email">Invia e-mail</string>
<string name="experimental_pref">Sperimentale</string>
- <string name="pref_sonic_title">Sonic Media Player</string>
- <string name="pref_sonic_message">Usa il sonic media player integrato in sostituzione di Prestissimo e del mediaplayer nativo di Android</string>
- <string name="pref_current_value">Valore corrente: %1$s</string>
+ <string name="pref_media_player_message">Seleziona il media player da usare per riprodurre i file</string>
+ <string name="pref_current_value">Impostazione attuale: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Imposta proxy di rete</string>
<string name="pref_faq">FAQ</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Chromecast richiede librerie proprietarie di terze parti che sono disabilitate in questa versione di AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Aggiungi i download alla coda</string>
<string name="pref_enqueue_downloaded_summary">Aggiungi gli episodi scaricati alla coda di riproduzione</string>
+ <string name="media_player_builtin">Player Android integrato</string>
+ <string name="pref_videoBehavior_title">Comportamento del video</string>
+ <string name="pref_videoBehavior_sum">Comportamento quando si esce dalla riproduzione video</string>
+ <string name="stop_playback">Interrompi riproduzione</string>
+ <string name="continue_playback">Continua la riproduzione</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Abilita l\'esecuzione automatica di Flattr</string>
<string name="auto_flattr_after_percent">Carica l\'episodio su Flattr appena è stato riprodotto al %d percento</string>
@@ -439,7 +463,7 @@
<string name="opml_import_explanation_2">Usa un\'applicazione esterna come Dropbox, Google Drive o il tuo gestore file preferito per aprire un file OPML.</string>
<string name="opml_import_explanation_3">Molte applicazioni come Google Mail, Dropbox, Google Drive e i gestori di file possono <i>aprire</i> i file OPML <i>con</i> AntennaPod.</string>
<string name="start_import_label">Avvio importazione</string>
- <string name="opml_import_label">Importazione OPML</string>
+ <string name="opml_import_label">Importa da OPML</string>
<string name="opml_directory_error">ERRORE!</string>
<string name="reading_opml_label">Lettura OPML file in corso</string>
<string name="opml_reader_error">E\' stato riscontrato un errore nell\'apertura del documento OPML</string>
@@ -450,7 +474,7 @@
<string name="choose_file_from_filesystem">Dal filesystem locale</string>
<string name="choose_file_from_external_application">Utilizza un\'applicazione esterna</string>
<string name="opml_export_label">Esportazione su OPML</string>
- <string name="html_export_label">Esportazione in HTML</string>
+ <string name="html_export_label">Esporta in HTML</string>
<string name="exporting_label">Esportazione in corso...</string>
<string name="export_error_label">Errore di esportazione</string>
<string name="export_success_title">Esportazione eseguita</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Ricerca della nuova posizione sul dispositivo ricevente fallita</string>
<string name="cast_failed_receiver_player_error">Il dispositivo ricevente ha restituito un errore grave</string>
<string name="cast_failed_media_error_skipping">Errore nella riproduzione. Salto...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Azione richesta</string>
+ <string name="notification_channel_user_action_description">Mostra se è richesto un tuo intervento, per sempio se è necessario inserire la password.</string>
+ <string name="notification_channel_downloading">Scaricando</string>
+ <string name="notification_channel_downloading_description">Mostra mentre è in corso il download</string>
+ <string name="notification_channel_playing">In riproduzione</string>
+ <string name="notification_channel_playing_description">Permette di controllare la riproduzione. Questa è la principale notifica visibile quando un prodcast è in riproduzione.</string>
+ <string name="notification_channel_error">Errori</string>
+ <string name="notification_channel_error_description">Mostrato se qualcosa è andato storto, per esempio se fallisce il download o la sincronizzazione di gpodder.</string>
</resources>
diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml
index f7988a463..d6effd4ef 100644
--- a/core/src/main/res/values-it/strings.xml
+++ b/core/src/main/res/values-it/strings.xml
@@ -123,7 +123,6 @@
<string name="feed_remover_msg">Rimozione del Feed in corso</string>
<string name="load_complete_feed">Aggiorna il feed completo</string>
<string name="hide_episodes_title">Nascondi gli episodi</string>
- <string name="episode_actions">Applica le azioni</string>
<string name="hide_unplayed_episodes_label">Non riprodotti</string>
<string name="hide_paused_episodes_label">In pausa</string>
<string name="hide_played_episodes_label">Riprodotti</string>
@@ -278,7 +277,6 @@
<string name="other_pref">Altro</string>
<string name="about_pref">Riguardo a</string>
<string name="queue_label">Coda</string>
- <string name="services_label">Servizi</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Pulizia dell\'episodio</string>
<string name="pref_episode_cleanup_summary">Gli episodi che non sono in coda e non sono preferiti dovrebbero essere idonei alla rimozione se Auto Download richiede spazio per nuovi episodi</string>
@@ -532,4 +530,5 @@
<!--Casting-->
<string name="cast_media_route_menu_title">Riproduci su...</string>
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-iw-rIL/strings.xml b/core/src/main/res/values-iw-rIL/strings.xml
index ffbd4f6e1..3860518d4 100644
--- a/core/src/main/res/values-iw-rIL/strings.xml
+++ b/core/src/main/res/values-iw-rIL/strings.xml
@@ -125,7 +125,6 @@
<string name="feed_remover_msg">ההזנה נמחקת</string>
<string name="load_complete_feed">רענון אלו שהסתיימו בהזנה</string>
<string name="hide_episodes_title">הסתרת פרקים</string>
- <string name="episode_actions">החלת פעולות</string>
<string name="hide_unplayed_episodes_label">לא נוגן</string>
<string name="hide_paused_episodes_label">מושהה</string>
<string name="hide_played_episodes_label">נוגן</string>
@@ -287,7 +286,6 @@
<string name="other_pref">אחר</string>
<string name="about_pref">על אודות</string>
<string name="queue_label">תור</string>
- <string name="services_label">שירותים</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">ניקוי פרקים</string>
<string name="pref_episode_cleanup_summary">פרקים שאינם בתור ואינם במועדפים אמורים לענות לתנאים של הסרה במקרה שההורדה האוטומטית זקוקה למקום לפרקים חדשים</string>
@@ -408,8 +406,6 @@
<string name="crash_report_sum">שליחת דיווח הקריסה העדכני ביותר דרך דוא״ל</string>
<string name="send_email">שליחת דוא״ל</string>
<string name="experimental_pref">ניסיוני</string>
- <string name="pref_sonic_title">נגן המדיה Sonic</string>
- <string name="pref_sonic_message">שימוש בנגן Sonic המובנה כחלופה לנגן המדיה המובנה של Android ו־Prestissimo</string>
<string name="pref_current_value">ערך נוכחי: %1$s</string>
<string name="pref_proxy_title">מתווך</string>
<string name="pref_proxy_sum">הגדרת מתווך רשת</string>
@@ -655,4 +651,5 @@
<string name="cast_failed_seek">ההקפצה למיקום נגינה אחר בהתקן השידור נכשלה</string>
<string name="cast_failed_receiver_player_error">הנגן המקבל נתקל בשגיאה חמורה</string>
<string name="cast_failed_media_error_skipping">שגיאה בנגינת המדיה. מתבצע דילוג…</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml
index 123beb079..c6068aa4b 100644
--- a/core/src/main/res/values-ja/strings.xml
+++ b/core/src/main/res/values-ja/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">購読を更新</string>
<string name="feeds_label">フィード</string>
<string name="statistics_label">統計情報</string>
<string name="add_feed_label">フィードを追加</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>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">ダウンロードをキャンセル</string>
<string name="playback_history_label">再生履歴</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">他のデバイスと同期</string>
<string name="gpodnet_auth_label">gpodder.net ログイン</string>
<string name="free_space_label">%1$s 空き</string>
<string name="episode_cache_full_title">エピソードキャッシュが一杯です</string>
<string name="episode_cache_full_message">エピソードキャッシュが制限に達しました。設定でキャッシュサイズを増やすことができます。</string>
+ <string name="synchronizing">同期しています…</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">ポッドキャストを再生した合計時間:</string>
<string name="statistics_details_dialog">%2$d から %1$d のエピソードが開始しました。\n\n%4$s から%3$s を再生しました。</string>
@@ -109,6 +113,9 @@
<string name="mark_all_seen_msg">すべてのエピソードを参照済にしました</string>
<string name="mark_all_seen_confirmation_msg">参照済としてマークするすべてのエピソードを確認してください。</string>
<string name="show_info_label">情報を表示</string>
+ <string name="show_feed_settings_label">フィード設定を表示</string>
+ <string name="feed_info_label">フィード情報</string>
+ <string name="feed_settings_label">フィード設定</string>
<string name="rename_feed_label">ポッドキャストの名前を変更</string>
<string name="remove_feed_label">ポッドキャストを削除</string>
<string name="share_label">共有…</string>
@@ -122,7 +129,7 @@
<string name="feed_remover_msg">フィードの削除中</string>
<string name="load_complete_feed">フィードをすべて更新</string>
<string name="hide_episodes_title">エピソードを非表示にする</string>
- <string name="episode_actions">操作を適用</string>
+ <string name="batch_edit">一括編集</string>
<string name="hide_unplayed_episodes_label">未再生</string>
<string name="hide_paused_episodes_label">一時停止しました</string>
<string name="hide_played_episodes_label">再生しました</string>
@@ -218,6 +225,7 @@
<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="playbackservice_notification_title">ポッドキャストを再生中</string>
<string name="unknown_media_key">AntennaPod - 不明なメディアキー: %1$d</string>
<!--Queue operations-->
@@ -235,6 +243,8 @@
<string name="duration">継続時間</string>
<string name="episode_title">エピソード タイトル</string>
<string name="feed_title">フィード タイトル</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>
@@ -281,8 +291,17 @@
<string name="other_pref">その他</string>
<string name="about_pref">について</string>
<string name="queue_label">キュー</string>
- <string name="services_label">サービス</string>
+ <string name="integrations_label">統合</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">マイクロペイメント サービス</string>
+ <string name="automation">自動</string>
+ <string name="download_pref_details">詳細</string>
+ <string name="import_export_pref">インポート/エクスポート</string>
+ <string name="appearance">外観</string>
+ <string name="external_elements">外部要素</string>
+ <string name="interruptions">割り込み</string>
+ <string name="buttons">ボタン</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">ヘッドフォンまたはBluetoothの接続が切断された時、再生を一時停止します</string>
@@ -352,6 +371,7 @@
<string name="pref_episode_cache_title">エピソードキャッシュ</string>
<string name="pref_theme_title_light">ライト</string>
<string name="pref_theme_title_dark">ダーク</string>
+ <string name="pref_theme_title_trueblack">トゥルーブラック</string>
<string name="pref_episode_cache_unlimited">無制限</string>
<string name="pref_update_interval_hours_plural">時間</string>
<string name="pref_update_interval_hours_singular">時間</string>
@@ -402,8 +422,7 @@
<string name="crash_report_sum">メールで最新のクラッシュレポートを送信します</string>
<string name="send_email">メールを送信</string>
<string name="experimental_pref">実験的</string>
- <string name="pref_sonic_title">Sonic メディアプレーヤー</string>
- <string name="pref_sonic_message">Android 標準のメディアプレーヤーと Prestissimo の代わりに、内蔵のソニックメディアプレーヤーを使用します</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>
@@ -415,6 +434,11 @@
<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="pref_videoBehavior_title">ビデオ動作</string>
+ <string name="pref_videoBehavior_sum">ビデオ再生から遷移時の動作</string>
+ <string name="stop_playback">再生停止</string>
+ <string name="continue_playback">再生継続</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">自動Flattrを有効にする</string>
<string name="auto_flattr_after_percent">%d %再生したらエピソードをFlattr </string>
@@ -640,4 +664,13 @@
<string name="cast_failed_seek">キャストデバイスの新しい位置への移動に失敗しました</string>
<string name="cast_failed_receiver_player_error">レシーバープレーヤーで深刻なエラーが発生しました</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">再生をコントロールできます。これはポッドキャスト再生中のメイン通知です。</string>
+ <string name="notification_channel_error">エラー</string>
+ <string name="notification_channel_error_description">ダウンロードや gpodder の同期に失敗した場合など、何か問題が発生した場合に表示されます。</string>
</resources>
diff --git a/core/src/main/res/values-kn-rIN/strings.xml b/core/src/main/res/values-kn-rIN/strings.xml
index f62c6b2de..14ccf4e42 100644
--- a/core/src/main/res/values-kn-rIN/strings.xml
+++ b/core/src/main/res/values-kn-rIN/strings.xml
@@ -101,4 +101,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-ko-rKR/strings.xml b/core/src/main/res/values-ko-rKR/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-ko-rKR/strings.xml
+++ b/core/src/main/res/values-ko-rKR/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml
index 078c43fbb..c776885ea 100644
--- a/core/src/main/res/values-ko/strings.xml
+++ b/core/src/main/res/values-ko/strings.xml
@@ -122,7 +122,6 @@
<string name="feed_remover_msg">피드 삭제하는 중</string>
<string name="load_complete_feed">전체 피드 새로고침</string>
<string name="hide_episodes_title">에피소드 감추기</string>
- <string name="episode_actions">동작 적용</string>
<string name="hide_unplayed_episodes_label">재생 안 함</string>
<string name="hide_paused_episodes_label">일시 중지</string>
<string name="hide_played_episodes_label">재생함</string>
@@ -281,7 +280,6 @@
<string name="other_pref">기타</string>
<string name="about_pref">정보</string>
<string name="queue_label">대기열</string>
- <string name="services_label">서비스</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">에피소드 정리</string>
<string name="pref_episode_cleanup_summary">대기열에 없고 즐겨찾기에 넣지 않은 에피소드는 자동 다운로드에서 새 에피소드에 공간이 필요할 경우 제거될 수 있습니다.</string>
@@ -402,8 +400,6 @@
<string name="crash_report_sum">최근의 이상 종료 보고서를 이메일로 보냅니다.</string>
<string name="send_email">이메일 보내기</string>
<string name="experimental_pref">실험적 기능</string>
- <string name="pref_sonic_title">소닉 미디어 플레이어</string>
- <string name="pref_sonic_message">내장 소닉 미디어 플레이어를 안드로이드 고유 미디어 플레이어와 Prestissimo 대신 사용합니다.</string>
<string name="pref_current_value">현재 값: %1$s</string>
<string name="pref_proxy_title">프록시</string>
<string name="pref_proxy_sum">네트워크 프록시 설정</string>
@@ -640,4 +636,5 @@
<string name="cast_failed_seek">캐스트 장치에 새 재생 위치로 이동하는데 실패했습니다</string>
<string name="cast_failed_receiver_player_error">리시버 플레이어에서 심각한 오류가 발생했습니다</string>
<string name="cast_failed_media_error_skipping">미디어 재생에 오류. 건너뜁니다...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-lt/strings.xml b/core/src/main/res/values-lt/strings.xml
index 7736c148b..ed8862d11 100644
--- a/core/src/main/res/values-lt/strings.xml
+++ b/core/src/main/res/values-lt/strings.xml
@@ -93,6 +93,7 @@
<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>
<!--'Add Feed' Activity labels-->
@@ -124,7 +125,6 @@
<string name="feed_remover_msg">Šalinamas sklaidos kanalas</string>
<string name="load_complete_feed">Atnaujinti visą sklaidos kanalą</string>
<string name="hide_episodes_title">Slėpti epizodus</string>
- <string name="episode_actions">Pritaikyti veiksmus</string>
<string name="hide_unplayed_episodes_label">Neperklausyti</string>
<string name="hide_paused_episodes_label">Pristabdyti</string>
<string name="hide_played_episodes_label">Perklausyti</string>
@@ -193,6 +193,7 @@
<plurals name="downloads_left">
<item quantity="one">Liko %d atsiuntimas</item>
<item quantity="few">Liko %d atsiuntimai</item>
+ <item quantity="many">Liko %d atsiuntimų</item>
<item quantity="other">Liko %d atsiuntimų</item>
</plurals>
<string name="downloads_processing">Apdorojami atsiuntimai</string>
@@ -283,7 +284,6 @@
<string name="other_pref">Kita</string>
<string name="about_pref">Apie</string>
<string name="queue_label">Eilė</string>
- <string name="services_label">Paslaugos</string>
<string name="flattr_label">Flattr</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>
@@ -404,8 +404,6 @@
<string name="crash_report_sum">Siųsti paskiausios strigties pranešimą el. paštu</string>
<string name="send_email">Siųsti el. laišką</string>
<string name="experimental_pref">Eksperimentinis</string>
- <string name="pref_sonic_title">„Sonic“ medijos leistuvė</string>
- <string name="pref_sonic_message">Naudoti įtaisytąją „Sonic“ medijos leistuvę vietoje savosios „Android“ medijos leistuvės ir „Prestissimo“ </string>
<string name="pref_current_value">Dabartinė reikšmė: %1$s</string>
<string name="pref_proxy_title">Įgaliotasis serveris</string>
<string name="pref_proxy_sum">Nustatyti įgaliotąjį tinklo serverį</string>
@@ -453,8 +451,6 @@
<string name="html_export_label">HTML eksportas</string>
<string name="exporting_label">Eksportuojama...</string>
<string name="export_error_label">Eksporto klaida</string>
- <string name="opml_export_success_title">OPML eksportas sėkmingas.</string>
- <string name="opml_export_success_sum">.opml failas išsaugotas į:\u0020</string>
<string name="opml_import_ask_read_permission">Norint nuskaityti OPML failą reikalinga prieiga prie nešiojamos atmintinės</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Nustatyti miego laikmatį</string>
@@ -472,16 +468,19 @@
<plurals name="time_seconds_quantified">
<item quantity="one">1 sekundė</item>
<item quantity="few">%d sekundės</item>
+ <item quantity="many">%d sekundžių</item>
<item quantity="other">%d sekundžių</item>
</plurals>
<plurals name="time_minutes_quantified">
<item quantity="one">1 minutė</item>
<item quantity="few">%d minutės</item>
+ <item quantity="many">%d minučių</item>
<item quantity="other">%d minučių</item>
</plurals>
<plurals name="time_hours_quantified">
<item quantity="one">1 valanda</item>
<item quantity="few">%d valandos</item>
+ <item quantity="many">%d valandų</item>
<item quantity="other">%d valandų</item>
</plurals>
<string name="auto_enable_label">Įjungti automatiškai</string>
@@ -634,7 +633,6 @@ Po importavimo, epizodai gali būti per klaidą pažymėti kaip atsisiųsti. Tie
<string name="label_import">Importuoti</string>
<string name="label_export">Eksportuoti</string>
<string name="import_select_file">Pasirinkite failą, kurį norite importuoti</string>
- <string name="export_ok">Eksportas sėkmingas. Duomenų bazė išsaugota SD kortelėje.</string>
<string name="import_ok">Importuota sėkmingai.
Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
@@ -654,4 +652,5 @@ Spauskite „OK“, kad paleisti „AntennaPod“ iš naujo.</string>
<string name="cast_failed_seek">Peršokti į naują poziciją „Chromecast“ įrenginyje nepavyko</string>
<string name="cast_failed_receiver_player_error">Imtuvo leistuvę ištiko rimta klaida</string>
<string name="cast_failed_media_error_skipping">Įvyko medijos atkūrimo klaida. Praleidžiama...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-mk/strings.xml b/core/src/main/res/values-mk/strings.xml
new file mode 100644
index 000000000..1bb5aa651
--- /dev/null
+++ b/core/src/main/res/values-mk/strings.xml
@@ -0,0 +1,54 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="statistics_label">Статистики</string>
+ <string name="add_feed_label">Стави Подкаст</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>
+ <!--Statistics fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <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="chapters_label">Поглавја</string>
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <string name="delete_label">Избриши</string>
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <string name="date">Датум</string>
+ <!--Flattr-->
+ <!--Flattr-->
+ <!--Variable Speed-->
+ <!--Empty list labels-->
+ <!--Preferences-->
+ <!--Auto-Flattr dialog-->
+ <!--Search-->
+ <!--OPML import and export-->
+ <!--Sleep timer-->
+ <!--gpodder.net-->
+ <!--Directory chooser-->
+ <!--Online feed view-->
+ <!--Content descriptions for image buttons-->
+ <!--Feed information screen-->
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <!--Episodes apply actions-->
+ <!--Sort-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+ <!--proxy settings-->
+ <!--Database import/export-->
+ <!--Casting-->
+ <!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
+</resources>
diff --git a/core/src/main/res/values-nb/strings.xml b/core/src/main/res/values-nb/strings.xml
index 65dc5565b..545eddc13 100644
--- a/core/src/main/res/values-nb/strings.xml
+++ b/core/src/main/res/values-nb/strings.xml
@@ -95,7 +95,6 @@
<string name="feed_remover_msg">Fjerner strøm</string>
<string name="load_complete_feed">Oppdater hele strømmen</string>
<string name="hide_episodes_title">Skjul episoder</string>
- <string name="episode_actions">Lagre handlinger</string>
<string name="hide_unplayed_episodes_label">Ikke avspilt</string>
<string name="hide_paused_episodes_label">Pauset</string>
<string name="hide_played_episodes_label">Avspilt</string>
@@ -231,7 +230,6 @@
<string name="other_pref">Annet</string>
<string name="about_pref">Om</string>
<string name="queue_label">Queue</string>
- <string name="services_label">Tjenester</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Episodeopprydding</string>
<string name="pref_pauseOnDisconnect_sum">Sett playback på pause når hodetelefoner eller bluetooth er frakoblet</string>
@@ -350,8 +348,6 @@
<string name="choose_file_from_external_application">Bruk ekstern applikasjon</string>
<string name="opml_export_label">OPML-eksportering</string>
<string name="export_error_label">Eksporteringserror</string>
- <string name="opml_export_success_title">OPML-import vellykket.</string>
- <string name="opml_export_success_sum">.opml-filen ble skrevet til:\u0020</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Sett opp sovetimer</string>
<string name="disable_sleeptimer_label">Deaktiver sovetimer</string>
@@ -480,4 +476,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml
index ae9f8ade9..daa64d90c 100644
--- a/core/src/main/res/values-nl/strings.xml
+++ b/core/src/main/res/values-nl/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Feeds updaten</string>
<string name="feeds_label">Feeds</string>
<string name="statistics_label">Statistieken</string>
<string name="add_feed_label">Podcast toevoegen</string>
<string name="episodes_label">Afleveringen</string>
<string name="all_episodes_short_label">Alle</string>
+ <string name="new_episodes_label">Nieuw</string>
<string name="favorite_episodes_label">Favorieten</string>
<string name="new_label">Nieuw</string>
<string name="settings_label">Instellingen</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Annuleer download</string>
<string name="playback_history_label">Afspeelgeschiedenis</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Met andere apparaten synchroniseren</string>
<string name="gpodnet_auth_label">gpodder.net login</string>
<string name="free_space_label">%1$s beschikbaar</string>
<string name="episode_cache_full_title">Afleveringen cache is vol</string>
<string name="episode_cache_full_message">Het maximum aantal gecachte afleveringen is bereikt. U kunt het maximum verhogen in de instellingen.</string>
+ <string name="synchronizing">Synchroniseren…</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Totale duur van afgespeelde podcasts:</string>
<string name="statistics_details_dialog">%1$d van de %2$d afleveringen gestart.\n\n%3$s van de %4$s afgespeeld.</string>
@@ -56,7 +60,7 @@
<string name="yes">Ja</string>
<string name="no">Nee</string>
<string name="reset">Reset</string>
- <string name="author_label">Auteur</string>
+ <string name="author_label">Auteur(s)</string>
<string name="language_label">Taal</string>
<string name="url_label">URL</string>
<string name="podcast_settings_label">Instellingen</string>
@@ -110,6 +114,9 @@
<string name="mark_all_seen_msg">\'Nieuw\' label van alle afleveringen verwijderend</string>
<string name="mark_all_seen_confirmation_msg">Bevestig aub dat u het \'nieuw\' label van alle afleveringen wilt verwijderen.</string>
<string name="show_info_label">Toon informatie</string>
+ <string name="show_feed_settings_label">Feed-instellingen tonen</string>
+ <string name="feed_info_label">Feed-informatie</string>
+ <string name="feed_settings_label">Feed-instellingen</string>
<string name="rename_feed_label">Podcast hernoemen</string>
<string name="remove_feed_label">Podcast verwijderen</string>
<string name="share_label">Delen…</string>
@@ -117,13 +124,13 @@
<string name="share_file_label">Deel bestand</string>
<string name="share_link_with_position_label">Link van de aflevering met tijdstip delen</string>
<string name="share_feed_url_label">URL van de feed delen</string>
- <string name="share_item_url_label">URL van het mediabestand delen</string>
- <string name="share_item_url_with_position_label">URL van mediabestand met tijdstip delen</string>
+ <string name="share_item_url_label">URL v/h mediabestand delen</string>
+ <string name="share_item_url_with_position_label">URL v/h mediabestand met tijdstip delen</string>
<string name="feed_delete_confirmation_msg">Bevestig dat u de feed <i>%1$s</i> en ALLE (ook gedownloade) afleveringen van deze podcast wilt verwijderen.</string>
<string name="feed_remover_msg">Feed verwijderen</string>
<string name="load_complete_feed">Hele feed vernieuwen</string>
<string name="hide_episodes_title">Afleveringen verbergen</string>
- <string name="episode_actions">Afleveringen beheren</string>
+ <string name="batch_edit">Bulkbewerking</string>
<string name="hide_unplayed_episodes_label">Niet afgespeeld</string>
<string name="hide_paused_episodes_label">Gepauzeerd</string>
<string name="hide_played_episodes_label">Afgespeeld</string>
@@ -176,7 +183,7 @@
<string name="download_error_http_data_error">HTTP data fout</string>
<string name="download_error_error_unknown">Onbekende fout</string>
<string name="download_error_parser_exception">Parser Exception</string>
- <string name="download_error_unsupported_type">Niet ondersteunde feed soort</string>
+ <string name="download_error_unsupported_type">Niet ondersteunde type feed</string>
<string name="download_error_connection_error">Verbindingsfout</string>
<string name="download_error_unknown_host">Onbekende host</string>
<string name="download_error_unauthorized">Authenticatie fout</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Onbekende fout</string>
<string name="no_media_playing_label">Geen media aan het afspelen</string>
<string name="player_buffering_msg">Buffering</string>
+ <string name="player_go_to_picture_in_picture">Picture-in-picture modus</string>
<string name="playbackservice_notification_title">Podcast aan het afspelen</string>
<string name="unknown_media_key">AntennaPod - Mediaknop onbekend: %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Lengte</string>
<string name="episode_title">Afleveringtitel</string>
<string name="feed_title">Feed-titel</string>
+ <string name="random">Willekeurig</string>
+ <string name="smart_shuffle">Slim Shuffelen</string>
<string name="ascending">Oplopend</string>
<string name="descending">Aflopend</string>
<string name="clear_queue_confirmation_msg">Bevestig aub dat u alle afleveringen uit de wachtrij wilt verwijderen</string>
@@ -283,16 +293,25 @@
<string name="other_pref">Overig</string>
<string name="about_pref">Over AntennaPod</string>
<string name="queue_label">Wachtrij</string>
- <string name="services_label">Services</string>
+ <string name="integrations_label">Integraties</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Service voor microbetalingen</string>
+ <string name="automation">Automatische acties</string>
+ <string name="download_pref_details">Details</string>
+ <string name="import_export_pref">Importeren/exporteren</string>
+ <string name="appearance">Uiterlijk</string>
+ <string name="external_elements">Externe elementen</string>
+ <string name="interruptions">Onderbrekingen</string>
+ <string name="buttons">Knoppen</string>
+ <string name="media_player">Mediaspeler</string>
<string name="pref_episode_cleanup_title">Automatisch opschonen</string>
<string name="pref_episode_cleanup_summary">Afleveringen die niet in de wachtrij staan én niet als favoriet gemarkeerd zijn, mogen verwijderd worden als Automatisch Downloaden ruimte nodig heeft voor nieuwe afleveringen</string>
<string name="pref_pauseOnDisconnect_sum">Afspelen pauzeren wanneer de koptelefoon wordt losgekoppeld of de bluetooth verbinding wordt verbroken</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Afspelen hervatten wanneer de koptelefoon opnieuw wordt aangesloten</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Afspelen hervatten wanneer de bluetooth verbinding hervat wordt</string>
- <string name="pref_hardwareForwardButtonSkips_title">\'Volgende\' knop voor overslaan</string>
+ <string name="pref_hardwareForwardButtonSkips_title">\'Volgende\' voor overslaan</string>
<string name="pref_hardwareForwardButtonSkips_sum">Aflevering overslaan ipv vooruitspoelen wanneer op een fysieke \'volgende\' knop wordt gedrukt</string>
- <string name="pref_hardwarePreviousButtonRestarts_title">Vorige voor opnieuw afspelen</string>
+ <string name="pref_hardwarePreviousButtonRestarts_title">\'Vorige\' voor opnieuw afspelen</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Aflevering afspelen vanaf het begin ipv terugspoelen wanneer op een fysieke \'vorige\' knop wordt gedrukt</string>
<string name="pref_followQueue_sum">Volgende item in de wachtrij afspelen als de aflevering voltooid is</string>
<string name="pref_auto_delete_sum">Afleveringen verwijderen als ze zijn afgespeeld</string>
@@ -335,7 +354,7 @@
<string name="pref_set_theme_title">Kies kleurschema</string>
<string name="pref_nav_drawer_title">Menu aanpassen</string>
<string name="pref_nav_drawer_sum">Het uiterlijk en andere instellingen van het menu aanpassen.</string>
- <string name="pref_nav_drawer_items_title">Menu-items instellen</string>
+ <string name="pref_nav_drawer_items_title">Selecteer menu-items</string>
<string name="pref_nav_drawer_items_sum">Aanpassen welke items in het menu worden getoond</string>
<string name="pref_nav_drawer_feed_order_title">Feed volgorde instellen</string>
<string name="pref_nav_drawer_feed_order_sum">De volgorde van uw feeds instellen</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Afleveringen cache</string>
<string name="pref_theme_title_light">Licht</string>
<string name="pref_theme_title_dark">Donker</string>
+ <string name="pref_theme_title_trueblack">Echt zwart</string>
<string name="pref_episode_cache_unlimited">Onbeperkt</string>
<string name="pref_update_interval_hours_plural">uur</string>
<string name="pref_update_interval_hours_singular">uur</string>
@@ -378,7 +398,7 @@
<string name="pref_playback_speed_sum">Pas de beschikbare snelheden aan voor de variabele audio afspeelsnelheid</string>
<string name="pref_fast_forward">Snelheid van vooruitspoelen</string>
<string name="pref_fast_forward_sum">Pas het aantal seconden aan waarmee wordt vooruitgespoeld per klik op de knop</string>
- <string name="pref_rewind">Snelheid terugspoelen</string>
+ <string name="pref_rewind">Snelheid van terugspoelen</string>
<string name="pref_rewind_sum">Pas het aantal seconden aan waarmee wordt teruggespoeld per klik op de knop</string>
<string name="pref_gpodnet_sethostname_title">Definieer hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Gebruik standaard host</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Verstuur laatste crashreport via email</string>
<string name="send_email">Verstuur email</string>
<string name="experimental_pref">Experimentele functie(s)</string>
- <string name="pref_sonic_title">Sonic mediaspeler</string>
- <string name="pref_sonic_message">Gebruik AntennaPod\'s ingebouwde Sonic mediaspeler als een alternatief voor Prestissimo en de mediaspeler van Android.</string>
+ <string name="pref_media_player_message">Selecteer welke mediaspeler gebruikt moet worden voor het afspelen van bestanden</string>
<string name="pref_current_value">Huidige instelling: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Netwerkproxy instellen</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Voor Chromecast is software van derden vereist die niet beschikbaar zijn in deze versie van AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Gedownloade afleveringen in wachtrij</string>
<string name="pref_enqueue_downloaded_summary">Voeg gedownloade afleveringen toe aan de wachtrij</string>
+ <string name="media_player_builtin">Ingebouwde speler van Android</string>
+ <string name="pref_videoBehavior_title">Bij verlaten video</string>
+ <string name="pref_videoBehavior_sum">Wat te doen bij het verlaten van spelende video</string>
+ <string name="stop_playback">Afspelen stoppen</string>
+ <string name="continue_playback">Blijf geluid afspelen</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Automatisch flattr\'en aanzetten</string>
<string name="auto_flattr_after_percent">Flattr een aflevering zodra %d procent is afgespeeld</string>
@@ -449,8 +473,8 @@
<string name="select_options_label">Selecteren…</string>
<string name="choose_file_from_filesystem">Via bestandsbeheer</string>
<string name="choose_file_from_external_application">Via externe app</string>
- <string name="opml_export_label">OPML export</string>
- <string name="html_export_label">HTML export</string>
+ <string name="opml_export_label">OPML exporteren</string>
+ <string name="html_export_label">HTML exporteren</string>
<string name="exporting_label">Exporteren…</string>
<string name="export_error_label">Export fout</string>
<string name="export_success_title">Export succesvol</string>
@@ -518,7 +542,7 @@
<!--Directory chooser-->
<string name="selected_folder_label">Geselecteerde map:</string>
<string name="create_folder_label">Map aanmaken</string>
- <string name="choose_data_directory">Kies data map</string>
+ <string name="choose_data_directory">Kies datamap</string>
<string name="choose_data_directory_message">Kies de hoofdmap voor uw data. AntennaPod zal de benodigde submappen creeëren.</string>
<string name="choose_data_directory_permission_rationale">Toegang tot de externe opslag is nodig om de data-map aan te passen</string>
<string name="create_folder_msg">Maak een nieuwe map aan met de naam \"%1$s\"?</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Het opzoeken van het nieuwe tijdstip op het Cast apparaat is mislukt</string>
<string name="cast_failed_receiver_player_error">Ernstige fout opgetreden bij het afspelende Cast apparaat</string>
<string name="cast_failed_media_error_skipping">Er was een fout bij het afspelen; de aflevering wordt overgeslagen…</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Actie vereist</string>
+ <string name="notification_channel_user_action_description">Tonen als actie vereist is, bijvoorbeeld als je een wachtwoord moet invoeren.</string>
+ <string name="notification_channel_downloading">Aan het downloaden</string>
+ <string name="notification_channel_downloading_description">Tonen als er iets wordt gedownload.</string>
+ <string name="notification_channel_playing">Wordt momenteel afgespeeld</string>
+ <string name="notification_channel_playing_description">Hiermee kun je het afspelen controleren. Dit is de voornaamste notificatie tijdens het afspelen van een podcast.</string>
+ <string name="notification_channel_error">Foutmeldingen</string>
+ <string name="notification_channel_error_description">Tonen wanneer er iets fout is gegaan, bijvoorbeeld als downloaden of synchroniseren mislukt.</string>
</resources>
diff --git a/core/src/main/res/values-no-rNB/strings.xml b/core/src/main/res/values-no-rNB/strings.xml
index 2e3b9bd53..166d93f47 100644
--- a/core/src/main/res/values-no-rNB/strings.xml
+++ b/core/src/main/res/values-no-rNB/strings.xml
@@ -120,7 +120,6 @@
<string name="feed_remover_msg">Fjerner strøm</string>
<string name="load_complete_feed">Oppdater hele strømmen</string>
<string name="hide_episodes_title">Skjul episoder</string>
- <string name="episode_actions">Lagre handlinger</string>
<string name="hide_unplayed_episodes_label">Ikke avspilt</string>
<string name="hide_paused_episodes_label">Pauset</string>
<string name="hide_played_episodes_label">Avspilt</string>
@@ -273,7 +272,6 @@
<string name="other_pref">Annet</string>
<string name="about_pref">Om</string>
<string name="queue_label">Queue</string>
- <string name="services_label">Tjenester</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Episodeopprydding</string>
<string name="pref_pauseOnDisconnect_sum">Sett playback på pause når hodetelefoner eller bluetooth er frakoblet</string>
@@ -381,8 +379,6 @@
<string name="crash_report_sum">Send den siste kræsj-rapporten via e-post</string>
<string name="send_email">Send e-post</string>
<string name="experimental_pref">Eksperimentell</string>
- <string name="pref_sonic_title">Sonic mediaspiller</string>
- <string name="pref_sonic_message">Bruk innebygd Sonic mediaspiller som en erstatning for Androids mediaspiller og Prestissimo</string>
<string name="pref_faq">FAQ</string>
<string name="pref_known_issues">Kjente problemer</string>
<string name="pref_no_browser_found">Ingen nettleser funnet.</string>
@@ -421,8 +417,6 @@
<string name="html_export_label">HTML eksport</string>
<string name="exporting_label">Eksporterer...</string>
<string name="export_error_label">Eksporteringserror</string>
- <string name="opml_export_success_title">OPML-import vellykket.</string>
- <string name="opml_export_success_sum">.opml-filen ble skrevet til:\u0020</string>
<string name="opml_import_ask_read_permission">Tilgang til ekstern lagring er nødvendig for å lese OPML filen</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Sett opp sovetimer</string>
@@ -592,4 +586,5 @@
<string name="cast_failed_to_stop">Feilter å stoppe avspillingen av media</string>
<string name="cast_failed_to_pause">Feilet å pause avspillingen av media</string>
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-no/strings.xml b/core/src/main/res/values-no/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-no/strings.xml
+++ b/core/src/main/res/values-no/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-pl-rPL/strings.xml b/core/src/main/res/values-pl-rPL/strings.xml
index abbcfe763..f75590077 100644
--- a/core/src/main/res/values-pl-rPL/strings.xml
+++ b/core/src/main/res/values-pl-rPL/strings.xml
@@ -22,6 +22,7 @@
<string name="free_space_label">%1$s wolnego miejsca</string>
<string name="episode_cache_full_title">Pełna pamięć cache</string>
<string name="episode_cache_full_message">Limit pamięci cache został osiągnięty. Możesz zwiększyć pojemność cache w ustawieniach aplikacji.</string>
+ <string name="synchronizing">Synchronizowanie...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Całkowity czas trwania 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>
@@ -125,7 +126,6 @@
<string name="feed_remover_msg">Usuwanie kanału</string>
<string name="load_complete_feed">Odśwież cały kanał</string>
<string name="hide_episodes_title">Ukryj odcinki</string>
- <string name="episode_actions">Zatwierdź czynności</string>
<string name="hide_unplayed_episodes_label">Nieodtworzone</string>
<string name="hide_paused_episodes_label">Zatrzymane</string>
<string name="hide_played_episodes_label">Odtworzone</string>
@@ -288,7 +288,6 @@
<string name="other_pref">Inne</string>
<string name="about_pref">O...</string>
<string name="queue_label">Kolejka</string>
- <string name="services_label">Usługi</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Usuwanie odcinków</string>
<string name="pref_episode_cleanup_summary">Odcinki niebędące w kolejce i niebędące na liście ulubiobych powinny nadawać się do usunięcia, jeśli Automatyczne Pobieranie potrzebuje miejsca na nowe odcinki.</string>
@@ -409,8 +408,6 @@
<string name="crash_report_sum">Wyślij ostatni raport o błędach przez e-mail</string>
<string name="send_email">Wyślij e-mail</string>
<string name="experimental_pref">Eksperymentalne</string>
- <string name="pref_sonic_title">Odtwarzacz mediów Sonic</string>
- <string name="pref_sonic_message">Użyj wbudowanego odtwarzacza Sonic jako oprogramowanie zastępcze do natywnego odtwarzacza Android i Prestissimo</string>
<string name="pref_current_value">Aktualna wartość: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Ustaw proxy sieciowe</string>
@@ -657,4 +654,5 @@ https://gpodder.net/register/</string>
<string name="cast_failed_seek">Wystąpił błąd podczas szukania nowej pozycji na urządzeniu nadającym.</string>
<string name="cast_failed_receiver_player_error">Urządzenie odbierające napotkało poważny problem</string>
<string name="cast_failed_media_error_skipping">Błąd podczas odtwarzania, pomijanie...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml
index 097417900..6a640a0ee 100644
--- a/core/src/main/res/values-pl/strings.xml
+++ b/core/src/main/res/values-pl/strings.xml
@@ -67,7 +67,6 @@
<!--Empty list labels-->
<!--Preferences-->
<string name="queue_label">Kolejka</string>
- <string name="services_label">Usługi</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Pobieraj pliki tylko przez WiFi</string>
<string name="refreshing_label">Odświeżanie</string>
<string name="user_interface_label">Interfejs Użytkownika</string>
@@ -97,4 +96,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-pt-rBR/strings.xml b/core/src/main/res/values-pt-rBR/strings.xml
index fc8633b1f..30b69432a 100644
--- a/core/src/main/res/values-pt-rBR/strings.xml
+++ b/core/src/main/res/values-pt-rBR/strings.xml
@@ -122,7 +122,6 @@
<string name="feed_remover_msg">Removendo feed</string>
<string name="load_complete_feed">Atualizar feed completamente</string>
<string name="hide_episodes_title">Ocultar Episódios</string>
- <string name="episode_actions">Aplicar ações</string>
<string name="hide_unplayed_episodes_label">Não reproduzido</string>
<string name="hide_paused_episodes_label">Pausado</string>
<string name="hide_played_episodes_label">Reproduzido</string>
@@ -279,7 +278,6 @@
<string name="other_pref">Outros</string>
<string name="about_pref">Sobre</string>
<string name="queue_label">Fila</string>
- <string name="services_label">Serviços</string>
<string name="flattr_label">Flattr</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>
@@ -396,8 +394,6 @@
<string name="crash_report_sum">Enviar o relatório da última falha por e-mail</string>
<string name="send_email">Enviar e-mail</string>
<string name="experimental_pref">Experimental</string>
- <string name="pref_sonic_title">Sonic Media Player</string>
- <string name="pref_sonic_message">Utilizar o reprodutor de mídia Sonic no lugar do reprodutor de mídia nativo do Android e do Prestissimo</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>
@@ -444,8 +440,6 @@
<string name="html_export_label">Exportar HTML</string>
<string name="exporting_label">Exportando...</string>
<string name="export_error_label">Erro na exportação</string>
- <string name="opml_export_success_title">Exportação do OPML realizada com sucesso.</string>
- <string name="opml_export_success_sum">O arquivo .opml foi gravado em:\u0020</string>
<string name="opml_import_ask_read_permission">Acesso ao armazenamento externo é necessária para ler o arquivo OPML</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Configura desligamento automático</string>
@@ -629,4 +623,5 @@
<string name="cast_failed_seek">Falha ao buscar uma nova posição no dispositivo cast</string>
<string name="cast_failed_receiver_player_error">O receptor de reprodução encontrou um erro grave</string>
<string name="cast_failed_media_error_skipping">Erro ao reproduzir mídia. Pulando...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml
index 1eb03a194..17f04c860 100644
--- a/core/src/main/res/values-pt/strings.xml
+++ b/core/src/main/res/values-pt/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Atualizar subscrições</string>
<string name="feeds_label">Fontes</string>
<string name="statistics_label">Estatísticas</string>
<string name="add_feed_label">Adicionar podcast</string>
<string name="episodes_label">Episódios</string>
<string name="all_episodes_short_label">Todos</string>
+ <string name="new_episodes_label">Novos</string>
<string name="favorite_episodes_label">Favoritos</string>
<string name="new_label">Novos</string>
<string name="settings_label">Definições</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Cancelar\ndescarga</string>
<string name="playback_history_label">Histórico de reprodução</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Sincronizar com outros dispositivos</string>
<string name="gpodnet_auth_label">Dados gpodder.net</string>
<string name="free_space_label">%1$s disponível</string>
<string name="episode_cache_full_title">Cache de episódios cheia</string>
<string name="episode_cache_full_message">Atingido o limite máximo de itens em cache. Pode aumentar o tamanho de cache nas definições.</string>
+ <string name="synchronizing">A sincronizar...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Tempo total dos podcasts reproduzidos:</string>
<string name="statistics_details_dialog">%1$d de %2$d episódios iniciados.\n\nReproduzidos %3$s de %4$s.</string>
@@ -110,6 +114,9 @@
<string name="mark_all_seen_msg">Marcar todos os episódios como vistos</string>
<string name="mark_all_seen_confirmation_msg">Confirma de que deseja marcar todos os episódios como vistos?</string>
<string name="show_info_label">Mostrar informações</string>
+ <string name="show_feed_settings_label">Mostrar definições da fonte</string>
+ <string name="feed_info_label">Informação da fonte</string>
+ <string name="feed_settings_label">Definições da fonte</string>
<string name="rename_feed_label">Renomear podcast</string>
<string name="remove_feed_label">Remover podcast</string>
<string name="share_label">Partilhar...</string>
@@ -123,7 +130,7 @@
<string name="feed_remover_msg">Remover fonte</string>
<string name="load_complete_feed">Atualizar todas as páginas da fonte</string>
<string name="hide_episodes_title">Ocultar episódios</string>
- <string name="episode_actions">Aplicar ações</string>
+ <string name="batch_edit">Edição em lote</string>
<string name="hide_unplayed_episodes_label">Não reproduzidos</string>
<string name="hide_paused_episodes_label">Em pausa</string>
<string name="hide_played_episodes_label">Reproduzidos</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Erro desconhecido</string>
<string name="no_media_playing_label">Nada em reprodução</string>
<string name="player_buffering_msg">A processar...</string>
+ <string name="player_go_to_picture_in_picture">Modo \'picture-in-picture\'</string>
<string name="playbackservice_notification_title">Reproduzir podcast</string>
<string name="unknown_media_key">Tecla multimédia desconhecida: %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Duração</string>
<string name="episode_title">Título do episódio</string>
<string name="feed_title">Título da fonte</string>
+ <string name="random">Aleatório</string>
+ <string name="smart_shuffle">Mistura inteligente</string>
<string name="ascending">Crescente</string>
<string name="descending">Decrescente</string>
<string name="clear_queue_confirmation_msg">Tem a certeza de que deseja remover todos os episódios da fila de reprodução?</string>
@@ -283,8 +293,17 @@
<string name="other_pref">Outras</string>
<string name="about_pref">Sobre</string>
<string name="queue_label">Fila</string>
- <string name="services_label">Serviços</string>
+ <string name="integrations_label">Integrações</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Serviço de micro pagamentos</string>
+ <string name="automation">Automatização</string>
+ <string name="download_pref_details">Detalhes</string>
+ <string name="import_export_pref">Importar/Exportar</string>
+ <string name="appearance">Aparência</string>
+ <string name="external_elements">Elementos externos</string>
+ <string name="interruptions">Interrupções</string>
+ <string name="buttons">Botões</string>
+ <string name="media_player">Reprodutor multimédia</string>
<string name="pref_episode_cleanup_title">Limpeza de episódios</string>
<string name="pref_episode_cleanup_summary">Os episódios que não estejam na fila e não sejam favoritos podem ser elegíveis para serem removidos se a Descarga automática necessitar de espaço para novos episódios.</string>
<string name="pref_pauseOnDisconnect_sum">Pausa na reprodução ao desligar os auscultadores ou o bluetooth</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Cache de episódios</string>
<string name="pref_theme_title_light">Claro</string>
<string name="pref_theme_title_dark">Escuro</string>
+ <string name="pref_theme_title_trueblack">Muito escuro</string>
<string name="pref_episode_cache_unlimited">Sem limite</string>
<string name="pref_update_interval_hours_plural">horas</string>
<string name="pref_update_interval_hours_singular">hora</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Enviar o relatório de erros por e-mail</string>
<string name="send_email">Enviar e-mail</string>
<string name="experimental_pref">Experimental</string>
- <string name="pref_sonic_title">Reprodutor multimédia Sonic</string>
- <string name="pref_sonic_message">Utilizar o Sonic Media Player como substituto do reprodutor nativo do Android e do Prestissimo</string>
+ <string name="pref_media_player_message">Selecione o reprodutor multimédia a utilizar</string>
<string name="pref_current_value">Valor atual: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Definir um proxy de rede</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">O Chromecast necessita de bibliotecas proprietárias de terceiros que estão desativadas nesta versão do AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Colocar descargas na fila</string>
<string name="pref_enqueue_downloaded_summary">Adicionar à fila os episódios descarregados</string>
+ <string name="media_player_builtin">Reprodutor nativo Android</string>
+ <string name="pref_videoBehavior_title">Comportamento do vídeo </string>
+ <string name="pref_videoBehavior_sum">Comportamento ao sair da reprodução do vídeo</string>
+ <string name="stop_playback">Parar reprodução</string>
+ <string name="continue_playback">Continuar reprodução</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Ativar flattr automático</string>
<string name="auto_flattr_after_percent">Flattr de episódios ao atingir %d porcento de reprodução</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Falha ao procurar a nova posição no dispositivo</string>
<string name="cast_failed_receiver_player_error">O reprodutor encontrou um erro crítico</string>
<string name="cast_failed_media_error_skipping">Erro de reprodução. A ignorar...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Requer ação</string>
+ <string name="notification_channel_user_action_description">Mostrar se for necessária uma ação como, por exemplo, digitar uma palavra-passe.</string>
+ <string name="notification_channel_downloading">A descarregar</string>
+ <string name="notification_channel_downloading_description">Mostrar durante a descarga.</string>
+ <string name="notification_channel_playing">Reprodução atual</string>
+ <string name="notification_channel_playing_description">Permite o controlo da reprodução. Esta será a notificação que verá ao reproduzir um podcast.</string>
+ <string name="notification_channel_error">Erros</string>
+ <string name="notification_channel_error_description">Mostrar se ocorrerem erros como, por exemplo, não for possível a descarga.</string>
</resources>
diff --git a/core/src/main/res/values-ro-rRO/strings.xml b/core/src/main/res/values-ro-rRO/strings.xml
index 3616d5644..92b2da8f9 100644
--- a/core/src/main/res/values-ro-rRO/strings.xml
+++ b/core/src/main/res/values-ro-rRO/strings.xml
@@ -144,7 +144,6 @@
<string name="other_pref">Altele</string>
<string name="about_pref">Despre</string>
<string name="queue_label">Coadă</string>
- <string name="services_label">Servicii</string>
<string name="flattr_label">Flattr</string>
<string name="pref_followQueue_sum">Sari la următorul element din coadă cand se termină ascultarea</string>
<string name="playback_pref">Ascultare</string>
@@ -247,4 +246,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-ru/strings.xml b/core/src/main/res/values-ru/strings.xml
index afe25cdf3..63823cc51 100644
--- a/core/src/main/res/values-ru/strings.xml
+++ b/core/src/main/res/values-ru/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Обновить подписки</string>
<string name="feeds_label">Каналы</string>
<string name="statistics_label">Статистика</string>
<string name="add_feed_label">Добавить подкаст</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>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Отменить загрузку</string>
<string name="playback_history_label">Журнал</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Синхронизировать с другими устройствами</string>
<string name="gpodnet_auth_label">Войти на gpodder.net</string>
<string name="free_space_label">свободно %1$s</string>
<string name="episode_cache_full_title">Кэш выпусков заполнен</string>
<string name="episode_cache_full_message">Достигнут предел кэша выпусков. Объём кэша можно увеличить в Настройках.</string>
+ <string name="synchronizing">Синхронизация…</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>
@@ -112,6 +116,9 @@
<string name="mark_all_seen_msg">Все выпуски отмечены как просмотренные</string>
<string name="mark_all_seen_confirmation_msg">Пожалуйста, подтвердите намерение отметить все выпуски как просмотренные.</string>
<string name="show_info_label">Показать информацию</string>
+ <string name="show_feed_settings_label">Показать настройки канала</string>
+ <string name="feed_info_label">О канале</string>
+ <string name="feed_settings_label">Настройки канала</string>
<string name="rename_feed_label">Переименовать подкаст</string>
<string name="remove_feed_label">Удалить подкаст</string>
<string name="share_label">Поделиться…</string>
@@ -125,7 +132,7 @@
<string name="feed_remover_msg">Удаление канала</string>
<string name="load_complete_feed">Обновить весь канал</string>
<string name="hide_episodes_title">Скрыть выпуски</string>
- <string name="episode_actions">Применить действия</string>
+ <string name="batch_edit">Групповая обработка</string>
<string name="hide_unplayed_episodes_label">Непрослушанное</string>
<string name="hide_paused_episodes_label">Приостановленное</string>
<string name="hide_played_episodes_label">Прослушанное</string>
@@ -227,6 +234,7 @@ URL файла:
<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="playbackservice_notification_title">Воспроизведение подкаста</string>
<string name="unknown_media_key">AntennaPod - неизвестный ключ носителя: %1$d</string>
<!--Queue operations-->
@@ -244,6 +252,8 @@ URL файла:
<string name="duration">По продолжительности</string>
<string name="episode_title">Название выпуска</string>
<string name="feed_title">Название канала</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>
@@ -290,8 +300,17 @@ URL файла:
<string name="other_pref">Прочее</string>
<string name="about_pref">О программе</string>
<string name="queue_label">Очередь</string>
- <string name="services_label">Сервисы</string>
+ <string name="integrations_label">Интеграция</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Услуга микроплатежей</string>
+ <string name="automation">Автоматизация</string>
+ <string name="download_pref_details">Подробнее</string>
+ <string name="import_export_pref">Импорт/экспорт</string>
+ <string name="appearance">Внешний вид</string>
+ <string name="external_elements">Внешние органы управления</string>
+ <string name="interruptions">Прерывания</string>
+ <string name="buttons">Кнопки</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">Приостановить воспроизведение, когда наушники или bluetooth отключены</string>
@@ -361,6 +380,7 @@ URL файла:
<string name="pref_episode_cache_title">Кэш выпусков</string>
<string name="pref_theme_title_light">Светлая</string>
<string name="pref_theme_title_dark">Тёмная</string>
+ <string name="pref_theme_title_trueblack">Совсем чёрная</string>
<string name="pref_episode_cache_unlimited">Неограничен</string>
<string name="pref_update_interval_hours_plural">ч.</string>
<string name="pref_update_interval_hours_singular">ч.</string>
@@ -411,8 +431,7 @@ URL файла:
<string name="crash_report_sum">Отослать последний отчёт о сбое по e-mail</string>
<string name="send_email">Отправить Email</string>
<string name="experimental_pref">Экспериментальные настройки</string>
- <string name="pref_sonic_title">Проигрывать через Sonic</string>
- <string name="pref_sonic_message">Задействовать встроенный медиа проигрыватель Sonic вместо стандартного из ОС Android и Prestissimo</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>
@@ -424,6 +443,11 @@ URL файла:
<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="pref_videoBehavior_title">Поведение видео</string>
+ <string name="pref_videoBehavior_sum">При сворачивании проигрывателя видео</string>
+ <string name="stop_playback">остановить воспроизведение</string>
+ <string name="continue_playback">продолжить воспроизведение</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Включить автоматическую поддержку через Flattr</string>
<string name="auto_flattr_after_percent">Поддерживать через Flattr эпизоды, прослушанные на %d процентов</string>
@@ -660,4 +684,13 @@ URL файла:
<string name="cast_failed_seek">Не удалось выполнить перемотку на устройстве 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>
+ <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">Позволяет управлять воспроизведением. Основное уведомление, показывается при воспроизведении подкаста.</string>
+ <string name="notification_channel_error">Ошибки</string>
+ <string name="notification_channel_error_description">Показывается если что-то пошло не так, к примеру, неудавшаяся загрузка или синхронизация с gpodder.</string>
</resources>
diff --git a/core/src/main/res/values-sv-rSE/strings.xml b/core/src/main/res/values-sv-rSE/strings.xml
index f2dc3c6f1..8e147d033 100644
--- a/core/src/main/res/values-sv-rSE/strings.xml
+++ b/core/src/main/res/values-sv-rSE/strings.xml
@@ -1,11 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
+ <string name="feed_update_receiver_name">Uppdatera Prenumerationer</string>
<string name="feeds_label">Flöden</string>
<string name="statistics_label">Statistik</string>
<string name="add_feed_label">Lägg till Podcast</string>
<string name="episodes_label">Episoder</string>
<string name="all_episodes_short_label">Alla</string>
+ <string name="new_episodes_label">Nytt</string>
<string name="favorite_episodes_label">Favoriter</string>
<string name="new_label">Nya</string>
<string name="settings_label">Inställningar</string>
@@ -18,10 +20,12 @@
<string name="cancel_download_label">Avbryt\nNedladdning</string>
<string name="playback_history_label">Uppspelningshistorik</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Synkronisera med andra enheter</string>
<string name="gpodnet_auth_label">Inloggning till gpodder.net</string>
<string name="free_space_label">%1$s kvar</string>
<string name="episode_cache_full_title">Episodcachen är full</string>
<string name="episode_cache_full_message">Episodcachens gräns har nåtts. Du kan öka cachens storlek i inställningarna.</string>
+ <string name="synchronizing">Synkroniserar...</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Total uppspelningstid:</string>
<string name="statistics_details_dialog">%1$d av %2$d episoder startade.\n\nSpelat %3$s av %4$s.</string>
@@ -110,6 +114,9 @@
<string name="mark_all_seen_msg">Markera alla Episoder som sedda</string>
<string name="mark_all_seen_confirmation_msg">Bekräfta att du vill markera alla episoder som sedda.</string>
<string name="show_info_label">Visa information</string>
+ <string name="show_feed_settings_label">Visa flödesinställningar</string>
+ <string name="feed_info_label">Flödesinfo</string>
+ <string name="feed_settings_label">Flödesinställningar</string>
<string name="rename_feed_label">Byt namn på Podcast</string>
<string name="remove_feed_label">Ta bort Podcast</string>
<string name="share_label">Dela…</string>
@@ -123,7 +130,7 @@
<string name="feed_remover_msg">Tar bort Flöde</string>
<string name="load_complete_feed">Uppdatera hela Flödet</string>
<string name="hide_episodes_title">Dölj Episoder</string>
- <string name="episode_actions">Applicera åtgärder</string>
+ <string name="batch_edit">Batchredigering</string>
<string name="hide_unplayed_episodes_label">Ospelade</string>
<string name="hide_paused_episodes_label">Pausade</string>
<string name="hide_played_episodes_label">Spelad</string>
@@ -220,6 +227,7 @@
<string name="playback_error_unknown">Okänt fel</string>
<string name="no_media_playing_label">Inget media spelar</string>
<string name="player_buffering_msg">Buffrar</string>
+ <string name="player_go_to_picture_in_picture">Bild-i-bild läge</string>
<string name="playbackservice_notification_title">Spelar podcast</string>
<string name="unknown_media_key">AntannaPod - Okänd mediaknapp: %1$d</string>
<!--Queue operations-->
@@ -237,6 +245,8 @@
<string name="duration">Längd</string>
<string name="episode_title">Episodtitel</string>
<string name="feed_title">Flödestitel</string>
+ <string name="random">Slumpa</string>
+ <string name="smart_shuffle">Smart Blandning</string>
<string name="ascending">Stigande</string>
<string name="descending">Fallande</string>
<string name="clear_queue_confirmation_msg">Bekräfta att du vill rensa kön från ALLA episoder.</string>
@@ -283,8 +293,17 @@
<string name="other_pref">Annat</string>
<string name="about_pref">Om</string>
<string name="queue_label">Kö</string>
- <string name="services_label">Tjänster</string>
+ <string name="integrations_label">Integrationer</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Mikrobetalningstjänst</string>
+ <string name="automation">Automatisering</string>
+ <string name="download_pref_details">Detaljer</string>
+ <string name="import_export_pref">Importera/Exportera</string>
+ <string name="appearance">Utseende</string>
+ <string name="external_elements">Externa element</string>
+ <string name="interruptions">Avbrott</string>
+ <string name="buttons">Knappar</string>
+ <string name="media_player">Mediaspelare</string>
<string name="pref_episode_cleanup_title">Episodupprensning</string>
<string name="pref_episode_cleanup_summary">Episoder som inte är i kön och inte är favoriter kan tas bort om Automatisk Nedladdning behöver utrymme för nya episoder</string>
<string name="pref_pauseOnDisconnect_sum">Pausa uppspelningen när hörlurar eller bluetooth kopplas ifrån.</string>
@@ -354,6 +373,7 @@
<string name="pref_episode_cache_title">Episodcache</string>
<string name="pref_theme_title_light">Ljust</string>
<string name="pref_theme_title_dark">Mörkt</string>
+ <string name="pref_theme_title_trueblack">Riktig Svart</string>
<string name="pref_episode_cache_unlimited">Obegränsat</string>
<string name="pref_update_interval_hours_plural">timmar</string>
<string name="pref_update_interval_hours_singular">timme</string>
@@ -404,8 +424,7 @@
<string name="crash_report_sum">Sänd den senaste krashrapporten via e-post</string>
<string name="send_email">Sänd e-post</string>
<string name="experimental_pref">Experimentellt</string>
- <string name="pref_sonic_title">Sonic Mediaspelare</string>
- <string name="pref_sonic_message">Använd den inbyggda Sonic mediaspelare som ersättning för Androids egna mediaspelare och Prestissimo</string>
+ <string name="pref_media_player_message">Välj vilken mediaspelare som ska spela filer</string>
<string name="pref_current_value">Nuvarande värde: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Använd en nätverksproxy</string>
@@ -417,6 +436,11 @@
<string name="pref_cast_message_free_flavor">Chromecast kräver propretiära tredjepartsbibliotek som inte är inkluderade i denna version av AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Köa Nedladdade</string>
<string name="pref_enqueue_downloaded_summary">Lägg nedladdade episoder i uppspelningskön</string>
+ <string name="media_player_builtin">Andriods inbyggda spelare</string>
+ <string name="pref_videoBehavior_title">Videobeteende</string>
+ <string name="pref_videoBehavior_sum">Beteende när videouppspelning avslutas</string>
+ <string name="stop_playback">Stoppa uppspelning</string>
+ <string name="continue_playback">Fortsätt uppspelning</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Aktivera automatisk Flattring</string>
<string name="auto_flattr_after_percent">Flattra episoden så snart %d procent har spelats</string>
@@ -645,4 +669,13 @@
<string name="cast_failed_seek">Misslyckades att söka till den nya positionen på cast-enheten</string>
<string name="cast_failed_receiver_player_error">Mottagande uppspelaren har stött på ett allvarligt fel</string>
<string name="cast_failed_media_error_skipping">Fel vid uppspelning av media. Hoppar över...</string>
+ <!--Notification channels-->
+ <string name="notification_channel_user_action">Åtgärd krävs</string>
+ <string name="notification_channel_user_action_description">Visas om din åtgärd är obligatorisk, till exempel om du behöver ange ett lösenord.</string>
+ <string name="notification_channel_downloading">Laddar ner</string>
+ <string name="notification_channel_downloading_description">Visas under tiden som nedladdning pågår.</string>
+ <string name="notification_channel_playing">Uppspelning pågår</string>
+ <string name="notification_channel_playing_description">Medger kontroll över uppspelning. Detta är huvudnotifieringen som du ser när en podcast spelas.</string>
+ <string name="notification_channel_error">Fel</string>
+ <string name="notification_channel_error_description">Visas om något blev fel, exempelvis om nedladdning eller gpodder synkronisering misslyckas.</string>
</resources>
diff --git a/core/src/main/res/values-sw-rKE/strings.xml b/core/src/main/res/values-sw-rKE/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-sw-rKE/strings.xml
+++ b/core/src/main/res/values-sw-rKE/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-te/strings.xml b/core/src/main/res/values-te/strings.xml
index 07091c14d..d73db283a 100644
--- a/core/src/main/res/values-te/strings.xml
+++ b/core/src/main/res/values-te/strings.xml
@@ -84,7 +84,6 @@
<!--Preferences-->
<string name="other_pref">ఇతర</string>
<string name="about_pref">గురించి</string>
- <string name="services_label">సేవలు</string>
<string name="network_pref">నెట్‌వర్క్</string>
<string name="pref_autoUpdateIntervallOrTime_Disable">అచేతనించు</string>
<string name="pref_autoUpdateIntervallOrTime_every">ప్రతీ %1$s</string>
@@ -148,4 +147,5 @@
<string name="export_ok">ఎగుమతి విజయవంతం.</string>
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-tr/strings.xml b/core/src/main/res/values-tr/strings.xml
index 9d9aa95e8..ec002ef97 100644
--- a/core/src/main/res/values-tr/strings.xml
+++ b/core/src/main/res/values-tr/strings.xml
@@ -110,7 +110,6 @@
<string name="feed_remover_msg">Besleme kaldırılıyor</string>
<string name="load_complete_feed">Tüm beslemeyi yenile</string>
<string name="hide_episodes_title">Bölümleri gizle</string>
- <string name="episode_actions">Eylemleri uygula</string>
<string name="hide_unplayed_episodes_label">Oynatılmadı</string>
<string name="hide_paused_episodes_label">Duraklatıldı</string>
<string name="hide_played_episodes_label">Oynatıldı</string>
@@ -264,7 +263,6 @@
<string name="other_pref">Diğer</string>
<string name="about_pref">Hakkında</string>
<string name="queue_label">Kuyruk</string>
- <string name="services_label">Servisler</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Bölüm Temizliği</string>
<string name="pref_pauseOnDisconnect_sum">Kulaklıklar çıkarıldığında veya bluetooth bağlantısı kesildiğinde çalmayı duraklat</string>
@@ -374,8 +372,6 @@
<string name="choose_file_from_external_application">Harici uygulama kullan</string>
<string name="opml_export_label">OPML dışa aktar</string>
<string name="export_error_label">Dışa aktarma hatası</string>
- <string name="opml_export_success_title">Opml dışa aktarma başarılı.</string>
- <string name="opml_export_success_sum">.opml dosyasy yazıldı: \u0020</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Zamanlayıcıyı ayarla</string>
<string name="disable_sleeptimer_label">Zamanlayıcıyı devre dışı bırak</string>
@@ -508,4 +504,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-uk-rUA/strings.xml b/core/src/main/res/values-uk-rUA/strings.xml
index 03cbe20d8..1c6b2588f 100644
--- a/core/src/main/res/values-uk-rUA/strings.xml
+++ b/core/src/main/res/values-uk-rUA/strings.xml
@@ -125,7 +125,6 @@
<string name="feed_remover_msg">Удаляю канал</string>
<string name="load_complete_feed">Оновити канал цілком</string>
<string name="hide_episodes_title">Приховати епізоди</string>
- <string name="episode_actions">Застосувати дії</string>
<string name="hide_unplayed_episodes_label">Неграні</string>
<string name="hide_paused_episodes_label">На паузі</string>
<string name="hide_played_episodes_label">Грані</string>
@@ -287,7 +286,6 @@
<string name="other_pref">Інше</string>
<string name="about_pref">Про програму</string>
<string name="queue_label">Черга</string>
- <string name="services_label">Сервіси</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Чищення епізодів</string>
<string name="pref_episode_cleanup_summary">Епізоди що не знаходяться в черзі та не помічені як улюблені можуть бути видалені якщо Автозавантажувач потребуватиме місце для нових епізодів.</string>
@@ -408,8 +406,6 @@
<string name="crash_report_sum">Надіслати е-пошту зі звітом про останній збій</string>
<string name="send_email">Надіслати е-пошту</string>
<string name="experimental_pref">Експериментальні</string>
- <string name="pref_sonic_title">Sonic Media Player</string>
- <string name="pref_sonic_message">Застосувати вбудований програвач sonic замість програвача Android та Prestissimo</string>
<string name="pref_current_value">Поточне значення: %1$s</string>
<string name="pref_proxy_title">Проксі</string>
<string name="pref_proxy_sum">Застосувати проксі сервер</string>
@@ -655,4 +651,5 @@
<string name="cast_failed_seek">Помилка перехода на нову позицію програвання на пристрої.</string>
<string name="cast_failed_receiver_player_error">Серйозна помилка програвання на пристрої</string>
<string name="cast_failed_media_error_skipping">Помилка програвання файла. Пропускаю...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-vi-rVN/strings.xml b/core/src/main/res/values-vi-rVN/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-vi-rVN/strings.xml
+++ b/core/src/main/res/values-vi-rVN/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-vi/strings.xml b/core/src/main/res/values-vi/strings.xml
index 00ed733d1..7bdaf82af 100644
--- a/core/src/main/res/values-vi/strings.xml
+++ b/core/src/main/res/values-vi/strings.xml
@@ -106,7 +106,6 @@
<string name="share_item_url_with_position_label">Chia sẻ liên kết và vị trí phát tập này</string>
<string name="feed_remover_msg">Đang xoá feed</string>
<string name="hide_episodes_title">Ẩn các tập</string>
- <string name="episode_actions">Áp dụng hành động</string>
<string name="hide_unplayed_episodes_label">Chưa nghe</string>
<string name="hide_paused_episodes_label">Đang tạm dừng</string>
<string name="hide_played_episodes_label">Đã nghe</string>
@@ -309,4 +308,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-zh-rCN/strings.xml b/core/src/main/res/values-zh-rCN/strings.xml
index 3eda888f9..6c9737828 100644
--- a/core/src/main/res/values-zh-rCN/strings.xml
+++ b/core/src/main/res/values-zh-rCN/strings.xml
@@ -122,7 +122,6 @@
<string name="feed_remover_msg">删除订阅</string>
<string name="load_complete_feed">刷新全部订阅</string>
<string name="hide_episodes_title">隐藏曲目</string>
- <string name="episode_actions">启用</string>
<string name="hide_unplayed_episodes_label">未播放</string>
<string name="hide_paused_episodes_label">已暂停</string>
<string name="hide_played_episodes_label">已播放</string>
@@ -277,7 +276,6 @@
<string name="other_pref">其他</string>
<string name="about_pref">关于</string>
<string name="queue_label">播放列表</string>
- <string name="services_label">服务</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">清理曲目</string>
<string name="pref_pauseOnDisconnect_sum">暂停播放曲目当耳机或蓝牙重新连接</string>
@@ -384,8 +382,6 @@
<string name="crash_report_sum">通过 E-mail 发送最后崩溃报告</string>
<string name="send_email">发送 E-mail</string>
<string name="experimental_pref">实验性</string>
- <string name="pref_sonic_title">音频媒体播放器</string>
- <string name="pref_sonic_message">使用内置音频媒体播放器代替 Android 原生媒体播放器</string>
<string name="pref_current_value">当前值:%1$s</string>
<string name="pref_proxy_title">代理</string>
<string name="pref_proxy_sum">选择一个网络代理</string>
@@ -430,8 +426,6 @@
<string name="html_export_label">导出为 HTML 文件</string>
<string name="exporting_label">正在导出</string>
<string name="export_error_label">导出出错</string>
- <string name="opml_export_success_title">OPML 导出成功.</string>
- <string name="opml_export_success_sum">.opml 文件已保存到:\u0020</string>
<string name="opml_import_ask_read_permission">读取 OPML 文件需要访问外部存储的权限</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">设置休眠计时器</string>
@@ -598,4 +592,5 @@
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
<string name="cast_failed_setting_volume">音量设置失败</string>
<string name="cast_failed_media_error_skipping">媒体播放出错.跳转中...</string>
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-zh-rHK/strings.xml b/core/src/main/res/values-zh-rHK/strings.xml
index acf3abe75..2d9481b84 100644
--- a/core/src/main/res/values-zh-rHK/strings.xml
+++ b/core/src/main/res/values-zh-rHK/strings.xml
@@ -36,4 +36,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values-zh-rTW/strings.xml b/core/src/main/res/values-zh-rTW/strings.xml
index 87f749c37..d642acb0d 100644
--- a/core/src/main/res/values-zh-rTW/strings.xml
+++ b/core/src/main/res/values-zh-rTW/strings.xml
@@ -122,7 +122,6 @@
<string name="feed_remover_msg">移除播客源</string>
<string name="load_complete_feed">刷新完成播客源</string>
<string name="hide_episodes_title">隱藏劇集</string>
- <string name="episode_actions">應用</string>
<string name="hide_unplayed_episodes_label">未播放</string>
<string name="hide_paused_episodes_label">暫停</string>
<string name="hide_played_episodes_label">已播放</string>
@@ -279,7 +278,6 @@
<string name="other_pref">其他</string>
<string name="about_pref">關於</string>
<string name="queue_label">隊列</string>
- <string name="services_label">服務</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">劇集清理</string>
<string name="pref_episode_cleanup_summary">如果自動下載需要空間用於新的劇集,則不在隊列中並且不是最愛的劇集將被移除。</string>
@@ -319,4 +317,5 @@
<!--Database import/export-->
<!--Casting-->
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+ <!--Notification channels-->
</resources>
diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml
index d9009d9d5..12961504c 100644
--- a/core/src/main/res/values/arrays.xml
+++ b/core/src/main/res/values/arrays.xml
@@ -214,6 +214,7 @@
<item>@string/hide_downloaded_episodes_label</item>
<item>@string/hide_not_downloaded_episodes_label</item>
<item>@string/hide_has_media_label</item>
+ <item>@string/hide_is_favorite_label</item>
</string-array>
<string-array name="episode_filter_values">
@@ -225,6 +226,7 @@
<item>downloaded</item>
<item>not_downloaded</item>
<item>has_media</item>
+ <item>is_favorite</item>
</string-array>
<string-array name="image_cache_size_options">
@@ -270,4 +272,37 @@
<item>stop</item>
<item>continue</item>
</string-array>
+
+ <string-array name="batch_long_press_options">
+ <item>@string/select_all_above</item>
+ <item>@string/select_all_below</item>
+ </string-array>
+
+ <string-array name="back_button_behavior_options">
+ <item>@string/back_button_default</item>
+ <item>@string/back_button_go_to_page</item>
+ <item>@string/back_button_open_drawer</item>
+ <item>@string/back_button_double_tap</item>
+ <item>@string/back_button_show_prompt</item>
+ </string-array>
+
+ <string-array name="back_button_behavior_values">
+ <item>default</item>
+ <item>page</item>
+ <item>drawer</item>
+ <item>doubletap</item>
+ <item>prompt</item>
+ </string-array>
+
+ <string-array name="back_button_go_to_pages">
+ <item>@string/queue_label</item>
+ <item>@string/episodes_label</item>
+ <item>@string/subscriptions_label</item>
+ </string-array>
+
+ <string-array name="back_button_go_to_pages_tags">
+ <item>QueueFragment</item>
+ <item>EpisodesFragment</item>
+ <item>SubscriptionFragment</item>
+ </string-array>
</resources>
diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml
index 9d168a1b9..16a6d9185 100644
--- a/core/src/main/res/values/attrs.xml
+++ b/core/src/main/res/values/attrs.xml
@@ -55,6 +55,10 @@
<attr name="ic_create_new_folder" format="reference"/>
<attr name="ic_cast_disconnect" format="reference"/>
<attr name="ic_swap" format="reference"/>
+ <attr name="ic_cellphone_text" format="reference"/>
+ <attr name="ic_question_answer" format="reference" />
+ <attr name="ic_bug" format="reference" />
+ <attr name="ic_known_issues" format="reference" />
<attr name="master_switch_background" format="color"/>
<attr name="currently_playing_background" format="color"/>
diff --git a/core/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml
index 37ad81639..f172b0f6d 100644
--- a/core/src/main/res/values/colors.xml
+++ b/core/src/main/res/values/colors.xml
@@ -31,7 +31,7 @@
<color name="highlight_light">#DDDDDD</color>
<color name="highlight_dark">#414141</color>
- <color name="highlight_trueblack">#000000</color>
+ <color name="highlight_trueblack">#414141</color>
<color name="antennapod_blue">#147BAF</color>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index b91c07648..9dd928311 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -144,6 +144,8 @@
<string name="load_complete_feed">Refresh complete podcast</string>
<string name="hide_episodes_title">Hide Episodes</string>
<string name="batch_edit">Batch edit</string>
+ <string name="select_all_above">Select all above</string>
+ <string name="select_all_below">Select all below</string>
<string name="hide_unplayed_episodes_label">Unplayed</string>
<string name="hide_paused_episodes_label">Paused</string>
<string name="hide_played_episodes_label">Played</string>
@@ -152,6 +154,7 @@
<string name="hide_downloaded_episodes_label">Downloaded</string>
<string name="hide_not_downloaded_episodes_label">Not downloaded</string>
<string name="hide_has_media_label">Has media</string>
+ <string name="hide_is_favorite_label">Is favorite</string>
<string name="filtered_label">Filtered</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Last Refresh failed</string>
<string name="open_podcast">Open Podcast</string>
@@ -334,7 +337,7 @@
<string name="pref_unpauseOnHeadsetReconnect_sum">Resume playback when the headphones are reconnected</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Resume playback when bluetooth reconnects</string>
<string name="pref_hardwareForwardButtonSkips_title">Forward Button Skips</string>
- <string name="pref_hardwareForwardButtonSkips_sum">When pressing a hardware forward button skip to the next episode instead of fast-forwarding</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">When pressing a forward button on a bluetooth-connected device skip to the next episode instead of fast-forwarding</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Previous button restarts</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">When pressing a hardware previous button restart playing the current episode instead of rewinding</string>
<string name="pref_followQueue_sum">Jump to next queue item when playback completes</string>
@@ -426,8 +429,8 @@
<string name="pref_rewind_sum">Customize the number of seconds to jump backwards when the rewind button is clicked</string>
<string name="pref_gpodnet_sethostname_title">Set hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Use default host</string>
- <string name="pref_expandNotify_title">Expand Notification</string>
- <string name="pref_expandNotify_sum">Always expand the notification to show playback buttons.</string>
+ <string name="pref_expandNotify_title">High Notification priority</string>
+ <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>
@@ -467,6 +470,17 @@
<string name="pref_videoBehavior_sum">Behavior when leaving video playback</string>
<string name="stop_playback">Stop playback</string>
<string name="continue_playback">Continue audio playback</string>
+ <string name="behavior">Behavior</string>
+ <string name="pref_back_button_behavior_title">Back Button Behavior</string>
+ <string name="pref_back_button_behavior_sum">Change behavior of the back button.</string>
+ <string name="back_button_default">Default</string>
+ <string name="back_button_open_drawer">Open navigation drawer</string>
+ <string name="back_button_double_tap">Double tap to exit</string>
+ <string name="back_button_show_prompt">Confirm to exit</string>
+ <string name="close_prompt">Are you sure you want to close AntennaPod?</string>
+ <string name="double_tap_toast">Tap back button again to exit</string>
+ <string name="back_button_go_to_page">Go to page…</string>
+ <string name="back_button_go_to_page_title">Select page</string>
<!-- Auto-Flattr dialog -->
<string name="auto_flattr_enable">Enable automatic flattring</string>
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index cbd1dc88e..60296c64f 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -66,8 +66,14 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_grey600_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_grey600_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_grey600_36dp</item>
+ <item type="attr" name="ic_cellphone_text">@drawable/ic_cellphone_text_grey600_24dp</item>
+ <item type="attr" name="ic_question_answer">@drawable/ic_forum_grey600_24dp</item>
+ <item type="attr" name="ic_bug">@drawable/ic_bug_grey600_24dp</item>
+ <item type="attr" name="ic_known_issues">@drawable/ic_format_list_bulleted_grey600_24dp</item>
+
<item type="attr" name="master_switch_background">@color/master_switch_background_light</item>
<item type="attr" name="currently_playing_background">@color/highlight_light</item>
+
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
<item type="attr" name="about_screen_background">#e5e5e5</item>
@@ -141,6 +147,10 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_white_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_white_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_white_36dp</item>
+ <item type="attr" name="ic_cellphone_text">@drawable/ic_cellphone_text_white_24dp</item>
+ <item type="attr" name="ic_question_answer">@drawable/ic_baseline_question_answer_white_24dp</item>
+ <item type="attr" name="ic_bug">@drawable/ic_bug_white_24dp</item>
+ <item type="attr" name="ic_known_issues">@drawable/ic_format_list_bulleted_white_24dp</item>
<item type="attr" name="master_switch_background">@color/master_switch_background_dark</item>
<item type="attr" name="currently_playing_background">@color/highlight_dark</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
@@ -158,13 +168,14 @@
<style name="Theme.Base.AntennaPod.TrueBlack" parent="Theme.Base.AntennaPod.Dark">
<item name="progressBarTheme">@style/ProgressBarTrueBlack</item>
<item type="attr" name="non_transparent_background">@color/black</item>
- <item type="attr" name="overlay_background">@color/overlay_dark</item>
- <item type="attr" name="overlay_drawable">@drawable/overlay_drawable_dark</item>
+ <item type="attr" name="overlay_background">@color/black</item>
+ <item type="attr" name="overlay_drawable">@drawable/overlay_drawable_dark_trueblack</item>
<item type="attr" name="dragview_background">@drawable/ic_drag_vertical_white_48dp</item>
<item type="attr" name="dragview_float_background">@color/black</item>
<item type="attr" name="nav_drawer_background">@color/black</item>
<item name="android:textColorPrimary">@color/white</item>
<item name="android:color">@color/white</item>
+ <item name="android:colorBackground">@color/black</item>
<item name="android:windowBackground">@color/black</item>
<item name="android:actionBarStyle">@color/black</item>
<item name="colorPrimary">@color/black</item>
@@ -238,6 +249,10 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_grey600_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_grey600_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_grey600_36dp</item>
+ <item type="attr" name="ic_cellphone_text">@drawable/ic_cellphone_text_grey600_24dp</item>
+ <item type="attr" name="ic_question_answer">@drawable/ic_forum_grey600_24dp</item>
+ <item type="attr" name="ic_bug">@drawable/ic_bug_grey600_24dp</item>
+ <item type="attr" name="ic_known_issues">@drawable/ic_format_list_bulleted_grey600_24dp</item>
<item type="attr" name="master_switch_background">@color/master_switch_background_light</item>
<item type="attr" name="currently_playing_background">@color/highlight_light</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
@@ -314,6 +329,10 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_white_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_white_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_white_36dp</item>
+ <item type="attr" name="ic_cellphone_text">@drawable/ic_cellphone_text_white_24dp</item>
+ <item type="attr" name="ic_question_answer">@drawable/ic_baseline_question_answer_white_24dp</item>
+ <item type="attr" name="ic_bug">@drawable/ic_bug_white_24dp</item>
+ <item type="attr" name="ic_known_issues">@drawable/ic_format_list_bulleted_white_24dp</item>
<item type="attr" name="master_switch_background">@color/master_switch_background_dark</item>
<item type="attr" name="currently_playing_background">@color/highlight_dark</item>
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
@@ -332,13 +351,14 @@
<item name="progressBarTheme">@style/ProgressBarTrueBlack</item>
<item type="attr" name="non_transparent_background">@color/black</item>
<item type="attr" name="overlay_background">@color/black</item>
- <item type="attr" name="overlay_drawable">@drawable/overlay_drawable_dark</item>
+ <item type="attr" name="overlay_drawable">@drawable/overlay_drawable_dark_trueblack</item>
<item type="attr" name="dragview_background">@drawable/ic_drag_vertical_white_48dp</item>
<item type="attr" name="dragview_float_background">@color/black</item>
<item type="attr" name="nav_drawer_background">@color/black</item>
<item type="attr" name="currently_playing_background">@color/highlight_trueblack</item>
<item name="android:textColorPrimary">@color/white</item>
<item name="android:color">@color/white</item>
+ <item name="android:colorBackground">@color/black</item>
<item name="android:windowBackground">@color/black</item>
<item name="android:actionBarStyle">@color/black</item>
<item name="colorPrimary">@color/black</item>
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 f12f1d806..9af76cf86 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java
@@ -14,6 +14,7 @@ import de.danoeh.antennapod.core.util.NetworkUtils;
* Apps using the core module of AntennaPod should register implementations of all interfaces here.
*/
public class ClientConfig {
+ private ClientConfig(){}
/**
* Should be used when setting User-Agent header for HTTP-requests.
diff --git a/core/src/play/java/de/danoeh/antennapod/core/cast/CastManager.java b/core/src/play/java/de/danoeh/antennapod/core/cast/CastManager.java
index 27fb7344d..5198a76bd 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/cast/CastManager.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/cast/CastManager.java
@@ -1440,12 +1440,6 @@ public class CastManager extends BaseCastManager implements OnFailedListener {
return idleReason;
}
- private void onMessageSendFailed(int errorCode) {
- for (CastConsumer consumer : castConsumers) {
- consumer.onDataMessageSendFailed(errorCode);
- }
- }
-
/*
* This is called by onStatusUpdated() of the RemoteMediaPlayer
*/
diff --git a/core/src/play/java/de/danoeh/antennapod/core/cast/CastUtils.java b/core/src/play/java/de/danoeh/antennapod/core/cast/CastUtils.java
index aec559a5f..88da6a0ec 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/cast/CastUtils.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/cast/CastUtils.java
@@ -23,6 +23,8 @@ import de.danoeh.antennapod.core.util.playback.Playable;
* Helper functions for Cast support.
*/
public class CastUtils {
+ private CastUtils(){}
+
private static final String TAG = "CastUtils";
public static final String KEY_MEDIA_ID = "de.danoeh.antennapod.core.cast.MediaId";
diff --git a/core/src/play/java/de/danoeh/antennapod/core/cast/RemoteMedia.java b/core/src/play/java/de/danoeh/antennapod/core/cast/RemoteMedia.java
index c6524e868..1c6dd30c4 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/cast/RemoteMedia.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/cast/RemoteMedia.java
@@ -24,7 +24,6 @@ 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.MediaType;
-import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.util.ChapterUtils;
import de.danoeh.antennapod.core.util.playback.Playable;
diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java
index e36a09f00..b9cba05b4 100644
--- a/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java
+++ b/core/src/test/java/de/danoeh/antennapod/core/feed/FeedItemTest.java
@@ -5,8 +5,6 @@ import org.junit.Test;
import static de.danoeh.antennapod.core.feed.FeedItemMother.anyFeedItemWithImage;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
public class FeedItemTest {