Add sorting options to downloads screen (#6210)
This commit is contained in:
parent
8248bc6bb1
commit
7a2f4771ec
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
@ -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 -> {
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
83
app/src/main/res/menu/sort_menu.xml
Normal file
83
app/src/main/res/menu/sort_menu.xml
Normal file
@ -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>
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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()
|
||||
|
@ -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();
|
||||
|
@ -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()
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user