summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java16
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java12
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/Converter.java29
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java10
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/Timeline.java94
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.pngbin429 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.pngbin1100 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.pngbin1232 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-hdpi/ic_av_rewind_80dp.pngbin408 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.pngbin328 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.pngbin768 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.pngbin820 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-mdpi/ic_av_rewind_80dp.pngbin349 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-v21/overlay_button_circle_background.xml10
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.pngbin575 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.pngbin1889 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.pngbin1994 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.pngbin603 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.pngbin831 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.pngbin2745 -> 0 bytes
-rw-r--r--core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.pngbin2987 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.pngbin757 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.pngbin1332 -> 0 bytes
-rwxr-xr-xcore/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.pngbin1362 -> 0 bytes
-rw-r--r--core/src/main/res/drawable/ic_av_fast_forward_white_80dp.xml10
-rw-r--r--core/src/main/res/drawable/ic_av_fast_rewind_white_80dp.xml10
-rw-r--r--core/src/main/res/drawable/ic_av_pause_white_80dp.xml10
-rw-r--r--core/src/main/res/drawable/ic_av_play_white_80dp.xml10
-rw-r--r--core/src/main/res/drawable/overlay_button_circle_background.xml10
-rw-r--r--core/src/main/res/values/arrays.xml12
-rw-r--r--core/src/main/res/values/strings.xml21
38 files changed, 207 insertions, 81 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
index 29e2456b2..1b4cbc0ea 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/UpdateManager.java
@@ -71,6 +71,11 @@ class UpdateManager {
UserPreferences.setEpisodeCleanupValue(oldValueInDays * 24);
} // else 0 or special negative values, no change needed
}
+ if (oldVersionCode < 1070197) {
+ if (prefs.getBoolean("prefMobileUpdate", false)) {
+ prefs.edit().putString(UserPreferences.PREF_MOBILE_UPDATE, "everything").apply();
+ }
+ }
}
}
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 39994ec16..f3a43e2d0 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
@@ -594,7 +594,7 @@ public class FeedMedia extends FeedFile implements Playable {
@Override
public void setDownloaded(boolean downloaded) {
super.setDownloaded(downloaded);
- if(item != null && downloaded) {
+ if(item != null && downloaded && item.isNew()) {
item.setPlayed(false);
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java
index ec10b78aa..552c1b691 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java
@@ -31,6 +31,6 @@ public class ApGlideModule extends AppGlideModule {
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
- registry.append(String.class, InputStream.class, new ApOkHttpUrlLoader.Factory());
+ registry.replace(String.class, InputStream.class, new ApOkHttpUrlLoader.Factory());
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java
index bd5276100..2e742e979 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApOkHttpUrlLoader.java
@@ -21,10 +21,8 @@ import de.danoeh.antennapod.core.service.download.AntennapodHttpClient;
import de.danoeh.antennapod.core.service.download.HttpDownloader;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.util.NetworkUtils;
-import okhttp3.Interceptor;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
+import okhttp3.*;
+import okhttp3.internal.http.RealResponseBody;
/**
* @see com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader
@@ -111,10 +109,16 @@ class ApOkHttpUrlLoader implements ModelLoader<String, InputStream> {
@Override
public Response intercept(Chain chain) throws IOException {
- if (NetworkUtils.isDownloadAllowed()) {
+ if (NetworkUtils.isImageAllowed()) {
return chain.proceed(chain.request());
} else {
- return null;
+ return new Response.Builder()
+ .protocol(Protocol.HTTP_2)
+ .code(420)
+ .message("Policy Not Fulfilled")
+ .body(ResponseBody.create(null, new byte[0]))
+ .request(chain.request())
+ .build();
}
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
index 3af5e9080..2588cfdee 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/gpoddernet/GpodnetService.java
@@ -14,6 +14,7 @@ import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
@@ -587,7 +588,7 @@ public class GpodnetService {
String result = null;
ResponseBody body = null;
try {
- String credential = Credentials.basic(username, password);
+ String credential = Credentials.basic(username, password, Charset.forName("UTF-8"));
Request authRequest = request.newBuilder().header("Authorization", credential).build();
Response response = httpClient.newCall(authRequest).execute();
checkStatusCode(response);
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 1feecd849..805f0c1b6 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
@@ -77,7 +77,7 @@ public class UserPreferences {
// Network
private static final String PREF_ENQUEUE_DOWNLOADED = "prefEnqueueDownloaded";
public static final String PREF_UPDATE_INTERVAL = "prefAutoUpdateIntervall";
- private static final String PREF_MOBILE_UPDATE = "prefMobileUpdate";
+ public static final String PREF_MOBILE_UPDATE = "prefMobileUpdateAllowed";
public static final String PREF_EPISODE_CLEANUP = "prefEpisodeCleanup";
public static final String PREF_PARALLEL_DOWNLOADS = "prefParallelDownloads";
public static final String PREF_EPISODE_CACHE_SIZE = "prefEpisodeCacheSize";
@@ -380,8 +380,16 @@ public class UserPreferences {
}
}
+ public static String getMobileUpdatesEnabled() {
+ return prefs.getString(PREF_MOBILE_UPDATE, "images");
+ }
+
public static boolean isAllowMobileUpdate() {
- return prefs.getBoolean(PREF_MOBILE_UPDATE, false);
+ return getMobileUpdatesEnabled().equals("everything");
+ }
+
+ public static boolean isAllowMobileImages() {
+ return isAllowMobileUpdate() || getMobileUpdatesEnabled().equals("images");
}
public static int getParallelDownloads() {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
index 83aa4c780..63227e550 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java
@@ -882,10 +882,6 @@ public final class DBReader {
continue;
}
- // played duration used to be reset when the item is added to the playback history
- if (media.getPlaybackCompletionDate() != null) {
- feedPlayedTime += media.getDuration() / 1000;
- }
feedPlayedTime += media.getPlayedDuration() / 1000;
if (item.isPlayed()) {
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 f1410b894..1daa43025 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
@@ -1253,9 +1253,15 @@ public class PodDBAdapter {
}
public final int getNumberOfNewItems() {
- final String query = "SELECT COUNT(" + KEY_ID + ")"
- + " FROM " + TABLE_NAME_FEED_ITEMS
- + " WHERE " + KEY_READ + "=" + FeedItem.NEW;
+ Object[] args = new String[]{
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ID,
+ TABLE_NAME_FEED_ITEMS,
+ TABLE_NAME_FEEDS,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID,
+ TABLE_NAME_FEED_ITEMS + "." + KEY_READ + "=" + FeedItem.NEW
+ + " AND " + TABLE_NAME_FEEDS + "." + KEY_KEEP_UPDATED + " > 0"
+ };
+ final String query = String.format("SELECT COUNT(%s) FROM %s INNER JOIN %s ON %s WHERE %s", args);
Cursor c = db.rawQuery(query, null);
int result = 0;
if (c.moveToFirst()) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
index 6966667bf..6ecca941a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/Converter.java
@@ -74,13 +74,14 @@ public final class Converter {
return String.format(Locale.getDefault(), "%02d:%02d:%02d", h, m, s);
}
- /** Converts milliseconds to a string containing hours and minutes */
- public static String getDurationStringShort(int duration) {
- int h = duration / HOURS_MIL;
- int rest = duration - h * HOURS_MIL;
- int m = rest / MINUTES_MIL;
-
- return String.format(Locale.getDefault(), "%02d:%02d", h, m);
+ /** Converts milliseconds to a string containing hours and minutes or minutes and seconds*/
+ public static String getDurationStringShort(int duration, boolean durationIsInHours) {
+ int firstPartBase = durationIsInHours ? HOURS_MIL : MINUTES_MIL;
+ int firstPart = duration / firstPartBase;
+ int leftoverFromFirstPart = duration - firstPart * firstPartBase;
+ int secondPart = leftoverFromFirstPart / (durationIsInHours ? MINUTES_MIL : SECONDS_MIL);
+
+ return String.format(Locale.getDefault(), "%02d:%02d", firstPart, secondPart);
}
/** Converts long duration string (HH:MM:SS) to milliseconds. */
@@ -94,14 +95,20 @@ public final class Converter {
Integer.parseInt(parts[2]) * 1000;
}
- /** Converts short duration string (HH:MM) to milliseconds. */
- public static int durationStringShortToMs(String input) {
+ /**
+ * Converts short duration string (XX:YY) to milliseconds. If durationIsInHours is true then the
+ * format is HH:MM, otherwise it's MM:SS.
+ * */
+ public static int durationStringShortToMs(String input, boolean durationIsInHours) {
String[] parts = input.split(":");
if (parts.length != 2) {
return 0;
}
- return Integer.parseInt(parts[0]) * 3600 * 1000 +
- Integer.parseInt(parts[1]) * 1000 * 60;
+
+ int modifier = durationIsInHours ? 60 : 1;
+
+ return Integer.parseInt(parts[0]) * 60 * 1000 * modifier+
+ Integer.parseInt(parts[1]) * 1000 * modifier;
}
/** Converts milliseconds to a localized string containing hours and minutes */
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java
index b34ba196d..9bdd375ce 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java
@@ -90,9 +90,13 @@ public class NetworkUtils {
return info != null && info.isConnected();
}
- public static boolean isDownloadAllowed() {
- return UserPreferences.isAllowMobileUpdate() || !NetworkUtils.isNetworkMetered();
- }
+ public static boolean isDownloadAllowed() {
+ return UserPreferences.isAllowMobileUpdate() || !NetworkUtils.isNetworkMetered();
+ }
+
+ public static boolean isImageAllowed() {
+ return UserPreferences.isAllowMobileImages() || !NetworkUtils.isNetworkMetered();
+ }
private static boolean isNetworkMetered() {
ConnectivityManager connManager = (ConnectivityManager) context
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
index 91009a196..6498b9ff1 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
@@ -407,8 +407,8 @@ public abstract class PlaybackController {
pauseResource = res.getResourceId(1, R.drawable.ic_pause_grey600_36dp);
res.recycle();
} else {
- playResource = R.drawable.ic_av_play_circle_outline_80dp;
- pauseResource = R.drawable.ic_av_pause_circle_outline_80dp;
+ playResource = R.drawable.ic_av_play_white_80dp;
+ pauseResource = R.drawable.ic_av_pause_white_80dp;
}
Log.d(TAG, "status: " + status.toString());
@@ -800,7 +800,7 @@ public abstract class PlaybackController {
res.getResourceId(0, de.danoeh.antennapod.core.R.drawable.ic_play_arrow_grey600_36dp));
res.recycle();
} else {
- getPlayButton().setImageResource(R.drawable.ic_av_play_circle_outline_80dp);
+ getPlayButton().setImageResource(R.drawable.ic_av_play_white_80dp);
}
}, error -> Log.e(TAG, Log.getStackTraceString(error)));
}
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 34cfe6d05..56550bb06 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
@@ -7,6 +7,7 @@ import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Pair;
import android.util.TypedValue;
import org.jsoup.Jsoup;
@@ -14,6 +15,7 @@ import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
+import java.util.ArrayList;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -68,7 +70,7 @@ public class Timeline {
private static final Pattern TIMECODE_LINK_REGEX = Pattern.compile("antennapod://timecode/((\\d+))");
private static final String TIMECODE_LINK = "<a class=\"timecode\" href=\"antennapod://timecode/%d\">%s</a>";
- private static final Pattern TIMECODE_REGEX = Pattern.compile("\\b(?:(?:(([0-9][0-9])):))?(([0-9][0-9])):(([0-9][0-9]))\\b");
+ private static final Pattern TIMECODE_REGEX = Pattern.compile("\\b((\\d+):)?(\\d+):(\\d{2})\\b");
private static final Pattern LINE_BREAK_REGEX = Pattern.compile("<br */?>");
@@ -127,35 +129,12 @@ public class Timeline {
// apply timecode links
if (addTimecodes) {
- Elements elementsWithTimeCodes = document.body().getElementsMatchingOwnText(TIMECODE_REGEX);
- Log.d(TAG, "Recognized " + elementsWithTimeCodes.size() + " timecodes");
- for (Element element : elementsWithTimeCodes) {
- Matcher matcherLong = TIMECODE_REGEX.matcher(element.html());
- StringBuffer buffer = new StringBuffer();
- while (matcherLong.find()) {
- String h = matcherLong.group(1);
- String group = matcherLong.group(0);
- int time = (h != null) ? Converter.durationStringLongToMs(group) :
- Converter.durationStringShortToMs(group);
-
- String rep;
- if (playable == null || playable.getDuration() > time) {
- rep = String.format(Locale.getDefault(), TIMECODE_LINK, time, group);
- } else {
- rep = group;
- }
- matcherLong.appendReplacement(buffer, rep);
- }
- matcherLong.appendTail(buffer);
-
- element.html(buffer.toString());
- }
+ addTimecodes(document, playable);
}
return document.toString();
}
-
/**
* Returns true if the given link is a timecode link.
*/
@@ -186,4 +165,69 @@ public class Timeline {
public void setShownotesProvider(@NonNull ShownotesProvider shownotesProvider) {
this.shownotesProvider = shownotesProvider;
}
+
+ private void addTimecodes(Document document, final Playable playable) {
+ Elements elementsWithTimeCodes = document.body().getElementsMatchingOwnText(TIMECODE_REGEX);
+ Log.d(TAG, "Recognized " + elementsWithTimeCodes.size() + " timecodes");
+
+ if (elementsWithTimeCodes.size() == 0) {
+ // No elements with timecodes
+ return;
+ }
+
+ int playableDuration = playable == null ? Integer.MAX_VALUE : playable.getDuration();
+ boolean useHourFormat = true;
+
+ if (playableDuration != Integer.MAX_VALUE) {
+
+ // We need to decide if we are going to treat short timecodes as HH:MM or MM:SS. To do
+ // so we will parse all the short timecodes and see if they fit in the duration. If one
+ // does not we will use MM:SS, otherwise all will be parsed as HH:MM.
+ for (Element element : elementsWithTimeCodes) {
+ Matcher matcherForElement = TIMECODE_REGEX.matcher(element.html());
+ while (matcherForElement.find()) {
+
+ // We only want short timecodes right now.
+ if (matcherForElement.group(1) == null) {
+ int time = Converter.durationStringShortToMs(matcherForElement.group(0), true);
+
+ // If the parsed timecode is greater then the duration then we know we need to
+ // use the minute format so we are done.
+ if (time > playableDuration) {
+ useHourFormat = false;
+ break;
+ }
+ }
+ }
+
+ if (!useHourFormat) {
+ break;
+ }
+ }
+ }
+
+ for (Element element : elementsWithTimeCodes) {
+
+ Matcher matcherForElement = TIMECODE_REGEX.matcher(element.html());
+ StringBuffer buffer = new StringBuffer();
+
+ while (matcherForElement.find()) {
+ String group = matcherForElement.group(0);
+
+ int time = matcherForElement.group(1) != null
+ ? Converter.durationStringLongToMs(group)
+ : Converter.durationStringShortToMs(group, useHourFormat);
+
+ String replacementText = group;
+ if (time < playableDuration) {
+ replacementText = String.format(Locale.getDefault(), TIMECODE_LINK, time, group);
+ }
+
+ matcherForElement.appendReplacement(buffer, replacementText);
+ }
+
+ matcherForElement.appendTail(buffer);
+ element.html(buffer.toString());
+ }
+ }
}
diff --git a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png
deleted file mode 100755
index 43783fbce..000000000
--- a/core/src/main/res/drawable-hdpi/ic_av_fast_forward_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png
deleted file mode 100644
index 115f7ebef..000000000
--- a/core/src/main/res/drawable-hdpi/ic_av_pause_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png
deleted file mode 100644
index 392c87bd2..000000000
--- a/core/src/main/res/drawable-hdpi/ic_av_play_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png
deleted file mode 100755
index 41052af65..000000000
--- a/core/src/main/res/drawable-hdpi/ic_av_rewind_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png
deleted file mode 100755
index 0bf060d89..000000000
--- a/core/src/main/res/drawable-mdpi/ic_av_fast_forward_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png
deleted file mode 100644
index 1e71c271f..000000000
--- a/core/src/main/res/drawable-mdpi/ic_av_pause_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png
deleted file mode 100644
index d305f0c69..000000000
--- a/core/src/main/res/drawable-mdpi/ic_av_play_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png
deleted file mode 100755
index 99ac9f3c9..000000000
--- a/core/src/main/res/drawable-mdpi/ic_av_rewind_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-v21/overlay_button_circle_background.xml b/core/src/main/res/drawable-v21/overlay_button_circle_background.xml
deleted file mode 100644
index c121690df..000000000
--- a/core/src/main/res/drawable-v21/overlay_button_circle_background.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <gradient
- android:type="radial"
- android:gradientRadius="37.5%p"
- android:startColor="#000000"
- android:endColor="@android:color/transparent"/>
-</shape> \ No newline at end of file
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png
deleted file mode 100755
index 270dc9bf8..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_av_fast_forward_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png
deleted file mode 100644
index 2e0b8ff6f..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_av_pause_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png
deleted file mode 100644
index 990ae524a..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_av_play_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png
deleted file mode 100755
index d94a40811..000000000
--- a/core/src/main/res/drawable-xhdpi/ic_av_rewind_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png
deleted file mode 100755
index 3b55c5d55..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_av_fast_forward_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png
deleted file mode 100644
index 76cc4db32..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_av_pause_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png
deleted file mode 100644
index eebf0110c..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_av_play_circle_outline_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png
deleted file mode 100755
index 38a5fc264..000000000
--- a/core/src/main/res/drawable-xxhdpi/ic_av_rewind_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png
deleted file mode 100755
index 1c915d9dd..000000000
--- a/core/src/main/res/drawable-xxxhdpi/ic_av_fast_forward_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png b/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png
deleted file mode 100755
index 190bb0f4c..000000000
--- a/core/src/main/res/drawable-xxxhdpi/ic_av_rewind_80dp.png
+++ /dev/null
Binary files differ
diff --git a/core/src/main/res/drawable/ic_av_fast_forward_white_80dp.xml b/core/src/main/res/drawable/ic_av_fast_forward_white_80dp.xml
new file mode 100644
index 000000000..a60145f1d
--- /dev/null
+++ b/core/src/main/res/drawable/ic_av_fast_forward_white_80dp.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="80dp"
+ android:width="80dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path android:pathData="M4,18l8.5,-6L4,6v12zM13,6v12l8.5,-6L13,6z"
+ android:fillColor="#FFFFFFFF"
+ android:strokeColor="#505050"
+ android:strokeWidth="0.75"/>
+</vector>
diff --git a/core/src/main/res/drawable/ic_av_fast_rewind_white_80dp.xml b/core/src/main/res/drawable/ic_av_fast_rewind_white_80dp.xml
new file mode 100644
index 000000000..4609e0c3e
--- /dev/null
+++ b/core/src/main/res/drawable/ic_av_fast_rewind_white_80dp.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0"
+ android:width="80dp"
+ android:height="80dp">
+ <path android:pathData="M11,18L11,6l-8.5,6 8.5,6zM11.5,12l8.5,6L20,6l-8.5,6z"
+ android:fillColor="#FFFFFFFF"
+ android:strokeColor="#505050"
+ android:strokeWidth="0.75"/>
+</vector>
diff --git a/core/src/main/res/drawable/ic_av_pause_white_80dp.xml b/core/src/main/res/drawable/ic_av_pause_white_80dp.xml
new file mode 100644
index 000000000..ad8847cb7
--- /dev/null
+++ b/core/src/main/res/drawable/ic_av_pause_white_80dp.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="80dp"
+ android:width="80dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"
+ android:fillColor="#FFFFFFFF"
+ android:strokeColor="#505050"
+ android:strokeWidth="0.75"/>
+</vector>
diff --git a/core/src/main/res/drawable/ic_av_play_white_80dp.xml b/core/src/main/res/drawable/ic_av_play_white_80dp.xml
new file mode 100644
index 000000000..9f9dbb1b1
--- /dev/null
+++ b/core/src/main/res/drawable/ic_av_play_white_80dp.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="80dp"
+ android:width="80dp"
+ android:viewportHeight="24.0"
+ android:viewportWidth="24.0">
+ <path android:pathData="M8,5v14l11,-7z"
+ android:fillColor="#FFFFFFFF"
+ android:strokeColor="#505050"
+ android:strokeWidth="0.75"/>
+</vector>
diff --git a/core/src/main/res/drawable/overlay_button_circle_background.xml b/core/src/main/res/drawable/overlay_button_circle_background.xml
deleted file mode 100644
index 90c51472c..000000000
--- a/core/src/main/res/drawable/overlay_button_circle_background.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <gradient
- android:type="radial"
- android:gradientRadius="60"
- android:startColor="#000000"
- android:endColor="@android:color/transparent"/>
-</shape> \ No newline at end of file
diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml
index 157b040e1..6d310e0e5 100644
--- a/core/src/main/res/values/arrays.xml
+++ b/core/src/main/res/values/arrays.xml
@@ -55,6 +55,18 @@
<item>-1</item>
</string-array>
+ <string-array name="mobile_update_entries">
+ <item>@string/pref_mobileUpdate_nothing</item>
+ <item>@string/pref_mobileUpdate_images</item>
+ <item>@string/pref_mobileUpdate_everything</item>
+ </string-array>
+
+ <string-array name="mobile_update_values">
+ <item>nothing</item>
+ <item>images</item>
+ <item>everything</item>
+ </string-array>
+
<string-array name="episode_cleanup_entries">
<item>@string/episode_cleanup_queue_removal</item>
<item>0</item>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index dd6053b5d..3b03f2af7 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -314,10 +314,25 @@
<string name="enable_sonic">Enable Sonic</string>
<!-- Empty list labels -->
- <string name="no_items_label">There are no items in this list.</string>
+ <string name="no_items_header_label">No queued episodes</string>
+ <string name="no_items_label">You can add episodes to the queue by long-pressing or downloading them.</string>
<string name="no_feeds_label">You haven\'t subscribed to any podcasts yet.</string>
<string name="no_chapters_label">This episode has no chapters.</string>
<string name="no_shownotes_label">This episode has no shownotes.</string>
+ <string name="no_run_downloads_head_label">No downloads running</string>
+ <string name="no_run_downloads_label">You can download episodes on the podcast details screen.</string>
+ <string name="no_comp_downloads_head_label">No downloaded episodes</string>
+ <string name="no_comp_downloads_label">You can download episodes on the podcast details screen.</string>
+ <string name="no_log_downloads_head_label">No download log</string>
+ <string name="no_log_downloads_label">Download logs will appear here when available.</string>
+ <string name="no_history_head_label">No History</string>
+ <string name="no_history_label">After you listen to an episode, it will appear here.</string>
+ <string name="no_all_episodes_head_label">No Episodes</string>
+ <string name="no_all_episodes_label">When you add a podcast, the episodes will be shown here.</string>
+ <string name="no_new_episodes_head_label">No new episodes</string>
+ <string name="no_new_episodes_label">When new episodes arrive, they will be shown here.</string>
+ <string name="no_fav_episodes_head_label">No favorite episodes</string>
+ <string name="no_fav_episodes_label">You can add episodes to the favorites by long-pressing them.</string>
<!-- Preferences -->
<string name="storage_pref">Storage</string>
@@ -331,6 +346,7 @@
<string name="automation">Automation</string>
<string name="download_pref_details">Details</string>
<string name="import_export_pref">Import/Export</string>
+ <string name="import_export_search_keywords">backup, restore</string>
<string name="appearance">Appearance</string>
<string name="external_elements">External elements</string>
<string name="interruptions">Interruptions</string>
@@ -372,6 +388,9 @@
<string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth Reconnect</string>
<string name="pref_mobileUpdate_title">Mobile Updates</string>
<string name="pref_mobileUpdate_sum">Allow updates over the mobile data connection</string>
+ <string name="pref_mobileUpdate_nothing">Nothing</string>
+ <string name="pref_mobileUpdate_images">Images only</string>
+ <string name="pref_mobileUpdate_everything">Everything</string>
<string name="refreshing_label">Refreshing</string>
<string name="flattr_settings_label">Flattr settings</string>
<string name="pref_flattr_auth_title">Flattr sign-in</string>