summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/ApplicationCallbacks.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/glide/ApGlideModule.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/NewEpisodesNotification.java5
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceNotificationBuilder.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java49
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java30
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/StorageUtils.java36
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/syndication/FeedDiscoverer.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java2
-rw-r--r--core/src/main/res/drawable-anydpi-v26/ic_playlist_shortcut.xml2
-rw-r--r--core/src/main/res/drawable-xxxhdpi/chart_box_outline.xml7
-rw-r--r--core/src/main/res/drawable/ic_chart_box.xml9
-rw-r--r--core/src/main/res/drawable/ic_inbox.xml10
-rw-r--r--core/src/main/res/drawable/ic_playlist.xml5
-rw-r--r--core/src/main/res/drawable/ic_playlist_black.xml5
-rw-r--r--core/src/main/res/drawable/ic_playlist_play.xml18
-rw-r--r--core/src/main/res/drawable/ic_playlist_play_black.xml18
-rw-r--r--core/src/main/res/drawable/ic_playlist_remove.xml9
-rw-r--r--core/src/main/res/drawable/ic_playlist_shortcut.xml2
-rw-r--r--core/src/main/res/values/arrays.xml7
-rw-r--r--core/src/main/res/values/dimens.xml1
-rw-r--r--core/src/main/res/values/styles.xml6
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java760
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java56
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<>());