diff options
Diffstat (limited to 'core')
27 files changed, 543 insertions, 530 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java b/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java index 3acc84e3b..3b591363f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java @@ -1,8 +1,6 @@ package de.danoeh.antennapod.core; import android.app.Application; -import android.content.Context; -import android.content.Intent; /** * Callbacks related to the application in general @@ -13,11 +11,4 @@ public interface ApplicationCallbacks { * Returns a non-null instance of the application class */ Application getApplicationInstance(); - - /** - * Returns a non-null intent that starts the storage error - * activity. - */ - Intent getStorageErrorActivity(Context context); - } diff --git a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java index 593b683f7..09b0e978a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java +++ b/core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java @@ -31,7 +31,7 @@ public class ApGlideModule extends AppGlideModule { @Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) { - builder.setDefaultRequestOptions(new RequestOptions().format(DecodeFormat.PREFER_ARGB_8888)); + builder.setDefaultRequestOptions(RequestOptions.formatOf(DecodeFormat.PREFER_ARGB_8888)); @SuppressLint("UsableSpace") long spaceAvailable = context.getCacheDir().getUsableSpace(); long imageCacheSize = (spaceAvailable > 2 * GIGABYTES) ? (250 * MEGABYTES) : (50 * MEGABYTES); diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java index eb87acb5f..31cb2d928 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java @@ -57,7 +57,7 @@ public class SleepTimerPreferences { } public static boolean vibrate() { - return prefs.getBoolean(PREF_VIBRATE, true); + return prefs.getBoolean(PREF_VIBRATE, false); } public static void setShakeToReset(boolean shakeToReset) { 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 3238ce5f1..9a2a10490 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 @@ -113,9 +113,6 @@ public class HttpDownloader extends Downloader { } else if (!response.isSuccessful() || response.body() == null) { callOnFailByResponseCode(response); return; - } else if (!StorageUtils.storageAvailable()) { - onFail(DownloadError.ERROR_DEVICE_NOT_FOUND, null); - return; } else if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA && isContentTypeTextAndSmallerThan100kb(response)) { onFail(DownloadError.ERROR_FILE_TYPE, null); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java index 8f955e3c5..b6a1851fa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java @@ -119,8 +119,9 @@ public class NewEpisodesNotification { return Glide.with(context) .asBitmap() .load(feed.getImageUrl()) - .apply(RequestOptions.diskCacheStrategyOf(ApGlideSettings.AP_DISK_CACHE_STRATEGY)) - .apply(new RequestOptions().centerCrop()) + .apply(new RequestOptions() + .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) + .centerCrop()) .submit(iconSize, iconSize) .get(); } catch (Throwable tr) { 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 5bee39970..77d71bfb8 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 @@ -48,6 +48,7 @@ import de.danoeh.antennapod.event.playback.BufferUpdateEvent; import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; import de.danoeh.antennapod.event.PlayerErrorEvent; import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent; +import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer; import de.danoeh.antennapod.playback.base.PlayerStatus; import de.danoeh.antennapod.playback.cast.CastPsmp; @@ -434,10 +435,12 @@ public class PlaybackService extends MediaBrowserServiceCompat { throws InterruptedException { List<MediaBrowserCompat.MediaItem> mediaItems = new ArrayList<>(); if (parentId.equals(getResources().getString(R.string.app_name))) { - mediaItems.add(createBrowsableMediaItem(R.string.queue_label, R.drawable.ic_playlist_black, + mediaItems.add(createBrowsableMediaItem(R.string.queue_label, R.drawable.ic_playlist_play_black, DBReader.getQueue().size())); mediaItems.add(createBrowsableMediaItem(R.string.downloads_label, R.drawable.ic_download_black, DBReader.getDownloadedItems().size())); + mediaItems.add(createBrowsableMediaItem(R.string.episodes_label, R.drawable.ic_feed_black, + DBReader.getTotalEpisodeCount(new FeedItemFilter(FeedItemFilter.UNPLAYED)))); List<Feed> feeds = DBReader.getFeedList(); for (Feed feed : feeds) { mediaItems.add(createBrowsableMediaItemForFeed(feed)); @@ -450,6 +453,10 @@ public class PlaybackService extends MediaBrowserServiceCompat { feedItems = DBReader.getQueue(); } else if (parentId.equals(getResources().getString(R.string.downloads_label))) { feedItems = DBReader.getDownloadedItems(); + } else if (parentId.equals(getResources().getString(R.string.episodes_label))) { + feedItems = DBReader.getRecentlyPublishedEpisodes(0, + MAX_ANDROID_AUTO_EPISODES_PER_FEED, + new FeedItemFilter(FeedItemFilter.UNPLAYED)); } else if (parentId.startsWith("FeedId:")) { long feedId = Long.parseLong(parentId.split(":")[1]); feedItems = DBReader.getFeedItemList(DBReader.getFeed(feedId)); 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 c348f5773..47b587d77 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 @@ -72,12 +72,14 @@ public class PlaybackServiceNotificationBuilder { public void loadIcon() { int iconSize = (int) (128 * context.getResources().getDisplayMetrics().density); + final RequestOptions options = new RequestOptions() + .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) + .centerCrop(); try { icon = Glide.with(context) .asBitmap() .load(playable.getImageLocation()) - .apply(RequestOptions.diskCacheStrategyOf(ApGlideSettings.AP_DISK_CACHE_STRATEGY)) - .apply(new RequestOptions().centerCrop()) + .apply(options) .submit(iconSize, iconSize) .get(); } catch (ExecutionException e) { @@ -85,8 +87,7 @@ public class PlaybackServiceNotificationBuilder { icon = Glide.with(context) .asBitmap() .load(ImageResourceUtils.getFallbackImageLocation(playable)) - .apply(RequestOptions.diskCacheStrategyOf(ApGlideSettings.AP_DISK_CACHE_STRATEGY)) - .apply(new RequestOptions().centerCrop()) + .apply(options) .submit(iconSize, iconSize) .get(); } catch (InterruptedException ignore) { 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 62a461dfe..e7e8e9587 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 @@ -46,11 +46,6 @@ public final class DBReader { private static final String TAG = "DBReader"; /** - * Maximum size of the list returned by {@link #getPlaybackHistory()}. - */ - public static final int PLAYBACK_HISTORY_SIZE = 50; - - /** * Maximum size of the list returned by {@link #getDownloadLog()}. */ private static final int DOWNLOAD_LOG_SIZE = 200; @@ -402,15 +397,29 @@ public final class DBReader { } } + public static int getTotalEpisodeCount(FeedItemFilter filter) { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + try (Cursor cursor = adapter.getTotalEpisodeCountCursor(filter)) { + if (cursor.moveToFirst()) { + return cursor.getInt(0); + } + return -1; + } finally { + adapter.close(); + } + } + /** * Loads the playback history from the database. A FeedItem is in the playback history if playback of the correpsonding episode * has been completed at least once. * + * @param limit The maximum number of items to return. + * * @return The playback history. The FeedItems are sorted by their media's playbackCompletionDate in descending order. - * The size of the returned list is limited by {@link #PLAYBACK_HISTORY_SIZE}. */ @NonNull - public static List<FeedItem> getPlaybackHistory() { + public static List<FeedItem> getPlaybackHistory(int offset, int limit) { Log.d(TAG, "getPlaybackHistory() called"); PodDBAdapter adapter = PodDBAdapter.getInstance(); @@ -419,7 +428,7 @@ public final class DBReader { Cursor mediaCursor = null; Cursor itemCursor = null; try { - mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE); + mediaCursor = adapter.getCompletedMediaCursor(offset, limit); String[] itemIds = new String[mediaCursor.getCount()]; for (int i = 0; i < itemIds.length && mediaCursor.moveToPosition(i); i++) { int index = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM); @@ -441,6 +450,17 @@ public final class DBReader { } } + public static long getPlaybackHistoryLength() { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + + try { + return adapter.getCompletedMediaLength(); + } finally { + adapter.close(); + } + } + /** * Loads the download log from the database. * @@ -775,6 +795,19 @@ public final class DBReader { } } + public static List<FeedItem> getFeedItemsWithMedia(Long[] mediaIds) { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + try (Cursor itemCursor = adapter.getFeedItemCursorByMediaIds(mediaIds)) { + List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor); + loadAdditionalFeedItemListData(items); + Collections.sort(items, new PlaybackCompletionDateComparator()); + return items; + } finally { + adapter.close(); + } + } + public static class MonthlyStatisticsItem { public int year = 0; public int month = 0; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index df4094590..ff8c990db 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -732,36 +732,6 @@ public class DBWriter { } /** - * Sets the 'read'-attribute of all FeedItems of a specific Feed to PLAYED. - * - * @param feedId ID of the Feed. - */ - public static Future<?> markFeedRead(final long feedId) { - return dbExec.submit(() -> { - final PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setFeedItems(FeedItem.PLAYED, feedId); - adapter.close(); - - EventBus.getDefault().post(new UnreadItemsUpdateEvent()); - }); - } - - /** - * Sets the 'read'-attribute of all FeedItems to PLAYED. - */ - public static Future<?> markAllItemsRead() { - return dbExec.submit(() -> { - final PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setFeedItems(FeedItem.PLAYED); - adapter.close(); - - EventBus.getDefault().post(new UnreadItemsUpdateEvent()); - }); - } - - /** * Sets the 'read'-attribute of all NEW FeedItems to UNPLAYED. */ public static Future<?> removeAllNewFlags() { 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 index cf049ed80..c15d80b6f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java @@ -1,50 +1,16 @@ package de.danoeh.antennapod.core.util; -import android.app.Activity; import android.os.StatFs; -import android.util.Log; +import de.danoeh.antennapod.core.preferences.UserPreferences; import java.io.File; -import de.danoeh.antennapod.core.ClientConfig; -import de.danoeh.antennapod.core.preferences.UserPreferences; - /** * Utility functions for handling storage errors */ public class StorageUtils { private StorageUtils(){} - private static final String TAG = "StorageUtils"; - - public static boolean storageAvailable() { - File dir = UserPreferences.getDataFolder(null); - if (dir != null) { - return dir.exists() && dir.canRead() && dir.canWrite(); - } else { - Log.d(TAG, "Storage not available: data folder is null"); - return false; - } - } - - /** - * Checks if external storage is available. If external storage isn't - * available, the current activity is finsished an an error activity is - * launched. - * - * @param activity the activity which would be finished if no storage is - * available - * @return true if external storage is available - */ - public static boolean checkStorageAvailability(Activity activity) { - boolean storageAvailable = storageAvailable(); - if (!storageAvailable) { - activity.finish(); - activity.startActivity(ClientConfig.applicationCallbacks.getStorageErrorActivity(activity)); - } - return storageAvailable; - } - /** * Get the number of free bytes that are available on the external storage. */ diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/syndication/FeedDiscoverer.java b/core/src/main/java/de/danoeh/antennapod/core/util/syndication/FeedDiscoverer.java index a474756e9..316608f2f 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/syndication/FeedDiscoverer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/syndication/FeedDiscoverer.java @@ -32,7 +32,7 @@ public class FeedDiscoverer { * a title cannot be found). */ public Map<String, String> findLinks(File in, String baseUrl) throws IOException { - return findLinks(Jsoup.parse(in, null), baseUrl); + return findLinks(Jsoup.parse(in), baseUrl); } /** diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java b/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java index 37dee0486..c5f0727c2 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java @@ -4,7 +4,7 @@ import android.text.TextUtils; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; -import org.jsoup.helper.StringUtil; +import org.jsoup.internal.StringUtil; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; diff --git a/core/src/main/res/drawable-anydpi-v26/ic_playlist_shortcut.xml b/core/src/main/res/drawable-anydpi-v26/ic_playlist_shortcut.xml index 60f95db32..5d3ce4954 100644 --- a/core/src/main/res/drawable-anydpi-v26/ic_playlist_shortcut.xml +++ b/core/src/main/res/drawable-anydpi-v26/ic_playlist_shortcut.xml @@ -3,7 +3,7 @@ <background android:drawable="@color/grey100" /> <foreground> <inset - android:drawable="@drawable/ic_playlist_black" + 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-xxxhdpi/chart_box_outline.xml b/core/src/main/res/drawable-xxxhdpi/chart_box_outline.xml deleted file mode 100644 index c6a9bf35d..000000000 --- a/core/src/main/res/drawable-xxxhdpi/chart_box_outline.xml +++ /dev/null @@ -1,7 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" - android:width="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path android:fillColor="?attr/action_icon_color" android:pathData="M9 17H7V10H9V17M13 17H11V7H13V17M17 17H15V13H17V17M19 19H5V5H19V19.1M19 3H5C3.9 3 3 3.9 3 5V19C3 20.1 3.9 21 5 21H19C20.1 21 21 20.1 21 19V5C21 3.9 20.1 3 19 3Z" /> -</vector> diff --git a/core/src/main/res/drawable/ic_chart_box.xml b/core/src/main/res/drawable/ic_chart_box.xml new file mode 100644 index 000000000..9fba84fa5 --- /dev/null +++ b/core/src/main/res/drawable/ic_chart_box.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM19,19L5,19L5,5h14v14zM7,10h2v7L7,17zM11,7h2v10h-2zM15,13h2v4h-2z" /> +</vector> diff --git a/core/src/main/res/drawable/ic_inbox.xml b/core/src/main/res/drawable/ic_inbox.xml new file mode 100644 index 000000000..5482a1d36 --- /dev/null +++ b/core/src/main/res/drawable/ic_inbox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M19,3L4.99,3c-1.11,0 -1.98,0.89 -1.98,2L3,19c0,1.1 0.88,2 1.99,2L19,21c1.1,0 2,-0.9 2,-2L21,5c0,-1.11 -0.9,-2 -2,-2zM19,15h-4c0,1.66 -1.35,3 -3,3s-3,-1.34 -3,-3L4.99,15L4.99,5L19,5v10z"/> +</vector> diff --git a/core/src/main/res/drawable/ic_playlist.xml b/core/src/main/res/drawable/ic_playlist.xml deleted file mode 100644 index c609f9fb3..000000000 --- a/core/src/main/res/drawable/ic_playlist.xml +++ /dev/null @@ -1,5 +0,0 @@ -<vector android:height="24dp" - android:viewportHeight="24.0" android:viewportWidth="24.0" - android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> - <path android:fillColor="?attr/action_icon_color" android:pathData="M19,9L2,9v2h17L19,9zM19,5L2,5v2h17L19,5zM2,15h13v-2L2,13v2zM17,13v6l5,-3 -5,-3z"/> -</vector> diff --git a/core/src/main/res/drawable/ic_playlist_black.xml b/core/src/main/res/drawable/ic_playlist_black.xml deleted file mode 100644 index c7b0a356c..000000000 --- a/core/src/main/res/drawable/ic_playlist_black.xml +++ /dev/null @@ -1,5 +0,0 @@ -<vector android:height="24dp" - android:viewportHeight="24.0" android:viewportWidth="24.0" - android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> - <path android:fillColor="#000000" android:pathData="M19,9L2,9v2h17L19,9zM19,5L2,5v2h17L19,5zM2,15h13v-2L2,13v2zM17,13v6l5,-3 -5,-3z"/> -</vector> diff --git a/core/src/main/res/drawable/ic_playlist_play.xml b/core/src/main/res/drawable/ic_playlist_play.xml new file mode 100644 index 000000000..24635798b --- /dev/null +++ b/core/src/main/res/drawable/ic_playlist_play.xml @@ -0,0 +1,18 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M3,10h11v2h-11z" /> + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M3,6h11v2h-11z" /> + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M3,14h7v2h-7z" /> + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M16,13l0,8l6,-4z" /> +</vector> diff --git a/core/src/main/res/drawable/ic_playlist_play_black.xml b/core/src/main/res/drawable/ic_playlist_play_black.xml new file mode 100644 index 000000000..adca5f7ee --- /dev/null +++ b/core/src/main/res/drawable/ic_playlist_play_black.xml @@ -0,0 +1,18 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + <path + android:fillColor="#000000" + android:pathData="M3,10h11v2h-11z" /> + <path + android:fillColor="#000000" + android:pathData="M3,6h11v2h-11z" /> + <path + android:fillColor="#000000" + android:pathData="M3,14h7v2h-7z" /> + <path + android:fillColor="#000000" + android:pathData="M16,13l0,8l6,-4z" /> +</vector> diff --git a/core/src/main/res/drawable/ic_playlist_remove.xml b/core/src/main/res/drawable/ic_playlist_remove.xml index 940744924..3d62ab6cc 100644 --- a/core/src/main/res/drawable/ic_playlist_remove.xml +++ b/core/src/main/res/drawable/ic_playlist_remove.xml @@ -1,8 +1,9 @@ -<!-- drawable/playlist_remove.xml --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:height="24dp" android:width="24dp" + android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - <path android:fillColor="?attr/action_icon_color" android:pathData="M2,6V8H14V6H2M2,10V12H11V10H2M14.17,10.76L12.76,12.17L15.59,15L12.76,17.83L14.17,19.24L17,16.41L19.83,19.24L21.24,17.83L18.41,15L21.24,12.17L19.83,10.76L17,13.59L14.17,10.76M2,14V16H11V14H2Z" /> -</vector>
\ No newline at end of file + <path + android:fillColor="?attr/action_icon_color" + android:pathData="M14,10H3v2h11V10zM14,6H3v2h11V6zM3,16h7v-2H3V16zM14.41,22L17,19.41L19.59,22L21,20.59L18.41,18L21,15.41L19.59,14L17,16.59L14.41,14L13,15.41L15.59,18L13,20.59L14.41,22z" /> +</vector> diff --git a/core/src/main/res/drawable/ic_playlist_shortcut.xml b/core/src/main/res/drawable/ic_playlist_shortcut.xml index d2b5815d9..8d01f24a3 100644 --- a/core/src/main/res/drawable/ic_playlist_shortcut.xml +++ b/core/src/main/res/drawable/ic_playlist_shortcut.xml @@ -2,6 +2,6 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_shortcut_background" /> <item - android:drawable="@drawable/ic_playlist_black" + android:drawable="@drawable/ic_playlist_play_black" android:gravity="center" /> </layer-list> diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index f3cf4361d..e5b4a5e3b 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -151,6 +151,7 @@ <string-array name="nav_drawer_titles"> <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> @@ -173,8 +174,8 @@ </string-array> <string-array name="nav_drawer_feed_counter_options"> - <item>@string/drawer_feed_counter_new_unplayed</item> - <item>@string/drawer_feed_counter_new</item> + <item>@string/drawer_feed_counter_inbox_unplayed</item> + <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_none</item> @@ -265,12 +266,14 @@ <string-array name="back_button_go_to_pages"> <item>@string/queue_label</item> + <item>@string/inbox_label</item> <item>@string/episodes_label</item> <item>@string/subscriptions_label</item> </string-array> <string-array name="back_button_go_to_pages_tags"> <item>QueueFragment</item> + <item>InboxFragment</item> <item>EpisodesFragment</item> <item>SubscriptionFragment</item> </string-array> diff --git a/core/src/main/res/values/dimens.xml b/core/src/main/res/values/dimens.xml index 4b2247492..dc8047acb 100644 --- a/core/src/main/res/values/dimens.xml +++ b/core/src/main/res/values/dimens.xml @@ -18,7 +18,6 @@ <dimen name="listitem_threeline_textleftpadding">16dp</dimen> <dimen name="listitem_threeline_textrightpadding">8dp</dimen> <dimen name="listitem_threeline_verticalpadding">8dp</dimen> - <dimen name="listitem_threeline_horizontalpadding">16dp</dimen> <dimen name="list_vertical_padding">8dp</dimen> <dimen name="listitem_icon_leftpadding">16dp</dimen> diff --git a/core/src/main/res/values/styles.xml b/core/src/main/res/values/styles.xml index e597f8222..72c4eef18 100644 --- a/core/src/main/res/values/styles.xml +++ b/core/src/main/res/values/styles.xml @@ -183,12 +183,6 @@ <item name="android:ellipsize">end</item> </style> - <style name="AntennaPod.TextView.UnreadIndicator" parent="@android:style/TextAppearance.Small"> - <item name="android:textSize">@dimen/text_size_micro</item> - <item name="android:textColor">?attr/colorAccent</item> - <item name="android:textAllCaps">true</item> - </style> - <style name="BigBlurryBackground"> <item name="android:scaleType">centerCrop</item> <!-- <item name="android:tint">@color/image_readability_tint</item> --> diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java index 834442fdd..bb3dd4b40 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java @@ -3,6 +3,8 @@ package de.danoeh.antennapod.core.storage; import android.content.Context; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Random; @@ -16,8 +18,11 @@ import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.storage.database.PodDBAdapter; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; +import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; +import org.robolectric.ParameterizedRobolectricTestRunner; import org.robolectric.RobolectricTestRunner; import static de.danoeh.antennapod.core.storage.DbTestUtils.saveFeedlist; @@ -31,410 +36,473 @@ import static org.junit.Assert.assertTrue; * Test class for DBReader. */ @SuppressWarnings("ConstantConditions") -@RunWith(RobolectricTestRunner.class) +@RunWith(Enclosed.class) public class DbReaderTest { + @Ignore("Not a test") + public static class TestBase { + @Before + public void setUp() { + Context context = InstrumentationRegistry.getInstrumentation().getContext(); + UserPreferences.init(context); + + PodDBAdapter.init(context); + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.close(); + } - @Before - public void setUp() { - Context context = InstrumentationRegistry.getInstrumentation().getContext(); - UserPreferences.init(context); - - PodDBAdapter.init(context); - PodDBAdapter.deleteDatabase(); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.close(); - } - - @After - public void tearDown() { - PodDBAdapter.tearDownTests(); - DBWriter.tearDownTests(); - } - - @Test - public void testGetFeedList() { - List<Feed> feeds = saveFeedlist(10, 0, false); - List<Feed> savedFeeds = DBReader.getFeedList(); - assertNotNull(savedFeeds); - assertEquals(feeds.size(), savedFeeds.size()); - for (int i = 0; i < feeds.size(); i++) { - assertEquals(feeds.get(i).getId(), savedFeeds.get(i).getId()); + @After + public void tearDown() { + PodDBAdapter.tearDownTests(); + DBWriter.tearDownTests(); } } - @Test - public void testGetFeedListSortOrder() { - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - - Feed feed1 = new Feed(0, null, "A", "link", "d", null, null, null, "rss", "A", null, "", "", true); - Feed feed2 = new Feed(0, null, "b", "link", "d", null, null, null, "rss", "b", null, "", "", true); - Feed feed3 = new Feed(0, null, "C", "link", "d", null, null, null, "rss", "C", null, "", "", true); - Feed feed4 = new Feed(0, null, "d", "link", "d", null, null, null, "rss", "d", null, "", "", true); - adapter.setCompleteFeed(feed1); - adapter.setCompleteFeed(feed2); - adapter.setCompleteFeed(feed3); - adapter.setCompleteFeed(feed4); - assertTrue(feed1.getId() != 0); - assertTrue(feed2.getId() != 0); - assertTrue(feed3.getId() != 0); - assertTrue(feed4.getId() != 0); - - adapter.close(); - - List<Feed> saved = DBReader.getFeedList(); - assertNotNull(saved); - assertEquals("Wrong size: ", 4, saved.size()); - - assertEquals("Wrong id of feed 1: ", feed1.getId(), saved.get(0).getId()); - assertEquals("Wrong id of feed 2: ", feed2.getId(), saved.get(1).getId()); - assertEquals("Wrong id of feed 3: ", feed3.getId(), saved.get(2).getId()); - assertEquals("Wrong id of feed 4: ", feed4.getId(), saved.get(3).getId()); - } + @RunWith(RobolectricTestRunner.class) + public static class SingleTests extends TestBase { + @Test + public void testGetFeedList() { + List<Feed> feeds = saveFeedlist(10, 0, false); + List<Feed> savedFeeds = DBReader.getFeedList(); + assertNotNull(savedFeeds); + assertEquals(feeds.size(), savedFeeds.size()); + for (int i = 0; i < feeds.size(); i++) { + assertEquals(feeds.get(i).getId(), savedFeeds.get(i).getId()); + } + } - @Test - public void testFeedListDownloadUrls() { - List<Feed> feeds = saveFeedlist(10, 0, false); - List<String> urls = DBReader.getFeedListDownloadUrls(); - assertNotNull(urls); - assertEquals(feeds.size(), urls.size()); - for (int i = 0; i < urls.size(); i++) { - assertEquals(urls.get(i), feeds.get(i).getDownload_url()); + @Test + public void testGetFeedListSortOrder() { + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + + Feed feed1 = new Feed(0, null, "A", "link", "d", null, null, null, "rss", "A", null, "", "", true); + Feed feed2 = new Feed(0, null, "b", "link", "d", null, null, null, "rss", "b", null, "", "", true); + Feed feed3 = new Feed(0, null, "C", "link", "d", null, null, null, "rss", "C", null, "", "", true); + Feed feed4 = new Feed(0, null, "d", "link", "d", null, null, null, "rss", "d", null, "", "", true); + adapter.setCompleteFeed(feed1); + adapter.setCompleteFeed(feed2); + adapter.setCompleteFeed(feed3); + adapter.setCompleteFeed(feed4); + assertTrue(feed1.getId() != 0); + assertTrue(feed2.getId() != 0); + assertTrue(feed3.getId() != 0); + assertTrue(feed4.getId() != 0); + + adapter.close(); + + List<Feed> saved = DBReader.getFeedList(); + assertNotNull(saved); + assertEquals("Wrong size: ", 4, saved.size()); + + assertEquals("Wrong id of feed 1: ", feed1.getId(), saved.get(0).getId()); + assertEquals("Wrong id of feed 2: ", feed2.getId(), saved.get(1).getId()); + assertEquals("Wrong id of feed 3: ", feed3.getId(), saved.get(2).getId()); + assertEquals("Wrong id of feed 4: ", feed4.getId(), saved.get(3).getId()); } - } - @Test - public void testLoadFeedDataOfFeedItemlist() { - final int numFeeds = 10; - final int numItems = 1; - List<Feed> feeds = saveFeedlist(numFeeds, numItems, false); - List<FeedItem> items = new ArrayList<>(); - for (Feed f : feeds) { - for (FeedItem item : f.getItems()) { - item.setFeed(null); - item.setFeedId(f.getId()); - items.add(item); + @Test + public void testFeedListDownloadUrls() { + List<Feed> feeds = saveFeedlist(10, 0, false); + List<String> urls = DBReader.getFeedListDownloadUrls(); + assertNotNull(urls); + assertEquals(feeds.size(), urls.size()); + for (int i = 0; i < urls.size(); i++) { + assertEquals(urls.get(i), feeds.get(i).getDownload_url()); } } - DBReader.loadAdditionalFeedItemListData(items); - for (int i = 0; i < numFeeds; i++) { - for (int j = 0; j < numItems; j++) { - FeedItem item = feeds.get(i).getItems().get(j); - assertNotNull(item.getFeed()); - assertEquals(feeds.get(i).getId(), item.getFeed().getId()); - assertEquals(item.getFeed().getId(), item.getFeedId()); + + @Test + public void testLoadFeedDataOfFeedItemlist() { + final int numFeeds = 10; + final int numItems = 1; + List<Feed> feeds = saveFeedlist(numFeeds, numItems, false); + List<FeedItem> items = new ArrayList<>(); + for (Feed f : feeds) { + for (FeedItem item : f.getItems()) { + item.setFeed(null); + item.setFeedId(f.getId()); + items.add(item); + } + } + DBReader.loadAdditionalFeedItemListData(items); + for (int i = 0; i < numFeeds; i++) { + for (int j = 0; j < numItems; j++) { + FeedItem item = feeds.get(i).getItems().get(j); + assertNotNull(item.getFeed()); + assertEquals(feeds.get(i).getId(), item.getFeed().getId()); + assertEquals(item.getFeed().getId(), item.getFeedId()); + } } } - } - @Test - public void testGetFeedItemList() { - final int numFeeds = 1; - final int numItems = 10; - Feed feed = saveFeedlist(numFeeds, numItems, false).get(0); - List<FeedItem> items = feed.getItems(); - feed.setItems(null); - List<FeedItem> savedItems = DBReader.getFeedItemList(feed); - assertNotNull(savedItems); - assertEquals(items.size(), savedItems.size()); - for (int i = 0; i < savedItems.size(); i++) { - assertEquals(savedItems.get(i).getId(), items.get(i).getId()); + @Test + public void testGetFeedItemList() { + final int numFeeds = 1; + final int numItems = 10; + Feed feed = saveFeedlist(numFeeds, numItems, false).get(0); + List<FeedItem> items = feed.getItems(); + feed.setItems(null); + List<FeedItem> savedItems = DBReader.getFeedItemList(feed); + assertNotNull(savedItems); + assertEquals(items.size(), savedItems.size()); + for (int i = 0; i < savedItems.size(); i++) { + assertEquals(savedItems.get(i).getId(), items.get(i).getId()); + } } - } - @SuppressWarnings("SameParameterValue") - private List<FeedItem> saveQueue(int numItems) { - if (numItems <= 0) { - throw new IllegalArgumentException("numItems<=0"); - } - List<Feed> feeds = saveFeedlist(numItems, numItems, false); - List<FeedItem> allItems = new ArrayList<>(); - for (Feed f : feeds) { - allItems.addAll(f.getItems()); + @SuppressWarnings("SameParameterValue") + private List<FeedItem> saveQueue(int numItems) { + if (numItems <= 0) { + throw new IllegalArgumentException("numItems<=0"); + } + List<Feed> feeds = saveFeedlist(numItems, numItems, false); + List<FeedItem> allItems = new ArrayList<>(); + for (Feed f : feeds) { + allItems.addAll(f.getItems()); + } + // take random items from every feed + Random random = new Random(); + List<FeedItem> queue = new ArrayList<>(); + while (queue.size() < numItems) { + int index = random.nextInt(numItems); + if (!queue.contains(allItems.get(index))) { + queue.add(allItems.get(index)); + } + } + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.setQueue(queue); + adapter.close(); + return queue; } - // take random items from every feed - Random random = new Random(); - List<FeedItem> queue = new ArrayList<>(); - while (queue.size() < numItems) { - int index = random.nextInt(numItems); - if (!queue.contains(allItems.get(index))) { - queue.add(allItems.get(index)); + + @Test + public void testGetQueueIdList() { + final int numItems = 10; + List<FeedItem> queue = saveQueue(numItems); + LongList ids = DBReader.getQueueIDList(); + assertNotNull(ids); + assertEquals(ids.size(), queue.size()); + for (int i = 0; i < queue.size(); i++) { + assertTrue(ids.get(i) != 0); + assertEquals(ids.get(i), queue.get(i).getId()); } } - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setQueue(queue); - adapter.close(); - return queue; - } - @Test - public void testGetQueueIdList() { - final int numItems = 10; - List<FeedItem> queue = saveQueue(numItems); - LongList ids = DBReader.getQueueIDList(); - assertNotNull(ids); - assertEquals(ids.size(), queue.size()); - for (int i = 0; i < queue.size(); i++) { - assertTrue(ids.get(i) != 0); - assertEquals(ids.get(i), queue.get(i).getId()); + @Test + public void testGetQueue() { + final int numItems = 10; + List<FeedItem> queue = saveQueue(numItems); + List<FeedItem> savedQueue = DBReader.getQueue(); + assertNotNull(savedQueue); + assertEquals(savedQueue.size(), queue.size()); + for (int i = 0; i < queue.size(); i++) { + assertTrue(savedQueue.get(i).getId() != 0); + assertEquals(savedQueue.get(i).getId(), queue.get(i).getId()); + } } - } - @Test - public void testGetQueue() { - final int numItems = 10; - List<FeedItem> queue = saveQueue(numItems); - List<FeedItem> savedQueue = DBReader.getQueue(); - assertNotNull(savedQueue); - assertEquals(savedQueue.size(), queue.size()); - for (int i = 0; i < queue.size(); i++) { - assertTrue(savedQueue.get(i).getId() != 0); - assertEquals(savedQueue.get(i).getId(), queue.get(i).getId()); + @SuppressWarnings("SameParameterValue") + private List<FeedItem> saveDownloadedItems(int numItems) { + if (numItems <= 0) { + throw new IllegalArgumentException("numItems<=0"); + } + List<Feed> feeds = saveFeedlist(numItems, numItems, true); + List<FeedItem> items = new ArrayList<>(); + for (Feed f : feeds) { + items.addAll(f.getItems()); + } + List<FeedItem> downloaded = new ArrayList<>(); + Random random = new Random(); + + while (downloaded.size() < numItems) { + int i = random.nextInt(numItems); + if (!downloaded.contains(items.get(i))) { + FeedItem item = items.get(i); + item.getMedia().setDownloaded(true); + item.getMedia().setFile_url("file" + i); + downloaded.add(item); + } + } + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.storeFeedItemlist(downloaded); + adapter.close(); + return downloaded; } - } - @SuppressWarnings("SameParameterValue") - private List<FeedItem> saveDownloadedItems(int numItems) { - if (numItems <= 0) { - throw new IllegalArgumentException("numItems<=0"); + @Test + public void testGetDownloadedItems() { + final int numItems = 10; + List<FeedItem> downloaded = saveDownloadedItems(numItems); + List<FeedItem> downloadedSaved = DBReader.getDownloadedItems(); + assertNotNull(downloadedSaved); + assertEquals(downloaded.size(), downloadedSaved.size()); + for (FeedItem item : downloadedSaved) { + assertNotNull(item.getMedia()); + assertTrue(item.getMedia().isDownloaded()); + assertNotNull(item.getMedia().getDownload_url()); + } } - List<Feed> feeds = saveFeedlist(numItems, numItems, true); - List<FeedItem> items = new ArrayList<>(); - for (Feed f : feeds) { - items.addAll(f.getItems()); + + @SuppressWarnings("SameParameterValue") + private List<FeedItem> saveNewItems(int numItems) { + List<Feed> feeds = saveFeedlist(numItems, numItems, true); + List<FeedItem> items = new ArrayList<>(); + for (Feed f : feeds) { + items.addAll(f.getItems()); + } + List<FeedItem> newItems = new ArrayList<>(); + Random random = new Random(); + + while (newItems.size() < numItems) { + int i = random.nextInt(numItems); + if (!newItems.contains(items.get(i))) { + FeedItem item = items.get(i); + item.setNew(); + newItems.add(item); + } + } + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.storeFeedItemlist(newItems); + adapter.close(); + return newItems; } - List<FeedItem> downloaded = new ArrayList<>(); - Random random = new Random(); - - while (downloaded.size() < numItems) { - int i = random.nextInt(numItems); - if (!downloaded.contains(items.get(i))) { - FeedItem item = items.get(i); - item.getMedia().setDownloaded(true); - item.getMedia().setFile_url("file" + i); - downloaded.add(item); + + @Test + public void testGetNewItemIds() { + final int numItems = 10; + + List<FeedItem> newItems = saveNewItems(numItems); + long[] unreadIds = new long[newItems.size()]; + for (int i = 0; i < newItems.size(); i++) { + unreadIds[i] = newItems.get(i).getId(); + } + List<FeedItem> newItemsSaved = DBReader.getNewItemsList(0, Integer.MAX_VALUE); + assertNotNull(newItemsSaved); + assertEquals(newItemsSaved.size(), newItems.size()); + for (FeedItem feedItem : newItemsSaved) { + long savedId = feedItem.getId(); + boolean found = false; + for (long id : unreadIds) { + if (id == savedId) { + found = true; + break; + } + } + assertTrue(found); } } - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.storeFeedItemlist(downloaded); - adapter.close(); - return downloaded; - } - @Test - public void testGetDownloadedItems() { - final int numItems = 10; - List<FeedItem> downloaded = saveDownloadedItems(numItems); - List<FeedItem> downloadedSaved = DBReader.getDownloadedItems(); - assertNotNull(downloadedSaved); - assertEquals(downloaded.size(), downloadedSaved.size()); - for (FeedItem item : downloadedSaved) { - assertNotNull(item.getMedia()); - assertTrue(item.getMedia().isDownloaded()); - assertNotNull(item.getMedia().getDownload_url()); + @Test + public void testGetPlaybackHistoryLength() { + final int totalItems = 100; + + Feed feed = DbTestUtils.saveFeedlist(1, totalItems, true).get(0); + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + for (int playedItems : Arrays.asList(0, 1, 20, 100)) { + adapter.open(); + for (int i = 0; i < playedItems; ++i) { + FeedMedia m = feed.getItems().get(i).getMedia(); + m.setPlaybackCompletionDate(new Date(i + 1)); + + adapter.setFeedMediaPlaybackCompletionDate(m); + } + adapter.close(); + + long len = DBReader.getPlaybackHistoryLength(); + assertEquals("Wrong size: ", (int) len, playedItems); + } + } - } - @SuppressWarnings("SameParameterValue") - private List<FeedItem> saveNewItems(int numItems) { - List<Feed> feeds = saveFeedlist(numItems, numItems, true); - List<FeedItem> items = new ArrayList<>(); - for (Feed f : feeds) { - items.addAll(f.getItems()); + @Test + public void testGetNavDrawerDataQueueEmptyNoUnreadItems() { + final int numFeeds = 10; + final int numItems = 10; + DbTestUtils.saveFeedlist(numFeeds, numItems, true); + NavDrawerData navDrawerData = DBReader.getNavDrawerData(); + assertEquals(numFeeds, navDrawerData.items.size()); + assertEquals(0, navDrawerData.numNewItems); + assertEquals(0, navDrawerData.queueSize); } - List<FeedItem> newItems = new ArrayList<>(); - Random random = new Random(); - while (newItems.size() < numItems) { - int i = random.nextInt(numItems); - if (!newItems.contains(items.get(i))) { - FeedItem item = items.get(i); + @Test + public void testGetNavDrawerDataQueueNotEmptyWithUnreadItems() { + final int numFeeds = 10; + final int numItems = 10; + final int numQueue = 1; + final int numNew = 2; + List<Feed> feeds = DbTestUtils.saveFeedlist(numFeeds, numItems, true); + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + for (int i = 0; i < numNew; i++) { + FeedItem item = feeds.get(0).getItems().get(i); item.setNew(); - newItems.add(item); + adapter.setSingleFeedItem(item); } - } - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.storeFeedItemlist(newItems); - adapter.close(); - return newItems; - } + List<FeedItem> queue = new ArrayList<>(); + for (int i = 0; i < numQueue; i++) { + FeedItem item = feeds.get(1).getItems().get(i); + queue.add(item); + } + adapter.setQueue(queue); - @Test - public void testGetNewItemIds() { - final int numItems = 10; + adapter.close(); - List<FeedItem> newItems = saveNewItems(numItems); - long[] unreadIds = new long[newItems.size()]; - for (int i = 0; i < newItems.size(); i++) { - unreadIds[i] = newItems.get(i).getId(); + NavDrawerData navDrawerData = DBReader.getNavDrawerData(); + assertEquals(numFeeds, navDrawerData.items.size()); + assertEquals(numNew, navDrawerData.numNewItems); + assertEquals(numQueue, navDrawerData.queueSize); } - List<FeedItem> newItemsSaved = DBReader.getNewItemsList(0, Integer.MAX_VALUE); - assertNotNull(newItemsSaved); - assertEquals(newItemsSaved.size(), newItems.size()); - for (FeedItem feedItem : newItemsSaved) { - long savedId = feedItem.getId(); - boolean found = false; - for (long id : unreadIds) { - if (id == savedId) { - found = true; - break; + + @Test + public void testGetFeedItemlistCheckChaptersFalse() { + List<Feed> feeds = DbTestUtils.saveFeedlist(10, 10, false, false, 0); + for (Feed feed : feeds) { + for (FeedItem item : feed.getItems()) { + assertFalse(item.hasChapters()); } } - assertTrue(found); } - } - @Test - public void testGetPlaybackHistory() { - final int numItems = (DBReader.PLAYBACK_HISTORY_SIZE + 1) * 2; - final int playedItems = DBReader.PLAYBACK_HISTORY_SIZE + 1; - final int numReturnedItems = Math.min(playedItems, DBReader.PLAYBACK_HISTORY_SIZE); - final int numFeeds = 1; - - Feed feed = DbTestUtils.saveFeedlist(numFeeds, numItems, true).get(0); - long[] ids = new long[playedItems]; - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - for (int i = 0; i < playedItems; i++) { - FeedMedia m = feed.getItems().get(i).getMedia(); - m.setPlaybackCompletionDate(new Date(i + 1)); - adapter.setFeedMediaPlaybackCompletionDate(m); - ids[ids.length - 1 - i] = m.getItem().getId(); - } - adapter.close(); - - List<FeedItem> saved = DBReader.getPlaybackHistory(); - assertNotNull(saved); - assertEquals("Wrong size: ", numReturnedItems, saved.size()); - for (int i = 0; i < numReturnedItems; i++) { - FeedItem item = saved.get(i); - assertNotNull(item.getMedia().getPlaybackCompletionDate()); - assertEquals("Wrong sort order: ", item.getId(), ids[i]); + @Test + public void testGetFeedItemlistCheckChaptersTrue() { + List<Feed> feeds = saveFeedlist(10, 10, false, true, 10); + for (Feed feed : feeds) { + for (FeedItem item : feed.getItems()) { + assertTrue(item.hasChapters()); + } + } } - } - @Test - public void testGetNavDrawerDataQueueEmptyNoUnreadItems() { - final int numFeeds = 10; - final int numItems = 10; - DbTestUtils.saveFeedlist(numFeeds, numItems, true); - NavDrawerData navDrawerData = DBReader.getNavDrawerData(); - assertEquals(numFeeds, navDrawerData.items.size()); - assertEquals(0, navDrawerData.numNewItems); - assertEquals(0, navDrawerData.queueSize); - } + @Test + public void testLoadChaptersOfFeedItemNoChapters() { + List<Feed> feeds = saveFeedlist(1, 3, false, false, 0); + saveFeedlist(1, 3, false, true, 3); + for (Feed feed : feeds) { + for (FeedItem item : feed.getItems()) { + assertFalse(item.hasChapters()); + item.setChapters(DBReader.loadChaptersOfFeedItem(item)); + assertFalse(item.hasChapters()); + assertNull(item.getChapters()); + } + } + } - @Test - public void testGetNavDrawerDataQueueNotEmptyWithUnreadItems() { - final int numFeeds = 10; - final int numItems = 10; - final int numQueue = 1; - final int numNew = 2; - List<Feed> feeds = DbTestUtils.saveFeedlist(numFeeds, numItems, true); - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - for (int i = 0; i < numNew; i++) { - FeedItem item = feeds.get(0).getItems().get(i); - item.setNew(); - adapter.setSingleFeedItem(item); + @Test + public void testLoadChaptersOfFeedItemWithChapters() { + final int numChapters = 3; + DbTestUtils.saveFeedlist(1, 3, false, false, 0); + List<Feed> feeds = saveFeedlist(1, 3, false, true, numChapters); + for (Feed feed : feeds) { + for (FeedItem item : feed.getItems()) { + assertTrue(item.hasChapters()); + item.setChapters(DBReader.loadChaptersOfFeedItem(item)); + assertTrue(item.hasChapters()); + assertNotNull(item.getChapters()); + assertEquals(numChapters, item.getChapters().size()); + } + } } - List<FeedItem> queue = new ArrayList<>(); - for (int i = 0; i < numQueue; i++) { - FeedItem item = feeds.get(1).getItems().get(i); - queue.add(item); + + @Test + public void testGetItemWithChapters() { + final int numChapters = 3; + List<Feed> feeds = saveFeedlist(1, 1, false, true, numChapters); + FeedItem item1 = feeds.get(0).getItems().get(0); + FeedItem item2 = DBReader.getFeedItem(item1.getId()); + item2.setChapters(DBReader.loadChaptersOfFeedItem(item2)); + assertTrue(item2.hasChapters()); + assertEquals(item1.getChapters(), item2.getChapters()); } - adapter.setQueue(queue); - adapter.close(); + @Test + public void testGetItemByEpisodeUrl() { + List<Feed> feeds = saveFeedlist(1, 1, true); + FeedItem item1 = feeds.get(0).getItems().get(0); + FeedItem feedItemByEpisodeUrl = DBReader.getFeedItemByGuidOrEpisodeUrl(null, + item1.getMedia().getDownload_url()); + assertEquals(item1.getItemIdentifier(), feedItemByEpisodeUrl.getItemIdentifier()); + } - NavDrawerData navDrawerData = DBReader.getNavDrawerData(); - assertEquals(numFeeds, navDrawerData.items.size()); - assertEquals(numNew, navDrawerData.numNewItems); - assertEquals(numQueue, navDrawerData.queueSize); - } + @Test + public void testGetItemByGuid() { + List<Feed> feeds = saveFeedlist(1, 1, true); + FeedItem item1 = feeds.get(0).getItems().get(0); - @Test - public void testGetFeedItemlistCheckChaptersFalse() { - List<Feed> feeds = DbTestUtils.saveFeedlist(10, 10, false, false, 0); - for (Feed feed : feeds) { - for (FeedItem item : feed.getItems()) { - assertFalse(item.hasChapters()); - } + FeedItem feedItemByGuid = DBReader.getFeedItemByGuidOrEpisodeUrl(item1.getItemIdentifier(), + item1.getMedia().getDownload_url()); + assertEquals(item1.getItemIdentifier(), feedItemByGuid.getItemIdentifier()); } - } - @Test - public void testGetFeedItemlistCheckChaptersTrue() { - List<Feed> feeds = saveFeedlist(10, 10, false, true, 10); - for (Feed feed : feeds) { - for (FeedItem item : feed.getItems()) { - assertTrue(item.hasChapters()); - } - } } - @Test - public void testLoadChaptersOfFeedItemNoChapters() { - List<Feed> feeds = saveFeedlist(1, 3, false, false, 0); - saveFeedlist(1, 3, false, true, 3); - for (Feed feed : feeds) { - for (FeedItem item : feed.getItems()) { - assertFalse(item.hasChapters()); - item.setChapters(DBReader.loadChaptersOfFeedItem(item)); - assertFalse(item.hasChapters()); - assertNull(item.getChapters()); + @RunWith(ParameterizedRobolectricTestRunner.class) + public static class PlaybackHistoryTest extends TestBase { + + private int paramOffset; + private int paramLimit; + + @ParameterizedRobolectricTestRunner.Parameters + public static Collection<Object[]> data() { + List<Integer> limits = Arrays.asList(1, 20, 100); + List<Integer> offsets = Arrays.asList(0, 10, 20); + Object[][] rv = new Object[limits.size() * offsets.size()][2]; + int i = 0; + for (int offset : offsets) { + for (int limit : limits) { + rv[i][0] = offset; + rv[i][1] = limit; + i++; + } } - } - } - @Test - public void testLoadChaptersOfFeedItemWithChapters() { - final int numChapters = 3; - DbTestUtils.saveFeedlist(1, 3, false, false, 0); - List<Feed> feeds = saveFeedlist(1, 3, false, true, numChapters); - for (Feed feed : feeds) { - for (FeedItem item : feed.getItems()) { - assertTrue(item.hasChapters()); - item.setChapters(DBReader.loadChaptersOfFeedItem(item)); - assertTrue(item.hasChapters()); - assertNotNull(item.getChapters()); - assertEquals(numChapters, item.getChapters().size()); - } + return Arrays.asList(rv); } - } - - @Test - public void testGetItemWithChapters() { - final int numChapters = 3; - List<Feed> feeds = saveFeedlist(1, 1, false, true, numChapters); - FeedItem item1 = feeds.get(0).getItems().get(0); - FeedItem item2 = DBReader.getFeedItem(item1.getId()); - item2.setChapters(DBReader.loadChaptersOfFeedItem(item2)); - assertTrue(item2.hasChapters()); - assertEquals(item1.getChapters(), item2.getChapters()); - } - @Test - public void testGetItemByEpisodeUrl() { - List<Feed> feeds = saveFeedlist(1, 1, true); - FeedItem item1 = feeds.get(0).getItems().get(0); - FeedItem feedItemByEpisodeUrl = DBReader.getFeedItemByGuidOrEpisodeUrl(null, - item1.getMedia().getDownload_url()); - assertEquals(item1.getItemIdentifier(), feedItemByEpisodeUrl.getItemIdentifier()); - } + public PlaybackHistoryTest(int offset, int limit) { + this.paramOffset = offset; + this.paramLimit = limit; - @Test - public void testGetItemByGuid() { - List<Feed> feeds = saveFeedlist(1, 1, true); - FeedItem item1 = feeds.get(0).getItems().get(0); + } - FeedItem feedItemByGuid = DBReader.getFeedItemByGuidOrEpisodeUrl(item1.getItemIdentifier(), - item1.getMedia().getDownload_url()); - assertEquals(item1.getItemIdentifier(), feedItemByGuid.getItemIdentifier()); + @Test + public void testGetPlaybackHistory() { + final int numItems = (paramLimit + 1) * 2; + final int playedItems = paramLimit + 1; + final int numReturnedItems = Math.min(Math.max(playedItems - paramOffset, 0), paramLimit); + final int numFeeds = 1; + + Feed feed = DbTestUtils.saveFeedlist(numFeeds, numItems, true).get(0); + long[] ids = new long[playedItems]; + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + for (int i = 0; i < playedItems; i++) { + FeedMedia m = feed.getItems().get(i).getMedia(); + m.setPlaybackCompletionDate(new Date(i + 1)); + adapter.setFeedMediaPlaybackCompletionDate(m); + ids[ids.length - 1 - i] = m.getItem().getId(); + } + adapter.close(); + + List<FeedItem> saved = DBReader.getPlaybackHistory(paramOffset, paramLimit); + assertNotNull(saved); + assertEquals(String.format("Wrong size with offset %d and limit %d: ", + paramOffset, paramLimit), + numReturnedItems, saved.size()); + for (int i = 0; i < numReturnedItems; i++) { + FeedItem item = saved.get(i); + assertNotNull(item.getMedia().getPlaybackCompletionDate()); + assertEquals(String.format("Wrong sort order with offset %d and limit %d: ", + paramOffset, paramLimit), + item.getId(), ids[paramOffset + i]); + } + } } } diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java index de1e78408..533b517d5 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java @@ -752,34 +752,6 @@ public class DbWriterTest { } @Test - public void testMarkFeedRead() throws Exception { - final int numItems = 10; - Feed feed = new Feed("url", null, "title"); - feed.setItems(new ArrayList<>()); - for (int i = 0; i < numItems; i++) { - FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, - new Date(), FeedItem.UNPLAYED, feed); - feed.getItems().add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : feed.getItems()) { - assertTrue(item.getId() != 0); - } - - DBWriter.markFeedRead(feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); - List<FeedItem> loadedItems = DBReader.getFeedItemList(feed); - for (FeedItem item : loadedItems) { - assertTrue(item.isPlayed()); - } - } - - @Test public void testRemoveAllNewFlags() throws Exception { final int numItems = 10; Feed feed = new Feed("url", null, "title"); @@ -807,34 +779,6 @@ public class DbWriterTest { } } - @Test - public void testMarkAllItemsReadSameFeed() throws Exception { - final int numItems = 10; - Feed feed = new Feed("url", null, "title"); - feed.setItems(new ArrayList<>()); - for (int i = 0; i < numItems; i++) { - FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, - new Date(), FeedItem.UNPLAYED, feed); - feed.getItems().add(item); - } - - PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - adapter.setCompleteFeed(feed); - adapter.close(); - - assertTrue(feed.getId() != 0); - for (FeedItem item : feed.getItems()) { - assertTrue(item.getId() != 0); - } - - DBWriter.markAllItemsRead().get(TIMEOUT, TimeUnit.SECONDS); - List<FeedItem> loadedItems = DBReader.getFeedItemList(feed); - for (FeedItem item : loadedItems) { - assertTrue(item.isPlayed()); - } - } - private static Feed createTestFeed(int numItems) { Feed feed = new Feed("url", null, "title"); feed.setItems(new ArrayList<>()); |