diff options
author | damoasda <46045854+damoasda@users.noreply.github.com> | 2019-08-10 16:51:05 +0200 |
---|---|---|
committer | damoasda <46045854+damoasda@users.noreply.github.com> | 2019-08-10 16:51:05 +0200 |
commit | db2661fb3ffa013e4663a788f0af4f4d6ecddda7 (patch) | |
tree | dddc3c27d77935fb7d45860c939f5b06720b0745 /core/src/main | |
parent | f10c11bcfea1fcc4c93941a472afc54e0dd96957 (diff) | |
parent | 51f348caa3054189ad426f1ff7f43e5f2940dd99 (diff) | |
download | AntennaPod-db2661fb3ffa013e4663a788f0af4f4d6ecddda7.zip |
Bring in work done for first queue sort approach
Diffstat (limited to 'core/src/main')
6 files changed, 157 insertions, 33 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index 8f5f5ae1e..9348ca807 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -54,6 +54,7 @@ public class UserPreferences { private static final String PREF_SHOW_DOWNLOAD_REPORT = "prefShowDownloadReport"; public static final String PREF_BACK_BUTTON_BEHAVIOR = "prefBackButtonBehavior"; private static final String PREF_BACK_BUTTON_GO_TO_PAGE = "prefBackButtonGoToPage"; + public static final String PREF_QUEUE_SORT_ORDER = "prefQueueSortOrder"; // Queue private static final String PREF_QUEUE_ADD_TO_FRONT = "prefQueueAddToFront"; @@ -491,7 +492,8 @@ public class UserPreferences { } public static boolean isQueueLocked() { - return prefs.getBoolean(PREF_QUEUE_LOCKED, false); + return prefs.getBoolean(PREF_QUEUE_LOCKED, false) + || !isQueueSortedManually(); } public static void setFastForwardSecs(int secs) { @@ -866,4 +868,32 @@ public class UserPreferences { public static boolean timeRespectsSpeed() { return prefs.getBoolean(PREF_TIME_RESPECTS_SPEED, false); } + + /** + * Supported episode queue sort orders. + * Use enum instead of integer to avoid mistakes at later maintenance changes. + */ + public enum QueueSortOrder { + MANUALLY, DATE_NEW_OLD, DATE_OLD_NEW, DURATION_SHORT_LONG, DURATION_LONG_SHORT, + EPISODE_TITLE_A_Z, EPISODE_TITLE_Z_A, FEED_TITLE_A_Z, FEED_TITLE_Z_A + } + + public static QueueSortOrder getQueueSortOrder() { + String sortOrderStr = prefs.getString(PREF_QUEUE_SORT_ORDER, "default"); + return parseQueueSortOrder(sortOrderStr); + } + + public static QueueSortOrder parseQueueSortOrder(String value) { + try { + return QueueSortOrder.valueOf(value); + } catch (IllegalArgumentException e) { + // default value + return QueueSortOrder.MANUALLY; + } + } + + public static boolean isQueueSortedManually() { + QueueSortOrder sortedOrder = getQueueSortOrder(); + return sortedOrder == QueueSortOrder.MANUALLY; + } } 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 49fbdcbfd..2de811788 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 @@ -44,6 +44,7 @@ import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.Permutor; +import de.danoeh.antennapod.core.util.QueueSorter; /** * Provides methods for writing data to AntennaPod's database. @@ -383,6 +384,7 @@ public class DBWriter { } } if (queueModified) { + applySortOrder(queue, events); adapter.setQueue(queue); for (QueueEvent event : events) { EventBus.getDefault().post(event); @@ -402,6 +404,29 @@ public class DBWriter { } /** + * Sorts the queue depending on the configured sort order. If manual order is configured, the queue is not modified. + * + * @param queue The queue to be sorted. + * @param events Replaces the events by a single SORT event if the list has to be sorted automatically. + */ + private static void applySortOrder(List<FeedItem> queue, List<QueueEvent> events) { + if (UserPreferences.isQueueSortedManually()) { + // automatic sort order is disabled, don't change anything + return; + } + + // Sort queue by configured sort order + UserPreferences.QueueSortOrder sortOrder = UserPreferences.getQueueSortOrder(); + QueueSorter.Rule sortRule = QueueSorter.queueSortOrder2Rule(sortOrder); + Permutor<FeedItem> permutor = QueueSorter.getPermutor(sortRule); + permutor.reorder(queue); + + // Replace ADDED events by a single SORTED event + events.clear(); + events.add(QueueEvent.sorted(queue)); + } + + /** * Removes all FeedItem objects from the queue. * */ @@ -850,31 +875,8 @@ public class DBWriter { } /** - * Sort the FeedItems in the queue with the given Comparator. - * @param comparator FeedItem comparator - * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to - */ - public static Future<?> sortQueue(final Comparator<FeedItem> comparator, final boolean broadcastUpdate) { - return dbExec.submit(() -> { - final PodDBAdapter adapter = PodDBAdapter.getInstance(); - adapter.open(); - final List<FeedItem> queue = DBReader.getQueue(adapter); - - if (queue != null) { - Collections.sort(queue, comparator); - adapter.setQueue(queue); - if (broadcastUpdate) { - EventBus.getDefault().post(QueueEvent.sorted(queue)); - } - } else { - Log.e(TAG, "sortQueue: Could not load queue"); - } - adapter.close(); - }); - } - - /** - * Similar to sortQueue, but allows more complex reordering by providing whole-queue context. + * Sort the FeedItems in the queue with the given Permutor. + * * @param permutor Encapsulates whole-Queue reordering logic. * @param broadcastUpdate <code>true</code> if this operation should trigger a * QueueUpdateBroadcast. This option should be set to <code>false</code> 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 index 8680b2d2e..8bc377ffa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java @@ -1,7 +1,5 @@ package de.danoeh.antennapod.core.util; -import android.content.Context; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -11,6 +9,7 @@ import java.util.Map; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBWriter; /** @@ -31,7 +30,30 @@ public class QueueSorter { SMART_SHUFFLE_DESC } - public static void sort(final Context context, final Rule rule, final boolean broadcastUpdate) { + /** + * Sorts the queue by the given rule and sends a broadcast update. + * + * @param rule Sort rule. + * @param broadcastUpdate Send broadcast update? + */ + public static void sort(Rule rule, boolean broadcastUpdate) { + Permutor<FeedItem> permutor = getPermutor(rule); + if (permutor != null) { + DBWriter.reorderQueue(permutor, broadcastUpdate); + } + } + + /** + * Returns a Permutor that sorts a list appropriate to the given sort rule. + * + * @param rule Sort rule. + * @return Permutor that sorts a list appropriate to the given sort rule. <code>null</code> if the rule is unknown or <code>null</code>. + */ + public static Permutor<FeedItem> getPermutor(Rule rule) { + if (rule == null) { + return null; + } + Comparator<FeedItem> comparator = null; Permutor<FeedItem> permutor = null; @@ -86,13 +108,44 @@ public class QueueSorter { case SMART_SHUFFLE_DESC: permutor = (queue) -> smartShuffle(queue, false); break; - default: } if (comparator != null) { - DBWriter.sortQueue(comparator, broadcastUpdate); - } else if (permutor != null) { - DBWriter.reorderQueue(permutor, broadcastUpdate); + final Comparator<FeedItem> comparator2 = comparator; + permutor = (queue) -> Collections.sort(queue, comparator2); + } + return permutor; + } + + /** + * Converts a QueueSortOrder value to its corresponding Rule value. + * + * @param sortOrder Sort order. + * @return Rule value corresponding to the given sort order. <code>null</code> if the sort order is unknown or <code>null</code>. + */ + public static Rule queueSortOrder2Rule(UserPreferences.QueueSortOrder sortOrder) { + if (sortOrder == null) { + return null; + } + switch (sortOrder) { + case DATE_NEW_OLD: + return QueueSorter.Rule.DATE_DESC; + case DATE_OLD_NEW: + return QueueSorter.Rule.DATE_ASC; + case DURATION_SHORT_LONG: + return QueueSorter.Rule.DURATION_ASC; + case DURATION_LONG_SHORT: + return QueueSorter.Rule.DURATION_DESC; + case EPISODE_TITLE_A_Z: + return QueueSorter.Rule.EPISODE_TITLE_ASC; + case EPISODE_TITLE_Z_A: + return QueueSorter.Rule.EPISODE_TITLE_DESC; + case FEED_TITLE_A_Z: + return QueueSorter.Rule.FEED_TITLE_ASC; + case FEED_TITLE_Z_A: + return QueueSorter.Rule.FEED_TITLE_DESC; + default: + return null; } } diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml index a58885975..a5ceaab57 100644 --- a/core/src/main/res/values-de/strings.xml +++ b/core/src/main/res/values-de/strings.xml @@ -285,6 +285,8 @@ <string name="ascending">Aufsteigend</string> <string name="descending">Absteigend</string> <string name="clear_queue_confirmation_msg">Bitte bestätige, dass ALLE Episoden aus der Abspielliste entfernt werden sollen</string> + <string name="sort_new_to_old">Neu bis alt</string> + <string name="sort_old_to_new">Alt bis neu</string> <!--Flattr--> <string name="flattr_auth_label">Flattr Anmeldung</string> <string name="flattr_auth_explanation">Drücke den Button unten, um den Authentifizierungsprozess zu starten. Du wirst zur Flattr-Anmeldeseite weitergeleitet. Hier wirst du gefragt, AntennaPod die Erlaubnis zu geben, Dinge zu flattrn. Nachdem du die Erlaubnis erteilt hast, kehrst du automatisch zu diesem Bildschirm zurück.</string> @@ -414,6 +416,8 @@ <string name="pref_nav_drawer_feed_order_sum">Ändere die Reihenfolge deiner Abonnements</string> <string name="pref_nav_drawer_feed_counter_title">Abonnement-Zähler einstellen</string> <string name="pref_nav_drawer_feed_counter_sum">Ändere die durch den Abonnementszähler angezeigten Informationen. Betrifft auch die Sortierung der Abonnements wenn \"Reihenfolge der Abonnements\" auf \"Zähler\" gesetzt ist.</string> + <string name="pref_queue_sort_title">Sortierung der Abspielliste einstellen</string> + <string name="pref_queue_sort_sum">Ändere die Sortierreihenfolge der Episoden in der Abspielliste.</string> <string name="pref_set_theme_sum">Ändere das Aussehen von AntennaPod.</string> <string name="pref_automatic_download_title">Automatisches Herunterladen</string> <string name="pref_automatic_download_sum">Konfiguriere das automatische Herunterladen von Episoden.</string> @@ -686,6 +690,11 @@ <string name="sort_date_old_new">Datum (alt \u2192 neu)</string> <string name="sort_duration_short_long">Dauer (kurz \u2192 lang)</string> <string name="sort_duration_long_short">Dauer (lang \u2192 kurz)</string> + <string name="sort_episode_title_a_z">Episodentitel (A \u2192 Z)</string> + <string name="sort_episode_title_z_a">Episodentitel (Z \u2192 A)</string> + <string name="sort_feed_title_a_z">Podcasttitel (A \u2192 Z)</string> + <string name="sort_feed_title_z_a">Podcasttitel (Z \u2192 A)</string> + <string name="sort_manually">Manuell</string> <!--Rating dialog--> <string name="rating_title">Gefällt dir AntennaPod?</string> <string name="rating_message">Wir würden uns freuen, wenn du dir kurz die Zeit nimmst, AntennaPod zu bewerten.</string> diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 39d1c0a94..d5df4f646 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -187,6 +187,29 @@ <item>3</item> </string-array> + <string-array name="nav_queue_sort_options"> + <item>@string/sort_manually</item> + <item>@string/sort_date_new_old</item> + <item>@string/sort_date_old_new</item> + <item>@string/sort_duration_short_long</item> + <item>@string/sort_duration_long_short</item> + <item>@string/sort_episode_title_a_z</item> + <item>@string/sort_episode_title_z_a</item> + <item>@string/sort_feed_title_a_z</item> + <item>@string/sort_feed_title_z_a</item> + </string-array> + <string-array name="nav_queue_sort_values"> + <item>MANUALLY</item> + <item>DATE_NEW_OLD</item> + <item>DATE_OLD_NEW</item> + <item>DURATION_SHORT_LONG</item> + <item>DURATION_LONG_SHORT</item> + <item>EPISODE_TITLE_A_Z</item> + <item>EPISODE_TITLE_Z_A</item> + <item>FEED_TITLE_A_Z</item> + <item>FEED_TITLE_Z_A</item> + </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> diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 6025dc888..9d64cf549 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -401,6 +401,8 @@ <string name="pref_nav_drawer_feed_order_sum">Change the order of your subscriptions</string> <string name="pref_nav_drawer_feed_counter_title">Set Subscription Counter</string> <string name="pref_nav_drawer_feed_counter_sum">Change the information displayed by the subscription counter. Also affects the sorting of subscriptions if \'Subscription Order\' is set to \'Counter\'.</string> + <string name="pref_queue_sort_title">Set Queue Sort Order</string> + <string name="pref_queue_sort_sum">Change the sort order of the episodes in the queue.</string> <string name="pref_set_theme_sum">Change the appearance of AntennaPod.</string> <string name="pref_automatic_download_title">Automatic Download</string> <string name="pref_automatic_download_sum">Configure the automatic download of episodes.</string> @@ -695,6 +697,11 @@ <string name="sort_date_old_new">Date (Old \u2192 New)</string> <string name="sort_duration_short_long">Duration (Short \u2192 Long)</string> <string name="sort_duration_long_short">Duration (Long \u2192 Short)</string> + <string name="sort_episode_title_a_z">Episode title (A \u2192 Z)</string> + <string name="sort_episode_title_z_a">Episode title (Z \u2192 A)</string> + <string name="sort_feed_title_a_z">Podcast title (A \u2192 Z)</string> + <string name="sort_feed_title_z_a">Podcast title (Z \u2192 A)</string> + <string name="sort_manually">Manually</string> <!-- Rating dialog --> <string name="rating_title">Like AntennaPod?</string> |