diff options
author | damoasda <46045854+damoasda@users.noreply.github.com> | 2019-08-10 21:25:59 +0200 |
---|---|---|
committer | damoasda <46045854+damoasda@users.noreply.github.com> | 2019-08-10 21:25:59 +0200 |
commit | be676c6faa4ec22650ef3d0bf614a8a0e09d4a77 (patch) | |
tree | 6595d55b44f6d93d9e047f4381d57590d9d85db5 | |
parent | db2661fb3ffa013e4663a788f0af4f4d6ecddda7 (diff) | |
download | AntennaPod-be676c6faa4ec22650ef3d0bf614a8a0e09d4a77.zip |
Queue: Keep sorted #1556
11 files changed, 108 insertions, 84 deletions
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 4947d5a87..4b926200d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -276,12 +276,22 @@ public class QueueFragment extends Fragment { MenuItemUtils.refreshLockItem(getActivity(), menu); - // Show Lock Item and Sort Item only if queue is sorted manually - boolean sortedManually = UserPreferences.isQueueSortedManually(); + // Show Lock Item only if queue is sorted manually + boolean sortedAutomatically = UserPreferences.isQueueSortedAutomatically(); MenuItem lockItem = menu.findItem(R.id.queue_lock); - lockItem.setVisible(sortedManually); - MenuItem sortItem = menu.findItem(R.id.queue_sort); - sortItem.setVisible(sortedManually); + lockItem.setVisible(!sortedAutomatically); + + // Set keep sorted checkbox + MenuItem sortedAutomaticallyItem = menu.findItem(R.id.queue_sort_automatically); + sortedAutomaticallyItem.setChecked(sortedAutomatically); + + // Hide sort menu items for sort orders that are not supported by automatic sort. + MenuItem sortRandomItem = menu.findItem(R.id.queue_sort_random); + sortRandomItem.setVisible(!sortedAutomatically); + MenuItem sortSmart1Item = menu.findItem(R.id.queue_sort_smart_shuffle_asc); + sortSmart1Item.setVisible(!sortedAutomatically); + MenuItem sortSmart2Item = menu.findItem(R.id.queue_sort_smart_shuffle_desc); + sortSmart2Item.setVisible(!sortedAutomatically); isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } @@ -331,38 +341,52 @@ public class QueueFragment extends Fragment { ((MainActivity) requireActivity()) .loadChildFragment( EpisodesApplyActionFragment.newInstance(queue, ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE)); return true; + case R.id.queue_sort_automatically: + boolean sortedAutomaticallyOld = UserPreferences.isQueueSortedAutomatically(); + boolean sortedAutomaticallyNew = !sortedAutomaticallyOld; + if (sortedAutomaticallyNew) { + // We have to choose an initially sort order, let's sort by episode date + UserPreferences.QueueSortOrder sortOrder = UserPreferences.QueueSortOrder.DATE_NEW_OLD; + UserPreferences.setQueueSortOrder(sortOrder); + QueueSorter.sort(QueueSorter.queueSortOrder2Rule(sortOrder), true); + } else { + UserPreferences.setQueueSortOrder(UserPreferences.QueueSortOrder.MANUALLY); + } + // Update sort menu items visibility and state + getActivity().invalidateOptionsMenu(); + return true; case R.id.queue_sort_episode_title_asc: - QueueSorter.sort(QueueSorter.Rule.EPISODE_TITLE_ASC, true); + queueSortOrderChanged(QueueSorter.Rule.EPISODE_TITLE_ASC); return true; case R.id.queue_sort_episode_title_desc: - QueueSorter.sort(QueueSorter.Rule.EPISODE_TITLE_DESC, true); + queueSortOrderChanged(QueueSorter.Rule.EPISODE_TITLE_DESC); return true; case R.id.queue_sort_date_asc: - QueueSorter.sort(QueueSorter.Rule.DATE_ASC, true); + queueSortOrderChanged(QueueSorter.Rule.DATE_ASC); return true; case R.id.queue_sort_date_desc: - QueueSorter.sort(QueueSorter.Rule.DATE_DESC, true); + queueSortOrderChanged(QueueSorter.Rule.DATE_DESC); return true; case R.id.queue_sort_duration_asc: - QueueSorter.sort(QueueSorter.Rule.DURATION_ASC, true); + queueSortOrderChanged(QueueSorter.Rule.DURATION_ASC); return true; case R.id.queue_sort_duration_desc: - QueueSorter.sort(QueueSorter.Rule.DURATION_DESC, true); + queueSortOrderChanged(QueueSorter.Rule.DURATION_DESC); return true; case R.id.queue_sort_feed_title_asc: - QueueSorter.sort(QueueSorter.Rule.FEED_TITLE_ASC, true); + queueSortOrderChanged(QueueSorter.Rule.FEED_TITLE_ASC); return true; case R.id.queue_sort_feed_title_desc: - QueueSorter.sort(QueueSorter.Rule.FEED_TITLE_DESC, true); + queueSortOrderChanged(QueueSorter.Rule.FEED_TITLE_DESC); return true; case R.id.queue_sort_random: - QueueSorter.sort(QueueSorter.Rule.RANDOM, true); + queueSortOrderChanged(QueueSorter.Rule.RANDOM); return true; case R.id.queue_sort_smart_shuffle_asc: - QueueSorter.sort(QueueSorter.Rule.SMART_SHUFFLE_ASC, true); + queueSortOrderChanged(QueueSorter.Rule.SMART_SHUFFLE_ASC); return true; case R.id.queue_sort_smart_shuffle_desc: - QueueSorter.sort(QueueSorter.Rule.SMART_SHUFFLE_DESC, true); + queueSortOrderChanged(QueueSorter.Rule.SMART_SHUFFLE_DESC); return true; default: return false; @@ -372,6 +396,22 @@ public class QueueFragment extends Fragment { } } + /** + * Sorts the queue on user interaction. + * If the queue is sorted automatically, the new sort order is stored in the preferences. + * + * @param rule Sort rule. + */ + private void queueSortOrderChanged(QueueSorter.Rule rule) { + boolean sortedAutomatically = UserPreferences.isQueueSortedAutomatically(); + UserPreferences.QueueSortOrder sortOrder = QueueSorter.rule2QueueSortOrder(rule); + // remember sort order to keep queue sorted + if (sortedAutomatically && sortOrder != null) { + UserPreferences.setQueueSortOrder(sortOrder); + } + // Sort queue + QueueSorter.sort(rule, true); + } @Override public boolean onContextItemSelected(MenuItem item) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java index db852cee7..8c0e0295f 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java @@ -11,11 +11,7 @@ import android.widget.ListView; import android.widget.Toast; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.storage.DBWriter; -import de.danoeh.antennapod.core.util.Permutor; -import de.danoeh.antennapod.core.util.QueueSorter; import org.apache.commons.lang3.ArrayUtils; @@ -94,17 +90,6 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat { if (Build.VERSION.SDK_INT >= 26) { findPreference(UserPreferences.PREF_EXPANDED_NOTIFICATION).setVisible(false); } - - findPreference(UserPreferences.PREF_QUEUE_SORT_ORDER) - .setOnPreferenceChangeListener((preference, newValue) -> { - UserPreferences.QueueSortOrder newSortOrder = UserPreferences.parseQueueSortOrder((String) newValue); - if (newSortOrder != UserPreferences.QueueSortOrder.MANUALLY) { - QueueSorter.Rule sortRule = QueueSorter.queueSortOrder2Rule(newSortOrder); - Permutor<FeedItem> permutor = QueueSorter.getPermutor(sortRule); - DBWriter.reorderQueue(permutor, true); - } - return true; - }); } private void showDrawerPreferencesDialog() { diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java index 0c7622a47..5d6af35da 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java @@ -15,7 +15,6 @@ import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction.Action; import de.danoeh.antennapod.core.preferences.GpodnetPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; -import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.IntentUtils; @@ -68,17 +67,17 @@ public class FeedItemMenuHandler { } boolean hasMedia = selectedItem.getMedia() != null; boolean isPlaying = hasMedia && selectedItem.getState() == FeedItem.State.PLAYING; - boolean sortedManually = UserPreferences.isQueueSortedManually(); + boolean sortedAutomatically = UserPreferences.isQueueSortedAutomatically(); if (!isPlaying) { mi.setItemVisibility(R.id.skip_episode_item, false); } boolean isInQueue = selectedItem.isTagged(FeedItem.TAG_QUEUE); - if (queueAccess == null || queueAccess.size() == 0 || queueAccess.get(0) == selectedItem.getId() || !sortedManually) { + if (queueAccess == null || queueAccess.size() == 0 || queueAccess.get(0) == selectedItem.getId() || sortedAutomatically) { mi.setItemVisibility(R.id.move_to_top_item, false); } - if (queueAccess == null || queueAccess.size() == 0 || queueAccess.get(queueAccess.size()-1) == selectedItem.getId() || !sortedManually) { + if (queueAccess == null || queueAccess.size() == 0 || queueAccess.get(queueAccess.size()-1) == selectedItem.getId() || sortedAutomatically) { mi.setItemVisibility(R.id.move_to_bottom_item, false); } if (!isInQueue) { diff --git a/app/src/main/res/menu/queue.xml b/app/src/main/res/menu/queue.xml index 0f7729be1..99f0fd950 100644 --- a/app/src/main/res/menu/queue.xml +++ b/app/src/main/res/menu/queue.xml @@ -29,6 +29,11 @@ <menu> <item + android:id="@+id/queue_sort_automatically" + android:title="@string/sort_automatically" + android:checkable="true" /> + + <item android:id="@+id/queue_sort_date" android:title="@string/date"> diff --git a/app/src/main/res/xml/preferences_user_interface.xml b/app/src/main/res/xml/preferences_user_interface.xml index 455838048..1d970a5f7 100644 --- a/app/src/main/res/xml/preferences_user_interface.xml +++ b/app/src/main/res/xml/preferences_user_interface.xml @@ -32,14 +32,6 @@ android:summary="@string/pref_nav_drawer_feed_counter_sum" android:defaultValue="0" app:useStockLayout="true"/> - <ListPreference - android:entryValues="@array/nav_queue_sort_values" - android:entries="@array/nav_queue_sort_options" - android:title="@string/pref_queue_sort_title" - android:key="prefQueueSortOrder" - android:summary="@string/pref_queue_sort_sum" - android:defaultValue="MANUALLY" - app:useStockLayout="true"/> </PreferenceCategory> <PreferenceCategory android:title="@string/external_elements"> <SwitchPreference 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 9348ca807..2ce7f7835 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 @@ -493,7 +493,7 @@ public class UserPreferences { public static boolean isQueueLocked() { return prefs.getBoolean(PREF_QUEUE_LOCKED, false) - || !isQueueSortedManually(); + || isQueueSortedAutomatically(); } public static void setFastForwardSecs(int secs) { @@ -883,6 +883,12 @@ public class UserPreferences { return parseQueueSortOrder(sortOrderStr); } + public static void setQueueSortOrder(QueueSortOrder queueSortOrder) { + prefs.edit() + .putString(PREF_QUEUE_SORT_ORDER, queueSortOrder.name()) + .apply(); + } + public static QueueSortOrder parseQueueSortOrder(String value) { try { return QueueSortOrder.valueOf(value); @@ -892,8 +898,8 @@ public class UserPreferences { } } - public static boolean isQueueSortedManually() { + public static boolean isQueueSortedAutomatically() { QueueSortOrder sortedOrder = getQueueSortOrder(); - return sortedOrder == QueueSortOrder.MANUALLY; + 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 2de811788..78812c234 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 @@ -410,7 +410,7 @@ public class DBWriter { * @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()) { + if (!UserPreferences.isQueueSortedAutomatically()) { // automatic sort order is disabled, don't change anything return; } 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 8bc377ffa..56402f940 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 @@ -150,6 +150,38 @@ public class QueueSorter { } /** + * Converts a Rule value to its corresponding QueueSortOrder value. + * + * @param rule Rule value. + * @return QueueSortOrder value corresponding to the given Rule value. <code>null</code> if the Rule value is unsupported or <code>null</code>. + */ + public static UserPreferences.QueueSortOrder rule2QueueSortOrder(Rule rule) { + if (rule == null) { + return null; + } + switch (rule) { + case EPISODE_TITLE_ASC: + return UserPreferences.QueueSortOrder.EPISODE_TITLE_A_Z; + case EPISODE_TITLE_DESC: + return UserPreferences.QueueSortOrder.EPISODE_TITLE_Z_A; + case DATE_ASC: + return UserPreferences.QueueSortOrder.DATE_OLD_NEW; + case DATE_DESC: + return UserPreferences.QueueSortOrder.DATE_NEW_OLD; + case DURATION_ASC: + return UserPreferences.QueueSortOrder.DURATION_SHORT_LONG; + case DURATION_DESC: + return UserPreferences.QueueSortOrder.DURATION_LONG_SHORT; + case FEED_TITLE_ASC: + return UserPreferences.QueueSortOrder.FEED_TITLE_A_Z; + case FEED_TITLE_DESC: + return UserPreferences.QueueSortOrder.FEED_TITLE_Z_A; + default: + return null; + } + } + + /** * Implements a reordering by pubdate that avoids consecutive episodes from the same feed in * the queue. * diff --git a/core/src/main/res/values-de/strings.xml b/core/src/main/res/values-de/strings.xml index a5ceaab57..449d8b283 100644 --- a/core/src/main/res/values-de/strings.xml +++ b/core/src/main/res/values-de/strings.xml @@ -276,6 +276,7 @@ <string name="move_to_top_label">Zum Anfang verschieben</string> <string name="move_to_bottom_label">Zum Ende verschieben</string> <string name="sort">Sortieren</string> + <string name="sort_automatically">Automatisch sortieren</string> <string name="date">Datum</string> <string name="duration">Dauer</string> <string name="episode_title">Episodentitel</string> @@ -416,8 +417,6 @@ <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> @@ -690,11 +689,6 @@ <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 d5df4f646..39d1c0a94 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -187,29 +187,6 @@ <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 9d64cf549..b32bd60df 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -294,6 +294,7 @@ <string name="move_to_top_label">Move to top</string> <string name="move_to_bottom_label">Move to bottom</string> <string name="sort">Sort</string> + <string name="sort_automatically">Keep sorted</string> <string name="date">Date</string> <string name="duration">Duration</string> <string name="episode_title">Episode title</string> @@ -401,8 +402,6 @@ <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> @@ -697,11 +696,6 @@ <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> |