summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/AndroidManifest.xml2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java15
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java14
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/Permutor.java17
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java109
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/gui/PictureInPictureUtil.java27
-rw-r--r--core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.pngbin0 -> 828 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_white_24dp.pngbin0 -> 635 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_launcher.pngbin3887 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_poll_box_grey600_24dp.pngbin0 -> 608 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_poll_box_white_24dp.pngbin0 -> 558 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sd_grey600_24dp.pngbin0 -> 533 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_sd_white_24dp.pngbin0 -> 472 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_swap_vertical_grey600_24dp.pngbin0 -> 581 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_swap_vertical_white_24dp.pngbin0 -> 510 bytes
-rw-r--r--core/src/main/res/drawable-ldpi/ic_launcher.pngbin1645 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.pngbin0 -> 619 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_white_24dp.pngbin0 -> 534 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_launcher.pngbin2359 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_poll_box_grey600_24dp.pngbin0 -> 463 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_poll_box_white_24dp.pngbin0 -> 429 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sd_grey600_24dp.pngbin0 -> 456 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_sd_white_24dp.pngbin0 -> 417 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_swap_vertical_grey600_24dp.pngbin0 -> 484 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_swap_vertical_white_24dp.pngbin0 -> 421 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.pngbin0 -> 862 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_white_24dp.pngbin0 -> 738 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_launcher.pngbin5519 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_poll_box_grey600_24dp.pngbin0 -> 592 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_poll_box_white_24dp.pngbin0 -> 565 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sd_grey600_24dp.pngbin0 -> 580 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_sd_white_24dp.pngbin0 -> 535 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_swap_vertical_grey600_24dp.pngbin0 -> 569 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_swap_vertical_white_24dp.pngbin0 -> 496 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.pngbin0 -> 1155 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.pngbin0 -> 965 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_launcher.pngbin9483 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_poll_box_grey600_24dp.pngbin0 -> 787 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_poll_box_white_24dp.pngbin0 -> 704 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sd_grey600_24dp.pngbin0 -> 791 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_sd_white_24dp.pngbin0 -> 684 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_swap_vertical_grey600_24dp.pngbin0 -> 710 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_swap_vertical_white_24dp.pngbin0 -> 582 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.pngbin0 -> 1366 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.pngbin0 -> 1200 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_poll_box_grey600_24dp.pngbin0 -> 918 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_poll_box_white_24dp.pngbin0 -> 848 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sd_grey600_24dp.pngbin0 -> 925 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_sd_white_24dp.pngbin0 -> 842 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_grey600_24dp.pngbin0 -> 818 bytes
-rw-r--r--core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_white_24dp.pngbin0 -> 664 bytes
-rw-r--r--core/src/main/res/drawable/bg_splash.xml4
-rw-r--r--core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml5
-rw-r--r--core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml5
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher.pngbin0 -> 4628 bytes
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher_foreground.pngbin0 -> 4876 bytes
-rw-r--r--core/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 4628 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher.pngbin0 -> 2752 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher_foreground.pngbin0 -> 2884 bytes
-rw-r--r--core/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 2752 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 6709 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.pngbin0 -> 6980 bytes
-rw-r--r--core/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 6709 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 10809 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.pngbin0 -> 12641 bytes
-rw-r--r--core/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 10809 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 15604 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.pngbin0 -> 19600 bytes
-rw-r--r--core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 15604 bytes
-rw-r--r--core/src/main/res/values/arrays.xml22
-rw-r--r--core/src/main/res/values/attrs.xml5
-rw-r--r--core/src/main/res/values/colors.xml3
-rw-r--r--core/src/main/res/values/ic_launcher_background.xml4
-rw-r--r--core/src/main/res/values/strings.xml25
-rw-r--r--core/src/main/res/values/styles.xml22
82 files changed, 326 insertions, 21 deletions
diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml
index 3a5db2c36..3257c13a7 100644
--- a/core/src/main/AndroidManifest.xml
+++ b/core/src/main/AndroidManifest.xml
@@ -12,7 +12,7 @@
<application
android:allowBackup="true"
- android:icon="@drawable/ic_launcher">
+ android:icon="@mipmap/ic_launcher">
<service
android:name=".service.download.DownloadService"
diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
index 2d551e1b2..a22422596 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java
@@ -554,15 +554,9 @@ public class FeedMedia extends FeedFile implements Playable {
public Callable<String> loadShownotes() {
return () -> {
if (item == null) {
- item = DBReader.getFeedItem(
- itemID);
+ item = DBReader.getFeedItem(itemID);
}
- if (item.getContentEncoded() == null || item.getDescription() == null) {
- DBReader.loadExtraInformationOfFeedItem(
- item);
-
- }
- return (item.getContentEncoded() != null) ? item.getContentEncoded() : item.getDescription();
+ return item.loadShownotes().call();
};
}
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 743ee135d..a93012d59 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
@@ -74,6 +74,7 @@ public class UserPreferences {
private static final String PREF_PLAYBACK_SPEED_ARRAY = "prefPlaybackSpeedArray";
private static final String PREF_PAUSE_PLAYBACK_FOR_FOCUS_LOSS = "prefPauseForFocusLoss";
private static final String PREF_RESUME_AFTER_CALL = "prefResumeAfterCall";
+ public static final String PREF_VIDEO_BEHAVIOR = "prefVideoBehavior";
// Network
private static final String PREF_ENQUEUE_DOWNLOADED = "prefEnqueueDownloaded";
@@ -85,7 +86,7 @@ public class UserPreferences {
public static final String PREF_ENABLE_AUTODL = "prefEnableAutoDl";
public static final String PREF_ENABLE_AUTODL_ON_BATTERY = "prefEnableAutoDownloadOnBattery";
public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter";
- private static final String PREF_ENABLE_AUTODL_ON_MOBILE = "prefEnableAutoDownloadOnMobile";
+ public static final String PREF_ENABLE_AUTODL_ON_MOBILE = "prefEnableAutoDownloadOnMobile";
private static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks";
private static final String PREF_PROXY_TYPE = "prefProxyType";
private static final String PREF_PROXY_HOST = "prefProxyHost";
@@ -661,6 +662,14 @@ public class UserPreferences {
.apply();
}
+ public static VideoBackgroundBehavior getVideoBackgroundBehavior() {
+ switch (prefs.getString(PREF_VIDEO_BEHAVIOR, "stop")) {
+ case "stop": return VideoBackgroundBehavior.STOP;
+ case "pip": return VideoBackgroundBehavior.PICTURE_IN_PICTURE;
+ case "continue": return VideoBackgroundBehavior.CONTINUE_PLAYING;
+ default: return VideoBackgroundBehavior.STOP;
+ }
+ }
public static EpisodeCleanupAlgorithm getEpisodeCleanupAlgorithm() {
int cleanupValue = Integer.parseInt(prefs.getString(PREF_EPISODE_CLEANUP, "-1"));
@@ -839,4 +848,8 @@ public class UserPreferences {
public static boolean isCastEnabled() {
return prefs.getBoolean(PREF_CAST_ENABLED, false);
}
+
+ public enum VideoBackgroundBehavior {
+ STOP, PICTURE_IN_PICTURE, CONTINUE_PLAYING
+ }
}
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 af735aefd..0e64f484f 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
@@ -609,6 +609,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
public void shutdown() {
executor.shutdown();
if (mediaPlayer != null) {
+ try {
+ mediaPlayer.stop();
+ } catch (Exception ignore) { }
mediaPlayer.release();
}
releaseWifiLockIfNecessary();
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 dd7e84857..0bd516f4e 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
@@ -1435,6 +1435,12 @@ public class PlaybackService extends MediaBrowserServiceCompat {
@Override
public void onReceive(Context context, Intent intent) {
+ if (isInitialStickyBroadcast ()) {
+ // Don't pause playback after we just started, just because the receiver
+ // delivers the current headset state (instead of a change)
+ return;
+ }
+
if (TextUtils.equals(intent.getAction(), Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
if (state != -1) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
index 75510d2f6..8cdf82e15 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
@@ -43,6 +43,7 @@ import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.download.DownloadStatus;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.LongList;
+import de.danoeh.antennapod.core.util.Permutor;
import de.danoeh.antennapod.core.util.flattr.FlattrStatus;
import de.danoeh.antennapod.core.util.flattr.FlattrThing;
import de.danoeh.antennapod.core.util.flattr.SimpleFlattrThing;
@@ -187,6 +188,9 @@ public class DBWriter {
if(queue.remove(item)) {
removed.add(item);
}
+ if (item.getState() == FeedItem.State.PLAYING && PlaybackService.isRunning) {
+ context.stopService(new Intent(context, PlaybackService.class));
+ }
if (item.getMedia() != null
&& item.getMedia().isDownloaded()) {
File mediaFile = new File(item.getMedia()
@@ -992,6 +996,32 @@ public class DBWriter {
}
/**
+ * Similar to sortQueue, but allows more complex reordering by providing whole-queue context.
+ * @param permutor Encapsulates whole-Queue reordering logic.
+ * @param broadcastUpdate <code>true</code> if this operation should trigger a
+ * QueueUpdateBroadcast. This option should be set to <code>false</code>
+ * if the caller wants to avoid unexpected updates of the GUI.
+ */
+ public static Future<?> reorderQueue(final Permutor<FeedItem> permutor, final boolean broadcastUpdate) {
+ return dbExec.submit(() -> {
+ final PodDBAdapter adapter = PodDBAdapter.getInstance();
+ adapter.open();
+ final List<FeedItem> queue = DBReader.getQueue(adapter);
+
+ if (queue != null) {
+ permutor.reorder(queue);
+ adapter.setQueue(queue);
+ if (broadcastUpdate) {
+ EventBus.getDefault().post(QueueEvent.sorted(queue));
+ }
+ } else {
+ Log.e(TAG, "reorderQueue: Could not load queue");
+ }
+ adapter.close();
+ });
+ }
+
+ /**
* Sets the 'auto_download'-attribute of specific FeedItem.
*
* @param feedItem FeedItem.
diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java
index ea1b724d4..b512dce3f 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java
@@ -1,6 +1,6 @@
package de.danoeh.antennapod.core.syndication.namespace.atom;
-import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.text.StringEscapeUtils;
import de.danoeh.antennapod.core.syndication.namespace.Namespace;
import de.danoeh.antennapod.core.syndication.namespace.SyndElement;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
index 892e5ff38..76a6549ae 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
@@ -75,4 +75,18 @@ public class FeedItemUtil {
return false;
}
+ /**
+ * Get the link for the feed item for the purpose of Share. It fallbacks to
+ * use the feed's link if the named feed item has no link.
+ */
+ public static String getLinkWithFallback(FeedItem item) {
+ if (item == null) {
+ return null;
+ } else if (item.getLink() != null) {
+ return item.getLink();
+ } else if (item.getFeed() != null) {
+ return item.getFeed().getLink();
+ }
+ return null;
+ }
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java b/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java
index a93dd8ee3..e99461806 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java
@@ -3,7 +3,8 @@ package de.danoeh.antennapod.core.util;
import android.text.TextUtils;
import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.text.RandomStringGenerator;
+
/** Generates valid filenames for a given string. */
public class FileNameGenerator {
@@ -34,7 +35,11 @@ public class FileNameGenerator {
}
String filename = buf.toString().trim();
if(TextUtils.isEmpty(filename)) {
- return RandomStringUtils.randomAlphanumeric(8);
+ return new RandomStringGenerator.Builder()
+ .withinRange('0', 'z')
+ .filteredBy(Character::isLetterOrDigit)
+ .build()
+ .generate(8);
}
return filename;
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Permutor.java b/core/src/main/java/de/danoeh/antennapod/core/util/Permutor.java
new file mode 100644
index 000000000..7d6e20ab1
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/Permutor.java
@@ -0,0 +1,17 @@
+package de.danoeh.antennapod.core.util;
+
+import java.util.List;
+
+/**
+ * Interface for passing around list permutor method. This is used for cases where a simple comparator
+ * won't work (e.g. Random, Smart Shuffle, etc).
+ *
+ * @param <E> the type of elements in the list
+ */
+public interface Permutor<E> {
+ /**
+ * Reorders the specified list.
+ * @param queue A (modifiable) list of elements to be reordered
+ */
+ void reorder(List<E> queue);
+}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java
index c3b4c0e15..5c827dfe9 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java
@@ -2,7 +2,12 @@ package de.danoeh.antennapod.core.util;
import android.content.Context;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
@@ -20,11 +25,15 @@ public class QueueSorter {
DURATION_ASC,
DURATION_DESC,
FEED_TITLE_ASC,
- FEED_TITLE_DESC
+ FEED_TITLE_DESC,
+ RANDOM,
+ SMART_SHUFFLE_ASC,
+ SMART_SHUFFLE_DESC
}
public static void sort(final Context context, final Rule rule, final boolean broadcastUpdate) {
Comparator<FeedItem> comparator = null;
+ Permutor<FeedItem> permutor = null;
switch (rule) {
case EPISODE_TITLE_ASC:
@@ -68,11 +77,109 @@ public class QueueSorter {
case FEED_TITLE_DESC:
comparator = (f1, f2) -> f2.getFeed().getTitle().compareTo(f1.getFeed().getTitle());
break;
+ case RANDOM:
+ permutor = Collections::shuffle;
+ break;
+ case SMART_SHUFFLE_ASC:
+ permutor = (queue) -> smartShuffle(queue, true);
+ break;
+ case SMART_SHUFFLE_DESC:
+ permutor = (queue) -> smartShuffle(queue, false);
+ break;
default:
}
if (comparator != null) {
DBWriter.sortQueue(comparator, broadcastUpdate);
+ } else if (permutor != null) {
+ DBWriter.reorderQueue(permutor, broadcastUpdate);
+ }
+ }
+
+ /**
+ * Implements a reordering by pubdate that avoids consecutive episodes from the same feed in
+ * the queue.
+ *
+ * A listener might want to hear episodes from any given feed in pubdate order, but would
+ * prefer a more balanced ordering that avoids having to listen to clusters of consecutive
+ * episodes from the same feed. This is what "Smart Shuffle" tries to accomplish.
+ *
+ * The Smart Shuffle algorithm involves choosing episodes (in round-robin fashion) from a
+ * collection of individual, pubdate-sorted lists that each contain only items from a specific
+ * feed.
+ *
+ * Of course, clusters of consecutive episodes <i>at the end of the queue</i> may be
+ * unavoidable. This seems unlikely to be an issue for most users who presumably maintain
+ * large queues with new episodes continuously being added.
+ *
+ * For example, given a queue containing three episodes each from three different feeds
+ * (A, B, and C), a simple pubdate sort might result in a queue that looks like the following:
+ *
+ * B1, B2, B3, A1, A2, C1, C2, C3, A3
+ *
+ * (note that feed B episodes were all published before the first feed A episode, so a simple
+ * pubdate sort will often result in significant clustering of episodes from a single feed)
+ *
+ * Using Smart Shuffle, the resulting queue would look like the following:
+ *
+ * A1, B1, C1, A2, B2, C2, A3, B3, C3
+ *
+ * (note that episodes above <i>aren't strictly ordered in terms of pubdate</i>, but episodes
+ * of each feed <b>do</b> appear in pubdate order)
+ *
+ * @param queue A (modifiable) list of FeedItem elements to be reordered.
+ * @param ascending {@code true} to use ascending pubdate in the reordering;
+ * {@code false} for descending.
+ */
+ private static void smartShuffle(List<FeedItem> queue, boolean ascending) {
+
+ // Divide FeedItems into lists by feed
+
+ Map<Long, List<FeedItem>> map = new HashMap<>();
+
+ while (!queue.isEmpty()) {
+ FeedItem item = queue.remove(0);
+ Long id = item.getFeedId();
+ if (!map.containsKey(id)) {
+ map.put(id, new ArrayList<>());
+ }
+ map.get(id).add(item);
+ }
+
+ // Sort each individual list by PubDate (ascending/descending)
+
+ Comparator<FeedItem> itemComparator = ascending
+ ? (f1, f2) -> f1.getPubDate().compareTo(f2.getPubDate())
+ : (f1, f2) -> f2.getPubDate().compareTo(f1.getPubDate());
+
+ for (Long id : map.keySet()) {
+ Collections.sort(map.get(id), itemComparator);
+ }
+
+ // Create a list of the individual FeedItems lists, and sort it by feed title (ascending).
+ // Doing this ensures that the feed order we use is predictable/deterministic.
+
+ List<List<FeedItem>> feeds = new ArrayList<>(map.values());
+ Collections.sort(feeds,
+ // (we use a desc sort here, since we're iterating back-to-front below)
+ (f1, f2) -> f2.get(0).getFeed().getTitle().compareTo(f1.get(0).getFeed().getTitle()));
+
+ // Cycle through the (sorted) feed lists in a round-robin fashion, removing the first item
+ // and adding it back into to the original queue
+
+ while (!feeds.isEmpty()) {
+ // Iterate across the (sorted) list of feeds, removing the first item in each, and
+ // appending it to the queue. Note that we're iterating back-to-front here, since we
+ // will be deleting feed lists as they become empty.
+ for (int i = feeds.size() - 1; i >= 0; --i) {
+ List<FeedItem> items = feeds.get(i);
+ queue.add(items.remove(0));
+ // Removed the last item in this particular feed? Then remove this feed from the
+ // list of feeds.
+ if (items.isEmpty()) {
+ feeds.remove(i);
+ }
+ }
}
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java
index 898f7bedb..5ae00460e 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/ShareUtils.java
@@ -50,11 +50,15 @@ public class ShareUtils {
return item.getFeed().getTitle() + ": " + item.getTitle();
}
+ public static boolean hasLinkToShare(FeedItem item) {
+ return FeedItemUtil.getLinkWithFallback(item) != null;
+ }
+
public static void shareFeedItemLink(Context context, FeedItem item, boolean withPosition) {
- String text = getItemShareText(item) + " " + item.getLink();
+ String text = getItemShareText(item) + " " + FeedItemUtil.getLinkWithFallback(item);
if(withPosition) {
int pos = item.getMedia().getPosition();
- text = item.getLink() + " [" + Converter.getDurationStringLong(pos) + "]";
+ text += " [" + Converter.getDurationStringLong(pos) + "]";
}
shareLink(context, text);
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/gui/PictureInPictureUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/gui/PictureInPictureUtil.java
new file mode 100644
index 000000000..f763653a1
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/gui/PictureInPictureUtil.java
@@ -0,0 +1,27 @@
+package de.danoeh.antennapod.core.util.gui;
+
+import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.os.Build;
+
+public class PictureInPictureUtil {
+ private PictureInPictureUtil() {
+ }
+
+ public static boolean supportsPictureInPicture(Activity activity) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ PackageManager packageManager = activity.getPackageManager();
+ return packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE);
+ } else {
+ return false;
+ }
+ }
+
+ public static boolean isInPictureInPictureMode(Activity activity) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && supportsPictureInPicture(activity)) {
+ return activity.isInPictureInPictureMode();
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
new file mode 100644
index 000000000..212948b70
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
new file mode 100644
index 000000000..cce69655d
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_launcher.png b/core/src/main/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index 8bd22b54a..000000000
--- a/core/src/main/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_poll_box_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_poll_box_grey600_24dp.png
new file mode 100644
index 000000000..2ee172a51
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_poll_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_poll_box_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_poll_box_white_24dp.png
new file mode 100644
index 000000000..3fe2256c7
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_poll_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sd_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_sd_grey600_24dp.png
new file mode 100644
index 000000000..2c7c210d3
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_sd_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_sd_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_sd_white_24dp.png
new file mode 100644
index 000000000..77fd16301
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_sd_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_swap_vertical_grey600_24dp.png b/core/src/main/res/drawable-hdpi/ic_swap_vertical_grey600_24dp.png
new file mode 100644
index 000000000..cd3508d72
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_swap_vertical_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_swap_vertical_white_24dp.png b/core/src/main/res/drawable-hdpi/ic_swap_vertical_white_24dp.png
new file mode 100644
index 000000000..b26af6aac
--- /dev/null
+++ b/core/src/main/res/drawable-hdpi/ic_swap_vertical_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-ldpi/ic_launcher.png b/core/src/main/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 494468020..000000000
--- a/core/src/main/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
new file mode 100644
index 000000000..498ddf8eb
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
new file mode 100644
index 000000000..66a6d7681
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_launcher.png b/core/src/main/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index 219e8c5ab..000000000
--- a/core/src/main/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_poll_box_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_poll_box_grey600_24dp.png
new file mode 100644
index 000000000..6fefa8b8c
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_poll_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_poll_box_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_poll_box_white_24dp.png
new file mode 100644
index 000000000..cf45cde6d
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_poll_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sd_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_sd_grey600_24dp.png
new file mode 100644
index 000000000..81c5f77d9
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_sd_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_sd_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_sd_white_24dp.png
new file mode 100644
index 000000000..a012f237c
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_sd_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_swap_vertical_grey600_24dp.png b/core/src/main/res/drawable-mdpi/ic_swap_vertical_grey600_24dp.png
new file mode 100644
index 000000000..c2aeb3b5d
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_swap_vertical_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_swap_vertical_white_24dp.png b/core/src/main/res/drawable-mdpi/ic_swap_vertical_white_24dp.png
new file mode 100644
index 000000000..ea4faabdf
--- /dev/null
+++ b/core/src/main/res/drawable-mdpi/ic_swap_vertical_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
new file mode 100644
index 000000000..df64c26fe
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
new file mode 100644
index 000000000..9e49cbe0a
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_launcher.png b/core/src/main/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index 2dbfd8874..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_poll_box_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_poll_box_grey600_24dp.png
new file mode 100644
index 000000000..e09b052b9
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_poll_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_poll_box_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_poll_box_white_24dp.png
new file mode 100644
index 000000000..9ed41f906
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_poll_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_grey600_24dp.png
new file mode 100644
index 000000000..c2bc3fa9f
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_sd_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_sd_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_sd_white_24dp.png
new file mode 100644
index 000000000..76e620405
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_sd_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_swap_vertical_grey600_24dp.png b/core/src/main/res/drawable-xhdpi/ic_swap_vertical_grey600_24dp.png
new file mode 100644
index 000000000..c6139c821
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_swap_vertical_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_swap_vertical_white_24dp.png b/core/src/main/res/drawable-xhdpi/ic_swap_vertical_white_24dp.png
new file mode 100644
index 000000000..c4bee7069
--- /dev/null
+++ b/core/src/main/res/drawable-xhdpi/ic_swap_vertical_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
new file mode 100644
index 000000000..951244d68
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
new file mode 100644
index 000000000..3eaedd318
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_launcher.png b/core/src/main/res/drawable-xxhdpi/ic_launcher.png
deleted file mode 100644
index 41b261b4f..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_poll_box_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_poll_box_grey600_24dp.png
new file mode 100644
index 000000000..3d24d9670
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_poll_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_poll_box_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_poll_box_white_24dp.png
new file mode 100644
index 000000000..3d9f54b6c
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_poll_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_grey600_24dp.png
new file mode 100644
index 000000000..7e8fa947e
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_sd_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_sd_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_sd_white_24dp.png
new file mode 100644
index 000000000..66c74428e
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_sd_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_swap_vertical_grey600_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_swap_vertical_grey600_24dp.png
new file mode 100644
index 000000000..2d71e15fc
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_swap_vertical_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_swap_vertical_white_24dp.png b/core/src/main/res/drawable-xxhdpi/ic_swap_vertical_white_24dp.png
new file mode 100644
index 000000000..24df5b942
--- /dev/null
+++ b/core/src/main/res/drawable-xxhdpi/ic_swap_vertical_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
new file mode 100644
index 000000000..6c4c2b94c
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
new file mode 100644
index 000000000..fd5114044
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_checkbox_multiple_marked_outline_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_poll_box_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_poll_box_grey600_24dp.png
new file mode 100644
index 000000000..c97eba579
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_poll_box_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_poll_box_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_poll_box_white_24dp.png
new file mode 100644
index 000000000..54e169d54
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_poll_box_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_grey600_24dp.png
new file mode 100644
index 000000000..744b2c8f4
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sd_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_sd_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_sd_white_24dp.png
new file mode 100644
index 000000000..1bee910ed
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_sd_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_grey600_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_grey600_24dp.png
new file mode 100644
index 000000000..631ef6d0a
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_grey600_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_white_24dp.png b/core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_white_24dp.png
new file mode 100644
index 000000000..5bf24ac32
--- /dev/null
+++ b/core/src/main/res/drawable-xxxhdpi/ic_swap_vertical_white_24dp.png
Binary files differ
diff --git a/core/src/main/res/drawable/bg_splash.xml b/core/src/main/res/drawable/bg_splash.xml
index dd66e3083..32241ec22 100644
--- a/core/src/main/res/drawable/bg_splash.xml
+++ b/core/src/main/res/drawable/bg_splash.xml
@@ -2,12 +2,12 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:drawable="@color/overlay_dark"/>
+ android:drawable="@color/ic_launcher_background"/>
<item>
<bitmap
android:gravity="center"
- android:src="@drawable/ic_launcher"/>
+ android:src="@mipmap/ic_launcher_foreground"/>
</item>
</layer-list> \ No newline at end of file
diff --git a/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..036d09bc5
--- /dev/null
+++ b/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..036d09bc5
--- /dev/null
+++ b/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@color/ic_launcher_background"/>
+ <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher.png b/core/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..12e9b3395
--- /dev/null
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..d687f94bb
--- /dev/null
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-hdpi/ic_launcher_round.png b/core/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 000000000..12e9b3395
--- /dev/null
+++ b/core/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher.png b/core/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..1da13d374
--- /dev/null
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..2e7a4b74d
--- /dev/null
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-mdpi/ic_launcher_round.png b/core/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 000000000..1da13d374
--- /dev/null
+++ b/core/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher.png b/core/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..32b022ada
--- /dev/null
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..5f90a1d11
--- /dev/null
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..32b022ada
--- /dev/null
+++ b/core/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..321600e15
--- /dev/null
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..d72ffedbb
--- /dev/null
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..321600e15
--- /dev/null
+++ b/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..ff2870dca
--- /dev/null
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..0af16fadf
--- /dev/null
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Binary files differ
diff --git a/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..ff2870dca
--- /dev/null
+++ b/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml
index 45650495c..9d9a2453d 100644
--- a/core/src/main/res/values/arrays.xml
+++ b/core/src/main/res/values/arrays.xml
@@ -224,4 +224,26 @@
<item>@string/fast_forward_label</item>
<item>@string/skip_episode_label</item>
</string-array>
+
+ <string-array name="video_background_behavior_options">
+ <item>@string/stop_playback</item>
+ <item>@string/player_go_to_picture_in_picture</item>
+ <item>@string/continue_playback</item>
+ </string-array>
+
+ <string-array name="video_background_behavior_values">
+ <item>stop</item>
+ <item>pip</item>
+ <item>continue</item>
+ </string-array>
+
+ <string-array name="video_background_behavior_options_without_pip">
+ <item>@string/stop_playback</item>
+ <item>@string/continue_playback</item>
+ </string-array>
+
+ <string-array name="video_background_behavior_values_without_pip">
+ <item>stop</item>
+ <item>continue</item>
+ </string-array>
</resources>
diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml
index 04ad7ea64..b005d4dc3 100644
--- a/core/src/main/res/values/attrs.xml
+++ b/core/src/main/res/values/attrs.xml
@@ -12,6 +12,8 @@
<attr name="av_rewind" format="reference"/>
<attr name="content_discard" format="reference"/>
<attr name="content_new" format="reference"/>
+ <attr name="storage" format="reference"/>
+ <attr name="statistics" format="reference"/>
<attr name="feed" format="reference"/>
<attr name="location_web_site" format="reference"/>
<attr name="navigation_accept" format="reference"/>
@@ -44,6 +46,7 @@
<attr name="ic_unfav" format="reference"/>
<attr name="ic_sleep" format="reference"/>
<attr name="ic_sleep_off" format="reference"/>
+ <attr name="checkbox_multiple" format="reference"/>
<attr name="ic_check_box" format="reference"/>
<attr name="ic_check_box_outline" format="reference"/>
<attr name="ic_indeterminate_check_box" format="reference"/>
@@ -51,6 +54,8 @@
<attr name="ic_sd_storage" format="reference"/>
<attr name="ic_create_new_folder" format="reference"/>
<attr name="ic_cast_disconnect" format="reference"/>
+ <attr name="ic_swap" format="reference"/>
+ <attr name="master_switch_background" format="color"/>
<!-- Used in itemdescription -->
<attr name="non_transparent_background" format="reference"/>
diff --git a/core/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml
index 969500928..c9a5b3d6a 100644
--- a/core/src/main/res/values/colors.xml
+++ b/core/src/main/res/values/colors.xml
@@ -33,4 +33,7 @@
<color name="antennapod_blue">#147BAF</color>
+ <color name="master_switch_background_light">#DDDDDD</color>
+ <color name="master_switch_background_dark">#191919</color>
+
</resources>
diff --git a/core/src/main/res/values/ic_launcher_background.xml b/core/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 000000000..3df03b8f4
--- /dev/null
+++ b/core/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <color name="ic_launcher_background">#008AB8</color>
+</resources> \ No newline at end of file
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index aa36eab33..46bac68c9 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -11,6 +11,7 @@
<string name="add_feed_label">Add Podcast</string>
<string name="episodes_label">Episodes</string>
<string name="all_episodes_short_label">All</string>
+ <string name="new_episodes_label">New</string>
<string name="favorite_episodes_label">Favorites</string>
<string name="new_label">New</string>
<string name="settings_label">Settings</string>
@@ -23,6 +24,7 @@
<string name="cancel_download_label">Cancel\nDownload</string>
<string name="playback_history_label">Playback History</string>
<string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_summary">Synchronize with other devices</string>
<string name="gpodnet_auth_label">gpodder.net Login</string>
<string name="free_space_label">%1$s free</string>
<string name="episode_cache_full_title">Episode cache full</string>
@@ -122,6 +124,9 @@
<string name="mark_all_seen_msg">Marked all Episodes as seen</string>
<string name="mark_all_seen_confirmation_msg">Please confirm that you want to mark all episodes as seen.</string>
<string name="show_info_label">Show information</string>
+ <string name="show_feed_settings_label">Show feed settings</string>
+ <string name="feed_info_label">Feed info</string>
+ <string name="feed_settings_label">Feed settings</string>
<string name="rename_feed_label">Rename Podcast</string>
<string name="remove_feed_label">Remove Podcast</string>
<string name="share_label">Share&#8230;</string>
@@ -135,7 +140,7 @@
<string name="feed_remover_msg">Removing Feed</string>
<string name="load_complete_feed">Refresh complete Feed</string>
<string name="hide_episodes_title">Hide Episodes</string>
- <string name="episode_actions">Apply actions</string>
+ <string name="batch_edit">Batch edit</string>
<string name="hide_unplayed_episodes_label">Unplayed</string>
<string name="hide_paused_episodes_label">Paused</string>
<string name="hide_played_episodes_label">Played</string>
@@ -236,6 +241,7 @@
<string name="no_media_playing_label">No media playing</string>
<string name="position_default_label" translate="false">00:00:00</string>
<string name="player_buffering_msg">Buffering</string>
+ <string name="player_go_to_picture_in_picture">Picture-in-picture mode</string>
<string name="playbackservice_notification_title">Playing podcast</string>
<string name="unknown_media_key">AntennaPod - Unknown media key: %1$d</string>
@@ -254,6 +260,8 @@
<string name="duration">Duration</string>
<string name="episode_title">Episode title</string>
<string name="feed_title">Feed title</string>
+ <string name="random">Random</string>
+ <string name="smart_shuffle">Smart Shuffle</string>
<string name="ascending">Ascending</string>
<string name="descending">Descending</string>
<string name="clear_queue_confirmation_msg">Please confirm that you want to clear the queue of ALL of the episodes in it</string>
@@ -305,8 +313,17 @@
<string name="other_pref">Other</string>
<string name="about_pref">About</string>
<string name="queue_label">Queue</string>
- <string name="services_label">Services</string>
+ <string name="integrations_label">Integrations</string>
<string name="flattr_label">Flattr</string>
+ <string name="flattr_summary">Micropayment service</string>
+ <string name="automation">Automation</string>
+ <string name="download_pref_details">Details</string>
+ <string name="import_export_pref">Import/Export</string>
+ <string name="appearance">Appearance</string>
+ <string name="external_elements">External elements</string>
+ <string name="interruptions">Interruptions</string>
+ <string name="buttons">Buttons</string>
+ <string name="media_player">Media player</string>
<string name="pref_episode_cleanup_title">Episode Cleanup</string>
<string name="pref_episode_cleanup_summary">Episodes that aren\'t in the queue and aren\'t favorites should be eligible for removal if Auto Download needs space for new episodes</string>
<string name="pref_pauseOnDisconnect_sum">Pause playback when headphones or bluetooth are disconnected</string>
@@ -439,6 +456,10 @@
<string name="pref_cast_message_free_flavor">Chromecast requires third party proprietary libraries that are disabled in this version of AntennaPod</string>
<string name="pref_enqueue_downloaded_title">Enqueue Downloaded</string>
<string name="pref_enqueue_downloaded_summary">Add downloaded episodes to the queue</string>
+ <string name="pref_videoBehavior_title">Video behavior</string>
+ <string name="pref_videoBehavior_sum">Behavior when leaving video playback</string>
+ <string name="stop_playback">Stop playback</string>
+ <string name="continue_playback">Continue playback</string>
<!-- Auto-Flattr dialog -->
<string name="auto_flattr_enable">Enable automatic flattring</string>
diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml
index 13d956bab..77758a223 100644
--- a/core/src/main/res/values/styles.xml
+++ b/core/src/main/res/values/styles.xml
@@ -12,7 +12,11 @@
<item name="buttonStyle">@style/Widget.AntennaPod.Button</item>
<item name="alertDialogTheme">@style/AntennaPod.Dialog.Light</item>
<item type="attr" name="action_bar_icon_color">@color/grey600</item>
+ <item type="attr" name="storage">@drawable/ic_sd_grey600_24dp</item>
+ <item type="attr" name="ic_swap">@drawable/ic_swap_vertical_grey600_24dp</item>
+ <item type="attr" name="statistics">@drawable/ic_poll_box_grey600_24dp</item>
<item type="attr" name="action_about">@drawable/ic_info_grey600_24dp</item>
+ <item type="attr" name="checkbox_multiple">@drawable/ic_checkbox_multiple_marked_outline_grey600_24dp</item>
<item type="attr" name="action_search">@drawable/ic_search_grey600_24dp</item>
<item type="attr" name="action_stream">@drawable/ic_settings_input_antenna_grey600_24dp</item>
<item type="attr" name="av_download">@drawable/ic_file_download_grey600_24dp</item>
@@ -62,6 +66,7 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_grey600_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_grey600_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_grey600_36dp</item>
+ <item type="attr" name="master_switch_background">@color/master_switch_background_light</item>
</style>
<style name="Theme.AntennaPod.Dark" parent="Theme.Base.AntennaPod.Dark">
@@ -75,7 +80,11 @@
<item name="progressBarTheme">@style/ProgressBarDark</item>
<item name="alertDialogTheme">@style/AntennaPod.Dialog.Dark</item>
<item type="attr" name="action_bar_icon_color">@color/white</item>
- <item type="attr" name="action_about">@drawable/ic_info_white_24dp</item>g
+ <item type="attr" name="storage">@drawable/ic_sd_white_24dp</item>
+ <item type="attr" name="ic_swap">@drawable/ic_swap_vertical_white_24dp</item>
+ <item type="attr" name="statistics">@drawable/ic_poll_box_white_24dp</item>
+ <item type="attr" name="action_about">@drawable/ic_info_white_24dp</item>
+ <item type="attr" name="checkbox_multiple">@drawable/ic_checkbox_multiple_marked_outline_white_24dp</item>
<item type="attr" name="action_search">@drawable/ic_search_white_24dp</item>
<item type="attr" name="action_stream">@drawable/ic_settings_input_antenna_white_24dp</item>
<item type="attr" name="av_download">@drawable/ic_file_download_white_24dp</item>
@@ -125,6 +134,7 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_white_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_white_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_white_36dp</item>
+ <item type="attr" name="master_switch_background">@color/master_switch_background_dark</item>
</style>
<style name="Theme.AntennaPod.Light.NoTitle" parent="Theme.Base.AntennaPod.Light.NoTitle">
@@ -139,7 +149,11 @@
<item name="colorAccent">@color/holo_blue_light</item>
<item name="buttonStyle">@style/Widget.AntennaPod.Button</item>
<item name="alertDialogTheme">@style/AntennaPod.Dialog.Light</item>
+ <item type="attr" name="storage">@drawable/ic_sd_grey600_24dp</item>
+ <item type="attr" name="ic_swap">@drawable/ic_swap_vertical_grey600_24dp</item>
+ <item type="attr" name="statistics">@drawable/ic_poll_box_grey600_24dp</item>
<item type="attr" name="action_about">@drawable/ic_info_grey600_24dp</item>
+ <item type="attr" name="checkbox_multiple">@drawable/ic_checkbox_multiple_marked_outline_grey600_24dp</item>
<item type="attr" name="action_search">@drawable/ic_search_grey600_24dp</item>
<item type="attr" name="action_stream">@drawable/ic_settings_input_antenna_grey600_24dp</item>
<item type="attr" name="av_download">@drawable/ic_file_download_grey600_24dp</item>
@@ -189,6 +203,7 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_grey600_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_grey600_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_grey600_36dp</item>
+ <item type="attr" name="master_switch_background">@color/master_switch_background_light</item>
</style>
<style name="Theme.AntennaPod.Dark.NoTitle" parent="Theme.Base.AntennaPod.Dark.NoTitle">
@@ -203,7 +218,11 @@
<item name="colorControlNormal">@color/white</item>
<item name="buttonStyle">@style/Widget.AntennaPod.Button</item>
<item name="alertDialogTheme">@style/AntennaPod.Dialog.Dark</item>
+ <item type="attr" name="storage">@drawable/ic_sd_white_24dp</item>
+ <item type="attr" name="ic_swap">@drawable/ic_swap_vertical_white_24dp</item>
+ <item type="attr" name="statistics">@drawable/ic_poll_box_white_24dp</item>
<item type="attr" name="action_about">@drawable/ic_info_white_24dp</item>
+ <item type="attr" name="checkbox_multiple">@drawable/ic_checkbox_multiple_marked_outline_white_24dp</item>
<item type="attr" name="action_search">@drawable/ic_search_white_24dp</item>
<item type="attr" name="action_stream">@drawable/ic_settings_input_antenna_white_24dp</item>
<item type="attr" name="av_download">@drawable/ic_file_download_white_24dp</item>
@@ -253,6 +272,7 @@
<item type="attr" name="ic_sd_storage">@drawable/ic_sd_storage_white_36dp</item>
<item type="attr" name="ic_create_new_folder">@drawable/ic_create_new_folder_white_24dp</item>
<item type="attr" name="ic_cast_disconnect">@drawable/ic_cast_disconnect_white_36dp</item>
+ <item type="attr" name="master_switch_background">@color/master_switch_background_dark</item>
</style>
<style name="Theme.AntennaPod.Dark.Splash" parent="Theme.AppCompat.NoActionBar">