From 7a2f4771ecd327665497f21606ebc9d6c9415fd1 Mon Sep 17 00:00:00 2001 From: Jared234 Date: Sun, 12 Feb 2023 21:12:04 +0100 Subject: Add sorting options to downloads screen (#6210) --- .../fragment/CompletedDownloadsFragment.java | 34 ++++++++- .../fragment/MenuItemToSortOrderConverter.java | 40 +++++++++++ .../danoeh/antennapod/fragment/QueueFragment.java | 50 ++++--------- .../ui/home/sections/DownloadsSection.java | 5 +- app/src/main/res/menu/downloads_completed.xml | 5 ++ app/src/main/res/menu/queue.xml | 83 +--------------------- app/src/main/res/menu/sort_menu.xml | 83 ++++++++++++++++++++++ .../core/service/playback/PlaybackService.java | 4 +- .../core/storage/APCleanupAlgorithm.java | 3 +- .../core/storage/APQueueCleanupAlgorithm.java | 3 +- .../danoeh/antennapod/core/storage/DBReader.java | 11 ++- .../storage/ExceptFavoriteCleanupAlgorithm.java | 3 +- .../antennapod/core/storage/DbReaderTest.java | 2 +- .../antennapod/storage/database/PodDBAdapter.java | 8 ++- .../storage/database/mapper/FeedItemSortQuery.java | 34 +++++++++ .../storage/preferences/UserPreferences.java | 19 +++++ 16 files changed, 256 insertions(+), 131 deletions(-) create mode 100644 app/src/main/java/de/danoeh/antennapod/fragment/MenuItemToSortOrderConverter.java create mode 100644 app/src/main/res/menu/sort_menu.xml create mode 100644 storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java 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 downloadedItems = DBReader.getDownloadedItems(); + SortOrder sortOrder = UserPreferences.getDownloadsSortedOrder(); + List downloadedItems = DBReader.getDownloadedItems(sortOrder); + List 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" /> + + + 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 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 getCandidates() { List candidates = new ArrayList<>(); - List downloadedItems = DBReader.getDownloadedItems(); + List 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 getCandidates() { List candidates = new ArrayList<>(); - List downloadedItems = DBReader.getDownloadedItems(); + List 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 getDownloadedItems() { + public static List 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 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 getCandidates() { List candidates = new ArrayList<>(); - List downloadedItems = DBReader.getDownloadedItems(); + List 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 downloaded = saveDownloadedItems(numItems); - List downloadedSaved = DBReader.getDownloadedItems(); + List 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); -- cgit v1.2.3