summaryrefslogtreecommitdiff
path: root/core/src/main/java
diff options
context:
space:
mode:
authordamoasda <46045854+damoasda@users.noreply.github.com>2019-08-11 11:08:19 +0200
committerdamoasda <46045854+damoasda@users.noreply.github.com>2019-08-11 11:08:19 +0200
commitfe9f0c8e7e65ba66590780d2344658112692c816 (patch)
tree83eab9fcec4973cf8935a7feab1d6af2f8355638 /core/src/main/java
parent906142cbf3fd67c3ed27b585ed30db68d6ed5ba9 (diff)
downloadAntennaPod-fe9f0c8e7e65ba66590780d2344658112692c816.zip
Changes due to feedback in pull request #3315
Diffstat (limited to 'core/src/main/java')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java66
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java16
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/QueueSorter.java118
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/SortOrder.java18
4 files changed, 91 insertions, 127 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 2ce7f7835..b85518840 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
@@ -27,6 +27,7 @@ import de.danoeh.antennapod.core.storage.APNullCleanupAlgorithm;
import de.danoeh.antennapod.core.storage.APQueueCleanupAlgorithm;
import de.danoeh.antennapod.core.storage.EpisodeCleanupAlgorithm;
import de.danoeh.antennapod.core.util.Converter;
+import de.danoeh.antennapod.core.util.SortOrder;
import de.danoeh.antennapod.core.util.download.AutoUpdateManager;
/**
@@ -54,10 +55,11 @@ 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";
+ public static final String PREF_QUEUE_KEEP_SORTED = "prefQueueKeepSorted";
+ public static final String PREF_QUEUE_KEEP_SORTED_ORDER = "prefQueueKeepSortedOrder";
// Playback
public static final String PREF_PAUSE_ON_HEADSET_DISCONNECT = "prefPauseOnHeadsetDisconnect";
@@ -493,7 +495,7 @@ public class UserPreferences {
public static boolean isQueueLocked() {
return prefs.getBoolean(PREF_QUEUE_LOCKED, false)
- || isQueueSortedAutomatically();
+ || isQueueKeepSorted();
}
public static void setFastForwardSecs(int secs) {
@@ -870,36 +872,60 @@ public class UserPreferences {
}
/**
- * Supported episode queue sort orders.
- * Use enum instead of integer to avoid mistakes at later maintenance changes.
+ * Returns if the queue is in keep sorted mode.
+ *
+ * @see #getQueueKeepSortedOrder()
*/
- 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 boolean isQueueKeepSorted() {
+ return prefs.getBoolean(PREF_QUEUE_KEEP_SORTED, false);
}
- public static QueueSortOrder getQueueSortOrder() {
- String sortOrderStr = prefs.getString(PREF_QUEUE_SORT_ORDER, "default");
- return parseQueueSortOrder(sortOrderStr);
+ /**
+ * Enables/disables the keep sorted mode of the queue.
+ *
+ * @see #setQueueKeepSortedOrder(SortOrder)
+ */
+ public static void setQueueKeepSorted(boolean keepSorted) {
+ prefs.edit()
+ .putBoolean(PREF_QUEUE_KEEP_SORTED, keepSorted)
+ .apply();
}
- public static void setQueueSortOrder(QueueSortOrder queueSortOrder) {
+ /**
+ * Returns the sort order for the queue keep sorted mode.
+ * Note: This value is stored independently from the keep sorted state.
+ *
+ * @see #isQueueKeepSorted()
+ */
+ public static SortOrder getQueueKeepSortedOrder() {
+ String sortOrderStr = prefs.getString(PREF_QUEUE_KEEP_SORTED_ORDER, "use-default");
+ return parseSortOrder(sortOrderStr);
+ }
+
+ /**
+ * Sets the sort order for the queue keep sorted mode.
+ *
+ * @see #setQueueKeepSorted(boolean)
+ */
+ public static void setQueueKeepSortedOrder(SortOrder sortOrder) {
+ if (sortOrder == null) {
+ return;
+ }
prefs.edit()
- .putString(PREF_QUEUE_SORT_ORDER, queueSortOrder.name())
+ .putString(PREF_QUEUE_KEEP_SORTED_ORDER, sortOrder.name())
.apply();
}
- public static QueueSortOrder parseQueueSortOrder(String value) {
+ /**
+ * Converts the string representation to its enum value. If the string value is unknown,
+ * a default value is retuned.
+ */
+ private static SortOrder parseSortOrder(String value) {
try {
- return QueueSortOrder.valueOf(value);
+ return SortOrder.valueOf(value);
} catch (IllegalArgumentException e) {
// default value
- return QueueSortOrder.MANUALLY;
+ return SortOrder.DATE_NEW_OLD;
}
}
-
- public static boolean isQueueSortedAutomatically() {
- 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 78812c234..b19bcfd1f 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
@@ -11,11 +11,8 @@ import android.util.Log;
import org.greenrobot.eventbus.EventBus;
import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Set;
@@ -45,6 +42,7 @@ 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;
+import de.danoeh.antennapod.core.util.SortOrder;
/**
* Provides methods for writing data to AntennaPod's database.
@@ -404,21 +402,21 @@ public class DBWriter {
}
/**
- * Sorts the queue depending on the configured sort order. If manual order is configured, the queue is not modified.
+ * Sorts the queue depending on the configured sort order.
+ * If the queue is not in keep sorted mode, nothing happens.
*
* @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.isQueueSortedAutomatically()) {
- // automatic sort order is disabled, don't change anything
+ if (!UserPreferences.isQueueKeepSorted()) {
+ // queue is not in keep sorted mode, there's nothing to do
return;
}
// Sort queue by configured sort order
- UserPreferences.QueueSortOrder sortOrder = UserPreferences.getQueueSortOrder();
- QueueSorter.Rule sortRule = QueueSorter.queueSortOrder2Rule(sortOrder);
- Permutor<FeedItem> permutor = QueueSorter.getPermutor(sortRule);
+ SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder();
+ Permutor<FeedItem> permutor = QueueSorter.getPermutor(sortOrder);
permutor.reorder(queue);
// Replace ADDED events by a single SORTED event
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 56402f940..37172d042 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
@@ -9,68 +9,54 @@ 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;
/**
* Provides method for sorting the queue according to rules.
*/
public class QueueSorter {
- public enum Rule {
- EPISODE_TITLE_ASC,
- EPISODE_TITLE_DESC,
- DATE_ASC,
- DATE_DESC,
- DURATION_ASC,
- DURATION_DESC,
- FEED_TITLE_ASC,
- FEED_TITLE_DESC,
- RANDOM,
- SMART_SHUFFLE_ASC,
- SMART_SHUFFLE_DESC
- }
/**
- * Sorts the queue by the given rule and sends a broadcast update.
+ * Sorts the queue by the given sort order and sends a broadcast update.
*
- * @param rule Sort rule.
+ * @param sortOrder Sort order.
* @param broadcastUpdate Send broadcast update?
*/
- public static void sort(Rule rule, boolean broadcastUpdate) {
- Permutor<FeedItem> permutor = getPermutor(rule);
+ public static void sort(SortOrder sortOrder, boolean broadcastUpdate) {
+ Permutor<FeedItem> permutor = getPermutor(sortOrder);
if (permutor != null) {
DBWriter.reorderQueue(permutor, broadcastUpdate);
}
}
/**
- * Returns a Permutor that sorts a list appropriate to the given sort rule.
+ * Returns a Permutor that sorts a list appropriate to the given sort order.
*
- * @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>.
+ * @param sortOrder Sort order.
+ * @return Permutor that sorts a list appropriate to the given sort order. <code>null</code> if the order is unknown or <code>null</code>.
*/
- public static Permutor<FeedItem> getPermutor(Rule rule) {
- if (rule == null) {
+ public static Permutor<FeedItem> getPermutor(SortOrder sortOrder) {
+ if (sortOrder == null) {
return null;
}
Comparator<FeedItem> comparator = null;
Permutor<FeedItem> permutor = null;
- switch (rule) {
- case EPISODE_TITLE_ASC:
+ switch (sortOrder) {
+ case EPISODE_TITLE_A_Z:
comparator = (f1, f2) -> f1.getTitle().compareTo(f2.getTitle());
break;
- case EPISODE_TITLE_DESC:
+ case EPISODE_TITLE_Z_A:
comparator = (f1, f2) -> f2.getTitle().compareTo(f1.getTitle());
break;
- case DATE_ASC:
+ case DATE_OLD_NEW:
comparator = (f1, f2) -> f1.getPubDate().compareTo(f2.getPubDate());
break;
- case DATE_DESC:
+ case DATE_NEW_OLD:
comparator = (f1, f2) -> f2.getPubDate().compareTo(f1.getPubDate());
break;
- case DURATION_ASC:
+ case DURATION_SHORT_LONG:
comparator = (f1, f2) -> {
FeedMedia f1Media = f1.getMedia();
FeedMedia f2Media = f2.getMedia();
@@ -83,7 +69,7 @@ public class QueueSorter {
return duration1 - duration2;
};
break;
- case DURATION_DESC:
+ case DURATION_LONG_SHORT:
comparator = (f1, f2) -> {
FeedMedia f1Media = f1.getMedia();
FeedMedia f2Media = f2.getMedia();
@@ -93,19 +79,19 @@ public class QueueSorter {
return -1 * (duration1 - duration2);
};
break;
- case FEED_TITLE_ASC:
+ case FEED_TITLE_A_Z:
comparator = (f1, f2) -> f1.getFeed().getTitle().compareTo(f2.getFeed().getTitle());
break;
- case FEED_TITLE_DESC:
+ case FEED_TITLE_Z_A:
comparator = (f1, f2) -> f2.getFeed().getTitle().compareTo(f1.getFeed().getTitle());
break;
case RANDOM:
permutor = Collections::shuffle;
break;
- case SMART_SHUFFLE_ASC:
+ case SMART_SHUFFLE_OLD_NEW:
permutor = (queue) -> smartShuffle(queue, true);
break;
- case SMART_SHUFFLE_DESC:
+ case SMART_SHUFFLE_NEW_OLD:
permutor = (queue) -> smartShuffle(queue, false);
break;
}
@@ -118,70 +104,6 @@ public class QueueSorter {
}
/**
- * 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;
- }
- }
-
- /**
- * 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/java/de/danoeh/antennapod/core/util/SortOrder.java b/core/src/main/java/de/danoeh/antennapod/core/util/SortOrder.java
new file mode 100644
index 000000000..6c67262db
--- /dev/null
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/SortOrder.java
@@ -0,0 +1,18 @@
+package de.danoeh.antennapod.core.util;
+
+/**
+ * Provides sort orders to sort a list of episodes.
+ */
+public enum SortOrder {
+ EPISODE_TITLE_A_Z,
+ EPISODE_TITLE_Z_A,
+ DATE_OLD_NEW,
+ DATE_NEW_OLD,
+ DURATION_SHORT_LONG,
+ DURATION_LONG_SHORT,
+ FEED_TITLE_A_Z,
+ FEED_TITLE_Z_A,
+ RANDOM,
+ SMART_SHUFFLE_OLD_NEW,
+ SMART_SHUFFLE_NEW_OLD
+}