diff options
Diffstat (limited to 'core/src')
51 files changed, 358 insertions, 238 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/DownloadEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/DownloadEvent.java index 24a71ec96..efd53ab9d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/event/DownloadEvent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/event/DownloadEvent.java @@ -1,5 +1,7 @@ package de.danoeh.antennapod.core.event; +import androidx.annotation.NonNull; + import java.util.ArrayList; import java.util.List; @@ -19,6 +21,7 @@ public class DownloadEvent { return new DownloadEvent(update); } + @NonNull @Override public String toString() { return "DownloadEvent{" + diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/DownloadLogEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/DownloadLogEvent.java index 7428c5b00..5ab5decf9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/event/DownloadLogEvent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/event/DownloadLogEvent.java @@ -1,5 +1,7 @@ package de.danoeh.antennapod.core.event; +import androidx.annotation.NonNull; + public class DownloadLogEvent { private DownloadLogEvent() { @@ -9,6 +11,7 @@ public class DownloadLogEvent { return new DownloadLogEvent(); } + @NonNull @Override public String toString() { return "DownloadLogEvent"; diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/DownloaderUpdate.java b/core/src/main/java/de/danoeh/antennapod/core/event/DownloaderUpdate.java index f549940b7..10992408d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/event/DownloaderUpdate.java +++ b/core/src/main/java/de/danoeh/antennapod/core/event/DownloaderUpdate.java @@ -46,6 +46,7 @@ public class DownloaderUpdate { this.mediaIds = mediaIds1.toArray(); } + @NonNull @Override public String toString() { return "DownloaderUpdate{" + diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java index 578007561..d3be8fac0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java @@ -1,5 +1,7 @@ package de.danoeh.antennapod.core.event; +import androidx.annotation.NonNull; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -27,6 +29,7 @@ public class FavoritesEvent { return new FavoritesEvent(Action.REMOVED, item); } + @NonNull @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/FeedItemEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/FeedItemEvent.java index 4b14a72d2..02559b2f5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/event/FeedItemEvent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/event/FeedItemEvent.java @@ -21,7 +21,7 @@ public class FeedItemEvent { private final Action action; @NonNull public final List<FeedItem> items; - private FeedItemEvent(Action action, List<FeedItem> items) { + private FeedItemEvent(@NonNull Action action, @NonNull List<FeedItem> items) { this.action = action; this.items = items; } @@ -42,6 +42,7 @@ public class FeedItemEvent { return updated(Arrays.asList(items)); } + @NonNull @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java index 2610d253f..3edecd35c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedComponent.java @@ -50,7 +50,7 @@ public abstract class FeedComponent { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || !(o instanceof FeedComponent)) return false; + if (!(o instanceof FeedComponent)) return false; FeedComponent that = (FeedComponent) o; diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedEvent.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedEvent.java index 15cdf92dc..044554451 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedEvent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedEvent.java @@ -1,5 +1,7 @@ package de.danoeh.antennapod.core.feed; +import androidx.annotation.NonNull; + import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -18,6 +20,7 @@ public class FeedEvent { this.feedId = feedId; } + @NonNull @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java index 20ed402fc..b681c21d1 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java @@ -1,12 +1,15 @@ package de.danoeh.antennapod.core.feed; import android.database.Cursor; + +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.text.TextUtils; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import java.io.Serializable; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -24,7 +27,7 @@ import de.danoeh.antennapod.core.util.ShownotesProvider; * * @author daniel */ -public class FeedItem extends FeedComponent implements ShownotesProvider, ImageResource { +public class FeedItem extends FeedComponent implements ShownotesProvider, ImageResource, Serializable { /** tag that indicates this item is in the queue */ public static final String TAG_QUEUE = "Queue"; @@ -481,6 +484,7 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, ImageR */ public void removeTag(String tag) { tags.remove(tag); } + @NonNull @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java index 719383d23..d34e23506 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java @@ -1,8 +1,10 @@ package de.danoeh.antennapod.core.feed; import android.text.TextUtils; +import android.util.Log; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import de.danoeh.antennapod.core.storage.DBReader; @@ -11,17 +13,21 @@ import de.danoeh.antennapod.core.util.LongList; import static de.danoeh.antennapod.core.feed.FeedItem.TAG_FAVORITE; public class FeedItemFilter { + private final String[] mProperties; private boolean showPlayed = false; private boolean showUnplayed = false; private boolean showPaused = false; + private boolean showNotPaused = false; private boolean showQueued = false; private boolean showNotQueued = false; private boolean showDownloaded = false; private boolean showNotDownloaded = false; private boolean showHasMedia = false; + private boolean showNoMedia = false; private boolean showIsFavorite = false; + private boolean showNotFavorite = false; public FeedItemFilter(String properties) { this(TextUtils.split(properties, ",")); @@ -29,15 +35,18 @@ public class FeedItemFilter { public FeedItemFilter(String[] properties) { this.mProperties = properties; - for(String property : properties) { + for (String property : properties) { // see R.arrays.feed_filter_values - switch(property) { + switch (property) { case "unplayed": showUnplayed = true; break; case "paused": showPaused = true; break; + case "not_paused": + showNotPaused = true; + break; case "played": showPlayed = true; break; @@ -56,9 +65,17 @@ public class FeedItemFilter { case "has_media": showHasMedia = true; break; + case "no_media": + showNoMedia = true; + break; case "is_favorite": showIsFavorite = true; break; + case "not_favorite": + showNotFavorite = true; + break; + default: + break; } } } @@ -77,12 +94,15 @@ public class FeedItemFilter { if (showQueued && showNotQueued) return result; if (showDownloaded && showNotDownloaded) return result; - final LongList queuedIds = DBReader.getQueueIDList(); - for(FeedItem item : items) { + final LongList queuedIds = DBReader.getQueueIDList(); + for (FeedItem item : items) { // If the item does not meet a requirement, skip it. + if (showPlayed && !item.isPlayed()) continue; if (showUnplayed && item.isPlayed()) continue; + if (showPaused && item.getState() != FeedItem.State.IN_PROGRESS) continue; + if (showNotPaused && item.getState() == FeedItem.State.IN_PROGRESS) continue; boolean queued = queuedIds.contains(item.getId()); if (showQueued && !queued) continue; @@ -93,8 +113,10 @@ public class FeedItemFilter { if (showNotDownloaded && downloaded) continue; if (showHasMedia && !item.hasMedia()) continue; + if (showNoMedia && item.hasMedia()) continue; if (showIsFavorite && !item.isTagged(TAG_FAVORITE)) continue; + if (showNotFavorite && item.isTagged(TAG_FAVORITE)) continue; // If the item reaches here, it meets all criteria result.add(item); diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilterGroup.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilterGroup.java new file mode 100644 index 000000000..fcbe2e4ab --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilterGroup.java @@ -0,0 +1,36 @@ +package de.danoeh.antennapod.core.feed; + +import de.danoeh.antennapod.core.R; + +public enum FeedItemFilterGroup { + PLAYED(new ItemProperties(R.string.hide_played_episodes_label, "played"), + new ItemProperties(R.string.not_played, "unplayed")), + PAUSED(new ItemProperties(R.string.hide_paused_episodes_label, "paused"), + new ItemProperties(R.string.not_paused, "not_paused")), + FAVORITE(new ItemProperties(R.string.hide_is_favorite_label, "is_favorite"), + new ItemProperties(R.string.not_favorite, "not_favorite")), + MEDIA(new ItemProperties(R.string.has_media, "has_media"), + new ItemProperties(R.string.no_media, "no_media")), + QUEUED(new ItemProperties(R.string.queued_label, "queued"), + new ItemProperties(R.string.not_queued_label, "not_queued")), + DOWNLOADED(new ItemProperties(R.string.hide_downloaded_episodes_label, "downloaded"), + new ItemProperties(R.string.hide_not_downloaded_episodes_label, "not_downloaded")); + + public final ItemProperties[] values; + + FeedItemFilterGroup(ItemProperties... values) { + this.values = values; + } + + public static class ItemProperties { + + public final int displayName; + public final String filterId; + + public ItemProperties(int displayName, String filterId) { + this.displayName = displayName; + this.filterId = filterId; + } + + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java index 7e1a5fd9b..d1c90cfa7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedMedia.java @@ -481,7 +481,7 @@ public class FeedMedia extends FeedFile implements Playable { @Override public void onPlaybackStart() { - startPosition = (position > 0) ? position : 0; + startPosition = Math.max(position, 0); playedDurationWhenStarted = played_duration; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ChapterImageModelLoader.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ChapterImageModelLoader.java index 36da11eca..35a9d987b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/glide/ChapterImageModelLoader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ChapterImageModelLoader.java @@ -28,8 +28,9 @@ import org.apache.commons.io.IOUtils; public final class ChapterImageModelLoader implements ModelLoader<EmbeddedChapterImage, ByteBuffer> { public static class Factory implements ModelLoaderFactory<EmbeddedChapterImage, ByteBuffer> { + @NonNull @Override - public ModelLoader<EmbeddedChapterImage, ByteBuffer> build(MultiModelLoaderFactory unused) { + public ModelLoader<EmbeddedChapterImage, ByteBuffer> build(@NonNull MultiModelLoaderFactory unused) { return new ChapterImageModelLoader(); } @@ -41,12 +42,15 @@ public final class ChapterImageModelLoader implements ModelLoader<EmbeddedChapte @Nullable @Override - public LoadData<ByteBuffer> buildLoadData(EmbeddedChapterImage model, int width, int height, Options options) { + public LoadData<ByteBuffer> buildLoadData(@NonNull EmbeddedChapterImage model, + int width, + int height, + @NonNull Options options) { return new LoadData<>(new ObjectKey(model), new EmbeddedImageFetcher(model)); } @Override - public boolean handles(EmbeddedChapterImage model) { + public boolean handles(@NonNull EmbeddedChapterImage model) { return true; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/FastBlurTransformation.java b/core/src/main/java/de/danoeh/antennapod/core/glide/FastBlurTransformation.java index d0301db2f..1f8ae5ad9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/glide/FastBlurTransformation.java +++ b/core/src/main/java/de/danoeh/antennapod/core/glide/FastBlurTransformation.java @@ -21,7 +21,10 @@ public class FastBlurTransformation extends BitmapTransformation { } @Override - protected Bitmap transform(BitmapPool pool, Bitmap source, int outWidth, int outHeight) { + protected Bitmap transform(@NonNull BitmapPool pool, + @NonNull Bitmap source, + int outWidth, + int outHeight) { int targetWidth = outWidth / 3; int targetHeight = (int) (1.0 * outHeight * targetWidth / outWidth); Bitmap resized = ThumbnailUtils.extractThumbnail(source, targetWidth, targetHeight); diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index 876251563..3488d125e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -19,10 +19,14 @@ import org.json.JSONException; import java.io.File; import java.io.IOException; import java.net.Proxy; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -64,6 +68,7 @@ public class UserPreferences { private static final String PREF_SHOW_AUTO_DOWNLOAD_REPORT = "prefShowAutoDownloadReport"; public static final String PREF_BACK_BUTTON_BEHAVIOR = "prefBackButtonBehavior"; private static final String PREF_BACK_BUTTON_GO_TO_PAGE = "prefBackButtonGoToPage"; + public static final String PREF_FILTER_FEED = "prefFeedFilter"; public static final String PREF_QUEUE_KEEP_SORTED = "prefQueueKeepSorted"; public static final String PREF_QUEUE_KEEP_SORTED_ORDER = "prefQueueKeepSortedOrder"; @@ -146,6 +151,8 @@ public class UserPreferences { public static final int FEED_COUNTER_SHOW_UNPLAYED = 2; public static final int FEED_COUNTER_SHOW_NONE = 3; public static final int FEED_COUNTER_SHOW_DOWNLOADED = 4; + public static final int FEED_FILTER_NONE = 0; + public static final int FEED_FILTER_COUNTER_ZERO = 1; private static Context context; private static SharedPreferences prefs; @@ -414,7 +421,7 @@ public class UserPreferences { return prefs.getBoolean(PREF_PLAYBACK_SKIP_SILENCE, false); } - public static float[] getPlaybackSpeedArray() { + public static List<Float> getPlaybackSpeedArray() { return readPlaybackSpeedArray(prefs.getString(PREF_PLAYBACK_SPEED_ARRAY, null)); } @@ -628,8 +635,7 @@ public class UserPreferences { } public static boolean isQueueLocked() { - return prefs.getBoolean(PREF_QUEUE_LOCKED, false) - || isQueueKeepSorted(); + return prefs.getBoolean(PREF_QUEUE_LOCKED, false); } public static void setFastForwardSecs(int secs) { @@ -662,10 +668,13 @@ public class UserPreferences { .apply(); } - public static void setPlaybackSpeedArray(String[] speeds) { + public static void setPlaybackSpeedArray(List<Float> speeds) { + DecimalFormatSymbols format = new DecimalFormatSymbols(Locale.US); + format.setDecimalSeparator('.'); + DecimalFormat speedFormat = new DecimalFormat("0.00", format); JSONArray jsonArray = new JSONArray(); - for (String speed : speeds) { - jsonArray.put(speed); + for (float speed : speeds) { + jsonArray.put(speedFormat.format(speed)); } prefs.edit() .putString(PREF_PLAYBACK_SPEED_ARRAY, jsonArray.toString()) @@ -775,13 +784,13 @@ public class UserPreferences { } } - private static float[] readPlaybackSpeedArray(String valueFromPrefs) { + private static List<Float> readPlaybackSpeedArray(String valueFromPrefs) { if (valueFromPrefs != null) { try { JSONArray jsonArray = new JSONArray(valueFromPrefs); - float[] selectedSpeeds = new float[jsonArray.length()]; + List<Float> selectedSpeeds = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { - selectedSpeeds[i] = (float) jsonArray.getDouble(i); + selectedSpeeds.add((float) jsonArray.getDouble(i)); } return selectedSpeeds; } catch (JSONException e) { @@ -790,7 +799,7 @@ public class UserPreferences { } } // If this preference hasn't been set yet, return the default options - return new float[] { 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f }; + return Arrays.asList(0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f); } public static String getMediaPlayer() { @@ -826,8 +835,8 @@ public class UserPreferences { public static VideoBackgroundBehavior getVideoBackgroundBehavior() { switch (prefs.getString(PREF_VIDEO_BEHAVIOR, "pip")) { case "stop": return VideoBackgroundBehavior.STOP; - case "pip": return VideoBackgroundBehavior.PICTURE_IN_PICTURE; case "continue": return VideoBackgroundBehavior.CONTINUE_PLAYING; + case "pip": //Deliberate fall-through default: return VideoBackgroundBehavior.PICTURE_IN_PICTURE; } } @@ -977,11 +986,11 @@ public class UserPreferences { public static BackButtonBehavior getBackButtonBehavior() { switch (prefs.getString(PREF_BACK_BUTTON_BEHAVIOR, "default")) { - case "default": return BackButtonBehavior.DEFAULT; case "drawer": return BackButtonBehavior.OPEN_DRAWER; case "doubletap": return BackButtonBehavior.DOUBLE_TAP; case "prompt": return BackButtonBehavior.SHOW_PROMPT; case "page": return BackButtonBehavior.GO_TO_PAGE; + case "default": // Deliberate fall-through default: return BackButtonBehavior.DEFAULT; } } @@ -1052,4 +1061,16 @@ public class UserPreferences { .putString(PREF_QUEUE_KEEP_SORTED_ORDER, sortOrder.name()) .apply(); } + + public static int getFeedFilter() { + String value = prefs.getString(PREF_FILTER_FEED, "" + FEED_FILTER_NONE); + return Integer.parseInt(value); + } + + public static void setFeedFilter(String value) { + prefs.edit() + .putString(PREF_FILTER_FEED, value) + .commit(); + } + } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java b/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java index f39ac0df8..7585e9d33 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/PlayerWidgetJobService.java @@ -121,7 +121,7 @@ public class PlayerWidgetJobService extends SafeJobIntentService { views.setOnClickPendingIntent(R.id.layout_left, startMediaPlayer); try { - Bitmap icon = null; + Bitmap icon; int iconSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size); icon = Glide.with(PlayerWidgetJobService.this) .asBitmap() diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java index d0484f2a2..9d0b3c5ad 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java @@ -156,8 +156,8 @@ public class AntennapodHttpClient { // workaround for Android 4.x for certain web sites. // see: https://github.com/square/okhttp/issues/4053#issuecomment-402579554 - List<CipherSuite> cipherSuites = new ArrayList<>(); - cipherSuites.addAll(ConnectionSpec.MODERN_TLS.cipherSuites()); + List<CipherSuite> cipherSuites = new ArrayList<>( + ConnectionSpec.MODERN_TLS.cipherSuites()); cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA); cipherSuites.add(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java index 78c4d3f48..3f503c6b4 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadRequest.java @@ -115,7 +115,7 @@ public class DownloadRequest implements Parcelable { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || !(o instanceof DownloadRequest)) return false; + if (!(o instanceof DownloadRequest)) return false; DownloadRequest that = (DownloadRequest) o; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java index e65e6fe26..61608992b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java @@ -190,7 +190,7 @@ public class HttpDownloader extends Downloader { } byte[] buffer = new byte[BUFFER_SIZE]; - int count = 0; + int count; request.setStatusMsg(R.string.download_running); Log.d(TAG, "Getting size of download"); request.setSize(responseBody.contentLength() + request.getSoFar()); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 585510ef8..111e2d37c 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -419,7 +419,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { e.printStackTrace(); } } else if (parentId.startsWith("FeedId:")) { - Long feedId = Long.parseLong(parentId.split(":")[1]); + long feedId = Long.parseLong(parentId.split(":")[1]); List<FeedItem> feedItems = DBReader.getFeedItemList(DBReader.getFeed(feedId)); for (FeedItem feedItem : feedItems) { if (feedItem.getMedia() != null && feedItem.getMedia().getMediaItem() != null) { @@ -711,9 +711,12 @@ public class PlaybackService extends MediaBrowserServiceCompat { } @Override - public void onSleepTimerAlmostExpired() { - float leftVolume = 0.1f * UserPreferences.getLeftVolume(); - float rightVolume = 0.1f * UserPreferences.getRightVolume(); + public void onSleepTimerAlmostExpired(long timeLeft) { + final float[] multiplicators = {0.1f, 0.2f, 0.3f, 0.3f, 0.3f, 0.4f, 0.4f, 0.4f, 0.6f, 0.8f}; + float multiplicator = multiplicators[Math.max(0, (int) timeLeft / 1000)]; + Log.d(TAG, "onSleepTimerAlmostExpired: " + multiplicator); + float leftVolume = multiplicator * UserPreferences.getLeftVolume(); + float rightVolume = multiplicator * UserPreferences.getRightVolume(); mediaPlayer.setVolume(leftVolume, rightVolume); } @@ -1140,13 +1143,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { case INITIALIZING: state = PlaybackStateCompat.STATE_CONNECTING; break; - case INITIALIZED: - case INDETERMINATE: - state = PlaybackStateCompat.STATE_NONE; - break; case ERROR: state = PlaybackStateCompat.STATE_ERROR; break; + case INITIALIZED: // Deliberate fall-through + case INDETERMINATE: default: state = PlaybackStateCompat.STATE_NONE; break; @@ -1158,7 +1159,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { long capabilities = PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_REWIND | PlaybackStateCompat.ACTION_FAST_FORWARD - | PlaybackStateCompat.ACTION_SKIP_TO_NEXT; + | PlaybackStateCompat.ACTION_SKIP_TO_NEXT + | PlaybackStateCompat.ACTION_SEEK_TO; if (useSkipToPreviousForRewindInLockscreen()) { // Workaround to fool Android so that Lockscreen will expose a skip-to-previous button, diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java index 4bb88200a..3239f3378 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java @@ -183,15 +183,14 @@ public class PlaybackServiceNotificationBuilder { notification.addAction(R.drawable.ic_notification_pause, //pause action context.getString(R.string.pause_label), pauseButtonPendingIntent); - compactActionList.add(numActions++); } else { PendingIntent playButtonPendingIntent = getPendingIntentForMediaAction( KeyEvent.KEYCODE_MEDIA_PLAY, numActions); notification.addAction(R.drawable.ic_notification_play, //play action context.getString(R.string.play_label), playButtonPendingIntent); - compactActionList.add(numActions++); } + compactActionList.add(numActions++); // ff follows play, then we have skip (if it's present) PendingIntent ffButtonPendingIntent = getPendingIntentForMediaAction( diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java index afa7fcebf..883ba6023 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java @@ -360,7 +360,8 @@ public class PlaybackServiceTaskManager { class SleepTimer implements Runnable { private static final String TAG = "SleepTimer"; private static final long UPDATE_INTERVAL = 1000L; - private static final long NOTIFICATION_THRESHOLD = 10000; + public static final long NOTIFICATION_THRESHOLD = 10000; + private boolean hasVibrated = false; private final long waitingTime; private long timeLeft; private ShakeListener shakeListener; @@ -390,7 +391,6 @@ public class PlaybackServiceTaskManager { @Override public void run() { Log.d(TAG, "Starting"); - boolean notifiedAlmostExpired = false; long lastTick = System.currentTimeMillis(); while (timeLeft > 0) { try { @@ -405,19 +405,19 @@ public class PlaybackServiceTaskManager { timeLeft -= now - lastTick; lastTick = now; - if (timeLeft < NOTIFICATION_THRESHOLD && !notifiedAlmostExpired) { + if (timeLeft < NOTIFICATION_THRESHOLD) { Log.d(TAG, "Sleep timer is about to expire"); - if (SleepTimerPreferences.vibrate()) { + if (SleepTimerPreferences.vibrate() && !hasVibrated) { Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); if (v != null) { v.vibrate(500); + hasVibrated = true; } } if (shakeListener == null && SleepTimerPreferences.shakeToReset()) { shakeListener = new ShakeListener(context, this); } - postCallback(callback::onSleepTimerAlmostExpired); - notifiedAlmostExpired = true; + postCallback(() -> callback.onSleepTimerAlmostExpired(timeLeft)); } if (timeLeft <= 0) { Log.d(TAG, "Sleep timer expired"); @@ -425,6 +425,7 @@ public class PlaybackServiceTaskManager { shakeListener.pause(); shakeListener = null; } + hasVibrated = false; if (!Thread.currentThread().isInterrupted()) { postCallback(callback::onSleepTimerExpired); } else { @@ -461,7 +462,7 @@ public class PlaybackServiceTaskManager { public interface PSTMCallback { void positionSaverTick(); - void onSleepTimerAlmostExpired(); + void onSleepTimerAlmostExpired(long timeLeft); void onSleepTimerExpired(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java index b0b6e164d..b967577af 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ShakeListener.java @@ -58,7 +58,6 @@ class ShakeListener implements SensorEventListener @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { - return; } }
\ No newline at end of file diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index c30f46315..0de67b306 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -72,19 +72,13 @@ public final class DBReader { @NonNull private static List<Feed> getFeedList(PodDBAdapter adapter) { - Cursor cursor = null; - try { - cursor = adapter.getAllFeedsCursor(); + try (Cursor cursor = adapter.getAllFeedsCursor()) { List<Feed> feeds = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { Feed feed = extractFeedFromCursorRow(cursor); feeds.add(feed); } return feeds; - } finally { - if (cursor != null) { - cursor.close(); - } } } @@ -96,18 +90,13 @@ public final class DBReader { public static List<String> getFeedListDownloadUrls() { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getFeedCursorDownloadUrls(); + try (Cursor cursor = adapter.getFeedCursorDownloadUrls()) { List<String> result = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { result.add(cursor.getString(1)); } return result; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -172,9 +161,7 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getAllItemsOfFeedCursor(feed); + try (Cursor cursor = adapter.getAllItemsOfFeedCursor(feed)) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); Collections.sort(items, new FeedItemPubdateComparator()); for (FeedItem item : items) { @@ -182,9 +169,6 @@ public final class DBReader { } return items; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -226,16 +210,10 @@ public final class DBReader { @NonNull static List<FeedItem> getQueue(PodDBAdapter adapter) { Log.d(TAG, "getQueue()"); - Cursor cursor = null; - try { - cursor = adapter.getQueueCursor(); + try (Cursor cursor = adapter.getQueueCursor()) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); loadAdditionalFeedItemListData(items); return items; - } finally { - if (cursor != null) { - cursor.close(); - } } } @@ -257,18 +235,12 @@ public final class DBReader { } private static LongList getQueueIDList(PodDBAdapter adapter) { - Cursor cursor = null; - try { - cursor = adapter.getQueueIDCursor(); + try (Cursor cursor = adapter.getQueueIDCursor()) { LongList queueIds = new LongList(cursor.getCount()); while (cursor.moveToNext()) { queueIds.add(cursor.getLong(0)); } return queueIds; - } finally { - if (cursor != null) { - cursor.close(); - } } } @@ -302,17 +274,12 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getDownloadedItemsCursor(); + try (Cursor cursor = adapter.getDownloadedItemsCursor()) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); loadAdditionalFeedItemListData(items); Collections.sort(items, new FeedItemPubdateComparator()); return items; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -328,16 +295,11 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getPlayedItemsCursor(); + try (Cursor cursor = adapter.getPlayedItemsCursor()) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); loadAdditionalFeedItemListData(items); return items; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -355,16 +317,11 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getNewItemsCursor(offset, limit); + try (Cursor cursor = adapter.getNewItemsCursor(offset, limit)) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); loadAdditionalFeedItemListData(items); return items; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -381,16 +338,11 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getFavoritesCursor(offset, limit); + try (Cursor cursor = adapter.getFavoritesCursor(offset, limit)) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); loadAdditionalFeedItemListData(items); return items; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -400,18 +352,13 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getFavoritesCursor(0, Integer.MAX_VALUE); + try (Cursor cursor = adapter.getFavoritesCursor(0, Integer.MAX_VALUE)) { LongList favoriteIDs = new LongList(cursor.getCount()); while (cursor.moveToNext()) { favoriteIDs.add(cursor.getLong(0)); } return favoriteIDs; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -428,16 +375,11 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getRecentlyPublishedItemsCursor(offset, limit); + try (Cursor cursor = adapter.getRecentlyPublishedItemsCursor(offset, limit)) { List<FeedItem> items = extractItemlistFromCursor(adapter, cursor); loadAdditionalFeedItemListData(items); return items; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -492,9 +434,7 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getDownloadLogCursor(DOWNLOAD_LOG_SIZE); + try (Cursor cursor = adapter.getDownloadLogCursor(DOWNLOAD_LOG_SIZE)) { List<DownloadStatus> downloadLog = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { downloadLog.add(DownloadStatus.fromCursor(cursor)); @@ -502,9 +442,6 @@ public final class DBReader { Collections.sort(downloadLog, new DownloadStatusComparator()); return downloadLog; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -521,9 +458,7 @@ public final class DBReader { PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feedId); + try (Cursor cursor = adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feedId)) { List<DownloadStatus> downloadLog = new ArrayList<>(cursor.getCount()); while (cursor.moveToNext()) { downloadLog.add(DownloadStatus.fromCursor(cursor)); @@ -531,9 +466,6 @@ public final class DBReader { Collections.sort(downloadLog, new DownloadStatusComparator()); return downloadLog; } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -560,9 +492,7 @@ public final class DBReader { @Nullable static Feed getFeed(final long feedId, PodDBAdapter adapter) { Feed feed = null; - Cursor cursor = null; - try { - cursor = adapter.getFeedCursor(feedId); + try (Cursor cursor = adapter.getFeedCursor(feedId)) { if (cursor.moveToNext()) { feed = extractFeedFromCursorRow(cursor); feed.setItems(getFeedItemList(feed)); @@ -570,10 +500,6 @@ public final class DBReader { Log.e(TAG, "getFeed could not find feed with id " + feedId); } return feed; - } finally { - if (cursor != null) { - cursor.close(); - } } } @@ -582,9 +508,7 @@ public final class DBReader { Log.d(TAG, "Loading feeditem with id " + itemId); FeedItem item = null; - Cursor cursor = null; - try { - cursor = adapter.getFeedItemCursor(Long.toString(itemId)); + try (Cursor cursor = adapter.getFeedItemCursor(Long.toString(itemId))) { if (cursor.moveToNext()) { List<FeedItem> list = extractItemlistFromCursor(adapter, cursor); if (!list.isEmpty()) { @@ -593,10 +517,6 @@ public final class DBReader { } } return item; - } finally { - if (cursor != null) { - cursor.close(); - } } } @@ -631,9 +551,7 @@ public final class DBReader { @Nullable private static FeedItem getFeedItemByUrl(final String podcastUrl, final String episodeUrl, PodDBAdapter adapter) { Log.d(TAG, "Loading feeditem with podcast url " + podcastUrl + " and episode url " + episodeUrl); - Cursor cursor = null; - try { - cursor = adapter.getFeedItemCursor(podcastUrl, episodeUrl); + try (Cursor cursor = adapter.getFeedItemCursor(podcastUrl, episodeUrl)) { if (!cursor.moveToNext()) { return null; } @@ -642,10 +560,6 @@ public final class DBReader { return list.get(0); } return null; - } finally { - if (cursor != null) { - cursor.close(); - } } } @@ -668,10 +582,8 @@ public final class DBReader { } private static String getImageAuthentication(final String imageUrl, PodDBAdapter adapter) { - String credentials = null; - Cursor cursor = null; - try { - cursor = adapter.getImageAuthenticationCursor(imageUrl); + String credentials; + try (Cursor cursor = adapter.getImageAuthenticationCursor(imageUrl)) { if (cursor.moveToFirst()) { String username = cursor.getString(0); String password = cursor.getString(1); @@ -683,10 +595,6 @@ public final class DBReader { } else { credentials = ""; } - } finally { - if (cursor != null) { - cursor.close(); - } } return credentials; } @@ -720,9 +628,7 @@ public final class DBReader { Log.d(TAG, "loadDescriptionOfFeedItem() called with: " + "item = [" + item + "]"); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - Cursor cursor = null; - try { - cursor = adapter.getDescriptionOfItem(item); + try (Cursor cursor = adapter.getDescriptionOfItem(item)) { if (cursor.moveToFirst()) { int indexDescription = cursor.getColumnIndex(PodDBAdapter.KEY_DESCRIPTION); String description = cursor.getString(indexDescription); @@ -732,9 +638,6 @@ public final class DBReader { item.setContentEncoded(contentEncoded); } } finally { - if (cursor != null) { - cursor.close(); - } adapter.close(); } } @@ -898,6 +801,16 @@ public final class DBReader { } final LongIntMap feedCounters = adapter.getFeedCounters(feedIds); + int feedFilter = UserPreferences.getFeedFilter(); + if (feedFilter == UserPreferences.FEED_FILTER_COUNTER_ZERO) { + for (int i = feeds.size() - 1; i >= 0; i--) { + if (feedCounters.get(feeds.get(i).getId()) <= 0) { + feedCounters.delete(feeds.get(i).getId()); + feeds.remove(i); + } + } + } + Comparator<Feed> comparator; int feedOrder = UserPreferences.getFeedOrder(); if (feedOrder == UserPreferences.FEED_ORDER_COUNTER) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java index f10dde65f..e3121caa2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DownloadRequester.java @@ -340,7 +340,7 @@ public class DownloadRequester implements DownloadStateProvider { /** * Checks if feedfile is in the downloads list */ - public synchronized boolean isDownloadingFile(FeedFile item) { + public synchronized boolean isDownloadingFile(@NonNull FeedFile item) { return item.getDownload_url() != null && downloads.containsKey(item.getDownload_url()); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java index e6d47b32a..8a3f44e18 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java @@ -1218,7 +1218,7 @@ public class PodDBAdapter { public Cursor searchItems(long feedID, String searchQuery) { String preparedQuery = prepareSearchQuery(searchQuery); - String queryFeedId = ""; + String queryFeedId; if (feedID != 0) { // search items in specific feed queryFeedId = KEY_FEED + " = " + feedID; diff --git a/core/src/main/java/de/danoeh/antennapod/core/sync/gpoddernet/GpodnetService.java b/core/src/main/java/de/danoeh/antennapod/core/sync/gpoddernet/GpodnetService.java index eae7a08af..62c8ce5f3 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/sync/gpoddernet/GpodnetService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/sync/gpoddernet/GpodnetService.java @@ -21,7 +21,6 @@ import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; -import org.apache.commons.io.Charsets; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -34,6 +33,7 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; @@ -505,7 +505,7 @@ public class GpodnetService implements ISyncService { RequestBody requestBody = RequestBody.create(TEXT, ""); Request request = new Request.Builder().url(url).post(requestBody).build(); try { - String credential = Credentials.basic(username, password, Charsets.UTF_8); + String credential = Credentials.basic(username, password, Charset.forName("UTF-8")); Request authRequest = request.newBuilder().header("Authorization", credential).build(); Response response = httpClient.newCall(authRequest).execute(); checkStatusCode(response); @@ -519,8 +519,8 @@ public class GpodnetService implements ISyncService { private String executeRequest(@NonNull Request.Builder requestB) throws GpodnetServiceException { Request request = requestB.build(); - String responseString = null; - Response response = null; + String responseString; + Response response; ResponseBody body = null; try { diff --git a/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeAction.java b/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeAction.java index 6154ccc84..798be8d96 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeAction.java +++ b/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeAction.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.core.sync.model; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.NonNull; import androidx.core.util.ObjectsCompat; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.util.DateUtils; @@ -179,6 +180,7 @@ public class EpisodeAction { return obj; } + @NonNull @Override public String toString() { return "EpisodeAction{" diff --git a/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeActionChanges.java b/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeActionChanges.java index 77942ffa0..90af585af 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeActionChanges.java +++ b/core/src/main/java/de/danoeh/antennapod/core/sync/model/EpisodeActionChanges.java @@ -23,6 +23,7 @@ public class EpisodeActionChanges { return this.timestamp; } + @NonNull @Override public String toString() { return "EpisodeActionGetResponse{" diff --git a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java index e85d5fae1..0c0561279 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java +++ b/core/src/main/java/de/danoeh/antennapod/core/syndication/namespace/atom/AtomText.java @@ -1,7 +1,7 @@ package de.danoeh.antennapod.core.syndication.namespace.atom; -import android.os.Build; -import android.text.Html; +import androidx.core.text.HtmlCompat; + import de.danoeh.antennapod.core.syndication.namespace.Namespace; import de.danoeh.antennapod.core.syndication.namespace.SyndElement; @@ -24,11 +24,7 @@ public class AtomText extends SyndElement { if (type == null) { return content; } else if (type.equals(TYPE_HTML)) { - if (Build.VERSION.SDK_INT >= 24) { - return Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY).toString(); - } else { - return Html.fromHtml(content).toString(); - } + return HtmlCompat.fromHtml(content, HtmlCompat.FROM_HTML_MODE_LEGACY).toString(); } else if (type.equals(TYPE_XHTML)) { return content; } else { // Handle as text by default diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java b/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java index 220a783f3..2a387b7b0 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/FileNameGenerator.java @@ -4,6 +4,7 @@ import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; @@ -29,6 +30,7 @@ public class FileNameGenerator { * characters of the given string. */ public static String generateFileName(String string) { + string = StringUtils.stripAccents(string); StringBuilder buf = new StringBuilder(); for (int i = 0; i < string.length(); i++) { char c = string.charAt(i); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java index 366f86707..813c6d0f7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/RewindAfterPauseUtils.java @@ -39,7 +39,7 @@ public class RewindAfterPauseUtils { int newPosition = currentPosition - (int) rewindTime; - return newPosition > 0 ? newPosition : 0; + return Math.max(newPosition, 0); } else { return currentPosition; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/ChapterStartTimeComparator.java b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/ChapterStartTimeComparator.java index 8bd23c2ed..920a1ef8a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/comparator/ChapterStartTimeComparator.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/comparator/ChapterStartTimeComparator.java @@ -8,13 +8,7 @@ public class ChapterStartTimeComparator implements Comparator<Chapter> { @Override public int compare(Chapter lhs, Chapter rhs) { - if (lhs.getStart() == rhs.getStart()) { - return 0; - } else if (lhs.getStart() < rhs.getStart()) { - return -1; - } else { - return 1; - } + return Long.compare(lhs.getStart(), rhs.getStart()); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java index 991089910..a8ca43ccb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java @@ -118,9 +118,8 @@ public class AutoUpdateManager { */ public static void runImmediate(@NonNull Context context) { Log.d(TAG, "Run auto update immediately in background."); - new Thread(() -> { - DBTasks.refreshAllFeeds(context.getApplicationContext(), true); - }, "ManualRefreshAllFeeds").start(); + new Thread(() -> DBTasks.refreshAllFeeds( + context.getApplicationContext(), true), "ManualRefreshAllFeeds").start(); } public static void disableAutoUpdate(Context context) { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java index 44f5f9b11..d47d26af9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java @@ -599,6 +599,13 @@ public class PlaybackController { } public void setPlaybackSpeed(float speed) { + PlaybackPreferences.setCurrentlyPlayingTemporaryPlaybackSpeed(speed); + if (getMedia() != null && getMedia().getMediaType() == MediaType.VIDEO) { + UserPreferences.setVideoPlaybackSpeed(speed); + } else { + UserPreferences.setPlaybackSpeed(speed); + } + if (playbackService != null) { playbackService.setSpeed(speed); } else { diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/OggInputStream.java b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/OggInputStream.java index cdf171299..9277af6e6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/OggInputStream.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/vorbiscommentreader/OggInputStream.java @@ -39,7 +39,7 @@ class OggInputStream extends InputStream { private void readOggPage() throws IOException { // find OggS int[] buffer = new int[4]; - int c = 0; + int c; boolean isInOggS = false; while ((c = input.read()) != -1) { switch (c) { diff --git a/core/src/main/res/color/filter_dialog_background_dark.xml b/core/src/main/res/color/filter_dialog_background_dark.xml new file mode 100644 index 000000000..3df2a80dc --- /dev/null +++ b/core/src/main/res/color/filter_dialog_background_dark.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@color/accent_dark" android:state_checked="true"/> + <item android:color="@color/dialog_filter_inactive_dark" /> +</selector>
\ No newline at end of file diff --git a/core/src/main/res/color/filter_dialog_background_light.xml b/core/src/main/res/color/filter_dialog_background_light.xml new file mode 100644 index 000000000..930325629 --- /dev/null +++ b/core/src/main/res/color/filter_dialog_background_light.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@color/accent_light" android:state_checked="true" /> + <item android:color="@color/dialog_filter_inactive_light" /> +</selector>
\ No newline at end of file diff --git a/core/src/main/res/color/filter_dialog_button_text.xml b/core/src/main/res/color/filter_dialog_button_text.xml new file mode 100644 index 000000000..fea8b3e74 --- /dev/null +++ b/core/src/main/res/color/filter_dialog_button_text.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="?attr/colorOnSecondary" android:state_checked="true" /> + <item android:color="?android:textColorPrimary" /> +</selector>
\ No newline at end of file diff --git a/core/src/main/res/color/filter_dialog_clear_dark.xml b/core/src/main/res/color/filter_dialog_clear_dark.xml new file mode 100644 index 000000000..88e022d0f --- /dev/null +++ b/core/src/main/res/color/filter_dialog_clear_dark.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@color/dialog_filter_inactive_dark" android:state_checked="true" /> + <item android:color="@color/dialog_filter_clear_inactive_dark" /> +</selector>
\ No newline at end of file diff --git a/core/src/main/res/color/filter_dialog_clear_light.xml b/core/src/main/res/color/filter_dialog_clear_light.xml new file mode 100644 index 000000000..9d513f72a --- /dev/null +++ b/core/src/main/res/color/filter_dialog_clear_light.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@color/dialog_filter_inactive_light" android:state_checked="true" /> + <item android:color="@color/dialog_filter_clear_inactive_light" /> +</selector>
\ No newline at end of file diff --git a/core/src/main/res/drawable/ic_filter_close.xml b/core/src/main/res/drawable/ic_filter_close.xml new file mode 100644 index 000000000..9e0a26905 --- /dev/null +++ b/core/src/main/res/drawable/ic_filter_close.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + + <item + android:bottom="5dp" + android:left="5dp" + android:right="5dp" + android:top="5dp"> + + <shape android:shape="oval"> + <stroke + android:width="4dp" + android:color="?attr/filter_dialog_clear" /> + </shape> + </item> + + <!-- x --> + <item + android:bottom="12dp" + android:left="12dp" + android:right="12dp" + android:top="12dp"> + <rotate + android:fromDegrees="135" + android:pivotX="50%" + android:pivotY="50%" + android:toDegrees="135"> + <shape android:shape="line"> + <stroke + android:width="4dp" + android:color="?attr/filter_dialog_clear" /> + </shape> + </rotate> + </item> + + <item + android:bottom="12dp" + android:left="12dp" + android:right="12dp" + android:top="12dp"> + <rotate + android:fromDegrees="45" + android:pivotX="50%" + android:pivotY="50%" + android:toDegrees="45"> + <shape android:shape="line"> + <stroke + android:width="4dp" + android:color="?attr/filter_dialog_clear" /> + </shape> + + </rotate> + </item> + +</layer-list>
\ No newline at end of file diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index dc79905cd..ba6c2f196 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -233,6 +233,16 @@ <item>3</item> </string-array> + <string-array name="nav_drawer_feed_filter_values"> + <item>0</item> + <item>1</item> + </string-array> + + <string-array name="nav_drawer_feed_filter_options"> + <item>@string/no_filter_label</item> + <item>@string/hide_subscriptions_where_counter_is_zero</item> + </string-array> + <string-array name="media_player_options"> <item>@string/media_player_builtin</item> <item>@string/media_player_sonic</item> @@ -245,30 +255,6 @@ <item>exoplayer</item> </string-array> - <string-array name="episode_filter_options"> - <item>@string/hide_unplayed_episodes_label</item> - <item>@string/hide_paused_episodes_label</item> - <item>@string/hide_played_episodes_label</item> - <item>@string/hide_queued_episodes_label</item> - <item>@string/hide_not_queued_episodes_label</item> - <item>@string/hide_downloaded_episodes_label</item> - <item>@string/hide_not_downloaded_episodes_label</item> - <item>@string/hide_has_media_label</item> - <item>@string/hide_is_favorite_label</item> - </string-array> - - <string-array name="episode_filter_values"> - <item>unplayed</item> - <item>paused</item> - <item>played</item> - <item>queued</item> - <item>not_queued</item> - <item>downloaded</item> - <item>not_downloaded</item> - <item>has_media</item> - <item>is_favorite</item> - </string-array> - <!-- sort for podcast screen, not for queue --> <string-array name="feed_episodes_sort_options"> <item>@string/sort_date_new_old</item> diff --git a/core/src/main/res/values/attrs.xml b/core/src/main/res/values/attrs.xml index b89a819f1..4a18f6ae6 100644 --- a/core/src/main/res/values/attrs.xml +++ b/core/src/main/res/values/attrs.xml @@ -58,6 +58,8 @@ <attr name="action_icon_color" format="color"/> <attr name="scrollbar_thumb" format="reference"/> <attr name="background_elevated" format="color"/> + <attr name="filter_dialog_clear" format="reference"/> + <attr name="filter_dialog_button_background" format="reference"/> <declare-styleable name="SquareImageView"> <attr name="direction" format="enum"> diff --git a/core/src/main/res/values/colors.xml b/core/src/main/res/values/colors.xml index a86d61eba..a55378931 100644 --- a/core/src/main/res/values/colors.xml +++ b/core/src/main/res/values/colors.xml @@ -28,4 +28,9 @@ <color name="master_switch_background_light">#DDDDDD</color> <color name="master_switch_background_dark">#191919</color> + <!-- filter dialog --> + <color name="dialog_filter_clear_inactive_light">#666666</color> + <color name="dialog_filter_clear_inactive_dark">#bbbbbb</color> + <color name="dialog_filter_inactive_light">#eeeeee</color> + <color name="dialog_filter_inactive_dark">#555555</color> </resources> diff --git a/core/src/main/res/values/dimens.xml b/core/src/main/res/values/dimens.xml index 41a24f6fa..4702a5302 100644 --- a/core/src/main/res/values/dimens.xml +++ b/core/src/main/res/values/dimens.xml @@ -38,4 +38,6 @@ <dimen name="media_router_controller_playback_control_start_padding">24dp</dimen> <dimen name="media_router_controller_bottom_margin">8dp</dimen> + <dimen name="nav_drawer_max_screen_size">480dp</dimen> + </resources> diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 93a21ef13..1059a55c1 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -136,12 +136,13 @@ <string name="feed_settings_label">Podcast settings</string> <string name="rename_feed_label">Rename podcast</string> <string name="remove_feed_label">Remove podcast</string> - <string name="share_label">Share…</string> + <string name="share_label">Share</string> + <string name="share_label_with_ellipses">Share…</string> <string name="share_link_label">Share Episode URL</string> <string name="share_link_with_position_label">Share Episode URL with Position</string> <string name="share_file_label">Share File</string> - <string name="share_website_url_label">Share Website URL</string> - <string name="share_feed_url_label">Share Podcast URL</string> + <string name="share_website_url_label">Website address</string> + <string name="share_feed_url_label">Podcast feed URL</string> <string name="share_item_url_label">Share Media File URL</string> <string name="share_item_url_with_position_label">Share Media File URL with Position</string> <string name="feed_delete_confirmation_msg">Please confirm that you want to delete the podcast \"%1$s\" and ALL its episodes (including downloaded episodes).</string> @@ -151,14 +152,9 @@ <string name="select_all_above">Select all above</string> <string name="select_all_below">Select all below</string> <string name="hide_unplayed_episodes_label">Unplayed</string> - <string name="hide_paused_episodes_label">Paused</string> - <string name="hide_played_episodes_label">Played</string> <string name="hide_queued_episodes_label">Queued</string> <string name="hide_not_queued_episodes_label">Not queued</string> - <string name="hide_downloaded_episodes_label">Downloaded</string> - <string name="hide_not_downloaded_episodes_label">Not downloaded</string> <string name="hide_has_media_label">Has media</string> - <string name="hide_is_favorite_label">Is favorite</string> <string name="filtered_label">Filtered</string> <string name="refresh_failed_msg">{fa-exclamation-circle} Last Refresh failed</string> <string name="open_podcast">Open Podcast</string> @@ -315,8 +311,9 @@ <string name="download_plugin_label">Download Plugin</string> <string name="no_playback_plugin_title">Plugin Not Installed</string> <string name="no_playback_plugin_or_sonic_msg">For variable speed playback to work, we recommend to enable the built-in Sonic mediaplayer.</string> - <string name="set_playback_speed_label">Playback Speeds</string> <string name="enable_sonic">Enable Sonic</string> + <string name="speed_presets">Presets</string> + <string name="preset_already_exists">%1$.2fx is already saved as a preset.</string> <!-- Empty list labels --> <string name="no_items_header_label">No queued episodes</string> @@ -391,7 +388,7 @@ <string name="pref_autoUpdateIntervallOrTime_every">every %1$s</string> <string name="pref_autoUpdateIntervallOrTime_at">at %1$s</string> <string name="pref_followQueue_title">Continuous Playback</string> - <string name="pref_pauseOnHeadsetDisconnect_title">Headphones Disconnect</string> + <string name="pref_pauseOnHeadsetDisconnect_title">Headphones or Bluetooth disconnect</string> <string name="pref_unpauseOnHeadsetReconnect_title">Headphones Reconnect</string> <string name="pref_unpauseOnBluetoothReconnect_title">Bluetooth Reconnect</string> <string name="pref_stream_over_download_title">Prefer Streaming</string> @@ -404,7 +401,7 @@ <string name="pref_mobileUpdate_episode_download">Episode download</string> <string name="pref_mobileUpdate_streaming">Streaming</string> <string name="user_interface_label">User Interface</string> - <string name="user_interface_sum">Appearance, Subscription order, Lockscreen</string> + <string name="user_interface_sum">Appearance, Subscriptions, Lockscreen</string> <string name="pref_set_theme_title">Select Theme</string> <string name="pref_nav_drawer_items_title">Set Navigation Drawer items</string> <string name="pref_nav_drawer_items_sum">Change which items appear in the navigation drawer.</string> @@ -445,8 +442,7 @@ <string name="pref_gpodnet_login_status"><![CDATA[Logged in as <i>%1$s</i> with device <i>%2$s</i>]]></string> <string name="pref_gpodnet_notifications_title">Show sync error notifications</string> <string name="pref_gpodnet_notifications_sum">This setting does not apply to authentication errors.</string> - <string name="pref_playback_speed_title">Playback Speeds</string> - <string name="pref_playback_speed_sum">Customize the speeds available for variable speed audio playback</string> + <string name="pref_playback_speed_sum">Customize the speeds available for variable speed playback</string> <string name="pref_feed_playback_speed_sum">The speed to use when starting audio playback for episodes in this podcast</string> <string name="pref_feed_skip">Auto Skip</string> <string name="pref_feed_skip_sum">Skip introductions and ending credits.</string> @@ -526,6 +522,11 @@ <string name="back_button_go_to_page_title">Select page</string> <string name="pref_delete_removes_from_queue_title">Delete removes from Queue</string> <string name="pref_delete_removes_from_queue_sum">Automatically remove an episode from the queue when it is deleted.</string> + <string name="pref_filter_feed_title">Subscription Filter</string> + <string name="pref_filter_feed_sum">Filter your subscriptions in navigation drawer and subscriptions screen.</string> + <string name="hide_subscriptions_where_counter_is_zero">Hide if counter is zero</string> + <string name="no_filter_label">None</string> + <string name="subscriptions_are_filtered">Subscriptions are filtered.</string> <!-- About screen --> <string name="about_pref">About</string> @@ -726,7 +727,7 @@ <!-- Episodes apply actions --> <string name="all_label">All</string> <string name="selected_all_label">Selected all Episodes</string> - <string name="none_label">None</string> + <string name="select_none_label">None</string> <string name="deselected_all_label">Deselected all Episodes</string> <string name="played_label">Played</string> <string name="selected_played_label">Selected played Episodes</string> @@ -736,13 +737,23 @@ <string name="selected_downloaded_label">Selected downloaded Episodes</string> <string name="not_downloaded_label">Not downloaded</string> <string name="selected_not_downloaded_label">Selected not downloaded Episodes</string> - <string name="queued_label">Queued</string> <string name="selected_queued_label">Selected queued Episodes</string> - <string name="not_queued_label">Not queued</string> <string name="selected_not_queued_label">Selected not queued Episodes</string> - <string name="has_media">Has media</string> <string name="selected_has_media_label">Selected episodes with media</string> + <string name="hide_is_favorite_label">Is favorite</string> + <string name="not_favorite">Not favorite</string> + <string name="hide_downloaded_episodes_label">Downloaded</string> + <string name="hide_not_downloaded_episodes_label">Not downloaded</string> + <string name="queued_label">Queued</string> + <string name="not_queued_label">Not queued</string> + <string name="has_media">Has media</string> + <string name="no_media">No media</string> + <string name="hide_paused_episodes_label">Paused</string> + <string name="not_paused">Not paused</string> + <string name="hide_played_episodes_label">Played</string> + <string name="not_played">Not played</string> + <!-- Sort --> <string name="sort_title_a_z">Title (A \u2192 Z)</string> <string name="sort_title_z_a">Title (Z \u2192 A)</string> @@ -765,6 +776,12 @@ <string name="rating_later_label">Remind me later</string> <string name="rating_now_label">Sure, let\'s do this!</string> + <!-- Share episode dialog --> + <string name="share_dialog_include_label">Include:</string> + <string name="share_playback_position_dialog_label">Playback position</string> + <string name="share_dialog_media_file_label">Media file URL</string> + <string name="share_dialog_episode_website_label">Episode webpage</string> + <!-- Audio controls --> <string name="audio_controls">Audio controls</string> <string name="playback_speed">Playback Speed</string> diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index ab78eac47..972174da5 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<resources xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"> +<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <style name="Theme.AntennaPod.Light" parent="Theme.Base.AntennaPod.Light"> <!-- Room for API dependent attributes --> @@ -73,6 +73,8 @@ <item name="ic_key">@drawable/ic_key_black</item> <item name="ic_volume_adaption">@drawable/ic_volume_adaption_black</item> <item name="scrollbar_thumb">@drawable/scrollbar_thumb_light</item> + <item name="filter_dialog_clear">@color/filter_dialog_clear_light</item> + <item name="filter_dialog_button_background">@color/filter_dialog_background_light</item> </style> <style name="Theme.AntennaPod.Dark" parent="Theme.Base.AntennaPod.Dark"> @@ -148,6 +150,8 @@ <item name="ic_key">@drawable/ic_key_white</item> <item name="ic_volume_adaption">@drawable/ic_volume_adaption_white</item> <item name="scrollbar_thumb">@drawable/scrollbar_thumb_dark</item> + <item name="filter_dialog_clear">@color/filter_dialog_clear_dark</item> + <item name="filter_dialog_button_background">@color/filter_dialog_background_dark</item> </style> <style name="Theme.AntennaPod.TrueBlack" parent="Theme.Base.AntennaPod.TrueBlack"> diff --git a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java index 45c86cb83..e933ce034 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/feed/VolumeAdaptionSettingTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertTrue; public class VolumeAdaptionSettingTest { diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/ItemEnqueuePositionCalculatorTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/ItemEnqueuePositionCalculatorTest.java index 80777d036..ed7d2fa75 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/ItemEnqueuePositionCalculatorTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/ItemEnqueuePositionCalculatorTest.java @@ -13,6 +13,7 @@ import java.util.Date; import java.util.List; import java.util.stream.Collectors; +import de.danoeh.antennapod.core.feed.FeedComponent; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedMother; @@ -27,6 +28,7 @@ import static de.danoeh.antennapod.core.preferences.UserPreferences.EnqueueLocat import static de.danoeh.antennapod.core.util.CollectionTestUtil.concat; import static de.danoeh.antennapod.core.util.CollectionTestUtil.list; import static de.danoeh.antennapod.core.util.FeedItemUtil.getIdList; +import static java.util.Collections.emptyList; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.any; import static org.mockito.Mockito.mock; @@ -248,13 +250,13 @@ public class ItemEnqueuePositionCalculatorTest { assertEquals(message, idsExpected, getIdList(queue)); } - static final List<FeedItem> QUEUE_EMPTY = Collections.unmodifiableList(Arrays.asList()); + static final List<FeedItem> QUEUE_EMPTY = Collections.unmodifiableList(emptyList()); static final List<FeedItem> QUEUE_DEFAULT = Collections.unmodifiableList(Arrays.asList( createFeedItem(11), createFeedItem(12), createFeedItem(13), createFeedItem(14))); static final List<Long> QUEUE_DEFAULT_IDS = - QUEUE_DEFAULT.stream().map(fi -> fi.getId()).collect(Collectors.toList()); + QUEUE_DEFAULT.stream().map(FeedComponent::getId).collect(Collectors.toList()); static Playable getCurrentlyPlaying(long idCurrentlyPlaying) { diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/FeedItemUtilTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/FeedItemUtilTest.java index 2560ac6a0..a3744035b 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/util/FeedItemUtilTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/util/FeedItemUtilTest.java @@ -7,6 +7,7 @@ import org.junit.runners.Parameterized.Parameters; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; @@ -55,7 +56,7 @@ public class FeedItemUtilTest { FeedItem feedItem = new FeedItem(); feedItem.setLink(itemLink); feedItem.setFeed(feed); - feed.setItems(Arrays.asList(feedItem)); + feed.setItems(Collections.singletonList(feedItem)); return feedItem; } } diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java index 0ed77eb9f..21df71bec 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/util/LongLongMapTest.java @@ -3,6 +3,8 @@ package de.danoeh.antennapod.core.util; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; public class LongLongMapTest { @@ -13,7 +15,7 @@ public class LongLongMapTest { assertEquals("LongLongMap{}", map.toString()); assertEquals(0, map.get(42)); assertEquals(-1, map.get(42, -1)); - assertEquals(false, map.delete(42)); + assertFalse(map.delete(42)); assertEquals(-1, map.indexOfKey(42)); assertEquals(-1, map.indexOfValue(42)); assertEquals(1, map.hashCode()); @@ -29,7 +31,7 @@ public class LongLongMapTest { assertEquals(42, map.get(17, -1)); assertEquals(0, map.indexOfKey(17)); assertEquals(0, map.indexOfValue(42)); - assertEquals(true, map.delete(17)); + assertTrue(map.delete(17)); } @Test @@ -45,7 +47,7 @@ public class LongLongMapTest { assertEquals(1, map.indexOfKey(17)); assertEquals(1, map.indexOfValue(42)); for(int i=0; i < 100; i++) { - assertEquals(true, map.delete(i * 17)); + assertTrue(map.delete(i * 17)); } } |