summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.classpath1
-rw-r--r--.gitignore9
-rw-r--r--.tx/config34
-rw-r--r--AndroidManifest.xml114
-rw-r--r--CHANGELOG.md8
-rw-r--r--CONTRIBUTORS7
-rw-r--r--assets/about.html2
-rw-r--r--pom.xml13
-rw-r--r--proguard.cfg5
-rw-r--r--res/drawable-xhdpi/ic_undobar_undo.pngbin0 -> 1558 bytes
-rw-r--r--res/drawable-xhdpi/undobar.9.pngbin0 -> 1665 bytes
-rw-r--r--res/drawable-xhdpi/undobar_button_focused.9.pngbin0 -> 1141 bytes
-rw-r--r--res/drawable-xhdpi/undobar_button_pressed.9.pngbin0 -> 1123 bytes
-rw-r--r--res/drawable-xhdpi/undobar_divider.9.pngbin0 -> 963 bytes
-rw-r--r--res/drawable/undobar_button.xml22
-rw-r--r--res/layout/organize_queue.xml15
-rw-r--r--res/values-az/strings.xml231
-rw-r--r--res/values-ca/strings.xml28
-rw-r--r--res/values-cs-rCZ/strings.xml231
-rw-r--r--res/values-da/strings.xml10
-rw-r--r--res/values-de/strings.xml10
-rw-r--r--res/values-es-rES/strings.xml1
-rw-r--r--res/values-es/strings.xml14
-rw-r--r--res/values-fr/strings.xml10
-rw-r--r--res/values-it-rIT/strings.xml22
-rw-r--r--res/values-pt-rBR/strings.xml1
-rw-r--r--res/values-pt/strings.xml231
-rw-r--r--res/values-ro-rRO/strings.xml10
-rw-r--r--res/values-ru/strings.xml100
-rw-r--r--res/values-uk-rUA/strings.xml30
-rw-r--r--res/values-zh-rCN/strings.xml40
-rw-r--r--res/values/arrays.xml31
-rw-r--r--res/values/integers.xml4
-rw-r--r--res/values/strings.xml11
-rw-r--r--res/values/styles.xml40
-rw-r--r--res/xml/preferences.xml4
-rw-r--r--src/de/danoeh/antennapod/activity/AddFeedActivity.java17
-rw-r--r--src/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java11
-rw-r--r--src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java98
-rw-r--r--src/de/danoeh/antennapod/activity/PreferenceActivity.java42
-rw-r--r--src/de/danoeh/antennapod/adapter/DefaultFeedItemlistAdapter.java9
-rw-r--r--src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java11
-rw-r--r--src/de/danoeh/antennapod/adapter/FeedlistAdapter.java19
-rw-r--r--src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java8
-rw-r--r--src/de/danoeh/antennapod/adapter/MiroGuideItemlistAdapter.java6
-rw-r--r--src/de/danoeh/antennapod/asynctask/DownloadStatus.java36
-rw-r--r--src/de/danoeh/antennapod/feed/FeedManager.java86
-rw-r--r--src/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java68
-rw-r--r--src/de/danoeh/antennapod/miroguide/conn/MiroGuideConnector.java2
-rw-r--r--src/de/danoeh/antennapod/preferences/UserPreferences.java26
-rw-r--r--src/de/danoeh/antennapod/service/PlaybackService.java38
-rw-r--r--src/de/danoeh/antennapod/service/download/DownloadService.java4
-rw-r--r--src/de/danoeh/antennapod/service/download/HttpDownloader.java18
-rw-r--r--src/de/danoeh/antennapod/storage/DownloadRequester.java28
-rw-r--r--src/de/danoeh/antennapod/storage/PodDBAdapter.java2
-rw-r--r--src/de/danoeh/antennapod/syndication/namespace/NSRSS20.java15
-rw-r--r--src/de/danoeh/antennapod/util/ConnectionTester.java6
-rw-r--r--src/de/danoeh/antennapod/util/Converter.java1
-rw-r--r--src/de/danoeh/antennapod/util/DownloadError.java86
-rw-r--r--src/de/danoeh/antennapod/util/UndoBarController.java135
-rw-r--r--src/de/danoeh/antennapod/util/id3reader/ChapterReader.java36
-rw-r--r--src/de/danoeh/antennapod/util/id3reader/ID3Reader.java89
-rw-r--r--src/de/danoeh/antennapod/util/id3reader/model/FrameHeader.java5
-rw-r--r--src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java2
-rw-r--r--tests/.classpath1
-rw-r--r--tests/src/de/danoeh/antennapod/test/FeedHandlerTest.java3
-rw-r--r--tests/src/de/danoeh/antennapod/test/TestFeeds.java1
67 files changed, 1742 insertions, 456 deletions
diff --git a/.classpath b/.classpath
index 3f9691c5d..3a0c88fe4 100644
--- a/.classpath
+++ b/.classpath
@@ -4,5 +4,6 @@
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
diff --git a/.gitignore b/.gitignore
index c3d0e23ef..9f082390d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,15 @@ build.xml
#eclipse project files
.metadata
.settings
+#IntelliJ project files
+.idea
+*.iml
+gen-external-apklibs
+out
+#transifex downloads
+changelog
+description
+
# other
*.odg#
proguard
diff --git a/.tx/config b/.tx/config
new file mode 100644
index 000000000..3a05b8725
--- /dev/null
+++ b/.tx/config
@@ -0,0 +1,34 @@
+[main]
+host = https://www.transifex.com
+
+[antennapod.english]
+source_file = res/values/strings.xml
+source_lang = en
+trans.az = res/values-az/strings.xml
+trans.ca = res/values-ca/strings.xml
+trans.cs_CZ = res/values-cs-rCZ/strings.xml
+trans.da = res/values-da/strings.xml
+trans.de = res/values-de/strings.xml
+trans.es = res/values-es/strings.xml
+trans.es_ES = res/values-es-rES/strings.xml
+trans.fr = res/values-fr/strings.xml
+trans.it_IT = res/values-it-rIT/strings.xml
+trans.pt = res/values-pt/strings.xml
+trans.pt_BR = res/values-pt-rBR/strings.xml
+trans.ro_RO = res/values-ro-rRO/strings.xml
+trans.ru = res/values-ru/strings.xml
+trans.ru-RU = res/values-ru/strings.xml
+trans.ru_RU = res/values-ru/strings.xml
+trans.uk_UA = res/values-uk-rUA/strings.xml
+trans.zh_CN = res/values-zh-rCN/strings.xml
+
+[antennapod.description]
+file_filter = description/<lang>.txt
+source_file = description/en.txt
+source_lang = en
+
+[antennapod.changelog]
+file_filter = changelog/<lang>.md
+source_file = CHANGELOG.md
+source_lang = en
+
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 888aa026a..38441a520 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.danoeh.antennapod"
- android:versionCode="30"
- android:versionName="0.9.7.3" >
+ android:versionCode="31"
+ android:versionName="0.9.7.4" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
@@ -23,6 +23,9 @@
<uses-feature
android:name="android.hardware.screen.portrait"
android:required="false" />
+ <uses-feature
+ android:name="android.hardware.touchscreen"
+ android:required="false" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@@ -53,6 +56,37 @@
android:label="@string/add_new_feed_label"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
+ <action android:name="android.intent.action.VIEW"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ <data android:scheme="http"/>
+ <data android:host="*"/>
+ <data android:pathPattern=".*\\.xml"/>
+ <data android:pathPattern=".*\\.rss"/>
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ <data android:scheme="http"/>
+ <data android:host="feeds.feedburner.com"/>
+ <data android:host="feedproxy.google.com"/>
+ <data android:host="feeds2.feedburner.com"/>
+ <data android:host="feedsproxy.google.com"/>
+ </intent-filter>
+
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW"/>
+ <category android:name="android.intent.category.DEFAULT"/>
+ <category android:name="android.intent.category.BROWSABLE"/>
+ <data android:scheme="http"/>
+ <data android:mimeType="text/xml"/>
+ <data android:mimeType="application/rss+xml"/>
+ <data android:mimeType="application/atom+xml"/>
+ <data android:mimeType="application/xml"/>
+ </intent-filter>
+ <intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
@@ -189,67 +223,9 @@
<data
android:host="*"
- android:pathPattern=".*\\.xml"
- android:scheme="https" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data
- android:host="*"
- android:pathPattern=".*\\.xml"
- android:scheme="http" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data
- android:pathPattern=".*\\.xml"
- android:scheme="file" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data android:mimeType="application/xml" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data android:mimeType="text/xml" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data
- android:host="*"
- android:pathPattern=".*\\.opml"
- android:scheme="https" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data
- android:host="*"
+ android:mimeType="*/*"
android:pathPattern=".*\\.opml"
- android:scheme="http" />
+ android:scheme="file" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@@ -259,17 +235,9 @@
<data
android:host="*"
- android:mimeType="*/*"
android:pathPattern=".*\\.opml"
- android:scheme="file" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
-
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
-
- <data android:mimeType="text/x-opml" />
+ android:scheme="file"
+ android:mimeType="text/x-opml" />
</intent-filter>
</activity>
<activity
@@ -368,4 +336,4 @@
</receiver>
</application>
-</manifest> \ No newline at end of file
+</manifest>
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5c2d376d1..8e9b28fb2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,14 @@
Change Log
==========
+Version 0.9.7.4
+---------------
+* Episode cache size can now be set to unlimited
+* Removing an episode in the queue via sliding can now be undone
+* Added support for Links in MP3 chapters
+* Added Czech(Czech Republic), Azerbaijani and Portuguese translations
+* Several bugfixes and improvements
+
Version 0.9.7.3
---------------
* Bluetooth devices now display metadata during playback (requires AVRCP 1.3 or higher)
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index d84bd79f1..2f51914fe 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -6,6 +6,8 @@ ligi
ortylp
LatinSuD
wseemann
+hzulla
+andrewgaul
Translations:
@@ -19,4 +21,7 @@ Spanish: frandavid100, Fitoschido, dvd1985
Spanish (Spain): e2jk, dvd1985, frandavid100
Ukrainian (Ukraine): zhenya97, older
French: lacouture, e2jk
-Italian (Italy): m.chinni \ No newline at end of file
+Italian (Italy): m.chinni
+Czech(Czech Republic): elich
+Azerbaijani: phoenixar
+Portuguese: smarquespt \ No newline at end of file
diff --git a/assets/about.html b/assets/about.html
index e0c972682..260db246f 100644
--- a/assets/about.html
+++ b/assets/about.html
@@ -40,7 +40,7 @@
<body>
<div id="header" align="center">
<img src="logo.png" alt="Logo" width="100px" height="100px"/>
- <p>AntennaPod, Version 0.9.7.3</p>
+ <p>AntennaPod, Version 0.9.7.4</p>
<p>Copyright © 2012 Daniel Oeh</p>
<p>Licensed under the MIT License <a href="LICENSE.html">(View)</a></p>
</div>
diff --git a/pom.xml b/pom.xml
index ad67f0b55..f7935a0d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
<groupId>de.danoeh</groupId>
<artifactId>antennapod</artifactId>
<packaging>apk</packaging>
- <version>0.9.7.3</version>
+ <version>0.9.7.4</version>
<name>AntennaPod</name>
@@ -87,7 +87,7 @@
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
- <version>3.5.0</version>
+ <version>3.6.0</version>
<configuration>
<sdk>
<path>${env.ANDROID_HOME}</path>
@@ -167,6 +167,10 @@
<storepass>${sign.storepass}</storepass>
<keypass>${sign.keypass}</keypass>
<verbose>true</verbose>
+ <arguments>
+ <argument>-sigalg</argument><argument>MD5withRSA</argument>
+ <argument>-digestalg</argument><argument>SHA1</argument>
+ </arguments>
</configuration>
</execution>
</executions>
@@ -190,10 +194,11 @@
</zipalign>
<manifest>
<debuggable>false</debuggable>
- <versionCodeAutoIncrement>true</versionCodeAutoIncrement>
+ <versionCodeAutoIncrement>false</versionCodeAutoIncrement>
</manifest>
<proguard>
- <skip>true</skip>
+ <skip>false</skip>
+ <config>proguard.cfg</config>
</proguard>
</configuration>
<executions>
diff --git a/proguard.cfg b/proguard.cfg
index 795bbbb9c..3e5ad54e4 100644
--- a/proguard.cfg
+++ b/proguard.cfg
@@ -8,6 +8,11 @@
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
+#-libraryjars libs/android-support-v4.jar
+#-libraryjars libs/commons-lang3-3.1.jar
+#-libraryjars libs/flattr4j-core-2.4.jar
+#-libraryjars libs/commons-io-2.4.jar
+
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
diff --git a/res/drawable-xhdpi/ic_undobar_undo.png b/res/drawable-xhdpi/ic_undobar_undo.png
new file mode 100644
index 000000000..91c8429ad
--- /dev/null
+++ b/res/drawable-xhdpi/ic_undobar_undo.png
Binary files differ
diff --git a/res/drawable-xhdpi/undobar.9.png b/res/drawable-xhdpi/undobar.9.png
new file mode 100644
index 000000000..22fa2205b
--- /dev/null
+++ b/res/drawable-xhdpi/undobar.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/undobar_button_focused.9.png b/res/drawable-xhdpi/undobar_button_focused.9.png
new file mode 100644
index 000000000..d284ca7cb
--- /dev/null
+++ b/res/drawable-xhdpi/undobar_button_focused.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/undobar_button_pressed.9.png b/res/drawable-xhdpi/undobar_button_pressed.9.png
new file mode 100644
index 000000000..e990659f0
--- /dev/null
+++ b/res/drawable-xhdpi/undobar_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/undobar_divider.9.png b/res/drawable-xhdpi/undobar_divider.9.png
new file mode 100644
index 000000000..1b067d4e7
--- /dev/null
+++ b/res/drawable-xhdpi/undobar_divider.9.png
Binary files differ
diff --git a/res/drawable/undobar_button.xml b/res/drawable/undobar_button.xml
new file mode 100644
index 000000000..a4de91b49
--- /dev/null
+++ b/res/drawable/undobar_button.xml
@@ -0,0 +1,22 @@
+<!--
+
+ Copyright 2012 Roman Nurik
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/undobar_button_pressed" android:state_pressed="true"/>
+ <item android:drawable="@drawable/undobar_button_focused" android:state_focused="true"/>
+ <item android:drawable="@android:color/transparent"/>
+</selector>
diff --git a/res/layout/organize_queue.xml b/res/layout/organize_queue.xml
index b73263632..62b2e980c 100644
--- a/res/layout/organize_queue.xml
+++ b/res/layout/organize_queue.xml
@@ -1,14 +1,12 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dslv="http://schemas.android.com/apk/res/de.danoeh.antennapod"
android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
+ android:layout_height="fill_parent" >
<com.mobeta.android.dslv.DragSortListView
android:id="@android:id/list"
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
+ android:layout_height="match_parent"
dslv:collapsed_height="2dp"
dslv:drag_enabled="true"
dslv:drag_handle_id="@id/drag_handle"
@@ -32,4 +30,9 @@
android:gravity="center"
android:text="@string/no_items_label" />
-</LinearLayout> \ No newline at end of file
+ <LinearLayout android:id="@+id/undobar" style="@style/UndoBar">
+ <TextView android:id="@+id/undobar_message" style="@style/UndoBarMessage" />
+ <Button android:id="@+id/undobar_button" style="@style/UndoBarButton" />
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
new file mode 100644
index 000000000..7047a2df2
--- /dev/null
+++ b/res/values-az/strings.xml
@@ -0,0 +1,231 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--Activitiy titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="feeds_label">Kanallar</string>
+ <string name="podcasts_label">PODKASTLAR</string>
+ <string name="episodes_label">EPIZODLAR</string>
+ <string name="new_label">Yeni</string>
+ <string name="waiting_list_label">Gözləmədə</string>
+ <string name="settings_label">Parametrlər</string>
+ <string name="add_new_feed_label">Yeni kanal əlavə et</string>
+ <string name="downloads_label">Yükləmələr</string>
+ <string name="cancel_download_label">Yükləməyi ləğv et</string>
+ <string name="download_log_label">Yükləmə jurnalı</string>
+ <string name="playback_history_label">Oynatma tarixiçəsi</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">Brauzerdə aç</string>
+ <string name="copy_url_label">URLı kopiyala</string>
+ <string name="share_url_label">URLı paylaş</string>
+ <string name="copied_url_msg">URL buferə köçürüldü</string>
+ <!--Playback history-->
+ <string name="clear_history_label">Tarixiçəni sildir</string>
+ <!--Other-->
+ <string name="confirm_label">Oldu</string>
+ <string name="cancel_label">Ləğv et</string>
+ <string name="author_label">Müəlif</string>
+ <string name="language_label">Dil</string>
+ <string name="cover_label">Üz:</string>
+ <string name="error_label">Xəta</string>
+ <string name="error_msg_prefix">Xəta baş verdi:</string>
+ <string name="refresh_label">Təzələ</string>
+ <string name="external_storage_error_msg">Heç bir yaddaş cihazı tapılmadı.</string>
+ <string name="chapters_label">Fəsillər</string>
+ <string name="shownotes_label">Təsvir</string>
+ <string name="most_recent_prefix">Ən yeni epizod:\u0020</string>
+ <string name="episodes_suffix">\u0020epizod</string>
+ <string name="published_prefix">Nəşr edən:\u0020</string>
+ <string name="length_prefix">Müddət:\u0020</string>
+ <string name="size_prefix">Ölçü:\u0020</string>
+ <string name="processing_label">Hazırlaşma</string>
+ <string name="loading_label">Yükləmə...</string>
+ <string name="image_of_prefix">Şəkil:\u0020</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">Kanalın URLı</string>
+ <string name="txtvfeedurl_label">Kanalın URLını yaz:</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Hamısını oxunmuş kimi işarələ</string>
+ <string name="show_info_label">Məlumatı göstər</string>
+ <string name="remove_feed_label">Kanlı sil</string>
+ <string name="share_link_label">Web-səhifəyi paylaş</string>
+ <string name="share_source_label">Kanalı paylaş</string>
+ <string name="feed_delete_confirmation_msg">Bütün kanallar və epizodlar silinəçək.</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Yüklə</string>
+ <string name="play_label">Oynat</string>
+ <string name="pause_label">Pauza</string>
+ <string name="stream_label">İnternetən yayimla</string>
+ <string name="remove_label">Sil</string>
+ <string name="mark_read_label">Oxumuş kimi işarələ</string>
+ <string name="mark_unread_label">Oxunmamış kimi işarələ</string>
+ <string name="add_to_queue_label">Növbəyə əlavə et</string>
+ <string name="remove_from_queue_label">Növbədən sil</string>
+ <string name="visit_website_label">Web-səhifəsini aç</string>
+ <string name="support_label">Flattrla</string>
+ <string name="enqueue_all_new">Hamsını növbəyə əlavə et</string>
+ <string name="download_all">Hamısını yüklə</string>
+ <string name="skip_episode_label">Epizodu burax</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">Yükləmə uğurlu keçdi</string>
+ <string name="download_failed">Yükləmə uğursuzdur</string>
+ <string name="download_pending">Yükləmə gözlənir</string>
+ <string name="download_running">Yükləmə gedir</string>
+ <string name="download_error_device_not_found">Yaddaş cihazı tapılmadı</string>
+ <string name="download_error_insufficient_space">Yaddaş çatmır</string>
+ <string name="download_error_file_error">Fayl xətası</string>
+ <string name="download_error_http_data_error">HTTP protokolnun xətası</string>
+ <string name="download_error_error_unknown">Naməlum xəta</string>
+ <string name="download_error_parser_exception">Parserin xətası</string>
+ <string name="download_error_unsupported_type">Naməlum kanal növü</string>
+ <string name="download_error_connection_error">Əlaqə xətasi</string>
+ <string name="download_error_unknown_host">Naməlum xost</string>
+ <string name="cancel_all_downloads_label">Yükləmələrin hamısını ləğv et</string>
+ <string name="download_cancelled_msg">Yükləmə ləğv olundu</string>
+ <string name="download_report_title">Yükləmə başa çatdı</string>
+ <string name="download_error_malformed_url">Yanlış URL</string>
+ <string name="download_error_io_error">IO xətasi</string>
+ <string name="download_error_request_error">Tələbin xətası</string>
+ <string name="downloads_left">\u0020yükləmə galdı</string>
+ <string name="download_notification_title">Podkast məlumatların yüklənişi</string>
+ <string name="download_report_content">%1$d yükləmə uğurludur, %2$d uğursuzdur</string>
+ <string name="download_log_title_unknown">Naməlum başliğ</string>
+ <string name="download_type_feed">Kanal</string>
+ <string name="download_type_media">Mediya fayl</string>
+ <string name="download_type_image">Şəkil</string>
+ <string name="download_request_error_dialog_message_prefix">Fayl yükləmə xətası:\u0020</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Xəta!</string>
+ <string name="player_stopped_msg">Heç nə oynadılmır</string>
+ <string name="player_preparing_msg">Hazırlanır</string>
+ <string name="player_ready_msg">Hazır</string>
+ <string name="player_seeking_msg">Axtarış</string>
+ <string name="playback_error_server_died">Server iştəmir</string>
+ <string name="playback_error_unknown">Naməlum xəta</string>
+ <string name="no_media_playing_label">Heç nə oynadılmır</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">Buferləşmə</string>
+ <string name="playbackservice_notification_title">Podkast oynadılır</string>
+ <string name="playbackservice_notification_content">Daha çox info üçün bura bas</string>
+ <!--Navigation-->
+ <string name="show_download_log">Jurnalı göstər</string>
+ <string name="show_player_label">Pleyeri göstər</string>
+ <!--Queue operations-->
+ <string name="clear_queue_label">Növbəyi sil</string>
+ <string name="organize_queue_label">Növbələ düzənlə</string>
+ <string name="undo">Qaytar</string>
+ <string name="removed_from_queue">Element silindi</string>
+ <!--Flattr-->
+ <string name="flattr_auth_label">Flattra gir</string>
+ <string name="flattr_auth_explanation">Girmə prosesini başlamaq üçün düyməyi basın. Flattrın giriş səhifəsinə aparılacağsınız.</string>
+ <string name="authenticate_label">Gir</string>
+ <string name="return_home_label">Baş ekrana dön</string>
+ <string name="flattr_auth_success">Giriş uğurludur! İndi tətbiqlədən Flattrla istifadə edə bilərsiniz.</string>
+ <string name="no_flattr_token_title">Heç bir Flattr tokeni tapılmadı</string>
+ <string name="no_flattr_token_msg">Olsun ki sizin Flattr hesabınız AntennaPod\'a qoşulmadı. Yenə Flattra girin ya da podkastın səhifəsinə keçin.</string>
+ <string name="authenticate_now_label">Gir</string>
+ <string name="action_forbidden_title">Əməliyyat qadağan olundu</string>
+ <string name="action_forbidden_msg">Bu əməliyyat üçün AntennaPod\'un icazəsi yoxdur. AntennaPod\'un keçid tokenin ləğv olunması bunun səbəbi ola bilər. Yenə Flattra girin ya da podkastın səhifəsinə keçin.</string>
+ <string name="access_revoked_title">Keçid ləğv olundu</string>
+ <string name="access_revoked_info">AntennaPod\'un keçid tokeni uğurlu ləğv olundu.</string>
+ <string name="flattr_click_success">Flattrma uğurludur</string>
+ <string name="flattring_label">Flattrləmə</string>
+ <!--Empty list labels-->
+ <string name="no_items_label">Siyahıda heç nə yoxdur</string>
+ <string name="no_feeds_label">Hələ heç bir kanala yazilmadınız</string>
+ <!--Preferences-->
+ <string name="other_pref">Başqa</string>
+ <string name="about_pref">Proqram haqqinda</string>
+ <string name="queue_label">Növbə</string>
+ <string name="pref_pauseOnHeadsetDisconnect_sum">Qulaqliqı ayiranda oynatma dayanacağ</string>
+ <string name="pref_followQueue_sum">Oynatma başa çatanda növbədə irəlidəki epizodu oynat</string>
+ <string name="playback_pref">Oynatma</string>
+ <string name="network_pref">Şəbəkə</string>
+ <string name="pref_autoUpdateIntervall_title">Təzələmə intervali</string>
+ <string name="pref_autoUpdateIntervall_sum">Kanalın avtomatik təzələməsinin intervalını seç ya da keçir onu</string>
+ <string name="pref_downloadMediaOnWifiOnly_sum">Təkçə Wi-Fi vasitəsiilə yüklə</string>
+ <string name="pref_followQueue_title">Fasiləsiz oynatma</string>
+ <string name="pref_downloadMediaOnWifiOnly_title">Wi-Fi vasitəsiilə yükləmə</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Qulaqliqı ayır</string>
+ <string name="pref_mobileUpdate_title">Mobil şəbəbkə vasitəsiilə təzələmə</string>
+ <string name="pref_mobileUpdate_sum">Mobil şəbəbkə vasitəsiilə təzələməyə icazə vermək</string>
+ <string name="refreshing_label">Təzələmə</string>
+ <string name="flattr_settings_label">Flattr parametrləri</string>
+ <string name="pref_flattr_auth_title">Flattra gir</string>
+ <string name="pref_flattr_auth_sum">Flattr\'la istifadə etmək üçün, öz Flattr hesabınıza girin</string>
+ <string name="pref_flattr_this_app_title">Bu proqramı flattrla</string>
+ <string name="pref_flattr_this_app_sum">Flattr vasitəsiilə AntennaPodun inkişafını dəstək edin. Sağolun!</string>
+ <string name="pref_revokeAccess_title">Keçidi ləğv ət</string>
+ <string name="pref_revokeAccess_sum">Flattr hesabına keçidi ləğv et</string>
+ <string name="pref_display_only_episodes_title">Təkçə epizodları göstər</string>
+ <string name="pref_display_only_episodes_sum">Təkçə daxilində epizod olan elementləri göstər</string>
+ <string name="user_interface_label">İnterfeys</string>
+ <string name="pref_set_theme_title">Görüşü seç</string>
+ <string name="pref_set_theme_sum">AntennaPod\'un görüşünü dəyişdir</string>
+ <string name="pref_automatic_download_title">Avtomatik yükləmə</string>
+ <string name="pref_automatic_download_sum">Epizodların avtomatik yüklənişinin konfiqurasiyanı dəyiş</string>
+ <string name="pref_autodl_wifi_filter_title">Wi-Fi filtr</string>
+ <string name="pref_autodl_wifi_filter_sum">Seçilən Wi-Fi səbəkələr vasitəsiilə avtomatik yükləməyi icazə ver</string>
+ <string name="pref_episode_cache_title">Epizod keşi</string>
+ <string name="pref_theme_title_light">Ağ</string>
+ <string name="pref_theme_title_dark">Qara</string>
+ <string name="pref_episode_cache_unlimited">Hədsiz</string>
+ <string name="pref_update_interval_hours_plural">saat</string>
+ <string name="pref_update_interval_hours_singular">saat</string>
+ <string name="pref_update_interval_hours_manual">Əl ilə</string>
+ <!--Search-->
+ <string name="search_hint">Kanalları və ya epizodları axtar</string>
+ <string name="found_in_shownotes_label">Təsvirlərdə tapıldı</string>
+ <string name="found_in_chapters_label">Fəsillərdə tapıldı</string>
+ <string name="search_status_searching">Axtarış...</string>
+ <string name="search_status_no_results">Heç nə tapılmadı</string>
+ <string name="search_results_label">Axtarışın nəticələri</string>
+ <string name="search_term_label">Axtarılan:\u0020</string>
+ <string name="search_label">Axtar</string>
+ <string name="found_in_title_label">Başlığda tapıldı</string>
+ <!--OPML import and export-->
+ <string name="opml_import_txtv_button_lable">Ya da OPML faylı idxal edə bilərsiniz. OPML fayl vasitəsiilə siz öz podkastlarınızı başqa podcast menecerə köcürə bilərsiniz:</string>
+ <string name="opml_import_explanation">OPML faylın idxalı üçün onu aşağıdakı qovluqa yerləşdirin və idxal prosesini başlamaq üçün düyməyi basın.</string>
+ <string name="start_import_label">İdxalı başla</string>
+ <string name="opml_import_label">OPML idxalı</string>
+ <string name="opml_directory_error">XƏTA!</string>
+ <string name="reading_opml_label">OPML faylın oxunması</string>
+ <string name="opml_reader_error">OPML faylını oxuyanda xəta baş verdi:</string>
+ <string name="opml_import_error_dir_empty">İdxal qovliqu boşdur.</string>
+ <string name="select_all_label">Hamısını seç</string>
+ <string name="deselect_all_label">Seçimi ləğv et</string>
+ <string name="choose_file_to_import_label">İdxal üçün fayl seç</string>
+ <string name="opml_export_label">OPML ixraçı</string>
+ <string name="exporting_label">İxrac...</string>
+ <string name="export_error_label">İxracın xətası</string>
+ <string name="opml_export_success_title">OPML ixracı uğurlu keçdi</string>
+ <string name="opml_export_success_sum">OPML fayl:\u0020 yazılıb</string>
+ <!--Sleep timer-->
+ <string name="set_sleeptimer_label">Yuxu taymerini qoy</string>
+ <string name="disable_sleeptimer_label">Yuxu taymerini keçir</string>
+ <string name="enter_time_here_label">Vaxtı yaz</string>
+ <string name="sleep_timer_label">Yuxu taymeri</string>
+ <string name="time_left_label">Vaxt galdı:\u0020</string>
+ <string name="time_dialog_invalid_input">Yanlış yazi. Vaxt təkçə rəqmlərlə yazılır</string>
+ <!--Miro Guide-->
+ <string name="loading_categories_label">Kategoriya yüklənişi...</string>
+ <string name="browse_miroguide_label">MiroGuide\'da bax</string>
+ <string name="txtv_browse_miroguide_label">Ya da MiroGuide\'da bax:</string>
+ <string name="miro_guide_label">MiroGuide</string>
+ <string name="miro_search_hint">MiroGuide\'da axtar</string>
+ <string name="popular_label">Populyar</string>
+ <string name="best_rating_label">Ən reytinqli</string>
+ <string name="add_feed_label">Kanalı əlavə et</string>
+ <string name="miro_feed_added">Kanal əlavə olundu</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Seçilən qovluq:</string>
+ <string name="create_folder_label">Qovluqu yarat</string>
+ <string name="choose_data_directory">Məlumat qovluqunu seç</string>
+ <string name="create_folder_msg">\"%1$s\" adlı qovluq yaradılsınmı?</string>
+ <string name="create_folder_success">Yeni qovluq yaradıldı</string>
+ <string name="create_folder_error_no_write_access">Bu qovluqa yazıla bilinmer</string>
+ <string name="create_folder_error_already_exists">Qovluq artiq var</string>
+ <string name="create_folder_error">Qovluq yaradılmadı</string>
+ <string name="folder_not_empty_dialog_title">Qovluq boş deyil</string>
+ <string name="folder_not_empty_dialog_msg">Seçilən qovluq boş deyil. Mediya yükləmələr və başka fayllar bu qovluqa yazılacaqlar. Necə olsa davam olsunmu?</string>
+ <string name="set_to_default_folder">Başlanğıc qovluqu seç</string>
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6ef477546..df2c3b719 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">L\'emmagatzemament extern no està disponible. Assegureu-vos que està muntat per què l\'aplicació funcioni correctament.</string>
<string name="chapters_label">Capítols</string>
<string name="shownotes_label">Notes del programa</string>
- <string name="last_update_prefix">Darrera actualització:\u0020</string>
+ <string name="most_recent_prefix">Episodi més recent: \u0020</string>
<string name="episodes_suffix">\u0020episodis</string>
<string name="published_prefix">Publicat:\u0020</string>
<string name="length_prefix">Durada:\u0020</string>
@@ -51,10 +51,10 @@
<string name="share_source_label">Comparteix l\'enllaç del canal</string>
<string name="feed_delete_confirmation_msg">Confirmeu que, efectivament, voleu suprimir aquest canal i tots els episodis que us n\'heu baixat.</string>
<!--actions on feeditems-->
- <string name="download_label">Baixades</string>
+ <string name="download_label">Baixa</string>
<string name="play_label">Reprodueix</string>
<string name="pause_label">Pausa</string>
- <string name="stream_label">Flux</string>
+ <string name="stream_label">Reprodueix sense baixar</string>
<string name="remove_label">Suprimeix</string>
<string name="mark_read_label">Marca com a llegit</string>
<string name="mark_unread_label">Marca com a pendent</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Buida la cua</string>
<string name="organize_queue_label">Ordena la cua</string>
+ <string name="undo">Desfés</string>
+ <string name="removed_from_queue">Ítem esborrat</string>
<!--Flattr-->
<string name="flattr_auth_label">Inici de sessió a Flattr</string>
<string name="flattr_auth_explanation">Premeu el botó per iniciar el procés d\'autenticació. Quan s\'obri la pantalla d\'inici de sessió de Flattr al vostre navegador, introduïu les vostres credencials i concediu a AntennaPod els permisos de compartir mitjançant Flattr. En finalitzar el procés, tornareu automàticament a aquesta pantalla.</string>
@@ -134,18 +136,18 @@
<string name="other_pref">Altres</string>
<string name="about_pref">Quant a</string>
<string name="queue_label">Cua</string>
- <string name="pref_pauseOnHeadsetDisconnect_sum">Pausa la reproducció en desconnectar els auriculars</string>
+ <string name="pref_pauseOnHeadsetDisconnect_sum">Pausa la reproducció en desconnectar els auriculars.</string>
<string name="pref_followQueue_sum">Salta al següent element de la cua en acabar la reproducció</string>
<string name="playback_pref">Reproducció</string>
<string name="network_pref">Xarxa</string>
<string name="pref_autoUpdateIntervall_title">Interval d\'actualització</string>
- <string name="pref_autoUpdateIntervall_sum">Especifiqueu l\'interval en què els canals s\'actualitzen de forma automàtica, o deshabiliteu la funcionalitat</string>
+ <string name="pref_autoUpdateIntervall_sum">Especifiqueu l\'interval en què els canals s\'actualitzen de forma automàtica, o deshabiliteu la funcionalitat.</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Només baixa fitxers a través d\'una xarxa sense fils</string>
<string name="pref_followQueue_title">Reproducció continuada</string>
<string name="pref_downloadMediaOnWifiOnly_title">Baixa a través de xarxes sense fils</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Desconnexió d\'auriculars</string>
<string name="pref_mobileUpdate_title">Actualitzacions sobre xarxes mòbils</string>
- <string name="pref_mobileUpdate_sum">Permet actualitzacions a través de xarxes mòbils</string>
+ <string name="pref_mobileUpdate_sum">Permet actualitzacions a través de xarxes mòbils.</string>
<string name="refreshing_label">S\'està actualitzant</string>
<string name="flattr_settings_label">Configuració de Flattr</string>
<string name="pref_flattr_auth_title">Inici de sessió Flattr</string>
@@ -153,17 +155,23 @@
<string name="pref_flattr_this_app_title">Compartiu aquesta aplicació amb Flattr</string>
<string name="pref_flattr_this_app_sum">Doneu suport al desenvolupament d\'AntennaPod compartint l\'aplicació a través de Flattr. Gràcies!</string>
<string name="pref_revokeAccess_title">Revoca l\'accés</string>
- <string name="pref_revokeAccess_sum">Revoca el permís d\'accés d\'aquesta aplicació al vostre compte Flattr.</string>
+ <string name="pref_revokeAccess_sum">Revoqueu el permís d\'accés d\'aquesta aplicació al vostre compte Flattr.</string>
<string name="pref_display_only_episodes_title">Mostra només episodis</string>
<string name="pref_display_only_episodes_sum">Mostra només els elements que tenen algun episodi.</string>
<string name="user_interface_label">Interfície d\'usuari</string>
- <string name="pref_set_theme_title">Seleccioneu un tema</string>
+ <string name="pref_set_theme_title">Selecció de tema</string>
<string name="pref_set_theme_sum">Canvieu l\'aparença d\'AntennaPod.</string>
<string name="pref_automatic_download_title">Baixada automàtica</string>
- <string name="pref_automatic_download_sum">Configura la baixada automàtica d\'episodis.</string>
+ <string name="pref_automatic_download_sum">Configureu la baixada automàtica d\'episodis.</string>
<string name="pref_autodl_wifi_filter_title">Activa el filtre de la xarxa sense fils</string>
<string name="pref_autodl_wifi_filter_sum">Permet les baixades automàtiques només per a les xarxes sense fils seleccionades.</string>
<string name="pref_episode_cache_title">Memòria d\'episodis</string>
+ <string name="pref_theme_title_light">Clar</string>
+ <string name="pref_theme_title_dark">Fosc</string>
+ <string name="pref_episode_cache_unlimited">Sense límits</string>
+ <string name="pref_update_interval_hours_plural">hores</string>
+ <string name="pref_update_interval_hours_singular">hora</string>
+ <string name="pref_update_interval_hours_manual">Manual</string>
<!--Search-->
<string name="search_hint">Cerca canals o episodis</string>
<string name="found_in_shownotes_label">Trobat a notes del programa</string>
@@ -176,7 +184,7 @@
<string name="found_in_title_label">Trobat al títol</string>
<!--OPML import and export-->
<string name="opml_import_txtv_button_lable">També podeu importar fitxers OPML. Els fitxers OPML us permeten moure els podcasts d\'una aplicació a una altra:</string>
- <string name="opml_import_explanation">Per importar un fitxer OPML, l\'heu d\'ubicar al següent directori i prémer el botó de sota per iniciar el procés. </string>
+ <string name="opml_import_explanation">Per importar un fitxer OPML, ubiqueu-lo al següent directori i premeu el botó de sota per iniciar el procés. </string>
<string name="start_import_label">Inicia la importació</string>
<string name="opml_import_label">Importació OPML</string>
<string name="opml_directory_error">Error!</string>
diff --git a/res/values-cs-rCZ/strings.xml b/res/values-cs-rCZ/strings.xml
new file mode 100644
index 000000000..84db0c7f6
--- /dev/null
+++ b/res/values-cs-rCZ/strings.xml
@@ -0,0 +1,231 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--Activitiy titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="feeds_label">Zdroje</string>
+ <string name="podcasts_label">PODCASTY</string>
+ <string name="episodes_label">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 nový zdroj</string>
+ <string name="downloads_label">Stahování</string>
+ <string name="cancel_download_label">Zrušit stahování</string>
+ <string name="download_log_label">Historie stáhnování</string>
+ <string name="playback_history_label">Historie přehrávání</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>
+ <!--Playback history-->
+ <string name="clear_history_label">Vymazat 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="cover_label">Obal</string>
+ <string name="error_label">Chyba</string>
+ <string name="error_msg_prefix">Nastala chyba:</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>
+ <string name="shownotes_label">Poznámky</string>
+ <string name="most_recent_prefix">Poslední epizoda:\u0020</string>
+ <string name="episodes_suffix">\u0020epizod</string>
+ <string name="published_prefix">Publikováno:\u0020</string>
+ <string name="length_prefix">Délka:\u0020</string>
+ <string name="size_prefix">Velikost:\u0020</string>
+ <string name="processing_label">Zpracovávám</string>
+ <string name="loading_label">Načítám...</string>
+ <string name="image_of_prefix">Obrázek:\u0020</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">URL zdroje</string>
+ <string name="txtvfeedurl_label">Zadejte URL zdroje:</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Označit vše jako přečtené</string>
+ <string name="show_info_label">Informace o zdroji</string>
+ <string name="remove_feed_label">Odstranit zdroj</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>
+ <!--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="remove_label">Odstranit</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="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_successful">Stahování dokončeno</string>
+ <string name="download_failed">Stahování selhalo</string>
+ <string name="download_pending">Čekající na stažení</string>
+ <string name="download_running">Probíhající 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>
+ <string name="download_error_http_data_error">HTTP chyba</string>
+ <string name="download_error_error_unknown">Neznámá chyba</string>
+ <string name="download_error_parser_exception">Výjimka parseru</string>
+ <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="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>
+ <string name="download_error_malformed_url">Chybné URL</string>
+ <string name="download_error_io_error">IO chyba</string>
+ <string name="download_error_request_error">Chyba požadavku</string>
+ <string name="downloads_left">\u0020Stahování zbývá</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>
+ <string name="download_type_feed">Zdroj</string>
+ <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>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Chyba!</string>
+ <string name="player_stopped_msg">Žádné probíhající přehrávání</string>
+ <string name="player_preparing_msg">Připravuji</string>
+ <string name="player_ready_msg">Připraven</string>
+ <string name="player_seeking_msg">Přetáčím</string>
+ <string name="playback_error_server_died">Server nereaguje</string>
+ <string name="playback_error_unknown">Neznámá chyba</string>
+ <string name="no_media_playing_label">Žádné probíhající přehrávání</string>
+ <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="playbackservice_notification_content">Stiskni zde pro více informací</string>
+ <!--Navigation-->
+ <string name="show_download_log">Historie stahování</string>
+ <string name="show_player_label">Přehrávač</string>
+ <!--Queue operations-->
+ <string name="clear_queue_label">Vyprázdnit frontu</string>
+ <string name="organize_queue_label">Přeuspořádat frontu</string>
+ <string name="undo">Zpět</string>
+ <string name="removed_from_queue">Položka odebrána</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>
+ <string name="authenticate_label">Přihlásit</string>
+ <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_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_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>
+ <string name="flattr_click_success">Úspěšně flattrováno!</string>
+ <string name="flattring_label">Flattruji</string>
+ <!--Empty list labels-->
+ <string name="no_items_label">Žádné položky v seznamu.</string>
+ <string name="no_feeds_label">Zatím nebyly přidány žádné zdroje.</string>
+ <!--Preferences-->
+ <string name="other_pref">Ostatní</string>
+ <string name="about_pref">O aplikaci</string>
+ <string name="queue_label">Fronta</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="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_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="refreshing_label">Obnovuji</string>
+ <string name="flattr_settings_label">Nastavení Flattr</string>
+ <string name="pref_flattr_auth_title">Flattr přihlášení</string>
+ <string name="pref_flattr_auth_sum">Přihlásit se k flattr účtu a umožnit flattrování přímo z aplikace.</string>
+ <string name="pref_flattr_this_app_title">Flattrovat tuto aplikaci</string>
+ <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_display_only_episodes_title">Zobrazit pouze epizody</string>
+ <string name="pref_display_only_episodes_sum">Zobrazit pouze položky obsahující epizody.</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>
+ <string name="pref_automatic_download_title">Automatické stahování</string>
+ <string name="pref_automatic_download_sum">Nastavení automatického stahování epizod.</string>
+ <string name="pref_autodl_wifi_filter_title">Zapnout Wi-Fi filtr</string>
+ <string name="pref_autodl_wifi_filter_sum">Povolit automatické stahování pouze pomocí vybraných Wi-Fi sítí.</string>
+ <string name="pref_episode_cache_title">Historie epizod</string>
+ <string name="pref_theme_title_light">Světlý</string>
+ <string name="pref_theme_title_dark">Tmavý</string>
+ <string name="pref_episode_cache_unlimited">Bez omezení</string>
+ <string name="pref_update_interval_hours_plural">hodin</string>
+ <string name="pref_update_interval_hours_singular">hodina</string>
+ <string name="pref_update_interval_hours_manual">Ruč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>
+ <string name="found_in_chapters_label">Nalezeno v kapitolách</string>
+ <string name="search_status_searching">Vyhledávám...</string>
+ <string name="search_status_no_results">Žádné výsledky</string>
+ <string name="search_results_label">Výsledky vyhledávání</string>
+ <string name="search_term_label">Vyhledáváno:\u0020</string>
+ <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">Můžete také importovat OPML soubor. 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="start_import_label">Importovat</string>
+ <string name="opml_import_label">OPML import</string>
+ <string name="opml_directory_error">CHYBA!</string>
+ <string name="reading_opml_label">Načítání OPML souboru</string>
+ <string name="opml_reader_error">Nastala chyba při čtení OPML souboru:</string>
+ <string name="opml_import_error_dir_empty">Adresář importu je prázdný.</string>
+ <string name="select_all_label">Označit vše</string>
+ <string name="deselect_all_label">Zrušit výběr</string>
+ <string name="choose_file_to_import_label">Vyberte soubor k importování</string>
+ <string name="opml_export_label">OPML export</string>
+ <string name="exporting_label">Exportuji...</string>
+ <string name="export_error_label">Chyba exportu</string>
+ <string name="opml_export_success_title">OPML export byl úspěšný.</string>
+ <string name="opml_export_success_sum">OPML soubor byl zapsán do:\u0020</string>
+ <!--Sleep timer-->
+ <string name="set_sleeptimer_label">Nastavit časovač vypnutí</string>
+ <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_dialog_invalid_input">Neplatný vstup, musí být zadáno celé číslo</string>
+ <!--Miro Guide-->
+ <string name="loading_categories_label">Načítám kategorie...</string>
+ <string name="browse_miroguide_label">Procházet Miro Guide</string>
+ <string name="txtv_browse_miroguide_label">Nebo procházet Miro Guide:</string>
+ <string name="miro_guide_label">Miro Guide</string>
+ <string name="miro_search_hint">Vyhledávat v Miro Guide</string>
+ <string name="popular_label">Populární</string>
+ <string name="best_rating_label">Nejlépe hodnocené</string>
+ <string name="add_feed_label">Přidat zdroj</string>
+ <string name="miro_feed_added">Přidávám zdroj</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Vybraný adresář:</string>
+ <string name="create_folder_label">Vytvořit adresář</string>
+ <string name="choose_data_directory">Vybrat umístění dat</string>
+ <string name="create_folder_msg">Vytvořit adresář \"%1$s\"?</string>
+ <string name="create_folder_success">Nový adresář vytvořen</string>
+ <string name="create_folder_error_no_write_access">Nelze zapisovat do adresáře</string>
+ <string name="create_folder_error_already_exists">Adresář již existuje</string>
+ <string name="create_folder_error">Nelze vytvořit adresář</string>
+ <string name="folder_not_empty_dialog_title">Adresář není prázdný</string>
+ <string name="folder_not_empty_dialog_msg">Vybraný adresář není prázdný. Stažená media a ostatní soubory budou umístěny přímo do tohoto adresáře. Přesto pokračovat?</string>
+ <string name="set_to_default_folder">Vybrat hlavní adresář</string>
+</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 02094b1b2..ae57da607 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">Ingen ekstern harddisk er tilgængelig. Vær venlig at sørge for at den eksterne hukommelse er monteret så app\'en kan fungere korrekt.</string>
<string name="chapters_label">Kapitler</string>
<string name="shownotes_label">Afsnitsnoter</string>
- <string name="last_update_prefix">Sidste opdateringer:\u0020</string>
+ <string name="most_recent_prefix">Seneste episoder:\u0020</string>
<string name="episodes_suffix">\u0020episoder</string>
<string name="published_prefix">Offentliggjort:\u0020</string>
<string name="length_prefix">Længde:\u0020</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Fjern kø</string>
<string name="organize_queue_label">Arranger kø</string>
+ <string name="undo">Fortryd</string>
+ <string name="removed_from_queue">Emne slettet</string>
<!--Flattr-->
<string name="flattr_auth_label">Flattr log ind</string>
<string name="flattr_auth_explanation">Tryk på knappen nedenfor for at starte godkendelsesprocessen. Du vil blive ført til flattr log ind siden i din browser og bedt om at give AntennaPod tilladelse til at flattr emner. Efter at du har givet tilladelsen vil du automatisk vende tilbage til denne side.</string>
@@ -164,6 +166,12 @@
<string name="pref_autodl_wifi_filter_title">Sæt Wi-Fi filter til</string>
<string name="pref_autodl_wifi_filter_sum">Tillad kun automatisk download for de valgte Wi-Fi netværk</string>
<string name="pref_episode_cache_title">Episode cache</string>
+ <string name="pref_theme_title_light">Lys</string>
+ <string name="pref_theme_title_dark">Mørk</string>
+ <string name="pref_episode_cache_unlimited">Uendelig</string>
+ <string name="pref_update_interval_hours_plural">timer</string>
+ <string name="pref_update_interval_hours_singular">time</string>
+ <string name="pref_update_interval_hours_manual">Manuelt</string>
<!--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 71236ef02..3afd65052 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">Der externe Speicher ist nicht verfügbar. Bitte stelle sicher, dass das externe Speichermedium eingelegt ist, damit die App funktioniert.</string>
<string name="chapters_label">Kapitel</string>
<string name="shownotes_label">Notizen</string>
- <string name="last_update_prefix">Letztes Update:\u0020</string>
+ <string name="most_recent_prefix">Letzte Episode:\u0020</string>
<string name="episodes_suffix">\u0020Episoden</string>
<string name="published_prefix">Veröffentlicht:\u0020</string>
<string name="length_prefix">Länge:\u0020</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Abspielliste leeren</string>
<string name="organize_queue_label">Abspielliste organisieren</string>
+ <string name="undo">Rückgängig</string>
+ <string name="removed_from_queue">Element entfernt</string>
<!--Flattr-->
<string name="flattr_auth_label">Flattr Anmeldung</string>
<string name="flattr_auth_explanation">Drücke den Button unten um den Authentifizierungsprozess zu starten. Du wirst dann zur Flattr-Anmeldeseite weitergeleitet, wo du gefragt wirst, AntennaPod die Erlaubnis zu geben, Dinge zu flattrn. Nachdem du die Erlaubnis erteilt hast, kehrst du automatisch zu diesem Bildschirm zurück.</string>
@@ -164,6 +166,12 @@
<string name="pref_autodl_wifi_filter_title">W-LAN-Filter aktivieren</string>
<string name="pref_autodl_wifi_filter_sum">Erlaube das automatische Herunterladen nur in ausgewählten W-LAN Netzwerken.</string>
<string name="pref_episode_cache_title">Episodenspeicher</string>
+ <string name="pref_theme_title_light">Hell</string>
+ <string name="pref_theme_title_dark">Dunkel</string>
+ <string name="pref_episode_cache_unlimited">Unbegrenzt</string>
+ <string name="pref_update_interval_hours_plural">Stunden</string>
+ <string name="pref_update_interval_hours_singular">Stunde</string>
+ <string name="pref_update_interval_hours_manual">Manuell</string>
<!--Search-->
<string name="search_hint">Suche nach Feeds oder Episoden</string>
<string name="found_in_shownotes_label">In Sendungsnotizen gefunden</string>
diff --git a/res/values-es-rES/strings.xml b/res/values-es-rES/strings.xml
index 31d088279..1eb829472 100644
--- a/res/values-es-rES/strings.xml
+++ b/res/values-es-rES/strings.xml
@@ -32,7 +32,6 @@
<string name="external_storage_error_msg">No se encuentra un almacenamiento externo. Asegúrese de que su almacenamiento externo esté montado para que la aplicación funcione correctamente.</string>
<string name="chapters_label">Capítulos</string>
<string name="shownotes_label">Notas del programa</string>
- <string name="last_update_prefix">Última actualización:\u0020</string>
<string name="episodes_suffix">\u0020episodios</string>
<string name="published_prefix">Publicado:\u0020</string>
<string name="length_prefix">Duración:\u0020</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index f28453dcc..0afdd0d1e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -32,9 +32,9 @@
<string name="external_storage_error_msg">No se encuentra un almacenamiento externo. Asegúrese de que su almacenamiento externo esté montado para que la aplicación funcione correctamente.</string>
<string name="chapters_label">Capítulos</string>
<string name="shownotes_label">Notas del programa</string>
- <string name="last_update_prefix">Última actualización:\u0020</string>
+ <string name="most_recent_prefix">Episodio más reciente:\u0020</string>
<string name="episodes_suffix">\u0020episodios</string>
- <string name="published_prefix">Publicado:\u0020</string>
+ <string name="published_prefix">Publicado el:\u0020</string>
<string name="length_prefix">Duración:\u0020</string>
<string name="size_prefix">Tamaño:\u0020</string>
<string name="processing_label">Procesando</string>
@@ -42,7 +42,7 @@
<string name="image_of_prefix">Imagen de:\u0020</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">URL del canal</string>
- <string name="txtvfeedurl_label">Escriba aquí la URL del canal</string>
+ <string name="txtvfeedurl_label">Escriba aquí la URL del canal:</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Marcar todo como leído</string>
<string name="show_info_label">Información del programa</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Limpiar la cola</string>
<string name="organize_queue_label">Organizar cola</string>
+ <string name="undo">Deshacer</string>
+ <string name="removed_from_queue">Artículo eliminado</string>
<!--Flattr-->
<string name="flattr_auth_label">Identificarse en Flattr</string>
<string name="flattr_auth_explanation">Pulse el botón inferior para comenzar la autenticación. Su navegador abrirá la pantalla de identificación de Flattr y le preguntará si quiere conceder permiso a AntennaPod para valorar cosas. Tras concederlo, volverá a esta pantalla automáticamente.</string>
@@ -164,6 +166,12 @@
<string name="pref_autodl_wifi_filter_title">Activar el filtro WiFi</string>
<string name="pref_autodl_wifi_filter_sum">Permitir la descarga automática sólo para las redes WiFi marcadas.</string>
<string name="pref_episode_cache_title">Caché de episodios</string>
+ <string name="pref_theme_title_light">Claro</string>
+ <string name="pref_theme_title_dark">Oscuro</string>
+ <string name="pref_episode_cache_unlimited">Ilimitado</string>
+ <string name="pref_update_interval_hours_plural">horas</string>
+ <string name="pref_update_interval_hours_singular">hora</string>
+ <string name="pref_update_interval_hours_manual">Manual</string>
<!--Search-->
<string name="search_hint">Buscar canales o episodios</string>
<string name="found_in_shownotes_label">Encontrado en las notas del programa</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index e747fc625..5589b59f3 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">Aucun stockage externe n\'est disponible. Merci de connecter un volume de stockage externe pour que l\'application puisse fonctionner correctement.</string>
<string name="chapters_label">Chapitres</string>
<string name="shownotes_label">Notes d\'épisode</string>
- <string name="last_update_prefix">Dernière mise à jour :\u0020</string>
+ <string name="most_recent_prefix">Episode le plus récent :\u0020</string>
<string name="episodes_suffix">\u0020épisodes</string>
<string name="published_prefix">Publié :\u0020</string>
<string name="length_prefix">Durée :\u0020</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Effacer la liste</string>
<string name="organize_queue_label">Ordre de lecture</string>
+ <string name="undo">Annuler</string>
+ <string name="removed_from_queue">Élément retiré</string>
<!--Flattr-->
<string name="flattr_auth_label">Connecter à Flattr</string>
<string name="flattr_auth_explanation">Appuyez sur le bouton ci-dessous pour vous authentifier. Vous serez envoyés à l\'écran de connexion Flattr dans le navigateur, et il vous sera demandé de donner à AntennaPod la permission de flattr. Une fois ceci fait, vous reviendrez automatiquement à cet écran.</string>
@@ -164,6 +166,12 @@
<string name="pref_autodl_wifi_filter_title">Activer le filtre Wi-Fi</string>
<string name="pref_autodl_wifi_filter_sum">Autoriser le téléchargement automatique uniquement sur les réseaux Wi-Fi sélectionnés.</string>
<string name="pref_episode_cache_title">Épisodes stockés localement</string>
+ <string name="pref_theme_title_light">Clair</string>
+ <string name="pref_theme_title_dark">Sombre</string>
+ <string name="pref_episode_cache_unlimited">Illimité</string>
+ <string name="pref_update_interval_hours_plural">heures</string>
+ <string name="pref_update_interval_hours_singular">heure</string>
+ <string name="pref_update_interval_hours_manual">Manuel</string>
<!--Search-->
<string name="search_hint">Chercher des flux ou épisodes</string>
<string name="found_in_shownotes_label">Trouvé dans les notes</string>
diff --git a/res/values-it-rIT/strings.xml b/res/values-it-rIT/strings.xml
index b664d20b5..0fe45c2df 100644
--- a/res/values-it-rIT/strings.xml
+++ b/res/values-it-rIT/strings.xml
@@ -3,7 +3,7 @@
<!--Activitiy titles-->
<string name="app_name">AntennaPod</string>
<string name="feeds_label">Feed</string>
- <string name="podcasts_label">PODCASTS</string>
+ <string name="podcasts_label">PODCAST</string>
<string name="episodes_label">EPISODI</string>
<string name="new_label">Nuovo</string>
<string name="waiting_list_label">Lista d\'attesa</string>
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">Non risulta disponibile lo spazio di archiviazione esterno. Assicurati che lo spazio di archiviazione sia montato per permettere all\'applicazione di funzionare correttamente.</string>
<string name="chapters_label">Capitoli</string>
<string name="shownotes_label">Note dell\'episodio</string>
- <string name="last_update_prefix">Ultimo aggiornamento:\u0020</string>
+ <string name="most_recent_prefix">Episodi Recenti:\u0020</string>
<string name="episodes_suffix">\u0020episodi</string>
<string name="published_prefix">Pubblicato:\u0020</string>
<string name="length_prefix">Durata:\u0020</string>
@@ -86,7 +86,7 @@
<string name="download_error_io_error">IO Error</string>
<string name="download_error_request_error">Request error</string>
<string name="downloads_left">\u0020Download rimasti</string>
- <string name="download_notification_title">Download dati dei podcast in corso</string>
+ <string name="download_notification_title">Download dati podcast in corso</string>
<string name="download_report_content">%1$d download con successo, %2$d ko</string>
<string name="download_log_title_unknown">Titolo sconosciuto</string>
<string name="download_type_feed">Feed</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Svuota la coda</string>
<string name="organize_queue_label">Riordina la coda</string>
+ <string name="undo">Undo</string>
+ <string name="removed_from_queue">Oggetto rimosso</string>
<!--Flattr-->
<string name="flattr_auth_label">Flattr sign-in</string>
<string name="flattr_auth_explanation">Premi il tasto seguente per iniziare il processo di autenticazione. Sarai trasferito alla pagina di login di flattr sul tuo browser e ti sarà richiesto di garantire ad AntennaPod il permesso di effettuare microdonazioni. Dopo la tua autorizzazione, sarai riportato alla seguente schermata in modo automatico.</string>
@@ -138,13 +140,13 @@
<string name="pref_followQueue_sum">Passa al prossimo episodio in coda quanto si completa una riproduzione</string>
<string name="playback_pref">Riproduzione</string>
<string name="network_pref">Rete</string>
- <string name="pref_autoUpdateIntervall_title">Intervallo di aggiornamento</string>
+ <string name="pref_autoUpdateIntervall_title">Intervallo di update</string>
<string name="pref_autoUpdateIntervall_sum">Specifica un intervallo per l\'aggiornamento automatico dei feed o disabilitalo</string>
<string name="pref_downloadMediaOnWifiOnly_sum">Abilita il download dei media solo tramite WiFi</string>
<string name="pref_followQueue_title">Playback continuo</string>
<string name="pref_downloadMediaOnWifiOnly_title">Download dei media su WiFi</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Disconnessione cuffie</string>
- <string name="pref_mobileUpdate_title">Aggiornamenti su rete mobile</string>
+ <string name="pref_mobileUpdate_title">Update su rete mobile</string>
<string name="pref_mobileUpdate_sum">Permetti gli aggiornamenti tramite connessione dati mobile</string>
<string name="refreshing_label">Aggiornamento</string>
<string name="flattr_settings_label">Impostazioni Flattr</string>
@@ -164,6 +166,12 @@
<string name="pref_autodl_wifi_filter_title">Abilita il filtro Wi-Fi</string>
<string name="pref_autodl_wifi_filter_sum">Abilita il download automatico solo per alcune reti Wi-Fi selezionate.</string>
<string name="pref_episode_cache_title">Cache degli episodi</string>
+ <string name="pref_theme_title_light">Light</string>
+ <string name="pref_theme_title_dark">Dark</string>
+ <string name="pref_episode_cache_unlimited">Illimitato</string>
+ <string name="pref_update_interval_hours_plural">ore</string>
+ <string name="pref_update_interval_hours_singular">ora</string>
+ <string name="pref_update_interval_hours_manual">Manuale</string>
<!--Search-->
<string name="search_hint">Ricerca per Feed o Episodi</string>
<string name="found_in_shownotes_label">Trovato nelle note dell\'episodio</string>
@@ -192,9 +200,9 @@
<string name="opml_export_success_title">Esportazione OPML avvenuta con successo.</string>
<string name="opml_export_success_sum">Il file .opml è stato scritto su:\u0020</string>
<!--Sleep timer-->
- <string name="set_sleeptimer_label">Imposta il timer di spegnimento</string>
+ <string name="set_sleeptimer_label">Imposta timer</string>
<string name="disable_sleeptimer_label">Disabilita il timer di spegnimento</string>
- <string name="enter_time_here_label">Inserisci il tempo</string>
+ <string name="enter_time_here_label">Tempo di spegnimento</string>
<string name="sleep_timer_label">Timer di spegnimento</string>
<string name="time_left_label">Tempo residuo:\u0020</string>
<string name="time_dialog_invalid_input">Input non valido, il campo deve essere un numero intero.</string>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index b5abb58bd..299e282ee 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -32,7 +32,6 @@
<string name="external_storage_error_msg">Não há dispositivos de armazenamento disponíveis. Por favor, certifique-se de que um dispositivo de armazenamento externo está montado para que o aplicativo possa funcionar adequadamente.</string>
<string name="chapters_label">Capítulos</string>
<string name="shownotes_label">Notas do podcast</string>
- <string name="last_update_prefix">Última atualização:\u0020</string>
<string name="episodes_suffix">\u0020episódios</string>
<string name="published_prefix">Publicado:\u0020</string>
<string name="length_prefix">Duração:\u0020</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
new file mode 100644
index 000000000..8b9383979
--- /dev/null
+++ b/res/values-pt/strings.xml
@@ -0,0 +1,231 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <!--Activitiy titles-->
+ <string name="app_name">AntennaPod</string>
+ <string name="feeds_label">Fontes</string>
+ <string name="podcasts_label">Podcasts</string>
+ <string name="episodes_label">Episódios</string>
+ <string name="new_label">Novo</string>
+ <string name="waiting_list_label">Lista de espera</string>
+ <string name="settings_label">Definições</string>
+ <string name="add_new_feed_label">Adicionar fonte</string>
+ <string name="downloads_label">Transferências</string>
+ <string name="cancel_download_label">Cancelar transferência</string>
+ <string name="download_log_label">Registo de transferências</string>
+ <string name="playback_history_label">Histórico de reprodução</string>
+ <!--Webview actions-->
+ <string name="open_in_browser_label">Abrir no navegador</string>
+ <string name="copy_url_label">Copiar URL</string>
+ <string name="share_url_label">Partilhar URL</string>
+ <string name="copied_url_msg">URL copiado para a área de transferência.</string>
+ <!--Playback history-->
+ <string name="clear_history_label">Limpar histórico</string>
+ <!--Other-->
+ <string name="confirm_label">Confirmar</string>
+ <string name="cancel_label">Cancelar</string>
+ <string name="author_label">Autor</string>
+ <string name="language_label">Idioma</string>
+ <string name="cover_label">Imagem</string>
+ <string name="error_label">Erro</string>
+ <string name="error_msg_prefix">Ocorreu um erro:</string>
+ <string name="refresh_label">Atualizar</string>
+ <string name="external_storage_error_msg">Não existe um cartão SD. Certifique-se que inseriu o cartão corretamente.</string>
+ <string name="chapters_label">Capítulos</string>
+ <string name="shownotes_label">Notas</string>
+ <string name="most_recent_prefix">Episódio mais recente:\u0020</string>
+ <string name="episodes_suffix">\u0020episódios</string>
+ <string name="published_prefix">Publicado:\u0020</string>
+ <string name="length_prefix">Duração:\u0020</string>
+ <string name="size_prefix">Tamanho:\u0020</string>
+ <string name="processing_label">A processar...</string>
+ <string name="loading_label">A carregar...</string>
+ <string name="image_of_prefix">Imagem de:\u0020</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">URL da fonte</string>
+ <string name="txtvfeedurl_label">Introduza o URL da fonte:</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Marcar tudo como lido</string>
+ <string name="show_info_label">Mostrar informações</string>
+ <string name="remove_feed_label">Remover fonte</string>
+ <string name="share_link_label">Partilhar ligação do sítio web</string>
+ <string name="share_source_label">Partilhar ligação da fonte</string>
+ <string name="feed_delete_confirmation_msg">Confirme a eliminação desta fonte e de todos os episódios a ela petencentes.</string>
+ <!--actions on feeditems-->
+ <string name="download_label">Transferir</string>
+ <string name="play_label">Reproduzir</string>
+ <string name="pause_label">Pausa</string>
+ <string name="stream_label">Emitir</string>
+ <string name="remove_label">Remover</string>
+ <string name="mark_read_label">Marcar como lido</string>
+ <string name="mark_unread_label">Marcar como novo</string>
+ <string name="add_to_queue_label">Adicionar à fila</string>
+ <string name="remove_from_queue_label">Remover da fila</string>
+ <string name="visit_website_label">Aceder ao sítio web</string>
+ <string name="support_label">Flattr</string>
+ <string name="enqueue_all_new">Colocar tudo na fila</string>
+ <string name="download_all">Transferir tudo</string>
+ <string name="skip_episode_label">Ignorar episódio</string>
+ <!--Download messages and labels-->
+ <string name="download_successful">Transferência terminada</string>
+ <string name="download_failed">Erro ao transferir</string>
+ <string name="download_pending">Transferência pendente</string>
+ <string name="download_running">Transferência atual</string>
+ <string name="download_error_device_not_found">Cartão SD não encontrado</string>
+ <string name="download_error_insufficient_space">Espaço insuficiente</string>
+ <string name="download_error_file_error">Erro no ficheiro</string>
+ <string name="download_error_http_data_error">Erro HTTP</string>
+ <string name="download_error_error_unknown">Erro desconhecido</string>
+ <string name="download_error_parser_exception">Exceção do processador</string>
+ <string name="download_error_unsupported_type">Fonte não suportada</string>
+ <string name="download_error_connection_error">Erro de ligação</string>
+ <string name="download_error_unknown_host">Servidor desconhecido</string>
+ <string name="cancel_all_downloads_label">Cancelar transferências</string>
+ <string name="download_cancelled_msg">Transferência cancelada</string>
+ <string name="download_report_title">Transferências terminadas</string>
+ <string name="download_error_malformed_url">URL inválido</string>
+ <string name="download_error_io_error">Erro I/O</string>
+ <string name="download_error_request_error">Erro de pedido</string>
+ <string name="downloads_left">\u0020Transferências em falta</string>
+ <string name="download_notification_title">A transferir dados...</string>
+ <string name="download_report_content">%1$d transferências efetuadas, %2$d falhadas</string>
+ <string name="download_log_title_unknown">Título desconhecido</string>
+ <string name="download_type_feed">Fonte</string>
+ <string name="download_type_media">Ficheiro multimédia</string>
+ <string name="download_type_image">Imagem</string>
+ <string name="download_request_error_dialog_message_prefix">Ocorreu um erro ao transferir o ficheiro:\u0020</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Erro!</string>
+ <string name="player_stopped_msg">Nada em reprodução</string>
+ <string name="player_preparing_msg">A preparar</string>
+ <string name="player_ready_msg">Pronto</string>
+ <string name="player_seeking_msg">A procurar</string>
+ <string name="playback_error_server_died">Erro de servidor</string>
+ <string name="playback_error_unknown">Erro desconhecido</string>
+ <string name="no_media_playing_label">Nada em reprodução</string>
+ <string name="position_default_label">00:00:00</string>
+ <string name="player_buffering_msg">A processar...</string>
+ <string name="playbackservice_notification_title">Reproduzir podcast</string>
+ <string name="playbackservice_notification_content">Clique para mais informações</string>
+ <!--Navigation-->
+ <string name="show_download_log">Mostrar registo</string>
+ <string name="show_player_label">Mostrar reprodutor</string>
+ <!--Queue operations-->
+ <string name="clear_queue_label">Limpar fila</string>
+ <string name="organize_queue_label">Organizar fila</string>
+ <string name="undo">Anular</string>
+ <string name="removed_from_queue">Item removido</string>
+ <!--Flattr-->
+ <string name="flattr_auth_label">Sessão Flattr</string>
+ <string name="flattr_auth_explanation">Prima o botão abaixo para iniciar a autenticação. O seu navegador web abrirá o ecrã da sessão flattr e ser-lhe-á solicitada a permissão para o AntennaPod efetuar as alterações. Após ser dada a permissão, voltará novamente a este ecrã.</string>
+ <string name="authenticate_label">Autenticar</string>
+ <string name="return_home_label">Voltar ao ecrã</string>
+ <string name="flattr_auth_success">Autenticação efetuada! Já pode fazer o flattr com a aplicação.</string>
+ <string name="no_flattr_token_title">Token flattr não encontrado</string>
+ <string name="no_flattr_token_msg">Parece que a sua conta flattr não está vinculada ao AntennaPod. Pode vincular a sua conta ao AntennaPod ou aceder ao sítio web para fazer o flattr.</string>
+ <string name="authenticate_now_label">Autenticar</string>
+ <string name="action_forbidden_title">Ação negada</string>
+ <string name="action_forbidden_msg">O AntennaPod não possui as permissões para esta ação. É possível que o token de acesso ao flattr via AntennaPod tenha sido revogado. Pode efetuar nova autenticação ou aceder ao sítio web do item.</string>
+ <string name="access_revoked_title">Acesso revogado</string>
+ <string name="access_revoked_info">Você revogou o token de acesso do AntennaPod à sua conta. Para concluir o processo, tem que remover esta aplicação da lista de aplicações presentes nas definições de conta no sítio web do flattr.</string>
+ <string name="flattr_click_success">Flattered com sucesso!</string>
+ <string name="flattring_label">Flattring</string>
+ <!--Empty list labels-->
+ <string name="no_items_label">Não existem itens na lista.</string>
+ <string name="no_feeds_label">Ainda não possui quaisquer fontes.</string>
+ <!--Preferences-->
+ <string name="other_pref">Outras</string>
+ <string name="about_pref">Sobre</string>
+ <string name="queue_label">Fila</string>
+ <string name="pref_pauseOnHeadsetDisconnect_sum">Parar reprodução ao remover os auscultadores</string>
+ <string name="pref_followQueue_sum">Ir para a faixa seguinte ao terminar a reprodução</string>
+ <string name="playback_pref">Reprodução</string>
+ <string name="network_pref">Rede</string>
+ <string name="pref_autoUpdateIntervall_title">Intervalo entre atualizações</string>
+ <string name="pref_autoUpdateIntervall_sum">Indique o intervalo de tempo entre as atualizações de fontes ou desative a opção</string>
+ <string name="pref_downloadMediaOnWifiOnly_sum">Apenas transferir pelas redes sem fios</string>
+ <string name="pref_followQueue_title">Reprodução contínua</string>
+ <string name="pref_downloadMediaOnWifiOnly_title">Transferência Wi-Fi</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Auscultadores removidos</string>
+ <string name="pref_mobileUpdate_title">Atualizações móveis</string>
+ <string name="pref_mobileUpdate_sum">Permitir atualizações através da rede de dados</string>
+ <string name="refreshing_label">A atualizar</string>
+ <string name="flattr_settings_label">Definições flattr</string>
+ <string name="pref_flattr_auth_title">Sessão flattr</string>
+ <string name="pref_flattr_auth_sum">Inicie sessão na sua conta flattr para fazer o flattr através do AntennaPod.</string>
+ <string name="pref_flattr_this_app_title">Flattr desta aplicação</string>
+ <string name="pref_flattr_this_app_sum">Ajude no desenvolvimento do AntennaPod através do Flattr. Obrigado!</string>
+ <string name="pref_revokeAccess_title">Revogar acesso</string>
+ <string name="pref_revokeAccess_sum">Revogar permissões de acesso da aplicação à sua conta flattr.</string>
+ <string name="pref_display_only_episodes_title">Mostrar apenas episódios</string>
+ <string name="pref_display_only_episodes_sum">Apenas mostrar itens que possuam episódios.</string>
+ <string name="user_interface_label">Interface</string>
+ <string name="pref_set_theme_title">Escolha o tema</string>
+ <string name="pref_set_theme_sum">Mudar o aspeto do AntennaPod.</string>
+ <string name="pref_automatic_download_title">Transferência automática</string>
+ <string name="pref_automatic_download_sum">Configure a transferência automática dos episódios.</string>
+ <string name="pref_autodl_wifi_filter_title">Ativar filtro Wi-Fi</string>
+ <string name="pref_autodl_wifi_filter_sum">Apenas permitir transferências automáticas através de redes sem fios.</string>
+ <string name="pref_episode_cache_title">Cache de episódios</string>
+ <string name="pref_theme_title_light">Claro</string>
+ <string name="pref_theme_title_dark">Escuro</string>
+ <string name="pref_episode_cache_unlimited">Sem limite</string>
+ <string name="pref_update_interval_hours_plural">horas</string>
+ <string name="pref_update_interval_hours_singular">hora</string>
+ <string name="pref_update_interval_hours_manual">Manual</string>
+ <!--Search-->
+ <string name="search_hint">Procurar fontes ou episódios</string>
+ <string name="found_in_shownotes_label">Encontrado nas notas</string>
+ <string name="found_in_chapters_label">Encontrado nos capítulos</string>
+ <string name="search_status_searching">A procurar...</string>
+ <string name="search_status_no_results">Nenhum resultado</string>
+ <string name="search_results_label">Resultados da procura</string>
+ <string name="search_term_label">Você procurou:\u0020</string>
+ <string name="search_label">Procura</string>
+ <string name="found_in_title_label">Encontrado no título</string>
+ <!--OPML import and export-->
+ <string name="opml_import_txtv_button_lable">Também pode importar ficheiros OPML. Estes ficheiros permitem-lhe mover os seus podcasts entre aplicações.</string>
+ <string name="opml_import_explanation">Para importar um ficheiro OPML, tem que o colocar neste diretório e premir o botão abaixo para iniciar o processo.</string>
+ <string name="start_import_label">Iniciar importação</string>
+ <string name="opml_import_label">Importação OPML</string>
+ <string name="opml_directory_error">Erro!</string>
+ <string name="reading_opml_label">A ler OPML</string>
+ <string name="opml_reader_error">Ocorreu um erro ao ler o ficheiro OPML:</string>
+ <string name="opml_import_error_dir_empty">O diretório de importação está vazio.</string>
+ <string name="select_all_label">Marcar tudo</string>
+ <string name="deselect_all_label">Desmarcar tudo</string>
+ <string name="choose_file_to_import_label">Escolha o ficheiro a importar</string>
+ <string name="opml_export_label">Exportação OPML</string>
+ <string name="exporting_label">A exportar...</string>
+ <string name="export_error_label">Erro de exportação</string>
+ <string name="opml_export_success_title">Exportação efetuada.</string>
+ <string name="opml_export_success_sum">O ficheiro .opml foi gravado em:\u0020</string>
+ <!--Sleep timer-->
+ <string name="set_sleeptimer_label">Definir temporizador</string>
+ <string name="disable_sleeptimer_label">Desativar temporizador</string>
+ <string name="enter_time_here_label">Introduza o tempo</string>
+ <string name="sleep_timer_label">Temporizador</string>
+ <string name="time_left_label">Tempo restante:\u0020</string>
+ <string name="time_dialog_invalid_input">Valor inválido. Tem que ser um inteiro.</string>
+ <!--Miro Guide-->
+ <string name="loading_categories_label">A carregar categorias...</string>
+ <string name="browse_miroguide_label">Explorar o guia Miro</string>
+ <string name="txtv_browse_miroguide_label">Ou explore o guia Miro:</string>
+ <string name="miro_guide_label">Guia Miro</string>
+ <string name="miro_search_hint">Procurar no guia Miro</string>
+ <string name="popular_label">Popular</string>
+ <string name="best_rating_label">Melhor avaliados</string>
+ <string name="add_feed_label">Adicionar fonte</string>
+ <string name="miro_feed_added">A fonte está a ser adicionada</string>
+ <!--Directory chooser-->
+ <string name="selected_folder_label">Diretório escolhido:</string>
+ <string name="create_folder_label">Criar diretório</string>
+ <string name="choose_data_directory">Escolha o diretório</string>
+ <string name="create_folder_msg">Criar um diretório com o nome \"%1$s\"?</string>
+ <string name="create_folder_success">Novo diretório criado</string>
+ <string name="create_folder_error_no_write_access">Não é possível gravar neste diretório</string>
+ <string name="create_folder_error_already_exists">O diretório já existe</string>
+ <string name="create_folder_error">Não é possível criar o diretório</string>
+ <string name="folder_not_empty_dialog_title">Diretório não vazio</string>
+ <string name="folder_not_empty_dialog_msg">O diretório escolhido não está vazio. As transferências serão colocadas neste diretório. Continuar?</string>
+ <string name="set_to_default_folder">Escolha a pasta pré-definida</string>
+</resources>
diff --git a/res/values-ro-rRO/strings.xml b/res/values-ro-rRO/strings.xml
index ba3c26827..c1320964a 100644
--- a/res/values-ro-rRO/strings.xml
+++ b/res/values-ro-rRO/strings.xml
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">Nu exista stocare externă. Asigurați-vă că stocarea externă este conectată pentru ca aplicația să funcționeze corespunzător.</string>
<string name="chapters_label">Capitole</string>
<string name="shownotes_label">Notițe</string>
- <string name="last_update_prefix">Ultima actualizare:\u0020</string>
+ <string name="most_recent_prefix">Cel mai recent episod:\u0020</string>
<string name="episodes_suffix">\u0020episoade</string>
<string name="published_prefix">Publicat:\u0020</string>
<string name="length_prefix">Durată:\u0020</string>
@@ -112,6 +112,8 @@
<!--Queue operations-->
<string name="clear_queue_label">Golește coada</string>
<string name="organize_queue_label">Organizează coada</string>
+ <string name="undo">Refă</string>
+ <string name="removed_from_queue">Element înlăturat</string>
<!--Flattr-->
<string name="flattr_auth_label">Flattr sign-in</string>
<string name="flattr_auth_explanation">Apăsați butonul de mai jos pentru a începe procesul de autentificare. Veți fi îndreptat spre pagina de logare flattr în browser și veți fi rugat să acordați permisiuni AntennaPod sa flattr. După ce veți acorda permisiunile veți fi readuși la acest ecran automat.</string>
@@ -164,6 +166,12 @@
<string name="pref_autodl_wifi_filter_title">Pornește filtru Wi-Fi</string>
<string name="pref_autodl_wifi_filter_sum">Pornește descărcarea automată doar pentru rețele Wi-Fi selectate.</string>
<string name="pref_episode_cache_title">Cache de episoade</string>
+ <string name="pref_theme_title_light">Deschis</string>
+ <string name="pref_theme_title_dark">Întunecat</string>
+ <string name="pref_episode_cache_unlimited">Nelimitat</string>
+ <string name="pref_update_interval_hours_plural">ore</string>
+ <string name="pref_update_interval_hours_singular">oră</string>
+ <string name="pref_update_interval_hours_manual">Manual</string>
<!--Search-->
<string name="search_hint">Caută feeduri sau episoade</string>
<string name="found_in_shownotes_label">Găsit în notițe</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 6f9f165cf..871803e2d 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -9,9 +9,9 @@
<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="cancel_download_label">Отменить закачку</string>
- <string name="download_log_label">Журнал закачек</string>
+ <string name="downloads_label">Загрузки</string>
+ <string name="cancel_download_label">Отменить загрузку</string>
+ <string name="download_log_label">Журнал загрузок</string>
<string name="playback_history_label">История воспроизведения</string>
<!--Webview actions-->
<string name="open_in_browser_label">Открыть в браузере</string>
@@ -22,17 +22,17 @@
<string name="clear_history_label">Очистить историю</string>
<!--Other-->
<string name="confirm_label">Подтвердить</string>
- <string name="cancel_label">Отменить</string>
+ <string name="cancel_label">Отмена</string>
<string name="author_label">Автор</string>
<string name="language_label">Язык</string>
<string name="cover_label">Обложка</string>
<string name="error_label">Ошибка</string>
<string name="error_msg_prefix">Произошла ошибка:</string>
<string name="refresh_label">Обновить</string>
- <string name="external_storage_error_msg">Внешний носитель данных недоступен. Убедитесь что внешний носитель смонтирован, иначе это приложение не сможет нормально работать.</string>
+ <string name="external_storage_error_msg">Внешний носитель недоступен. Убедитесь что внешний носитель смонтирован, иначе приложение не сможет нормально работать.</string>
<string name="chapters_label">Разделы</string>
<string name="shownotes_label">Описание</string>
- <string name="last_update_prefix">Последнее обновление:\u0020</string>
+ <string name="most_recent_prefix">Следующий эпизод:\u0020</string>
<string name="episodes_suffix">\u0020 выпуск(ов)</string>
<string name="published_prefix">Опубликовано:\u0020</string>
<string name="length_prefix">Продолжительность:\u0020</string>
@@ -51,25 +51,25 @@
<string name="share_source_label">Поделиться ссылкой на канал</string>
<string name="feed_delete_confirmation_msg">Подтвердите удаление канала и ВСЕХ закачанных выпусков этого канала.</string>
<!--actions on feeditems-->
- <string name="download_label">Закачать</string>
- <string name="play_label">Слушать</string>
+ <string name="download_label">Загрузить</string>
+ <string name="play_label">Воспроизвести</string>
<string name="pause_label">Пауза</string>
- <string name="stream_label">Воспроизвести из сети</string>
+ <string name="stream_label">Потоковое воспроизведение</string>
<string name="remove_label">Удалить</string>
<string name="mark_read_label">Отметить как прочитанное</string>
<string name="mark_unread_label">Отметить как непрочитанное</string>
- <string name="add_to_queue_label">Поставить в очередь</string>
+ <string name="add_to_queue_label">Добавить в очередь</string>
<string name="remove_from_queue_label">Удалить из очереди</string>
<string name="visit_website_label">Посетить сайт</string>
<string name="support_label">Поддержать посредством Flattr</string>
- <string name="enqueue_all_new">Поставить в очередь все</string>
- <string name="download_all">Скачать все</string>
+ <string name="enqueue_all_new">Добавить все в очередь</string>
+ <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_successful">Загрузка завершена</string>
+ <string name="download_failed">Загрузка прервана</string>
+ <string name="download_pending">Загрузка в ожидании</string>
+ <string name="download_running">Загрузка в процессе</string>
<string name="download_error_device_not_found">Устройство хранения не найдено</string>
<string name="download_error_insufficient_space">Недостаточно свободного места</string>
<string name="download_error_file_error">Ошибка файла</string>
@@ -79,39 +79,41 @@
<string name="download_error_unsupported_type">Неподдерживаемый тип канала</string>
<string name="download_error_connection_error">Ошибка соединения</string>
<string name="download_error_unknown_host">Неизвестный хост</string>
- <string name="cancel_all_downloads_label">Отменить все закачки</string>
- <string name="download_cancelled_msg">Закачка отменена</string>
- <string name="download_report_title">Закачки завершены</string>
+ <string name="cancel_all_downloads_label">Отменить все загрузки</string>
+ <string name="download_cancelled_msg">Загрузка отменена</string>
+ <string name="download_report_title">Загрузки завершены</string>
<string name="download_error_malformed_url">Некорректная ссылка</string>
<string name="download_error_io_error">Ошибка ввода-вывода</string>
<string name="download_error_request_error">Ошибка запроса</string>
- <string name="downloads_left">\u0020закачек осталось</string>
+ <string name="downloads_left">Осталось\u0020загрузок</string>
<string name="download_notification_title">Получение данных подкаста</string>
- <string name="download_report_content">%1$d успешных закачек, %2$d неудачных</string>
+ <string name="download_report_content">%1$d загрузок завершено, %2$d не удалось</string>
<string name="download_log_title_unknown">Неизвестное название</string>
<string name="download_type_feed">Канал</string>
<string name="download_type_media">Медиа файл</string>
<string name="download_type_image">Изображение</string>
- <string name="download_request_error_dialog_message_prefix">Ошибка скачивания файла:\u0020</string>
+ <string name="download_request_error_dialog_message_prefix">Ошибка при загрузки файла:\u0020</string>
<!--Mediaplayer messages-->
<string name="player_error_msg">Ошибка!</string>
<string name="player_stopped_msg">Ничего не воспроизводится</string>
<string name="player_preparing_msg">Подготовка</string>
<string name="player_ready_msg">Готово</string>
- <string name="player_seeking_msg">Поиск</string>
- <string name="playback_error_server_died">Сервер отключился</string>
+ <string name="player_seeking_msg">Перемотка</string>
+ <string name="playback_error_server_died">Сервер отключен</string>
<string name="playback_error_unknown">Неизвестная ошибка</string>
<string name="no_media_playing_label">Ничего не воспроизводится</string>
<string name="position_default_label">00:00:00</string>
<string name="player_buffering_msg">Буферизация</string>
<string name="playbackservice_notification_title">Воспроизведение подкаста</string>
- <string name="playbackservice_notification_content">Для получения дополнительной информации нажмите здесь</string>
+ <string name="playbackservice_notification_content">Нажмите для получения дополнительной информации</string>
<!--Navigation-->
<string name="show_download_log">Показать журнал</string>
<string name="show_player_label">Показать проигрыватель</string>
<!--Queue operations-->
<string name="clear_queue_label">Очистить очередь</string>
<string name="organize_queue_label">Упорядочить очередь</string>
+ <string name="undo">Отмена</string>
+ <string name="removed_from_queue">Удален</string>
<!--Flattr-->
<string name="flattr_auth_label">Авторизоваться в Flattr</string>
<string name="flattr_auth_explanation">Нажмите кнопку чтобы начать процесс авторизации. Вы будете перенаправлены на сайт Flattr где вам нужно будет подключить AntennaPod к вашему аккаунту. После этого вы автоматически будете перенаправлены обратно.</string>
@@ -134,15 +136,15 @@
<string name="other_pref">Прочее</string>
<string name="about_pref">О программе</string>
<string name="queue_label">Очередь</string>
- <string name="pref_pauseOnHeadsetDisconnect_sum">Остановить воспроизведение когда наушники отсоединены</string>
+ <string name="pref_pauseOnHeadsetDisconnect_sum">Остановить воспроизведение, когда наушники отсоединены</string>
<string name="pref_followQueue_sum">После завершения воспроизведения перейти к следующему в очереди</string>
<string name="playback_pref">Воспроизведение</string>
<string name="network_pref">Сеть</string>
<string name="pref_autoUpdateIntervall_title">Интервал обновлений</string>
- <string name="pref_autoUpdateIntervall_sum">Укажите интервал через который каналы обновляются автоматически, или отключите это</string>
- <string name="pref_downloadMediaOnWifiOnly_sum">Закачивать файлы только по WiFi</string>
+ <string name="pref_autoUpdateIntervall_sum">Укажите интервал через который каналы обновляются автоматически, или отключите его</string>
+ <string name="pref_downloadMediaOnWifiOnly_sum">Загружать файлы только по Wi-Fi</string>
<string name="pref_followQueue_title">Непрерывное воспроизведение</string>
- <string name="pref_downloadMediaOnWifiOnly_title">Закачка по WiFi</string>
+ <string name="pref_downloadMediaOnWifiOnly_title">Загрузка по Wi-Fi</string>
<string name="pref_pauseOnHeadsetDisconnect_title">Наушники отсоединены</string>
<string name="pref_mobileUpdate_title">Мобильные обновления</string>
<string name="pref_mobileUpdate_sum">Обновлять каналы через мобильное интернет-подключение</string>
@@ -155,15 +157,21 @@
<string name="pref_revokeAccess_title">Отозвать доступ</string>
<string name="pref_revokeAccess_sum">Отменить доступ этого приложения к вашему аккаунту Flattr.</string>
<string name="pref_display_only_episodes_title">Показывать только выпуски</string>
- <string name="pref_display_only_episodes_sum">Показывать только те элементы списка которые содержат выпуски</string>
+ <string name="pref_display_only_episodes_sum">Показывать только те элементы списка, которые содержат выпуски</string>
<string name="user_interface_label">Интерфейс</string>
<string name="pref_set_theme_title">Выбор темы</string>
- <string name="pref_set_theme_sum">Изменить оформление AntennaPod</string>
+ <string name="pref_set_theme_sum">Изменить тему оформление AntennaPod</string>
<string name="pref_automatic_download_title">Автоматическая загрузка</string>
<string name="pref_automatic_download_sum">Настроить автоматическую загрузку выпусков.</string>
<string name="pref_autodl_wifi_filter_title">Включить фильтр Wi-Fi</string>
- <string name="pref_autodl_wifi_filter_sum">Разрешать автоматическую загрузку тольуо для выбранных Wi-Fi сетей.</string>
+ <string name="pref_autodl_wifi_filter_sum">Разрешать автоматическую загрузку только для выбранных Wi-Fi сетей.</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>
+ <string name="pref_update_interval_hours_plural">Часы</string>
+ <string name="pref_update_interval_hours_singular">Час</string>
+ <string name="pref_update_interval_hours_manual">Вручную</string>
<!--Search-->
<string name="search_hint">Поиск каналов или выпусков</string>
<string name="found_in_shownotes_label">Найдено в описании выпуска</string>
@@ -175,37 +183,37 @@
<string name="search_label">Поиск</string>
<string name="found_in_title_label">Найдено в заголовке</string>
<!--OPML import and export-->
- <string name="opml_import_txtv_button_lable">Также возможен импорт файла OPML. OPML файлы позволяют переносить ваши подписки с подкастами из одного приложения в другое.</string>
+ <string name="opml_import_txtv_button_lable">Также возможен импорт файла OPML. OPML файлы позволяют переносить ваши подписки из одного приложения в другое:</string>
<string name="opml_import_explanation">Для импорта файла OPML его нужно поместить каталог указанный ниже и нажать кнопку чтобы начать процесс импорта.</string>
<string name="start_import_label">Начать импорт</string>
<string name="opml_import_label">Импорт OPML</string>
<string name="opml_directory_error">ОШИБКА!</string>
<string name="reading_opml_label">Чтение файла OPML</string>
- <string name="opml_reader_error">Ошибка чтения документа OPML</string>
+ <string name="opml_reader_error">Ошибка чтения файла OPML</string>
<string name="opml_import_error_dir_empty">Каталог импорта пуст.</string>
<string name="select_all_label">Отметить все</string>
<string name="deselect_all_label">Снять все отметки</string>
<string name="choose_file_to_import_label">Выбрать файл для импорта</string>
- <string name="opml_export_label">Выгрузка в OPML</string>
- <string name="exporting_label">Выгружается...</string>
- <string name="export_error_label">Ошибка выгрузки</string>
- <string name="opml_export_success_title">Выгружено в OPML успешно</string>
+ <string name="opml_export_label">Экспорт в OPML</string>
+ <string name="exporting_label">Экспортируется...</string>
+ <string name="export_error_label">Ошибка экспорта</string>
+ <string name="opml_export_success_title">Экспорт OPML завершен</string>
<string name="opml_export_success_sum">OPML файл был записан в:\u0020</string>
<!--Sleep timer-->
<string name="set_sleeptimer_label">Установить таймер сна</string>
<string name="disable_sleeptimer_label">Отключить таймер сна</string>
- <string name="enter_time_here_label">Ввести время</string>
+ <string name="enter_time_here_label">Введите время</string>
<string name="sleep_timer_label">Таймер сна</string>
<string name="time_left_label">Времени осталось:\u0020</string>
<string name="time_dialog_invalid_input">Неправильный ввод, время должно быть в виде числа</string>
<!--Miro Guide-->
- <string name="loading_categories_label">Загружаются категории...</string>
- <string name="browse_miroguide_label">Просмотреть каталоги в проекте Miro</string>
- <string name="txtv_browse_miroguide_label">Или просмотреть каталоги в проекте Miro</string>
- <string name="miro_guide_label">Проект Miro</string>
- <string name="miro_search_hint">Поиск в проекте Miro</string>
+ <string name="loading_categories_label">Загрузка категорий...</string>
+ <string name="browse_miroguide_label">Посмотреть в каталоге Miro</string>
+ <string name="txtv_browse_miroguide_label">Или посмотреть в каталоге Miro</string>
+ <string name="miro_guide_label">Miro</string>
+ <string name="miro_search_hint">Поиск в Miro</string>
<string name="popular_label">Популярные</string>
- <string name="best_rating_label">Наивысший рейтинг</string>
+ <string name="best_rating_label">С высоким рейтингом</string>
<string name="add_feed_label">Добавить канал</string>
<string name="miro_feed_added">Канал добавляется</string>
<!--Directory chooser-->
@@ -218,6 +226,6 @@
<string name="create_folder_error_already_exists">Папка уже существует</string>
<string name="create_folder_error">Невозможно создать папку</string>
<string name="folder_not_empty_dialog_title">Папка не пуста</string>
- <string name="folder_not_empty_dialog_msg">Выбранная папка не пуста. Закачки и прочие файлы будут сохранены в эту папку. Продолжить?</string>
+ <string name="folder_not_empty_dialog_msg">Выбранная папка не пуста. Загрузки и прочие файлы будут сохранены в эту папку. Продолжить?</string>
<string name="set_to_default_folder">Выберите папку по умолчанию</string>
</resources>
diff --git a/res/values-uk-rUA/strings.xml b/res/values-uk-rUA/strings.xml
index ccb65ab61..84f51ab7d 100644
--- a/res/values-uk-rUA/strings.xml
+++ b/res/values-uk-rUA/strings.xml
@@ -11,7 +11,7 @@
<string name="add_new_feed_label">Додати канал</string>
<string name="downloads_label">Завантаження</string>
<string name="cancel_download_label">Скасувати завантаження</string>
- <string name="download_log_label">Завантаження</string>
+ <string name="download_log_label">Історія завантажень</string>
<string name="playback_history_label">Що грало</string>
<!--Webview actions-->
<string name="open_in_browser_label">Відкрити в браузері</string>
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">Немає доступної флешки. Зовнішній носій потрібен для коректної роботи додатку</string>
<string name="chapters_label">Глави</string>
<string name="shownotes_label">Нотатки до епізода</string>
- <string name="last_update_prefix">Останнє оновлення:\u0020</string>
+ <string name="most_recent_prefix">Найновіший епізод:\u0020</string>
<string name="episodes_suffix">\u0020епізодів</string>
<string name="published_prefix">Опубліковано:\u0020</string>
<string name="length_prefix">Довжина:\u0020</string>
@@ -54,11 +54,11 @@
<string name="download_label">Завантажити</string>
<string name="play_label">Грати</string>
<string name="pause_label">Пауза</string>
- <string name="stream_label">Поток</string>
+ <string name="stream_label">Прослухати без завантаження</string>
<string name="remove_label">Видалити</string>
<string name="mark_read_label">Прочитано</string>
<string name="mark_unread_label">Непрочитано</string>
- <string name="add_to_queue_label">Додати канал</string>
+ <string name="add_to_queue_label">Додати до черги</string>
<string name="remove_from_queue_label">Видалити з черги</string>
<string name="visit_website_label">Відкрити сайт</string>
<string name="support_label">Підтримати за допомогою Flattr</string>
@@ -112,14 +112,16 @@
<!--Queue operations-->
<string name="clear_queue_label">Очистити чергу</string>
<string name="organize_queue_label">Впорядкувати чергу</string>
+ <string name="undo">Скасувати</string>
+ <string name="removed_from_queue">Видалено</string>
<!--Flattr-->
- <string name="flattr_auth_label">Увійти дл Flattr</string>
+ <string name="flattr_auth_label">Увійти до Flattr</string>
<string name="flattr_auth_explanation">Нажміть цю кнопку для початку авторізації. Буде відкрито flattr в браузері, буде запит на дозвіл доступу Antennapod до flattr. Після надання доступу ви повернетесь до цього екрану автоматично</string>
<string name="authenticate_label">Ввісти ім\'я та пароль</string>
<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_msg">Здається ваш обліковий запис flattr не підєднано до AntennaPod. Ви можете або підєднати її або відкривати web сторінку в браузері</string>
+ <string name="no_flattr_token_title">Немає flattr token</string>
+ <string name="no_flattr_token_msg">Здається ваш обліковий запис flattr не під\'єднано до AntennaPod. Ви можете або під\'єднати її або відкривати web сторінку в браузері</string>
<string name="authenticate_now_label">Пароль та логін</string>
<string name="action_forbidden_title">Заборонено</string>
<string name="action_forbidden_msg">AntennaPod не маэ дозвілу це зробити. Можливо відкликаний доступ до AntennaPod. Або ввідіть логін пароль в налаштуваннях або зробить це на сайті</string>
@@ -158,12 +160,18 @@
<string name="pref_display_only_episodes_sum">Відображати тільки канали з наявними епізодами</string>
<string name="user_interface_label">Зовнішній вид</string>
<string name="pref_set_theme_title">Обрати тему</string>
- <string name="pref_set_theme_sum">Змінти появу AntennaPod</string>
+ <string name="pref_set_theme_sum">Змінити появу AntennaPod</string>
<string name="pref_automatic_download_title">Автоматичне завантаження</string>
<string name="pref_automatic_download_sum">Налаштування автоматичного завантаження епізодів</string>
<string name="pref_autodl_wifi_filter_title">Увімкнути фільтр Wi-Fi</string>
- <string name="pref_autodl_wifi_filter_sum">Дозволити автоматичне завантаження тільки для окремих Wi-Fi мережах</string>
+ <string name="pref_autodl_wifi_filter_sum">Дозволити автоматичне завантаження тільки в цих Wi-Fi мережах</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>
+ <string name="pref_update_interval_hours_plural">годин</string>
+ <string name="pref_update_interval_hours_singular">година</string>
+ <string name="pref_update_interval_hours_manual">Інструкція</string>
<!--Search-->
<string name="search_hint">Пошук каналів та епізодів</string>
<string name="found_in_shownotes_label">Знайдено у примітках</string>
@@ -175,7 +183,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>
@@ -203,7 +211,7 @@
<string name="browse_miroguide_label">Перегляд Miro Guide</string>
<string name="txtv_browse_miroguide_label">Або проглянути Miro Guide</string>
<string name="miro_guide_label">Miro Guide</string>
- <string name="miro_search_hint">Пошук Mirog Guide</string>
+ <string name="miro_search_hint">Пошук в Mirog Guide</string>
<string name="popular_label">Популярні</string>
<string name="best_rating_label">Кращі</string>
<string name="add_feed_label">Додати канал</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index d8c99b20a..f7bf7d493 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -32,7 +32,7 @@
<string name="external_storage_error_msg">没有可用的外部存储. 请确保安装外部存储器, 这样本应用才可以正常工作.</string>
<string name="chapters_label">章节</string>
<string name="shownotes_label">笔记</string>
- <string name="last_update_prefix">最后更新:\u0020</string>
+ <string name="most_recent_prefix">最近曲目:\u0020</string>
<string name="episodes_suffix">\u0020 曲</string>
<string name="published_prefix">发表:\u0020</string>
<string name="length_prefix">长度:\u0020</string>
@@ -49,20 +49,20 @@
<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>
+ <string name="feed_delete_confirmation_msg">确认要删除这些订阅吗? 该订阅所有已经下载的曲目将一并删除. </string>
<!--actions on feeditems-->
<string name="download_label">下载</string>
<string name="play_label">播放</string>
<string name="pause_label">暂停</string>
- <string name="stream_label">流</string>
+ <string name="stream_label">流媒体</string>
<string name="remove_label">删除</string>
<string name="mark_read_label">标记已读</string>
<string name="mark_unread_label">标记未读</string>
- <string name="add_to_queue_label">添加到队列</string>
- <string name="remove_from_queue_label">从队列中删除</string>
+ <string name="add_to_queue_label">添加到播放列表</string>
+ <string name="remove_from_queue_label">从播放列表中删除</string>
<string name="visit_website_label">访问网站</string>
<string name="support_label">Flattr 他</string>
- <string name="enqueue_all_new">全部添加到队列</string>
+ <string name="enqueue_all_new">全部添加到播放列表</string>
<string name="download_all">全部下载</string>
<string name="skip_episode_label">跳过曲目</string>
<!--Download messages and labels-->
@@ -110,8 +110,10 @@
<string name="show_download_log">下载日志</string>
<string name="show_player_label">播放器</string>
<!--Queue operations-->
- <string name="clear_queue_label">清空队列</string>
- <string name="organize_queue_label">组织队列</string>
+ <string name="clear_queue_label">清空播放列表</string>
+ <string name="organize_queue_label">组织播放列表</string>
+ <string name="undo">撤消</string>
+ <string name="removed_from_queue">已删除项</string>
<!--Flattr-->
<string name="flattr_auth_label">Flattr 登录</string>
<string name="flattr_auth_explanation">按下面的按钮开始身份验证过程. 将在浏览器中打开 Flattr 登录界面并要求给予 AntennaPod 访问 Flattr 的权限. 权限许可后, 将自动回到这个界面.</string>
@@ -133,9 +135,9 @@
<!--Preferences-->
<string name="other_pref">其他</string>
<string name="about_pref">关于</string>
- <string name="queue_label">队列</string>
+ <string name="queue_label">清空播放</string>
<string name="pref_pauseOnHeadsetDisconnect_sum">当耳机是断开时暂停播放 </string>
- <string name="pref_followQueue_sum">播放完成跳转到队列下一项</string>
+ <string name="pref_followQueue_sum">播放完成跳转到播放列表下一项</string>
<string name="playback_pref">播放</string>
<string name="network_pref">网络</string>
<string name="pref_autoUpdateIntervall_title">更新周期</string>
@@ -164,8 +166,14 @@
<string name="pref_autodl_wifi_filter_title">打开 Wi-Fi 过滤器</string>
<string name="pref_autodl_wifi_filter_sum">只允许在 Wi-Fi 网络下自动下载</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>
+ <string name="pref_update_interval_hours_plural">小时</string>
+ <string name="pref_update_interval_hours_singular">时</string>
+ <string name="pref_update_interval_hours_manual">手动</string>
<!--Search-->
- <string name="search_hint">搜索订阅或者插曲</string>
+ <string name="search_hint">搜索订阅或者曲目</string>
<string name="found_in_shownotes_label">笔记中查找</string>
<string name="found_in_chapters_label">章节中查找</string>
<string name="search_status_searching">搜索中...</string>
@@ -200,11 +208,11 @@
<string name="time_dialog_invalid_input">无效的输入, 时间是一个整数</string>
<!--Miro Guide-->
<string name="loading_categories_label">加载目录中...</string>
- <string name="browse_miroguide_label">浏览 Miro 指南</string>
- <string name="txtv_browse_miroguide_label">或者浏览 Miro 指南</string>
- <string name="miro_guide_label">Miro 指南</string>
- <string name="miro_search_hint">搜索 Miro 指南</string>
- <string name="popular_label">受欢迎的</string>
+ <string name="browse_miroguide_label">浏览 Miro 频道</string>
+ <string name="txtv_browse_miroguide_label">或者浏览 Miro 频道</string>
+ <string name="miro_guide_label">Miro 频道</string>
+ <string name="miro_search_hint">搜索 Miro 频道</string>
+ <string name="popular_label">流行</string>
<string name="best_rating_label">评分最高</string>
<string name="add_feed_label">添加订阅</string>
<string name="miro_feed_added">订阅已被添加</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index aebc74b33..4036ff0f4 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1,16 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string-array name="update_intervall_options">
- <item>Manual</item>
- <item>1 hour</item>
- <item>2 hours</item>
- <item>4 hours</item>
- <item>8 hours</item>
- <item>12 hours</item>
- <item>24 hours</item>
- </string-array>
-
<string-array name="update_intervall_values">
<item>0</item>
<item>1</item>
@@ -20,8 +10,17 @@
<item>12</item>
<item>24</item>
</string-array>
-
- <string-array name="episode_cache_size">
+ <string-array name="episode_cache_size_entries">
+ <item>@string/pref_episode_cache_unlimited</item>
+ <item>10</item>
+ <item>20</item>
+ <item>40</item>
+ <item>60</item>
+ <item>80</item>
+ <item>100</item>
+ </string-array>
+ <string-array name="episode_cache_size_values">
+ <item>-1</item>
<item>10</item>
<item>20</item>
<item>40</item>
@@ -29,20 +28,16 @@
<item>80</item>
<item>100</item>
</string-array>
-
<string-array name="autodl_select_networks_default_entries">
<item>N/A</item>
</string-array>
-
<string-array name="autodl_select_networks_default_values">
<item>0</item>
</string-array>
-
<string-array name="theme_options">
- <item>Light</item>
- <item>Dark</item>
+ <item>@string/pref_theme_title_light</item>
+ <item>@string/pref_theme_title_dark</item>
</string-array>
-
<string-array name="theme_values">
<item>0</item>
<item>1</item>
diff --git a/res/values/integers.xml b/res/values/integers.xml
new file mode 100644
index 000000000..33501d9fb
--- /dev/null
+++ b/res/values/integers.xml
@@ -0,0 +1,4 @@
+<resources>
+ <integer name="undobar_hide_delay">5000</integer>
+ <integer name="episode_cache_size_unlimited">-1</integer>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index afc912d28..b3f9975cb 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -39,7 +39,7 @@
<string name="external_storage_error_msg">No external storage is available. Please make sure that external storage is mounted so that the app can work properly.</string>
<string name="chapters_label">Chapters</string>
<string name="shownotes_label">Shownotes</string>
- <string name="last_update_prefix">Last Update:\u0020</string>
+ <string name="most_recent_prefix">Most Recent Episode:\u0020</string>
<string name="episodes_suffix">\u0020episodes</string>
<string name="published_prefix">Published:\u0020</string>
<string name="length_prefix">Length:\u0020</string>
@@ -125,6 +125,8 @@
<!-- Queue operations -->
<string name="clear_queue_label">Clear queue</string>
<string name="organize_queue_label">Organize queue</string>
+ <string name="undo">Undo</string>
+ <string name="removed_from_queue">Item removed</string>
<!-- Flattr -->
<string name="flattr_auth_label">Flattr sign-in</string>
@@ -180,6 +182,13 @@
<string name="pref_autodl_wifi_filter_title">Enable Wi-Fi filter</string>
<string name="pref_autodl_wifi_filter_sum">Allow automatic download only for selected Wi-Fi networks.</string>
<string name="pref_episode_cache_title">Episode cache</string>
+ <string name="pref_theme_title_light">Light</string>
+ <string name="pref_theme_title_dark">Dark</string>
+ <string name="pref_episode_cache_unlimited">Unlimited</string>
+ <string name="pref_update_interval_hours_plural">hours</string>
+ <string name="pref_update_interval_hours_singular">hour</string>
+ <string name="pref_update_interval_hours_manual">Manual</string>
+
<!-- Search -->
<string name="search_hint">Search for Feeds or Episodes</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c5e3abde3..f32ea3894 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -92,4 +92,42 @@
<item name="android:textColor">#FFFFFF</item>
</style>
-</resources> \ No newline at end of file
+ <style name="UndoBar">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">48dp</item>
+ <item name="android:layout_gravity">bottom</item>
+ <item name="android:layout_marginLeft">8dp</item>
+ <item name="android:layout_marginRight">8dp</item>
+ <item name="android:layout_marginBottom">16dp</item>
+ <item name="android:orientation">horizontal</item>
+ <item name="android:background">@drawable/undobar</item>
+ <item name="android:clickable">true</item>
+ <item name="android:showDividers">middle</item>
+ <item name="android:divider">@drawable/undobar_divider</item>
+ <item name="android:dividerPadding">10dp</item>
+ </style>
+ <style name="UndoBarMessage">
+ <item name="android:layout_width">0dp</item>
+ <item name="android:layout_weight">1</item>
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_marginLeft">16dp</item>
+ <item name="android:layout_gravity">center_vertical</item>
+ <item name="android:layout_marginRight">16dp</item>
+ <item name="android:textAppearance">?android:textAppearanceMedium</item>
+ <item name="android:textColor">#fff</item>
+ </style>
+ <style name="UndoBarButton">
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:paddingLeft">16dp</item>
+ <item name="android:paddingRight">16dp</item>
+ <item name="android:background">@drawable/undobar_button</item>
+ <item name="android:drawableLeft">@drawable/ic_undobar_undo</item>
+ <item name="android:drawablePadding">12dp</item>
+ <item name="android:textAppearance">?android:textAppearanceSmall</item>
+ <item name="android:textAllCaps">true</item>
+ <item name="android:textStyle">bold</item>
+ <item name="android:textColor">#fff</item>
+ <item name="android:text">@string/undo</item>
+ </style>
+</resources>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index dfa67d4f9..e94d1c47e 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -22,7 +22,7 @@
<PreferenceCategory android:title="@string/network_pref" >
<ListPreference
android:defaultValue="0"
- android:entries="@array/update_intervall_options"
+ android:entries="@array/update_intervall_values"
android:entryValues="@array/update_intervall_values"
android:key="prefAutoUpdateIntervall"
android:summary="@string/pref_autoUpdateIntervall_sum"
@@ -34,7 +34,7 @@
android:key="prefMobileUpdate"
android:summary="@string/pref_mobileUpdate_sum"
android:title="@string/pref_mobileUpdate_title" />
- <ListPreference android:defaultValue="20" android:entries="@array/episode_cache_size" android:key="prefEpisodeCacheSize" android:title="@string/pref_episode_cache_title" android:entryValues="@array/episode_cache_size"/><PreferenceScreen android:summary="@string/pref_automatic_download_sum" android:key="prefAutoDownloadSettings" android:title="@string/pref_automatic_download_title">
+ <ListPreference android:defaultValue="20" android:entries="@array/episode_cache_size_entries" android:key="prefEpisodeCacheSize" android:title="@string/pref_episode_cache_title" android:entryValues="@array/episode_cache_size_values"/><PreferenceScreen android:summary="@string/pref_automatic_download_sum" android:key="prefAutoDownloadSettings" android:title="@string/pref_automatic_download_title">
<CheckBoxPreference android:key="prefEnableAutoDl" android:title="@string/pref_automatic_download_title" android:defaultValue="false"/><CheckBoxPreference android:key="prefEnableAutoDownloadWifiFilter" android:title="@string/pref_autodl_wifi_filter_title" android:summary="@string/pref_autodl_wifi_filter_sum"/>
</PreferenceScreen>
diff --git a/src/de/danoeh/antennapod/activity/AddFeedActivity.java b/src/de/danoeh/antennapod/activity/AddFeedActivity.java
index 39434fa87..545b53494 100644
--- a/src/de/danoeh/antennapod/activity/AddFeedActivity.java
+++ b/src/de/danoeh/antennapod/activity/AddFeedActivity.java
@@ -2,6 +2,8 @@ package de.danoeh.antennapod.activity;
import java.util.Date;
+import org.apache.commons.lang3.StringUtils;
+
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
@@ -44,6 +46,9 @@ public class AddFeedActivity extends SherlockActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Was started with Intent " + getIntent().getAction()
+ + " and Data " + getIntent().getDataString());
setTheme(UserPreferences.getTheme());
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@@ -54,6 +59,10 @@ public class AddFeedActivity extends SherlockActivity {
progDialog = new ProgressDialog(this);
etxtFeedurl = (EditText) findViewById(R.id.etxtFeedurl);
+ if (StringUtils.equals(getIntent().getAction(), Intent.ACTION_VIEW)) {
+ etxtFeedurl.setText(getIntent().getDataString());
+ }
+
butBrowseMiroGuide = (Button) findViewById(R.id.butBrowseMiroguide);
butOpmlImport = (Button) findViewById(R.id.butOpmlImport);
butConfirm = (Button) findViewById(R.id.butConfirm);
@@ -101,7 +110,7 @@ public class AddFeedActivity extends SherlockActivity {
if (intent.getAction() != null
&& intent.getAction().equals(Intent.ACTION_SEND)) {
if (AppConfig.DEBUG)
- Log.d(TAG, "Was started with ACTION_SEND intent");
+ Log.d(TAG, "Resuming with ACTION_SEND intent");
String text = intent.getStringExtra(Intent.EXTRA_TEXT);
if (text != null) {
etxtFeedurl.setText(text);
@@ -152,7 +161,7 @@ public class AddFeedActivity extends SherlockActivity {
}
@Override
- public void onConnectionFailure(int reason) {
+ public void onConnectionFailure(DownloadError reason) {
handleDownloadError(reason);
}
});
@@ -168,11 +177,11 @@ public class AddFeedActivity extends SherlockActivity {
progDialog.setMessage(getString(R.string.loading_label));
}
- private void handleDownloadError(int reason) {
+ private void handleDownloadError(DownloadError reason) {
final AlertDialog errorDialog = new AlertDialog.Builder(this).create();
errorDialog.setTitle(R.string.error_label);
errorDialog.setMessage(getString(R.string.error_msg_prefix) + " "
- + DownloadError.getErrorString(this, reason));
+ + reason.getErrorString(this));
errorDialog.setButton(getString(android.R.string.ok),
new DialogInterface.OnClickListener() {
@Override
diff --git a/src/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/src/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
index d6ff537a3..612c45e64 100644
--- a/src/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/src/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -88,9 +88,8 @@ public abstract class OnlineFeedViewActivity extends SherlockFragmentActivity {
if (status.isSuccessful()) {
parseFeed();
} else {
- String errorMsg = DownloadError.getErrorString(
- OnlineFeedViewActivity.this,
- status.getReason());
+ String errorMsg = status.getReason().getErrorString(
+ OnlineFeedViewActivity.this);
if (errorMsg != null
&& status.getReasonDetailed() != null) {
errorMsg += " ("
@@ -187,9 +186,9 @@ public abstract class OnlineFeedViewActivity extends SherlockFragmentActivity {
}
});
} else {
- final String errorMsg = DownloadError.getErrorString(
- OnlineFeedViewActivity.this,
- DownloadError.ERROR_PARSER_EXCEPTION)
+ final String errorMsg =
+ DownloadError.ERROR_PARSER_EXCEPTION.getErrorString(
+ OnlineFeedViewActivity.this)
+ " (" + reasonDetailed + ")";
runOnUiThread(new Runnable() {
diff --git a/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
index 89001f7f5..7269f7549 100644
--- a/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
+++ b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
@@ -3,6 +3,8 @@ package de.danoeh.antennapod.activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -21,19 +23,23 @@ import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.FeedItem;
import de.danoeh.antennapod.feed.FeedManager;
import de.danoeh.antennapod.preferences.UserPreferences;
+import de.danoeh.antennapod.util.UndoBarController;
-public class OrganizeQueueActivity extends SherlockListActivity {
+public class OrganizeQueueActivity extends SherlockListActivity implements
+ UndoBarController.UndoListener {
private static final String TAG = "OrganizeQueueActivity";
private static final int MENU_ID_ACCEPT = 2;
private OrganizeAdapter adapter;
+ private UndoBarController undoBarController;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(UserPreferences.getTheme());
super.onCreate(savedInstanceState);
setContentView(R.layout.organize_queue);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
DragSortListView listView = (DragSortListView) getListView();
listView.setDropListener(dropListener);
@@ -41,6 +47,9 @@ public class OrganizeQueueActivity extends SherlockListActivity {
adapter = new OrganizeAdapter(this);
setListAdapter(adapter);
+
+ undoBarController = new UndoBarController(findViewById(R.id.undobar),
+ this);
}
@Override
@@ -50,6 +59,13 @@ public class OrganizeQueueActivity extends SherlockListActivity {
}
@Override
+ protected void onStop() {
+ super.onStop();
+ FeedManager.getInstance().autodownloadUndownloadedItems(
+ getApplicationContext());
+ }
+
+ @Override
protected void onResume() {
super.onResume();
EventDistributor.getInstance().register(contentUpdate);
@@ -82,27 +98,24 @@ public class OrganizeQueueActivity extends SherlockListActivity {
@Override
public void remove(int which) {
FeedManager manager = FeedManager.getInstance();
- manager.removeQueueItem(OrganizeQueueActivity.this,
- (FeedItem) getListAdapter().getItem(which));
+ FeedItem item = (FeedItem) getListAdapter().getItem(which);
+ manager.removeQueueItem(OrganizeQueueActivity.this, item, false);
+ undoBarController.showUndoBar(false,
+ getString(R.string.removed_from_queue), new UndoToken(item,
+ which));
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
- TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.navigation_accept });
- menu.add(Menu.NONE, MENU_ID_ACCEPT, Menu.NONE, R.string.confirm_label)
- .setIcon(drawables.getDrawable(0))
- .setShowAsAction(
- MenuItem.SHOW_AS_ACTION_IF_ROOM
- | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case MENU_ID_ACCEPT:
+ case android.R.id.home:
finish();
return true;
default:
@@ -110,11 +123,18 @@ public class OrganizeQueueActivity extends SherlockListActivity {
}
}
- /**
- * WARNING: If the PlaybackService is playing an episode from the queue,
- * this list adapter will ignore the first item in the list to make sure
- * that the position of the first queue item cannot be changed.
- */
+ @Override
+ public void onUndo(Parcelable token) {
+ // Perform the undo
+ UndoToken undoToken = (UndoToken) token;
+ FeedItem feedItem = undoToken.getFeedItem();
+ int position = undoToken.getPosition();
+
+ FeedManager manager = FeedManager.getInstance();
+ manager.addQueueItemAt(OrganizeQueueActivity.this, feedItem, position,
+ false);
+ }
+
private static class OrganizeAdapter extends BaseAdapter {
private Context context;
@@ -185,4 +205,52 @@ public class OrganizeQueueActivity extends SherlockListActivity {
}
+ private static class UndoToken implements Parcelable {
+ private long itemId;
+ private long feedId;
+ private int position;
+
+ public UndoToken(FeedItem item, int position) {
+ FeedManager manager = FeedManager.getInstance();
+ this.itemId = item.getId();
+ this.feedId = item.getFeed().getId();
+ this.position = position;
+ }
+
+ private UndoToken(Parcel in) {
+ itemId = in.readLong();
+ feedId = in.readLong();
+ position = in.readInt();
+ }
+
+ public static final Parcelable.Creator<UndoToken> CREATOR = new Parcelable.Creator<UndoToken>() {
+ public UndoToken createFromParcel(Parcel in) {
+ return new UndoToken(in);
+ }
+
+ public UndoToken[] newArray(int size) {
+ return new UndoToken[size];
+ }
+ };
+
+ public int describeContents() {
+ return 0;
+ }
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeLong(itemId);
+ out.writeLong(feedId);
+ out.writeInt(position);
+ }
+
+ public FeedItem getFeedItem() {
+ FeedManager manager = FeedManager.getInstance();
+ return manager.getFeedItem(itemId, feedId);
+ }
+
+ public int getPosition() {
+ return position;
+ }
+ }
+
}
diff --git a/src/de/danoeh/antennapod/activity/PreferenceActivity.java b/src/de/danoeh/antennapod/activity/PreferenceActivity.java
index 994cd2df6..9fcf57ac2 100644
--- a/src/de/danoeh/antennapod/activity/PreferenceActivity.java
+++ b/src/de/danoeh/antennapod/activity/PreferenceActivity.java
@@ -12,6 +12,7 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
@@ -166,13 +167,40 @@ public class PreferenceActivity extends SherlockPreferenceActivity {
return true;
}
});
-
+ buildUpdateIntervalPreference();
buildAutodownloadSelectedNetworsPreference();
setSelectedNetworksEnabled(UserPreferences
.isEnableAutodownloadWifiFilter());
}
+ private void buildUpdateIntervalPreference() {
+ ListPreference pref = (ListPreference) findPreference(UserPreferences.PREF_UPDATE_INTERVAL);
+ String[] values = getResources().getStringArray(
+ R.array.update_intervall_values);
+ String[] entries = new String[values.length];
+ for (int x = 0; x < values.length; x++) {
+ Integer v = Integer.parseInt(values[x]);
+ switch (v) {
+ case 0:
+ entries[x] = getString(R.string.pref_update_interval_hours_manual);
+ break;
+ case 1:
+ entries[x] = v
+ + " "
+ + getString(R.string.pref_update_interval_hours_singular);
+ break;
+ default:
+ entries[x] = v + " "
+ + getString(R.string.pref_update_interval_hours_plural);
+ break;
+
+ }
+ }
+ pref.setEntries(entries);
+
+ }
+
private void setSelectedNetworksEnabled(boolean b) {
if (selectedNetworks != null) {
for (Preference p : selectedNetworks) {
@@ -205,9 +233,15 @@ public class PreferenceActivity extends SherlockPreferenceActivity {
}
private void setEpisodeCacheSizeText(int cacheSize) {
- findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE).setSummary(
- Integer.toString(cacheSize)
- + getString(R.string.episodes_suffix));
+ String s;
+ if (cacheSize == getResources().getInteger(
+ R.integer.episode_cache_size_unlimited)) {
+ s = getString(R.string.pref_episode_cache_unlimited);
+ } else {
+ s = Integer.toString(cacheSize)
+ + getString(R.string.episodes_suffix);
+ }
+ findPreference(UserPreferences.PREF_EPISODE_CACHE_SIZE).setSummary(s);
}
private void setDataFolderText() {
diff --git a/src/de/danoeh/antennapod/adapter/DefaultFeedItemlistAdapter.java b/src/de/danoeh/antennapod/adapter/DefaultFeedItemlistAdapter.java
index b603bb54f..2b49795c3 100644
--- a/src/de/danoeh/antennapod/adapter/DefaultFeedItemlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/DefaultFeedItemlistAdapter.java
@@ -1,7 +1,5 @@
package de.danoeh.antennapod.adapter;
-import java.text.DateFormat;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.text.format.DateUtils;
@@ -75,10 +73,9 @@ public class DefaultFeedItemlistAdapter extends BaseAdapter {
holder.title.setText(item.getTitle());
holder.published.setText(convertView.getResources().getString(
R.string.published_prefix)
- + DateUtils.formatSameDayTime(item.getPubDate().getTime(),
- System.currentTimeMillis(), DateFormat.MEDIUM,
- DateFormat.SHORT));
-
+ + DateUtils.getRelativeTimeSpanString(
+ item.getPubDate().getTime(),
+ System.currentTimeMillis(), 0, 0));
if (item.getMedia() == null) {
holder.type.setVisibility(View.GONE);
holder.lenSize.setVisibility(View.GONE);
diff --git a/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
index c0ccdc7fe..99a30401e 100644
--- a/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
@@ -1,7 +1,5 @@
package de.danoeh.antennapod.adapter;
-import java.text.DateFormat;
-
import android.content.Context;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
@@ -60,9 +58,9 @@ public class DownloadLogAdapter extends BaseAdapter {
} else {
holder.title.setText(R.string.download_log_title_unknown);
}
- holder.date.setText(DateUtils.formatSameDayTime(status
- .getCompletionDate().getTime(), System.currentTimeMillis(),
- DateFormat.SHORT, DateFormat.SHORT));
+ holder.date.setText(DateUtils.getRelativeTimeSpanString(
+ status.getCompletionDate().getTime(),
+ System.currentTimeMillis(), 0, 0));
if (status.isSuccessful()) {
holder.successful.setTextColor(convertView.getResources().getColor(
R.color.download_success_green));
@@ -72,8 +70,7 @@ public class DownloadLogAdapter extends BaseAdapter {
holder.successful.setTextColor(convertView.getResources().getColor(
R.color.download_failed_red));
holder.successful.setText(R.string.download_failed);
- String reasonText = DownloadError.getErrorString(context,
- status.getReason());
+ String reasonText = status.getReason().getErrorString(context);
if (status.getReasonDetailed() != null) {
reasonText += ": " + status.getReasonDetailed();
}
diff --git a/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java b/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java
index d7ea0c160..03b46cce5 100644
--- a/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/FeedlistAdapter.java
@@ -1,7 +1,5 @@
package de.danoeh.antennapod.adapter;
-import java.text.DateFormat;
-
import android.content.Context;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
@@ -77,16 +75,21 @@ public class FeedlistAdapter extends BaseAdapter {
}
holder.title.setText(feed.getTitle());
+ int numOfItems = feed.getNumOfItems(true);
if (DownloadRequester.getInstance().isDownloadingFile(feed)) {
holder.lastUpdate.setText(R.string.refreshing_label);
} else {
- holder.lastUpdate.setText(convertView.getResources().getString(
- R.string.last_update_prefix)
- + DateUtils.formatSameDayTime(feed.getLastUpdate()
- .getTime(), System.currentTimeMillis(),
- DateFormat.MEDIUM, DateFormat.SHORT));
+ if (numOfItems > 0) {
+ holder.lastUpdate.setText(convertView.getResources().getString(
+ R.string.most_recent_prefix)
+ + DateUtils.getRelativeTimeSpanString(
+ feed.getItemAtIndex(true, 0).getPubDate().getTime(),
+ System.currentTimeMillis(), 0, 0));
+ } else {
+ holder.lastUpdate.setText("");
+ }
}
- holder.numberOfEpisodes.setText(feed.getNumOfItems(true)
+ holder.numberOfEpisodes.setText(numOfItems
+ convertView.getResources()
.getString(R.string.episodes_suffix));
diff --git a/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java b/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
index 7b898385e..e5c12f018 100644
--- a/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/InternalFeedItemlistAdapter.java
@@ -1,7 +1,5 @@
package de.danoeh.antennapod.adapter;
-import java.text.DateFormat;
-
import android.content.Context;
import android.content.res.TypedArray;
import android.text.format.DateUtils;
@@ -122,9 +120,9 @@ public class InternalFeedItemlistAdapter extends DefaultFeedItemlistAdapter {
holder.published.setText(convertView.getResources().getString(
R.string.published_prefix)
- + DateUtils.formatSameDayTime(item.getPubDate().getTime(),
- System.currentTimeMillis(), DateFormat.MEDIUM,
- DateFormat.SHORT));
+ + DateUtils.getRelativeTimeSpanString(
+ item.getPubDate().getTime(),
+ System.currentTimeMillis(), 0, 0));
FeedMedia media = item.getMedia();
if (media == null) {
diff --git a/src/de/danoeh/antennapod/adapter/MiroGuideItemlistAdapter.java b/src/de/danoeh/antennapod/adapter/MiroGuideItemlistAdapter.java
index 4cee0a64a..f12345f84 100644
--- a/src/de/danoeh/antennapod/adapter/MiroGuideItemlistAdapter.java
+++ b/src/de/danoeh/antennapod/adapter/MiroGuideItemlistAdapter.java
@@ -1,6 +1,5 @@
package de.danoeh.antennapod.adapter;
-import java.text.DateFormat;
import java.util.List;
import android.content.Context;
@@ -42,9 +41,8 @@ public class MiroGuideItemlistAdapter extends ArrayAdapter<MiroGuideItem> {
holder.title.setText(item.getName());
if (item.getDate() != null) {
- holder.date.setText(DateUtils.formatSameDayTime(item.getDate()
- .getTime(), System.currentTimeMillis(), DateFormat.SHORT,
- DateFormat.SHORT));
+ holder.date.setText(DateUtils.getRelativeTimeSpanString(
+ item.getDate().getTime(), System.currentTimeMillis(), 0, 0));
holder.date.setVisibility(View.VISIBLE);
} else {
holder.date.setVisibility(View.GONE);
diff --git a/src/de/danoeh/antennapod/asynctask/DownloadStatus.java b/src/de/danoeh/antennapod/asynctask/DownloadStatus.java
index e9225d33b..7d141f356 100644
--- a/src/de/danoeh/antennapod/asynctask/DownloadStatus.java
+++ b/src/de/danoeh/antennapod/asynctask/DownloadStatus.java
@@ -3,6 +3,7 @@ package de.danoeh.antennapod.asynctask;
import java.util.Date;
import de.danoeh.antennapod.feed.FeedFile;
+import de.danoeh.antennapod.util.DownloadError;
/** Contains status attributes for one download */
public class DownloadStatus {
@@ -25,7 +26,7 @@ public class DownloadStatus {
* URL if the download has no other title.
*/
protected String title;
- protected int reason;
+ protected DownloadError reason;
/**
* A message which can be presented to the user to give more information.
* Should be null if Download was successful.
@@ -59,7 +60,7 @@ public class DownloadStatus {
/** Constructor for restoring Download status entries from DB. */
public DownloadStatus(long id, String title, FeedFile feedfile,
- int feedfileType, boolean successful, int reason,
+ int feedfileType, boolean successful, DownloadError reason,
Date completionDate, String reasonDetailed) {
progressPercent = 100;
soFar = 0;
@@ -77,7 +78,7 @@ public class DownloadStatus {
}
/** Constructor for creating new completed downloads. */
- public DownloadStatus(FeedFile feedfile, String title, int reason,
+ public DownloadStatus(FeedFile feedfile, String title, DownloadError reason,
boolean successful, String reasonDetailed) {
this(0, title, feedfile, feedfile.getTypeAsInt(), successful, reason,
new Date(), reasonDetailed);
@@ -115,7 +116,7 @@ public class DownloadStatus {
return statusMsg;
}
- public int getReason() {
+ public DownloadError getReason() {
return reason;
}
@@ -151,17 +152,24 @@ public class DownloadStatus {
this.statusMsg = statusMsg;
}
- public void setReason(int reason) {
- this.reason = reason;
- }
+ public void setSuccessful() {
+ this.successful = true;
+ this.reason = DownloadError.SUCCESS;
+ this.done = true;
+ }
- public void setSuccessful(boolean successful) {
- this.successful = successful;
- }
+ public void setFailed(DownloadError reason, String reasonDetailed) {
+ this.successful = false;
+ this.reason = reason;
+ this.reasonDetailed = reasonDetailed;
+ }
- public void setDone(boolean done) {
- this.done = done;
- }
+ public void setCancelled() {
+ this.successful = false;
+ this.reason = DownloadError.ERROR_DOWNLOAD_CANCELLED;
+ this.done = true;
+ this.cancelled = true;
+ }
public void setCompletionDate(Date completionDate) {
this.completionDate = completionDate;
@@ -195,4 +203,4 @@ public class DownloadStatus {
this.cancelled = cancelled;
}
-} \ No newline at end of file
+}
diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java
index bdffdc667..5adca403b 100644
--- a/src/de/danoeh/antennapod/feed/FeedManager.java
+++ b/src/de/danoeh/antennapod/feed/FeedManager.java
@@ -10,6 +10,7 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
+import java.util.Comparator;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
@@ -676,8 +677,12 @@ public class FeedManager {
int deletedEpisodes = performAutoCleanup(context,
getPerformAutoCleanupArgs(undownloadedEpisodes));
int episodeSpaceLeft = undownloadedEpisodes;
- if (UserPreferences.getEpisodeCacheSize() < downloadedEpisodes
- + undownloadedEpisodes) {
+ boolean cacheIsUnlimited = UserPreferences.getEpisodeCacheSize() == UserPreferences
+ .getEpisodeCacheSizeUnlimited();
+
+ if (!cacheIsUnlimited
+ && UserPreferences.getEpisodeCacheSize() < downloadedEpisodes
+ + undownloadedEpisodes) {
episodeSpaceLeft = UserPreferences.getEpisodeCacheSize()
- (downloadedEpisodes - deletedEpisodes);
}
@@ -732,7 +737,9 @@ public class FeedManager {
* that the number of episodes fits into the episode cache.
* */
private int getPerformAutoCleanupArgs(final int episodeNumber) {
- if (episodeNumber >= 0) {
+ if (episodeNumber >= 0
+ && UserPreferences.getEpisodeCacheSize() != UserPreferences
+ .getEpisodeCacheSizeUnlimited()) {
int downloadedEpisodes = getNumberOfDownloadedEpisodes();
if (downloadedEpisodes + episodeNumber >= UserPreferences
.getEpisodeCacheSize()) {
@@ -760,24 +767,45 @@ public class FeedManager {
* @return The number of episodes that were actually deleted
* */
private int performAutoCleanup(Context context, final int episodeNumber) {
- int counter = 0;
- if (episodeNumber > 0) {
- int episodesLeft = episodeNumber;
- feedloop: for (Feed feed : feeds) {
- for (FeedItem item : feed.getItems()) {
- if (item.hasMedia() && item.getMedia().isDownloaded()) {
- if (!isInQueue(item) && item.isRead()) {
- deleteFeedMedia(context, item.getMedia());
- counter++;
- episodesLeft--;
- if (episodesLeft == 0) {
- break feedloop;
- }
- }
- }
+ List<FeedItem> candidates = new ArrayList<FeedItem>();
+ List<FeedItem> delete;
+ for (Feed feed : feeds) {
+ for (FeedItem item : feed.getItems()) {
+ if (item.hasMedia() && item.getMedia().isDownloaded()
+ && !isInQueue(item) && item.isRead()) {
+ candidates.add(item);
}
}
}
+
+ Collections.sort(candidates, new Comparator<FeedItem>() {
+ @Override
+ public int compare(FeedItem lhs, FeedItem rhs) {
+ Date l = lhs.getMedia().getPlaybackCompletionDate();
+ Date r = rhs.getMedia().getPlaybackCompletionDate();
+
+ if (l == null) {
+ l = new Date(0);
+ }
+ if (r == null) {
+ r = new Date(0);
+ }
+ return l.compareTo(r);
+ }
+ });
+
+ if (candidates.size() > episodeNumber) {
+ delete = candidates.subList(0, episodeNumber);
+ } else {
+ delete = candidates;
+ }
+
+ for (FeedItem item : delete) {
+ deleteFeedMedia(context, item.getMedia());
+ }
+
+ int counter = delete.size();
+
if (AppConfig.DEBUG)
Log.d(TAG, String.format(
"Auto-delete deleted %d episodes (%d requested)", counter,
@@ -970,7 +998,8 @@ public class FeedManager {
}
/** Removes a FeedItem from the queue. */
- public void removeQueueItem(final Context context, FeedItem item) {
+ public void removeQueueItem(final Context context, FeedItem item,
+ final boolean performAutoDownload) {
boolean removed = queue.remove(item);
if (removed) {
dbExec.execute(new Runnable() {
@@ -985,12 +1014,14 @@ public class FeedManager {
});
}
- new Thread() {
- @Override
- public void run() {
- autodownloadUndownloadedItems(context);
- }
- }.start();
+ if (performAutoDownload) {
+ new Thread() {
+ @Override
+ public void run() {
+ autodownloadUndownloadedItems(context);
+ }
+ }.start();
+ }
eventDist.sendQueueUpdateBroadcast();
}
@@ -1606,7 +1637,8 @@ public class FeedManager {
}
boolean successful = logCursor
.getInt(PodDBAdapter.KEY_SUCCESSFUL_INDEX) > 0;
- int reason = logCursor.getInt(PodDBAdapter.KEY_REASON_INDEX);
+ DownloadError reason = DownloadError.fromCode(
+ logCursor.getInt(PodDBAdapter.KEY_REASON_INDEX));
String reasonDetailed = logCursor
.getString(PodDBAdapter.KEY_REASON_DETAILED_INDEX);
String title = logCursor
@@ -1980,4 +2012,4 @@ public class FeedManager {
}
}
-} \ No newline at end of file
+}
diff --git a/src/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java b/src/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java
index a1dfa51d4..10f43718f 100644
--- a/src/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java
+++ b/src/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java
@@ -9,7 +9,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
-import android.graphics.Picture;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
@@ -23,10 +22,9 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.webkit.WebChromeClient;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
-import android.webkit.WebView.PictureListener;
+import android.webkit.WebViewClient;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
@@ -101,7 +99,6 @@ public class ItemDescriptionFragment extends SherlockFragment {
if (AppConfig.DEBUG)
Log.d(TAG, "Creating view");
webvDescription = new WebView(getActivity());
-
if (UserPreferences.getTheme() == R.style.Theme_AntennaPod_Dark) {
if (Build.VERSION.SDK_INT >= 11
&& Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
@@ -115,6 +112,32 @@ public class ItemDescriptionFragment extends SherlockFragment {
LayoutAlgorithm.NARROW_COLUMNS);
webvDescription.getSettings().setLoadWithOverviewMode(true);
webvDescription.setOnLongClickListener(webViewLongClickListener);
+ webvDescription.setWebViewClient(new WebViewClient() {
+
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ startActivity(intent);
+ return true;
+ }
+
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ super.onPageFinished(view, url);
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Page finished");
+ // Restoring the scroll position might not always work
+ view.postDelayed(new Runnable() {
+
+ @Override
+ public void run() {
+ restoreFromPreference();
+ }
+
+ }, 50);
+ }
+
+ });
registerForContextMenu(webvDescription);
return webvDescription;
}
@@ -336,7 +359,6 @@ public class ItemDescriptionFragment extends SherlockFragment {
String data;
- @SuppressWarnings("deprecation")
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
@@ -350,16 +372,6 @@ public class ItemDescriptionFragment extends SherlockFragment {
if (AppConfig.DEBUG)
Log.d(TAG, "Webview loaded");
webViewLoader = null;
- webvDescription.setPictureListener(new PictureListener() {
-
- @Override
- @Deprecated
- public void onNewPicture(WebView view, Picture picture) {
- restoreFromPreference();
-
- }
- });
-
}
@Override
@@ -434,17 +446,21 @@ public class ItemDescriptionFragment extends SherlockFragment {
if (saveState) {
if (AppConfig.DEBUG)
Log.d(TAG, "Restoring from preferences");
- SharedPreferences prefs = getActivity().getSharedPreferences(PREF,
- Activity.MODE_PRIVATE);
- String id = prefs.getString(PREF_PLAYABLE_ID, "");
- int scrollY = prefs.getInt(PREF_SCROLL_Y, -1);
- if (scrollY != -1 && media != null
- && id.equals(media.getIdentifier().toString())
- && webvDescription != null) {
- if (AppConfig.DEBUG)
- Log.d(TAG, "Restored scroll Position: " + scrollY);
- webvDescription.scrollTo(webvDescription.getScrollX(), scrollY);
- return true;
+ Activity activity = getActivity();
+ if (activity != null) {
+ SharedPreferences prefs = activity.getSharedPreferences(
+ PREF, Activity.MODE_PRIVATE);
+ String id = prefs.getString(PREF_PLAYABLE_ID, "");
+ int scrollY = prefs.getInt(PREF_SCROLL_Y, -1);
+ if (scrollY != -1 && media != null
+ && id.equals(media.getIdentifier().toString())
+ && webvDescription != null) {
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Restored scroll Position: " + scrollY);
+ webvDescription.scrollTo(webvDescription.getScrollX(),
+ scrollY);
+ return true;
+ }
}
}
return false;
diff --git a/src/de/danoeh/antennapod/miroguide/conn/MiroGuideConnector.java b/src/de/danoeh/antennapod/miroguide/conn/MiroGuideConnector.java
index 4637c7725..99bef4bd8 100644
--- a/src/de/danoeh/antennapod/miroguide/conn/MiroGuideConnector.java
+++ b/src/de/danoeh/antennapod/miroguide/conn/MiroGuideConnector.java
@@ -20,7 +20,7 @@ import android.net.Uri;
public class MiroGuideConnector {
private HttpClient httpClient;
- private static final String HOST_URL = "https://www.miroguide.com/api/";
+ private static final String HOST_URL = "http://www.miroguide.com/api/";
private static final String PATH_GET_CHANNELS = "get_channels";
private static final String PATH_LIST_CATEGORIES = "list_categories";
private static final String PATH_GET_CHANNEL = "get_channel";
diff --git a/src/de/danoeh/antennapod/preferences/UserPreferences.java b/src/de/danoeh/antennapod/preferences/UserPreferences.java
index bd491a5cf..f2f35f41d 100644
--- a/src/de/danoeh/antennapod/preferences/UserPreferences.java
+++ b/src/de/danoeh/antennapod/preferences/UserPreferences.java
@@ -42,6 +42,8 @@ public class UserPreferences implements
private static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks";
public static final String PREF_EPISODE_CACHE_SIZE = "prefEpisodeCacheSize";
+ private static int EPISODE_CACHE_SIZE_UNLIMITED = -1;
+
private static UserPreferences instance;
private Context context;
@@ -86,6 +88,8 @@ public class UserPreferences implements
private void loadPreferences() {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(context);
+ EPISODE_CACHE_SIZE_UNLIMITED = context.getResources().getInteger(
+ R.integer.episode_cache_size_unlimited);
pauseOnHeadsetDisconnect = sp.getBoolean(
PREF_PAUSE_ON_HEADSET_DISCONNECT, true);
followQueue = sp.getBoolean(PREF_FOLLOW_QUEUE, false);
@@ -101,7 +105,7 @@ public class UserPreferences implements
PREF_ENABLE_AUTODL_WIFI_FILTER, false);
autodownloadSelectedNetworks = StringUtils.split(
sp.getString(PREF_AUTODL_SELECTED_NETWORKS, ""), ',');
- episodeCacheSize = Integer.valueOf(sp.getString(
+ episodeCacheSize = readEpisodeCacheSize(sp.getString(
PREF_EPISODE_CACHE_SIZE, "20"));
enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false);
}
@@ -122,6 +126,15 @@ public class UserPreferences implements
return TimeUnit.HOURS.toMillis(hours);
}
+ private int readEpisodeCacheSize(String valueFromPrefs) {
+ if (valueFromPrefs.equals(context
+ .getString(R.string.pref_episode_cache_unlimited))) {
+ return EPISODE_CACHE_SIZE_UNLIMITED;
+ } else {
+ return Integer.valueOf(valueFromPrefs);
+ }
+ }
+
private static void instanceAvailable() {
if (instance == null) {
throw new IllegalStateException(
@@ -179,6 +192,15 @@ public class UserPreferences implements
return instance.autodownloadSelectedNetworks;
}
+ public static int getEpisodeCacheSizeUnlimited() {
+ return EPISODE_CACHE_SIZE_UNLIMITED;
+ }
+
+ /**
+ * Returns the capacity of the episode cache. This method will return the
+ * negative integer EPISODE_CACHE_SIZE_UNLIMITED if the cache size is set to
+ * 'unlimited'.
+ */
public static int getEpisodeCacheSize() {
instanceAvailable();
return instance.episodeCacheSize;
@@ -224,7 +246,7 @@ public class UserPreferences implements
autodownloadSelectedNetworks = StringUtils.split(
sp.getString(PREF_AUTODL_SELECTED_NETWORKS, ""), ',');
} else if (key.equals(PREF_EPISODE_CACHE_SIZE)) {
- episodeCacheSize = Integer.valueOf(sp.getString(
+ episodeCacheSize = readEpisodeCacheSize(sp.getString(
PREF_EPISODE_CACHE_SIZE, "20"));
} else if (key.equals(PREF_ENABLE_AUTODL)) {
enableAutodownload = sp.getBoolean(PREF_ENABLE_AUTODL, false);
diff --git a/src/de/danoeh/antennapod/service/PlaybackService.java b/src/de/danoeh/antennapod/service/PlaybackService.java
index 11da79015..409ac6b48 100644
--- a/src/de/danoeh/antennapod/service/PlaybackService.java
+++ b/src/de/danoeh/antennapod/service/PlaybackService.java
@@ -73,8 +73,8 @@ public class PlaybackService extends Service {
public static final String EXTRA_PREPARE_IMMEDIATELY = "extra.de.danoeh.antennapod.service.prepareImmediately";
public static final String ACTION_PLAYER_STATUS_CHANGED = "action.de.danoeh.antennapod.service.playerStatusChanged";
- private static final String AVRCP_ACTION_PLAYER_STATUS_CHANGED= "com.android.music.playstatechanged";
-
+ private static final String AVRCP_ACTION_PLAYER_STATUS_CHANGED = "com.android.music.playstatechanged";
+
public static final String ACTION_PLAYER_NOTIFICATION = "action.de.danoeh.antennapod.service.playerNotification";
public static final String EXTRA_NOTIFICATION_CODE = "extra.de.danoeh.antennapod.service.notificationCode";
public static final String EXTRA_NOTIFICATION_TYPE = "extra.de.danoeh.antennapod.service.notificationType";
@@ -363,13 +363,15 @@ public class PlaybackService extends Service {
}
// Intent values appear to be valid
// check if already playing and playbackType is the same
- } else if (media == null || playable != media
+ } else if (media == null
+ || !playable.getIdentifier().equals(media.getIdentifier())
|| playbackType != shouldStream) {
pause(true, false);
player.reset();
sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, 0);
if (media == null
- || playable.getIdentifier() != media.getIdentifier()) {
+ || !playable.getIdentifier().equals(
+ media.getIdentifier())) {
media = playable;
}
@@ -730,7 +732,7 @@ public class PlaybackService extends Service {
isInQueue = media instanceof FeedMedia
&& manager.isInQueue(((FeedMedia) media).getItem());
if (isInQueue) {
- manager.removeQueueItem(PlaybackService.this, item);
+ manager.removeQueueItem(PlaybackService.this, item, true);
}
manager.addItemToPlaybackHistory(PlaybackService.this, item);
manager.setFeedMedia(PlaybackService.this, (FeedMedia) media);
@@ -1226,23 +1228,23 @@ public class PlaybackService extends Service {
private void bluetoothNotifyChange() {
boolean isPlaying = false;
-
+
if (status == PlayerStatus.PLAYING) {
isPlaying = true;
}
-
- Intent i = new Intent(AVRCP_ACTION_PLAYER_STATUS_CHANGED);
- i.putExtra("id", 1);
- i.putExtra("artist", "");
- i.putExtra("album", media.getFeedTitle());
- i.putExtra("track", media.getEpisodeTitle());
- i.putExtra("playing", isPlaying);
- i.putExtra("ListSize", manager.getQueueSize(false));
- i.putExtra("duration", media.getDuration());
- i.putExtra("position", media.getPosition());
- sendBroadcast(i);
+
+ Intent i = new Intent(AVRCP_ACTION_PLAYER_STATUS_CHANGED);
+ i.putExtra("id", 1);
+ i.putExtra("artist", "");
+ i.putExtra("album", media.getFeedTitle());
+ i.putExtra("track", media.getEpisodeTitle());
+ i.putExtra("playing", isPlaying);
+ i.putExtra("ListSize", manager.getQueueSize(false));
+ i.putExtra("duration", media.getDuration());
+ i.putExtra("position", media.getPosition());
+ sendBroadcast(i);
}
-
+
/**
* Pauses playback when the headset is disconnected and the preference is
* set
diff --git a/src/de/danoeh/antennapod/service/download/DownloadService.java b/src/de/danoeh/antennapod/service/download/DownloadService.java
index e1230e170..d6701c129 100644
--- a/src/de/danoeh/antennapod/service/download/DownloadService.java
+++ b/src/de/danoeh/antennapod/service/download/DownloadService.java
@@ -612,7 +612,7 @@ public class DownloadService extends Service {
private Feed feed;
private DownloadStatus status;
- private int reason;
+ private DownloadError reason;
private boolean successful;
public FeedSyncThread(DownloadStatus status) {
@@ -622,7 +622,7 @@ public class DownloadService extends Service {
public void run() {
Feed savedFeed = null;
- reason = 0;
+ reason = DownloadError.SUCCESS;
String reasonDetailed = null;
successful = true;
final FeedManager manager = FeedManager.getInstance();
diff --git a/src/de/danoeh/antennapod/service/download/HttpDownloader.java b/src/de/danoeh/antennapod/service/download/HttpDownloader.java
index f8f26f6fd..0cb89368d 100644
--- a/src/de/danoeh/antennapod/service/download/HttpDownloader.java
+++ b/src/de/danoeh/antennapod/service/download/HttpDownloader.java
@@ -63,7 +63,7 @@ public class HttpDownloader extends Downloader {
@Override
protected void download() {
DefaultHttpClient httpClient = null;
- OutputStream out = null;
+ BufferedOutputStream out = null;
InputStream connection = null;
try {
HttpGet httpGet = new HttpGet(status.getFeedFile()
@@ -113,6 +113,7 @@ public class HttpDownloader extends Downloader {
if (cancelled) {
onCancelled();
} else {
+ out.flush();
onSuccess();
}
} else {
@@ -158,28 +159,21 @@ public class HttpDownloader extends Downloader {
private void onSuccess() {
if (AppConfig.DEBUG)
Log.d(TAG, "Download was successful");
- status.setSuccessful(true);
- status.setDone(true);
+ status.setSuccessful();
}
- private void onFail(int reason, String reasonDetailed) {
+ private void onFail(DownloadError reason, String reasonDetailed) {
if (AppConfig.DEBUG) {
Log.d(TAG, "Download failed");
}
- status.setReason(reason);
- status.setReasonDetailed(reasonDetailed);
- status.setDone(true);
- status.setSuccessful(false);
+ status.setFailed(reason, reasonDetailed);
cleanup();
}
private void onCancelled() {
if (AppConfig.DEBUG)
Log.d(TAG, "Download was cancelled");
- status.setReason(DownloadError.ERROR_DOWNLOAD_CANCELLED);
- status.setDone(true);
- status.setSuccessful(false);
- status.setCancelled(true);
+ status.setCancelled();
cleanup();
}
diff --git a/src/de/danoeh/antennapod/storage/DownloadRequester.java b/src/de/danoeh/antennapod/storage/DownloadRequester.java
index 29bd764dd..fb011d238 100644
--- a/src/de/danoeh/antennapod/storage/DownloadRequester.java
+++ b/src/de/danoeh/antennapod/storage/DownloadRequester.java
@@ -5,6 +5,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.text.ExtendedMessageFormat;
import android.content.Context;
import android.content.Intent;
@@ -61,7 +62,7 @@ public class DownloadRequester {
.getName())
+ "-"
+ i
- + "."
+ + FilenameUtils.EXTENSION_SEPARATOR
+ FilenameUtils.getExtension(dest.getName());
if (AppConfig.DEBUG)
Log.d(TAG, "Testing filename " + newName);
@@ -289,8 +290,29 @@ public class DownloadRequester {
}
public String getMediafilename(FeedMedia media) {
- return URLUtil.guessFileName(media.getDownload_url(), null,
- media.getMime_type());
+ String filename;
+ String titleBaseFilename = "";
+
+ // Try to generate the filename by the item title
+ if (media.getItem() != null && media.getItem().getTitle() != null) {
+ String title = media.getItem().getTitle();
+ // Delete reserved characters
+ titleBaseFilename = title.replaceAll("[\\\\/%\\?\\*:|<>\"\\p{Cntrl}]", "");
+ titleBaseFilename = titleBaseFilename.trim();
+ }
+
+ String URLBaseFilename = URLUtil.guessFileName(media.getDownload_url(),
+ null, media.getMime_type());;
+
+ if (titleBaseFilename != "") {
+ // Append extension
+ filename = titleBaseFilename + FilenameUtils.EXTENSION_SEPARATOR +
+ FilenameUtils.getExtension(URLBaseFilename);
+ } else {
+ // Fall back on URL file name
+ filename = URLBaseFilename;
+ }
+ return filename;
}
}
diff --git a/src/de/danoeh/antennapod/storage/PodDBAdapter.java b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
index 420264840..3d3d23de1 100644
--- a/src/de/danoeh/antennapod/storage/PodDBAdapter.java
+++ b/src/de/danoeh/antennapod/storage/PodDBAdapter.java
@@ -424,7 +424,7 @@ public class PodDBAdapter {
values.put(KEY_FEEDFILETYPE, FeedMedia.FEEDFILETYPE_FEEDMEDIA);
}
}
- values.put(KEY_REASON, status.getReason());
+ values.put(KEY_REASON, status.getReason().getCode());
values.put(KEY_SUCCESSFUL, status.isSuccessful());
values.put(KEY_COMPLETION_DATE, status.getCompletionDate().getTime());
values.put(KEY_REASON_DETAILED, status.getReasonDetailed());
diff --git a/src/de/danoeh/antennapod/syndication/namespace/NSRSS20.java b/src/de/danoeh/antennapod/syndication/namespace/NSRSS20.java
index 4d0b42132..5a2c6005e 100644
--- a/src/de/danoeh/antennapod/syndication/namespace/NSRSS20.java
+++ b/src/de/danoeh/antennapod/syndication/namespace/NSRSS20.java
@@ -78,6 +78,15 @@ public class NSRSS20 extends Namespace {
@Override
public void handleElementEnd(String localName, HandlerState state) {
if (localName.equals(ITEM)) {
+ if (state.getCurrentItem() != null) {
+ // the title tag is optional in RSS 2.0. The description is used
+ // as a
+ // title if the item has no title-tag.
+ if (state.getCurrentItem().getTitle() == null) {
+ state.getCurrentItem().setTitle(
+ state.getCurrentItem().getDescription());
+ }
+ }
state.setCurrentItem(null);
} else if (state.getTagstack().size() >= 2
&& state.getContentBuf() != null) {
@@ -98,7 +107,8 @@ public class NSRSS20 extends Namespace {
state.getCurrentItem().setTitle(content);
} else if (second.equals(CHANNEL)) {
state.getFeed().setTitle(content);
- } else if (second.equals(IMAGE) && third != null && third.equals(CHANNEL)) {
+ } else if (second.equals(IMAGE) && third != null
+ && third.equals(CHANNEL)) {
state.getFeed().getImage().setTitle(content);
}
} else if (top.equals(LINK)) {
@@ -110,7 +120,8 @@ public class NSRSS20 extends Namespace {
} else if (top.equals(PUBDATE) && second.equals(ITEM)) {
state.getCurrentItem().setPubDate(
SyndDateUtils.parseRFC822Date(content));
- } else if (top.equals(URL) && second.equals(IMAGE) && third != null && third.equals(CHANNEL)) {
+ } else if (top.equals(URL) && second.equals(IMAGE) && third != null
+ && third.equals(CHANNEL)) {
state.getFeed().getImage().setDownload_url(content);
} else if (localName.equals(DESCR)) {
if (second.equals(CHANNEL)) {
diff --git a/src/de/danoeh/antennapod/util/ConnectionTester.java b/src/de/danoeh/antennapod/util/ConnectionTester.java
index 2fd22d356..5d940d9e1 100644
--- a/src/de/danoeh/antennapod/util/ConnectionTester.java
+++ b/src/de/danoeh/antennapod/util/ConnectionTester.java
@@ -14,7 +14,7 @@ public class ConnectionTester implements Runnable {
private static final String TAG = "ConnectionTester";
private String strUrl;
private Callback callback;
- private int reason;
+ private DownloadError reason;
private Handler handler;
@@ -68,10 +68,10 @@ public class ConnectionTester implements Runnable {
public static abstract class Callback {
public abstract void onConnectionSuccessful();
- public abstract void onConnectionFailure(int reason);
+ public abstract void onConnectionFailure(DownloadError reason);
}
- public int getReason() {
+ public DownloadError getReason() {
return reason;
}
diff --git a/src/de/danoeh/antennapod/util/Converter.java b/src/de/danoeh/antennapod/util/Converter.java
index f02e8ea69..6ef47af31 100644
--- a/src/de/danoeh/antennapod/util/Converter.java
+++ b/src/de/danoeh/antennapod/util/Converter.java
@@ -78,4 +78,5 @@ public final class Converter {
return String.format("%02d:%02d", h, m);
}
+
}
diff --git a/src/de/danoeh/antennapod/util/DownloadError.java b/src/de/danoeh/antennapod/util/DownloadError.java
index 4723a521c..c37a14584 100644
--- a/src/de/danoeh/antennapod/util/DownloadError.java
+++ b/src/de/danoeh/antennapod/util/DownloadError.java
@@ -4,54 +4,46 @@ import android.content.Context;
import de.danoeh.antennapod.R;
/** Utility class for Download Errors. */
-public class DownloadError {
- public static final int ERROR_PARSER_EXCEPTION = 1;
- public static final int ERROR_UNSUPPORTED_TYPE = 2;
- public static final int ERROR_CONNECTION_ERROR = 3;
- public static final int ERROR_MALFORMED_URL = 4;
- public static final int ERROR_IO_ERROR = 5;
- public static final int ERROR_FILE_EXISTS = 6;
- public static final int ERROR_DOWNLOAD_CANCELLED = 7;
- public static final int ERROR_DEVICE_NOT_FOUND = 8;
- public static final int ERROR_HTTP_DATA_ERROR = 9;
- public static final int ERROR_NOT_ENOUGH_SPACE = 10;
- public static final int ERROR_UNKNOWN_HOST = 11;
- public static final int ERROR_REQUEST_ERROR = 12;
-
- /** Get a human-readable string for a specific error code. */
- public static String getErrorString(Context context, int code) {
- int resId;
- switch(code) {
- case ERROR_NOT_ENOUGH_SPACE:
- resId = R.string.download_error_insufficient_space;
- break;
- case ERROR_DEVICE_NOT_FOUND:
- resId = R.string.download_error_device_not_found;
- break;
- case ERROR_IO_ERROR:
- resId = R.string.download_error_io_error;
- break;
- case ERROR_HTTP_DATA_ERROR:
- resId = R.string.download_error_http_data_error;
- break;
- case ERROR_PARSER_EXCEPTION:
- resId = R.string.download_error_parser_exception;
- break;
- case ERROR_UNSUPPORTED_TYPE:
- resId = R.string.download_error_unsupported_type;
- break;
- case ERROR_CONNECTION_ERROR:
- resId = R.string.download_error_connection_error;
- break;
- case ERROR_UNKNOWN_HOST:
- resId = R.string.download_error_unknown_host;
- break;
- case ERROR_REQUEST_ERROR:
- resId = R.string.download_error_request_error;
- break;
- default:
- resId = R.string.download_error_error_unknown;
+public enum DownloadError {
+ SUCCESS(0, R.string.download_successful),
+ ERROR_PARSER_EXCEPTION(1, R.string.download_error_parser_exception),
+ ERROR_UNSUPPORTED_TYPE(2, R.string.download_error_unsupported_type),
+ ERROR_CONNECTION_ERROR(3, R.string.download_error_connection_error),
+ ERROR_MALFORMED_URL(4, R.string.download_error_error_unknown),
+ ERROR_IO_ERROR(5, R.string.download_error_io_error),
+ ERROR_FILE_EXISTS(6, R.string.download_error_error_unknown),
+ ERROR_DOWNLOAD_CANCELLED(7, R.string.download_error_error_unknown),
+ ERROR_DEVICE_NOT_FOUND(8, R.string.download_error_device_not_found),
+ ERROR_HTTP_DATA_ERROR(9, R.string.download_error_http_data_error),
+ ERROR_NOT_ENOUGH_SPACE(10, R.string.download_error_insufficient_space),
+ ERROR_UNKNOWN_HOST(11, R.string.download_error_unknown_host),
+ ERROR_REQUEST_ERROR(12, R.string.download_error_request_error);
+
+ private final int code;
+ private final int resId;
+
+ private DownloadError(int code, int resId) {
+ this.code = code;
+ this.resId = resId;
+ }
+
+ /** Return DownloadError from its associated code. */
+ public static DownloadError fromCode(int code) {
+ for (DownloadError reason : values()) {
+ if (reason.getCode() == code) {
+ return reason;
+ }
}
+ throw new IllegalArgumentException("unknown code: " + code);
+ }
+
+ /** Get machine-readable code. */
+ public int getCode() {
+ return code;
+ }
+
+ /** Get a human-readable string. */
+ public String getErrorString(Context context) {
return context.getString(resId);
}
diff --git a/src/de/danoeh/antennapod/util/UndoBarController.java b/src/de/danoeh/antennapod/util/UndoBarController.java
new file mode 100644
index 000000000..e726717a1
--- /dev/null
+++ b/src/de/danoeh/antennapod/util/UndoBarController.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2012 Roman Nurik
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.danoeh.antennapod.util;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Parcelable;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewPropertyAnimator;
+import android.widget.TextView;
+
+import de.danoeh.antennapod.R;
+
+public class UndoBarController {
+ private View mBarView;
+ private TextView mMessageView;
+ private ViewPropertyAnimator mBarAnimator;
+ private Handler mHideHandler = new Handler();
+
+ private UndoListener mUndoListener;
+
+ // State objects
+ private Parcelable mUndoToken;
+ private CharSequence mUndoMessage;
+
+ public interface UndoListener {
+ void onUndo(Parcelable token);
+ }
+
+ public UndoBarController(View undoBarView, UndoListener undoListener) {
+ mBarView = undoBarView;
+ mBarAnimator = mBarView.animate();
+ mUndoListener = undoListener;
+
+ mMessageView = (TextView) mBarView.findViewById(R.id.undobar_message);
+ mBarView.findViewById(R.id.undobar_button)
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ hideUndoBar(false);
+ mUndoListener.onUndo(mUndoToken);
+ }
+ });
+
+ hideUndoBar(true);
+ }
+
+ public void showUndoBar(boolean immediate, CharSequence message, Parcelable undoToken) {
+ mUndoToken = undoToken;
+ mUndoMessage = message;
+ mMessageView.setText(mUndoMessage);
+
+ mHideHandler.removeCallbacks(mHideRunnable);
+ mHideHandler.postDelayed(mHideRunnable,
+ mBarView.getResources().getInteger(R.integer.undobar_hide_delay));
+
+ mBarView.setVisibility(View.VISIBLE);
+ if (immediate) {
+ mBarView.setAlpha(1);
+ } else {
+ mBarAnimator.cancel();
+ mBarAnimator
+ .alpha(1)
+ .setDuration(
+ mBarView.getResources()
+ .getInteger(android.R.integer.config_shortAnimTime))
+ .setListener(null);
+ }
+ }
+
+ public void hideUndoBar(boolean immediate) {
+ mHideHandler.removeCallbacks(mHideRunnable);
+ if (immediate) {
+ mBarView.setVisibility(View.GONE);
+ mBarView.setAlpha(0);
+ mUndoMessage = null;
+ mUndoToken = null;
+
+ } else {
+ mBarAnimator.cancel();
+ mBarAnimator
+ .alpha(0)
+ .setDuration(mBarView.getResources()
+ .getInteger(android.R.integer.config_shortAnimTime))
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mBarView.setVisibility(View.GONE);
+ mUndoMessage = null;
+ mUndoToken = null;
+ }
+ });
+ }
+ }
+
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putCharSequence("undo_message", mUndoMessage);
+ outState.putParcelable("undo_token", mUndoToken);
+ }
+
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ if (savedInstanceState != null) {
+ mUndoMessage = savedInstanceState.getCharSequence("undo_message");
+ mUndoToken = savedInstanceState.getParcelable("undo_token");
+
+ if (mUndoToken != null || !TextUtils.isEmpty(mUndoMessage)) {
+ showUndoBar(true, mUndoMessage, mUndoToken);
+ }
+ }
+ }
+
+ private Runnable mHideRunnable = new Runnable() {
+ @Override
+ public void run() {
+ hideUndoBar(false);
+ }
+ };
+}
diff --git a/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java b/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java
index e1cafe85d..f897f886c 100644
--- a/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java
+++ b/src/de/danoeh/antennapod/util/id3reader/ChapterReader.java
@@ -2,18 +2,24 @@ package de.danoeh.antennapod.util.id3reader;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
+import android.util.Log;
+
+import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.feed.Chapter;
import de.danoeh.antennapod.feed.ID3Chapter;
import de.danoeh.antennapod.util.id3reader.model.FrameHeader;
import de.danoeh.antennapod.util.id3reader.model.TagHeader;
public class ChapterReader extends ID3Reader {
+ private static final String TAG = "ID3ChapterReader";
private static final String FRAME_ID_CHAPTER = "CHAP";
private static final String FRAME_ID_TITLE = "TIT2";
+ private static final String FRAME_ID_LINK = "WXXX";
private List<Chapter> chapters;
private ID3Chapter currentChapter;
@@ -33,27 +39,45 @@ public class ChapterReader extends ID3Reader {
if (currentChapter != null) {
if (!hasId3Chapter(currentChapter)) {
chapters.add(currentChapter);
- System.out.println("Found chapter: " + currentChapter);
+ if (AppConfig.DEBUG) Log.d(TAG, "Found chapter: " + currentChapter);
currentChapter = null;
}
}
- String elementId = readISOString(input, Integer.MAX_VALUE);
+ StringBuffer elementId = new StringBuffer();
+ readISOString(elementId, input, Integer.MAX_VALUE);
char[] startTimeSource = readBytes(input, 4);
long startTime = ((int) startTimeSource[0] << 24)
| ((int) startTimeSource[1] << 16)
| ((int) startTimeSource[2] << 8) | startTimeSource[3];
- currentChapter = new ID3Chapter(elementId, startTime);
+ currentChapter = new ID3Chapter(elementId.toString(), startTime);
skipBytes(input, 12);
return ID3Reader.ACTION_DONT_SKIP;
} else if (header.getId().equals(FRAME_ID_TITLE)) {
if (currentChapter != null && currentChapter.getTitle() == null) {
+ StringBuffer title = new StringBuffer();
+ readString(title, input, header.getSize());
currentChapter
- .setTitle(readString(input, header.getSize()));
- System.out.println("Found title: " + currentChapter.getTitle());
+ .setTitle(title.toString());
+ if (AppConfig.DEBUG) Log.d(TAG, "Found title: " + currentChapter.getTitle());
return ID3Reader.ACTION_DONT_SKIP;
}
- }
+ } else if (header.getId().equals(FRAME_ID_LINK)) {
+ if (currentChapter != null) {
+ // skip description
+ int descriptionLength = readString(null, input, header.getSize());
+ StringBuffer link = new StringBuffer();
+ readISOString(link, input, header.getSize() - descriptionLength);
+ String decodedLink = URLDecoder.decode(link.toString(), "UTF-8");
+
+ currentChapter.setLink(decodedLink);
+
+ if (AppConfig.DEBUG) Log.d(TAG, "Found link: " + currentChapter.getLink());
+ return ID3Reader.ACTION_DONT_SKIP;
+ }
+ } else if (header.getId().equals("APIC")) {
+ Log.d(TAG, header.toString());
+ }
return super.onStartFrameHeader(header, input);
}
diff --git a/src/de/danoeh/antennapod/util/id3reader/ID3Reader.java b/src/de/danoeh/antennapod/util/id3reader/ID3Reader.java
index dff6d77e8..92f817363 100644
--- a/src/de/danoeh/antennapod/util/id3reader/ID3Reader.java
+++ b/src/de/danoeh/antennapod/util/id3reader/ID3Reader.java
@@ -24,7 +24,11 @@ public class ID3Reader {
protected int readerPosition;
- private static final byte ENCODING_UNICODE = 1;
+ private static final byte ENCODING_UTF16_WITH_BOM = 1;
+ private static final byte ENCODING_UTF16_WITHOUT_BOM = 2;
+ private static final byte ENCODING_UTF8 = 3;
+
+ private TagHeader tagHeader;
public ID3Reader() {
}
@@ -34,7 +38,7 @@ public class ID3Reader {
int rc;
readerPosition = 0;
char[] tagHeaderSource = readBytes(input, HEADER_LENGTH);
- TagHeader tagHeader = createTagHeader(tagHeaderSource);
+ tagHeader = createTagHeader(tagHeaderSource);
if (tagHeader == null) {
onNoTagHeaderFound();
} else {
@@ -124,12 +128,12 @@ public class ID3Reader {
+ HEADER_LENGTH);
}
if (hasTag) {
- String id = null;
- id = new String(source, 0, ID3_LENGTH);
+ String id = new String(source, 0, ID3_LENGTH);
char version = (char) ((source[3] << 8) | source[4]);
byte flags = (byte) source[5];
int size = (source[6] << 24) | (source[7] << 16) | (source[8] << 8)
| source[9];
+ size = unsynchsafe(size);
return new TagHeader(id, size, version, flags);
} else {
return null;
@@ -142,48 +146,89 @@ public class ID3Reader {
throw new ID3ReaderException("Length of header must be "
+ HEADER_LENGTH);
}
- String id = null;
- id = new String(source, 0, FRAME_ID_LENGTH);
- int size = (((int) source[4]) << 24) | (((int) source[5]) << 16)
- | (((int) source[6]) << 8) | source[7];
+ String id = new String(source, 0, FRAME_ID_LENGTH);
+
+ int size = (((int) source[4]) << 24) | (((int) source[5]) << 16)
+ | (((int) source[6]) << 8) | source[7];
+ if (tagHeader != null && tagHeader.getVersion() >= 0x0400) {
+ size = unsynchsafe(size);
+ }
char flags = (char) ((source[8] << 8) | source[9]);
return new FrameHeader(id, size, flags);
}
- protected String readString(InputStream input, int max) throws IOException,
+ private int unsynchsafe(int in) {
+ int out = 0;
+ int mask = 0x7F000000;
+
+ while (mask != 0) {
+ out >>= 1;
+ out |= in & mask;
+ mask >>= 8;
+ }
+
+ return out;
+ }
+
+ protected int readString(StringBuffer buffer, InputStream input, int max) throws IOException,
ID3ReaderException {
if (max > 0) {
char[] encoding = readBytes(input, 1);
max--;
- if (encoding[0] == ENCODING_UNICODE) {
- return readUnicodeString(input, max);
- } else {
- return readISOString(input, max);
+ if (encoding[0] == ENCODING_UTF16_WITH_BOM || encoding[0] == ENCODING_UTF16_WITHOUT_BOM) {
+ return readUnicodeString(buffer, input, max, Charset.forName("UTF-16")) + 1; // take encoding byte into account
+ } else if (encoding[0] == ENCODING_UTF8) {
+ return readUnicodeString(buffer, input, max, Charset.forName("UTF-8")) + 1; // take encoding byte into account
+ } else {
+ return readISOString(buffer, input, max) + 1; // take encoding byte into account
}
} else {
- return "";
+ if (buffer != null) {
+ buffer.append("");
+ }
+ return 0;
}
}
- protected String readISOString(InputStream input, int max)
+ protected int readISOString(StringBuffer buffer, InputStream input, int max)
throws IOException, ID3ReaderException {
int bytesRead = 0;
- StringBuilder builder = new StringBuilder();
char c;
while (++bytesRead <= max && (c = (char) input.read()) > 0) {
- builder.append(c);
+ if (buffer != null) {
+ buffer.append(c);
+ }
}
- return builder.toString();
+ return bytesRead;
}
- private String readUnicodeString(InputStream input, int max)
+ private int readUnicodeString(StringBuffer strBuffer, InputStream input, int max, Charset charset)
throws IOException, ID3ReaderException {
byte[] buffer = new byte[max];
- IOUtils.readFully(input, buffer);
- Charset charset = Charset.forName("UTF-16");
- return charset.newDecoder().decode(ByteBuffer.wrap(buffer)).toString();
+ int c, cZero = -1;
+ int i = 0;
+ for (; i < max; i++) {
+ c = input.read();
+ if (c == -1) {
+ break;
+ } else if (c == 0) {
+ if (cZero == 0) {
+ // termination character found
+ break;
+ } else {
+ cZero = 0;
+ }
+ } else {
+ buffer[i] = (byte) c;
+ cZero = -1;
+ }
+ }
+ if (strBuffer != null) {
+ strBuffer.append(charset.newDecoder().decode(ByteBuffer.wrap(buffer)).toString());
+ }
+ return i;
}
public int onStartTagHeader(TagHeader header) {
diff --git a/src/de/danoeh/antennapod/util/id3reader/model/FrameHeader.java b/src/de/danoeh/antennapod/util/id3reader/model/FrameHeader.java
index 2c0d8e5ba..df73393a5 100644
--- a/src/de/danoeh/antennapod/util/id3reader/model/FrameHeader.java
+++ b/src/de/danoeh/antennapod/util/id3reader/model/FrameHeader.java
@@ -11,8 +11,7 @@ public class FrameHeader extends Header {
@Override
public String toString() {
- return "FrameHeader [flags=" + Integer.toString(flags) + ", id=" + id + ", size=" + size
- + "]";
- }
+ return String.format("FrameHeader [flags=%s, id=%s, size=%s]", Integer.toBinaryString(flags), id, Integer.toBinaryString(size));
+ }
}
diff --git a/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java b/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java
index 64bcb1cf2..472124bf7 100644
--- a/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java
+++ b/src/de/danoeh/antennapod/util/menuhandler/FeedItemMenuHandler.java
@@ -140,7 +140,7 @@ public class FeedItemMenuHandler {
manager.addQueueItem(context, selectedItem);
break;
case R.id.remove_from_queue_item:
- manager.removeQueueItem(context, selectedItem);
+ manager.removeQueueItem(context, selectedItem, true);
break;
case R.id.stream_item:
manager.playMedia(context, selectedItem.getMedia(), true, true,
diff --git a/tests/.classpath b/tests/.classpath
index 0e8961f49..62d428f2b 100644
--- a/tests/.classpath
+++ b/tests/.classpath
@@ -5,5 +5,6 @@
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry combineaccessrules="false" kind="src" path="/AntennaPod"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
diff --git a/tests/src/de/danoeh/antennapod/test/FeedHandlerTest.java b/tests/src/de/danoeh/antennapod/test/FeedHandlerTest.java
index 132d40eba..daba95dbf 100644
--- a/tests/src/de/danoeh/antennapod/test/FeedHandlerTest.java
+++ b/tests/src/de/danoeh/antennapod/test/FeedHandlerTest.java
@@ -54,7 +54,7 @@ public class FeedHandlerTest extends AndroidTestCase {
for (int i = 0; i < num_retries; i++) {
InputStream in = null;
- OutputStream out = null;
+ BufferedOutputStream out = null;
try {
in = getInputStream(feed.getDownload_url());
assertNotNull(in);
@@ -65,6 +65,7 @@ public class FeedHandlerTest extends AndroidTestCase {
while ((count = in.read(buffer)) != -1) {
out.write(buffer, 0, count);
}
+ out.flush();
successful = true;
} catch (IOException e) {
e.printStackTrace();
diff --git a/tests/src/de/danoeh/antennapod/test/TestFeeds.java b/tests/src/de/danoeh/antennapod/test/TestFeeds.java
index 576a8ddd9..8b754fea6 100644
--- a/tests/src/de/danoeh/antennapod/test/TestFeeds.java
+++ b/tests/src/de/danoeh/antennapod/test/TestFeeds.java
@@ -3,6 +3,7 @@ package de.danoeh.antennapod.test;
public class TestFeeds {
public static final String[] urls = {
+ "http://savoirsenmultimedia.ens.fr/podcast.php?id=30",
"http://bitlove.org/apollo40/ps3newsroom/feed",
"http://bitlove.org/beapirate/hauptstadtpiraten/feed",
"http://bitlove.org/benni/besondereumstaende/feed",