summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java34
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java40
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java50
-rw-r--r--app/src/main/java/de/danoeh/antennapod/ui/home/sections/DownloadsSection.java5
-rw-r--r--app/src/main/res/menu/downloads_completed.xml5
-rw-r--r--app/src/main/res/menu/queue.xml83
-rw-r--r--app/src/main/res/menu/sort_menu.xml83
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java3
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java11
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java3
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/storage/DbReaderTest.java2
-rw-r--r--storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java8
-rw-r--r--storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java34
-rw-r--r--storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java19
16 files changed, 256 insertions, 131 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
index b39b41897..6d91765da 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java
@@ -4,6 +4,8 @@ import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -33,6 +35,8 @@ import de.danoeh.antennapod.fragment.swipeactions.SwipeActions;
import de.danoeh.antennapod.menuhandler.FeedItemMenuHandler;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedItemFilter;
+import de.danoeh.antennapod.model.feed.SortOrder;
+import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.view.EmptyViewHandler;
import de.danoeh.antennapod.view.EpisodeItemListRecyclerView;
import de.danoeh.antennapod.view.LiftOnScrollListener;
@@ -77,6 +81,8 @@ public class CompletedDownloadsFragment extends Fragment
MaterialToolbar toolbar = root.findViewById(R.id.toolbar);
toolbar.setTitle(R.string.downloads_label);
toolbar.inflateMenu(R.menu.downloads_completed);
+ inflateSortMenu(toolbar);
+
toolbar.setOnMenuItemClickListener(this);
toolbar.setOnLongClickListener(v -> {
recyclerView.scrollToPosition(5);
@@ -139,6 +145,19 @@ public class CompletedDownloadsFragment extends Fragment
return root;
}
+ private void inflateSortMenu(MaterialToolbar toolbar) {
+ Menu menu = toolbar.getMenu();
+ MenuItem downloadsItem = menu.findItem(R.id.downloads_sort);
+ MenuInflater menuInflater = getActivity().getMenuInflater();
+ menuInflater.inflate(R.menu.sort_menu, downloadsItem.getSubMenu());
+
+ // Remove the sorting options that are not needed in this fragment
+ menu.findItem(R.id.sort_feed_title).setVisible(false);
+ menu.findItem(R.id.sort_random).setVisible(false);
+ menu.findItem(R.id.sort_smart_shuffle).setVisible(false);
+ menu.findItem(R.id.keep_sorted).setVisible(false);
+ }
+
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putBoolean(KEY_UP_ARROW, displayUpArrow);
@@ -177,10 +196,21 @@ public class CompletedDownloadsFragment extends Fragment
} else if (item.getItemId() == R.id.action_search) {
((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance());
return true;
+ } else {
+ SortOrder sortOrder = MenuItemToSortOrderConverter.convert(item);
+ if (sortOrder != null) {
+ setSortOrder(sortOrder);
+ return true;
+ }
}
return false;
}
+ private void setSortOrder(SortOrder sortOrder) {
+ UserPreferences.setDownloadsSortedOrder(sortOrder);
+ loadItems();
+ }
+
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventMainThread(DownloadEvent event) {
Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]");
@@ -279,7 +309,9 @@ public class CompletedDownloadsFragment extends Fragment
}
emptyView.hide();
disposable = Observable.fromCallable(() -> {
- List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ SortOrder sortOrder = UserPreferences.getDownloadsSortedOrder();
+ List<FeedItem> downloadedItems = DBReader.getDownloadedItems(sortOrder);
+
List<Long> mediaIds = new ArrayList<>();
if (runningDownloads == null) {
return downloadedItems;
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java b/app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java
new file mode 100644
index 000000000..51911b122
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java
@@ -0,0 +1,40 @@
+package de.danoeh.antennapod.fragment;
+
+import android.view.MenuItem;
+
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.model.feed.SortOrder;
+
+public class MenuItemToSortOrderConverter {
+
+ public static SortOrder convert(MenuItem item) {
+ final int itemId = item.getItemId();
+
+ if (itemId == R.id.sort_episode_title_asc) {
+ return SortOrder.EPISODE_TITLE_A_Z;
+ } else if (itemId == R.id.sort_episode_title_desc) {
+ return SortOrder.EPISODE_TITLE_Z_A;
+ } else if (itemId == R.id.sort_date_asc) {
+ return SortOrder.DATE_OLD_NEW;
+ } else if (itemId == R.id.sort_date_desc) {
+ return SortOrder.DATE_NEW_OLD;
+ } else if (itemId == R.id.sort_duration_asc) {
+ return SortOrder.DURATION_SHORT_LONG;
+ } else if (itemId == R.id.sort_duration_desc) {
+ return SortOrder.DURATION_LONG_SHORT;
+ } else if (itemId == R.id.sort_feed_title_asc) {
+ return SortOrder.FEED_TITLE_A_Z;
+ } else if (itemId == R.id.sort_feed_title_desc) {
+ return SortOrder.FEED_TITLE_Z_A;
+ } else if (itemId == R.id.sort_random) {
+ return SortOrder.RANDOM;
+ } else if (itemId == R.id.sort_smart_shuffle_asc) {
+ return SortOrder.SMART_SHUFFLE_OLD_NEW;
+ } else if (itemId == R.id.sort_smart_shuffle_desc) {
+ return SortOrder.SMART_SHUFFLE_NEW_OLD;
+ }
+
+ return null;
+ }
+
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
index 12fa20d05..4e8999d0f 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java
@@ -10,6 +10,7 @@ import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.LayoutInflater;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@@ -256,8 +257,8 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
boolean keepSorted = UserPreferences.isQueueKeepSorted();
toolbar.getMenu().findItem(R.id.queue_lock).setChecked(UserPreferences.isQueueLocked());
toolbar.getMenu().findItem(R.id.queue_lock).setVisible(!keepSorted);
- toolbar.getMenu().findItem(R.id.queue_sort_random).setVisible(!keepSorted);
- toolbar.getMenu().findItem(R.id.queue_keep_sorted).setChecked(keepSorted);
+ toolbar.getMenu().findItem(R.id.sort_random).setVisible(!keepSorted);
+ toolbar.getMenu().findItem(R.id.keep_sorted).setChecked(keepSorted);
MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(),
R.id.refresh_item, DownloadService.isRunning && DownloadService.isDownloadingFeeds());
}
@@ -286,40 +287,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
};
conDialog.createNewDialog().show();
return true;
- } else if (itemId == R.id.queue_sort_episode_title_asc) {
- setSortOrder(SortOrder.EPISODE_TITLE_A_Z);
- return true;
- } else if (itemId == R.id.queue_sort_episode_title_desc) {
- setSortOrder(SortOrder.EPISODE_TITLE_Z_A);
- return true;
- } else if (itemId == R.id.queue_sort_date_asc) {
- setSortOrder(SortOrder.DATE_OLD_NEW);
- return true;
- } else if (itemId == R.id.queue_sort_date_desc) {
- setSortOrder(SortOrder.DATE_NEW_OLD);
- return true;
- } else if (itemId == R.id.queue_sort_duration_asc) {
- setSortOrder(SortOrder.DURATION_SHORT_LONG);
- return true;
- } else if (itemId == R.id.queue_sort_duration_desc) {
- setSortOrder(SortOrder.DURATION_LONG_SHORT);
- return true;
- } else if (itemId == R.id.queue_sort_feed_title_asc) {
- setSortOrder(SortOrder.FEED_TITLE_A_Z);
- return true;
- } else if (itemId == R.id.queue_sort_feed_title_desc) {
- setSortOrder(SortOrder.FEED_TITLE_Z_A);
- return true;
- } else if (itemId == R.id.queue_sort_random) {
- setSortOrder(SortOrder.RANDOM);
- return true;
- } else if (itemId == R.id.queue_sort_smart_shuffle_asc) {
- setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW);
- return true;
- } else if (itemId == R.id.queue_sort_smart_shuffle_desc) {
- setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD);
- return true;
- } else if (itemId == R.id.queue_keep_sorted) {
+ } else if (itemId == R.id.keep_sorted) {
boolean keepSortedOld = UserPreferences.isQueueKeepSorted();
boolean keepSortedNew = !keepSortedOld;
UserPreferences.setQueueKeepSorted(keepSortedNew);
@@ -335,6 +303,12 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
} else if (itemId == R.id.action_search) {
((MainActivity) getActivity()).loadChildFragment(SearchFragment.newInstance());
return true;
+ } else {
+ SortOrder sortOrder = MenuItemToSortOrderConverter.convert(item);
+ if (sortOrder != null) {
+ setSortOrder(sortOrder);
+ return true;
+ }
}
return false;
}
@@ -444,6 +418,10 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte
}
((MainActivity) getActivity()).setupToolbarToggle(toolbar, displayUpArrow);
toolbar.inflateMenu(R.menu.queue);
+
+ MenuItem queueItem = toolbar.getMenu().findItem(R.id.queue_sort);
+ MenuInflater menuInflater = getActivity().getMenuInflater();
+ menuInflater.inflate(R.menu.sort_menu, queueItem.getSubMenu());
refreshToolbarState();
progressBar = root.findViewById(R.id.progressBar);
progressBar.setVisibility(View.VISIBLE);
diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/DownloadsSection.java b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/DownloadsSection.java
index 78c336335..0053b0e82 100644
--- a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/DownloadsSection.java
+++ b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/DownloadsSection.java
@@ -23,6 +23,8 @@ import de.danoeh.antennapod.fragment.CompletedDownloadsFragment;
import de.danoeh.antennapod.fragment.swipeactions.SwipeActions;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedItemFilter;
+import de.danoeh.antennapod.model.feed.SortOrder;
+import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.ui.home.HomeSection;
import de.danoeh.antennapod.view.viewholder.EpisodeItemViewHolder;
import io.reactivex.Observable;
@@ -121,7 +123,8 @@ public class DownloadsSection extends HomeSection {
if (disposable != null) {
disposable.dispose();
}
- disposable = Observable.fromCallable(DBReader::getDownloadedItems)
+ SortOrder sortOrder = UserPreferences.getDownloadsSortedOrder();
+ disposable = Observable.fromCallable(() -> DBReader.getDownloadedItems(sortOrder))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(downloads -> {
diff --git a/app/src/main/res/menu/downloads_completed.xml b/app/src/main/res/menu/downloads_completed.xml
index 61a0e6578..08179de58 100644
--- a/app/src/main/res/menu/downloads_completed.xml
+++ b/app/src/main/res/menu/downloads_completed.xml
@@ -22,5 +22,10 @@
android:menuCategory="container"
android:icon="@drawable/ic_refresh"
app:showAsAction="always" />
+ <item
+ android:id="@+id/downloads_sort"
+ android:title="@string/sort">
+ <menu></menu>
+ </item>
</menu>
diff --git a/app/src/main/res/menu/queue.xml b/app/src/main/res/menu/queue.xml
index c1c2d982c..e4bb63808 100644
--- a/app/src/main/res/menu/queue.xml
+++ b/app/src/main/res/menu/queue.xml
@@ -24,88 +24,7 @@
<item
android:id="@+id/queue_sort"
android:title="@string/sort">
-
- <menu>
- <item
- android:id="@+id/queue_sort_date"
- android:title="@string/date">
-
- <menu>
- <item
- android:id="@+id/queue_sort_date_asc"
- android:title="@string/sort_old_new"/>
- <item
- android:id="@+id/queue_sort_date_desc"
- android:title="@string/sort_new_old"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/queue_sort_duration"
- android:title="@string/duration">
-
- <menu>
- <item
- android:id="@+id/queue_sort_duration_asc"
- android:title="@string/sort_short_long"/>
- <item
- android:id="@+id/queue_sort_duration_desc"
- android:title="@string/sort_long_short"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/queue_sort_episode_title"
- android:title="@string/episode_title">
-
- <menu>
- <item
- android:id="@+id/queue_sort_episode_title_asc"
- android:title="@string/sort_a_z"/>
- <item
- android:id="@+id/queue_sort_episode_title_desc"
- android:title="@string/sort_z_a"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/queue_sort_feed_title"
- android:title="@string/feed_title">
-
- <menu>
- <item
- android:id="@+id/queue_sort_feed_title_asc"
- android:title="@string/sort_a_z"/>
- <item
- android:id="@+id/queue_sort_feed_title_desc"
- android:title="@string/sort_z_a"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/queue_sort_random"
- android:title="@string/random">
- </item>
-
- <item
- android:id="@+id/queue_sort_smart_shuffle"
- android:title="@string/smart_shuffle">
-
- <menu>
- <item
- android:id="@+id/queue_sort_smart_shuffle_asc"
- android:title="@string/sort_old_new"/>
- <item
- android:id="@+id/queue_sort_smart_shuffle_desc"
- android:title="@string/sort_new_old"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/queue_keep_sorted"
- android:title="@string/keep_sorted"
- android:checkable="true" />
- </menu>
+ <menu></menu>
</item>
<item
diff --git a/app/src/main/res/menu/sort_menu.xml b/app/src/main/res/menu/sort_menu.xml
new file mode 100644
index 000000000..f0a22042b
--- /dev/null
+++ b/app/src/main/res/menu/sort_menu.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item
+ android:id="@+id/sort_date"
+ android:title="@string/date">
+
+ <menu>
+ <item
+ android:id="@+id/sort_date_asc"
+ android:title="@string/sort_old_new"/>
+ <item
+ android:id="@+id/sort_date_desc"
+ android:title="@string/sort_new_old"/>
+ </menu>
+ </item>
+
+ <item
+ android:id="@+id/sort_duration"
+ android:title="@string/duration">
+
+ <menu>
+ <item
+ android:id="@+id/sort_duration_asc"
+ android:title="@string/sort_short_long"/>
+ <item
+ android:id="@+id/sort_duration_desc"
+ android:title="@string/sort_long_short"/>
+ </menu>
+ </item>
+
+ <item
+ android:id="@+id/sort_episode_title"
+ android:title="@string/episode_title">
+
+ <menu>
+ <item
+ android:id="@+id/sort_episode_title_asc"
+ android:title="@string/sort_a_z"/>
+ <item
+ android:id="@+id/sort_episode_title_desc"
+ android:title="@string/sort_z_a"/>
+ </menu>
+ </item>
+
+ <item
+ android:id="@+id/sort_feed_title"
+ android:title="@string/feed_title">
+
+ <menu>
+ <item
+ android:id="@+id/sort_feed_title_asc"
+ android:title="@string/sort_a_z"/>
+ <item
+ android:id="@+id/sort_feed_title_desc"
+ android:title="@string/sort_z_a"/>
+ </menu>
+ </item>
+
+ <item
+ android:id="@+id/sort_random"
+ android:title="@string/random">
+ </item>
+
+ <item
+ android:id="@+id/sort_smart_shuffle"
+ android:title="@string/smart_shuffle">
+
+ <menu>
+ <item
+ android:id="@+id/sort_smart_shuffle_asc"
+ android:title="@string/sort_old_new"/>
+ <item
+ android:id="@+id/sort_smart_shuffle_desc"
+ android:title="@string/sort_new_old"/>
+ </menu>
+ </item>
+ <item
+ android:id="@+id/keep_sorted"
+ android:title="@string/keep_sorted"
+ android:checkable="true" />
+
+</menu>
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 bf8cf7778..14e11af23 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
@@ -387,7 +387,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
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()));
+ DBReader.getDownloadedItems(UserPreferences.getDownloadsSortedOrder()).size()));
mediaItems.add(createBrowsableMediaItem(R.string.episodes_label, R.drawable.ic_feed_black,
DBReader.getTotalEpisodeCount(new FeedItemFilter(FeedItemFilter.UNPLAYED))));
List<Feed> feeds = DBReader.getFeedList();
@@ -401,7 +401,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
if (parentId.equals(getResources().getString(R.string.queue_label))) {
feedItems = DBReader.getQueue();
} else if (parentId.equals(getResources().getString(R.string.downloads_label))) {
- feedItems = DBReader.getDownloadedItems();
+ feedItems = DBReader.getDownloadedItems(UserPreferences.getDownloadsSortedOrder());
} else if (parentId.equals(getResources().getString(R.string.episodes_label))) {
feedItems = DBReader.getRecentlyPublishedEpisodes(0,
MAX_ANDROID_AUTO_EPISODES_PER_FEED,
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
index 2be330a3e..30c50b576 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
@@ -15,6 +15,7 @@ import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedMedia;
+import de.danoeh.antennapod.model.feed.SortOrder;
/**
* Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod.
@@ -88,7 +89,7 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
@NonNull
private List<FeedItem> getCandidates() {
List<FeedItem> candidates = new ArrayList<>();
- List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ List<FeedItem> downloadedItems = DBReader.getDownloadedItems(SortOrder.DATE_NEW_OLD);
Date mostRecentDateForDeletion = calcMostRecentDateForDeletion(new Date());
for (FeedItem item : downloadedItems) {
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
index 9fce34a44..3241f37ef 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
@@ -12,6 +12,7 @@ import java.util.Locale;
import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.SortOrder;
/**
* A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite
@@ -75,7 +76,7 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm {
@NonNull
private List<FeedItem> getCandidates() {
List<FeedItem> candidates = new ArrayList<>();
- List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ List<FeedItem> downloadedItems = DBReader.getDownloadedItems(SortOrder.DATE_NEW_OLD);
for (FeedItem item : downloadedItems) {
if (item.hasMedia()
&& item.getMedia().isDownloaded()
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 55acb8b92..4641e366c 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
@@ -20,6 +20,7 @@ import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedItemFilter;
import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.model.feed.FeedPreferences;
+import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.model.feed.SubscriptionsFilter;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.model.download.DownloadStatus;
@@ -280,15 +281,19 @@ public final class DBReader {
* @return A list of FeedItems whose episdoe has been downloaded.
*/
@NonNull
- public static List<FeedItem> getDownloadedItems() {
+ public static List<FeedItem> getDownloadedItems(@Nullable SortOrder sortOrder) {
Log.d(TAG, "getDownloadedItems() called");
+ // Set a default sort order
+ if (sortOrder == null) {
+ sortOrder = SortOrder.DATE_NEW_OLD;
+ }
+
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
- try (Cursor cursor = adapter.getDownloadedItemsCursor()) {
+ try (Cursor cursor = adapter.getDownloadedItemsCursor(sortOrder)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
loadAdditionalFeedItemListData(items);
- Collections.sort(items, new FeedItemPubdateComparator());
return items;
} finally {
adapter.close();
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java
index 5d092da6d..448cffeb9 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java
@@ -13,6 +13,7 @@ import java.util.Locale;
import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
/**
@@ -74,7 +75,7 @@ public class ExceptFavoriteCleanupAlgorithm extends EpisodeCleanupAlgorithm {
@NonNull
private List<FeedItem> getCandidates() {
List<FeedItem> candidates = new ArrayList<>();
- List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
+ List<FeedItem> downloadedItems = DBReader.getDownloadedItems(SortOrder.DATE_NEW_OLD);
for (FeedItem item : downloadedItems) {
if (item.hasMedia()
&& item.getMedia().isDownloaded()
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 93f158b66..c44c6ae43 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
@@ -237,7 +237,7 @@ public class DbReaderTest {
public void testGetDownloadedItems() {
final int numItems = 10;
List<FeedItem> downloaded = saveDownloadedItems(numItems);
- List<FeedItem> downloadedSaved = DBReader.getDownloadedItems();
+ List<FeedItem> downloadedSaved = DBReader.getDownloadedItems(null);
assertNotNull(downloadedSaved);
assertEquals(downloaded.size(), downloadedSaved.size());
for (FeedItem item : downloadedSaved) {
diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java
index 46c731205..bcb57f3bb 100644
--- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java
+++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java
@@ -38,6 +38,8 @@ import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.model.download.DownloadStatus;
import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.storage.database.mapper.FeedItemFilterQuery;
+import de.danoeh.antennapod.storage.database.mapper.FeedItemSortQuery;
+
import org.apache.commons.io.FileUtils;
import static de.danoeh.antennapod.model.feed.FeedPreferences.SPEED_USE_GLOBAL;
@@ -1095,9 +1097,11 @@ public class PodDBAdapter {
return db.rawQuery(query, null);
}
- public Cursor getDownloadedItemsCursor() {
+ public Cursor getDownloadedItemsCursor(SortOrder sortOrder) {
+ String sortQuery = FeedItemSortQuery.generateFrom(sortOrder);
final String query = SELECT_FEED_ITEMS_AND_MEDIA
- + "WHERE " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " > 0";
+ + " WHERE " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " > 0"
+ + " ORDER BY " + sortQuery;
return db.rawQuery(query, null);
}
diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java
new file mode 100644
index 000000000..aae5154d3
--- /dev/null
+++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java
@@ -0,0 +1,34 @@
+package de.danoeh.antennapod.storage.database.mapper;
+
+import de.danoeh.antennapod.model.feed.SortOrder;
+import de.danoeh.antennapod.storage.database.PodDBAdapter;
+
+public class FeedItemSortQuery {
+ public static String generateFrom(SortOrder sortOrder) {
+ String sortQuery = "";
+ switch (sortOrder) {
+ case EPISODE_TITLE_A_Z:
+ sortQuery = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_TITLE + " " + "ASC";
+ break;
+ case EPISODE_TITLE_Z_A:
+ sortQuery = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_TITLE + " " + "DESC";
+ break;
+ case DATE_OLD_NEW:
+ sortQuery = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_PUBDATE + " " + "ASC";
+ break;
+ case DATE_NEW_OLD:
+ sortQuery = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_PUBDATE + " " + "DESC";
+ break;
+ case DURATION_SHORT_LONG:
+ sortQuery = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DURATION + " " + "ASC";
+ break;
+ case DURATION_LONG_SHORT:
+ sortQuery = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DURATION + " " + "DESC";
+ break;
+ default:
+ sortQuery = "";
+ break;
+ }
+ return sortQuery;
+ }
+} \ No newline at end of file
diff --git a/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java b/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java
index 895d0ab6f..8d9b099fc 100644
--- a/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java
+++ b/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java
@@ -66,6 +66,7 @@ public class UserPreferences {
public static final String PREF_QUEUE_KEEP_SORTED = "prefQueueKeepSorted";
public static final String PREF_QUEUE_KEEP_SORTED_ORDER = "prefQueueKeepSortedOrder";
+ private static final String PREF_DOWNLOADS_SORTED_ORDER = "prefDownloadSortedOrder";
// Playback
public static final String PREF_PAUSE_ON_HEADSET_DISCONNECT = "prefPauseOnHeadsetDisconnect";
@@ -926,6 +927,24 @@ public class UserPreferences {
.apply();
}
+ /**
+ * Returns the sort order for the downloads.
+ */
+ public static SortOrder getDownloadsSortedOrder() {
+ String sortOrderStr = prefs.getString(PREF_DOWNLOADS_SORTED_ORDER, "" + SortOrder.DATE_NEW_OLD.code);
+ return SortOrder.fromCodeString(sortOrderStr);
+ }
+
+ /**
+ * Sets the sort order for the downloads.
+ */
+ public static void setDownloadsSortedOrder(SortOrder sortOrder) {
+ if (sortOrder == null) {
+ return;
+ }
+ prefs.edit().putString(PREF_DOWNLOADS_SORTED_ORDER, "" + sortOrder.code).apply();
+ }
+
public static SubscriptionsFilter getSubscriptionsFilter() {
String value = prefs.getString(PREF_FILTER_FEED, "");
return new SubscriptionsFilter(value);