From 9764b8093544857261bb5abf99c1ab9dbfcda65a Mon Sep 17 00:00:00 2001 From: drabux Date: Sat, 24 Jan 2015 13:17:19 -0500 Subject: Options to sort queue refactor, add sort by alpha and duration --- .../danoeh/antennapod/fragment/QueueFragment.java | 17 ++++- app/src/main/res/menu/queue.xml | 50 ++++++++++-- .../danoeh/antennapod/core/storage/DBWriter.java | 23 +----- .../danoeh/antennapod/core/util/QueueSorter.java | 89 ++++++++++++++++++++++ core/src/main/res/values/strings.xml | 7 +- 5 files changed, 156 insertions(+), 30 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java 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 185af0e93..ca8543b4c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -40,6 +40,7 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.core.util.QueueSorter; import de.danoeh.antennapod.menuhandler.MenuItemUtils; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; @@ -174,11 +175,23 @@ public class QueueFragment extends Fragment { DBTasks.refreshAllFeeds(getActivity(), feeds); } return true; + case R.id.queue_sort_alpha_asc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.ALPHA_ASC, true); + return true; + case R.id.queue_sort_alpha_desc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.ALPHA_DESC, true); + return true; case R.id.queue_sort_date_asc: - DBWriter.sortQueueItemByDate(getActivity(), true, true); + QueueSorter.sort(getActivity(), QueueSorter.Rule.DATE_ASC, true); return true; case R.id.queue_sort_date_desc: - DBWriter.sortQueueItemByDate(getActivity(), false, true); + QueueSorter.sort(getActivity(), QueueSorter.Rule.DATE_DESC, true); + return true; + case R.id.queue_sort_duration_asc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.DURATION_ASC, true); + return true; + case R.id.queue_sort_duration_desc: + QueueSorter.sort(getActivity(), QueueSorter.Rule.DURATION_DESC, true); return true; default: return false; diff --git a/app/src/main/res/menu/queue.xml b/app/src/main/res/menu/queue.xml index fa4d21b21..b85279e5a 100644 --- a/app/src/main/res/menu/queue.xml +++ b/app/src/main/res/menu/queue.xml @@ -15,13 +15,49 @@ android:title="@string/sort"> - - + + + + + + + + + + + + + + + + + + + + + + + + - + 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 41dde8656..07c3c78e6 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 @@ -595,39 +595,24 @@ public class DBWriter { * This function must be run using the ExecutorService (dbExec). * * @param context A context that is used for opening a database connection. - * @param asc true sort by ascending order - * false sort by descending order + * @param comparator FeedItem comparator * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to * false if the caller wants to avoid unexpected updates of the GUI. */ - public static void sortQueueItemByDate(final Context context, final boolean asc, final boolean broadcastUpdate) { + public static void sort (final Context context, Comparator comparator, final boolean broadcastUpdate) { final PodDBAdapter adapter = new PodDBAdapter(context); adapter.open(); final List queue = DBReader.getQueue(context, adapter); if (queue != null) { - if (asc) { - Collections.sort(queue, new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f1.getPubDate().compareTo(f2.getPubDate()); - } - }); - } else { - Collections.sort(queue, new Comparator() { - public int compare(FeedItem f1, FeedItem f2) { - return f2.getPubDate().compareTo(f1.getPubDate()); - } - }); - } - + Collections.sort(queue, comparator); adapter.setQueue(queue); if (broadcastUpdate) { EventDistributor.getInstance() .sendQueueUpdateBroadcast(); } - } else { - Log.e(TAG, "sortQueueItemByDate: Could not load queue"); + Log.e(TAG, "sort: Could not load queue"); } adapter.close(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java new file mode 100644 index 000000000..b6ea8c977 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java @@ -0,0 +1,89 @@ +package de.danoeh.antennapod.core.util; + +import android.content.Context; + +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.storage.DBWriter; + +import java.util.Comparator; + +/** + * Provides method for sorting the queue according to rules. + */ +public class QueueSorter { + public enum Rule { + ALPHA_ASC, + ALPHA_DESC, + DATE_ASC, + DATE_DESC, + DURATION_ASC, + DURATION_DESC + } + + public static void sort(final Context context, final Rule rule, final boolean broadcastUpdate) { + Comparator comparator = null; + + switch (rule) { + case ALPHA_ASC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f1.getTitle().compareTo(f2.getTitle()); + } + }; + break; + case ALPHA_DESC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f2.getTitle().compareTo(f1.getTitle()); + } + }; + break; + case DATE_ASC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f1.getPubDate().compareTo(f2.getPubDate()); + } + }; + break; + case DATE_DESC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + return f2.getPubDate().compareTo(f1.getPubDate()); + } + }; + break; + case DURATION_ASC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + FeedMedia f1Media = f1.getMedia(); + FeedMedia f2Media = f2.getMedia(); + int duration1 = f1Media != null ? f1Media.getDuration() : -1; + int duration2 = f2Media != null ? f2Media.getDuration() : -1; + + if (duration1 == -1 || duration2 == -1) + return duration2 - duration1; + else + return duration1 - duration2; + } + }; + break; + case DURATION_DESC: + comparator = new Comparator() { + public int compare(FeedItem f1, FeedItem f2) { + FeedMedia f1Media = f1.getMedia(); + FeedMedia f2Media = f2.getMedia(); + int duration1 = f1Media != null ? f1Media.getDuration() : -1; + int duration2 = f2Media != null ? f2Media.getDuration() : -1; + + return -1 * (duration1 - duration2); + } + }; + default: + } + + if (comparator != null) { + DBWriter.sort(context, comparator, broadcastUpdate); + } + } +} diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index d76cc533b..b68013674 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -160,8 +160,11 @@ Move to top Move to bottom Sort - ascending date - descending date + Alphabetically + Date + Duration + Ascending + Descending Flattr sign-in -- cgit v1.2.3