diff options
author | ByteHamster <ByteHamster@users.noreply.github.com> | 2024-04-05 19:20:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-05 19:20:27 +0200 |
commit | 92ab575b150ab49ca85e0ac994558142e49c9e68 (patch) | |
tree | 422dcd76895a4ba06ed02723ff61351435c0fe49 /core/src/main | |
parent | 2143ab135182434911d4554a8ef08115eaa0d2d0 (diff) | |
download | AntennaPod-92ab575b150ab49ca85e0ac994558142e49c9e68.zip |
Delete core module (#7060)
Diffstat (limited to 'core/src/main')
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> |