summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2014-10-09 21:29:30 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2014-10-09 21:29:30 +0200
commitbaa7d5f11283cb7668d45b561af5d38f0ccb9632 (patch)
tree21cb976e8f2a948dae44bc014fb2c6ed62f81157
parenta8bf235017d5896c0691ad056727dafc72c63596 (diff)
parent4d622cb27ab54dc081d81285128b9c70f8dd37ac (diff)
downloadAntennaPod-baa7d5f11283cb7668d45b561af5d38f0ccb9632.zip
Merge branch 'develop'0.9.9.4
-rw-r--r--AndroidManifest.xml9
-rw-r--r--CHANGELOG.md6
-rw-r--r--README.md11
-rw-r--r--assets/LICENSE_FFMPEGMEDIAMETADATARETRIEVER.txt16
-rw-r--r--assets/about.html3
-rw-r--r--build.gradle23
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin51106 -> 51017 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties4
-rw-r--r--pom.xml2
-rw-r--r--res/layout/feeditem_dialog.xml3
-rw-r--r--res/values-ca/strings.xml2
-rw-r--r--res/values-cs-rCZ/strings.xml107
-rw-r--r--res/values-da/strings.xml20
-rw-r--r--res/values-de/strings.xml10
-rw-r--r--res/values-es/strings.xml38
-rw-r--r--res/values-fr/strings.xml9
-rw-r--r--res/values-hi-rIN/strings.xml14
-rw-r--r--res/values-it-rIT/strings.xml2
-rw-r--r--res/values-iw-rIL/strings.xml2
-rw-r--r--res/values-ko/strings.xml48
-rw-r--r--res/values-nl/strings.xml2
-rw-r--r--res/values-pl-rPL/strings.xml10
-rw-r--r--res/values-pt-rBR/strings.xml2
-rw-r--r--res/values-pt/strings.xml8
-rw-r--r--res/values-ro-rRO/strings.xml1
-rw-r--r--res/values-ru/strings.xml5
-rw-r--r--res/values-sv-rSE/strings.xml6
-rw-r--r--res/values-uk-rUA/strings.xml24
-rw-r--r--res/values-zh-rCN/strings.xml5
-rw-r--r--res/values/arrays.xml8
-rw-r--r--res/values/strings.xml6
-rw-r--r--res/xml/preferences.xml12
-rw-r--r--src/com/aocate/media/ServiceBackedMediaPlayer.java33
-rw-r--r--src/de/danoeh/antennapod/AppConfig.java2
-rw-r--r--src/de/danoeh/antennapod/activity/AudioplayerActivity.java3
-rw-r--r--src/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java5
-rw-r--r--src/de/danoeh/antennapod/activity/FeedInfoActivity.java1
-rw-r--r--src/de/danoeh/antennapod/activity/MediaplayerActivity.java14
-rw-r--r--src/de/danoeh/antennapod/activity/PreferenceActivity.java23
-rw-r--r--src/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java6
-rw-r--r--src/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java2
-rw-r--r--src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java2
-rw-r--r--src/de/danoeh/antennapod/adapter/NavListAdapter.java5
-rw-r--r--src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java4
-rw-r--r--src/de/danoeh/antennapod/adapter/QueueListAdapter.java5
-rw-r--r--src/de/danoeh/antennapod/adapter/SearchlistAdapter.java6
-rw-r--r--src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java14
-rw-r--r--src/de/danoeh/antennapod/asynctask/PicassoImageResource.java12
-rw-r--r--src/de/danoeh/antennapod/asynctask/PicassoProvider.java13
-rw-r--r--src/de/danoeh/antennapod/dialog/FeedItemDialog.java6
-rw-r--r--src/de/danoeh/antennapod/feed/FeedComponent.java82
-rw-r--r--src/de/danoeh/antennapod/feed/FeedMedia.java18
-rw-r--r--src/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java3
-rw-r--r--src/de/danoeh/antennapod/fragment/ItemlistFragment.java3
-rw-r--r--src/de/danoeh/antennapod/fragment/SearchFragment.java2
-rw-r--r--src/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java8
-rw-r--r--src/de/danoeh/antennapod/preferences/UserPreferences.java32
-rw-r--r--src/de/danoeh/antennapod/service/playback/PlaybackService.java62
-rw-r--r--src/de/danoeh/antennapod/service/playback/PlaybackServiceMediaPlayer.java2
-rw-r--r--src/de/danoeh/antennapod/service/playback/PlayerWidgetService.java27
-rw-r--r--src/de/danoeh/antennapod/storage/DownloadRequester.java42
-rw-r--r--src/de/danoeh/antennapod/syndication/namespace/NSSimpleChapters.java21
-rw-r--r--src/de/danoeh/antennapod/syndication/util/SyndDateUtils.java254
-rw-r--r--src/de/danoeh/antennapod/util/ChapterUtils.java469
-rw-r--r--src/de/danoeh/antennapod/util/URLChecker.java21
-rw-r--r--src/de/danoeh/antennapod/util/flattr/FlattrUtils.java4
-rw-r--r--src/instrumentationTest/de/test/antennapod/util/URLCheckerTest.java20
m---------submodules/dslv0
68 files changed, 1069 insertions, 575 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 65eac99ea..ee87cc8b5 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,17 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.danoeh.antennapod"
- android:versionCode="40"
- android:versionName="0.9.9.3">
+ android:versionCode="41"
+ android:versionName="0.9.9.4">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
- <uses-sdk
- android:minSdkVersion="10"
- android:targetSdkVersion="19"/>
-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<supports-screens
@@ -297,6 +293,7 @@
<data android:scheme="itpc"/>
<data android:scheme="pcast"/>
<data android:scheme="feed"/>
+ <data android:scheme="antennapod-subscribe"/>
</intent-filter>
<intent-filter>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2508edf49..75b9d9e2f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
Change Log
==========
+Version 0.9.9.4
+---------------
+* Added option to keep notification and lockscreen controls when playback is paused
+* Fixed a bug where episode images were not loaded correctly
+* Fixed battery usage problems
+
Version 0.9.9.3
---------------
* Fixed video playback problems
diff --git a/README.md b/README.md
index b4a74b4f4..503f46717 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,8 @@
This is the official repository of AntennaPod, a podcast manager for Android.
-
-<a href="https://play.google.com/store/apps/details?id=de.danoeh.antennapod" alt="Download from Google Play">
- <img src="http://www.android.com/images/brand/android_app_on_play_large.png">
-</a>
-[AntennaPod on fdroid.org](http://f-droid.org/repository/browse/?fdcategory=Multimedia&fdid=de.danoeh.antennapod&fdpage=1)
+[![Download from Google Play](http://www.android.com/images/brand/android_app_on_play_large.png "Download from Google Play")](https://play.google.com/store/apps/details?id=de.danoeh.antennapod)
+[![AntennaPod on fdroid.org](https://camo.githubusercontent.com/7df0eafa4433fa4919a56f87c3d99cf81b68d01c/68747470733a2f2f662d64726f69642e6f72672f77696b692f696d616765732f632f63342f462d44726f69642d627574746f6e5f617661696c61626c652d6f6e2e706e67 "Download from fdroid.org")](http://f-droid.org/repository/browse/?fdcategory=Multimedia&fdid=de.danoeh.antennapod&fdpage=1)
## Feedback
You can use the [AntennaPod Google Group](https://groups.google.com/forum/#!forum/antennapod) for discussions about the app.
@@ -36,5 +33,7 @@ Information on how to build AntennaPod can be found in the [Wiki](https://github
[![Flattr Button](http://api.flattr.com/button/button-static-50x60.png "Flattr This!")](https://flattr.com/thing/745609/Antennapod "AntennaPod")
-Bitcoin donations can be sent to this address: <pre>1DzvtuvdW8VhDsq9GUytMyALmsHeaHEKbg</pre>
+![Donate Bitcoin](https://en.bitcoin.it/w/images/en/7/74/BC_Rnd_64px.png)
+Bitcoin address: `1DzvtuvdW8VhDsq9GUytMyALmsHeaHEKbg`
+[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=370084)](https://www.bountysource.com/trackers/370084-antennapod?utm_source=370084&utm_medium=shield&utm_campaign=TRACKER_BADGE)
diff --git a/assets/LICENSE_FFMPEGMEDIAMETADATARETRIEVER.txt b/assets/LICENSE_FFMPEGMEDIAMETADATARETRIEVER.txt
new file mode 100644
index 000000000..fcaf80557
--- /dev/null
+++ b/assets/LICENSE_FFMPEGMEDIAMETADATARETRIEVER.txt
@@ -0,0 +1,16 @@
+FFmpegMediaMetadataRetriever: A unified interface for retrieving frame
+and meta data from an input media file.
+
+Copyright 2014 William Seemann
+
+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.
diff --git a/assets/about.html b/assets/about.html
index 8b8746add..115a0a5c9 100644
--- a/assets/about.html
+++ b/assets/about.html
@@ -41,7 +41,7 @@
<div id="header" align="center">
<img src="logo.png" alt="Logo" width="100px" height="100px"/>
- <p>AntennaPod, Version 0.9.9.3</p>
+ <p>AntennaPod, Version 0.9.9.4</p>
<p>Copyright © 2014 Daniel Oeh</p>
@@ -79,4 +79,5 @@ licensed under the Apache 2.0 license <a href="LICENSE_OKHTTP.txt">(View)</a>
<h2>Okio <a href="https://github.com/square/okio">(Link)</a></h2>
licensed under the Apache 2.0 license <a href="LICENSE_OKIO.txt">(View)</a>
+
</html>
diff --git a/build.gradle b/build.gradle
index 441b17385..673eff508 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,7 +3,7 @@ buildscript {
mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:0.12.+'
+ classpath 'com.android.tools.build:gradle:0.13.2'
}
}
apply plugin: 'com.android.application'
@@ -17,10 +17,10 @@ dependencies {
println "Creating libs directory"
libsdir.mkdir()
}
- compile 'com.android.support:support-v4:19.1.+'
- compile 'com.android.support:appcompat-v7:19.1.+'
+ compile 'com.android.support:support-v4:20.0.0'
+ compile 'com.android.support:appcompat-v7:20.0.0'
compile 'org.apache.commons:commons-lang3:3.3.2'
- compile ('org.shredzone.flattr4j:flattr4j-core:2.10') {
+ compile ('org.shredzone.flattr4j:flattr4j-core:2.11') {
exclude group: 'org.apache.httpcomponents', module: 'httpcore'
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
exclude group: 'org.json', module: 'json'
@@ -33,20 +33,20 @@ dependencies {
compile ("com.doomonafireball.betterpickers:library:1.5.2") {
exclude group: 'com.android.support', module: 'support-v4'
}
- compile 'org.jsoup:jsoup:1.7.3'
- compile 'com.squareup.picasso:picasso:2.3.+'
- compile 'com.squareup.okhttp:okhttp:2.0.+'
+ compile 'org.jsoup:jsoup:1.8.1'
+ compile 'com.squareup.picasso:picasso:2.3.4'
+ compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
- compile 'com.squareup.okio:okio:1.0.0'
+ compile 'com.squareup.okio:okio:1.0.1'
}
android {
- compileSdkVersion 19
+ compileSdkVersion 20
buildToolsVersion "20.0"
defaultConfig {
minSdkVersion 10
- targetSdkVersion 19
+ targetSdkVersion 20
testApplicationId "de.test.antennapod"
testInstrumentationRunner "instrumentationTest.de.test.antennapod.AntennaPodTestRunner"
}
@@ -85,6 +85,7 @@ android {
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
+ jniLibs.srcDirs = ['jniLibs']
}
}
@@ -125,5 +126,5 @@ android {
}
task wrapper(type: Wrapper) {
- gradleVersion = '1.12'
+ gradleVersion = '2.1'
}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 3c7abdf12..3d0dee6e8 100644
--- a/gradle/wrapper/gradle-wrapper.jar
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index b83aa49f2..6c3897a9c 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun May 18 21:50:42 CEST 2014
+#Sun Sep 28 21:26:43 CEST 2014
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
diff --git a/pom.xml b/pom.xml
index 81e223b10..c90a33f1c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
<groupId>de.danoeh</groupId>
<artifactId>antennapod</artifactId>
<packaging>apk</packaging>
- <version>0.9.9.3</version>
+ <version>0.9.9.4</version>
<name>AntennaPod</name>
diff --git a/res/layout/feeditem_dialog.xml b/res/layout/feeditem_dialog.xml
index c8dca8460..e4a37d685 100644
--- a/res/layout/feeditem_dialog.xml
+++ b/res/layout/feeditem_dialog.xml
@@ -12,7 +12,8 @@
android:id="@+id/txtvTitle"
android:layout_alignParentTop="true"
style="@style/AntennaPod.Dialog.Title"
- android:maxLines="10"/>
+ android:maxLines="5"
+ android:ellipsize="none"/>
<View
android:id="@+id/title_divider"
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index ae2addb05..20f96ae23 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -171,7 +171,6 @@
<!--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_msg">Per a què funcioni la velocitat de reproducció variable, cal instal·lar una biblioteca addicional.\n\nFeu un toc a «Baixa el connector» per baixar-vos el connector gratuït des de la Play Store.\n\nQualsevol problema que sorgeixi en utilitzar aquest connector no és culpa de l\'AntennaPod. Cal informar-ne, doncs, al propietari del connector.</string>
<string name="set_playback_speed_label">Velocitats de reproducció</string>
<!--Empty list labels-->
<string name="no_items_label">No hi ha elements a la llista.</string>
@@ -277,7 +276,6 @@
<string name="gpodnetauth_login_title">Inici de sessió</string>
<string name="gpodnetauth_login_descr">Benvingut al procés d\'inici de sessió a gpodder.net. Primerament, introduïu la informació d\'accés:</string>
<string name="gpodnetauth_login_butLabel">Entra</string>
- <string name="gpodnetauth_login_register">Si encara no teniu un compte, creeu-ne un aquí:\nhttps://gpodder.net/register/</string>
<string name="username_label">Nom d\'usuari</string>
<string name="password_label">Contrasenya</string>
<string name="gpodnetauth_device_title">Selecció de dispositiu</string>
diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml
index 8792d1fc9..f7844ed8c 100644
--- a/res/values-cs-rCZ/strings.xml
+++ b/res/values-cs-rCZ/strings.xml
@@ -3,34 +3,46 @@
<!--Activitiy and fragment titles-->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Zdroje</string>
+ <string name="add_feed_label">Přidat podcast</string>
<string name="podcasts_label">PODCASTY</string>
<string name="episodes_label">EPIZODY</string>
+ <string name="new_episodes_label">Nové epizody</string>
+ <string name="all_episodes_label">Všechny epizody</string>
<string name="new_label">Nový</string>
<string name="waiting_list_label">Seznam nepřečtených</string>
<string name="settings_label">Nastavení</string>
<string name="add_new_feed_label">Přidat podcast</string>
<string name="downloads_label">Stahování</string>
+ <string name="downloads_running_label">Právě běží</string>
+ <string name="downloads_completed_label">Dokončeno</string>
+ <string name="downloads_log_label">Log</string>
<string name="cancel_download_label">Zrušit stahování</string>
<string name="playback_history_label">Historie přehrávání</string>
<string name="gpodnet_main_label">gpodder.net</string>
- <string name="gpodnet_auth_label">gpodder.net uživatel</string>
+ <string name="gpodnet_auth_label">Login pro gpodder.net</string>
<!--New episodes fragment-->
+ <string name="recently_published_episodes_label">Nedávno zveřejněné</string>
+ <string name="episode_filter_label">Zobrazit pouze nové epizody</string>
<!--Main activity-->
+ <string name="drawer_open">Otevřít menu</string>
+ <string name="drawer_close">Zavřít menu</string>
<!--Webview actions-->
<string name="open_in_browser_label">Otevřít v prohlížeči</string>
<string name="copy_url_label">Kopírovat URL</string>
<string name="share_url_label">Sdílet URL</string>
<string name="copied_url_msg">URL zkopírováno do schránky.</string>
+ <string name="go_to_position_label">Jít na pozici</string>
<!--Playback history-->
- <string name="clear_history_label">Vymazat historii</string>
+ <string name="clear_history_label">Smazat historii</string>
<!--Other-->
<string name="confirm_label">Potvrdit</string>
<string name="cancel_label">Zrušit</string>
<string name="author_label">Autor</string>
<string name="language_label">Jazyk</string>
<string name="podcast_settings_label">Nastavení</string>
+ <string name="cover_label">Obrázek</string>
<string name="error_label">Chyba</string>
- <string name="error_msg_prefix">Nastala chyba:</string>
+ <string name="error_msg_prefix">Došlo k chybě:</string>
<string name="refresh_label">Obnovit</string>
<string name="external_storage_error_msg">Není dostupné žádné externí uložiště. Pro správnou funkci aplikace se prosím ujistěte, že je připojeno externí úložiště.</string>
<string name="chapters_label">Kapitoly</string>
@@ -48,32 +60,42 @@
<string name="auto_download_label">Zahrnout do automaticky stahovaných</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">URL zdroje</string>
+ <string name="etxtFeedurlHint">URL nebo webová stránka zdroje</string>
<string name="txtvfeedurl_label">Přidat podcast pomocí URL</string>
+ <string name="podcastdirectories_label">Najít podcast v seznamu</string>
+ <string name="podcastdirectories_descr">Můžete vyhledávat nové podcasty podle jména, kategorie nebo popularity v seznamu gpodder.net.</string>
+ <string name="browse_gpoddernet_label">Prohledávat gpodder.net</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Označit vše jako přečtené</string>
+ <string name="mark_all_read_msg">Označit všechny epizody jako přečtené</string>
<string name="show_info_label">Informace o zdroji</string>
+ <string name="remove_feed_label">Odstranit podcast</string>
<string name="share_link_label">Sdílet odkaz</string>
<string name="share_source_label">Sdílet adresu zdroje</string>
<string name="feed_delete_confirmation_msg">Prosím potvrďte, že chcete smazat tento zdroj včetně všech stažených epizod.</string>
- <string name="feed_remover_msg">Odstranit feed</string>
+ <string name="feed_remover_msg">Odstranit zdroj</string>
<!--actions on feeditems-->
<string name="download_label">Stáhnout</string>
<string name="play_label">Přehrát</string>
<string name="pause_label">Pozastavit</string>
- <string name="stream_label">Streamovat</string>
+ <string name="stop_label">Zastavit</string>
+ <string name="stream_label">Vysílat</string>
<string name="remove_label">Odstranit</string>
+ <string name="remove_episode_lable">Odstranit epizodu</string>
<string name="mark_read_label">Označit jako přečtené</string>
<string name="mark_unread_label">Označit jako nepřečtené</string>
<string name="add_to_queue_label">Přidat do fronty</string>
<string name="remove_from_queue_label">Odebrat z fronty</string>
<string name="visit_website_label">Navštívit stránku</string>
- <string name="support_label">Flattr</string>
+ <string name="support_label">Flattrovat</string>
<string name="enqueue_all_new">Vše do fronty</string>
<string name="download_all">Stáhnout vše</string>
<string name="skip_episode_label">Přeskočit epizodu</string>
<!--Download messages and labels-->
- <string name="download_pending">Čekající na stažení</string>
- <string name="download_running">Probíhající stahování</string>
+ <string name="download_successful">úspěšné</string>
+ <string name="download_failed">selhalo</string>
+ <string name="download_pending">Čeká na stažení</string>
+ <string name="download_running">Probíhá stahování</string>
<string name="download_error_device_not_found">Úložné zařízení nenalezeno</string>
<string name="download_error_insufficient_space">Nedostatek volného místa</string>
<string name="download_error_file_error">Souborová chyba</string>
@@ -83,6 +105,7 @@
<string name="download_error_unsupported_type">Nepodporovaný typ zdroje</string>
<string name="download_error_connection_error">Chyba spojení</string>
<string name="download_error_unknown_host">Neznámý host</string>
+ <string name="download_error_unauthorized">Chyba přihlášení</string>
<string name="cancel_all_downloads_label">Zrušit všechna stahování</string>
<string name="download_cancelled_msg">Stahování zrušeno</string>
<string name="download_report_title">Všechna stahování dokončena</string>
@@ -91,6 +114,7 @@
<string name="download_error_request_error">Chyba požadavku</string>
<string name="download_error_db_access">Chyba přístupu do databáze</string>
<string name="downloads_left">\u0020Stahování zbývá</string>
+ <string name="downloads_processing">Probíhá stahování</string>
<string name="download_notification_title">Stahuji podcast data</string>
<string name="download_report_content">%1$d úspěšných stahování, %2$d selhalo</string>
<string name="download_log_title_unknown">Neznámý název</string>
@@ -98,6 +122,8 @@
<string name="download_type_media">Soubor</string>
<string name="download_type_image">Obrázek</string>
<string name="download_request_error_dialog_message_prefix">Nastala chyba při pokusu o stažení souboru:\u0020</string>
+ <string name="authentication_notification_title">Vyžadováno ověření</string>
+ <string name="authentication_notification_msg">Zdroj který jste vybrali vyžaduje zadání uživatelského jména a hesla</string>
<!--Mediaplayer messages-->
<string name="player_error_msg">Chyba!</string>
<string name="player_stopped_msg">Žádné probíhající přehrávání</string>
@@ -110,12 +136,13 @@
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">Načítání</string>
<string name="playbackservice_notification_title">Přehrávaný podcast</string>
+ <string name="unknown_media_key">AntennaPod - Neznámý klíč médií: %1$d</string>
<!--Queue operations-->
<string name="clear_queue_label">Vyprázdnit frontu</string>
<string name="undo">Zpět</string>
<string name="removed_from_queue">Položka odebrána</string>
- <string name="move_to_top_label">Přejít na začátek</string>
- <string name="move_to_bottom_label">Přejít na konec</string>
+ <string name="move_to_top_label">Posunout na začátek</string>
+ <string name="move_to_bottom_label">Posunout na konec</string>
<!--Flattr-->
<string name="flattr_auth_label">Flattr přihlášení</string>
<string name="flattr_auth_explanation">Stiskněte následující tlačítko pro spuštění autentizačního procesu. Budete přesměrováni na přihlašovací obrazovku flattru a vyzváni k potvrzení udělení práv pro použití flattru aplikací AntennaPod. Po udělení práv se automaticky vrátíte na tuto obrazovku.</string>
@@ -123,17 +150,18 @@
<string name="return_home_label">Návrat domů</string>
<string name="flattr_auth_success">Úspěšně přihlášen. Nyní můžete využít flattru přímo v aplikaci. </string>
<string name="no_flattr_token_title">Nenalezen Flattr token</string>
+ <string name="no_flattr_token_notification_msg">Váš flattr účet není propojen s AntennaPod. Pro ověření tapněte sem.</string>
<string name="no_flattr_token_msg">Váš flattr učet není napojen do AntenaPodu. Můžete buďto napojit váš flattr účet do AntennaPodu a využít flattru přímo v aplikaci a nebo použít flattr přímo na webových stránkách zdroje v prohlížeči. </string>
<string name="authenticate_now_label">Přihlásit</string>
<string name="action_forbidden_title">Akce zakázána</string>
<string name="action_forbidden_msg">AntennaPod nemá oprávnění pro tuto akci. Důvodem může být revokování přístupového tokenu AntennaPodu k vašemu účtu. Přístup můžete obnovit nebo využít prohlížeče k návštěvě stránky zdroje.</string>
- <string name="access_revoked_title">Přístup revokován</string>
+ <string name="access_revoked_title">Přístup ukončen</string>
<string name="access_revoked_info">Úspěšně revokován přístup AntennPodu k vašemu účtu. Pro dokončení tohoto procesu je ještě zapotřebí na stránkách flattru odebrat z vašeho účtu AntennaPod ze seznamu povolených aplikací.</string>
<!--Flattr-->
<!--Variable Speed-->
- <string name="download_plugin_label">Stáhnout Plugin</string>
+ <string name="download_plugin_label">Stáhnout plugin</string>
<string name="no_playback_plugin_title">Plugin není nainstalován</string>
- <string name="no_playback_plugin_msg">Pro nastavení rychlosti přehrávání musí být nainstalovaná knihovna třetí strany.\n\nKlikněte na \"Stáhnout Plugin\" ke stažení pluginu z Play Store.\n\nAntennaPod nenese žádnou odpovědnost, za jakékoliv problémy, způsobené tímto pluginem.</string>
+ <string name="no_playback_plugin_msg">Pro možnost měnit rychlost přehrávání musí být nainstalovaná knihovna třetí strany.\n\nKlikněte na \"Stáhnout Plugin\" ke stažení pluginu z Obchodu Play.\n\nAntennaPod nenese žádnou odpovědnost za jakékoliv problémy způsobené tímto pluginem.</string>
<string name="set_playback_speed_label">Rychlosti přehrávání</string>
<!--Empty list labels-->
<string name="no_items_label">Žádné položky v seznamu.</string>
@@ -145,17 +173,17 @@
<string name="services_label">Služby</string>
<string name="flattr_label">Flattr</string>
<string name="pref_pauseOnHeadsetDisconnect_sum">Při odpojení sluchátek automaticky pozastavit přehrávání.</string>
- <string name="pref_followQueue_sum">Po přehrání položky z fronty přejít automaticky na další.</string>
+ <string name="pref_followQueue_sum">Po přehrání položky z fronty přejít automaticky na další</string>
<string name="playback_pref">Přehrávání</string>
<string name="network_pref">Síť</string>
<string name="pref_autoUpdateIntervall_title">Interval aktualizace zdrojů</string>
- <string name="pref_autoUpdateIntervall_sum">Udává interval, ve kterém se zdroje automaticky aktualizují nebo tuto funkci deaktivuje.</string>
+ <string name="pref_autoUpdateIntervall_sum">Udává interval, ve kterém se zdroje automaticky aktualizují nebo tuto funkci deaktivuje</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Stahovat soubory pouze pomocí WiFi</string>
<string name="pref_followQueue_title">Kontinuální přehrávání</string>
<string name="pref_downloadMediaOnWifiOnly_title">WiFi stahování</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Odpojení sluchátek</string>
<string name="pref_mobileUpdate_title">Mobilní aktualizace</string>
- <string name="pref_mobileUpdate_sum">Povolit aktualizace pomocí mobilního připojení.</string>
+ <string name="pref_mobileUpdate_sum">Povolit aktualizace pomocí mobilního připojení</string>
<string name="refreshing_label">Obnovuji</string>
<string name="flattr_settings_label">Nastavení Flattr</string>
<string name="pref_flattr_auth_title">Flattr přihlášení</string>
@@ -164,6 +192,8 @@
<string name="pref_flattr_this_app_sum">Podpořit vývoj AntennaPodu na flatteru. Děkujeme!</string>
<string name="pref_revokeAccess_title">Odebrat přístup</string>
<string name="pref_revokeAccess_sum">Odebere aplikaci přístupová práva k vašemu flattr účtu.</string>
+ <string name="pref_auto_flattr_title">Automatický Flattr</string>
+ <string name="pref_auto_flattr_sum">Nastavit automatické flattrování</string>
<string name="user_interface_label">Uživatelské rozhraní</string>
<string name="pref_set_theme_title">Vybrat motiv</string>
<string name="pref_set_theme_sum">Změnit vzhled AntennaPod.</string>
@@ -186,9 +216,17 @@
<string name="pref_gpodnet_setlogin_information_sum">Změní přihlašovací údaje k vašemu gpodder.net účtu.</string>
<string name="pref_playback_speed_title">Rychlosti přehrávání</string>
<string name="pref_playback_speed_sum">Přizpůsobení rychlosti je dostupné pro přehrávání zvuku různými rychlostmi</string>
+ <string name="pref_seek_delta_title">Čas poskočení</string>
+ <string name="pref_seek_delta_sum">Poskočí o vybraný počet sekund při posunu zpět nebo vpřed</string>
<string name="pref_gpodnet_sethostname_title">Nastavit hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Použít přednastaveného hosta</string>
+ <string name="pref_expandNotify_title">Rozšířené upozornění</string>
+ <string name="pref_expandNotify_sum">Vždy zobrazovat tlačítka pro přehrávání v upozornění.</string>
+ <string name="pref_persistNotify_title">Pevné ovládání přehrávání</string>
+ <string name="pref_persistNotify_sum">Zachovat upozornění a ovládání na obrazovce uzamčení i při pozastaveném přehrávání.</string>
+ <string name="pref_expand_notify_unsupport_toast">Verze Androidu nižší než 4.1 nepodporují rozšířená upozornění.</string>
<!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">Povolit automatické flattrování</string>
<!--Search-->
<string name="search_hint">Hledat zdroje a epizody</string>
<string name="found_in_shownotes_label">Nalezeno v poznámkách k show</string>
@@ -197,8 +235,8 @@
<string name="search_label">Vyhledat</string>
<string name="found_in_title_label">Nalezeno v názvu</string>
<!--OPML import and export-->
- <string name="opml_import_txtv_button_lable">OPML soubory umožňují přenést vaše podcasty z jednoho podcast manažera do jiného.</string>
- <string name="opml_import_explanation">Pro import OPML souboru je třeba ho nejdříve umístit do následujícího adresáře a poté pro zahájení procesu importu stisknout tlačítko. </string>
+ <string name="opml_import_txtv_button_lable">OPML soubory umožňují přenést vaše podcasty z jednoho přehrávače na jiný.</string>
+ <string name="opml_import_explanation">Pro načtení OPML souboru je třeba ho nejdříve umístit do následujícího adresáře a poté stisknout tlačítko pro zahájení procesu importu. </string>
<string name="start_import_label">Importovat</string>
<string name="opml_import_label">OPML import</string>
<string name="opml_directory_error">CHYBA!</string>
@@ -218,18 +256,21 @@
<string name="disable_sleeptimer_label">Deaktivovat časovač vypnutí</string>
<string name="enter_time_here_label">Zadejte čas</string>
<string name="sleep_timer_label">Časovač vypnutí</string>
- <string name="time_left_label">Zbývá času:\u0020</string>
+ <string name="time_left_label">Zbývající čas:\u0020</string>
<string name="time_dialog_invalid_input">Neplatný vstup, musí být zadáno celé číslo</string>
+ <string name="time_unit_seconds">sekund</string>
+ <string name="time_unit_minutes">minut</string>
+ <string name="time_unit_hours">hodin</string>
<!--gpodder.net-->
<string name="gpodnet_taglist_header">KATEGORIE</string>
<string name="gpodnet_toplist_header">TOP PODCASTY</string>
- <string name="gpodnet_suggestions_header">DOPOTUČENÉ</string>
+ <string name="gpodnet_suggestions_header">DOPORUČENÉ</string>
<string name="gpodnet_search_hint">Vyhledat na gpodder.net</string>
<string name="gpodnetauth_login_title">Přihlásit</string>
<string name="gpodnetauth_login_descr">Vítejte do průvodce přihlášením ke gpodder.net účtu. Zadejte vaše přihlašovací údaje:</string>
<string name="gpodnetauth_login_butLabel">Přihlásit</string>
- <string name="gpodnetauth_login_register">Jestliže nemáte účet, můžete si ho vytvořit zde:\nhttps://gpodder.net/register/</string>
- <string name="username_label">Uživatleské jméno</string>
+ <string name="gpodnetauth_login_register">Pokud ještě nemáte účet, můžete ho vytvořit zde:\nhttps://gpodder.net/register/</string>
+ <string name="username_label">Uživatelské jméno</string>
<string name="password_label">Heslo</string>
<string name="gpodnetauth_device_title">Výběr zařízení</string>
<string name="gpodnetauth_device_descr">Vytvořte nové nebo vyberte již existující zařízení pro použití s vašim gpodder.net účtem.</string>
@@ -241,7 +282,7 @@
<string name="gpodnetauth_device_errorAlreadyUsed">ID zařízení je již obsazeno</string>
<string name="gpodnetauth_device_butChoose">Vybrat</string>
<string name="gpodnetauth_finish_title">Úspěšně přihlášeno!</string>
- <string name="gpodnetauth_finish_descr">Gratulujeme! Váš gpodder.net účet je nyná úspěšně propojen s vašim zařízením. AntennaPod bude automaticky synchronizovat odebírané podcasty s vaším gpodder.net účtem. </string>
+ <string name="gpodnetauth_finish_descr">Gratulujeme! Váš gpodder.net účet je nyní úspěšně propojen s vaším zařízením. AntennaPod bude automaticky synchronizovat odebírané podcasty s nastaveným účtem na gpodder.net.</string>
<string name="gpodnetauth_finish_butsyncnow">Synchronizovat nyní</string>
<string name="gpodnetauth_finish_butgomainscreen">Přejít na hlavní obrazovku</string>
<string name="gpodnetsync_auth_error_title">gpodder.net autentizace selhala</string>
@@ -267,6 +308,26 @@
<string name="subscribed_label">Odebíráno</string>
<string name="downloading_label">Stahuji...</string>
<!--Content descriptions for image buttons-->
+ <string name="show_chapters_label">Zobrazit kapitoly</string>
+ <string name="show_shownotes_label">Zobrazit poznámky o pořadu</string>
+ <string name="show_cover_label">Zobrazit obrázek</string>
+ <string name="rewind_label">Posunout zpět</string>
+ <string name="fast_forward_label">Posunout vpřed</string>
+ <string name="media_type_audio_label">Audio</string>
+ <string name="media_type_video_label">Video</string>
+ <string name="navigate_upwards_label">Navigovat vzhůru</string>
+ <string name="butAction_label">Více možností</string>
+ <string name="status_playing_label">Epizoda se právě přehrává</string>
+ <string name="status_downloading_label">Epizoda je právě stahována</string>
+ <string name="status_downloaded_label">Epizoda je stažena</string>
+ <string name="status_unread_label">Nová položka</string>
+ <string name="in_queue_label">Epizoda je ve frontě</string>
+ <string name="new_episodes_count_label">Počet nových epizod</string>
+ <string name="in_progress_episodes_count_label">Počet epizod u kterých byl započat poslech</string>
+ <string name="drag_handle_content_description">Tahem změnit pozici této položky</string>
<!--Feed information screen-->
+ <string name="authentication_label">Ověření</string>
+ <string name="authentication_descr">Změnit uživatelské jméno a heslo pro tento podcast a jeho epizody.</string>
<!--AntennaPodSP-->
+ <string name="sp_apps_importing_feeds_msg">Importuji odběry z jednoúčelových aplikací...</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 5c41b6eb0..4e5ccd255 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -3,6 +3,7 @@
<!--Activitiy and fragment titles-->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Feeds</string>
+ <string name="add_feed_label">Tilføj podcast</string>
<string name="podcasts_label">PODCASTS</string>
<string name="episodes_label">EPISODER</string>
<string name="new_episodes_label">Nye episoder</string>
@@ -30,6 +31,7 @@
<string name="copy_url_label">Kopier URL</string>
<string name="share_url_label">Del URL</string>
<string name="copied_url_msg">URL kopieret til udklipsholderen.</string>
+ <string name="go_to_position_label">Gå til denne position</string>
<!--Playback history-->
<string name="clear_history_label">Fjern historik</string>
<!--Other-->
@@ -58,6 +60,7 @@
<string name="auto_download_label">Inkluder i automatiske downloads</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">Feed URL</string>
+ <string name="etxtFeedurlHint">URL af feed eller webside</string>
<string name="txtvfeedurl_label">Tilføj Podcast med URL</string>
<string name="podcastdirectories_label">Find podcast i mappen</string>
<string name="podcastdirectories_descr">Du kan søge efter nye podcasts efter navn, kategori eller popularitet i gpodder.net biblioteket</string>
@@ -75,6 +78,7 @@
<string name="download_label">Hent</string>
<string name="play_label">Afspil</string>
<string name="pause_label">Pause</string>
+ <string name="stop_label">Stop</string>
<string name="stream_label">Stream</string>
<string name="remove_label">Fjern</string>
<string name="remove_episode_lable">Fjern episode</string>
@@ -132,6 +136,7 @@
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">Buffering</string>
<string name="playbackservice_notification_title">Afspiller podcast</string>
+ <string name="unknown_media_key">AntennaPod - ukendt medie nøgle: %1$d</string>
<!--Queue operations-->
<string name="clear_queue_label">Fjern kø</string>
<string name="undo">Fortryd</string>
@@ -145,6 +150,7 @@
<string name="return_home_label">Retuner hjem</string>
<string name="flattr_auth_success">Godkendelse lykkedes! Du kan nu flattr emner inde i app\'en.</string>
<string name="no_flattr_token_title">Ingen flattr polet fundet</string>
+ <string name="no_flattr_token_notification_msg">Din flattr konto ser ikke ud til at være forbundet med AntennaPod. Tryk her for at forbinde.</string>
<string name="no_flattr_token_msg">Din flattr konto er vidst ikke forbundet til AntennaPod. Du kan forbinde din konto til AntennaPod for at flattr emner inde i app\'en, eller besøge websiden af mediet for at flattr det der.</string>
<string name="authenticate_now_label">Godkender</string>
<string name="action_forbidden_title">Forbudt handling</string>
@@ -166,7 +172,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Hent Plugin</string>
<string name="no_playback_plugin_title">Plugin er ikke installeret</string>
- <string name="no_playback_plugin_msg">For at få variabel afspilningshastighed til at virke skal der installeres et tredjepartsprogram.\n\nTryk \'Download Plugin\' for at downloade et gratis plugin fra Play Store\n\nAlle problemer forårsaget ved at bruge dette plugin er ikke AntennaPods ansvar og bør meldes til ejeren af plugin\'et.</string>
+ <string name="no_playback_plugin_msg">For at variabel afspilningshastighed virker skal der installeres et 3. part bibliotek.\n\nTap \'Download Plugin\' for at downloade et gratis plugin fra Play Store\n\nHvis der findes nogen problemer med dette plugin, så er det ikke AntennaPods ansvar, og problemet bør reporteres til ejeren af pluginet. </string>
<string name="set_playback_speed_label">Afspilningshastigheder</string>
<!--Empty list labels-->
<string name="no_items_label">Der er ingen emner i denne liste.</string>
@@ -198,6 +204,7 @@
<string name="pref_revokeAccess_title">Tilbagekald adgang</string>
<string name="pref_revokeAccess_sum">Tilbagekald adgangen til din flattr konto fra denne app.</string>
<string name="pref_auto_flattr_title">Flattr\'er automatisk</string>
+ <string name="pref_auto_flattr_sum">Konfigurer automatisk flattering</string>
<string name="user_interface_label">Brugerflade</string>
<string name="pref_set_theme_title">Vælg tema</string>
<string name="pref_set_theme_sum">Skift AntennaPods udseende.</string>
@@ -220,9 +227,20 @@
<string name="pref_gpodnet_setlogin_information_sum">Skift din gpodder.net kontos login information.</string>
<string name="pref_playback_speed_title">Afspilningshastigheder</string>
<string name="pref_playback_speed_sum">Tilpas tilgængelige hastigheder for variabelt afspilningshastigheds plugin</string>
+ <string name="pref_seek_delta_title">Søg tid</string>
+ <string name="pref_seek_delta_sum">Søg så mange sekunder når der spoles tilbage eller frem</string>
<string name="pref_gpodnet_sethostname_title">Indstil værtsnavn</string>
<string name="pref_gpodnet_sethostname_use_default_host">Brug standard vært</string>
+ <string name="pref_expandNotify_title">Udvid notifikation</string>
+ <string name="pref_expandNotify_sum">Altid udvid notifikationen for at vise afspilningsknapper.</string>
+ <string name="pref_persistNotify_title">Afspilningskontrol forbliver altid</string>
+ <string name="pref_persistNotify_sum">Behold notifikation og låseskærmskontrol når afspilningen pauses.</string>
+ <string name="pref_expand_notify_unsupport_toast">Android versioner før 4.1 understøtter ikke udvidede notifikationer.</string>
<!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">Aktiver automatisk flattring</string>
+ <string name="auto_flattr_after_percent">Flattr episoder så snart %d procent er blevet afspillet</string>
+ <string name="auto_flattr_ater_beginning">Flattr episoder når afspilning starter</string>
+ <string name="auto_flattr_ater_end">Flattr episoder når afspilning slutter</string>
<!--Search-->
<string name="search_hint">Søg efter feeds eller episoder</string>
<string name="found_in_shownotes_label">Funder i showets noter</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 539470a5e..3947582fc 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -78,6 +78,7 @@
<string name="download_label">Herunterladen</string>
<string name="play_label">Abspielen</string>
<string name="pause_label">Pausieren</string>
+ <string name="stop_label">Stop</string>
<string name="stream_label">Streamen</string>
<string name="remove_label">Entfernen</string>
<string name="remove_episode_lable">Episode entfernen</string>
@@ -171,7 +172,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Plugin herunterladen</string>
<string name="no_playback_plugin_title">Plugin nicht installiert</string>
- <string name="no_playback_plugin_msg">Um die Wiedergabegeschwindigkeit zu verändern, muss eine Drittanbieter-Bibliothek heruntegeladen werden.\n\nDrücke auf \"Plugin herunterladen\", um ein kostenloses Plugin aus dem Play Store zu installieren.\n\nProbleme, die bei der Benutzung des Plugins auftreten, sollten dem Entwickler des Plugins gemeldet werden.</string>
+ <string name="no_playback_plugin_msg">Um die Wiedergabegeschwindigkeit zu verändern, muss eine Drittanbieter-Bibliothek heruntegeladen werden. Drücke auf \"Plugin herunterladen\", um ein kostenloses Plugin aus dem Play Store zu installieren. Probleme, die bei der Benutzung des Plugins auftreten, sollten dem Entwickler des Plugins gemeldet werden.</string>
<string name="set_playback_speed_label">Wiedergabegeschwindigkeiten</string>
<!--Empty list labels-->
<string name="no_items_label">Es sind keine Einträge in dieser Liste.</string>
@@ -230,6 +231,11 @@
<string name="pref_seek_delta_sum">Spule so viele Sekunden vor oder zurück</string>
<string name="pref_gpodnet_sethostname_title">Hostname ändern</string>
<string name="pref_gpodnet_sethostname_use_default_host">Standard-Host verwenden</string>
+ <string name="pref_expandNotify_title">Benachrichtigung erweitern</string>
+ <string name="pref_expandNotify_sum">Erweiterte Wiedergabebenachrichtigung mit Abspiel-, Pause- und Stop-Knöpfen anzeigen.</string>
+ <string name="pref_persistNotify_title">Persistente Wiedergabesteurung</string>
+ <string name="pref_persistNotify_sum">Zeige Wiedergabebedienelemente in der Benachrichtigung und im Lockscreen an, während die Wiedergabe pausiert ist.</string>
+ <string name="pref_expand_notify_unsupport_toast">Android-Versionen vor 4.1 unterstützen keine erweiterten Benachrichtigungen.</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Automatisches Flattrn aktivieren</string>
<string name="auto_flattr_after_percent">Flattr eine Episode sobald %d Prozent gespielt worden sind</string>
@@ -277,7 +283,7 @@
<string name="gpodnetauth_login_title">Anmeldung</string>
<string name="gpodnetauth_login_descr">Willkommen beim gpodder.net Anmeldeprozess. Gib zuerst deine Anmeldeinformationen ein:</string>
<string name="gpodnetauth_login_butLabel">Anmelden</string>
- <string name="gpodnetauth_login_register">Falls du noch kein gpodder.net profil hast, kannst du hier eines erstellen:\nhttps://gpodder.net/register/</string>
+ <string name="gpodnetauth_login_register">Falls du noch kein gpodder.net profil hast, kannst du hier eines erstellen: https://gpodder.net/register/</string>
<string name="username_label">Benutzername</string>
<string name="password_label">Passwort</string>
<string name="gpodnetauth_device_title">Geräte-Auswahl</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 1b87e6dbc..b00c9df17 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -3,6 +3,7 @@
<!--Activitiy and fragment titles-->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Canales</string>
+ <string name="add_feed_label">Añadir podcast</string>
<string name="podcasts_label">PODCASTS</string>
<string name="episodes_label">EPISODIOS</string>
<string name="new_episodes_label">Episodios nuevos</string>
@@ -12,18 +13,25 @@
<string name="settings_label">Ajustes</string>
<string name="add_new_feed_label">Añadir podcast</string>
<string name="downloads_label">Descargas</string>
+ <string name="downloads_running_label">En Curso</string>
+ <string name="downloads_completed_label">Completado</string>
+ <string name="downloads_log_label">Log</string>
<string name="cancel_download_label">Cancelar descarga</string>
<string name="playback_history_label">Histórico de reproducción</string>
<string name="gpodnet_main_label">gpodder.net</string>
<string name="gpodnet_auth_label">Iniciar sesión en gpodder.net</string>
<!--New episodes fragment-->
+ <string name="recently_published_episodes_label">Publicados Recientemente</string>
<string name="episode_filter_label">Mostrar solo episodios nuevos</string>
<!--Main activity-->
+ <string name="drawer_open">Abrir menú</string>
+ <string name="drawer_close">Cerrar Menú</string>
<!--Webview actions-->
<string name="open_in_browser_label">Abrir en el navegador</string>
<string name="copy_url_label">Copiar URL</string>
<string name="share_url_label">Compartir URL</string>
<string name="copied_url_msg">URL copiada al portapapeles.</string>
+ <string name="go_to_position_label">Ir a esta posición</string>
<!--Playback history-->
<string name="clear_history_label">Vaciar el histórico</string>
<!--Other-->
@@ -52,11 +60,16 @@
<string name="auto_download_label">Incluir en auto descargas</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">URL del canal</string>
+ <string name="etxtFeedurlHint">URL del feed o del sitio web</string>
<string name="txtvfeedurl_label">Añadir podcast por URL</string>
+ <string name="podcastdirectories_label">Buscar podcast en directorio</string>
+ <string name="podcastdirectories_descr">Se puede buscar nuevos podcast según nombre, categoría o popularidad en el directorio gpodder.net</string>
<string name="browse_gpoddernet_label">Explorar gpodder.net</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Marcar todo como leído</string>
+ <string name="mark_all_read_msg">Marcar todos los episodios como leídos</string>
<string name="show_info_label">Información del programa</string>
+ <string name="remove_feed_label">Eliminar podcast</string>
<string name="share_link_label">Compartir el enlace de la web</string>
<string name="share_source_label">Compartir el enlace del canal</string>
<string name="feed_delete_confirmation_msg">Confirme que quiere eliminar este canal y TODOS los episodios descargados del mismo.</string>
@@ -65,8 +78,10 @@
<string name="download_label">Descargar</string>
<string name="play_label">Reproducir</string>
<string name="pause_label">Pausar</string>
+ <string name="stop_label">Stop</string>
<string name="stream_label">Reproducir por streaming</string>
<string name="remove_label">Quitar</string>
+ <string name="remove_episode_lable">Eliminar episodio</string>
<string name="mark_read_label">Marcar como leído</string>
<string name="mark_unread_label">Marcar como no leído</string>
<string name="add_to_queue_label">Añadir a la cola</string>
@@ -77,6 +92,8 @@
<string name="download_all">Descargarlos todos</string>
<string name="skip_episode_label">Omitir episodio</string>
<!--Download messages and labels-->
+ <string name="download_successful">exitoso</string>
+ <string name="download_failed">fallido</string>
<string name="download_pending">Descarga pendiente</string>
<string name="download_running">Descarga en curso</string>
<string name="download_error_device_not_found">No se ha encontrado un dispositivo de almacenamiento</string>
@@ -97,6 +114,7 @@
<string name="download_error_request_error">Error de solicitud</string>
<string name="download_error_db_access">Error de acceso a la base de datos</string>
<string name="downloads_left">\u0020descargas restantes</string>
+ <string name="downloads_processing">Procesando descargas</string>
<string name="download_notification_title">Descargando datos del podcast</string>
<string name="download_report_content">%1$d descargas exitosas, %2$d fallidas</string>
<string name="download_log_title_unknown">Título desconocido</string>
@@ -118,6 +136,7 @@
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">Almacenando</string>
<string name="playbackservice_notification_title">Reproduciendo el podcast</string>
+ <string name="unknown_media_key">AntennaPod - Tecla multimedia desconocida: %1$d</string>
<!--Queue operations-->
<string name="clear_queue_label">Vaciar la cola</string>
<string name="undo">Deshacer</string>
@@ -131,6 +150,7 @@
<string name="return_home_label">Volver a la pantalla principal</string>
<string name="flattr_auth_success">Autentificación exitosa. Ya puede valorar cosas en Flattr desde la aplicación.</string>
<string name="no_flattr_token_title">No se ha encontrado un token de Flattr</string>
+ <string name="no_flattr_token_notification_msg">Tu cuenta Flatter parece no estar conectada con AntennaPod. Pulsa aquí para autenticar.</string>
<string name="no_flattr_token_msg">Su cuenta de Flattr no está conectada con AntennaPod. Puede conectarla o puede visitar la página web de cada cosa para valorarla desde allí.</string>
<string name="authenticate_now_label">Autenticarse</string>
<string name="action_forbidden_title">Acción prohibida</string>
@@ -152,7 +172,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_msg">Para que la reproducción a velocidad variable funcione, es necesario instalar un complemento adicional.\n\nPulse «Descargar complemento» para descargar un complemento gratuito de la Play Store.\n\nSi aparece cualquier problema durante la utilización del complemento, informe de él al propietario, pues éste no es responsabilidad de AntennaPod.</string>
+ <string name="no_playback_plugin_msg">Para que funcione la reproducción a velocidad variable, es necesaria una librería de terceros.\n\nPulsa «Descargar plugin» para descargar un plugin gratuito desde el Play Store\n\nCualquier problema relacionado con este plugin no es responsabilidad de AntennaPod y deberían ser reportados al autor del plugin.</string>
<string name="set_playback_speed_label">Velocidades de reproducción</string>
<!--Empty list labels-->
<string name="no_items_label">Esta lista no tiene elementos.</string>
@@ -184,6 +204,7 @@
<string name="pref_revokeAccess_title">Revocar el acceso</string>
<string name="pref_revokeAccess_sum">Rescindir el permiso de acceso de esta aplicación a su cuenta de Flattr.</string>
<string name="pref_auto_flattr_title">Uso de Flattr automático</string>
+ <string name="pref_auto_flattr_sum">Configurar flattr automático</string>
<string name="user_interface_label">Interfaz de usuario</string>
<string name="pref_set_theme_title">Elegir un tema</string>
<string name="pref_set_theme_sum">Cambiar la apariencia de AntennaPod.</string>
@@ -206,9 +227,20 @@
<string name="pref_gpodnet_setlogin_information_sum">Modificar datos de inicio de sesión en gpodder.net.</string>
<string name="pref_playback_speed_title">Velocidades de reproducción</string>
<string name="pref_playback_speed_sum">Personalice las velocidades disponibles para la reproducción de audio a velocidad variable</string>
+ <string name="pref_seek_delta_title">Intervalo de búsqueda</string>
+ <string name="pref_seek_delta_sum">Avanzar o retroceder esta cantidad de segundos</string>
<string name="pref_gpodnet_sethostname_title">Definir nombre de equipo</string>
<string name="pref_gpodnet_sethostname_use_default_host">Usar nombre de equipo por defecto</string>
+ <string name="pref_expandNotify_title">Expandir Notificación</string>
+ <string name="pref_expandNotify_sum">Expandir siempre la notificación para mostrar los botones de reproducción</string>
+ <string name="pref_persistNotify_title">Controles de reproducción persistentes</string>
+ <string name="pref_persistNotify_sum">Mantener la notificación y controles en pantalla de bloqueo cuando se pausa.</string>
+ <string name="pref_expand_notify_unsupport_toast">Las versiones de Android anteriores a la 4.1 no soportan notificaciones expandidas</string>
<!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">Habilitar Flattr automático</string>
+ <string name="auto_flattr_after_percent">Hacer Flattr del episodio en cuanto se haya reproducido el %d por ciento</string>
+ <string name="auto_flattr_ater_beginning">Hacer Flattr del episodio al comenzar la reproducción</string>
+ <string name="auto_flattr_ater_end">Hacer Flattr del episodio al terminar la reproducción</string>
<!--Search-->
<string name="search_hint">Buscar canales o episodios</string>
<string name="found_in_shownotes_label">Encontrado en las notas del programa</string>
@@ -251,7 +283,7 @@
<string name="gpodnetauth_login_title">Iniciar sesión</string>
<string name="gpodnetauth_login_descr">Bienvenido al proceso de autenticación de gpodder.net. Primero, escriba sus datos de inicio de sesión:</string>
<string name="gpodnetauth_login_butLabel">Iniciar sesión</string>
- <string name="gpodnetauth_login_register">Si tiene una cuenta aún, puede crear una aquí:\nhttps://gpodder.net/register/</string>
+ <string name="gpodnetauth_login_register">Si no tienes una cuenta aún, puedes crearla en:\nhttps://gpodder.net/register/</string>
<string name="username_label">Nombre de usuario</string>
<string name="password_label">Contraseña</string>
<string name="gpodnetauth_device_title">Selección del dispositivo</string>
@@ -306,8 +338,10 @@
<string name="in_queue_label">El episodio está en la cola</string>
<string name="new_episodes_count_label">Cantidad de episodios nuevos</string>
<string name="in_progress_episodes_count_label">Cantidad de episodios que ha comenzado a escuchar</string>
+ <string name="drag_handle_content_description">Arrastrar para cambiar la posición de este ítem</string>
<!--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>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Importando subscripciones de aplicaciones de uso específico...</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index afc441b99..0d3889468 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -78,6 +78,7 @@
<string name="download_label">Télécharger</string>
<string name="play_label">Lire</string>
<string name="pause_label">Pause</string>
+ <string name="stop_label">Stop</string>
<string name="stream_label">Lire en ligne</string>
<string name="remove_label">Supprimer</string>
<string name="remove_episode_lable">Supprimer cet épisode</string>
@@ -226,9 +227,15 @@
<string name="pref_gpodnet_setlogin_information_sum">Modifier les information de connexion pour votre compte gpodder.net</string>
<string name="pref_playback_speed_title">Vitesses de lecture</string>
<string name="pref_playback_speed_sum">Modifier la liste des vitesses disponibles pour la lecture audio</string>
+ <string name="pref_seek_delta_title">Chercher un moment spécifique</string>
<string name="pref_seek_delta_sum">Bouger d\'autant de secondes en rembobinant ou en faisant une avance rapide </string>
<string name="pref_gpodnet_sethostname_title">Choisir un nom de domaine</string>
<string name="pref_gpodnet_sethostname_use_default_host">Utiliser le nom de domaine par défaut</string>
+ <string name="pref_expandNotify_title">Etendre la notification</string>
+ <string name="pref_expandNotify_sum">Toujours étendre les notifications pour montrer les boutons de lecture</string>
+ <string name="pref_persistNotify_title">Boutons de lecture permanents</string>
+ <string name="pref_persistNotify_sum">Garder les notifications et les boutons de lecture sur l\'écran de verouillage quand la lecture est en pause</string>
+ <string name="pref_expand_notify_unsupport_toast">Les versions d\'Android antérieures à 4.1 ne sont pas compatibles avec les notifications élargies</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Activer le paiement flattr automatique</string>
<string name="auto_flattr_after_percent">Lancer un paiement flattr pour un épisode dès que %d de l\'épisode a été joué</string>
@@ -276,7 +283,7 @@
<string name="gpodnetauth_login_title">Se connecter</string>
<string name="gpodnetauth_login_descr">Bienvenue dans le processus de connexion à gpodder.net. Premièrement, veuillez entrer vos informations de connexion :</string>
<string name="gpodnetauth_login_butLabel">Connexion</string>
- <string name="gpodnetauth_login_register">SI vous n\'avez pas encore de compte, vous pouvez en créer un⏎\nhttps://gpodder.net/register/</string>
+ <string name="gpodnetauth_login_register">SI vous n\'avez pas encore de compte, vous pouvez en créer un ici:\https://gpodder.net/register/</string>
<string name="username_label">Identifiant</string>
<string name="password_label">Mot de passe</string>
<string name="gpodnetauth_device_title">Choix de l\'appareil</string>
diff --git a/res/values-hi-rIN/strings.xml b/res/values-hi-rIN/strings.xml
index 43590f62a..b1d6c33b1 100644
--- a/res/values-hi-rIN/strings.xml
+++ b/res/values-hi-rIN/strings.xml
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
- <string name="app_name">\tऐन्टेनापॉड</string>
+ <string name="app_name"> ऐन्टेनापॉड</string>
<string name="feeds_label">फिड्स</string>
<string name="podcasts_label">पॉडकास्ट</string>
<string name="episodes_label">एपिसोड</string>
@@ -26,7 +26,7 @@
<!--Other-->
<string name="confirm_label">पुष्टि करें</string>
<string name="cancel_label">रद्द करें</string>
- <string name="author_label">\tनिर्माता</string>
+ <string name="author_label"> निर्माता</string>
<string name="language_label">भाषा</string>
<string name="podcast_settings_label">सेटिंग्स</string>
<string name="cover_label">तस्वीर</string>
@@ -54,7 +54,8 @@
<!--Actions on feeds-->
<string name="mark_all_read_label">पढ़ने के रूप में सभी को चिह्नित करें</string>
<string name="show_info_label">जानकारी दिखाएँ</string>
- <string name="remove_feed_label">पॉडकास्ट हटाएँ\n</string>
+ <string name="remove_feed_label">पॉडकास्ट हटाएँ
+</string>
<string name="share_link_label">शेयर वेबसाइट लिंक</string>
<string name="share_source_label">शेयर फ़ीड लिंक</string>
<string name="feed_delete_confirmation_msg">इसकी पुष्टि करें कि आप इस फ़ीड और इस फ़ीड के सभी प्रकरणों को हटाना चाहते हैं जिन्हें आपने डाउनलोड किया है.</string>
@@ -75,7 +76,8 @@
<string name="download_all">सभी डाउनलोड</string>
<string name="skip_episode_label">एपिसोड छोङें</string>
<!--Download messages and labels-->
- <string name="download_successful">सफल\n</string>
+ <string name="download_successful">सफल
+</string>
<string name="download_failed">डाउनलोड विफल</string>
<string name="download_pending">लंबित डाउनलोड</string>
<string name="download_running">डाउनलोड चल रहा है</string>
@@ -142,7 +144,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">प्लगइन डाउनलोड करें</string>
<string name="no_playback_plugin_title">प्लगइन स्थापित नहीं हुआ</string>
- <string name="no_playback_plugin_msg">काम करने के लिए चर गति प्लेबैक के लिए, एक तीसरी पार्टी पुस्तकालय स्थापित किया जाना चाहिए. ⏎\n⏎\nप्ले स्टोर से एक मुक्त प्लगइन डाउनलोड करने के लिए \'डाउनलोड प्लगइन\' को ठोकें⏎\n⏎इस प्लगइन का उपयोग कर पाने में कोई समस्या है तो AntennaPod जिम्मेदार नहीं है और प्लगइन मालिक को सूचित किया जाना चाहिए.</string>
<string name="set_playback_speed_label">प्लेबैक गति</string>
<!--Empty list labels-->
<string name="no_items_label">इस सूची में कोई आइटम नहीं हैं.</string>
@@ -180,7 +181,7 @@
<string name="pref_automatic_download_sum">एपिसोड के स्वत: डाउनलोड विन्यस्त करें.</string>
<string name="pref_autodl_wifi_filter_title">वाई-फाई फिल्टर सक्षम करें</string>
<string name="pref_autodl_wifi_filter_sum">केवल चयनित वाई-फाई नेटवर्क के लिए स्वत: डाउनलोड की अनुमति दें.</string>
- <string name="pref_episode_cache_title">\tगुप्त एपिसोड</string>
+ <string name="pref_episode_cache_title"> गुप्त एपिसोड</string>
<string name="pref_theme_title_light">हलका</string>
<string name="pref_theme_title_dark">अंधेरा</string>
<string name="pref_episode_cache_unlimited">असीमित</string>
@@ -237,7 +238,6 @@
<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>
diff --git a/res/values-it-rIT/strings.xml b/res/values-it-rIT/strings.xml
index 9bc81c269..b91f1a5fd 100644
--- a/res/values-it-rIT/strings.xml
+++ b/res/values-it-rIT/strings.xml
@@ -135,7 +135,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">Scarica Plugin</string>
<string name="no_playback_plugin_title">Plugin non installato</string>
- <string name="no_playback_plugin_msg">Per la riproduzione a velocità variabile deve essere installata una libreria di terze parti.\n\nPremi \'Scarica Plugin\' per scaricare un plugin gratuito dal Play Store.\n\nEventuali problemi riscontrati utilizzando questo plugin non sono da imputare ad AntennaPod e devono essere segnalati al proprietario plugin.</string>
<string name="set_playback_speed_label">Velocità di riproduzione</string>
<!--Empty list labels-->
<string name="no_items_label">Non ci sono oggetti in questa lista.</string>
@@ -230,7 +229,6 @@
<string name="gpodnetauth_login_title">Login</string>
<string name="gpodnetauth_login_descr">Benvenuto sul processo di login di gpodder.net. Per prima cosa, inserisci le tue informazioni di login:</string>
<string name="gpodnetauth_login_butLabel">Login</string>
- <string name="gpodnetauth_login_register">Se non possiedi ancora un account, puoi crearlo uno qui:\nhttps://gpodder.net/register/</string>
<string name="username_label">Username</string>
<string name="password_label">Password</string>
<string name="gpodnetauth_device_title">Scelta del dispositivo</string>
diff --git a/res/values-iw-rIL/strings.xml b/res/values-iw-rIL/strings.xml
index 27f4b969d..82a8fe773 100644
--- a/res/values-iw-rIL/strings.xml
+++ b/res/values-iw-rIL/strings.xml
@@ -148,7 +148,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">הורד תוסף</string>
<string name="no_playback_plugin_title">תוסף לא מותקן</string>
- <string name="no_playback_plugin_msg">לניגון במהירות משתנה תוסף מגורם שלישי צריך להיות מותקן. \n\nהקש על \'הורד תוסף\' להוריד תוסף חינמי מחנות Play\n\nבעיות בשימוש עם תוסף זה אינן באחריות אנטנה-פוד וצריך לדווחן ליוצר התוסף.</string>
<string name="set_playback_speed_label">מהירויות ניגון</string>
<!--Empty list labels-->
<string name="no_items_label">אין פריטים ברשימה זו.</string>
@@ -244,7 +243,6 @@
<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>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 4d783b83a..a29de1582 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -3,24 +3,35 @@
<!--Activitiy and fragment titles-->
<string name="app_name">안테나팟</string>
<string name="feeds_label">피드</string>
+ <string name="add_feed_label">팟캐스트 추가</string>
<string name="podcasts_label">팟캐스트</string>
<string name="episodes_label">에피소드</string>
+ <string name="new_episodes_label">새 에피소드</string>
+ <string name="all_episodes_label">모든 에피소드</string>
<string name="new_label">신규</string>
<string name="waiting_list_label">추가 대기 목록</string>
<string name="settings_label">설정</string>
<string name="add_new_feed_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>
<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>
<!--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>
+ <string name="go_to_position_label">이 위치로 이동</string>
<!--Playback history-->
<string name="clear_history_label">기록 지우기</string>
<!--Other-->
@@ -49,10 +60,16 @@
<string name="auto_download_label">자동 다운로드에 포함</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">피드 URL</string>
+ <string name="etxtFeedurlHint">피드의 URL 또는 홈페이지</string>
<string name="txtvfeedurl_label">URL로 팟캐스트를 추가</string>
+ <string name="podcastdirectories_label">디렉터리에서 팟캐스트 찾기</string>
+ <string name="podcastdirectories_descr">gpodder.net 디렉터리에서 이름, 분류, 인기에 따라 새 팟캐스트를 검색할 수 있습니다</string>
+ <string name="browse_gpoddernet_label">gpodder.net 둘러보기</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">모두 읽은 것으로 표시</string>
+ <string name="mark_all_read_msg">모든 에피소드 읽은 것으로 표시</string>
<string name="show_info_label">정보 표시</string>
+ <string name="remove_feed_label">팟캐스트 제거</string>
<string name="share_link_label">홈페이지 링크 공유</string>
<string name="share_source_label">피드 링크 공유</string>
<string name="feed_delete_confirmation_msg">이 피드와 이 피드에서 다운로드한 모든 에피소드를 삭제하시려면 확인을 누르십시오.</string>
@@ -61,8 +78,10 @@
<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="remove_episode_lable">에피소드 제거</string>
<string name="mark_read_label">읽은 것으로 표시</string>
<string name="mark_unread_label">읽지 않은 것으로 표시</string>
<string name="add_to_queue_label">대기열에 추가</string>
@@ -73,6 +92,8 @@
<string name="download_all">모두 다운로드</string>
<string name="skip_episode_label">에피소드 건너뛰기</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>
@@ -93,6 +114,7 @@
<string name="download_error_request_error">요청 오류</string>
<string name="download_error_db_access">데이터베이스 접근 오류</string>
<string name="downloads_left">개\u0020다운로드 남음</string>
+ <string name="downloads_processing">다운로드 처리 중</string>
<string name="download_notification_title">팟캐스트 데이터 다운로드 중</string>
<string name="download_report_content">다운로드 %1$d개 성공, %2$d개 실패</string>
<string name="download_log_title_unknown">알 수 없는 제목</string>
@@ -114,6 +136,7 @@
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">버퍼링 중</string>
<string name="playbackservice_notification_title">팟캐스트 재생 중</string>
+ <string name="unknown_media_key">안테나팟 - 알 수 없는 미디어 키: %1$d</string>
<!--Queue operations-->
<string name="clear_queue_label">대기열 지우기</string>
<string name="undo">실행 취소</string>
@@ -127,6 +150,7 @@
<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 계정을 안테나팟에 연결하지 않았습니다. 인증하려면 누르십시오.</string>
<string name="no_flattr_token_msg">Flattr 계정이 안테나팟에 연결되지 않은 것 같습니다. 앱 안에서 안테나팟을 Flattr 계정에 연결할 수도 있고, Flattr 홈페이지에서 Flattr할 거리를 선택할 수 있습니다.</string>
<string name="authenticate_now_label">인증</string>
<string name="action_forbidden_title">금지된 동작입니다</string>
@@ -146,9 +170,9 @@
<string name="flattrd_failed_label">안테나팟에서 Flattr 실패</string>
<string name="flattr_retrieving_status">Flattr한 내용 가져오는 중</string>
<!--Variable Speed-->
- <string name="download_plugin_label">다운로드 플러그인</string>
+ <string name="download_plugin_label">플러그인 다운로드</string>
<string name="no_playback_plugin_title">플러그인을 설치하지 않았습니다</string>
- <string name="no_playback_plugin_msg">여러가지 속도로 재생하려면 외부 라이브러리를 설치해야 합니다.\n\n플레이 스토어에서 무료 플러그인을 설치하려면 \"플러그인 다운로드\"를 누르십시오.\n\n이 플러그인에서 발생하는 문제는 안테나팟의 책임이 아니므로 플러그인 개발자에게 문의하십시오.</string>
+ <string name="no_playback_plugin_msg">재생 속도 조절이 동작하려면 외부 라이브러리를 설치해야 합니다.\n\nPlay Store에서 무료 플러그인을 다운로드하려면 \'플러그인 다운로드\'를 누르십시오.\n\n이 플러그인을 사용하면서 생기는 문제는 안테나팟의 책임이 아니므로 해당 플러그인의 관리자에게 문의하십시오.</string>
<string name="set_playback_speed_label">재생 속도</string>
<!--Empty list labels-->
<string name="no_items_label">이 목록에 항목이 없습니다.</string>
@@ -180,6 +204,7 @@
<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">자동 flattr 설정</string>
<string name="user_interface_label">사용자 인터페이스</string>
<string name="pref_set_theme_title">테마 선택</string>
<string name="pref_set_theme_sum">안테나팟의 겉모양을 바꿉니다.</string>
@@ -202,9 +227,20 @@
<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_seek_delta_title">넘기기 간격</string>
+ <string name="pref_seek_delta_sum">뒤나 앞으로 이동할 때 몇 초를 넘어갈지 지정합니다</string>
<string name="pref_gpodnet_sethostname_title">호스트 이름 설정</string>
<string name="pref_gpodnet_sethostname_use_default_host">기본 호스트 사용</string>
+ <string name="pref_expandNotify_title">알림 확장</string>
+ <string name="pref_expandNotify_sum">항상 알림에서 재생 버튼이 표시되도록 확장</string>
+ <string name="pref_persistNotify_title">재생 조작 고정</string>
+ <string name="pref_persistNotify_sum">재생이 일시 중지했을 때에도 알림과 잠금 화면의 조작 기능 유지</string>
+ <string name="pref_expand_notify_unsupport_toast">안드로이드 4.1 전 버전에서는 알림 확장을 지원하지 않습니다.</string>
<!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">자동 flattr 사용</string>
+ <string name="auto_flattr_after_percent">%d 퍼센트를 재생하면 에피소드에 flattr합니다</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>
@@ -236,6 +272,9 @@
<string name="sleep_timer_label">취침 타이머</string>
<string name="time_left_label">남은 시간:\u0020</string>
<string name="time_dialog_invalid_input">입력이 잘못되었습니다. 시간으로 숫자를 입력해야 합니다.</string>
+ <string name="time_unit_seconds">초</string>
+ <string name="time_unit_minutes">분</string>
+ <string name="time_unit_hours">시간</string>
<!--gpodder.net-->
<string name="gpodnet_taglist_header">분류</string>
<string name="gpodnet_toplist_header">상위 팟캐스트</string>
@@ -244,7 +283,7 @@
<string name="gpodnetauth_login_title">로그인</string>
<string name="gpodnetauth_login_descr">gpodder.net 로그인입니다. 먼저 로그인 정보를 입력하십시오:</string>
<string name="gpodnetauth_login_butLabel">로그인</string>
- <string name="gpodnetauth_login_register">아직 계정이 없으면, 다음 사이트에서 만들 수 있습니다:\nhttps://gpodder.net/register/</string>
+ <string name="gpodnetauth_login_register">아직 계정이 없으면 다음에서 만들 수 있습니다:\nhttps://gpodder.net/register/</string>
<string name="username_label">사용자 이름</string>
<string name="password_label">암호</string>
<string name="gpodnetauth_device_title">장치 선택</string>
@@ -299,7 +338,10 @@
<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>
<!--Feed information screen-->
+ <string name="authentication_label">인증</string>
+ <string name="authentication_descr">이 팟캐스트와 에피소드에 대한 사용자 이름과 비밀번호를 바꿉니다.</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">단일 용도 앱에서 구독 정보를 가져옵니다...</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a0c852059..9df199324 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -148,7 +148,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">Plugin downloaden</string>
<string name="no_playback_plugin_title">Plugin niet geinstalleerd</string>
- <string name="no_playback_plugin_msg">Voor variabele afspeelsnelheid moet er een derde partij bibliotheek geïnstalleerd worden.\n\nTik op \'Plugin downloaden\' om een ​​gratis plugin te downloaden uit de Play Store.\n\nEventuele problemen gevonden door het gebruik van deze plugin zijn niet de verantwoordelijkheid van AntennaPod en moeten aan de plugin ontwikkelaar gemeld worden.</string>
<string name="set_playback_speed_label">Afspeelsnelheden</string>
<!--Empty list labels-->
<string name="no_items_label">Er zijn geen items in deze lijst.</string>
@@ -244,7 +243,6 @@
<string name="gpodnetauth_login_title">Log in</string>
<string name="gpodnetauth_login_descr">Welkom op de gpodder.net login proces. Eerst, typ je login gegevens:</string>
<string name="gpodnetauth_login_butLabel">Log in</string>
- <string name="gpodnetauth_login_register">Als je nog geen account hebt, kun je er hier een aanmaken:\n https://gpodder.net/register/</string>
<string name="username_label">Gebruikersnaam</string>
<string name="password_label">Wachtwoord</string>
<string name="gpodnetauth_device_title">Apparaatselectie</string>
diff --git a/res/values-pl-rPL/strings.xml b/res/values-pl-rPL/strings.xml
index fc56ab6bf..ed8abb227 100644
--- a/res/values-pl-rPL/strings.xml
+++ b/res/values-pl-rPL/strings.xml
@@ -31,6 +31,7 @@
<string name="copy_url_label">Kopiuj adres</string>
<string name="share_url_label">Udostępnij adres</string>
<string name="copied_url_msg">Skopiowano adres do schowka.</string>
+ <string name="go_to_position_label">Przejdź do tego miejsca</string>
<!--Playback history-->
<string name="clear_history_label">Wyczyść historię</string>
<!--Other-->
@@ -59,6 +60,7 @@
<string name="auto_download_label">Dołącz do automatycznego pobierania</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">Adres kanału</string>
+ <string name="etxtFeedurlHint">Adres URL kanału lub strony internetowej</string>
<string name="txtvfeedurl_label">Dodaj podcast przez adres</string>
<string name="podcastdirectories_label">Znajdź podcast w folderze</string>
<string name="podcastdirectories_descr">Możesz wyszukiwać nowe podcasty ze względu na nazwę, kategorię lub popularność na gpodder.net</string>
@@ -76,6 +78,7 @@
<string name="download_label">Pobierz</string>
<string name="play_label">Odtwórz</string>
<string name="pause_label">Pauza</string>
+ <string name="stop_label">Stop</string>
<string name="stream_label">Strumień</string>
<string name="remove_label">Usuń</string>
<string name="remove_episode_lable">Usuń odcinek</string>
@@ -133,6 +136,7 @@
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">Buferowanie</string>
<string name="playbackservice_notification_title">Odtwarzenie podcastu </string>
+ <string name="unknown_media_key">AntennaPod - Nieznany klawisz: %1$d</string>
<!--Queue operations-->
<string name="clear_queue_label">Wyczyść kolejkę</string>
<string name="undo">Cofnij</string>
@@ -146,6 +150,7 @@
<string name="return_home_label">Wróć do ekranu głównego</string>
<string name="flattr_auth_success">Autoryzacja się powiodła. Możesz teraz używać flattr w aplikacji.</string>
<string name="no_flattr_token_title">Nie znaleziono tokenu Flattr</string>
+ <string name="no_flattr_token_notification_msg">Twoje konto flattr nie jest połączone z AntennaPod. Naciśnij tutaj aby autoryzować.</string>
<string name="no_flattr_token_msg">Twoje konto Flattr wydaje się nie być podłączone do AntennaPod. Możesz połączyć konto do AntennaPod by przez program flattr-ować lub możesz odwiedzić stronę wątku by zrobić to tam.</string>
<string name="authenticate_now_label">Autoryzuj</string>
<string name="action_forbidden_title">Akcja zabroniona</string>
@@ -167,7 +172,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Pobierz wtyczkę</string>
<string name="no_playback_plugin_title">Wtyczka nie zainstalowana</string>
- <string name="no_playback_plugin_msg">Do odtwarzania ze zmienną prędkością jest potrzebna biblioteka innej firmy. \n\nDotknij przycisku \"Pobierz wtyczkę\", aby pobrać darmową wtyczkę ze sklepu\n\nWszelkie znalezione za pomocą tej wtyczki problemy nie są odpowiedzialnością AntennaPod i należy zgłosić się do właściciela plugin.</string>
+ <string name="no_playback_plugin_msg">Aby odtwarzać ze zmienną prędkością niezbędna jest instalacja biblioteki innej firmy.\n\nDotknij \'Pobierz wtyczkę\' aby pobrać darmową wtyczkę z Play Store\n\nAntennaPod nie odpowiada za problemy wynikłe z używania tej wtyczki, które powinny zostać zgłoszone bezpośrednio autorowi wtyczki.</string>
<string name="set_playback_speed_label">Prędkość odtwarzania</string>
<!--Empty list labels-->
<string name="no_items_label">Brak elementów na tej liście.</string>
@@ -199,6 +204,7 @@
<string name="pref_revokeAccess_title">Anuluj dostęp</string>
<string name="pref_revokeAccess_sum">Anuluj dostęp tej aplikacji do konta Flattr </string>
<string name="pref_auto_flattr_title">Automatyczne wsparcie na Flattr</string>
+ <string name="pref_auto_flattr_sum">Skonfiguruj automatyczne flattr-owanie</string>
<string name="user_interface_label">Interfejs użytkownika</string>
<string name="pref_set_theme_title">Wybierz motyw</string>
<string name="pref_set_theme_sum">Zmień wygląd AntennaPod.</string>
@@ -223,6 +229,7 @@
<string name="pref_playback_speed_sum">Dostosuj prędkości dostępne dla odtwarzania audio o zmiennej prędkości</string>
<string name="pref_gpodnet_sethostname_title">Ustaw nazwę hosta</string>
<string name="pref_gpodnet_sethostname_use_default_host">Użyj domyślnego hosta</string>
+ <string name="pref_expandNotify_title">Rozwiń Powiadomienia</string>
<!--Auto-Flattr dialog-->
<!--Search-->
<string name="search_hint">Szukaj kanałów lub odcinków</string>
@@ -266,7 +273,6 @@
<string name="gpodnetauth_login_title">Login</string>
<string name="gpodnetauth_login_descr">Witamy w procesie logowania do gpodder.net. Najpierw podaj swoje dane logowania:</string>
<string name="gpodnetauth_login_butLabel">Login</string>
- <string name="gpodnetauth_login_register">Jeśli nie masz jeszcze konta, możesz utworzyć je tutaj:\nhttps://gpodder.net/register/</string>
<string name="username_label">Nazwa użytkownika</string>
<string name="password_label">Hasło</string>
<string name="gpodnetauth_device_title">Wybór urządzenia</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 62fd9c046..ef63e718e 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -134,7 +134,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">Download Plugin</string>
<string name="no_playback_plugin_title">Plugin Não Instalado</string>
- <string name="no_playback_plugin_msg">Para velocidade variável de reprodução funcionar uma biblioteca de terceiros deve ser instalada.\n\nToque em \'Download Plugin\' para baixar um plugin grátis na Play Store.\n\nQuaisquer problemas encontrados usando esse plugin não é responsabilidade do AntennaPod e deve ser reportado ao proprietário do plugin.</string>
<string name="set_playback_speed_label">Velocidades de Reprodução</string>
<!--Empty list labels-->
<string name="no_items_label">Não existem itens nesta lista.</string>
@@ -229,7 +228,6 @@
<string name="gpodnetauth_login_title">Login</string>
<string name="gpodnetauth_login_descr">Bem-vindo ao processo de login gpodder.net. Primeiramente, digite suas informações:</string>
<string name="gpodnetauth_login_butLabel">Login</string>
- <string name="gpodnetauth_login_register">Se ainda não possui uma conta, você pode criar uma aqui:\nhttps://gpodder.net/register/</string>
<string name="username_label">Nome do usuário</string>
<string name="password_label">Senha</string>
<string name="gpodnetauth_device_title">Seleção de dispositivo</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index f1e525384..d43845ae4 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -78,6 +78,7 @@
<string name="download_label">Transferir</string>
<string name="play_label">Reproduzir</string>
<string name="pause_label">Pausa</string>
+ <string name="stop_label">Parar</string>
<string name="stream_label">Emitir</string>
<string name="remove_label">Remover</string>
<string name="remove_episode_lable">Remover episódio</string>
@@ -171,7 +172,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Transferir extra</string>
<string name="no_playback_plugin_title">Extra não instalado</string>
- <string name="no_playback_plugin_msg">Para melhorar a reprodução, deve transferir e instalar um biblioteca de terceiros.\nClique Transferir extra para transferir o extra através da loja Google.\n\nSe encontrar problemas ao utilizar esta biblioteca, os programadores do AntennaPod não podem ser responsabilizados e deve contactar o programador do extra.</string>
+ <string name="no_playback_plugin_msg">Para que a velocidade de reprodução variável funcione, tem que instalar um biblioteca de terceiros.\n\nClique em Transferir extra para a transferir no Google Play.\n\nQuaisquer problemas que ocorram na utilização do extra devem ser reportados diretamente ao seu programador.</string>
<string name="set_playback_speed_label">Velocidades de reprodução</string>
<!--Empty list labels-->
<string name="no_items_label">Não existem itens na lista.</string>
@@ -230,6 +231,11 @@
<string name="pref_seek_delta_sum">Ao recuar ou avançar, procurar este valor de segundos</string>
<string name="pref_gpodnet_sethostname_title">Definir nome de servidor</string>
<string name="pref_gpodnet_sethostname_use_default_host">Utilizar pré-definição</string>
+ <string name="pref_expandNotify_title">Expansão de notificação</string>
+ <string name="pref_expandNotify_sum">Expandir sempre a notificação para mostrar os botões de reprodução.</string>
+ <string name="pref_persistNotify_title">Controlos de reprodução persistentes</string>
+ <string name="pref_persistNotify_sum">Manter controlos de notificação e ecrã de bloqueio ao colocar a reprodução em pausa.</string>
+ <string name="pref_expand_notify_unsupport_toast">As versões Android anteriores à 4.1 não possuem suporte à expansão de notificações.</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Ativar flattr automático</string>
<string name="auto_flattr_after_percent">Flattr de episódios ao atingir %d porcento de reprodução</string>
diff --git a/res/values-ro-rRO/strings.xml b/res/values-ro-rRO/strings.xml
index a6e782f74..6cc93e4a9 100644
--- a/res/values-ro-rRO/strings.xml
+++ b/res/values-ro-rRO/strings.xml
@@ -126,7 +126,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">Descarcă plugin</string>
<string name="no_playback_plugin_title">Plugin neinstalat</string>
- <string name="no_playback_plugin_msg">Pentru ca viteza variabilă de ascultare să funcționeze este necesară o librărie externă.\n\nApăsați \'Descarcă Plugin\' pentru a descărca un plugin gratuit din Play Store\n\nOrice probleme găsite folosind acest plugin nu sunt responsabilitatea AntennaPod și trebuie raportate autorului pluginului.</string>
<string name="set_playback_speed_label">Viteze de ascultare</string>
<!--Empty list labels-->
<string name="no_items_label">Nu sunt elemente în listă.</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c5c642da0..400c3a543 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -3,6 +3,7 @@
<!--Activitiy and fragment titles-->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Каналы</string>
+ <string name="add_feed_label">Добавить подкаст</string>
<string name="podcasts_label">Подкасты</string>
<string name="episodes_label">Выпуски</string>
<string name="new_episodes_label">Новые выпуски</string>
@@ -57,7 +58,7 @@
<string name="mark_all_read_label">Отметить все как прочитанное</string>
<string name="show_info_label">Показать информацию</string>
<string name="remove_feed_label">Удалить подкаст</string>
- <string name="share_link_label">Ссылка на сайт</string>
+ <string name="share_link_label">Поделиться ссылкой на сайт</string>
<string name="share_source_label">Ссылка на канал</string>
<string name="feed_delete_confirmation_msg">Подтвердите удаление канала и ВСЕХ загруженных с этого канала выпусков.</string>
<string name="feed_remover_msg">Удаление канала</string>
@@ -154,7 +155,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">Загрузить плагин</string>
<string name="no_playback_plugin_title">Плагин не установлен</string>
- <string name="no_playback_plugin_msg">Для изменения скорости воспроизведения должна быть установлена сторонняя библиотека.⏎\n⏎\nНажмите «Загрузить плагин», чтобы загрузить беспалтный плагин из Play Store⏎\n⏎\nЛюбые проблемы при использовании плагина не являются ответственностью AntennaPod и о них следует сообщать владельцу плагину.</string>
<string name="set_playback_speed_label">Скорость воспроизведения</string>
<!--Empty list labels-->
<string name="no_items_label">Список пуст</string>
@@ -250,7 +250,6 @@
<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>
diff --git a/res/values-sv-rSE/strings.xml b/res/values-sv-rSE/strings.xml
index e17f54fa5..622741dc5 100644
--- a/res/values-sv-rSE/strings.xml
+++ b/res/values-sv-rSE/strings.xml
@@ -78,6 +78,7 @@
<string name="download_label">Ladda ned</string>
<string name="play_label">Spela</string>
<string name="pause_label">Pausa</string>
+ <string name="stop_label">Stopp</string>
<string name="stream_label">Stream</string>
<string name="remove_label">Ta bort</string>
<string name="remove_episode_lable">Ta bort episod</string>
@@ -230,6 +231,11 @@
<string name="pref_seek_delta_sum">Sök så här många sekunder vid snabbspolning bakåt eller framåt</string>
<string name="pref_gpodnet_sethostname_title">Sätt värdnamn</string>
<string name="pref_gpodnet_sethostname_use_default_host">Använd standardvärden</string>
+ <string name="pref_expandNotify_title">Expandera notifieringar</string>
+ <string name="pref_expandNotify_sum">Expandera alltid notifieringen för att visa uppspelningskontrollerna.</string>
+ <string name="pref_persistNotify_title">Bestående uppspelningskontroller</string>
+ <string name="pref_persistNotify_sum">Behåll notifiering och kontroller på låsskärmen när uppspelningen pausas.</string>
+ <string name="pref_expand_notify_unsupport_toast">Androidversioner före 4.1 har inte stöd för expanderade notifieringar.</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Aktivera automatisk Flattring</string>
<string name="auto_flattr_after_percent">Flattra episoden så snart %d procent har spelats</string>
diff --git a/res/values-uk-rUA/strings.xml b/res/values-uk-rUA/strings.xml
index 6653e6614..64f5c38af 100644
--- a/res/values-uk-rUA/strings.xml
+++ b/res/values-uk-rUA/strings.xml
@@ -3,6 +3,7 @@
<!--Activitiy and fragment titles-->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Канали</string>
+ <string name="add_feed_label">Додати подкаст</string>
<string name="podcasts_label">Подкасти</string>
<string name="episodes_label">Епізоди</string>
<string name="new_episodes_label">Нові епізоди</string>
@@ -30,6 +31,7 @@
<string name="copy_url_label">Копія URL</string>
<string name="share_url_label">Поділитися URL</string>
<string name="copied_url_msg">Копіювати URL в clipboard</string>
+ <string name="go_to_position_label">До цієї позиції</string>
<!--Playback history-->
<string name="clear_history_label">Забути</string>
<!--Other-->
@@ -58,6 +60,7 @@
<string name="auto_download_label">Включити до автозавантаження</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">Посилання на канал</string>
+ <string name="etxtFeedurlHint">URL канала або сайта</string>
<string name="txtvfeedurl_label">Додати подкаст за URL</string>
<string name="podcastdirectories_label">Знайти подкаст в каталозі</string>
<string name="podcastdirectories_descr">В каталозі gpodder.net можливий пошук за назвою, категорією або популярністю.</string>
@@ -75,6 +78,7 @@
<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="remove_episode_lable">Видалити епізод</string>
@@ -132,6 +136,7 @@
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">Буферізую</string>
<string name="playbackservice_notification_title">Грає подкаст</string>
+ <string name="unknown_media_key">AntennaPod - Невідомий медіа ключ: %1$d</string>
<!--Queue operations-->
<string name="clear_queue_label">Очистити чергу</string>
<string name="undo">Скасувати</string>
@@ -145,6 +150,7 @@
<string name="return_home_label">Повернення до початку</string>
<string name="flattr_auth_success">Вийшло авторізуватись. Тепер ви можете flattr things за допомогою додатку</string>
<string name="no_flattr_token_title">Немає flattr token</string>
+ <string name="no_flattr_token_notification_msg">Ваш обліковий запис flattr, здається, не підключений до AntennaPod. Натисніть тут для підключення.</string>
<string name="no_flattr_token_msg">Здається ваш обліковий запис flattr не під\'єднано до AntennaPod. Ви можете або під\'єднати її або відкривати web сторінку в браузері</string>
<string name="authenticate_now_label">Пароль та логін</string>
<string name="action_forbidden_title">Заборонено</string>
@@ -166,7 +172,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Завантажити Plugin</string>
<string name="no_playback_plugin_title">Plugin не встановлено</string>
- <string name="no_playback_plugin_msg">Для керування швидкістю програвання потрібно встановити plugin\nНатисніть \"Завантажити Plugin\" для завантаження безкоштовного plugin з Play Store\nЯкщо при використанні plugin будуть які небудь проблеми це відповідальність автору plugin, а не автору AntennaPod</string>
+ <string name="no_playback_plugin_msg">Для керування швидкістю програвання потрібно встановити додаток.\n\nНатисніть \"Завантажити додаток\" для завантаження безкоштовного додатку з Play Store\n\nЯкщо при використанні plugin виникнуть будь які проблеми - це відповідальність автора додатка, а не автора AntennaPod.</string>
<string name="set_playback_speed_label">Швидкість програвання</string>
<!--Empty list labels-->
<string name="no_items_label">Нічного в цьому списку</string>
@@ -198,6 +204,7 @@
<string name="pref_revokeAccess_title">Відкликати доступ</string>
<string name="pref_revokeAccess_sum">Відкликати дозвіл на доступ до вашого flattr з цього додатку</string>
<string name="pref_auto_flattr_title">Automatic Flattr</string>
+ <string name="pref_auto_flattr_sum">Налаштування автоматичного заохочення авторів через сервіс flattr</string>
<string name="user_interface_label">Зовнішній вид</string>
<string name="pref_set_theme_title">Обрати тему</string>
<string name="pref_set_theme_sum">Змінити появу AntennaPod</string>
@@ -220,9 +227,20 @@
<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_seek_delta_title">Час перемотки</string>
+ <string name="pref_seek_delta_sum">Перейти на таку кількість секунд при перемотуванні назад або вперед</string>
<string name="pref_gpodnet_sethostname_title">Встановити ім\'я хоста</string>
<string name="pref_gpodnet_sethostname_use_default_host">Використати хост по замовчанню</string>
+ <string name="pref_expandNotify_title">Розгорнути повідомлення</string>
+ <string name="pref_expandNotify_sum">Завжди розгортати повідомлення, щоб показати кнопки керування.</string>
+ <string name="pref_persistNotify_title">Завжди показувати елементи керування відтворенням</string>
+ <string name="pref_persistNotify_sum">Показувати повідомлення та елементи керування на lockscreen в режимі паузи.</string>
+ <string name="pref_expand_notify_unsupport_toast">Android до версії 4.1 не підтримує розширені повідомлення.</string>
<!--Auto-Flattr dialog-->
+ <string name="auto_flattr_enable">Включити автоматичне заохочення авторів через сервіс flattr</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>
@@ -231,7 +249,7 @@
<string name="search_label">Пошук</string>
<string name="found_in_title_label">Знайдено у назві</string>
<!--OPML import and export-->
- <string name="opml_import_txtv_button_lable">OPML файли дозволяют вам перенести подскати з однієї программи до іншої</string>
+ <string name="opml_import_txtv_button_lable">OPML файли дозволяют вам перенести подкасти з однієї программи до іншої</string>
<string name="opml_import_explanation">Для імпорту OPML файлу, скопіюйте його в цю папку та натіснить кнопку внизу для початку імпорту</string>
<string name="start_import_label">Почати імпорт</string>
<string name="opml_import_label">OPML імпорт</string>
@@ -265,7 +283,7 @@
<string name="gpodnetauth_login_title">Логін</string>
<string name="gpodnetauth_login_descr">Ласкаво просимо до gpodder.net. Зпочатку заповнить вашу інформацію для входу</string>
<string name="gpodnetauth_login_butLabel">Логін</string>
- <string name="gpodnetauth_login_register">Якщо ви щє не маєте логіну, ви можете отримати тут:\nhttps://gpodder.net/register</string>
+ <string name="gpodnetauth_login_register">Якщо у вас немає облікового запису, ви можете створити його тут:\nhttps://gpodder.net/register/</string>
<string name="username_label">Ім\'я користувача</string>
<string name="password_label">Пароль</string>
<string name="gpodnetauth_device_title">Обрати пристрій</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 63320b851..59958ec35 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -155,7 +155,6 @@
<!--Variable Speed-->
<string name="download_plugin_label">插件下载</string>
<string name="no_playback_plugin_title">插件没有安装</string>
- <string name="no_playback_plugin_msg">安装第三方库后播放速度设置起作用.\n点击 \'插件下载\' 从 \'Pay 商店\' 下载免费插件.\n使用这些插件中碰到的任何问题请报告给插件作者, 跟 AntennaPod 无关.</string>
<string name="set_playback_speed_label">播放速度</string>
<!--Empty list labels-->
<string name="no_items_label">列表为空.</string>
@@ -183,7 +182,8 @@
<string name="pref_flattr_auth_title">Flattr 登录</string>
<string name="pref_flattr_auth_sum">登录 Flattr 账户, 以便直接使用本应用中的相关功能.</string>
<string name="pref_flattr_this_app_title">Flattr 本应用</string>
- <string name="pref_flattr_this_app_sum">支持 AntennaPod 发展, 请 Flattring 他. 谢谢!!\n</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="user_interface_label">界面</string>
@@ -253,7 +253,6 @@
<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>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index f09c76080..9b9079021 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -32,6 +32,9 @@
</string-array>
<string-array name="episode_cache_size_entries">
<item>@string/pref_episode_cache_unlimited</item>
+ <item>1</item>
+ <item>2</item>
+ <item>5</item>
<item>10</item>
<item>20</item>
<item>40</item>
@@ -41,6 +44,9 @@
</string-array>
<string-array name="episode_cache_size_values">
<item>-1</item>
+ <item>1</item>
+ <item>2</item>
+ <item>5</item>
<item>10</item>
<item>20</item>
<item>40</item>
@@ -111,4 +117,4 @@
<item>0</item>
<item>1</item>
</string-array>
-</resources> \ No newline at end of file
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b5cc4ee86..6a62f5e14 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -90,6 +90,7 @@
<string name="download_label">Download</string>
<string name="play_label">Play</string>
<string name="pause_label">Pause</string>
+ <string name="stop_label">Stop</string>
<string name="stream_label">Stream</string>
<string name="remove_label">Remove</string>
<string name="remove_episode_lable">Remove episode</string>
@@ -250,6 +251,11 @@
<string name="pref_seek_delta_sum">Seek this many seconds when rewinding or fast-forwarding</string>
<string name="pref_gpodnet_sethostname_title">Set hostname</string>
<string name="pref_gpodnet_sethostname_use_default_host">Use default host</string>
+ <string name="pref_expandNotify_title">Expand Notification</string>
+ <string name="pref_expandNotify_sum">Always expand the notification to show playback buttons.</string>
+ <string name="pref_persistNotify_title">Persistent playback controls</string>
+ <string name="pref_persistNotify_sum">Keep notification and lockscreen controls when playback is paused.</string>
+ <string name="pref_expand_notify_unsupport_toast">Android versions before 4.1 do not support expanded notifications.</string>
<!-- Auto-Flattr dialog -->
<string name="auto_flattr_enable">Enable automatic flattring</string>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 470e1a1fe..5175acdcb 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -9,6 +9,18 @@
android:key="prefTheme"
android:summary="@string/pref_set_theme_sum"
android:defaultValue="0"/>
+ <CheckBoxPreference
+ android:defaultValue="false"
+ android:enabled="true"
+ android:key="prefExpandNotify"
+ android:summary="@string/pref_expandNotify_sum"
+ android:title="@string/pref_expandNotify_title"/>
+ <CheckBoxPreference
+ android:defaultValue="false"
+ android:enabled="true"
+ android:key="prefPersistNotify"
+ android:summary="@string/pref_persistNotify_sum"
+ android:title="@string/pref_persistNotify_title"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/playback_pref">
<CheckBoxPreference
diff --git a/src/com/aocate/media/ServiceBackedMediaPlayer.java b/src/com/aocate/media/ServiceBackedMediaPlayer.java
index ef4572d33..8d08867ef 100644
--- a/src/com/aocate/media/ServiceBackedMediaPlayer.java
+++ b/src/com/aocate/media/ServiceBackedMediaPlayer.java
@@ -11,6 +11,12 @@
// 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.
+//
+// -----------------------------------------------------------------------
+// Compared to the original version, this class been slightly modified so
+// that any acquired WakeLocks are only held while the MediaPlayer is
+// playing (see the stayAwake method for more details).
+
package com.aocate.media;
@@ -40,6 +46,8 @@ import com.aocate.presto.service.IOnSeekCompleteListenerCallback_0_8;
import com.aocate.presto.service.IOnSpeedAdjustmentAvailableChangedListenerCallback_0_8;
import com.aocate.presto.service.IPlayMedia_0_8;
+import de.danoeh.antennapod.BuildConfig;
+
/**
* Class for connecting to remote speed-altering, media playing Service
* Note that there is unusually high coupling between MediaPlayer and this
@@ -206,6 +214,7 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
void error(int what, int extra) {
owningMediaPlayer.lock.lock();
Log.e(SBMP_TAG, "error(" + what + ", " + extra + ")");
+ stayAwake(false);
try {
if (!this.isErroring) {
this.isErroring = true;
@@ -478,6 +487,7 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
e.printStackTrace();
ServiceBackedMediaPlayer.this.error(MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
}
+ stayAwake(false);
}
/**
@@ -581,6 +591,7 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
e.printStackTrace();
ServiceBackedMediaPlayer.this.error(MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
}
+ stayAwake(false);
}
/**
@@ -870,12 +881,28 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
// Since mode can't be changed on the fly, we have to allocate a new one
this.mWakeLock = pm.newWakeLock(mode, this.getClass().getName());
+ this.mWakeLock.setReferenceCounted(false);
}
this.mWakeLock.acquire();
}
}
+ /**
+ * Changes the state of the WakeLock if it has been acquired.
+ * If no WakeLock has been acquired with setWakeMode, this method does nothing.
+ * */
+ private void stayAwake(boolean awake) {
+ if (BuildConfig.DEBUG) Log.d(SBMP_TAG, "stayAwake(" + awake + ")");
+ if (mWakeLock != null) {
+ if (awake && !mWakeLock.isHeld()) {
+ mWakeLock.acquire();
+ } else if (!awake && mWakeLock.isHeld()) {
+ mWakeLock.release();
+ }
+ }
+ }
+
private IOnBufferingUpdateListenerCallback_0_8.Stub mOnBufferingUpdateCallback = null;
private void setOnBufferingUpdateCallback(IPlayMedia_0_8 iface) {
try {
@@ -913,6 +940,7 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
public void onCompletion() throws RemoteException {
owningMediaPlayer.lock.lock();
Log.d(SBMP_TAG, "onCompletionListener being called");
+ stayAwake(false);
try {
if (owningMediaPlayer.onCompletionListener != null) {
owningMediaPlayer.onCompletionListener.onCompletion(owningMediaPlayer);
@@ -940,7 +968,8 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
this.mOnErrorCallback = new IOnErrorListenerCallback_0_8.Stub() {
public boolean onError(int what, int extra) throws RemoteException {
owningMediaPlayer.lock.lock();
- try {
+ stayAwake(false);
+ try {
if (owningMediaPlayer.onErrorListener != null) {
return owningMediaPlayer.onErrorListener.onError(owningMediaPlayer, what, extra);
}
@@ -1146,6 +1175,7 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
e.printStackTrace();
ServiceBackedMediaPlayer.this.error(MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
}
+ stayAwake(true);
}
/**
@@ -1166,5 +1196,6 @@ public class ServiceBackedMediaPlayer extends MediaPlayerImpl {
e.printStackTrace();
ServiceBackedMediaPlayer.this.error(MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
}
+ stayAwake(false);
}
} \ No newline at end of file
diff --git a/src/de/danoeh/antennapod/AppConfig.java b/src/de/danoeh/antennapod/AppConfig.java
index 7a75e3a18..24f13d4a3 100644
--- a/src/de/danoeh/antennapod/AppConfig.java
+++ b/src/de/danoeh/antennapod/AppConfig.java
@@ -2,6 +2,6 @@ package de.danoeh.antennapod;
public final class AppConfig {
/** Should be used when setting User-Agent header for HTTP-requests. */
- public final static String USER_AGENT = "AntennaPod/0.9.9.3";
+ public final static String USER_AGENT = "AntennaPod/0.9.9.4";
}
diff --git a/src/de/danoeh/antennapod/activity/AudioplayerActivity.java b/src/de/danoeh/antennapod/activity/AudioplayerActivity.java
index 50f5d8f2e..18d27ddda 100644
--- a/src/de/danoeh/antennapod/activity/AudioplayerActivity.java
+++ b/src/de/danoeh/antennapod/activity/AudioplayerActivity.java
@@ -343,7 +343,6 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
} else {
ft.add(R.id.contentView, currentlyShownFragment);
}
- ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.disallowAddToBackStack();
ft.commit();
updateNavButtonDrawable();
@@ -383,6 +382,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
public void run() {
PicassoProvider.getMediaMetadataPicassoInstance(AudioplayerActivity.this)
.load(media.getImageUri())
+ .fit()
.into(butNavLeft);
}
});
@@ -399,6 +399,7 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc
public void run() {
PicassoProvider.getMediaMetadataPicassoInstance(AudioplayerActivity.this)
.load(media.getImageUri())
+ .fit()
.into(butNavLeft);
}
diff --git a/src/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java b/src/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java
index 86b278bf0..e8bc75293 100644
--- a/src/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java
+++ b/src/de/danoeh/antennapod/activity/DefaultOnlineFeedViewActivity.java
@@ -122,11 +122,10 @@ public class DefaultOnlineFeedViewActivity extends OnlineFeedViewActivity {
subscribeButton = (Button) header.findViewById(R.id.butSubscribe);
- if (feed.getImage() != null) {
- int imageSize = (int) getResources().getDimension(R.dimen.thumbnail_length);
+ if (feed.getImage() != null && StringUtils.isNoneBlank(feed.getImage().getDownload_url())) {
PicassoProvider.getDefaultPicassoInstance(this)
.load(feed.getImage().getDownload_url())
- .resize(imageSize, imageSize)
+ .fit()
.into(cover);
}
diff --git a/src/de/danoeh/antennapod/activity/FeedInfoActivity.java b/src/de/danoeh/antennapod/activity/FeedInfoActivity.java
index b46bc7546..5cf187eb6 100644
--- a/src/de/danoeh/antennapod/activity/FeedInfoActivity.java
+++ b/src/de/danoeh/antennapod/activity/FeedInfoActivity.java
@@ -80,6 +80,7 @@ public class FeedInfoActivity extends ActionBarActivity {
public void run() {
PicassoProvider.getDefaultPicassoInstance(FeedInfoActivity.this)
.load(feed.getImageUri())
+ .fit()
.into(imgvCover);
}
});
diff --git a/src/de/danoeh/antennapod/activity/MediaplayerActivity.java b/src/de/danoeh/antennapod/activity/MediaplayerActivity.java
index 13e7b8a82..2e5372b60 100644
--- a/src/de/danoeh/antennapod/activity/MediaplayerActivity.java
+++ b/src/de/danoeh/antennapod/activity/MediaplayerActivity.java
@@ -502,18 +502,24 @@ public abstract class MediaplayerActivity extends ActionBarActivity
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
- prog = controller.onSeekBarProgressChanged(seekBar, progress, fromUser,
- txtvPosition);
+ if (controller != null) {
+ prog = controller.onSeekBarProgressChanged(seekBar, progress, fromUser,
+ txtvPosition);
+ }
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
- controller.onSeekBarStartTrackingTouch(seekBar);
+ if (controller != null) {
+ controller.onSeekBarStartTrackingTouch(seekBar);
+ }
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
- controller.onSeekBarStopTrackingTouch(seekBar, prog);
+ if (controller != null) {
+ controller.onSeekBarStopTrackingTouch(seekBar, prog);
+ }
}
}
diff --git a/src/de/danoeh/antennapod/activity/PreferenceActivity.java b/src/de/danoeh/antennapod/activity/PreferenceActivity.java
index cd6731c02..a21985bb8 100644
--- a/src/de/danoeh/antennapod/activity/PreferenceActivity.java
+++ b/src/de/danoeh/antennapod/activity/PreferenceActivity.java
@@ -9,6 +9,7 @@ import android.content.res.Resources.Theme;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.os.Build;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
@@ -60,6 +61,9 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
private static final String PREF_GPODNET_LOGOUT = "pref_gpodnet_logout";
private static final String PREF_GPODNET_HOSTNAME = "pref_gpodnet_hostname";
+ private static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify";
+ private static final String PREF_PERSISTENT_NOTIFICATION = "prefPersistNotify";
+
private CheckBoxPreference[] selectedNetworks;
@SuppressLint("NewApi")
@@ -77,6 +81,23 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
}
addPreferencesFromResource(R.xml.preferences);
+
+ if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
+ // disable expanded notification option on unsupported android versions
+ findPreference(PREF_EXPANDED_NOTIFICATION).setEnabled(false);
+ findPreference(PREF_EXPANDED_NOTIFICATION).setOnPreferenceClickListener(
+ new OnPreferenceClickListener() {
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ Toast toast = Toast.makeText(PreferenceActivity.this, R.string.pref_expand_notify_unsupport_toast, Toast.LENGTH_SHORT);
+ toast.show();
+ return true;
+ }
+ }
+ );
+ }
+
findPreference(PREF_FLATTR_THIS_APP).setOnPreferenceClickListener(
new OnPreferenceClickListener() {
@@ -272,8 +293,6 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
buildAutodownloadSelectedNetworsPreference();
setSelectedNetworksEnabled(UserPreferences
.isEnableAutodownloadWifiFilter());
-
-
}
private void updateGpodnetPreferenceScreen() {
diff --git a/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java b/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java
index cb6dc41cf..6a60f65fe 100644
--- a/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java
+++ b/src/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java
@@ -270,8 +270,10 @@ public class GpodnetAuthenticationActivity extends ActionBarActivity {
@Override
public void onClick(View v) {
final int position = spinnerDevices.getSelectedItemPosition();
- selectedDevice = devices.get().get(position);
- advance();
+ if (position != AdapterView.INVALID_POSITION) {
+ selectedDevice = devices.get().get(position);
+ advance();
+ }
}
});
}
diff --git a/src/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java b/src/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
index 641a1368d..ef5af67de 100644
--- a/src/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/DownloadedEpisodesListAdapter.java
@@ -89,7 +89,7 @@ public class DownloadedEpisodesListAdapter extends BaseAdapter {
PicassoProvider.getMediaMetadataPicassoInstance(context)
.load(item.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.imageView);
return convertView;
diff --git a/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java b/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java
index 56c3e1ca6..3f666eb8b 100644
--- a/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/ExternalEpisodesListAdapter.java
@@ -176,7 +176,7 @@ public class ExternalEpisodesListAdapter extends BaseExpandableListAdapter {
PicassoProvider.getMediaMetadataPicassoInstance(context)
.load(item.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.feedImage);
holder.butAction.setFocusable(false);
diff --git a/src/de/danoeh/antennapod/adapter/NavListAdapter.java b/src/de/danoeh/antennapod/adapter/NavListAdapter.java
index ed85c8836..ef8e8ce07 100644
--- a/src/de/danoeh/antennapod/adapter/NavListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/NavListAdapter.java
@@ -32,8 +32,6 @@ public class NavListAdapter extends BaseAdapter {
private ItemAccess itemAccess;
private Context context;
- private final int imageSize;
-
public NavListAdapter(ItemAccess itemAccess, Context context) {
this.itemAccess = itemAccess;
this.context = context;
@@ -43,7 +41,6 @@ public class NavListAdapter extends BaseAdapter {
drawables = new Drawable[]{ta.getDrawable(0), ta.getDrawable(1), ta.getDrawable(2),
ta.getDrawable(3), ta.getDrawable(4)};
ta.recycle();
- this.imageSize = (int) context.getResources().getDimension(R.dimen.thumbnail_length_navlist);
}
@Override
@@ -195,7 +192,7 @@ public class NavListAdapter extends BaseAdapter {
PicassoProvider.getDefaultPicassoInstance(context)
.load(feed.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.image);
return convertView;
diff --git a/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java b/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java
index 4370de14d..8abe49133 100644
--- a/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/NewEpisodesListAdapter.java
@@ -27,7 +27,6 @@ public class NewEpisodesListAdapter extends BaseAdapter {
private final ItemAccess itemAccess;
private final ActionButtonCallback actionButtonCallback;
private final ActionButtonUtils actionButtonUtils;
- private final int imageSize;
public NewEpisodesListAdapter(Context context, ItemAccess itemAccess, ActionButtonCallback actionButtonCallback) {
super();
@@ -35,7 +34,6 @@ public class NewEpisodesListAdapter extends BaseAdapter {
this.itemAccess = itemAccess;
this.actionButtonUtils = new ActionButtonUtils(context);
this.actionButtonCallback = actionButtonCallback;
- this.imageSize = (int) context.getResources().getDimension(R.dimen.thumbnail_length_itemlist);
}
@Override
@@ -133,7 +131,7 @@ public class NewEpisodesListAdapter extends BaseAdapter {
PicassoProvider.getMediaMetadataPicassoInstance(context)
.load(item.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.imageView);
return convertView;
diff --git a/src/de/danoeh/antennapod/adapter/QueueListAdapter.java b/src/de/danoeh/antennapod/adapter/QueueListAdapter.java
index c670089b9..ebe519592 100644
--- a/src/de/danoeh/antennapod/adapter/QueueListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/QueueListAdapter.java
@@ -22,7 +22,6 @@ public class QueueListAdapter extends BaseAdapter {
private final ActionButtonCallback actionButtonCallback;
private final ActionButtonUtils actionButtonUtils;
- private final int imageSize;
public QueueListAdapter(Context context, ItemAccess itemAccess, ActionButtonCallback actionButtonCallback) {
super();
@@ -30,8 +29,6 @@ public class QueueListAdapter extends BaseAdapter {
this.itemAccess = itemAccess;
this.actionButtonUtils = new ActionButtonUtils(context);
this.actionButtonCallback = actionButtonCallback;
- this.imageSize = (int) context.getResources().getDimension(R.dimen.thumbnail_length_queue_item);
-
}
@Override
@@ -97,7 +94,7 @@ public class QueueListAdapter extends BaseAdapter {
PicassoProvider.getMediaMetadataPicassoInstance(context)
.load(item.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.imageView);
return convertView;
diff --git a/src/de/danoeh/antennapod/adapter/SearchlistAdapter.java b/src/de/danoeh/antennapod/adapter/SearchlistAdapter.java
index 6b1fefaad..2314c2269 100644
--- a/src/de/danoeh/antennapod/adapter/SearchlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/SearchlistAdapter.java
@@ -23,12 +23,10 @@ public class SearchlistAdapter extends BaseAdapter {
private final Context context;
private final ItemAccess itemAccess;
- private final int imageSize;
public SearchlistAdapter(Context context, ItemAccess itemAccess) {
this.context = context;
this.itemAccess = itemAccess;
- this.imageSize = (int) context.getResources().getDimension(R.dimen.thumbnail_length);
}
@Override
@@ -76,7 +74,7 @@ public class SearchlistAdapter extends BaseAdapter {
PicassoProvider.getDefaultPicassoInstance(context)
.load(feed.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.cover);
} else if (component.getClass() == FeedItem.class) {
@@ -89,7 +87,7 @@ public class SearchlistAdapter extends BaseAdapter {
PicassoProvider.getDefaultPicassoInstance(context)
.load(item.getFeed().getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(holder.cover);
}
diff --git a/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java b/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
index dcad2d524..aeb1fc53a 100644
--- a/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/gpodnet/PodcastListAdapter.java
@@ -8,6 +8,8 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
+import org.apache.commons.lang3.StringUtils;
+
import java.util.List;
import de.danoeh.antennapod.R;
@@ -18,11 +20,9 @@ import de.danoeh.antennapod.gpoddernet.model.GpodnetPodcast;
* Adapter for displaying a list of GPodnetPodcast-Objects.
*/
public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> {
- private final int thumbnailLength;
public PodcastListAdapter(Context context, int resource, List<GpodnetPodcast> objects) {
super(context, resource, objects);
- thumbnailLength = (int) context.getResources().getDimension(R.dimen.thumbnail_length);
}
@Override
@@ -50,10 +50,12 @@ public class PodcastListAdapter extends ArrayAdapter<GpodnetPodcast> {
holder.title.setText(podcast.getTitle());
holder.description.setText(podcast.getDescription());
- PicassoProvider.getDefaultPicassoInstance(convertView.getContext())
- .load(podcast.getLogoUrl())
- .resize(thumbnailLength, thumbnailLength)
- .into(holder.image);
+ if (StringUtils.isNoneBlank(podcast.getLogoUrl())) {
+ PicassoProvider.getDefaultPicassoInstance(convertView.getContext())
+ .load(podcast.getLogoUrl())
+ .fit()
+ .into(holder.image);
+ }
return convertView;
}
diff --git a/src/de/danoeh/antennapod/asynctask/PicassoImageResource.java b/src/de/danoeh/antennapod/asynctask/PicassoImageResource.java
index 84179cfcb..26f9d9278 100644
--- a/src/de/danoeh/antennapod/asynctask/PicassoImageResource.java
+++ b/src/de/danoeh/antennapod/asynctask/PicassoImageResource.java
@@ -18,8 +18,20 @@ public interface PicassoImageResource {
*/
public static final 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";
+
/**
* Returns a Uri to the image or null if no image is available.
+ * <p/>
+ * The Uri can either be an HTTP-URL, a URL pointing to a local image file or
+ * a non-image file (see SCHEME_MEDIA for more details).
+ * <p/>
+ * The Uri can also have an optional fallback-URL if loading the default URL
+ * failed (see PARAM_FALLBACK).
*/
public Uri getImageUri();
}
diff --git a/src/de/danoeh/antennapod/asynctask/PicassoProvider.java b/src/de/danoeh/antennapod/asynctask/PicassoProvider.java
index 9ecf87023..849725630 100644
--- a/src/de/danoeh/antennapod/asynctask/PicassoProvider.java
+++ b/src/de/danoeh/antennapod/asynctask/PicassoProvider.java
@@ -127,14 +127,25 @@ public class PicassoProvider {
mmr.setDataSource(uri.getPath());
byte[] data = mmr.getEmbeddedPicture();
mmr.release();
+
if (data != null) {
return new Response(new ByteArrayInputStream(data), true, data.length);
} else {
+
+ // check for fallback Uri
+ String fallbackParam = uri.getQueryParameter(PicassoImageResource.PARAM_FALLBACK);
+
+ if (fallbackParam != null) {
+ String fallback = Uri.decode(Uri.parse(fallbackParam).getPath());
+ if (fallback != null) {
+ File imageFile = new File(fallback);
+ return new Response(new BufferedInputStream(new FileInputStream(imageFile)), true, imageFile.length());
+ }
+ }
return null;
}
}
}
-
return okHttpDownloader.load(uri, b);
}
}
diff --git a/src/de/danoeh/antennapod/dialog/FeedItemDialog.java b/src/de/danoeh/antennapod/dialog/FeedItemDialog.java
index 7384463de..4cd6a379e 100644
--- a/src/de/danoeh/antennapod/dialog/FeedItemDialog.java
+++ b/src/de/danoeh/antennapod/dialog/FeedItemDialog.java
@@ -11,6 +11,7 @@ import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.PopupMenu;
+import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.MenuItem;
@@ -115,6 +116,11 @@ public class FeedItemDialog extends Dialog {
popupMenu = new PopupMenu(getContext(), butMore);
webvDescription.setWebViewClient(new WebViewClient());
+
+ if (Build.VERSION.SDK_INT >= 14) { // ellipsize is causing problems on old versions, see #448
+ txtvTitle.setEllipsize(TextUtils.TruncateAt.END);
+ }
+
txtvTitle.setText(item.getTitle());
if (UserPreferences.getTheme() == R.style.Theme_AntennaPod_Dark) {
diff --git a/src/de/danoeh/antennapod/feed/FeedComponent.java b/src/de/danoeh/antennapod/feed/FeedComponent.java
index 66a2f9cc5..48b243770 100644
--- a/src/de/danoeh/antennapod/feed/FeedComponent.java
+++ b/src/de/danoeh/antennapod/feed/FeedComponent.java
@@ -2,43 +2,43 @@ package de.danoeh.antennapod.feed;
/**
* Represents every possible component of a feed
- * @author daniel
*
+ * @author daniel
*/
public abstract class FeedComponent {
- protected long id;
-
- public FeedComponent() {
- super();
- }
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- /**
- * Update this FeedComponent's attributes with the attributes from another
- * FeedComponent. This method should only update attributes which where read from
- * the feed.
- */
- public void updateFromOther(FeedComponent other) {
- }
-
- /**
- * Compare's this FeedComponent's attribute values with another FeedComponent's
- * attribute values. This method will only compare attributes which were
- * read from the feed.
- *
- * @return true if attribute values are different, false otherwise
- */
- public boolean compareWithOther(FeedComponent other) {
- return false;
- }
+ protected long id;
+
+ public FeedComponent() {
+ super();
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * Update this FeedComponent's attributes with the attributes from another
+ * FeedComponent. This method should only update attributes which where read from
+ * the feed.
+ */
+ public void updateFromOther(FeedComponent other) {
+ }
+
+ /**
+ * Compare's this FeedComponent's attribute values with another FeedComponent's
+ * attribute values. This method will only compare attributes which were
+ * read from the feed.
+ *
+ * @return true if attribute values are different, false otherwise
+ */
+ public boolean compareWithOther(FeedComponent other) {
+ return false;
+ }
/**
@@ -47,4 +47,20 @@ public abstract class FeedComponent {
*/
public abstract String getHumanReadableIdentifier();
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ FeedComponent that = (FeedComponent) o;
+
+ if (id != that.id) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return (int) (id ^ (id >>> 32));
+ }
} \ No newline at end of file
diff --git a/src/de/danoeh/antennapod/feed/FeedMedia.java b/src/de/danoeh/antennapod/feed/FeedMedia.java
index f555654d0..9298ebe8a 100644
--- a/src/de/danoeh/antennapod/feed/FeedMedia.java
+++ b/src/de/danoeh/antennapod/feed/FeedMedia.java
@@ -386,9 +386,23 @@ public class FeedMedia extends FeedFile implements Playable {
@Override
public Uri getImageUri() {
+ final Uri feedImgUri = getFeedImageUri();
+
if (localFileAvailable()) {
- return new Uri.Builder().scheme(SCHEME_MEDIA).encodedPath(getLocalMediaUrl()).build();
- } else if (item != null && item.getFeed() != null) {
+ Uri.Builder builder = new Uri.Builder();
+ builder.scheme(SCHEME_MEDIA)
+ .encodedPath(getLocalMediaUrl());
+ if (feedImgUri != null) {
+ builder.appendQueryParameter(PARAM_FALLBACK, feedImgUri.toString());
+ }
+ return builder.build();
+ } else {
+ return feedImgUri;
+ }
+ }
+
+ private Uri getFeedImageUri() {
+ if (item != null && item.getFeed() != null) {
return item.getFeed().getImageUri();
} else {
return null;
diff --git a/src/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java b/src/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
index 77587194b..985673dd3 100644
--- a/src/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
+++ b/src/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java
@@ -207,10 +207,9 @@ public class ExternalPlayerFragment extends Fragment {
if (media != null) {
txtvTitle.setText(media.getEpisodeTitle());
- int imageSize = (int) getResources().getDimension(R.dimen.external_player_height);
PicassoProvider.getMediaMetadataPicassoInstance(getActivity())
.load(media.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(imgvCover);
fragmentLayout.setVisibility(View.VISIBLE);
diff --git a/src/de/danoeh/antennapod/fragment/ItemlistFragment.java b/src/de/danoeh/antennapod/fragment/ItemlistFragment.java
index 5ef914f6c..909774467 100644
--- a/src/de/danoeh/antennapod/fragment/ItemlistFragment.java
+++ b/src/de/danoeh/antennapod/fragment/ItemlistFragment.java
@@ -350,10 +350,9 @@ public class ItemlistFragment extends ListFragment {
txtvTitle.setText(feed.getTitle());
txtvAuthor.setText(feed.getAuthor());
- int imageSize = (int) getResources().getDimension(R.dimen.thumbnail_length_onlinefeedview);
PicassoProvider.getDefaultPicassoInstance(getActivity())
.load(feed.getImageUri())
- .resize(imageSize, imageSize)
+ .fit()
.into(imgvCover);
if (feed.getLink() == null) {
diff --git a/src/de/danoeh/antennapod/fragment/SearchFragment.java b/src/de/danoeh/antennapod/fragment/SearchFragment.java
index b3ade4d70..b1411cf0a 100644
--- a/src/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/src/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -160,7 +160,7 @@ public class SearchFragment extends ListFragment {
private final EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
- if ((arg & (EventDistributor.DOWNLOAD_QUEUED)) != 0) {
+ if ((arg & (EventDistributor.DOWNLOAD_QUEUED)) != 0 && feedItemDialog != null) {
feedItemDialog.updateMenuAppearance();
}
if ((arg & (EventDistributor.UNREAD_ITEMS_UPDATE
diff --git a/src/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java b/src/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java
index 2289862aa..a7e1033df 100644
--- a/src/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java
+++ b/src/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java
@@ -1,5 +1,6 @@
package de.danoeh.antennapod.fragment.gpodnet;
+import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -43,8 +44,11 @@ public class TagListFragment extends ListFragment {
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
- sv.clearFocus();
- ((MainActivity) getActivity()).loadChildFragment(SearchListFragment.newInstance(s));
+ Activity activity = getActivity();
+ if (activity != null) {
+ sv.clearFocus();
+ ((MainActivity) activity).loadChildFragment(SearchListFragment.newInstance(s));
+ }
return true;
}
diff --git a/src/de/danoeh/antennapod/preferences/UserPreferences.java b/src/de/danoeh/antennapod/preferences/UserPreferences.java
index 2020ddfae..73a4a1a14 100644
--- a/src/de/danoeh/antennapod/preferences/UserPreferences.java
+++ b/src/de/danoeh/antennapod/preferences/UserPreferences.java
@@ -6,6 +6,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
+import android.support.v4.app.NotificationCompat;
import android.util.Log;
import org.apache.commons.lang3.StringUtils;
@@ -53,6 +54,8 @@ public class UserPreferences implements
private static final String PREF_PLAYBACK_SPEED_ARRAY = "prefPlaybackSpeedArray";
public static final String PREF_PAUSE_PLAYBACK_FOR_FOCUS_LOSS = "prefPauseForFocusLoss";
private static final String PREF_SEEK_DELTA_SECS = "prefSeekDeltaSecs";
+ private static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify";
+ private static final String PREF_PERSISTENT_NOTIFICATION = "prefPersistNotify";
// TODO: Make this value configurable
private static final float PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD_DEFAULT = 0.8f;
@@ -82,6 +85,8 @@ public class UserPreferences implements
private boolean pauseForFocusLoss;
private int seekDeltaSecs;
private boolean isFreshInstall;
+ private int notifyPriority;
+ private boolean persistNotify;
private UserPreferences(Context context) {
this.context = context;
@@ -138,6 +143,13 @@ public class UserPreferences implements
PREF_PLAYBACK_SPEED_ARRAY, null));
pauseForFocusLoss = sp.getBoolean(PREF_PAUSE_PLAYBACK_FOR_FOCUS_LOSS, false);
seekDeltaSecs = Integer.valueOf(sp.getString(PREF_SEEK_DELTA_SECS, "30"));
+ if (sp.getBoolean(PREF_EXPANDED_NOTIFICATION, false)) {
+ notifyPriority = NotificationCompat.PRIORITY_MAX;
+ }
+ else {
+ notifyPriority = NotificationCompat.PRIORITY_DEFAULT;
+ }
+ persistNotify = sp.getBoolean(PREF_PERSISTENT_NOTIFICATION, false);
}
private int readThemeValue(String valueFromPrefs) {
@@ -243,6 +255,17 @@ public class UserPreferences implements
return instance.autoFlattr;
}
+ public static int getNotifyPriority() {
+ instanceAvailable();
+ return instance.notifyPriority;
+ }
+
+ public static boolean isPersistNotify() {
+ instanceAvailable();
+ return instance.persistNotify;
+ }
+
+
/**
* Returns the time after which an episode should be auto-flattr'd in percent of the episode's
* duration.
@@ -366,6 +389,15 @@ public class UserPreferences implements
} else if (key.equals(PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD)) {
autoFlattrPlayedDurationThreshold = sp.getFloat(PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD,
PREF_AUTO_FLATTR_PLAYED_DURATION_THRESHOLD_DEFAULT);
+ } else if (key.equals(PREF_EXPANDED_NOTIFICATION)) {
+ if (sp.getBoolean(PREF_EXPANDED_NOTIFICATION, false)) {
+ notifyPriority = NotificationCompat.PRIORITY_MAX;
+ }
+ else {
+ notifyPriority = NotificationCompat.PRIORITY_DEFAULT;
+ }
+ } else if (key.equals(PREF_PERSISTENT_NOTIFICATION)) {
+ persistNotify = sp.getBoolean(PREF_PERSISTENT_NOTIFICATION, false);
}
}
diff --git a/src/de/danoeh/antennapod/service/playback/PlaybackService.java b/src/de/danoeh/antennapod/service/playback/PlaybackService.java
index 59d7ddbb9..6c292c08a 100644
--- a/src/de/danoeh/antennapod/service/playback/PlaybackService.java
+++ b/src/de/danoeh/antennapod/service/playback/PlaybackService.java
@@ -297,7 +297,12 @@ public class PlaybackService extends Service {
case KeyEvent.KEYCODE_HEADSETHOOK:
case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
if (status == PlayerStatus.PLAYING) {
- mediaPlayer.pause(true, true);
+ if (UserPreferences.isPersistNotify()) {
+ mediaPlayer.pause(false, true);
+ }
+ else {
+ mediaPlayer.pause(true, true);
+ }
} else if (status == PlayerStatus.PAUSED || status == PlayerStatus.PREPARED) {
mediaPlayer.resume();
} else if (status == PlayerStatus.PREPARING) {
@@ -317,7 +322,12 @@ public class PlaybackService extends Service {
break;
case KeyEvent.KEYCODE_MEDIA_PAUSE:
if (status == PlayerStatus.PLAYING) {
+ if (UserPreferences.isPersistNotify()) {
+ mediaPlayer.pause(false, true);
+ }
+ else {
mediaPlayer.pause(true, true);
+ }
}
break;
case KeyEvent.KEYCODE_MEDIA_NEXT:
@@ -328,6 +338,12 @@ public class PlaybackService extends Service {
case KeyEvent.KEYCODE_MEDIA_REWIND:
mediaPlayer.seekDelta(-UserPreferences.getSeekDeltaMs());
break;
+ case KeyEvent.KEYCODE_MEDIA_STOP:
+ if (status == PlayerStatus.PLAYING) {
+ mediaPlayer.pause(true, true);
+ }
+ stopForeground(true); // gets rid of persistent notification
+ break;
default:
if (info.playable != null && info.playerStatus == PlayerStatus.PLAYING) { // only notify the user about an unknown key event if it is actually doing something
String message = String.format(getResources().getString(R.string.unknown_media_key), keycode);
@@ -401,7 +417,13 @@ public class PlaybackService extends Service {
taskManager.cancelPositionSaver();
saveCurrentPosition(false, 0);
taskManager.cancelWidgetUpdater();
- stopForeground(true);
+ if (UserPreferences.isPersistNotify() && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ // do not remove notification on pause based on user pref and whether android version supports expanded notifications
+ }
+ else {
+ // remove notifcation on pause
+ stopForeground(true);
+ }
break;
case STOPPED:
@@ -713,7 +735,7 @@ public class PlaybackService extends Service {
String contentTitle = info.playable.getEpisodeTitle();
Notification notification = null;
if (android.os.Build.VERSION.SDK_INT >= 16) {
- Intent pauseButtonIntent = new Intent(
+ Intent pauseButtonIntent = new Intent( // pause button intent
PlaybackService.this, PlaybackService.class);
pauseButtonIntent.putExtra(
MediaButtonReceiver.EXTRA_KEYCODE,
@@ -722,6 +744,24 @@ public class PlaybackService extends Service {
.getService(PlaybackService.this, 0,
pauseButtonIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
+ Intent playButtonIntent = new Intent( // play button intent
+ PlaybackService.this, PlaybackService.class);
+ playButtonIntent.putExtra(
+ MediaButtonReceiver.EXTRA_KEYCODE,
+ KeyEvent.KEYCODE_MEDIA_PLAY);
+ PendingIntent playButtonPendingIntent = PendingIntent
+ .getService(PlaybackService.this, 1,
+ playButtonIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ Intent stopButtonIntent = new Intent( // stop button intent
+ PlaybackService.this, PlaybackService.class);
+ stopButtonIntent.putExtra(
+ MediaButtonReceiver.EXTRA_KEYCODE,
+ KeyEvent.KEYCODE_MEDIA_STOP);
+ PendingIntent stopButtonPendingIntent = PendingIntent
+ .getService(PlaybackService.this, 2,
+ stopButtonIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder notificationBuilder = new Notification.Builder(
PlaybackService.this)
.setContentTitle(contentTitle)
@@ -730,9 +770,16 @@ public class PlaybackService extends Service {
.setContentIntent(pIntent)
.setLargeIcon(icon)
.setSmallIcon(R.drawable.ic_stat_antenna)
- .addAction(android.R.drawable.ic_media_pause,
+ .setPriority(UserPreferences.getNotifyPriority()) // set notification priority
+ .addAction(android.R.drawable.ic_media_play, //play action
+ getString(R.string.play_label),
+ playButtonPendingIntent)
+ .addAction(android.R.drawable.ic_media_pause, //pause action
getString(R.string.pause_label),
- pauseButtonPendingIntent);
+ pauseButtonPendingIntent)
+ .addAction(android.R.drawable.ic_menu_close_clear_cancel, // stop action
+ getString(R.string.stop_label),
+ stopButtonPendingIntent);
notification = notificationBuilder.build();
} else {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
@@ -949,7 +996,12 @@ public class PlaybackService extends Service {
*/
private void pauseIfPauseOnDisconnect() {
if (UserPreferences.isPauseOnHeadsetDisconnect()) {
+ if (UserPreferences.isPersistNotify()) {
+ mediaPlayer.pause(false, true);
+ }
+ else {
mediaPlayer.pause(true, true);
+ }
}
}
diff --git a/src/de/danoeh/antennapod/service/playback/PlaybackServiceMediaPlayer.java b/src/de/danoeh/antennapod/service/playback/PlaybackServiceMediaPlayer.java
index 49f20012d..9978fff3c 100644
--- a/src/de/danoeh/antennapod/service/playback/PlaybackServiceMediaPlayer.java
+++ b/src/de/danoeh/antennapod/service/playback/PlaybackServiceMediaPlayer.java
@@ -747,8 +747,8 @@ public class PlaybackServiceMediaPlayer {
pause(false, false);
pausedBecauseOfTransientAudiofocusLoss = true;
}
- playerLock.unlock();
}
+ playerLock.unlock();
}
});
}
diff --git a/src/de/danoeh/antennapod/service/playback/PlayerWidgetService.java b/src/de/danoeh/antennapod/service/playback/PlayerWidgetService.java
index 71bc40c2a..ec28724ed 100644
--- a/src/de/danoeh/antennapod/service/playback/PlayerWidgetService.java
+++ b/src/de/danoeh/antennapod/service/playback/PlayerWidgetService.java
@@ -24,6 +24,10 @@ public class PlayerWidgetService extends Service {
private static final String TAG = "PlayerWidgetService";
private PlaybackService playbackService;
+
+ /** Controls write access to playbackservice reference */
+ private Object psLock;
+
/** True while service is updating the widget */
private volatile boolean isUpdating;
@@ -36,6 +40,7 @@ public class PlayerWidgetService extends Service {
if (BuildConfig.DEBUG)
Log.d(TAG, "Service created");
isUpdating = false;
+ psLock = new Object();
}
@Override
@@ -148,16 +153,20 @@ public class PlayerWidgetService extends Service {
public void onServiceConnected(ComponentName className, IBinder service) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Connection to service established");
- playbackService = ((PlaybackService.LocalBinder) service)
- .getService();
- startViewUpdaterIfNotRunning();
+ synchronized (psLock) {
+ playbackService = ((PlaybackService.LocalBinder) service)
+ .getService();
+ startViewUpdaterIfNotRunning();
+ }
}
@Override
public void onServiceDisconnected(ComponentName name) {
- playbackService = null;
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Disconnected from service");
+ synchronized (psLock) {
+ playbackService = null;
+ if (BuildConfig.DEBUG)
+ Log.d(TAG, "Disconnected from service");
+ }
}
};
@@ -169,7 +178,7 @@ public class PlayerWidgetService extends Service {
}
}
- static class ViewUpdater extends Thread {
+ class ViewUpdater extends Thread {
private static final String THREAD_NAME = "ViewUpdater";
private PlayerWidgetService service;
@@ -182,7 +191,9 @@ public class PlayerWidgetService extends Service {
@Override
public void run() {
- service.updateViews();
+ synchronized (psLock) {
+ service.updateViews();
+ }
}
}
diff --git a/src/de/danoeh/antennapod/storage/DownloadRequester.java b/src/de/danoeh/antennapod/storage/DownloadRequester.java
index d305c572b..0eae52137 100644
--- a/src/de/danoeh/antennapod/storage/DownloadRequester.java
+++ b/src/de/danoeh/antennapod/storage/DownloadRequester.java
@@ -34,7 +34,7 @@ public class DownloadRequester {
private static DownloadRequester downloader;
- Map<String, DownloadRequest> downloads;
+ private Map<String, DownloadRequest> downloads;
private DownloadRequester() {
downloads = new ConcurrentHashMap<String, DownloadRequest>();
@@ -57,7 +57,7 @@ public class DownloadRequester {
* call will return false.
* @return True if the download request was accepted, false otherwise.
*/
- public boolean download(Context context, DownloadRequest request) {
+ public synchronized boolean download(Context context, DownloadRequest request) {
Validate.notNull(context);
Validate.notNull(request);
@@ -145,7 +145,7 @@ public class DownloadRequester {
return true;
}
- public void downloadFeed(Context context, Feed feed)
+ public synchronized void downloadFeed(Context context, Feed feed)
throws DownloadRequestException {
if (feedFileValid(feed)) {
String username = (feed.getPreferences() != null) ? feed.getPreferences().getUsername() : null;
@@ -156,7 +156,7 @@ public class DownloadRequester {
}
}
- public void downloadImage(Context context, FeedImage image)
+ public synchronized void downloadImage(Context context, FeedImage image)
throws DownloadRequestException {
if (feedFileValid(image)) {
download(context, image, new File(getImagefilePath(context),
@@ -164,7 +164,7 @@ public class DownloadRequester {
}
}
- public void downloadMedia(Context context, FeedMedia feedmedia)
+ public synchronized void downloadMedia(Context context, FeedMedia feedmedia)
throws DownloadRequestException {
if (feedFileValid(feedmedia)) {
Feed feed = feedmedia.getItem().getFeed();
@@ -210,14 +210,14 @@ public class DownloadRequester {
/**
* Cancels a running download.
*/
- public void cancelDownload(final Context context, final FeedFile f) {
+ public synchronized void cancelDownload(final Context context, final FeedFile f) {
cancelDownload(context, f.getDownload_url());
}
/**
* Cancels a running download.
*/
- public void cancelDownload(final Context context, final String downloadUrl) {
+ public synchronized void cancelDownload(final Context context, final String downloadUrl) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Cancelling download with url " + downloadUrl);
Intent cancelIntent = new Intent(DownloadService.ACTION_CANCEL_DOWNLOAD);
@@ -228,7 +228,7 @@ public class DownloadRequester {
/**
* Cancels all running downloads
*/
- public void cancelAllDownloads(Context context) {
+ public synchronized void cancelAllDownloads(Context context) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Cancelling all running downloads");
context.sendBroadcast(new Intent(
@@ -238,7 +238,7 @@ public class DownloadRequester {
/**
* Returns true if there is at least one Feed in the downloads queue.
*/
- public boolean isDownloadingFeeds() {
+ public synchronized boolean isDownloadingFeeds() {
for (DownloadRequest r : downloads.values()) {
if (r.getFeedfileType() == Feed.FEEDFILETYPE_FEED) {
return true;
@@ -250,32 +250,32 @@ public class DownloadRequester {
/**
* Checks if feedfile is in the downloads list
*/
- public boolean isDownloadingFile(FeedFile item) {
+ public synchronized boolean isDownloadingFile(FeedFile item) {
if (item.getDownload_url() != null) {
return downloads.containsKey(item.getDownload_url());
}
return false;
}
- public DownloadRequest getDownload(String downloadUrl) {
+ public synchronized DownloadRequest getDownload(String downloadUrl) {
return downloads.get(downloadUrl);
}
/**
* Checks if feedfile with the given download url is in the downloads list
*/
- public boolean isDownloadingFile(String downloadUrl) {
+ public synchronized boolean isDownloadingFile(String downloadUrl) {
return downloads.get(downloadUrl) != null;
}
- public boolean hasNoDownloads() {
+ public synchronized boolean hasNoDownloads() {
return downloads.isEmpty();
}
/**
* Remove an object from the downloads-list of the requester.
*/
- public void removeDownload(DownloadRequest r) {
+ public synchronized void removeDownload(DownloadRequest r) {
if (downloads.remove(r.getSource()) == null) {
Log.e(TAG,
"Could not remove object with url " + r.getSource());
@@ -285,17 +285,17 @@ public class DownloadRequester {
/**
* Get the number of uncompleted Downloads
*/
- public int getNumberOfDownloads() {
+ public synchronized int getNumberOfDownloads() {
return downloads.size();
}
- public String getFeedfilePath(Context context)
+ public synchronized String getFeedfilePath(Context context)
throws DownloadRequestException {
return getExternalFilesDirOrThrowException(context, FEED_DOWNLOADPATH)
.toString() + "/";
}
- public String getFeedfileName(Feed feed) {
+ public synchronized String getFeedfileName(Feed feed) {
String filename = feed.getDownload_url();
if (feed.getTitle() != null && !feed.getTitle().isEmpty()) {
filename = feed.getTitle();
@@ -303,13 +303,13 @@ public class DownloadRequester {
return "feed-" + FileNameGenerator.generateFileName(filename);
}
- public String getImagefilePath(Context context)
+ public synchronized String getImagefilePath(Context context)
throws DownloadRequestException {
return getExternalFilesDirOrThrowException(context, IMAGE_DOWNLOADPATH)
.toString() + "/";
}
- public String getImagefileName(FeedImage image) {
+ public synchronized String getImagefileName(FeedImage image) {
String filename = image.getDownload_url();
if (image.getOwner() != null && image.getOwner().getHumanReadableIdentifier() != null) {
filename = image.getOwner().getHumanReadableIdentifier();
@@ -317,7 +317,7 @@ public class DownloadRequester {
return "image-" + FileNameGenerator.generateFileName(filename);
}
- public String getMediafilePath(Context context, FeedMedia media)
+ public synchronized String getMediafilePath(Context context, FeedMedia media)
throws DownloadRequestException {
File externalStorage = getExternalFilesDirOrThrowException(
context,
@@ -338,7 +338,7 @@ public class DownloadRequester {
return result;
}
- public String getMediafilename(FeedMedia media) {
+ private String getMediafilename(FeedMedia media) {
String filename;
String titleBaseFilename = "";
diff --git a/src/de/danoeh/antennapod/syndication/namespace/NSSimpleChapters.java b/src/de/danoeh/antennapod/syndication/namespace/NSSimpleChapters.java
index 3f983ee88..b45793b6b 100644
--- a/src/de/danoeh/antennapod/syndication/namespace/NSSimpleChapters.java
+++ b/src/de/danoeh/antennapod/syndication/namespace/NSSimpleChapters.java
@@ -1,5 +1,8 @@
package de.danoeh.antennapod.syndication.namespace;
+import android.util.Log;
+
+import de.danoeh.antennapod.BuildConfig;
import de.danoeh.antennapod.feed.Chapter;
import de.danoeh.antennapod.feed.SimpleChapter;
import de.danoeh.antennapod.syndication.handler.HandlerState;
@@ -9,6 +12,8 @@ import org.xml.sax.Attributes;
import java.util.ArrayList;
public class NSSimpleChapters extends Namespace {
+ private static final String TAG = "NSSimpleChapters";
+
public static final String NSTAG = "psc|sc";
public static final String NSURI = "http://podlove.org/simple-chapters";
@@ -24,12 +29,16 @@ public class NSSimpleChapters extends Namespace {
if (localName.equals(CHAPTERS)) {
state.getCurrentItem().setChapters(new ArrayList<Chapter>());
} else if (localName.equals(CHAPTER)) {
- state.getCurrentItem()
- .getChapters()
- .add(new SimpleChapter(SyndDateUtils
- .parseTimeString(attributes.getValue(START)),
- attributes.getValue(TITLE), state.getCurrentItem(),
- attributes.getValue(HREF)));
+ try {
+ state.getCurrentItem()
+ .getChapters()
+ .add(new SimpleChapter(SyndDateUtils
+ .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);
+ }
}
return new SyndElement(localName, this);
diff --git a/src/de/danoeh/antennapod/syndication/util/SyndDateUtils.java b/src/de/danoeh/antennapod/syndication/util/SyndDateUtils.java
index 3138f087a..56687ac2e 100644
--- a/src/de/danoeh/antennapod/syndication/util/SyndDateUtils.java
+++ b/src/de/danoeh/antennapod/syndication/util/SyndDateUtils.java
@@ -7,130 +7,138 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
-/** Parses several date formats. */
+/**
+ * Parses several date formats.
+ */
public class SyndDateUtils {
- private static final String TAG = "DateUtils";
-
- private static final String[] RFC822DATES = { "dd MMM yy HH:mm:ss Z", };
-
- /** RFC 3339 date format for UTC dates. */
- public static final String RFC3339UTC = "yyyy-MM-dd'T'HH:mm:ss'Z'";
-
- /** RFC 3339 date format for localtime dates with offset. */
- public static final String RFC3339LOCAL = "yyyy-MM-dd'T'HH:mm:ssZ";
-
- private static ThreadLocal<SimpleDateFormat> RFC822Formatter = new ThreadLocal<SimpleDateFormat>() {
- @Override
- protected SimpleDateFormat initialValue() {
- return new SimpleDateFormat(RFC822DATES[0], Locale.US);
- }
-
- };
-
- private static ThreadLocal<SimpleDateFormat> RFC3339Formatter = new ThreadLocal<SimpleDateFormat>() {
- @Override
- protected SimpleDateFormat initialValue() {
- return new SimpleDateFormat(RFC3339UTC, Locale.US);
- }
-
- };
-
- public static Date parseRFC822Date(String date) {
- Date result = null;
- if (date.contains("PDT")) {
- date = date.replace("PDT", "PST8PDT");
- }
- if (date.contains(",")) {
- // Remove day of the week
- date = date.substring(date.indexOf(",") + 1).trim();
- }
- SimpleDateFormat format = RFC822Formatter.get();
- for (int i = 0; i < RFC822DATES.length; i++) {
- try {
- format.applyPattern(RFC822DATES[i]);
- result = format.parse(date);
- break;
- } catch (ParseException e) {
- e.printStackTrace();
- }
- }
- if (result == null) {
- Log.e(TAG, "Unable to parse feed date correctly");
- }
-
- return result;
- }
-
- public static Date parseRFC3339Date(String date) {
- Date result = null;
- SimpleDateFormat format = RFC3339Formatter.get();
- boolean isLocal = date.endsWith("Z");
- if (date.contains(".")) {
- // remove secfrac
- int fracIndex = date.indexOf(".");
- String first = date.substring(0, fracIndex);
- String second = null;
- if (isLocal) {
- second = date.substring(date.length() - 1);
- } else {
- if (date.contains("+")) {
- second = date.substring(date.indexOf("+"));
- } else {
- second = date.substring(date.indexOf("-"));
- }
- }
-
- date = first + second;
- }
- if (isLocal) {
- try {
- result = format.parse(date);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- } else {
- format.applyPattern(RFC3339LOCAL);
- // remove last colon
- StringBuffer buf = new StringBuffer(date.length() - 1);
- int colonIdx = date.lastIndexOf(':');
- for (int x = 0; x < date.length(); x++) {
- if (x != colonIdx)
- buf.append(date.charAt(x));
- }
- String bufStr = buf.toString();
- try {
- result = format.parse(bufStr);
- } catch (ParseException e) {
- e.printStackTrace();
- Log.e(TAG, "Unable to parse date");
- } finally {
- format.applyPattern(RFC3339UTC);
- }
-
- }
-
- return result;
-
- }
-
- /**
- * Takes a string of the form [HH:]MM:SS[.mmm] and converts it to
- * milliseconds.
- */
- public static long parseTimeString(final String time) {
- String[] parts = time.split(":");
- long result = 0;
- int idx = 0;
- if (parts.length == 3) {
- // string has hours
- result += Integer.valueOf(parts[idx]) * 3600000L;
- idx++;
- }
- result += Integer.valueOf(parts[idx]) * 60000L;
- idx++;
- result += (Float.valueOf(parts[idx])) * 1000L;
- return result;
- }
+ private static final String TAG = "DateUtils";
+
+ private static final String[] RFC822DATES = {"dd MMM yy HH:mm:ss Z",};
+
+ /**
+ * RFC 3339 date format for UTC dates.
+ */
+ public static final String RFC3339UTC = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+
+ /**
+ * RFC 3339 date format for localtime dates with offset.
+ */
+ public static final String RFC3339LOCAL = "yyyy-MM-dd'T'HH:mm:ssZ";
+
+ private static ThreadLocal<SimpleDateFormat> RFC822Formatter = new ThreadLocal<SimpleDateFormat>() {
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat(RFC822DATES[0], Locale.US);
+ }
+
+ };
+
+ private static ThreadLocal<SimpleDateFormat> RFC3339Formatter = new ThreadLocal<SimpleDateFormat>() {
+ @Override
+ protected SimpleDateFormat initialValue() {
+ return new SimpleDateFormat(RFC3339UTC, Locale.US);
+ }
+
+ };
+
+ public static Date parseRFC822Date(String date) {
+ Date result = null;
+ if (date.contains("PDT")) {
+ date = date.replace("PDT", "PST8PDT");
+ }
+ if (date.contains(",")) {
+ // Remove day of the week
+ date = date.substring(date.indexOf(",") + 1).trim();
+ }
+ SimpleDateFormat format = RFC822Formatter.get();
+ for (int i = 0; i < RFC822DATES.length; i++) {
+ try {
+ format.applyPattern(RFC822DATES[i]);
+ result = format.parse(date);
+ break;
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ }
+ if (result == null) {
+ Log.e(TAG, "Unable to parse feed date correctly");
+ }
+
+ return result;
+ }
+
+ public static Date parseRFC3339Date(String date) {
+ Date result = null;
+ SimpleDateFormat format = RFC3339Formatter.get();
+ boolean isLocal = date.endsWith("Z");
+ if (date.contains(".")) {
+ // remove secfrac
+ int fracIndex = date.indexOf(".");
+ String first = date.substring(0, fracIndex);
+ String second = null;
+ if (isLocal) {
+ second = date.substring(date.length() - 1);
+ } else {
+ if (date.contains("+")) {
+ second = date.substring(date.indexOf("+"));
+ } else {
+ second = date.substring(date.indexOf("-"));
+ }
+ }
+
+ date = first + second;
+ }
+ if (isLocal) {
+ try {
+ result = format.parse(date);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ } else {
+ format.applyPattern(RFC3339LOCAL);
+ // remove last colon
+ StringBuffer buf = new StringBuffer(date.length() - 1);
+ int colonIdx = date.lastIndexOf(':');
+ for (int x = 0; x < date.length(); x++) {
+ if (x != colonIdx)
+ buf.append(date.charAt(x));
+ }
+ String bufStr = buf.toString();
+ try {
+ result = format.parse(bufStr);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ Log.e(TAG, "Unable to parse date");
+ } finally {
+ format.applyPattern(RFC3339UTC);
+ }
+
+ }
+
+ return result;
+
+ }
+
+ /**
+ * Takes a string of the form [HH:]MM:SS[.mmm] and converts it to
+ * milliseconds.
+ *
+ * @throws java.lang.NumberFormatException if the number segments contain invalid numbers.
+ */
+ public static long parseTimeString(final String time) {
+ String[] parts = time.split(":");
+ long result = 0;
+ int idx = 0;
+ if (parts.length == 3) {
+ // string has hours
+ result += Integer.valueOf(parts[idx]) * 3600000L;
+ idx++;
+ }
+ result += Integer.valueOf(parts[idx]) * 60000L;
+ idx++;
+ result += (Float.valueOf(parts[idx])) * 1000L;
+ return result;
+ }
public static String formatRFC822Date(Date date) {
SimpleDateFormat format = RFC822Formatter.get();
diff --git a/src/de/danoeh/antennapod/util/ChapterUtils.java b/src/de/danoeh/antennapod/util/ChapterUtils.java
index 9e1c50674..2d9022eed 100644
--- a/src/de/danoeh/antennapod/util/ChapterUtils.java
+++ b/src/de/danoeh/antennapod/util/ChapterUtils.java
@@ -1,6 +1,20 @@
package de.danoeh.antennapod.util;
import android.util.Log;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+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;
+
import de.danoeh.antennapod.BuildConfig;
import de.danoeh.antennapod.feed.Chapter;
import de.danoeh.antennapod.util.comparator.ChapterStartTimeComparator;
@@ -9,253 +23,252 @@ import de.danoeh.antennapod.util.id3reader.ID3ReaderException;
import de.danoeh.antennapod.util.playback.Playable;
import de.danoeh.antennapod.util.vorbiscommentreader.VorbisCommentChapterReader;
import de.danoeh.antennapod.util.vorbiscommentreader.VorbisCommentReaderException;
-import org.apache.commons.io.IOUtils;
-import java.io.*;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.List;
-
-/** Utility class for getting chapter data from media files. */
+/**
+ * Utility class for getting chapter data from media files.
+ */
public class ChapterUtils {
- private static final String TAG = "ChapterUtils";
+ private static final String TAG = "ChapterUtils";
- private ChapterUtils() {
- }
+ private ChapterUtils() {
+ }
- /**
- * Uses the download URL of a media object of a feeditem to read its ID3
- * chapters.
- */
- public static void readID3ChaptersFromPlayableStreamUrl(Playable p) {
- if (p != null && p.getStreamUrl() != null) {
+ /**
+ * Uses the download URL of a media object of a feeditem to read its ID3
+ * chapters.
+ */
+ public static void readID3ChaptersFromPlayableStreamUrl(Playable p) {
+ if (p != null && p.getStreamUrl() != null) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Reading id3 chapters from item " + p.getEpisodeTitle());
- InputStream in = null;
- try {
- URL url = new URL(p.getStreamUrl());
- ChapterReader reader = new ChapterReader();
+ InputStream in = null;
+ try {
+ URL url = new URL(p.getStreamUrl());
+ ChapterReader reader = new ChapterReader();
- in = url.openStream();
- reader.readInputStream(in);
- List<Chapter> chapters = reader.getChapters();
+ in = url.openStream();
+ reader.readInputStream(in);
+ List<Chapter> chapters = reader.getChapters();
- if (chapters != null) {
- Collections
- .sort(chapters, new ChapterStartTimeComparator());
- processChapters(chapters, p);
- if (chaptersValid(chapters)) {
- p.setChapters(chapters);
- Log.i(TAG, "Chapters loaded");
- } else {
- Log.e(TAG, "Chapter data was invalid");
- }
- } else {
- Log.i(TAG, "ChapterReader could not find any ID3 chapters");
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ID3ReaderException e) {
- e.printStackTrace();
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- } else {
- Log.e(TAG,
- "Unable to read ID3 chapters: media or download URL was null");
- }
- }
+ if (chapters != null) {
+ Collections
+ .sort(chapters, new ChapterStartTimeComparator());
+ processChapters(chapters, p);
+ if (chaptersValid(chapters)) {
+ p.setChapters(chapters);
+ Log.i(TAG, "Chapters loaded");
+ } else {
+ Log.e(TAG, "Chapter data was invalid");
+ }
+ } else {
+ Log.i(TAG, "ChapterReader could not find any ID3 chapters");
+ }
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ID3ReaderException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ } else {
+ Log.e(TAG,
+ "Unable to read ID3 chapters: media or download URL was null");
+ }
+ }
- /**
- * Uses the file URL of a media object of a feeditem to read its ID3
- * chapters.
- */
- public static void readID3ChaptersFromPlayableFileUrl(Playable p) {
- if (p != null && p.localFileAvailable() && p.getLocalMediaUrl() != null) {
+ /**
+ * Uses the file URL of a media object of a feeditem to read its ID3
+ * chapters.
+ */
+ public static void readID3ChaptersFromPlayableFileUrl(Playable p) {
+ if (p != null && p.localFileAvailable() && p.getLocalMediaUrl() != null) {
if (BuildConfig.DEBUG)
Log.d(TAG, "Reading id3 chapters from item " + p.getEpisodeTitle());
- File source = new File(p.getLocalMediaUrl());
- if (source.exists()) {
- ChapterReader reader = new ChapterReader();
- InputStream in = null;
+ File source = new File(p.getLocalMediaUrl());
+ if (source.exists()) {
+ ChapterReader reader = new ChapterReader();
+ InputStream in = null;
+
+ try {
+ in = new BufferedInputStream(new FileInputStream(source));
+ reader.readInputStream(in);
+ List<Chapter> chapters = reader.getChapters();
- try {
- in = new BufferedInputStream(new FileInputStream(source));
- reader.readInputStream(in);
- List<Chapter> chapters = reader.getChapters();
+ if (chapters != null) {
+ Collections.sort(chapters,
+ new ChapterStartTimeComparator());
+ processChapters(chapters, p);
+ if (chaptersValid(chapters)) {
+ p.setChapters(chapters);
+ Log.i(TAG, "Chapters loaded");
+ } else {
+ Log.e(TAG, "Chapter data was invalid");
+ }
+ } else {
+ Log.i(TAG,
+ "ChapterReader could not find any ID3 chapters");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (ID3ReaderException e) {
+ e.printStackTrace();
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ } else {
+ Log.e(TAG, "Unable to read id3 chapters: Source doesn't exist");
+ }
+ }
+ }
- if (chapters != null) {
- Collections.sort(chapters,
- new ChapterStartTimeComparator());
- processChapters(chapters, p);
- if (chaptersValid(chapters)) {
- p.setChapters(chapters);
- Log.i(TAG, "Chapters loaded");
- } else {
- Log.e(TAG, "Chapter data was invalid");
- }
- } else {
- Log.i(TAG,
- "ChapterReader could not find any ID3 chapters");
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ID3ReaderException e) {
- e.printStackTrace();
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- } else {
- Log.e(TAG, "Unable to read id3 chapters: Source doesn't exist");
- }
- }
- }
+ public static void readOggChaptersFromPlayableStreamUrl(Playable media) {
+ if (media != null && media.streamAvailable()) {
+ InputStream input = null;
+ try {
+ URL url = new URL(media.getStreamUrl());
+ input = url.openStream();
+ if (input != null) {
+ readOggChaptersFromInputStream(media, input);
+ }
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+ }
- public static void readOggChaptersFromPlayableStreamUrl(Playable media) {
- if (media != null && media.streamAvailable()) {
- InputStream input = null;
- try {
- URL url = new URL(media.getStreamUrl());
- input = url.openStream();
- if (input != null) {
- readOggChaptersFromInputStream(media, input);
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
- }
+ public static void readOggChaptersFromPlayableFileUrl(Playable media) {
+ if (media != null && media.getLocalMediaUrl() != null) {
+ File source = new File(media.getLocalMediaUrl());
+ if (source.exists()) {
+ InputStream input = null;
+ try {
+ input = new BufferedInputStream(new FileInputStream(source));
+ readOggChaptersFromInputStream(media, input);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(input);
+ }
+ }
+ }
+ }
- public static void readOggChaptersFromPlayableFileUrl(Playable media) {
- if (media != null && media.getLocalMediaUrl() != null) {
- File source = new File(media.getLocalMediaUrl());
- if (source.exists()) {
- InputStream input = null;
- try {
- input = new BufferedInputStream(new FileInputStream(source));
- readOggChaptersFromInputStream(media, input);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } finally {
- IOUtils.closeQuietly(input);
- }
- }
- }
- }
+ private static void readOggChaptersFromInputStream(Playable p,
+ InputStream input) {
+ if (BuildConfig.DEBUG)
+ Log.d(TAG,
+ "Trying to read chapters from item with title "
+ + p.getEpisodeTitle());
+ try {
+ VorbisCommentChapterReader reader = new VorbisCommentChapterReader();
+ reader.readInputStream(input);
+ List<Chapter> chapters = reader.getChapters();
+ if (chapters != null) {
+ Collections.sort(chapters, new ChapterStartTimeComparator());
+ processChapters(chapters, p);
+ if (chaptersValid(chapters)) {
+ p.setChapters(chapters);
+ Log.i(TAG, "Chapters loaded");
+ } else {
+ Log.e(TAG, "Chapter data was invalid");
+ }
+ } else {
+ Log.i(TAG,
+ "ChapterReader could not find any Ogg vorbis chapters");
+ }
+ } catch (VorbisCommentReaderException e) {
+ e.printStackTrace();
+ }
+ }
- private static void readOggChaptersFromInputStream(Playable p,
- InputStream input) {
- if (BuildConfig.DEBUG)
- Log.d(TAG,
- "Trying to read chapters from item with title "
- + p.getEpisodeTitle());
- try {
- VorbisCommentChapterReader reader = new VorbisCommentChapterReader();
- reader.readInputStream(input);
- List<Chapter> chapters = reader.getChapters();
- if (chapters != null) {
- Collections.sort(chapters, new ChapterStartTimeComparator());
- processChapters(chapters, p);
- if (chaptersValid(chapters)) {
- p.setChapters(chapters);
- Log.i(TAG, "Chapters loaded");
- } else {
- Log.e(TAG, "Chapter data was invalid");
- }
- } else {
- Log.i(TAG,
- "ChapterReader could not find any Ogg vorbis chapters");
- }
- } catch (VorbisCommentReaderException e) {
- e.printStackTrace();
- }
- }
+ /**
+ * Makes sure that chapter does a title and an item attribute.
+ */
+ private static void processChapters(List<Chapter> chapters, Playable p) {
+ for (int i = 0; i < chapters.size(); i++) {
+ Chapter c = chapters.get(i);
+ if (c.getTitle() == null) {
+ c.setTitle(Integer.toString(i));
+ }
+ }
+ }
- /** Makes sure that chapter does a title and an item attribute. */
- private static void processChapters(List<Chapter> chapters, Playable p) {
- for (int i = 0; i < chapters.size(); i++) {
- Chapter c = chapters.get(i);
- if (c.getTitle() == null) {
- c.setTitle(Integer.toString(i));
- }
- }
- }
+ private static boolean chaptersValid(List<Chapter> chapters) {
+ if (chapters.isEmpty()) {
+ return false;
+ }
+ for (Chapter c : chapters) {
+ if (c.getTitle() == null) {
+ return false;
+ }
+ if (c.getStart() < 0) {
+ return false;
+ }
+ }
+ return true;
+ }
- private static boolean chaptersValid(List<Chapter> chapters) {
- if (chapters.isEmpty()) {
- return false;
- }
- for (Chapter c : chapters) {
- if (c.getTitle() == null) {
- return false;
- }
- if (c.getStart() < 0) {
- return false;
- }
- }
- return true;
- }
+ /**
+ * Calls getCurrentChapter with current position.
+ */
+ public static Chapter getCurrentChapter(Playable media) {
+ if (media.getChapters() != null) {
+ List<Chapter> chapters = media.getChapters();
+ Chapter current = null;
+ if (chapters != null) {
+ current = chapters.get(0);
+ for (Chapter sc : chapters) {
+ if (sc.getStart() > media.getPosition()) {
+ break;
+ } else {
+ current = sc;
+ }
+ }
+ }
+ return current;
+ } else {
+ return null;
+ }
+ }
- /** Calls getCurrentChapter with current position. */
- public static Chapter getCurrentChapter(Playable media) {
- if (media.getChapters() != null) {
- List<Chapter> chapters = media.getChapters();
- Chapter current = null;
- if (chapters != null) {
- current = chapters.get(0);
- for (Chapter sc : chapters) {
- if (sc.getStart() > media.getPosition()) {
- break;
- } else {
- current = sc;
- }
- }
- }
- return current;
- } else {
- return null;
- }
- }
+ public static void loadChaptersFromStreamUrl(Playable media) {
+ if (BuildConfig.DEBUG)
+ Log.d(TAG, "Starting chapterLoader thread");
+ ChapterUtils.readID3ChaptersFromPlayableStreamUrl(media);
+ if (media.getChapters() == null) {
+ ChapterUtils.readOggChaptersFromPlayableStreamUrl(media);
+ }
- public static void loadChaptersFromStreamUrl(Playable media) {
- if (BuildConfig.DEBUG)
- Log.d(TAG, "Starting chapterLoader thread");
- ChapterUtils.readID3ChaptersFromPlayableStreamUrl(media);
- if (media.getChapters() == null) {
- ChapterUtils.readOggChaptersFromPlayableStreamUrl(media);
- }
+ if (BuildConfig.DEBUG)
+ Log.d(TAG, "ChapterLoaderThread has finished");
+ }
- if (BuildConfig.DEBUG)
- Log.d(TAG, "ChapterLoaderThread has finished");
- }
-
- public static void loadChaptersFromFileUrl(Playable media) {
- if (media.localFileAvailable()) {
- ChapterUtils.readID3ChaptersFromPlayableFileUrl(media);
- if (media.getChapters() == null) {
- ChapterUtils.readOggChaptersFromPlayableFileUrl(media);
- }
- } else {
- Log.e(TAG, "Could not load chapters from file url: local file not available");
- }
- }
+ public static void loadChaptersFromFileUrl(Playable media) {
+ if (media.localFileAvailable()) {
+ ChapterUtils.readID3ChaptersFromPlayableFileUrl(media);
+ if (media.getChapters() == null) {
+ ChapterUtils.readOggChaptersFromPlayableFileUrl(media);
+ }
+ } else {
+ Log.e(TAG, "Could not load chapters from file url: local file not available");
+ }
+ }
}
diff --git a/src/de/danoeh/antennapod/util/URLChecker.java b/src/de/danoeh/antennapod/util/URLChecker.java
index 9997daaf7..2352adddf 100644
--- a/src/de/danoeh/antennapod/util/URLChecker.java
+++ b/src/de/danoeh/antennapod/util/URLChecker.java
@@ -22,6 +22,8 @@ public final class URLChecker {
*/
private static final String TAG = "URLChecker";
+ private static final String AP_SUBSCRIBE = "antennapod-subscribe://";
+
/**
* Checks if URL is valid and modifies it if necessary.
*
@@ -29,23 +31,24 @@ public final class URLChecker {
* @return The prepared url
*/
public static String prepareURL(String url) {
- StringBuilder builder = new StringBuilder();
url = StringUtils.trim(url);
if (url.startsWith("feed://")) {
if (BuildConfig.DEBUG) Log.d(TAG, "Replacing feed:// with http://");
- url = url.replaceFirst("feed://", "http://");
+ return url.replaceFirst("feed://", "http://");
} else if (url.startsWith("pcast://")) {
- if (BuildConfig.DEBUG) Log.d(TAG, "Replacing pcast:// with http://");
- url = url.replaceFirst("pcast://", "http://");
+ if (BuildConfig.DEBUG) Log.d(TAG, "Removing pcast://");
+ return prepareURL(StringUtils.removeStart(url, "pcast://"));
} else if (url.startsWith("itpc")) {
if (BuildConfig.DEBUG) Log.d(TAG, "Replacing itpc:// with http://");
- url = url.replaceFirst("itpc://", "http://");
+ return url.replaceFirst("itpc://", "http://");
+ } else if (url.startsWith(AP_SUBSCRIBE)) {
+ if (BuildConfig.DEBUG) Log.d(TAG, "Removing antennapod-subscribe://");
+ return prepareURL(StringUtils.removeStart(url, AP_SUBSCRIBE));
} else if (!(url.startsWith("http://") || url.startsWith("https://"))) {
if (BuildConfig.DEBUG) Log.d(TAG, "Adding http:// at the beginning of the URL");
- builder.append("http://");
+ return "http://" + url;
+ } else {
+ return url;
}
- builder.append(url);
-
- return builder.toString();
}
}
diff --git a/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java b/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java
index 1ff3437c0..96d3bbedd 100644
--- a/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java
+++ b/src/de/danoeh/antennapod/util/flattr/FlattrUtils.java
@@ -90,7 +90,7 @@ public class FlattrUtils {
*/
public static boolean hasAPICredentials() {
return StringUtils.isNotEmpty(BuildConfig.FLATTR_APP_KEY)
- && StringUtils.isNoneEmpty(BuildConfig.FLATTR_APP_SECRET);
+ && StringUtils.isNotEmpty(BuildConfig.FLATTR_APP_SECRET);
}
public static boolean hasToken() {
@@ -133,7 +133,7 @@ public class FlattrUtils {
throws FlattrException {
if (hasToken()) {
FlattrService fs = FlattrServiceCreator.getService(retrieveToken());
- fs.click(url);
+ fs.flattr(url);
} else {
Log.e(TAG, "clickUrl was called with null access token");
}
diff --git a/src/instrumentationTest/de/test/antennapod/util/URLCheckerTest.java b/src/instrumentationTest/de/test/antennapod/util/URLCheckerTest.java
index 08fd0d486..fa99303b1 100644
--- a/src/instrumentationTest/de/test/antennapod/util/URLCheckerTest.java
+++ b/src/instrumentationTest/de/test/antennapod/util/URLCheckerTest.java
@@ -32,7 +32,7 @@ public class URLCheckerTest extends AndroidTestCase {
assertEquals("http://example.com", out);
}
- public void testPcastProtocol() {
+ public void testPcastProtocolNoScheme() {
final String in = "pcast://example.com";
final String out = URLChecker.prepareURL(in);
assertEquals("http://example.com", out);
@@ -55,4 +55,22 @@ public class URLCheckerTest extends AndroidTestCase {
final String out = URLChecker.prepareURL(in);
assertEquals("http://example.com", out);
}
+
+ public void testAntennaPodSubscribeProtocolNoScheme() throws Exception {
+ final String in = "antennapod-subscribe://example.com";
+ final String out = URLChecker.prepareURL(in);
+ assertEquals("http://example.com", out);
+ }
+
+ public void testPcastProtocolWithScheme() {
+ final String in = "pcast://https://example.com";
+ final String out = URLChecker.prepareURL(in);
+ assertEquals("https://example.com", out);
+ }
+
+ public void testAntennaPodSubscribeProtocolWithScheme() throws Exception {
+ final String in = "antennapod-subscribe://https://example.com";
+ final String out = URLChecker.prepareURL(in);
+ assertEquals("https://example.com", out);
+ }
}
diff --git a/submodules/dslv b/submodules/dslv
-Subproject 80011c50e444e1c7d5e13b57bdb127b524a1ff9
+Subproject cde289ca23772bbcd5c72c187011c6cbd22a76c