summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/build.gradle4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java22
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java97
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/FeedRemover.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrClickWorker.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/FlattrStatusFetcher.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/asynctask/ImageResource.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java24
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java46
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java23
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java57
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java25
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java23
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeAction.java11
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java100
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java9
-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/download/AntennapodHttpClient.java32
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java237
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java51
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java32
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java14
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java441
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java55
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java59
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java115
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java38
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java132
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java81
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java22
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java15
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java374
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java41
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java20
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java61
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java59
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSRSS20.java88
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/NSAtom.java103
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java13
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/Converter.java35
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/DateUtils.java19
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/IntList.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/LongList.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java54
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/flattr/FlattrServiceCreator.java13
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java55
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/gui/MoreContentListFooterUtil.java13
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java99
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java14
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/Playable.java54
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java328
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java64
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java6
-rw-r--r--core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.pngbin678 -> 541 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi-v11/ic_stat_authentication.pngbin467 -> 371 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.pngbin222 -> 125 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_add_white_24dp.pngbin223 -> 124 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.pngbin1228 -> 429 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.pngbin3309 -> 1100 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.pngbin3395 -> 1232 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_av_rewind_80dp.pngbin1277 -> 408 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.pngbin522 -> 415 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.pngbin510 -> 394 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.pngbin584 -> 278 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.pngbin397 -> 180 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.pngbin340 -> 170 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.pngbin505 -> 260 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.pngbin0 -> 167 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.pngbin0 -> 164 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.pngbin248 -> 161 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_delete_white_24dp.pngbin246 -> 158 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.pngbin425 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_description_white_36dp.pngbin424 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.pngbin326 -> 175 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_done_white_24dp.pngbin309 -> 169 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.pngbin389 -> 289 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.pngbin361 -> 265 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.pngbin348 -> 195 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.pngbin324 -> 189 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.pngbin366 -> 256 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.pngbin460 -> 324 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.pngbin360 -> 253 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.pngbin451 -> 315 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.pngbin395 -> 267 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.pngbin480 -> 331 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.pngbin376 -> 261 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.pngbin461 -> 321 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.pngbin1159 -> 511 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_feed_white_24dp.pngbin727 -> 458 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.pngbin276 -> 154 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.pngbin277 -> 150 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.pngbin135 -> 111 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_filter_white_24dp.pngbin131 -> 110 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.pngbin583 -> 478 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.pngbin602 -> 449 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.pngbin636 -> 509 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_history_white_24dp.pngbin638 -> 511 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.pngbin405 -> 179 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.pngbin348 -> 171 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.pngbin448 -> 342 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_info_white_24dp.pngbin433 -> 325 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_launcher.pngbin3955 -> 3887 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.pngbin207 -> 115 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_list_white_24dp.pngbin207 -> 114 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.pngbin366 -> 315 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.pngbin358 -> 303 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.pngbin362 -> 314 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.pngbin356 -> 299 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.pngbin221 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.pngbin219 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_new.pngbin891 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_new_dark.pngbin716 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.pngbin501 -> 399 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.pngbin491 -> 381 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.pngbin188 -> 103 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.pngbin235 -> 126 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_pause_white_24dp.pngbin188 -> 103 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_pause_white_36dp.pngbin234 -> 124 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.pngbin301 -> 195 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.pngbin355 -> 235 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.pngbin282 -> 194 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.pngbin348 -> 232 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.pngbin508 -> 407 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.pngbin531 -> 367 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.pngbin470 -> 380 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.pngbin468 -> 358 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.pngbin0 -> 259 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.pngbin0 -> 247 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.pngbin522 -> 412 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_search_white_24dp.pngbin504 -> 386 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.pngbin572 -> 468 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.pngbin713 -> 569 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.pngbin703 -> 553 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_settings_white_24dp.pngbin561 -> 438 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.pngbin513 -> 413 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_share_white_24dp.pngbin506 -> 382 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.pngbin302 -> 256 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_skip_white_36dp.pngbin304 -> 251 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.pngbin421 -> 180 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.pngbin659 -> 290 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.pngbin431 -> 264 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.pngbin361 -> 179 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.pngbin264 -> 118 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sort_white_24dp.pngbin238 -> 114 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.pngbin637 -> 530 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.pngbin637 -> 488 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.pngbin460 -> 389 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_star_white_24dp.pngbin454 -> 369 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_stat_antenna_default.pngbin649 -> 473 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_stat_authentication.pngbin648 -> 446 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.pngbin640 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_timer_white_24dp.pngbin609 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.pngbin229 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_toc_white_36dp.pngbin240 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.pngbin248 -> 162 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_web_white_24dp.pngbin245 -> 159 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_widget_preview.pngbin18320 -> 8210 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/navigation_up.pngbin2270 -> 318 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/navigation_up_dark.pngbin2221 -> 309 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/stat_notify_sync.pngbin421 -> 333 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/stat_notify_sync_error.pngbin436 -> 352 bytes
-rw-r--r--core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.pngbin307 -> 259 bytes
-rw-r--r--core/src/main/res/drawable-ldpi/ic_launcher.pngbin1658 -> 1645 bytes
-rw-r--r--core/src/main/res/drawable-ldpi/ic_stat_antenna_default.pngbin271 -> 202 bytes
-rw-r--r--core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.pngbin414 -> 349 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi-v11/ic_stat_authentication.pngbin293 -> 244 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.pngbin174 -> 90 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_add_white_24dp.pngbin174 -> 88 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.pngbin760 -> 328 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.pngbin1765 -> 768 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.pngbin1858 -> 820 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_av_rewind_80dp.pngbin853 -> 349 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.pngbin401 -> 307 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.pngbin393 -> 290 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.pngbin397 -> 193 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.pngbin254 -> 116 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.pngbin230 -> 113 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.pngbin331 -> 179 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.pngbin0 -> 133 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.pngbin0 -> 132 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.pngbin199 -> 114 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_delete_white_24dp.pngbin197 -> 112 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.pngbin271 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_description_white_36dp.pngbin309 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.pngbin244 -> 132 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_done_white_24dp.pngbin243 -> 133 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.pngbin253 -> 202 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.pngbin231 -> 191 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.pngbin291 -> 160 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.pngbin290 -> 153 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.pngbin276 -> 162 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.pngbin366 -> 256 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.pngbin265 -> 163 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.pngbin360 -> 253 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.pngbin267 -> 167 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.pngbin395 -> 267 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.pngbin263 -> 162 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.pngbin376 -> 261 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.pngbin773 -> 353 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_feed_white_24dp.pngbin492 -> 321 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.pngbin213 -> 115 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.pngbin210 -> 113 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.pngbin111 -> 91 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_filter_white_24dp.pngbin111 -> 90 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.pngbin408 -> 324 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.pngbin397 -> 301 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.pngbin447 -> 345 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_history_white_24dp.pngbin447 -> 345 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.pngbin259 -> 118 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.pngbin241 -> 115 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.pngbin327 -> 233 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_info_white_24dp.pngbin319 -> 224 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_launcher.pngbin2382 -> 2359 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.pngbin178 -> 88 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_list_white_24dp.pngbin171 -> 86 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.pngbin242 -> 205 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.pngbin237 -> 199 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.pngbin242 -> 208 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.pngbin238 -> 198 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.pngbin202 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.pngbin202 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_new.pngbin593 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_new_dark.pngbin484 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.pngbin382 -> 288 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.pngbin378 -> 277 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.pngbin168 -> 84 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.pngbin188 -> 103 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_pause_white_24dp.pngbin174 -> 83 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_pause_white_36dp.pngbin188 -> 103 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.pngbin248 -> 151 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.pngbin301 -> 195 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.pngbin257 -> 154 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.pngbin282 -> 194 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.pngbin356 -> 261 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.pngbin346 -> 247 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.pngbin357 -> 265 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.pngbin371 -> 259 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.pngbin0 -> 181 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.pngbin0 -> 172 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.pngbin356 -> 263 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_search_white_24dp.pngbin346 -> 247 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.pngbin491 -> 388 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.pngbin473 -> 371 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.pngbin371 -> 269 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_share_white_24dp.pngbin361 -> 261 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.pngbin218 -> 183 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_skip_white_36dp.pngbin216 -> 183 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.pngbin336 -> 140 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.pngbin472 -> 225 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.pngbin323 -> 203 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.pngbin252 -> 139 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.pngbin193 -> 91 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sort_white_24dp.pngbin192 -> 90 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.pngbin410 -> 354 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.pngbin410 -> 342 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.pngbin307 -> 274 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_star_white_24dp.pngbin302 -> 265 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_stat_antenna_default.pngbin412 -> 297 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_stat_authentication.pngbin460 -> 317 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.pngbin442 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_timer_white_24dp.pngbin420 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.pngbin205 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_toc_white_36dp.pngbin205 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.pngbin212 -> 123 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_web_white_24dp.pngbin211 -> 122 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/navigation_up.pngbin2123 -> 279 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/navigation_up_dark.pngbin2060 -> 267 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/stat_notify_sync.pngbin272 -> 227 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/stat_notify_sync_error.pngbin274 -> 241 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.pngbin1005 -> 783 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.pngbin529 -> 418 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.pngbin199 -> 109 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_add_white_24dp.pngbin198 -> 97 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.pngbin1968 -> 575 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.pngbin5191 -> 1889 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.pngbin5393 -> 1994 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.pngbin1992 -> 603 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.pngbin661 -> 537 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.pngbin645 -> 513 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.pngbin658 -> 305 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.pngbin406 -> 186 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.pngbin364 -> 165 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.pngbin526 -> 282 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.pngbin0 -> 198 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.pngbin0 -> 188 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.pngbin271 -> 153 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.pngbin270 -> 146 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.pngbin461 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_description_white_36dp.pngbin459 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.pngbin373 -> 189 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_done_white_24dp.pngbin363 -> 183 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.pngbin548 -> 379 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.pngbin517 -> 349 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.pngbin411 -> 223 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.pngbin406 -> 218 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.pngbin383 -> 252 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.pngbin497 -> 332 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.pngbin386 -> 253 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.pngbin496 -> 327 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.pngbin405 -> 279 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.pngbin523 -> 348 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.pngbin399 -> 263 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.pngbin511 -> 331 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.pngbin1420 -> 645 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_feed_white_24dp.pngbin910 -> 572 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.pngbin283 -> 148 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.pngbin282 -> 143 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.pngbin141 -> 106 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.pngbin141 -> 103 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.pngbin759 -> 621 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.pngbin724 -> 588 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.pngbin769 -> 636 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_history_white_24dp.pngbin770 -> 634 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.pngbin407 -> 186 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.pngbin370 -> 166 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.pngbin547 -> 428 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_info_white_24dp.pngbin530 -> 411 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_launcher.pngbin5589 -> 5519 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.pngbin197 -> 104 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_list_white_24dp.pngbin196 -> 95 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.pngbin430 -> 355 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.pngbin421 -> 341 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.pngbin427 -> 355 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.pngbin420 -> 341 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.pngbin252 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.pngbin269 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_new.pngbin1189 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_new_dark.pngbin989 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.pngbin623 -> 496 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.pngbin637 -> 464 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.pngbin193 -> 105 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.pngbin217 -> 109 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.pngbin193 -> 90 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.pngbin215 -> 92 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.pngbin319 -> 211 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.pngbin400 -> 270 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.pngbin318 -> 206 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.pngbin399 -> 270 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.pngbin644 -> 511 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.pngbin637 -> 484 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.pngbin589 -> 492 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.pngbin585 -> 472 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.pngbin0 -> 295 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.pngbin0 -> 284 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.pngbin597 -> 483 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_search_white_24dp.pngbin591 -> 453 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.pngbin704 -> 581 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.pngbin834 -> 698 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.pngbin825 -> 675 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.pngbin737 -> 540 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.pngbin629 -> 496 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_share_white_24dp.pngbin625 -> 472 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.pngbin364 -> 285 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.pngbin368 -> 285 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.pngbin494 -> 224 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.pngbin769 -> 358 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.pngbin486 -> 326 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.pngbin367 -> 208 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.pngbin215 -> 106 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.pngbin212 -> 101 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.pngbin828 -> 694 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.pngbin821 -> 630 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.pngbin593 -> 487 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_star_white_24dp.pngbin582 -> 455 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.pngbin942 -> 693 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_stat_authentication.pngbin882 -> 584 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.pngbin761 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.pngbin810 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.pngbin222 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.pngbin229 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_undobar_undo.pngbin1558 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.pngbin282 -> 190 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_web_white_24dp.pngbin319 -> 182 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/navigation_up.pngbin2471 -> 409 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/navigation_up_dark.pngbin2445 -> 408 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/stat_notify_sync.pngbin475 -> 368 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/stat_notify_sync_error.pngbin533 -> 415 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/undobar.9.pngbin1665 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/undobar_button_focused.9.pngbin1141 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.pngbin1123 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/undobar_divider.9.pngbin963 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.pngbin223 -> 114 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.pngbin222 -> 97 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.pngbin3207 -> 831 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.pngbin8059 -> 2745 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.pngbin8216 -> 2987 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.pngbin3502 -> 757 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.pngbin920 -> 756 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.pngbin893 -> 716 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.pngbin920 -> 415 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.pngbin582 -> 244 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.pngbin502 -> 214 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.pngbin800 -> 383 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.pngbin0 -> 262 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.pngbin0 -> 251 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.pngbin341 -> 195 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.pngbin338 -> 189 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.pngbin635 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.pngbin626 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.pngbin451 -> 262 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.pngbin476 -> 252 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.pngbin853 -> 593 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.pngbin809 -> 544 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.pngbin539 -> 278 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.pngbin539 -> 273 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.pngbin497 -> 332 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.pngbin689 -> 520 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.pngbin496 -> 327 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.pngbin689 -> 518 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.pngbin523 -> 348 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.pngbin704 -> 547 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.pngbin511 -> 331 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.pngbin708 -> 548 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.pngbin2087 -> 956 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.pngbin1366 -> 843 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.pngbin353 -> 182 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.pngbin351 -> 177 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.pngbin189 -> 114 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.pngbin188 -> 107 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.pngbin1041 -> 885 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.pngbin1034 -> 840 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.pngbin1121 -> 950 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.pngbin1123 -> 952 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.pngbin580 -> 247 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.pngbin514 -> 219 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.pngbin762 -> 611 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.pngbin736 -> 576 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_launcher.pngbin14262 -> 9483 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.pngbin223 -> 111 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.pngbin230 -> 94 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.pngbin630 -> 518 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.pngbin621 -> 494 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.pngbin627 -> 519 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.pngbin621 -> 496 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.pngbin316 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.pngbin313 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_new.pngbin1759 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_new_dark.pngbin1501 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.pngbin881 -> 718 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.pngbin858 -> 679 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.pngbin217 -> 109 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.pngbin294 -> 143 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.pngbin215 -> 92 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.pngbin293 -> 143 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.pngbin400 -> 270 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.pngbin544 -> 367 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.pngbin399 -> 270 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.pngbin543 -> 351 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.pngbin882 -> 741 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.pngbin875 -> 689 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.pngbin826 -> 697 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.pngbin862 -> 669 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.pngbin0 -> 439 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.pngbin0 -> 416 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.pngbin881 -> 712 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.pngbin871 -> 669 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.pngbin994 -> 844 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.pngbin1231 -> 1063 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.pngbin1219 -> 1019 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.pngbin974 -> 790 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.pngbin866 -> 694 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.pngbin857 -> 660 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.pngbin533 -> 369 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.pngbin543 -> 361 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.pngbin737 -> 311 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.pngbin1113 -> 495 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.pngbin664 -> 449 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.pngbin509 -> 280 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.pngbin244 -> 115 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.pngbin241 -> 103 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.pngbin1227 -> 1009 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.pngbin1222 -> 934 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.pngbin877 -> 703 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.pngbin870 -> 657 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_stat_authentication.pngbin1266 -> 848 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.pngbin1074 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.pngbin1063 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.pngbin313 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.pngbin312 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.pngbin402 -> 245 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.pngbin408 -> 234 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/stat_notify_sync.pngbin705 -> 545 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.pngbin761 -> 577 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.pngbin5878 -> 1332 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.pngbin6299 -> 1362 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.pngbin0 -> 331 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.pngbin0 -> 314 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.pngbin235 -> 123 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.pngbin234 -> 106 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.pngbin854 -> 675 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.pngbin839 -> 646 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.pngbin850 -> 674 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.pngbin838 -> 643 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.pngbin0 -> 583 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.pngbin0 -> 559 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.pngbin737 -> 443 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.pngbin749 -> 433 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.pngbin955 -> 403 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.pngbin1514 -> 637 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.pngbin882 -> 580 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.pngbin647 -> 358 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.pngbin1675 -> 1352 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.pngbin1684 -> 1248 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.pngbin1179 -> 916 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.pngbin1183 -> 856 bytes
-rw-r--r--core/src/main/res/drawable/undobar_button.xml22
-rw-r--r--core/src/main/res/values-ar/strings.xml128
-rw-r--r--core/src/main/res/values-ca-rES/strings.xml33
-rw-r--r--core/src/main/res/values-ca/strings.xml66
-rw-r--r--core/src/main/res/values-cs-rCZ/strings.xml13
-rw-r--r--core/src/main/res/values-de/strings.xml13
-rw-r--r--core/src/main/res/values-el/strings.xml358
-rw-r--r--core/src/main/res/values-es/strings.xml19
-rw-r--r--core/src/main/res/values-fi/strings.xml33
-rw-r--r--core/src/main/res/values-fr/strings.xml12
-rw-r--r--core/src/main/res/values-hu/strings.xml33
-rw-r--r--core/src/main/res/values-id/strings.xml33
-rw-r--r--core/src/main/res/values-it/strings.xml290
-rw-r--r--core/src/main/res/values-ja/strings.xml13
-rw-r--r--core/src/main/res/values-kn-rIN/strings.xml103
-rw-r--r--core/src/main/res/values-ko-rKR/strings.xml33
-rw-r--r--core/src/main/res/values-ko/strings.xml7
-rw-r--r--core/src/main/res/values-nl/strings.xml26
-rw-r--r--core/src/main/res/values-no-rNB/strings.xml510
-rw-r--r--core/src/main/res/values-no/strings.xml33
-rw-r--r--core/src/main/res/values-pl/strings.xml99
-rw-r--r--core/src/main/res/values-pt/strings.xml13
-rw-r--r--core/src/main/res/values-sv-rSE/strings.xml13
-rw-r--r--core/src/main/res/values-uk-rUA/strings.xml63
-rw-r--r--core/src/main/res/values-vi-rVN/strings.xml33
-rw-r--r--core/src/main/res/values-vi/strings.xml60
-rw-r--r--core/src/main/res/values/attrs.xml5
-rw-r--r--core/src/main/res/values/strings.xml45
-rw-r--r--core/src/main/res/values/styles.xml22
570 files changed, 4043 insertions, 1674 deletions
diff --git a/core/build.gradle b/core/build.gradle
index 09d13a476..f79ea8fc8 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -45,10 +45,10 @@ dependencies {
exclude group: "org.json", module: "json"
}
compile "commons-io:commons-io:$commonsioVersion"
- compile "com.jayway.android.robotium:robotium-solo:5.5.3"
+ compile "com.jayway.android.robotium:robotium-solo:$robotiumSoloVersion"
compile "org.jsoup:jsoup:$jsoupVersion"
compile "com.github.bumptech.glide:glide:$glideVersion"
- compile "com.github.bumptech.glide:okhttp-integration:1.3.1"
+ compile "com.github.bumptech.glide:okhttp-integration:$glideOkhttpIntegrationVersion"
compile "com.squareup.okhttp:okhttp:$okhttpVersion"
compile "com.squareup.okhttp:okhttp-urlconnection:$okhttpVersion"
compile "com.squareup.okio:okio:$okioVersion"
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java
index 1064e98ac..3acc84e3b 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java
@@ -12,12 +12,12 @@ public interface ApplicationCallbacks {
/**
* Returns a non-null instance of the application class
*/
- public Application getApplicationInstance();
+ Application getApplicationInstance();
/**
* Returns a non-null intent that starts the storage error
* activity.
*/
- public Intent getStorageErrorActivity(Context context);
+ Intent getStorageErrorActivity(Context context);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java
index 6619e706b..a96affb23 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java
@@ -1,5 +1,12 @@
package de.danoeh.antennapod.core;
+import android.content.Context;
+
+import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
+import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.storage.PodDBAdapter;
+import de.danoeh.antennapod.core.util.NetworkUtils;
+
/**
* Stores callbacks for core classes like Services, DB classes etc. and other configuration variables.
* Apps using the core module of AntennaPod should register implementations of all interfaces here.
@@ -22,4 +29,19 @@ public class ClientConfig {
public static FlattrCallbacks flattrCallbacks;
public static DBTasksCallbacks dbTasksCallbacks;
+
+ private static boolean initialized = false;
+
+ public static synchronized void initialize(Context context) {
+ if(initialized) {
+ return;
+ }
+ PodDBAdapter.init(context);
+ UserPreferences.init(context);
+ UpdateManager.init(context);
+ PlaybackPreferences.init(context);
+ NetworkUtils.init(context);
+ initialized = true;
+ }
+
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java
index edf3e3199..11a6b2c9f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/DBTasksCallbacks.java
@@ -11,10 +11,10 @@ public interface DBTasksCallbacks {
/**
* Returns the client's implementation of the AutomaticDownloadAlgorithm interface.
*/
- public AutomaticDownloadAlgorithm getAutomaticDownloadAlgorithm();
+ AutomaticDownloadAlgorithm getAutomaticDownloadAlgorithm();
/**
* Returns the client's implementation of the EpisodeCacheCleanupAlgorithm interface.
*/
- public EpisodeCleanupAlgorithm getEpisodeCacheCleanupAlgorithm();
+ EpisodeCleanupAlgorithm getEpisodeCacheCleanupAlgorithm();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java
index 286e830c5..e56445489 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/DownloadServiceCallbacks.java
@@ -19,7 +19,7 @@ public interface DownloadServiceCallbacks {
*
* @return A non-null PendingIntent for the notification.
*/
- public PendingIntent getNotificationContentIntent(Context context);
+ PendingIntent getNotificationContentIntent(Context context);
/**
* Returns a PendingIntent for a notification that tells the user to enter a username
@@ -30,7 +30,7 @@ public interface DownloadServiceCallbacks {
*
* @return A non-null PendingIntent for the notification.
*/
- public PendingIntent getAuthentificationNotificationContentIntent(Context context, DownloadRequest request);
+ PendingIntent getAuthentificationNotificationContentIntent(Context context, DownloadRequest request);
/**
* Returns a PendingIntent for notification that notifies the user about the completion of downloads
@@ -40,19 +40,19 @@ public interface DownloadServiceCallbacks {
*
* @return A non-null PendingIntent for the notification or null if shouldCreateReport()==false
*/
- public PendingIntent getReportNotificationContentIntent(Context context);
+ PendingIntent getReportNotificationContentIntent(Context context);
/**
* Called by the FeedSyncThread after a feed has been downloaded and parsed.
*
* @param feed The non-null feed that has been parsed.
*/
- public void onFeedParsed(Context context, Feed feed);
+ void onFeedParsed(Context context, Feed feed);
/**
* Returns true if the DownloadService should create a report that shows the number of failed
* downloads when the service shuts down.
* */
- public boolean shouldCreateReport();
+ boolean shouldCreateReport();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java
index cee1029d8..5fa6faa13 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/FlattrCallbacks.java
@@ -15,7 +15,7 @@ public interface FlattrCallbacks {
* Returns if true if the flattr integration should be activated,
* false otherwise.
*/
- public boolean flattrEnabled();
+ boolean flattrEnabled();
/**
* Returns an intent that starts the activity that is responsible for
@@ -24,13 +24,13 @@ public interface FlattrCallbacks {
* @return The intent that starts the authentication activity or null
* if flattr integration is disabled (i.e. flattrEnabled() == false).
*/
- public Intent getFlattrAuthenticationActivityIntent(Context context);
+ Intent getFlattrAuthenticationActivityIntent(Context context);
- public PendingIntent getFlattrFailedNotificationContentIntent(Context context);
+ PendingIntent getFlattrFailedNotificationContentIntent(Context context);
- public String getFlattrAppKey();
+ String getFlattrAppKey();
- public String getFlattrAppSecret();
+ String getFlattrAppSecret();
- public void handleFlattrAuthenticationSuccess(AccessToken token);
+ void handleFlattrAuthenticationSuccess(AccessToken token);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java
index 6174bce29..10797ecfb 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/GpodnetCallbacks.java
@@ -13,7 +13,7 @@ public interface GpodnetCallbacks {
* Returns if true if the gpodder.net integration should be activated,
* false otherwise.
*/
- public boolean gpodnetEnabled();
+ boolean gpodnetEnabled();
/**
* Returns a PendingIntent for the error notification of the GpodnetSyncService.
@@ -23,5 +23,5 @@ public interface GpodnetCallbacks {
* @return A PendingIntent for the notification or null if gpodder.net integration
* has been disabled (i.e. gpodnetEnabled() == false).
*/
- public PendingIntent getGpodnetSyncServiceErrorNotificationPendingIntent(Context context);
+ PendingIntent getGpodnetSyncServiceErrorNotificationPendingIntent(Context context);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java
index fb01fa703..08ccb6d71 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/PlaybackServiceCallbacks.java
@@ -17,17 +17,17 @@ public interface PlaybackServiceCallbacks {
* @param mediaType The type of media that is being played.
* @return A non-null activity intent.
*/
- public Intent getPlayerActivityIntent(Context context, MediaType mediaType);
+ Intent getPlayerActivityIntent(Context context, MediaType mediaType);
/**
* Returns true if the PlaybackService should load new episodes from the queue when playback ends
* and false if the PlaybackService should ignore the queue and load no more episodes when playback
* finishes.
*/
- public boolean useQueue();
+ boolean useQueue();
/**
* Returns a drawable resource that is used for the notification of the playback service.
*/
- public int getNotificationIconResource(Context context);
+ int getNotificationIconResource(Context context);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
new file mode 100644
index 000000000..8362c4a4e
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
@@ -0,0 +1,97 @@
+package de.danoeh.antennapod.core;
+
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+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.FeedImage;
+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
+ */
+public class UpdateManager {
+
+ public static final String TAG = UpdateManager.class.getSimpleName();
+
+ private static final String PREF_NAME = "app_version";
+ private static final String KEY_VERSION_CODE = "version_code";
+
+ private static int currentVersionCode;
+
+ private static Context context;
+ private static SharedPreferences prefs;
+
+ public static void init(Context context) {
+ UpdateManager.context = context;
+ prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
+ PackageManager pm = context.getPackageManager();
+ try {
+ PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0);
+ currentVersionCode = info.versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(TAG, "Failed to obtain package info for package name: " + context.getPackageName(), e);
+ currentVersionCode = 0;
+ return;
+ }
+ final int oldVersionCode = getStoredVersionCode();
+ Log.d(TAG, "old: " + oldVersionCode + ", current: " + currentVersionCode);
+ if(oldVersionCode < currentVersionCode) {
+ onUpgrade(oldVersionCode, currentVersionCode);
+ setCurrentVersionCode();
+ }
+ }
+
+ public static int getStoredVersionCode() {
+ return prefs.getInt(KEY_VERSION_CODE, -1);
+ }
+
+ public static void setCurrentVersionCode() {
+ prefs.edit().putInt(KEY_VERSION_CODE, currentVersionCode).apply();
+ }
+
+ private static void onUpgrade(final int oldVersionCode, final int newVersionCode) {
+ if(oldVersionCode < 1030099) {
+ // delete the now obsolete image cache
+ // from now on, Glide will handle caching images
+ new Thread() {
+ public void run() {
+ List<Feed> feeds = DBReader.getFeedList();
+ for (Feed podcast : feeds) {
+ List<FeedItem> episodes = DBReader.getFeedItemList(podcast);
+ for (FeedItem episode : episodes) {
+ FeedImage image = episode.getImage();
+ if (image != null && image.isDownloaded() && image.getFile_url() != null) {
+ File imageFile = new File(image.getFile_url());
+ if (imageFile.exists()) {
+ imageFile.delete();
+ }
+ image.setFile_url(null); // calls setDownloaded(false)
+ DBWriter.setFeedImage(image);
+ }
+ }
+ }
+ }
+ }.start();
+ }
+ if(oldVersionCode < 1050004) {
+ if(MediaPlayer.isPrestoLibraryInstalled(context) && Build.VERSION.SDK_INT >= 16) {
+ UserPreferences.enableSonic(true);
+ }
+ }
+ }
+
+}
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 7ff622f34..e475e696c 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
@@ -30,9 +30,7 @@ public class FeedRemover extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
try {
DBWriter.deleteFeed(context, feed.getId()).get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return null;
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 ac032fcc0..3ddaba52e 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
@@ -17,6 +17,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
+import java.util.concurrent.atomic.AtomicInteger;
import de.danoeh.antennapod.core.BuildConfig;
import de.danoeh.antennapod.core.ClientConfig;
@@ -44,10 +45,10 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
private final Context context;
- public static enum ExitCode {EXIT_NORMAL, NO_TOKEN, NO_NETWORK, NO_THINGS}
+ public enum ExitCode {EXIT_NORMAL, NO_TOKEN, NO_NETWORK, NO_THINGS}
- private volatile int countFailed = 0;
- private volatile int countSuccess = 0;
+ private final AtomicInteger countFailed = new AtomicInteger();
+ private final AtomicInteger countSuccess = new AtomicInteger();
private volatile FlattrThing extraFlattrThing;
@@ -105,7 +106,7 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
return ExitCode.NO_THINGS;
}
- List<Future> dbFutures = new LinkedList<Future>();
+ List<Future> dbFutures = new LinkedList<>();
for (FlattrThing thing : flattrQueue) {
if (BuildConfig.DEBUG) Log.d(TAG, "Processing " + thing.getTitle());
@@ -114,12 +115,12 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
FlattrUtils.clickUrl(context, thing.getPaymentLink());
thing.getFlattrStatus().setFlattred();
publishProgress(R.string.flattr_click_success);
- countSuccess++;
+ countSuccess.incrementAndGet();
} catch (FlattrException e) {
e.printStackTrace();
- countFailed++;
- if (countFailed == 1) {
+ int failed = countFailed.incrementAndGet();
+ if (failed == 1) {
exception = e;
}
}
@@ -133,9 +134,7 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
for (Future f : dbFutures) {
try {
f.get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
@@ -148,7 +147,7 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
super.onPostExecute(exitCode);
switch (exitCode) {
case EXIT_NORMAL:
- if (countFailed > 0) {
+ if (countFailed.get() > 0) {
postFlattrFailedNotification();
}
break;
@@ -190,7 +189,8 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
}
private void postFlattrFailedNotification() {
- if (countFailed == 0) {
+ int failed = countFailed.get();
+ if (failed == 0) {
return;
}
@@ -198,15 +198,15 @@ public class FlattrClickWorker extends AsyncTask<Void, Integer, FlattrClickWorke
String title;
String subtext;
- if (countFailed == 1) {
+ if (failed == 1) {
title = context.getString(R.string.flattrd_failed_label);
String exceptionMsg = (exception.getMessage() != null) ? exception.getMessage() : "";
subtext = context.getString(R.string.flattr_click_failure, extraFlattrThing.getTitle())
+ "\n" + exceptionMsg;
} else {
title = context.getString(R.string.flattrd_label);
- subtext = context.getString(R.string.flattr_click_success_count, countSuccess) + "\n"
- + context.getString(R.string.flattr_click_failure_count, countFailed);
+ subtext = context.getString(R.string.flattr_click_success_count, countSuccess.get()) + "\n"
+ + context.getString(R.string.flattr_click_failure_count, failed);
}
Notification notification = new NotificationCompat.Builder(context)
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 888591e89..4c084eaaf 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
@@ -2,15 +2,17 @@ package de.danoeh.antennapod.core.asynctask;
import android.content.Context;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
-import de.danoeh.antennapod.core.storage.DBWriter;
-import de.danoeh.antennapod.core.util.flattr.FlattrUtils;
+
import org.shredzone.flattr4j.exception.FlattrException;
import org.shredzone.flattr4j.model.Flattr;
import java.util.List;
import java.util.concurrent.ExecutionException;
+import de.danoeh.antennapod.core.BuildConfig;
+import de.danoeh.antennapod.core.storage.DBWriter;
+import de.danoeh.antennapod.core.util.flattr.FlattrUtils;
+
/**
* Fetch list of flattred things and flattr status in database in a background thread.
*/
@@ -36,9 +38,7 @@ public class FlattrStatusFetcher extends Thread {
} catch (FlattrException e) {
e.printStackTrace();
Log.d(TAG, "flattrQueue exception retrieving list with flattred items " + e.getMessage());
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/asynctask/ImageResource.java b/core/src/main/java/de/danoeh/antennapod/core/asynctask/ImageResource.java
index edd69f15b..992321441 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/asynctask/ImageResource.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/asynctask/ImageResource.java
@@ -16,13 +16,13 @@ public interface ImageResource {
* <p/>
* For example implementations, see FeedMedia or ExternalMedia.
*/
- public static final String SCHEME_MEDIA = "media";
+ String SCHEME_MEDIA = "media";
/**
* Parameter key for an encoded fallback Uri. This Uri MUST point to a local image file
*/
- public static final String PARAM_FALLBACK = "fallback";
+ String PARAM_FALLBACK = "fallback";
/**
* Returns a Uri to the image or null if no image is available.
@@ -33,5 +33,5 @@ public interface ImageResource {
* The Uri can also have an optional fallback-URL if loading the default URL
* failed (see PARAM_FALLBACK).
*/
- public Uri getImageUri();
+ Uri getImageUri();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java b/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java
index 5ea0ba904..982015314 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/backup/OpmlBackupAgent.java
@@ -8,7 +8,6 @@ import android.content.Context;
import android.os.ParcelFileDescriptor;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayOutputStream;
@@ -26,8 +25,8 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Date;
+import de.danoeh.antennapod.core.BuildConfig;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.opml.OpmlElement;
import de.danoeh.antennapod.core.opml.OpmlReader;
@@ -45,13 +44,13 @@ public class OpmlBackupAgent extends BackupAgentHelper {
addHelper(OPML_BACKUP_KEY, new OpmlBackupHelper(this));
}
- private static final void LOGD(String tag, String msg) {
+ private static void LOGD(String tag, String msg) {
if (BuildConfig.DEBUG && Log.isLoggable(tag, Log.DEBUG)) {
Log.d(tag, msg);
}
}
- private static final void LOGD(String tag, String msg, Throwable tr) {
+ private static void LOGD(String tag, String msg, Throwable tr) {
if (BuildConfig.DEBUG && Log.isLoggable(tag, Log.DEBUG)) {
Log.d(tag, msg, tr);
}
@@ -156,10 +155,9 @@ public class OpmlBackupAgent extends BackupAgentHelper {
ArrayList<OpmlElement> opmlElements = new OpmlReader().readDocument(reader);
mChecksum = digester == null ? null : digester.digest();
DownloadRequester downloader = DownloadRequester.getInstance();
- Date lastUpdated = new Date();
for (OpmlElement opmlElem : opmlElements) {
- Feed feed = new Feed(opmlElem.getXmlUrl(), lastUpdated, opmlElem.getText());
+ Feed feed = new Feed(opmlElem.getXmlUrl(), null, opmlElem.getText());
try {
downloader.downloadFeed(mContext, feed);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java b/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java
index abb75e5e7..266526d82 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/dialog/ConfirmationDialog.java
@@ -49,28 +49,10 @@ public abstract class ConfirmationDialog {
builder.setTitle(titleId);
builder.setMessage(messageId);
builder.setPositiveButton(positiveText != 0 ? positiveText : R.string.confirm_label,
- new DialogInterface.OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- onConfirmButtonPressed(dialog);
- }
- });
+ (dialog, which) -> onConfirmButtonPressed(dialog));
builder.setNegativeButton(negativeText != 0 ? negativeText : R.string.cancel_label,
- new DialogInterface.OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- onCancelButtonPressed(dialog);
- }
- });
- builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
-
- @Override
- public void onCancel(DialogInterface dialog) {
- onCancelButtonPressed(dialog);
- }
- });
+ (dialog, which) -> onCancelButtonPressed(dialog));
+ builder.setOnCancelListener(ConfirmationDialog.this::onCancelButtonPressed);
return builder.create();
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java b/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java
index b7e79431d..b1beac315 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/dialog/DownloadRequestErrorDialogCreator.java
@@ -1,7 +1,6 @@
package de.danoeh.antennapod.core.dialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import de.danoeh.antennapod.core.R;
@@ -15,13 +14,7 @@ public class DownloadRequestErrorDialogCreator {
String errorMessage) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setNeutralButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
-
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
+ (dialog, which) -> dialog.dismiss())
.setTitle(R.string.download_error_request_error)
.setMessage(
context.getString(R.string.download_request_error_dialog_message_prefix)
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java
index 7ccb742fb..dbad084c7 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java
@@ -34,7 +34,7 @@ public class EventDistributor extends Observable {
private EventDistributor() {
this.handler = new Handler();
- events = new ConcurrentLinkedQueue<Integer>();
+ events = new ConcurrentLinkedQueue<>();
}
public static synchronized EventDistributor getInstance() {
@@ -54,13 +54,7 @@ public class EventDistributor extends Observable {
public void addEvent(Integer i) {
events.offer(i);
- handler.post(new Runnable() {
-
- @Override
- public void run() {
- processEventQueue();
- }
- });
+ handler.post(EventDistributor.this::processEventQueue);
}
private void processEventQueue() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java
index 4be788f33..67ac2d280 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java
@@ -44,10 +44,12 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
private String author;
private FeedImage image;
private List<FeedItem> items;
+
/**
- * Date of last refresh.
+ * String that identifies the last update (adopted from Last-Modified or ETag header)
*/
- private Date lastUpdate;
+ private String lastUpdate;
+
private FlattrStatus flattrStatus;
private String paymentLink;
/**
@@ -91,18 +93,14 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
/**
* This constructor is used for restoring a feed from the database.
*/
- public Feed(long id, Date lastUpdate, String title, String link, String description, String paymentLink,
+ public Feed(long id, String lastUpdate, String title, String link, String description, String paymentLink,
String author, String language, String type, String feedIdentifier, FeedImage image, String fileUrl,
String downloadUrl, boolean downloaded, FlattrStatus status, boolean paged, String nextPageLink,
String filter, boolean lastUpdateFailed) {
super(fileUrl, downloadUrl, downloaded);
this.id = id;
this.title = title;
- if (lastUpdate != null) {
- this.lastUpdate = (Date) lastUpdate.clone();
- } else {
- this.lastUpdate = null;
- }
+ this.lastUpdate = lastUpdate;
this.link = link;
this.description = description;
this.paymentLink = paymentLink;
@@ -114,7 +112,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
this.flattrStatus = status;
this.paged = paged;
this.nextPageLink = nextPageLink;
- this.items = new ArrayList<FeedItem>();
+ this.items = new ArrayList<>();
if(filter != null) {
this.itemfilter = new FeedItemFilter(filter);
} else {
@@ -126,7 +124,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
/**
* This constructor is used for test purposes and uses a default flattr status object.
*/
- public Feed(long id, Date lastUpdate, String title, String link, String description, String paymentLink,
+ public Feed(long id, String lastUpdate, String title, String link, String description, String paymentLink,
String author, String language, String type, String feedIdentifier, FeedImage image, String fileUrl,
String downloadUrl, boolean downloaded) {
this(id, lastUpdate, title, link, description, paymentLink, author, language, type, feedIdentifier, image,
@@ -138,7 +136,6 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
*/
public Feed() {
super();
- lastUpdate = new Date();
this.flattrStatus = new FlattrStatus();
}
@@ -146,9 +143,9 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
* This constructor is used for requesting a feed download (it must not be used for anything else!). It should NOT be
* used if the title of the feed is already known.
*/
- public Feed(String url, Date lastUpdate) {
+ public Feed(String url, String lastUpdate) {
super(null, url, false);
- this.lastUpdate = (lastUpdate != null) ? (Date) lastUpdate.clone() : null;
+ this.lastUpdate = lastUpdate;
this.flattrStatus = new FlattrStatus();
}
@@ -156,7 +153,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
* This constructor is used for requesting a feed download (it must not be used for anything else!). It should be
* used if the title of the feed is already known.
*/
- public Feed(String url, Date lastUpdate, String title) {
+ public Feed(String url, String lastUpdate, String title) {
this(url, lastUpdate);
this.title = title;
this.flattrStatus = new FlattrStatus();
@@ -166,7 +163,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
* This constructor is used for requesting a feed download (it must not be used for anything else!). It should be
* used if the title of the feed is already known.
*/
- public Feed(String url, Date lastUpdate, String title, String username, String password) {
+ public Feed(String url, String lastUpdate, String title, String username, String password) {
this(url, lastUpdate, title);
preferences = new FeedPreferences(0, true, FeedPreferences.AutoDeleteAction.GLOBAL, username, password);
}
@@ -191,11 +188,9 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
int indexHide = cursor.getColumnIndex(PodDBAdapter.KEY_HIDE);
int indexLastUpdateFailed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_UPDATE_FAILED);
- Date lastUpdate = new Date(cursor.getLong(indexLastUpdate));
-
Feed feed = new Feed(
cursor.getLong(indexId),
- lastUpdate,
+ cursor.getString(indexLastUpdate),
cursor.getString(indexTitle),
cursor.getString(indexLink),
cursor.getString(indexDescription),
@@ -240,7 +235,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
*/
public boolean hasUnplayedItems() {
for (FeedItem item : items) {
- if (false == item.isNew() && false == item.isPlayed()) {
+ if (!item.isNew() && !item.isPlayed()) {
return true;
}
}
@@ -329,12 +324,11 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
if (super.compareWithOther(other)) {
return true;
}
- if (!title.equals(other.title)) {
+ if (!TextUtils.equals(title, other.title)) {
return true;
}
if (other.feedIdentifier != null) {
- if (feedIdentifier == null
- || !feedIdentifier.equals(other.feedIdentifier)) {
+ if (feedIdentifier == null || !feedIdentifier.equals(other.feedIdentifier)) {
return true;
}
}
@@ -430,12 +424,12 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource {
this.items = list;
}
- public Date getLastUpdate() {
- return (lastUpdate != null) ? (Date) lastUpdate.clone() : null;
+ public String getLastUpdate() {
+ return lastUpdate;
}
- public void setLastUpdate(Date lastUpdate) {
- this.lastUpdate = (lastUpdate != null) ? (Date) lastUpdate.clone() : null;
+ public void setLastUpdate(String lastModified) {
+ this.lastUpdate = lastModified;
}
public String getFeedIdentifier() {
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 05115c1ea..90b5e50b7 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
@@ -54,9 +54,8 @@ public abstract class FeedComponent {
FeedComponent that = (FeedComponent) o;
- if (id != that.id) return false;
+ return id == that.id;
- return true;
}
@Override
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java
index 3dc58654b..ca9af058b 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedFile.java
@@ -1,5 +1,7 @@
package de.danoeh.antennapod.core.feed;
+import android.text.TextUtils;
+
import java.io.File;
/**
@@ -54,7 +56,7 @@ public abstract class FeedFile extends FeedComponent {
if (super.compareWithOther(other)) {
return true;
}
- if (!download_url.equals(other.download_url)) {
+ if (!TextUtils.equals(download_url, other.download_url)) {
return true;
}
return false;
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 d8c32f55e..4921c0576 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
@@ -171,9 +171,8 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
String itemIdentifier = cursor.getString(indexItemIdentifier);
long autoDownload = cursor.getLong(indexAutoDownload);
- FeedItem item = new FeedItem(id, title, link, pubDate, paymentLink, feedId, flattrStatus,
+ return new FeedItem(id, title, link, pubDate, paymentLink, feedId, flattrStatus,
hasChapters, null, state, itemIdentifier, autoDownload);
- return item;
}
public void updateFromOther(FeedItem other) {
@@ -196,6 +195,8 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
if (other.media != null) {
if (media == null) {
setMedia(other.media);
+ // reset to new if feed item did link to a file before
+ setNew();
} else if (media.compareWithOther(other.media)) {
media.updateFromOther(other.media);
}
@@ -359,24 +360,16 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
}
private boolean isPlaying() {
- if (media != null) {
- return media.isPlaying();
- }
- return false;
+ return media != null && media.isPlaying();
}
@Override
public Callable<String> loadShownotes() {
- return new Callable<String>() {
- @Override
- public String call() throws Exception {
-
- if (contentEncoded == null || description == null) {
- DBReader.loadExtraInformationOfFeedItem(FeedItem.this);
-
- }
- return (contentEncoded != null) ? contentEncoded : description;
+ return () -> {
+ if (contentEncoded == null || description == null) {
+ DBReader.loadExtraInformationOfFeedItem(FeedItem.this);
}
+ return (contentEncoded != null) ? contentEncoded : description;
};
}
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 56b996d1c..991499316 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
@@ -8,7 +8,6 @@ import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.Nullable;
-import android.text.TextUtils;
import java.util.Date;
import java.util.List;
@@ -168,10 +167,6 @@ public class FeedMedia extends FeedFile implements Playable {
}
public void updateFromOther(FeedMedia other) {
- // reset to new if feed item did link to a file before
- if(TextUtils.isEmpty(download_url) && !TextUtils.isEmpty(other.download_url)) {
- item.setNew();
- }
super.updateFromOther(other);
if (other.size > 0) {
size = other.size;
@@ -386,11 +381,14 @@ public class FeedMedia extends FeedFile implements Playable {
// check if chapters are stored in db and not loaded yet.
if (item != null && item.hasChapters() && item.getChapters() == null) {
DBReader.loadChaptersOfFeedItem(item);
- } else if (item != null && item.getChapters() == null && !localFileAvailable()) {
- ChapterUtils.loadChaptersFromStreamUrl(this);
+ } else if (item != null && item.getChapters() == null) {
+ if(localFileAvailable()) {
+ ChapterUtils.loadChaptersFromFileUrl(this);
+ } else {
+ ChapterUtils.loadChaptersFromStreamUrl(this);
+ }
if (getChapters() != null && item != null) {
- DBWriter.setFeedItem(
- item);
+ DBWriter.setFeedItem(item);
}
}
}
@@ -400,10 +398,10 @@ public class FeedMedia extends FeedFile implements Playable {
if (item == null) {
return null;
}
- if (getItem().getTitle() != null) {
- return getItem().getTitle();
+ if (item.getTitle() != null) {
+ return item.getTitle();
} else {
- return getItem().getIdentifyingValue();
+ return item.getIdentifyingValue();
}
}
@@ -412,7 +410,7 @@ public class FeedMedia extends FeedFile implements Playable {
if (item == null) {
return null;
}
- return getItem().getChapters();
+ return item.getChapters();
}
@Override
@@ -420,15 +418,15 @@ public class FeedMedia extends FeedFile implements Playable {
if (item == null) {
return null;
}
- return getItem().getLink();
+ return item.getLink();
}
@Override
public String getFeedTitle() {
- if (item == null) {
+ if (item == null || item.getFeed() == null) {
return null;
}
- return getItem().getFeed().getTitle();
+ return item.getFeed().getTitle();
}
@Override
@@ -451,7 +449,7 @@ public class FeedMedia extends FeedFile implements Playable {
if (item == null) {
return null;
}
- return getItem().getPaymentLink();
+ return item.getPaymentLink();
}
@Override
@@ -489,25 +487,24 @@ public class FeedMedia extends FeedFile implements Playable {
@Override
public void setChapters(List<Chapter> chapters) {
- getItem().setChapters(chapters);
+ if(item != null) {
+ item.setChapters(chapters);
+ }
}
@Override
public Callable<String> loadShownotes() {
- return new Callable<String>() {
- @Override
- public String call() throws Exception {
- if (item == null) {
- item = DBReader.getFeedItem(
- itemID);
- }
- if (item.getContentEncoded() == null || item.getDescription() == null) {
- DBReader.loadExtraInformationOfFeedItem(
- item);
+ return () -> {
+ if (item == null) {
+ item = DBReader.getFeedItem(
+ itemID);
+ }
+ if (item.getContentEncoded() == null || item.getDescription() == null) {
+ DBReader.loadExtraInformationOfFeedItem(
+ item);
- }
- return (item.getContentEncoded() != null) ? item.getContentEncoded() : item.getDescription();
}
+ return (item.getContentEncoded() != null) ? item.getContentEncoded() : item.getDescription();
};
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java
index faf23a37a..e2b5dd7c2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedPreferences.java
@@ -68,7 +68,7 @@ public class FeedPreferences {
/**
* @return the filter for this feed
*/
- public FeedFilter getFilter() {
+ public @NonNull FeedFilter getFilter() {
return filter;
}
@@ -95,8 +95,9 @@ public class FeedPreferences {
* @return True if the two objects are different.
*/
public boolean compareWithOther(FeedPreferences other) {
- if (other == null)
+ if (other == null) {
return true;
+ }
if (!TextUtils.equals(username, other.username)) {
return true;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java
index 86baa459c..513264a05 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java
@@ -18,7 +18,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
-import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
import de.danoeh.antennapod.core.service.download.HttpDownloader;
import de.danoeh.antennapod.core.storage.DBReader;
@@ -107,7 +106,6 @@ public class ApOkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> {
public Response intercept(Chain chain) throws IOException {
com.squareup.okhttp.Request request = chain.request();
String url = request.urlString();
- Context context = ClientConfig.applicationCallbacks.getApplicationInstance();
String authentication = DBReader.getImageAuthentication(url);
if(TextUtils.isEmpty(authentication)) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
index a24e3a485..9f716e546 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
@@ -80,7 +80,7 @@ public class GpodnetService {
String response = executeRequest(request);
try {
JSONArray jsonTagList = new JSONArray(response);
- List<GpodnetTag> tagList = new ArrayList<GpodnetTag>(
+ List<GpodnetTag> tagList = new ArrayList<>(
jsonTagList.length());
for (int i = 0; i < jsonTagList.length(); i++) {
JSONObject jObj = jsonTagList.getJSONObject(i);
@@ -318,8 +318,7 @@ public class GpodnetService {
URL url = new URI(BASE_SCHEME, BASE_HOST, String.format(
"/subscriptions/%s.opml", username), null).toURL();
Request.Builder request = new Request.Builder().url(url);
- String response = executeRequest(request);
- return response;
+ return executeRequest(request);
} catch (MalformedURLException | URISyntaxException e) {
e.printStackTrace();
throw new GpodnetServiceException(e);
@@ -660,7 +659,7 @@ public class GpodnetService {
private List<GpodnetPodcast> readPodcastListFromJSONArray(@NonNull JSONArray array)
throws JSONException {
- List<GpodnetPodcast> result = new ArrayList<GpodnetPodcast>(
+ List<GpodnetPodcast> result = new ArrayList<>(
array.length());
for (int i = 0; i < array.length(); i++) {
result.add(readPodcastFromJSONObject(array.getJSONObject(i)));
@@ -712,7 +711,7 @@ public class GpodnetService {
private List<GpodnetDevice> readDeviceListFromJSONArray(@NonNull JSONArray array)
throws JSONException {
- List<GpodnetDevice> result = new ArrayList<GpodnetDevice>(
+ List<GpodnetDevice> result = new ArrayList<>(
array.length());
for (int i = 0; i < array.length(); i++) {
result.add(readDeviceFromJSONObject(array.getJSONObject(i)));
@@ -732,16 +731,22 @@ public class GpodnetService {
private GpodnetSubscriptionChange readSubscriptionChangesFromJSONObject(
@NonNull JSONObject object) throws JSONException {
- List<String> added = new LinkedList<String>();
+ List<String> added = new LinkedList<>();
JSONArray jsonAdded = object.getJSONArray("add");
for (int i = 0; i < jsonAdded.length(); i++) {
- added.add(jsonAdded.getString(i));
+ String addedUrl = jsonAdded.getString(i);
+ // gpodder escapes colons unnecessarily
+ addedUrl = addedUrl.replace("%3A", ":");
+ added.add(addedUrl);
}
- List<String> removed = new LinkedList<String>();
+ List<String> removed = new LinkedList<>();
JSONArray jsonRemoved = object.getJSONArray("remove");
for (int i = 0; i < jsonRemoved.length(); i++) {
- removed.add(jsonRemoved.getString(i));
+ String removedUrl = jsonRemoved.getString(i);
+ // gpodder escapes colons unnecessarily
+ removedUrl = removedUrl.replace("%3A", ":");
+ removed.add(removedUrl);
}
long timestamp = object.getLong("timestamp");
@@ -751,7 +756,7 @@ public class GpodnetService {
private GpodnetEpisodeActionGetResponse readEpisodeActionsFromJSONObject(
@NonNull JSONObject object) throws JSONException {
- List<GpodnetEpisodeAction> episodeActions = new ArrayList<GpodnetEpisodeAction>();
+ List<GpodnetEpisodeAction> episodeActions = new ArrayList<>();
long timestamp = object.getLong("timestamp");
JSONArray jsonActions = object.getJSONArray("actions");
diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java
index 2d49c170a..79eb33cb5 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetDevice.java
@@ -25,7 +25,7 @@ public class GpodnetDevice {
+ type + ", subscriptions=" + subscriptions + "]";
}
- public static enum DeviceType {
+ public enum DeviceType {
DESKTOP, LAPTOP, MOBILE, SERVER, OTHER;
static DeviceType fromString(String s) {
@@ -33,16 +33,17 @@ public class GpodnetDevice {
return OTHER;
}
- if (s.equals("desktop")) {
- return DESKTOP;
- } else if (s.equals("laptop")) {
- return LAPTOP;
- } else if (s.equals("mobile")) {
- return MOBILE;
- } else if (s.equals("server")) {
- return SERVER;
- } else {
- return OTHER;
+ switch (s) {
+ case "desktop":
+ return DESKTOP;
+ case "laptop":
+ return LAPTOP;
+ case "mobile":
+ return MOBILE;
+ case "server":
+ return SERVER;
+ default:
+ return OTHER;
}
}
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 2d174a6bc..9627ecae6 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
@@ -61,14 +61,13 @@ public class GpodnetEpisodeAction {
String deviceId = fields[2];
try {
Action action = Action.valueOf(fields[3]);
- GpodnetEpisodeAction result = new Builder(podcast, episode, action)
+ return new Builder(podcast, episode, action)
.deviceId(deviceId)
- .timestamp(new Date(Long.valueOf(fields[4])))
- .started(Integer.valueOf(fields[5]))
- .position(Integer.valueOf(fields[6]))
- .total(Integer.valueOf(fields[7]))
+ .timestamp(new Date(Long.parseLong(fields[4])))
+ .started(Integer.parseInt(fields[5]))
+ .position(Integer.parseInt(fields[6]))
+ .total(Integer.parseInt(fields[7]))
.build();
- return result;
} catch(IllegalArgumentException e) {
Log.e(TAG, "readFromString(" + s + "): " + e.getMessage());
return null;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java
index 5f096db14..03c33c9a1 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/model/GpodnetEpisodeActionPostResponse.java
@@ -38,7 +38,7 @@ public class GpodnetEpisodeActionPostResponse {
final JSONObject object = new JSONObject(objectString);
final long timestamp = object.getLong("timestamp");
JSONArray urls = object.getJSONArray("update_urls");
- Map<String, String> updatedUrls = new ArrayMap<String, String>(urls.length());
+ Map<String, String> updatedUrls = new ArrayMap<>(urls.length());
for (int i = 0; i < urls.length(); i++) {
JSONArray urlPair = urls.getJSONArray(i);
updatedUrls.put(urlPair.getString(0), urlPair.getString(1));
diff --git a/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java b/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java
index b8d17bcce..f63c9aeb0 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/menuhandler/MenuItemUtils.java
@@ -32,7 +32,7 @@ public class MenuItemUtils {
}
}
- public static interface UpdateRefreshMenuItemChecker {
- public boolean isRefreshing();
+ public interface UpdateRefreshMenuItemChecker {
+ boolean isRefreshing();
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java b/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java
index 775129d09..17afc7904 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/opml/OpmlReader.java
@@ -1,7 +1,7 @@
package de.danoeh.antennapod.core.opml;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
@@ -10,6 +10,8 @@ import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
+import de.danoeh.antennapod.core.BuildConfig;
+
/** Reads OPML documents. */
public class OpmlReader {
private static final String TAG = "OpmlReader";
@@ -27,7 +29,7 @@ public class OpmlReader {
*/
public ArrayList<OpmlElement> readDocument(Reader reader)
throws XmlPullParserException, IOException {
- elementList = new ArrayList<OpmlElement>();
+ elementList = new ArrayList<>();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
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 edd7b807a..6d4d3baa6 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
@@ -189,7 +189,7 @@ public class GpodnetPreferences {
public static Set<String> getAddedFeedsCopy() {
ensurePreferencesLoaded();
- Set<String> copy = new HashSet<String>();
+ Set<String> copy = new HashSet<>();
feedListLock.lock();
copy.addAll(addedFeeds);
feedListLock.unlock();
@@ -206,7 +206,7 @@ public class GpodnetPreferences {
public static Set<String> getRemovedFeedsCopy() {
ensurePreferencesLoaded();
- Set<String> copy = new HashSet<String>();
+ Set<String> copy = new HashSet<>();
feedListLock.lock();
copy.addAll(removedFeeds);
feedListLock.unlock();
@@ -232,7 +232,7 @@ public class GpodnetPreferences {
public static List<GpodnetEpisodeAction> getQueuedEpisodeActions() {
ensurePreferencesLoaded();
- List<GpodnetEpisodeAction> copy = new ArrayList();
+ List<GpodnetEpisodeAction> copy = new ArrayList<>();
feedListLock.lock();
copy.addAll(queuedEpisodeActions);
feedListLock.unlock();
@@ -272,7 +272,7 @@ public class GpodnetPreferences {
}
private static Set<String> readListFromString(String s) {
- Set<String> result = new HashSet<String>();
+ Set<String> result = new HashSet<>();
for (String item : s.split(" ")) {
result.add(item);
}
@@ -290,7 +290,7 @@ public class GpodnetPreferences {
private static List<GpodnetEpisodeAction> readEpisodeActionsFromString(String s) {
String[] lines = s.split("\n");
- List<GpodnetEpisodeAction> result = new ArrayList<GpodnetEpisodeAction>(lines.length);
+ List<GpodnetEpisodeAction> result = new ArrayList<>(lines.length);
for(String line : lines) {
if(TextUtils.isEmpty(line)) {
GpodnetEpisodeAction action = GpodnetEpisodeAction.readFromString(line);
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 6c0aff15e..a38f50cfc 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
@@ -17,6 +17,7 @@ import org.json.JSONException;
import java.io.File;
import java.io.IOException;
+import java.net.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -25,10 +26,12 @@ import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.receiver.FeedUpdateReceiver;
+import de.danoeh.antennapod.core.service.download.ProxyConfig;
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.core.util.Converter;
/**
* Provides access to preferences set by the user in the settings screen. A
@@ -78,6 +81,11 @@ public class UserPreferences {
public static final String PREF_ENABLE_AUTODL_ON_BATTERY = "prefEnableAutoDownloadOnBattery";
public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter";
public static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks";
+ public static final String PREF_PROXY_TYPE = "prefProxyType";
+ public static final String PREF_PROXY_HOST = "prefProxyHost";
+ public static final String PREF_PROXY_PORT = "prefProxyPort";
+ public static final String PREF_PROXY_USER = "prefProxyUser";
+ public static final String PREF_PROXY_PASSWORD = "prefProxyPassword";
// Services
public static final String PREF_AUTO_FLATTR = "pref_auto_flattr";
@@ -104,6 +112,7 @@ public class UserPreferences {
public static final int EPISODE_CLEANUP_QUEUE = -1;
public static final int EPISODE_CLEANUP_NULL = -2;
public static final int EPISODE_CLEANUP_DEFAULT = 0;
+ private static final String PREF_SHOW_SUBSCRIPTIONS_IN_DRAWER = "prefShowSubscriptionsInDrawer";
// Constants
private static int EPISODE_CACHE_SIZE_UNLIMITED = -1;
@@ -158,12 +167,16 @@ public class UserPreferences {
public static int getFeedOrder() {
String value = prefs.getString(PREF_DRAWER_FEED_ORDER, "0");
- return Integer.valueOf(value);
+ return Integer.parseInt(value);
}
public static int getFeedCounterSetting() {
String value = prefs.getString(PREF_DRAWER_FEED_COUNTER, "0");
- return Integer.valueOf(value);
+ return Integer.parseInt(value);
+ }
+
+ public static boolean showSubscriptionsInDrawer() {
+ return prefs.getBoolean(PREF_SHOW_SUBSCRIPTIONS_IN_DRAWER, true);
}
/**
@@ -243,7 +256,7 @@ public class UserPreferences {
}
public static int getSmartMarkAsPlayedSecs() {
- return Integer.valueOf(prefs.getString(PREF_SMART_MARK_AS_PLAYED_SECS, "30"));
+ return Integer.parseInt(prefs.getString(PREF_SMART_MARK_AS_PLAYED_SECS, "30"));
}
public static boolean isAutoFlattr() {
@@ -260,20 +273,20 @@ public class UserPreferences {
public static float getLeftVolume() {
int volume = prefs.getInt(PREF_LEFT_VOLUME, 100);
- if(volume == 100) {
- return 1.0f;
- } else {
- return (float) (1 - (Math.log(100 - volume) / Math.log(100)));
- }
+ return Converter.getVolumeFromPercentage(volume);
}
public static float getRightVolume() {
int volume = prefs.getInt(PREF_RIGHT_VOLUME, 100);
- if(volume == 100) {
- return 1.0f;
- } else {
- return (float) (1 - (Math.log(100 - volume) / Math.log(100)));
- }
+ return Converter.getVolumeFromPercentage(volume);
+ }
+
+ public static int getLeftVolumePercentage() {
+ return prefs.getInt(PREF_LEFT_VOLUME, 100);
+ }
+
+ public static int getRightVolumePercentage() {
+ return prefs.getInt(PREF_RIGHT_VOLUME, 100);
}
public static boolean shouldPauseForFocusLoss() {
@@ -284,7 +297,7 @@ public class UserPreferences {
public static long getUpdateInterval() {
String updateInterval = prefs.getString(PREF_UPDATE_INTERVAL, "0");
- if(false == updateInterval.contains(":")) {
+ if(!updateInterval.contains(":")) {
return readUpdateInterval(updateInterval);
} else {
return 0;
@@ -295,8 +308,8 @@ public class UserPreferences {
String datetime = prefs.getString(PREF_UPDATE_INTERVAL, "");
if(datetime.length() >= 3 && datetime.contains(":")) {
String[] parts = datetime.split(":");
- int hourOfDay = Integer.valueOf(parts[0]);
- int minute = Integer.valueOf(parts[1]);
+ int hourOfDay = Integer.parseInt(parts[0]);
+ int minute = Integer.parseInt(parts[1]);
return new int[] { hourOfDay, minute };
} else {
return new int[0];
@@ -308,7 +321,7 @@ public class UserPreferences {
}
public static int getParallelDownloads() {
- return Integer.valueOf(prefs.getString(PREF_PARALLEL_DOWNLOADS, "4"));
+ return Integer.parseInt(prefs.getString(PREF_PARALLEL_DOWNLOADS, "4"));
}
public static int getEpisodeCacheSizeUnlimited() {
@@ -338,12 +351,12 @@ public class UserPreferences {
public static int getImageCacheSize() {
String cacheSizeString = prefs.getString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE);
- int cacheSizeInt = Integer.valueOf(cacheSizeString);
+ int cacheSizeInt = Integer.parseInt(cacheSizeString);
// if the cache size is too small the user won't get any images at all
// that's bad, force it back to the default.
if (cacheSizeInt < IMAGE_CACHE_SIZE_MINIMUM) {
prefs.edit().putString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE).apply();
- cacheSizeInt = Integer.valueOf(IMAGE_CACHE_DEFAULT_VALUE);
+ cacheSizeInt = Integer.parseInt(IMAGE_CACHE_DEFAULT_VALUE);
}
int cacheSizeMB = cacheSizeInt * 1024 * 1024;
return cacheSizeMB;
@@ -371,6 +384,41 @@ public class UserPreferences {
return TextUtils.split(selectedNetWorks, ",");
}
+ public static void setProxyConfig(ProxyConfig config) {
+ SharedPreferences.Editor editor = prefs.edit();
+ editor.putString(PREF_PROXY_TYPE, config.type.name());
+ if(TextUtils.isEmpty(config.host)) {
+ editor.remove(PREF_PROXY_HOST);
+ } else {
+ editor.putString(PREF_PROXY_HOST, config.host);
+ }
+ if(config.port <= 0 || config.port > 65535) {
+ editor.remove(PREF_PROXY_PORT);
+ } else {
+ editor.putInt(PREF_PROXY_PORT, config.port);
+ }
+ if(TextUtils.isEmpty(config.username)) {
+ editor.remove(PREF_PROXY_USER);
+ } else {
+ editor.putString(PREF_PROXY_USER, config.username);
+ }
+ if(TextUtils.isEmpty(config.password)) {
+ editor.remove(PREF_PROXY_PASSWORD);
+ } else {
+ editor.putString(PREF_PROXY_PASSWORD, config.password);
+ }
+ editor.apply();
+ }
+
+ public static ProxyConfig getProxyConfig() {
+ Proxy.Type type = Proxy.Type.valueOf(prefs.getString(PREF_PROXY_TYPE, Proxy.Type.DIRECT.name()));
+ String host = prefs.getString(PREF_PROXY_HOST, null);
+ int port = prefs.getInt(PREF_PROXY_PORT, 0);
+ String username = prefs.getString(PREF_PROXY_USER, null);
+ String password = prefs.getString(PREF_PROXY_PASSWORD, null);
+ return new ProxyConfig(type, host, port, username, password);
+ }
+
public static boolean shouldResumeAfterCall() {
return prefs.getBoolean(PREF_RESUME_AFTER_CALL, true);
}
@@ -494,7 +542,7 @@ public class UserPreferences {
if (valueFromPrefs.equals(context.getString(R.string.pref_episode_cache_unlimited))) {
return EPISODE_CACHE_SIZE_UNLIMITED;
} else {
- return Integer.valueOf(valueFromPrefs);
+ return Integer.parseInt(valueFromPrefs);
}
}
@@ -502,15 +550,7 @@ public class UserPreferences {
String[] selectedSpeeds = null;
// If this preference hasn't been set yet, return the default options
if (valueFromPrefs == null) {
- String[] allSpeeds = context.getResources().getStringArray(R.array.playback_speed_values);
- List<String> speedList = new ArrayList<>();
- for (String speedStr : allSpeeds) {
- float speed = Float.parseFloat(speedStr);
- if (speed < 2.0001 && speed * 10 % 1 == 0) {
- speedList.add(speedStr);
- }
- }
- selectedSpeeds = speedList.toArray(new String[speedList.size()]);
+ selectedSpeeds = new String[] { "1.00", "1.25", "1.50", "1.75", "2.00" };
} else {
try {
JSONArray jsonArray = new JSONArray(valueFromPrefs);
@@ -548,7 +588,7 @@ public class UserPreferences {
public static EpisodeCleanupAlgorithm getEpisodeCleanupAlgorithm() {
- int cleanupValue = Integer.valueOf(prefs.getString(PREF_EPISODE_CLEANUP, "-1"));
+ int cleanupValue = Integer.parseInt(prefs.getString(PREF_EPISODE_CLEANUP, "-1"));
if (cleanupValue == EPISODE_CLEANUP_QUEUE) {
return new APQueueCleanupAlgorithm();
} else if (cleanupValue == EPISODE_CLEANUP_NULL) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java
index ce5004a98..33c15883b 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/AlarmUpdateReceiver.java
@@ -6,7 +6,7 @@ import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
-import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
+import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.preferences.UserPreferences;
/** Listens for events that make it necessary to reset the update alarm. */
@@ -22,8 +22,7 @@ public class AlarmUpdateReceiver extends BroadcastReceiver {
} else if (TextUtils.equals(intent.getAction(), Intent.ACTION_PACKAGE_REPLACED)) {
Log.d(TAG, "Resetting update alarm after app upgrade");
}
- PlaybackPreferences.init(context);
- UserPreferences.init(context);
+ ClientConfig.initialize(context);
UserPreferences.restartUpdateAlarm(false);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java
index b959c7301..e0abe0efb 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/FeedUpdateReceiver.java
@@ -5,6 +5,7 @@ import android.content.Context;
import android.content.Intent;
import android.util.Log;
+import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.storage.DBTasks;
import de.danoeh.antennapod.core.util.NetworkUtils;
@@ -19,6 +20,7 @@ public class FeedUpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Received intent");
+ ClientConfig.initialize(context);
if (NetworkUtils.isDownloadAllowed()) {
DBTasks.refreshAllFeeds(context, null);
} else {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java
index a900248d2..51cc52e10 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/receiver/MediaButtonReceiver.java
@@ -5,7 +5,8 @@ import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.KeyEvent;
-import de.danoeh.antennapod.core.BuildConfig;
+
+import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
/** Receives media button events. */
@@ -17,10 +18,10 @@ public class MediaButtonReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
- if (BuildConfig.DEBUG) Log.d(TAG, "Received intent");
- KeyEvent event = (KeyEvent) intent.getExtras().get(
- Intent.EXTRA_KEY_EVENT);
+ Log.d(TAG, "Received intent");
+ KeyEvent event = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ ClientConfig.initialize(context);
Intent serviceIntent = new Intent(context, PlaybackService.class);
int keycode = event.getKeyCode();
serviceIntent.putExtra(EXTRA_KEYCODE, keycode);
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 0b90cef6c..d939c1007 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
@@ -13,7 +13,6 @@ import android.util.Log;
import android.util.Pair;
import java.util.Collection;
-import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -175,7 +174,7 @@ public class GpodnetSyncService extends Service {
for (String downloadUrl : changes.getAdded()) {
if (false == localSubscriptions.contains(downloadUrl) &&
false == localRemoved.contains(downloadUrl)) {
- Feed feed = new Feed(downloadUrl, new Date(0));
+ Feed feed = new Feed(downloadUrl, null);
DownloadRequester.getInstance().downloadFeed(this, feed);
}
}
@@ -315,6 +314,7 @@ public class GpodnetSyncService extends Service {
.setContentIntent(activityIntent)
.setSmallIcon(R.drawable.stat_notify_sync_error)
.setAutoCancel(true)
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
.build();
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(id, notification);
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 b23819ef7..5dd1e2dfa 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
@@ -2,8 +2,10 @@ package de.danoeh.antennapod.core.service.download;
import android.os.Build;
import android.support.annotation.NonNull;
+import android.text.TextUtils;
import android.util.Log;
+import com.squareup.okhttp.Credentials;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
@@ -14,7 +16,10 @@ import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.HttpURLConnection;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
import java.net.Socket;
+import java.net.SocketAddress;
import java.net.URL;
import java.security.GeneralSecurityException;
import java.util.concurrent.TimeUnit;
@@ -23,6 +28,7 @@ import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
+import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.storage.DBWriter;
/**
@@ -44,12 +50,15 @@ public class AntennapodHttpClient {
*/
public static synchronized OkHttpClient getHttpClient() {
if (httpClient == null) {
-
httpClient = newHttpClient();
}
return httpClient;
}
+ public static synchronized void reinit() {
+ httpClient = newHttpClient();
+ }
+
/**
* Creates a new HTTP client. Most users should just use
* getHttpClient() to get the standard AntennaPod client,
@@ -69,13 +78,13 @@ public class AntennapodHttpClient {
client.networkInterceptors().add(chain -> {
Request request = chain.request();
Response response = chain.proceed(request);
- if(response.code() == HttpURLConnection.HTTP_MOVED_PERM ||
+ if (response.code() == HttpURLConnection.HTTP_MOVED_PERM ||
response.code() == StatusLine.HTTP_PERM_REDIRECT) {
String location = response.header("Location");
- if(location.startsWith("/")) { // URL is not absolute, but relative
+ if (location.startsWith("/")) { // URL is not absolute, but relative
URL url = request.url();
location = url.getProtocol() + "://" + url.getHost() + location;
- } else if(!location.toLowerCase().startsWith("http://") &&
+ } else if (!location.toLowerCase().startsWith("http://") &&
!location.toLowerCase().startsWith("https://")) {
// Reference is relative to current path
URL url = request.url();
@@ -106,6 +115,21 @@ public class AntennapodHttpClient {
client.setFollowRedirects(true);
client.setFollowSslRedirects(true);
+ ProxyConfig config = UserPreferences.getProxyConfig();
+ if (config.type != Proxy.Type.DIRECT) {
+ int port = config.port > 0 ? config.port : ProxyConfig.DEFAULT_PORT;
+ SocketAddress address = InetSocketAddress.createUnresolved(config.host, port);
+ Proxy proxy = new Proxy(config.type, address);
+ client.setProxy(proxy);
+ if (!TextUtils.isEmpty(config.username)) {
+ String credentials = Credentials.basic(config.username, config.password);
+ client.interceptors().add(chain -> {
+ Request request = chain.request().newBuilder()
+ .header("Proxy-Authorization", credentials).build();
+ return chain.proceed(request);
+ });
+ }
+ }
if(16 <= Build.VERSION.SDK_INT && Build.VERSION.SDK_INT < 21) {
client.setSslSocketFactory(new CustomSslSocketFactory());
}
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 bc3006eea..de91916a9 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
@@ -4,6 +4,7 @@ import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import de.danoeh.antennapod.core.feed.FeedFile;
import de.danoeh.antennapod.core.util.URLChecker;
@@ -15,7 +16,7 @@ public class DownloadRequest implements Parcelable {
private final String title;
private String username;
private String password;
- private long ifModifiedSince;
+ private String lastModified;
private boolean deleteOnFailure;
private final long feedfileId;
private final int feedfileType;
@@ -60,7 +61,7 @@ public class DownloadRequest implements Parcelable {
this.feedfileType = builder.feedfileType;
this.username = builder.username;
this.password = builder.password;
- this.ifModifiedSince = builder.ifModifiedSince;
+ this.lastModified = builder.lastModified;
this.deleteOnFailure = builder.deleteOnFailure;
this.arguments = (builder.arguments != null) ? builder.arguments : new Bundle();
}
@@ -71,7 +72,7 @@ public class DownloadRequest implements Parcelable {
title = in.readString();
feedfileId = in.readLong();
feedfileType = in.readInt();
- ifModifiedSince = in.readLong();
+ lastModified = in.readString();
deleteOnFailure = (in.readByte() > 0);
arguments = in.readBundle();
if (in.dataAvail() > 0) {
@@ -98,7 +99,7 @@ public class DownloadRequest implements Parcelable {
dest.writeString(title);
dest.writeLong(feedfileId);
dest.writeInt(feedfileType);
- dest.writeLong(ifModifiedSince);
+ dest.writeString(lastModified);
dest.writeByte((deleteOnFailure) ? (byte) 1 : 0);
dest.writeBundle(arguments);
if (username != null) {
@@ -127,7 +128,8 @@ public class DownloadRequest implements Parcelable {
DownloadRequest that = (DownloadRequest) o;
- if (ifModifiedSince != that.ifModifiedSince) return false;
+ if (lastModified != null ? !lastModified.equals(that.lastModified) : that.lastModified != null)
+ return false;
if (deleteOnFailure != that.deleteOnFailure) return false;
if (feedfileId != that.feedfileId) return false;
if (feedfileType != that.feedfileType) return false;
@@ -143,7 +145,6 @@ public class DownloadRequest implements Parcelable {
if (title != null ? !title.equals(that.title) : that.title != null) return false;
if (username != null ? !username.equals(that.username) : that.username != null)
return false;
-
return true;
}
@@ -154,7 +155,7 @@ public class DownloadRequest implements Parcelable {
result = 31 * result + (title != null ? title.hashCode() : 0);
result = 31 * result + (username != null ? username.hashCode() : 0);
result = 31 * result + (password != null ? password.hashCode() : 0);
- result = 31 * result + (int)ifModifiedSince;
+ result = 31 * result + (lastModified != null ? lastModified.hashCode() : 0);
result = 31 * result + (deleteOnFailure ? 1 : 0);
result = 31 * result + (int) (feedfileId ^ (feedfileId >>> 32));
result = 31 * result + feedfileType;
@@ -234,13 +235,14 @@ public class DownloadRequest implements Parcelable {
this.password = password;
}
- public DownloadRequest setIfModifiedSince(long time) {
- this.ifModifiedSince = time;
+ public DownloadRequest setLastModified(@Nullable String lastModified) {
+ this.lastModified = lastModified;
return this;
}
- public long getIfModifiedSince() {
- return this.ifModifiedSince;
+ @Nullable
+ public String getLastModified() {
+ return lastModified;
}
public boolean isDeleteOnFailure() {
@@ -257,7 +259,7 @@ public class DownloadRequest implements Parcelable {
private String title;
private String username;
private String password;
- private long ifModifiedSince;
+ private String lastModified;
private boolean deleteOnFailure = false;
private long feedfileId;
private int feedfileType;
@@ -276,8 +278,8 @@ public class DownloadRequest implements Parcelable {
return this;
}
- public Builder ifModifiedSince(long time) {
- this.ifModifiedSince = time;
+ public Builder lastModified(String lastModified) {
+ this.lastModified = lastModified;
return this;
}
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 d69228ceb..3f0112b56 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
@@ -41,11 +41,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
@@ -72,6 +69,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequester;
import de.danoeh.antennapod.core.syndication.handler.FeedHandler;
import de.danoeh.antennapod.core.syndication.handler.FeedHandlerResult;
import de.danoeh.antennapod.core.syndication.handler.UnsupportedFeedtypeException;
+import de.danoeh.antennapod.core.util.ChapterUtils;
import de.danoeh.antennapod.core.util.DownloadError;
import de.danoeh.antennapod.core.util.InvalidFeedException;
import de.greenrobot.event.EventBus;
@@ -187,7 +185,7 @@ public class DownloadService extends Service {
if (status.getReason() == DownloadError.ERROR_UNAUTHORIZED) {
postAuthenticationNotification(downloader.getDownloadRequest());
} else if (status.getReason() == DownloadError.ERROR_HTTP_DATA_ERROR
- && Integer.valueOf(status.getReasonDetailed()) == 416) {
+ && Integer.parseInt(status.getReasonDetailed()) == 416) {
Log.d(TAG, "Requested invalid range, restarting download from the beginning");
FileUtils.deleteQuietly(new File(downloader.getDownloadRequest().getDestination()));
@@ -251,54 +249,35 @@ public class DownloadService extends Service {
Log.d(TAG, "Service started");
isRunning = true;
handler = new Handler();
- reportQueue = Collections.synchronizedList(new ArrayList<DownloadStatus>());
- downloads = Collections.synchronizedList(new ArrayList<Downloader>());
+ reportQueue = Collections.synchronizedList(new ArrayList<>());
+ downloads = Collections.synchronizedList(new ArrayList<>());
numberOfDownloads = new AtomicInteger(0);
IntentFilter cancelDownloadReceiverFilter = new IntentFilter();
cancelDownloadReceiverFilter.addAction(ACTION_CANCEL_ALL_DOWNLOADS);
cancelDownloadReceiverFilter.addAction(ACTION_CANCEL_DOWNLOAD);
registerReceiver(cancelDownloadReceiver, cancelDownloadReceiverFilter);
- syncExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
-
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setPriority(Thread.MIN_PRIORITY);
- return t;
- }
+ syncExecutor = Executors.newSingleThreadExecutor(r -> {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.MIN_PRIORITY);
+ return t;
});
Log.d(TAG, "parallel downloads: " + UserPreferences.getParallelDownloads());
- downloadExecutor = new ExecutorCompletionService<Downloader>(
+ downloadExecutor = new ExecutorCompletionService<>(
Executors.newFixedThreadPool(UserPreferences.getParallelDownloads(),
- new ThreadFactory() {
-
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setPriority(Thread.MIN_PRIORITY);
- return t;
- }
+ r -> {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.MIN_PRIORITY);
+ return t;
}
)
);
schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOL_SIZE,
- new ThreadFactory() {
-
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setPriority(Thread.MIN_PRIORITY);
- return t;
- }
- }, new RejectedExecutionHandler() {
-
- @Override
- public void rejectedExecution(Runnable r,
- ThreadPoolExecutor executor) {
- Log.w(TAG, "SchedEx rejected submission of new task");
- }
- }
+ r -> {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.MIN_PRIORITY);
+ return t;
+ }, (r, executor) -> Log.w(TAG, "SchedEx rejected submission of new task")
);
downloadCompletionThread.start();
feedSyncThread = new FeedSyncThread();
@@ -349,7 +328,9 @@ public class DownloadService extends Service {
.setOngoing(true)
.setContentIntent(ClientConfig.downloadServiceCallbacks.getNotificationContentIntent(this))
.setLargeIcon(icon)
- .setSmallIcon(R.drawable.stat_notify_sync);
+ .setSmallIcon(R.drawable.stat_notify_sync)
+ .setVisibility(Notification.VISIBILITY_PUBLIC);
+
Log.d(TAG, "Notification set up");
}
@@ -380,16 +361,16 @@ public class DownloadService extends Service {
if (i > 0) {
bigText.append("\n");
}
- bigText.append("\u2022 " + request.getTitle());
+ bigText.append("\u2022 ").append(request.getTitle());
}
} else if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
if (request.getTitle() != null) {
if (i > 0) {
bigText.append("\n");
}
- bigText.append("\u2022 " + request.getTitle()
- + " (" + request.getProgressPercent()
- + "%)");
+ bigText.append("\u2022 ").append(request.getTitle())
+ .append(" (").append(request.getProgressPercent())
+ .append("%)");
}
}
@@ -486,16 +467,13 @@ public class DownloadService extends Service {
* DownloadService list.
*/
private void removeDownload(final Downloader d) {
- handler.post(new Runnable() {
- @Override
- public void run() {
- Log.d(TAG, "Removing downloader: "
- + d.getDownloadRequest().getSource());
- boolean rc = downloads.remove(d);
- Log.d(TAG, "Result of downloads.remove: " + rc);
- DownloadRequester.getInstance().removeDownload(d.getDownloadRequest());
- postDownloaders();
- }
+ handler.post(() -> {
+ Log.d(TAG, "Removing downloader: "
+ + d.getDownloadRequest().getSource());
+ boolean rc = downloads.remove(d);
+ Log.d(TAG, "Result of downloads.remove: " + rc);
+ DownloadRequester.getInstance().removeDownload(d.getDownloadRequest());
+ postDownloaders();
});
}
@@ -555,7 +533,9 @@ public class DownloadService extends Service {
.setContentIntent(
ClientConfig.downloadServiceCallbacks.getReportNotificationContentIntent(this)
)
- .setAutoCancel(true).build();
+ .setAutoCancel(true)
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .build();
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(REPORT_ID, notification);
} else {
@@ -569,12 +549,7 @@ public class DownloadService extends Service {
* used from a thread other than the main thread.
*/
void queryDownloadsAsync() {
- handler.post(new Runnable() {
- public void run() {
- queryDownloads();
- ;
- }
- });
+ handler.post(DownloadService.this::queryDownloads);
}
/**
@@ -593,26 +568,24 @@ public class DownloadService extends Service {
}
private void postAuthenticationNotification(final DownloadRequest downloadRequest) {
- handler.post(new Runnable() {
- @Override
- public void run() {
- final String resourceTitle = (downloadRequest.getTitle() != null)
- ? downloadRequest.getTitle() : downloadRequest.getSource();
-
- NotificationCompat.Builder builder = new NotificationCompat.Builder(DownloadService.this);
- builder.setTicker(getText(R.string.authentication_notification_title))
- .setContentTitle(getText(R.string.authentication_notification_title))
- .setContentText(getText(R.string.authentication_notification_msg))
- .setStyle(new NotificationCompat.BigTextStyle().bigText(getText(R.string.authentication_notification_msg)
- + ": " + resourceTitle))
- .setSmallIcon(R.drawable.ic_stat_authentication)
- .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_stat_authentication))
- .setAutoCancel(true)
- .setContentIntent(ClientConfig.downloadServiceCallbacks.getAuthentificationNotificationContentIntent(DownloadService.this, downloadRequest));
- Notification n = builder.build();
- NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- nm.notify(downloadRequest.getSource().hashCode(), n);
- }
+ handler.post(() -> {
+ final String resourceTitle = (downloadRequest.getTitle() != null)
+ ? downloadRequest.getTitle() : downloadRequest.getSource();
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(DownloadService.this);
+ builder.setTicker(getText(R.string.authentication_notification_title))
+ .setContentTitle(getText(R.string.authentication_notification_title))
+ .setContentText(getText(R.string.authentication_notification_msg))
+ .setStyle(new NotificationCompat.BigTextStyle().bigText(getText(R.string.authentication_notification_msg)
+ + ": " + resourceTitle))
+ .setSmallIcon(R.drawable.ic_stat_authentication)
+ .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_stat_authentication))
+ .setAutoCancel(true)
+ .setContentIntent(ClientConfig.downloadServiceCallbacks.getAuthentificationNotificationContentIntent(DownloadService.this, downloadRequest))
+ .setVisibility(Notification.VISIBILITY_PUBLIC);
+ Notification n = builder.build();
+ NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ nm.notify(downloadRequest.getSource().hashCode(), n);
});
}
@@ -645,8 +618,8 @@ public class DownloadService extends Service {
class FeedSyncThread extends Thread {
private static final String TAG = "FeedSyncThread";
- private BlockingQueue<DownloadRequest> completedRequests = new LinkedBlockingDeque<DownloadRequest>();
- private CompletionService<Pair<DownloadRequest, FeedHandlerResult>> parserService = new ExecutorCompletionService<Pair<DownloadRequest, FeedHandlerResult>>(Executors.newSingleThreadExecutor());
+ private BlockingQueue<DownloadRequest> completedRequests = new LinkedBlockingDeque<>();
+ private CompletionService<Pair<DownloadRequest, FeedHandlerResult>> parserService = new ExecutorCompletionService<>(Executors.newSingleThreadExecutor());
private ExecutorService dbService = Executors.newSingleThreadExecutor();
private Future<?> dbUpdateFuture;
private volatile boolean isActive = true;
@@ -662,7 +635,7 @@ public class DownloadService extends Service {
* @return Collected feeds or null if the method has been interrupted during the first waiting period.
*/
private List<Pair<DownloadRequest, FeedHandlerResult>> collectCompletedRequests() {
- List<Pair<DownloadRequest, FeedHandlerResult>> results = new LinkedList<Pair<DownloadRequest, FeedHandlerResult>>();
+ List<Pair<DownloadRequest, FeedHandlerResult>> results = new LinkedList<>();
DownloadRequester requester = DownloadRequester.getInstance();
int tasks = 0;
@@ -706,11 +679,9 @@ public class DownloadService extends Service {
if (result != null) {
results.add(result);
}
- } catch (InterruptedException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
}
}
@@ -745,41 +716,36 @@ public class DownloadService extends Service {
if (dbUpdateFuture != null) {
try {
dbUpdateFuture.get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
- dbUpdateFuture = dbService.submit(new Runnable() {
- @Override
- public void run() {
- Feed[] savedFeeds = DBTasks.updateFeed(DownloadService.this, getFeeds(results));
-
- for (int i = 0; i < savedFeeds.length; i++) {
- Feed savedFeed = savedFeeds[i];
-
- // If loadAllPages=true, check if another page is available and queue it for download
- final boolean loadAllPages = results.get(i).first.getArguments().getBoolean(DownloadRequester.REQUEST_ARG_LOAD_ALL_PAGES);
- final Feed feed = results.get(i).second.feed;
- if (loadAllPages && feed.getNextPageLink() != null) {
- try {
- feed.setId(savedFeed.getId());
- DBTasks.loadNextPageOfFeed(DownloadService.this, savedFeed, true);
- } catch (DownloadRequestException e) {
- Log.e(TAG, "Error trying to load next page", e);
- }
+ dbUpdateFuture = dbService.submit(() -> {
+ Feed[] savedFeeds = DBTasks.updateFeed(DownloadService.this, getFeeds(results));
+
+ for (int i = 0; i < savedFeeds.length; i++) {
+ Feed savedFeed = savedFeeds[i];
+
+ // If loadAllPages=true, check if another page is available and queue it for download
+ final boolean loadAllPages = results.get(i).first.getArguments().getBoolean(DownloadRequester.REQUEST_ARG_LOAD_ALL_PAGES);
+ final Feed feed = results.get(i).second.feed;
+ if (loadAllPages && feed.getNextPageLink() != null) {
+ try {
+ feed.setId(savedFeed.getId());
+ DBTasks.loadNextPageOfFeed(DownloadService.this, savedFeed, true);
+ } catch (DownloadRequestException e) {
+ Log.e(TAG, "Error trying to load next page", e);
}
-
- ClientConfig.downloadServiceCallbacks.onFeedParsed(DownloadService.this,
- savedFeed);
-
- numberOfDownloads.decrementAndGet();
}
- queryDownloadsAsync();
+ ClientConfig.downloadServiceCallbacks.onFeedParsed(DownloadService.this,
+ savedFeed);
+
+ numberOfDownloads.decrementAndGet();
}
+
+ queryDownloadsAsync();
});
}
@@ -824,7 +790,7 @@ public class DownloadService extends Service {
}
private Pair<DownloadRequest, FeedHandlerResult> parseFeed(DownloadRequest request) {
- Feed feed = new Feed(request.getSource(), new Date());
+ Feed feed = new Feed(request.getSource(), request.getLastModified());
feed.setFile_url(request.getDestination());
feed.setId(request.getFeedfileId());
feed.setDownloaded(true);
@@ -841,21 +807,11 @@ public class DownloadService extends Service {
try {
result = feedHandler.parseFeed(feed);
Log.d(TAG, feed.getTitle() + " parsed");
- if (checkFeedData(feed) == false) {
+ if (!checkFeedData(feed)) {
throw new InvalidFeedException();
}
- } catch (SAXException e) {
- successful = false;
- e.printStackTrace();
- reason = DownloadError.ERROR_PARSER_EXCEPTION;
- reasonDetailed = e.getMessage();
- } catch (IOException e) {
- successful = false;
- e.printStackTrace();
- reason = DownloadError.ERROR_PARSER_EXCEPTION;
- reasonDetailed = e.getMessage();
- } catch (ParserConfigurationException e) {
+ } catch (SAXException | IOException | ParserConfigurationException e) {
successful = false;
e.printStackTrace();
reason = DownloadError.ERROR_PARSER_EXCEPTION;
@@ -878,7 +834,7 @@ public class DownloadService extends Service {
if (successful) {
// we create a 'successful' download log if the feed's last refresh failed
List<DownloadStatus> log = DBReader.getFeedDownloadLog(feed);
- if(log.size() > 0 && log.get(0).isSuccessful() == false) {
+ if(log.size() > 0 && !log.get(0).isSuccessful()) {
saveDownloadStatus(new DownloadStatus(feed,
feed.getHumanReadableIdentifier(), DownloadError.SUCCESS, successful,
reasonDetailed));
@@ -1011,9 +967,7 @@ public class DownloadService extends Service {
media.setFile_url(request.getDestination());
try {
DBWriter.setFeedMedia(media).get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
@@ -1046,6 +1000,9 @@ public class DownloadService extends Service {
media.setFile_url(request.getDestination());
media.setHasEmbeddedPicture(null);
+ // check if file has chapters
+ ChapterUtils.loadChaptersFromFileUrl(media);
+
// Get duration
MediaMetadataRetriever mmr = null;
try {
@@ -1078,10 +1035,7 @@ public class DownloadService extends Service {
if (item != null && !DBTasks.isInQueue(DownloadService.this, item.getId())) {
DBWriter.addQueueItem(DownloadService.this, item).get();
}
- } catch (ExecutionException e) {
- e.printStackTrace();
- status = new DownloadStatus(media, media.getEpisodeTitle(), DownloadError.ERROR_DB_ACCESS_ERROR, false, e.getMessage());
- } catch (InterruptedException e) {
+ } catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
status = new DownloadStatus(media, media.getEpisodeTitle(), DownloadError.ERROR_DB_ACCESS_ERROR, false, e.getMessage());
}
@@ -1125,14 +1079,11 @@ public class DownloadService extends Service {
private class NotificationUpdater implements Runnable {
public void run() {
- handler.post(new Runnable() {
- @Override
- public void run() {
- Notification n = updateNotifications();
- if (n != null) {
- NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- nm.notify(NOTIFICATION_ID, n);
- }
+ handler.post(() -> {
+ Notification n = updateNotifications();
+ if (n != null) {
+ NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ nm.notify(NOTIFICATION_ID, n);
}
});
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java
index 2d9347b0a..b0829f084 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloaderCallback.java
@@ -6,5 +6,5 @@ package de.danoeh.antennapod.core.service.download;
*/
public interface DownloaderCallback {
- public void onDownloadCompleted(Downloader downloader);
+ void onDownloadCompleted(Downloader downloader);
}
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 0b9fba6f7..f79cf9685 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
@@ -8,7 +8,6 @@ import com.squareup.okhttp.Protocol;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ResponseBody;
-import com.squareup.okhttp.internal.http.HttpDate;
import org.apache.commons.io.IOUtils;
@@ -22,12 +21,14 @@ import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.UnknownHostException;
-import java.util.Arrays;
+import java.util.Collections;
import java.util.Date;
import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.feed.FeedImage;
+import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.core.util.DateUtils;
import de.danoeh.antennapod.core.util.DownloadError;
import de.danoeh.antennapod.core.util.StorageUtils;
import de.danoeh.antennapod.core.util.URIUtil;
@@ -67,13 +68,24 @@ public class HttpDownloader extends Downloader {
final URI uri = URIUtil.getURIFromRequestUrl(request.getSource());
Request.Builder httpReq = new Request.Builder().url(uri.toURL())
.header("User-Agent", ClientConfig.USER_AGENT);
- if(request.getIfModifiedSince() > 0) {
- long threeDaysAgo = System.currentTimeMillis() - 1000*60*60*24*3;
- if(request.getIfModifiedSince() > threeDaysAgo) {
- Date date = new Date(request.getIfModifiedSince());
- String httpDate = HttpDate.format(date);
- Log.d(TAG, "addHeader(\"If-Modified-Since\", \"" + httpDate + "\")");
- httpReq.addHeader("If-Modified-Since", httpDate);
+ if(request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
+ // set header explicitly so that okhttp doesn't do transparent gzip
+ Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")");
+ httpReq.addHeader("Accept-Encoding", "identity");
+ }
+
+ if(!TextUtils.isEmpty(request.getLastModified())) {
+ String lastModified = request.getLastModified();
+ Date lastModifiedDate = DateUtils.parse(lastModified);
+ if(lastModifiedDate != null) {
+ long threeDaysAgo = System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 3;
+ if (lastModifiedDate.getTime() > threeDaysAgo) {
+ Log.d(TAG, "addHeader(\"If-Modified-Since\", \"" + lastModified + "\")");
+ httpReq.addHeader("If-Modified-Since", lastModified);
+ }
+ } else {
+ Log.d(TAG, "addHeader(\"If-None-Match\", \"" + lastModified + "\")");
+ httpReq.addHeader("If-None-Match", lastModified);
}
}
@@ -98,19 +110,28 @@ public class HttpDownloader extends Downloader {
Log.d(TAG, "Adding range header: " + request.getSoFar());
}
- Response response = null;
+ Response response;
try {
response = httpClient.newCall(httpReq.build()).execute();
} catch(IOException e) {
Log.e(TAG, e.toString());
if(e.getMessage().contains("PROTOCOL_ERROR")) {
- httpClient.setProtocols(Arrays.asList(Protocol.HTTP_1_1));
+ httpClient.setProtocols(Collections.singletonList(Protocol.HTTP_1_1));
response = httpClient.newCall(httpReq.build()).execute();
}
else {
throw e;
}
}
+
+ if(request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
+ String contentType = response.header("Content-Type");
+ if(!contentType.startsWith("audio/") && !contentType.startsWith("video/")) {
+ onFail(DownloadError.ERROR_FILE_TYPE, null);
+ return;
+ }
+ }
+
responseBody = response.body();
String contentEncodingHeader = response.header("Content-Encoding");
boolean isGzip = false;
@@ -174,7 +195,7 @@ public class HttpDownloader extends Downloader {
&& !TextUtils.isEmpty(contentRangeHeader)) {
String start = contentRangeHeader.substring("bytes ".length(),
contentRangeHeader.indexOf("-"));
- request.setSoFar(Long.valueOf(start));
+ request.setSoFar(Long.parseLong(start));
Log.d(TAG, "Starting download at position " + request.getSoFar());
out = new RandomAccessFile(destination, "rw");
@@ -235,6 +256,12 @@ public class HttpDownloader extends Downloader {
onFail(DownloadError.ERROR_IO_ERROR, "Download completed, but nothing was read");
return;
}
+ String lastModified = response.header("Last-Modified");
+ if(lastModified != null) {
+ request.setLastModified(lastModified);
+ } else {
+ request.setLastModified(response.header("ETag"));
+ }
onSuccess();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java
new file mode 100644
index 000000000..6eb1f4118
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/ProxyConfig.java
@@ -0,0 +1,32 @@
+package de.danoeh.antennapod.core.service.download;
+
+import android.support.annotation.Nullable;
+
+import java.net.Proxy;
+
+public class ProxyConfig {
+
+ public final Proxy.Type type;
+ @Nullable public final String host;
+ public final int port;
+ @Nullable public final String username;
+ @Nullable public final String password;
+
+ public final static int DEFAULT_PORT = 8080;
+
+ public static ProxyConfig direct() {
+ return new ProxyConfig(Proxy.Type.DIRECT, null, 0, null, null);
+ }
+
+ public static ProxyConfig http(String host, int port, String username, String password) {
+ return new ProxyConfig(Proxy.Type.HTTP, host, port, username, password);
+ }
+
+ public ProxyConfig(Proxy.Type type, String host, int port, String username, String password) {
+ this.type = type;
+ this.host = host;
+ this.port = port;
+ this.username = username;
+ this.password = password;
+ }
+}
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 2be075a92..729ea9e7a 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
@@ -142,6 +142,11 @@ public class PlaybackService extends Service {
public static final int NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE = 8;
/**
+ * Ability to set the playback speed has changed
+ */
+ public static final int NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED = 9;
+
+ /**
* Returned by getPositionSafe() or getDurationSafe() if the playbackService
* is in an invalid state.
*/
@@ -512,8 +517,11 @@ public class PlaybackService extends Service {
@Override
public void playbackSpeedChanged(float s) {
- sendNotificationBroadcast(
- NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0);
+ sendNotificationBroadcast(NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE, 0);
+ }
+
+ public void setSpeedAbilityChanged() {
+ sendNotificationBroadcast(NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED, 0);
}
@Override
@@ -835,7 +843,7 @@ public class PlaybackService extends Service {
if (!Thread.currentThread().isInterrupted() && started && info.playable != null) {
String contentText = info.playable.getEpisodeTitle();
String contentTitle = info.playable.getFeedTitle();
- Notification notification = null;
+ Notification notification;
// Builder is v7, even if some not overwritten methods return its parent's v4 interface
NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java
index a82e82506..aa51840a7 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java
@@ -25,6 +25,8 @@ import android.view.WindowManager;
import com.bumptech.glide.Glide;
+import org.antennapod.audio.MediaPlayer;
+
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
@@ -99,7 +101,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
this.playerLock = new ReentrantLock();
this.startWhenPrepared = new AtomicBoolean(false);
- executor = new ThreadPoolExecutor(1, 1, 5, TimeUnit.MINUTES, new LinkedBlockingDeque<Runnable>(),
+ executor = new ThreadPoolExecutor(1, 1, 5, TimeUnit.MINUTES, new LinkedBlockingDeque<>(),
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
@@ -175,18 +177,15 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
*/
public void playMediaObject(@NonNull final Playable playable, final boolean stream, final boolean startWhenPrepared, final boolean prepareImmediately) {
Log.d(TAG, "playMediaObject(...)");
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- try {
- playMediaObject(playable, false, stream, startWhenPrepared, prepareImmediately);
- } catch (RuntimeException e) {
- e.printStackTrace();
- throw e;
- } finally {
- playerLock.unlock();
- }
+ executor.submit(() -> {
+ playerLock.lock();
+ try {
+ playMediaObject(playable, false, stream, startWhenPrepared, prepareImmediately);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ throw e;
+ } finally {
+ playerLock.unlock();
}
});
}
@@ -258,24 +257,13 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
}
setPlayerStatus(PlayerStatus.INITIALIZED, media);
- if (mediaType == MediaType.VIDEO) {
- VideoPlayer vp = (VideoPlayer) mediaPlayer;
- // vp.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT);
- }
-
if (prepareImmediately) {
setPlayerStatus(PlayerStatus.PREPARING, media);
mediaPlayer.prepare();
onPrepared(startWhenPrepared);
}
- } catch (Playable.PlayableException e) {
- e.printStackTrace();
- setPlayerStatus(PlayerStatus.ERROR, null);
- } catch (IOException e) {
- e.printStackTrace();
- setPlayerStatus(PlayerStatus.ERROR, null);
- } catch (IllegalStateException e) {
+ } catch (Playable.PlayableException | IOException | IllegalStateException e) {
e.printStackTrace();
setPlayerStatus(PlayerStatus.ERROR, null);
}
@@ -379,58 +367,52 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* file is being streamed
*/
public void pause(final boolean abandonFocus, final boolean reinit) {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- releaseWifiLockIfNecessary();
- if (playerStatus == PlayerStatus.PLAYING) {
- Log.d(TAG, "Pausing playback.");
- mediaPlayer.pause();
- setPlayerStatus(PlayerStatus.PAUSED, media);
-
- if (abandonFocus) {
- audioManager.abandonAudioFocus(audioFocusChangeListener);
- pausedBecauseOfTransientAudiofocusLoss = false;
- }
- if (stream && reinit) {
- reinit();
- }
- } else {
- Log.d(TAG, "Ignoring call to pause: Player is in " + playerStatus + " state");
+ executor.submit(() -> {
+ playerLock.lock();
+ releaseWifiLockIfNecessary();
+ if (playerStatus == PlayerStatus.PLAYING) {
+ Log.d(TAG, "Pausing playback.");
+ mediaPlayer.pause();
+ setPlayerStatus(PlayerStatus.PAUSED, media);
+
+ if (abandonFocus) {
+ audioManager.abandonAudioFocus(audioFocusChangeListener);
+ pausedBecauseOfTransientAudiofocusLoss = false;
}
-
- playerLock.unlock();
+ if (stream && reinit) {
+ reinit();
+ }
+ } else {
+ Log.d(TAG, "Ignoring call to pause: Player is in " + playerStatus + " state");
}
+
+ playerLock.unlock();
});
}
/**
- * Prepared media player for playback if the service is in the INITALIZED
+ * Prepares media player for playback if the service is in the INITALIZED
* state.
* <p/>
* This method is executed on an internal executor service.
*/
public void prepare() {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
-
- if (playerStatus == PlayerStatus.INITIALIZED) {
- Log.d(TAG, "Preparing media player");
- setPlayerStatus(PlayerStatus.PREPARING, media);
- try {
- mediaPlayer.prepare();
- onPrepared(startWhenPrepared.get());
- } catch (IOException e) {
- e.printStackTrace();
- setPlayerStatus(PlayerStatus.ERROR, null);
- }
- }
- playerLock.unlock();
+ executor.submit(() -> {
+ playerLock.lock();
+ if (playerStatus == PlayerStatus.INITIALIZED) {
+ Log.d(TAG, "Preparing media player");
+ setPlayerStatus(PlayerStatus.PREPARING, media);
+ try {
+ mediaPlayer.prepare();
+ onPrepared(startWhenPrepared.get());
+ } catch (IOException e) {
+ e.printStackTrace();
+ setPlayerStatus(PlayerStatus.ERROR, null);
+ }
}
+ playerLock.unlock();
+
});
}
@@ -449,7 +431,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
if (mediaType == MediaType.VIDEO) {
VideoPlayer vp = (VideoPlayer) mediaPlayer;
- videoSize = new Pair<Integer, Integer>(vp.getVideoWidth(), vp.getVideoHeight());
+ videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight());
}
if (media.getPosition() > 0) {
@@ -475,20 +457,17 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* This method is executed on an internal executor service.
*/
public void reinit() {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- releaseWifiLockIfNecessary();
- if (media != null) {
- playMediaObject(media, true, stream, startWhenPrepared.get(), false);
- } else if (mediaPlayer != null) {
- mediaPlayer.reset();
- } else {
- Log.d(TAG, "Call to reinit was ignored: media and mediaPlayer were null");
- }
- playerLock.unlock();
+ executor.submit(() -> {
+ playerLock.lock();
+ releaseWifiLockIfNecessary();
+ if (media != null) {
+ playMediaObject(media, true, stream, startWhenPrepared.get(), false);
+ } else if (mediaPlayer != null) {
+ mediaPlayer.reset();
+ } else {
+ Log.d(TAG, "Call to reinit was ignored: media and mediaPlayer were null");
}
+ playerLock.unlock();
});
}
@@ -542,12 +521,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* This method is executed on an internal executor service.
*/
public void seekTo(final int t) {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- seekToSync(t);
- }
- });
+ executor.submit(() -> seekToSync(t));
}
/**
@@ -556,19 +530,16 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* @param d offset from current position (positive or negative)
*/
public void seekDelta(final int d) {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- int currentPosition = getPosition();
- if (currentPosition != INVALID_TIME) {
- seekToSync(currentPosition + d);
- } else {
- Log.e(TAG, "getPosition() returned INVALID_TIME in seekDelta");
- }
-
- playerLock.unlock();
+ executor.submit(() -> {
+ playerLock.lock();
+ int currentPosition = getPosition();
+ if (currentPosition != INVALID_TIME) {
+ seekToSync(currentPosition + d);
+ } else {
+ Log.e(TAG, "getPosition() returned INVALID_TIME in seekDelta");
}
+
+ playerLock.unlock();
});
}
@@ -604,7 +575,11 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* Returns the position of the current media object or INVALID_TIME if the position could not be retrieved.
*/
public int getPosition() {
- if (!playerLock.tryLock()) {
+ try {
+ if (!playerLock.tryLock(50, TimeUnit.MILLISECONDS)) {
+ return INVALID_TIME;
+ }
+ } catch (InterruptedException e) {
return INVALID_TIME;
}
@@ -614,10 +589,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
|| playerStatus == PlayerStatus.PREPARED
|| playerStatus == PlayerStatus.SEEKING) {
retVal = mediaPlayer.getCurrentPosition();
- if(retVal <= 0 && media != null && media.getPosition() > 0) {
- retVal = media.getPosition();
- }
- } else if (media != null && media.getPosition() > 0) {
+ }
+ if (retVal <= 0 && media != null && media.getPosition() >= 0) {
retVal = media.getPosition();
}
@@ -653,7 +626,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
playerLock.lock();
if (media != null && media.getMediaType() == MediaType.AUDIO) {
if (mediaPlayer.canSetSpeed()) {
- mediaPlayer.setPlaybackSpeed((float) speed);
+ mediaPlayer.setPlaybackSpeed(speed);
Log.d(TAG, "Playback speed was set to " + speed);
callback.playbackSpeedChanged(speed);
}
@@ -666,12 +639,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* This method is executed on an internal executor service.
*/
public void setSpeed(final float speed) {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- setSpeedSync(speed);
- }
- });
+ executor.submit(() -> setSpeedSync(speed));
}
/**
@@ -693,7 +661,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
}
/**
- * Sets the playback speed.
+ * Sets the playback volume.
* This method is executed on an internal executor service.
*/
public void setVolume(final float volumeLeft, float volumeRight) {
@@ -701,7 +669,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
}
/**
- * Sets the playback speed.
+ * Sets the playback volume.
* This method is executed on the caller's thread.
*/
private void setVolumeSync(float volumeLeft, float volumeRight) {
@@ -757,28 +725,22 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
}
public void setVideoSurface(final SurfaceHolder surface) {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- if (mediaPlayer != null) {
- mediaPlayer.setDisplay(surface);
- }
- playerLock.unlock();
+ executor.submit(() -> {
+ playerLock.lock();
+ if (mediaPlayer != null) {
+ mediaPlayer.setDisplay(surface);
}
+ playerLock.unlock();
});
}
public void resetVideoSurface() {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- Log.d(TAG, "Resetting video surface");
- mediaPlayer.setDisplay(null);
- reinit();
- playerLock.unlock();
- }
+ executor.submit(() -> {
+ playerLock.lock();
+ Log.d(TAG, "Resetting video surface");
+ mediaPlayer.setDisplay(null);
+ reinit();
+ playerLock.unlock();
});
}
@@ -799,7 +761,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
res = null;
} else {
VideoPlayer vp = (VideoPlayer) mediaPlayer;
- videoSize = new Pair<Integer, Integer>(vp.getVideoWidth(), vp.getVideoHeight());
+ videoSize = new Pair<>(vp.getVideoWidth(), vp.getVideoHeight());
res = videoSize;
}
playerLock.unlock();
@@ -946,15 +908,16 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
if (pausedBecauseOfTransientAudiofocusLoss) { // we paused => play now
resume();
} else { // we ducked => raise audio level back
- audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
- AudioManager.ADJUST_RAISE, 0);
+ setVolumeSync(UserPreferences.getLeftVolume(),
+ UserPreferences.getRightVolume());
}
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
if (playerStatus == PlayerStatus.PLAYING) {
if (!UserPreferences.shouldPauseForFocusLoss()) {
Log.d(TAG, "Lost audio focus temporarily. Ducking...");
- audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
- AudioManager.ADJUST_LOWER, 0);
+ final float DUCK_FACTOR = 0.25f;
+ setVolumeSync(DUCK_FACTOR * UserPreferences.getLeftVolume(),
+ DUCK_FACTOR * UserPreferences.getRightVolume());
pausedBecauseOfTransientAudiofocusLoss = false;
} else {
Log.d(TAG, "Lost audio focus temporarily. Could duck, but won't, pausing...");
@@ -1004,20 +967,17 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
* abandoning audio focus have to be done with other methods.
*/
public void stop() {
- executor.submit(new Runnable() {
- @Override
- public void run() {
- playerLock.lock();
- releaseWifiLockIfNecessary();
-
- if (playerStatus == PlayerStatus.INDETERMINATE) {
- setPlayerStatus(PlayerStatus.STOPPED, null);
- } else {
- Log.d(TAG, "Ignored call to stop: Current player state is: " + playerStatus);
- }
- playerLock.unlock();
+ executor.submit(() -> {
+ playerLock.lock();
+ releaseWifiLockIfNecessary();
+ if (playerStatus == PlayerStatus.INDETERMINATE) {
+ setPlayerStatus(PlayerStatus.STOPPED, null);
+ } else {
+ Log.d(TAG, "Ignored call to stop: Current player state is: " + playerStatus);
}
+ playerLock.unlock();
+
});
}
@@ -1058,6 +1018,8 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
void playbackSpeedChanged(float s);
+ void setSpeedAbilityChanged();
+
void onBufferingUpdate(int percent);
boolean onMediaPlayerInfo(int code);
@@ -1078,6 +1040,7 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
((AudioPlayer) mp)
.setOnBufferingUpdateListener(audioBufferingUpdateListener);
((AudioPlayer) mp).setOnInfoListener(audioInfoListener);
+ ((AudioPlayer) mp).setOnSpeedAdjustmentAvailableChangedListener(audioSetSpeedAbilityListener);
} else {
((VideoPlayer) mp)
.setOnCompletionListener(videoCompletionListener);
@@ -1092,100 +1055,68 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
return mp;
}
- private final org.antennapod.audio.MediaPlayer.OnCompletionListener audioCompletionListener = new org.antennapod.audio.MediaPlayer.OnCompletionListener() {
- @Override
- public void onCompletion(org.antennapod.audio.MediaPlayer mp) {
- genericOnCompletion();
- }
- };
+ private final MediaPlayer.OnCompletionListener audioCompletionListener =
+ mp -> genericOnCompletion();
- private final android.media.MediaPlayer.OnCompletionListener videoCompletionListener = new android.media.MediaPlayer.OnCompletionListener() {
- @Override
- public void onCompletion(android.media.MediaPlayer mp) {
- genericOnCompletion();
- }
- };
+ private final android.media.MediaPlayer.OnCompletionListener videoCompletionListener =
+ mp -> genericOnCompletion();
private void genericOnCompletion() {
endPlayback(false);
}
- private final org.antennapod.audio.MediaPlayer.OnBufferingUpdateListener audioBufferingUpdateListener = new org.antennapod.audio.MediaPlayer.OnBufferingUpdateListener() {
- @Override
- public void onBufferingUpdate(org.antennapod.audio.MediaPlayer mp,
- int percent) {
- genericOnBufferingUpdate(percent);
- }
- };
+ private final MediaPlayer.OnBufferingUpdateListener audioBufferingUpdateListener =
+ (mp, percent) -> genericOnBufferingUpdate(percent);
- private final android.media.MediaPlayer.OnBufferingUpdateListener videoBufferingUpdateListener = new android.media.MediaPlayer.OnBufferingUpdateListener() {
- @Override
- public void onBufferingUpdate(android.media.MediaPlayer mp, int percent) {
- genericOnBufferingUpdate(percent);
- }
- };
+ private final android.media.MediaPlayer.OnBufferingUpdateListener videoBufferingUpdateListener =
+ (mp, percent) -> genericOnBufferingUpdate(percent);
private void genericOnBufferingUpdate(int percent) {
callback.onBufferingUpdate(percent);
}
- private final org.antennapod.audio.MediaPlayer.OnInfoListener audioInfoListener = new org.antennapod.audio.MediaPlayer.OnInfoListener() {
- @Override
- public boolean onInfo(org.antennapod.audio.MediaPlayer mp, int what,
- int extra) {
- return genericInfoListener(what);
- }
- };
+ private final MediaPlayer.OnInfoListener audioInfoListener =
+ (mp, what, extra) -> genericInfoListener(what);
- private final android.media.MediaPlayer.OnInfoListener videoInfoListener = new android.media.MediaPlayer.OnInfoListener() {
- @Override
- public boolean onInfo(android.media.MediaPlayer mp, int what, int extra) {
- return genericInfoListener(what);
- }
- };
+ private final android.media.MediaPlayer.OnInfoListener videoInfoListener =
+ (mp, what, extra) -> genericInfoListener(what);
private boolean genericInfoListener(int what) {
return callback.onMediaPlayerInfo(what);
}
- private final org.antennapod.audio.MediaPlayer.OnErrorListener audioErrorListener = new org.antennapod.audio.MediaPlayer.OnErrorListener() {
+ private final MediaPlayer.OnSpeedAdjustmentAvailableChangedListener
+ audioSetSpeedAbilityListener = new MediaPlayer.OnSpeedAdjustmentAvailableChangedListener() {
@Override
- public boolean onError(org.antennapod.audio.MediaPlayer mp, int what, int extra) {
- if(mp.canFallback()) {
- mp.fallback();
- return true;
- } else {
- return genericOnError(mp, what, extra);
- }
+ public void onSpeedAdjustmentAvailableChanged(MediaPlayer arg0, boolean speedAdjustmentAvailable) {
+ callback.setSpeedAbilityChanged();
}
};
- private final android.media.MediaPlayer.OnErrorListener videoErrorListener = new android.media.MediaPlayer.OnErrorListener() {
- @Override
- public boolean onError(android.media.MediaPlayer mp, int what, int extra) {
- return genericOnError(mp, what, extra);
- }
- };
+
+ private final MediaPlayer.OnErrorListener audioErrorListener =
+ (mp, what, extra) -> {
+ if(mp.canFallback()) {
+ mp.fallback();
+ return true;
+ } else {
+ return genericOnError(mp, what, extra);
+ }
+ };
+
+ private final android.media.MediaPlayer.OnErrorListener videoErrorListener = this::genericOnError;
private boolean genericOnError(Object inObj, int what, int extra) {
return callback.onMediaPlayerError(inObj, what, extra);
}
- private final org.antennapod.audio.MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener = new org.antennapod.audio.MediaPlayer.OnSeekCompleteListener() {
- @Override
- public void onSeekComplete(org.antennapod.audio.MediaPlayer mp) {
- genericSeekCompleteListener();
- }
- };
+ private final MediaPlayer.OnSeekCompleteListener audioSeekCompleteListener =
+ mp -> genericSeekCompleteListener();
- private final android.media.MediaPlayer.OnSeekCompleteListener videoSeekCompleteListener = new android.media.MediaPlayer.OnSeekCompleteListener() {
- @Override
- public void onSeekComplete(android.media.MediaPlayer mp) {
- genericSeekCompleteListener();
- }
- };
+ private final android.media.MediaPlayer.OnSeekCompleteListener videoSeekCompleteListener =
+ mp -> genericSeekCompleteListener();
- private final void genericSeekCompleteListener() {
+ private void genericSeekCompleteListener() {
Thread t = new Thread(() -> {
Log.d(TAG, "genericSeekCompleteListener");
if(seekLatch != null) {
@@ -1205,6 +1136,71 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
private static final String TAG = "MediaSessionCompat";
@Override
+ public void onPlay() {
+ Log.d(TAG, "onPlay()");
+ if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) {
+ resume();
+ } else if (playerStatus == PlayerStatus.INITIALIZED) {
+ setStartWhenPrepared(true);
+ prepare();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ Log.d(TAG, "onPause()");
+ if (playerStatus == PlayerStatus.PLAYING) {
+ pause(false, true);
+ }
+ if (UserPreferences.isPersistNotify()) {
+ pause(false, true);
+ } else {
+ pause(true, true);
+ }
+ }
+
+ @Override
+ public void onStop() {
+ Log.d(TAG, "onStop()");
+ stop();
+ }
+
+ @Override
+ public void onSkipToPrevious() {
+ Log.d(TAG, "onSkipToPrevious()");
+ seekDelta(-UserPreferences.getRewindSecs() * 1000);
+ }
+
+ @Override
+ public void onRewind() {
+ Log.d(TAG, "onRewind()");
+ seekDelta(-UserPreferences.getRewindSecs() * 1000);
+ }
+
+ @Override
+ public void onFastForward() {
+ Log.d(TAG, "onFastForward()");
+ seekDelta(UserPreferences.getFastFowardSecs() * 1000);
+ }
+
+ @Override
+ public void onSkipToNext() {
+ Log.d(TAG, "onSkipToNext()");
+ if(UserPreferences.shouldHardwareButtonSkip()) {
+ endPlayback(true);
+ } else {
+ seekDelta(UserPreferences.getFastFowardSecs() * 1000);
+ }
+ }
+
+
+ @Override
+ public void onSeekTo(long pos) {
+ Log.d(TAG, "onSeekTo()");
+ seekTo((int) pos);
+ }
+
+ @Override
public boolean onMediaButtonEvent(final Intent mediaButton) {
Log.d(TAG, "onMediaButtonEvent(" + mediaButton + ")");
if (mediaButton != null) {
@@ -1240,42 +1236,27 @@ public class PlaybackServiceMediaPlayer implements SharedPreferences.OnSharedPre
return true;
}
case KeyEvent.KEYCODE_MEDIA_PLAY: {
- Log.d(TAG, "Received Play event from RemoteControlClient");
- if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) {
- resume();
- } else if (playerStatus == PlayerStatus.INITIALIZED) {
- setStartWhenPrepared(true);
- prepare();
- }
+ sessionCallback.onPlay();
return true;
}
case KeyEvent.KEYCODE_MEDIA_PAUSE: {
- Log.d(TAG, "Received Pause event from RemoteControlClient");
- if (playerStatus == PlayerStatus.PLAYING) {
- pause(false, true);
- }
- if (UserPreferences.isPersistNotify()) {
- pause(false, true);
- } else {
- pause(true, true);
- }
+ sessionCallback.onPause();
return true;
}
case KeyEvent.KEYCODE_MEDIA_STOP: {
- Log.d(TAG, "Received Stop event from RemoteControlClient");
- stop();
+ sessionCallback.onStop();
return true;
}
case KeyEvent.KEYCODE_MEDIA_PREVIOUS: {
- seekDelta(-UserPreferences.getRewindSecs() * 1000);
+ sessionCallback.onSkipToPrevious();
return true;
}
case KeyEvent.KEYCODE_MEDIA_REWIND: {
- seekDelta(-UserPreferences.getRewindSecs() * 1000);
+ sessionCallback.onRewind();
return true;
}
case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
- seekDelta(UserPreferences.getFastFowardSecs() * 1000);
+ sessionCallback.onFastForward();
return true;
}
case KeyEvent.KEYCODE_MEDIA_NEXT: {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
index 680fb8777..8a0964d36 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java
@@ -6,12 +6,10 @@ import android.support.annotation.NonNull;
import android.util.Log;
import java.util.List;
-import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
-import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.core.event.QueueEvent;
@@ -65,13 +63,10 @@ public class PlaybackServiceTaskManager {
@NonNull PSTMCallback callback) {
this.context = context;
this.callback = callback;
- schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOL_SIZE, new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setPriority(Thread.MIN_PRIORITY);
- return t;
- }
+ schedExecutor = new ScheduledThreadPoolExecutor(SCHED_EX_POOL_SIZE, r -> {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.MIN_PRIORITY);
+ return t;
});
loadQueue();
EventBus.getDefault().register(this);
@@ -95,12 +90,7 @@ public class PlaybackServiceTaskManager {
private synchronized void loadQueue() {
if (!isQueueLoaderActive()) {
- queueFuture = schedExecutor.submit(new Callable<List<FeedItem>>() {
- @Override
- public List<FeedItem> call() throws Exception {
- return DBReader.getQueue();
- }
- });
+ queueFuture = schedExecutor.submit(DBReader::getQueue);
}
}
@@ -112,9 +102,7 @@ public class PlaybackServiceTaskManager {
if (queueFuture.isDone()) {
try {
return queueFuture.get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
@@ -137,12 +125,7 @@ public class PlaybackServiceTaskManager {
*/
public synchronized void startPositionSaver() {
if (!isPositionSaverActive()) {
- Runnable positionSaver = new Runnable() {
- @Override
- public void run() {
- callback.positionSaverTick();
- }
- };
+ Runnable positionSaver = callback::positionSaverTick;
positionSaverFuture = schedExecutor.scheduleWithFixedDelay(positionSaver, POSITION_SAVER_WAITING_INTERVAL,
POSITION_SAVER_WAITING_INTERVAL, TimeUnit.MILLISECONDS);
@@ -174,12 +157,7 @@ public class PlaybackServiceTaskManager {
*/
public synchronized void startWidgetUpdater() {
if (!isWidgetUpdaterActive()) {
- Runnable widgetUpdater = new Runnable() {
- @Override
- public void run() {
- callback.onWidgetUpdaterTick();
- }
- };
+ Runnable widgetUpdater = callback::onWidgetUpdaterTick;
widgetUpdaterFuture = schedExecutor.scheduleWithFixedDelay(widgetUpdater, WIDGET_UPDATER_NOTIFICATION_INTERVAL,
WIDGET_UPDATER_NOTIFICATION_INTERVAL, TimeUnit.MILLISECONDS);
@@ -279,18 +257,15 @@ public class PlaybackServiceTaskManager {
cancelChapterLoader();
}
- Runnable chapterLoader = new Runnable() {
- @Override
- public void run() {
- Log.d(TAG, "Chapter loader started");
- if (media.getChapters() == null) {
- media.loadChapterMarks();
- if (!Thread.currentThread().isInterrupted() && media.getChapters() != null) {
- callback.onChapterLoaded(media);
- }
+ Runnable chapterLoader = () -> {
+ Log.d(TAG, "Chapter loader started");
+ if (media.getChapters() == null) {
+ media.loadChapterMarks();
+ if (!Thread.currentThread().isInterrupted() && media.getChapters() != null) {
+ callback.onChapterLoaded(media);
}
- Log.d(TAG, "Chapter loader stopped");
}
+ Log.d(TAG, "Chapter loader stopped");
};
chapterLoaderFuture = schedExecutor.submit(chapterLoader);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
index 0dc54fb6e..e94874453 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.core.storage;
import android.content.Context;
+import android.support.annotation.NonNull;
import android.util.Log;
import java.util.ArrayList;
@@ -12,8 +13,6 @@ import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
-import de.danoeh.antennapod.core.preferences.UserPreferences;
-import de.danoeh.antennapod.core.util.LongList;
/**
* Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod.
@@ -28,30 +27,18 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
this.numberOfDaysAfterPlayback = numberOfDaysAfterPlayback;
}
+ /**
+ * @return the number of episodes that *could* be cleaned up, if needed
+ */
+ public int getReclaimableItems()
+ {
+ return getCandidates().size();
+ }
+
@Override
public int performCleanup(Context context, int numberOfEpisodesToDelete) {
- List<FeedItem> candidates = new ArrayList<>();
- List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ List<FeedItem> candidates = getCandidates();
List<FeedItem> delete;
- Calendar cal = Calendar.getInstance();
- cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback);
- Date mostRecentDateForDeletion = cal.getTime();
- for (FeedItem item : downloadedItems) {
- if (item.hasMedia()
- && item.getMedia().isDownloaded()
- && !item.isTagged(FeedItem.TAG_QUEUE)
- && item.isPlayed()
- && !item.isTagged(FeedItem.TAG_FAVORITE)) {
- FeedMedia media = item.getMedia();
- // make sure this candidate was played at least the proper amount of days prior
- // to now
- if (media != null
- && media.getPlaybackCompletionDate() != null
- && media.getPlaybackCompletionDate().before(mostRecentDateForDeletion)) {
- candidates.add(item);
- }
- }
- }
Collections.sort(candidates, (lhs, rhs) -> {
Date l = lhs.getMedia().getPlaybackCompletionDate();
@@ -90,6 +77,32 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
return counter;
}
+ @NonNull
+ private List<FeedItem> getCandidates() {
+ List<FeedItem> candidates = new ArrayList<>();
+ List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ Calendar cal = Calendar.getInstance();
+ cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback);
+ Date mostRecentDateForDeletion = cal.getTime();
+ for (FeedItem item : downloadedItems) {
+ if (item.hasMedia()
+ && item.getMedia().isDownloaded()
+ && !item.isTagged(FeedItem.TAG_QUEUE)
+ && item.isPlayed()
+ && !item.isTagged(FeedItem.TAG_FAVORITE)) {
+ FeedMedia media = item.getMedia();
+ // make sure this candidate was played at least the proper amount of days prior
+ // to now
+ if (media != null
+ && media.getPlaybackCompletionDate() != null
+ && media.getPlaybackCompletionDate().before(mostRecentDateForDeletion)) {
+ candidates.add(item);
+ }
+ }
+ }
+ return candidates;
+ }
+
@Override
public int getDefaultCleanupParameter() {
return getNumEpisodesToCleanup(0);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java
index 26dc027bf..aa97b321a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APDownloadAlgorithm.java
@@ -33,73 +33,70 @@ public class APDownloadAlgorithm implements AutomaticDownloadAlgorithm {
*/
@Override
public Runnable autoDownloadUndownloadedItems(final Context context) {
- return new Runnable() {
- @Override
- public void run() {
-
- // true if we should auto download based on network status
- boolean networkShouldAutoDl = NetworkUtils.autodownloadNetworkAvailable()
- && UserPreferences.isEnableAutodownload();
-
- // true if we should auto download based on power status
- boolean powerShouldAutoDl = PowerUtils.deviceCharging(context)
- || UserPreferences.isEnableAutodownloadOnBattery();
-
- // we should only auto download if both network AND power are happy
- if (networkShouldAutoDl && powerShouldAutoDl) {
-
- Log.d(TAG, "Performing auto-dl of undownloaded episodes");
-
- List<FeedItem> candidates;
- final List<FeedItem> queue = DBReader.getQueue();
- final List<FeedItem> newItems = DBReader.getNewItemsList();
- candidates = new ArrayList<FeedItem>(queue.size() + newItems.size());
- candidates.addAll(queue);
- for(FeedItem newItem : newItems) {
- FeedPreferences feedPrefs = newItem.getFeed().getPreferences();
- FeedFilter feedFilter = feedPrefs.getFilter();
- if(candidates.contains(newItem) == false && feedFilter.shouldAutoDownload(newItem)) {
- candidates.add(newItem);
- }
- }
-
- // filter items that are not auto downloadable
- Iterator<FeedItem> it = candidates.iterator();
- while(it.hasNext()) {
- FeedItem item = it.next();
- if(item.isAutoDownloadable() == false) {
- it.remove();
- }
+ return () -> {
+
+ // true if we should auto download based on network status
+ boolean networkShouldAutoDl = NetworkUtils.autodownloadNetworkAvailable()
+ && UserPreferences.isEnableAutodownload();
+
+ // true if we should auto download based on power status
+ boolean powerShouldAutoDl = PowerUtils.deviceCharging(context)
+ || UserPreferences.isEnableAutodownloadOnBattery();
+
+ // we should only auto download if both network AND power are happy
+ if (networkShouldAutoDl && powerShouldAutoDl) {
+
+ Log.d(TAG, "Performing auto-dl of undownloaded episodes");
+
+ List<FeedItem> candidates;
+ final List<FeedItem> queue = DBReader.getQueue();
+ final List<FeedItem> newItems = DBReader.getNewItemsList();
+ candidates = new ArrayList<>(queue.size() + newItems.size());
+ candidates.addAll(queue);
+ for(FeedItem newItem : newItems) {
+ FeedPreferences feedPrefs = newItem.getFeed().getPreferences();
+ FeedFilter feedFilter = feedPrefs.getFilter();
+ if(!candidates.contains(newItem) && feedFilter.shouldAutoDownload(newItem)) {
+ candidates.add(newItem);
}
+ }
- int autoDownloadableEpisodes = candidates.size();
- int downloadedEpisodes = DBReader.getNumberOfDownloadedEpisodes();
- int deletedEpisodes = UserPreferences.getEpisodeCleanupAlgorithm()
- .makeRoomForEpisodes(context, autoDownloadableEpisodes);
- boolean cacheIsUnlimited = UserPreferences.getEpisodeCacheSize() == UserPreferences
- .getEpisodeCacheSizeUnlimited();
- int episodeCacheSize = UserPreferences.getEpisodeCacheSize();
-
- int episodeSpaceLeft;
- if (cacheIsUnlimited ||
- episodeCacheSize >= downloadedEpisodes + autoDownloadableEpisodes) {
- episodeSpaceLeft = autoDownloadableEpisodes;
- } else {
- episodeSpaceLeft = episodeCacheSize - (downloadedEpisodes - deletedEpisodes);
+ // filter items that are not auto downloadable
+ Iterator<FeedItem> it = candidates.iterator();
+ while(it.hasNext()) {
+ FeedItem item = it.next();
+ if(!item.isAutoDownloadable()) {
+ it.remove();
}
+ }
- FeedItem[] itemsToDownload = candidates.subList(0, episodeSpaceLeft)
- .toArray(new FeedItem[episodeSpaceLeft]);
+ int autoDownloadableEpisodes = candidates.size();
+ int downloadedEpisodes = DBReader.getNumberOfDownloadedEpisodes();
+ int deletedEpisodes = UserPreferences.getEpisodeCleanupAlgorithm()
+ .makeRoomForEpisodes(context, autoDownloadableEpisodes);
+ boolean cacheIsUnlimited = UserPreferences.getEpisodeCacheSize() == UserPreferences
+ .getEpisodeCacheSizeUnlimited();
+ int episodeCacheSize = UserPreferences.getEpisodeCacheSize();
+
+ int episodeSpaceLeft;
+ if (cacheIsUnlimited ||
+ episodeCacheSize >= downloadedEpisodes + autoDownloadableEpisodes) {
+ episodeSpaceLeft = autoDownloadableEpisodes;
+ } else {
+ episodeSpaceLeft = episodeCacheSize - (downloadedEpisodes - deletedEpisodes);
+ }
- Log.d(TAG, "Enqueueing " + itemsToDownload.length + " items for download");
+ FeedItem[] itemsToDownload = candidates.subList(0, episodeSpaceLeft)
+ .toArray(new FeedItem[episodeSpaceLeft]);
- try {
- DBTasks.downloadFeedItems(false, context, itemsToDownload);
- } catch (DownloadRequestException e) {
- e.printStackTrace();
- }
+ Log.d(TAG, "Enqueueing " + itemsToDownload.length + " items for download");
+ try {
+ DBTasks.downloadFeedItems(false, context, itemsToDownload);
+ } catch (DownloadRequestException e) {
+ e.printStackTrace();
}
+
}
};
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java
index 132b61853..9cec62d83 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APNullCleanupAlgorithm.java
@@ -21,4 +21,9 @@ public class APNullCleanupAlgorithm extends EpisodeCleanupAlgorithm {
public int getDefaultCleanupParameter() {
return 0;
}
+
+ @Override
+ public int getReclaimableItems() {
+ return 0;
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
index 234d6162c..04b200699 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
@@ -1,18 +1,16 @@
package de.danoeh.antennapod.core.storage;
import android.content.Context;
+import android.support.annotation.NonNull;
import android.util.Log;
import java.util.ArrayList;
-import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.FeedMedia;
-import de.danoeh.antennapod.core.util.LongList;
/**
* A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite
@@ -22,19 +20,18 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm {
private static final String TAG = "APQueueCleanupAlgorithm";
+ /**
+ * @return the number of episodes that *could* be cleaned up, if needed
+ */
+ public int getReclaimableItems()
+ {
+ return getCandidates().size();
+ }
+
@Override
public int performCleanup(Context context, int numberOfEpisodesToDelete) {
- List<FeedItem> candidates = new ArrayList<>();
- List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ List<FeedItem> candidates = getCandidates();
List<FeedItem> delete;
- for (FeedItem item : downloadedItems) {
- if (item.hasMedia()
- && item.getMedia().isDownloaded()
- && !item.isTagged(FeedItem.TAG_QUEUE)
- && !item.isTagged(FeedItem.TAG_FAVORITE)) {
- candidates.add(item);
- }
- }
// in the absence of better data, we'll sort by item publication date
Collections.sort(candidates, (lhs, rhs) -> {
@@ -74,6 +71,21 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm {
return counter;
}
+ @NonNull
+ private List<FeedItem> getCandidates() {
+ List<FeedItem> candidates = new ArrayList<>();
+ List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ for (FeedItem item : downloadedItems) {
+ if (item.hasMedia()
+ && item.getMedia().isDownloaded()
+ && !item.isTagged(FeedItem.TAG_QUEUE)
+ && !item.isTagged(FeedItem.TAG_FAVORITE)) {
+ candidates.add(item);
+ }
+ }
+ return candidates;
+ }
+
@Override
public int getDefaultCleanupParameter() {
return getNumEpisodesToCleanup(0);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java
index 72c68ddb6..dbb77e19c 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/AutomaticDownloadAlgorithm.java
@@ -14,5 +14,5 @@ public interface AutomaticDownloadAlgorithm {
* @param context Used for accessing the DB.
* @return A Runnable that will be submitted to an ExecutorService.
*/
- public Runnable autoDownloadUndownloadedItems(Context context);
+ Runnable autoDownloadUndownloadedItems(Context context);
}
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 0563f878f..94629ba9d 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
@@ -4,6 +4,7 @@ import android.database.Cursor;
import android.support.v4.util.ArrayMap;
import android.util.Log;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -590,17 +591,19 @@ public final class DBReader {
FeedItem item = null;
Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId));
- if (itemCursor.moveToFirst()) {
- List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
- if (list.size() > 0) {
- item = list.get(0);
- loadAdditionalFeedItemListData(list);
- if (item.hasChapters()) {
- loadChaptersOfFeedItem(adapter, item);
- }
- }
+ if (!itemCursor.moveToFirst()) {
+ itemCursor.close();
+ return null;
}
+ List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
itemCursor.close();
+ if (list.size() > 0) {
+ item = list.get(0);
+ loadAdditionalFeedItemListData(list);
+ if (item.hasChapters()) {
+ loadChaptersOfFeedItem(adapter, item);
+ }
+ }
return item;
}
@@ -676,7 +679,7 @@ public final class DBReader {
* as well as chapter marks of the FeedItems will also be loaded from the database.
*/
public static List<FeedItem> getFeedItems(final long... itemIds) {
- Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + itemIds + "]");
+ Log.d(TAG, "getFeedItems() called with: " + "itemIds = [" + Arrays.toString(itemIds) + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
List<FeedItem> items = getFeedItems(adapter, itemIds);
@@ -898,25 +901,112 @@ public final class DBReader {
adapter.open();
Cursor mediaCursor = adapter.getSingleFeedMediaCursor(mediaId);
- FeedMedia media = null;
- if (mediaCursor.moveToFirst()) {
- int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM);
- final long itemId = mediaCursor.getLong(indexFeedItem);
- media = FeedMedia.fromCursor(mediaCursor);
+ if (!mediaCursor.moveToFirst()) {
+ mediaCursor.close();
+ return null;
+ }
+
+ int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM);
+ long itemId = mediaCursor.getLong(indexFeedItem);
+ FeedMedia media = FeedMedia.fromCursor(mediaCursor);
+ mediaCursor.close();
+
+ if(media != null) {
FeedItem item = getFeedItem(itemId);
- if (media != null && item != null) {
+ if (item != null) {
media.setItem(item);
item.setMedia(media);
}
}
- mediaCursor.close();
adapter.close();
return media;
}
/**
+ * Searches the DB for statistics
+ *
+ * @return The StatisticsInfo object
+ */
+ public static StatisticsData getStatistics() {
+ PodDBAdapter adapter = PodDBAdapter.getInstance();
+ adapter.open();
+
+ long totalTime = 0;
+ List<StatisticsItem> feedTime = new ArrayList<>();
+
+ List<Feed> feeds = getFeedList();
+ for (Feed feed : feeds) {
+ long feedPlayedTime = 0;
+ long feedTotalTime = 0;
+ long episodes = 0;
+ long episodesStarted = 0;
+ List<FeedItem> items = getFeed(feed.getId()).getItems();
+ for(FeedItem item : items) {
+ FeedMedia media = item.getMedia();
+ if(media == null) {
+ continue;
+ }
+
+ if(item.isPlayed()) {
+ feedPlayedTime += media.getDuration() / 1000;
+ } else {
+ feedPlayedTime += media.getPosition() / 1000;
+ }
+ if(item.isPlayed() || media.getPosition() != 0) {
+ episodesStarted++;
+ }
+ feedTotalTime += media.getDuration() / 1000;
+ episodes++;
+ }
+ feedTime.add(new StatisticsItem(
+ feed, feedTotalTime, feedPlayedTime, episodes, episodesStarted));
+ totalTime += feedPlayedTime;
+ }
+
+ Collections.sort(feedTime, (item1, item2) -> {
+ if(item1.timePlayed > item2.timePlayed) {
+ return -1;
+ } else if(item1.timePlayed < item2.timePlayed) {
+ return 1;
+ } else {
+ return 0;
+ }
+ });
+
+ adapter.close();
+ return new StatisticsData(totalTime, feedTime);
+ }
+
+ public static class StatisticsData {
+ public long totalTime;
+ public List<StatisticsItem> feedTime;
+
+ public StatisticsData(long totalTime, List<StatisticsItem> feedTime) {
+ this.totalTime = totalTime;
+ this.feedTime = feedTime;
+ }
+ }
+
+ public static class StatisticsItem {
+ public Feed feed;
+ public long time;
+ public long timePlayed;
+ public long episodes;
+ public long episodesStarted;
+
+ public StatisticsItem(Feed feed, long time, long timePlayed,
+ long episodes, long episodesStarted) {
+ this.feed = feed;
+ this.time = time;
+ this.timePlayed = timePlayed;
+ this.episodes = episodes;
+ this.episodesStarted = episodesStarted;
+ }
+ }
+
+ /**
* Returns the flattr queue as a List of FlattrThings. The list consists of Feeds and FeedItems.
*
* @return The flattr queue as a List.
@@ -1017,7 +1107,8 @@ public final class DBReader {
int numNewItems = adapter.getNumberOfNewItems();
int numDownloadedItems = adapter.getNumberOfDownloadedEpisodes();
- NavDrawerData result = new NavDrawerData(feeds, queueSize, numNewItems, numDownloadedItems, feedCounters);
+ NavDrawerData result = new NavDrawerData(feeds, queueSize, numNewItems, numDownloadedItems,
+ feedCounters, UserPreferences.getEpisodeCleanupAlgorithm().getReclaimableItems());
adapter.close();
return result;
}
@@ -1028,17 +1119,20 @@ public final class DBReader {
public int numNewItems;
public int numDownloadedItems;
public LongIntMap feedCounters;
+ public int reclaimableSpace;
public NavDrawerData(List<Feed> feeds,
int queueSize,
int numNewItems,
int numDownloadedItems,
- LongIntMap feedIndicatorValues) {
+ LongIntMap feedIndicatorValues,
+ int reclaimableSpace) {
this.feeds = feeds;
this.queueSize = queueSize;
this.numNewItems = numNewItems;
this.numDownloadedItems = numDownloadedItems;
this.feedCounters = feedIndicatorValues;
+ this.reclaimableSpace = reclaimableSpace;
}
}
}
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 efc60bfc2..47e2d8a26 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
@@ -48,13 +48,10 @@ public final class DBTasks {
private static ExecutorService autodownloadExec;
static {
- autodownloadExec = Executors.newSingleThreadExecutor(new ThreadFactory() {
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r);
- t.setPriority(Thread.MIN_PRIORITY);
- return t;
- }
+ autodownloadExec = Executors.newSingleThreadExecutor(r -> {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.MIN_PRIORITY);
+ return t;
});
}
@@ -85,9 +82,7 @@ public final class DBTasks {
if (feedID != 0) {
try {
DBWriter.deleteFeed(context, feedID).get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
} else {
@@ -114,7 +109,7 @@ public final class DBTasks {
boolean showPlayer, boolean startWhenPrepared, boolean shouldStream) {
try {
if (!shouldStream) {
- if (media.fileExists() == false) {
+ if (!media.fileExists()) {
throw new MediaFileNotFoundException(
"No episode was found at " + media.getFile_url(),
media);
@@ -224,7 +219,28 @@ public final class DBTasks {
*/
public static void refreshCompleteFeed(final Context context, final Feed feed) {
try {
- refreshFeed(context, feed, true);
+ refreshFeed(context, feed, true, false);
+ } catch (DownloadRequestException e) {
+ e.printStackTrace();
+ DBWriter.addDownloadStatus(
+ new DownloadStatus(feed, feed
+ .getHumanReadableIdentifier(),
+ DownloadError.ERROR_REQUEST_ERROR, false, e
+ .getMessage()
+ )
+ );
+ }
+ }
+
+ /**
+ * Downloads all pages of the given feed even if feed has not been modified since last refresh
+ *
+ * @param context Used for requesting the download.
+ * @param feed The Feed object.
+ */
+ public static void forceRefreshCompleteFeed(final Context context, final Feed feed) {
+ try {
+ refreshFeed(context, feed, true, true);
} catch (DownloadRequestException e) {
e.printStackTrace();
DBWriter.addDownloadStatus(
@@ -248,11 +264,11 @@ public final class DBTasks {
public static void loadNextPageOfFeed(final Context context, Feed feed, boolean loadAllPages) throws DownloadRequestException {
if (feed.isPaged() && feed.getNextPageLink() != null) {
int pageNr = feed.getPageNr() + 1;
- Feed nextFeed = new Feed(feed.getNextPageLink(), new Date(), feed.getTitle() + "(" + pageNr + ")");
+ Feed nextFeed = new Feed(feed.getNextPageLink(), null, feed.getTitle() + "(" + pageNr + ")");
nextFeed.setPageNr(pageNr);
nextFeed.setPaged(true);
nextFeed.setId(feed.getId());
- DownloadRequester.getInstance().downloadFeed(context, nextFeed, loadAllPages);
+ DownloadRequester.getInstance().downloadFeed(context, nextFeed, loadAllPages, false);
} else {
Log.e(TAG, "loadNextPageOfFeed: Feed was either not paged or contained no nextPageLink");
}
@@ -268,12 +284,25 @@ public final class DBTasks {
public static void refreshFeed(Context context, Feed feed)
throws DownloadRequestException {
Log.d(TAG, "refreshFeed(feed.id: " + feed.getId() +")");
- refreshFeed(context, feed, false);
+ refreshFeed(context, feed, false, false);
+ }
+
+ /**
+ * Refresh a specific feed even if feed has not been modified since last refresh
+ *
+ * @param context Used for requesting the download.
+ * @param feed The Feed object.
+ */
+ public static void forceRefreshFeed(Context context, Feed feed)
+ throws DownloadRequestException {
+ Log.d(TAG, "refreshFeed(feed.id: " + feed.getId() +")");
+ refreshFeed(context, feed, false, true);
}
- private static void refreshFeed(Context context, Feed feed, boolean loadAllPages) throws DownloadRequestException {
+ private static void refreshFeed(Context context, Feed feed, boolean loadAllPages, boolean force)
+ throws DownloadRequestException {
Feed f;
- Date lastUpdate = feed.hasLastUpdateFailed() ? new Date(0) : feed.getLastUpdate();
+ String lastUpdate = feed.hasLastUpdateFailed() ? null : feed.getLastUpdate();
if (feed.getPreferences() == null) {
f = new Feed(feed.getDownload_url(), lastUpdate, feed.getTitle());
} else {
@@ -281,7 +310,7 @@ public final class DBTasks {
feed.getPreferences().getUsername(), feed.getPreferences().getPassword());
}
f.setId(feed.getId());
- DownloadRequester.getInstance().downloadFeed(context, f, loadAllPages);
+ DownloadRequester.getInstance().downloadFeed(context, f, loadAllPages, force);
}
/**
@@ -484,8 +513,8 @@ public final class DBTasks {
*/
public static synchronized Feed[] updateFeed(final Context context,
final Feed... newFeeds) {
- List<Feed> newFeedsList = new ArrayList<Feed>();
- List<Feed> updatedFeedsList = new ArrayList<Feed>();
+ List<Feed> newFeedsList = new ArrayList<>();
+ List<Feed> updatedFeedsList = new ArrayList<>();
Feed[] resultFeeds = new Feed[newFeeds.length];
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
@@ -577,9 +606,7 @@ public final class DBTasks {
try {
DBWriter.addNewFeed(context, newFeedsList.toArray(new Feed[newFeedsList.size()])).get();
DBWriter.setCompleteFeed(updatedFeedsList.toArray(new Feed[updatedFeedsList.size()])).get();
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
@@ -599,7 +626,7 @@ public final class DBTasks {
*/
public static FutureTask<List<FeedItem>> searchFeedItemTitle(final Context context,
final long feedID, final String query) {
- return new FutureTask<List<FeedItem>>(new QueryTask<List<FeedItem>>(context) {
+ return new FutureTask<>(new QueryTask<List<FeedItem>>(context) {
@Override
public void execute(PodDBAdapter adapter) {
Cursor searchResult = adapter.searchItemTitles(feedID,
@@ -623,7 +650,7 @@ public final class DBTasks {
*/
public static FutureTask<List<FeedItem>> searchFeedItemDescription(final Context context,
final long feedID, final String query) {
- return new FutureTask<List<FeedItem>>(new QueryTask<List<FeedItem>>(context) {
+ return new FutureTask<>(new QueryTask<List<FeedItem>>(context) {
@Override
public void execute(PodDBAdapter adapter) {
Cursor searchResult = adapter.searchItemDescriptions(feedID,
@@ -647,7 +674,7 @@ public final class DBTasks {
*/
public static FutureTask<List<FeedItem>> searchFeedItemContentEncoded(final Context context,
final long feedID, final String query) {
- return new FutureTask<List<FeedItem>>(new QueryTask<List<FeedItem>>(context) {
+ return new FutureTask<>(new QueryTask<List<FeedItem>>(context) {
@Override
public void execute(PodDBAdapter adapter) {
Cursor searchResult = adapter.searchItemContentEncoded(feedID,
@@ -670,7 +697,7 @@ public final class DBTasks {
*/
public static FutureTask<List<FeedItem>> searchFeedItemChapters(final Context context,
final long feedID, final String query) {
- return new FutureTask<List<FeedItem>>(new QueryTask<List<FeedItem>>(context) {
+ return new FutureTask<>(new QueryTask<List<FeedItem>>(context) {
@Override
public void execute(PodDBAdapter adapter) {
Cursor searchResult = adapter.searchItemChapters(feedID,
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 e728abc3b..7dad9cb08 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
@@ -14,7 +14,6 @@ import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
@@ -132,7 +131,7 @@ public class DBWriter {
}
}
Log.d(TAG, "Deleting File. Result: " + result);
- EventBus.getDefault().post(FeedItemEvent.deletedMedia(Arrays.asList(media.getItem())));
+ EventBus.getDefault().post(FeedItemEvent.deletedMedia(Collections.singletonList(media.getItem())));
EventDistributor.getInstance().sendUnreadItemsUpdateBroadcast();
}
});
@@ -372,7 +371,7 @@ public class DBWriter {
if (queue != null) {
boolean queueModified = false;
LongList markAsUnplayedIds = new LongList();
- List<QueueEvent> events = new ArrayList<QueueEvent>();
+ List<QueueEvent> events = new ArrayList<>();
for (int i = 0; i < itemIds.length; i++) {
if (!itemListContains(queue, itemIds[i])) {
final FeedItem item = DBReader.getFeedItem(itemIds[i]);
@@ -545,9 +544,7 @@ public class DBWriter {
*/
public static Future<?> moveQueueItem(final int from,
final int to, final boolean broadcastUpdate) {
- return dbExec.submit(() -> {
- moveQueueItemHelper(from, to, broadcastUpdate);
- });
+ return dbExec.submit(() -> moveQueueItemHelper(from, to, broadcastUpdate));
}
/**
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 0dc1dadeb..04afc504b 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
@@ -51,7 +51,7 @@ public class DownloadRequester {
private Map<String, DownloadRequest> downloads;
private DownloadRequester() {
- downloads = new ConcurrentHashMap<String, DownloadRequest>();
+ downloads = new ConcurrentHashMap<>();
}
public static synchronized DownloadRequester getInstance() {
@@ -88,7 +88,7 @@ public class DownloadRequester {
private void download(Context context, FeedFile item, FeedFile container, File dest,
boolean overwriteIfExists, String username, String password,
- long ifModifiedSince, boolean deleteOnFailure, Bundle arguments) {
+ String lastModified, boolean deleteOnFailure, Bundle arguments) {
final boolean partiallyDownloadedFileExists = item.getFile_url() != null;
if (isDownloadingFile(item)) {
Log.e(TAG, "URL " + item.getDownload_url()
@@ -129,7 +129,7 @@ public class DownloadRequester {
DownloadRequest.Builder builder = new DownloadRequest.Builder(dest.toString(), item)
.withAuthentication(username, password)
- .ifModifiedSince(ifModifiedSince)
+ .lastModified(lastModified)
.deleteOnFailure(deleteOnFailure)
.withArguments(arguments);
DownloadRequest request = builder.build();
@@ -162,24 +162,25 @@ public class DownloadRequester {
* @param feed Feed to download
* @param loadAllPages Set to true to download all pages
*/
- public synchronized void downloadFeed(Context context, Feed feed, boolean loadAllPages)
+ public synchronized void downloadFeed(Context context, Feed feed, boolean loadAllPages,
+ boolean force)
throws DownloadRequestException {
if (feedFileValid(feed)) {
String username = (feed.getPreferences() != null) ? feed.getPreferences().getUsername() : null;
String password = (feed.getPreferences() != null) ? feed.getPreferences().getPassword() : null;
- long ifModifiedSince = feed.isPaged() ? 0 : feed.getLastUpdate().getTime();
+ String lastModified = feed.isPaged() || force ? null : feed.getLastUpdate();
Bundle args = new Bundle();
args.putInt(REQUEST_ARG_PAGE_NR, feed.getPageNr());
args.putBoolean(REQUEST_ARG_LOAD_ALL_PAGES, loadAllPages);
download(context, feed, null, new File(getFeedfilePath(context),
- getFeedfileName(feed)), true, username, password, ifModifiedSince, true, args);
+ getFeedfileName(feed)), true, username, password, lastModified, true, args);
}
}
public synchronized void downloadFeed(Context context, Feed feed) throws DownloadRequestException {
- downloadFeed(context, feed, false);
+ downloadFeed(context, feed, false, false);
}
public synchronized void downloadMedia(Context context, FeedMedia feedmedia)
@@ -204,7 +205,7 @@ public class DownloadRequester {
getMediafilename(feedmedia));
}
download(context, feedmedia, feed,
- dest, false, username, password, 0, false, null);
+ dest, false, username, password, null, false, null);
}
}
@@ -267,10 +268,7 @@ public class DownloadRequester {
* Checks if feedfile is in the downloads list
*/
public synchronized boolean isDownloadingFile(FeedFile item) {
- if (item.getDownload_url() != null) {
- return downloads.containsKey(item.getDownload_url());
- }
- return false;
+ return item.getDownload_url() != null && downloads.containsKey(item.getDownload_url());
}
public synchronized DownloadRequest getDownload(String downloadUrl) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java
index 0f402745c..97cbdca33 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/EpisodeCleanupAlgorithm.java
@@ -40,6 +40,11 @@ public abstract class EpisodeCleanupAlgorithm {
}
/**
+ * @return the number of episodes/items that *could* be cleaned up, if needed
+ */
+ public abstract int getReclaimableItems();
+
+ /**
* @param amountOfRoomNeeded the number of episodes we want to download
* @return the number of episodes to delete in order to make room
*/
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 3a63685ba..d7c9e9108 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
@@ -1,10 +1,6 @@
package de.danoeh.antennapod.core.storage;
import android.content.Context;
-import de.danoeh.antennapod.core.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.SearchResult;
-import de.danoeh.antennapod.core.util.comparator.SearchResultValueComparator;
import java.util.ArrayList;
import java.util.Collections;
@@ -12,6 +8,11 @@ import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
+import de.danoeh.antennapod.core.R;
+import de.danoeh.antennapod.core.feed.FeedItem;
+import de.danoeh.antennapod.core.feed.SearchResult;
+import de.danoeh.antennapod.core.util.comparator.SearchResultValueComparator;
+
/**
* Performs search on Feeds and FeedItems
*/
@@ -30,7 +31,7 @@ public class FeedSearcher {
context.getString(R.string.found_in_chapters_label),
context.getString(R.string.found_in_title_label)};
- List<SearchResult> result = new ArrayList<SearchResult>();
+ List<SearchResult> result = new ArrayList<>();
FutureTask<List<FeedItem>>[] tasks = new FutureTask[4];
(tasks[0] = DBTasks.searchFeedItemContentEncoded(context, selectedFeed, query)).run();
@@ -46,9 +47,7 @@ public class FeedSearcher {
}
}
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
+ } catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
Collections.sort(result, new SearchResultValueComparator());
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 85ff8fc8c..c8df0f572 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
@@ -10,12 +10,14 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.media.MediaMetadataRetriever;
+import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.event.ProgressEvent;
@@ -303,7 +305,7 @@ public class PodDBAdapter {
private static SQLiteDatabase db;
private static Context context;
private static PodDBHelper dbHelper;
- private static int counter = 0;
+ private static AtomicInteger counter = new AtomicInteger(0);
public static void init(Context context) {
PodDBAdapter.context = context.getApplicationContext();
@@ -318,11 +320,15 @@ public class PodDBAdapter {
private PodDBAdapter() {}
- public PodDBAdapter open() {
+ public synchronized PodDBAdapter open() {
+ int adapters = counter.incrementAndGet();
+ Log.v(TAG, "Opening DB #" + adapters);
if (db == null || !db.isOpen() || db.isReadOnly()) {
- Log.v(TAG, "Opening DB");
try {
db = dbHelper.getWritableDatabase();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.enableWriteAheadLogging();
+ }
} catch (SQLException ex) {
Log.e(TAG, Log.getStackTraceString(ex));
db = dbHelper.getReadableDatabase();
@@ -331,8 +337,13 @@ public class PodDBAdapter {
return this;
}
- public void close() {
- // do nothing
+ public synchronized void close() {
+ int adapters = counter.decrementAndGet();
+ Log.v(TAG, "Closing DB #" + adapters);
+ if(adapters == 0) {
+ Log.v(TAG, "Closing DB, really");
+ db.close();
+ }
}
public static boolean deleteDatabase() {
@@ -368,7 +379,7 @@ public class PodDBAdapter {
values.put(KEY_FILE_URL, feed.getFile_url());
values.put(KEY_DOWNLOAD_URL, feed.getDownload_url());
values.put(KEY_DOWNLOADED, feed.isDownloaded());
- values.put(KEY_LASTUPDATE, feed.getLastUpdate().getTime());
+ values.put(KEY_LASTUPDATE, feed.getLastUpdate());
values.put(KEY_TYPE, feed.getType());
values.put(KEY_FEED_IDENTIFIER, feed.getFeedIdentifier());
@@ -425,34 +436,46 @@ public class PodDBAdapter {
*/
public long setImage(FeedImage image) {
boolean startedTransaction = false;
- if(false == db.inTransaction()) {
- db.beginTransaction();
- startedTransaction = true;
- }
- ContentValues values = new ContentValues();
- values.put(KEY_TITLE, image.getTitle());
- values.put(KEY_DOWNLOAD_URL, image.getDownload_url());
- values.put(KEY_DOWNLOADED, image.isDownloaded());
- values.put(KEY_FILE_URL, image.getFile_url());
- if (image.getId() == 0) {
- image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values));
- } else {
- db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?",
+ try {
+ if (!db.inTransaction()) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ startedTransaction = true;
+ }
+
+ ContentValues values = new ContentValues();
+ values.put(KEY_TITLE, image.getTitle());
+ values.put(KEY_DOWNLOAD_URL, image.getDownload_url());
+ values.put(KEY_DOWNLOADED, image.isDownloaded());
+ values.put(KEY_FILE_URL, image.getFile_url());
+ if (image.getId() == 0) {
+ image.setId(db.insert(TABLE_NAME_FEED_IMAGES, null, values));
+ } else {
+ db.update(TABLE_NAME_FEED_IMAGES, values, KEY_ID + "=?",
new String[]{String.valueOf(image.getId())});
- }
+ }
- final FeedComponent owner = image.getOwner();
- if (owner != null && owner.getId() != 0) {
- values.clear();
- values.put(KEY_IMAGE, image.getId());
- if (owner instanceof Feed) {
- db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())});
+ final FeedComponent owner = image.getOwner();
+ if (owner != null && owner.getId() != 0) {
+ values.clear();
+ values.put(KEY_IMAGE, image.getId());
+ if (owner instanceof Feed) {
+ db.update(TABLE_NAME_FEEDS, values, KEY_ID + "=?", new String[]{String.valueOf(image.getOwner().getId())});
+ }
+ }
+ if (startedTransaction) {
+ db.setTransactionSuccessful();
+ }
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ if (startedTransaction) {
+ db.endTransaction();
}
- }
- if(startedTransaction) {
- db.setTransactionSuccessful();
- db.endTransaction();
}
return image.getId();
}
@@ -522,20 +545,29 @@ public class PodDBAdapter {
* transaction
*/
public void setCompleteFeed(Feed... feeds) {
- db.beginTransaction();
- for (Feed feed : feeds) {
- setFeed(feed);
- if (feed.getItems() != null) {
- for (FeedItem item : feed.getItems()) {
- setFeedItem(item, false);
- }
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
}
- if (feed.getPreferences() != null) {
- setFeedPreferences(feed.getPreferences());
+ for (Feed feed : feeds) {
+ setFeed(feed);
+ if (feed.getItems() != null) {
+ for (FeedItem item : feed.getItems()) {
+ setFeedItem(item, false);
+ }
+ }
+ if (feed.getPreferences() != null) {
+ setFeedPreferences(feed.getPreferences());
+ }
}
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
}
- db.setTransactionSuccessful();
- db.endTransaction();
}
/**
@@ -598,19 +630,38 @@ public class PodDBAdapter {
}
public void setFeedItemlist(List<FeedItem> items) {
- db.beginTransaction();
- for (FeedItem item : items) {
- setFeedItem(item, true);
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ for (FeedItem item : items) {
+ setFeedItem(item, true);
+ }
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
}
- db.setTransactionSuccessful();
- db.endTransaction();
}
public long setSingleFeedItem(FeedItem item) {
- db.beginTransaction();
- long result = setFeedItem(item, true);
- db.setTransactionSuccessful();
- db.endTransaction();
+ long result = 0;
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ result = setFeedItem(item, true);
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
+ }
return result;
}
@@ -728,20 +779,29 @@ public class PodDBAdapter {
public void setFeedItemRead(int played, long itemId, long mediaId,
boolean resetMediaPosition) {
- db.beginTransaction();
- ContentValues values = new ContentValues();
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ ContentValues values = new ContentValues();
- values.put(KEY_READ, played);
- db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)});
+ values.put(KEY_READ, played);
+ db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(itemId)});
- if (resetMediaPosition) {
- values.clear();
- values.put(KEY_POSITION, 0);
- db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)});
- }
+ if (resetMediaPosition) {
+ values.clear();
+ values.put(KEY_POSITION, 0);
+ db.update(TABLE_NAME_FEED_MEDIA, values, KEY_ID + "=?", new String[]{String.valueOf(mediaId)});
+ }
- db.setTransactionSuccessful();
- db.endTransaction();
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
+ }
}
/**
@@ -750,15 +810,24 @@ public class PodDBAdapter {
* @param itemIds items to change the value of
*/
public void setFeedItemRead(int read, long... itemIds) {
- db.beginTransaction();
- ContentValues values = new ContentValues();
- for (long id : itemIds) {
- values.clear();
- values.put(KEY_READ, read);
- db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)});
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ ContentValues values = new ContentValues();
+ for (long id : itemIds) {
+ values.clear();
+ values.put(KEY_READ, read);
+ db.update(TABLE_NAME_FEED_ITEMS, values, KEY_ID + "=?", new String[]{String.valueOf(id)});
+ }
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
}
- db.setTransactionSuccessful();
- db.endTransaction();
}
public void setChapters(FeedItem item) {
@@ -822,17 +891,26 @@ public class PodDBAdapter {
public void setFavorites(List<FeedItem> favorites) {
ContentValues values = new ContentValues();
- db.beginTransaction();
- db.delete(TABLE_NAME_FAVORITES, null, null);
- for (int i = 0; i < favorites.size(); i++) {
- FeedItem item = favorites.get(i);
- values.put(KEY_ID, i);
- values.put(KEY_FEEDITEM, item.getId());
- values.put(KEY_FEED, item.getFeed().getId());
- db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ db.delete(TABLE_NAME_FAVORITES, null, null);
+ for (int i = 0; i < favorites.size(); i++) {
+ FeedItem item = favorites.get(i);
+ values.put(KEY_ID, i);
+ values.put(KEY_FEEDITEM, item.getId());
+ values.put(KEY_FEED, item.getFeed().getId());
+ db.insertWithOnConflict(TABLE_NAME_FAVORITES, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ }
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
}
- db.setTransactionSuccessful();
- db.endTransaction();
}
/**
@@ -880,17 +958,26 @@ public class PodDBAdapter {
public void setQueue(List<FeedItem> queue) {
ContentValues values = new ContentValues();
- db.beginTransaction();
- db.delete(TABLE_NAME_QUEUE, null, null);
- for (int i = 0; i < queue.size(); i++) {
- FeedItem item = queue.get(i);
- values.put(KEY_ID, i);
- values.put(KEY_FEEDITEM, item.getId());
- values.put(KEY_FEED, item.getFeed().getId());
- db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
+ }
+ db.delete(TABLE_NAME_QUEUE, null, null);
+ for (int i = 0; i < queue.size(); i++) {
+ FeedItem item = queue.get(i);
+ values.put(KEY_ID, i);
+ values.put(KEY_FEEDITEM, item.getId());
+ values.put(KEY_FEED, item.getFeed().getId());
+ db.insertWithOnConflict(TABLE_NAME_QUEUE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+ }
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
}
- db.setTransactionSuccessful();
- db.endTransaction();
}
public void clearQueue() {
@@ -937,23 +1024,32 @@ public class PodDBAdapter {
* Remove a feed with all its FeedItems and Media entries.
*/
public void removeFeed(Feed feed) {
- db.beginTransaction();
- if (feed.getImage() != null) {
- removeFeedImage(feed.getImage());
- }
- if (feed.getItems() != null) {
- for (FeedItem item : feed.getItems()) {
- removeFeedItem(item);
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ db.beginTransactionNonExclusive();
+ } else {
+ db.beginTransaction();
}
- }
- // delete download log entries for feed
- db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE +"=?",
- new String[] { String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED) });
+ if (feed.getImage() != null) {
+ removeFeedImage(feed.getImage());
+ }
+ if (feed.getItems() != null) {
+ for (FeedItem item : feed.getItems()) {
+ removeFeedItem(item);
+ }
+ }
+ // delete download log entries for feed
+ db.delete(TABLE_NAME_DOWNLOAD_LOG, KEY_FEEDFILE + "=? AND " + KEY_FEEDFILETYPE + "=?",
+ new String[]{String.valueOf(feed.getId()), String.valueOf(Feed.FEEDFILETYPE_FEED)});
- db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",
+ db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",
new String[]{String.valueOf(feed.getId())});
- db.setTransactionSuccessful();
- db.endTransaction();
+ db.setTransactionSuccessful();
+ } catch (SQLException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ } finally {
+ db.endTransaction();
+ }
}
public void clearPlaybackHistory() {
@@ -972,9 +1068,8 @@ public class PodDBAdapter {
* @return The cursor of the query
*/
public final Cursor getAllFeedsCursor() {
- Cursor c = db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, null, null, null, null,
+ return db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, null, null, null, null,
KEY_TITLE + " COLLATE NOCASE ASC");
- return c;
}
public final Cursor getFeedCursorDownloadUrls() {
@@ -992,22 +1087,19 @@ public class PodDBAdapter {
}
public final Cursor getAllItemsOfFeedCursor(final long feedId) {
- Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_FEED
+ return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_FEED
+ "=?", new String[]{String.valueOf(feedId)}, null, null,
- null
- );
- return c;
+ null);
}
/**
* Return a cursor with the SEL_FI_EXTRA selection of a single feeditem.
*/
public final Cursor getExtraInformationOfItem(final FeedItem item) {
- Cursor c = db
+ return db
.query(TABLE_NAME_FEED_ITEMS, SEL_FI_EXTRA, KEY_ID + "=?",
new String[]{String.valueOf(item.getId())}, null,
null, null);
- return c;
}
/**
@@ -1017,10 +1109,9 @@ public class PodDBAdapter {
* @return The cursor of the query
*/
public final Cursor getFeedMediaOfItemCursor(final FeedItem item) {
- Cursor c = db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + "=?",
+ return db.query(TABLE_NAME_FEED_MEDIA, null, KEY_ID + "=?",
new String[]{String.valueOf(item.getMedia().getId())}, null,
null, null);
- return c;
}
/**
@@ -1065,25 +1156,22 @@ public class PodDBAdapter {
}
public final Cursor getSimpleChaptersOfFeedItemCursor(final FeedItem item) {
- Cursor c = db.query(TABLE_NAME_SIMPLECHAPTERS, null, KEY_FEEDITEM
+ return db.query(TABLE_NAME_SIMPLECHAPTERS, null, KEY_FEEDITEM
+ "=?", new String[]{String.valueOf(item.getId())}, null,
null, null
);
- return c;
}
public final Cursor getDownloadLog(final int feedFileType, final long feedFileId) {
final String query = "SELECT * FROM " + TABLE_NAME_DOWNLOAD_LOG +
" WHERE " + KEY_FEEDFILE + "=" + feedFileId + " AND " + KEY_FEEDFILETYPE + "=" + feedFileType
+ " ORDER BY " + KEY_ID + " DESC";
- Cursor c = db.rawQuery(query, null);
- return c;
+ return db.rawQuery(query, null);
}
public final Cursor getDownloadLogCursor(final int limit) {
- Cursor c = db.query(TABLE_NAME_DOWNLOAD_LOG, null, null, null, null,
+ return db.query(TABLE_NAME_DOWNLOAD_LOG, null, null, null, null,
null, KEY_COMPLETION_DATE + " DESC LIMIT " + limit);
- return c;
}
/**
@@ -1099,13 +1187,11 @@ public class PodDBAdapter {
TABLE_NAME_QUEUE + "." + KEY_FEEDITEM,
TABLE_NAME_QUEUE + "." + KEY_ID };
String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s", args);
- Cursor c = db.rawQuery(query, null);
- return c;
+ return db.rawQuery(query, null);
}
public Cursor getQueueIDCursor() {
- Cursor c = db.query(TABLE_NAME_QUEUE, new String[]{KEY_FEEDITEM}, null, null, null, null, KEY_ID + " ASC", null);
- return c;
+ return db.query(TABLE_NAME_QUEUE, new String[]{KEY_FEEDITEM}, null, null, null, null, KEY_ID + " ASC", null);
}
@@ -1117,8 +1203,7 @@ public class PodDBAdapter {
TABLE_NAME_FAVORITES + "." + KEY_FEEDITEM,
TABLE_NAME_FEED_ITEMS + "." + KEY_PUBDATE };
String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s=%s ORDER BY %s DESC", args);
- Cursor c = db.rawQuery(query, null);
- return c;
+ return db.rawQuery(query, null);
}
/**
@@ -1126,9 +1211,8 @@ public class PodDBAdapter {
* The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection.
*/
public final Cursor getUnreadItemsCursor() {
- Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_READ
+ return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, KEY_READ
+ "<" + FeedItem.PLAYED, null, null, null, KEY_PUBDATE + " DESC");
- return c;
}
/**
@@ -1141,8 +1225,7 @@ public class PodDBAdapter {
+ " WHERE " + KEY_FEED + "=" + feedId
+ " AND " + KEY_READ + "=" + FeedItem.NEW
+ " ORDER BY " + KEY_PUBDATE + " DESC";
- Cursor c = db.rawQuery(query, null);
- return c;
+ return db.rawQuery(query, null);
}
/**
@@ -1151,7 +1234,7 @@ public class PodDBAdapter {
* The returned cursor uses the FEEDITEM_SEL_FI_SMALL selection.
*/
public final Cursor getNewItemsCursor() {
- String[] args = new String[] {
+ Object[] args = new String[] {
SEL_FI_SMALL_STR,
TABLE_NAME_FEED_ITEMS,
TABLE_NAME_FEEDS,
@@ -1160,13 +1243,11 @@ public class PodDBAdapter {
KEY_PUBDATE + " DESC"
};
final String query = String.format("SELECT %s FROM %s INNER JOIN %s ON %s WHERE %s ORDER BY %s", args);
- Cursor c = db.rawQuery(query, null);
- return c;
+ return db.rawQuery(query, null);
}
public final Cursor getRecentlyPublishedItemsCursor(int limit) {
- Cursor c = db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, null, null, null, null, KEY_PUBDATE + " DESC LIMIT " + limit);
- return c;
+ return db.query(TABLE_NAME_FEED_ITEMS, FEEDITEM_SEL_FI_SMALL, null, null, null, null, KEY_PUBDATE + " DESC LIMIT " + limit);
}
public Cursor getDownloadedItemsCursor() {
@@ -1175,8 +1256,7 @@ public class PodDBAdapter {
+ " INNER JOIN " + TABLE_NAME_FEED_MEDIA
+ " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID + "=" + TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM
+ " WHERE " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + ">0";
- Cursor c = db.rawQuery(query, null);
- return c;
+ return db.rawQuery(query, null);
}
/**
@@ -1192,10 +1272,9 @@ public class PodDBAdapter {
throw new IllegalArgumentException("Limit must be >= 0");
}
- Cursor c = db.query(TABLE_NAME_FEED_MEDIA, null,
+ return db.query(TABLE_NAME_FEED_MEDIA, null,
KEY_PLAYBACK_COMPLETION_DATE + " > 0", null, null,
null, String.format("%s DESC LIMIT %d", KEY_PLAYBACK_COMPLETION_DATE, limit));
- return c;
}
public final Cursor getSingleFeedMediaCursor(long id) {
@@ -1244,18 +1323,17 @@ public class PodDBAdapter {
if (size == 1) {
return "(?)";
}
- StringBuffer buffer = new StringBuffer("(");
+ StringBuilder builder = new StringBuilder("(");
for (int i = 0; i < size - 1; i++) {
- buffer.append("?,");
+ builder.append("?,");
}
- buffer.append("?)");
- return buffer.toString();
+ builder.append("?)");
+ return builder.toString();
}
public final Cursor getFeedCursor(final long id) {
- Cursor c = db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, KEY_ID + "=" + id, null,
+ return db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, KEY_ID + "=" + id, null,
null, null, null);
- return c;
}
public final Cursor getFeedItemCursor(final String id) {
@@ -1512,7 +1590,7 @@ public class PodDBAdapter {
*/
private static class PodDBHelper extends SQLiteOpenHelper {
- private final static int VERSION = 1050003;
+ private final static int VERSION = 1050004;
private Context context;
@@ -1756,7 +1834,6 @@ public class PodDBAdapter {
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_PUBDATE);
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_READ);
}
-
if (oldVersion < 1050003) {
// Migrates feed list filter data
@@ -1804,6 +1881,11 @@ public class PodDBAdapter {
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
+ " ADD COLUMN " + PodDBAdapter.KEY_KEEP_UPDATED + " INTEGER DEFAULT 1");
}
+ if (oldVersion < 1050004) {
+ // prevent old timestamps to be misinterpreted as ETags
+ db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEEDS
+ +" SET " + PodDBAdapter.KEY_LASTUPDATE + "=NULL");
+ }
EventBus.getDefault().post(ProgressEvent.end());
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java
index 9280db8a3..66513a12e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/HandlerState.java
@@ -47,10 +47,10 @@ public class HandlerState {
public HandlerState(Feed feed) {
this.feed = feed;
alternateUrls = new ArrayMap<>();
- items = new ArrayList<FeedItem>();
- tagstack = new Stack<SyndElement>();
+ items = new ArrayList<>();
+ tagstack = new Stack<>();
namespaces = new ArrayMap<>();
- defaultNamespaces = new Stack<Namespace>();
+ defaultNamespaces = new Stack<>();
tempObjects = new ArrayMap<>();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java
index 4d56e1365..f84d6ee96 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/handler/TypeGetter.java
@@ -41,27 +41,28 @@ public class TypeGetter {
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String tag = xpp.getName();
- if (tag.equals(ATOM_ROOT)) {
- feed.setType(Feed.TYPE_ATOM1);
- Log.d(TAG, "Recognized type Atom");
- return Type.ATOM;
- } else if (tag.equals(RSS_ROOT)) {
- String strVersion = xpp.getAttributeValue(null, "version");
- if (strVersion != null) {
- if (strVersion.equals("2.0")) {
- feed.setType(Feed.TYPE_RSS2);
- Log.d(TAG, "Recognized type RSS 2.0");
- return Type.RSS20;
- } else if (strVersion.equals("0.91")
- || strVersion.equals("0.92")) {
- Log.d(TAG, "Recognized type RSS 0.91/0.92");
- return Type.RSS091;
+ switch (tag) {
+ case ATOM_ROOT:
+ feed.setType(Feed.TYPE_ATOM1);
+ Log.d(TAG, "Recognized type Atom");
+ return Type.ATOM;
+ case RSS_ROOT:
+ String strVersion = xpp.getAttributeValue(null, "version");
+ if (strVersion != null) {
+ if (strVersion.equals("2.0")) {
+ feed.setType(Feed.TYPE_RSS2);
+ Log.d(TAG, "Recognized type RSS 2.0");
+ return Type.RSS20;
+ } else if (strVersion.equals("0.91")
+ || strVersion.equals("0.92")) {
+ Log.d(TAG, "Recognized type RSS 0.91/0.92");
+ return Type.RSS091;
+ }
}
- }
- throw new UnsupportedFeedtypeException(Type.INVALID);
- } else {
- Log.d(TAG, "Type is invalid");
- throw new UnsupportedFeedtypeException(Type.INVALID, tag);
+ throw new UnsupportedFeedtypeException(Type.INVALID);
+ default:
+ Log.d(TAG, "Type is invalid");
+ throw new UnsupportedFeedtypeException(Type.INVALID, tag);
}
} else {
eventType = xpp.next();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java
index 71bf69ffa..306b79c15 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSContent.java
@@ -1,8 +1,9 @@
package de.danoeh.antennapod.core.syndication.namespace;
-import de.danoeh.antennapod.core.syndication.handler.HandlerState;
import org.xml.sax.Attributes;
+import de.danoeh.antennapod.core.syndication.handler.HandlerState;
+
public class NSContent extends Namespace {
public static final String NSTAG = "content";
public static final String NSURI = "http://purl.org/rss/1.0/modules/content/";
@@ -17,7 +18,8 @@ public class NSContent extends Namespace {
@Override
public void handleElementEnd(String localName, HandlerState state) {
- if (localName.equals(ENCODED)) {
+ if (ENCODED.equals(localName) && state.getCurrentItem() != null &&
+ state.getContentBuf() != null) {
state.getCurrentItem().setContentEncoded(state.getContentBuf().toString());
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java
index 23f76186b..59d66a97e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSDublinCore.java
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.core.syndication.namespace;
import org.xml.sax.Attributes;
+import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.syndication.handler.HandlerState;
import de.danoeh.antennapod.core.util.DateUtils;
@@ -21,17 +22,16 @@ public class NSDublinCore extends Namespace {
@Override
public void handleElementEnd(String localName, HandlerState state) {
- if(state.getTagstack().size() >= 2
- && state.getContentBuf() != null) {
- String content = state.getContentBuf().toString();
- SyndElement topElement = state.getTagstack().peek();
- String top = topElement.getName();
- SyndElement secondElement = state.getSecondTag();
- String second = secondElement.getName();
- if (top.equals(DATE) && second.equals(ITEM)) {
- state.getCurrentItem().setPubDate(
- DateUtils.parse(content));
+ if (state.getCurrentItem() != null && state.getContentBuf() != null &&
+ state.getTagstack() != null && state.getTagstack().size() >= 2) {
+ FeedItem currentItem = state.getCurrentItem();
+ String top = state.getTagstack().peek().getName();
+ String second = state.getSecondTag().getName();
+ if (DATE.equals(top) && ITEM.equals(second)) {
+ String content = state.getContentBuf().toString();
+ currentItem.setPubDate(DateUtils.parse(content));
}
}
}
+
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java
index 99c4cd67a..1c424c6b5 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSITunes.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.core.syndication.namespace;
import android.text.TextUtils;
+import android.util.Log;
import org.xml.sax.Attributes;
@@ -10,6 +11,7 @@ import de.danoeh.antennapod.core.feed.FeedImage;
import de.danoeh.antennapod.core.syndication.handler.HandlerState;
public class NSITunes extends Namespace {
+
public static final String NSTAG = "itunes";
public static final String NSURI = "http://www.itunes.com/dtds/podcast-1.0.dtd";
@@ -26,69 +28,82 @@ public class NSITunes extends Namespace {
@Override
public SyndElement handleElementStart(String localName, HandlerState state,
Attributes attributes) {
- if (localName.equals(IMAGE)) {
+ if (IMAGE.equals(localName)) {
FeedImage image = new FeedImage();
image.setTitle(IMAGE_TITLE);
image.setDownload_url(attributes.getValue(IMAGE_HREF));
if (state.getCurrentItem() != null) {
// this is an items image
- image.setTitle(state.getCurrentItem().getTitle()+IMAGE_TITLE);
+ image.setTitle(state.getCurrentItem().getTitle() + IMAGE_TITLE);
image.setOwner(state.getCurrentItem());
state.getCurrentItem().setImage(image);
-
- } else {
+ } else {
// this is the feed image
// prefer to all other images
- if(!TextUtils.isEmpty(image.getDownload_url())) {
+ if (!TextUtils.isEmpty(image.getDownload_url())) {
image.setOwner(state.getFeed());
state.getFeed().setImage(image);
}
}
-
}
-
return new SyndElement(localName, this);
}
@Override
public void handleElementEnd(String localName, HandlerState state) {
- if (localName.equals(AUTHOR)) {
- state.getFeed().setAuthor(state.getContentBuf().toString());
- } else if (localName.equals(DURATION)) {
- String[] parts = state.getContentBuf().toString().trim().split(":");
+ if(state.getContentBuf() == null) {
+ return;
+ }
+ if (AUTHOR.equals(localName)) {
+ if (state.getFeed() != null) {
+ String author = state.getContentBuf().toString();
+ state.getFeed().setAuthor(author);
+ }
+ } else if (DURATION.equals(localName)) {
+ String durationStr = state.getContentBuf().toString();
+ if(TextUtils.isEmpty(durationStr)) {
+ return;
+ }
+ String[] parts = durationStr.trim().split(":");
try {
- int duration = 0;
+ int durationMs = 0;
if (parts.length == 2) {
- duration += TimeUnit.MINUTES.toMillis(Long.valueOf(parts[0])) +
- TimeUnit.SECONDS.toMillis(Long.valueOf(parts[1]));
+ durationMs += TimeUnit.MINUTES.toMillis(Long.parseLong(parts[0])) +
+ TimeUnit.SECONDS.toMillis((long)Float.parseFloat(parts[1]));
} else if (parts.length >= 3) {
- duration += TimeUnit.HOURS.toMillis(Long.valueOf(parts[0])) +
- TimeUnit.MINUTES.toMillis(Long.valueOf(parts[1])) +
- TimeUnit.SECONDS.toMillis(Long.valueOf(parts[2]));
+ durationMs += TimeUnit.HOURS.toMillis(Long.parseLong(parts[0])) +
+ TimeUnit.MINUTES.toMillis(Long.parseLong(parts[1])) +
+ TimeUnit.SECONDS.toMillis((long)Float.parseFloat(parts[2]));
} else {
return;
}
- state.getTempObjects().put(DURATION, duration);
+ state.getTempObjects().put(DURATION, durationMs);
} catch (NumberFormatException e) {
- e.printStackTrace();
+ Log.e(NSTAG, "Duration \"" + durationStr + "\" could not be parsed");
}
- } else if (localName.equals(SUBTITLE)) {
+ } else if (SUBTITLE.equals(localName)) {
String subtitle = state.getContentBuf().toString();
+ if (TextUtils.isEmpty(subtitle)) {
+ return;
+ }
if (state.getCurrentItem() != null) {
if (TextUtils.isEmpty(state.getCurrentItem().getDescription())) {
state.getCurrentItem().setDescription(subtitle);
}
} else {
- if (TextUtils.isEmpty(state.getFeed().getDescription())) {
+ if (state.getFeed() != null && TextUtils.isEmpty(state.getFeed().getDescription())) {
state.getFeed().setDescription(subtitle);
}
}
- } else if (localName.equals(SUMMARY)) {
+ } else if (SUMMARY.equals(localName)) {
String summary = state.getContentBuf().toString();
+ if (TextUtils.isEmpty(summary)) {
+ return;
+ }
if (state.getCurrentItem() != null) {
state.getCurrentItem().setDescription(summary);
- } else {
+ } else if (state.getFeed() != null) {
state.getFeed().setDescription(summary);
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java
index 7f03f1139..7a8b2bc03 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSMedia.java
@@ -1,14 +1,16 @@
package de.danoeh.antennapod.core.syndication.namespace;
+import android.text.TextUtils;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
-import de.danoeh.antennapod.core.feed.FeedMedia;
-import de.danoeh.antennapod.core.syndication.handler.HandlerState;
-import de.danoeh.antennapod.core.syndication.util.SyndTypeUtils;
+
import org.xml.sax.Attributes;
import java.util.concurrent.TimeUnit;
+import de.danoeh.antennapod.core.feed.FeedMedia;
+import de.danoeh.antennapod.core.syndication.handler.HandlerState;
+import de.danoeh.antennapod.core.syndication.util.SyndTypeUtils;
+
/** Processes tags from the http://search.yahoo.com/mrss/ namespace. */
public class NSMedia extends Namespace {
private static final String TAG = "NSMedia";
@@ -25,36 +27,41 @@ public class NSMedia extends Namespace {
@Override
public SyndElement handleElementStart(String localName, HandlerState state,
Attributes attributes) {
- if (localName.equals(CONTENT)) {
+ if (CONTENT.equals(localName)) {
String url = attributes.getValue(DOWNLOAD_URL);
String type = attributes.getValue(MIME_TYPE);
- if (state.getCurrentItem().getMedia() == null
- && url != null
- && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils
- .getValidMimeTypeFromUrl(url)) != null))) {
-
+ boolean validType;
+ if(SyndTypeUtils.enclosureTypeValid(type)) {
+ validType = true;
+ } else {
+ type = SyndTypeUtils.getValidMimeTypeFromUrl(url);
+ validType = type != null;
+ }
+ if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null &&
+ url != null && validType) {
long size = 0;
+ String sizeStr = attributes.getValue(SIZE);
try {
- size = Long.parseLong(attributes.getValue(SIZE));
+ size = Long.parseLong(sizeStr);
} catch (NumberFormatException e) {
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Length attribute could not be parsed.");
+ Log.e(TAG, "Size \"" + sizeStr + "\" could not be parsed.");
}
-
- int duration = 0;
- try {
- String durationStr = attributes.getValue(DURATION);
- if (durationStr != null) {
- duration = (int) TimeUnit.MILLISECONDS.convert(
- Long.parseLong(durationStr), TimeUnit.SECONDS);
+
+ int durationMs = 0;
+ String durationStr = attributes.getValue(DURATION);
+ if (!TextUtils.isEmpty(durationStr)) {
+ try {
+ long duration = Long.parseLong(durationStr);
+ durationMs = (int) TimeUnit.MILLISECONDS.convert(duration, TimeUnit.SECONDS);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "Duration \"" + durationStr + "\" could not be parsed");
}
- } catch (NumberFormatException e) {
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Duration attribute could not be parsed");
}
-
- state.getCurrentItem().setMedia(
- new FeedMedia(state.getCurrentItem(), url, size, type));
+ FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type);
+ if(durationMs > 0) {
+ media.setDuration(durationMs);
+ }
+ state.getCurrentItem().setMedia(media);
}
}
return new SyndElement(localName, this);
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 7e19213be..1c7952a56 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
@@ -1,10 +1,10 @@
package de.danoeh.antennapod.core.syndication.namespace;
+import android.text.TextUtils;
import android.util.Log;
import org.xml.sax.Attributes;
-import de.danoeh.antennapod.core.BuildConfig;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedImage;
import de.danoeh.antennapod.core.feed.FeedItem;
@@ -43,18 +43,23 @@ public class NSRSS20 extends Namespace {
@Override
public SyndElement handleElementStart(String localName, HandlerState state,
Attributes attributes) {
- if (localName.equals(ITEM)) {
+ if (ITEM.equals(localName)) {
state.setCurrentItem(new FeedItem());
state.getItems().add(state.getCurrentItem());
state.getCurrentItem().setFeed(state.getFeed());
- } else if (localName.equals(ENCLOSURE)) {
+ } else if (ENCLOSURE.equals(localName)) {
String type = attributes.getValue(ENC_TYPE);
String url = attributes.getValue(ENC_URL);
- if (state.getCurrentItem().getMedia() == null
- && (SyndTypeUtils.enclosureTypeValid(type) || ((type = SyndTypeUtils
- .getValidMimeTypeFromUrl(url)) != null))) {
-
+ boolean validType;
+ if(SyndTypeUtils.enclosureTypeValid(type)) {
+ validType = true;
+ } else {
+ type = type = SyndTypeUtils.getValidMimeTypeFromUrl(url);
+ validType = type != null;
+ }
+ if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null &&
+ validType) {
long size = 0;
try {
size = Long.parseLong(attributes.getValue(ENC_LEN));
@@ -63,19 +68,18 @@ public class NSRSS20 extends Namespace {
size = 0;
}
} catch (NumberFormatException e) {
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Length attribute could not be parsed.");
+ Log.d(TAG, "Length attribute could not be parsed.");
}
state.getCurrentItem().setMedia(
new FeedMedia(state.getCurrentItem(), url, size, type));
}
- } else if (localName.equals(IMAGE)) {
+ } else if (IMAGE.equals(localName)) {
if (state.getTagstack().size() >= 1) {
String parent = state.getTagstack().peek().getName();
- if (parent.equals(CHANNEL)) {
+ if (CHANNEL.equals(parent)) {
Feed feed = state.getFeed();
- if(feed.getImage() == null) {
+ if(feed != null && feed.getImage() == null) {
feed.setImage(new FeedImage());
feed.getImage().setOwner(state.getFeed());
}
@@ -87,26 +91,26 @@ public class NSRSS20 extends Namespace {
@Override
public void handleElementEnd(String localName, HandlerState state) {
- if (localName.equals(ITEM)) {
+ if (ITEM.equals(localName)) {
if (state.getCurrentItem() != null) {
+ FeedItem currentItem = state.getCurrentItem();
// the title tag is optional in RSS 2.0. The description is used
// as a
// title if the item has no title-tag.
- if (state.getCurrentItem().getTitle() == null) {
- state.getCurrentItem().setTitle(
- state.getCurrentItem().getDescription());
+ if (currentItem.getTitle() == null) {
+ currentItem.setTitle(currentItem.getDescription());
}
if (state.getTempObjects().containsKey(NSITunes.DURATION)) {
- if (state.getCurrentItem().hasMedia()) {
- state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION));
+ if (currentItem.hasMedia()) {
+ Integer duration = (Integer) state.getTempObjects().get(NSITunes.DURATION);
+ currentItem.getMedia().setDuration(duration);
}
state.getTempObjects().remove(NSITunes.DURATION);
}
}
state.setCurrentItem(null);
- } else if (state.getTagstack().size() >= 2
- && state.getContentBuf() != null) {
+ } else if (state.getTagstack().size() >= 2 && state.getContentBuf() != null) {
String content = state.getContentBuf().toString();
SyndElement topElement = state.getTagstack().peek();
String top = topElement.getName();
@@ -116,46 +120,44 @@ public class NSRSS20 extends Namespace {
if (state.getTagstack().size() >= 3) {
third = state.getThirdTag().getName();
}
-
- if (top.equals(GUID) && second.equals(ITEM)) {
+ if (GUID.equals(top) && ITEM.equals(second)) {
// some feed creators include an empty or non-standard guid-element in their feed, which should be ignored
- if (!content.isEmpty()) {
+ if (!TextUtils.isEmpty(content) && state.getCurrentItem() != null) {
state.getCurrentItem().setItemIdentifier(content);
}
- } else if (top.equals(TITLE)) {
+ } else if (TITLE.equals(top)) {
String title = content.trim();
- if (second.equals(ITEM)) {
+ if (ITEM.equals(second) && state.getCurrentItem() != null) {
state.getCurrentItem().setTitle(title);
- } else if (second.equals(CHANNEL)) {
+ } else if (CHANNEL.equals(second) && state.getFeed() != null) {
state.getFeed().setTitle(title);
- } else if (second.equals(IMAGE) && third != null
- && third.equals(CHANNEL)) {
- if(state.getFeed().getImage().getTitle() == null) {
+ } else if (IMAGE.equals(second) && CHANNEL.equals(third)) {
+ if(state.getFeed() != null && state.getFeed().getImage() != null &&
+ state.getFeed().getImage().getTitle() == null) {
state.getFeed().getImage().setTitle(title);
}
}
- } else if (top.equals(LINK)) {
- if (second.equals(CHANNEL)) {
+ } else if (LINK.equals(top)) {
+ if (CHANNEL.equals(second) && state.getFeed() != null) {
state.getFeed().setLink(content);
- } else if (second.equals(ITEM)) {
+ } else if (ITEM.equals(second) && state.getCurrentItem() != null) {
state.getCurrentItem().setLink(content);
}
- } else if (top.equals(PUBDATE) && second.equals(ITEM)) {
- state.getCurrentItem().setPubDate(
- DateUtils.parse(content));
- } else if (top.equals(URL) && second.equals(IMAGE) && third != null
- && third.equals(CHANNEL)) {
- if(state.getFeed().getImage().getDownload_url() == null) { // prefer itunes:image
+ } else if (PUBDATE.equals(top) && ITEM.equals(second) && state.getCurrentItem() != null) {
+ state.getCurrentItem().setPubDate(DateUtils.parse(content));
+ } else if (URL.equals(top) && IMAGE.equals(second) && CHANNEL.equals(third)) {
+ // prefer itunes:image
+ if(state.getFeed() != null && state.getFeed().getImage() != null &&
+ state.getFeed().getImage().getDownload_url() == null) {
state.getFeed().getImage().setDownload_url(content);
}
- } else if (localName.equals(DESCR)) {
- if (second.equals(CHANNEL)) {
+ } else if (DESCR.equals(localName)) {
+ if (CHANNEL.equals(second) && state.getFeed() != null) {
state.getFeed().setDescription(content);
- } else if (second.equals(ITEM)) {
+ } else if (ITEM.equals(second) && state.getCurrentItem() != null) {
state.getCurrentItem().setDescription(content);
}
-
- } else if (localName.equals(LANGUAGE)) {
+ } else if (LANGUAGE.equals(localName) && state.getFeed() != null) {
state.getFeed().setLanguage(content.toLowerCase());
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java
index 64b82100e..703817a35 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/NSSimpleChapters.java
@@ -6,8 +6,7 @@ import org.xml.sax.Attributes;
import java.util.ArrayList;
-import de.danoeh.antennapod.core.BuildConfig;
-import de.danoeh.antennapod.core.feed.Chapter;
+import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.SimpleChapter;
import de.danoeh.antennapod.core.syndication.handler.HandlerState;
import de.danoeh.antennapod.core.util.DateUtils;
@@ -27,21 +26,22 @@ public class NSSimpleChapters extends Namespace {
@Override
public SyndElement handleElementStart(String localName, HandlerState state,
Attributes attributes) {
- if (localName.equals(CHAPTERS)) {
- state.getCurrentItem().setChapters(new ArrayList<Chapter>());
- } else if (localName.equals(CHAPTER)) {
- try {
- state.getCurrentItem()
- .getChapters()
- .add(new SimpleChapter(DateUtils
- .parseTimeString(attributes.getValue(START)),
- attributes.getValue(TITLE), state.getCurrentItem(),
- attributes.getValue(HREF)));
- } catch (NumberFormatException e) {
- if (BuildConfig.DEBUG) Log.w(TAG, "Unable to read chapter", e);
+ FeedItem currentItem = state.getCurrentItem();
+ if(currentItem != null) {
+ if (localName.equals(CHAPTERS)) {
+ currentItem.setChapters(new ArrayList<>());
+ } else if (localName.equals(CHAPTER)) {
+ try {
+ long start = DateUtils.parseTimeString(attributes.getValue(START));
+ String title = attributes.getValue(TITLE);
+ String link = attributes.getValue(HREF);
+ SimpleChapter chapter = new SimpleChapter(start, title, currentItem, link);
+ currentItem.getChapters().add(chapter);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "Unable to read chapter", e);
+ }
}
}
-
return new SyndElement(localName, this);
}
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 b23a142af..7b5abf053 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
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.core.syndication.namespace.atom;
+import android.text.TextUtils;
import android.util.Log;
import org.xml.sax.Attributes;
@@ -65,21 +66,21 @@ public class NSAtom extends Namespace {
@Override
public SyndElement handleElementStart(String localName, HandlerState state,
Attributes attributes) {
- if (localName.equals(ENTRY)) {
+ if (ENTRY.equals(localName)) {
state.setCurrentItem(new FeedItem());
state.getItems().add(state.getCurrentItem());
state.getCurrentItem().setFeed(state.getFeed());
} else if (localName.matches(isText)) {
String type = attributes.getValue(TEXT_TYPE);
return new AtomText(localName, this, type);
- } else if (localName.equals(LINK)) {
+ } else if (LINK.equals(localName)) {
String href = attributes.getValue(LINK_HREF);
String rel = attributes.getValue(LINK_REL);
SyndElement parent = state.getTagstack().peek();
if (parent.getName().matches(isFeedItem)) {
- if (rel == null || rel.equals(LINK_REL_ALTERNATE)) {
+ if (LINK_REL_ALTERNATE.equals(rel)) {
state.getCurrentItem().setLink(href);
- } else if (rel.equals(LINK_REL_ENCLOSURE)) {
+ } else if (LINK_REL_ENCLOSURE.equals(rel)) {
String strSize = attributes.getValue(LINK_LENGTH);
long size = 0;
try {
@@ -90,40 +91,45 @@ public class NSAtom extends Namespace {
Log.d(TAG, "Length attribute could not be parsed.");
}
String type = attributes.getValue(LINK_TYPE);
- if (SyndTypeUtils.enclosureTypeValid(type)
- || (type = SyndTypeUtils.getValidMimeTypeFromUrl(href)) != null) {
+ boolean validType;
+ if(SyndTypeUtils.enclosureTypeValid(type)) {
+ validType = true;
+ } else {
+ type = SyndTypeUtils.getValidMimeTypeFromUrl(href);
+ validType = type != null;
+ }
+ if (validType) {
FeedItem currItem = state.getCurrentItem();
- if(!currItem.hasMedia()) {
+ if(currItem != null && !currItem.hasMedia()) {
currItem.setMedia(new FeedMedia(currItem, href, size, type));
}
}
- } else if (rel.equals(LINK_REL_PAYMENT)) {
+ } else if (LINK_REL_PAYMENT.equals(rel)) {
state.getCurrentItem().setPaymentLink(href);
}
} else if (parent.getName().matches(isFeed)) {
- if (rel == null || rel.equals(LINK_REL_ALTERNATE)) {
+ if (LINK_REL_ALTERNATE.equals(rel)) {
String type = attributes.getValue(LINK_TYPE);
/*
* Use as link if a) no type-attribute is given and
* feed-object has no link yet b) type of link is
* LINK_TYPE_HTML or LINK_TYPE_XHTML
*/
- if ((type == null && state.getFeed().getLink() == null)
- || (type != null && (type.equals(LINK_TYPE_HTML)
- || type.equals(LINK_TYPE_XHTML)))) {
+ if (state.getFeed() != null &&
+ ((type == null && state.getFeed().getLink() == null) ||
+ (LINK_TYPE_HTML.equals(type) || LINK_TYPE_XHTML.equals(type)))) {
state.getFeed().setLink(href);
- } else if (type != null && (type.equals(LINK_TYPE_ATOM)
- || type.equals(LINK_TYPE_RSS))) {
+ } else if (LINK_TYPE_ATOM.equals(type) || LINK_TYPE_RSS.equals(type)) {
// treat as podlove alternate feed
String title = attributes.getValue(LINK_TITLE);
- if (title == null) {
+ if (TextUtils.isEmpty(title)) {
title = href;
}
state.addAlternateFeedUrl(title, href);
}
- } else if (rel.equals(LINK_REL_PAYMENT)) {
+ } else if (LINK_REL_PAYMENT.equals(rel) && state.getFeed() != null) {
state.getFeed().setPaymentLink(href);
- } else if (rel.equals(LINK_REL_NEXT)) {
+ } else if (LINK_REL_NEXT.equals(rel) && state.getFeed() != null) {
state.getFeed().setPaged(true);
state.getFeed().setNextPageLink(href);
}
@@ -134,11 +140,13 @@ public class NSAtom extends Namespace {
@Override
public void handleElementEnd(String localName, HandlerState state) {
- if (localName.equals(ENTRY)) {
+ if (ENTRY.equals(localName)) {
if (state.getCurrentItem() != null &&
state.getTempObjects().containsKey(NSITunes.DURATION)) {
- if (state.getCurrentItem().hasMedia()) {
- state.getCurrentItem().getMedia().setDuration((Integer) state.getTempObjects().get(NSITunes.DURATION));
+ FeedItem currentItem = state.getCurrentItem();
+ if (currentItem.hasMedia()) {
+ Integer duration = (Integer) state.getTempObjects().get(NSITunes.DURATION);
+ currentItem.getMedia().setDuration(duration);
}
state.getTempObjects().remove(NSITunes.DURATION);
}
@@ -163,47 +171,32 @@ public class NSAtom extends Namespace {
textElement.setContent(content);
}
- if (top.equals(ID)) {
- if (second.equals(FEED)) {
+ if (ID.equals(top)) {
+ if (FEED.equals(second) && state.getFeed() != null) {
state.getFeed().setFeedIdentifier(content);
- } else if (second.equals(ENTRY)) {
+ } else if (ENTRY.equals(second) && state.getCurrentItem() != null) {
state.getCurrentItem().setItemIdentifier(content);
}
- } else if (top.equals(TITLE)) {
-
- if (second.equals(FEED)) {
+ } else if (TITLE.equals(top) && textElement != null) {
+ if (FEED.equals(second) && state.getFeed() != null) {
state.getFeed().setTitle(textElement.getProcessedContent());
- } else if (second.equals(ENTRY)) {
- state.getCurrentItem().setTitle(
- textElement.getProcessedContent());
- }
- } else if (top.equals(SUBTITLE)) {
- if (second.equals(FEED)) {
- state.getFeed().setDescription(
- textElement.getProcessedContent());
- }
- } else if (top.equals(CONTENT)) {
- if (second.equals(ENTRY)) {
- state.getCurrentItem().setDescription(
- textElement.getProcessedContent());
- }
- } else if (top.equals(UPDATED)) {
- if (second.equals(ENTRY)
- && state.getCurrentItem().getPubDate() == null) {
- state.getCurrentItem().setPubDate(
- DateUtils.parse(content));
- }
- } else if (top.equals(PUBLISHED)) {
- if (second.equals(ENTRY)) {
- state.getCurrentItem().setPubDate(
- DateUtils.parse(content));
- }
- } else if (top.equals(IMAGE)) {
- if(state.getFeed().getImage() == null) {
- state.getFeed().setImage(new FeedImage(state.getFeed(), content, null));
+ } else if (ENTRY.equals(second) && state.getCurrentItem() != null) {
+ state.getCurrentItem().setTitle(textElement.getProcessedContent());
}
+ } else if (SUBTITLE.equals(top) && FEED.equals(second) && textElement != null &&
+ state.getFeed() != null) {
+ state.getFeed().setDescription(textElement.getProcessedContent());
+ } else if (CONTENT.equals(top) && ENTRY.equals(second) && textElement != null &&
+ state.getCurrentItem() != null) {
+ state.getCurrentItem().setDescription(textElement.getProcessedContent());
+ } else if (UPDATED.equals(top) && ENTRY.equals(second) && state.getCurrentItem() != null &&
+ state.getCurrentItem().getPubDate() == null) {
+ state.getCurrentItem().setPubDate(DateUtils.parse(content));
+ } else if (PUBLISHED.equals(top) && ENTRY.equals(second) && state.getCurrentItem() != null) {
+ state.getCurrentItem().setPubDate(DateUtils.parse(content));
+ } else if (IMAGE.equals(top) && state.getFeed() != null && state.getFeed().getImage() == null) {
+ state.getFeed().setImage(new FeedImage(state.getFeed(), content, null));
}
-
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java
index 8d1d8ffde..e84361fb2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/util/SyndTypeUtils.java
@@ -30,8 +30,7 @@ public class SyndTypeUtils {
if (url != null) {
String extension = FilenameUtils.getExtension(url);
if (extension != null) {
- String type = MimeTypeMap.getSingleton()
- .getMimeTypeFromExtension(extension);
+ String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
if (type != null && enclosureTypeValid(type)) {
return type;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java
index 8dd9ffe4b..5169f7e76 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java
@@ -10,7 +10,6 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.List;
@@ -63,11 +62,7 @@ public class ChapterUtils {
} else {
Log.i(TAG, "ChapterReader could not find any ID3 chapters");
}
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ID3ReaderException e) {
+ } catch (IOException | ID3ReaderException e) {
e.printStackTrace();
} finally {
if (in != null) {
@@ -116,9 +111,7 @@ public class ChapterUtils {
Log.i(TAG,
"ChapterReader could not find any ID3 chapters");
}
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ID3ReaderException e) {
+ } catch (IOException | ID3ReaderException e) {
e.printStackTrace();
} finally {
if (in != null) {
@@ -144,8 +137,6 @@ public class ChapterUtils {
if (input != null) {
readOggChaptersFromInputStream(media, input);
}
- } catch (MalformedURLException e) {
- e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
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 1b929b214..70a180913 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
@@ -3,6 +3,8 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
import android.util.Log;
+import java.util.Locale;
+
import de.danoeh.antennapod.core.R;
/** Provides methods for converting various units. */
@@ -88,9 +90,9 @@ public final class Converter {
if (parts.length != 3) {
return 0;
}
- return Integer.valueOf(parts[0]) * 3600 * 1000 +
- Integer.valueOf(parts[1]) * 60 * 1000 +
- Integer.valueOf(parts[2]) * 1000;
+ return Integer.parseInt(parts[0]) * 3600 * 1000 +
+ Integer.parseInt(parts[1]) * 60 * 1000 +
+ Integer.parseInt(parts[2]) * 1000;
}
/** Converts short duration string (HH:MM) to milliseconds. */
@@ -99,8 +101,8 @@ public final class Converter {
if (parts.length != 2) {
return 0;
}
- return Integer.valueOf(parts[0]) * 3600 * 1000 +
- Integer.valueOf(parts[1]) * 1000 * 60;
+ return Integer.parseInt(parts[0]) * 3600 * 1000 +
+ Integer.parseInt(parts[1]) * 1000 * 60;
}
/** Converts milliseconds to a localized string containing hours and minutes */
@@ -118,5 +120,26 @@ public final class Converter {
result += minutes;
return result;
}
-
+
+ /**
+ * Converts seconds to a localized representation
+ * @param time The time in seconds
+ * @return "HH:MM hours"
+ */
+ public static String shortLocalizedDuration(Context context, long time) {
+ float hours = (float) time / 3600f;
+ return String.format(Locale.getDefault(), "%.1f ", hours) + context.getString(R.string.time_hours);
+ }
+
+ /**
+ * Converts the volume as read as the progress from a SeekBar scaled to 100 and as saved in
+ * UserPreferences to the format taken by setVolume methods.
+ * @param progress integer between 0 to 100 taken from the SeekBar progress
+ * @return the appropriate volume as float taken by setVolume methods
+ */
+ public static float getVolumeFromPercentage(int progress){
+ if (progress==100)
+ return 1f;
+ return (float) (1 - (Math.log(101 - progress) / Math.log(101)));
+ }
}
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 4b4201b50..314062e52 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
@@ -19,14 +19,8 @@ public class DateUtils {
private static final String TAG = "DateUtils";
- private static final SimpleDateFormat parser = new SimpleDateFormat("", Locale.US);
private static final TimeZone defaultTimezone = TimeZone.getTimeZone("GMT");
- static {
- parser.setLenient(false);
- parser.setTimeZone(defaultTimezone);
- }
-
public static Date parse(final String input) {
if(input == null) {
throw new IllegalArgumentException("Date must not be null");
@@ -86,6 +80,10 @@ public class DateUtils {
"yyyy-MM-dd"
};
+ SimpleDateFormat parser = new SimpleDateFormat("", Locale.US);
+ parser.setLenient(false);
+ parser.setTimeZone(defaultTimezone);
+
ParsePosition pos = new ParsePosition(0);
for(String pattern : patterns) {
parser.applyPattern(pattern);
@@ -117,13 +115,13 @@ public class DateUtils {
int idx = 0;
if (parts.length == 3) {
// string has hours
- result += Integer.valueOf(parts[idx]) * 3600000L;
+ result += Integer.parseInt(parts[idx]) * 3600000L;
idx++;
}
if (parts.length >= 2) {
- result += Integer.valueOf(parts[idx]) * 60000L;
+ result += Integer.parseInt(parts[idx]) * 60000L;
idx++;
- result += (Float.valueOf(parts[idx])) * 1000L;
+ result += (Float.parseFloat(parts[idx])) * 1000L;
}
return result;
}
@@ -145,6 +143,9 @@ public class DateUtils {
}
public static String formatAbbrev(final Context context, final Date date) {
+ if(date == null) {
+ return "";
+ }
GregorianCalendar cal = new GregorianCalendar();
cal.add(GregorianCalendar.YEAR, -1);
// some padding, because no one really remembers what day of the month it is
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java b/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java
index 602c221bf..4ad88743f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/DownloadError.java
@@ -19,12 +19,13 @@ public enum DownloadError {
ERROR_UNKNOWN_HOST(11, R.string.download_error_unknown_host),
ERROR_REQUEST_ERROR(12, R.string.download_error_request_error),
ERROR_DB_ACCESS_ERROR(13, R.string.download_error_db_access),
- ERROR_UNAUTHORIZED(14, R.string.download_error_unauthorized);
+ ERROR_UNAUTHORIZED(14, R.string.download_error_unauthorized),
+ ERROR_FILE_TYPE(15, R.string.download_error_file_type_type);
private final int code;
private final int resId;
- private DownloadError(int code, int resId) {
+ DownloadError(int code, int resId) {
this.code = code;
this.resId = resId;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java b/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java
index 029e7fe84..89edd7dbe 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/EpisodeFilter.java
@@ -13,7 +13,7 @@ public class EpisodeFilter {
/** Return a copy of the itemlist without items which have no media. */
public static ArrayList<FeedItem> getEpisodeList(List<FeedItem> items) {
- ArrayList<FeedItem> episodes = new ArrayList<FeedItem>(items);
+ ArrayList<FeedItem> episodes = new ArrayList<>(items);
for (FeedItem item : items) {
if (item.getMedia() == null) {
episodes.remove(item);
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java b/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java
index 673c81235..f48b9169b 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/IntList.java
@@ -35,7 +35,7 @@ public final class IntList {
int hashCode = 1;
for (int i = 0; i < size; i++) {
int value = values[i];
- hashCode = 31 * hashCode + (int)(value ^ (value >>> 32));
+ hashCode = 31 * hashCode + value;
}
return hashCode;
}
@@ -62,7 +62,7 @@ public final class IntList {
@Override
public String toString() {
- StringBuffer sb = new StringBuffer(size * 5 + 10);
+ StringBuilder sb = new StringBuilder(size * 5 + 10);
sb.append("IntList{");
for (int i = 0; i < size; i++) {
if (i != 0) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java b/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java
index 6ed8b820e..fdc244517 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/LongList.java
@@ -73,7 +73,7 @@ public final class LongList {
@Override
public String toString() {
- StringBuffer sb = new StringBuffer(size * 5 + 10);
+ StringBuilder sb = new StringBuilder(size * 5 + 10);
sb.append("LongList{");
for (int i = 0; i < size; i++) {
if (i != 0) {
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 c2cd273b8..927639e69 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
@@ -96,7 +96,7 @@ public class NetworkUtils {
return Observable.create(new Observable.OnSubscribe<Long>() {
@Override
public void call(Subscriber<? super Long> subscriber) {
- if (false == NetworkUtils.isDownloadAllowed()) {
+ if (!NetworkUtils.isDownloadAllowed()) {
subscriber.onNext(0L);
subscriber.onCompleted();
return;
@@ -107,7 +107,7 @@ public class NetworkUtils {
if (mediaFile.exists()) {
size = mediaFile.length();
}
- } else if (false == media.checkedOnSizeButUnknown()) {
+ } else if (!media.checkedOnSizeButUnknown()) {
// only query the network if we haven't already checked
String url = media.getDownload_url();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java
index 71d6040ba..5dc194dbd 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java
@@ -2,12 +2,12 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
+import java.util.Comparator;
+
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.storage.DBWriter;
-import java.util.Comparator;
-
/**
* Provides method for sorting the queue according to rules.
*/
@@ -26,59 +26,39 @@ public class QueueSorter {
switch (rule) {
case ALPHA_ASC:
- comparator = new Comparator<FeedItem>() {
- public int compare(FeedItem f1, FeedItem f2) {
- return f1.getTitle().compareTo(f2.getTitle());
- }
- };
+ comparator = (f1, f2) -> f1.getTitle().compareTo(f2.getTitle());
break;
case ALPHA_DESC:
- comparator = new Comparator<FeedItem>() {
- public int compare(FeedItem f1, FeedItem f2) {
- return f2.getTitle().compareTo(f1.getTitle());
- }
- };
+ comparator = (f1, f2) -> f2.getTitle().compareTo(f1.getTitle());
break;
case DATE_ASC:
- comparator = new Comparator<FeedItem>() {
- public int compare(FeedItem f1, FeedItem f2) {
- return f1.getPubDate().compareTo(f2.getPubDate());
- }
- };
+ comparator = (f1, f2) -> f1.getPubDate().compareTo(f2.getPubDate());
break;
case DATE_DESC:
- comparator = new Comparator<FeedItem>() {
- public int compare(FeedItem f1, FeedItem f2) {
- return f2.getPubDate().compareTo(f1.getPubDate());
- }
- };
+ comparator = (f1, f2) -> f2.getPubDate().compareTo(f1.getPubDate());
break;
case DURATION_ASC:
- comparator = new Comparator<FeedItem>() {
- public int compare(FeedItem f1, FeedItem f2) {
- FeedMedia f1Media = f1.getMedia();
- FeedMedia f2Media = f2.getMedia();
- int duration1 = f1Media != null ? f1Media.getDuration() : -1;
- int duration2 = f2Media != null ? f2Media.getDuration() : -1;
+ comparator = (f1, f2) -> {
+ FeedMedia f1Media = f1.getMedia();
+ FeedMedia f2Media = f2.getMedia();
+ int duration1 = f1Media != null ? f1Media.getDuration() : -1;
+ int duration2 = f2Media != null ? f2Media.getDuration() : -1;
- if (duration1 == -1 || duration2 == -1)
- return duration2 - duration1;
- else
- return duration1 - duration2;
- }
+ if (duration1 == -1 || duration2 == -1)
+ return duration2 - duration1;
+ else
+ return duration1 - duration2;
};
break;
case DURATION_DESC:
- comparator = new Comparator<FeedItem>() {
- public int compare(FeedItem f1, FeedItem f2) {
+ comparator = (f1, f2) -> {
FeedMedia f1Media = f1.getMedia();
FeedMedia f2Media = f2.getMedia();
int duration1 = f1Media != null ? f1Media.getDuration() : -1;
int duration2 = f2Media != null ? f2Media.getDuration() : -1;
return -1 * (duration1 - duration2);
- }
- };
+ };
default:
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java b/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java
index 7e7c6c08b..a4cd83f70 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/ShownotesProvider.java
@@ -11,6 +11,6 @@ public interface ShownotesProvider {
* database, it should be done in a separate thread. After the shownotes
* have been loaded, callback.onShownotesLoaded should be called.
*/
- public Callable<String> loadShownotes();
+ Callable<String> loadShownotes();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java
index 092c06b4a..e093dc766 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/URIUtil.java
@@ -1,13 +1,14 @@
package de.danoeh.antennapod.core.util;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
+import de.danoeh.antennapod.core.BuildConfig;
+
/**
* Utility methods for dealing with URL encoding.
*/
@@ -26,9 +27,7 @@ public class URIUtil {
try {
URL url = new URL(source);
return new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
- } catch (MalformedURLException e) {
- throw new IllegalArgumentException(e);
- } catch (URISyntaxException e) {
+ } catch (MalformedURLException | URISyntaxException e) {
throw new IllegalArgumentException(e);
}
}
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 e4818214e..97958eea7 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
@@ -1,11 +1,13 @@
package de.danoeh.antennapod.core.util.flattr;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
+
import org.shredzone.flattr4j.FlattrFactory;
import org.shredzone.flattr4j.FlattrService;
import org.shredzone.flattr4j.oauth.AccessToken;
+import de.danoeh.antennapod.core.BuildConfig;
+
/** Ensures that only one instance of the FlattrService class exists at a time */
public class FlattrServiceCreator {
@@ -13,11 +15,14 @@ public class FlattrServiceCreator {
private static volatile FlattrService flattrService;
- public static FlattrService getService(AccessToken token) {
- return FlattrFactory.getInstance().createFlattrService(token);
+ public synchronized static FlattrService getService(AccessToken token) {
+ if (flattrService == null) {
+ flattrService = FlattrFactory.getInstance().createFlattrService(token);
+ }
+ return flattrService;
}
- public static void deleteFlattrService() {
+ public synchronized static void deleteFlattrService() {
if (BuildConfig.DEBUG) Log.d(TAG, "Deleting service instance");
flattrService = null;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java
deleted file mode 100644
index 17581d3e9..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/gui/FeedItemUndoToken.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package de.danoeh.antennapod.core.util.gui;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import de.danoeh.antennapod.core.feed.FeedItem;
-
-/**
- * Used by an UndoBarController for saving a removed FeedItem
- */
-public class FeedItemUndoToken implements Parcelable {
- private long itemId;
- private long feedId;
- private int position;
-
- public FeedItemUndoToken(FeedItem item, int position) {
- this.itemId = item.getId();
- this.feedId = item.getFeed().getId();
- this.position = position;
- }
-
- private FeedItemUndoToken(Parcel in) {
- itemId = in.readLong();
- feedId = in.readLong();
- position = in.readInt();
- }
-
- public static final Parcelable.Creator<FeedItemUndoToken> CREATOR = new Parcelable.Creator<FeedItemUndoToken>() {
- public FeedItemUndoToken createFromParcel(Parcel in) {
- return new FeedItemUndoToken(in);
- }
-
- public FeedItemUndoToken[] newArray(int size) {
- return new FeedItemUndoToken[size];
- }
- };
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeLong(itemId);
- out.writeLong(feedId);
- out.writeInt(position);
- }
-
- public long getFeedItemId() {
- return itemId;
- }
-
- public int getPosition() {
- return position;
- }
-}
-
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 d56871fd1..386f46724 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
@@ -19,12 +19,9 @@ public class MoreContentListFooterUtil {
public MoreContentListFooterUtil(View root) {
this.root = root;
- root.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (listener != null && !loading) {
- listener.onClick();
- }
+ root.setOnClickListener(v -> {
+ if (listener != null && !loading) {
+ listener.onClick();
}
});
}
@@ -46,8 +43,8 @@ public class MoreContentListFooterUtil {
listener = l;
}
- public static interface Listener {
- public void onClick();
+ public interface Listener {
+ void onClick();
}
public View getRoot() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java
index 9f3c4c6d5..1807421b0 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ChapterReader.java
@@ -1,11 +1,6 @@
package de.danoeh.antennapod.core.util.id3reader;
import android.util.Log;
-import de.danoeh.antennapod.core.BuildConfig;
-import de.danoeh.antennapod.core.feed.Chapter;
-import de.danoeh.antennapod.core.feed.ID3Chapter;
-import de.danoeh.antennapod.core.util.id3reader.model.FrameHeader;
-import de.danoeh.antennapod.core.util.id3reader.model.TagHeader;
import java.io.IOException;
import java.io.InputStream;
@@ -13,6 +8,12 @@ import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
+import de.danoeh.antennapod.core.BuildConfig;
+import de.danoeh.antennapod.core.feed.Chapter;
+import de.danoeh.antennapod.core.feed.ID3Chapter;
+import de.danoeh.antennapod.core.util.id3reader.model.FrameHeader;
+import de.danoeh.antennapod.core.util.id3reader.model.TagHeader;
+
public class ChapterReader extends ID3Reader {
private static final String TAG = "ID3ChapterReader";
@@ -25,7 +26,7 @@ public class ChapterReader extends ID3Reader {
@Override
public int onStartTagHeader(TagHeader header) {
- chapters = new ArrayList<Chapter>();
+ chapters = new ArrayList<>();
System.out.println(header.toString());
return ID3Reader.ACTION_DONT_SKIP;
}
@@ -34,49 +35,53 @@ public class ChapterReader extends ID3Reader {
public int onStartFrameHeader(FrameHeader header, InputStream input)
throws IOException, ID3ReaderException {
System.out.println(header.toString());
- if (header.getId().equals(FRAME_ID_CHAPTER)) {
- if (currentChapter != null) {
- if (!hasId3Chapter(currentChapter)) {
- chapters.add(currentChapter);
- if (BuildConfig.DEBUG) Log.d(TAG, "Found chapter: " + currentChapter);
- currentChapter = null;
+ switch (header.getId()) {
+ case FRAME_ID_CHAPTER:
+ if (currentChapter != null) {
+ if (!hasId3Chapter(currentChapter)) {
+ chapters.add(currentChapter);
+ if (BuildConfig.DEBUG) Log.d(TAG, "Found chapter: " + currentChapter);
+ currentChapter = null;
+ }
}
- }
- StringBuffer elementId = new StringBuffer();
- readISOString(elementId, input, Integer.MAX_VALUE);
- char[] startTimeSource = readBytes(input, 4);
- long startTime = ((int) startTimeSource[0] << 24)
- | ((int) startTimeSource[1] << 16)
- | ((int) startTimeSource[2] << 8) | startTimeSource[3];
- currentChapter = new ID3Chapter(elementId.toString(), startTime);
- skipBytes(input, 12);
- return ID3Reader.ACTION_DONT_SKIP;
- } else if (header.getId().equals(FRAME_ID_TITLE)) {
- if (currentChapter != null && currentChapter.getTitle() == null) {
- StringBuffer title = new StringBuffer();
- readString(title, input, header.getSize());
- currentChapter
- .setTitle(title.toString());
- if (BuildConfig.DEBUG) Log.d(TAG, "Found title: " + currentChapter.getTitle());
-
+ StringBuffer elementId = new StringBuffer();
+ readISOString(elementId, input, Integer.MAX_VALUE);
+ char[] startTimeSource = readBytes(input, 4);
+ long startTime = ((int) startTimeSource[0] << 24)
+ | ((int) startTimeSource[1] << 16)
+ | ((int) startTimeSource[2] << 8) | startTimeSource[3];
+ currentChapter = new ID3Chapter(elementId.toString(), startTime);
+ skipBytes(input, 12);
return ID3Reader.ACTION_DONT_SKIP;
- }
- } else if (header.getId().equals(FRAME_ID_LINK)) {
- if (currentChapter != null) {
- // skip description
- int descriptionLength = readString(null, input, header.getSize());
- StringBuffer link = new StringBuffer();
- readISOString(link, input, header.getSize() - descriptionLength);
- String decodedLink = URLDecoder.decode(link.toString(), "UTF-8");
-
- currentChapter.setLink(decodedLink);
-
- if (BuildConfig.DEBUG) Log.d(TAG, "Found link: " + currentChapter.getLink());
- return ID3Reader.ACTION_DONT_SKIP;
- }
- } else if (header.getId().equals("APIC")) {
- Log.d(TAG, header.toString());
- }
+ case FRAME_ID_TITLE:
+ if (currentChapter != null && currentChapter.getTitle() == null) {
+ StringBuffer title = new StringBuffer();
+ readString(title, input, header.getSize());
+ currentChapter
+ .setTitle(title.toString());
+ if (BuildConfig.DEBUG) Log.d(TAG, "Found title: " + currentChapter.getTitle());
+
+ return ID3Reader.ACTION_DONT_SKIP;
+ }
+ break;
+ case FRAME_ID_LINK:
+ if (currentChapter != null) {
+ // skip description
+ int descriptionLength = readString(null, input, header.getSize());
+ StringBuffer link = new StringBuffer();
+ readISOString(link, input, header.getSize() - descriptionLength);
+ String decodedLink = URLDecoder.decode(link.toString(), "UTF-8");
+
+ currentChapter.setLink(decodedLink);
+
+ if (BuildConfig.DEBUG) Log.d(TAG, "Found link: " + currentChapter.getLink());
+ return ID3Reader.ACTION_DONT_SKIP;
+ }
+ break;
+ case "APIC":
+ Log.d(TAG, header.toString());
+ break;
+ }
return super.onStartFrameHeader(header, input);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java
index f0850e6df..846733882 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/AudioPlayer.java
@@ -1,8 +1,11 @@
package de.danoeh.antennapod.core.util.playback;
import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
import android.util.Log;
import android.view.SurfaceHolder;
+
import org.antennapod.audio.MediaPlayer;
import de.danoeh.antennapod.core.preferences.UserPreferences;
@@ -12,8 +15,17 @@ public class AudioPlayer extends MediaPlayer implements IPlayer {
public AudioPlayer(Context context) {
super(context);
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .registerOnSharedPreferenceChangeListener(sonicListener);
}
+ private final SharedPreferences.OnSharedPreferenceChangeListener sonicListener =
+ (sharedPreferences, key) -> {
+ if (key.equals(UserPreferences.PREF_SONIC)) {
+ checkMpi();
+ }
+ };
+
@Override
public void setScreenOnWhilePlaying(boolean screenOn) {
Log.e(TAG, "Setting screen on while playing not supported in Audio Player");
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java
index ec50dce7c..412a27b95 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/ExternalMedia.java
@@ -6,13 +6,14 @@ import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
-import de.danoeh.antennapod.core.feed.Chapter;
-import de.danoeh.antennapod.core.feed.MediaType;
-import de.danoeh.antennapod.core.util.ChapterUtils;
import java.util.List;
import java.util.concurrent.Callable;
+import de.danoeh.antennapod.core.feed.Chapter;
+import de.danoeh.antennapod.core.feed.MediaType;
+import de.danoeh.antennapod.core.util.ChapterUtils;
+
/** Represents a media file that is stored on the local storage device. */
public class ExternalMedia implements Playable {
@@ -106,12 +107,7 @@ public class ExternalMedia implements Playable {
@Override
public Callable<String> loadShownotes() {
- return new Callable<String>() {
- @Override
- public String call() throws Exception {
- return "";
- }
- };
+ return () -> "";
}
@Override
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 86ec4fbd0..6459d86ed 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
@@ -26,7 +26,7 @@ public interface Playable extends Parcelable,
* Implementations must NOT call commit() after they have written the values
* to the preferences file.
*/
- public void writeToPreferences(SharedPreferences.Editor prefEditor);
+ void writeToPreferences(SharedPreferences.Editor prefEditor);
/**
* This method is called from a separate thread by the PlaybackService.
@@ -34,88 +34,88 @@ public interface Playable extends Parcelable,
* should execute as quickly as possible and NOT load chapter marks if no
* local file is available.
*/
- public void loadMetadata() throws PlayableException;
+ void loadMetadata() throws PlayableException;
/**
* This method is called from a separate thread by the PlaybackService.
* Playable objects should load their chapter marks in this method if no
* local file was available when loadMetadata() was called.
*/
- public void loadChapterMarks();
+ void loadChapterMarks();
/**
* Returns the title of the episode that this playable represents
*/
- public String getEpisodeTitle();
+ String getEpisodeTitle();
/**
* Returns a list of chapter marks or null if this Playable has no chapters.
*/
- public List<Chapter> getChapters();
+ List<Chapter> getChapters();
/**
* Returns a link to a website that is meant to be shown in a browser
*/
- public String getWebsiteLink();
+ String getWebsiteLink();
- public String getPaymentLink();
+ String getPaymentLink();
/**
* Returns the title of the feed this Playable belongs to.
*/
- public String getFeedTitle();
+ String getFeedTitle();
/**
* Returns a unique identifier, for example a file url or an ID from a
* database.
*/
- public Object getIdentifier();
+ Object getIdentifier();
/**
* Return duration of object or 0 if duration is unknown.
*/
- public int getDuration();
+ int getDuration();
/**
* Return position of object or 0 if position is unknown.
*/
- public int getPosition();
+ int getPosition();
/**
* Returns last time (in ms) when this playable was played or 0
* if last played time is unknown.
*/
- public long getLastPlayedTime();
+ long getLastPlayedTime();
/**
* Returns the type of media. This method should return the correct value
* BEFORE loadMetadata() is called.
*/
- public MediaType getMediaType();
+ MediaType getMediaType();
/**
* Returns an url to a local file that can be played or null if this file
* does not exist.
*/
- public String getLocalMediaUrl();
+ String getLocalMediaUrl();
/**
* Returns an url to a file that can be streamed by the player or null if
* this url is not known.
*/
- public String getStreamUrl();
+ String getStreamUrl();
/**
* Returns true if a local file that can be played is available. getFileUrl
* MUST return a non-null string if this method returns true.
*/
- public boolean localFileAvailable();
+ boolean localFileAvailable();
/**
* Returns true if a streamable file is available. getStreamUrl MUST return
* a non-null string if this method returns true.
*/
- public boolean streamAvailable();
+ boolean streamAvailable();
/**
* Saves the current position of this object. Implementations can use the
@@ -126,40 +126,40 @@ public interface Playable extends Parcelable,
* @param newPosition new playback position in ms
* @param timestamp current time in ms
*/
- public void saveCurrentPosition(SharedPreferences pref, int newPosition, long timestamp);
+ void saveCurrentPosition(SharedPreferences pref, int newPosition, long timestamp);
- public void setPosition(int newPosition);
+ void setPosition(int newPosition);
- public void setDuration(int newDuration);
+ void setDuration(int newDuration);
/**
* @param lastPlayedTimestamp timestamp in ms
*/
- public void setLastPlayedTime(long lastPlayedTimestamp);
+ void setLastPlayedTime(long lastPlayedTimestamp);
/**
* Is called by the PlaybackService when playback starts.
*/
- public void onPlaybackStart();
+ void onPlaybackStart();
/**
* Is called by the PlaybackService when playback is completed.
*/
- public void onPlaybackCompleted();
+ void onPlaybackCompleted();
/**
* Returns an integer that must be unique among all Playable classes. The
* return value is later used by PlayableUtils to determine the type of the
* Playable object that is restored.
*/
- public int getPlayableType();
+ int getPlayableType();
- public void setChapters(List<Chapter> chapters);
+ void setChapters(List<Chapter> chapters);
/**
* Provides utility methods for Playable objects.
*/
- public static class PlayableUtils {
+ class PlayableUtils {
private static final String TAG = "PlayableUtils";
/**
@@ -213,7 +213,7 @@ public interface Playable extends Parcelable,
}
}
- public static class PlayableException extends Exception {
+ class PlayableException extends Exception {
private static final long serialVersionUID = 1L;
public PlayableException() {
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 27935978c..1409ffe09 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
@@ -10,7 +10,6 @@ import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.media.MediaPlayer;
-import android.os.AsyncTask;
import android.os.Build;
import android.os.IBinder;
import android.preference.PreferenceManager;
@@ -19,7 +18,6 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import android.view.SurfaceHolder;
-import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
@@ -42,6 +40,10 @@ import de.danoeh.antennapod.core.service.playback.PlayerStatus;
import de.danoeh.antennapod.core.storage.DBTasks;
import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.playback.Playable.PlayableUtils;
+import rx.Observable;
+import rx.Subscription;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.schedulers.Schedulers;
/**
* Communicates with the playback service. GUI classes should use this class to
@@ -51,28 +53,30 @@ public abstract class PlaybackController {
private static final String TAG = "PlaybackController";
- public static final int INVALID_TIME = -1;
+ private static final int INVALID_TIME = -1;
private final Activity activity;
private PlaybackService playbackService;
- protected Playable media;
+ private Playable media;
private PlayerStatus status;
- private ScheduledThreadPoolExecutor schedExecutor;
+ private final ScheduledThreadPoolExecutor schedExecutor;
private static final int SCHED_EX_POOLSIZE = 1;
- protected MediaPositionObserver positionObserver;
- protected ScheduledFuture positionObserverFuture;
+ private MediaPositionObserver positionObserver;
+ private ScheduledFuture positionObserverFuture;
private boolean mediaInfoLoaded = false;
private boolean released = false;
+ private Subscription serviceBinder;
+
/**
* True if controller should reinit playback service if 'pause' button is
* pressed.
*/
- private boolean reinitOnPause;
+ private final boolean reinitOnPause;
public PlaybackController(@NonNull Activity activity, boolean reinitOnPause) {
@@ -87,8 +91,7 @@ public abstract class PlaybackController {
@Override
public void rejectedExecution(Runnable r,
ThreadPoolExecutor executor) {
- Log.w(TAG,
- "Rejected execution of runnable in schedExecutor");
+ Log.w(TAG, "Rejected execution of runnable in schedExecutor");
}
}
);
@@ -111,8 +114,7 @@ public abstract class PlaybackController {
if (!released) {
bindToService();
} else {
- throw new IllegalStateException(
- "Can't call init() after release() has been called");
+ throw new IllegalStateException("Can't call init() after release() has been called");
}
checkMediaInfoLoaded();
}
@@ -136,6 +138,9 @@ public abstract class PlaybackController {
// ignore
}
+ if(serviceBinder != null) {
+ serviceBinder.unsubscribe();
+ }
try {
activity.unbindService(mConnection);
} catch (IllegalArgumentException e) {
@@ -168,34 +173,33 @@ public abstract class PlaybackController {
*/
private void bindToService() {
Log.d(TAG, "Trying to connect to service");
- AsyncTask<Void, Void, Intent> intentLoader = new AsyncTask<Void, Void, Intent>() {
- @Override
- protected Intent doInBackground(Void... voids) {
- return getPlayLastPlayedMediaIntent();
- }
-
- @Override
- protected void onPostExecute(Intent serviceIntent) {
- boolean bound = false;
- if (!PlaybackService.started) {
- if (serviceIntent != null) {
- Log.d(TAG, "Calling start service");
- activity.startService(serviceIntent);
- bound = activity.bindService(serviceIntent, mConnection, 0);
+ if(serviceBinder != null) {
+ serviceBinder.unsubscribe();
+ }
+ serviceBinder = Observable.fromCallable(() -> getPlayLastPlayedMediaIntent())
+ .subscribeOn(Schedulers.newThread())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(intent -> {
+ boolean bound = false;
+ if (!PlaybackService.started) {
+ if (intent != null) {
+ Log.d(TAG, "Calling start service");
+ activity.startService(intent);
+ bound = activity.bindService(intent, mConnection, 0);
+ } else {
+ status = PlayerStatus.STOPPED;
+ setupGUI();
+ handleStatus();
+ }
} else {
- status = PlayerStatus.STOPPED;
- setupGUI();
- handleStatus();
+ Log.d(TAG, "PlaybackService is running, trying to connect without start command.");
+ bound = activity.bindService(new Intent(activity, PlaybackService.class),
+ mConnection, 0);
}
- } else {
- Log.d(TAG, "PlaybackService is running, trying to connect without start command.");
- bound = activity.bindService(new Intent(activity,
- PlaybackService.class), mConnection, 0);
- }
- Log.d(TAG, "Result for service binding: " + bound);
- }
- };
- intentLoader.execute();
+ Log.d(TAG, "Result for service binding: " + bound);
+ }, error -> {
+ Log.e(TAG, Log.getStackTraceString(error));
+ });
}
/**
@@ -204,27 +208,21 @@ public abstract class PlaybackController {
*/
private Intent getPlayLastPlayedMediaIntent() {
Log.d(TAG, "Trying to restore last played media");
- SharedPreferences prefs = PreferenceManager
- .getDefaultSharedPreferences(activity.getApplicationContext());
- long currentlyPlayingMedia = PlaybackPreferences
- .getCurrentlyPlayingMedia();
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
+ activity.getApplicationContext());
+ long currentlyPlayingMedia = PlaybackPreferences.getCurrentlyPlayingMedia();
if (currentlyPlayingMedia != PlaybackPreferences.NO_MEDIA_PLAYING) {
Playable media = PlayableUtils.createInstanceFromPreferences(activity,
(int) currentlyPlayingMedia, prefs);
if (media != null) {
- Intent serviceIntent = new Intent(activity,
- PlaybackService.class);
+ Intent serviceIntent = new Intent(activity, PlaybackService.class);
serviceIntent.putExtra(PlaybackService.EXTRA_PLAYABLE, media);
- serviceIntent.putExtra(
- PlaybackService.EXTRA_START_WHEN_PREPARED, false);
- serviceIntent.putExtra(
- PlaybackService.EXTRA_PREPARE_IMMEDIATELY, false);
+ serviceIntent.putExtra(PlaybackService.EXTRA_START_WHEN_PREPARED, false);
+ serviceIntent.putExtra(PlaybackService.EXTRA_PREPARE_IMMEDIATELY, false);
boolean fileExists = media.localFileAvailable();
- boolean lastIsStream = PlaybackPreferences
- .getCurrentEpisodeIsStream();
+ boolean lastIsStream = PlaybackPreferences.getCurrentEpisodeIsStream();
if (!fileExists && !lastIsStream && media instanceof FeedMedia) {
- DBTasks.notifyMissingFeedMediaFile(
- activity, (FeedMedia) media);
+ DBTasks.notifyMissingFeedMediaFile(activity, (FeedMedia) media);
}
serviceIntent.putExtra(PlaybackService.EXTRA_SHOULD_STREAM,
lastIsStream || !fileExists);
@@ -238,10 +236,9 @@ public abstract class PlaybackController {
private void setupPositionObserver() {
- if ((positionObserverFuture != null && positionObserverFuture
- .isCancelled())
- || (positionObserverFuture != null && positionObserverFuture
- .isDone()) || positionObserverFuture == null) {
+ if (positionObserverFuture == null ||
+ positionObserverFuture.isCancelled() ||
+ positionObserverFuture.isDone()) {
Log.d(TAG, "Setting up position observer");
positionObserver = new MediaPositionObserver();
@@ -259,7 +256,7 @@ public abstract class PlaybackController {
}
}
- private ServiceConnection mConnection = new ServiceConnection() {
+ private final ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
playbackService = ((PlaybackService.LocalBinder) service)
.getService();
@@ -267,7 +264,8 @@ public abstract class PlaybackController {
queryService();
Log.d(TAG, "Connection to Service established");
} else {
- Log.i(TAG, "Connection to playback service has been established, but controller has already been released");
+ Log.i(TAG, "Connection to playback service has been established, " +
+ "but controller has already been released");
}
}
@@ -278,7 +276,7 @@ public abstract class PlaybackController {
}
};
- protected BroadcastReceiver statusUpdate = new BroadcastReceiver() {
+ private final BroadcastReceiver statusUpdate = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Received statusUpdate Intent.");
@@ -288,66 +286,64 @@ public abstract class PlaybackController {
media = info.playable;
handleStatus();
} else {
- Log.w(TAG,
- "Couldn't receive status update: playbackService was null");
+ Log.w(TAG, "Couldn't receive status update: playbackService was null");
bindToService();
}
}
};
- protected BroadcastReceiver notificationReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver notificationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (isConnectedToPlaybackService()) {
- int type = intent.getIntExtra(
- PlaybackService.EXTRA_NOTIFICATION_TYPE, -1);
- int code = intent.getIntExtra(
- PlaybackService.EXTRA_NOTIFICATION_CODE, -1);
- if (code != -1 && type != -1) {
- switch (type) {
- case PlaybackService.NOTIFICATION_TYPE_ERROR:
- handleError(code);
- break;
- case PlaybackService.NOTIFICATION_TYPE_BUFFER_UPDATE:
- float progress = ((float) code) / 100;
- onBufferUpdate(progress);
- break;
- case PlaybackService.NOTIFICATION_TYPE_RELOAD:
- cancelPositionObserver();
- mediaInfoLoaded = false;
- queryService();
- onReloadNotification(intent.getIntExtra(
- PlaybackService.EXTRA_NOTIFICATION_CODE, -1));
- break;
- case PlaybackService.NOTIFICATION_TYPE_SLEEPTIMER_UPDATE:
- onSleepTimerUpdate();
- break;
- case PlaybackService.NOTIFICATION_TYPE_BUFFER_START:
- onBufferStart();
- break;
- case PlaybackService.NOTIFICATION_TYPE_BUFFER_END:
- onBufferEnd();
- break;
- case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_END:
- onPlaybackEnd();
- break;
- case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE:
- onPlaybackSpeedChange();
- break;
- }
-
- } else {
- Log.d(TAG, "Bad arguments. Won't handle intent");
- }
- } else {
+ if (!isConnectedToPlaybackService()) {
bindToService();
+ return;
+ }
+ int type = intent.getIntExtra(PlaybackService.EXTRA_NOTIFICATION_TYPE, -1);
+ int code = intent.getIntExtra(PlaybackService.EXTRA_NOTIFICATION_CODE, -1);
+ if(code == -1 || type == -1) {
+ Log.d(TAG, "Bad arguments. Won't handle intent");
+ return;
+ }
+ switch (type) {
+ case PlaybackService.NOTIFICATION_TYPE_ERROR:
+ handleError(code);
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_BUFFER_UPDATE:
+ float progress = ((float) code) / 100;
+ onBufferUpdate(progress);
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_RELOAD:
+ cancelPositionObserver();
+ mediaInfoLoaded = false;
+ queryService();
+ onReloadNotification(intent.getIntExtra(
+ PlaybackService.EXTRA_NOTIFICATION_CODE, -1));
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_SLEEPTIMER_UPDATE:
+ onSleepTimerUpdate();
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_BUFFER_START:
+ onBufferStart();
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_BUFFER_END:
+ onBufferEnd();
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_END:
+ onPlaybackEnd();
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_PLAYBACK_SPEED_CHANGE:
+ onPlaybackSpeedChange();
+ break;
+ case PlaybackService.NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED:
+ onSetSpeedAbilityChanged();
}
}
};
- private BroadcastReceiver shutdownReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver shutdownReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -361,31 +357,33 @@ public abstract class PlaybackController {
}
};
- public void setupGUI() {};
+ public void setupGUI() {}
- public void onPositionObserverUpdate() {};
+ public void onPositionObserverUpdate() {}
- public void onPlaybackSpeedChange() {};
+ public void onPlaybackSpeedChange() {}
- public void onShutdownNotification() {};
+ public void onSetSpeedAbilityChanged() {}
+
+ public void onShutdownNotification() {}
/**
* Called when the currently displayed information should be refreshed.
*/
- public void onReloadNotification(int code) {};
+ public void onReloadNotification(int code) {}
- public void onBufferStart() {};
+ public void onBufferStart() {}
- public void onBufferEnd() {};
+ public void onBufferEnd() {}
- public void onBufferUpdate(float progress) {};
+ public void onBufferUpdate(float progress) {}
- public void onSleepTimerUpdate() {};
+ public void onSleepTimerUpdate() {}
- public void handleError(int code) {};
+ public void handleError(int code) {}
- public void onPlaybackEnd() {};
+ public void onPlaybackEnd() {}
public void repeatHandleStatus() {
if (status != null && playbackService != null) {
@@ -424,6 +422,7 @@ public abstract class PlaybackController {
clearStatusMsg();
checkMediaInfoLoaded();
cancelPositionObserver();
+ onPositionObserverUpdate();
updatePlayButtonAppearance(playResource, playText);
if (PlaybackService.getCurrentMediaType() == MediaType.VIDEO) {
setScreenOn(false);
@@ -484,23 +483,23 @@ public abstract class PlaybackController {
public ImageButton getPlayButton() {
return null;
- };
+ }
- public void postStatusMsg(int msg) {};
+ public void postStatusMsg(int msg) {}
- public void clearStatusMsg() {};
+ public void clearStatusMsg() {}
public boolean loadMediaInfo() {
return false;
- };
+ }
- public void onAwaitingVideoSurface() {};
+ public void onAwaitingVideoSurface() {}
/**
* Called when connection to playback service has been established or
* information has to be refreshed
*/
- void queryService() {
+ private void queryService() {
Log.d(TAG, "Querying service info");
if (playbackService != null) {
status = playbackService.getStatus();
@@ -528,7 +527,7 @@ public abstract class PlaybackController {
}
}
- public void onServiceQueried() {};
+ public void onServiceQueried() {}
/**
* Should be used by classes which implement the OnSeekBarChanged interface.
@@ -574,34 +573,32 @@ public abstract class PlaybackController {
}
- public OnClickListener newOnPlayButtonClickListener() {
- return v -> {
- if (playbackService == null) {
- Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!");
- return;
- }
- switch (status) {
- case PLAYING:
- playbackService.pause(true, reinitOnPause);
- break;
- case PAUSED:
- case PREPARED:
- playbackService.resume();
- break;
- case PREPARING:
- playbackService.setStartWhenPrepared(!playbackService
- .isStartWhenPrepared());
- if (reinitOnPause
- && playbackService.isStartWhenPrepared() == false) {
- playbackService.reinit();
- }
- break;
- case INITIALIZED:
- playbackService.setStartWhenPrepared(true);
- playbackService.prepare();
- break;
- }
- };
+ public void playPause() {
+ if (playbackService == null) {
+ Log.w(TAG, "Play/Pause button was pressed, but playbackservice was null!");
+ return;
+ }
+ switch (status) {
+ case PLAYING:
+ playbackService.pause(true, reinitOnPause);
+ break;
+ case PAUSED:
+ case PREPARED:
+ playbackService.resume();
+ break;
+ case PREPARING:
+ playbackService.setStartWhenPrepared(!playbackService
+ .isStartWhenPrepared());
+ if (reinitOnPause
+ && !playbackService.isStartWhenPrepared()) {
+ playbackService.reinit();
+ }
+ break;
+ case INITIALIZED:
+ playbackService.setStartWhenPrepared(true);
+ playbackService.prepare();
+ break;
+ }
}
public boolean serviceAvailable() {
@@ -679,12 +676,10 @@ public abstract class PlaybackController {
}
public boolean canSetPlaybackSpeed() {
- if (org.antennapod.audio.MediaPlayer.isPrestoLibraryInstalled(activity.getApplicationContext())
+ return org.antennapod.audio.MediaPlayer.isPrestoLibraryInstalled(activity.getApplicationContext())
|| UserPreferences.useSonic()
- || Build.VERSION.SDK_INT >= 23) {
- return true;
- }
- return playbackService != null && playbackService.canSetSpeed();
+ || Build.VERSION.SDK_INT >= 23
+ || playbackService != null && playbackService.canSetSpeed();
}
public void setPlaybackSpeed(float speed) {
@@ -718,10 +713,7 @@ public abstract class PlaybackController {
}
public boolean isPlayingVideo() {
- if (playbackService != null) {
- return PlaybackService.getCurrentMediaType() == MediaType.VIDEO;
- }
- return false;
+ return playbackService != null && PlaybackService.getCurrentMediaType() == MediaType.VIDEO;
}
public Pair<Integer, Integer> getVideoSize() {
@@ -737,7 +729,7 @@ public abstract class PlaybackController {
* Returns true if PlaybackController can communicate with the playback
* service.
*/
- public boolean isConnectedToPlaybackService() {
+ private boolean isConnectedToPlaybackService() {
return playbackService != null;
}
@@ -753,9 +745,9 @@ public abstract class PlaybackController {
public void reinitServiceIfPaused() {
if (playbackService != null
&& playbackService.isStreaming()
- && (playbackService.getStatus() == PlayerStatus.PAUSED || (playbackService
- .getStatus() == PlayerStatus.PREPARING && playbackService
- .isStartWhenPrepared() == false))) {
+ && (playbackService.getStatus() == PlayerStatus.PAUSED ||
+ (playbackService.getStatus() == PlayerStatus.PREPARING &&
+ !playbackService.isStartWhenPrepared()))) {
playbackService.reinit();
}
}
@@ -770,13 +762,7 @@ public abstract class PlaybackController {
@Override
public void run() {
if (playbackService != null && playbackService.getStatus() == PlayerStatus.PLAYING) {
- activity.runOnUiThread(new Runnable() {
-
- @Override
- public void run() {
- onPositionObserverUpdate();
- }
- });
+ activity.runOnUiThread(PlaybackController.this::onPositionObserverUpdate);
}
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java
index 2eee1ac87..efdf46a97 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java
@@ -2,7 +2,10 @@ package de.danoeh.antennapod.core.util.playback;
import android.content.Context;
import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
+import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
@@ -14,6 +17,7 @@ import org.jsoup.select.Elements;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import de.danoeh.antennapod.core.R;
import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.ShownotesProvider;
@@ -32,33 +36,39 @@ public class Timeline {
private ShownotesProvider shownotesProvider;
-
- private final String colorString;
+ private final String noShownotesLabel;
+ private final String colorPrimaryString;
+ private final String colorSecondaryString;
private final int pageMargin;
public Timeline(Context context, ShownotesProvider shownotesProvider) {
if (shownotesProvider == null) throw new IllegalArgumentException("shownotesProvider = null");
this.shownotesProvider = shownotesProvider;
- TypedArray res = context
- .getTheme()
- .obtainStyledAttributes(
- new int[]{android.R.attr.textColorPrimary});
- int colorResource = res.getColor(0, 0);
- colorString = String.format("#%06X",
- 0xFFFFFF & colorResource);
+ noShownotesLabel = context.getString(R.string.no_shownotes_label);
+
+ TypedArray res = context.getTheme().obtainStyledAttributes(
+ new int[]{ android.R.attr.textColorPrimary});
+ @ColorInt int col = res.getColor(0, 0);
+ colorPrimaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," +
+ Color.blue(col) + "," + (Color.alpha(col)/256.0) + ")";
+ res.recycle();
+ res = context.getTheme().obtainStyledAttributes(
+ new int[]{android.R.attr.textColorSecondary});
+ col = res.getColor(0, 0);
+ colorSecondaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," +
+ Color.blue(col) + "," + (Color.alpha(col)/256.0) + ")";
res.recycle();
- pageMargin = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, 8, context.getResources()
- .getDisplayMetrics()
+ pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
+ context.getResources().getDisplayMetrics()
);
}
private static final Pattern TIMECODE_LINK_REGEX = Pattern.compile("antennapod://timecode/((\\d+))");
private static final String TIMECODE_LINK = "<a class=\"timecode\" href=\"antennapod://timecode/%d\">%s</a>";
private static final Pattern TIMECODE_REGEX = Pattern.compile("\\b(?:(?:(([0-9][0-9])):))?(([0-9][0-9])):(([0-9][0-9]))\\b");
- private static final Pattern LINE_BREAK_REGEX = Pattern.compile("<br *\\/?>");
+ private static final Pattern LINE_BREAK_REGEX = Pattern.compile("<br */?>");
/**
@@ -82,9 +92,24 @@ public class Timeline {
e.printStackTrace();
return null;
}
- if (shownotes == null) {
- Log.d(TAG, "shownotesProvider contained no shownotes. Returning empty string");
- return "";
+
+ if(TextUtils.isEmpty(shownotes)) {
+ Log.d(TAG, "shownotesProvider contained no shownotes. Returning 'no shownotes' message");
+ shownotes ="<html>" +
+ "<head>" +
+ "<style type='text/css'>" +
+ "html, body { margin: 0; padding: 0; width: 100%; height: 100%; } " +
+ "html { display: table; }" +
+ "body { display: table-cell; vertical-align: middle; text-align:center;" +
+ "-webkit-text-size-adjust: none; font-size: 87%; color: " + colorSecondaryString + ";} " +
+ "</style>" +
+ "</head>" +
+ "<body>" +
+ "<p>" + noShownotesLabel + "</p>" +
+ "</body>" +
+ "</html>";
+ Log.d(TAG, "shownotes: " + shownotes);
+ return shownotes;
}
// replace ASCII line breaks with HTML ones if shownotes don't contain HTML line breaks already
@@ -95,7 +120,7 @@ public class Timeline {
Document document = Jsoup.parse(shownotes);
// apply style
- String styleStr = String.format(WEBVIEW_STYLE, colorString, "100%", pageMargin,
+ String styleStr = String.format(WEBVIEW_STYLE, colorPrimaryString, "100%", pageMargin,
pageMargin, pageMargin, pageMargin);
document.head().appendElement("style").attr("type", "text/css").text(styleStr);
@@ -125,8 +150,7 @@ public class Timeline {
element.html(buffer.toString());
}
}
-
- Log.i(TAG, "Out: " + document.toString());
+
return document.toString();
}
@@ -148,7 +172,7 @@ public class Timeline {
try {
if (m.find()) {
- return Integer.valueOf(m.group(1));
+ return Integer.parseInt(m.group(1));
}
} catch (NumberFormatException e) {
e.printStackTrace();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java
index c4961a3ab..6243da5bc 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentChapterReader.java
@@ -9,7 +9,7 @@ import java.util.ArrayList;
import java.util.List;
public class VorbisCommentChapterReader extends VorbisCommentReader {
- private static final String TAG = "VorbisCommentChapterReader";
+ private static final String TAG = "VorbisCommentChptrReadr";
private static final String CHAPTER_KEY = "chapter\\d\\d\\d.*";
private static final String CHAPTER_ATTRIBUTE_TITLE = "name";
@@ -27,7 +27,7 @@ public class VorbisCommentChapterReader extends VorbisCommentReader {
@Override
public void onVorbisCommentHeaderFound(VorbisCommentHeader header) {
- chapters = new ArrayList<Chapter>();
+ chapters = new ArrayList<>();
System.out.println(header.toString());
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java
index 9639b9c42..49ea18721 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/VorbisCommentReader.java
@@ -180,13 +180,13 @@ public abstract class VorbisCommentReader {
private String readContentVectorKey(InputStream input, long vectorLength)
throws IOException {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder builder = new StringBuilder();
for (int i = 0; i < vectorLength; i++) {
char c = (char) input.read();
if (c == '=') {
- return buffer.toString();
+ return builder.toString();
} else {
- buffer.append(c);
+ builder.append(c);
}
}
return null; // no key found
diff --git a/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png
index 37d73c734..af99f4b3b 100644
--- a/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-hdpi-v11/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png
index ad148cc6b..398dffa4b 100755
--- a/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-hdpi-v11/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png
index 492c8f880..69efaccd1 100644
--- a/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_add_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png
index 481643ecd..023e5d21a 100644
--- a/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png
index a32968a19..43783fbce 100755
--- a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png
index 6f9df0934..115f7ebef 100644
--- a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png
index bddb0b024..392c87bd2 100644
--- a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png
index e39de4dcf..41052af65 100755
--- a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png
index 1f4fd985f..6a2ca5023 100644
--- a/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_cancel_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png
index 794b7b780..9698d4b7d 100644
--- a/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_cancel_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png
index e4e833242..187a426a8 100644
--- a/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png
index 4f1a804b3..076773bca 100644
--- a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png
index 6dbf83c58..ecaf0d5be 100644
--- a/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_check_box_outline_blank_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png
index d3f636f13..5ce64cc5f 100644
--- a/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png
new file mode 100644
index 000000000..75c703ae4
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_create_new_folder_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png
new file mode 100644
index 000000000..e6ae7f36b
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_create_new_folder_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png
index b72a9f3c6..501e60fa0 100644
--- a/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png
index a9eac0ca7..4d8ce49e3 100644
--- a/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_delete_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png
deleted file mode 100644
index dd7d0734d..000000000
--- a/core/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png
deleted file mode 100644
index 93aa3032a..000000000
--- a/core/src/main/res/drawable-hdpi/ic_description_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png
index 6e42e1359..72eea4a8d 100644
--- a/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_done_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png
index f42a0e2d2..9b4047a41 100644
--- a/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_done_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png
index f2d9906c6..a0b47594b 100644
--- a/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png
+++ b/core/src/main/res/drawable-hdpi/ic_drag_vertical_grey600_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png
index a2a91938d..a4ce8fa7e 100644
--- a/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png
+++ b/core/src/main/res/drawable-hdpi/ic_drag_vertical_white_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png
index 0f0ddf717..96ed70a40 100644
--- a/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_expand_more_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png
index 724eb1f7a..f3c628e77 100644
--- a/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_expand_more_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png
index 4d1c1d4ae..df9e662c1 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png
index deeff701f..59ae40266 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_forward_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png
index 03a54ee75..2d61b31f1 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png
index 60e3decf6..e5ae251d3 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_forward_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png
index 9866ee629..f661ca723 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png
index 8b9bfd34b..d36891a8d 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_rewind_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png
index b4f526e62..ab8b48ec3 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png
index 5d9d35f70..75796d7a9 100644
--- a/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_fast_rewind_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png
index d1ad6629d..c09c73441 100755
--- a/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_feed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png
index 9ff662fca..43183d393 100755
--- a/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_feed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png
index c2222fb8e..62caf8392 100644
--- a/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_file_download_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png
index 46aeab458..8300268dc 100644
--- a/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_file_download_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png
index 83c564377..0d2f6ccb4 100644
--- a/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_filter_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png
index e3517a57d..ea6f9078e 100644
--- a/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_filter_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png
index 294523814..2452cfa92 100644
--- a/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_hearing_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png
index 11114b568..96a06141a 100644
--- a/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_hearing_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png
index f87403fa5..f02be50e2 100644
--- a/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_history_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png
index b2b1332e1..a0756f264 100644
--- a/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_history_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png
index 62dd8ef48..e56fbf224 100644
--- a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png
index 5bb43b464..dccf44930 100644
--- a/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_indeterminate_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png
index 713a9ba9a..754299c4a 100644
--- a/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_info_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png
index f4b88742d..61ca3fee4 100644
--- a/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_info_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_launcher.png b/core/src/main/res/drawable-hdpi/ic_launcher.png
index 994b763cc..8bd22b54a 100644
--- a/core/src/main/res/drawable-hdpi/ic_launcher.png
+++ b/core/src/main/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png
index 2aee6f902..11c973d3d 100644
--- a/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_list_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png
index 436113d27..4f1e57ec1 100644
--- a/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_list_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png
index b6dba1002..3e52fd88d 100644
--- a/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_lock_closed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png
index 5c60ab08a..2260411cb 100644
--- a/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_lock_closed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png
index a99e9f2b6..a42417431 100644
--- a/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_lock_open_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png
index 61c623ce2..7bde52e12 100644
--- a/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png
deleted file mode 100644
index e141502a6..000000000
--- a/core/src/main/res/drawable-hdpi/ic_more_vert_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png
deleted file mode 100644
index fdc4a5ad2..000000000
--- a/core/src/main/res/drawable-hdpi/ic_more_vert_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_new.png b/core/src/main/res/drawable-hdpi/ic_new.png
deleted file mode 100755
index 8ff519052..000000000
--- a/core/src/main/res/drawable-hdpi/ic_new.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_new_dark.png b/core/src/main/res/drawable-hdpi/ic_new_dark.png
deleted file mode 100755
index c8581e01c..000000000
--- a/core/src/main/res/drawable-hdpi/ic_new_dark.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png
index 7a08c4138..2aa5de2ad 100644
--- a/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_new_releases_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png
index 0d08f329c..8f109572b 100644
--- a/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_new_releases_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png
index 711e0cf94..7281f37e1 100644
--- a/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_pause_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png
index 5e884dfe8..dde9bb25c 100644
--- a/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_pause_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
index b4bdbb558..1701f34b0 100644
--- a/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png
index da17d12ba..1d024393a 100644
--- a/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_pause_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png
index 264416933..b540e4a63 100644
--- a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png
index 8af4c6cd6..a12b921e4 100644
--- a/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_play_arrow_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
index 164385d04..f77ad6b57 100644
--- a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png
index 0cd5cb61a..2b8e3513f 100644
--- a/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_play_arrow_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png
index 51cc4dbd1..ec8ac3041 100644
--- a/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_refresh_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png
index cd16fdd50..db069b266 100644
--- a/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png
index c4df13afa..4f1af39ab 100644
--- a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png
index fdf524010..abc338d51 100644
--- a/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_remove_red_eye_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png
new file mode 100644
index 000000000..26a39bec9
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_sd_storage_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png
new file mode 100644
index 000000000..751e0e360
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_sd_storage_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png
index ba65a135b..022f081e0 100644
--- a/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_search_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png
index a2fc5b2e7..cc6d5da86 100644
--- a/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png
index 20d2b66e0..a7c216d3d 100644
--- a/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png
index 9c0172ad0..f8f215236 100644
--- a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png
index 9b5a9fb47..eb2611f95 100644
--- a/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_settings_input_antenna_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png
index f9a8915fd..14c7da0c2 100644
--- a/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_settings_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png
index 987e9b86c..9457cac52 100644
--- a/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_share_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png
index 93b3c219c..80c24d993 100644
--- a/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png
index edbc95b05..6e1dffc93 100644
--- a/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_skip_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png
index cbfb262d8..760ec9987 100644
--- a/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_skip_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png
index 809066499..f25063071 100644
--- a/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_sleep_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png
index 4496a320d..0db6381ea 100644
--- a/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_sleep_off_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png
index 79684ab65..c614c2b3d 100644
--- a/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_sleep_off_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png
index f0df6032c..5d8072149 100644
--- a/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_sleep_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png
index 0a52de9fe..715dea65f 100644
--- a/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_sort_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png
index 26014a542..9cdac3582 100644
--- a/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_sort_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png
index 006410bc3..6b5bc858a 100644
--- a/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_star_border_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png
index 27831192f..d59bc4792 100644
--- a/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_star_border_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png
index 93f70a024..e4fe7f43a 100644
--- a/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_star_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png
index e8619b780..394c5a60c 100644
--- a/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_star_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png
index 36d502492..fb15f7ee1 100644
--- a/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-hdpi/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_stat_authentication.png b/core/src/main/res/drawable-hdpi/ic_stat_authentication.png
index c6b5efd33..f40820ef7 100755
--- a/core/src/main/res/drawable-hdpi/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-hdpi/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png
deleted file mode 100644
index a5fdd2c40..000000000
--- a/core/src/main/res/drawable-hdpi/ic_timer_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png
deleted file mode 100644
index 864291fa7..000000000
--- a/core/src/main/res/drawable-hdpi/ic_timer_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png
deleted file mode 100644
index e299eb41b..000000000
--- a/core/src/main/res/drawable-hdpi/ic_toc_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png
deleted file mode 100644
index bfdc05d9e..000000000
--- a/core/src/main/res/drawable-hdpi/ic_toc_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png
index 1942f3f12..57c236892 100644
--- a/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_web_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png
index 952404cbc..410ef41e9 100644
--- a/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png
+++ b/core/src/main/res/drawable-hdpi/ic_web_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_widget_preview.png b/core/src/main/res/drawable-hdpi/ic_widget_preview.png
index 8b583b285..85a537154 100644
--- a/core/src/main/res/drawable-hdpi/ic_widget_preview.png
+++ b/core/src/main/res/drawable-hdpi/ic_widget_preview.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/navigation_up.png b/core/src/main/res/drawable-hdpi/navigation_up.png
index a2cf2ba52..370092e7e 100755
--- a/core/src/main/res/drawable-hdpi/navigation_up.png
+++ b/core/src/main/res/drawable-hdpi/navigation_up.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/navigation_up_dark.png b/core/src/main/res/drawable-hdpi/navigation_up_dark.png
index f2374a323..2b520c553 100755
--- a/core/src/main/res/drawable-hdpi/navigation_up_dark.png
+++ b/core/src/main/res/drawable-hdpi/navigation_up_dark.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/stat_notify_sync.png b/core/src/main/res/drawable-hdpi/stat_notify_sync.png
index ca6c68e4e..f70373d50 100644
--- a/core/src/main/res/drawable-hdpi/stat_notify_sync.png
+++ b/core/src/main/res/drawable-hdpi/stat_notify_sync.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png
index 84f19cd4e..222e9e8b1 100644
--- a/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png
+++ b/core/src/main/res/drawable-hdpi/stat_notify_sync_error.png
Binary files differ
diff --git a/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png
index e44f42510..ddf545c0b 100644
--- a/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-ldpi-v11/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-ldpi/ic_launcher.png b/core/src/main/res/drawable-ldpi/ic_launcher.png
index 546090dd2..494468020 100644
--- a/core/src/main/res/drawable-ldpi/ic_launcher.png
+++ b/core/src/main/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png
index 63d72970d..501dfa848 100644
--- a/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-ldpi/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png
index 8808dedc7..41fd20655 100644
--- a/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-mdpi-v11/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png
index de69b17c0..550b56b33 100755
--- a/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-mdpi-v11/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png
index 07858bc09..27e311f39 100644
--- a/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_add_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png
index 977dd3427..3856041d7 100644
--- a/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png
index 69b81c10d..0bf060d89 100755
--- a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png
index 08c523d48..1e71c271f 100644
--- a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png
index 27738aacb..d305f0c69 100644
--- a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png
index 5355abfd6..99ac9f3c9 100755
--- a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png
index a7a30cc24..e91e2cbf6 100644
--- a/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_cancel_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png
index df332ef3c..c433d9ba0 100644
--- a/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_cancel_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png
index a6bdce736..d5bdfa433 100644
--- a/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png
index cd90223d1..aefe5b6c1 100644
--- a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png
index 8a014bda1..a3a588c64 100644
--- a/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_check_box_outline_blank_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png
index 0811a3493..dc94cdbf4 100644
--- a/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png
new file mode 100644
index 000000000..45c0c29bf
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_create_new_folder_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png
new file mode 100644
index 000000000..02167a9f0
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_create_new_folder_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png
index e757fdb07..3bf363a2b 100644
--- a/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png
index e4ea52ef2..6b44a07da 100644
--- a/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_delete_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png
deleted file mode 100644
index ac18b5750..000000000
--- a/core/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png
deleted file mode 100644
index f5612717f..000000000
--- a/core/src/main/res/drawable-mdpi/ic_description_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png
index 9f860915d..73f72da71 100644
--- a/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_done_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png
index e91f9048b..e094dee36 100644
--- a/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_done_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png
index 0d8277204..7cd66845b 100644
--- a/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png
+++ b/core/src/main/res/drawable-mdpi/ic_drag_vertical_grey600_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png
index 15d016e89..3d1fd0fe3 100644
--- a/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png
+++ b/core/src/main/res/drawable-mdpi/ic_drag_vertical_white_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png
index 00b9f645c..4d8cd8e99 100644
--- a/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_expand_more_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png
index 6c2476660..682bcf79f 100644
--- a/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_expand_more_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png
index c2864a726..c67fc25f1 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png
index 4d1c1d4ae..df9e662c1 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_forward_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png
index 215099f9e..fceffcb7b 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png
index 03a54ee75..2d61b31f1 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_forward_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png
index 75adfc97e..de04575da 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png
index 9866ee629..f661ca723 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_rewind_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png
index a050e1bb8..bfb476b4a 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png
index b4f526e62..ab8b48ec3 100644
--- a/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_fast_rewind_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png
index 3932b6eef..8037c315e 100755
--- a/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_feed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png
index 9c2a1eb6e..026cac8f2 100755
--- a/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_feed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png
index b3ef8ce73..74d554774 100644
--- a/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_file_download_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png
index e089466de..b09c53c86 100644
--- a/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_file_download_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png
index e1e55d72b..b78e7d4d2 100644
--- a/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_filter_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png
index 7d72e7562..59a2ec755 100644
--- a/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_filter_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png
index df26536f9..ea44e3f07 100644
--- a/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_hearing_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png
index 0771a106d..78e98fe8d 100644
--- a/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_hearing_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png
index 0a62d358f..397972f67 100644
--- a/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_history_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png
index b93da1006..bcc729de0 100644
--- a/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_history_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png
index 52812c42f..0e6ce58e3 100644
--- a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png
index 20a9fe5d7..c496b4648 100644
--- a/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_indeterminate_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png
index 2537c5f42..b5c14a369 100644
--- a/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_info_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png
index 34f980085..6dbeeb0b7 100644
--- a/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_info_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_launcher.png b/core/src/main/res/drawable-mdpi/ic_launcher.png
index 403dfabc4..219e8c5ab 100644
--- a/core/src/main/res/drawable-mdpi/ic_launcher.png
+++ b/core/src/main/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png
index c5c2fc195..ac5b3bed4 100644
--- a/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_list_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png
index 5e51ed478..15d8fc2bb 100644
--- a/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_list_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png
index f1627ce34..f9415627e 100644
--- a/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_lock_closed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png
index 8f18d11e6..1203a4406 100644
--- a/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_lock_closed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png
index ada8d3be4..192e27ccd 100644
--- a/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_lock_open_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png
index 72d01c406..232b4bfb4 100644
--- a/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png
deleted file mode 100644
index 4ed34354b..000000000
--- a/core/src/main/res/drawable-mdpi/ic_more_vert_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png
deleted file mode 100644
index 1d8ad18a0..000000000
--- a/core/src/main/res/drawable-mdpi/ic_more_vert_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_new.png b/core/src/main/res/drawable-mdpi/ic_new.png
deleted file mode 100755
index 84994bd10..000000000
--- a/core/src/main/res/drawable-mdpi/ic_new.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_new_dark.png b/core/src/main/res/drawable-mdpi/ic_new_dark.png
deleted file mode 100755
index b723618b4..000000000
--- a/core/src/main/res/drawable-mdpi/ic_new_dark.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png
index 494781a20..4b3ffdbdc 100644
--- a/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_new_releases_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png
index 36e3262a4..c5bb20f49 100644
--- a/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_new_releases_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png
index 06abcb50b..126ee03ef 100644
--- a/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_pause_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png
index 711e0cf94..7281f37e1 100644
--- a/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_pause_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png
index 026f38854..2272d478c 100644
--- a/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png
index b4bdbb558..1701f34b0 100644
--- a/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_pause_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png
index 4ff5decb0..9c8f2c555 100644
--- a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png
index 264416933..b540e4a63 100644
--- a/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_play_arrow_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
index 8d1e433a5..172c211ab 100644
--- a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png
index 164385d04..f77ad6b57 100644
--- a/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_play_arrow_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png
index c136c59fc..0e927f106 100644
--- a/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_refresh_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png
index 235c84f1e..79b5ec871 100644
--- a/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png
index 9e840f03e..daa8e568e 100644
--- a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png
index 0bcba825f..a6b4ff0da 100644
--- a/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_remove_red_eye_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png
new file mode 100644
index 000000000..26977a920
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_sd_storage_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png
new file mode 100644
index 000000000..4aeb2e668
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_sd_storage_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png
index 29954062c..c386dbb38 100644
--- a/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_search_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png
index dff1e3a8a..faefc59c8 100644
--- a/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png
index 8995d0f43..dafbeca33 100644
--- a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png
index c31fa8309..ccf89acea 100644
--- a/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_settings_input_antenna_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png
index ee0248838..42eb539de 100644
--- a/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_share_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png
index 4d0197223..9d2ef6655 100644
--- a/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png
index be0fcc765..229eeca47 100644
--- a/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_skip_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png
index 893cf2c64..9032328d4 100644
--- a/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_skip_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png
index ea511bf2a..df84861b9 100644
--- a/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_sleep_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png
index 7f631ad86..463b87d2f 100644
--- a/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_sleep_off_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png
index 795e318e3..942e7f380 100644
--- a/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_sleep_off_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png
index 4304a6bca..9f37b124d 100644
--- a/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_sleep_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png
index f527d0094..dc393caf7 100644
--- a/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_sort_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png
index e28dd4592..3d84a4442 100644
--- a/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_sort_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png
index dd9d11ba0..8b5275b11 100644
--- a/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_star_border_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png
index 104fb3c9d..edfd7d71d 100644
--- a/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_star_border_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png
index af84b71f2..246b43279 100644
--- a/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_star_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png
index 0ccebc7c8..c79334c61 100644
--- a/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_star_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png
index 8b1206b51..152239888 100644
--- a/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-mdpi/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_stat_authentication.png b/core/src/main/res/drawable-mdpi/ic_stat_authentication.png
index cadfb9643..7fab11a83 100755
--- a/core/src/main/res/drawable-mdpi/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-mdpi/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png
deleted file mode 100644
index 186887c30..000000000
--- a/core/src/main/res/drawable-mdpi/ic_timer_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png
deleted file mode 100644
index 735ed7a00..000000000
--- a/core/src/main/res/drawable-mdpi/ic_timer_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png
deleted file mode 100644
index 23bec7945..000000000
--- a/core/src/main/res/drawable-mdpi/ic_toc_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png
deleted file mode 100644
index dc03b34b9..000000000
--- a/core/src/main/res/drawable-mdpi/ic_toc_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png
index cdbce22a7..c620bc4dd 100644
--- a/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_web_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png
index 3602c4c48..f59e16fa9 100644
--- a/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png
+++ b/core/src/main/res/drawable-mdpi/ic_web_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/navigation_up.png b/core/src/main/res/drawable-mdpi/navigation_up.png
index 1ee248a79..520e11da6 100755
--- a/core/src/main/res/drawable-mdpi/navigation_up.png
+++ b/core/src/main/res/drawable-mdpi/navigation_up.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/navigation_up_dark.png b/core/src/main/res/drawable-mdpi/navigation_up_dark.png
index 8ef44cbac..e53627915 100755
--- a/core/src/main/res/drawable-mdpi/navigation_up_dark.png
+++ b/core/src/main/res/drawable-mdpi/navigation_up_dark.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/stat_notify_sync.png b/core/src/main/res/drawable-mdpi/stat_notify_sync.png
index 516b65bd9..02066f847 100644
--- a/core/src/main/res/drawable-mdpi/stat_notify_sync.png
+++ b/core/src/main/res/drawable-mdpi/stat_notify_sync.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png
index c3ed306cf..d797f59c3 100644
--- a/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png
+++ b/core/src/main/res/drawable-mdpi/stat_notify_sync_error.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png b/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png
index 59de64c87..30431ed6a 100644
--- a/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-xhdpi-v11/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png b/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png
index f58fb21df..e83cbc333 100755
--- a/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-xhdpi-v11/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png
index 0d8af34b9..19ed567e9 100644
--- a/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_add_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
index 67042105d..67bb598e5 100644
--- a/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png
index ed34e22a1..270dc9bf8 100755
--- a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png
index 3288241e7..2e0b8ff6f 100644
--- a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png
index db7b695e9..990ae524a 100644
--- a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png
index 3dc7bf5cb..d94a40811 100755
--- a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png
index ce0da2222..2ad1ac3f5 100644
--- a/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_cancel_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png
index e9e9c7a53..e8836a1b0 100644
--- a/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_cancel_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png
index f7c205dd2..e46ab71b4 100644
--- a/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png
index ea2ff8671..bb15a903a 100644
--- a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png
index a615ee436..336682497 100644
--- a/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_check_box_outline_blank_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png
index 946cfea57..cdb4a3181 100644
--- a/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png
new file mode 100644
index 000000000..bb16eabce
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png
new file mode 100644
index 000000000..ae5448d24
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_create_new_folder_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png
index c6bb43e8b..5ad22d0f1 100644
--- a/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png
index cdb230c2f..63f990408 100644
--- a/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png
deleted file mode 100644
index 50f854ea5..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png
deleted file mode 100644
index 60d988dd4..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_description_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png
index 36ed24eec..3f78a47a3 100644
--- a/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_done_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png
index e5024472a..5567661ac 100644
--- a/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_done_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png
index 8f335e274..83cb91561 100644
--- a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png
+++ b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_grey600_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png
index ae9972926..4b030e169 100644
--- a/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png
+++ b/core/src/main/res/drawable-xhdpi/ic_drag_vertical_white_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png
index 921249fb2..8e697365f 100644
--- a/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_expand_more_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png
index f00aa8bd4..16b7c081e 100644
--- a/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_expand_more_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png
index 6c26d6ea2..6f8b42221 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png
index 169a3b386..521f7490b 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_forward_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png
index b7c86059b..2b34fb82d 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png
index 8aec1abb0..2d9a7e3c9 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_forward_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png
index d1db46a23..9468020b7 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png
index ccac2c273..ea5493251 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png
index 379435f54..f4182f174 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png
index 857a1aaa2..de9ec1d90 100644
--- a/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png
index 995aafb5c..84554ce5b 100755
--- a/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_feed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png
index 1495c4fa6..339113c20 100755
--- a/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_feed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png
index aa89d4977..0d42f1749 100644
--- a/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_file_download_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png
index 990dfb82b..219f47167 100644
--- a/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_file_download_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png
index fdbb8eb4e..4c6a96eba 100644
--- a/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_filter_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png
index 7e14f7fbf..9416c70ec 100644
--- a/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_filter_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png
index a0c760e6f..d014684e1 100644
--- a/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_hearing_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png
index 1b8722a7f..91adb4437 100644
--- a/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_hearing_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png
index a098d8d0f..c0ffea719 100644
--- a/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_history_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png
index 7681ac8b8..3aa40c305 100644
--- a/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_history_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png
index e67d41cc1..3b0d3aa1a 100644
--- a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png
index 48e52d596..57e478e9f 100644
--- a/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_indeterminate_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png
index 9dcb234fe..57f3ec5e3 100644
--- a/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_info_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png
index bee33abb7..e18df93a1 100644
--- a/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_info_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_launcher.png b/core/src/main/res/drawable-xhdpi/ic_launcher.png
index 857a1b12e..2dbfd8874 100644
--- a/core/src/main/res/drawable-xhdpi/ic_launcher.png
+++ b/core/src/main/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png
index c51f8a258..030263ce3 100644
--- a/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_list_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png
index abefc200a..2b7253975 100644
--- a/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_list_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png
index ca35f6d0a..c6f6fa06c 100644
--- a/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_lock_closed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png
index 01fb55ca1..873687188 100644
--- a/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_lock_closed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png
index 11d9a4b8b..d82d4bd8b 100644
--- a/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_lock_open_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png
index 01ca4b56c..a5ed62d8a 100644
--- a/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png
deleted file mode 100644
index 7bc63a511..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_more_vert_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png
deleted file mode 100644
index 1b04eda04..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_more_vert_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_new.png b/core/src/main/res/drawable-xhdpi/ic_new.png
deleted file mode 100755
index 447a9398b..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_new.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_new_dark.png b/core/src/main/res/drawable-xhdpi/ic_new_dark.png
deleted file mode 100755
index 4a23d309c..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_new_dark.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png
index 655658557..a2bb4d1b8 100644
--- a/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_new_releases_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png
index 00a4daa62..e78b002f2 100644
--- a/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_new_releases_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png
index 3ec598cfd..6708b4161 100644
--- a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png
index 7efc88511..aeb13ebc4 100644
--- a/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_pause_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
index 14b6d17d4..f49aed757 100644
--- a/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png
index 72dfa9fa6..7192ad487 100644
--- a/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_pause_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png
index 689fda259..6874b8236 100644
--- a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png
index ba62a8102..dabd252ee 100644
--- a/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_play_arrow_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
index a55d19922..5b0110454 100644
--- a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png
index 043acd808..fff3e1f56 100644
--- a/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_play_arrow_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png
index 7891efffa..b2f5463a8 100644
--- a/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_refresh_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png
index 5f89fc257..3dffcc846 100644
--- a/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png
index 7047ed7ea..2039d9ce8 100644
--- a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png
index ef2023b52..6dd240bca 100644
--- a/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_remove_red_eye_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png
new file mode 100644
index 000000000..57162f5ca
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_sd_storage_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png
new file mode 100644
index 000000000..ced6247ca
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_sd_storage_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png
index f9c0b2ec3..b0999b31d 100644
--- a/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_search_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png
index 043759acd..ee844ccdd 100644
--- a/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png
index 2251d2bbb..5a70fdb99 100644
--- a/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png
index c30f31017..49813c945 100644
--- a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png
index ea2313395..bac1560a2 100644
--- a/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_settings_input_antenna_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png
index 12e5d100d..d0cf80051 100644
--- a/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png
index 88a0edd6c..e856dca31 100644
--- a/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_share_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png
index dd536bca2..82692971c 100644
--- a/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png
index 2e291dd19..31aa09ca2 100644
--- a/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_skip_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png
index fa85f1899..e664f607c 100644
--- a/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_skip_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png
index ae0787a26..2d8cb9a75 100644
--- a/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_sleep_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png
index 026224c5e..6ba86245c 100644
--- a/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_sleep_off_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png
index ef39d7279..b03fb39b4 100644
--- a/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_sleep_off_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png
index 07e156172..4d03cc0dc 100644
--- a/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_sleep_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png
index f2ef499ef..91447dc4c 100644
--- a/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_sort_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png
index 68b0b7ad3..6d4af1bcb 100644
--- a/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_sort_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png
index 5160319b5..2bd46b7e7 100644
--- a/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_star_border_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png
index 33f9727d3..4eaf8b891 100644
--- a/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_star_border_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png
index 7a09ebc33..30f1e6ae6 100644
--- a/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_star_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png
index 288799f93..93d3b5d0c 100644
--- a/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_star_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png b/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png
index 50d73271d..3d8a046a8 100644
--- a/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png
+++ b/core/src/main/res/drawable-xhdpi/ic_stat_antenna_default.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png b/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png
index 4adfb636c..200b60c96 100755
--- a/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-xhdpi/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png
deleted file mode 100644
index 23149552f..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_timer_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png
deleted file mode 100644
index 896d9dcf2..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_timer_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png
deleted file mode 100644
index 57a60ed9f..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_toc_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png
deleted file mode 100644
index aa7ee9c02..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_toc_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png b/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png
deleted file mode 100644
index 91c8429ad..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_undobar_undo.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png
index a9f5ebc33..38150f680 100644
--- a/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_web_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png
index edc590a0b..cce57ef59 100644
--- a/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png
+++ b/core/src/main/res/drawable-xhdpi/ic_web_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/navigation_up.png b/core/src/main/res/drawable-xhdpi/navigation_up.png
index f8c3e6f75..0f954094e 100755
--- a/core/src/main/res/drawable-xhdpi/navigation_up.png
+++ b/core/src/main/res/drawable-xhdpi/navigation_up.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/navigation_up_dark.png b/core/src/main/res/drawable-xhdpi/navigation_up_dark.png
index 6964e069b..539222b2f 100755
--- a/core/src/main/res/drawable-xhdpi/navigation_up_dark.png
+++ b/core/src/main/res/drawable-xhdpi/navigation_up_dark.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/stat_notify_sync.png b/core/src/main/res/drawable-xhdpi/stat_notify_sync.png
index ab02927fb..d7348168d 100644
--- a/core/src/main/res/drawable-xhdpi/stat_notify_sync.png
+++ b/core/src/main/res/drawable-xhdpi/stat_notify_sync.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png
index c1f483f71..78c5df4d9 100644
--- a/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png
+++ b/core/src/main/res/drawable-xhdpi/stat_notify_sync_error.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/undobar.9.png b/core/src/main/res/drawable-xhdpi/undobar.9.png
deleted file mode 100644
index 22fa2205b..000000000
--- a/core/src/main/res/drawable-xhdpi/undobar.9.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png b/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png
deleted file mode 100644
index d284ca7cb..000000000
--- a/core/src/main/res/drawable-xhdpi/undobar_button_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png b/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png
deleted file mode 100644
index e990659f0..000000000
--- a/core/src/main/res/drawable-xhdpi/undobar_button_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/undobar_divider.9.png b/core/src/main/res/drawable-xhdpi/undobar_divider.9.png
deleted file mode 100644
index 1b067d4e7..000000000
--- a/core/src/main/res/drawable-xhdpi/undobar_divider.9.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png
index 70e4e86e7..396d18bca 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_add_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
index 72cedcad4..0fdced8fc 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png
index f90617f45..3b55c5d55 100755
--- a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png
index 48e28102a..76cc4db32 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png
index b5918c0f1..eebf0110c 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png
index 81709e0ae..38a5fc264 100755
--- a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png
index f6f7844de..3d2aba75b 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_cancel_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png
index faa409f80..5bb0c3cc4 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_cancel_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png
index 5e52fa65e..7093f28d5 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png
index 9c8615618..050e6cd6c 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png
index 565a755f3..56d380575 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_check_box_outline_blank_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png
index 7b1d9ea34..ba9af5265 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png
new file mode 100644
index 000000000..23fa54d28
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png
new file mode 100644
index 000000000..d8391d37c
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_create_new_folder_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png
index 4886ab1e9..1a3a6192b 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png
index 0e95e9b1d..e4a5d0261 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png
deleted file mode 100644
index 33df5d9d2..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png
deleted file mode 100644
index aa5e73299..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_description_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png
index c836c5490..7feeca3a1 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_done_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png
index f801e7ab3..edb552b49 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png
index 88a800f24..dc8682716 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_grey600_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png
index 148891e6c..808186aa9 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_drag_vertical_white_48dp.9.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png
index 503678f1b..07bb07a38 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_expand_more_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png
index 16094f9bc..fe5c3d280 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_expand_more_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png
index 169a3b386..521f7490b 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png
index 7b83df521..644645c8b 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png
index 8aec1abb0..2d9a7e3c9 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png
index b4cf934f7..76c94c3ba 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png
index ccac2c273..ea5493251 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png
index 940b5413d..831fda2ab 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png
index 857a1aaa2..de9ec1d90 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png
index 751e5d1ba..8e11ac89e 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png
index ddfe32b53..62decef68 100755
--- a/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_feed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png
index 4929a6a11..7838ab87c 100755
--- a/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_feed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png
index e61a48a4d..82b0d1986 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_file_download_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png
index 95502de3f..0b479dba2 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_file_download_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png
index 43ec90ea5..5846ad140 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_filter_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png
index d3923efee..1263ae82e 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_filter_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png
index 111ed802c..19456de04 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_hearing_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png
index 417b39b81..82de8bb65 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_hearing_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png
index 632a73e42..f083e0f2c 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_history_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png
index 3e438ec4e..17d6d29b8 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_history_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png
index c2300b53b..2e7d39a5a 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png
index 66a710d8c..ec4981f5c 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_indeterminate_check_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png
index 64445284b..874226124 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_info_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png
index 185d18d1a..8a1b185ff 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_info_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_launcher.png b/core/src/main/res/drawable-xxhdpi/ic_launcher.png
index 2bef52ec7..41b261b4f 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_launcher.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png
index ceaf36811..c92e250b8 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_list_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png
index 6b7e78f83..4d2807e4e 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png
index 311a7fa13..386595f99 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png
index 39a163843..7bc7c690d 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_lock_closed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png
index c0552d564..a424f4c5d 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_lock_open_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png
index 46852d54f..d37d40dcb 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png
deleted file mode 100644
index 44012b87d..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_more_vert_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png
deleted file mode 100644
index 2955c02ec..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_more_vert_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_new.png b/core/src/main/res/drawable-xxhdpi/ic_new.png
deleted file mode 100755
index 5e836eae4..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_new.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_dark.png b/core/src/main/res/drawable-xxhdpi/ic_new_dark.png
deleted file mode 100755
index bca96b751..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_new_dark.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png
index 3eccc24f0..79507d800 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_new_releases_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png
index 4a7083c57..a4dbba8ae 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_new_releases_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png
index 7efc88511..aeb13ebc4 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png
index c8ed1d00a..8753d9c50 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_pause_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
index 72dfa9fa6..7192ad487 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png
index 76833ff7d..fb63ddc5a 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_pause_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png
index ba62a8102..dabd252ee 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png
index 1d44f8f2f..9fcf99558 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
index 043acd808..fff3e1f56 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png
index fe7ea25cc..9b31e2d19 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png
index 9c1e27d74..e5eef5d8a 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_refresh_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png
index 72128fe69..13157817d 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_refresh_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png
index 259ddcd14..16cdc31c1 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_grey600_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png
index ece7aeb74..695eb950e 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_remove_red_eye_white_18dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png
new file mode 100644
index 000000000..597f417d5
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png
new file mode 100644
index 000000000..2ef908e26
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_sd_storage_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png
index 9424ae98e..2cac5b19c 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_search_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
index 0bbeab150..0ada3a39f 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png
index 6a70402b4..fe7d1a24d 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png
index 5404820db..37ce4c61a 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png
index 19752dd44..0609c3154 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_settings_input_antenna_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png
index 6bb8f6e08..e5de22411 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png
index 89136d7c3..97a334744 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_share_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png
index 9963c6a05..406bc9ab5 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png
index 00a55a0f8..75a4a9545 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_skip_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png
index ac38e6d42..a31299c81 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_skip_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png
index f4bd9e94d..8346240f1 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_sleep_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png
index 6c42d6051..07748be06 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png
index b8e06f9b3..8e2e80e71 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_sleep_off_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png
index e2249c357..33770dbb1 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_sleep_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png
index 6cdc649ea..fa8c4c593 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_sort_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png
index 56ea13fe2..b8ef1050e 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_sort_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png
index 6348e1997..06f24ef24 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_star_border_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png
index aab4831ff..70785a1e3 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_star_border_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png
index ef0294931..29fff7d5f 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_star_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png
index de4b7b29d..d5d478096 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png b/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png
index b274bb60f..965fabc57 100755
--- a/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_stat_authentication.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png
deleted file mode 100644
index a9ae43327..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_timer_grey600_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png
deleted file mode 100644
index 276f4e1b9..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_timer_white_24dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png
deleted file mode 100644
index bb35c5657..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_toc_grey600_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png b/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png
deleted file mode 100644
index fdbb3ac3a..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_toc_white_36dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png
index 9e70743e8..abb58b77b 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_web_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png
index fcc2d1aca..abf5662b3 100644
--- a/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png
+++ b/core/src/main/res/drawable-xxhdpi/ic_web_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png b/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png
index 9cd2a53b4..dabb1ea27 100644
--- a/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png
+++ b/core/src/main/res/drawable-xxhdpi/stat_notify_sync.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png b/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png
index bb76c2756..6810a8249 100644
--- a/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png
+++ b/core/src/main/res/drawable-xxhdpi/stat_notify_sync_error.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png
index c9b68abf0..1c915d9dd 100755
--- a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png
index 87b0756eb..190bb0f4c 100755
--- a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png
new file mode 100644
index 000000000..448ca4898
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png
new file mode 100644
index 000000000..56a47309c
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_create_new_folder_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png
index 5d14b5b25..3fe8eb4dd 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_filter_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png
index e8b865e4a..cb2207f11 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_filter_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png
index e41d5b9ee..03ccfd0d6 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png
index 2376b7334..2586be5ab 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_lock_closed_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png
index c281784dd..e46b956e0 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png
index 25ea3ab99..b2dd88c07 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png
new file mode 100644
index 000000000..25d26d523
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png
new file mode 100644
index 000000000..505fb28dc
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sd_storage_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png
index 94836e0c8..b599c2207 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_skip_grey600_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png b/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png
index a84f34228..a0dd670c3 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_skip_white_36dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png
index 9c0116c60..e8348b7e4 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sleep_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png
index e8141d0df..c06456421 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png
index ca41ad5e6..5cf1d4f3b 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sleep_off_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png
index 29782e155..3e9984bf0 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sleep_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png
index 1109e95c8..d79dfa577 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_star_border_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png
index 086cb677c..c2d2ee285 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_star_border_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png
index dda3262ed..2866aff29 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_star_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png
index ba29292b0..a74fee378 100644
--- a/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png
+++ b/core/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable/undobar_button.xml b/core/src/main/res/drawable/undobar_button.xml
deleted file mode 100644
index a4de91b49..000000000
--- a/core/src/main/res/drawable/undobar_button.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-
- Copyright 2012 Roman Nurik
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
--->
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/undobar_button_pressed" android:state_pressed="true"/>
- <item android:drawable="@drawable/undobar_button_focused" android:state_focused="true"/>
- <item android:drawable="@android:color/transparent"/>
-</selector>
diff --git a/core/src/main/res/values-ar/strings.xml b/core/src/main/res/values-ar/strings.xml
new file mode 100644
index 000000000..912f104b0
--- /dev/null
+++ b/core/src/main/res/values-ar/strings.xml
@@ -0,0 +1,128 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="all_episodes_short_label">الكل</string>
+ <string name="favorite_episodes_label">المفضلات</string>
+ <string name="new_label">جديد</string>
+ <string name="waiting_list_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="cancel_download_label">الغاء التنزيل</string>
+ <!--New episodes fragment-->
+ <string name="recently_published_episodes_label">تم نشره مؤخرا</string>
+ <!--Main activity-->
+ <string name="drawer_open">قائمة الفتح</string>
+ <string name="drawer_close">قائمة الاغلاف</string>
+ <string name="drawer_feed_order_unplayed_episodes">ترتيب بالعداد</string>
+ <string name="drawer_feed_order_alphabetical">ترتيب بالابجدية</string>
+ <string name="drawer_feed_order_last_update">ترتيب بتاريخ النشر</string>
+ <string name="drawer_feed_counter_new">الاعداد الجديدة</string>
+ <string name="drawer_feed_counter_unplayed">الاعداد غير المقرؤة</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">افتح فى المتصفح</string>
+ <string name="copy_url_label">انسخ رابط الموقع</string>
+ <string name="share_url_label">انشر رابط الموقع</string>
+ <string name="copied_url_msg">تم نسخ الرابط للحافظة</string>
+ <string name="go_to_position_label">اذهب لهذا الموقع</string>
+ <!--Playback history-->
+ <!--Other-->
+ <string name="confirm_label">تأكيد</string>
+ <string name="cancel_label">الغاء</string>
+ <string name="yes">نعم</string>
+ <string name="no">لا</string>
+ <string name="author_label">المؤلف</string>
+ <string name="language_label">لغة</string>
+ <string name="url_label">عنوان الموقع</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="description_label">وصف</string>
+ <string name="processing_label">جارى المعالجة</string>
+ <string name="loading_label">جارى التحميل ....</string>
+ <string name="save_username_password_label">حفظ اسم وكلمة المرور</string>
+ <string name="close_label">اغلاق</string>
+ <string name="retry_label">اعادة المحاولة</string>
+ <string name="auto_download_label">تضمين فى التنزيل التلقائي</string>
+ <string name="feed_auto_download_global">عام</string>
+ <string name="feed_auto_download_always">دائما</string>
+ <string name="feed_auto_download_never">ابدا</string>
+ <string name="send_label">ارسال ...</string>
+ <string name="episode_cleanup_never">ابدا</string>
+ <string name="episode_cleanup_after_listening">بعد الانتهاء</string>
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">تعليمه ك تم تشغيله</string>
+ <string name="mark_all_seen_label">تعليمه ك تم مشاهدته</string>
+ <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>
+ <string name="hide_not_downloaded_episodes_label">لم يتم التنزيل</string>
+ <!--actions on feeditems-->
+ <string name="play_label">تشغيل</string>
+ <string name="pause_label">ايقاف مؤقت</string>
+ <string name="stop_label">ايقاف</string>
+ <string name="remove_label">مسح</string>
+ <string name="marked_as_read_label">تم تعليمه ك مشغل</string>
+ <string name="mark_unread_label">تعليمه ك لم يتم تشغيله</string>
+ <string name="add_to_favorite_label">اضافة للمفضلات</string>
+ <string name="added_to_favorites">تم اضافته للمفضلات</string>
+ <string name="remove_from_favorite_label">المسح من المفضلات</string>
+ <string name="removed_from_favorites">تم مسحه من المفضلات</string>
+ <string name="visit_website_label">زيارة الموقع</string>
+ <string name="download_all">تنزيل الكل</string>
+ <string name="activate_auto_download">تفعيل التنزيل التلقائي</string>
+ <string name="deactivate_auto_download">ايقاف التنزيل التلقائي</string>
+ <string name="removed_item">تم حزف العنصر</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">نجحت العملية</string>
+ <string name="download_failed">فشلت العملية</string>
+ <string name="download_pending">التنزيل فى الانتظار</string>
+ <string name="download_running">جارى التنزيل</string>
+ <string name="download_error_device_not_found">حهاز التخزين غير موجود</string>
+ <string name="download_error_insufficient_space">مساحة غير كافية</string>
+ <string name="download_error_file_error">خطاء فى الملف</string>
+ <string name="download_error_http_data_error">خطاء فى بيانات HTTP</string>
+ <string name="download_error_error_unknown">خطاء غير معروف</string>
+ <string name="download_error_connection_error">خطاء فى الاتصال</string>
+ <string name="download_error_unknown_host">المضيف غير معروف</string>
+ <string name="download_error_unauthorized">خطاء فى التحقق</string>
+ <!--Mediaplayer messages-->
+ <string name="playback_error_unknown">خطاء غير معروف</string>
+ <!--Queue operations-->
+ <string name="removed_from_queue">تم حزف العنصر</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-->
+ <string name="new_episodes_count_label">الاعداد غير المقرؤة</string>
+ <!--Feed information screen-->
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <string name="all_label">الكل</string>
+ <string name="unplayed_label">لم يتم تشغيله</string>
+ <string name="downloaded_label">تم التنزيل</string>
+ <string name="not_downloaded_label">لم يتم التنزيل</string>
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-ca-rES/strings.xml b/core/src/main/res/values-ca-rES/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-ca-rES/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml
index 290c16176..1821eeab7 100644
--- a/core/src/main/res/values-ca/strings.xml
+++ b/core/src/main/res/values-ca/strings.xml
@@ -22,6 +22,9 @@
<string name="playback_history_label">Historial de reproducció</string>
<string name="gpodnet_main_label">gpodder.net</string>
<string name="gpodnet_auth_label">Inici de sessió a gpodder.net</string>
+ <string name="free_space_label">%1$s lliures</string>
+ <string name="episode_cache_full_title">Caché d\'episodi completa</string>
+ <string name="episode_cache_full_message">S\'ha arribat al límit de la caché. Pots incrementar la capacitat de la caché a les Opcions</string>
<!--New episodes fragment-->
<string name="recently_published_episodes_label">Publicats recentment</string>
<string name="episode_filter_label">Mostra només els episodis nous</string>
@@ -66,6 +69,7 @@
<string name="length_prefix">Durada:\u0020</string>
<string name="size_prefix">Mida:\u0020</string>
<string name="processing_label">S\'està processant</string>
+ <string name="loading_label">Carregant...</string>
<string name="save_username_password_label">Desa nom d\'usuari i contrasenya</string>
<string name="close_label">Tanca</string>
<string name="retry_label">Reintenta</string>
@@ -77,6 +81,7 @@
<string name="feed_auto_download_global">Global</string>
<string name="feed_auto_download_always">Sempre</string>
<string name="feed_auto_download_never">Mai</string>
+ <string name="send_label">Enviar...</string>
<string name="episode_cleanup_never">Mai</string>
<string name="episode_cleanup_queue_removal">Quan no està a la cua</string>
<string name="episode_cleanup_after_listening">Després d\'acabar</string>
@@ -99,6 +104,7 @@
<string name="mark_all_seen_label">Marca tot com a llegit</string>
<string name="show_info_label">Mostra informació</string>
<string name="remove_feed_label">Esborra podcast</string>
+ <string name="share_label">Compartir...</string>
<string name="share_link_label">Comparteix l\'enllaç</string>
<string name="share_link_with_position_label">Comparteix enllaç amb posició</string>
<string name="share_feed_url_label">Comparteix adreça del canal</string>
@@ -133,7 +139,9 @@
<string name="added_to_queue_label">Afegit a la cua</string>
<string name="remove_from_queue_label">Suprimeix de la cua</string>
<string name="add_to_favorite_label">Afegit a Favorits</string>
+ <string name="added_to_favorites">Afegit a favorits</string>
<string name="remove_from_favorite_label">Suprimeix de Favorits</string>
+ <string name="removed_from_favorites">Tret de favorits</string>
<string name="visit_website_label">Visita el lloc web</string>
<string name="support_label">Comparteix amb Flattr</string>
<string name="enqueue_all_new">Posa-ho tot a la cua</string>
@@ -167,6 +175,10 @@
<string name="download_error_io_error">Error d\'E/S</string>
<string name="download_error_request_error">Error de petició</string>
<string name="download_error_db_access">Error d\'accés a la base de dades</string>
+ <plurals name="downloads_left">
+ <item quantity="one">%d baixada pendent</item>
+ <item quantity="other">%d baixades pendents</item>
+ </plurals>
<string name="downloads_processing">S\'estan processant les baixades</string>
<string name="download_notification_title">S\'estan baixant les dades del podcast</string>
<string name="download_report_content">%1$d baixades finalitzades, %2$d fallides</string>
@@ -198,6 +210,8 @@
<!--Queue operations-->
<string name="lock_queue">Bloqueja la cua</string>
<string name="unlock_queue">Desbloqueja la cua</string>
+ <string name="queue_locked">Cua bloquejada</string>
+ <string name="queue_unlocked">Cua no bloquejada</string>
<string name="clear_queue_label">Buida la cua</string>
<string name="undo">Desfés</string>
<string name="removed_from_queue">Ítem esborrat</string>
@@ -239,11 +253,13 @@
<!--Variable Speed-->
<string name="download_plugin_label">Baixa el connector</string>
<string name="no_playback_plugin_title">Connector no instal·lat</string>
+ <string name="no_playback_plugin_or_sonic_msg">Per a què funcioni la velocitat de reproducció variable, recomanem activar el Sonic Media Player integrat [Android 4.1+].\n\nPer una altra banda, pots baixar el plugin de tercers <i>Prestissimo</i> de la Play Store.\nQualsevol problema amb Prestissimo no és responsabilitat d\'AntennaPod i no haurà de ser reportat al seu propietari.</string>
<string name="set_playback_speed_label">Velocitats de reproducció</string>
<string name="enable_sonic">Activa Sonic</string>
<!--Empty list labels-->
<string name="no_items_label">No hi ha elements a la llista.</string>
<string name="no_feeds_label">No us heu subscrit a cap canal.</string>
+ <string name="no_chapters_label">Aquest episodi no té capítols</string>
<!--Preferences-->
<string name="other_pref">Altres</string>
<string name="about_pref">Quant a</string>
@@ -251,12 +267,19 @@
<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">Episodis que no es troben a la cua i no són favorits haurien de ser candidats per ser esborrats si Auto Descàrrega necessita espai per nous episodis</string>
+ <string name="pref_pauseOnDisconnect_sum">Pausa la reproducció en desconnectar els auriculars o el bluetooth</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Continua la reproducció en connectar novament els auriculars</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">Continua la reproducció en connectar novament el bluetooth</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Botó \'Endavant\' passa al següent</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Al prémer el botó de hardware \'Endavant\' passar al següent episodi en comptes d\'avançar a la reproducció</string>
<string name="pref_followQueue_sum">Salta al següent element de la cua en acabar la reproducció</string>
<string name="pref_auto_delete_sum">Suprimeix l\'episodi quan s\'acabi de reproduir</string>
<string name="pref_auto_delete_title">Esborrat automàtic</string>
<string name="pref_smart_mark_as_played_sum">Marca episodis com com reproduits, encara que quedi menys d\'una certa quantitat de segons de temps</string>
<string name="pref_smart_mark_as_played_title">Marcació intel·ligent com a reproduit</string>
+ <string name="pref_skip_keeps_episodes_sum">Mantenir episodis quan són passats de llarg</string>
+ <string name="pref_skip_keeps_episodes_title">Mantenir els episodis passats de llarg</string>
<string name="playback_pref">Reproducció</string>
<string name="network_pref">Xarxa</string>
<string name="pref_autoUpdateIntervallOrTime_title">Actualitza interval o horari del dia</string>
@@ -265,11 +288,14 @@
<string name="pref_autoUpdateIntervallOrTime_Disable">Desactivar</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Establir interval</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Establir hora del dia</string>
+ <string name="pref_autoUpdateIntervallOrTime_every">cada %1$s</string>
+ <string name="pref_autoUpdateIntervallOrTime_at">als %1$s</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Només baixa fitxers a través d\'una xarxa sense fils</string>
<string name="pref_followQueue_title">Reproducció continuada</string>
<string name="pref_downloadMediaOnWifiOnly_title">Baixa a través de xarxes sense fils</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Desconnexió d\'auriculars</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Connexió d\'auriculars</string>
+ <string name="pref_unpauseOnBluetoothReconnect_title">Connexió de bluetooth</string>
<string name="pref_mobileUpdate_title">Actualitzacions sobre xarxes mòbils</string>
<string name="pref_mobileUpdate_sum">Permet actualitzacions a través de xarxes mòbils.</string>
<string name="refreshing_label">S\'està actualitzant</string>
@@ -333,8 +359,13 @@
<string name="pref_smart_mark_as_played_disabled">Desactivar</string>
<string name="pref_image_cache_size_title">Mida de la memòria cau de les imatges</string>
<string name="pref_image_cache_size_sum">Mida de la memòria cau en el disc de les imatges.</string>
+ <string name="crash_report_title">Reportar tancament abrupte</string>
+ <string name="crash_report_sum">Enviar l\'últim report 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 multimèdia Sonic</string>
+ <string name="pref_sonic_message">Fer servir el reproductor Sonic Media integrat en comptes del reproductor natiu d\'Android i Prestissimo</string>
+ <string name="pref_current_value">Valor actual: %1$s</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Activa la compartició automàtica per Flattr</string>
<string name="auto_flattr_after_percent">Comparteix per Flattr l\'episodi en haver-ne reproduït el %d per cent</string>
@@ -361,12 +392,15 @@
<string name="opml_import_error_dir_empty">El directori d\'importacions és buit.</string>
<string name="select_all_label">Selecciona-ho tot</string>
<string name="deselect_all_label">Deselecciona-ho tot</string>
+ <string name="select_options_label">Selecciona...</string>
<string name="choose_file_from_filesystem">Des de sistema d\'arxius local</string>
<string name="choose_file_from_external_application">Utilitza aplicació externa</string>
<string name="opml_export_label">Exportació OPML</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>
<string name="disable_sleeptimer_label">Desactiva el temporitzador</string>
@@ -424,11 +458,15 @@
<string name="selected_folder_label">Carpeta seleccionada:</string>
<string name="create_folder_label">Crea una carpeta</string>
<string name="choose_data_directory">Selecció de la carpeta de dades</string>
+ <string name="choose_data_directory_message">Selecciona l\'arrel del teu directori d\'informació. AntennaPod crearà els subdirectoris pertinents</string>
<string name="create_folder_msg">Voleu crear una nova carpeta amb el nom \"%1$s\"?</string>
<string name="create_folder_success">S\'ha creat la nova carpeta</string>
<string name="create_folder_error_no_write_access">No es pot escriure dins d\'aquesta carpeta</string>
<string name="create_folder_error_already_exists">La carpeta ja existeix</string>
<string name="create_folder_error">No s\'ha pogut crear la carpeta</string>
+ <string name="folder_does_not_exist_error">\"%1$s\" no existeix</string>
+ <string name="folder_not_readable_error">\"%1$s\" no es pot llegir</string>
+ <string name="folder_not_writable_error">No es pot escriure a \"%1$s\"</string>
<string name="folder_not_empty_dialog_title">La carpeta no és buida</string>
<string name="folder_not_empty_dialog_msg">La carpeta que heu seleccionat no és buida. Les baixades i altres fitxers es copiaran directament a aquesta carpeta. Voleu continuar?</string>
<string name="set_to_default_folder">Selecciona la carpeta per defecte</string>
@@ -440,6 +478,7 @@
<!--Online feed view-->
<string name="subscribe_label">Subscriu</string>
<string name="subscribed_label">Subscrit</string>
+ <string name="downloading_label">S\'està baixant...</string>
<!--Content descriptions for image buttons-->
<string name="show_chapters_label">Mostra els capítols</string>
<string name="show_shownotes_label">Mostra les notes del programa</string>
@@ -462,11 +501,20 @@
<!--Feed information screen-->
<string name="authentication_label">Autenticació</string>
<string name="authentication_descr">Canvieu el nom d\'usuari i contrasenya per a aquest podcast i els seus episodis.</string>
+ <string name="auto_download_settings_label">Opcions d\'Auto Descàrrega</string>
+ <string name="episode_filters_label">Filtre d\'episodis</string>
+ <string name="episode_filters_description">Llistat de termes usats per decidir si un episodi s\'ha d\'incloure o excloure en descarregar automàticament</string>
+ <string name="episode_filters_include">Incloure</string>
+ <string name="episode_filters_exclude">Excloure</string>
+ <string name="episode_filters_hint">Una paraula \n\"Diverses paraules\"</string>
+ <string name="keep_updated">Mantenir actualitzat</string>
<!--Progress information-->
<string name="progress_upgrading_database">Actualització de la base de dades</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">S\'estan important les subscripcions des de les apps de propòsit únic...</string>
<string name="search_itunes_label">Cerca a iTunes</string>
+ <string name="select_label"><b>Selecciona...</b></string>
+ <string name="filter">Filtrar</string>
<string name="all_label">Tot</string>
<string name="selected_all_label">Selecciona tots els episodis</string>
<string name="none_label">Cap</string>
@@ -479,6 +527,11 @@
<string name="selected_downloaded_label">Selecciona episodis descarregats</string>
<string name="not_downloaded_label">No baixat</string>
<string name="selected_not_downloaded_label">Selecciona episodis sense descarregar</string>
+ <string name="queued_label">En cua</string>
+ <string name="selected_queued_label">Episodis en cua seleccionats</string>
+ <string name="not_queued_label">No a la cua</string>
+ <string name="selected_not_queued_label">Episodis seleccionats i no a la cua</string>
+ <string name="sort_title"><b>Ordena per...</b></string>
<string name="sort_title_a_z">Títol (A \u2192 Z)</string>
<string name="sort_title_z_a">Títol (Z \u2192 A)</string>
<string name="sort_date_new_old">Data (Nou \u2192 Antic)</string>
@@ -486,5 +539,18 @@
<string name="sort_duration_short_long">Duració (Curt \u2192 Llarg)</string>
<string name="sort_duration_long_short">Duration (Llarg \u2192 Curt)</string>
<!--Rating dialog-->
+ <string name="rating_title">T\'agrada AntennaPod?</string>
+ <string name="rating_message">Apreciaríem que et prenguessis un temps per valorar AntennaPod</string>
+ <string name="rating_never_label">Deixa\'m tranquil</string>
+ <string name="rating_later_label">Pregunta\'m més tard</string>
+ <string name="rating_now_label">I tant, fem-ho!</string>
<!--Audio controls-->
+ <string name="audio_controls">Controls d\'audio</string>
+ <string name="playback_speed">Velocitat de reproducció</string>
+ <string name="volume">Volum</string>
+ <string name="left_short">E</string>
+ <string name="right_short">D</string>
+ <string name="audio_effects">Efectes de so</string>
+ <string name="stereo_to_mono">Downmix: D\'estereo a mono</string>
+ <string name="sonic_only">Només Sonic</string>
</resources>
diff --git a/core/src/main/res/values-cs-rCZ/strings.xml b/core/src/main/res/values-cs-rCZ/strings.xml
index 335232675..390fff60b 100644
--- a/core/src/main/res/values-cs-rCZ/strings.xml
+++ b/core/src/main/res/values-cs-rCZ/strings.xml
@@ -403,6 +403,7 @@
<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>
<string name="disable_sleeptimer_label">Deaktivovat časovač vypnutí</string>
@@ -464,6 +465,7 @@
<string name="create_folder_label">Vytvořit adresář</string>
<string name="choose_data_directory">Vybrat umístění dat</string>
<string name="choose_data_directory_message">Vyberte prosím váš výchozí datový adresář. AntennaPod vytvoří všechny potřebné podadresáře.</string>
+ <string name="choose_data_directory_permission_rationale">Ke změně datového adresáře je vyžadován přístup k externímu úložišti</string>
<string name="create_folder_msg">Vytvořit adresář \"%1$s\"?</string>
<string name="create_folder_success">Nový adresář vytvořen</string>
<string name="create_folder_error_no_write_access">Nelze zapisovat do adresáře</string>
@@ -506,6 +508,13 @@
<!--Feed information screen-->
<string name="authentication_label">Ověření</string>
<string name="authentication_descr">Změnit uživatelské jméno a heslo pro tento podcast a jeho epizody.</string>
+ <string name="auto_download_settings_label">Nastavení automatického stahování</string>
+ <string name="episode_filters_label">Filtr epizod</string>
+ <string name="episode_filters_description">Seznam pravidel použitých při rozhodování, jestli má být epizoda zahrnuta nebo vyřazena při automatickém stahování</string>
+ <string name="episode_filters_include">Zahrnout</string>
+ <string name="episode_filters_exclude">Vyřadit</string>
+ <string name="episode_filters_hint">Jednoslovné \n\"Víceslovné\"</string>
+ <string name="keep_updated">Udržovat aktuální</string>
<!--Progress information-->
<string name="progress_upgrading_database">Probíhá aktualizace databáze</string>
<!--AntennaPodSP-->
@@ -525,6 +534,10 @@
<string name="selected_downloaded_label">Vybrány stažené epizody</string>
<string name="not_downloaded_label">Nestažené</string>
<string name="selected_not_downloaded_label">Vybrány nestažené epizody</string>
+ <string name="queued_label">Ve frontě</string>
+ <string name="selected_queued_label">Vybrané epizody ve frontě</string>
+ <string name="not_queued_label">Mimo frontu</string>
+ <string name="selected_not_queued_label">Vybrané epizody mimo frontu</string>
<string name="sort_title"><b>Řadit dle</b></string>
<string name="sort_title_a_z">Názvu (A \u2192 Z)</string>
<string name="sort_title_z_a">Názvu (Z \u2192 A)</string>
diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml
index 7432f5537..bf7f1a435 100644
--- a/core/src/main/res/values-de/strings.xml
+++ b/core/src/main/res/values-de/strings.xml
@@ -400,6 +400,7 @@
<string name="export_error_label">Exportfehler</string>
<string name="opml_export_success_title">OPML Export erfolgreich</string>
<string name="opml_export_success_sum">Die OPML Datei wurde unter dem folgenden Pfad gespeichert:\u0020</string>
+ <string name="opml_import_ask_read_permission">Zugriff auf externen Speicher wird benötigt, um die OPML Datei zu lesen</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Schlummerfunktion</string>
<string name="disable_sleeptimer_label">Schlummerfunktion deaktivieren</string>
@@ -458,6 +459,7 @@
<string name="create_folder_label">Neuer Ordner</string>
<string name="choose_data_directory">Datenordner auswählen</string>
<string name="choose_data_directory_message">Bitte wähle eine Basis für deinen Datenordner. AntennaPod erstellt automatisch die richtigen Unterverzeichnisse.</string>
+ <string name="choose_data_directory_permission_rationale">Zugriff auf den externen Speicher wird benötigt, um den Datenordner zu ändern</string>
<string name="create_folder_msg">Neuen Ordner mit Namen \"%1$s\" erstellen?</string>
<string name="create_folder_success">Neuer Ordner angelegt</string>
<string name="create_folder_error_no_write_access">Kann in diesem Ordner nicht schreiben</string>
@@ -500,6 +502,13 @@
<!--Feed information screen-->
<string name="authentication_label">Authentifizierung</string>
<string name="authentication_descr">Ändere den Benutzernamen und das Passwort für diesen Podcast und dessen Episoden.</string>
+ <string name="auto_download_settings_label">Einstellungen für Automatischen Download</string>
+ <string name="episode_filters_label">Episoden-Filter</string>
+ <string name="episode_filters_description">Liste von Wörtern, die dazu verwendet wird, Episoden beim automatischen Download einzubeziehen oder auszuschließen</string>
+ <string name="episode_filters_include">Einbeziehen</string>
+ <string name="episode_filters_exclude">Ausschließen</string>
+ <string name="episode_filters_hint">Einzelne Wörter\n\"Mehrere Wörter\"</string>
+ <string name="keep_updated">Aktuell halten</string>
<!--Progress information-->
<string name="progress_upgrading_database">Datenbank wird aktualisiert</string>
<!--AntennaPodSP-->
@@ -519,6 +528,10 @@
<string name="selected_downloaded_label">Heruntergeladene Episoden ausgewählt</string>
<string name="not_downloaded_label">Nicht heruntergeladen</string>
<string name="selected_not_downloaded_label">Nicht heruntergeladene Episoden ausgewählt</string>
+ <string name="queued_label">In Abspielliste</string>
+ <string name="selected_queued_label">Episoden in Abspielliste ausgewählt</string>
+ <string name="not_queued_label">Nicht in Abspielliste</string>
+ <string name="selected_not_queued_label">Episoden nicht in Abspielliste ausgewählt</string>
<string name="sort_title"><b>Sortiere nach…</b></string>
<string name="sort_title_a_z">Titel (A \u2192 Z)</string>
<string name="sort_title_z_a">Titel (Z \u2192 A)</string>
diff --git a/core/src/main/res/values-el/strings.xml b/core/src/main/res/values-el/strings.xml
new file mode 100644
index 000000000..60a3213b8
--- /dev/null
+++ b/core/src/main/res/values-el/strings.xml
@@ -0,0 +1,358 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="feeds_label">Ροές</string>
+ <string name="podcasts_label">PODCASTS</string>
+ <string name="episodes_label">Επεισόδια</string>
+ <string name="new_episodes_label">Νέα Επεισόδια</string>
+ <string name="all_episodes_label">Όλα τα Επεισόδια</string>
+ <string name="all_episodes_short_label">Όλα</string>
+ <string name="favorite_episodes_label">Αγαπημένα</string>
+ <string name="new_label">Νέα</string>
+ <string name="settings_label">Ρυθμίσεις</string>
+ <string name="downloads_label">Λήψεις</string>
+ <string name="downloads_running_label">Εκτέλεση</string>
+ <string name="downloads_completed_label">Ολοκληρώθηκε</string>
+ <string name="downloads_log_label">Είσοδος</string>
+ <string name="playback_history_label">Ιστορικό Αναπαραγωγής</string>
+ <string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_auth_label">gpodder.net Σύνδεση</string>
+ <!--New episodes fragment-->
+ <string name="recently_published_episodes_label">Πρόσφατα δημοσιεύθηκε</string>
+ <string name="episode_filter_label">Εμφάνιση μόνο νέων Επεισοδίων</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_counter_new">Αριθμός νέων επεισοδίων</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="copied_url_msg">Αντιγραφή URL στο Πρόχειρο</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="error_msg_prefix">Παρουσιάστηκε ένα σφάλμα:</string>
+ <string name="refresh_label">Ανανέωση</string>
+ <string name="external_storage_error_msg">Καμία εξωτερική αποθήκευση είναι διαθέσιμη. Παρακαλώ βεβαιωθείτε ότι η εξωτερική αποθήκευση έχει τοποθετηθεί έτσι ώστε η εφαρμογή να μπορεί να λειτουργήσει σωστά.</string>
+ <string name="chapters_label">Κεφάλαια</string>
+ <string name="shownotes_label">Εμφάνιση Σημειώσεων</string>
+ <string name="description_label">Περιγραφή</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="close_label">Κλείσιμο</string>
+ <string name="retry_label">Επανάληψη</string>
+ <string name="auto_download_label">Συμπερίληψη στην αυτόματη λήψη</string>
+ <string name="parallel_downloads_suffix">\u0020παράλληλες λήψεις</string>
+ <string name="feed_auto_download_always">Πάντα</string>
+ <string name="feed_auto_download_never">Ποτέ</string>
+ <string name="episode_cleanup_never">Ποτέ</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">URL της Ροής</string>
+ <string name="etxtFeedurlHint">www.example.com/feed</string>
+ <string name="txtvfeedurl_label">Προσθήκη Podcast με τη διεύθυνση URL</string>
+ <string name="podcastdirectories_descr">Μπορείτε να ψάξετε για νέα podcast από το όνομα, κατηγορία ή δημοτικότητα στον κατάλογο του iTunes.</string>
+ <string name="browse_gpoddernet_label">Περιήγηση στο gpodder.net</string>
+ <!--Actions on feeds-->
+ <string name="show_info_label">Εμφάνιση πληροφοριών</string>
+ <string name="remove_feed_label">Κατάργηση Podcast</string>
+ <string name="feed_delete_confirmation_msg">Παρακαλούμε επιβεβαιώστε ότι θέλετε να διαγράφθουν αυτες οι τροφοδοσιες και όλα τα επεισόδια του υλικού αυτού που έχετε κανει λήψη.</string>
+ <string name="hide_episodes_title">Απόκρυψη Επεισοδίων</string>
+ <string name="hide_downloaded_episodes_label">Ειλημμένα</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} Η Τελευταία Ανανέωση Απέτυχε</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Λήψη</string>
+ <string name="play_label">Αναπαραγωγή</string>
+ <string name="pause_label">Παύση</string>
+ <string name="stop_label">Στοπ</string>
+ <string name="stream_label">Ροή</string>
+ <string name="remove_label">Κατάργηση</string>
+ <string name="add_to_queue_label">Προσθήκη σε αναμονή κλήσης</string>
+ <string name="remove_from_queue_label">Κατάργηση απο την αναμονή κλήσης</string>
+ <string name="add_to_favorite_label">Προσθήκη στα Αγαπημένα</string>
+ <string name="remove_from_favorite_label">Προσθήκη από τα Αγαπημένα</string>
+ <string name="visit_website_label">Επισκεφθείτε την ιστοσελίδα</string>
+ <string name="support_label">Flattr αυτό</string>
+ <string name="enqueue_all_new">Τοποθέτηση στην αναμονή ολων</string>
+ <string name="download_all">Λήψη όλων</string>
+ <string name="skip_episode_label">Μετάβαση επεισοδίων</string>
+ <string name="activate_auto_download">Ενεργοποίηση Αυτόματης Λήψης</string>
+ <string name="deactivate_auto_download">Απενεργοποίηση Αυτόματης Λήψης</string>
+ <string name="reset_position">Επαναφορά Θέσης Αναπαραγωγής</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">επιτυχής</string>
+ <string name="download_failed">απέτυχε</string>
+ <string name="download_pending">Λήψη σε εκκρεμότητα</string>
+ <string name="download_running">Λήψη εν λειτουργία</string>
+ <string name="download_error_device_not_found">Η Συσκευή Αποθήκευσης δεν υπάρχει</string>
+ <string name="download_error_file_error">Σφάλμα Αρχείου</string>
+ <string name="download_error_http_data_error">Σφάλμα HTTP Δεδομένων</string>
+ <string name="download_error_error_unknown">Άγνωστο σφάλμα</string>
+ <string name="download_error_parser_exception">Αναλυτής εξαίρεσης</string>
+ <string name="download_error_connection_error">Σφάλμα Σύνδεσης</string>
+ <string name="download_error_unauthorized">Σφάλμα Αυθεντικοποίησης</string>
+ <string name="cancel_all_downloads_label">Ακύρωση όλων των λήψεων</string>
+ <string name="download_canceled_msg">Η Λήψη ακυρώθηκε</string>
+ <string name="download_report_title">Οι Λήψεις ολοκληρώθηκαν με σφάλμα(τα)</string>
+ <string name="download_report_content_title">Αναφορά Λήψεων</string>
+ <string name="download_error_malformed_url">Εσφαλμένη διεύθυνση URL</string>
+ <string name="download_error_io_error">IO Σφαλμα</string>
+ <string name="download_error_db_access">Σφάλμα Πρόσβασης Βάσης Δεδομένων</string>
+ <string name="downloads_processing">Λήψη Επεξεργασίας</string>
+ <string name="download_notification_title">Λήψη podcast δεδομένων </string>
+ <string name="download_report_content">%1$d λήψη πέτυχε, %2$d απέτυχε</string>
+ <string name="download_log_title_unknown">Άγνωστος Τίτλος</string>
+ <string name="download_type_feed">Τροφοδοσία</string>
+ <string name="download_type_media">Αρχείο πολυμέσων</string>
+ <string name="download_type_image">Εικόνα</string>
+ <string name="download_request_error_dialog_message_prefix">Παρουσιάστηκε ένα σφάλμα κατά την προσπάθεια να κάνετε λήψη του αρχείου: \ u0020</string>
+ <string name="authentication_notification_title">Απαιτείται έλεγχος ταυτότητας</string>
+ <string name="authentication_notification_msg">Ο πόρος που ζητήσατε απαιτεί ένα όνομα χρήστη και έναν κωδικό πρόσβασης</string>
+ <string name="confirm_mobile_download_dialog_only_add_to_queue">Τοποθέτηση στην ουρά αναμονής</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Σφάλμα!</string>
+ <string name="player_stopped_msg">Δεν απαραγωνται πολυμεσα</string>
+ <string name="player_preparing_msg">Προετοιμασία</string>
+ <string name="player_ready_msg">Έτοιμοι</string>
+ <string name="player_seeking_msg">Αναζητηση</string>
+ <string name="playback_error_server_died">Ο διακομιστής πέθανε</string>
+ <string name="playback_error_unknown">Άγνωστο σφάλμα</string>
+ <string name="no_media_playing_label">Δεν απαραγωνται πολυμεσα</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">Προσωρινή μνήμη</string>
+ <string name="playbackservice_notification_title">Αναπαραγωγή του podcast</string>
+ <string name="unknown_media_key">AntennaPod - Άγνωστα πλήκτρα πολυμέσων: %1$d</string>
+ <!--Queue operations-->
+ <string name="lock_queue">Κλείδωμα Ουράς Αναμονής</string>
+ <string name="unlock_queue">Ξεκλείδωμα Ουράς Αναμονής</string>
+ <string name="clear_queue_label">Εκκαθάριση Ουράς Αναμονής</string>
+ <string name="undo">Αναίρεση</string>
+ <string name="removed_from_queue">Στοιχεία αφαιρούνται</string>
+ <string name="move_to_top_label">Μετακίνηση στην κορυφή</string>
+ <string name="move_to_bottom_label">Μετακίνηση προς τα κάτω</string>
+ <string name="sort">Ταξινόμηση</string>
+ <string name="alpha">Αλφαβητικά</string>
+ <string name="date">Ημερομηνία</string>
+ <string name="duration">Δάρκεια</string>
+ <string name="ascending">Αύξουσα</string>
+ <string name="descending">Φθίνουσα</string>
+ <string name="clear_queue_confirmation_msg">Παρακαλούμε επιβεβαιώστε ότι θέλετε να διαγράψετε την ουρά όλων των επεισοδίων σε αυτό</string>
+ <!--Flattr-->
+ <string name="flattr_auth_label">Flattr σύνδεση </string>
+ <string name="flattr_auth_explanation">Πατήστε το κουμπί παρακάτω για να ξεκινήσει η διαδικασία ελέγχου ταυτότητας. Θα πρέπει να διαβιβάζονται στην οθόνη σύνδεσης Flattr στον browser σας και να σας ζητηθεί να δώσει AntennaPod την άδεια να Flattr πράγματα. Αφού έχετε δώσει την άδεια, θα επιστρέψετε σε αυτήν την οθόνη αυτόματα.</string>
+ <string name="authenticate_label">Έλεγχος</string>
+ <string name="return_home_label">Επιστροφή στην αρχική σελίδα</string>
+ <string name="flattr_auth_success">Έλεγχος ταυτότητας ήταν επιτυχής! Μπορείτε τώρα να Flattr πράγματα μέσα από την εφαρμογή.</string>
+ <string name="no_flattr_token_title">Δεν βρέθηκε Flattr διακριτικό</string>
+ <string name="no_flattr_token_notification_msg">Ο Flattr λογαριασμός σας δεν φαίνεται να συνδέεται με το AntennaPod. Πατήστε εδώ για να επικυρωθει.</string>
+ <string name="no_flattr_token_msg">Ο Flattr λογαριασμός σας δεν φαίνεται να συνδέεται με το AntennaPod. Μπορείτε είτε να συνδέσετε το λογαριασμό σας στο AntennaPod να Flattr πράγματα μέσα από την εφαρμογή ή μπορείτε να επισκεφθείτε την ιστοσελίδα του πράγματος για Flattr εκεί</string>
+ <string name="authenticate_now_label">Έλεγχος</string>
+ <string name="action_forbidden_title">Δράση απαγορεύεται</string>
+ <string name="action_forbidden_msg">Το AntennaPod δεν έχει άδεια για τη δράση αυτή. Ο λόγος ειναι οτι θα μπορούσε να είναι ότι το διακριτικό πρόσβασης του AntennaPod στο λογαριασμό σας έχει ανακληθεί. Μπορείτε να κανετε εκ νέου τον ελεγχο ταυτοποιησης ή επισκεφθείτε την ιστοσελίδα του πράγματος.</string>
+ <string name="access_revoked_title">Πρόσβαση ανακαλείται</string>
+ <string name="access_revoked_info">Έχετε ανακαλέσει επιτυχώς διακριτικό πρόσβασης AntennaPod στον λογαριασμό σας. Για να ολοκληρωθεί η διαδικασία, θα πρέπει να αφαιρέσετε αυτή η εφαρμογή από τον κατάλογο των εγκεκριμένων αιτήσεων στις ρυθμίσεις του λογαριασμού σας στην Flattr ιστοσελίδα.</string>
+ <!--Flattr-->
+ <string name="flattr_click_success">Flattr\'ed ένα πράγμα!</string>
+ <string name="flattr_click_success_count">Flattr\'ed%d πράγματα!</string>
+ <string name="flattr_click_success_queue">Flattr\'ed: %s.</string>
+ <string name="flattr_click_failure_count">Αποτυχία Flattr%d πράγματα!</string>
+ <string name="flattr_click_failure">Οχι flattr\'ed: %s.</string>
+ <string name="flattr_click_enqueued">Πράγμα θα flattr\'ed αργότερα</string>
+ <string name="flattring_thing">Flattring %s</string>
+ <string name="flattring_label">Το AntennaPod είναι flattring</string>
+ <string name="flattrd_label">Το AntennaPod έχει flattr\'ed</string>
+ <string name="flattrd_failed_label">AntennaPod Flattr απέτυχε</string>
+ <string name="flattr_retrieving_status">Ανάκτηση flattr\'ed πραγμάτων</string>
+ <!--Variable Speed-->
+ <string name="download_plugin_label">Λήψη Πρόσθετου</string>
+ <string name="no_playback_plugin_title">Το Πρόσθετο δεν είναι εγκατεστημένο</string>
+ <string name="set_playback_speed_label">Ταχύτητες αναπαραγωγής</string>
+ <!--Empty list labels-->
+ <string name="no_items_label">Δεν υπάρχουν στοιχεία σε αυτή τη λίστα.</string>
+ <string name="no_feeds_label">Δεν έχετε εγγραφεί σε οποιεσδήποτε τροφοδοσίες ακόμα</string>
+ <!--Preferences-->
+ <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>
+ <string name="pref_auto_delete_sum">Διαγραφή επεισοδίων όταν η αναπαραγωγή ολοκληρωθεί</string>
+ <string name="pref_auto_delete_title">Αυτόματη διαγραφή</string>
+ <string name="playback_pref">Αναπαραγωγή</string>
+ <string name="network_pref">Δίκτυο</string>
+ <string name="pref_downloadMediaOnWifiOnly_sum">Λήψη αρχείων πολυμέσων μόνο μέσω WiFi</string>
+ <string name="pref_downloadMediaOnWifiOnly_title">WiFi λυψη πολυμεσων</string>
+ <string name="pref_mobileUpdate_sum">Να επιτρέπονται ενημερώσεις μέσω της σύνδεσης δεδομένων κινητής τηλεφωνίας</string>
+ <string name="refreshing_label">Ανανεωση</string>
+ <string name="flattr_settings_label">Flattr Ρυθμισεις</string>
+ <string name="pref_flattr_auth_title">Flattr Συνδεση</string>
+ <string name="pref_flattr_auth_sum">Συνδεθείτε στον Flattr λογαριασμό σας για να Flattr πράγματα απευθείας από την εφαρμογή.</string>
+ <string name="pref_flattr_this_app_sum">Υποστήριξη της ανάπτυξης του AntennaPod flattring αυτό. Ευχαριστούμε!</string>
+ <string name="pref_revokeAccess_title">Ανάκληση πρόσβασης</string>
+ <string name="pref_revokeAccess_sum">Ανακληση της άδειας πρόσβασης στον Flattr λογαριασμό για αυτη την εφαρμογή.</string>
+ <string name="pref_auto_flattr_title">Αυτόματο Flattr</string>
+ <string name="pref_auto_flattr_sum">Διαμόρφωση αυτόματου flattring</string>
+ <string name="user_interface_label">Περιβάλλον χρήστη</string>
+ <string name="pref_set_theme_sum">Αλλαγή της εμφάνισης του AntennaPod.</string>
+ <string name="pref_automatic_download_sum">Ρύθμιση της αυτόματης λήψης των επεισοδίων.</string>
+ <string name="pref_autodl_wifi_filter_title">Ενεργοποίηση Wi-Fi φίλτρου</string>
+ <string name="pref_autodl_wifi_filter_sum">Να επιτρέπεται η αυτόματη λήψη μόνο στα επιλεγμένα δίκτυα Wi-Fi.</string>
+ <string name="pref_automatic_download_on_battery_title">Λήψη όταν δεν φορτίζει</string>
+ <string name="pref_automatic_download_on_battery_sum">Επιτρέψετε την αυτόματη λήψη όταν η μπαταρία δεν φορτίζει</string>
+ <string name="pref_theme_title_light">Φως</string>
+ <string name="pref_theme_title_dark">Σκοτάδι</string>
+ <string name="pref_episode_cache_unlimited">Απεριόριστα</string>
+ <string name="pref_update_interval_hours_plural">ώρες</string>
+ <string name="pref_update_interval_hours_singular">ώρα</string>
+ <string name="pref_update_interval_hours_manual">Εγχειρίδιο</string>
+ <string name="pref_gpodnet_authenticate_title">Σύνδεση</string>
+ <string name="pref_gpodnet_authenticate_sum">Σύνδεση με τον λογαριασμό σας στο gpodder.net σας για να συγχρονίσετε τις συνδρομές σας.</string>
+ <string name="pref_gpodnet_logout_title">Αποσύνδεση</string>
+ <string name="pref_gpodnet_logout_toast">Η Αποσύνδεση ήταν επιτυχής</string>
+ <string name="pref_gpodnet_setlogin_information_title">Αλλαγή στοιχείων σύνδεσης</string>
+ <string name="pref_gpodnet_setlogin_information_sum">Αλλαγή στοιχείων σύνδεσης για το λογαριασμό σας στο gpodder.net. </string>
+ <string name="pref_playback_speed_title">Ταχύτητα αναπαραγωγής</string>
+ <string name="pref_playback_speed_sum">Προσαρμόστε τις διαθέσιμες ταχύτητες για αναπαραγωγή ήχου μεταβλητής ταχύτητας</string>
+ <string name="pref_gpodnet_sethostname_title">Ορισμός κεντρικού υπολογιστή</string>
+ <string name="pref_gpodnet_sethostname_use_default_host">Χρήση προεπιλεγμένης υποδοχής</string>
+ <string name="pref_expandNotify_title">Ανάπτυξη κοινοποίησης</string>
+ <string name="pref_expandNotify_sum">Πάντα επέκταση της ειδοποίησης για εμφανιση κουμπιων αναπαραγωγής.</string>
+ <string name="pref_persistNotify_sum">Διατηρηση των ελέγχων κοινοποίησης και lockscreen όταν γίνεται παύση της αναπαραγωγής.</string>
+ <string name="pref_expand_notify_unsupport_toast">Εκδόσεις του Android πριν από το 4.1 δεν υποστηρίζουν εκτεταμένες κοινοποιήσεις.</string>
+ <string name="pref_queueAddToFront_sum">Προσθήκη νέων επεισοδίων στο μπροστινό μέρος της ουράς.</string>
+ <string name="pref_queueAddToFront_title">Τοποθέτηση στην Αρχή της Ουράς</string>
+ <string name="experimental_pref">Πειραματικό</string>
+ <!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">Ενεργοποίηση αυτόματου flattring</string>
+ <string name="auto_flattr_after_percent">Flattr επεισόδιο συντομότερο απο %d τοις εκατό έχει παιχτεί</string>
+ <string name="auto_flattr_ater_beginning">Flattr επεισόδιο όταν αρχίζει η αναπαραγωγή</string>
+ <string name="auto_flattr_ater_end">Flattr επεισόδιο όταν ολοκληρωθεί η αναπαραγωγή του</string>
+ <!--Search-->
+ <string name="search_hint">Αναζήτηση για Τροφοδοσίες ή Επεισόδια</string>
+ <string name="found_in_shownotes_label">Βρέθηκε στις σημειώσεις</string>
+ <string name="found_in_chapters_label">Βρέθηκε σε κεφάλαια</string>
+ <string name="search_status_no_results">Δεν βρέθηκαν αποτελέσματα</string>
+ <string name="search_label">Αναζήτηση</string>
+ <string name="found_in_title_label">Βρέθηκε στον τίτλο</string>
+ <!--OPML import and export-->
+ <string name="opml_import_txtv_button_lable">Τα OPML αρχεία σας επιτρέπουν να μετακινήσετε τα podcast από το ένα στο άλλο podcatcher.</string>
+ <string name="opml_import_explanation_1">Επιλέξτε μια συγκεκριμένη διαδρομή αρχείου από το τοπικό σύστημα αρχείων.</string>
+ <string name="opml_import_explanation_2">Χρησιμοποιήστε μια εξωτερική εφαρμογη όπως το Dropbox, το Google Drive ή τον αγαπημένο σας διαχειριστή αρχείων για να ανοίξετε ένα αρχείο OPML.</string>
+ <string name="opml_import_explanation_3">Πολλές από τις εφαρμογές όπως το Google Mail, Dropbox, το Google Drive και οι περισσότεροι διαχειριστές αρχείων μπορούν να &lt;i&gt; ανοικτό &lt;/ i&gt; Τα αρχεία OPML &lt;i&gt; με &lt;/ i&gt; AntennaPod.</string>
+ <string name="start_import_label">Εναρξη εισαγωγής</string>
+ <string name="opml_import_label">Εισαγωγή OPML</string>
+ <string name="opml_directory_error">ΣΦΑΛΜΑ!</string>
+ <string name="reading_opml_label">Ανάγνωση αρχείου OPML</string>
+ <string name="opml_reader_error">Παρουσιάστηκε σφάλμα κατά την ανάγνωση του εγγράφου OPML:</string>
+ <string name="opml_import_error_dir_empty">Ο κατάλογος εισαγωγής είναι άδειος.</string>
+ <string name="select_all_label">Επιλογή όλων</string>
+ <string name="deselect_all_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="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>
+ <string name="enter_time_here_label">Εισαγωγη χρονου</string>
+ <string name="sleep_timer_label">Χρονοδιακόπτης ύπνου</string>
+ <string name="time_left_label">Χρόνος που απομένει:\u0020</string>
+ <string name="time_dialog_invalid_input">Μη έγκυρη εισαγωγή, ο χρόνος πρέπει να είναι ακέραιος</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">ΚΟΡΥΦΑΙΑ PODCAST</string>
+ <string name="gpodnet_suggestions_header">ΠΡΟΤΑΣΕΙΣ</string>
+ <string name="gpodnet_search_hint">Αναζήτηση στο gpodder.net</string>
+ <string name="gpodnetauth_login_title">Σύνδεση</string>
+ <string name="gpodnetauth_login_descr">Καλώς ήρθατε στη διαδικασία σύνδεσης με το gpodder.net. Πρώτον, πληκτρολογήστε τα στοιχεία σύνδεσής σας:</string>
+ <string name="gpodnetauth_login_butLabel">Σύνδεση</string>
+ <string name="gpodnetauth_login_register">Εάν δεν έχετε ακόμα λογαριασμό, μπορείτε να δημιουργήσετε έναν εδώ:\nhttps://gpodder.net/register/</string>
+ <string name="username_label">Όνομα Χρήστη</string>
+ <string name="password_label">Κωδικός</string>
+ <string name="gpodnetauth_device_title">Επιλογή συσκευής</string>
+ <string name="gpodnetauth_device_descr">Δημιουργήστε μια νέα συσκευή που θα χρησιμοποιηθεί για λογαριασμό του gpodder.net ή επιλέξτε μια ήδη υπάρχουσα:</string>
+ <string name="gpodnetauth_device_deviceID">Αναγνωριστικό συσκευής:\u0020</string>
+ <string name="gpodnetauth_device_caption">Επικεφαλίδα</string>
+ <string name="gpodnetauth_device_butCreateNewDevice">Δημιουργία νέας συσκευής</string>
+ <string name="gpodnetauth_device_chooseExistingDevice">Επιλογή υπάρχουσας συσκευής:</string>
+ <string name="gpodnetauth_device_errorEmpty">Το Αναγνωριστικό συσκευής δεν πρέπει να είναι κενό</string>
+ <string name="gpodnetauth_device_errorAlreadyUsed">Το Αναγνωριστικό συσκευής ειναι ήδη σε χρήση</string>
+ <string name="gpodnetauth_device_butChoose">Επιλογή</string>
+ <string name="gpodnetauth_finish_title">Είσοδος επιτυχής!</string>
+ <string name="gpodnetauth_finish_descr">Συγχαρητήρια! Ο Λογαριασμός σας στο gpodder.net συνδέεται πλέον με τη συσκευή σας. Το AntennaPod θα συγχρονίζει αυτόματα τις συνδρομές στην συσκευή σας με το λογαριασμό σας στο gpodder.net.</string>
+ <string name="gpodnetauth_finish_butsyncnow">Έναρξη συγχρονισμού τώρα</string>
+ <string name="gpodnetauth_finish_butgomainscreen">Μετάβαση στην κύρια οθόνη</string>
+ <string name="gpodnetsync_auth_error_title">gpodder.net σφάλμα ελέγχου ταυτότητας</string>
+ <string name="gpodnetsync_auth_error_descr">Λάθος όνομα χρήστη ή κωδικός πρόσβασης</string>
+ <string name="gpodnetsync_error_title">gpodder.net σφάλμα συγχρονισμού</string>
+ <string name="gpodnetsync_error_descr">Παρουσιάστηκε σφάλμα κατά το συγχρονισμό:\u0020</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Επιλεγμένος φάκελος:</string>
+ <string name="create_folder_label">Δημιουργία φακέλου</string>
+ <string name="create_folder_msg">Δημιουργία νέου φακέλου με το όνομα \"%1$s\";</string>
+ <string name="create_folder_success">Δημιουργήθηκε ο νέος φάκελος</string>
+ <string name="create_folder_error_no_write_access">Δεν είναι δυνατή η εγγραφή σε αυτόν το φάκελο</string>
+ <string name="create_folder_error_already_exists">Ο φάκελος ήδη υπάρχει</string>
+ <string name="create_folder_error">Δεν ήταν δυνατή η δημιουργία φακέλου</string>
+ <string name="folder_not_empty_dialog_title">Ο φάκελος δεν είναι άδειος</string>
+ <string name="folder_not_empty_dialog_msg">Ο φάκελος που επιλέξατε δεν είναι άδειος. Λήψεις πολυμεσων και άλλων αρχείων, θα τοποθετουνται απευθείας σε αυτό τον φάκελο. Θέλετε να συνεχίσετε;</string>
+ <string name="set_to_default_folder">Επιλογή προεπιλεγμένου φακέλου</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">Παύση της αναπαραγωγής, αντί της μείωσης έντασης όταν μια άλλη εφαρμογή θέλει να αναπαράξει ήχους</string>
+ <string name="pref_pausePlaybackForFocusLoss_title">Παύση για διακοπές</string>
+ <string name="pref_resumeAfterCall_sum">Συνέχιση της αναπαραγωγής, μετά το πέρας τηλεφωνικής κλήσης</string>
+ <string name="pref_resumeAfterCall_title">Συνέχιση της αναπαραγωγής, μετά από Κλήση</string>
+ <string name="pref_restart_required">Το AntennaPod χρειάζεται επανεκκίνηση για την εφαρμογή των αλλαγών.</string>
+ <!--Online feed view-->
+ <string name="subscribe_label">Εγγραφή</string>
+ <string name="subscribed_label">Εγγεγραμμένα</string>
+ <!--Content descriptions for image buttons-->
+ <string name="show_chapters_label">Εμφάνιση κεφαλαίων</string>
+ <string name="show_shownotes_label">Εμφάνιση σημειώσεων </string>
+ <string name="show_cover_label">Εμφάνιση εικόνας</string>
+ <string name="rewind_label">Κίνηση εμπρός</string>
+ <string name="fast_forward_label">Γρήγορη κίνηση εμπρός</string>
+ <string name="media_type_audio_label">Ήχος</string>
+ <string name="media_type_video_label">Βίντεο</string>
+ <string name="navigate_upwards_label">Πλοήγηση προς τα πάνω</string>
+ <string name="butAction_label">Περισσότερες ενέργειες</string>
+ <string name="status_playing_label">Το επεισόδιο αναπαράγεται</string>
+ <string name="status_downloading_label">Το επεισόδιο γίνεται λήφθετε</string>
+ <string name="status_downloaded_label">Το επεισόδιο εχει ληφθει</string>
+ <string name="status_unread_label">Το Στοιχείο είναι νέο</string>
+ <string name="in_queue_label">Το επεισόδιο είναι στη σειρά αναμονής</string>
+ <string name="new_episodes_count_label">Αριθμός νέων επεισοδίων</string>
+ <string name="in_progress_episodes_count_label">Αριθμός επεισοδίων που έχετε αρχίσει να ακούτε</string>
+ <string name="drag_handle_content_description">Σύρετε για να αλλάξετε τη θέση αυτού του στοιχείου</string>
+ <string name="load_next_page_label">Τοποθέτηση επόμενης σελίδας</string>
+ <!--Feed information screen-->
+ <string name="authentication_label">Πιστοποίηση</string>
+ <string name="authentication_descr">Αλλαγή του όνοματος χρήστη και του κωδικόυ πρόσβασής για αυτό το podcast και τα επεισόδια του.</string>
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <string name="sp_apps_importing_feeds_msg">Εισαγωγή εγγραφών από εφαρμογές και μονο...</string>
+ <string name="search_itunes_label">iTunes Αναζήτηση</string>
+ <string name="all_label">Όλα</string>
+ <string name="downloaded_label">Ειλημμένα</string>
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-es/strings.xml b/core/src/main/res/values-es/strings.xml
index a2abd5d85..bee1d5903 100644
--- a/core/src/main/res/values-es/strings.xml
+++ b/core/src/main/res/values-es/strings.xml
@@ -23,6 +23,8 @@
<string name="gpodnet_main_label">gpodder.net</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>
<!--New episodes fragment-->
<string name="recently_published_episodes_label">Publicados recientemente</string>
<string name="episode_filter_label">Mostrar solo episodios nuevos</string>
@@ -251,6 +253,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Descargar complemento</string>
<string name="no_playback_plugin_title">Complemento no instalado</string>
+ <string name="no_playback_plugin_or_sonic_msg">Para que funciona la velocidad de reproducción variable, recomendamos habilitar el reproductor Sonic Media [Android 4.1+].\n\nPor otro lado, puedes descargar el plugin de terceros <i>Prestissimo</i> de la Play Store.\nCualquier problema con Prestissimo no es reponsabilidad de AntennaPod y no debería ser reportado al propietario del plugin.</string>
<string name="set_playback_speed_label">Velocidades de reproducción</string>
<string name="enable_sonic">Activar Sonic</string>
<!--Empty list labels-->
@@ -361,6 +364,7 @@
<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_current_value">Valor actual: %1$s</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Habilitar Flattr automático</string>
@@ -396,6 +400,7 @@
<string name="export_error_label">Error en la exportación</string>
<string name="opml_export_success_title">Exportación a OPML exitosa</string>
<string name="opml_export_success_sum">El archivo OPML se ha escrito en:\u0020</string>
+ <string name="opml_import_ask_read_permission">Es necesario el acceso al almacenamiento externo para leer archivos OPML</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Establecer un temporizador</string>
<string name="disable_sleeptimer_label">Desactivar el temporizador</string>
@@ -454,6 +459,7 @@
<string name="create_folder_label">Crear carpeta</string>
<string name="choose_data_directory">Elegir carpeta de datos</string>
<string name="choose_data_directory_message">Por favor elige la raíz de la carpeta de datos. AntennaPod creará los subdirectorios apropiados.</string>
+ <string name="choose_data_directory_permission_rationale">Se necesita acceso a almacenamiento externo para cambiar la carpeta de datos</string>
<string name="create_folder_msg">¿Crear carpeta con nombre «%1$s»?</string>
<string name="create_folder_success">Carpeta creada</string>
<string name="create_folder_error_no_write_access">No se puede escribir a esta carpeta</string>
@@ -496,6 +502,13 @@
<!--Feed information screen-->
<string name="authentication_label">Autenticación</string>
<string name="authentication_descr">Cambiar nombre y contraseña de este podcast y sus episodios</string>
+ <string name="auto_download_settings_label">Opciones de Auto Descarga</string>
+ <string name="episode_filters_label">Filtro de Episodios</string>
+ <string name="episode_filters_description">Listado de términos para decidir si un episodio debe ser incluído o excluído al auto descargar</string>
+ <string name="episode_filters_include">Incluir</string>
+ <string name="episode_filters_exclude">Excluir</string>
+ <string name="episode_filters_hint">Palabras sueltas \n\"Múltiples palabras\"</string>
+ <string name="keep_updated">Mantener actualizado</string>
<!--Progress information-->
<string name="progress_upgrading_database">Actualizando la base de datos</string>
<!--AntennaPodSP-->
@@ -515,6 +528,10 @@
<string name="selected_downloaded_label">Seleccionados episodios descargados</string>
<string name="not_downloaded_label">No descargado</string>
<string name="selected_not_downloaded_label">Seleccionados episodios no descargados</string>
+ <string name="queued_label">En cola</string>
+ <string name="selected_queued_label">Seleccionados episodios en cola</string>
+ <string name="not_queued_label">No en cola</string>
+ <string name="selected_not_queued_label">Seleccionados episodios no en cola</string>
<string name="sort_title"><b>Ordenar por…</b></string>
<string name="sort_title_a_z">Título (A \u2192 Z)</string>
<string name="sort_title_z_a">Título (Z \u2192 A)</string>
@@ -535,4 +552,6 @@
<string name="left_short">I</string>
<string name="right_short">D</string>
<string name="audio_effects">Efectos de audio</string>
+ <string name="stereo_to_mono">Downmix: De estereo a mono</string>
+ <string name="sonic_only">Sólo Sonic</string>
</resources>
diff --git a/core/src/main/res/values-fi/strings.xml b/core/src/main/res/values-fi/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-fi/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index 38eef41df..239946097 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -400,6 +400,7 @@
<string name="export_error_label">Erreur d\'exportation</string>
<string name="opml_export_success_title">Exportation OPML réussie.</string>
<string name="opml_export_success_sum">Le fichier .opml a été écrit ici :\u0020</string>
+ <string name="opml_import_ask_read_permission">L\'accès aux stockages externes est requis pour lire le fichier OPML</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Définir le minuteur d\'arrêt automatique</string>
<string name="disable_sleeptimer_label">Désactiver le minuteur d\'arrêt automatique</string>
@@ -500,6 +501,13 @@
<!--Feed information screen-->
<string name="authentication_label">Authentification</string>
<string name="authentication_descr">Modifier votre identifiant et mot de passe pour ce podcast et tous ses épisodes</string>
+ <string name="auto_download_settings_label">Préférence de téléchargement automatique</string>
+ <string name="episode_filters_label">Filtre d\'épisode</string>
+ <string name="episode_filters_description">Liste de mots décidant si un épisode est à inclure ou exclure des téléchargements automatiques</string>
+ <string name="episode_filters_include">Inclure</string>
+ <string name="episode_filters_exclude">Exclure</string>
+ <string name="episode_filters_hint">Mots uniques \n\"Liste de mots\"</string>
+ <string name="keep_updated">Mettre à jour</string>
<!--Progress information-->
<string name="progress_upgrading_database">Mise à jour de la base de données</string>
<!--AntennaPodSP-->
@@ -519,6 +527,10 @@
<string name="selected_downloaded_label">Episodes téléchargés sélectionnés</string>
<string name="not_downloaded_label">Non téléchargés</string>
<string name="selected_not_downloaded_label">Épisodes non téléchargés sélectionnés</string>
+ <string name="queued_label">Dans liste de lecture</string>
+ <string name="selected_queued_label">Episodes présents dans la liste de lecture sélectionnés</string>
+ <string name="not_queued_label">Hors liste de lecture</string>
+ <string name="selected_not_queued_label">Episodes absents de la liste de lecture sélectionnés</string>
<string name="sort_title"><b>Trier par...</b></string>
<string name="sort_title_a_z">Titre (A \u2192 Z)</string>
<string name="sort_title_z_a">Titre (Z \u2192 A)</string>
diff --git a/core/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-hu/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-id/strings.xml b/core/src/main/res/values-id/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-id/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml
new file mode 100644
index 000000000..84f60ab38
--- /dev/null
+++ b/core/src/main/res/values-it/strings.xml
@@ -0,0 +1,290 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="feeds_label">Feed</string>
+ <string name="add_feed_label">Aggiungi un podcast</string>
+ <string name="podcasts_label">PODCAST</string>
+ <string name="episodes_label">Episodi</string>
+ <string name="new_episodes_label">Episodi nuovi</string>
+ <string name="all_episodes_label">Tutti gli episodi</string>
+ <string name="all_episodes_short_label">Tutto</string>
+ <string name="favorite_episodes_label">Preferiti</string>
+ <string name="new_label">Nuovo</string>
+ <string name="waiting_list_label">Lista d\'attesa</string>
+ <string name="settings_label">Impostazioni</string>
+ <string name="add_new_feed_label">Aggiungi un podcast</string>
+ <string name="downloads_label">Download</string>
+ <string name="downloads_running_label">In corso</string>
+ <string name="downloads_completed_label">Completati</string>
+ <string name="downloads_log_label">Registro</string>
+ <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_auth_label">Accesso a gpodder.net</string>
+ <!--New episodes fragment-->
+ <string name="recently_published_episodes_label">Pubblicati di recente</string>
+ <!--Main activity-->
+ <string name="drawer_open">Apri il menù</string>
+ <string name="drawer_close">Chiudi il menù</string>
+ <string name="drawer_feed_order_alphabetical">Ordina alfabeticamente</string>
+ <string name="drawer_feed_order_last_update">Ordina secondo la data di pubblicazione</string>
+ <string name="drawer_feed_counter_new">Numero di episodi nuovi</string>
+ <string name="drawer_feed_counter_unplayed">Numero di episodi non riprodotti</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">Apri nel browser</string>
+ <string name="copy_url_label">Copia l\'URL</string>
+ <string name="share_url_label">Condividi l\'URL</string>
+ <!--Playback history-->
+ <!--Other-->
+ <string name="confirm_label">Conferma</string>
+ <string name="cancel_label">Annulla</string>
+ <string name="yes">Sì</string>
+ <string name="no">No</string>
+ <string name="author_label">Autore</string>
+ <string name="language_label">Lingua</string>
+ <string name="url_label">URL</string>
+ <string name="podcast_settings_label">Impostazioni</string>
+ <string name="cover_label">Immagine</string>
+ <string name="error_label">Errore</string>
+ <string name="error_msg_prefix">È avvenuto un errore:</string>
+ <string name="refresh_label">Ricarica</string>
+ <string name="chapters_label">Capitoli</string>
+ <string name="description_label">Descrizione</string>
+ <string name="episodes_suffix">\u0020episodi</string>
+ <string name="length_prefix">Lunghezza:\u0020</string>
+ <string name="size_prefix">Dimensione:\u0020</string>
+ <string name="processing_label">Processando</string>
+ <string name="save_username_password_label">Salva il nome utente e la password</string>
+ <string name="close_label">Chiudi</string>
+ <string name="retry_label">Riprova</string>
+ <string name="auto_download_label">Includi nei download automatici</string>
+ <string name="auto_download_apply_to_items_title">Applica agli episodi precedenti</string>
+ <string name="parallel_downloads_suffix">\u0020download paralleli</string>
+ <string name="feed_auto_download_global">Globale</string>
+ <string name="feed_auto_download_always">Sempre</string>
+ <string name="feed_auto_download_never">Mai</string>
+ <string name="episode_cleanup_never">Mai</string>
+ <string name="episode_cleanup_after_listening">Dopo il completamento</string>
+ <plurals name="episode_cleanup_days_after_listening">
+ <item quantity="one">1 giorno dopo il completamento</item>
+ <item quantity="other">%d giorni dopo il completamento</item>
+ </plurals>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">URL del feed</string>
+ <string name="etxtFeedurlHint">www.example.com/feed</string>
+ <string name="txtvfeedurl_label">Aggiungi un podcast inserendo un URL</string>
+ <string name="podcastdirectories_descr">Puoi cercare nuovi podcast per nome, categoria o popolarità su gpodder.net, oppure sull\'iTunes store.</string>
+ <string name="browse_gpoddernet_label">Esplora gpodder.net</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Segna tutti come riprodotti</string>
+ <string name="mark_all_read_confirmation_msg">Conferma che desideri segnare tutti gli episodi come riprodotti.</string>
+ <string name="mark_all_read_feed_confirmation_msg">Conferma che desideri segnare tutti gli episodi in questo feed come riprodotti.</string>
+ <string name="show_info_label">Mostra delle informazioni</string>
+ <string name="feed_delete_confirmation_msg">Conferma che desideri cancellare questo feed e TUTTI gli episodi di questo feed che hai scaricato.</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">Riprodotto</string>
+ <string name="hide_queued_episodes_label">In coda</string>
+ <string name="hide_not_queued_episodes_label">Non in coda</string>
+ <string name="hide_downloaded_episodes_label">Scaricato</string>
+ <string name="hide_not_downloaded_episodes_label">Non scaricato</string>
+ <string name="filtered_label">Filtrato</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Scarica</string>
+ <string name="play_label">Riproduci</string>
+ <string name="pause_label">Metti in pausa</string>
+ <string name="stop_label">Interrompi</string>
+ <string name="stream_label">Stream</string>
+ <string name="remove_label">Rimuovi</string>
+ <string name="mark_read_label">Segna come riprodotto</string>
+ <string name="marked_as_read_label">Segnato come riprodotto</string>
+ <string name="mark_unread_label">Segna come non riprodotto</string>
+ <string name="add_to_queue_label">Aggiungi alla coda</string>
+ <string name="added_to_queue_label">Aggiunto alla Coda</string>
+ <string name="remove_from_queue_label">Rimuovi dalla coda</string>
+ <string name="visit_website_label">Visita il sito web</string>
+ <string name="enqueue_all_new">Metti tutti in coda</string>
+ <string name="download_all">Scarica tutti</string>
+ <string name="skip_episode_label">Salta l\'episodio</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">successo</string>
+ <string name="download_failed">fallito</string>
+ <string name="download_pending">Download in attesa</string>
+ <string name="download_running">Download in corso</string>
+ <string name="download_error_http_data_error">Errore dei dati HTTP</string>
+ <string name="download_error_error_unknown">Errore sconosciuto</string>
+ <string name="cancel_all_downloads_label">Annulla tutti i download</string>
+ <string name="download_canceled_msg">Download annullato</string>
+ <string name="download_canceled_autodownload_enabled_msg">Download annullato\nDisabilitato <i>Download Automatico</i> per questo elemento</string>
+ <string name="download_error_malformed_url">URL malformato</string>
+ <string name="download_error_io_error">Errore IO</string>
+ <string name="download_notification_title">Download dei dati del podcast in corso</string>
+ <string name="download_report_content">%1$d download hanno avuto successo, %2$d hanno fallito</string>
+ <string name="download_type_feed">Feed</string>
+ <string name="download_type_media">File multimediale</string>
+ <string name="download_type_image">Immagine</string>
+ <string name="download_request_error_dialog_message_prefix">Si è verificato un errore nello scaricare il file:\u0020</string>
+ <string name="authentication_notification_title">Autenticazione richiesta</string>
+ <string name="authentication_notification_msg">La risorsa che hai richiesto richiede un nome utente e una password</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Errore!</string>
+ <string name="player_stopped_msg">Nessun elemento multimediale in riproduzione</string>
+ <string name="player_preparing_msg">Preparazione in corso</string>
+ <string name="player_ready_msg">Pronto</string>
+ <string name="player_seeking_msg">Ricerca in corso</string>
+ <string name="playback_error_server_died">Server morto</string>
+ <string name="playback_error_unknown">Errore sconosciuto</string>
+ <string name="no_media_playing_label">Nessun elemento multimediale in riproduzione</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">Buffer in corso</string>
+ <string name="playbackservice_notification_title">Riproduzione del podcast in corso</string>
+ <!--Queue operations-->
+ <string name="undo">Annulla</string>
+ <string name="removed_from_queue">Oggetto rimosso</string>
+ <string name="move_to_top_label">Sposta in cima</string>
+ <string name="move_to_bottom_label">Sposta in fondo</string>
+ <string name="sort">Ordina</string>
+ <string name="alpha">In ordine alfabetico</string>
+ <string name="date">Data</string>
+ <string name="duration">Durata</string>
+ <string name="ascending">Ascendente</string>
+ <string name="descending">Discendente</string>
+ <!--Flattr-->
+ <string name="flattr_auth_label">Accesso a Flattr</string>
+ <string name="authenticate_label">Autentica</string>
+ <string name="return_home_label">Ritorna alla pagina iniziale</string>
+ <string name="no_flattr_token_notification_msg">Il tuo account flattr non sembra connesso ad AntennaPod. Clicca qui per accedere.</string>
+ <string name="authenticate_now_label">Autentica</string>
+ <string name="action_forbidden_title">Azione proibita</string>
+ <string name="access_revoked_title">Accesso revocato</string>
+ <!--Flattr-->
+ <!--Variable Speed-->
+ <string name="download_plugin_label">Scarica plugin</string>
+ <string name="no_playback_plugin_title">Plugin non installato</string>
+ <string name="set_playback_speed_label">Velocità di riproduzione</string>
+ <!--Empty list labels-->
+ <string name="no_items_label">Non ci sono oggetti in questo elenco.</string>
+ <string name="no_feeds_label">Non sei ancora iscritto a nessun feed.</string>
+ <!--Preferences-->
+ <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_unpauseOnHeadsetReconnect_sum">Riprendi la riproduzione quando le cuffie vengono ricollegate</string>
+ <string name="pref_followQueue_sum">Salta all\'elemento successivo della lista al termine della riproduzione</string>
+ <string name="pref_auto_delete_sum">Elimina l\'episodio al termine della riproduzione</string>
+ <string name="pref_auto_delete_title">Eliminazione Automatica</string>
+ <string name="playback_pref">Riproduzione</string>
+ <string name="network_pref">Rete</string>
+ <string name="pref_mobileUpdate_sum">Permetti gli aggiornamenti su rete dati</string>
+ <string name="refreshing_label">Ricaricamento</string>
+ <string name="pref_flattr_auth_title">Accesso a Flattr</string>
+ <string name="pref_revokeAccess_title">Revoca l\'accesso</string>
+ <string name="user_interface_label">Interfaccia utente</string>
+ <string name="pref_set_theme_sum">Cambia l\'aspetto di AntennaPod</string>
+ <string name="pref_autodl_wifi_filter_title">Abilita il filtro Wi-Fi</string>
+ <string name="pref_automatic_download_on_battery_sum">Scarica automaticamente quando la batteria non è in caricamento</string>
+ <string name="pref_theme_title_light">Chiaro</string>
+ <string name="pref_theme_title_dark">Scuro</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>
+ <string name="pref_update_interval_hours_manual">Manuale</string>
+ <string name="pref_gpodnet_authenticate_title">Accesso</string>
+ <string name="pref_gpodnet_logout_title">Esci</string>
+ <string name="pref_gpodnet_setlogin_information_title">Cambia le informazioni di accesso</string>
+ <string name="pref_playback_speed_title">Velocità di riproduzione</string>
+ <string name="pref_gpodnet_sethostname_title">Imposta il nome dell\'host</string>
+ <string name="pref_gpodnet_sethostname_use_default_host">Utilizza l\'host predefinito</string>
+ <string name="pref_expandNotify_title">Espandi le notifiche</string>
+ <string name="pref_queueAddToFront_sum">Aggiungi un nuovo episodio in testa alla coda.</string>
+ <string name="pref_smart_mark_as_played_disabled">Disabilitato</string>
+ <!--Auto-Flattr dialog-->
+ <!--Search-->
+ <string name="search_hint">Cerca dei feed o degli episodi</string>
+ <string name="found_in_chapters_label">Trovato nei capitoli</string>
+ <string name="search_status_no_results">Nessun risultato trovato</string>
+ <string name="search_label">Cerca</string>
+ <string name="found_in_title_label">Trovato nel titolo</string>
+ <!--OPML import and export-->
+ <string name="start_import_label">Avvia l\'importazione</string>
+ <string name="opml_directory_error">ERRORE!</string>
+ <string name="opml_import_error_dir_empty">La directory dell\'importazione è vuota.</string>
+ <string name="select_all_label">Seleziona tutto</string>
+ <string name="deselect_all_label">Deseleziona tutto</string>
+ <string name="choose_file_from_external_application">Usa un\'applicazione esterna</string>
+ <string name="opml_export_label">Esportazione OPML</string>
+ <string name="export_error_label">Errore di esportazione</string>
+ <!--Sleep timer-->
+ <string name="set_sleeptimer_label">Imposta timer per lo spegnimento</string>
+ <string name="disable_sleeptimer_label">Disabilta timer per lo spegnimento</string>
+ <string name="sleep_timer_label">Timer per lo spegnimento</string>
+ <string name="time_left_label">Tempo rimasto:\u0020</string>
+ <string name="time_dialog_invalid_input">Input non valido, il tempo deve essere un numero intero</string>
+ <!--gpodder.net-->
+ <string name="gpodnet_taglist_header">CATEGORIE</string>
+ <string name="gpodnet_toplist_header">PODCAST PIÙ POPOLARI</string>
+ <string name="gpodnet_suggestions_header">SUGGERIMENTI</string>
+ <string name="gpodnet_search_hint">Cerca su gpodder.net</string>
+ <string name="gpodnetauth_login_title">Accesso</string>
+ <string name="gpodnetauth_login_descr">Benvenuto nella procedura di accesso a gpodder.net. Per prima cosa, inserisci i tuoi dati di accesso:</string>
+ <string name="gpodnetauth_login_butLabel">Accesso</string>
+ <string name="gpodnetauth_login_register">Se non hai ancora un account , puoi crearne uno su:\nhttps://gpodder.net/register/</string>
+ <string name="username_label">Nome utente</string>
+ <string name="password_label">Password</string>
+ <string name="gpodnetauth_device_title">Selezione del dispositivo</string>
+ <string name="gpodnetauth_device_deviceID">ID del dispositivo:\u0020</string>
+ <string name="gpodnetauth_device_butCreateNewDevice">Crea un nuovo dispositivo</string>
+ <string name="gpodnetauth_device_chooseExistingDevice">Scegli un dispositivo esistente:</string>
+ <string name="gpodnetauth_device_errorEmpty">L\'ID del dispositivo non può essere vuoto</string>
+ <string name="gpodnetauth_device_errorAlreadyUsed">ID del dispositivo già in uso</string>
+ <string name="gpodnetauth_device_butChoose">Scegli</string>
+ <string name="gpodnetauth_finish_title">Accesso avvenuto con successo!</string>
+ <string name="gpodnetauth_finish_butsyncnow">Avvia ora la sincronizzazione</string>
+ <string name="gpodnetauth_finish_butgomainscreen">Vai alla schermata principale</string>
+ <string name="gpodnetsync_auth_error_title">errore di autenticazione di gpodder.net</string>
+ <string name="gpodnetsync_auth_error_descr">Nome utente o password errati</string>
+ <string name="gpodnetsync_error_title">errore di sincronizzazione di gpodder.net</string>
+ <string name="gpodnetsync_error_descr">È avvenuto un errore durante la sincronizzazione:\u0020</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Cartella selezionata:</string>
+ <string name="create_folder_label">Crea una cartella</string>
+ <string name="create_folder_msg">Creare una nuova cartella dal nome \"%1$s\"?</string>
+ <string name="create_folder_success">Creata una nuova cartella</string>
+ <string name="create_folder_error_no_write_access">Non è possibile scrivere in questa cartella</string>
+ <string name="create_folder_error_already_exists">La cartella esiste già</string>
+ <string name="create_folder_error">Non è stato possibile creare la cartella</string>
+ <string name="folder_not_empty_dialog_title">La cartella non è vuota</string>
+ <string name="set_to_default_folder">Scegli la cartella predefinita</string>
+ <!--Online feed view-->
+ <string name="subscribe_label">Abbonati</string>
+ <string name="subscribed_label">Abbonato</string>
+ <!--Content descriptions for image buttons-->
+ <string name="show_chapters_label">Mostra i capitoli</string>
+ <string name="show_cover_label">Mostra l\'immagine</string>
+ <string name="rewind_label">Riavvolgi</string>
+ <string name="fast_forward_label">Avanti veloce</string>
+ <string name="media_type_audio_label">Audio</string>
+ <string name="media_type_video_label">Video</string>
+ <string name="butAction_label">Altre azioni</string>
+ <string name="status_playing_label">L\'episodio sta venendo riprodotto</string>
+ <string name="status_downloading_label">L\'episodio sta venendo scaricato</string>
+ <string name="status_downloaded_label">L\'episodio è stato scaricato</string>
+ <string name="status_unread_label">L\'oggetto è nuovo</string>
+ <string name="in_queue_label">L\'episodio è in coda</string>
+ <string name="new_episodes_count_label">Numero di episodi nuovi</string>
+ <string name="in_progress_episodes_count_label">Numero di episodi che hai iniziato ad ascoltare</string>
+ <string name="load_next_page_label">Carica la pagina successiva</string>
+ <!--Feed information screen-->
+ <string name="authentication_label">Autenticazione</string>
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <string name="search_itunes_label">Cerca su iTunes</string>
+ <string name="all_label">Tutto</string>
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-ja/strings.xml b/core/src/main/res/values-ja/strings.xml
index 3e3b5b97f..836af9fc0 100644
--- a/core/src/main/res/values-ja/strings.xml
+++ b/core/src/main/res/values-ja/strings.xml
@@ -398,6 +398,7 @@
<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>
<string name="disable_sleeptimer_label">スリープタイマーを無効にする</string>
@@ -453,6 +454,7 @@
<string name="create_folder_label">フォルダーを作成</string>
<string name="choose_data_directory">データ フォルダーを選択</string>
<string name="choose_data_directory_message">基本のデータフォルダーを選択してください。 AntennaPodは、適切なサブディレクトリを作成します。</string>
+ <string name="choose_data_directory_permission_rationale">データフォルダーを変更するために外部ストレージのアクセスが必要です</string>
<string name="create_folder_msg">名前 \"%1$s\" で新しいフォルダーを作成しますか?</string>
<string name="create_folder_success">新しいフォルダーを作成しました</string>
<string name="create_folder_error_no_write_access">このフォルダーに書き込みできません</string>
@@ -495,6 +497,13 @@
<!--Feed information screen-->
<string name="authentication_label">認証</string>
<string name="authentication_descr">このポッドキャストとそのエピソード用のあなたのユーザー名とパスワードを変更します。</string>
+ <string name="auto_download_settings_label">自動ダウンロード設定</string>
+ <string name="episode_filters_label">エピソード フィルター</string>
+ <string name="episode_filters_description">自動ダウンロードのときに、エピソードを含めるか除外する必要があるかを決定するために使用される条件のリスト</string>
+ <string name="episode_filters_include">含む</string>
+ <string name="episode_filters_exclude">含まない</string>
+ <string name="episode_filters_hint">単一の単語 \n\"複数の 単語\"</string>
+ <string name="keep_updated">更新済を保持</string>
<!--Progress information-->
<string name="progress_upgrading_database">データベースをアップグレードしています</string>
<!--AntennaPodSP-->
@@ -514,6 +523,10 @@
<string name="selected_downloaded_label">ダウンロード済のエピソードを選択しました</string>
<string name="not_downloaded_label">ダウンロードしていません</string>
<string name="selected_not_downloaded_label">ダウンロードしていないエピソードを選択しました</string>
+ <string name="queued_label">キューに入れました</string>
+ <string name="selected_queued_label">キューに入ったエピソードを選択しました</string>
+ <string name="not_queued_label">キューに入っていません</string>
+ <string name="selected_not_queued_label">キューに入っていないエピソードを選択しました</string>
<string name="sort_title"><b>並び替え…</b></string>
<string name="sort_title_a_z">タイトル (A \u2192 Z)</string>
<string name="sort_title_z_a">タイトル (Z \u2192 A)</string>
diff --git a/core/src/main/res/values-kn-rIN/strings.xml b/core/src/main/res/values-kn-rIN/strings.xml
new file mode 100644
index 000000000..c95dfba8d
--- /dev/null
+++ b/core/src/main/res/values-kn-rIN/strings.xml
@@ -0,0 +1,103 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="app_name">ಆಂಟೆನಾಪಾಡ್</string>
+ <string name="feeds_label">ಫೀಡ್ಗಳು</string>
+ <string name="new_label">ಹೊಸ</string>
+ <string name="settings_label">ಸೆಟ್ಟಿಂಗ್ಗಳು</string>
+ <string name="downloads_label">ಇಳಿಕೆಗಳು</string>
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <string name="confirm_label">ದೃಢೀಕರಿಸಿ</string>
+ <string name="cancel_label">ರದ್ದುಗೊಳಿಸು</string>
+ <string name="author_label">ಲೇಖಕ</string>
+ <string name="language_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="shownotes_label">ಟಿಪ್ಪಣಿಗಳು </string>
+ <string name="episodes_suffix">\u0020ಕಂತುಗಳು</string>
+ <string name="length_prefix">ಉದ್ದ:\u0020</string>
+ <string name="size_prefix">ಗಾತ್ರ:\u0020</string>
+ <string name="processing_label">ಸಂಸ್ಕರಣೆ</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">ಫೀಡ್ ಯು.ಆರ್.ಎಲ್</string>
+ <!--Actions on feeds-->
+ <string name="show_info_label">ಮಾಹಿತಿ ತೋರಿಸು</string>
+ <string name="feed_delete_confirmation_msg">ನೀವು ಈ ಫೀಡ್ ಮತ್ತು ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಈ ಫೀಡ್ನ ಎಲ್ಲಾ ಕಂತುಗಳು ಅಳಿಸಲು ಬಯಸುತ್ತೀರಿ ಎಂಬುದನ್ನು ದಯವಿಟ್ಟು ದೃಢಪಡಿಸಿ.</string>
+ <!--actions on feeditems-->
+ <string name="download_label">ಡೌನ್ಲೋಡ್</string>
+ <string name="play_label">ಚಾಲನೆಗೊಳಿಸು</string>
+ <string name="stream_label">ಹೊಳೆ</string>
+ <string name="remove_label">ತೆಗೆದುಹಾಕಿ</string>
+ <string name="add_to_queue_label">ಸರದಿಗೆ ಸೇರಿಸಿ</string>
+ <string name="remove_from_queue_label">ಸರದಿಯಿಂದ ತೆಗೆದುಹಾಕಿ</string>
+ <string name="visit_website_label">ಜಾಲತಾಣವನ್ನು ಭೇಟಿಮಾಡಿ</string>
+ <string name="support_label">ಫ್ಲಾಟರ್ ಮಾಡಿ</string>
+ <!--Download messages and labels-->
+ <string name="download_pending">ಡೌನ್ಲೋಡ್ ಬಾಕಿ ಉಳಿದಿದೆ</string>
+ <string name="download_running">ಚಾಲನೆಯಲ್ಲಿರುವ ಡೌನ್ಲೋಡ್</string>
+ <string name="download_error_http_data_error">ಎಚ್ಟಿಟಿಪಿ ಮಾಹಿತಿ ದೋಷ</string>
+ <string name="download_error_error_unknown">ತಿಳಿಯದ ದೋಷ</string>
+ <string name="download_error_parser_exception">ಪಾರ್ಸರ್ ಎಕ್ಸೆಪ್ಶನ್</string>
+ <string name="cancel_all_downloads_label">ಎಲ್ಲಾ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ರದ್ದು ಮಾಡು</string>
+ <string name="download_error_malformed_url">ದೋಷಪೂರಿತ ಯು.ಆರ್.ಎಲ್</string>
+ <string name="download_error_io_error">ಐಓ ದೋಷ</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">ದೋಷ!</string>
+ <string name="player_stopped_msg">ಯಾವುದೇ ಮಾಧ್ಯಮ ಓಡುತ್ತಿಲ್ಲ</string>
+ <string name="player_preparing_msg">ಸಿದ್ಧತೆ</string>
+ <string name="player_ready_msg">ಸಿದ್ಧ</string>
+ <string name="player_seeking_msg">ಅರಸುತ್ತಿರುವ</string>
+ <string name="playback_error_server_died">ಸರ್ವರ್ ಸತ್ತಿದೆ</string>
+ <string name="playback_error_unknown">ತಿಳಿಯದ ದೋಷ</string>
+ <string name="no_media_playing_label">ಯಾವುದೇ ಮಾಧ್ಯಮ ಓಡುತ್ತಿಲ್ಲ</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">ತುಣಿಗಲೆಯಾಗುತ್ತಿದೆ</string>
+ <!--Queue operations-->
+ <!--Flattr-->
+ <string name="flattr_auth_label">ಫ್ಳಟರ್ ಪ್ರವೇಶ</string>
+ <string name="flattr_auth_explanation">ದೃಢೀಕರಣ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಆರಂಭಿಸಲು ಕೆಳಗಿನ ಬಟನ್ ಒತ್ತಿರಿ. ನಿಮ್ಮ ಬ್ರೌಸರ್ನಲ್ಲಿ ನೀವು ಫ್ಳಟರ್ ಪ್ರವೇಶ ತೆರೆಗೆ ರವಾನಿಸಲ್ಪಡುತ್ತೀರಿ ಮತ್ತು ಆಂಟೆನಾ-ಪಾಡ್ ವಿಷಯಗಳನ್ನು ಫ್ಳಟರ್ ಮಾಡಲು ಅನುಮತಿ ನೀಡಲು ಕೇಳಲಾಗುತ್ತದೆ. ನೀವು ಅನುಮತಿ ನೀಡಿದ ನಂತರ, ನೀವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಈ ಪರದೆಗೆ ಮರಳಬಹುದು.</string>
+ <string name="authenticate_label">ದೃಢೀಕರಿಸು</string>
+ <string name="return_home_label">ಮುಂಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ</string>
+ <string name="flattr_auth_success">ದೃಢೀಕರಣ ಯಶಸ್ವಿಯಾಯಿತು! ನೀವು ಈಗ ಅಪ್ಲಿಕೇಶನ್ ಒಳಗೆ ವಿಷಯಗಳನ್ನು ಫ್ಳಟರ್ ಮಾಡಬಹುದು.</string>
+ <string name="no_flattr_token_title">ಫ್ಳಟರ್ ಟೋಕನ್ ಕಂಡುಬಂದಿಲ್ಲ</string>
+ <string name="authenticate_now_label">ದೃಢೀಕರಿಸು</string>
+ <string name="action_forbidden_title">ಕ್ರಿಯೆಯನ್ನು ನಿಷೇಧಿಸಲಾಗಿದೆ</string>
+ <string name="access_revoked_title">ಪ್ರವೇಶವನ್ನು ಹಿಂಪಡೆಯಲಾಗಿದೆ</string>
+ <!--Flattr-->
+ <!--Variable Speed-->
+ <!--Empty list labels-->
+ <string name="no_items_label">ಈ ಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೇ ಅಂಶಗಳು ಇಲ್ಲ.</string>
+ <string name="no_feeds_label">ನೀವು ಇನ್ನೂ ಯಾವುದೇ ಫೀಡ್ಗಳಿಗೆ ಚಂದಾದಾರರಾಗಿಲ್ಲ.</string>
+ <!--Preferences-->
+ <string name="other_pref">ಇತರೆ</string>
+ <string name="about_pref">ಕುರಿತು</string>
+ <string name="queue_label">ಸರದಿ</string>
+ <string name="playback_pref">ಹಿನ್ನೆಲೆ</string>
+ <string name="network_pref"> ಜಾಲಬಂಧ</string>
+ <string name="user_interface_label">ಬಳಕೆದಾರ ಸಂಪರ್ಕಸಾಧನ</string>
+ <!--Auto-Flattr dialog-->
+ <!--Search-->
+ <string name="search_hint">ಫೀಡ್ಸ್ ಅಥವಾ ಸಂಚಿಕೆಗಳಿಗಾಗಿ ಹುಡುಕಿ</string>
+ <string name="found_in_shownotes_label">ಪ್ರದರ್ಶನ ಟಿಪ್ಪಣಿಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತವೆ</string>
+ <string name="found_in_chapters_label">ಅಧ್ಯಾಯಗಳಲ್ಲಿ ಕಂಡುಬರುತ್ತವೆ</string>
+ <string name="search_status_no_results">ಯಾವುದೇ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ</string>
+ <string name="search_label">ಹುಡುಕು</string>
+ <!--OPML import and export-->
+ <!--Sleep timer-->
+ <!--gpodder.net-->
+ <!--Directory chooser-->
+ <!--Online feed view-->
+ <!--Content descriptions for image buttons-->
+ <!--Feed information screen-->
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-ko-rKR/strings.xml b/core/src/main/res/values-ko-rKR/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-ko-rKR/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-ko/strings.xml b/core/src/main/res/values-ko/strings.xml
index 6802cc36d..d0b3aae33 100644
--- a/core/src/main/res/values-ko/strings.xml
+++ b/core/src/main/res/values-ko/strings.xml
@@ -495,6 +495,13 @@
<!--Feed information screen-->
<string name="authentication_label">인증</string>
<string name="authentication_descr">이 팟캐스트와 에피소드에 대한 사용자 이름과 비밀번호를 바꿉니다.</string>
+ <string name="auto_download_settings_label">자동 다운로드 설정</string>
+ <string name="episode_filters_label">에피소드 필터</string>
+ <string name="episode_filters_description">자동 다운로드를 할 때 에피소드가 포함되어야할지 제외되어야할지 결정하는 규칙의 목록</string>
+ <string name="episode_filters_include">포함</string>
+ <string name="episode_filters_exclude">제외</string>
+ <string name="episode_filters_hint">단수 단어 \n\"복수 단어\"</string>
+ <string name="keep_updated">최신 업데이트 유지</string>
<!--Progress information-->
<string name="progress_upgrading_database">데이터베이스 업그레이드 중</string>
<!--AntennaPodSP-->
diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml
index 5cbc40d78..1973cd51b 100644
--- a/core/src/main/res/values-nl/strings.xml
+++ b/core/src/main/res/values-nl/strings.xml
@@ -97,7 +97,7 @@
<string name="podcastdirectories_descr">U kunt nieuwe podcasts zoeken op naam, categorie of populariteit in de gpodder.net database, of de iTunes winkel doorzoeken.</string>
<string name="browse_gpoddernet_label">gpodder.net doorbladeren</string>
<!--Actions on feeds-->
- <string name="mark_all_read_label">Alles als beluisterd markeren</string>
+ <string name="mark_all_read_label">Alles als afgespeeld markeren</string>
<string name="mark_all_read_msg">Alle afleveringen als afgespeeld markeren</string>
<string name="mark_all_read_confirmation_msg">Bevestig aub dat u alle afleveringen als afgespeeld wilt markeren.</string>
<string name="mark_all_read_feed_confirmation_msg">Bevestig aub dat u alle afleveringen van deze feed als afgespeeld wilt markeren.</string>
@@ -267,7 +267,7 @@
<string name="services_label">Services</string>
<string name="flattr_label">Flattr</string>
<string name="pref_episode_cleanup_title">Automatisch opschonen</string>
- <string name="pref_episode_cleanup_summary">Afleveringen die niet in de wachtrij staan en die niet als favoriet zijn gemarkeerd, mogen verwijderd worden als Automatisch Downloaden ruimte nodig heeft voor nieuwe afleveringen.</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>
@@ -276,7 +276,7 @@
<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>
<string name="pref_auto_delete_title">Automatisch verwijderen</string>
- <string name="pref_smart_mark_as_played_sum">Als afgespeeld markeren wanneer minder dan een bepaald aantal seconden van de afspeeltijd over is</string>
+ <string name="pref_smart_mark_as_played_sum">Afleveringen als afgespeeld markeren wanneer deze nog maar een bepaald aantal seconden duurt</string>
<string name="pref_smart_mark_as_played_title">Slimme afgespeeld markering</string>
<string name="pref_skip_keeps_episodes_sum">Afleveringen bewaren en in de wachtrij houden als u op \'overslaan\' klikt</string>
<string name="pref_skip_keeps_episodes_title">Overgeslagen afleveringen bewaren</string>
@@ -390,8 +390,8 @@
<string name="reading_opml_label">OPML-bestand aan het lezen</string>
<string name="opml_reader_error">Er is een fout opgetreden bij het lezen van het OPML-bestand:</string>
<string name="opml_import_error_dir_empty">De import map is leeg.</string>
- <string name="select_all_label">Selecteer alles</string>
- <string name="deselect_all_label">Deselecteer alles</string>
+ <string name="select_all_label">Alles selecteren</string>
+ <string name="deselect_all_label">Alles deselecteren</string>
<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>
@@ -400,6 +400,7 @@
<string name="export_error_label">Export fout</string>
<string name="opml_export_success_title">OPML bestand succesvol geëxporteerd.</string>
<string name="opml_export_success_sum"> Het OPML-bestand is in \u0020 geplaatst</string>
+ <string name="opml_import_ask_read_permission">Toegang tot externe locaties is nodig om het OPML-bestand te kunnen lezen</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Slaap timer instellen</string>
<string name="disable_sleeptimer_label">Slaap timer uitschakelen</string>
@@ -458,6 +459,7 @@
<string name="create_folder_label">Map aanmaken</string>
<string name="choose_data_directory">Kies data map</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>
<string name="create_folder_success">Nieuwe map aangemaakt</string>
<string name="create_folder_error_no_write_access">Kan in deze map niet schrijven</string>
@@ -469,8 +471,8 @@
<string name="folder_not_empty_dialog_title">Map is niet leeg</string>
<string name="folder_not_empty_dialog_msg">De map die je hebt gekozen is niet leeg. Media downloads en andere bestanden zullen rechtstreeks in deze map geplaatst worden. Toch doorgaan?</string>
<string name="set_to_default_folder">Kies default map</string>
- <string name="pref_pausePlaybackForFocusLoss_sum">Het afspelen onderbreken in plaats van het volume te verlagen wanneer er een andere app geluiden af wilt spelen</string>
- <string name="pref_pausePlaybackForFocusLoss_title">Pauze voor onderbrekingen</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">Het afspelen onderbreken in plaats van het volume te verlagen wanneer er een andere app geluiden af wil spelen</string>
+ <string name="pref_pausePlaybackForFocusLoss_title">Pauzeren bij onderbrekingen</string>
<string name="pref_resumeAfterCall_sum">Afspelen hervatten na beëindigen telefoongesprek</string>
<string name="pref_resumeAfterCall_title">Hervatten na gesprek</string>
<string name="pref_restart_required">AntennaPod moet opnieuw worden opgestart om deze wijziging door te voeren.</string>
@@ -500,6 +502,12 @@
<!--Feed information screen-->
<string name="authentication_label">Authenticatie</string>
<string name="authentication_descr">Gebruikersnaam en wachtwoord aanpassen voor deze podcast</string>
+ <string name="auto_download_settings_label">Instellingen voor Automatisch downloaden</string>
+ <string name="episode_filters_label">Afleveringenfilter</string>
+ <string name="episode_filters_description">Lijst van zoektermen die bepalen of een aflevering meegenomen of uitgesloten wordt bij automatisch downloaden</string>
+ <string name="episode_filters_include">Meenemen</string>
+ <string name="episode_filters_exclude">Uitsluiten</string>
+ <string name="keep_updated">Up to date houden</string>
<!--Progress information-->
<string name="progress_upgrading_database">Database upgraden</string>
<!--AntennaPodSP-->
@@ -519,6 +527,10 @@
<string name="selected_downloaded_label">Gedownloadde afleveringen geselecteerd</string>
<string name="not_downloaded_label">Niet gedownload</string>
<string name="selected_not_downloaded_label">Niet gedownloadde afleveringen geselecteerd</string>
+ <string name="queued_label">In de wachtrij</string>
+ <string name="selected_queued_label">Afleveringen in de wachtrij selecteren</string>
+ <string name="not_queued_label">Niet in de wachtrij</string>
+ <string name="selected_not_queued_label">Afleveringen geselecteerd die niet in de wachtrij staan</string>
<string name="sort_title"><b>Sorteren op…</b></string>
<string name="sort_title_a_z">Titel (A \u2192 Z)</string>
<string name="sort_title_z_a">Titel (A \u2192 A)</string>
diff --git a/core/src/main/res/values-no-rNB/strings.xml b/core/src/main/res/values-no-rNB/strings.xml
new file mode 100644
index 000000000..e3aa1ca5d
--- /dev/null
+++ b/core/src/main/res/values-no-rNB/strings.xml
@@ -0,0 +1,510 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="feeds_label">Strømmer</string>
+ <string name="add_feed_label">Legg til podcast</string>
+ <string name="podcasts_label">PODCASTER</string>
+ <string name="episodes_label">Episoder</string>
+ <string name="new_episodes_label">Nye episoder</string>
+ <string name="all_episodes_label">Alle episoder</string>
+ <string name="all_episodes_short_label">Alle</string>
+ <string name="favorite_episodes_label">Favoritter</string>
+ <string name="new_label">Nye</string>
+ <string name="waiting_list_label">Venteliste</string>
+ <string name="settings_label">Innstillinger</string>
+ <string name="add_new_feed_label">Legg til podcast</string>
+ <string name="downloads_label">Nedlastninger</string>
+ <string name="downloads_running_label">Kjører</string>
+ <string name="downloads_completed_label">Fullført</string>
+ <string name="downloads_log_label">Logg</string>
+ <string name="cancel_download_label">Avbryt\nLast ned</string>
+ <string name="playback_history_label">Avspillingshistorikk</string>
+ <string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_auth_label">gpodder.net-innlogging</string>
+ <string name="free_space_label">%1$s ledig</string>
+ <!--New episodes fragment-->
+ <string name="recently_published_episodes_label">Nylig publisert</string>
+ <string name="episode_filter_label">Vis kun nye episoder</string>
+ <!--Main activity-->
+ <string name="drawer_open">Åpne menyen</string>
+ <string name="drawer_close">Lukk menyen</string>
+ <string name="drawer_preferences">Skuff-innstillinger</string>
+ <string name="drawer_feed_order_unplayed_episodes">Sorter på teller</string>
+ <string name="drawer_feed_order_alphabetical">Sorter alfabetisk</string>
+ <string name="drawer_feed_order_last_update">Sorter på utgivelsesdato</string>
+ <string name="drawer_feed_counter_new_unplayed">Antall nye og uavspilte episoder</string>
+ <string name="drawer_feed_counter_new">Antall nye episoder</string>
+ <string name="drawer_feed_counter_unplayed">Antall uavspilte episoder</string>
+ <string name="drawer_feed_counter_none">Ingen</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">Åpne i nettleser</string>
+ <string name="copy_url_label">Kopier URL</string>
+ <string name="share_url_label">Del URL</string>
+ <string name="copied_url_msg">URL er kopiert til utklippstavlen</string>
+ <string name="go_to_position_label">Gå til denne posisjonen</string>
+ <!--Playback history-->
+ <string name="clear_history_label">Tøm historikk</string>
+ <!--Other-->
+ <string name="confirm_label">Bekreft</string>
+ <string name="cancel_label">Avbryt</string>
+ <string name="yes">Ja</string>
+ <string name="no">Nei</string>
+ <string name="author_label">Opphavsperson</string>
+ <string name="language_label">Språk</string>
+ <string name="url_label">URL</string>
+ <string name="podcast_settings_label">Innstillinger</string>
+ <string name="cover_label">Bilde</string>
+ <string name="error_label">Feil</string>
+ <string name="error_msg_prefix">Det oppsto en feil:</string>
+ <string name="refresh_label">Oppdater</string>
+ <string name="external_storage_error_msg">Finner ikke ekstern lagring. Sjekk at det eksterne lagringsmediet er montert.</string>
+ <string name="chapters_label">Kapittel</string>
+ <string name="shownotes_label">Shownotater</string>
+ <string name="description_label">Beskrivelse</string>
+ <string name="most_recent_prefix">Nyeste episode:\u0020</string>
+ <string name="episodes_suffix">\u0020episoder</string>
+ <string name="length_prefix">Lengde:\u0020</string>
+ <string name="size_prefix">Størrelse:\u0020</string>
+ <string name="processing_label">Behandler</string>
+ <string name="save_username_password_label">Lagre brukernavn og passord</string>
+ <string name="close_label">Lukk</string>
+ <string name="retry_label">Prøv igjen</string>
+ <string name="auto_download_label">Inkluder i automatiske nedlastninger</string>
+ <string name="auto_download_apply_to_items_title">Angi for tidligere episoder</string>
+ <string name="auto_download_apply_to_items_message">Den nye <i>Automatisk nedlasting</i>-innstillingen vil automatisk aktiveres for nye episoder.\nØnsker du å aktivere den for tidligere utgitte episoder også?</string>
+ <string name="auto_delete_label">Automatisk sletting av episode\n(overstyr den globale standarden)</string>
+ <string name="parallel_downloads_suffix">\u0020samtidige nedlastinger</string>
+ <string name="feed_auto_download_global">Global</string>
+ <string name="feed_auto_download_always">Alltid</string>
+ <string name="feed_auto_download_never">Aldri</string>
+ <string name="episode_cleanup_never">AldriAldri</string>
+ <string name="episode_cleanup_queue_removal">Når ikke i kø</string>
+ <string name="episode_cleanup_after_listening">Etter den er ferdig</string>
+ <plurals name="episode_cleanup_days_after_listening">
+ <item quantity="one">1 dag etter fullført avspilling</item>
+ <item quantity="other">%d dager etter fullført avspilling</item>
+ </plurals>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">Strømmens URL</string>
+ <string name="etxtFeedurlHint">www.example.com/feed</string>
+ <string name="txtvfeedurl_label">Legg til en podcast via URL</string>
+ <string name="podcastdirectories_label">Finn podcast i katalog</string>
+ <string name="podcastdirectories_descr">Du kan søke etter nye podcaster på navn, kategori eller popularitet i gpodder.nets katalog eller på iTunes.</string>
+ <string name="browse_gpoddernet_label">Bla gjennom gpodder.net</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Marker alle som avspilt</string>
+ <string name="mark_all_read_msg">Marker alle episoder som avspilt</string>
+ <string name="mark_all_read_confirmation_msg">Vennligst bekreft at du ønsker å markere alle episoder som avspilt.</string>
+ <string name="mark_all_read_feed_confirmation_msg">Vennligst bekreft at du ønsker å markere alle episoder i denne strømmen som avspilt.</string>
+ <string name="mark_all_seen_label">Marker alle som sett</string>
+ <string name="show_info_label">Vis informasjon</string>
+ <string name="remove_feed_label">Fjern podcast</string>
+ <string name="share_link_label">Del lenke</string>
+ <string name="share_link_with_position_label">Del lenke med plassering</string>
+ <string name="share_feed_url_label">Del strømmens URL</string>
+ <string name="share_item_url_label">Del episodens URL</string>
+ <string name="share_item_url_with_position_label">Del episodens URL med posisjon</string>
+ <string name="feed_delete_confirmation_msg">Vil du virkelig slette denne strømmen og alle episodene av denne strømmen du har lastet ned?</string>
+ <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>
+ <string name="hide_queued_episodes_label">I kø</string>
+ <string name="hide_not_queued_episodes_label">Ikke i kø</string>
+ <string name="hide_downloaded_episodes_label">Nedlastet</string>
+ <string name="hide_not_downloaded_episodes_label">Ikke nedlastet</string>
+ <string name="filtered_label">Filtrert</string>
+ <string name="refresh_failed_msg">{fa-exclamation-circle} Siste oppdatering mislyktes</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Last ned</string>
+ <string name="play_label">Spill</string>
+ <string name="pause_label">Pause</string>
+ <string name="stop_label">Stopp</string>
+ <string name="stream_label">Stream</string>
+ <string name="remove_label">Fjern</string>
+ <string name="remove_episode_lable">Fjern episode</string>
+ <string name="mark_read_label">Marker som avspilt</string>
+ <string name="marked_as_read_label">Marker som avspilt</string>
+ <string name="mark_unread_label">Marker som ikke avspilt</string>
+ <string name="add_to_queue_label">Legg til queue</string>
+ <string name="added_to_queue_label">Lagt til i kø</string>
+ <string name="remove_from_queue_label">Fjern fra queue</string>
+ <string name="add_to_favorite_label">Legg til i favoritter</string>
+ <string name="remove_from_favorite_label">Fjern fra favoritter</string>
+ <string name="visit_website_label">Besøk nettside</string>
+ <string name="support_label">Flattr\'e dette</string>
+ <string name="enqueue_all_new">Legg alle til queue</string>
+ <string name="download_all">Last ned alle</string>
+ <string name="skip_episode_label">Skip episode</string>
+ <string name="activate_auto_download">Aktiver automatisk nedlasting</string>
+ <string name="deactivate_auto_download">Deaktiver automatisk nedlasting</string>
+ <string name="reset_position">Tilbakestill avspillingsposisjon</string>
+ <string name="removed_item">Element fjernet</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">nedlastning lyktes</string>
+ <string name="download_failed">mislyktes</string>
+ <string name="download_pending">Nedlastning venter</string>
+ <string name="download_running">Nedlasting pågår</string>
+ <string name="download_error_device_not_found">Lagringsenhet ikke funnet</string>
+ <string name="download_error_insufficient_space">Ikke nok plass</string>
+ <string name="download_error_file_error">Fil-feil</string>
+ <string name="download_error_http_data_error">HTTP-datafeil</string>
+ <string name="download_error_error_unknown">Ukjent feil</string>
+ <string name="download_error_parser_exception">Parser-unntak</string>
+ <string name="download_error_unsupported_type">Strøm-typen er ikke støttet</string>
+ <string name="download_error_connection_error">Tilkoblingsfeil</string>
+ <string name="download_error_unknown_host">Ukjent vert</string>
+ <string name="download_error_unauthorized">Autentiseringsfeil</string>
+ <string name="cancel_all_downloads_label">Avbryt alle nedlastninger</string>
+ <string name="download_canceled_msg">Nedlasting avbrutt</string>
+ <string name="download_canceled_autodownload_enabled_msg">Nedlasting avbrutt\n<i>Automatisk nedlasting</i> for dette elementet er deaktivert</string>
+ <string name="download_report_title">Nedlasting fullført med feilmeldinger</string>
+ <string name="download_report_content_title">Nedlastingsrapport</string>
+ <string name="download_error_malformed_url">Misformet URL</string>
+ <string name="download_error_io_error">IO feil</string>
+ <string name="download_error_request_error">Forespørselfeil</string>
+ <string name="download_error_db_access">Tilgangsfeil for database</string>
+ <string name="downloads_processing">Behandler nedlastninger</string>
+ <string name="download_notification_title">Laster ned data til podcast</string>
+ <string name="download_report_content">%1$d nedlastninger lyktes, %2$d mislyktes</string>
+ <string name="download_log_title_unknown">Ukjent tittel</string>
+ <string name="download_type_feed">Strøm</string>
+ <string name="download_type_media">Mediafil</string>
+ <string name="download_type_image">Bilde</string>
+ <string name="download_request_error_dialog_message_prefix">En feil oppsto under nedlastningen av filen:\u0020</string>
+ <string name="authentication_notification_title">Autentisering påkreves</string>
+ <string name="authentication_notification_msg">Ressursen du forespør krever brukernavn og passord</string>
+ <string name="confirm_mobile_download_dialog_title">Bekreft nedlasting over mobildata</string>
+ <string name="confirm_mobile_download_dialog_message_not_in_queue">Nedlasting over mobildata er deaktivert i innstillingene.\n\nDu kan velge å legge episoden til i køen eller tillate midlertidig nedlasting over mobildata.\n\n<small>Valget ditt vil gjelde i 10 minutter.</small></string>
+ <string name="confirm_mobile_download_dialog_message">Nedlasting over mobildata er deaktivert i innstillingene.\n\nVil du tillate nedlasting over mobildata midlertidig?\n\n<small>Valget ditt vil gjelde i 10 minutter.</small></string>
+ <string name="confirm_mobile_download_dialog_only_add_to_queue">Legg til i kø</string>
+ <string name="confirm_mobile_download_dialog_enable_temporarily">Tillat midlertidig</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Error!</string>
+ <string name="player_stopped_msg">Ingen media spillende for øyeblikket.</string>
+ <string name="player_preparing_msg">Forbereder</string>
+ <string name="player_ready_msg">Klar</string>
+ <string name="player_seeking_msg">Oppsøker</string>
+ <string name="playback_error_server_died">Serveren døde</string>
+ <string name="playback_error_unknown">Ukjent feil</string>
+ <string name="no_media_playing_label">Ingen media spillende for øyeblikket.</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">Bufrer</string>
+ <string name="playbackservice_notification_title">Spiller podcast</string>
+ <string name="unknown_media_key">AntennaPod - Ukjent medienøkkel: %1$d</string>
+ <!--Queue operations-->
+ <string name="lock_queue">Lås køen</string>
+ <string name="unlock_queue">Lås opp køen</string>
+ <string name="clear_queue_label">Slett køen</string>
+ <string name="undo">Angre</string>
+ <string name="removed_from_queue">Objekt er fjernet</string>
+ <string name="move_to_top_label">Gå til toppen</string>
+ <string name="move_to_bottom_label">Gå til bunnen</string>
+ <string name="sort">Sortér</string>
+ <string name="alpha">Alfabetisk</string>
+ <string name="date">På dato</string>
+ <string name="duration">På varighet</string>
+ <string name="ascending">Økende</string>
+ <string name="descending">Synkende</string>
+ <string name="clear_queue_confirmation_msg">Vennligst bekreft at du ønsker å slette ALLE elementer i køen</string>
+ <!--Flattr-->
+ <string name="flattr_auth_label">Flattr innlogging</string>
+ <string name="flattr_auth_explanation">Trykk knappen nedenfor for å starte autentiseringsprosessen. Du vil videresendes til flattr sin innloggsinsskjerm i din nettleser og spurt om å gi AntennaPod tillatelse til å flattr\'e ting. Etter at du har gitt tillatelse blir du returnert hit automatisk.</string>
+ <string name="authenticate_label">Autentiser</string>
+ <string name="return_home_label">Returner hjem</string>
+ <string name="flattr_auth_success">Autentisering fullført! Nå kan du flattr tingene i denne appen.</string>
+ <string name="no_flattr_token_title">Flattr-token ikke funnet</string>
+ <string name="no_flattr_token_notification_msg">Det virker som at Flattr-kontoen din ikke er sammenkoblet med AntennaPod. Trykk her for å autentisere.</string>
+ <string name="no_flattr_token_msg">Det virker ikke som din flattr konto er koblet til AntennaPod. Du kan enten koble kontoen din til AntennaPod for å flattr\'e ting i appen eller du kan besøke nettsiden til tingen for å flattr\'e det der.</string>
+ <string name="authenticate_now_label">Autentiser</string>
+ <string name="action_forbidden_title">Handling forbudt</string>
+ <string name="action_forbidden_msg">AntennaPod har ikke tilgang til denne handlingen. Grunnen kan være at tilgangstokenet til kontoen din er blitt inndratt. Du kan enten re-autentisere eller besøke tjenestens nettsted.</string>
+ <string name="access_revoked_title">Tilgang opphevet</string>
+ <string name="access_revoked_info">Du har fjernet AntennaPods tilgang til kontoen din. For å fullføre prossessen må du fjerne denne appen fra listen over tillatte apper på flattr-nettsiden.</string>
+ <!--Flattr-->
+ <string name="flattr_click_success">Flattr\'erte en ting!</string>
+ <string name="flattr_click_success_count">Flattret %d ting!</string>
+ <string name="flattr_click_success_queue">Flattret: %s.</string>
+ <string name="flattr_click_failure_count">Klarte ikke flattre %d ting!</string>
+ <string name="flattr_click_failure">Ikke flattret: %s.</string>
+ <string name="flattr_click_enqueued">Tingen vil bli flattret senere</string>
+ <string name="flattring_thing">Flattrer %s</string>
+ <string name="flattring_label">AntennaPod flattrer</string>
+ <string name="flattrd_label">AntennaPod har flattret</string>
+ <string name="flattrd_failed_label">AntennaPods flattring feilet</string>
+ <string name="flattr_retrieving_status">Henter flattrede ting</string>
+ <!--Variable Speed-->
+ <string name="download_plugin_label">Last ned programtillegg</string>
+ <string name="no_playback_plugin_title">Programtillegg er ikke installert</string>
+ <string name="set_playback_speed_label">Avspillingshastigheter</string>
+ <string name="enable_sonic">Skru på Sonic</string>
+ <!--Empty list labels-->
+ <string name="no_items_label">Det er ingen objekter på denne listen.</string>
+ <string name="no_feeds_label">Du abonnerer ikke på noen strømmer enda.</string>
+ <!--Preferences-->
+ <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>
+ <string name="pref_unpauseOnHeadsetReconnect_sum">Gjenoppta avspilling når hodetelefoner gjeninnkoples</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">Fortsett avspilling når bluetooth er tilkoblet igjen</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Forover-knapp hopper</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">Ved pressing av hardware forover-knapp hopp til neste episode istedenfor forover-spoling</string>
+ <string name="pref_followQueue_sum">Hopp til neste element i køen når avspillingen er ferdig</string>
+ <string name="pref_auto_delete_sum">Slett episode når avspillingen er ferdig</string>
+ <string name="pref_auto_delete_title">Automatisk sletting</string>
+ <string name="pref_smart_mark_as_played_sum">Marker episoder som avspilt selv om det er X antall sekunder igjen av avspillingen</string>
+ <string name="pref_smart_mark_as_played_title">Smart markering av avspilt</string>
+ <string name="pref_skip_keeps_episodes_sum">Behold episoder når de hoppes over</string>
+ <string name="pref_skip_keeps_episodes_title">Behold episoder som er hoppet over</string>
+ <string name="playback_pref">Avspilling</string>
+ <string name="network_pref">Nettverk</string>
+ <string name="pref_autoUpdateIntervallOrTime_title">Oppdateringsintervall eler tidspunkt</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Spesifiser en intervall eller et spesifikt tidspunkt når strømmer skal oppdateres automatisk</string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Du kan sette en <i>intervall</i> som «hver andre time», et <i>spesifikt tidspunkt</i> som «07:00» eller <i>skru av</i> automatiske oppdateringer helt.\n\n<small>Merk: Oppdateringstider er ikke eksakte; du kan oppleve små forsinkelser.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_Disable">Skru av</string>
+ <string name="pref_autoUpdateIntervallOrTime_Interval">Sett intervall</string>
+ <string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Angi klokkeslett</string>
+ <string name="pref_downloadMediaOnWifiOnly_sum">Last ned mediafiler eksklusivt med WiFi</string>
+ <string name="pref_followQueue_title">Kontinuerlig avspilling</string>
+ <string name="pref_downloadMediaOnWifiOnly_title">WiFi media nedlastning</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Frakobling av hodetelefoner</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">Gjeninnkopling av hodetelefoner</string>
+ <string name="pref_unpauseOnBluetoothReconnect_title">Blutetooth tilkoblet igjen</string>
+ <string name="pref_mobileUpdate_title">Mobiloppdateringer</string>
+ <string name="pref_mobileUpdate_sum">Tillat oppdateringer over kobling via mobildata</string>
+ <string name="refreshing_label">Oppdaterer</string>
+ <string name="flattr_settings_label">Flattr innstillinger</string>
+ <string name="pref_flattr_auth_title">Flattr logg in</string>
+ <string name="pref_flattr_auth_sum">Logg på din flattr konto for å flattr ting direkte fra appen.</string>
+ <string name="pref_flattr_this_app_title">Flattr denne appen</string>
+ <string name="pref_flattr_this_app_sum">Støtt utviklingen av AntennaPod ved å flattr\'e det. Tusen takk!</string>
+ <string name="pref_revokeAccess_title">Opphev tilgang</string>
+ <string name="pref_revokeAccess_sum">Opphev tilgangstillatelsen til din flattr konto for denne appen.</string>
+ <string name="pref_auto_flattr_title">Automatisk Flattr</string>
+ <string name="pref_auto_flattr_sum">Konfigurer automatisk flattring</string>
+ <string name="user_interface_label">Brukergrensesnitt</string>
+ <string name="pref_set_theme_title">Velg tema</string>
+ <string name="pref_nav_drawer_title">Skreddersy navigasjonsskuff</string>
+ <string name="pref_nav_drawer_sum">Velg utseendet til navigasjonsskuffen.</string>
+ <string name="pref_nav_drawer_items_title">Velg elementer i navigasjonsskuffen</string>
+ <string name="pref_nav_drawer_items_sum">Endre hvilke elementer som vises i navigeringsfanen.</string>
+ <string name="pref_nav_drawer_feed_order_title">Velg rekkefølge på abbonement</string>
+ <string name="pref_nav_drawer_feed_order_sum">Endre rekkefølgen på abbonementene dine</string>
+ <string name="pref_nav_drawer_feed_counter_title">Velg abbonementsteller</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Endre informasjonen vist av abonnementstelleren</string>
+ <string name="pref_set_theme_sum">Endre utseendet til AntennaPod</string>
+ <string name="pref_automatic_download_title">Automatisk nedlasting</string>
+ <string name="pref_automatic_download_sum">Konfigurer automatisk nedlasting av episoder.</string>
+ <string name="pref_autodl_wifi_filter_title">Skru på Wi-Fi-filter</string>
+ <string name="pref_autodl_wifi_filter_sum">Tillat automatisk nedlasting kun for valgte Wi-Fi-nettverk.</string>
+ <string name="pref_automatic_download_on_battery_title">Last ned når enheten ikke lader</string>
+ <string name="pref_automatic_download_on_battery_sum">Tillat automatisk nedlasting når enheten ikke står til lading</string>
+ <string name="pref_parallel_downloads_title">Parallelle nedlastinger</string>
+ <string name="pref_episode_cache_title">Mellomlager for episoder</string>
+ <string name="pref_theme_title_light">Lyst</string>
+ <string name="pref_theme_title_dark">Mørkt</string>
+ <string name="pref_episode_cache_unlimited">Ulimitert</string>
+ <string name="pref_update_interval_hours_plural">Timer</string>
+ <string name="pref_update_interval_hours_singular">Time</string>
+ <string name="pref_update_interval_hours_manual">Manuelt</string>
+ <string name="pref_gpodnet_authenticate_title">Logg inn</string>
+ <string name="pref_gpodnet_authenticate_sum">Logg inn med din gpodder.net konto for å synkronisere dine abonnementer.</string>
+ <string name="pref_gpodnet_logout_title">Logg ut</string>
+ <string name="pref_gpodnet_logout_toast">Utloggelse lyktes</string>
+ <string name="pref_gpodnet_setlogin_information_title">Endre innloggingsinformasjon</string>
+ <string name="pref_gpodnet_setlogin_information_sum">Endre innlogginsinformasjonen til din gpodder.net konto</string>
+ <string name="pref_playback_speed_title">Avspillingshastigheter</string>
+ <string name="pref_playback_speed_sum">Egendefiner hastighetene tilgjengelig for variabel avspillingshastighet</string>
+ <string name="pref_fast_forward">Spoling fremover</string>
+ <string name="pref_rewind">Spoling bakover</string>
+ <string name="pref_gpodnet_sethostname_title">Sett vertsnavn</string>
+ <string name="pref_gpodnet_sethostname_use_default_host">Bruk standard vert</string>
+ <string name="pref_expandNotify_title">Utvid varsel</string>
+ <string name="pref_expandNotify_sum">Utvider alltid varselet for å inkludere avspillingsknapper.</string>
+ <string name="pref_persistNotify_title">Vedvarende avspillingskontroller</string>
+ <string name="pref_persistNotify_sum">Behold varsel- og låseskjermkontroller når avspilling er satt på pause.</string>
+ <string name="pref_lockscreen_background_title">Angi som bakgrunn på låseskjermen</string>
+ <string name="pref_lockscreen_background_sum">Angir låseskjermbakgrunnsbildet til å være den nåværende episodens bilde. Som en sideeffekt vil dette også vise bildet i tredjepartsapper.</string>
+ <string name="pref_showDownloadReport_title">Vis nedlastingsrapport</string>
+ <string name="pref_showDownloadReport_sum">Generer en rapport som viser detaljer dersom nedlastinger feiler.</string>
+ <string name="pref_expand_notify_unsupport_toast">Android-versjoner tidligere enn 4.1 støtter ikke utvidede varsler.</string>
+ <string name="pref_queueAddToFront_sum">Legg til nye episoder i begynnelsen av køen.</string>
+ <string name="pref_queueAddToFront_title">Legg til foran i køen</string>
+ <string name="pref_smart_mark_as_played_disabled">Deaktivert</string>
+ <string name="pref_image_cache_size_title">Størrelse for bildemellomlager</string>
+ <string name="pref_image_cache_size_sum">Størrelsen på mellomlageret for bilder.</string>
+ <string name="crash_report_title">Kræsj-rapport</string>
+ <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 medieavspiller</string>
+ <!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">Aktiver automatisk flattring</string>
+ <string name="auto_flattr_after_percent">Flattre episode så snart %d prosent er avspilt</string>
+ <string name="auto_flattr_ater_beginning">Flattre episode når avspillingen starter</string>
+ <string name="auto_flattr_ater_end">Flattre episode når avspillingen tar slutt</string>
+ <!--Search-->
+ <string name="search_hint">Søk etter strømmer eller episoder</string>
+ <string name="found_in_shownotes_label">Funnet i shownotater</string>
+ <string name="found_in_chapters_label">Funnet i kapitler</string>
+ <string name="search_status_no_results">Ingen resultater ble funnet</string>
+ <string name="search_label">Søk</string>
+ <string name="found_in_title_label">Funnet i tittel</string>
+ <!--OPML import and export-->
+ <string name="opml_import_txtv_button_lable">OPML-filer lar deg flytte podcastene dine fra en podcatcher til en annen.</string>
+ <string name="opml_import_option">Valg %1$d</string>
+ <string name="opml_import_explanation_1">Velg en spesifikk filbane fra det lokale filsystemet.</string>
+ <string name="opml_import_explanation_2">Bruk en ektern applikasjon som Dropbox, Google Drive eller favoritt-filbehandleren din for å åpne en OPML-fil.</string>
+ <string name="opml_import_explanation_3">Mange applikasjoner som Gmail, Dropbox, Google Drive og de fleste filbehandlere kan <i>åpne</i> OPML-filer <i>med</i> AntennaPod.</string>
+ <string name="start_import_label">Start importering</string>
+ <string name="opml_import_label">OPML-import</string>
+ <string name="opml_directory_error">ERROR!</string>
+ <string name="reading_opml_label">Leser OPML-fil</string>
+ <string name="opml_reader_error">En feil oppsto under lesingen av opml dokumentet:</string>
+ <string name="opml_import_error_dir_empty">Importkatalogen er tom.</string>
+ <string name="select_all_label">Velg alle</string>
+ <string name="deselect_all_label">Opphev alle markeringene</string>
+ <string name="choose_file_from_filesystem">Fra lokalt filsystem</string>
+ <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>
+ <string name="enter_time_here_label">Legg til tid</string>
+ <string name="sleep_timer_label">Sovetimer</string>
+ <string name="time_left_label">Tid igjen:\u0020</string>
+ <string name="time_dialog_invalid_input">Ugyldig innspill, tid må være et heltall</string>
+ <string name="timer_about_to_expire_label"><b>Når nedtellingen er i ferd med å utløpe:</b></string>
+ <string name="shake_to_reset_label">Rist for å tilbakestille nedtellingen</string>
+ <string name="timer_vibration_label">Vibrer</string>
+ <string name="time_seconds">sekunder</string>
+ <string name="time_minutes">minutter</string>
+ <string name="time_hours">timer</string>
+ <plurals name="time_seconds_quantified">
+ <item quantity="one">1 sekund</item>
+ <item quantity="other">%d sekunder</item>
+ </plurals>
+ <plurals name="time_minutes_quantified">
+ <item quantity="one">1 minutt</item>
+ <item quantity="other">%d minutter</item>
+ </plurals>
+ <plurals name="time_hours_quantified">
+ <item quantity="one">1 time</item>
+ <item quantity="other">%d timer</item>
+ </plurals>
+ <!--gpodder.net-->
+ <string name="gpodnet_taglist_header">KATEGORIER</string>
+ <string name="gpodnet_toplist_header">TOPP-PODCASTER</string>
+ <string name="gpodnet_suggestions_header">FORSLAG</string>
+ <string name="gpodnet_search_hint">Søk på gpodder.net</string>
+ <string name="gpodnetauth_login_title">Logg inn</string>
+ <string name="gpodnetauth_login_descr">Velkommen til gpodder.net innlogginsprosess. Først begynner vi med å skrive inn innlogginsinformasjon.</string>
+ <string name="gpodnetauth_login_butLabel">Logg inn</string>
+ <string name="gpodnetauth_login_register">Dersom du ikke har en konto enda kan du opprette en her:\nhttps://gpodder.net/register/</string>
+ <string name="username_label">Brukernavn</string>
+ <string name="password_label">Passord</string>
+ <string name="gpodnetauth_device_title">Enhetsvalg</string>
+ <string name="gpodnetauth_device_descr">Lag en ny enhet til å bruke for din gpodder.net konto eller velg en som allerede eksisterer.</string>
+ <string name="gpodnetauth_device_deviceID">EnhetsID:\u0020</string>
+ <string name="gpodnetauth_device_caption">Tekst</string>
+ <string name="gpodnetauth_device_butCreateNewDevice">Lag en ny enhet</string>
+ <string name="gpodnetauth_device_chooseExistingDevice">Velg eksisterende enhet:</string>
+ <string name="gpodnetauth_device_errorEmpty">Device ID kan ikke være tom</string>
+ <string name="gpodnetauth_device_errorAlreadyUsed">EnhetsID er allerede i bruk</string>
+ <string name="gpodnetauth_device_butChoose">Velg</string>
+ <string name="gpodnetauth_finish_title">Innlogging lyktes!</string>
+ <string name="gpodnetauth_finish_descr">Gratulerer! Din gpodder.net konto er nå linket opp med din enhet. AntennaPod vil nå automatisk synkronisere abonnementer på din enhet med din gpodder.net konto.</string>
+ <string name="gpodnetauth_finish_butsyncnow">Start synkronisering nå.</string>
+ <string name="gpodnetauth_finish_butgomainscreen">Gå til hovedskjermen</string>
+ <string name="gpodnetsync_auth_error_title">gpodder.net-autentiseringsfeil</string>
+ <string name="gpodnetsync_auth_error_descr">Feil brukernavn eller passord.</string>
+ <string name="gpodnetsync_error_title">gpodder.net synkroniseringserror</string>
+ <string name="gpodnetsync_error_descr">En feil oppsto under synkronisering av:\u0020</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Valgt mappe</string>
+ <string name="create_folder_label">Lag mappe</string>
+ <string name="choose_data_directory">Velg datamappe</string>
+ <string name="choose_data_directory_message">Vennligst velg basisen for datamappen din. AntennaPod vil lage de nødvendige submappene dine.</string>
+ <string name="create_folder_msg">Lag en ny mappe med navn \"%1$s\"?</string>
+ <string name="create_folder_success">Lagde en ny mappe</string>
+ <string name="create_folder_error_no_write_access">Kan ikke skrive til denne mappen</string>
+ <string name="create_folder_error_already_exists">Mappe eksisterer allerede</string>
+ <string name="create_folder_error">Kunne ikke lage mappe</string>
+ <string name="folder_does_not_exist_error">%1$s eksisterer ikke</string>
+ <string name="folder_not_readable_error">%1$s kan ikke leses</string>
+ <string name="folder_not_writable_error">%1$s kan ikke skrives til</string>
+ <string name="folder_not_empty_dialog_title">Mappen er ikke tom</string>
+ <string name="folder_not_empty_dialog_msg">Mappen du har valgt er ikke tom. Nedlastet media og andre filer vil bli plassert direkte i denne mappen? Vil du fortsette?</string>
+ <string name="set_to_default_folder">Velg standardmappe</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">Sett pause på playback istedenfor å skru ned volumet når en annen app har lyst å spille av lyder</string>
+ <string name="pref_pausePlaybackForFocusLoss_title">Pause for avbrytelser</string>
+ <string name="pref_resumeAfterCall_sum">Gjenoppta avspilling etter at telefonsamtaler avsluttes</string>
+ <string name="pref_resumeAfterCall_title">Gjenoppta etter samtale</string>
+ <string name="pref_restart_required">AntennaPod må startes om for at denne endringen skal lagres.</string>
+ <!--Online feed view-->
+ <string name="subscribe_label">Abonner</string>
+ <string name="subscribed_label">Abonnert</string>
+ <!--Content descriptions for image buttons-->
+ <string name="show_chapters_label">Vis kapitler</string>
+ <string name="show_shownotes_label">Vis notater</string>
+ <string name="show_cover_label">Vis bilde</string>
+ <string name="rewind_label">Spol tilbake</string>
+ <string name="fast_forward_label">Spol fremover</string>
+ <string name="media_type_audio_label">Lyd</string>
+ <string name="media_type_video_label">Video</string>
+ <string name="navigate_upwards_label">Naviger oppover</string>
+ <string name="butAction_label">Flere handlinger</string>
+ <string name="status_playing_label">Episode spilles nå</string>
+ <string name="status_downloading_label">Episode lastes ned nå</string>
+ <string name="status_downloaded_label">Episode har blitt lastet ned</string>
+ <string name="status_unread_label">Objekt er nytt</string>
+ <string name="in_queue_label">Episoden er i queue</string>
+ <string name="new_episodes_count_label">Antall nye episoder</string>
+ <string name="in_progress_episodes_count_label">Antall episoder du har begynt å høre på</string>
+ <string name="drag_handle_content_description">Dra for å endre posisjonen til dette objektet</string>
+ <string name="load_next_page_label">Last inn neste side</string>
+ <!--Feed information screen-->
+ <string name="authentication_label">Autentisering</string>
+ <string name="authentication_descr">Endre brukernavnet og passordet for denne podcasten og dens episoder.</string>
+ <!--Progress information-->
+ <string name="progress_upgrading_database">Oppgraderer databasen</string>
+ <!--AntennaPodSP-->
+ <string name="sp_apps_importing_feeds_msg">Importerer abbonementer fra enkeltstående applikasjoner ...</string>
+ <string name="search_itunes_label">Søk på iTunes</string>
+ <string name="all_label">Alle</string>
+ <string name="selected_all_label">Valgte alle episoder</string>
+ <string name="none_label">Ingen</string>
+ <string name="deselected_all_label">Fjernet valg av alle episoder</string>
+ <string name="played_label">Avspilt</string>
+ <string name="selected_played_label">Valgte avspilte episoder</string>
+ <string name="unplayed_label">Uavspilt</string>
+ <string name="selected_unplayed_label">Valgte uavspilte episoder</string>
+ <string name="downloaded_label">Nedlastede</string>
+ <string name="selected_downloaded_label">Valgte nedlastede episoder</string>
+ <string name="not_downloaded_label">Ikke nedlastet</string>
+ <string name="selected_not_downloaded_label">Valgte ikke-nedlastede episoder</string>
+ <string name="sort_title_a_z">Tittel (A \u2192 Z)</string>
+ <string name="sort_title_z_a">Tittel (Z \u2192 A)</string>
+ <string name="sort_date_new_old">Dato (Ny \u2192 Gammel)</string>
+ <string name="sort_date_old_new">Dato (Gammel \u2192 Ny)</string>
+ <string name="sort_duration_short_long">Lengde (Kort \u2192 Lang)</string>
+ <string name="sort_duration_long_short">Lengde (Lang \u2192 Kort)</string>
+ <!--Rating dialog-->
+ <string name="rating_title">Liker du AntennaPod?</string>
+ <string name="rating_message">Vi ville satt pris på om du tok deg tid til å vurdere AntennaPod.</string>
+ <string name="rating_never_label">La meg være i fred</string>
+ <string name="rating_later_label">Minn meg på dette senere</string>
+ <string name="rating_now_label">Naturligvis, kom igjen!</string>
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-no/strings.xml b/core/src/main/res/values-no/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-no/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-pl/strings.xml b/core/src/main/res/values-pl/strings.xml
new file mode 100644
index 000000000..784b69c5a
--- /dev/null
+++ b/core/src/main/res/values-pl/strings.xml
@@ -0,0 +1,99 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="podcasts_label">PODKASTY</string>
+ <string name="settings_label">Ustawienia</string>
+ <string name="downloads_log_label">Dziennik</string>
+ <!--New episodes fragment-->
+ <string name="recently_published_episodes_label">Ostatnio opublikowane</string>
+ <!--Main activity-->
+ <string name="drawer_open">Otwórz menu</string>
+ <string name="drawer_close">Zamknij menu</string>
+ <!--Webview actions-->
+ <string name="copy_url_label">Kopiuj URL</string>
+ <string name="share_url_label">Udostępnij URL</string>
+ <!--Playback history-->
+ <!--Other-->
+ <string name="confirm_label">Potwierdź</string>
+ <string name="cancel_label">Anuluj</string>
+ <string name="author_label">Autor</string>
+ <string name="language_label">Język</string>
+ <string name="url_label">URL</string>
+ <string name="podcast_settings_label">Ustawienia</string>
+ <string name="cover_label">Obrazek</string>
+ <string name="error_label">Błąd</string>
+ <string name="refresh_label">Odśwież</string>
+ <string name="chapters_label">Rozdział</string>
+ <string name="description_label">Opis</string>
+ <string name="episodes_suffix">\u0020 odcinków</string>
+ <string name="length_prefix">Długość:\u0020</string>
+ <string name="size_prefix">Rozmiar:\u0020</string>
+ <string name="save_username_password_label">Zapis nazwę użytkownika i hasło</string>
+ <string name="close_label">Zamknij</string>
+ <string name="retry_label">Ponów</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="etxtFeedurlHint">www.example.com/feed</string>
+ <string name="browse_gpoddernet_label">Przeglądaj gpodder.net</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Zaznacz wszystkie jako przesłuchane</string>
+ <string name="show_info_label">Pokaż informacje</string>
+ <string name="hide_downloaded_episodes_label">Pobrany</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Pobierz</string>
+ <string name="play_label">Odtwórz</string>
+ <string name="stop_label">Zatrzymaj</string>
+ <string name="remove_label">Usuń</string>
+ <string name="mark_read_label">Zaznacz jako przesłuchany</string>
+ <string name="mark_unread_label">Zaznacz jako nieprzesłuchany</string>
+ <string name="add_to_queue_label">Dodaj do kolejki</string>
+ <string name="added_to_queue_label">Dodano do kolejki</string>
+ <string name="remove_from_queue_label">Usuń z kolejki</string>
+ <string name="visit_website_label">Odwiedź stronę</string>
+ <string name="download_all">Pobierz wszystko</string>
+ <string name="skip_episode_label">Pomiń odcinek</string>
+ <!--Download messages and labels-->
+ <string name="download_error_error_unknown">Nieznany błąd</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Błąd!</string>
+ <string name="playback_error_server_died">Serwer umarł</string>
+ <string name="playback_error_unknown">Nieznany błąd</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">Buforowanie</string>
+ <!--Queue operations-->
+ <string name="sort">Sortuj</string>
+ <string name="date">Data</string>
+ <string name="duration">Czas trwania</string>
+ <string name="ascending">Rosnąco</string>
+ <string name="descending">Malejąco</string>
+ <!--Flattr-->
+ <!--Flattr-->
+ <!--Variable Speed-->
+ <!--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>
+ <string name="pref_gpodnet_logout_toast">Wylogowano pomyślnie</string>
+ <!--Auto-Flattr dialog-->
+ <!--Search-->
+ <!--OPML import and export-->
+ <!--Sleep timer-->
+ <!--gpodder.net-->
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Wybrany folder</string>
+ <string name="create_folder_msg">Utworzyć nowy folder z nazwą \"%1$s\"?</string>
+ <string name="create_folder_error_already_exists">Folder już istnieje</string>
+ <string name="create_folder_error">Nie można utworzyć folderu</string>
+ <string name="folder_not_empty_dialog_title">Folder nie jest pusty</string>
+ <string name="set_to_default_folder">Wybierz domyślny folder</string>
+ <!--Online feed view-->
+ <!--Content descriptions for image buttons-->
+ <!--Feed information screen-->
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml
index f3fbc0623..ebea5f391 100644
--- a/core/src/main/res/values-pt/strings.xml
+++ b/core/src/main/res/values-pt/strings.xml
@@ -400,6 +400,7 @@
<string name="export_error_label">Erro de exportação</string>
<string name="opml_export_success_title">Exportação efetuada</string>
<string name="opml_export_success_sum">O ficheiro .opml foi guardado em:\u0020</string>
+ <string name="opml_import_ask_read_permission">Requer acesso ao armazenamento externo para ler o ficheiro OPML</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Definir temporizador</string>
<string name="disable_sleeptimer_label">Desativar temporizador</string>
@@ -458,6 +459,7 @@
<string name="create_folder_label">Criar pasta</string>
<string name="choose_data_directory">Escolha a pasta de dados</string>
<string name="choose_data_directory_message">Escolha a base da pasta de dados. O AntennaPod irá criar as subpastas apropriadas.</string>
+ <string name="choose_data_directory_permission_rationale">Para alterar a pasta de dados, tem que ter acesso ao armazenamento externo</string>
<string name="create_folder_msg">Criar uma pasta com o nome \"%1$s\"?</string>
<string name="create_folder_success">Nova pasta criada</string>
<string name="create_folder_error_no_write_access">Não é possível guardar nesta pasta</string>
@@ -500,6 +502,13 @@
<!--Feed information screen-->
<string name="authentication_label">Autenticação</string>
<string name="authentication_descr">Altere o seu nome de utilizador e palavra-passe para este podcast e seus episódios</string>
+ <string name="auto_download_settings_label">Definições de descarga automática</string>
+ <string name="episode_filters_label">Filtro de episódios</string>
+ <string name="episode_filters_description">Lista de termos utilizados para determinar se um episódio deve ser incluído ou excluído das descargas automáticas</string>
+ <string name="episode_filters_include">Incluir</string>
+ <string name="episode_filters_exclude">Excluir</string>
+ <string name="episode_filters_hint">Uma palavra\n\"Várias palavras\"</string>
+ <string name="keep_updated">Manter atualizada</string>
<!--Progress information-->
<string name="progress_upgrading_database">Atualizando base de dados</string>
<!--AntennaPodSP-->
@@ -519,6 +528,10 @@
<string name="selected_downloaded_label">Selecionar episódios descarregados</string>
<string name="not_downloaded_label">Não descarregados</string>
<string name="selected_not_downloaded_label">Selecionar episódios não descarregados</string>
+ <string name="queued_label">Na fila</string>
+ <string name="selected_queued_label">Episódios selecionados na fila</string>
+ <string name="not_queued_label">Não na fila</string>
+ <string name="selected_not_queued_label">Episódios não selecionados na fila</string>
<string name="sort_title"><b>Ordenar por…</b></string>
<string name="sort_title_a_z">Título (A \u2192 Z)</string>
<string name="sort_title_z_a">Título (Z \u2192 A)</string>
diff --git a/core/src/main/res/values-sv-rSE/strings.xml b/core/src/main/res/values-sv-rSE/strings.xml
index b91b030d6..7407b3474 100644
--- a/core/src/main/res/values-sv-rSE/strings.xml
+++ b/core/src/main/res/values-sv-rSE/strings.xml
@@ -400,6 +400,7 @@
<string name="export_error_label">Exporteringsfel</string>
<string name="opml_export_success_title">OPML Exportering lyckades.</string>
<string name="opml_export_success_sum">.opml filen skrevs till:\u0020</string>
+ <string name="opml_import_ask_read_permission">Tillgång till extern lagring krävs för att läsa OPML-filen</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Ställ in sömntimer</string>
<string name="disable_sleeptimer_label">Stäng av sömntimer</string>
@@ -458,6 +459,7 @@
<string name="create_folder_label">Skapa mapp</string>
<string name="choose_data_directory">Välj Datakatalog</string>
<string name="choose_data_directory_message">Välj rotkatalogen för din data. AntennaPod skapar de underkataloger som behövs.</string>
+ <string name="choose_data_directory_permission_rationale">Tillgång till extern lagring krävs för att byta datakatalogen</string>
<string name="create_folder_msg">Skapa ny mapp med namnet \"%1$s\"?</string>
<string name="create_folder_success">Skapade ny mapp</string>
<string name="create_folder_error_no_write_access">Kan inte skriva till den här mappen</string>
@@ -500,6 +502,13 @@
<!--Feed information screen-->
<string name="authentication_label">Autentisering</string>
<string name="authentication_descr">Byt ditt användarnamn och lösenord för den här podcasten och dess episoder.</string>
+ <string name="auto_download_settings_label">Automatisk nedladdningsinställningar</string>
+ <string name="episode_filters_label">Episodfilter</string>
+ <string name="episode_filters_description">Lista av termer som används för att avgöra om en episod ska inkluderas eller exkluderas vid automatisk nedladdning</string>
+ <string name="episode_filters_include">Inkludera</string>
+ <string name="episode_filters_exclude">Exkludera</string>
+ <string name="episode_filters_hint">Enstaka ord \n\"Flera ord\"</string>
+ <string name="keep_updated">Håll uppdaterad</string>
<!--Progress information-->
<string name="progress_upgrading_database">Uppgraderar databasen</string>
<!--AntennaPodSP-->
@@ -519,6 +528,10 @@
<string name="selected_downloaded_label">Valde nedladdade Episoder</string>
<string name="not_downloaded_label">Ej nedladdade</string>
<string name="selected_not_downloaded_label">Valde ej nedladdade Episoder</string>
+ <string name="queued_label">Köad</string>
+ <string name="selected_queued_label">Valde köade Episoder</string>
+ <string name="not_queued_label">Ej köad</string>
+ <string name="selected_not_queued_label">Välj ej köade Episoder</string>
<string name="sort_title"><b>Sortera efter…</b></string>
<string name="sort_title_a_z">Titel (A \u2192 Ö)</string>
<string name="sort_title_z_a">Titel (Ö \u2192 A)</string>
diff --git a/core/src/main/res/values-uk-rUA/strings.xml b/core/src/main/res/values-uk-rUA/strings.xml
index abc5fcec1..f0970a6cd 100644
--- a/core/src/main/res/values-uk-rUA/strings.xml
+++ b/core/src/main/res/values-uk-rUA/strings.xml
@@ -22,6 +22,9 @@
<string name="playback_history_label">Що грало</string>
<string name="gpodnet_main_label">gpodder.net</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>
<!--New episodes fragment-->
<string name="recently_published_episodes_label">Щойно опубліковано</string>
<string name="episode_filter_label">Показати тількі нові епізоди</string>
@@ -66,6 +69,7 @@
<string name="length_prefix">Довжина:\u0020</string>
<string name="size_prefix">Розмір:\u0020</string>
<string name="processing_label">Обробка</string>
+ <string name="loading_label">Завантажується…</string>
<string name="save_username_password_label">Зберегти ім\'я користувача та пароль</string>
<string name="close_label">Закрити</string>
<string name="retry_label">Повторити знову</string>
@@ -77,6 +81,7 @@
<string name="feed_auto_download_global">Для всіх</string>
<string name="feed_auto_download_always">Завжди</string>
<string name="feed_auto_download_never">Ніколи</string>
+ <string name="send_label">Відправити…</string>
<string name="episode_cleanup_never">Ніколи</string>
<string name="episode_cleanup_queue_removal">Якщо не в черзі</string>
<string name="episode_cleanup_after_listening">Після закінчення</string>
@@ -100,6 +105,7 @@
<string name="mark_all_seen_label">Позначити всі як переглянуті</string>
<string name="show_info_label">Інформація</string>
<string name="remove_feed_label">Видалити подкаст</string>
+ <string name="share_label">Поділитися…</string>
<string name="share_link_label">Поділитися URL сайту</string>
<string name="share_link_with_position_label">Поділитись посиланням на позицію</string>
<string name="share_feed_url_label">Поділитись посиланням на канал</string>
@@ -134,7 +140,9 @@
<string name="added_to_queue_label">Додано до черги</string>
<string name="remove_from_queue_label">Видалити з черги</string>
<string name="add_to_favorite_label">Додати до улюблених</string>
+ <string name="added_to_favorites">Додано до улюблених</string>
<string name="remove_from_favorite_label">Видалити з улюблених</string>
+ <string name="removed_from_favorites">Видалено з улюблених</string>
<string name="visit_website_label">Відкрити сайт</string>
<string name="support_label">Підтримати за допомогою Flattr</string>
<string name="enqueue_all_new">Додати до черги</string>
@@ -168,6 +176,11 @@
<string name="download_error_io_error">Помилка IO</string>
<string name="download_error_request_error">Помилка запиту</string>
<string name="download_error_db_access">Помилка бази даних</string>
+ <plurals name="downloads_left">
+ <item quantity="one">%d завантаження залишилось</item>
+ <item quantity="few">%d завантаження залишилось</item>
+ <item quantity="other">%d завантажень залишилось</item>
+ </plurals>
<string name="downloads_processing">Обробка завантаженого</string>
<string name="download_notification_title">Завантаження даних подкасту</string>
<string name="download_report_content">Завантажилось %1$d успішно, %2$d з помилками</string>
@@ -199,6 +212,8 @@
<!--Queue operations-->
<string name="lock_queue">Заблокувати чергу</string>
<string name="unlock_queue">Розблокувати чергу</string>
+ <string name="queue_locked">Чергу заблоковано</string>
+ <string name="queue_unlocked">Чергу разблоковано</string>
<string name="clear_queue_label">Очистити чергу</string>
<string name="undo">Скасувати</string>
<string name="removed_from_queue">Видалено</string>
@@ -240,11 +255,13 @@
<!--Variable Speed-->
<string name="download_plugin_label">Завантажити додаток</string>
<string name="no_playback_plugin_title">Додаток не встановлено</string>
+ <string name="no_playback_plugin_or_sonic_msg">Для програвання зі змінною швидкістю, ми радимо включити вбудований програвач Sonic [Android 4.1+].\n\nАбо ви можете завантажити додаток <i>Prestissimo</i> із Play Store.\nБудь які проблеми з Prestissimo не є відповідальністю розробників AntennaPod та мають вирішуватись авторами додатка.</string>
<string name="set_playback_speed_label">Швидкість програвання</string>
<string name="enable_sonic">Включити Sonic</string>
<!--Empty list labels-->
<string name="no_items_label">Нічого в цьому списку</string>
<string name="no_feeds_label">Немає підписаних каналів </string>
+ <string name="no_chapters_label">В цьому епізоді немає розділів.</string>
<!--Preferences-->
<string name="other_pref">Інше</string>
<string name="about_pref">Про програму</string>
@@ -252,9 +269,12 @@
<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>
<string name="pref_pauseOnDisconnect_sum">Зупинятись коли навушники або блютуз від’єднано</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Поновити відтворення коли навушники повторно під’єднано</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Поновити відтворення коли блютуз повторно під’єднано</string>
+ <string name="pref_hardwareForwardButtonSkips_title">Пропуск кнопкой перемотки</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">При натисканні апаратної кнопки перемотки перейти до наступного епізода замість перемотки.</string>
<string name="pref_followQueue_sum">Перейти до наступного епізода в черзі коли поточний закінчено</string>
<string name="pref_auto_delete_sum">Видалити епізод після повного відтворення</string>
<string name="pref_auto_delete_title">Автовидалення</string>
@@ -270,6 +290,8 @@
<string name="pref_autoUpdateIntervallOrTime_Disable">Вимкнути</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Інтервал</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Встановити час щодня</string>
+ <string name="pref_autoUpdateIntervallOrTime_every">кожні %1$s</string>
+ <string name="pref_autoUpdateIntervallOrTime_at">на %1$s</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Завантажувати тільки через Wifi</string>
<string name="pref_followQueue_title">Грати безперервно</string>
<string name="pref_downloadMediaOnWifiOnly_title">Завантаження через Wifi</string>
@@ -339,8 +361,13 @@
<string name="pref_smart_mark_as_played_disabled">Вимкнено</string>
<string name="pref_image_cache_size_title">Розмір кеша зображень</string>
<string name="pref_image_cache_size_sum">Розмір дискового кеша для зображень.</string>
+ <string name="crash_report_title">Звіт про збій</string>
+ <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>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Включити автоматичне заохочення авторів через сервіс flattr</string>
<string name="auto_flattr_after_percent">Заохотити автора через Flattr щойно %d відсотків епізода було відтворено</string>
@@ -367,12 +394,15 @@
<string name="opml_import_error_dir_empty">Директорія імпорту пуста</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="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>
<string name="disable_sleeptimer_label">Вимкнути засинання</string>
@@ -433,11 +463,16 @@
<string name="selected_folder_label">Обрати папку:</string>
<string name="create_folder_label">Нова папка</string>
<string name="choose_data_directory">Обрати папку</string>
+ <string name="choose_data_directory_message">Оберіть, будь ласка, базовий каталог для даних. AntennaPod створить відповідні підрозділи. </string>
+ <string name="choose_data_directory_permission_rationale">Для зміни папки зберігання даних потрібен доступ до зовнішнього носія</string>
<string name="create_folder_msg">Створити папку з ім\'ям \"%1$s\"?</string>
<string name="create_folder_success">Створена нова папка</string>
<string name="create_folder_error_no_write_access">Не можу записати в цю папку</string>
<string name="create_folder_error_already_exists">Папка вже існує</string>
<string name="create_folder_error">Не можу создати папку</string>
+ <string name="folder_does_not_exist_error">\"%1$s\" не існує</string>
+ <string name="folder_not_readable_error">\"%1$s\" недоступний до читання</string>
+ <string name="folder_not_writable_error">\"%1$s\" недоступний для запису</string>
<string name="folder_not_empty_dialog_title">Папка не є пустою</string>
<string name="folder_not_empty_dialog_msg">В папці щось є. Всі завантаження зберігаються в цю папку. Все рівно продовжувати?</string>
<string name="set_to_default_folder">Обрати папку по замовчанню</string>
@@ -449,6 +484,7 @@
<!--Online feed view-->
<string name="subscribe_label">Підписатися</string>
<string name="subscribed_label">Підписано</string>
+ <string name="downloading_label">Завантажується…</string>
<!--Content descriptions for image buttons-->
<string name="show_chapters_label">Показати глави</string>
<string name="show_shownotes_label">Показати нотатки</string>
@@ -471,11 +507,20 @@
<!--Feed information screen-->
<string name="authentication_label">Автентикація</string>
<string name="authentication_descr">Змінити ваші логін та пароль для подкаста та епізодів</string>
+ <string name="auto_download_settings_label">Налаштування автозавантаження</string>
+ <string name="episode_filters_label">Фільтр епізодів</string>
+ <string name="episode_filters_description">Перелік термінів що використовуються для вирішення чи завантажувати епізод автоматично</string>
+ <string name="episode_filters_include">Включити</string>
+ <string name="episode_filters_exclude">Вилучити</string>
+ <string name="episode_filters_hint">Окремі слова \n\"Слова Разом\"</string>
+ <string name="keep_updated">Підтримувати оновленим</string>
<!--Progress information-->
<string name="progress_upgrading_database">Оновлення бази даних</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Імпорт подкастів з інших програм...</string>
<string name="search_itunes_label">Пошук в iTunes</string>
+ <string name="select_label"><b>Обрати…</b></string>
+ <string name="filter">Фільтр</string>
<string name="all_label">Всі</string>
<string name="selected_all_label">Обрано всі епізоди</string>
<string name="none_label">Жодного</string>
@@ -488,6 +533,11 @@
<string name="selected_downloaded_label">Обрано завантажені епізоди</string>
<string name="not_downloaded_label">Незавантажені</string>
<string name="selected_not_downloaded_label">Обрано незавантажені епізоди</string>
+ <string name="queued_label">В черзі</string>
+ <string name="selected_queued_label">Обрано епізоди що в черзі</string>
+ <string name="not_queued_label">Не в черзі</string>
+ <string name="selected_not_queued_label">Обрано епізоди що не в черзі</string>
+ <string name="sort_title"><b>Сортувати за…</b></string>
<string name="sort_title_a_z">Назва (А \u2192 Я)</string>
<string name="sort_title_z_a">Назва (Я \u2192 А)</string>
<string name="sort_date_new_old">Дата (Нові \u2192 Старі)</string>
@@ -495,5 +545,18 @@
<string name="sort_duration_short_long">Тривалість (Короткі \u2192 Довгі)</string>
<string name="sort_duration_long_short">Тривалість (Довгі \u2192 Короткі)</string>
<!--Rating dialog-->
+ <string name="rating_title">Оцінити AntennaPod?</string>
+ <string name="rating_message">Ми будемо вдячні якщо ви поставите свою оцінку AntennaPod.</string>
+ <string name="rating_never_label">Не зараз</string>
+ <string name="rating_later_label">Нагадати згодом</string>
+ <string name="rating_now_label">Звичайно, з задоволенням!</string>
<!--Audio controls-->
+ <string name="audio_controls">Керування звуком</string>
+ <string name="playback_speed">Швидкість програвання</string>
+ <string name="volume">Гучність</string>
+ <string name="left_short">Л</string>
+ <string name="right_short">П</string>
+ <string name="audio_effects">Аудіоефекти</string>
+ <string name="stereo_to_mono">Зробити моно із стерео</string>
+ <string name="sonic_only">Тільки Sonic</string>
</resources>
diff --git a/core/src/main/res/values-vi-rVN/strings.xml b/core/src/main/res/values-vi-rVN/strings.xml
new file mode 100644
index 000000000..c0e5d73d3
--- /dev/null
+++ b/core/src/main/res/values-vi-rVN/strings.xml
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <!--'Add Feed' Activity labels-->
+ <!--Actions on feeds-->
+ <!--actions on feeditems-->
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values-vi/strings.xml b/core/src/main/res/values-vi/strings.xml
new file mode 100644
index 000000000..f16823f84
--- /dev/null
+++ b/core/src/main/res/values-vi/strings.xml
@@ -0,0 +1,60 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="feeds_label">Các feed</string>
+ <string name="new_label">Tạo mới</string>
+ <string name="settings_label">Thiết lập</string>
+ <string name="downloads_label">Tải về</string>
+ <!--New episodes fragment-->
+ <!--Main activity-->
+ <!--Webview actions-->
+ <!--Playback history-->
+ <!--Other-->
+ <string name="confirm_label">Xác nhận</string>
+ <string name="cancel_label">Hủy bỏ</string>
+ <string name="author_label">Tác giả</string>
+ <string name="language_label">Ngôn ngữ</string>
+ <string name="error_label">Lỗi</string>
+ <string name="refresh_label">Cập nhật lại</string>
+ <string name="external_storage_error_msg">Hiện không có thiết bị lưu trữ gắn ngoài nào. Hãy chắc rằng bạn đã kết nối máy của mình với thiết bị lưu trữ gắn ngoài để ứng dụng có thể được hoạt động trơn tru.</string>
+ <string name="chapters_label">Chương</string>
+ <string name="shownotes_label">Hiển thị ghi chú</string>
+ <string name="episodes_suffix">\u0020tập</string>
+ <string name="length_prefix">Độ dài:\u0020</string>
+ <string name="size_prefix">Kích thước:\u0020</string>
+ <string name="processing_label">Đang xử lý</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">Đường dẫn liên kết feed</string>
+ <!--Actions on feeds-->
+ <string name="show_info_label">Hiển thị thông ti</string>
+ <string name="feed_delete_confirmation_msg">Xin vui lòng xác nhận rằng bạn muốn xóa feed này và toàn bộ các phần khác của feed này mà bạn đã tải về.</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Tải về</string>
+ <string name="play_label">Phát</string>
+ <string name="stream_label">Phân luồng</string>
+ <string name="remove_label">Loại bỏ</string>
+ <string name="add_to_queue_label">Thêm vào hàng đợi</string>
+ <string name="remove_from_queue_label">Loại bỏ khỏi hàng đợi</string>
+ <string name="visit_website_label">Truy cập website</string>
+ <!--Download messages and labels-->
+ <!--Mediaplayer messages-->
+ <!--Queue operations-->
+ <!--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-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+</resources>
diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml
index 48f8ae12b..c3ee4d3e2 100644
--- a/core/src/main/res/values/attrs.xml
+++ b/core/src/main/res/values/attrs.xml
@@ -19,8 +19,6 @@
<attr name="navigation_expand" format="reference"/>
<attr name="navigation_refresh" format="reference"/>
<attr name="navigation_up" format="reference"/>
- <attr name="navigation_shownotes" format="reference"/>
- <attr name="navigation_chapters" format="reference"/>
<attr name="social_share" format="reference"/>
<attr name="stat_playlist" format="reference"/>
<attr name="ic_folder" format="reference"/>
@@ -30,7 +28,6 @@
<attr name="overlay_drawable" format="reference"/>
<attr name="dragview_background" format="reference"/>
<attr name="dragview_float_background" format="reference"/>
- <attr name="ic_action_overflow" format="reference"/>
<attr name="ic_new" format="reference"/>
<attr name="ic_history" format="reference"/>
<attr name="av_play_big" format="reference"/>
@@ -51,6 +48,8 @@
<attr name="ic_check_box_outline" format="reference"/>
<attr name="ic_indeterminate_check_box" format="reference"/>
<attr name="ic_sort" format="reference"/>
+ <attr name="ic_sd_storage" format="reference"/>
+ <attr name="ic_create_new_folder" format="reference"/>
<!-- Used in itemdescription -->
<attr name="non_transparent_background" format="reference"/>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index 37ccbb80b..8d0ef56d9 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -6,6 +6,7 @@
<!-- Activitiy and fragment titles -->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Feeds</string>
+ <string name="statistics_label">Statistics</string>
<string name="add_feed_label">Add Podcast</string>
<string name="podcasts_label">PODCASTS</string>
<string name="episodes_label">Episodes</string>
@@ -34,6 +35,10 @@
<string name="recently_published_episodes_label">Recently published</string>
<string name="episode_filter_label">Show only new Episodes</string>
+ <!-- Statistics fragment -->
+ <string name="total_time_listened_to_podcasts">Total time of podcasts played:</string>
+ <string name="statistics_details_dialog">%1$d out of %2$d episodes started.\n\nPlayed %3$s out of %4$s.</string>
+
<!-- Main activity -->
<string name="drawer_open">Open menu</string>
<string name="drawer_close">Close menu</string>
@@ -135,6 +140,7 @@
<string name="hide_not_downloaded_episodes_label">Not downloaded</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>
<!-- actions on feeditems -->
<string name="download_label">Download</string>
@@ -179,6 +185,7 @@
<string name="download_error_connection_error">Connection Error</string>
<string name="download_error_unknown_host">Unknown Host</string>
<string name="download_error_unauthorized">Authentication Error</string>
+ <string name="download_error_file_type_type">File Type Error</string>
<string name="cancel_all_downloads_label">Cancel all downloads</string>
<string name="download_canceled_msg">Download canceled</string>
<string name="download_canceled_autodownload_enabled_msg">Download canceled\nDisabled <i>Auto Download</i> for this item</string>
@@ -279,8 +286,12 @@
<string name="no_items_label">There are no items in this list.</string>
<string name="no_feeds_label">You haven\'t subscribed to any feeds yet.</string>
<string name="no_chapters_label">This episode has no chapters.</string>
+ <string name="no_shownotes_label">This episode has no shownotes.</string>
+
<!-- Preferences -->
+ <string name="storage_pref">Storage</string>
+ <string name="project_pref">Project</string>
<string name="other_pref">Other</string>
<string name="about_pref">About</string>
<string name="queue_label">Queue</string>
@@ -359,6 +370,10 @@
<string name="pref_gpodnet_logout_toast">Logout was successful</string>
<string name="pref_gpodnet_setlogin_information_title">Change login information</string>
<string name="pref_gpodnet_setlogin_information_sum">Change the login information for your gpodder.net account.</string>
+ <string name="pref_gpodnet_sync_title">Sync now</string>
+ <string name="pref_gpodnet_sync_sum">Sync subscriptions and episode states with gpodder.net</string>
+ <string name="pref_gpodnet_sync_started">Sync started</string>
+ <string name="pref_gpodnet_login_status"><![CDATA[Logged in as <i>%1$s</i> with device <i>%2$s</i>]]></string>
<string name="pref_playback_speed_title">Playback Speeds</string>
<string name="pref_playback_speed_sum">Customize the speeds available for variable speed audio playback</string>
<string name="pref_fast_forward">Fast forward time</string>
@@ -369,6 +384,8 @@
<string name="pref_expandNotify_sum">Always expand 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_show_subscriptions_in_drawer_title">Show subscriptions</string>
+ <string name="pref_show_subscriptions_in_drawer_sum">Show subscription list directly in navigation drawer</string>
<string name="pref_lockscreen_background_title">Set Lockscreen Background</string>
<string name="pref_lockscreen_background_sum">Set the lockscreen background to the current episode\'s image. As a side effect, this will also show the image in third party apps.</string>
<string name="pref_showDownloadReport_title">Show Download Report</string>
@@ -386,6 +403,11 @@
<string name="pref_sonic_title">Sonic media player</string>
<string name="pref_sonic_message">Use built-in sonic media player as a replacement for Android\'s native mediaplayer and Prestissimo</string>
<string name="pref_current_value">Current value: %1$s</string>
+ <string name="pref_proxy_title">Proxy</string>
+ <string name="pref_proxy_sum">Set a network proxy</string>
+ <string name="pref_faq">FAQ</string>
+ <string name="pref_known_issues">Known issues</string>
+ <string name="pref_no_browser_found">No web browser found.</string>
<!-- Auto-Flattr dialog -->
<string name="auto_flattr_enable">Enable automatic flattring</string>
@@ -410,8 +432,8 @@
<string name="opml_import_label">OPML Import</string>
<string name="opml_directory_error">ERROR!</string>
<string name="reading_opml_label">Reading OPML file</string>
- <string name="opml_reader_error">An error has occurred while reading the opml document:</string>
- <string name="opml_import_error_dir_empty">The import directory is empty.</string>
+ <string name="opml_reader_error">An error has occurred while reading the OPML document:</string>
+ <string name="opml_import_error_no_file">No file selected!</string>
<string name="select_all_label">Select all</string>
<string name="deselect_all_label">Deselect all</string>
<string name="select_options_label">Select&#8230;</string>
@@ -422,6 +444,7 @@
<string name="export_error_label">Export error</string>
<string name="opml_export_success_title">OPML Export successful.</string>
<string name="opml_export_success_sum">The .opml file was written to:\u0020</string>
+ <string name="opml_import_ask_read_permission">Access to external storage is required to read the OPML file</string>
<!-- Sleep timer -->
<string name="set_sleeptimer_label">Set sleep timer</string>
@@ -485,6 +508,7 @@
<string name="create_folder_label">Create folder</string>
<string name="choose_data_directory">Choose Data Folder</string>
<string name="choose_data_directory_message">Please choose the base of your data folder. AntennaPod will create the appropriate sub-directories.</string>
+ <string name="choose_data_directory_permission_rationale">Access to external storage is required to change the data folder</string>
<string name="create_folder_msg">Create new folder with name "%1$s"?</string>
<string name="create_folder_success">Created new folder</string>
<string name="create_folder_error_no_write_access">Cannot write to this folder</string>
@@ -561,6 +585,10 @@
<string name="selected_downloaded_label">Selected downloaded Episodes</string>
<string name="not_downloaded_label">Not downloaded</string>
<string name="selected_not_downloaded_label">Selected not downloaded Episodes</string>
+ <string name="queued_label">Queued</string>
+ <string name="selected_queued_label">Selected queued Episodes</string>
+ <string name="not_queued_label">Not queued</string>
+ <string name="selected_not_queued_label">Selected not queued Episodes</string>
<string name="sort_title"><b>Sort by&#8230;</b></string>
<string name="sort_title_a_z">Title (A \u2192 Z)</string>
<string name="sort_title_z_a">Title (Z \u2192 A)</string>
@@ -586,4 +614,17 @@
<string name="stereo_to_mono">Downmix: Stereo to mono</string>
<string name="sonic_only">Sonic only</string>
+ <!-- proxy settings -->
+ <string name="proxy_type_label">Type</string>
+ <string name="host_label">Host</string>
+ <string name="port_label">Port</string>
+ <string name="optional_hint">(Optional)</string>
+ <string name="proxy_test_label">Test</string>
+ <string name="proxy_checking">Checking&#8230;</string>
+ <string name="proxy_test_successful">Test successful</string>
+ <string name="proxy_test_failed">Test failed</string>
+ <string name="proxy_host_empty_error">Host must not be empty</string>
+ <string name="proxy_host_invalid_error">Host not valid IP address or domain</string>
+ <string name="proxy_port_invalid_error">Port not valid</string>
+
</resources>
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index eb2b6e12e..f7775a0bf 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -25,8 +25,6 @@
<item name="attr/navigation_expand">@drawable/ic_expand_more_grey600_36dp</item>
<item name="attr/navigation_refresh">@drawable/ic_refresh_grey600_24dp</item>
<item name="attr/navigation_up">@drawable/navigation_up</item>
- <item name="attr/navigation_shownotes">@drawable/ic_description_grey600_36dp</item>
- <item name="attr/navigation_chapters">@drawable/ic_toc_grey600_36dp</item>
<item name="attr/social_share">@drawable/ic_share_grey600_24dp</item>
<item name="attr/stat_playlist">@drawable/ic_list_grey600_24dp</item>
<item name="attr/type_audio">@drawable/ic_hearing_grey600_18dp</item>
@@ -37,7 +35,6 @@
<item name="attr/dragview_background">@drawable/ic_drag_vertical_grey600_48dp</item>
<item name="attr/dragview_float_background">@color/white</item>
<item name="attr/nav_drawer_background">@color/white</item>
- <item name="attr/ic_action_overflow">@drawable/ic_more_vert_grey600_24dp</item>
<item name="attr/ic_new">@drawable/ic_new_releases_grey600_24dp</item>
<item name="attr/ic_history">@drawable/ic_history_grey600_24dp</item>
<item name="attr/ic_folder">@drawable/ic_folder_grey600_24dp</item>
@@ -58,10 +55,13 @@
<item name="attr/ic_check_box_outline">@drawable/ic_check_box_outline_blank_grey600_24dp</item>
<item name="attr/ic_indeterminate_check_box">@drawable/ic_indeterminate_check_box_grey600_24dp</item>
<item name="attr/ic_sort">@drawable/ic_sort_grey600_24dp</item>
+ <item name="attr/ic_sd_storage">@drawable/ic_sd_storage_grey600_36dp</item>
+ <item name="attr/ic_create_new_folder">@drawable/ic_create_new_folder_grey600_24dp</item>
</style>
<style name="Theme.AntennaPod.Dark" parent="Theme.AppCompat">
<item name="colorAccent">@color/holo_blue_dark</item>
+ <item name="colorControlNormal">@color/white</item>
<item name="buttonStyle">@style/Widget.AntennaPod.Button</item>
<item name="progressBarTheme">@style/ProgressBarDark</item>
<item name="alertDialogTheme">@style/AntennaPod.Dialog.Dark</item>
@@ -83,8 +83,6 @@
<item name="attr/navigation_expand">@drawable/ic_expand_more_white_36dp</item>
<item name="attr/navigation_refresh">@drawable/ic_refresh_white_24dp</item>
<item name="attr/navigation_up">@drawable/navigation_up_dark</item>
- <item name="attr/navigation_shownotes">@drawable/ic_description_white_36dp</item>
- <item name="attr/navigation_chapters">@drawable/ic_toc_white_36dp</item>
<item name="attr/social_share">@drawable/ic_share_white_24dp</item>
<item name="attr/stat_playlist">@drawable/ic_list_white_24dp</item>
<item name="attr/type_audio">@drawable/ic_hearing_white_18dp</item>
@@ -95,7 +93,6 @@
<item name="attr/dragview_background">@drawable/ic_drag_vertical_white_48dp</item>
<item name="attr/dragview_float_background">@color/black</item>
<item name="attr/nav_drawer_background">#3B3B3B</item>
- <item name="attr/ic_action_overflow">@drawable/ic_more_vert_white_24dp</item>
<item name="attr/ic_new">@drawable/ic_new_releases_white_24dp</item>
<item name="attr/ic_history">@drawable/ic_history_white_24dp</item>
<item name="attr/ic_folder">@drawable/ic_folder_white_24dp</item>
@@ -116,6 +113,8 @@
<item name="attr/ic_check_box_outline">@drawable/ic_check_box_outline_blank_white_24dp</item>
<item name="attr/ic_indeterminate_check_box">@drawable/ic_indeterminate_check_box_white_24dp</item>
<item name="attr/ic_sort">@drawable/ic_sort_white_24dp</item>
+ <item name="attr/ic_sd_storage">@drawable/ic_sd_storage_white_36dp</item>
+ <item name="attr/ic_create_new_folder">@drawable/ic_create_new_folder_white_24dp</item>
</style>
<style name="Theme.AntennaPod.Light.NoTitle" parent="Theme.AppCompat.Light.NoActionBar">
@@ -143,8 +142,6 @@
<item name="attr/navigation_expand">@drawable/ic_expand_more_grey600_36dp</item>
<item name="attr/navigation_refresh">@drawable/ic_refresh_grey600_24dp</item>
<item name="attr/navigation_up">@drawable/navigation_up</item>
- <item name="attr/navigation_shownotes">@drawable/ic_description_grey600_36dp</item>
- <item name="attr/navigation_chapters">@drawable/ic_toc_grey600_36dp</item>
<item name="attr/social_share">@drawable/ic_share_grey600_24dp</item>
<item name="attr/stat_playlist">@drawable/ic_list_grey600_24dp</item>
<item name="attr/type_audio">@drawable/ic_hearing_grey600_18dp</item>
@@ -155,7 +152,6 @@
<item name="attr/dragview_background">@drawable/ic_drag_vertical_grey600_48dp</item>
<item name="attr/dragview_float_background">@color/white</item>
<item name="attr/nav_drawer_background">@color/white</item>
- <item name="attr/ic_action_overflow">@drawable/ic_more_vert_grey600_24dp</item>
<item name="attr/ic_new">@drawable/ic_new_releases_grey600_24dp</item>
<item name="attr/ic_history">@drawable/ic_history_grey600_24dp</item>
<item name="attr/ic_folder">@drawable/ic_folder_grey600_24dp</item>
@@ -176,6 +172,8 @@
<item name="attr/ic_check_box_outline">@drawable/ic_check_box_outline_blank_grey600_24dp</item>
<item name="attr/ic_indeterminate_check_box">@drawable/ic_indeterminate_check_box_grey600_24dp</item>
<item name="attr/ic_sort">@drawable/ic_sort_grey600_24dp</item>
+ <item name="attr/ic_sd_storage">@drawable/ic_sd_storage_grey600_36dp</item>
+ <item name="attr/ic_create_new_folder">@drawable/ic_create_new_folder_grey600_24dp</item>
</style>
<style name="Theme.AntennaPod.Dark.NoTitle" parent="Theme.AppCompat.NoActionBar">
@@ -183,6 +181,7 @@
<item name="windowActionModeOverlay">true</item>
<item name="progressBarTheme">@style/ProgressBarDark</item>
<item name="colorAccent">@color/holo_blue_dark</item>
+ <item name="colorControlNormal">@color/white</item>
<item name="buttonStyle">@style/Widget.AntennaPod.Button</item>
<item name="alertDialogTheme">@style/AntennaPod.Dialog.Dark</item>
<item name="attr/action_about">@drawable/ic_info_white_24dp</item>
@@ -202,8 +201,6 @@
<item name="attr/navigation_expand">@drawable/ic_expand_more_white_36dp</item>
<item name="attr/navigation_refresh">@drawable/ic_refresh_white_24dp</item>
<item name="attr/navigation_up">@drawable/navigation_up_dark</item>
- <item name="attr/navigation_shownotes">@drawable/ic_description_white_36dp</item>
- <item name="attr/navigation_chapters">@drawable/ic_toc_white_36dp</item>
<item name="attr/social_share">@drawable/ic_share_white_24dp</item>
<item name="attr/stat_playlist">@drawable/ic_list_white_24dp</item>
<item name="attr/type_audio">@drawable/ic_hearing_white_18dp</item>
@@ -214,7 +211,6 @@
<item name="attr/dragview_background">@drawable/ic_drag_vertical_white_48dp</item>
<item name="attr/dragview_float_background">@color/black</item>
<item name="attr/nav_drawer_background">#3B3B3B</item>
- <item name="attr/ic_action_overflow">@drawable/ic_more_vert_white_24dp</item>
<item name="attr/ic_new">@drawable/ic_new_releases_white_24dp</item>
<item name="attr/ic_history">@drawable/ic_history_white_24dp</item>
<item name="attr/ic_folder">@drawable/ic_folder_white_24dp</item>
@@ -235,6 +231,8 @@
<item name="attr/ic_check_box_outline">@drawable/ic_check_box_outline_blank_white_24dp</item>
<item name="attr/ic_indeterminate_check_box">@drawable/ic_indeterminate_check_box_white_24dp</item>
<item name="attr/ic_sort">@drawable/ic_sort_white_24dp</item>
+ <item name="attr/ic_sd_storage">@drawable/ic_sd_storage_white_36dp</item>
+ <item name="attr/ic_create_new_folder">@drawable/ic_create_new_folder_white_24dp</item>
</style>
<style name="Theme.AntennaPod.VideoPlayer" parent="@style/Theme.AntennaPod.Dark">