summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2024-04-05 19:20:27 +0200
committerGitHub <noreply@github.com>2024-04-05 19:20:27 +0200
commit92ab575b150ab49ca85e0ac994558142e49c9e68 (patch)
tree422dcd76895a4ba06ed02723ff61351435c0fe49 /core/src/main
parent2143ab135182434911d4554a8ef08115eaa0d2d0 (diff)
downloadAntennaPod-92ab575b150ab49ca85e0ac994558142e49c9e68.zip
Delete core module (#7060)
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/AndroidManifest.xml15
-rw-r--r--core/src/main/assets/shownotes-style.css30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ChapterMerger.java70
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java241
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ConfirmationDialog.java56
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java69
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/FeedUtil.java13
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java69
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/ReleaseScheduleGuesser.java219
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java42
-rw-r--r--core/src/main/res/drawable-anydpi-v26/ic_shortcut_feed.xml9
-rw-r--r--core/src/main/res/drawable-anydpi-v26/ic_shortcut_playlist.xml9
-rw-r--r--core/src/main/res/drawable-anydpi-v26/ic_shortcut_refresh.xml9
-rw-r--r--core/src/main/res/drawable-anydpi-v26/ic_shortcut_subscriptions.xml9
-rw-r--r--core/src/main/res/drawable/bg_blue_gradient.xml10
-rw-r--r--core/src/main/res/drawable/bg_circle.xml6
-rw-r--r--core/src/main/res/drawable/bg_drawer_item.xml20
-rw-r--r--core/src/main/res/drawable/bg_gradient.xml10
-rw-r--r--core/src/main/res/drawable/bg_pill.xml7
-rw-r--r--core/src/main/res/drawable/bg_rounded_corners.xml6
-rw-r--r--core/src/main/res/drawable/ic_shortcut_feed.xml7
-rw-r--r--core/src/main/res/drawable/ic_shortcut_playlist.xml7
-rw-r--r--core/src/main/res/drawable/ic_shortcut_refresh.xml7
-rw-r--r--core/src/main/res/drawable/ic_shortcut_subscriptions.xml7
-rw-r--r--core/src/main/res/layout/more_content_list_footer.xml36
-rw-r--r--core/src/main/res/layout/popup_bubble_view.xml41
-rw-r--r--core/src/main/res/values/arrays.xml277
-rw-r--r--core/src/main/res/values/ids.xml17
-rw-r--r--core/src/main/res/values/keycodes.xml9
29 files changed, 0 insertions, 1327 deletions
diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml
deleted file mode 100644
index 73c47d636..000000000
--- a/core/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools">
-
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
- tools:ignore="ScopedStorage" />
- <uses-permission android:name="android.permission.WAKE_LOCK" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.BLUETOOTH" />
- <uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
-
-</manifest>
diff --git a/core/src/main/assets/shownotes-style.css b/core/src/main/assets/shownotes-style.css
deleted file mode 100644
index 01d13bc16..000000000
--- a/core/src/main/assets/shownotes-style.css
+++ /dev/null
@@ -1,30 +0,0 @@
-* {
- color: %s;
- overflow-wrap: break-word;
-}
-a {
- font-style: normal;
- text-decoration: none;
- font-weight: normal;
- color: %s;
-}
-a.timecode {
- color: #669900;
-}
-img, iframe {
- display: block;
- margin: 10 auto;
- max-width: 100%%;
- height: auto;
-}
-body {
- padding: %dpx %dpx %dpx %dpx;
-}
-p#apNoShownotes {
- position: fixed;
- top: 50%%;
- left: 50%%;
- transform: translate(-50%%, -50%%);
- text-align: center;
- -webkit-text-size-adjust: none;
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterMerger.java b/core/src/main/java/de/danoeh/antennapod/core/util/ChapterMerger.java
deleted file mode 100644
index 794b2322d..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterMerger.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import android.text.TextUtils;
-import android.util.Log;
-import androidx.annotation.Nullable;
-import de.danoeh.antennapod.model.feed.Chapter;
-
-import java.util.List;
-
-public class ChapterMerger {
- private static final String TAG = "ChapterMerger";
-
- private ChapterMerger() {
-
- }
-
- /**
- * This method might modify the input data.
- */
- @Nullable
- public static List<Chapter> merge(@Nullable List<Chapter> chapters1, @Nullable List<Chapter> chapters2) {
- Log.d(TAG, "Merging chapters");
- if (chapters1 == null) {
- return chapters2;
- } else if (chapters2 == null) {
- return chapters1;
- } else if (chapters2.size() > chapters1.size()) {
- return chapters2;
- } else if (chapters2.size() < chapters1.size()) {
- return chapters1;
- } else {
- // Merge chapter lists of same length. Store in chapters2 array.
- // In case the lists can not be merged, return chapters1 array.
- for (int i = 0; i < chapters2.size(); i++) {
- Chapter chapterTarget = chapters2.get(i);
- Chapter chapterOther = chapters1.get(i);
-
- if (Math.abs(chapterTarget.getStart() - chapterOther.getStart()) > 1000) {
- Log.e(TAG, "Chapter lists are too different. Cancelling merge.");
- return score(chapters1) > score(chapters2) ? chapters1 : chapters2;
- }
-
- if (TextUtils.isEmpty(chapterTarget.getImageUrl())) {
- chapterTarget.setImageUrl(chapterOther.getImageUrl());
- }
- if (TextUtils.isEmpty(chapterTarget.getLink())) {
- chapterTarget.setLink(chapterOther.getLink());
- }
- if (TextUtils.isEmpty(chapterTarget.getTitle())) {
- chapterTarget.setTitle(chapterOther.getTitle());
- }
- }
- return chapters2;
- }
- }
-
- /**
- * Tries to give a score that can determine which list of chapters a user might want to see.
- */
- private static int score(List<Chapter> chapters) {
- int score = 0;
- for (Chapter chapter : chapters) {
- score = score
- + (TextUtils.isEmpty(chapter.getTitle()) ? 0 : 1)
- + (TextUtils.isEmpty(chapter.getLink()) ? 0 : 1)
- + (TextUtils.isEmpty(chapter.getImageUrl()) ? 0 : 1);
- }
- return score;
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java
deleted file mode 100644
index b32b05236..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ChapterUtils.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import android.content.ContentResolver;
-import android.content.Context;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
-import androidx.annotation.NonNull;
-import de.danoeh.antennapod.model.feed.Chapter;
-import de.danoeh.antennapod.model.feed.FeedMedia;
-import de.danoeh.antennapod.net.common.AntennapodHttpClient;
-import de.danoeh.antennapod.storage.database.DBReader;
-import de.danoeh.antennapod.parser.feed.PodcastIndexChapterParser;
-import de.danoeh.antennapod.parser.media.id3.ChapterReader;
-import de.danoeh.antennapod.parser.media.id3.ID3ReaderException;
-import de.danoeh.antennapod.model.playback.Playable;
-import de.danoeh.antennapod.parser.media.vorbis.VorbisCommentChapterReader;
-import de.danoeh.antennapod.parser.media.vorbis.VorbisCommentReaderException;
-import okhttp3.CacheControl;
-import okhttp3.Request;
-import okhttp3.Response;
-import org.apache.commons.io.input.CountingInputStream;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Utility class for getting chapter data from media files.
- */
-public class ChapterUtils {
-
- private static final String TAG = "ChapterUtils";
-
- private ChapterUtils() {
- }
-
- public static int getCurrentChapterIndex(Playable media, int position) {
- if (media == null || media.getChapters() == null || media.getChapters().size() == 0) {
- return -1;
- }
- List<Chapter> chapters = media.getChapters();
- for (int i = 0; i < chapters.size(); i++) {
- if (chapters.get(i).getStart() > position) {
- return i - 1;
- }
- }
- return chapters.size() - 1;
- }
-
- public static void loadChapters(Playable playable, Context context, boolean forceRefresh) {
- if (playable.getChapters() != null && !forceRefresh) {
- // Already loaded
- return;
- }
-
- try {
- List<Chapter> chaptersFromDatabase = null;
- List<Chapter> chaptersFromPodcastIndex = null;
- if (playable instanceof FeedMedia) {
- FeedMedia feedMedia = (FeedMedia) playable;
- if (feedMedia.getItem() == null) {
- feedMedia.setItem(DBReader.getFeedItem(feedMedia.getItemId()));
- }
- if (feedMedia.getItem().hasChapters()) {
- chaptersFromDatabase = DBReader.loadChaptersOfFeedItem(feedMedia.getItem());
- }
-
- if (!TextUtils.isEmpty(feedMedia.getItem().getPodcastIndexChapterUrl())) {
- chaptersFromPodcastIndex = ChapterUtils.loadChaptersFromUrl(
- feedMedia.getItem().getPodcastIndexChapterUrl(), forceRefresh);
- }
-
- }
-
- List<Chapter> chaptersFromMediaFile = ChapterUtils.loadChaptersFromMediaFile(playable, context);
- List<Chapter> chaptersMergePhase1 = ChapterMerger.merge(chaptersFromDatabase, chaptersFromMediaFile);
- List<Chapter> chapters = ChapterMerger.merge(chaptersMergePhase1, chaptersFromPodcastIndex);
- if (chapters == null) {
- // Do not try loading again. There are no chapters or parsing failed.
- playable.setChapters(Collections.emptyList());
- } else {
- playable.setChapters(chapters);
- }
- } catch (InterruptedIOException e) {
- Log.d(TAG, "Chapter loading interrupted");
- playable.setChapters(null); // Allow later retry
- }
- }
-
- public static List<Chapter> loadChaptersFromMediaFile(Playable playable, Context context)
- throws InterruptedIOException {
- try (CountingInputStream in = openStream(playable, context)) {
- List<Chapter> chapters = readId3ChaptersFrom(in);
- if (!chapters.isEmpty()) {
- Log.i(TAG, "Chapters loaded");
- return chapters;
- }
- } catch (InterruptedIOException e) {
- throw e;
- } catch (IOException | ID3ReaderException e) {
- Log.e(TAG, "Unable to load ID3 chapters: " + e.getMessage());
- }
-
- try (CountingInputStream in = openStream(playable, context)) {
- List<Chapter> chapters = readOggChaptersFromInputStream(in);
- if (!chapters.isEmpty()) {
- Log.i(TAG, "Chapters loaded");
- return chapters;
- }
- } catch (InterruptedIOException e) {
- throw e;
- } catch (IOException | VorbisCommentReaderException e) {
- Log.e(TAG, "Unable to load vorbis chapters: " + e.getMessage());
- }
- return null;
- }
-
- private static CountingInputStream openStream(Playable playable, Context context) throws IOException {
- if (playable.localFileAvailable()) {
- if (playable.getLocalFileUrl() == null) {
- throw new IOException("No local url");
- }
- File source = new File(playable.getLocalFileUrl());
- if (!source.exists()) {
- throw new IOException("Local file does not exist");
- }
- return new CountingInputStream(new BufferedInputStream(new FileInputStream(source)));
- } else if (playable.getStreamUrl().startsWith(ContentResolver.SCHEME_CONTENT)) {
- Uri uri = Uri.parse(playable.getStreamUrl());
- return new CountingInputStream(new BufferedInputStream(context.getContentResolver().openInputStream(uri)));
- } else {
- Request request = new Request.Builder().url(playable.getStreamUrl()).build();
- Response response = AntennapodHttpClient.getHttpClient().newCall(request).execute();
- if (response.body() == null) {
- throw new IOException("Body is null");
- }
- return new CountingInputStream(new BufferedInputStream(response.body().byteStream()));
- }
- }
-
- public static List<Chapter> loadChaptersFromUrl(String url, boolean forceRefresh) throws InterruptedIOException {
- if (forceRefresh) {
- return loadChaptersFromUrl(url, CacheControl.FORCE_NETWORK);
- }
- List<Chapter> cachedChapters = loadChaptersFromUrl(url, CacheControl.FORCE_CACHE);
- if (cachedChapters == null || cachedChapters.size() <= 1) {
- // Some publishers use one dummy chapter before actual chapters are available
- return loadChaptersFromUrl(url, CacheControl.FORCE_NETWORK);
- }
- return cachedChapters;
- }
-
- private static List<Chapter> loadChaptersFromUrl(String url, CacheControl cacheControl)
- throws InterruptedIOException {
- Response response = null;
- try {
- Request request = new Request.Builder().url(url).cacheControl(cacheControl).build();
- response = AntennapodHttpClient.getHttpClient().newCall(request).execute();
- if (response.isSuccessful() && response.body() != null) {
- return PodcastIndexChapterParser.parse(response.body().string());
- }
- } catch (InterruptedIOException e) {
- throw e;
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (response != null) {
- response.close();
- }
- }
- return null;
- }
-
- @NonNull
- private static List<Chapter> readId3ChaptersFrom(CountingInputStream in) throws IOException, ID3ReaderException {
- ChapterReader reader = new ChapterReader(in);
- reader.readInputStream();
- List<Chapter> chapters = reader.getChapters();
- Collections.sort(chapters, new ChapterStartTimeComparator());
- enumerateEmptyChapterTitles(chapters);
- if (!chaptersValid(chapters)) {
- Log.e(TAG, "Chapter data was invalid");
- return Collections.emptyList();
- }
- return chapters;
- }
-
- @NonNull
- private static List<Chapter> readOggChaptersFromInputStream(InputStream input) throws VorbisCommentReaderException {
- VorbisCommentChapterReader reader = new VorbisCommentChapterReader(new BufferedInputStream(input));
- reader.readInputStream();
- List<Chapter> chapters = reader.getChapters();
- if (chapters == null) {
- return Collections.emptyList();
- }
- Collections.sort(chapters, new ChapterStartTimeComparator());
- enumerateEmptyChapterTitles(chapters);
- if (chaptersValid(chapters)) {
- return chapters;
- }
- return Collections.emptyList();
- }
-
- /**
- * Makes sure that chapter does a title and an item attribute.
- */
- private static void enumerateEmptyChapterTitles(List<Chapter> chapters) {
- for (int i = 0; i < chapters.size(); i++) {
- Chapter c = chapters.get(i);
- if (c.getTitle() == null) {
- c.setTitle(Integer.toString(i));
- }
- }
- }
-
- private static boolean chaptersValid(List<Chapter> chapters) {
- if (chapters.isEmpty()) {
- return false;
- }
- for (Chapter c : chapters) {
- if (c.getStart() < 0) {
- return false;
- }
- }
- return true;
- }
-
- public static class ChapterStartTimeComparator implements Comparator<Chapter> {
- @Override
- public int compare(Chapter lhs, Chapter rhs) {
- return Long.compare(lhs.getStart(), rhs.getStart());
- }
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ConfirmationDialog.java b/core/src/main/java/de/danoeh/antennapod/core/util/ConfirmationDialog.java
deleted file mode 100644
index ff5e56f5d..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ConfirmationDialog.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import androidx.appcompat.app.AlertDialog;
-import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import android.util.Log;
-
-import de.danoeh.antennapod.core.R;
-
-/**
- * Creates an AlertDialog which asks the user to confirm something. Other
- * classes can handle events like confirmation or cancellation.
- */
-public abstract class ConfirmationDialog {
-
- private static final String TAG = ConfirmationDialog.class.getSimpleName();
-
- private final Context context;
- private final int titleId;
- private final String message;
-
- private int positiveText;
-
- public ConfirmationDialog(Context context, int titleId, int messageId) {
- this(context, titleId, context.getString(messageId));
- }
-
- public ConfirmationDialog(Context context, int titleId, String message) {
- this.context = context;
- this.titleId = titleId;
- this.message = message;
- }
-
- private void onCancelButtonPressed(DialogInterface dialog) {
- Log.d(TAG, "Dialog was cancelled");
- dialog.dismiss();
- }
-
- public void setPositiveText(int id) {
- this.positiveText = id;
- }
-
- public abstract void onConfirmButtonPressed(DialogInterface dialog);
-
- public final AlertDialog createNewDialog() {
- MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
- builder.setTitle(titleId);
- builder.setMessage(message);
- builder.setPositiveButton(positiveText != 0 ? positiveText : R.string.confirm_label,
- (dialog, which) -> onConfirmButtonPressed(dialog));
- builder.setNegativeButton(R.string.cancel_label, (dialog, which) -> onCancelButtonPressed(dialog));
- builder.setOnCancelListener(ConfirmationDialog.this::onCancelButtonPressed);
- return builder.create();
- }
-}
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
deleted file mode 100644
index db8a33576..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/FeedItemUtil.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import androidx.annotation.NonNull;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import de.danoeh.antennapod.model.feed.FeedItem;
-
-public class FeedItemUtil {
- private FeedItemUtil(){}
-
- public static int indexOfItemWithId(List<FeedItem> items, long id) {
- for(int i=0; i < items.size(); i++) {
- FeedItem item = items.get(i);
- if(item != null && item.getId() == id) {
- return i;
- }
- }
- return -1;
- }
-
- public static int indexOfItemWithDownloadUrl(List<FeedItem> items, String downloadUrl) {
- for (int i = 0; i < items.size(); i++) {
- FeedItem item = items.get(i);
- if (item != null && item.getMedia() != null && item.getMedia().getDownloadUrl().equals(downloadUrl)) {
- return i;
- }
- }
- return -1;
- }
-
- public static long[] getIds(List<FeedItem> items) {
- if(items == null || items.size() == 0) {
- return new long[0];
- }
- long[] result = new long[items.size()];
- for(int i=0; i < items.size(); i++) {
- result[i] = items.get(i).getId();
- }
- return result;
- }
-
- @NonNull
- public static List<Long> getIdList(List<? extends FeedItem> items) {
- List<Long> result = new ArrayList<>();
- for (FeedItem item : items) {
- result.add(item.getId());
- }
- return result;
- }
-
- /**
- * 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 (StringUtils.isNotBlank(item.getLink())) {
- return item.getLink();
- } else if (StringUtils.isNotBlank(item.getFeed().getLink())) {
- return item.getFeed().getLink();
- }
- return null;
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FeedUtil.java b/core/src/main/java/de/danoeh/antennapod/core/util/FeedUtil.java
deleted file mode 100644
index 201207816..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/FeedUtil.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import de.danoeh.antennapod.model.feed.Feed;
-import de.danoeh.antennapod.storage.preferences.UserPreferences;
-
-public abstract class FeedUtil {
- public static boolean shouldAutoDeleteItemsOnThatFeed(Feed feed) {
- if (!UserPreferences.isAutoDelete()) {
- return false;
- }
- return !feed.isLocalFeed() || UserPreferences.isAutoDeleteLocal();
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java
deleted file mode 100644
index 8b30b4eac..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/IntentUtils.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.net.Uri;
-import android.util.Log;
-import android.widget.Toast;
-import de.danoeh.antennapod.core.R;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.ArrayUtils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Locale;
-
-public class IntentUtils {
- private static final String TAG = "IntentUtils";
-
- private IntentUtils(){}
-
- /*
- * Checks if there is at least one exported activity that can be performed for the intent
- */
- public static boolean isCallable(final Context context, final Intent intent) {
- List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
- PackageManager.MATCH_DEFAULT_ONLY);
- for(ResolveInfo info : list) {
- if(info.activityInfo.exported) {
- return true;
- }
- }
- return false;
- }
-
- public static void sendLocalBroadcast(Context context, String action) {
- context.sendBroadcast(new Intent(action).setPackage(context.getPackageName()));
- }
-
- public static void openInBrowser(Context context, String url) {
- try {
- Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
- myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(myIntent);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(context, R.string.pref_no_browser_found, Toast.LENGTH_LONG).show();
- Log.e(TAG, Log.getStackTraceString(e));
- }
- }
-
-
- public static String getLocalizedWebsiteLink(Context context) {
- try (InputStream is = context.getAssets().open("website-languages.txt")) {
- String[] languages = IOUtils.toString(is, StandardCharsets.UTF_8.name()).split("\n");
- String deviceLanguage = Locale.getDefault().getLanguage();
- if (ArrayUtils.contains(languages, deviceLanguage) && !"en".equals(deviceLanguage)) {
- return "https://antennapod.org/" + deviceLanguage;
- } else {
- return "https://antennapod.org";
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/ReleaseScheduleGuesser.java b/core/src/main/java/de/danoeh/antennapod/core/util/ReleaseScheduleGuesser.java
deleted file mode 100644
index 580cf4164..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/ReleaseScheduleGuesser.java
+++ /dev/null
@@ -1,219 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.List;
-
-/**
- * Can be used to guess the release schedule of podcasts based on a sorted list of past release dates
- */
-public class ReleaseScheduleGuesser {
- static final long ONE_MINUTE = 60 * 1000;
- static final long ONE_HOUR = ONE_MINUTE * 60;
- static final long ONE_DAY = ONE_HOUR * 24;
- static final long ONE_WEEK = ONE_DAY * 7;
- static final long ONE_MONTH = ONE_DAY * 30;
- private static final int MAX_DATA_POINTS = 20;
-
- public enum Schedule {
- DAILY, WEEKDAYS, SPECIFIC_DAYS,
- WEEKLY, BIWEEKLY, FOURWEEKLY,
- MONTHLY, UNKNOWN
- }
-
- public static class Guess {
- public final Schedule schedule;
- public final List<Integer> days;
- public final Date nextExpectedDate;
-
- public Guess(Schedule schedule, List<Integer> days, Date nextExpectedDate) {
- this.schedule = schedule;
- this.days = days;
- this.nextExpectedDate = nextExpectedDate;
- }
- }
-
- private static class Stats {
- final float medianHour;
- final float medianDistance;
- final float avgDeltaToMedianDistance;
- final int[] daysOfWeek;
- final int[] daysOfMonth;
- final int mostOftenDayOfWeek;
- final int mostOftenDayOfMonth;
-
- public Stats(float medianHour, float medianDistance, float avgDeltaToMedianDistance,
- int[] daysOfWeek, int[] daysOfMonth, int mostOftenDayOfWeek, int mostOftenDayOfMonth) {
- this.medianHour = medianHour;
- this.medianDistance = medianDistance;
- this.avgDeltaToMedianDistance = avgDeltaToMedianDistance;
- this.daysOfWeek = daysOfWeek;
- this.daysOfMonth = daysOfMonth;
- this.mostOftenDayOfWeek = mostOftenDayOfWeek;
- this.mostOftenDayOfMonth = mostOftenDayOfMonth;
- }
- }
-
- private static void addTime(GregorianCalendar date, long time) {
- date.setTime(new Date(date.getTime().getTime() + time));
- }
-
- private static void addUntil(GregorianCalendar date, List<Integer> days) {
- do {
- addTime(date, ONE_DAY);
- } while (!days.contains(date.get(Calendar.DAY_OF_WEEK)));
- }
-
- private static <T> T getMedian(List<T> list) {
- return list.get(list.size() / 2);
- }
-
- private static Stats getStats(List<Date> releaseDates) {
- ArrayList<Float> hours = new ArrayList<>();
- ArrayList<Long> distances = new ArrayList<>();
- int[] daysOfWeek = new int[8];
- int[] daysOfMonth = new int[32];
- for (int i = 0; i < releaseDates.size(); i++) {
- Date d = releaseDates.get(i);
- Calendar calendar = new GregorianCalendar();
- calendar.setTime(d);
- hours.add(calendar.get(Calendar.HOUR_OF_DAY) + calendar.get(Calendar.MINUTE) / 60f);
- if (i > 0) {
- distances.add(d.getTime() - releaseDates.get(i - 1).getTime());
- }
- daysOfWeek[calendar.get(Calendar.DAY_OF_WEEK)]++;
- daysOfMonth[calendar.get(Calendar.DAY_OF_MONTH)]++;
- }
-
- int mostOftenDayOfWeek = 1;
- int mostOftenDayOfWeekNum = 0;
- for (int i = Calendar.SUNDAY; i <= Calendar.SATURDAY; i++) {
- if (daysOfWeek[i] > mostOftenDayOfWeekNum) {
- mostOftenDayOfWeekNum = daysOfWeek[i];
- mostOftenDayOfWeek = i;
- }
- }
-
- int mostOftenDayOfMonth = 1;
- int mostOftenDayOfMonthNum = 0;
- for (int i = 1; i < 31; i++) {
- if (daysOfMonth[i] > mostOftenDayOfMonthNum) {
- mostOftenDayOfMonthNum = daysOfMonth[i];
- mostOftenDayOfMonth = i;
- }
- }
-
- Collections.sort(hours, Float::compareTo);
- final float medianHour = getMedian(hours);
- Collections.sort(distances, Long::compareTo);
- final float medianDistance = getMedian(distances);
-
- float avgDeltaToMedianDistance = 0;
- for (long distance : distances) {
- avgDeltaToMedianDistance += Math.abs(distance - medianDistance);
- }
- avgDeltaToMedianDistance /= distances.size();
-
- return new Stats(medianHour, medianDistance, avgDeltaToMedianDistance,
- daysOfWeek, daysOfMonth, mostOftenDayOfWeek, mostOftenDayOfMonth);
- }
-
- public static Guess performGuess(List<Date> releaseDates) {
- if (releaseDates.size() <= 1) {
- return new Guess(Schedule.UNKNOWN, null, null);
- } else if (releaseDates.size() > MAX_DATA_POINTS) {
- releaseDates = releaseDates.subList(releaseDates.size() - MAX_DATA_POINTS, releaseDates.size());
- }
- Stats stats = getStats(releaseDates);
- final int maxTotalWrongDays = Math.max(1, releaseDates.size() / 5);
- final int maxSingleDayOff = releaseDates.size() / 10;
-
- GregorianCalendar last = new GregorianCalendar();
- last.setTime(releaseDates.get(releaseDates.size() - 1));
- last.set(Calendar.HOUR_OF_DAY, (int) stats.medianHour);
- last.set(Calendar.MINUTE, (int) ((stats.medianHour - Math.floor(stats.medianHour)) * 60));
- last.set(Calendar.SECOND, 0);
- last.set(Calendar.MILLISECOND, 0);
-
- if (Math.abs(stats.medianDistance - ONE_DAY) < 2 * ONE_HOUR
- && stats.avgDeltaToMedianDistance < 2 * ONE_HOUR) {
- addTime(last, ONE_DAY);
- return new Guess(Schedule.DAILY, Arrays.asList(Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY,
- Calendar.THURSDAY, Calendar.FRIDAY, Calendar.SATURDAY, Calendar.SUNDAY), last.getTime());
- } else if (Math.abs(stats.medianDistance - ONE_WEEK) < ONE_DAY
- && stats.avgDeltaToMedianDistance < 2 * ONE_DAY) {
- // Just using last.set(Calendar.DAY_OF_WEEK) could skip a week
- // when the last release is delayed over week boundaries
- addTime(last, 3 * ONE_DAY);
- do {
- addTime(last, ONE_DAY);
- } while (last.get(Calendar.DAY_OF_WEEK) != stats.mostOftenDayOfWeek);
- return new Guess(Schedule.WEEKLY, List.of(stats.mostOftenDayOfWeek), last.getTime());
- } else if (Math.abs(stats.medianDistance - 2 * ONE_WEEK) < ONE_DAY
- && stats.avgDeltaToMedianDistance < 2 * ONE_DAY) {
- // Just using last.set(Calendar.DAY_OF_WEEK) could skip a week
- // when the last release is delayed over week boundaries
- addTime(last, 10 * ONE_DAY);
- do {
- addTime(last, ONE_DAY);
- } while (last.get(Calendar.DAY_OF_WEEK) != stats.mostOftenDayOfWeek);
- return new Guess(Schedule.BIWEEKLY, List.of(stats.mostOftenDayOfWeek), last.getTime());
- } else if (Math.abs(stats.medianDistance - ONE_MONTH) < 5 * ONE_DAY
- && stats.avgDeltaToMedianDistance < 5 * ONE_DAY) {
- if (stats.daysOfMonth[stats.mostOftenDayOfMonth] >= releaseDates.size() - maxTotalWrongDays) {
- // Just using last.set(Calendar.DAY_OF_MONTH) could skip a week
- // when the last release is delayed over week boundaries
- addTime(last, 2 * ONE_WEEK);
- do {
- addTime(last, ONE_DAY);
- } while (last.get(Calendar.DAY_OF_MONTH) != stats.mostOftenDayOfMonth);
- return new Guess(Schedule.MONTHLY, null, last.getTime());
- }
-
- addTime(last, 3 * ONE_WEEK + 3 * ONE_DAY);
- do {
- addTime(last, ONE_DAY);
- } while (last.get(Calendar.DAY_OF_WEEK) != stats.mostOftenDayOfWeek);
- return new Guess(Schedule.FOURWEEKLY, List.of(stats.mostOftenDayOfWeek), last.getTime());
- }
-
- // Find release days
- List<Integer> largeDays = new ArrayList<>();
- for (int i = Calendar.SUNDAY; i <= Calendar.SATURDAY; i++) {
- if (stats.daysOfWeek[i] > maxSingleDayOff) {
- largeDays.add(i);
- }
- }
- // Ensure that all release days are used similarly often
- int averageDays = releaseDates.size() / largeDays.size();
- boolean matchesAverageDays = true;
- for (int day : largeDays) {
- if (stats.daysOfWeek[day] < averageDays - maxSingleDayOff) {
- matchesAverageDays = false;
- break;
- }
- }
-
- if (matchesAverageDays && stats.medianDistance < ONE_WEEK) {
- // Fixed daily release schedule (eg Mo, Thu, Fri)
- addUntil(last, largeDays);
-
- if (largeDays.size() == 5 && largeDays.containsAll(Arrays.asList(
- Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY, Calendar.FRIDAY))) {
- return new Guess(Schedule.WEEKDAYS, largeDays, last.getTime());
- }
- return new Guess(Schedule.SPECIFIC_DAYS, largeDays, last.getTime());
- } else if (largeDays.size() == 1) {
- // Probably still weekly with more exceptions than others
- addUntil(last, largeDays);
- return new Guess(Schedule.WEEKLY, largeDays, last.getTime());
- }
-
- addTime(last, (long) (0.6f * stats.medianDistance));
- return new Guess(Schedule.UNKNOWN, null, last.getTime());
- }
-}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java
deleted file mode 100644
index eed9fcf37..000000000
--- a/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package de.danoeh.antennapod.core.util;
-
-import android.os.StatFs;
-import de.danoeh.antennapod.storage.preferences.UserPreferences;
-
-import java.io.File;
-
-/**
- * Utility functions for handling storage errors
- */
-public class StorageUtils {
- private StorageUtils(){}
-
- /**
- * Get the number of free bytes that are available on the external storage.
- */
- public static long getFreeSpaceAvailable() {
- File dataFolder = UserPreferences.getDataFolder(null);
- if (dataFolder != null) {
- return getFreeSpaceAvailable(dataFolder.getAbsolutePath());
- } else {
- return 0;
- }
- }
-
- /**
- * Get the number of free bytes that are available on the external storage.
- */
- public static long getFreeSpaceAvailable(String path) {
- StatFs stat = new StatFs(path);
- long availableBlocks = stat.getAvailableBlocksLong();
- long blockSize = stat.getBlockSizeLong();
- return availableBlocks * blockSize;
- }
-
- public static long getTotalSpaceAvailable(String path) {
- StatFs stat = new StatFs(path);
- long blockCount = stat.getBlockCountLong();
- long blockSize = stat.getBlockSizeLong();
- return blockCount * blockSize;
- }
-}
diff --git a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_feed.xml b/core/src/main/res/drawable-anydpi-v26/ic_shortcut_feed.xml
deleted file mode 100644
index ae080d335..000000000
--- a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_feed.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/grey100" />
- <foreground>
- <inset
- android:drawable="@drawable/ic_feed_black"
- android:inset="33.3%" />
- </foreground>
-</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_playlist.xml b/core/src/main/res/drawable-anydpi-v26/ic_shortcut_playlist.xml
deleted file mode 100644
index 5d3ce4954..000000000
--- a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_playlist.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/grey100" />
- <foreground>
- <inset
- android:drawable="@drawable/ic_playlist_play_black"
- android:inset="33.3%" />
- </foreground>
-</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_refresh.xml b/core/src/main/res/drawable-anydpi-v26/ic_shortcut_refresh.xml
deleted file mode 100644
index 1a7752443..000000000
--- a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_refresh.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/grey100" />
- <foreground>
- <inset
- android:drawable="@drawable/ic_refresh_black"
- android:inset="33.3%" />
- </foreground>
-</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_subscriptions.xml b/core/src/main/res/drawable-anydpi-v26/ic_shortcut_subscriptions.xml
deleted file mode 100644
index 10f437917..000000000
--- a/core/src/main/res/drawable-anydpi-v26/ic_shortcut_subscriptions.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
- <background android:drawable="@color/grey100" />
- <foreground>
- <inset
- android:drawable="@drawable/ic_subscriptions_black"
- android:inset="33.3%" />
- </foreground>
-</adaptive-icon> \ No newline at end of file
diff --git a/core/src/main/res/drawable/bg_blue_gradient.xml b/core/src/main/res/drawable/bg_blue_gradient.xml
deleted file mode 100644
index 8ae045b6d..000000000
--- a/core/src/main/res/drawable/bg_blue_gradient.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:angle="90"
- android:endColor="@color/gradient_025"
- android:startColor="@color/gradient_075"
- android:type="linear" />
- <corners
- android:radius="0dp"/>
-</shape>
diff --git a/core/src/main/res/drawable/bg_circle.xml b/core/src/main/res/drawable/bg_circle.xml
deleted file mode 100644
index 0957db5e4..000000000
--- a/core/src/main/res/drawable/bg_circle.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="?attr/colorPrimary" />
- <corners android:radius="30dp" />
- <size android:width="60dp" android:height="60dp"/>
-</shape>
diff --git a/core/src/main/res/drawable/bg_drawer_item.xml b/core/src/main/res/drawable/bg_drawer_item.xml
deleted file mode 100644
index 40727bf50..000000000
--- a/core/src/main/res/drawable/bg_drawer_item.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?attr/colorSurfaceVariant">
- <item android:id="@android:id/mask">
- <shape android:shape="rectangle">
- <solid android:color="@color/black"/>
- <corners android:radius="32dp"/>
- </shape>
- </item>
- <item>
- <selector>
- <item android:state_selected="true">
- <shape android:shape="rectangle">
- <solid android:color="?attr/colorSurfaceVariant"/>
- <corners android:radius="32dp"/>
- </shape>
- </item>
- <item android:drawable="@android:color/transparent" />
- </selector>
- </item>
-</ripple>
diff --git a/core/src/main/res/drawable/bg_gradient.xml b/core/src/main/res/drawable/bg_gradient.xml
deleted file mode 100644
index 5022240b3..000000000
--- a/core/src/main/res/drawable/bg_gradient.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:angle="90"
- android:endColor="#00ffffff"
- android:startColor="#ffffffff"
- android:type="linear" />
- <corners
- android:radius="0dp"/>
-</shape> \ No newline at end of file
diff --git a/core/src/main/res/drawable/bg_pill.xml b/core/src/main/res/drawable/bg_pill.xml
deleted file mode 100644
index f5865ccff..000000000
--- a/core/src/main/res/drawable/bg_pill.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <stroke
- android:width="1dp"
- android:color="?attr/colorPrimary" />
- <corners android:radius="20dp" />
-</shape> \ No newline at end of file
diff --git a/core/src/main/res/drawable/bg_rounded_corners.xml b/core/src/main/res/drawable/bg_rounded_corners.xml
deleted file mode 100644
index 11b7710c4..000000000
--- a/core/src/main/res/drawable/bg_rounded_corners.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<shape
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="8dp" />
-</shape>
diff --git a/core/src/main/res/drawable/ic_shortcut_feed.xml b/core/src/main/res/drawable/ic_shortcut_feed.xml
deleted file mode 100644
index fa5a0267c..000000000
--- a/core/src/main/res/drawable/ic_shortcut_feed.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_shortcut_background" />
- <item
- android:drawable="@drawable/ic_feed_black"
- android:gravity="center" />
-</layer-list> \ No newline at end of file
diff --git a/core/src/main/res/drawable/ic_shortcut_playlist.xml b/core/src/main/res/drawable/ic_shortcut_playlist.xml
deleted file mode 100644
index 8d01f24a3..000000000
--- a/core/src/main/res/drawable/ic_shortcut_playlist.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_shortcut_background" />
- <item
- android:drawable="@drawable/ic_playlist_play_black"
- android:gravity="center" />
-</layer-list>
diff --git a/core/src/main/res/drawable/ic_shortcut_refresh.xml b/core/src/main/res/drawable/ic_shortcut_refresh.xml
deleted file mode 100644
index 2f1b37337..000000000
--- a/core/src/main/res/drawable/ic_shortcut_refresh.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_shortcut_background" />
- <item
- android:drawable="@drawable/ic_refresh_black"
- android:gravity="center" />
-</layer-list> \ No newline at end of file
diff --git a/core/src/main/res/drawable/ic_shortcut_subscriptions.xml b/core/src/main/res/drawable/ic_shortcut_subscriptions.xml
deleted file mode 100644
index b932aebaf..000000000
--- a/core/src/main/res/drawable/ic_shortcut_subscriptions.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/ic_shortcut_background" />
- <item
- android:drawable="@drawable/ic_subscriptions_black"
- android:gravity="center" />
-</layer-list> \ No newline at end of file
diff --git a/core/src/main/res/layout/more_content_list_footer.xml b/core/src/main/res/layout/more_content_list_footer.xml
deleted file mode 100644
index a3fcd5489..000000000
--- a/core/src/main/res/layout/more_content_list_footer.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/more_content_list_footer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:foreground="?attr/selectableItemBackground"
- android:background="?android:attr/colorBackground"
- android:gravity="center"
- android:padding="8dp">
-
- <ImageView
- android:id="@+id/imgExpand"
- android:layout_width="16dp"
- android:layout_height="16dp"
- android:layout_gravity="center"
- android:contentDescription="@string/load_next_page_label"
- app:srcCompat="@drawable/ic_load_more" />
-
- <ProgressBar
- android:id="@+id/progBar"
- android:layout_width="16dp"
- android:layout_height="16dp"
- android:indeterminateOnly="true"
- android:visibility="gone" />
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/load_next_page_label"
- android:textColor="?android:attr/textColorPrimary"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp" />
-
-</LinearLayout>
diff --git a/core/src/main/res/layout/popup_bubble_view.xml b/core/src/main/res/layout/popup_bubble_view.xml
deleted file mode 100644
index 7dee08eb5..000000000
--- a/core/src/main/res/layout/popup_bubble_view.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="16dp">
-
- <TextView
- android:id="@+id/balloon_message"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="?attr/colorOnSecondary"
- android:lines="3" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:layout_marginTop="4dp"
- android:gravity="end">
-
- <Button
- android:id="@+id/balloon_button_negative"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="?attr/colorOnSecondary"
- android:text="@string/no"
- style="@style/Widget.MaterialComponents.Button.TextButton" />
-
- <Button
- android:id="@+id/balloon_button_positive"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="?attr/colorOnSecondary"
- android:text="@string/yes"
- style="@style/Widget.MaterialComponents.Button.TextButton" />
-
- </LinearLayout>
-
-</LinearLayout>
diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml
deleted file mode 100644
index a4f5d7f38..000000000
--- a/core/src/main/res/values/arrays.xml
+++ /dev/null
@@ -1,277 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
- <string-array name="spnAutoDeleteItems">
- <item>@string/global_default</item>
- <item>@string/feed_auto_download_always</item>
- <item>@string/feed_auto_download_never</item>
- </string-array>
-
- <string-array name="spnAutoDeleteValues">
- <item>global</item>
- <item>always</item>
- <item>never</item>
- </string-array>
-
- <string-array name="spnVolumeAdaptationItems">
- <item>@string/feed_volume_reduction_heavy</item>
- <item>@string/feed_volume_reduction_light</item>
- <item>@string/feed_volume_reduction_off</item>
- <item>@string/feed_volume_boost_light</item>
- <item>@string/feed_volume_boost_medium</item>
- <item>@string/feed_volume_boost_heavy</item>
- </string-array>
-
- <string-array name="spnVolumeAdaptationValues">
- <item>heavy</item>
- <item>light</item>
- <item>off</item>
- <item>light_boost</item>
- <item>medium_boost</item>
- <item>heavy_boost</item>
- </string-array>
-
- <string-array name="feed_refresh_interval_entries">
- <item>@string/feed_refresh_never</item>
- <item>@string/feed_every_hour</item>
- <item>@string/feed_every_2_hours</item>
- <item>@string/feed_every_4_hours</item>
- <item>@string/feed_every_8_hours</item>
- <item>@string/feed_every_12_hours</item>
- <item>@string/feed_every_24_hours</item>
- <item>@string/feed_every_72_hours</item>
- </string-array>
-
- <string-array name="feed_refresh_interval_values">
- <item>0</item>
- <item>1</item>
- <item>2</item>
- <item>4</item>
- <item>8</item>
- <item>12</item>
- <item>24</item>
- <item>72</item>
- </string-array>
-
- <string-array name="globalNewEpisodesActionItems">
- <item>@string/feed_new_episodes_action_add_to_inbox</item>
- <item>@string/feed_new_episodes_action_add_to_queue</item>
- <item>@string/feed_new_episodes_action_nothing</item>
- </string-array>
-
- <string-array name="globalNewEpisodesActionValues">
- <item>1</item>
- <item>3</item>
- <item>2</item>
- </string-array>
-
- <string-array name="feedNewEpisodesActionItems">
- <item>@string/global_default</item>
- <item>@string/feed_new_episodes_action_add_to_inbox</item>
- <item>@string/feed_new_episodes_action_add_to_queue</item>
- <item>@string/feed_new_episodes_action_nothing</item>
- </string-array>
-
- <string-array name="feedNewEpisodesActionValues">
- <item>0</item>
- <item>1</item>
- <item>3</item>
- <item>2</item>
- </string-array>
-
- <string-array name="smart_mark_as_played_values">
- <item>0</item>
- <item>15</item>
- <item>30</item>
- <item>60</item>
- <item>120</item>
- <item>300</item>
- </string-array>
-
-
- <integer-array name="seek_delta_values">
- <item>5</item>
- <item>10</item>
- <item>15</item>
- <item>20</item>
- <item>30</item>
- <item>45</item>
- <item>60</item>
- </integer-array>
-
- <string-array name="episode_cache_size_entries">
- <item>5</item>
- <item>10</item>
- <item>25</item>
- <item>50</item>
- <item>100</item>
- <item>500</item>
- <item>@string/pref_episode_cache_unlimited</item>
- </string-array>
-
- <string-array name="episode_cache_size_values">
- <item>5</item>
- <item>10</item>
- <item>25</item>
- <item>50</item>
- <item>100</item>
- <item>500</item>
- <item>-1</item>
- </string-array>
-
- <string-array name="mobile_update_entries">
- <item>@string/pref_mobileUpdate_refresh</item>
- <item>@string/pref_mobileUpdate_episode_download</item>
- <item>@string/pref_mobileUpdate_auto_download</item>
- <item>@string/pref_mobileUpdate_streaming</item>
- <item>@string/pref_mobileUpdate_images</item>
- <item>@string/synchronization_pref</item>
- </string-array>
-
- <string-array name="mobile_update_values">
- <item>feed_refresh</item>
- <item>episode_download</item>
- <item>auto_download</item>
- <item>streaming</item>
- <item>images</item>
- <item>sync</item>
- </string-array>
-
- <string-array name="mobile_update_default_value">
- <item>images</item>
- <item>sync</item>
- </string-array>
-
- <string-array name="episode_cleanup_entries">
- <item>@string/episode_cleanup_except_favorite_removal</item>
- <item>@string/episode_cleanup_queue_removal</item>
- <item>0</item>
- <item>1</item>
- <item>3</item>
- <item>5</item>
- <item>7</item>
- <item>@string/episode_cleanup_never</item>
- </string-array>
-
- <string-array name="button_action_options">
- <item>@string/button_action_fast_forward</item>
- <item>@string/button_action_rewind</item>
- <item>@string/button_action_skip_episode</item>
- <item>@string/button_action_restart_episode</item>
- </string-array>
-
- <string-array name="button_action_values">
- <item>@string/keycode_media_fast_forward</item>
- <item>@string/keycode_media_rewind</item>
- <item>@string/keycode_media_next</item>
- <item>@string/keycode_media_previous</item>
- </string-array>
-
- <string-array name="enqueue_location_options">
- <item>@string/enqueue_location_back</item>
- <item>@string/enqueue_location_front</item>
- <item>@string/enqueue_location_after_current</item>
- <item>@string/enqueue_location_random</item>
- </string-array>
-
- <string-array name="enqueue_location_values">
- <!-- MUST be the same as UserPreferences.EnqueueLocation enum -->
- <item>BACK</item>
- <item>FRONT</item>
- <item>AFTER_CURRENTLY_PLAYING</item>
- <item>RANDOM</item>
- </string-array>
-
- <string-array name="episode_cleanup_values">
- <item>-3</item>
- <item>-1</item>
- <item>0</item>
- <item>12</item>
- <item>24</item>
- <item>72</item>
- <item>120</item>
- <item>168</item>
- <item>-2</item>
- </string-array>
-
- <string-array name="nav_drawer_titles">
- <item>@string/home_label</item>
- <item>@string/queue_label</item>
- <item>@string/inbox_label</item>
- <item>@string/episodes_label</item>
- <item>@string/subscriptions_label</item>
- <item>@string/downloads_label</item>
- <item>@string/playback_history_label</item>
- <item>@string/add_feed_label</item>
- <item>@string/subscriptions_list_label</item>
- </string-array>
-
- <string-array name="nav_drawer_feed_order_options">
- <item>@string/drawer_feed_order_unplayed_episodes</item>
- <item>@string/drawer_feed_order_alphabetical</item>
- <item>@string/drawer_feed_order_last_update</item>
- <item>@string/drawer_feed_order_most_played</item>
- </string-array>
- <string-array name="nav_drawer_feed_order_values">
- <item>0</item>
- <item>1</item>
- <item>2</item>
- <item>3</item>
- </string-array>
-
- <string-array name="nav_drawer_feed_counter_options">
- <item>@string/drawer_feed_counter_inbox</item>
- <item>@string/drawer_feed_counter_unplayed</item>
- <item>@string/drawer_feed_counter_downloaded</item>
- <item>@string/drawer_feed_counter_downloaded_unplayed</item>
- <item>@string/drawer_feed_counter_none</item>
- </string-array>
- <string-array name="nav_drawer_feed_counter_values">
- <item>1</item>
- <item>2</item>
- <item>4</item>
- <item>5</item>
- <item>3</item>
- </string-array>
-
- <string-array name="home_section_titles">
- <item>@string/home_continue_title</item>
- <item>@string/home_new_title</item>
- <item>@string/home_surprise_title</item>
- <item>@string/home_classics_title</item>
- <item>@string/home_downloads_title</item>
- </string-array>
-
- <string-array name="home_section_tags">
- <item>QueueSection</item>
- <item>InboxSection</item>
- <item>EpisodesSurpriseSection</item>
- <item>SubscriptionsSection</item>
- <item>DownloadsSection</item>
- </string-array>
-
- <string-array name="full_notification_buttons_options">
- <item>@string/skip_episode_label</item>
- <item>@string/next_chapter</item>
- <item>@string/playback_speed</item>
- <item>@string/sleep_timer_label</item>
- </string-array>
-
- <string-array name="default_page_values">
- <item>HomeFragment</item>
- <item>QueueFragment</item>
- <item>NewEpisodesFragment</item>
- <item>EpisodesFragment</item>
- <item>SubscriptionFragment</item>
- <item>remember</item>
- </string-array>
-
- <string-array name="default_page_titles">
- <item>@string/home_label</item>
- <item>@string/queue_label</item>
- <item>@string/inbox_label</item>
- <item>@string/episodes_label</item>
- <item>@string/subscriptions_label</item>
- <item>@string/remember_last_page</item>
- </string-array>
-</resources>
diff --git a/core/src/main/res/values/ids.xml b/core/src/main/res/values/ids.xml
deleted file mode 100644
index 8c4091390..000000000
--- a/core/src/main/res/values/ids.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<resources>
- <!-- Menu items -->
- <item name="select_all_item" type="id"/>
- <item name="deselect_all_item" type="id"/>
- <item name="clear_history_item" type="id"/>
- <item name="open_in_browser_item" type="id"/>
- <item name="copy_url_item" type="id"/>
- <item name="share_url_item" type="id"/>
- <item name="go_to_position_item" type="id"/>
- <item name="drag_handle" type="id"/>
- <item name="skip_episode_item" type="id"/>
- <item name="move_to_top_item" type="id"/>
- <item name="move_to_bottom_item" type="id"/>
-
- <!-- View types -->
- <item name="view_type_episode_item" type="id"/>
-</resources>
diff --git a/core/src/main/res/values/keycodes.xml b/core/src/main/res/values/keycodes.xml
deleted file mode 100644
index e0d44ce04..000000000
--- a/core/src/main/res/values/keycodes.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<resources
- xmlns:tools="http://schemas.android.com/tools"
- tools:ignore="MissingTranslation">
-
- <string name="keycode_media_next">87</string>
- <string name="keycode_media_previous">88</string>
- <string name="keycode_media_rewind">89</string>
- <string name="keycode_media_fast_forward">90</string>
-</resources>