summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle4
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java4
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java1
-rw-r--r--app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java84
-rw-r--r--app/src/main/AndroidManifest.xml8
-rw-r--r--app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java73
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java11
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java40
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java12
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java19
-rw-r--r--app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java16
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java72
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java17
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java10
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java29
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java4
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java3
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.pngbin0 -> 1497812 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.pngbin0 -> 1412509 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.pngbin0 -> 775545 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.pngbin0 -> 1396778 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.pngbin0 -> 1007155 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.pngbin0 -> 1119328 bytes
-rw-r--r--app/src/main/play/listings/de-DE/graphics/phone-screenshots/4.pngbin495972 -> 0 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/00.pngbin0 -> 1469428 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/01.pngbin0 -> 609387 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/02.pngbin0 -> 784201 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/03.pngbin0 -> 1408825 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/04.pngbin0 -> 902025 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/05.pngbin0 -> 1129419 bytes
-rw-r--r--app/src/main/play/listings/en-US/graphics/phone-screenshots/4.pngbin502083 -> 0 bytes
-rw-r--r--app/src/main/play/listings/es-ES/full-description.txt24
-rw-r--r--app/src/main/play/listings/et/full-description.txt31
-rw-r--r--app/src/main/play/listings/et/short-description.txt1
-rw-r--r--app/src/main/play/listings/et/title.txt1
-rw-r--r--app/src/main/play/listings/fr-FR/full-description.txt10
-rw-r--r--app/src/main/play/listings/fr-FR/graphics/phone-screenshots/4.pngbin511650 -> 0 bytes
-rw-r--r--app/src/main/play/listings/fr-FR/short-description.txt2
-rw-r--r--app/src/main/play/listings/gl-ES/full-description.txt65
-rw-r--r--app/src/main/play/listings/hu-HU/full-description.txt31
-rw-r--r--app/src/main/play/listings/hu-HU/short-description.txt1
-rw-r--r--app/src/main/play/listings/hu-HU/title.txt1
-rw-r--r--app/src/main/play/listings/it-IT/full-description.txt66
-rw-r--r--app/src/main/play/listings/ja-JP/full-description.txt65
-rw-r--r--app/src/main/play/listings/nl-NL/full-description.txt65
-rw-r--r--app/src/main/play/listings/pl-PL/full-description.txt31
-rw-r--r--app/src/main/play/listings/pl-PL/short-description.txt1
-rw-r--r--app/src/main/play/listings/pl-PL/title.txt1
-rw-r--r--app/src/main/play/listings/ru-RU/full-description.txt31
-rw-r--r--app/src/main/play/listings/ru-RU/short-description.txt1
-rw-r--r--app/src/main/play/listings/ru-RU/title.txt1
-rw-r--r--app/src/main/play/listings/sv-SE/full-description.txt53
-rw-r--r--app/src/main/play/listings/zh-CN/full-description.txt65
-rw-r--r--app/src/main/play/release-notes/en-US/default.txt10
-rw-r--r--app/src/main/res/layout/feeditem_fragment.xml87
-rw-r--r--app/src/main/res/layout/opml_selection.xml2
-rw-r--r--app/src/main/res/xml/preferences_playback.xml2
-rw-r--r--app/src/main/res/xml/searchable.xml2
-rw-r--r--artwork/screenshots/generateScreenshots.sh53
-rw-r--r--artwork/screenshots/raw/de-DE/00.png (renamed from app/src/main/play/listings/de-DE/graphics/phone-screenshots/1.png)bin988741 -> 988741 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/01.png (renamed from app/src/main/play/listings/de-DE/graphics/phone-screenshots/2.png)bin995809 -> 995809 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/02.png (renamed from app/src/main/play/listings/de-DE/graphics/phone-screenshots/3.png)bin254192 -> 254192 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/03a.pngbin0 -> 393905 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/03b.pngbin0 -> 395890 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/04.png (renamed from app/src/main/play/listings/de-DE/graphics/phone-screenshots/5.png)bin473491 -> 473491 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/05.png (renamed from app/src/main/play/listings/de-DE/graphics/phone-screenshots/6.png)bin704178 -> 704178 bytes
-rw-r--r--artwork/screenshots/raw/de-DE/texts.txt6
-rw-r--r--artwork/screenshots/raw/en-US/00.png (renamed from app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png)bin952560 -> 952560 bytes
-rw-r--r--artwork/screenshots/raw/en-US/01.png (renamed from app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png)bin97710 -> 97710 bytes
-rw-r--r--artwork/screenshots/raw/en-US/02.png (renamed from app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png)bin250923 -> 250923 bytes
-rw-r--r--artwork/screenshots/raw/en-US/03a.pngbin0 -> 394632 bytes
-rw-r--r--artwork/screenshots/raw/en-US/03b.pngbin0 -> 396605 bytes
-rw-r--r--artwork/screenshots/raw/en-US/04.png (renamed from app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png)bin380087 -> 380087 bytes
-rw-r--r--artwork/screenshots/raw/en-US/05.png (renamed from app/src/main/play/listings/en-US/graphics/phone-screenshots/6.png)bin759276 -> 759276 bytes
-rw-r--r--artwork/screenshots/raw/en-US/texts.txt6
-rw-r--r--artwork/screenshots/raw/fr-FR/00.png (renamed from app/src/main/play/listings/fr-FR/graphics/phone-screenshots/1.png)bin951594 -> 951594 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/01.png (renamed from app/src/main/play/listings/fr-FR/graphics/phone-screenshots/2.png)bin96555 -> 96555 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/02.png (renamed from app/src/main/play/listings/fr-FR/graphics/phone-screenshots/3.png)bin254441 -> 254441 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/03a.pngbin0 -> 396364 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/03b.pngbin0 -> 398409 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/04.png (renamed from app/src/main/play/listings/fr-FR/graphics/phone-screenshots/5.png)bin379047 -> 379047 bytes
-rw-r--r--artwork/screenshots/raw/fr-FR/05.png (renamed from app/src/main/play/listings/fr-FR/graphics/phone-screenshots/6.png)bin726651 -> 726651 bytes
-rw-r--r--artwork/screenshots/templates/phone.pngbin0 -> 452923 bytes
-rw-r--r--artwork/screenshots/templates/suggestions.pngbin0 -> 561417 bytes
-rw-r--r--artwork/screenshots/templates/twophones-a.pngbin0 -> 544210 bytes
-rw-r--r--artwork/screenshots/templates/twophones-b.pngbin0 -> 478127 bytes
-rw-r--r--artwork/screenshots/templates/twophones.pngbin0 -> 3737 bytes
-rw-r--r--core/src/main/assets/shownotes-style.css37
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java22
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java34
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java1
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java17
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java32
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java59
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java49
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java21
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java115
-rw-r--r--core/src/main/res/values-ca/strings.xml6
-rw-r--r--core/src/main/res/values-da/strings.xml89
-rw-r--r--core/src/main/res/values-de/strings.xml30
-rw-r--r--core/src/main/res/values-fr/strings.xml12
-rw-r--r--core/src/main/res/values-gl-rES/strings.xml79
-rw-r--r--core/src/main/res/values-hu/strings.xml1
-rw-r--r--core/src/main/res/values-it/strings.xml92
-rw-r--r--core/src/main/res/values-nl/strings.xml10
-rw-r--r--core/src/main/res/values-pl-rPL/strings.xml2
-rw-r--r--core/src/main/res/values-uk-rUA/strings.xml53
-rw-r--r--core/src/main/res/values-v26/styles.xml6
-rw-r--r--core/src/main/res/values-zh-rCN/strings.xml2
-rw-r--r--core/src/main/res/values/strings.xml11
-rw-r--r--core/src/main/res/values/styles.xml6
121 files changed, 1113 insertions, 879 deletions
diff --git a/app/build.gradle b/app/build.gradle
index 9e862d982..771ef5b95 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -18,8 +18,8 @@ android {
// "1.2.3-SNAPSHOT" -> 1020300
// "1.2.3-RC4" -> 1020304
// "1.2.3" -> 1020395
- versionCode 1080008
- versionName "1.8.0-RC8"
+ versionCode 1080195
+ versionName "1.8.1"
testApplicationId "de.test.antennapod"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
generatedDensities = []
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java b/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java
index df32ed3c0..194d51a3c 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java
@@ -66,8 +66,8 @@ public class SpeedChangeTest {
List<FeedItem> queue = DBReader.getQueue();
PlaybackPreferences.writeMediaPlaying(queue.get(0).getMedia(), PlayerStatus.PAUSED, false);
- UserPreferences.setPlaybackSpeedArray(new String[] {"1.00", "2.00", "3.00"});
- availableSpeeds = UserPreferences.getPlaybackSpeedArray();
+ availableSpeeds = new String[] {"1.00", "2.00", "3.00"};
+ UserPreferences.setPlaybackSpeedArray(availableSpeeds);
EspressoTestUtils.tryKillPlaybackService();
activityRule.launchActivity(new Intent());
diff --git a/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java b/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java
index 3f0bf6967..8f1000d43 100644
--- a/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java
@@ -64,6 +64,7 @@ public class TextOnlyFeedsTest {
openNavDrawer();
onDrawerItem(withText(feed.getTitle())).perform(scrollTo(), click());
onView(withText(feed.getItemAtIndex(0).getTitle())).perform(click());
+ onView(isRoot()).perform(waitForView(withText(R.string.mark_read_no_media_label), 3000));
onView(withText(R.string.mark_read_no_media_label)).perform(click());
onView(isRoot()).perform(waitForView(allOf(withText(R.string.mark_read_no_media_label), not(isDisplayed())), 3000));
}
diff --git a/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java b/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java
index ab049a8e5..59b9ceaca 100644
--- a/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java
@@ -26,7 +26,7 @@ import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
- * Test class for timeline
+ * Test class for timeline.
*/
@SmallTest
public class TimelineTest {
@@ -34,7 +34,7 @@ public class TimelineTest {
private Context context;
@Before
- public void setUp() throws Exception {
+ public void setUp() {
context = InstrumentationRegistry.getTargetContext();
}
@@ -49,128 +49,151 @@ public class TimelineTest {
}
@Test
- public void testProcessShownotesAddTimecodeHHMMSSNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeHHMMSSNoChapters() {
final String timeStr = "10:11:12";
final long time = 3600 * 1000 * 10 + 60 * 1000 * 11 + 12 * 1000;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStr + " here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStr + " here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeHHMMSSMoreThen24HoursNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeHHMMSSMoreThen24HoursNoChapters() {
final String timeStr = "25:00:00";
final long time = 25 * 60 * 60 * 1000;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStr + " here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStr + " here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeHHMMNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeHHMMNoChapters() {
final String timeStr = "10:11";
final long time = 3600 * 1000 * 10 + 60 * 1000 * 11;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStr + " here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStr + " here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeMMSSNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeMMSSNoChapters() {
final String timeStr = "10:11";
final long time = 10 * 60 * 1000 + 11 * 1000;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStr + " here.</p>", 11 * 60 * 1000);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStr + " here.</p>", 11 * 60 * 1000);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeHMMSSNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeHMMSSNoChapters() {
final String timeStr = "2:11:12";
final long time = 2 * 60 * 60 * 1000 + 11 * 60 * 1000 + 12 * 1000;
-
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStr + " here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStr + " here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeMSSNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeMSSNoChapters() {
final String timeStr = "1:12";
final long time = 60 * 1000 + 12 * 1000;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStr + " here.</p>", 2 * 60 * 1000);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStr + " here.</p>", 2 * 60 * 1000);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeMultipleFormatsNoChapters() throws Exception {
+ public void testProcessShownotesAddNoTimecodeDuration() {
+ final String timeStr = "2:11:12";
+ final int time = 2 * 60 * 60 * 1000 + 11 * 60 * 1000 + 12 * 1000;
+ String originalText = "<p> Some test text with a timecode " + timeStr + " here.</p>";
+ Playable p = newTestPlayable(null, originalText, time);
+ Timeline t = new Timeline(context, p);
+ String res = t.processShownotes();
+ Document d = Jsoup.parse(res);
+ assertEquals("Should not parse time codes that equal duration", 0, d.body().getElementsByTag("a").size());
+ }
+
+ @Test
+ public void testProcessShownotesAddTimecodeMultipleFormatsNoChapters() {
final String[] timeStrings = new String[]{ "10:12", "1:10:12" };
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStrings[0] + " here. Hey look another one " + timeStrings[1] + " here!</p>", 2 * 60 * 60 * 1000);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStrings[0] + " here. Hey look another one " + timeStrings[1] + " here!</p>", 2 * 60 * 60 * 1000);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
- checkLinkCorrect(res, new long[]{ 10 * 60 * 1000 + 12 * 1000, 60 * 60 * 1000 + 10 * 60 * 1000 + 12 * 1000 }, timeStrings);
+ checkLinkCorrect(res, new long[]{ 10 * 60 * 1000 + 12 * 1000,
+ 60 * 60 * 1000 + 10 * 60 * 1000 + 12 * 1000 }, timeStrings);
}
@Test
- public void testProcessShownotesAddTimecodeMultipleShortFormatNoChapters() throws Exception {
+ public void testProcessShownotesAddTimecodeMultipleShortFormatNoChapters() {
// One of these timecodes fits as HH:MM and one does not so both should be parsed as MM:SS.
final String[] timeStrings = new String[]{ "10:12", "2:12" };
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode " + timeStrings[0] + " here. Hey look another one " + timeStrings[1] + " here!</p>", 3 * 60 * 60 * 1000);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode "
+ + timeStrings[0] + " here. Hey look another one " + timeStrings[1] + " here!</p>", 3 * 60 * 60 * 1000);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{ 10 * 60 * 1000 + 12 * 1000, 2 * 60 * 1000 + 12 * 1000 }, timeStrings);
}
@Test
- public void testProcessShownotesAddTimecodeParentheses() throws Exception {
+ public void testProcessShownotesAddTimecodeParentheses() {
final String timeStr = "10:11";
final long time = 3600 * 1000 * 10 + 60 * 1000 * 11;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode (" + timeStr + ") here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode ("
+ + timeStr + ") here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeBrackets() throws Exception {
+ public void testProcessShownotesAddTimecodeBrackets() {
final String timeStr = "10:11";
final long time = 3600 * 1000 * 10 + 60 * 1000 * 11;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode [" + timeStr + "] here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode ["
+ + timeStr + "] here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAddTimecodeAngleBrackets() throws Exception {
+ public void testProcessShownotesAddTimecodeAngleBrackets() {
final String timeStr = "10:11";
final long time = 3600 * 1000 * 10 + 60 * 1000 * 11;
- Playable p = newTestPlayable(null, "<p> Some test text with a timecode <" + timeStr + "> here.</p>", Integer.MAX_VALUE);
+ Playable p = newTestPlayable(null, "<p> Some test text with a timecode <"
+ + timeStr + "> here.</p>", Integer.MAX_VALUE);
Timeline t = new Timeline(context, p);
String res = t.processShownotes();
checkLinkCorrect(res, new long[]{time}, new String[]{timeStr});
}
@Test
- public void testProcessShownotesAndInvalidTimecode() throws Exception {
+ public void testProcessShownotesAndInvalidTimecode() {
final String[] timeStrs = new String[] {"2:1", "0:0", "000", "00", "00:000"};
StringBuilder shownotes = new StringBuilder("<p> Some test text with timecodes ");
@@ -197,14 +220,15 @@ public class TimelineTest {
assertTrue(href.endsWith(String.valueOf(timecodes[countedLinks])));
assertEquals(timecodeStr[countedLinks], text);
countedLinks++;
- assertTrue("Contains too many links: " + countedLinks + " > " + timecodes.length, countedLinks <= timecodes.length);
+ assertTrue("Contains too many links: " + countedLinks + " > "
+ + timecodes.length, countedLinks <= timecodes.length);
}
}
assertEquals(timecodes.length, countedLinks);
}
@Test
- public void testIsTimecodeLink() throws Exception {
+ public void testIsTimecodeLink() {
assertFalse(Timeline.isTimecodeLink(null));
assertFalse(Timeline.isTimecodeLink("http://antennapod/timecode/123123"));
assertFalse(Timeline.isTimecodeLink("antennapod://timecode/"));
@@ -215,7 +239,7 @@ public class TimelineTest {
}
@Test
- public void testGetTimecodeLinkTime() throws Exception {
+ public void testGetTimecodeLinkTime() {
assertEquals(-1, Timeline.getTimecodeLinkTime(null));
assertEquals(-1, Timeline.getTimecodeLinkTime("http://timecode/123"));
assertEquals(123, Timeline.getTimecodeLinkTime("antennapod://timecode/123"));
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0fb753b0c..11b539b81 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -33,6 +33,7 @@
android:label="@string/app_name"
android:backupAgent=".core.backup.OpmlBackupAgent"
android:restoreAnyVersion="true"
+ android:theme="@style/Theme.AntennaPod.Splash"
android:usesCleartextTraffic="true"
android:logo="@mipmap/ic_launcher">
@@ -53,12 +54,7 @@
<activity
android:name=".activity.SplashActivity"
android:label="@string/app_name"
- android:configChanges="keyboardHidden|orientation|screenSize"
- android:theme="@style/Theme.AntennaPod.Dark.Splash">
- <!-- android:launchMode="singleTask" removed for #2948, so that
- when app is launched again, the app will go to the last activity users use
- (if the app has been used recently, e.g., last 30 minutes),
- rather than always go to MainActivity (launched by SplashActivity here) -->
+ android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
diff --git a/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java b/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java
index 061ea9ae2..ab4d564df 100644
--- a/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java
+++ b/app/src/main/java/de/danoeh/antennapod/CrashReportWriter.java
@@ -35,7 +35,9 @@ public class CrashReportWriter implements Thread.UncaughtExceptionHandler {
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter(path));
- out.println(getSystemInfo());
+ out.println("[ Crash info ]");
+ out.println("Time: " + new SimpleDateFormat("dd-MM-yyyy HH:mm:ss", Locale.getDefault()).format(new Date()));
+ out.println("AntennaPod version: " + BuildConfig.VERSION_NAME);
out.println();
out.println("[ StackTrace ]");
ex.printStackTrace(out);
@@ -54,7 +56,6 @@ public class CrashReportWriter implements Thread.UncaughtExceptionHandler {
"\nAntennaPod version: " + BuildConfig.VERSION_NAME +
"\nModel: " + Build.MODEL +
"\nDevice: " + Build.DEVICE +
- "\nProduct: " + Build.PRODUCT +
- "\nTime: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()) + "\n";
+ "\nProduct: " + Build.PRODUCT;
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java
index 7f8c14b03..5906cd214 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java
@@ -1,28 +1,25 @@
package de.danoeh.antennapod.activity;
import android.content.Intent;
-import androidx.core.view.ViewCompat;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.Locale;
-import java.util.concurrent.atomic.AtomicBoolean;
-
import de.danoeh.antennapod.core.feed.MediaType;
-import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
+import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.dialog.VariableSpeedDialog;
+import java.text.DecimalFormat;
+import java.util.concurrent.atomic.AtomicBoolean;
+
/**
* Activity for playing audio files.
*/
public class AudioplayerActivity extends MediaplayerInfoActivity {
private static final String TAG = "AudioPlayerActivity";
+ private static final float EPSILON = 0.001f;
private final AtomicBoolean isSetup = new AtomicBoolean(false);
@@ -33,8 +30,8 @@ public class AudioplayerActivity extends MediaplayerInfoActivity {
playExternalMedia(getIntent(), MediaType.AUDIO);
} else if (PlaybackService.isCasting()) {
Intent intent = PlaybackService.getPlayerActivityIntent(this);
- if (intent.getComponent() != null &&
- !intent.getComponent().getClassName().equals(AudioplayerActivity.class.getName())) {
+ if (intent.getComponent() != null
+ && !intent.getComponent().getClassName().equals(AudioplayerActivity.class.getName())) {
saveCurrentFragment();
finish();
startActivity(intent);
@@ -57,7 +54,7 @@ public class AudioplayerActivity extends MediaplayerInfoActivity {
@Override
protected void updatePlaybackSpeedButton() {
- if(butPlaybackSpeed == null) {
+ if (butPlaybackSpeed == null) {
return;
}
if (controller == null) {
@@ -66,14 +63,14 @@ public class AudioplayerActivity extends MediaplayerInfoActivity {
return;
}
updatePlaybackSpeedButtonText();
- ViewCompat.setAlpha(butPlaybackSpeed, controller.canSetPlaybackSpeed() ? 1.0f : 0.5f);
+ butPlaybackSpeed.setAlpha(controller.canSetPlaybackSpeed() ? 1.0f : 0.5f);
butPlaybackSpeed.setVisibility(View.VISIBLE);
txtvPlaybackSpeed.setVisibility(View.VISIBLE);
}
@Override
protected void updatePlaybackSpeedButtonText() {
- if(butPlaybackSpeed == null) {
+ if (butPlaybackSpeed == null) {
return;
}
if (controller == null) {
@@ -82,7 +79,7 @@ public class AudioplayerActivity extends MediaplayerInfoActivity {
return;
}
float speed = 1.0f;
- if(controller.canSetPlaybackSpeed()) {
+ if (controller.canSetPlaybackSpeed()) {
speed = PlaybackSpeedUtils.getCurrentPlaybackSpeed(controller.getMedia());
}
String speedStr = new DecimalFormat("0.00").format(speed);
@@ -91,54 +88,40 @@ public class AudioplayerActivity extends MediaplayerInfoActivity {
@Override
protected void setupGUI() {
- if(isSetup.getAndSet(true)) {
+ if (isSetup.getAndSet(true)) {
return;
}
super.setupGUI();
- if(butCastDisconnect != null) {
+ if (butCastDisconnect != null) {
butCastDisconnect.setVisibility(View.GONE);
}
- if(butPlaybackSpeed != null) {
+ if (butPlaybackSpeed != null) {
butPlaybackSpeed.setOnClickListener(v -> {
if (controller == null) {
return;
}
if (controller.canSetPlaybackSpeed()) {
- String[] availableSpeeds = UserPreferences.getPlaybackSpeedArray();
- DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US);
- format.setDecimalSeparator('.');
+ float[] availableSpeeds = UserPreferences.getPlaybackSpeedArray();
+ float currentSpeed = controller.getCurrentPlaybackSpeedMultiplier();
- float currentSpeedValue = controller.getCurrentPlaybackSpeedMultiplier();
- String currentSpeed = new DecimalFormat("0.00", format).format(currentSpeedValue);
+ int newSpeedIndex = 0;
+ while (newSpeedIndex < availableSpeeds.length
+ && availableSpeeds[newSpeedIndex] < currentSpeed + EPSILON) {
+ newSpeedIndex++;
+ }
- // Provide initial value in case the speed list has changed
- // out from under us
- // and our current speed isn't in the new list
- String newSpeed;
- if (availableSpeeds.length > 0) {
+ float newSpeed;
+ if (availableSpeeds.length == 0) {
+ newSpeed = 1.0f;
+ } else if (newSpeedIndex == availableSpeeds.length) {
newSpeed = availableSpeeds[0];
} else {
- newSpeed = "1.00";
+ newSpeed = availableSpeeds[newSpeedIndex];
}
- for (int i = 0; i < availableSpeeds.length; i++) {
- if (availableSpeeds[i].equals(currentSpeed)) {
- if (i == availableSpeeds.length - 1) {
- newSpeed = availableSpeeds[0];
- } else {
- newSpeed = availableSpeeds[i + 1];
- }
- break;
- }
- }
-
- try {
- PlaybackPreferences.setCurrentlyPlayingTemporaryPlaybackSpeed(Float.parseFloat(newSpeed));
- } catch (NumberFormatException e) {
- // Well this was awkward...
- }
+ PlaybackPreferences.setCurrentlyPlayingTemporaryPlaybackSpeed(newSpeed);
UserPreferences.setPlaybackSpeed(newSpeed);
- controller.setPlaybackSpeed(Float.parseFloat(newSpeed));
+ controller.setPlaybackSpeed(newSpeed);
onPositionObserverUpdate();
} else {
VariableSpeedDialog.showGetPluginDialog(this);
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java
index 666eacfa8..01413bb79 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java
@@ -30,16 +30,17 @@ public class BugReportActivity extends AppCompatActivity {
getSupportActionBar().setDisplayShowHomeEnabled(true);
setContentView(R.layout.bug_report);
- TextView crashDetailsText = findViewById(R.id.crash_report_logs);
+ String crashDetailsText = CrashReportWriter.getSystemInfo() + "\n\n";
+ TextView crashDetailsTextView = findViewById(R.id.crash_report_logs);
try {
File crashFile = CrashReportWriter.getFile();
- String crashReportContent = IOUtils.toString(new FileInputStream(crashFile), Charset.forName("UTF-8"));
- crashDetailsText.setText(crashReportContent);
+ crashDetailsText += IOUtils.toString(new FileInputStream(crashFile), Charset.forName("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
- crashDetailsText.setText("No crash report recorded\n" + CrashReportWriter.getSystemInfo());
+ crashDetailsText += "No crash report recorded";
}
+ crashDetailsTextView.setText(crashDetailsText);
findViewById(R.id.btn_open_bug_tracker).setOnClickListener(v -> {
IntentUtils.openInBrowser(BugReportActivity.this, "https://github.com/AntennaPod/AntennaPod/issues");
@@ -47,7 +48,7 @@ public class BugReportActivity extends AppCompatActivity {
findViewById(R.id.btn_copy_log).setOnClickListener(v -> {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
- ClipData clip = ClipData.newPlainText(getString(R.string.bug_report_title), crashDetailsText.getText());
+ ClipData clip = ClipData.newPlainText(getString(R.string.bug_report_title), crashDetailsTextView.getText());
clipboard.setPrimaryClip(clip);
Snackbar.make(findViewById(android.R.id.content), R.string.copied_to_clipboard, Snackbar.LENGTH_SHORT).show();
});
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
index 3b81dbd0b..75819425c 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
@@ -274,7 +274,7 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem
@Override
boolean loadMediaInfo() {
- if (controller != null) {
+ if (controller != null && controller.getMedia() != null) {
List<Chapter> chapters = controller.getMedia().getChapters();
boolean hasChapters = chapters != null && !chapters.isEmpty();
pageIndicator.setDisabledPage(hasChapters ? -1 : 2);
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
index adb127acb..3621f0b44 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java
@@ -7,11 +7,6 @@ import android.content.Intent;
import android.graphics.LightingColorFilter;
import android.os.Build;
import android.os.Bundle;
-import androidx.annotation.NonNull;
-import androidx.annotation.UiThread;
-import androidx.core.app.NavUtils;
-import androidx.appcompat.app.AlertDialog;
-import androidx.appcompat.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
@@ -24,26 +19,18 @@ import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.TextView;
-
+import androidx.annotation.NonNull;
+import androidx.annotation.UiThread;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.NavUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
-
-import de.danoeh.antennapod.core.event.FeedListUpdateEvent;
-import org.apache.commons.lang3.StringUtils;
-import org.greenrobot.eventbus.EventBus;
-import org.greenrobot.eventbus.Subscribe;
-import org.greenrobot.eventbus.ThreadMode;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.FeedItemlistDescriptionAdapter;
import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator;
import de.danoeh.antennapod.core.event.DownloadEvent;
+import de.danoeh.antennapod.core.event.FeedListUpdateEvent;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedPreferences;
@@ -73,6 +60,16 @@ import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
+import org.apache.commons.lang3.StringUtils;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
/**
* Downloads a feed from a feed URL and parses it. Subclasses can display the
@@ -368,8 +365,6 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
findViewById(R.id.feedDisplay).setVisibility(View.VISIBLE);
this.feed = feed;
this.selectedDownloadUrl = feed.getDownload_url();
- listView.setSelector(android.R.color.transparent);
- listView.setAdapter(new FeedItemlistDescriptionAdapter(this, 0, feed.getItems()));
ImageView cover = findViewById(R.id.imgvCover);
ImageView headerBackground = findViewById(R.id.imgvBackground);
@@ -382,6 +377,9 @@ public class OnlineFeedViewActivity extends AppCompatActivity {
View header = View.inflate(this, R.layout.onlinefeedview_header, null);
listView.addHeaderView(header);
+ listView.setSelector(android.R.color.transparent);
+ listView.setAdapter(new FeedItemlistDescriptionAdapter(this, 0, feed.getItems()));
+
TextView description = header.findViewById(R.id.txtvDescription);
subscribeButton = findViewById(R.id.butSubscribe);
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java
index ad23478d6..d1615b410 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/SearchlistAdapter.java
@@ -9,15 +9,12 @@ import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
-
import com.bumptech.glide.Glide;
-
import com.bumptech.glide.request.RequestOptions;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedComponent;
import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.SearchResult;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
/**
@@ -40,7 +37,7 @@ public class SearchlistAdapter extends BaseAdapter {
}
@Override
- public SearchResult getItem(int position) {
+ public FeedComponent getItem(int position) {
return itemAccess.getItem(position);
}
@@ -52,8 +49,7 @@ public class SearchlistAdapter extends BaseAdapter {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Holder holder;
- SearchResult result = getItem(position);
- FeedComponent component = result.getComponent();
+ FeedComponent component = getItem(position);
// Inflate Layout
if (convertView == null) {
@@ -93,7 +89,7 @@ public class SearchlistAdapter extends BaseAdapter {
} else if (component.getClass() == FeedItem.class) {
final FeedItem item = (FeedItem) component;
holder.title.setText(item.getTitle());
- holder.subtitle.setText(result.getLocation().getDescription());
+ holder.subtitle.setVisibility(View.VISIBLE);
convertView.setAlpha(item.isPlayed() ? 0.5f : 1.0f);
@@ -121,7 +117,7 @@ public class SearchlistAdapter extends BaseAdapter {
public interface ItemAccess {
int getCount();
- SearchResult getItem(int position);
+ FeedComponent getItem(int position);
}
}
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java
index 970a1cfae..47eab7d05 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/ItemActionButton.java
@@ -34,7 +34,7 @@ public abstract class ItemActionButton {
}
@NonNull
- public static ItemActionButton forItem(@NonNull FeedItem item, boolean isInQueue) {
+ public static ItemActionButton forItem(@NonNull FeedItem item, boolean isInQueue, boolean allowStream) {
final FeedMedia media = item.getMedia();
if (media == null) {
return new MarkAsPlayedActionButton(item);
@@ -45,9 +45,10 @@ public abstract class ItemActionButton {
return new PlayActionButton(item);
} else if (isDownloadingMedia) {
return new CancelDownloadActionButton(item);
- } else if (UserPreferences.streamOverDownload()) {
+ } else if (UserPreferences.streamOverDownload() && allowStream) {
return new StreamActionButton(item);
- } else if (MobileDownloadHelper.userAllowedMobileDownloads() || !MobileDownloadHelper.userChoseAddToQueue() || isInQueue) {
+ } else if (MobileDownloadHelper.userAllowedMobileDownloads()
+ || !MobileDownloadHelper.userChoseAddToQueue() || isInQueue) {
return new DownloadActionButton(item, isInQueue);
} else {
return new AddToQueueActionButton(item);
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java
index 9db257503..4e3068e7b 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/PlaybackControlsDialog.java
@@ -10,7 +10,6 @@ import android.widget.CheckBox;
import android.widget.SeekBar;
import android.widget.TextView;
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
-import java.util.Locale;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.feed.util.PlaybackSpeedUtils;
import de.danoeh.antennapod.core.preferences.UserPreferences;
@@ -102,13 +101,12 @@ public class PlaybackControlsDialog extends DialogFragment {
if (controller != null && controller.canSetPlaybackSpeed()) {
float playbackSpeed = (progress + 10) / 20.0f;
controller.setPlaybackSpeed(playbackSpeed);
- String speedPref = String.format(Locale.US, "%.2f", playbackSpeed);
PlaybackPreferences.setCurrentlyPlayingTemporaryPlaybackSpeed(playbackSpeed);
if (isPlayingVideo) {
- UserPreferences.setVideoPlaybackSpeed(speedPref);
+ UserPreferences.setVideoPlaybackSpeed(playbackSpeed);
} else {
- UserPreferences.setPlaybackSpeed(speedPref);
+ UserPreferences.setPlaybackSpeed(playbackSpeed);
}
String speedStr = String.format("%.2fx", playbackSpeed);
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java
index ef624ebe6..3a6ba183f 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/VariableSpeedDialog.java
@@ -6,8 +6,12 @@ import androidx.appcompat.app.AlertDialog;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.UserPreferences;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Locale;
public class VariableSpeedDialog {
@@ -43,15 +47,22 @@ public class VariableSpeedDialog {
}
private static void showSpeedSelectorDialog(final Context context) {
+ DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US);
+ format.setDecimalSeparator('.');
+ DecimalFormat speedFormat = new DecimalFormat("0.00", format);
+
final String[] speedValues = context.getResources().getStringArray(
R.array.playback_speed_values);
// According to Java spec these get initialized to false on creation
final boolean[] speedChecked = new boolean[speedValues.length];
- // Build the "isChecked" array so that multiChoice dialog is
- // populated correctly
- List<String> selectedSpeedList = Arrays.asList(UserPreferences
- .getPlaybackSpeedArray());
+ // Build the "isChecked" array so that multiChoice dialog is populated correctly
+ List<String> selectedSpeedList = new ArrayList<>();
+ float[] selectedSpeeds = UserPreferences.getPlaybackSpeedArray();
+ for (float speed : selectedSpeeds) {
+ selectedSpeedList.add(speedFormat.format(speed));
+ }
+
for (int i = 0; i < speedValues.length; i++) {
speedChecked[i] = selectedSpeedList.contains(speedValues[i]);
}
diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java
index 79ccd9532..ee318c706 100644
--- a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java
+++ b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java
@@ -1,6 +1,8 @@
package de.danoeh.antennapod.discovery;
import android.content.Context;
+import android.util.Log;
+
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.ClientConfig;
import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
@@ -21,6 +23,7 @@ import java.util.List;
import java.util.Locale;
public class ItunesTopListLoader {
+ private static final String TAG = "ITunesTopListLoader";
private final Context context;
public ItunesTopListLoader(Context context) {
@@ -29,11 +32,11 @@ public class ItunesTopListLoader {
public Single<List<PodcastSearchResult>> loadToplist(int limit) {
return Single.create((SingleOnSubscribe<List<PodcastSearchResult>>) emitter -> {
- String lang = Locale.getDefault().getLanguage();
+ String country = Locale.getDefault().getCountry();
OkHttpClient client = AntennapodHttpClient.getHttpClient();
String feedString;
try {
- feedString = getTopListFeed(client, lang, limit);
+ feedString = getTopListFeed(client, country, limit);
} catch (IOException e) {
feedString = getTopListFeed(client, "us", limit);
}
@@ -74,11 +77,12 @@ public class ItunesTopListLoader {
.observeOn(AndroidSchedulers.mainThread());
}
- private String getTopListFeed(OkHttpClient client, String language, int limit) throws IOException {
- String url = "https://itunes.apple.com/%s/rss/toppodcasts/limit="+limit+"/explicit=true/json";
+ private String getTopListFeed(OkHttpClient client, String country, int limit) throws IOException {
+ String url = "https://itunes.apple.com/%s/rss/toppodcasts/limit=" + limit + "/explicit=true/json";
+ Log.d(TAG, "Feed URL " + String.format(url, country));
Request.Builder httpReq = new Request.Builder()
.header("User-Agent", ClientConfig.USER_AGENT)
- .url(String.format(url, language));
+ .url(String.format(url, country));
try (Response response = client.newCall(httpReq.build()).execute()) {
if (response.isSuccessful()) {
@@ -95,7 +99,7 @@ public class ItunesTopListLoader {
JSONArray entries = feed.getJSONArray("entry");
List<PodcastSearchResult> results = new ArrayList<>();
- for (int i=0; i < entries.length(); i++) {
+ for (int i = 0; i < entries.length(); i++) {
JSONObject json = entries.getJSONObject(i);
results.add(PodcastSearchResult.fromItunesToplist(json));
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
index e7d22652e..9a353e05a 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java
@@ -169,7 +169,7 @@ public abstract class EpisodesListFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem);
- sv.setQueryHint(getString(R.string.search_hint));
+ sv.setQueryHint(getString(R.string.search_label));
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
index 5d3c811f5..16787a1c5 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java
@@ -179,7 +179,7 @@ public class FeedItemlistFragment extends ListFragment {
MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem);
- sv.setQueryHint(getString(R.string.search_hint));
+ sv.setQueryHint(getString(R.string.search_label));
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
index 63160bb2c..8ff71e114 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
@@ -117,8 +117,7 @@ public class FeedSettingsFragment extends PreferenceFragmentCompat {
private void setupPlaybackSpeedPreference() {
ListPreference feedPlaybackSpeedPreference = findPreference(PREF_FEED_PLAYBACK_SPEED);
- String[] speeds = UserPreferences.getPlaybackSpeedArray();
-
+ final String[] speeds = getResources().getStringArray(R.array.playback_speed_values);
String[] values = new String[speeds.length + 1];
values[0] = SPEED_FORMAT.format(SPEED_USE_GLOBAL);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
index e1202704a..5caaa592f 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java
@@ -94,8 +94,12 @@ public class ItemFragment extends Fragment {
private ImageView imgvCover;
private ProgressBar progbarDownload;
private ProgressBar progbarLoading;
- private Button butAction1;
- private Button butAction2;
+ private TextView butAction1Text;
+ private TextView butAction2Text;
+ private ImageView butAction1Icon;
+ private ImageView butAction2Icon;
+ private View butAction1;
+ private View butAction2;
private Disposable disposable;
private PlaybackController controller;
@@ -141,12 +145,16 @@ public class ItemFragment extends Fragment {
progbarLoading = layout.findViewById(R.id.progbarLoading);
butAction1 = layout.findViewById(R.id.butAction1);
butAction2 = layout.findViewById(R.id.butAction2);
+ butAction1Icon = layout.findViewById(R.id.butAction1Icon);
+ butAction2Icon = layout.findViewById(R.id.butAction2Icon);
+ butAction1Text = layout.findViewById(R.id.butAction1Text);
+ butAction2Text = layout.findViewById(R.id.butAction2Text);
butAction1.setOnClickListener(v -> {
if (item == null) {
return;
}
- ItemActionButton actionButton = ItemActionButton.forItem(item, item.isTagged(FeedItem.TAG_QUEUE));
+ ItemActionButton actionButton = ItemActionButton.forItem(item, item.isTagged(FeedItem.TAG_QUEUE), false);
actionButton.onClick(getActivity());
FeedMedia media = item.getMedia();
@@ -267,22 +275,22 @@ public class ItemFragment extends Fragment {
}
FeedMedia media = item.getMedia();
- @AttrRes int butAction1Icon = 0;
- @StringRes int butAction1Text = 0;
- @AttrRes int butAction2Icon = 0;
- @StringRes int butAction2Text = 0;
+ @AttrRes int butAction1IconRes = 0;
+ @StringRes int butAction1TextRes = 0;
+ @AttrRes int butAction2IconRes = 0;
+ @StringRes int butAction2TextRes = 0;
if (media == null) {
if (!item.isPlayed()) {
- butAction1Icon = R.attr.navigation_accept;
+ butAction1IconRes = R.attr.navigation_accept;
if (item.hasMedia()) {
- butAction1Text = R.string.mark_read_label;
+ butAction1TextRes = R.string.mark_read_label;
} else {
- butAction1Text = R.string.mark_read_no_media_label;
+ butAction1TextRes = R.string.mark_read_no_media_label;
}
}
if (item.getLink() != null) {
- butAction2Icon = R.attr.location_web_site;
- butAction2Text = R.string.visit_website_label;
+ butAction2IconRes = R.attr.location_web_site;
+ butAction2TextRes = R.string.visit_website_label;
}
} else {
if (media.getDuration() > 0) {
@@ -290,40 +298,40 @@ public class ItemFragment extends Fragment {
}
boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media);
if (!media.isDownloaded()) {
- butAction2Icon = R.attr.action_stream;
- butAction2Text = R.string.stream_label;
+ butAction2IconRes = R.attr.action_stream;
+ butAction2TextRes = R.string.stream_label;
} else {
- butAction2Icon = R.attr.content_discard;
- butAction2Text = R.string.delete_label;
+ butAction2IconRes = R.attr.content_discard;
+ butAction2TextRes = R.string.delete_label;
}
if (isDownloading) {
- butAction1Icon = R.attr.navigation_cancel;
- butAction1Text = R.string.cancel_label;
+ butAction1IconRes = R.attr.navigation_cancel;
+ butAction1TextRes = R.string.cancel_label;
} else if (media.isDownloaded()) {
- butAction1Icon = R.attr.av_play;
- butAction1Text = R.string.play_label;
+ butAction1IconRes = R.attr.av_play;
+ butAction1TextRes = R.string.play_label;
} else {
- butAction1Icon = R.attr.av_download;
- butAction1Text = R.string.download_label;
+ butAction1IconRes = R.attr.av_download;
+ butAction1TextRes = R.string.download_label;
}
}
- if (butAction1Icon != 0 && butAction1Text != 0) {
- butAction1.setText(butAction1Text);
- butAction1.setTransformationMethod(null);
+ if (butAction1IconRes != 0 && butAction1TextRes != 0) {
+ butAction1Text.setText(butAction1TextRes);
+ butAction1Text.setTransformationMethod(null);
TypedValue typedValue = new TypedValue();
- getContext().getTheme().resolveAttribute(butAction1Icon, typedValue, true);
- butAction1.setCompoundDrawablesWithIntrinsicBounds(typedValue.resourceId, 0, 0, 0);
+ getContext().getTheme().resolveAttribute(butAction1IconRes, typedValue, true);
+ butAction1Icon.setImageResource(typedValue.resourceId);
butAction1.setVisibility(View.VISIBLE);
} else {
butAction1.setVisibility(View.INVISIBLE);
}
- if (butAction2Icon != 0 && butAction2Text != 0) {
- butAction2.setText(butAction2Text);
- butAction2.setTransformationMethod(null);
+ if (butAction2IconRes != 0 && butAction2TextRes != 0) {
+ butAction2Text.setText(butAction2TextRes);
+ butAction2Text.setTransformationMethod(null);
TypedValue typedValue = new TypedValue();
- getContext().getTheme().resolveAttribute(butAction2Icon, typedValue, true);
- butAction2.setCompoundDrawablesWithIntrinsicBounds(typedValue.resourceId, 0, 0, 0);
+ getContext().getTheme().resolveAttribute(butAction2IconRes, typedValue, true);
+ butAction2Icon.setImageResource(typedValue.resourceId);
butAction2.setVisibility(View.VISIBLE);
} else {
butAction2.setVisibility(View.INVISIBLE);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
index b9e961535..51d1c7ba9 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java
@@ -16,6 +16,7 @@ import androidx.viewpager.widget.ViewPager;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.CastEnabledActivity;
import de.danoeh.antennapod.activity.MainActivity;
+import de.danoeh.antennapod.core.event.FeedItemEvent;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.util.Flavors;
@@ -24,6 +25,9 @@ import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
/**
* Displays information about a list of FeedItems.
@@ -104,12 +108,14 @@ public class ItemPagerFragment extends Fragment {
}
});
+ EventBus.getDefault().register(this);
return layout;
}
@Override
public void onDestroyView() {
super.onDestroyView();
+ EventBus.getDefault().unregister(this);
if (disposable != null) {
disposable.dispose();
}
@@ -162,6 +168,17 @@ public class ItemPagerFragment extends Fragment {
}
}
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onEventMainThread(FeedItemEvent event) {
+ for (FeedItem item : event.items) {
+ if (this.item != null && this.item.getId() == item.getId()) {
+ this.item = item;
+ getActivity().invalidateOptionsMenu();
+ return;
+ }
+ }
+ }
+
private void openPodcast() {
Fragment fragment = FeedItemlistFragment.newInstance(item.getFeedId());
((MainActivity) getActivity()).loadChildFragment(fragment);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
index ffe874a8c..48df5ab32 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -288,7 +288,7 @@ public class QueueFragment extends Fragment {
MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem);
- sv.setQueryHint(getString(R.string.search_hint));
+ sv.setQueryHint(getString(R.string.search_label));
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
@@ -471,15 +471,19 @@ public class QueueFragment extends Fragment {
return super.onContextItemSelected(item);
}
+ int position = FeedItemUtil.indexOfItemWithId(queue, selectedItem.getId());
+ if (position < 0) {
+ Log.i(TAG, "Selected item no longer exist, ignoring selection");
+ return super.onContextItemSelected(item);
+ }
+
switch(item.getItemId()) {
case R.id.move_to_top_item:
- int position = FeedItemUtil.indexOfItemWithId(queue, selectedItem.getId());
queue.add(0, queue.remove(position));
recyclerAdapter.notifyItemMoved(position, 0);
DBWriter.moveQueueItemToTop(selectedItem.getId(), true);
return true;
case R.id.move_to_bottom_item:
- position = FeedItemUtil.indexOfItemWithId(queue, selectedItem.getId());
queue.add(queue.size()-1, queue.remove(position));
recyclerAdapter.notifyItemMoved(position, queue.size()-1);
DBWriter.moveQueueItemToBottom(selectedItem.getId(), true);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
index 6befa7e18..c640554ff 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java
@@ -25,7 +25,6 @@ import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent;
import de.danoeh.antennapod.core.feed.Feed;
import de.danoeh.antennapod.core.feed.FeedComponent;
import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.SearchResult;
import de.danoeh.antennapod.core.storage.FeedSearcher;
import de.danoeh.antennapod.view.EmptyViewHandler;
import io.reactivex.Observable;
@@ -47,9 +46,8 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
private static final String ARG_FEED = "feed";
private SearchlistAdapter searchAdapter;
- private List<SearchResult> searchResults = new ArrayList<>();
+ private List<FeedComponent> searchResults = new ArrayList<>();
private Disposable disposable;
- private ListView listView;
private ProgressBar progressBar;
private EmptyViewHandler emptyViewHandler;
@@ -57,7 +55,9 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
* Create a new SearchFragment that searches all feeds.
*/
public static SearchFragment newInstance(String query) {
- if (query == null) query = "";
+ if (query == null) {
+ query = "";
+ }
SearchFragment fragment = new SearchFragment();
Bundle args = new Bundle();
args.putString(ARG_QUERY, query);
@@ -103,7 +103,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(R.string.search_label);
View layout = inflater.inflate(R.layout.search_fragment, container, false);
- listView = layout.findViewById(R.id.listview);
+ ListView listView = layout.findViewById(R.id.listview);
progressBar = layout.findViewById(R.id.progressBar);
searchAdapter = new SearchlistAdapter(getActivity(), itemAccess);
listView.setAdapter(searchAdapter);
@@ -125,15 +125,12 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- SearchResult result = (SearchResult) listView.getAdapter().getItem(position);
- FeedComponent comp = result.getComponent();
+ FeedComponent comp = searchAdapter.getItem(position);
if (comp.getClass() == Feed.class) {
((MainActivity) getActivity()).loadFeedFragmentById(comp.getId(), null);
- } else {
- if (comp.getClass() == FeedItem.class) {
- FeedItem item = (FeedItem) comp;
- ((MainActivity) getActivity()).loadChildFragment(ItemPagerFragment.newInstance(item.getId()));
- }
+ } else if (comp.getClass() == FeedItem.class) {
+ FeedItem item = (FeedItem) comp;
+ ((MainActivity) getActivity()).loadChildFragment(ItemPagerFragment.newInstance(item.getId()));
}
}
@@ -143,7 +140,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
MenuItem item = menu.add(Menu.NONE, R.id.search_item, Menu.NONE, R.string.search_label);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
final SearchView sv = new SearchView(getActivity());
- sv.setQueryHint(getString(R.string.search_hint));
+ sv.setQueryHint(getString(R.string.search_label));
sv.setQuery(getArguments().getString(ARG_QUERY), false);
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
@@ -167,7 +164,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
search();
}
- private void onSearchResults(List<SearchResult> results) {
+ private void onSearchResults(List<FeedComponent> results) {
progressBar.setVisibility(View.GONE);
searchResults = results;
searchAdapter.notifyDataSetChanged();
@@ -182,7 +179,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
}
@Override
- public SearchResult getItem(int position) {
+ public FeedComponent getItem(int position) {
if (0 <= position && position < searchResults.size()) {
return searchResults.get(position);
} else {
@@ -204,7 +201,7 @@ public class SearchFragment extends Fragment implements AdapterView.OnItemClickL
}
@NonNull
- private List<SearchResult> performSearch() {
+ private List<FeedComponent> performSearch() {
Bundle args = getArguments();
String query = args.getString(ARG_QUERY);
long feed = args.getLong(ARG_FEED);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
index af3649ed0..d0f6772ea 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java
@@ -304,12 +304,12 @@ public class SubscriptionFragment extends Fragment {
dialog.createNewDialog().show();
}
- @Subscribe
+ @Subscribe(threadMode = ThreadMode.MAIN)
public void onFeedListChanged(FeedListUpdateEvent event) {
loadSubscriptions();
}
- @Subscribe
+ @Subscribe(threadMode = ThreadMode.MAIN)
public void onUnreadItemsChanged(UnreadItemsUpdateEvent event) {
loadSubscriptions();
}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
index 9a09d55b0..8036a7506 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java
@@ -216,8 +216,8 @@ public class ImportExportPreferencesFragment extends PreferenceFragmentCompat {
private void showExportErrorDialog(final Throwable error) {
progressDialog.dismiss();
- final AlertDialog.Builder alert = new AlertDialog.Builder(getContext())
- .setNeutralButton(android.R.string.ok, (dialog, which) -> dialog.dismiss());
+ final AlertDialog.Builder alert = new AlertDialog.Builder(getContext());
+ alert.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.dismiss());
alert.setTitle(R.string.export_error_label);
alert.setMessage(error.getMessage());
alert.show();
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java
index 4686f0303..e791efe98 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceUpgrader.java
@@ -84,5 +84,8 @@ public class PreferenceUpgrader {
UserPreferences.setEnqueueLocation(enqueueLocation);
}
}
+ if (oldVersion < 1080100) {
+ prefs.edit().putString(UserPreferences.PREF_VIDEO_BEHAVIOR, "pip").apply();
+ }
}
}
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png
new file mode 100644
index 000000000..9fe34a151
--- /dev/null
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png
new file mode 100644
index 000000000..57528fe56
--- /dev/null
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png
new file mode 100644
index 000000000..a7b6a35f2
--- /dev/null
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png
new file mode 100644
index 000000000..014920d27
--- /dev/null
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png
new file mode 100644
index 000000000..88d5c89e2
--- /dev/null
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png
new file mode 100644
index 000000000..2708df498
--- /dev/null
+++ b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/4.png b/app/src/main/play/listings/de-DE/graphics/phone-screenshots/4.png
deleted file mode 100644
index dcd040008..000000000
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/4.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png
new file mode 100644
index 000000000..2ab1d595a
--- /dev/null
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/00.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png
new file mode 100644
index 000000000..e435dfd80
--- /dev/null
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/01.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png
new file mode 100644
index 000000000..eba177029
--- /dev/null
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/02.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png
new file mode 100644
index 000000000..586b10752
--- /dev/null
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/03.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png
new file mode 100644
index 000000000..dd13094c6
--- /dev/null
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/04.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png
new file mode 100644
index 000000000..2684f2a8b
--- /dev/null
+++ b/app/src/main/play/listings/en-US/graphics/phone-screenshots/05.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png b/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png
deleted file mode 100644
index 8eb6c2bad..000000000
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/4.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/play/listings/es-ES/full-description.txt b/app/src/main/play/listings/es-ES/full-description.txt
index b98757cee..b15dd1762 100644
--- a/app/src/main/play/listings/es-ES/full-description.txt
+++ b/app/src/main/play/listings/es-ES/full-description.txt
@@ -1,31 +1,31 @@
-AntennaPod is un gestor y reproductor de podcast que te da acceso instantáneo a millones de podcast gratuitos y de pago, desde podcasters independientes a grandes estaciones como la BBC, NPR y CNN. Agrega, importa y exporta las fuentes de manera sencilla usando el listado de iTunes, archivos OPML o las URL de tipo RSS. Ahorra esfuerzo, batería y datos con los controles de descarga y de borrado de episodios (basado en favoritos y ajustes de tiempo).
-Descarga, escucha en stream, o añade la cola episodios y disfrútalos como quieras con velocidad de reproducción ajustable, soporte para capítulos y temporizador de sueño.
-Ahorra esuferzo, batería y consumo de datos con los potentes controles de automatización para descarga (especifica a qué horas y desde qué redes Wi-Fi) y borrado de episodios antiguos (basado en tus preferencias).
+AntennaPod es un gestor y reproductor de podcasts que te da acceso instantáneo a millones de podcast gratuitos y de pago; desde podcasters independientes a grandes estaciones como la BBC, NPR y CNN. Agrega, importa y exporta las fuentes de manera sencilla usando el listado de iTunes, archivos OPML o las URL de tipo RSS. Ahorra esfuerzo, batería y datos con los controles de descarga y de borrado de episodios (basado en favoritos y ajustes de tiempo).
+Descarga, escucha en stream o añade a la cola episodios y disfrútalos como quieras con velocidad de reproducción ajustable, soporte para capítulos y temporizador de sueño.
+Ahorra esfuerzo, batería y consumo de datos con los potentes controles de automatización para descarga (especifica la hora y desde qué redes Wi-Fi) y el borrado de episodios antiguos (basado en tus preferencias).
Creado por entusiastas del pódcast, AntennaPod es libre en todos los sentidos: código abierto, gratuito y sin publicidad.
<b>Importar, organizar y reproducir</b>
-• Administra la reproducción desde cualquier parte: control en pantalla de inicio, notificación del sistema y controles de auricular y bluetooth
+• Administra la reproducción desde cualquier parte: control en la pantalla de inicio, las notificaciones del sistema y los controles de auriculares y bluetooth
• Añade e importa fuentes mediante los directorios de iTunes y gPodder.net, archivos OPML y enlaces RSS o Atom
-• Disfruta escuchando a tu manera con velocidad de reproducción ajustable, soporte de capítulos (MP3, VorbisComment y Podlove), recordatorio del punto de reproducción y el temporizador de sueño avanzado (agita para restablecer, bajar el volumen y disminuir la velocidad de reproducción)
+• Disfruta escuchando a tu manera, con velocidad de reproducción ajustable, soporte de capítulos (MP3, VorbisComment y Podlove), marcador del punto de reproducción y temporizador de sueño avanzado (agita para restablecer, bajar el volumen y disminuir la velocidad de reproducción)
• Accede a fuentes y episodios protegidos con contraseña
<b>Seguir, valorar y compartir </b>
• Haz un seguimiento de lo mejor de lo mejor marcando episodios como favoritos
• Busca ese episodio en el historial o busca por título y notas
-• Comparte episodios y fuentes a través de las avanzadas redes sociales y opciones de correo electrónico, los servicios de gPodder.net y la exportación OPML
+• Comparte episodios y fuentes a través de las opciones avanzadas de redes sociales y correo electrónico, los servicios de gPodder.net y exportando a OPML
<b>Control del sistema</b>
-• Controla las descargas automáticas: elige las fuentes, excluye las redes móviles, selecciona redes wifi específicas, o solo cuando el teléfono se esté cargando y establece horarios o intervalos
-• Gestiona el almacenamiento configurando la cantidad de episodios en caché, configura borrado inteligente y eligiendo tu ubicación favorita
+• Controla las descargas automáticas: elige las fuentes, excluye las redes móviles, selecciona redes WiFi específicas, cuando el teléfono se cargue, establece horarios o intervalos
+• Gestiona el almacenamiento configurando la cantidad de episodios en caché, borrado inteligente y eligiendo tu ubicación favorita
• Adáptate a tu entorno usando el tema claro u oscuro
-• Haz una copia de seguridad de tus suscripciones con la integración de gPodder.net y la exportación OPML
+• Haz una copia de seguridad de tus suscripciones con la integración de gPodder.net y exportando a OPML
<b>¡Únete a la comunidad AntennaPod!</b>
-AntennaPod está en continuo desarrollo por voluntarios. ¡Tú también puedes contribuir, con tu código o con tus comentarios!
+AntennaPod es desarrollado por voluntarios. ¡Tú también puedes contribuir, con tu código o con tus comentarios!
-GitHub es el sitio que debes visitar para solicitar características nuevas, reportar fallos y contribuir con código:
+Visita GitHub para solicitar características nuevas, reportar fallos y contribuir con código:
https://www.github.com/AntennaPod/AntennaPod
-Para ayudar con las traducciones en Transifex:
+Ayuda con las traducciones en Transifex:
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/et/full-description.txt b/app/src/main/play/listings/et/full-description.txt
new file mode 100644
index 000000000..446d16ded
--- /dev/null
+++ b/app/src/main/play/listings/et/full-description.txt
@@ -0,0 +1,31 @@
+AntennaPod on taskuhäälingu haldur ja esitaja, millega saad kohese ligipääsu miljonitele tasuta ja tasulistele saadetele nii ise- kui suurtegijatelt nagu BBC, NPR ja CNN. Lisa, impordi ja ekspordi nende voogusid ilma muredeta kasutades iTunes'i taskuhäälingute andmebaasi, OPML fail või lihtsalt RSS URL-e.
+Laadi alla, voogedasta või lisa kuulamise järjekorda saateid ning naudi neid täpselt nii, nagu sina tahad, kasutades muudetavat taasesituse kiirust, peatükkide tuge ja unetaimerit.
+Säästa pingutuselt, aku kestuselt ja mobiilse andmeside kasutuselt võimekate automatiseerimise vahenditega saadete allalaadimiseks (määra millal, mis sagedusega ja millistest WiFi võrkudes) ning kustutamiseks (vastavalt sinu lemmikutele ja viivituse sätetele).
+
+Kuna AntennaPod on tehtud taskuhäälingu entusiastide poolt, on AntennaPod vaba selle sõna igas tähenduses: vaba lähtekoodiga, tasuta ja ilma mingi reklaamita.
+
+<b>Impordi, korrasta ja kuula</b>
+• Halda esitust kust tahes: avaekraani vidina abil, süsteemi teate kaudu või kõrvaklappide või bluetoothi nuppude abil
+• Lisa ja impordi voogusid iTunesi ja gPodder.net kaustadest, OPML failidest ja RSS või Atom linkide kaudu
+• Naudi kuulamist just sinu moodi tänu muudetavale esituskiirusele, peatükkide toele, meeldejäetavale asukohale ning unetaimerile (raputamine, valjuse vähendamine)
+• Ligipääs parooliga kaitstud voogudele ja saadetele
+
+<b>Talleta ja jaga, et avaldada tunnustust</b>
+• Talleta parimatest parimaid märkides saateid lemmikuteks
+• Leia see üks saade otsides esitatute ajaloost pealkirjade või kirjelduste järgi
+• Jaga saateid ja voogusid suurepäraste sotsiaalmeedia ja e-posti valikute abil, gPodder.neti kaudu ja OPML failide abil
+
+<b>Oma kontrolli</b>
+• Võta kontroll automaatse allalaadimise üle enda kätte: vali vood, keela mobiilivõrk, vali õiged WiFi võrgud, ütle, kui telefon peaks allalaadimise ajal laadima või määra millal ja kui tihti saateid alla laadida
+• Halda ruumikasutust, määrates mitu saadet varuks hoida, luba nutikas kustutamine ja failide eelistatud asukoha määramine
+• Kohanda keskonnaga heleda ja tumeda kujundusega
+• Varunda oma tellimused gPodder.net keskkonda ja OPML faili eksportides
+
+<b>Liitu AntennaPodi kogukonnaga!</b>
+AntennaPod on vabatahtlike poolt aktiivselt arendamisel. Ka sina võid anda oma osa, kirjutades koodi või andes tagasisidet!
+
+GitHub on koht, kus esitada uute võimaluste soove, vearaporteid ja kooditäiendusi:
+https://www.github.com/AntennaPod/AntennaPod
+
+Transifex on koht, kus saab aidata tõlgetega:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/et/short-description.txt b/app/src/main/play/listings/et/short-description.txt
new file mode 100644
index 000000000..59ff4ac69
--- /dev/null
+++ b/app/src/main/play/listings/et/short-description.txt
@@ -0,0 +1 @@
+Lihtne, paindlik ja avatud lähtekoodiga taskuhäälingu haldur ja esitaja \ No newline at end of file
diff --git a/app/src/main/play/listings/et/title.txt b/app/src/main/play/listings/et/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/et/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/fr-FR/full-description.txt b/app/src/main/play/listings/fr-FR/full-description.txt
index fe8734be4..7e763023b 100644
--- a/app/src/main/play/listings/fr-FR/full-description.txt
+++ b/app/src/main/play/listings/fr-FR/full-description.txt
@@ -12,20 +12,20 @@ Conçu par des fans de podcast, AntennaPod est gratuit, open source et sans publ
<b>Suivez, partagez et appréciez</b>
• Enregistrez les meilleurs épisodes en tant que favoris
-• Retrouvez un épisode à partir de l'historique de lecture ou en recherchant les noms et commentaires des épisodes
+• Retrouvez un épisode à partir de l'historique de lecture ou en recherchant les titres et commentaires des épisodes
• Partagez vos épisodes et flux sur les réseaux sociaux, par email, sur gPodder.net ou en les exportant au format OPML
<b>Contrôlez</b>
-• Prenez le contrôle en automatisant vos téléchargements : flux spécifiques, restriction de la connexion mobile, réseaux WIFI autorisés, seulement pendant la recharge, fréquence de mise à jour
+• Prenez le contrôle en automatisant vos téléchargements : flux spécifiques, restriction de la connexion mobile, réseaux WIFI autorisés, seulement pendant la recharge, fréquence ou heure de mise à jour
• Gérez l'espace de stockage en réglant le nombre d'épisodes à garder, quand les supprimer et où les enregistrer
-• Choisissez le thème de l'interface
+• Adaptez l'interface selon vos préférences avec le thème clair ou sombre
• Sauvegardez vos abonnements avec gPodder.net ou des exports OPML
<b>Rejoignez la communauté d'AntennaPod !</b>
AntennaPod est développé activement par des volontaires. Vous pouvez aussi contribuer avec du code, des traductions ou des commentaires !
-Allez sur GitHub pour demander de nouvelles options, signaler des bugs ou pour contribuer au développement :
+Rendez-vous sur GitHub pour demander de nouvelles options, signaler des bugs ou pour contribuer au développement :
https://www.github.com/AntennaPod/AntennaPod
-Allez sur Transifex pour aider la traduction :
+Rendez-vous sur Transifex pour aider la traduction :
https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/4.png b/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/4.png
deleted file mode 100644
index 5fa129b40..000000000
--- a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/4.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/short-description.txt b/app/src/main/play/listings/fr-FR/short-description.txt
index 7143385e1..3214e7933 100644
--- a/app/src/main/play/listings/fr-FR/short-description.txt
+++ b/app/src/main/play/listings/fr-FR/short-description.txt
@@ -1 +1 @@
-Un lecteur de podcast facile à utiliser et flexible \ No newline at end of file
+Un lecteur de podcast facile et souple à utiliser \ No newline at end of file
diff --git a/app/src/main/play/listings/gl-ES/full-description.txt b/app/src/main/play/listings/gl-ES/full-description.txt
index 2acaf65f7..bf9471ad2 100644
--- a/app/src/main/play/listings/gl-ES/full-description.txt
+++ b/app/src/main/play/listings/gl-ES/full-description.txt
@@ -1,42 +1,31 @@
-AntenaPod é un xestor de podcast e reprodutor que lle da acceso a millóns de podcast tanto gratuítos como de pagamento, desde podcasters independentes a grandes productores como BBC, NPR e CNN. Engada, importe e exporte as súas fontes de xeito doado utilizando a base de datos de iTunes, ficheiros OPML ou URLs RSS. Aforre traballo, enerxía da batería e datos móbiles co sistema automatizado de control das descargas de episodios (indicando horario, intervalos e redes WiFi) e borrando episodios (baseado nos seus favoritos e axustes de retardo).<br>
-O máis importante: Descarga, reproduce ou pon en cola os episodios e desfrútaos do xeito en que máis che conveña axustando a velocidade de reprodución, o soporte de capítulos e o apagado programable.
-
-Escrito por namorados dos podcast, AntennaPod é gratuíto e libre: open source, sen custos, sen publicidade.
-
-<b>Características:</b><br>
-IMPORTAR, ORGANIZAR E REPRODUCIR<br>
-&#8226; Engada e importe fontes a través dos directorios de iTunes e gPodder.net, ficheiros OPML e RSS ou ligazóns Atom<br>
-&#8226; Xestione as opcións de reprodución desde calquer lugar: widget na pantalla de inicio, barra de notificacións e tamén desde os controis de auriculares e bluetooth<br>
-&#8226; Goce escoitando ao seu xeito coa velocidade de reprodución axustable, soporte de capítulos (MP3, VorbisComment e Podlove), recordo da posición de reprodución e apagado configurable (axitar para reiniciar, baixar volume e diminuir velocidade de reprodución)<br>
-&#8226; Acceso protexido con contrasinal a episodios e fontes<br>
-&#8226; Benefíciese das fontes paxinadas (www.podlove.org/paged-feeds)
-
-SIGA, COMPARTA E VALORE <br>
-&#8226; Garde o melloriño de cada casa marcando episodios como favoritos<br>
-&#8226; Atope ese episodio especial no historial de reprodución ou buscando (títulos e notas do episodio)<br>
-&#8226; Comparta episodios e fontes a través das opcións de redes sociais e correro electrónico, os servizos de gPodder.net e exportando a OPML<br>
-
-CONTROL DO SISTEMA <br>
-&#8226; Tome control sobre as descargas automáticas: escolla fontes, exclúa redes móbiles, redes WIFI concretas, requerir que o móbil esté a cargar e horarios e intervalos<br>
-&#8226; Xestione o almacenamento establecendo o volume almacenado de episodios, borrado intelixente (baseándose nos favoritos e situación de reprodución) e selecionando a localización preferida<br>
-&#8226; Utilice AntennaPod no seu idioma (EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH, GL)<br>
-&#8226; Adápteo a contorna utilizando o decorado claro ou oscuro<br>
-&#8226; Respalde as súas suscricións coa integración en gPodder.net e exportando a OPML
-
-<b>Únase a comunidade AntennaPod!</b><br>
+AntennaPod é un xestor de podcast e reprodutor que che permite acceder a millóns de contidos gratuítos e de pagamento, desde produtores independentes a grandes empresas de contidos como BBC, NPR ou CNN. Engade, importa e exporta as súas fontes sen complicacións utilizando a base de datos de iTunes, ficheiros OPML ou URL de RSS.
+Descarga, difunde ou pon e cola episodios e desfrutaos do xeito que prefiras, con velocidade de reprodución axustable, soporte de capítulos e apagado programable.
+De xeito doado, aforrando batería e datos móbiles e con ferramentas potentes para a automatización das descargas (indicando horarios, intervalos e redes WiFi) e borrado de ficheiros (baseado nos favoritos e axustes temporais).
+
+Feita por entusiastas do podcast, AntennaPod é libre en todos os sentidos da palabra: código aberto, gratuíto e sen anuncios.
+
+<b>Importar, organizar e reproducir</b>
+• Controlar a reprodución desde calquera lugar: widget na pantalla, sistema de notificacións e controis de auriculares e por bluetooth.
+• Engade e importa fontes vía directorios de iTunes e gPodder.net, ficheiros OPML e ligazóns RSS ou Atom.
+• Desfruta escoitando ao teu xeito, con velocidade axustable, soporte de capítulos, lembra a posición de reprodución e programa a hora de apagado (axita para restablecer, volume máis baixo)
+• Acceso protexido con contrasinal para fontes e episodios
+
+<b>Leva un rexistro, comparte e promociona</b>
+• Mantén un rexistro dos mellores episodios marcándoos como favoritos
+• Atopa un episodio no histórico de reprodución ou buscando por títulos e notas do episodio
+• Comparte episodios e fontes a través da web social, correo electrónico, o servizo gPodder.net e exportándoos como OPML.
+
+<b>Xestiona o sistema</b>
+• Toma o control das descargas automáticas: escolle fontes, exclúe redes móbiles, redes Wifi específicas, que o móbil esté cargando ou establece horarios para a descarga
+• Xestiona o almacenaxe establecendo a número de episodios gardados, borrado intelixente e escollendo a localización preferida.
+• Adáptase ao teu entorno utilizando os decorados claro ou escuro
+• Respalda as túas subscricións con gPodder.net e a exportación OPML
+
+<b>Participa na comunidade AntennaPod!</b>
AntennaPod está baixo continuo desenvolvemento grazas a voluntarios. Vostede tamén pode contribuir, con código ou con comentarios!
-En GitHub pode solicitar novas características, informar de erros e contribuir ao código:<br>
+Podes solicitar novas características utilizando GitHub, así como informe de fallos ou contribuír ao código:
https://www.github.com/AntennaPod/AntennaPod
-No noso Google Group pode compartir ideas, momentos favoritos dos podcast e agradecer o traballo dos voluntarios:<br>
-https://groups.google.com/forum/#!forum/antennapod
-
-Ten algunha pregunta ou quere facernos algún comentario?
-https://twitter.com/@AntennaPod
-
-Para axudar na tradución vaia a Transifex:<br>
-https://www.transifex.com/antennapod/antennapod
-
-Mire o noso programa Beta de Probas para ter os últimos avances:<br>
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+As traducións fanse en Transifex:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/hu-HU/full-description.txt b/app/src/main/play/listings/hu-HU/full-description.txt
new file mode 100644
index 000000000..708ad5b1e
--- /dev/null
+++ b/app/src/main/play/listings/hu-HU/full-description.txt
@@ -0,0 +1,31 @@
+Az AntennaPod egy podcastkezelő és -lejátszó, amely azonnali hozzáférést nyújt ingyenes és fizetős podcastok millióihoz: a független podcastkészítőktől kezdve a nagy kiadókig, mint a BBC, NPR és a CNN. Adjon hozzá, importáljon és exportáljon csatornákat az iTunes podcast adatbázis, OPML fájlok vagy egyszerű RSS URL-ek segítségével.
+Töltsön le, hallgassa élőben vagy állítsa sorba az epizódokat, és elvezze azokat, ahogy szeretné az állítható lejátszási sebességgel, a fejezettámogatással és az alvási időzítővel.
+Spóroljon az idejével, az akkumulátorral és a mobiladat-keretével a sokoldalú automatizálási beállításokkal, melyek letöltik az epizódokat (adjon meg időket, intervallumokat és WiFi-hálózatokat), és törlik is azokat (a kedvencei vagy a késleltetési beállításai alapján).
+
+Podcast-rajongók készítésében, az AntennaPod teljesen szabad, nyílt forráskódú, ingyenes, és hirdetésektől mentes.
+
+<b>Importálás, rendszerezés és lejátszás</b>
+• Lejátszás kezelése bárhonnan: a kezdőképernyőről, fülhallgatóról és bluetoothos vezérlőkről
+• Csatornák hozzáadása és importálása iTunesból, gPodder.net könyvtárakból, OPML-fájlokból és RSS/Atom hivatkozásokból
+• Hallgasson saját ízlése szerint az állítható lejátszási sebességgel, fejezettámogatással, megjegyzett lejátszási pozícióval és egy nagy tudású alvási időzítővel (rázás az újraindításhoz, hangerő csökkentéshez)
+• Jelszóval védett csatornák és epizódok elérése
+
+<b>Kövesse, ossza meg és élvezze</b>
+• Kövesse a legjobbak legjobbját azáltal, hogy kedvencként jelöli meg az epizódokat
+• Találja meg azt a bizonyos epizódot a lejátszási előzményekkel vagy kereséssel (cím és adásjegyzetek alapján)
+• Osszon meg epizódokat és csatornákat továbbfejlesztett közösségi média és e-mail lehetőségekkel, a gPodder.net szolgáltatásokkal és OPML exportálás segítségével
+
+<b>Vezérelje a rendszert</b>
+• Vegye át az irányítást az automatikus letöltés felett: válasszon csatornákat, mellőzze a mobilhálózatokat, válasszon specifikus WiFi-hálózatokat, követelje meg a telefon töltését és adjon meg időpontokat vagy időszakokat
+• Kezelje a tárhelyet a tárolandó epizódok számának megadásával, az okos törléssel és az előnyben részesített hely megadásával
+• Alkalmazkodjon a környezethez a világos és sötét téma használatával
+• Mentse el a feliratkozásait a gPodder.net integrációval és az OPML exporttal
+
+<b>Csatlakozzon az AntennaPod közösséghez!</b>
+Az AntennaPodot aktívan fejlesztik az önkéntesek. Ön is közreműködhet: kóddal vagy megjegyzésekkel!
+
+A GitHub a funkciókérések, hibajelentések és a kódbeküldés helye:
+https://www.github.com/AntennaPod/AntennaPod
+
+A Transifexen segíthet a fordításokban:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/hu-HU/short-description.txt b/app/src/main/play/listings/hu-HU/short-description.txt
new file mode 100644
index 000000000..0e9612141
--- /dev/null
+++ b/app/src/main/play/listings/hu-HU/short-description.txt
@@ -0,0 +1 @@
+Könnyen használható, rugalmas és nyílt forráskódú podcastkezelő és -lejátszó \ No newline at end of file
diff --git a/app/src/main/play/listings/hu-HU/title.txt b/app/src/main/play/listings/hu-HU/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/hu-HU/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/it-IT/full-description.txt b/app/src/main/play/listings/it-IT/full-description.txt
index 978ae2d46..047a2278b 100644
--- a/app/src/main/play/listings/it-IT/full-description.txt
+++ b/app/src/main/play/listings/it-IT/full-description.txt
@@ -1,43 +1,31 @@
-AntennaPod è un riproduttore e gestore di podcast che ti da accesso immediato a milioni di podcast gratuiti e a pagamento, dai podcaster indipendenti alle più grandi emittenti come BBC, NPR e CNN. Aggiungi, importa e esporta in modo semplice usando il database di podcast di iTunes, un file OPML o i semplici URL RSS. Risparmia fatica, batteria e dati con il potente controllo automatizzato per il download di episodi (orari specifici, intervalli e reti WiFi) e dell'eliminazione degli episodi (basata sui preferiti e le impostazioni di eliminazione personali).<br>
-Ancora più importante: scarica, ascolta in streaming o metti in coda gli episodi e goditeli quando e come vuoi grazie alla velocità di riproduzione personalizzabile, al supporto per i capitoli e al timer di spegnimento. Puoi anche ringraziare i creatori di contenuti grazie all'integrazione con Flattr.
-
-Creato da amanti dei podcast, AntennaPod è libero in tutti i sensi: open source, gratis, senza pubblicità.
-
-<b>Funzioni:</b><br>
-IMPORTA, ORGANIZZA E RIPRODUCI<br>
-&#8226; Aggiungi e importa feed via iTunes, gPodder.net, file OPML e link RSS o Atom<br>
-&#8226; Gestisci la riproduzione da dove vuoi: widget sulla schermata Home, notifiche di sistema e controlli sugli auricolari e via bluetooth. <br>
-&#8226; Divertiti ad ascoltare nel modo che preferisci grazie alla velocità di riproduzione variabile, il supporto ai capitoli (MP3, VorbisComment e Podlove), la memorizzazione dell'avanzamento di riproduzione e un timer di spegnimento avanzato (scuoti per resettare, volume basso e rallentamento della velocità)<br>
-&#8226; Accedi a feed e episodi protetti da password<br>
-&#8226; Sfrutta i vantaggi dei paged feeds (www.podlove.org/paged-feeds)
-
-TIENI TRACCIA, CONDIVIDI & APPREZZA<br>
-&#8226; Tieni traccia del meglio del meglio segnando gli episodi come Preferiti<br>
-&#8226; Trova l'episodio specifico grazie alla cronologia di riproduzione o al sistema di ricerca (titoli e note dell'episodio)<br>
-&#8226; Condividi gli episodi e i feed tramite le avanzate opzioni social ed email, il servizio gPodder.net e l'esportazione in OPML<br>
-&#8226; Supporta i creatori di contenuti tramite l'integrazione con Flattr e il flattring automatico
-
-CONTROLLA IL SISTEMA<br>
-&#8226; Prendi il controllo grazie ai download automatici: scegli i feed, escludi le reti mobili, seleziona reti WiFi specifiche, richiedi che il telefono sia in carica e imposta tempi e intervalli di aggiornamento<br>
-&#8226; Gestisci lo spazio impostando l'occupazione massima, la cancellazione intelligente (basata sui Preferiti e sullo stato di riproduzione) e selezionando la posizione che preferisci <br>
-&#8226; Usa AntennaPod nella tua lingua (EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH)<br>
-&#8226; Adattati all'ambiente in cui ti trovi con i temi Chiaro e Scuro.<br>
-&#8226; Salva le sottoscrizioni grazie all'integrazione con gPodder.net e l'esportazione OPML
-
-<b>Entra nella community di AntennaPod!</b><br>
+AntennaPod è un riproduttore e gestore di podcast che permette l'accesso immediato a milioni di podcast gratuiti e a pagamento, dai podcaster indipendenti alle più grandi emittenti come BBC, NPR e CNN. Aggiungi, importa e esporta in modo semplice usando il database di podcast di iTunes, un file OPML o i semplici URL RSS.
+Scarica, ascolta in streaming o accoda gli episodi e goditeli come preferisci grazie alla velocità di riproduzione modificabile, al supporto ai capitoli e al timer di spegnimento.
+Risparmia fatica, carica della batteria e dati con i potenti controlli automatizzati per il download degli episodi (orari specifici, intervalli di tempo e reti WiFi selezionate) e l'eliminazione degli episodi (gestione dei preferiti e i tempi di cancellazione).
+
+Creato da appassionati di podcast, AntennaPod è libero in tutti i sensi: open source, gratuito e senza pubblicità.
+
+<b>Importa, organizza e riproduci</b>
+• Gestisci la riproduzione ovunque: widget nella schermata home, tendina delle notifiche, cuffie e controlli bluetooth.
+• Aggiungi e importa le sottoscrizioni tramite iTunes e gPodder, o anche tramite file OPML, collegamenti RSS o Atom.
+• Goditi l'ascolto nel modo che preferisci grazie alla velocità di riproduzione modificabile, il supporto ai capitoli, la memorizzazione dello stato di riproduzione e un timer di spegnimento avanzato (scuoti per riavviare o riduci il volume)
+• Accedi ai feed e agli episodi protetti tramite utente e password
+
+<b>Tieni traccia, condividi & ricerca</b>
+• Tieni traccia dei migliori episodi di sempre segnandoli come preferiti
+• Trova proprio l'episodio che cercavi grazie alla ricerca nella cronologia, nei titoli e nelle note degli episodi
+• Condividi gli episodi e i feed tramite opzioni avanzate di condivisione via social o email, i servizi di gPodder.net o l'esportazione OPML.
+
+<b>Controlla il sistema</b>
+• Gestisci il download automatico: puoi selezionare i feed, escludere le reti mobili, utilizzare reti WiFi specifiche, impostare il download solo se in carica e scaricare in orari o intervalli selezionati.
+• Gestisci lo spazio impostando l'occupazione massima degli episodi, la cancellazione intelligente e il percorso in cui scaricare i file.
+• Adattati alle tue preferenze grazie ai temi chiaro o scuro.
+• Effettua il backup delle sottoscrizioni grazie all'integrazione di gPodder.net e all'esportazione in OPML
+
+<b>Partecipa alla community di AntennaPod!</b>
AntennaPod è sviluppato da volontari. Anche tu puoi contribuire, con il codice o con dei commenti!
-GitHub è il posto nel quale fare richieste, segnalare bug e contribuire allo sviluppo:<br>
+GitHub è la piattaforma usata per le richieste di funzionalità, le segnalazioni di bug o i contributi al codice:
https://www.github.com/AntennaPod/AntennaPod
-Il nostro gruppo Google è il luogo ideale dove condividere le idee, stimolare momenti di podcasting e ringraziare tutti i volontari:<br>
-https://groups.google.com/forum/#!forum/antennapod
-
-Hai una domanda o vuoi darci un feedback?
-https://twitter.com/@AntennaPod
-
-Transifex è il posto dove puoi contribuire alla traduzione di AntennaPod:<br>
-https://www.transifex.com/antennapod/antennapod
-
-Dai un'occhiata al nostro programma di Beta Testing per avere accesso in anticipo alle nuove features:<br>
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+Transifex è dove puoi contribuire alla traduzione:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/ja-JP/full-description.txt b/app/src/main/play/listings/ja-JP/full-description.txt
index 4dc50f57e..52bb64c46 100644
--- a/app/src/main/play/listings/ja-JP/full-description.txt
+++ b/app/src/main/play/listings/ja-JP/full-description.txt
@@ -1,42 +1,31 @@
-AntennaPodは、独自のポッドキャスターから、BBC、NPR、CNNなどの大規模な放送まで、数百万の無料や有料ポッドキャストに瞬時にアクセスすることができる、ポッドキャストマネージャーおよびプレーヤーです。フィードは手間のかからないiTunesのPodcastのデータベース、OPMLファイルや簡単なRSSのURLを使用して追加、インポート、エクスポートします。エピソードのダウンロード (時間、間隔およびWiFiネットワークを指定) とエピソードの削除 (お気に入りと遅延設定に基づいて) をするために強力な自動コントロールで、手間、バッテリ消費、モバイルデータ使用量を節約します。<br>
-しかし最も重要なこと: エピソードをダウンロード、ストリーム再生、またはキューに入れて、そして再生速度の調整、チャプターのサポート、スリープタイマーで好きなように楽しんでください。
-
-ポッドキャスト愛好家が作成した AntennaPod はすべての意味でフリー自由です: オープンソース、コスト不要、広告はありません。
-
-<b>すべての機能:</b><br>
-インポート、整理、再生<br>
-&#8226; iTunesや、gPodder.netディレクトリ、OPMLファイル、RSSまたはAtom経由でフィードを追加およびインポートします<br>
-&#8226; 様々な場所で再生を管理します: ホーム画面ウィジェット、システム通知、イヤホン、Bluetoothコントロール<br>
-&#8226; 再生速度の調整、チャプターのサポート (MP3、VorbisCommentとPodlove)、再生位置の保存、高度なスリープタイマー (シェイクしてリセット、音量を小さく、再生速度を遅く) で、お好みの聞き方でお楽しみください<br>
-&#8226; アクセスパスワードで保護されたフィードとエピソード<br>
-&#8226; ページフィードをご利用ください (www.podlove.org/paged-feeds)
-
-記録、共有 & 感謝<br>
-&#8226; エピソードをお気に入りとしてマークして、一番の中の一番を保存してください<br>
-&#8226; 再生履歴から、または検索 (タイトルとショーノート) して目的のエピソードを見つけてください<br>
-&#8226; 高度なソーシャルメディアとメールオプション、gPodder.netサービス、OPMLエクスポートからエピソードやフィードを共有してください<br>
-
-システムのコントロール
-&#8226; 自動ダウンロードの制御: フィードを選択、モバイルネットワークを除外、特定のWiFiネットワークを選択、電話を充電する必要、時間や間隔を設定<br>
-&#8226; キャッシュされるエピソードの量の設定、スマート削除 (お気に入りやプレイ状況に基づいて) と、お好みの場所を選択して、ストレージを管理します<br>
-&#8226; AntennaPod をあなたの言語でご利用ください (EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH)<br>
-&#8226; ライトとダーク テーマを使用して環境に適応します<br>
-&#8226; gPodder.net統合とOPMLのエクスポートで、購読をバックアップします
-
-<b>AntennaPod のコミュニティに参加してください!</b><br>
+AntennaPod は、独立したポッドキャスターから BBC、NPR、CNN などの大規模な出版社まで、数百万の無料および有料のポッドキャストに即座にアクセスできるポッドキャストマネージャーおよびプレーヤーです。 iTunes ポッドキャストデータベース、OPML ファイル、または簡単な RSS URL を使用して、フィードを簡単に追加、インポート、エクスポートできます。
+エピソードをダウンロード、ストリーミング、またはキューに入れて、調整可能な再生速度、チャプターサポート、スリープタイマーで、お好きな方法でお楽しみください。
+エピソードのダウンロード (時間、間隔、WiFi ネットワークの指定) とエピソードの削除 (お気に入りと遅延設定に基づく) の強力な自動化コントロールにより、労力、バッテリー消費量、モバイルデータ通信使用量を節約できます。
+
+ポッドキャスト愛好家によって作られた AntennaPod は、オープンソース、無料、広告なしなど、あらゆる意味でフリーです。
+
+<b>インポート、整理、再生</b>
+• どこからでも再生を管理: ホームスクリーンウィジェット、システム通知、イヤホン、Bluetooth コントロール
+• iTunes および gPodder.net ディレクトリー、OPMLファイル、RSS または Atom リンク経由でフィードを追加およびインポートします
+• 調整可能な再生速度、チャプターサポート、記憶した再生位置、高度なスリープタイマー (シェイクしてリセット、音量を下げる) でお好みの方法でお楽しみください
+• パスワードで保護されたフィードとエピソードのアクセス
+
+<b>追跡、共有、感謝</b>
+• エピソードをお気に入りとしてマークすることにより、ベストを追跡します
+• 再生履歴から、またはタイトルとショーノートを検索して、エピソードを見つけます
+• 高度なソーシャルメディア、メールオプション、gPodder.net サービス、OPML エクスポートを介してエピソードとフィードを共有します
+
+<b>システムをコントロール</b>
+• 自動ダウンロードの制御: フィードの選択、モバイル通信ネットワークの除外、特定の WiFi ネットワークの選択、充電が必要な時間または間隔の設定
+• キャッシュされるエピソードの量を設定、スマート削除、お好みの場所を選択してストレージを管理します
+• ライトとダークのテーマを使用して環境に適応します
+• gPodder.net 統合と OPML エクスポートを使用して購読をバックアップします
+
+<b>AntennaPod コミュニティに参加しましょう!</b>
AntennaPod はボランティアによって活発に開発中です。コードやコメントで、あなたもも貢献することができます!
-GitHubは、機能のリクエスト、バグの報告、コードの貢献のための場所です:<br>
+GitHub は、機能のリクエスト、バグ報告、およびコードの貢献のための場所です:
https://www.github.com/AntennaPod/AntennaPod
-私たちのGoogleグループは、あなたのアイデア、お気に入りのポッドキャスティングモーメント、感謝を、すべてのボランティアと共有するための場所です:<br>
-https://groups.google.com/forum/#!forum/antennapod
-
-質問や、私たちへのフィードバックがありませんか?
-https://twitter.com/@AntennaPod
-
-Transifexは翻訳を支援するための場所です:<br>
-https://www.transifex.com/antennapod/antennapod
-
-私たちのベータテストプログラムをチェックして、最新機能を最初に入手してください:<br>
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+Transifex は翻訳を支援する場所です:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/nl-NL/full-description.txt b/app/src/main/play/listings/nl-NL/full-description.txt
index 518745f17..851f0b34e 100644
--- a/app/src/main/play/listings/nl-NL/full-description.txt
+++ b/app/src/main/play/listings/nl-NL/full-description.txt
@@ -1,42 +1,31 @@
-Met AntennaPod speel en beheer je al je podcasts en krijg je directe toegang tot duizenden gratis en betaalde podcasts - van onafhankelijke makers tot grote merken zoals BBC, CNN en NPO. Via de iTunes-databank, OPML-bestanden en simpele RSS-linkjes voeg je deze podcasts gemakkelijk toe. Dankzij simpele maar slimme automatische controle van het downloaden en verwijderen van afleveringen bespaar je de accu, hoef je je favoriete podcast niet meer handmatig te volgen en verbruik je geen onnodige mobiele gegevens.<br>
-Maar belangrijker: download, stream of voeg afleveringen toe aan de wachtrij en geniet ervan! Je hebt beschikking over afspeelsnelheden, hoofdstukondersteuning en een slaaptimer.
-
-Gemaakt door podcast-enthousiastelingen, AntennaPod is vrij in de breedste zin van het woord: vrij van advertenties, open source en gratis.
-
-<b>Alle features:</b><br>
-IMPORTEREN, ORGANISEREN, AFSPELEN<br>
-&#8226; Voeg feeds toe via iTunes and gPodder.net database, OPML-bestanden and RSS of Atom linkjes<br>
-&#8226; Beheer het afspelen overal: met een homescreen widget, in je Android meldingen en de knoppen op je koptelefoon en bluetooth-apparaat<br>
-&#8226; Bepaal zelf hoe je luistert met aanpasbare afspeelsnelheden, ondersteuning van hoofdstukken (MP3, VorbisComment en Podlove), afspeelpositie voor elke aflevering en een handige 'slaap timer' (schudden om te resetten, volume langzaam zachter en herstel naar normale afspeelsnelheid)<br>
-&#8226; Toegang tot wachtwoord-beveiligde podcasts en afleveringen<br>
-&#8226; Doe je voordeel met 'paged feeds' (www.podlove.org/paged-feeds)
-
-DEEL & WAARDEER<br>
-&#8226; Hou het beste van het beste bij door afleveringen als favoriet te markeren<br>
-&#8226; Vindt die ene aflevering terug in de afspeelgeschiedenis of door te zoeken (in titels, shownotes en makers)<br>
-&#8226; Deel podcasts en afleveringen via uitgebreide opties voor sociale media, WhatsApp, email en gPodder.net<br>
-
-HOUD DE CONTROLE
-&#8226; Beheer automatische downloads: kies je podcasts, sluit mobiele netwerken uit, selecteer specifieke WiFi-verbindingen, eis dat de telefoon wordt opgeladen and bepaal tijden of intervals<br>
-&#8226; Controleer geheugengebruik: stel een maximumaantal gedownloade afleveringen in, laat afleveringen automatisch verwijderen (maar sluit je favorieten en niet-afgespeelde afleveringen uit) en selecteer zelf je opslaglocatie<br>
-&#8226; Gebruik AntennaPod in jouw taal: Nederlands! (Of in het Engels, Zweeds, Frans, Duits, Spaans, enz)<br>
-&#8226; Voel je een kameleon: kies voor een licht of donker uiterlijk<br>
-&#8226; Back-up je abonnementen via gPodder.net en geëxporteerde OPML-bestanden
-
-<b>Doe mee met de AntennaPod gemeenschap!</b><br>
+Met AntennaPod speel en beheer je al je podcasts en krijg je directe toegang tot duizenden gratis en betaalde podcasts - van onafhankelijke makers tot grote merken zoals BBC, CNN en NPO. Via de iTunes-database, OPML-bestanden en simpele RSS-linkjes voeg je deze podcasts makkelijk toe.
+Download, stream of voeg afleveringen toe aan de wachtrij. Met instelbare afspeelsnelheden, hoofdstukondersteuning en een slaaptimer luister je podcasts op de manier die jij prettig vindt.
+Spaar moeite, je batterij en je databundel met slimme automatische controle op het downloaden nieuwe afleveringen. En AntennaPod verwijdert ook je oude afleveringen, afhankelijk van je instellingen.
+
+AntennaPod is gemaakt door podcast-enthousiastelingen. Het team van vrijwilligers bieden je het gratis aan - vrij van advertenties en open source.
+
+<b>Importeren, organiseren en afspelen</b>
+• Beheer het afspelen op elke manier: met een homescreen widget, in je Android meldingen en via de knoppen op je koptelefoon en bluetooth-apparaat
+• Voeg podcasts toe via iTunes- en gPodder.net-databases, OPML-bestanden en RSS- of Atom-links
+• Bepaal zelf hoe je luistert met aanpasbare afspeelsnelheden, ondersteuning van hoofdstukken, opslag van afspeelpositie voor elke aflevering en een handige 'slaap timer' (schudden om te resetten, volume langzaam zachter)
+• Toegang tot wachtwoord-beveiligde podcasts en afleveringen
+
+<b>Hou bij, deel en waardeer</b>
+• Hou het beste van het beste bij door afleveringen als favoriet te markeren
+• Vindt die ene aflevering terug via de afspeelgeschiedenis of door te zoeken in titels en shownotes
+• Deel podcasts en afleveringen via uitgebreide opties voor sociale media, email, gPodder.net of een OPML-bestand
+
+<b>Hou de controle</b>
+• Beheer automatische downloads: kies je podcasts, sluit mobiele netwerken uit, selecteer specifieke WiFi-verbindingen, vereis dat de telefoon wordt opgeladen en bepaal tijden of intervals
+• Controleer geheugengebruik: stel een maximumaantal gedownloade afleveringen in, laat afleveringen automatisch verwijderen en selecteer zelf je opslaglocatie
+• Voel je een kameleon: kies voor een licht of donker uiterlijk
+• Back-up je abonnementen via gPodder.net en geëxporteerde OPML-bestanden
+
+<b>Doe mee met de AntennaPod-gemeenschap!</b>
AntennaPod wordt regelmatig geüpdatet door vrijwilligers. En jij kan ook helpen, met code of commentaar!
-GitHub is de beste plek voor foutmeldingen, verzoekjes voor nieuwe functies en bijdragen aan de code:<br>
+Je kunt op GitHub terecht voor foutmeldingen, verzoekjes voor nieuwe functies en bijdragen aan de code:
https://www.github.com/AntennaPod/AntennaPod
-Onze Google Group is de beste plek om je ideeën, favoriete podcast-momenten en waardering naar alle vrijwilligers te delen:<br>
-https://groups.google.com/forum/#!forum/antennapod
-
-Heb je een vraag of wil je feedback geven?
-https://twitter.com/@AntennaPod
-
-Transifex is de beste plek om te helpen met vertalen:<br>
-https://www.transifex.com/antennapod/antennapod
-
-Check het Beta Testprogramma om de laatste features als eerst te krijgen:<br>
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+Transifex is de beste plek om te helpen met vertalen:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/pl-PL/full-description.txt b/app/src/main/play/listings/pl-PL/full-description.txt
new file mode 100644
index 000000000..8c7236fac
--- /dev/null
+++ b/app/src/main/play/listings/pl-PL/full-description.txt
@@ -0,0 +1,31 @@
+AntennaPod to menedżer i odtwarzacz podcastów, który pozwala na natychmiastowy dostęp do milionów darmowych i płatnych podcastów, od niezależnych twórców po wielkie wydawnictwa takie jak BBC, NPR i CNN. Bezproblemowo dodawaj, importuj i eksportuj ich kanały używając bazy danych podcastów iTunes, plików OPML lub zwykłych adresów RSS.
+Pobieraj, streamuj lub dodawaj do kolejki odcinki i korzystaj z nich jak chcesz, przy pomocy konfigurowalnej prędkości odtwarzania, wsparcia rozdziałów i wyłącznika czasowego.
+Oszczędź czas, baterię i ilość pobranych danych komórkowych dzięki wielu możliwościom automatyzacji pobierania odcinków (określanie czasu, interwałów i sieci WiFi) i kasowania odcinków (na podstawie twoich ulubionych i ustawień opóźnienia)
+
+Stworzony przez miłośników podcastów, AntennaPod jest darmowy w każdym znaczeniu tego słowa: otwarty kod, bez opłat, bez reklam.
+
+<b>Importuj, organizuj i odtwarzaj</b>
+• Zarządzaj odtwarzaniem z dowolnego miejsca: widgetu na ekranie głównym, powiadomienia systemowego, pilota na kablu słuchawkowym, urządzeń bluetooth
+Dodawaj i importuj kanały z iTunes i gPodder.net, plików OPML oraz z adresów RSS lub Atom
+• Ciesz się słuchaniem podcastów po swojemu, dzięki konfigurowalnej prędkości odtwarzania, obsłudze rozdziałów, zapamiętywanej pozycji odtwarzania i zaawansowanemu wyłącznikowi czasowemu (potrząśnij aby zresetować, zmniejszanie głośności)
+• Wsparcie dla kanałów i odcinków zabezpieczonych hasłem
+
+<b>Śledź i dziel się</b>
+• Zachowaj najlepsze z najlepszych oznaczając odcinki jako ulubione
+• Odnajdź ten jedyny odcinek dzięki historii odtwarzania lub przez wyszukiwanie po tytułach i opisach
+• Udostępniaj odcinki i kanały dzięki zaawansowanym opcjom mediów społecznościowych i email, usłudze gPodder.net oraz eksporcie OPML
+
+ <b>Kontroluj</b>
+• Kontroluj automatyczne pobieranie: wybierz kanały, oszczędzaj dane komórkowe, wybierz określone sieci WiFi, pobieraj tylko podczas ładowania, ustaw czas dnia lub częstotliwość
+• Kontroluj użycie pamięci poprzez ustawienie ilości zachowywanych odcinków, inteligentne kasowanie oraz wybranie domyślnej lokalizacji
+• Dostosuj wygląd dzięki motywom: ciemny, jasny, czarny (dla ekranów AMOLED)
+• Twórz kopie zapasowe swoich subskrypcji dzięki integracji gPodder.net lub eksportuj je do pliku OPML
+
+<b>Dołącz do społeczności AntennaPod</b>
+AntennaPod jest ciągle rozwijane przez ochotników. Ty też możesz pomóc, kodem lub komentarzem!
+
+Chcesz zgłosić błąd lub brakuje Ci jakiejś funkcji, a może programujesz? Odwiedź nasz GitHub:
+https://www.github.com/AntennaPod/AntennaPod
+
+Chcesz pomóc tłumaczyć AntennaPod - możesz to zrobić na Transifex:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/pl-PL/short-description.txt b/app/src/main/play/listings/pl-PL/short-description.txt
new file mode 100644
index 000000000..5f2cdff77
--- /dev/null
+++ b/app/src/main/play/listings/pl-PL/short-description.txt
@@ -0,0 +1 @@
+Łatwy w użyciu, konfigurowalny opensource'owy menedżer i odtwarzacz podcastów \ No newline at end of file
diff --git a/app/src/main/play/listings/pl-PL/title.txt b/app/src/main/play/listings/pl-PL/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/pl-PL/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/ru-RU/full-description.txt b/app/src/main/play/listings/ru-RU/full-description.txt
new file mode 100644
index 000000000..d3d8f2d8f
--- /dev/null
+++ b/app/src/main/play/listings/ru-RU/full-description.txt
@@ -0,0 +1,31 @@
+AntennaPod — менеджер и проигрыватель подкастов, который обеспечит Вас мгновенным доступом к миллионам бесплатных и платных подкастов, как от независимых подкастеров, так и крупных издательских домов. С лёгкостью добавляйте, импортируйте и экспортируйте их каналы используя каталог подкастов iTunes, файлы OPML или адреса каналов RSS.
+Загружайте, транслируйте по сети или добавляйте выпуски в очередь и наслаждайтесь ими так, как вам нравится, с регулируемой скоростью воспроизведения, поддержкой оглавления и таймером сна.
+Экономьте время, заряд батареи и мобильный трафик при помощи мощных средств автоматизации загрузки выпусков (фильтрация, указание времени и интервалов, а также сетей WiFi) и их удаления (избранные и настройки хранения).
+
+Созданное поклонниками подкастов, AntennaPod — бесплатное и свободное приложение без рекламы и платежей.
+
+<b>Импортируйте, систематизируйте и слушайте</b>
+• Всевозможное управление воспроизведением: виджетом, системным уведомлением и кнопками проводных и беспроводных гарнитур
+• Добавление и импорт каналов через каталоги iTunes и gPodder.net, файлы OPML и ссылки на каналы в RSS или Atom
+• Приятное Вам прослушивание с регулировкой скорости воспроизведения, оглавлениями, запоминанием места воспроизведения и продвинутым таймером сна (со сбросом при встряхивании, снижением громкости)
+• Доступ к каналам и выпускам защищённым паролем
+
+<b>Отслеживайте, делитесь и благодарите</b>
+• Отслеживайте лучших из лучших, помещая выпуски в избранное
+• Поиск того самого выпуска в истории воспроизведения или по заголовкам и примечаниям
+• Разнообразие способов поделиться выпусками и каналами через социальные сети и e-mail, услуги gPodder.net и экспорт в OPML
+
+<b>Управляйте системой</b>
+• Управление автоматической загрузкой: выбор отдельных каналов, запрет на использование мобильных сетей, выбор определённых точек доступа WiFi, только во время зарядки телефона и в заданное время или интервалы
+• Управление хранением путём задания количества выпусков в кэше, автоудаление и выбор предпочтительного размещения
+• Приспосабливается к Вашему окружению посредством светлого или тёмного оформления
+• Резервирование Ваших подписок путём интеграции с gPodder.net и экпорта в OPML
+
+<b>Присоединяйтесь к сообществу AntennaPod!</b>
+AntennaPod постоянно развивается силами добровольцев. Вы тоже можете сделать свой вклад при помощи кода или комментария!
+
+Посещайте GitHub для запроса новых возможностей, уведомления об ошибках и внесения кода:
+https://www.github.com/AntennaPod/AntennaPod
+
+Помогайте с переводом приложения на Transifex:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/ru-RU/short-description.txt b/app/src/main/play/listings/ru-RU/short-description.txt
new file mode 100644
index 000000000..10923eafb
--- /dev/null
+++ b/app/src/main/play/listings/ru-RU/short-description.txt
@@ -0,0 +1 @@
+Удобный и гибкий менеджер и проигрыватель подкастов с открытым исходным кодом \ No newline at end of file
diff --git a/app/src/main/play/listings/ru-RU/title.txt b/app/src/main/play/listings/ru-RU/title.txt
new file mode 100644
index 000000000..31552f353
--- /dev/null
+++ b/app/src/main/play/listings/ru-RU/title.txt
@@ -0,0 +1 @@
+AntennaPod \ No newline at end of file
diff --git a/app/src/main/play/listings/sv-SE/full-description.txt b/app/src/main/play/listings/sv-SE/full-description.txt
index d46fdafdc..5965f45bc 100644
--- a/app/src/main/play/listings/sv-SE/full-description.txt
+++ b/app/src/main/play/listings/sv-SE/full-description.txt
@@ -1,42 +1,31 @@
-AntennaPod är en podcasthanterare och spelare som ger dig omedelbar tillgång till miljoner av gratis och betalda podcasts, från oberoende podcastare till stora publiceringshus så som BBC, NPR och CNN. Lägg till, importera och exportera enkelt deras flöden med iTunes podcastdatabas, OPML-filer eller vanliga RSS URL:er. Spara möda, batterikraft och mobildata med kraftfulla automatiseringskontroller för nedladdning (välj tider, intervall och WiFi-nätverk) och borttagning av episoder (baserat på dina favoriter och fördröjningsinställningar).
-Men viktigast av allt: Ladda ner, strömma eller köa episoder och avnjut dem på det sätt du gillar med justerbar uppspelningshastighet, kapitelstöd och insomningstimer.
+Antennapod är en podcasthanterare och spelare som ger dig omedelbar tillgång till millioner av gratis och betalda podcasts, allt ifrån oberoende podcasters till publiceringsjättar som BBC, NPR och CNN. Lägg till, importera och exportera enkelt deras flöden med hjälp av Itunes-podcastdatabas, OPML filer eller enkla RSS URL:er.
+Ladda ner, strömma eller köa episoder och avnjut dem på det sätt du gillar med justerbar uppspelningshastighet, kapitelstöd och sömntimer.
+Spara tid, batteri och mobildata med kraftfulla automatiseringskontroller för nedladdning av episoder (specifera tider, intervall och Wi-Fi nätverk) och borttagning av episoder (baserat på dina favoriseringar och fördröjningsinställningar).
Gjord av podcastenthusiaster, AntennaPod är fri i alla ordets bemärkelser: öppen källkod, inga kostnader, ingen reklam.
-<b>Alla funktioner:</b><br>
-IMPORTERA, ORGANISERA OCH SPELA<br>
-&#8226; Lägg till och importera flöden via iTunes och gPodder.net, OPML filer och RSS eller Atom länkar<br>
-&#8226; Hantera uppspelningen från vartsomhelst: hemskärmswidget, aviseringsfältet och hörlurs/bluetoth-kontroller<br>
-&#8226; Njut av att lyssna på ditt sätt med justerbar uppspelningshastighet, kapitelstöd (MP4, VorbisComment och Podlove), ihågkommen uppspelningsposition och en avancerad sömntimer (skaka för återställaning, sänk volymen och sänk hastigheten)<br>
-&#8226; Kom åt lösenordsskyddade flöden och episoder<br>
-&#8226; Dra nytta av siduppdelade flöden (www.podlove.ord/paged-feeds)
+<b>Importera, organisera och spela</b>
+• Hantera uppspelningen från vartsomhelst: hemskärmswidget, aviseringsfältet och hörlurs/bluetoth-kontroller
+• Lägg till och importera flöden via iTunes och gPodder.net, OPML filer och RSS eller Atom länkar
+• Njut av att lyssna på ditt sätt med justerbar uppspelningshastighet, kapitelstöd (MP3, VorbisComment och Podlove), ihågkommen uppspelningsposition och en avancerad sömntimer (skaka för återställaning, sänk volymen och sänk hastigheten)
+• Kom åt lösenordsskyddade flöden och episoder
-SPÅRA, DELA & UPPSKATTA<br>
-&#8226; Håll ordning på de bästa av de bästa med favoritmarkering av episoder<br>
-&#8226; Hitta just den där episoden i uppspelningshistoriken eller genom sökning (titel och shownotes)<br>
-&#8226; Dela episoder och flöden med avancerade vald för social media och och email, tjänsten gPodder.net och via OPML export<br>
+<b>Håll reda på, dela & uppskatta</b>
+• Håll ordning på de bästa av de bästa med favoritmarkering av episoder
+• Hitta just den där episoden i uppspelningshistoriken eller genom sökning (titel och shownotes)
+• Dela episoder och flöden med avancerade vald för social media och och email, tjänsten gPodder.net och via OPML export
-KONTROLLERA SYSTEMET<br>
-&#8226; Ta kontroll över automatisk nedladdning: välj flöden, exkludera mobilnätverk, välj specifika WiFi nätverk, kräv att telefonen är inkopplad för laddning och sätt tider eller intervall för körning<br>
-&#8226; Hantera lagringsutrymme genom att välja antalet cachade episoder, smart borttagning (baserat på dina favoriter och uppspelningsstatus) och välj den lagringsplats du föredrar<br>
-&#8226; Använd AntennaPod på ditt språk (EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH)<br>
-&#8226; Anpassa till din omgivning med det ljusa och mörka temat<br>
-&#8226; Ta backup av dina prenumerationer med integreringen av gPodder.net och OPML exportering
+<b>Kontroller systemet</b>
+• Ta kontroll över automatisk nedladdning: välj flöden, exkludera mobilnätverk, välj specifika Wi-Fi nätverk, kräv att telefonen är inkopplad för laddning och sätt tider eller intervall för körning
+• Hantera lagring med inställningar för antalet episoder i cachen, smart borttagning (med hänsyn till dina favoriter och uppspelningsstatus) och välj din föredragna plats
+• Anpassa till din omgivning med det ljusa och mörka temat
+• Ta backup av dina prenumerationer med integreringen av gPodder.net och OPML exportering
-<b>Gå med i AntennaPods gemenskap!</b><br>
+<b>Gå med i AntennaPods gemenskap!</b>
AntennaPod är under aktiv utveckling av volontärer. Du kan också bidra, med kod eller kommentarer!
-GitHub är platsen att gå till för att be om funktioner, skapa buggrapporter eller bidra med kod:<br>
+GitHub är platsen att gå till för att be om funktioner, skapa buggrapporter eller bidra med kod:
https://www.github.com/AntennaPod/AntennaPod
-Vår Google Group är platsen för att dela idéer, dina favoritögonblick med podcasting och din uppskattning till volontärerna:<br>
-https://groups.google.com/forum/#!forum/antennapod
-
-Har du frågor eller vill ge feedback?
-https://twitter.com/@AntennaPod
-
-Transifex är platsen att gå till för att hjälpa till med översättningen:<br>
-https://www.transifex.com/antennapod/antennapod
-
-Kolla in vårat Beta Testing program för att få de senaste funktionerna först:<br>
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+Transifex är platsen att gå till för att hjälpa till med översättningen:
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/listings/zh-CN/full-description.txt b/app/src/main/play/listings/zh-CN/full-description.txt
index a39b43eee..993e7e18c 100644
--- a/app/src/main/play/listings/zh-CN/full-description.txt
+++ b/app/src/main/play/listings/zh-CN/full-description.txt
@@ -1,42 +1,31 @@
-AntennaPod 是一款播客管理器和播放器,可让您即时收听数百万免费和付费的播客,从独立播客到大型出版商如BBC,NPR和CNN;使用 iTunes 播客数据库,OPML文件或简单的RSS URL轻松添加,导入和导出 feeds ;通过强大的自动化控制功能节省工作量,电池电量和移动数据使用情况,以便下载剧集(指定时间,间隔和 WiFi 网络)和删除剧集(根据您的收藏和延迟设置)。
-但最重要的是:下载,串流或安排节目并用可调节回放速度,章节支持和睡眠定时器以您喜欢的方式享受它们。
-
-AntennaPod由播客爱好者开发,在任意方面上都是自由的:开源,免费,无广告。
-
-<b>所有功能:</b><br>
-导入、整理与播放<br>
-&#8226; 通过 iTunes、gPodder.net、OPML 文件、RSS 或 Atom 链接添加和导入订阅
-&#8226;从任意地点管理回放:主屏widget,系统通知,耳塞和蓝牙控制装置
-&#8226;借助可调节回放速度,章节支持(Mp3、Vorbis注释和Podlove),记忆的回放位置和一个高级的睡眠定时器 (摇动设备来重置、调低音量并减慢回放)以您自己的方式享受收听播客节目
-#8226; 访问受密码保护的 feeds 和剧集
-&#8226; 充分利用分页 feeds (www.podlove.org/paged-feeds)
-
-保持更新,分享&欣赏
-&#8226; 通过将剧集标记为收藏来追踪最佳的剧集
-&#8226; 通过回放历史或搜索(标题和节目笔记)找到您需要的那期节目
-&#8226; 通过高级社交媒体和电邮选项,gPodder.net服务和导出OPML文件来分享节目和源
-
-一切尽在掌控<br>
-&#8226; 控制自动下载:选择源,排除移动网络,选择特定无线网络,要求手机充电并设定次数或间隔
-&#8226; 通过设定缓存节目的数量管理存储,智能删除(基于您的喜好和播放状态)并选择您偏好的存储位置
-&#8226; 使用对应您的语言的 AntennaPod (EN, DE, CS, NL, NB, JA, PT, ES, SV, CA, UK, FR, KO, TR, ZH)<br>
-&#8226; 使用浅色和深色主题以适应您的环境
-&#8226; 使用 gPodder.net 集成功能和 OPML 导出以备份您的订阅
-
-<b>加入 AntennaPod 社区!</b><br>
+AntennaPod是一个播客管理器和播放器,可以让你即时访问数以百万计的免费和付费播客,从独立播主到大型新闻机构出版社,如BBC、NPR和CNN。使用iTunes podcast数据库、OPML文件或简单的RSS地址轻而易举地添加、导入和导出它们的提要(Feed)。
+下载,在线播放或对音频进行排队,并借助可调节的回放速度、章节支持及睡眠定时器以您喜爱的方式享用它们。
+通过针对音频下载(指定时间、间隔和WiFi网络)和音频删除(根据您的喜好和延迟设置)的强大自动控制功能,节省精力、电池电量和移动数据使用量。
+
+由播客爱好者制作的AntennaPod在任何意义上都是免费的:开源、无成本、无广告。
+
+<b>导入、组织和播放</b>
+•从任何地方管理播放:主屏幕小部件、系统通知、耳塞和蓝牙控制
+•通过iTunes和gPodder.net目录、OPML文件和RSS或Atom链接添加和导入提要
+•通过可调整的回放速度、章节支持、记忆回放位置及高级睡眠定时器(晃动手机重置、调低音量)以您的方式享受收听
+•访问有密码保护的提要和音频
+
+<b>保持跟踪、分享和欣赏</b>
+•把剧集标记为最爱
+•通过回放历史或通过搜索标题和shownotes找到某期节目
+•通过高级社交媒体和电子邮件选项、gPodder.net服务和导出OPML分享剧集和提要
+
+<b>控制系统</b>
+•控制自动下载:选择订阅源、排除移动网络、选择特定的WiFi网络、要求手机充电,设置次数或间隔
+•通过设置缓存的剧集数量、智能删除和选择您的首选位置来管理存储
+•使用浅色和深色主题适应你的环境
+• 使用gPodder.net集成和OPML导出备份订阅
+
+<b>加入AntennaPod社区</b>
志愿者正在积极开发 AntennaPod 。您也可以通过代码或评论做出贡献!
-GitHub 是申请增加功能,报告错误和贡献代码的地方:
+前往Github请求功能、报告错误和贡献代码
https://www.github.com/AntennaPod/AntennaPod
-对于所有志愿者来说,我们的谷歌社群是分享你的创意,收藏的播客瞬间和表达感激的地方:
-https://groups.google.com/forum/#!forum/antennapod
-
-抱有疑问或者想要向我们提供反馈?
-https://twitter.com/@AntennaPod
-
-Transifex 是与翻译者帮助项目的网站:
-https://www.transifex.com/antennapod/antennapod
-
-查看我们的测试程序以获得最新的功能列表:
-https://www.github.com/AntennaPod/AntennaPod/wiki/Help-test-AntennaPod \ No newline at end of file
+要帮忙翻译请前往Transifex
+https://www.transifex.com/antennapod/antennapod \ No newline at end of file
diff --git a/app/src/main/play/release-notes/en-US/default.txt b/app/src/main/play/release-notes/en-US/default.txt
index 20f9bf802..667338c61 100644
--- a/app/src/main/play/release-notes/en-US/default.txt
+++ b/app/src/main/play/release-notes/en-US/default.txt
@@ -1,7 +1,3 @@
-- Added per-feed playback speed setting (by @spacecowboy)
-- Support sorting in Podcast screen (by @orionlee)
-- Option to show stream button rather than download in lists (by @dsmith47)
-- Option to replace Episode cover with Podcast cover (by @xgouchet)
-- Transparent widget (by @M-arcel)
-- User interface tweaks (by @ByteHamster)
-- Tons of bug fixes and improvements
+- Enabled picture-in-picture for video podcasts by default (by @ByteHamster)
+- Fixed podcast discovery not showing local trends (by @tonytamsf)
+- Various bug fixes and improvements (by @ByteHamster)
diff --git a/app/src/main/res/layout/feeditem_fragment.xml b/app/src/main/res/layout/feeditem_fragment.xml
index 93919435a..47460a28f 100644
--- a/app/src/main/res/layout/feeditem_fragment.xml
+++ b/app/src/main/res/layout/feeditem_fragment.xml
@@ -105,50 +105,55 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="16dp"
- android:layout_marginStart="16dp"
- android:layout_marginRight="16dp"
- android:layout_marginEnd="16dp"
android:orientation="horizontal"
+ android:gravity="center_vertical"
tools:background="@android:color/holo_blue_bright">
- <View
- android:layout_width="0dp"
- android:layout_height="1dp"
- android:layout_weight="1" />
-
- <Button
- android:id="@+id/butAction1"
- style="?attr/buttonBarButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="48dp"
- android:ellipsize="end"
- android:drawablePadding="8dp"
- android:textColor="?android:attr/textColorPrimary"
- tools:text="Button 1"
- tools:background="@android:color/holo_red_light" />
-
- <View
- android:layout_width="0dp"
- android:layout_height="1dp"
- android:layout_weight="1" />
-
- <Button
- android:id="@+id/butAction2"
- style="?attr/buttonBarButtonStyle"
- android:layout_width="wrap_content"
- android:layout_height="48dp"
- android:drawablePadding="8dp"
- android:ellipsize="end"
- android:textColor="?android:attr/textColorPrimary"
- tools:text="Button 2"
- tools:background="@android:color/holo_orange_dark" />
-
- <View
- android:layout_width="0dp"
- android:layout_height="1dp"
- android:layout_weight="1" />
-
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:id="@+id/butAction1"
+ android:orientation="horizontal"
+ android:background="?android:attr/selectableItemBackground"
+ android:gravity="center">
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:id="@+id/butAction1Icon"
+ android:layout_margin="12dp"
+ tools:src="@drawable/ic_settings_grey600_24dp"/>
+ <TextView
+ android:textAppearance="@style/TextAppearance.AppCompat.Button"
+ android:id="@+id/butAction1Text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ tools:text="Button 1"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:id="@+id/butAction2"
+ android:orientation="horizontal"
+ android:background="?android:attr/selectableItemBackground"
+ android:gravity="center">
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:id="@+id/butAction2Icon"
+ android:layout_margin="12dp"
+ tools:src="@drawable/ic_settings_grey600_24dp"/>
+ <TextView
+ android:textAppearance="@style/TextAppearance.AppCompat.Button"
+ android:id="@+id/butAction2Text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?android:attr/textColorPrimary"
+ tools:text="Button 2"/>
+ </LinearLayout>
</LinearLayout>
<View
diff --git a/app/src/main/res/layout/opml_selection.xml b/app/src/main/res/layout/opml_selection.xml
index f8f37b5ac..e018ffde3 100644
--- a/app/src/main/res/layout/opml_selection.xml
+++ b/app/src/main/res/layout/opml_selection.xml
@@ -37,6 +37,7 @@
android:layout_toLeftOf="@id/horizontal_divider"
android:layout_toStartOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
+ android:textColor="?android:attr/textColorPrimary"
android:text="@string/cancel_label" />
<Button
@@ -50,6 +51,7 @@
android:layout_toRightOf="@id/horizontal_divider"
android:layout_toEndOf="@id/horizontal_divider"
android:background="?android:attr/selectableItemBackground"
+ android:textColor="?android:attr/textColorPrimary"
android:text="@string/confirm_label" />
</RelativeLayout>
diff --git a/app/src/main/res/xml/preferences_playback.xml b/app/src/main/res/xml/preferences_playback.xml
index 7a7535dda..32bf383d7 100644
--- a/app/src/main/res/xml/preferences_playback.xml
+++ b/app/src/main/res/xml/preferences_playback.xml
@@ -35,7 +35,7 @@
android:summary="@string/pref_resumeAfterCall_sum"
android:title="@string/pref_resumeAfterCall_title"/>
<ListPreference
- android:defaultValue="stop"
+ android:defaultValue="pip"
android:entries="@array/video_background_behavior_options"
android:entryValues="@array/video_background_behavior_values"
android:key="prefVideoBehavior"
diff --git a/app/src/main/res/xml/searchable.xml b/app/src/main/res/xml/searchable.xml
index ee73aca8d..0861ecdae 100644
--- a/app/src/main/res/xml/searchable.xml
+++ b/app/src/main/res/xml/searchable.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
- android:hint="@string/search_hint"
+ android:hint="@string/search_label"
android:label="@string/app_name"/> \ No newline at end of file
diff --git a/artwork/screenshots/generateScreenshots.sh b/artwork/screenshots/generateScreenshots.sh
new file mode 100644
index 000000000..7c4d5daa6
--- /dev/null
+++ b/artwork/screenshots/generateScreenshots.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+function generateText() {
+ echo "$1"
+ convert -size 1698x750 xc:none -gravity Center -pointsize 150 -fill white -font Lato-Regular \
+ -annotate 0 "$1" /tmp/text.png
+}
+
+function simplePhone() {
+ generateText "$1"
+ convert templates/phone.png \
+ $2 -geometry +306+989 -composite \
+ /tmp/text.png -geometry +0+0 -composite \
+ $3
+}
+
+function addLayer() {
+ convert $2 $1 -composite $2
+}
+
+function generateScreenshots() {
+ language=$1
+ mkdir output/$1 2>/dev/null
+ text0=`cat raw/$language/texts.txt | head -1 | tail -1`
+ text1=`cat raw/$language/texts.txt | head -2 | tail -1`
+ text2=`cat raw/$language/texts.txt | head -3 | tail -1`
+ text3=`cat raw/$language/texts.txt | head -4 | tail -1`
+ text4=`cat raw/$language/texts.txt | head -5 | tail -1`
+ text5=`cat raw/$language/texts.txt | head -6 | tail -1`
+
+ simplePhone "$text0" raw/$language/00.png output/$language/00.png
+ simplePhone "$text1" raw/$language/01.png output/$language/01.png
+ simplePhone "$text2" raw/$language/02.png output/$language/02.png
+ generateText "$text3"
+ convert templates/twophones.png \
+ templates/twophones-a.png -geometry +0+0 -composite \
+ raw/$language/03a.png -geometry +119+984 -composite \
+ templates/twophones-b.png -geometry +0+0 -composite \
+ raw/$language/03b.png -geometry +479+1540 -composite \
+ /tmp/text.png -geometry +0+0 -composite \
+ output/$language/03.png
+ simplePhone "$text4" raw/$language/04.png output/$language/04.png
+ simplePhone "$text5" raw/$language/05.png output/$language/05.png
+ addLayer templates/suggestions.png output/$language/05.png
+ optipng output/$language/*.png
+}
+
+mkdir output 2>/dev/null
+
+generateScreenshots "de-DE"
+generateScreenshots "en-US"
+
+rm /tmp/text.png
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/1.png b/artwork/screenshots/raw/de-DE/00.png
index f5f7a463b..f5f7a463b 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/1.png
+++ b/artwork/screenshots/raw/de-DE/00.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/2.png b/artwork/screenshots/raw/de-DE/01.png
index eac002341..eac002341 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/2.png
+++ b/artwork/screenshots/raw/de-DE/01.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/3.png b/artwork/screenshots/raw/de-DE/02.png
index f189d11f2..f189d11f2 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/3.png
+++ b/artwork/screenshots/raw/de-DE/02.png
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/03a.png b/artwork/screenshots/raw/de-DE/03a.png
new file mode 100644
index 000000000..9681a8586
--- /dev/null
+++ b/artwork/screenshots/raw/de-DE/03a.png
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/03b.png b/artwork/screenshots/raw/de-DE/03b.png
new file mode 100644
index 000000000..28868ecc1
--- /dev/null
+++ b/artwork/screenshots/raw/de-DE/03b.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/5.png b/artwork/screenshots/raw/de-DE/04.png
index 03467f768..03467f768 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/5.png
+++ b/artwork/screenshots/raw/de-DE/04.png
Binary files differ
diff --git a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/6.png b/artwork/screenshots/raw/de-DE/05.png
index 4d687d88b..4d687d88b 100644
--- a/app/src/main/play/listings/de-DE/graphics/phone-screenshots/6.png
+++ b/artwork/screenshots/raw/de-DE/05.png
Binary files differ
diff --git a/artwork/screenshots/raw/de-DE/texts.txt b/artwork/screenshots/raw/de-DE/texts.txt
new file mode 100644
index 000000000..088bb840f
--- /dev/null
+++ b/artwork/screenshots/raw/de-DE/texts.txt
@@ -0,0 +1,6 @@
+Abonniere deine\nLieblings-Podcasts
+Player mit\nSchlummerfunktion
+Automatisches\nHerunterladen
+Wähle dein\nLieblings-Theme
+Passe AntennaPod\nan deine Wünsche an
+Entdecke tausende\nneuer Podcasts
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png b/artwork/screenshots/raw/en-US/00.png
index f201567a1..f201567a1 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/1.png
+++ b/artwork/screenshots/raw/en-US/00.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png b/artwork/screenshots/raw/en-US/01.png
index 1c0cd9e8d..1c0cd9e8d 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/2.png
+++ b/artwork/screenshots/raw/en-US/01.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png b/artwork/screenshots/raw/en-US/02.png
index c7812c099..c7812c099 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/3.png
+++ b/artwork/screenshots/raw/en-US/02.png
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/03a.png b/artwork/screenshots/raw/en-US/03a.png
new file mode 100644
index 000000000..153344671
--- /dev/null
+++ b/artwork/screenshots/raw/en-US/03a.png
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/03b.png b/artwork/screenshots/raw/en-US/03b.png
new file mode 100644
index 000000000..464c4f9fb
--- /dev/null
+++ b/artwork/screenshots/raw/en-US/03b.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png b/artwork/screenshots/raw/en-US/04.png
index 65fe711a6..65fe711a6 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/5.png
+++ b/artwork/screenshots/raw/en-US/04.png
Binary files differ
diff --git a/app/src/main/play/listings/en-US/graphics/phone-screenshots/6.png b/artwork/screenshots/raw/en-US/05.png
index 35a1d3b08..35a1d3b08 100644
--- a/app/src/main/play/listings/en-US/graphics/phone-screenshots/6.png
+++ b/artwork/screenshots/raw/en-US/05.png
Binary files differ
diff --git a/artwork/screenshots/raw/en-US/texts.txt b/artwork/screenshots/raw/en-US/texts.txt
new file mode 100644
index 000000000..f7579b498
--- /dev/null
+++ b/artwork/screenshots/raw/en-US/texts.txt
@@ -0,0 +1,6 @@
+Subscribe to all of your\nfavorite podcasts
+Powerful player\nwith sleep timer
+Save time with\nautomatic downloads
+Select the theme\nthat fits best to you
+Adapt AntennaPod\nto your needs
+Discover thousands\nof great podcasts
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/1.png b/artwork/screenshots/raw/fr-FR/00.png
index e32664902..e32664902 100644
--- a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/1.png
+++ b/artwork/screenshots/raw/fr-FR/00.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/2.png b/artwork/screenshots/raw/fr-FR/01.png
index f1119dd11..f1119dd11 100644
--- a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/2.png
+++ b/artwork/screenshots/raw/fr-FR/01.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/3.png b/artwork/screenshots/raw/fr-FR/02.png
index 17cae455a..17cae455a 100644
--- a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/3.png
+++ b/artwork/screenshots/raw/fr-FR/02.png
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/03a.png b/artwork/screenshots/raw/fr-FR/03a.png
new file mode 100644
index 000000000..4944f4f3d
--- /dev/null
+++ b/artwork/screenshots/raw/fr-FR/03a.png
Binary files differ
diff --git a/artwork/screenshots/raw/fr-FR/03b.png b/artwork/screenshots/raw/fr-FR/03b.png
new file mode 100644
index 000000000..c4cf5f058
--- /dev/null
+++ b/artwork/screenshots/raw/fr-FR/03b.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/5.png b/artwork/screenshots/raw/fr-FR/04.png
index 2d7572b65..2d7572b65 100644
--- a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/5.png
+++ b/artwork/screenshots/raw/fr-FR/04.png
Binary files differ
diff --git a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/6.png b/artwork/screenshots/raw/fr-FR/05.png
index cdf2cac38..cdf2cac38 100644
--- a/app/src/main/play/listings/fr-FR/graphics/phone-screenshots/6.png
+++ b/artwork/screenshots/raw/fr-FR/05.png
Binary files differ
diff --git a/artwork/screenshots/templates/phone.png b/artwork/screenshots/templates/phone.png
new file mode 100644
index 000000000..f3bc145c4
--- /dev/null
+++ b/artwork/screenshots/templates/phone.png
Binary files differ
diff --git a/artwork/screenshots/templates/suggestions.png b/artwork/screenshots/templates/suggestions.png
new file mode 100644
index 000000000..00d761ef6
--- /dev/null
+++ b/artwork/screenshots/templates/suggestions.png
Binary files differ
diff --git a/artwork/screenshots/templates/twophones-a.png b/artwork/screenshots/templates/twophones-a.png
new file mode 100644
index 000000000..bb10550e8
--- /dev/null
+++ b/artwork/screenshots/templates/twophones-a.png
Binary files differ
diff --git a/artwork/screenshots/templates/twophones-b.png b/artwork/screenshots/templates/twophones-b.png
new file mode 100644
index 000000000..ffe3dddf6
--- /dev/null
+++ b/artwork/screenshots/templates/twophones-b.png
Binary files differ
diff --git a/artwork/screenshots/templates/twophones.png b/artwork/screenshots/templates/twophones.png
new file mode 100644
index 000000000..ea532f1d9
--- /dev/null
+++ b/artwork/screenshots/templates/twophones.png
Binary files differ
diff --git a/core/src/main/assets/shownotes-style.css b/core/src/main/assets/shownotes-style.css
new file mode 100644
index 000000000..d0c8564aa
--- /dev/null
+++ b/core/src/main/assets/shownotes-style.css
@@ -0,0 +1,37 @@
+@font-face {
+ font-family: 'Roboto-Light';
+ src: url('file:///android_asset/Roboto-Light.ttf');
+}
+* {
+ color: %s;
+ font-family: roboto-Light;
+ font-size: 13pt;
+ overflow-wrap: break-word;
+}
+a {
+ font-style: normal;
+ text-decoration: none;
+ font-weight: normal;
+ color: #00A8DF;
+}
+a.timecode {
+ color: #669900;
+}
+img, iframe {
+ display: block;
+ margin: 10 auto;
+ max-width: 100%%;
+ height: auto;
+}
+body {
+ margin: %dpx %dpx %dpx %dpx;
+}
+p#apNoShownotes {
+ position: fixed;
+ top: 50%%;
+ left: 50%%;
+ transform: translate(-50%%, -50%%);
+ text-align: center;
+ -webkit-text-size-adjust: none;
+ font-size: 80%%;
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java b/core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java
deleted file mode 100644
index 062a6abac..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/SearchResult.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package de.danoeh.antennapod.core.feed;
-
-import de.danoeh.antennapod.core.storage.SearchLocation;
-
-public class SearchResult {
- private final FeedComponent component;
- private SearchLocation location;
-
- public SearchResult(FeedComponent component, SearchLocation location) {
- super();
- this.component = component;
- this.location = location;
- }
-
- public FeedComponent getComponent() {
- return component;
- }
-
- public SearchLocation getLocation() {
- return location;
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
index 9db5eb212..383697fa2 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java
@@ -389,7 +389,7 @@ public class UserPreferences {
return Float.parseFloat(prefs.getString(PREF_PLAYBACK_SPEED, "1.00"));
} catch (NumberFormatException e) {
Log.e(TAG, Log.getStackTraceString(e));
- UserPreferences.setPlaybackSpeed("1.00");
+ UserPreferences.setPlaybackSpeed(1.0f);
return 1.0f;
}
}
@@ -399,7 +399,7 @@ public class UserPreferences {
return Float.parseFloat(prefs.getString(PREF_VIDEO_PLAYBACK_SPEED, "1.00"));
} catch (NumberFormatException e) {
Log.e(TAG, Log.getStackTraceString(e));
- UserPreferences.setVideoPlaybackSpeed("1.00");
+ UserPreferences.setVideoPlaybackSpeed(1.0f);
return 1.0f;
}
}
@@ -408,7 +408,7 @@ public class UserPreferences {
return prefs.getBoolean(PREF_PLAYBACK_SKIP_SILENCE, false);
}
- public static String[] getPlaybackSpeedArray() {
+ public static float[] getPlaybackSpeedArray() {
return readPlaybackSpeedArray(prefs.getString(PREF_PLAYBACK_SPEED_ARRAY, null));
}
@@ -638,15 +638,15 @@ public class UserPreferences {
.apply();
}
- public static void setPlaybackSpeed(String speed) {
+ public static void setPlaybackSpeed(float speed) {
prefs.edit()
- .putString(PREF_PLAYBACK_SPEED, speed)
+ .putString(PREF_PLAYBACK_SPEED, String.valueOf(speed))
.apply();
}
- public static void setVideoPlaybackSpeed(String speed) {
+ public static void setVideoPlaybackSpeed(float speed) {
prefs.edit()
- .putString(PREF_VIDEO_PLAYBACK_SPEED, speed)
+ .putString(PREF_VIDEO_PLAYBACK_SPEED, String.valueOf(speed))
.apply();
}
@@ -769,24 +769,22 @@ public class UserPreferences {
}
}
- private static String[] readPlaybackSpeedArray(String valueFromPrefs) {
- String[] selectedSpeeds = null;
- // If this preference hasn't been set yet, return the default options
- if (valueFromPrefs == null) {
- selectedSpeeds = new String[] { "0.75", "1.00", "1.25", "1.50", "1.75", "2.00" };
- } else {
+ private static float[] readPlaybackSpeedArray(String valueFromPrefs) {
+ if (valueFromPrefs != null) {
try {
JSONArray jsonArray = new JSONArray(valueFromPrefs);
- selectedSpeeds = new String[jsonArray.length()];
+ float[] selectedSpeeds = new float[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
- selectedSpeeds[i] = jsonArray.getString(i);
+ selectedSpeeds[i] = (float) jsonArray.getDouble(i);
}
+ return selectedSpeeds;
} catch (JSONException e) {
Log.e(TAG, "Got JSON error when trying to get speeds from JSONArray");
e.printStackTrace();
}
}
- return selectedSpeeds;
+ // If this preference hasn't been set yet, return the default options
+ return new float[] { 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f };
}
public static String getMediaPlayer() {
@@ -816,11 +814,11 @@ public class UserPreferences {
}
public static VideoBackgroundBehavior getVideoBackgroundBehavior() {
- switch (prefs.getString(PREF_VIDEO_BEHAVIOR, "stop")) {
+ switch (prefs.getString(PREF_VIDEO_BEHAVIOR, "pip")) {
case "stop": return VideoBackgroundBehavior.STOP;
case "pip": return VideoBackgroundBehavior.PICTURE_IN_PICTURE;
case "continue": return VideoBackgroundBehavior.CONTINUE_PLAYING;
- default: return VideoBackgroundBehavior.STOP;
+ default: return VideoBackgroundBehavior.PICTURE_IN_PICTURE;
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java
index 9c32e42e0..6f7401698 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java
@@ -646,6 +646,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
float retVal = 1;
if ((playerStatus == PlayerStatus.PLAYING
|| playerStatus == PlayerStatus.PAUSED
+ || playerStatus == PlayerStatus.INITIALIZED
|| playerStatus == PlayerStatus.PREPARED) && mediaPlayer.canSetSpeed()) {
retVal = mediaPlayer.getCurrentSpeedMultiplier();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
index 37deb6dc0..fbd8d65d8 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
@@ -54,10 +54,10 @@ import de.danoeh.antennapod.core.event.settings.SpeedPresetChangedEvent;
import de.danoeh.antennapod.core.event.settings.VolumeAdaptionChangedEvent;
import de.danoeh.antennapod.core.feed.Chapter;
import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.core.feed.FeedComponent;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
import de.danoeh.antennapod.core.feed.MediaType;
-import de.danoeh.antennapod.core.feed.SearchResult;
import de.danoeh.antennapod.core.glide.ApGlideSettings;
import de.danoeh.antennapod.core.preferences.PlaybackPreferences;
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
@@ -574,6 +574,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
} else if (mediaPlayer.getPlayable() == null) {
startPlayingFromPreferences();
}
+ taskManager.restartSleepTimer();
return true;
case KeyEvent.KEYCODE_MEDIA_PLAY:
if (status == PlayerStatus.PAUSED || status == PlayerStatus.PREPARED) {
@@ -584,6 +585,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
} else if (mediaPlayer.getPlayable() == null) {
startPlayingFromPreferences();
}
+ taskManager.restartSleepTimer();
return true;
case KeyEvent.KEYCODE_MEDIA_PAUSE:
if (status == PlayerStatus.PLAYING) {
@@ -833,9 +835,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
@Override
public void onPlaybackStart(@NonNull Playable playable, int position) {
- if (taskManager.isSleepTimerActive()) {
- taskManager.restartSleepTimer();
- }
taskManager.startWidgetUpdater();
if (position != PlaybackServiceMediaPlayer.INVALID_TIME) {
playable.setPosition(position);
@@ -1468,10 +1467,12 @@ public class PlaybackService extends MediaBrowserServiceCompat {
public void resume() {
mediaPlayer.resume();
+ taskManager.restartSleepTimer();
}
public void prepare() {
mediaPlayer.prepare();
+ taskManager.restartSleepTimer();
}
public void pause(boolean abandonAudioFocus, boolean reinit) {
@@ -1634,16 +1635,17 @@ public class PlaybackService extends MediaBrowserServiceCompat {
public void onPlayFromSearch(String query, Bundle extras) {
Log.d(TAG, "onPlayFromSearch query=" + query + " extras=" + extras.toString());
- List<SearchResult> results = FeedSearcher.performSearch(getBaseContext(), query, 0);
- for (SearchResult result : results) {
- try {
- FeedMedia p = ((FeedItem) (result.getComponent())).getMedia();
- mediaPlayer.playMediaObject(p, !p.localFileAvailable(), true, true);
- return;
- } catch (Exception e) {
- Log.d(TAG, e.getMessage());
- e.printStackTrace();
- continue;
+ List<FeedComponent> results = FeedSearcher.performSearch(getBaseContext(), query, 0);
+ for (FeedComponent result : results) {
+ if (result instanceof FeedItem) {
+ try {
+ FeedMedia media = ((FeedItem) result).getMedia();
+ mediaPlayer.playMediaObject(media, !media.localFileAvailable(), true, true);
+ return;
+ } catch (Exception e) {
+ Log.d(TAG, e.getMessage());
+ e.printStackTrace();
+ }
}
}
onPlay();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
index 91f656bf1..8ebe18dc0 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java
@@ -553,6 +553,23 @@ public final class DBTasks {
});
}
+ public static FutureTask<List<Feed>> searchFeeds(final Context context, final String query) {
+ return new FutureTask<>(new QueryTask<List<Feed>>(context) {
+ @Override
+ public void execute(PodDBAdapter adapter) {
+ Cursor cursor = adapter.searchFeeds(query);
+ List<Feed> items = new ArrayList<>();
+ if (cursor.moveToFirst()) {
+ do {
+ items.add(Feed.fromCursor(cursor));
+ } while (cursor.moveToNext());
+ }
+ setResult(items);
+ cursor.close();
+ }
+ });
+ }
+
/**
* A runnable which should be used for database queries. The onCompletion
* method is executed on the database executor to handle Cursors correctly.
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java
index af3d1206c..234c01b20 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DatabaseExporter.java
@@ -1,6 +1,8 @@
package de.danoeh.antennapod.core.storage;
import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
@@ -14,21 +16,10 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.FileChannel;
-import java.util.Arrays;
public class DatabaseExporter {
private static final String TAG = "DatabaseExporter";
- private static final byte[] SQLITE3_MAGIC = "SQLite format 3\0".getBytes();
-
- public static boolean validateDB(Uri inputUri, Context context) throws IOException {
- try (InputStream inputStream = context.getContentResolver().openInputStream(inputUri)) {
- byte[] magicBuf = new byte[SQLITE3_MAGIC.length];
- if (inputStream.read(magicBuf) == magicBuf.length) {
- return Arrays.equals(SQLITE3_MAGIC, magicBuf);
- }
- }
- return false;
- }
+ private static final String TEMP_DB_NAME = PodDBAdapter.DATABASE_NAME + "_tmp";
public static void exportToDocument(Uri uri, Context context) throws IOException {
ParcelFileDescriptor pfd = null;
@@ -78,14 +69,21 @@ public class DatabaseExporter {
public static void importBackup(Uri inputUri, Context context) throws IOException {
InputStream inputStream = null;
try {
- if (!validateDB(inputUri, context)) {
- throw new IOException(context.getString(R.string.import_bad_file));
+ File tempDB = context.getDatabasePath(TEMP_DB_NAME);
+ inputStream = context.getContentResolver().openInputStream(inputUri);
+ FileUtils.copyInputStreamToFile(inputStream, tempDB);
+
+ SQLiteDatabase db = SQLiteDatabase.openDatabase(tempDB.getAbsolutePath(),
+ null, SQLiteDatabase.OPEN_READONLY);
+ if (db.getVersion() > PodDBAdapter.VERSION) {
+ throw new IOException(context.getString(R.string.import_no_downgrade));
}
+ db.close();
File currentDB = context.getDatabasePath(PodDBAdapter.DATABASE_NAME);
- inputStream = context.getContentResolver().openInputStream(inputUri);
- FileUtils.copyInputStreamToFile(inputStream, currentDB);
- } catch (IOException e) {
+ currentDB.delete();
+ FileUtils.moveFile(tempDB, currentDB);
+ } catch (IOException | SQLiteException e) {
Log.e(TAG, Log.getStackTraceString(e));
throw e;
} finally {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java
index 1d9e33d0e..bbe8b26f1 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/FeedSearcher.java
@@ -2,21 +2,15 @@ package de.danoeh.antennapod.core.storage;
import android.content.Context;
import androidx.annotation.NonNull;
+import de.danoeh.antennapod.core.feed.Feed;
+import de.danoeh.antennapod.core.feed.FeedComponent;
+import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.Chapter;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
-import de.danoeh.antennapod.core.R;
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.SearchResult;
-import de.danoeh.antennapod.core.util.comparator.InReverseChronologicalOrder;
-
/**
* Performs search on Feeds and FeedItems.
*/
@@ -37,48 +31,19 @@ public class FeedSearcher {
* @return list of episodes containing the query
*/
@NonNull
- public static List<SearchResult> performSearch(final Context context, final String query, final long selectedFeed) {
- final List<SearchResult> result = new ArrayList<>();
+ public static List<FeedComponent> performSearch(final Context context, final String query, final long selectedFeed) {
+ final List<FeedComponent> result = new ArrayList<>();
try {
- FutureTask<List<FeedItem>> searchTask = DBTasks.searchFeedItems(context, selectedFeed, query);
- searchTask.run();
- final List<FeedItem> items = searchTask.get();
- for (FeedItem item : items) {
- SearchLocation location;
- if (safeContains(item.getTitle(), query)) {
- location = SearchLocation.TITLE;
- } else if (safeContains(item.getContentEncoded(), query)) {
- location = SearchLocation.SHOWNOTES;
- } else if (safeContains(item.getDescription(), query)) {
- location = SearchLocation.SHOWNOTES;
- } else if (safeContains(item.getChapters(), query)) {
- location = SearchLocation.CHAPTERS;
- } else if (safeContains(item.getFeed().getAuthor(), query)) {
- location = SearchLocation.AUTHORS;
- } else {
- location = SearchLocation.FEED;
- }
- result.add(new SearchResult(item, location));
- }
+ FutureTask<List<FeedItem>> itemSearchTask = DBTasks.searchFeedItems(context, selectedFeed, query);
+ FutureTask<List<Feed>> feedSearchTask = DBTasks.searchFeeds(context, query);
+ itemSearchTask.run();
+ feedSearchTask.run();
+
+ result.addAll(feedSearchTask.get());
+ result.addAll(itemSearchTask.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return result;
}
-
- private static boolean safeContains(String haystack, String needle) {
- return haystack != null && haystack.contains(needle);
- }
-
- private static boolean safeContains(List<Chapter> haystack, String needle) {
- if (haystack == null) {
- return false;
- }
- for (Chapter chapter : haystack) {
- if (safeContains(chapter.getTitle(), needle)) {
- return true;
- }
- }
- return false;
- }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index 17b79a3da..4e2588f22 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -48,6 +48,7 @@ public class PodDBAdapter {
private static final String TAG = "PodDBAdapter";
public static final String DATABASE_NAME = "Antennapod.db";
+ public static final int VERSION = 1090000;
/**
* Maximum number of arguments for IN-operator.
@@ -284,10 +285,13 @@ public class PodDBAdapter {
* Contains FEEDITEM_SEL_FI_SMALL as comma-separated list. Useful for raw queries.
*/
private static final String SEL_FI_SMALL_STR;
+ private static final String FEED_SEL_STD_STR;
static {
String selFiSmall = Arrays.toString(FEEDITEM_SEL_FI_SMALL);
SEL_FI_SMALL_STR = selFiSmall.substring(1, selFiSmall.length() - 1);
+ String selFeedSmall = Arrays.toString(FEED_SEL_STD);
+ FEED_SEL_STD_STR = selFeedSmall.substring(1, selFeedSmall.length() - 1);
}
/**
@@ -1274,21 +1278,29 @@ public class PodDBAdapter {
}
String query = "SELECT " + SEL_FI_SMALL_STR + " FROM " + TABLE_NAME_FEED_ITEMS
- + " LEFT JOIN " + TABLE_NAME_SIMPLECHAPTERS
- + " ON " + TABLE_NAME_SIMPLECHAPTERS + "." + KEY_FEEDITEM
- + "=" + TABLE_NAME_FEED_ITEMS + "." + KEY_ID
- + " LEFT JOIN " + TABLE_NAME_FEEDS
- + " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED
- + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ " WHERE " + queryFeedId + " AND ("
- + TABLE_NAME_FEED_ITEMS + "." + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' OR "
- + TABLE_NAME_FEED_ITEMS + "." + KEY_CONTENT_ENCODED + " LIKE '%" + preparedQuery + "%' OR "
- + TABLE_NAME_FEED_ITEMS + "." + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR "
- + TABLE_NAME_SIMPLECHAPTERS + "." + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR "
- + TABLE_NAME_FEEDS + "." + KEY_AUTHOR + " LIKE '%" + preparedQuery + "%' OR "
- + TABLE_NAME_FEEDS + "." + KEY_FEED_IDENTIFIER + " LIKE '%" + preparedQuery + "%'"
+ + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' OR "
+ + KEY_CONTENT_ENCODED + " LIKE '%" + preparedQuery + "%' OR "
+ + KEY_TITLE + " LIKE '%" + preparedQuery + "%'"
+ ") ORDER BY " + KEY_PUBDATE + " DESC "
- + "LIMIT 500";
+ + "LIMIT 300";
+ return db.rawQuery(query, null);
+ }
+
+ /**
+ * Searches for the given query in various values of all feeds.
+ *
+ * @return A cursor with all search results in SEL_FI_EXTRA selection.
+ */
+ public Cursor searchFeeds(String searchQuery) {
+ String preparedQuery = prepareSearchQuery(searchQuery);
+ String query = "SELECT " + FEED_SEL_STD_STR + " FROM " + TABLE_NAME_FEEDS + " WHERE "
+ + KEY_TITLE + " LIKE '%" + preparedQuery + "%' OR "
+ + KEY_CUSTOM_TITLE + " LIKE '%" + preparedQuery + "%' OR "
+ + KEY_AUTHOR + " LIKE '%" + preparedQuery + "%' OR "
+ + KEY_DESCRIPTION + " LIKE '%" + preparedQuery + "%' "
+ + "ORDER BY " + KEY_TITLE + " ASC "
+ + "LIMIT 300";
return db.rawQuery(query, null);
}
@@ -1336,8 +1348,6 @@ public class PodDBAdapter {
* Helper class for opening the Antennapod database.
*/
private static class PodDBHelper extends SQLiteOpenHelper {
- private static final int VERSION = 1090000;
-
/**
* Constructor.
*
@@ -1345,8 +1355,7 @@ public class PodDBAdapter {
* @param name Name of the database
* @param factory to use for creating cursor objects
*/
- public PodDBHelper(final Context context, final String name,
- final CursorFactory factory) {
+ public PodDBHelper(final Context context, final String name, final CursorFactory factory) {
super(context, name, factory, VERSION, new PodDbErrorHandler());
}
@@ -1369,10 +1378,8 @@ public class PodDBAdapter {
}
@Override
- public void onUpgrade(final SQLiteDatabase db, final int oldVersion,
- final int newVersion) {
- Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to "
- + newVersion + ".");
+ public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
+ Log.w("DBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion + ".");
DBUpgrader.upgrade(db, oldVersion, newVersion);
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java b/core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java
deleted file mode 100644
index fabe85b2c..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/SearchLocation.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.danoeh.antennapod.core.storage;
-
-import androidx.annotation.StringRes;
-import de.danoeh.antennapod.core.R;
-
-public enum SearchLocation {
- TITLE(R.string.found_in_title_label),
- CHAPTERS(R.string.found_in_chapters_label),
- SHOWNOTES(R.string.found_in_shownotes_label),
- AUTHORS(R.string.found_in_authors_label),
- FEED(R.string.found_in_feeds_label);
-
- private int description;
- SearchLocation(@StringRes int description) {
- this.description = description;
- }
-
- public @StringRes int getDescription() {
- return description;
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java
deleted file mode 100644
index 80246af8f..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/InReverseChronologicalOrder.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package de.danoeh.antennapod.core.util.comparator;
-
-import java.util.Comparator;
-
-import de.danoeh.antennapod.core.feed.FeedItem;
-import de.danoeh.antennapod.core.feed.SearchResult;
-
-public class InReverseChronologicalOrder implements Comparator<SearchResult> {
- /**
- * Compare items and sort it on chronological order.
- */
- @Override
- public int compare(SearchResult o1, SearchResult o2) {
- if ((o1.getComponent() instanceof FeedItem) && (o2.getComponent() instanceof FeedItem)) {
- FeedItem item1 = (FeedItem) o1.getComponent();
- FeedItem item2 = (FeedItem) o2.getComponent();
- return item2.getPubDate().compareTo(item1.getPubDate());
- }
- return 0;
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java
index 8624ec7e5..0fd658853 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java
@@ -9,11 +9,15 @@ import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
+import de.danoeh.antennapod.core.feed.FeedItem;
+import org.apache.commons.io.IOUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -27,48 +31,20 @@ import de.danoeh.antennapod.core.util.ShownotesProvider;
* shownotes to navigate to another position in the podcast or by highlighting certain parts of the shownotesProvider's
* shownotes.
* <p/>
- * A timeline object needs a shownotesProvider from which the chapter information is retrieved and shownotes are generated.
+ * A timeline object needs a shownotesProvider from which the chapter information
+ * is retrieved and shownotes are generated.
*/
public class Timeline {
private static final String TAG = "Timeline";
- private static final String WEBVIEW_STYLE =
- "@font-face {"
- + "font-family: 'Roboto-Light';"
- + "src: url('file:///android_asset/Roboto-Light.ttf');"
- + "}"
- + "* {"
- + "color: %s;"
- + "font-family: roboto-Light;"
- + "font-size: 13pt;"
- + "overflow-wrap: break-word;"
- + "}"
- + "a {"
- + "font-style: normal;"
- + "text-decoration: none;"
- + "font-weight: normal;"
- + "color: #00A8DF;"
- + "}"
- + "a.timecode {"
- + "color: #669900;"
- + "}"
- + "img, iframe {"
- + "display: block;"
- + "margin: 10 auto;"
- + "max-width: %s;"
- + "height: auto;"
- + "}"
- + "body {"
- + "margin: %dpx %dpx %dpx %dpx;"
- + "}";
-
-
- private ShownotesProvider shownotesProvider;
+ private static final Pattern TIMECODE_LINK_REGEX = Pattern.compile("antennapod://timecode/((\\d+))");
+ private static final String TIMECODE_LINK = "<a class=\"timecode\" href=\"antennapod://timecode/%d\">%s</a>";
+ private static final Pattern TIMECODE_REGEX = Pattern.compile("\\b((\\d+):)?(\\d+):(\\d{2})\\b");
+ private static final Pattern LINE_BREAK_REGEX = Pattern.compile("<br */?>");
+ private final ShownotesProvider shownotesProvider;
private final String noShownotesLabel;
- private final String colorPrimaryString;
- private final String colorSecondaryString;
- private final int pageMargin;
+ private final String webviewStyle;
public Timeline(Context context, ShownotesProvider shownotesProvider) {
if (shownotesProvider == null) {
@@ -80,26 +56,21 @@ public class Timeline {
TypedArray res = context.getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorPrimary});
@ColorInt int col = res.getColor(0, 0);
- colorPrimaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," +
- Color.blue(col) + "," + (Color.alpha(col) / 255.0) + ")";
- res.recycle();
- res = context.getTheme().obtainStyledAttributes(new int[]{android.R.attr.textColorSecondary});
- col = res.getColor(0, 0);
- colorSecondaryString = "rgba(" + Color.red(col) + "," + Color.green(col) + "," +
- Color.blue(col) + "," + (Color.alpha(col) / 255.0) + ")";
+ final String colorPrimary = "rgba(" + Color.red(col) + "," + Color.green(col) + ","
+ + Color.blue(col) + "," + (Color.alpha(col) / 255.0) + ")";
res.recycle();
-
- pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
- context.getResources().getDisplayMetrics()
- );
+ final int margin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
+ context.getResources().getDisplayMetrics());
+ String styleString = "";
+ try {
+ InputStream templateStream = context.getAssets().open("shownotes-style.css");
+ styleString = IOUtils.toString(templateStream, "UTF-8");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ webviewStyle = String.format(Locale.getDefault(), styleString, colorPrimary, margin, margin, margin, margin);
}
- private static final Pattern TIMECODE_LINK_REGEX = Pattern.compile("antennapod://timecode/((\\d+))");
- private static final String TIMECODE_LINK = "<a class=\"timecode\" href=\"antennapod://timecode/%d\">%s</a>";
- private static final Pattern TIMECODE_REGEX = Pattern.compile("\\b((\\d+):)?(\\d+):(\\d{2})\\b");
- private static final Pattern LINE_BREAK_REGEX = Pattern.compile("<br */?>");
-
-
/**
* Applies an app-specific CSS stylesheet and adds timecode links (optional).
* <p/>
@@ -110,10 +81,6 @@ public class Timeline {
*/
@NonNull
public String processShownotes() {
- final Playable playable = (shownotesProvider instanceof Playable) ? (Playable) shownotesProvider : null;
-
- // load shownotes
-
String shownotes;
try {
shownotes = shownotesProvider.loadShownotes().call();
@@ -124,21 +91,7 @@ public class Timeline {
if (TextUtils.isEmpty(shownotes)) {
Log.d(TAG, "shownotesProvider contained no shownotes. Returning 'no shownotes' message");
- shownotes = "<html>" +
- "<head>" +
- "<style type='text/css'>" +
- "html, body { margin: 0; padding: 0; width: 100%; height: 100%; } " +
- "html { display: table; }" +
- "body { display: table-cell; vertical-align: middle; text-align:center;" +
- "-webkit-text-size-adjust: none; font-size: 87%; color: " + colorSecondaryString + ";} " +
- "</style>" +
- "</head>" +
- "<body>" +
- "<p>" + noShownotesLabel + "</p>" +
- "</body>" +
- "</html>";
- Log.d(TAG, "shownotes: " + shownotes);
- return shownotes;
+ shownotes = "<html><head></head><body><p id='apNoShownotes'>" + noShownotesLabel + "</p></body></html>";
}
// replace ASCII line breaks with HTML ones if shownotes don't contain HTML line breaks already
@@ -147,14 +100,10 @@ public class Timeline {
}
Document document = Jsoup.parse(shownotes);
-
- // apply style
- String styleStr = String.format(Locale.getDefault(), WEBVIEW_STYLE, colorPrimaryString, "100%",
- pageMargin, pageMargin, pageMargin, pageMargin);
- document.head().appendElement("style").attr("type", "text/css").text(styleStr);
+ document.head().appendElement("style").attr("type", "text/css").text(webviewStyle);
// apply timecode links
- addTimecodes(document, playable);
+ addTimecodes(document);
return document.toString();
}
@@ -184,7 +133,7 @@ public class Timeline {
return -1;
}
- private void addTimecodes(Document document, final Playable playable) {
+ private void addTimecodes(Document document) {
Elements elementsWithTimeCodes = document.body().getElementsMatchingOwnText(TIMECODE_REGEX);
Log.d(TAG, "Recognized " + elementsWithTimeCodes.size() + " timecodes");
@@ -193,7 +142,13 @@ public class Timeline {
return;
}
- int playableDuration = playable == null ? Integer.MAX_VALUE : playable.getDuration();
+ int playableDuration = Integer.MAX_VALUE;
+ if (shownotesProvider instanceof Playable) {
+ playableDuration = ((Playable) shownotesProvider).getDuration();
+ } else if (shownotesProvider instanceof FeedItem && ((FeedItem) shownotesProvider).getMedia() != null) {
+ playableDuration = ((FeedItem) shownotesProvider).getMedia().getDuration();
+ }
+
boolean useHourFormat = true;
if (playableDuration != Integer.MAX_VALUE) {
diff --git a/core/src/main/res/values-ca/strings.xml b/core/src/main/res/values-ca/strings.xml
index aeb5738b2..4d16c469e 100644
--- a/core/src/main/res/values-ca/strings.xml
+++ b/core/src/main/res/values-ca/strings.xml
@@ -91,11 +91,14 @@
<item quantity="one">1 dia després d\'acabar</item>
<item quantity="other">%d dies després d\'acabar</item>
</plurals>
+ <string name="num_selected_label">%d sel·leccionat</string>
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">Enllaç del canal</string>
<string name="etxtFeedurlHint">URL, canal o lloc web</string>
<string name="txtvfeedurl_label">Afegeix podcast amb l\'URL</string>
<string name="browse_gpoddernet_label">Navega gpodder.net</string>
+ <string name="discover">Descobreix</string>
+ <string name="discover_more">més »</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Marca-ho tot com a llegit</string>
<string name="mark_all_read_msg">S\'han marcat tots els episodis com a llegits</string>
@@ -246,6 +249,7 @@
<string name="appearance">Aparença</string>
<string name="external_elements">Elements externs</string>
<string name="interruptions">Interrupcions</string>
+ <string name="preference_search_hint">Cerca…</string>
<string name="media_player">Reproductor multimèdia</string>
<string name="pref_episode_cleanup_title">Neteja l\'episodi</string>
<string name="pref_episode_cleanup_summary">Els episodis que no es troben a la cua i no són preferits seran candidats a ser suprimits si l\'Auto Descàrrega necessita espai per a nous episodis</string>
@@ -494,8 +498,10 @@
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">S\'estan important les subscripcions des de les apps de propòsit únic...</string>
<!--Add podcast fragment-->
+ <string name="search_podcast_hint">Cerca podcast…</string>
<string name="search_itunes_label">Cerca a iTunes</string>
<string name="search_fyyd_label">Cerca a fyyd</string>
+ <string name="advanced_search">Cerca avançada</string>
<string name="filter">Filtra</string>
<!--Episodes apply actions-->
<string name="all_label">Tot</string>
diff --git a/core/src/main/res/values-da/strings.xml b/core/src/main/res/values-da/strings.xml
index 728975847..58192ee30 100644
--- a/core/src/main/res/values-da/strings.xml
+++ b/core/src/main/res/values-da/strings.xml
@@ -64,6 +64,7 @@
<string name="cover_label">Billede</string>
<string name="error_label">Fejl</string>
<string name="error_msg_prefix">En fejl er opstået:</string>
+ <string name="needs_storage_permission">Tilladelse til lageradgang kræves for denne handling</string>
<string name="refresh_label">Opdater</string>
<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>
@@ -86,6 +87,10 @@
<string name="episode_cleanup_never">Aldrig</string>
<string name="episode_cleanup_queue_removal">Når ikke i kø</string>
<string name="episode_cleanup_after_listening">Efter færdig afspilning</string>
+ <plurals name="episode_cleanup_hours_after_listening">
+ <item quantity="one">1 time efter afslutning</item>
+ <item quantity="other">%d timer efter afslutning</item>
+ </plurals>
<plurals name="episode_cleanup_days_after_listening">
<item quantity="one">1 dag efter færdig afspilning</item>
<item quantity="other">%d dage efter færdig afspilning</item>
@@ -95,18 +100,28 @@
<string name="etxtFeedurlHint">www.example.com/feed</string>
<string name="txtvfeedurl_label">Tilføj podcast via webadresse</string>
<string name="browse_gpoddernet_label">Gennemse gpodder.net</string>
+ <string name="discover">Opdag</string>
+ <string name="discover_more">mere »</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Marker alle som afspillet</string>
<string name="mark_all_read_msg">Marker alle udsendelser som afspillet</string>
<string name="mark_all_read_confirmation_msg">Bekræft venligst at du ønsker at markere alle udsendelser som værende afspillet.</string>
+ <string name="remove_all_new_flags_label">Fjern alle \"ny\"-markeringer</string>
+ <string name="removed_all_new_flags_msg">Fjernede alle \"ny\"-markeringer</string>
<string name="show_info_label">Vis information</string>
+ <string name="show_feed_settings_label">Vis podcast-indstillinger</string>
<string name="feed_info_label">Podcast-info</string>
+ <string name="feed_settings_label">Podcast-indstillinger</string>
<string name="rename_feed_label">Omdøb podcast</string>
<string name="remove_feed_label">Fjern podcast</string>
<string name="share_label">Del…</string>
<string name="share_link_label">Del udsendelsens webadresse</string>
+ <string name="share_link_with_position_label">Del webadresse for udsendelse med position</string>
<string name="share_file_label">Del fil</string>
+ <string name="share_website_url_label">Del webstedets adresse</string>
<string name="share_feed_url_label">Del webadresse for feedet</string>
+ <string name="share_item_url_label">Del webadresse for mediefil</string>
+ <string name="share_item_url_with_position_label">Del webadresse for mediefil med position</string>
<string name="feed_delete_confirmation_msg">Bekræft venligst at du ønsker at slette podcasten \"%1$s\" og ALLE dens udsendelser (inklusive overførte udsendelser)</string>
<string name="feed_remover_msg">Fjerner podcast</string>
<string name="load_complete_feed">Opdater komplet podcast</string>
@@ -127,17 +142,40 @@
<string name="open_podcast">Åbn podcast</string>
<!--actions on feeditems-->
<string name="download_label">Hent</string>
+ <plurals name="downloading_batch_label">
+ <item quantity="one">Henter %d udsendelse.</item>
+ <item quantity="other">Henter %d udsendelser.</item>
+ </plurals>
<string name="play_label">Afspil</string>
<string name="pause_label">Sæt på pause</string>
<string name="stream_label">Stream</string>
<string name="delete_label">Slet</string>
<string name="delete_failed">Kan ikke slette fil. En genstart af enheden vil sandsynligvis hjælpe.</string>
+ <string name="delete_episode_label">Slet udsendelse</string>
+ <plurals name="deleted_episode_batch_label">
+ <item quantity="one">%d udsendelse slettet.</item>
+ <item quantity="other">%d udsendelser slettet.</item>
+ </plurals>
+ <string name="remove_new_flag_label">Fjern \"ny\"-markering</string>
+ <string name="removed_new_flag_label">Fjernet \"ny\"-markering</string>
<string name="mark_read_label">Marker som læst</string>
<string name="marked_as_read_label">Markeret som afspillet</string>
+ <plurals name="marked_read_batch_label">
+ <item quantity="one">%d udsendelse markeret som afspillet.</item>
+ <item quantity="other">%d udsendelser markeret som afspillet.</item>
+ </plurals>
<string name="mark_unread_label">Marker som uafspillet</string>
+ <plurals name="marked_unread_batch_label">
+ <item quantity="one">%d udsendelse markeret som uafspillet.</item>
+ <item quantity="other">%d udsendelser markeret som uafspillede.</item>
+ </plurals>
<string name="add_to_queue_label">Føj til kø</string>
<string name="added_to_queue_label">Føjet til kø</string>
<string name="remove_from_queue_label">Fjern fra kø</string>
+ <plurals name="removed_from_queue_batch_label">
+ <item quantity="one">%d udsendelse fjernet fra køen.</item>
+ <item quantity="other">%d udsendelser fjernet fra køen.</item>
+ </plurals>
<string name="add_to_favorite_label">Føj til foretrukne</string>
<string name="added_to_favorites">Føjet til foretrukne</string>
<string name="remove_from_favorite_label">Fjern fra foretrukne</string>
@@ -189,6 +227,9 @@
<string name="confirm_mobile_download_dialog_title">Bekræft brug af mobildata</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">Overførsel over mobil dataforbindelse er slået fra i indstillingerne.\n\nDu kan vælge blot at føje udsendelsen til køen eller du kan tillade overførsel midlertidigt.\n\n<small>Dit valg vil blive husket i 10 minutter.</small></string>
<string name="confirm_mobile_download_dialog_message">Overførsel over mobil dataforbindelse er slået fra i indstillingerne.\n\nVil du tillade overførsel midlertidigt?\n\n<small>Dit valg vil blive husket i 10 minutter.</small></string>
+ <string name="confirm_mobile_streaming_notification_title">Bekræft mobil streaming</string>
+ <string name="confirm_mobile_streaming_notification_message">Streaming via mobildata er slået fra i indstillingerne. Tryk for at streame alligevel.</string>
+ <string name="confirm_mobile_streaming_button_always">Tillad altid</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Sæt i kø</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Tillad midlertidigt</string>
<!--Mediaplayer messages-->
@@ -198,6 +239,7 @@
<string name="player_ready_msg">Klar</string>
<string name="player_seeking_msg">Søger</string>
<string name="playback_error_server_died">Server døde</string>
+ <string name="playback_error_unsupported">Kan ikke afspille denne medietype</string>
<string name="playback_error_unknown">Ukendt fejl</string>
<string name="no_media_playing_label">Ingen medier afspiller</string>
<string name="player_buffering_msg">Henter data til buffer</string>
@@ -208,27 +250,44 @@
<string name="unlock_queue">Lås kø op</string>
<string name="queue_locked">Kø låst</string>
<string name="queue_unlocked">Kø låst op</string>
+ <string name="checkbox_do_not_show_again">Vis ikke igen</string>
<string name="clear_queue_label">Ryd kø</string>
<string name="undo">Fortryd</string>
<string name="move_to_top_label">Flyt til toppen</string>
<string name="move_to_bottom_label">Flyt til bunden</string>
<string name="sort">Sorter</string>
+ <string name="keep_sorted">Hold sorteret</string>
<string name="date">Dato</string>
<string name="duration">Varighed</string>
<string name="episode_title">Titel på udsendelse</string>
<string name="feed_title">Titel på podcast</string>
<string name="random">Tilfældig</string>
+ <string name="smart_shuffle">Smart blanding</string>
<string name="ascending">Stigende</string>
<string name="descending">Faldende</string>
<string name="clear_queue_confirmation_msg">Bekræft venligst at du vil rydde ALLE udsendelser fra køen</string>
+ <string name="sort_old_to_new">Gamle til nye</string>
+ <string name="sort_new_to_old">Nye til gamle</string>
<!--Variable Speed-->
<string name="download_plugin_label">Hent plugin</string>
<string name="no_playback_plugin_title">Plugin er ikke installeret</string>
<string name="set_playback_speed_label">Afspilningshastigheder</string>
<string name="enable_sonic">Slå Sonic til</string>
<!--Empty list labels-->
+ <string name="no_items_header_label">Ingen udsendelser i køen</string>
<string name="no_shownotes_label">Denne udsendelse har ingen beskrivelse.</string>
+ <string name="no_run_downloads_head_label">Ingen overførsler i gang</string>
+ <string name="no_comp_downloads_head_label">Ingen overførte udsendelser</string>
+ <string name="no_log_downloads_head_label">Ingen overførselslog</string>
+ <string name="no_history_head_label">Ingen historik</string>
+ <string name="no_all_episodes_head_label">Ingen udsendelser</string>
+ <string name="no_all_episodes_label">Når du tilføjer en podcast, vil udsendelserne blive vist her.</string>
+ <string name="no_new_episodes_label">Når nye udsendelser ankommer, vil de blive vist her.</string>
+ <string name="no_fav_episodes_head_label">Ingen foretrukne udsendelser</string>
+ <string name="no_fav_episodes_label">Du kan føje udsendelser til foretrukne ved at trykke længe på dem</string>
+ <string name="no_chapters_head_label">Ingen kapitler</string>
<string name="no_chapters_label">Denne udsendelse har ingen kapitler.</string>
+ <string name="no_subscriptions_head_label">Ingen abonnementer</string>
<!--Preferences-->
<string name="storage_pref">Lagring</string>
<string name="project_pref">Projekt</string>
@@ -237,8 +296,12 @@
<string name="automation">Automatisering</string>
<string name="download_pref_details">Detaljer</string>
<string name="import_export_pref">Import/eksport</string>
+ <string name="import_export_search_keywords">sikkerhedskopiering, sikkerhedskopi, backup, gendan, gendannelse, restore</string>
<string name="appearance">Udseende</string>
<string name="interruptions">Afbrydelser</string>
+ <string name="preference_search_hint">Søg...</string>
+ <string name="preference_search_no_results">Ingen resultater</string>
+ <string name="preference_search_clear_history">Slet historik</string>
<string name="media_player">Medieafspiller</string>
<string name="pref_episode_cleanup_title">Oprydning i udsendelser</string>
<string name="pref_episode_cleanup_summary">Tillad at udsendelser, som ikke er i køen og som ikke er markeret som foretrukne, kan fjernes, hvis Automatisk overførsel har brug for plads til nye udsendelser</string>
@@ -271,7 +334,11 @@
<string name="pref_pauseOnHeadsetDisconnect_title">Afbrydelse af hovedtelefoner</string>
<string name="pref_unpauseOnHeadsetReconnect_title">Tilslutning af hovedtelefoner igen</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth forbundet igen</string>
+ <string name="pref_stream_over_download_title">Foretræk streaming</string>
<string name="pref_mobileUpdate_title">Mobile opdateringer</string>
+ <string name="pref_mobileUpdate_auto_download">Hent automatisk</string>
+ <string name="pref_mobileUpdate_episode_download">Download af udsendelser</string>
+ <string name="pref_mobileUpdate_streaming">Streaming</string>
<string name="user_interface_label">Brugergrænseflade</string>
<string name="pref_set_theme_title">Vælg tema</string>
<string name="pref_nav_drawer_items_title">Vælg elementer i navigationspanelet</string>
@@ -288,6 +355,7 @@
<string name="pref_automatic_download_on_battery_sum">Tillad automatisk overførsel, når batteriet ikke oplades</string>
<string name="pref_parallel_downloads_title">Parallelle overførsler</string>
<string name="pref_episode_cache_title">Mellemlager for udsendelser</string>
+ <string name="pref_theme_title_use_system">Brug systemtema</string>
<string name="pref_theme_title_light">Lys</string>
<string name="pref_theme_title_dark">Mørk</string>
<string name="pref_theme_title_trueblack">Sort (AMOLED-klar)</string>
@@ -331,9 +399,18 @@
<string name="pref_showDownloadReport_title">Vis rapport over overførsler</string>
<string name="pref_showDownloadReport_sum">Lav en rapport, som viser detaljer om fejlene, hvis overførsler fejler</string>
<string name="pref_expand_notify_unsupport_toast">Android-versioner før 4.1 understøtter ikke udvidede notifikationer.</string>
+ <string name="pref_enqueue_location_title">Placering i kø</string>
+ <string name="pref_enqueue_location_sum">Føj udsendelser til: %1$s</string>
+ <string name="enqueue_location_back">Slutningen</string>
+ <string name="enqueue_location_front">Starten</string>
+ <string name="enqueue_location_after_current">Efter aktuel udsendelse</string>
<string name="pref_smart_mark_as_played_disabled">Slået fra</string>
<string name="pref_image_cache_size_title">Størrelse på mellemlager (cache) for billeder</string>
<string name="pref_image_cache_size_sum">Størrelse på diskmellemlageret (disk cache) for billeder</string>
+ <string name="bug_report_title">Rapportér fejl i appen</string>
+ <string name="open_bug_tracker">Åbn programfejlsdatabase</string>
+ <string name="copy_to_clipboard">Kopier til udklipsholder</string>
+ <string name="copied_to_clipboard">Kopieret til udklipsholder</string>
<string name="experimental_pref">Eksperimentelt</string>
<string name="pref_current_value">Nuværende værdi: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
@@ -343,9 +420,10 @@
<string name="pref_cast_message_play_flavor">Aktiver understøttelse af fjernafspilning på Cast-enheder (såsom Chromecast, højttalere med indbygget Chromecast, eller Android TV)</string>
<string name="pref_cast_message_free_flavor">Chromecast kræver tredjeparts proprietære biblioteker, som er slået fra i denne version af AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Sæt overførte udsendelser i kø</string>
- <string name="pref_enqueue_downloaded_summary">Føj udsendelser til køen, så snart de er overført</string>
+ <string name="pref_enqueue_downloaded_summary">Føj downloadede udsendelser til køen</string>
<string name="media_player_builtin">Indbygget Android-afspiller</string>
<string name="pref_videoBehavior_title">Når videoen forlades</string>
+ <string name="pref_videoBehavior_sum">Opførsel når videoafspilning forlades</string>
<string name="stop_playback">Stop afspilning</string>
<string name="continue_playback">Fortsæt afspilning af lyd</string>
<string name="behavior">Funktion</string>
@@ -355,11 +433,13 @@
<string name="back_button_open_drawer">Åbn navigationsskuffen</string>
<string name="back_button_double_tap">Dobbelttryk for at afslutte</string>
<string name="back_button_show_prompt">Bekræft for at afslutte</string>
+ <string name="close_prompt">Er du sikker på at du vil lukke AntennaPod?</string>
<string name="double_tap_toast">Tryk på tilbageknappen igen for at afslutte</string>
<string name="back_button_go_to_page">Gå til side ...</string>
<string name="back_button_go_to_page_title">Vælg side</string>
<!--About screen-->
<string name="about_pref">Om</string>
+ <string name="translators">Oversættere</string>
<!--Search-->
<string name="search_hint">Søg efter udsendelser</string>
<string name="found_in_shownotes_label">Fundet i beskrivelse</string>
@@ -453,6 +533,7 @@
<string name="choose_data_directory">Vælg datamappe</string>
<string name="choose_data_directory_message">Vælg venligst roden af din datamappe. AntennaPod vil oprette passende undermapper.</string>
<string name="choose_data_directory_permission_rationale">Adgang til eksternt lager er kræver for at ændre datamappen</string>
+ <string name="choose_data_directory_available_space">%1$s af %2$s ledig</string>
<string name="create_folder_msg">Opret en ny mappe med navnet \"%1$s\"?</string>
<string name="create_folder_success">Oprettede ny mappe</string>
<string name="create_folder_error_no_write_access">Kan ikke skrive til denne mappe</string>
@@ -471,6 +552,7 @@
<string name="pref_restart_required">AntennaPod skal genstartes for at denne indstilling kan træde i kraft</string>
<!--Online feed view-->
<string name="subscribe_label">Abonner</string>
+ <string name="subscribing_label">Abonnerer ...</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Spol tilbage</string>
<string name="fast_forward_label">Spol frem</string>
@@ -496,8 +578,10 @@
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Importerer abonnementer fra enkeltformålsapps…</string>
<!--Add podcast fragment-->
+ <string name="search_podcast_hint">Søg efter podcast ...</string>
<string name="search_itunes_label">Søg i iTunes</string>
<string name="search_fyyd_label">Søg i fyyd</string>
+ <string name="advanced_search">Avanceret søgning</string>
<string name="filter">Filtrér</string>
<!--Episodes apply actions-->
<string name="all_label">Alle</string>
@@ -579,6 +663,9 @@
<string name="notification_channel_user_action">Handling påkrævet</string>
<string name="notification_channel_downloading">Henter</string>
<string name="notification_channel_downloading_description">Vises samtidig med den hentes.</string>
+ <string name="notification_channel_playing">Spiller nu</string>
<string name="notification_channel_error">Fejl</string>
+ <string name="import_bad_file">Ugyldig/ødelagt fil</string>
<!--Widget settings-->
+ <string name="widget_opacity">Ugennemsigtighed</string>
</resources>
diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml
index 0d5158d24..379693f9f 100644
--- a/core/src/main/res/values-de/strings.xml
+++ b/core/src/main/res/values-de/strings.xml
@@ -114,10 +114,10 @@
<string name="removed_all_new_flags_msg">Alle \"neu\"-Markierungen entfernt</string>
<string name="remove_all_new_flags_confirmation_msg">Bitte bestätige, dass du die \"neu\"-Markierung aller Episoden entfernen willst.</string>
<string name="show_info_label">Informationen anzeigen</string>
- <string name="show_feed_settings_label">Zeige Feed-Einstellungen</string>
- <string name="feed_info_label">Feed-Informationen</string>
- <string name="feed_settings_label">Feed-Einstellungen</string>
- <string name="rename_feed_label">Feed umbenennen</string>
+ <string name="show_feed_settings_label">Zeige Podcast-Einstellungen</string>
+ <string name="feed_info_label">Podcast-Informationen</string>
+ <string name="feed_settings_label">Podcast-Einstellungen</string>
+ <string name="rename_feed_label">Podcast umbenennen</string>
<string name="remove_feed_label">Podcast entfernen</string>
<string name="share_label">Teilen…</string>
<string name="share_link_label">Episoden URL Teilen</string>
@@ -127,9 +127,9 @@
<string name="share_feed_url_label">Teile URL des Podcasts</string>
<string name="share_item_url_label">Teile URL der Episodendatei</string>
<string name="share_item_url_with_position_label">Teile URL der Episodendatei mit Zeitmarke</string>
- <string name="feed_delete_confirmation_msg">Bitte bestätige, dass du den Podcast \"%1$s\" und ALLE heruntergeladenen Episoden dieses Feeds entfernen möchtest.</string>
- <string name="feed_remover_msg">Entferne Podcast</string>
- <string name="load_complete_feed">Kompletten Feed aktualisieren</string>
+ <string name="feed_delete_confirmation_msg">Bitte bestätige, dass du den Podcast \"%1$s\" und ALL dessen Episoden entfernen möchtest (auch heruntergeladene).</string>
+ <string name="feed_remover_msg">Podcast wird entfernt</string>
+ <string name="load_complete_feed">Kompletten Podcast aktualisieren</string>
<string name="batch_edit">Stapelbearbeitung</string>
<string name="select_all_above">Alles oberhalb auswählen</string>
<string name="select_all_below">Alles unterhalb auswählen</string>
@@ -156,7 +156,7 @@
<string name="stream_label">Streamen</string>
<string name="delete_label">Löschen</string>
<string name="delete_failed">Die Datei kann nicht gelöscht werden. Eventuell hilft es, das Gerät neu zu starten.</string>
- <string name="delete_episode_label">Episode entfernen</string>
+ <string name="delete_episode_label">Episode löschen</string>
<plurals name="deleted_episode_batch_label">
<item quantity="one">%d Episode gelöscht.</item>
<item quantity="other">%d Episoden gelöscht.</item>
@@ -272,7 +272,7 @@
<string name="date">Datum</string>
<string name="duration">Dauer</string>
<string name="episode_title">Episodentitel</string>
- <string name="feed_title">Feedname</string>
+ <string name="feed_title">Podcast-Name</string>
<string name="random">Zufällig</string>
<string name="smart_shuffle">Schlaues Mischen</string>
<string name="ascending">Aufsteigend</string>
@@ -320,7 +320,7 @@
<string name="appearance">Erscheinungsbild</string>
<string name="external_elements">Externe Elemente</string>
<string name="interruptions">Unterbrechungen</string>
- <string name="playback_control">Wiedergabesteurung</string>
+ <string name="playback_control">Wiedergabesteuerung</string>
<string name="preference_search_hint">Suchen…</string>
<string name="preference_search_no_results">Keine Ergebnisse</string>
<string name="preference_search_clear_history">Verlauf leeren</string>
@@ -369,7 +369,7 @@
<string name="user_interface_label">Benutzeroberfläche</string>
<string name="pref_set_theme_title">Theme auswählen</string>
<string name="pref_nav_drawer_items_title">Seitenleiste ändern</string>
- <string name="pref_nav_drawer_items_sum">Ändere, welche Listen in der Seitenleiste erscheinen</string>
+ <string name="pref_nav_drawer_items_sum">Ändere, welche Einträge in der Seitenleiste erscheinen</string>
<string name="pref_nav_drawer_feed_order_title">Reihenfolge der Abonnements einstellen</string>
<string name="pref_nav_drawer_feed_order_sum">Ändere die Reihenfolge deiner Abonnements</string>
<string name="pref_nav_drawer_feed_counter_title">Abonnement-Zähler einstellen</string>
@@ -462,7 +462,7 @@
<string name="pref_enqueue_downloaded_summary">Füge heruntergeladene Episoden zur Abspielliste hinzu</string>
<string name="media_player_builtin">Androids eingebauter Abspieler</string>
<string name="pref_skip_silence_title">Stille im Ton überspringen</string>
- <string name="pref_videoBehavior_title">Beim Beenden des Videos</string>
+ <string name="pref_videoBehavior_title">Beim Beenden von Videos</string>
<string name="pref_videoBehavior_sum">Verhalten beim Verlassen der Video-Wiedergabe</string>
<string name="stop_playback">Wiedergabe anhalten</string>
<string name="continue_playback">Audiowiedergabe fortsetzen</string>
@@ -493,8 +493,8 @@
<string name="search_hint">Suche nach Episoden</string>
<string name="found_in_shownotes_label">In Shownotizen gefunden</string>
<string name="found_in_chapters_label">In Kapiteln gefunden</string>
- <string name="found_in_authors_label">Gefunden in Autor(en)</string>
- <string name="found_in_feeds_label">Gefunden in Podcast</string>
+ <string name="found_in_authors_label">In Autor(en) gefunden</string>
+ <string name="found_in_feeds_label">In Podcast gefunden</string>
<string name="search_status_no_results">Keine Ergebnisse gefunden</string>
<string name="search_label">Suchen</string>
<string name="found_in_title_label">In Titel gefunden</string>
@@ -676,7 +676,7 @@
<string name="audio_effects">Audioeffekte</string>
<string name="stereo_to_mono">Heruntermischen: Stereo zu Mono</string>
<string name="sonic_only">nur Sonic</string>
- <string name="exoplayer_only">Nur ExoPlayer</string>
+ <string name="exoplayer_only">nur ExoPlayer</string>
<!--proxy settings-->
<string name="proxy_type_label">Typ</string>
<string name="host_label">Host</string>
diff --git a/core/src/main/res/values-fr/strings.xml b/core/src/main/res/values-fr/strings.xml
index 4418289e9..a27013c44 100644
--- a/core/src/main/res/values-fr/strings.xml
+++ b/core/src/main/res/values-fr/strings.xml
@@ -261,7 +261,7 @@
<string name="unlock_queue">Déverrouiller la liste de lecture</string>
<string name="queue_locked">Liste de lecture verrouillée</string>
<string name="queue_unlocked">Liste de lecture déverrouillée</string>
- <string name="queue_lock_warning">Lorsque la liste est verrouillée le swipe n\'est pas possible et l\'ordre des épisodes ne peut être changé.</string>
+ <string name="queue_lock_warning">Quand la liste est verrouillée il n\'est plus possible d\'utiliser le swipe ou de changer l\'ordre des épisodes.</string>
<string name="checkbox_do_not_show_again">Ne pas réafficher</string>
<string name="clear_queue_label">Effacer la liste de lecture</string>
<string name="undo">Annuler</string>
@@ -358,10 +358,10 @@
<string name="pref_unpauseOnHeadsetReconnect_title">Connexion des écouteurs</string>
<string name="pref_unpauseOnBluetoothReconnect_title">Connexion du Bluetooth</string>
<string name="pref_stream_over_download_title">Préférer le streaming</string>
- <string name="pref_stream_over_download_sum">Afficher dans les listes le bouton du stream au lieu de celui de téléchargement.</string>
+ <string name="pref_stream_over_download_sum">Afficher dans les listes le bouton du streaming au lieu de celui du téléchargement.</string>
<string name="pref_mobileUpdate_title">Utilisation de la connexion mobile</string>
<string name="pref_mobileUpdate_sum">Choisir ce qui est autorisé lorsque la connexion mobile est utilisée</string>
- <string name="pref_mobileUpdate_refresh">Rafraîchissement des flux</string>
+ <string name="pref_mobileUpdate_refresh">Mise à jour des flux</string>
<string name="pref_mobileUpdate_images">Récupération des images</string>
<string name="pref_mobileUpdate_auto_download">Téléchargement automatique</string>
<string name="pref_mobileUpdate_episode_download">Téléchargement d\'épisodes</string>
@@ -387,7 +387,7 @@
<string name="pref_episode_cache_title">Nombre d\'épisodes stockés</string>
<string name="pref_episode_cache_summary">Nombre maximum d\'épisodes stockés sur l\'appareil. Le téléchargement automatique sera suspendu si ce nombre est atteint.</string>
<string name="pref_episode_cover_title">Image des épisodes</string>
- <string name="pref_episode_cover_summary">Lorsqu\'elle existe, utiliser l\'image propre aux épisodes au lieu de celle du podcast.</string>
+ <string name="pref_episode_cover_summary">Lorsqu\'elles existent, utiliser les images propres aux épisodes au lieu de celle du podcast.</string>
<string name="pref_theme_title_use_system">Thème du système</string>
<string name="pref_theme_title_light">Clair</string>
<string name="pref_theme_title_dark">Sombre</string>
@@ -413,7 +413,7 @@
<string name="pref_gpodnet_notifications_sum">Ce paramètre ne s\'applique pas aux erreurs d\'authentification.</string>
<string name="pref_playback_speed_title">Vitesses de lecture</string>
<string name="pref_playback_speed_sum">Définir les vitesses disponibles lors de la lecture audio</string>
- <string name="pref_feed_playback_speed_sum">Vitesse de lecture pour les épisodes de ce flux</string>
+ <string name="pref_feed_playback_speed_sum">Vitesse de lecture par défaut pour les épisodes de ce flux</string>
<string name="pref_playback_time_respects_speed_title">Ajuster les informations en fonction la vitesse de lecture</string>
<string name="pref_playback_time_respects_speed_sum">La position et la durée affichée tiendront compte de la vitesse de lecture.</string>
<string name="pref_fast_forward">Durée du saut avant</string>
@@ -725,7 +725,7 @@
<string name="notification_channel_error_description">S\'affiche en cas de problème. Par exemple, un téléchargement ou une synchronisation qui échoue.</string>
<string name="import_bad_file">Fichier invalide/corrompu</string>
<!--Widget settings-->
- <string name="widget_settings">Préférences des widget</string>
+ <string name="widget_settings">Préférences des widgets</string>
<string name="widget_create_button">Créer un widget</string>
<string name="widget_opacity">Opacité</string>
</resources>
diff --git a/core/src/main/res/values-gl-rES/strings.xml b/core/src/main/res/values-gl-rES/strings.xml
index 4a0131a20..42b46be47 100644
--- a/core/src/main/res/values-gl-rES/strings.xml
+++ b/core/src/main/res/values-gl-rES/strings.xml
@@ -23,7 +23,7 @@
<string name="gpodnet_summary">Sincronizar con outros dispositivos</string>
<string name="gpodnet_auth_label">gpodder.net Conexión</string>
<string name="episode_cache_full_title">Caché de episodios chea</string>
- <string name="episode_cache_full_message">Acadouse o límite de espazo na caché de episodios. Pode incrementalo nos Axustes do tamaño da caché.</string>
+ <string name="episode_cache_full_message">Acadouse o límite de espazo na caché de episodios. Podes incrementalo nos Axustes do tamaño da caché.</string>
<!--Statistics fragment-->
<string name="total_time_listened_to_podcasts">Tempo total dos podcast reproducidos:</string>
<string name="statistics_details_dialog">%1$d de %2$d episodios iniciados.\n\nReproducidos %3$s de %4$s.</string>
@@ -68,7 +68,7 @@
<string name="error_msg_prefix">Produciuse un fallo:</string>
<string name="needs_storage_permission">Precísase o permiso de almacenamento para esta operación</string>
<string name="refresh_label">Actualizar</string>
- <string name="external_storage_error_msg">Non se dispón de almacenamento externo. Por favor asegúrese de que o almacenamento externo está montado e así a aplicación poderá funcionar correctamente.</string>
+ <string name="external_storage_error_msg">Non se dispón de almacenamento externo. Por favor asegúrate de que o almacenamento externo está montado e así a aplicación poderá funcionar correctamente.</string>
<string name="chapters_label">Capítulos</string>
<string name="chapter_duration">Duración: %1$s</string>
<string name="description_label">Descrición</string>
@@ -79,7 +79,7 @@
<string name="retry_label">Reintentar</string>
<string name="auto_download_label">Incluír en descargas automáticas</string>
<string name="auto_download_apply_to_items_title">Aplicar a episodios previos</string>
- <string name="auto_download_apply_to_items_message">A nova función <i>Descarga automática</i> aplicarase automáticamente aos novos episodios.\nQuere que tamén se aplique aos episodios publicados con anterioridade?</string>
+ <string name="auto_download_apply_to_items_message">A nova función <i>Descarga automática</i> aplicarase automáticamente aos novos episodios.\nQueres que tamén se aplique aos episodios publicados con anterioridade?</string>
<string name="auto_delete_label">Borrado automático do episodio</string>
<string name="parallel_downloads_suffix">\u0020descargas paralelas</string>
<string name="feed_auto_download_global">Valor xeral por omisión</string>
@@ -111,8 +111,8 @@
<string name="mark_all_read_confirmation_msg">Por favor confirme que quere marcar todos os episodios como reproducidos.</string>
<string name="mark_all_read_feed_confirmation_msg">Por favor, confirme que quere marcar todos os episodios deste podcast como reproducidos.</string>
<string name="remove_all_new_flags_label">Quitarlle a marca de \"novidade\" a todo</string>
- <string name="removed_all_new_flags_msg">Eliminou todas as \"novas\" marcas</string>
- <string name="remove_all_new_flags_confirmation_msg">Por favor, confirme que quere quitar marca de \"novidade\" a todos os episodios.</string>
+ <string name="removed_all_new_flags_msg">Eliminaches o aviso de \"novos\" episodios</string>
+ <string name="remove_all_new_flags_confirmation_msg">Confirma que queres quitarlle marca de \"novidade\" a todos os episodios.</string>
<string name="show_info_label">Mostrar información</string>
<string name="show_feed_settings_label">Mostrar axustes do podcast</string>
<string name="feed_info_label">Información do podcast</string>
@@ -235,7 +235,7 @@
<string name="authentication_notification_title">Precísase autenticación</string>
<string name="authentication_notification_msg">O recurso solicitado require un usuario e contrasinal</string>
<string name="confirm_mobile_download_dialog_title">Confirme a descarga con datos do móbil</string>
- <string name="confirm_mobile_download_dialog_message_not_in_queue">Descargar coa conexión de datos do móbil está desactivada nos axustes.\n\nPode escoller ben só engadir o episodio a cola ou pode permitir a descarga temporalmente.\n\n<small> A súa elección lembrarase durante 10 minutos.</small></string>
+ <string name="confirm_mobile_download_dialog_message_not_in_queue">Descargar coa conexión de datos do móbil está desactivada nos axustes.\n\nPodes escoller ben só engadir o episodio a cola ou podes permitir a descarga temporalmente.\n\n<small> A túa elección lembrarase durante 10 minutos.</small></string>
<string name="confirm_mobile_download_dialog_message">A descarga con datos móbiles está desactivada nos axustes.\n\nQuere permitir a descarga temporalmente?\n\n <small>A súa decisión lembrarase durante 10 minutos.</small></string>
<string name="confirm_mobile_streaming_notification_title">Confirmar retransmisión Móbil</string>
<string name="confirm_mobile_streaming_notification_message">Desactivouse nos axustes Retransmitir mediante a conexión de datos. Toque para retransmitir igualmente.</string>
@@ -262,7 +262,7 @@
<string name="queue_locked">Cola bloqueada</string>
<string name="queue_unlocked">Cola desbloqueada</string>
<string name="queue_lock_warning">Se bloqueas a cola, non poderás quitar ou mover os episodios.</string>
- <string name="checkbox_do_not_show_again">Non mostrar outra vez</string>
+ <string name="checkbox_do_not_show_again">Non mostrar de novo</string>
<string name="clear_queue_label">Limpar cola</string>
<string name="undo">Desfacer</string>
<string name="move_to_top_label">Mover arriba</string>
@@ -288,12 +288,12 @@
<string name="enable_sonic">Habilitar Sonic</string>
<!--Empty list labels-->
<string name="no_items_header_label">Sen episodios na cola</string>
- <string name="no_items_label">Engada un episodio descargándoo, ou manteña preso un episodio e escolla \"Engadir a cola\".</string>
+ <string name="no_items_label">Engade un episodio descargándoo, ou mantén preso un episodio e escolle \"Engadir a cola\".</string>
<string name="no_shownotes_label">Este episodio non ten notas de episodio.</string>
<string name="no_run_downloads_head_label">Sen descargas activas</string>
- <string name="no_run_downloads_label">Pode descargar episodios na pantalla con detalles do episodio.</string>
+ <string name="no_run_downloads_label">Podes descargar episodios na pantalla con detalles do podcast.</string>
<string name="no_comp_downloads_head_label">Sen episodios descargados</string>
- <string name="no_comp_downloads_label">Pode descargar episodios na pantalla de detalles do podcast.</string>
+ <string name="no_comp_downloads_label">Podes descargar episodios na pantalla de detalles do podcast.</string>
<string name="no_log_downloads_head_label">Sen rexistro da descarga</string>
<string name="no_log_downloads_label">Os rexistros de descarga aparecerán aquí se están dispoñibles.</string>
<string name="no_history_head_label">Sen Historial</string>
@@ -301,9 +301,9 @@
<string name="no_all_episodes_head_label">Sen episodios</string>
<string name="no_all_episodes_label">Cando engade un podcast, os episodios mostraranse aquí.</string>
<string name="no_new_episodes_head_label">Sen episodios novos</string>
- <string name="no_new_episodes_label">Cando reciba novos episodios, mostraranse aquí.</string>
+ <string name="no_new_episodes_label">Cando recibas novos episodios, mostraranse aquí.</string>
<string name="no_fav_episodes_head_label">Sen episodios favoritos</string>
- <string name="no_fav_episodes_label">Pode engadir episodios aos favoritos manténdoos pulsados.</string>
+ <string name="no_fav_episodes_label">Podes engadir episodios aos favoritos manténdoos presos.</string>
<string name="no_chapters_head_label">Sen capítulos</string>
<string name="no_chapters_label">Este episodio non ten capítulos.</string>
<string name="no_subscriptions_head_label">Sen subscricións</string>
@@ -326,12 +326,12 @@
<string name="preference_search_clear_history">Limpar historial</string>
<string name="media_player">Reprodutor de medios</string>
<string name="pref_episode_cleanup_title">Limpeza de episodios</string>
- <string name="pref_episode_cleanup_summary">Os episodios que non están na cola e tampouco son favoritos deberían poder ser candidatos a ser eliminados si a función Descarga Automática precisa espazo para novos episodios.</string>
+ <string name="pref_episode_cleanup_summary">Os episodios que non están na cola e tampouco son favoritos deberían poder ser candidatos a ser eliminados se a función Descarga Automática precisa espazo para novos episodios.</string>
<string name="pref_pauseOnDisconnect_sum">Deter a reprodución cando se desconectan os auriculares ou bluetooth</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Retomar a reprodución cando se conectan os auriculares</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Retomar a reprodución cando se reconecta o bluetooth</string>
<string name="pref_hardwareForwardButtonSkips_title">O botón Adiante salta</string>
- <string name="pref_hardwareForwardButtonSkips_sum">A premer no botón de adiante nun dispositivo conectado por bluetooth ir ao episodio seguinte en vez dun avance rápido</string>
+ <string name="pref_hardwareForwardButtonSkips_sum">A premer no botón de adiante nun dispositivo conectado por bluetooth ir ao episodio seguinte no lugar de avance rápido</string>
<string name="pref_hardwarePreviousButtonRestarts_title">O botón Anterior reinicia</string>
<string name="pref_hardwarePreviousButtonRestarts_sum">Cando se presiona Anterior no dispositivo reinicia o episodio no lugar de ir cara atrás</string>
<string name="pref_followQueue_sum">Saltar ao seguinte elemento na cola cando remata o episodio</string>
@@ -347,7 +347,7 @@
<string name="network_pref">Rede</string>
<string name="pref_autoUpdateIntervallOrTime_title">Intervalo de actualización ou Hora do día</string>
<string name="pref_autoUpdateIntervallOrTime_sum">Indicar un intervalo ou unha hora en concreto para actualizar automaticamente as fontes</string>
- <string name="pref_autoUpdateIntervallOrTime_message">Pode establecer un <i>intervalo</i> como \"2 horas\", unha <i>hora do día</i> en concreto como \"7:00 AM\" ou <i>desactivar</i> totalmente a actualización automática.\n\n<small>Aviso: pode haber un lixeiro retardo do momento da actualización.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Podes establecer un <i>intervalo</i> como \"2 horas\", unha <i>hora do día</i> en concreto como \"7:00 AM\" ou <i>desactivar</i> totalmente a actualización automática.\n\n<small>Aviso: pode haber un lixeiro retardo do momento da actualización.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Desactivar</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Establecer intervalo</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Establecer hora do día</string>
@@ -360,17 +360,17 @@
<string name="pref_stream_over_download_title">Preferir Difusión</string>
<string name="pref_stream_over_download_sum">Mostrar botón de difusión no lugar de botón de descarga nas listas.</string>
<string name="pref_mobileUpdate_title">Actualizacións Móbil</string>
- <string name="pref_mobileUpdate_sum">Escolla o que estará permitido utilizando conexión de datos do móbil</string>
+ <string name="pref_mobileUpdate_sum">Escolle o que estará permitido utilizando conexión de datos do móbil</string>
<string name="pref_mobileUpdate_refresh">Actualizar fontes</string>
<string name="pref_mobileUpdate_images">Imaxes de portadas</string>
<string name="pref_mobileUpdate_auto_download">Descarga automática</string>
<string name="pref_mobileUpdate_episode_download">Descarga de episodio</string>
<string name="pref_mobileUpdate_streaming">Retransmisión</string>
<string name="user_interface_label">Interface de usuaria</string>
- <string name="pref_set_theme_title">Escolla o decorado</string>
- <string name="pref_nav_drawer_items_title">Estableza os elementos da Caixa de navegación</string>
+ <string name="pref_set_theme_title">Escolle o decorado</string>
+ <string name="pref_nav_drawer_items_title">Escoller os elementos da Caixa de navegación</string>
<string name="pref_nav_drawer_items_sum">Cambie os elementos que aparecerán na Caixa de navegación</string>
- <string name="pref_nav_drawer_feed_order_title">Estableza a orde das subscricións</string>
+ <string name="pref_nav_drawer_feed_order_title">Indicar a orde das subscricións</string>
<string name="pref_nav_drawer_feed_order_sum">Cambie a orde das subscricións</string>
<string name="pref_nav_drawer_feed_counter_title">Establecer o contador de subscricións</string>
<string name="pref_nav_drawer_feed_counter_sum">Cambiar a información mostrada polo contador de subscricións. Tamén afecta á orde das subscricións se \"Orde das subscricións\" está establecida a \"Contador\".</string>
@@ -412,14 +412,14 @@
<string name="pref_gpodnet_notifications_title">Mostrar notificacións de erros na sincronización.</string>
<string name="pref_gpodnet_notifications_sum">Esta preferencia non se aplica a fallos na autenticación.</string>
<string name="pref_playback_speed_title">Velocidades de reprodución</string>
- <string name="pref_playback_speed_sum">Personalice a velocidade variable de reprodución de audio</string>
+ <string name="pref_playback_speed_sum">Personaliza a velocidade variable de reprodución de audio</string>
<string name="pref_feed_playback_speed_sum">A velocidade a utilizar cando se reproduce o audio dos episodios de esta fonte</string>
<string name="pref_playback_time_respects_speed_title">Axustar info dos medios a velocidade de reprodución</string>
<string name="pref_playback_time_respects_speed_sum">A posición mostrada e a duración están adaptadas a velocidade de reprodución</string>
<string name="pref_fast_forward">Avance rápido Salta tempo</string>
- <string name="pref_fast_forward_sum">Personalice o número de segundos a avanzar cando o se pulsa o botón de avance rápido</string>
+ <string name="pref_fast_forward_sum">Personaliza o número de segundos a avanzar cando o se preme o botón de avance rápido</string>
<string name="pref_rewind">Retroceso Salta tempo</string>
- <string name="pref_rewind_sum">Personalice o número de segundos que se retrocede na reprodución cando se pulsa o botón retroceso</string>
+ <string name="pref_rewind_sum">Personaliza o número de segundos que se retrocede na reprodución cando se preme o botón retroceso</string>
<string name="pref_gpodnet_sethostname_title">Establecer servidor</string>
<string name="pref_gpodnet_sethostname_use_default_host">Utilizar servidor por omisión</string>
<string name="pref_expandNotify_title">Alta prioridade nas notificacións</string>
@@ -428,13 +428,14 @@
<string name="pref_persistNotify_sum">Manter notificación e controles na pantalla de bloqueo cando a reprodución está pausada.</string>
<string name="pref_compact_notification_buttons_title">Establecer botóns de pantalla de bloqueo</string>
<string name="pref_compact_notification_buttons_sum">Cambiar os botóns de reprodución na pantalla de bloqueo. O botón reproducir/pausa sempre se inclúe.</string>
- <string name="pref_compact_notification_buttons_dialog_title">Escolla un máximo de %1$d elementos</string>
- <string name="pref_compact_notification_buttons_dialog_error">Só pode selecionar un máximo de %1$d elementos.</string>
+ <string name="pref_compact_notification_buttons_dialog_title">Escolle un máximo de %1$d elementos</string>
+ <string name="pref_compact_notification_buttons_dialog_error">Só podes selecionar un máximo de %1$d elementos.</string>
<string name="pref_lockscreen_background_title">Establecer fondo da pantalla de bloqueo</string>
<string name="pref_lockscreen_background_sum">Establecer o fondo de pantalla de bloqueo coa imaxe do episodio actual. Como consecuencia, esto tamén mostrará a imaxe en aplicacións de terceiros.</string>
<string name="pref_showDownloadReport_title">Mostrar informe de descarga</string>
<string name="pref_showDownloadReport_sum">Si falla a descarga, xerar un informe que informe dos detalles do fallo.</string>
<string name="pref_expand_notify_unsupport_toast">As versións de Android anteriores a 4.1 non teñen soporte para notificacións expandidas.</string>
+ <string name="pref_enqueue_location_title">Situación na cola</string>
<string name="pref_enqueue_location_sum">Engadir episodios a: %1$s</string>
<string name="enqueue_location_back">Atrás</string>
<string name="enqueue_location_front">Diante</string>
@@ -448,7 +449,7 @@
<string name="copy_to_clipboard">Copiar ó portapapeis</string>
<string name="copied_to_clipboard">Copiado ó portapapeis</string>
<string name="experimental_pref">En probas</string>
- <string name="pref_media_player_message">Escolla o reprodutor de medios para reproducir ficheiros</string>
+ <string name="pref_media_player_message">Escolle o reprodutor de medios para reproducir ficheiros</string>
<string name="pref_current_value">Valor actual: %1$s</string>
<string name="pref_proxy_title">Proxy</string>
<string name="pref_proxy_sum">Establecer un proxy para a rede</string>
@@ -500,7 +501,7 @@
<string name="no_results_for_query">Non hai resultados para \"%1$s\"</string>
<!--OPML import and export-->
<string name="opml_import_option">Opción %1$d</string>
- <string name="opml_import_explanation_1">Escolla unha ruta de ficheiro concreta no sistema de ficheiros local.</string>
+ <string name="opml_import_explanation_1">Escolle unha ruta de ficheiro concreta no sistema de ficheiros local.</string>
<string name="opml_import_explanation_3">Moitas aplicacións, como Google Mail, Dropbox, Google Drive e a maioría dos xestores de ficheiros poden <i>abrir</i> ficheiros OPML <i>con</i> AntennaPod.</string>
<string name="opml_import_label">Importar OPML</string>
<string name="reading_opml_label">Lendo ficheiro OPML</string>
@@ -552,21 +553,21 @@
<string name="gpodnetauth_login_title">Conexión</string>
<string name="gpodnetauth_login_descr">Benvida ao proceso de conexión a gpodder.net. Primeiro, escriba os seus datos de conexión:</string>
<string name="gpodnetauth_login_butLabel">Conexión</string>
- <string name="gpodnetauth_login_register">Se aínda non ten unha conta, pode crear unha aquí:\nhttps://gpodder.net/register/</string>
+ <string name="gpodnetauth_login_register">Se aínda non tes unha conta, podes crear unha aquí:\nhttps://gpodder.net/register/</string>
<string name="username_label">Nome de usuaria</string>
<string name="password_label">Contrasinal</string>
<string name="gpodnetauth_device_title">Selección de dispositivo</string>
- <string name="gpodnetauth_device_descr">Crear un novo dispositivo para usar coa sua conta gpodder.net ou escoller un existente:</string>
+ <string name="gpodnetauth_device_descr">Crear un novo dispositivo para usar coa túa conta gpodder.net ou escoller un existente:</string>
<string name="gpodnetauth_device_deviceID">ID de dispositivo:\u0020</string>
<string name="gpodnetauth_device_caption">Título</string>
<string name="gpodnetauth_device_butCreateNewDevice">Crear un novo dispositivo</string>
<string name="gpodnetauth_device_chooseExistingDevice">Escolle un novo dispositivo:</string>
- <string name="gpodnetauth_device_errorEmpty">O ID do dispositivo non pode quedar baldeiro</string>
+ <string name="gpodnetauth_device_errorEmpty">O ID do dispositivo non pode quedar baleiro</string>
<string name="gpodnetauth_device_errorAlreadyUsed">ID de dispositivo xa en uso</string>
- <string name="gpodnetauth_device_caption_errorEmpty">Non pode quedar baldeiro o titulo</string>
+ <string name="gpodnetauth_device_caption_errorEmpty">O título non pode estar baleiro</string>
<string name="gpodnetauth_device_butChoose">Escoller</string>
<string name="gpodnetauth_finish_title">Conexión correcta!</string>
- <string name="gpodnetauth_finish_descr">Parabéns! A súa conta gpodder.net está conectada ao dispositivo. AntennaPod poderá agora sincronizar automaticamente as súas subscricións no dispositivo na conta de gpodder.net</string>
+ <string name="gpodnetauth_finish_descr">Parabéns! A túa conta gpodder.net está conectada ao dispositivo. AntennaPod poderá agora sincronizar automaticamente as túas subscricións no dispositivo na conta de gpodder.net</string>
<string name="gpodnetauth_finish_butsyncnow">Iniciar a sincronización</string>
<string name="gpodnetauth_finish_butgomainscreen">Ir a pantalla principal</string>
<string name="gpodnetsync_auth_error_title">fallo na autenticación en gpodder.net</string>
@@ -580,20 +581,20 @@
<string name="selected_folder_label">Cartafol escollido:</string>
<string name="create_folder_label">Crear cartafol</string>
<string name="choose_data_directory">Escoller cartafol de datos</string>
- <string name="choose_data_directory_message">Por favor escolla a base do cartafol dos seus datos. AntennaPod creará os subcartafoles axeitados.</string>
+ <string name="choose_data_directory_message">Por favor escolle a base do cartafol dos teus datos. AntennaPod creará os subcartafoles axeitados.</string>
<string name="choose_data_directory_permission_rationale">Precísase o acceso ao almacenamento externo para mudar o cartafol de datos</string>
<string name="choose_data_directory_available_space">%1$s de %2$s libre</string>
<string name="create_folder_msg">Crear un novo cartafol de nome \"%1$s\"?</string>
<string name="create_folder_success">Novo cartafol creado</string>
- <string name="create_folder_error_no_write_access">Non se pode escribir en este cartafol</string>
+ <string name="create_folder_error_no_write_access">Non se pode escribir neste cartafol</string>
<string name="create_folder_error_already_exists">O cartafol xa existe</string>
<string name="create_folder_error">Non se creou o cartafol</string>
<string name="folder_does_not_exist_error">\"%1$s\" non existe</string>
<string name="folder_not_readable_error">\"%1$s\" non se pode ler</string>
<string name="folder_not_writable_error">non se pode escribir en \"%1$s\"</string>
- <string name="folder_not_empty_dialog_title">O cartafol non está baldeiro</string>
- <string name="folder_not_empty_dialog_msg">O cartafol escollido non está baldeiro. As descargas de medios e outros ficheiros situaranse directamente en este cartafol. Proceder de todos xeitos?</string>
- <string name="set_to_default_folder">Escolla o cartafol por omisión</string>
+ <string name="folder_not_empty_dialog_title">O cartafol non está baleiro</string>
+ <string name="folder_not_empty_dialog_msg">O cartafol escollido non está baleiro. As descargas de medios e outros ficheiros situaranse directamente neste cartafol. Utilizalo igualmente?</string>
+ <string name="set_to_default_folder">Escolle o cartafol por omisión</string>
<string name="pref_pausePlaybackForFocusLoss_sum">Pausar a reprodución en lugar de baixar o volume cando outra aplicación quere reproducir un son.</string>
<string name="pref_pausePlaybackForFocusLoss_title">Pausa para interrupcións</string>
<string name="pref_resumeAfterCall_sum">Retomar a reprodución despois de rematar a chamada telefónica</string>
@@ -685,7 +686,7 @@
<string name="proxy_checking">Comprobando...</string>
<string name="proxy_test_successful">Proba exitosa</string>
<string name="proxy_test_failed">Fallo na proba</string>
- <string name="proxy_host_empty_error">Servidor non pode quedar baldeiro</string>
+ <string name="proxy_host_empty_error">Servidor non pode quedar baleiro</string>
<string name="proxy_host_invalid_error">O servidor indicado non é un dominio ou IP válidos</string>
<string name="proxy_port_invalid_error">Porto non válido</string>
<!--Subscriptions fragment-->
@@ -695,7 +696,7 @@
<string name="import_export_warning">Esta función experimental utilízase para transferir as súas subscricións e episodios reproducidos noutro dispositivo.\n\nAs bases de datos exportadas só se poden importar se utiliza a misma versión de AntennaPod. De todos xeitos, esta función pode comportarse de xeito raro.\n\nDespois de importar, os episodios poderían ser mostrados como descargados sin telo sido. Simplemente pulse o botón de reprodución dos episodios para que AntennaPod detecte esto.</string>
<string name="label_import">Importar</string>
<string name="label_export">Exportar</string>
- <string name="import_select_file">Escolla o ficheiro a importar</string>
+ <string name="import_select_file">Escolle o ficheiro a importar</string>
<string name="export_ok">Exportado con éxito.</string>
<string name="import_ok">Importación correcta.\n\nPulse OK para reiniciar AntennaPod</string>
<!--Casting-->
@@ -708,7 +709,7 @@
<!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
<string name="cast_failed_setting_volume">Non se puido establecer o volume</string>
<string name="cast_failed_no_connection">Non hai conexión ao dispositivo de emisión</string>
- <string name="cast_failed_no_connection_trans">Perdeuse a conexión ao dispositivo de emisión. A aplicación está a intentar restablecela se fose posible. Por favor, agarde uns segundos e inténteo de novo.</string>
+ <string name="cast_failed_no_connection_trans">Perdeuse a conexión ao dispositivo de emisión. A aplicación está a intentar restablecela se fose posible. Por favor, agarda uns intres e inténtao outra vez.</string>
<string name="cast_failed_status_request">Fallo de sincronización co dispositivo de emisión</string>
<string name="cast_failed_seek">Non se puido cambiar a posición no dispositivo de emisión</string>
<string name="cast_failed_receiver_player_error">O reprodutor receptor atopou un fallo grave</string>
diff --git a/core/src/main/res/values-hu/strings.xml b/core/src/main/res/values-hu/strings.xml
index b84d1900a..c82d505db 100644
--- a/core/src/main/res/values-hu/strings.xml
+++ b/core/src/main/res/values-hu/strings.xml
@@ -720,6 +720,7 @@
<string name="notification_channel_error_description">Akkor látszik, ha hiba történt, például ha a letöltés vagy a gpodder szinkronizálás sikertelen.</string>
<string name="import_bad_file">Érvénytelen/sérült fájl</string>
<!--Widget settings-->
+ <string name="widget_settings">Widget beállítások</string>
<string name="widget_create_button">Widget létrehozása</string>
<string name="widget_opacity">Átlátszatlanság</string>
</resources>
diff --git a/core/src/main/res/values-it/strings.xml b/core/src/main/res/values-it/strings.xml
index 384368d35..cef128007 100644
--- a/core/src/main/res/values-it/strings.xml
+++ b/core/src/main/res/values-it/strings.xml
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!--Activitiy and fragment titles-->
- <string name="feed_update_receiver_name">Aggiorna Sottoscrizioni</string>
+ <string name="feed_update_receiver_name">Aggiorna sottoscrizioni</string>
<string name="feeds_label">Feed</string>
<string name="statistics_label">Statistiche</string>
<string name="add_feed_label">Aggiungi un podcast</string>
@@ -17,7 +17,7 @@
<string name="downloads_log_label">Registro</string>
<string name="subscriptions_label">Sottoscrizioni</string>
<string name="subscriptions_list_label">Elenco sottoscrizioni</string>
- <string name="cancel_download_label">Annulla\nil Download</string>
+ <string name="cancel_download_label">Annulla\nil download</string>
<string name="playback_history_label">Cronologia riproduzioni</string>
<string name="gpodnet_main_label">gpodder.net</string>
<string name="gpodnet_summary">Sincronizza con altri dispositivi</string>
@@ -28,15 +28,15 @@
<string name="total_time_listened_to_podcasts">Tempo totale di riproduzione:</string>
<string name="statistics_details_dialog">%1$d di %2$d episodi iniziati.\n\nRiprodotti %3$s di %4$s.</string>
<string name="statistics_mode">Modalità di calcolo</string>
- <string name="statistics_mode_normal">Calcola il tempo di riproduzione reale. Riprodurre un podcast due volte verrà contato due volte, segnarlo come riprodotto no.</string>
+ <string name="statistics_mode_normal">Tempo di riproduzione reale. Riprodurre due volte un episodio verrà contato doppio, segnarlo come riprodotto no.</string>
<string name="statistics_mode_count_all">Somma il tempo di riproduzione di tutti i podcast segnati come riprodotti</string>
- <string name="statistics_speed_not_counted">Avviso: La velocità di riproduzione non viene considerata.</string>
+ <string name="statistics_speed_not_counted">Avviso: la velocità di riproduzione non viene considerata.</string>
<string name="statistics_reset_data">Resetta statistiche</string>
- <string name="statistics_reset_data_msg">Verranno eliminate le statistiche del tempo di riproduzione per tutti gli episodi. Sei sicuro?</string>
+ <string name="statistics_reset_data_msg">Verranno eliminate le statistiche sul tempo di riproduzione di tutti gli episodi. Sei sicuro?</string>
<!--Main activity-->
<string name="drawer_open">Apri il menù</string>
<string name="drawer_close">Chiudi il menù</string>
- <string name="drawer_preferences">Preferenze del Drawer</string>
+ <string name="drawer_preferences">Preferenze del drawer</string>
<string name="drawer_feed_order_unplayed_episodes">Ordina per contatore</string>
<string name="drawer_feed_order_alphabetical">Ordina alfabeticamente</string>
<string name="drawer_feed_order_last_update">Ordina per data di pubblicazione</string>
@@ -47,13 +47,13 @@
<string name="drawer_feed_counter_downloaded">Numero di episodi scaricati</string>
<string name="drawer_feed_counter_none">Nulla</string>
<!--Webview actions-->
- <string name="open_in_browser_label">Apri nel Browser</string>
+ <string name="open_in_browser_label">Apri nel browser</string>
<string name="copy_url_label">Copia URL</string>
<string name="share_url_label">Condividi URL</string>
<string name="copied_url_msg">URL copiato negli appunti</string>
<string name="go_to_position_label">Vai a questa posizione</string>
<!--Playback history-->
- <string name="clear_history_label">Pulisci la cronologia</string>
+ <string name="clear_history_label">Svuota la cronologia</string>
<!--Other-->
<string name="confirm_label">Conferma</string>
<string name="cancel_label">Annulla</string>
@@ -68,7 +68,7 @@
<string name="error_msg_prefix">È stato rilevato un errore:</string>
<string name="needs_storage_permission">Questa operazione richiede l\'accesso alla memoria</string>
<string name="refresh_label">Aggiorna</string>
- <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="external_storage_error_msg">Spazio di archiviazione esterno non disponibile. Assicurati che sia montato per consentire all\'app di funzionare correttamente.</string>
<string name="chapters_label">Capitoli</string>
<string name="chapter_duration">Durata: %1$s</string>
<string name="description_label">Descrizione</string>
@@ -78,9 +78,9 @@
<string name="close_label">Chiudi</string>
<string name="retry_label">Riprova</string>
<string name="auto_download_label">Includi nei download automatici</string>
- <string name="auto_download_apply_to_items_title">Applica ai Precedenti Episodi</string>
- <string name="auto_download_apply_to_items_message">L\'opzione <i>Download Automatico</i> verrà applicata ai nuovi episodi.\nVuoi anche applicarla agli episodi precedenti?</string>
- <string name="auto_delete_label">Elimina Episodi Automaticamente</string>
+ <string name="auto_download_apply_to_items_title">Applica agli episodi precedenti</string>
+ <string name="auto_download_apply_to_items_message">L\'opzione <i>Download automatico</i> verrà applicata ai nuovi episodi.\nVuoi applicarla anche agli episodi precedenti?</string>
+ <string name="auto_delete_label">Elimina episodi automaticamente</string>
<string name="parallel_downloads_suffix">\u0020download paralleli</string>
<string name="feed_auto_download_global">Predefinita globale</string>
<string name="feed_auto_download_always">Sempre</string>
@@ -101,7 +101,7 @@
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">URL del feed</string>
<string name="etxtFeedurlHint">www.example.com/feed</string>
- <string name="txtvfeedurl_label">Aggiungi un Podcast tramite URL</string>
+ <string name="txtvfeedurl_label">Aggiungi un podcast tramite URL</string>
<string name="browse_gpoddernet_label">Esplora gpodder.net</string>
<string name="discover">Scopri</string>
<string name="discover_more">altro »</string>
@@ -121,14 +121,14 @@
<string name="remove_feed_label">Rimuovi podcast</string>
<string name="share_label">Condividi...</string>
<string name="share_link_label">Condividi URL episodio</string>
- <string name="share_link_with_position_label">Condividi URL dell\'episodio con la posizione</string>
+ <string name="share_link_with_position_label">Condividi URL episodio con posizione</string>
<string name="share_file_label">Condividi il file</string>
<string name="share_website_url_label">Condividi URL del sito</string>
<string name="share_feed_url_label">Condividi URL del feed</string>
<string name="share_item_url_label">Condividi URL del media</string>
- <string name="share_item_url_with_position_label">Condividi URL del media con la posizione</string>
+ <string name="share_item_url_with_position_label">Condividi URL del media con posizione</string>
<string name="feed_delete_confirmation_msg">Conferma di voler eliminare il podcast \"%1$s\" e TUTTI i suoi episodi (compresi quelli scaricati).</string>
- <string name="feed_remover_msg">Rimozione del Feed in corso</string>
+ <string name="feed_remover_msg">Rimozione podcast in corso</string>
<string name="load_complete_feed">Aggiorna podcast completo</string>
<string name="batch_edit">Modifica in gruppo</string>
<string name="select_all_above">Seleziona tutti sopra</string>
@@ -144,7 +144,7 @@
<string name="hide_is_favorite_label">E\' preferito</string>
<string name="filtered_label">Filtrati</string>
<string name="refresh_failed_msg">{fa-exclamation-circle} Ultimo aggiornamento fallito</string>
- <string name="open_podcast">Apri Podcast</string>
+ <string name="open_podcast">Apri podcast</string>
<!--actions on feeditems-->
<string name="download_label">Download</string>
<plurals name="downloading_batch_label">
@@ -186,14 +186,14 @@
<item quantity="other">%d episodi rimossi dalla coda.</item>
</plurals>
<string name="add_to_favorite_label">Aggiungi ai preferiti</string>
- <string name="added_to_favorites">Aggiunto ai Preferiti</string>
+ <string name="added_to_favorites">Aggiunto ai preferiti</string>
<string name="remove_from_favorite_label">Rimuovi dai preferiti</string>
- <string name="removed_from_favorites">Rimosso dai Preferiti</string>
+ <string name="removed_from_favorites">Rimosso dai preferiti</string>
<string name="visit_website_label">Visita il sito</string>
<string name="skip_episode_label">Salta l\'episodio</string>
<string name="activate_auto_download">Attiva il download automatico</string>
<string name="deactivate_auto_download">Disattiva il download automatico</string>
- <string name="reset_position">Azzera la Posizione di Riproduzione</string>
+ <string name="reset_position">Azzera la posizione di riproduzione</string>
<string name="removed_item">Elemento rimosso</string>
<!--Download messages and labels-->
<string name="download_successful">successo</string>
@@ -210,10 +210,10 @@
<string name="download_error_connection_error">Errore di connessione</string>
<string name="download_error_unknown_host">Host sconosciuto</string>
<string name="download_error_unauthorized">Errore di autenticazione</string>
- <string name="download_error_file_type_type">Errore Formato FIle</string>
+ <string name="download_error_file_type_type">Errore del formato file</string>
<string name="download_error_forbidden">Proibito</string>
<string name="download_canceled_msg">Download annullato</string>
- <string name="download_canceled_autodownload_enabled_msg">Download annullato\n<i>Download Automatico</i> disabilitato per questo elemento</string>
+ <string name="download_canceled_autodownload_enabled_msg">Download annullato\n<i>Download automatico</i> disabilitato per questo elemento</string>
<string name="download_report_title">Download completato con un errore (o errori)</string>
<string name="download_report_content_title">Rapporto del download</string>
<string name="download_error_malformed_url">URL malformato</string>
@@ -225,17 +225,17 @@
<item quantity="other">%d download rimanenti</item>
</plurals>
<string name="downloads_processing">Elaborazione dei download in corso</string>
- <string name="download_notification_title">Download podcast in corso</string>
+ <string name="download_notification_title">Scaricamento podcast in corso</string>
<string name="download_report_content">%1$d download con successo, %2$d falliti</string>
- <string name="download_log_title_unknown">Titolo Sconosciuto</string>
+ <string name="download_log_title_unknown">Titolo sconosciuto</string>
<string name="download_type_feed">Feed</string>
<string name="download_type_media">File multimediali</string>
<string name="download_request_error_dialog_message_prefix">Rilevato errore durante il download del file:\u0020</string>
<string name="null_value_podcast_error">Non è stato fornito alcun podcast da mostrare.</string>
<string name="authentication_notification_title">Autenticazione richiesta</string>
<string name="authentication_notification_msg">La risorsa che hai richiesto richiede un nome utente e una password</string>
- <string name="confirm_mobile_download_dialog_title">Conferma il download su cellulare</string>
- <string name="confirm_mobile_download_dialog_message_not_in_queue">Il download tramite rete mobile è disattivato nelle impostazioni.\n\nÈ possibile scegliere di aggiungere semplicemente l\'episodio alla coda o consentire temporaneamente il download.\n\n<small>La scelta verrà ricordata per 10 minuti.</small></string>
+ <string name="confirm_mobile_download_dialog_title">Conferma download su rete mobile</string>
+ <string name="confirm_mobile_download_dialog_message_not_in_queue">Il download tramite rete mobile è disattivato nelle impostazioni.\n\nPuoi scegliere di aggiungere semplicemente l\'episodio alla coda o consentire temporaneamente i download.\n\n<small>La scelta sarà valida per 10 minuti.</small></string>
<string name="confirm_mobile_download_dialog_message">Il download tramite rete mobile è disattivato nelle impostazioni.\n\nVuoi abilitare temporaneamente il download?\n\n<small>La scelta verrà ricordata per 10 minuti.</small></string>
<string name="confirm_mobile_streaming_notification_title">Conferma streaming su rete mobile</string>
<string name="confirm_mobile_streaming_notification_message">Lo streaming su rete mobile è disattivato nelle impostazioni. Tocca per avviare comunque.</string>
@@ -263,7 +263,7 @@
<string name="queue_unlocked">Coda sbloccata</string>
<string name="queue_lock_warning">Se blocchi la coda non potrai più fare swipe o riordinare gli episodi.</string>
<string name="checkbox_do_not_show_again">Non mostrare più</string>
- <string name="clear_queue_label">Svuota la Coda</string>
+ <string name="clear_queue_label">Svuota la coda</string>
<string name="undo">Undo</string>
<string name="move_to_top_label">Sposta all\'inizio</string>
<string name="move_to_bottom_label">Sposta in fondo</string>
@@ -271,7 +271,7 @@
<string name="keep_sorted">Mantieni ordinato</string>
<string name="date">Per data</string>
<string name="duration">Per durata</string>
- <string name="episode_title">Titolo dell\'episodio</string>
+ <string name="episode_title">Titolo episodio</string>
<string name="feed_title">Titolo podcast</string>
<string name="random">Casuale</string>
<string name="smart_shuffle">Casuale intelligente</string>
@@ -326,14 +326,14 @@
<string name="preference_search_clear_history">Svuota cronologia</string>
<string name="media_player">Media player</string>
<string name="pref_episode_cleanup_title">Pulizia episodi</string>
- <string name="pref_episode_cleanup_summary">Gli episodi che non sono in coda e non sono tra i preferiti potrebbero essere rimossi se i Download Automatici richiedono maggiore spazio.</string>
+ <string name="pref_episode_cleanup_summary">Gli episodi che non sono in coda e non sono tra i preferiti potrebbero essere rimossi se i Download automatici richiedono altro spazio.</string>
<string name="pref_pauseOnDisconnect_sum">Sospendi la riproduzione quando le cuffie o il bluetooth vengono disconnessi</string>
<string name="pref_unpauseOnHeadsetReconnect_sum">Riprendi la riproduzione quando vengono riconnesse le cuffie</string>
<string name="pref_unpauseOnBluetoothReconnect_sum">Riprendi la riproduzione quando il Bluetooth si riconnette</string>
<string name="pref_hardwareForwardButtonSkips_title">Il tasto Avanti salta la traccia</string>
<string name="pref_hardwareForwardButtonSkips_sum">Quando viene premuto il tasto Avanti sul dispositivo bluetooth connesso, passa all\'episodio successivo invece di andare avanti veloce</string>
<string name="pref_hardwarePreviousButtonRestarts_title">Il tasto Indietro riavvia la traccia</string>
- <string name="pref_hardwarePreviousButtonRestarts_sum">Quando viene premuto il tasto fisico Indietro, viene riavviata la traccia invece di tornare indietro</string>
+ <string name="pref_hardwarePreviousButtonRestarts_sum">Quando viene premuto il tasto fisico Indietro, viene riavviata la traccia invece di saltare indietro</string>
<string name="pref_followQueue_sum">Passa al prossimo episodio in coda quando viene completata la riproduzione</string>
<string name="pref_auto_delete_sum">Elimina l\'episodio quando viene completata la riproduzione</string>
<string name="pref_auto_delete_title">Elimina automaticamente</string>
@@ -347,7 +347,7 @@
<string name="network_pref">Rete</string>
<string name="pref_autoUpdateIntervallOrTime_title">Intervallo o orario di aggiornamento</string>
<string name="pref_autoUpdateIntervallOrTime_sum">Imposta un intervallo di tempo o un orario specifico in cui le sottoscrizioni vengono aggiornate automaticamente</string>
- <string name="pref_autoUpdateIntervallOrTime_message">Puoi impostare un <i>intervallo</i> come \"ogni 2 ore\", impostare <i>un\'ora del giorno</i> specifica, come \"7:00\" oppure <i>disabilitare</i> gli aggiornamenti automatici del tutto.\n\n<small>Nota: I tempi di aggiornamento non sono perfetti. Potrai riscontrare dei brevi ritardi.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Puoi impostare un <i>intervallo</i> come \"ogni 2 ore\", <i>un\'ora del giorno</i> specifica come \"7:00\" oppure <i>disabilitare</i> gli aggiornamenti automatici.\n\n<small>Nota: I tempi di aggiornamento non sono perfetti. Potrebbero esserci dei leggeri ritardi.</small></string>
<string name="pref_autoUpdateIntervallOrTime_Disable">Disabilita</string>
<string name="pref_autoUpdateIntervallOrTime_Interval">Imposta Intervallo</string>
<string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Imposta orario</string>
@@ -381,9 +381,9 @@
<string name="pref_autodl_wifi_filter_sum">Abilita il download automatico solo per alcune reti Wi-Fi selezionate.</string>
<string name="autodl_wifi_filter_permission_title">Autorizzazione richiesta</string>
<string name="autodl_wifi_filter_permission_message">Per il filtro Wi-Fi è richiesto l\'accesso alla posizione. Tocca per autorizzare.</string>
- <string name="pref_automatic_download_on_battery_title">Scarica quando la batteria non è in carica</string>
+ <string name="pref_automatic_download_on_battery_title">Scarica episodi con batteria non in carica</string>
<string name="pref_automatic_download_on_battery_sum">Permetti il download automatico quando la batteria non è in carica</string>
- <string name="pref_parallel_downloads_title">Download simulanei</string>
+ <string name="pref_parallel_downloads_title">Download simultanei</string>
<string name="pref_episode_cache_title">Cache degli episodi</string>
<string name="pref_episode_cache_summary">Numero di episodi scaricati memorizzabili sul dispositivo. I download automatici vengono interrotti se si raggiunge questo valore.</string>
<string name="pref_episode_cover_title">Usa immagine episodio</string>
@@ -434,7 +434,7 @@
<string name="pref_lockscreen_background_sum">Sostituisce l\'immagine della schermata di blocco con quella dell\'episodio in riproduzione. Mostrerà l\'immagine anche in app di terze parti.</string>
<string name="pref_showDownloadReport_title">Mostra il rapporto del download</string>
<string name="pref_showDownloadReport_sum">Se il download fallisce, genera un report che mostra i dettagli dell\'errore.</string>
- <string name="pref_expand_notify_unsupport_toast">Le versioni di Android prima della 4.1 non supportano le notifiche estese.</string>
+ <string name="pref_expand_notify_unsupport_toast">Le versioni Android precedenti alla 4.1 non supportano le notifiche estese.</string>
<string name="pref_enqueue_location_title">Posizione in coda</string>
<string name="pref_enqueue_location_sum">Aggiungi episodi a: %1$s</string>
<string name="enqueue_location_back">Retro</string>
@@ -463,7 +463,7 @@
<string name="media_player_builtin">Player Android integrato</string>
<string name="pref_skip_silence_title">Salta il silenzio audio</string>
<string name="pref_videoBehavior_title">Uscita dal video</string>
- <string name="pref_videoBehavior_sum">Comportamento quando si esce dalla riproduzione video</string>
+ <string name="pref_videoBehavior_sum">Comportamento quando si termina una riproduzione video</string>
<string name="stop_playback">Interrompi riproduzione</string>
<string name="continue_playback">Continua riproduzione audio</string>
<string name="behavior">Comportamento</string>
@@ -551,7 +551,7 @@
<string name="gpodnet_suggestions_header">SUGGERIMENTI</string>
<string name="gpodnet_search_hint">Cerca su gpodder.net</string>
<string name="gpodnetauth_login_title">Login</string>
- <string name="gpodnetauth_login_descr">Benvenuto sul processo di login di gpodder.net. Per prima cosa, inserisci le tue informazioni di login:</string>
+ <string name="gpodnetauth_login_descr">Benvenuto alla procedura di login di gpodder.net. Come prima cosa, inserisci le credenziali:</string>
<string name="gpodnetauth_login_butLabel">Login</string>
<string name="gpodnetauth_login_register">Se non hai ancora un account, puoi crearne uno qui:\nhttps://gpodder.net/register/</string>
<string name="username_label">Username</string>
@@ -563,11 +563,11 @@
<string name="gpodnetauth_device_butCreateNewDevice">Crea un nuovo dispositivo</string>
<string name="gpodnetauth_device_chooseExistingDevice">Scegli un dispositivo esistente:</string>
<string name="gpodnetauth_device_errorEmpty">L\'ID del dispositivo non può essere vuoto</string>
- <string name="gpodnetauth_device_errorAlreadyUsed">ID di dispositivo già in uso</string>
+ <string name="gpodnetauth_device_errorAlreadyUsed">ID del dispositivo già in uso</string>
<string name="gpodnetauth_device_caption_errorEmpty">La didascalia non può essere vuota</string>
<string name="gpodnetauth_device_butChoose">Scegli</string>
<string name="gpodnetauth_finish_title">Login effettuato!</string>
- <string name="gpodnetauth_finish_descr">Congraturazioni! Il tuo account gpodder.net è stato collegato con il tuo dispositivo. Da ora AntennaPod sincronizzerà automaticamente le sottoscrizioni sul tuo dispositivo con il tuo account gpodder.net.</string>
+ <string name="gpodnetauth_finish_descr">Congraturazioni! Il tuo account gpodder.net è stato collegato con il dispositivo. Ora AntennaPod sincronizzerà automaticamente le sottoscrizioni sul dispositivo con il tuo account gpodder.net.</string>
<string name="gpodnetauth_finish_butsyncnow">Avvia la sincronizzazione</string>
<string name="gpodnetauth_finish_butgomainscreen">Vai alla schermata principale</string>
<string name="gpodnetsync_auth_error_title">errore di autenticazione su gpodder.net</string>
@@ -584,7 +584,7 @@
<string name="choose_data_directory_message">Scegli la base della tua cartella dati. AntennaPod creerà le sottocartelle appropriate.</string>
<string name="choose_data_directory_permission_rationale">E\' necessario accedere alla memoria esterna per cambiare la cartella dei dati</string>
<string name="choose_data_directory_available_space">%1$s di %2$s liberi</string>
- <string name="create_folder_msg">Crea una nuova directory con nome \"%1$s\"?</string>
+ <string name="create_folder_msg">Creare una nuova directory con nome \"%1$s\"?</string>
<string name="create_folder_success">Crea una nuova directory</string>
<string name="create_folder_error_no_write_access">Impossibile scrivere in questa directory</string>
<string name="create_folder_error_already_exists">La cartella esiste già</string>
@@ -595,7 +595,7 @@
<string name="folder_not_empty_dialog_title">La cartella non è vuota</string>
<string name="folder_not_empty_dialog_msg">La cartella che hai selezionato non è vuota. I download dei media e altri file saranno creati in questa cartella. Continuare?</string>
<string name="set_to_default_folder">Scegli la cartella predefinita</string>
- <string name="pref_pausePlaybackForFocusLoss_sum">Sospendi la riproduzione invece di abbassare il volume quando un\'altra app emette un suono</string>
+ <string name="pref_pausePlaybackForFocusLoss_sum">Quando un\'altra app emette un suono, sospendi la riproduzione invece di abbassare il volume</string>
<string name="pref_pausePlaybackForFocusLoss_title">Pausa su interruzione</string>
<string name="pref_resumeAfterCall_sum">Riprendi la riproduzione al termine di una chiamata</string>
<string name="pref_resumeAfterCall_title">Riprendi dopo la chiamata</string>
@@ -622,7 +622,7 @@
<string name="episode_filters_include">Includi</string>
<string name="episode_filters_exclude">Escludi</string>
<string name="episode_filters_hint">Parole singole \n\"Parole multiple\"</string>
- <string name="keep_updated">Mantieni Aggiornato</string>
+ <string name="keep_updated">Mantieni aggiornato</string>
<string name="keep_updated_summary">Includi nell\'(auto-)aggiornamento di tutti i feed</string>
<string name="auto_download_disabled_globally">Il download automatico è disabilitato nelle Impostazioni generali.</string>
<!--Progress information-->
@@ -637,9 +637,9 @@
<string name="filter">Filtro</string>
<!--Episodes apply actions-->
<string name="all_label">Tutto</string>
- <string name="selected_all_label">Seleziona tutti gli Episodi</string>
+ <string name="selected_all_label">Seleziona tutti gli episodi</string>
<string name="none_label">Nulla</string>
- <string name="deselected_all_label">De-seleziona tutti gli episodi</string>
+ <string name="deselected_all_label">Deseleziona tutti gli episodi</string>
<string name="played_label">Riprodotti</string>
<string name="selected_played_label">Selezionati gli episodi riprodotti</string>
<string name="unplayed_label">Non riprodotti</string>
@@ -675,7 +675,7 @@
<string name="right_short">Dx</string>
<string name="audio_effects">Effetti Audio</string>
<string name="stereo_to_mono">Downmix: da Stereo a Mono</string>
- <string name="sonic_only">solo Sonic</string>
+ <string name="sonic_only">Solo Sonic</string>
<string name="exoplayer_only">Solo ExoPlayer</string>
<!--proxy settings-->
<string name="proxy_type_label">Tipo</string>
@@ -693,7 +693,7 @@
<string name="subscription_num_columns">Numero di colonne</string>
<!--Database import/export-->
<string name="import_export">Importa/Esporta database</string>
- <string name="import_export_warning">Questa funzione sperimentale può essere usata per trasferire le sottoscrizioni e gli episoti completati ad un altro dispositivo.\n\nIl database potrà essere importato solo se si usa la stessa versione di AntennaPod, altrimenti potrebbero generarsi comportamenti anomali.\n\nDopo l\'importazione, gli episodi potrebbero essere mostrati come scaricati anche se non lo sono. Basta premere Play per farli riconoscere ad AntennaPod.</string>
+ <string name="import_export_warning">Questa funzione sperimentale può essere usata per trasferire le sottoscrizioni e gli episodi completati ad un altro dispositivo.\n\nIl database potrà essere importato solo se si usa la stessa versione di AntennaPod, altrimenti potrebbero generarsi comportamenti anomali.\n\nDopo l\'importazione, gli episodi potrebbero essere mostrati come scaricati anche se non lo sono. Basta premere Play per farli riconoscere ad AntennaPod.</string>
<string name="label_import">Importa</string>
<string name="label_export">Esporta</string>
<string name="import_select_file">Scegli file da importare</string>
@@ -716,7 +716,7 @@
<string name="cast_failed_media_error_skipping">Errore nella riproduzione. Salto...</string>
<!--Notification channels-->
<string name="notification_channel_user_action">Azione richesta</string>
- <string name="notification_channel_user_action_description">Mostra se è richesto un tuo intervento, per sempio se è necessario inserire la password.</string>
+ <string name="notification_channel_user_action_description">Mostra se è richesto un tuo intervento, per esempio se è necessario inserire la password.</string>
<string name="notification_channel_downloading">Scaricando</string>
<string name="notification_channel_downloading_description">Mostra mentre è in corso il download</string>
<string name="notification_channel_playing">In riproduzione</string>
diff --git a/core/src/main/res/values-nl/strings.xml b/core/src/main/res/values-nl/strings.xml
index 338f4c193..f6cb6c26d 100644
--- a/core/src/main/res/values-nl/strings.xml
+++ b/core/src/main/res/values-nl/strings.xml
@@ -68,7 +68,7 @@
<string name="error_msg_prefix">Er is een fout opgetreden:</string>
<string name="needs_storage_permission">Machtiging vereist voor gebruik van opslag</string>
<string name="refresh_label">Verversen</string>
- <string name="external_storage_error_msg">Geen externe opslag beschikbaar. Zorg ervoor dat de externe opslag is aangekoppeld zodat de app goed kan werken.</string>
+ <string name="external_storage_error_msg">Geen externe opslag beschikbaar. Zorg ervoor dat de externe opslag gekoppeld is zodat de app juist kan functioneren.</string>
<string name="chapters_label">Hoofdstukken</string>
<string name="chapter_duration">Duur: %1$s</string>
<string name="description_label">Omschrijving</string>
@@ -101,12 +101,12 @@
<!--'Add Feed' Activity labels-->
<string name="feedurl_label">Feed-url</string>
<string name="etxtFeedurlHint">www.voorbeeld.nl/feed</string>
- <string name="txtvfeedurl_label">Podcast toevoegen middels url</string>
+ <string name="txtvfeedurl_label">Podcast toevoegen middels URL</string>
<string name="browse_gpoddernet_label">Verken gpodder.net</string>
<string name="discover">Ontdekken</string>
<string name="discover_more">meer »</string>
<!--Actions on feeds-->
- <string name="mark_all_read_label">Alles markeren als afgespeeld</string>
+ <string name="mark_all_read_label">Alles als afgespeeld markeren</string>
<string name="mark_all_read_msg">Alle afleveringen zijn gemarkeerd als afgespeeld</string>
<string name="mark_all_read_confirmation_msg">Bevestig dat je alle afleveringen wilt markeren als afgespeeld.</string>
<string name="mark_all_read_feed_confirmation_msg">Bevestig dat je alle afleveringen van deze podcast wilt markeren als afgespeeld.</string>
@@ -163,13 +163,13 @@
</plurals>
<string name="remove_new_flag_label">\'Nieuw\'-label verwijderen</string>
<string name="removed_new_flag_label">\'Nieuw\'-label is verwijderd</string>
- <string name="mark_read_label">Markeren als afgespeeld</string>
+ <string name="mark_read_label">Als afgespeeld markeren</string>
<string name="marked_as_read_label">Gemarkeerd als afgespeeld</string>
<plurals name="marked_read_batch_label">
<item quantity="one">%d aflevering gemarkeerd als afgespeeld.</item>
<item quantity="other">%d afleveringen gemarkeerd als afgespeeld.</item>
</plurals>
- <string name="mark_unread_label">Markeren als niet-afgespeeld</string>
+ <string name="mark_unread_label">Als niet-afgespeeld markeren</string>
<plurals name="marked_unread_batch_label">
<item quantity="one">%d aflevering gemarkeerd als niet-afgespeeld.</item>
<item quantity="other">%d afleveringen gemarkeerd als niet-afgespeeld.</item>
diff --git a/core/src/main/res/values-pl-rPL/strings.xml b/core/src/main/res/values-pl-rPL/strings.xml
index 22f0cc64e..05204fd4f 100644
--- a/core/src/main/res/values-pl-rPL/strings.xml
+++ b/core/src/main/res/values-pl-rPL/strings.xml
@@ -302,6 +302,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Pobierz wtyczkę</string>
<string name="no_playback_plugin_title">Wtyczka nie zainstalowana</string>
+ <string name="no_playback_plugin_or_sonic_msg">Aby używać zmiennej prędkości odtwarzania, zalecamy używanie wbudowanego odtwarzacza Sonic.</string>
<string name="set_playback_speed_label">Prędkość odtwarzania</string>
<string name="enable_sonic">Włącz Sonic</string>
<!--Empty list labels-->
@@ -750,6 +751,7 @@ https://gpodder.net/register/</string>
<string name="notification_channel_error_description">Pokazywane gdy coś pójdzie nie tak, na przykład jeśli nie powiedzie się pobieranie lub synchronizacja z gpodder.</string>
<string name="import_bad_file">Nieprawidłowy/uszkodzony plik</string>
<!--Widget settings-->
+ <string name="widget_settings">Ustawienia widżetu</string>
<string name="widget_create_button">Dodaj widżet</string>
<string name="widget_opacity">Nieprzezroczystość</string>
</resources>
diff --git a/core/src/main/res/values-uk-rUA/strings.xml b/core/src/main/res/values-uk-rUA/strings.xml
index 34d2b0ebe..37f1049ac 100644
--- a/core/src/main/res/values-uk-rUA/strings.xml
+++ b/core/src/main/res/values-uk-rUA/strings.xml
@@ -105,6 +105,7 @@
<string name="etxtFeedurlHint">Посилання на канал чи сторінку</string>
<string name="txtvfeedurl_label">Додати подкаст за URL</string>
<string name="browse_gpoddernet_label">Переглянути gpodder.net</string>
+ <string name="discover_more">більше »</string>
<!--Actions on feeds-->
<string name="mark_all_read_label">Позначити всі як відтворені</string>
<string name="mark_all_read_msg">Позначено всі епізоди як відтворені</string>
@@ -117,12 +118,13 @@
<string name="rename_feed_label">Перейменувати подкаст</string>
<string name="remove_feed_label">Видалити подкаст</string>
<string name="share_label">Поділитися…</string>
- <string name="share_link_label">Поділитись посиланням на епізод</string>
+ <string name="share_link_label">Поділитися посиланням на епізод</string>
<string name="share_link_with_position_label">Поділіться посиланням на епізод з позицією відтворення</string>
- <string name="share_file_label">Поділитись файлом</string>
- <string name="share_feed_url_label">Поділитись посиланням на канал</string>
- <string name="share_item_url_label">Поділитись посиланням на медіа-файл</string>
- <string name="share_item_url_with_position_label">Поділитись посиланням на медіа-файл з позицією відтворення</string>
+ <string name="share_file_label">Поділитися файлом</string>
+ <string name="share_website_url_label">Поділитися посиланням на сайт</string>
+ <string name="share_feed_url_label">Поділитися посиланням на канал</string>
+ <string name="share_item_url_label">Поділитися посиланням на медіа-файл</string>
+ <string name="share_item_url_with_position_label">Поділитися посиланням на медіа-файл з позицією відтворення</string>
<string name="feed_delete_confirmation_msg">Будь ласка, підтвердіть що ви бажаєте видалити подкаст \"%1$s\" і ВСІ його епізоди (разом з завантаженими).</string>
<string name="feed_remover_msg">Видалення подкасту</string>
<string name="load_complete_feed">Оновити весь подкаст</string>
@@ -245,6 +247,7 @@
<string name="confirm_mobile_download_dialog_title">Підтвердження завантажень через мобільні мережі</string>
<string name="confirm_mobile_download_dialog_message_not_in_queue">Завантаження через мобільні мережі вимкнено в налаштуваннях.\n\nВибрати додавання епізоду до черги чи тимчасове завантаження?\n\n<small>Ваш вибір буде дійсним 10 хвилин.</small></string>
<string name="confirm_mobile_download_dialog_message">Завантаження через мобільні мережі вимкнено в налаштуваннях.\n\nУвімкнути тимчасово?\n\n<small>Ваш вибір буде дійсним 10 хвилин.</small></string>
+ <string name="confirm_mobile_streaming_button_always">Завжди дозволяти</string>
<string name="confirm_mobile_download_dialog_only_add_to_queue">Лише додати до черги</string>
<string name="confirm_mobile_download_dialog_enable_temporarily">Увімкнути тимчасово</string>
<!--Mediaplayer messages-->
@@ -254,6 +257,7 @@
<string name="player_ready_msg">Готов</string>
<string name="player_seeking_msg">Шукаю</string>
<string name="playback_error_server_died">Сервер помер</string>
+ <string name="playback_error_unsupported">Тип медіа не підтримується</string>
<string name="playback_error_unknown">Невідома помилка</string>
<string name="no_media_playing_label">Немає що грати</string>
<string name="player_buffering_msg">Буферізую</string>
@@ -264,6 +268,7 @@
<string name="unlock_queue">Розблокувати чергу</string>
<string name="queue_locked">Чергу заблоковано</string>
<string name="queue_unlocked">Чергу розблоковано</string>
+ <string name="checkbox_do_not_show_again">Більше не показувати</string>
<string name="clear_queue_label">Очистити чергу</string>
<string name="undo">Скасувати</string>
<string name="move_to_top_label">Догори</string>
@@ -278,6 +283,8 @@
<string name="ascending">За зростанням</string>
<string name="descending">За спаданням</string>
<string name="clear_queue_confirmation_msg">Будь ласка, підтвердіть що ви бажаєте вилучити всі епізоди з черги.</string>
+ <string name="sort_old_to_new">Спочатку старіші</string>
+ <string name="sort_new_to_old">Спочатку новіші</string>
<!--Variable Speed-->
<string name="download_plugin_label">Завантажити додаток</string>
<string name="no_playback_plugin_title">Додаток не встановлено</string>
@@ -301,7 +308,10 @@
<string name="no_new_episodes_label">Коли з’являться нові епізоди, іх буде показано тут.</string>
<string name="no_fav_episodes_head_label">Немає улюблених епізодів</string>
<string name="no_fav_episodes_label">Ви можете додавати епізоди до улюблених за допомогою довгого натискання.</string>
- <string name="no_chapters_label">В цьому епізоді немає розділів.</string>
+ <string name="no_chapters_head_label">Немає глав</string>
+ <string name="no_chapters_label">В цьому епізоді немає глав.</string>
+ <string name="no_subscriptions_head_label">Немає підписок</string>
+ <string name="no_subscriptions_label">Щоб підписатись на подкаст, натисніть на значок плюса нижче</string>
<!--Preferences-->
<string name="storage_pref">Зберігання</string>
<string name="project_pref">Проект</string>
@@ -314,6 +324,9 @@
<string name="appearance">Вигляд</string>
<string name="external_elements">Зовнішні елементи</string>
<string name="interruptions">Тимчасові паузи</string>
+ <string name="preference_search_hint">Пошук...</string>
+ <string name="preference_search_no_results">Немає результатів</string>
+ <string name="preference_search_clear_history">Очистити історію</string>
<string name="media_player">Медіа програвач</string>
<string name="pref_episode_cleanup_title">Очищення епізодів</string>
<string name="pref_episode_cleanup_summary">Епізоди що не знаходяться в черзі та не помічені як улюблені можуть бути видалені якщо Автозавантажувач потребуватиме місце для нових епізодів.</string>
@@ -365,6 +378,7 @@
<string name="pref_automatic_download_on_battery_sum">Дозволити автозавантаження коли зарядний пристрій не підключений</string>
<string name="pref_parallel_downloads_title">Паралельні завантаження</string>
<string name="pref_episode_cache_title">Кеш епізодів</string>
+ <string name="pref_theme_title_use_system">Використовувати системну тему</string>
<string name="pref_theme_title_light">Світла</string>
<string name="pref_theme_title_dark">Темна</string>
<string name="pref_theme_title_trueblack">Чорна (для AMOLED)</string>
@@ -389,6 +403,7 @@
<string name="pref_gpodnet_notifications_sum">Це налаштування не застосовується до помилок автентифікації.</string>
<string name="pref_playback_speed_title">Швидкість програвання</string>
<string name="pref_playback_speed_sum">Налаштування швідкості доступно для змінної швидкості програвання</string>
+ <string name="pref_feed_playback_speed_sum">Виберіть швидкість відтворення епізодів з цього каналу</string>
<string name="pref_fast_forward">Час, що пропускається кнопкою перемотки вперед</string>
<string name="pref_fast_forward_sum">Налаштувати кількість секунд, які пропускаються при натисканні кнопки перемотки вперед</string>
<string name="pref_rewind">Час, що пропускається кнопкою відмотки назад</string>
@@ -408,14 +423,21 @@
<string name="pref_showDownloadReport_title">Показати звіт про завантаження</string>
<string name="pref_showDownloadReport_sum">У разі помилки при завантаженні створити детальний звіт про помилку.</string>
<string name="pref_expand_notify_unsupport_toast">Android до версії 4.1 не підтримує розширені повідомлення.</string>
+ <string name="pref_enqueue_location_sum">Додати епізоди до: %1$s</string>
+ <string name="enqueue_location_after_current">Після поточного епізоду</string>
<string name="pref_smart_mark_as_played_disabled">Вимкнено</string>
<string name="pref_image_cache_size_title">Розмір кеша зображень</string>
<string name="pref_image_cache_size_sum">Розмір дискового кеша для зображень.</string>
+ <string name="bug_report_title">Повідомити про помилку</string>
+ <string name="open_bug_tracker">Відкрити трекер помилок</string>
+ <string name="copy_to_clipboard">Копіювати</string>
+ <string name="copied_to_clipboard">Скопійовано</string>
<string name="experimental_pref">Експериментальні</string>
<string name="pref_media_player_message">Оберіть медіа плеєр для програвання файлів</string>
<string name="pref_current_value">Поточне значення: %1$s</string>
<string name="pref_proxy_title">Проксі</string>
<string name="pref_proxy_sum">Застосувати проксі сервер</string>
+ <string name="pref_faq">Часті питання</string>
<string name="pref_no_browser_found">Веб браузер не знайдено.</string>
<string name="pref_cast_title">Підтримка для Chromecast</string>
<string name="pref_cast_message_play_flavor">Включити підтримку програвання на таких пристроях як Chromecast або Android TV</string>
@@ -443,6 +465,14 @@
<string name="pref_delete_removes_from_queue_sum">Автоматично видаляти епізод із черги, коли він буде видалений.</string>
<!--About screen-->
<string name="about_pref">Про програму</string>
+ <string name="antennapod_version">Версія AntennaPod</string>
+ <string name="developers">Розробники</string>
+ <string name="developers_summary">Кожен може допомогти AntennaPod стати краще</string>
+ <string name="translators">Перекладачі</string>
+ <string name="translators_summary">Переклади створюються користувачами AntennaPod за допомогою Transifex</string>
+ <string name="privacy_policy">Політика конфіденційності</string>
+ <string name="licenses">Ліцензії</string>
+ <string name="licenses_summary">AntennaPod використовує інше чудове програмне забезпечення</string>
<!--Search-->
<string name="search_hint">Пошук епізодів</string>
<string name="found_in_shownotes_label">Знайдено в нотатках епізода</string>
@@ -536,12 +566,14 @@
<string name="gpodnetsync_error_descr">Трапилась помилка при сінхронизації:\u0020</string>
<string name="gpodnetsync_pref_report_successful">Успішно</string>
<string name="gpodnetsync_pref_report_failed">Невдало</string>
+ <string name="gpodnetsync_username_characters_error">Імена користувачів можуть містити лише літери, цифри, дефіси та підкреслення.</string>
<!--Directory chooser-->
<string name="selected_folder_label">Обрати папку:</string>
<string name="create_folder_label">Нова папка</string>
<string name="choose_data_directory">Обрати папку</string>
<string name="choose_data_directory_message">Оберіть, будь ласка, базовий каталог даних. AntennaPod створить відповідні підрозділи.</string>
<string name="choose_data_directory_permission_rationale">Для зміни папки зберігання даних потрібен доступ до зовнішнього носія</string>
+ <string name="choose_data_directory_available_space">%1$s з %2$s вільно</string>
<string name="create_folder_msg">Створити папку з ім\'ям \"%1$s\"?</string>
<string name="create_folder_success">Створена нова папка</string>
<string name="create_folder_error_no_write_access">Не можу записати в цю папку</string>
@@ -560,6 +592,7 @@
<string name="pref_restart_required">Для застосування змін потрібно перезапустити AntennaPod</string>
<!--Online feed view-->
<string name="subscribe_label">Підписатися</string>
+ <string name="subscribing_label">Підписка...</string>
<!--Content descriptions for image buttons-->
<string name="rewind_label">Перемотка назад</string>
<string name="fast_forward_label">Перемотка вперед</string>
@@ -580,13 +613,17 @@
<string name="episode_filters_exclude">Виключити</string>
<string name="episode_filters_hint">Окремі слова \n\"Кілька слів\"</string>
<string name="keep_updated">Підтримувати оновленим</string>
+ <string name="keep_updated_summary">Включити цей канал під час (авто-)оновлення всіх каналів</string>
+ <string name="auto_download_disabled_globally">Автозавантаження вимкнено в налаштуваннях AntennaPod</string>
<!--Progress information-->
<string name="progress_upgrading_database">Оновлення бази даних</string>
<!--AntennaPodSP-->
<string name="sp_apps_importing_feeds_msg">Імпорт подкастів з інших програм...</string>
<!--Add podcast fragment-->
+ <string name="search_podcast_hint">Шукати подкаст...</string>
<string name="search_itunes_label">Пошук в iTunes</string>
<string name="search_fyyd_label">Шукати в fyyd</string>
+ <string name="advanced_search">Розширений пошук</string>
<string name="filter">Фільтр</string>
<!--Episodes apply actions-->
<string name="all_label">Всі</string>
@@ -676,5 +713,9 @@
<string name="notification_channel_playing_description">Дозволяє керувати відтворенням. Це основне сповіщення, яке ви бачите під час відтворення подкасту.</string>
<string name="notification_channel_error">Помилки</string>
<string name="notification_channel_error_description">Відображається, якщо щось пішло не так, наприклад, якщо не вдалося завантажити або синхронізувати з gpodder.</string>
+ <string name="import_bad_file">Недоступний/пошкоджений файл</string>
<!--Widget settings-->
+ <string name="widget_settings">Налаштування віджету</string>
+ <string name="widget_create_button">Створити віджет</string>
+ <string name="widget_opacity">Непрозорість</string>
</resources>
diff --git a/core/src/main/res/values-v26/styles.xml b/core/src/main/res/values-v26/styles.xml
new file mode 100644
index 000000000..87453eb5e
--- /dev/null
+++ b/core/src/main/res/values-v26/styles.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <style name="Theme.AntennaPod.Splash" parent="Theme.Base.AntennaPod.Splash">
+ <item name="android:windowSplashscreenContent">@drawable/bg_splash</item>
+ </style>
+</resources> \ No newline at end of file
diff --git a/core/src/main/res/values-zh-rCN/strings.xml b/core/src/main/res/values-zh-rCN/strings.xml
index 123c1cc0d..758e7de78 100644
--- a/core/src/main/res/values-zh-rCN/strings.xml
+++ b/core/src/main/res/values-zh-rCN/strings.xml
@@ -274,6 +274,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">插件下载</string>
<string name="no_playback_plugin_title">插件没有安装</string>
+ <string name="no_playback_plugin_or_sonic_msg">为了使变速播放正常工作,我们建议启用内置的Sonic媒体播放器</string>
<string name="set_playback_speed_label">播放速度</string>
<string name="enable_sonic">允许声音</string>
<!--Empty list labels-->
@@ -712,6 +713,7 @@
<string name="notification_channel_error_description">发生错误时显示,比如下载或与gpodder的同步失败</string>
<string name="import_bad_file">无效/损坏文件</string>
<!--Widget settings-->
+ <string name="widget_settings">小部件设置</string>
<string name="widget_create_button">创建小部件</string>
<string name="widget_opacity">不透明度</string>
</resources>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index d87afcd09..e5d8247bc 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -536,14 +536,8 @@
<string name="licenses_summary">AntennaPod uses other great software</string>
<!-- Search -->
- <string name="search_hint">Search for episodes</string>
- <string name="found_in_shownotes_label">Found in show notes</string>
- <string name="found_in_chapters_label">Found in chapters</string>
- <string name="found_in_authors_label">Found in author(s)</string>
- <string name="found_in_feeds_label">Found in podcast</string>
<string name="search_status_no_results">No results were found</string>
<string name="search_label">Search</string>
- <string name="found_in_title_label">Found in title</string>
<string name="no_results_for_query">No results were found for \"%1$s\"</string>
<!-- import and export -->
@@ -572,6 +566,7 @@
<string name="opml_import_ask_read_permission">Access to external storage is required to read the OPML file</string>
<string name="import_select_file">Select file to import</string>
<string name="import_ok">Import successful.\n\nPlease press OK to restart AntennaPod</string>
+ <string name="import_no_downgrade">This database was exported with a newer version of AntennaPod. Your current installation does not yet know how to handle this file.</string>
<!-- Sleep timer -->
<string name="set_sleeptimer_label">Set sleep timer</string>
@@ -579,7 +574,7 @@
<string name="sleep_timer_label">Sleep timer</string>
<string name="time_dialog_invalid_input">Invalid input, time has to be an integer</string>
<string name="shake_to_reset_label">Shake to reset</string>
- <string name="timer_vibration_label">Vibrate</string>
+ <string name="timer_vibration_label">Vibrate shortly before end</string>
<string name="time_seconds">seconds</string>
<string name="time_minutes">minutes</string>
<string name="time_hours">hours</string>
@@ -768,7 +763,6 @@
<string name="cast_failed_to_play">Failed to start the playback of media</string>
<string name="cast_failed_to_stop">Failed to stop the playback of media</string>
<string name="cast_failed_to_pause">Failed to pause the playback of media</string>
- <!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
<string name="cast_failed_setting_volume">Failed to set the volume</string>
<string name="cast_failed_no_connection">No connection to the cast device is present</string>
<string name="cast_failed_no_connection_trans">Connection to the cast device has been lost. Application is trying to re-establish the connection, if possible. Please wait for a few seconds and try again.</string>
@@ -786,7 +780,6 @@
<string name="notification_channel_playing_description">Allows to control playback. This is the main notification you see while playing a podcast.</string>
<string name="notification_channel_error">Errors</string>
<string name="notification_channel_error_description">Shown if something went wrong, for example if download or gpodder sync fails.</string>
- <string name="import_bad_file">Invalid/corrupt file</string>
<!-- Widget settings -->
<string name="widget_settings">Widget settings</string>
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index c7f45a29e..33b736089 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -266,7 +266,11 @@
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
- <style name="Theme.AntennaPod.Dark.Splash" parent="Theme.AppCompat.NoActionBar">
+ <style name="Theme.AntennaPod.Splash" parent="Theme.Base.AntennaPod.Splash">
+ <!-- Room for API dependent attributes -->
+ </style>
+
+ <style name="Theme.Base.AntennaPod.Splash" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
<item name="colorPrimary">@color/ic_launcher_background</item>
<item name="colorPrimaryDark">@color/ic_launcher_background</item>