diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/ItemSortDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/ItemSortDialog.java index bb68477df..91ebc8481 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/ItemSortDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/ItemSortDialog.java @@ -32,7 +32,7 @@ public class ItemSortDialog extends BottomSheetDialogFragment { return viewBinding.getRoot(); } - private void populateList() { + protected void populateList() { viewBinding.gridLayout.removeAllViews(); onAddItem(R.string.episode_title, SortOrder.EPISODE_TITLE_A_Z, SortOrder.EPISODE_TITLE_Z_A, true); onAddItem(R.string.feed_title, SortOrder.FEED_TITLE_A_Z, SortOrder.FEED_TITLE_Z_A, true); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/SingleFeedSortDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/SingleFeedSortDialog.java index d9766bbfa..20cb22203 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/SingleFeedSortDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/SingleFeedSortDialog.java @@ -2,6 +2,10 @@ package de.danoeh.antennapod.ui.screen.feed; import android.os.Bundle; import androidx.annotation.Nullable; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.databinding.SortDialogItemActiveBinding; +import de.danoeh.antennapod.databinding.SortDialogItemBinding; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.database.DBWriter; @@ -16,7 +20,7 @@ public class SingleFeedSortDialog extends ItemSortDialog { bundle.putLong(ARG_FEED_ID, feed.getId()); bundle.putBoolean(ARG_FEED_IS_LOCAL, feed.isLocalFeed()); if (feed.getSortOrder() == null) { - bundle.putString(ARG_SORT_ORDER, String.valueOf(SortOrder.DATE_NEW_OLD.code)); + bundle.putString(ARG_SORT_ORDER, String.valueOf(SortOrder.GLOBAL_DEFAULT.code)); } else { bundle.putString(ARG_SORT_ORDER, String.valueOf(feed.getSortOrder().code)); } @@ -25,6 +29,27 @@ public class SingleFeedSortDialog extends ItemSortDialog { return dialog; } + @Override + protected void populateList() { + super.populateList(); + if (sortOrder == SortOrder.GLOBAL_DEFAULT) { + SortDialogItemActiveBinding item = SortDialogItemActiveBinding.inflate( + getLayoutInflater(), viewBinding.gridLayout, false); + item.button.setText(R.string.global_default); + viewBinding.gridLayout.addView(item.getRoot()); + } else { + SortDialogItemBinding item = SortDialogItemBinding.inflate( + getLayoutInflater(), viewBinding.gridLayout, false); + item.button.setText(R.string.global_default); + item.button.setOnClickListener(v -> { + sortOrder = SortOrder.GLOBAL_DEFAULT; + populateList(); + onSelectionChanged(); + }); + viewBinding.gridLayout.addView(item.getRoot()); + } + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/UserInterfacePreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/UserInterfacePreferencesFragment.java index 01f6587d4..6cbd0b2ae 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/UserInterfacePreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/UserInterfacePreferencesFragment.java @@ -18,6 +18,8 @@ import de.danoeh.antennapod.storage.preferences.UsageStatistics; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.ui.preferences.screen.AnimatedPreferenceFragment; import de.danoeh.antennapod.ui.screen.drawer.DrawerPreferencesDialog; +import de.danoeh.antennapod.ui.screen.subscriptions.EpisodeListGlobalDefaultSortDialog; + import org.greenrobot.eventbus.EventBus; import java.util.List; @@ -70,6 +72,12 @@ public class UserInterfacePreferencesFragment extends AnimatedPreferenceFragment showFullNotificationButtonsDialog(); return true; }); + findPreference(UserPreferences.PREF_GLOBAL_DEFAULT_SORTED_ORDER) + .setOnPreferenceClickListener((preference -> { + EpisodeListGlobalDefaultSortDialog dialog = EpisodeListGlobalDefaultSortDialog.newInstance(); + dialog.show(getChildFragmentManager(), "SortDialog"); + return true; + })); findPreference(PREF_SWIPE) .setOnPreferenceClickListener(preference -> { ((PreferenceActivity) getActivity()).openScreen(R.xml.preferences_swipe); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/EpisodeListGlobalDefaultSortDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/EpisodeListGlobalDefaultSortDialog.java new file mode 100644 index 000000000..026a3cf3f --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/EpisodeListGlobalDefaultSortDialog.java @@ -0,0 +1,37 @@ +package de.danoeh.antennapod.ui.screen.subscriptions; + +import android.os.Bundle; +import androidx.annotation.Nullable; + +import de.danoeh.antennapod.model.feed.SortOrder; +import de.danoeh.antennapod.storage.preferences.UserPreferences; +import de.danoeh.antennapod.ui.screen.feed.ItemSortDialog; + +public class EpisodeListGlobalDefaultSortDialog extends ItemSortDialog { + public static EpisodeListGlobalDefaultSortDialog newInstance() { + Bundle bundle = new Bundle(); + EpisodeListGlobalDefaultSortDialog dialog = new EpisodeListGlobalDefaultSortDialog(); + dialog.setArguments(bundle); + return dialog; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + sortOrder = SortOrder.fromCodeString(String.valueOf(UserPreferences.getPrefGlobalSortedOrder().code)); + } + + @Override + protected void onAddItem(int title, SortOrder ascending, SortOrder descending, boolean ascendingIsDefault) { + if (ascending == SortOrder.DATE_OLD_NEW || ascending == SortOrder.DURATION_SHORT_LONG + || ascending == SortOrder.EPISODE_TITLE_A_Z) { + super.onAddItem(title, ascending, descending, ascendingIsDefault); + } + } + + @Override + protected void onSelectionChanged() { + super.onSelectionChanged(); + UserPreferences.setPrefGlobalSortedOrder(sortOrder); + } +} diff --git a/model/src/main/java/de/danoeh/antennapod/model/feed/SortOrder.java b/model/src/main/java/de/danoeh/antennapod/model/feed/SortOrder.java index fc2a4623b..7c74a9823 100644 --- a/model/src/main/java/de/danoeh/antennapod/model/feed/SortOrder.java +++ b/model/src/main/java/de/danoeh/antennapod/model/feed/SortOrder.java @@ -22,6 +22,7 @@ public enum SortOrder { EPISODE_FILENAME_Z_A(8, INTRA_FEED), SIZE_SMALL_LARGE(9, INTRA_FEED), SIZE_LARGE_SMALL(10, INTRA_FEED), + GLOBAL_DEFAULT(11, INTRA_FEED), FEED_TITLE_A_Z(101, INTER_FEED), FEED_TITLE_Z_A(102, INTER_FEED), RANDOM(103, INTER_FEED), diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/FeedItemPermutors.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/FeedItemPermutors.java index 7955ebbbb..d3b3a6eed 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/FeedItemPermutors.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/FeedItemPermutors.java @@ -15,6 +15,7 @@ import java.util.Map; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.SortOrder; +import de.danoeh.antennapod.storage.preferences.UserPreferences; /** * Provides method for sorting the a list of {@link FeedItem} according to rules. @@ -32,6 +33,10 @@ public class FeedItemPermutors { Comparator comparator = null; Permutor permutor = null; + if (SortOrder.GLOBAL_DEFAULT.equals(sortOrder)) { + sortOrder = UserPreferences.getPrefGlobalSortedOrder(); + } + switch (sortOrder) { case EPISODE_TITLE_A_Z: comparator = (f1, f2) -> itemTitle(f1).compareTo(itemTitle(f2)); diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java index c37d9aa7e..4ec47ddcb 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java @@ -54,7 +54,7 @@ public class PodDBAdapter { private static final String TAG = "PodDBAdapter"; public static final String DATABASE_NAME = "Antennapod.db"; - public static final int VERSION = 3080000; + public static final int VERSION = 3110000; /** * Maximum number of arguments for IN-operator. diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java index 96a3a509f..eccaaa78d 100644 --- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java +++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/mapper/FeedItemSortQuery.java @@ -2,11 +2,12 @@ package de.danoeh.antennapod.storage.database.mapper; import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.storage.database.PodDBAdapter; +import de.danoeh.antennapod.storage.preferences.UserPreferences; public class FeedItemSortQuery { public static String generateFrom(SortOrder sortOrder) { - if (sortOrder == null) { - sortOrder = SortOrder.DATE_NEW_OLD; + if (sortOrder == null || SortOrder.GLOBAL_DEFAULT.equals(sortOrder)) { + sortOrder = UserPreferences.getPrefGlobalSortedOrder(); } switch (sortOrder) { case EPISODE_TITLE_A_Z: diff --git a/storage/database/src/test/java/de/danoeh/antennapod/storage/database/FeedItemPermutorsTest.java b/storage/database/src/test/java/de/danoeh/antennapod/storage/database/FeedItemPermutorsTest.java index 48a5a62de..f75e4e189 100644 --- a/storage/database/src/test/java/de/danoeh/antennapod/storage/database/FeedItemPermutorsTest.java +++ b/storage/database/src/test/java/de/danoeh/antennapod/storage/database/FeedItemPermutorsTest.java @@ -1,7 +1,11 @@ package de.danoeh.antennapod.storage.database; +import android.content.Context; +import androidx.test.platform.app.InstrumentationRegistry; import de.danoeh.antennapod.model.feed.SortOrder; import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; import java.util.ArrayList; import java.util.Calendar; @@ -10,6 +14,7 @@ import java.util.List; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; import de.danoeh.antennapod.model.feed.FeedMedia; +import de.danoeh.antennapod.storage.preferences.UserPreferences; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -17,10 +22,13 @@ import static org.junit.Assert.assertTrue; /** * Test class for FeedItemPermutors. */ +@RunWith(RobolectricTestRunner.class) public class FeedItemPermutorsTest { @Test public void testEnsureNonNullPermutors() { + final Context context = InstrumentationRegistry.getInstrumentation().getContext(); + UserPreferences.init(context); for (SortOrder sortOrder : SortOrder.values()) { assertNotNull("The permutor for SortOrder " + sortOrder + " is unexpectedly null", FeedItemPermutors.getPermutor(sortOrder)); diff --git a/storage/database/src/test/java/de/danoeh/antennapod/storage/database/NonSubscribedFeedsCleanerTest.java b/storage/database/src/test/java/de/danoeh/antennapod/storage/database/NonSubscribedFeedsCleanerTest.java index a53a26c9b..48c28782a 100644 --- a/storage/database/src/test/java/de/danoeh/antennapod/storage/database/NonSubscribedFeedsCleanerTest.java +++ b/storage/database/src/test/java/de/danoeh/antennapod/storage/database/NonSubscribedFeedsCleanerTest.java @@ -8,6 +8,8 @@ import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterface; import de.danoeh.antennapod.net.download.serviceinterface.DownloadServiceInterfaceStub; import de.danoeh.antennapod.storage.preferences.PlaybackPreferences; +import de.danoeh.antennapod.storage.preferences.UserPreferences; + import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -121,6 +123,7 @@ public class NonSubscribedFeedsCleanerTest { // Initialize database PlaybackPreferences.init(context); + UserPreferences.init(context); DownloadServiceInterface.setImpl(new DownloadServiceInterfaceStub()); PodDBAdapter.init(context); PodDBAdapter.deleteDatabase(); diff --git a/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java b/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java index 412a23697..c37de7a9d 100644 --- a/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java +++ b/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java @@ -63,6 +63,7 @@ public abstract class UserPreferences { public static final String PREF_BACK_OPENS_DRAWER = "prefBackButtonOpensDrawer"; public static final String PREF_BOTTOM_NAVIGATION = "prefBottomNavigation"; + public static final String PREF_GLOBAL_DEFAULT_SORTED_ORDER = "prefGlobalDefaultSortedOrder"; public static final String PREF_QUEUE_KEEP_SORTED = "prefQueueKeepSorted"; public static final String PREF_QUEUE_KEEP_SORTED_ORDER = "prefQueueKeepSortedOrder"; public static final String PREF_NEW_EPISODES_ACTION = "prefNewEpisodesAction"; @@ -224,7 +225,7 @@ public abstract class UserPreferences { public static List getFullNotificationButtons() { String[] buttons = TextUtils.split( - prefs.getString(PREF_FULL_NOTIFICATION_BUTTONS, + prefs.getString(PREF_FULL_NOTIFICATION_BUTTONS, NOTIFICATION_BUTTON_SKIP + "," + NOTIFICATION_BUTTON_PLAYBACK_SPEED), ","); List notificationButtons = new ArrayList<>(); @@ -863,6 +864,15 @@ public abstract class UserPreferences { prefs.edit().putBoolean(PREF_SUBSCRIPTION_TITLE, show).apply(); } + public static void setPrefGlobalSortedOrder(SortOrder sortOrder) { + prefs.edit().putString(PREF_GLOBAL_DEFAULT_SORTED_ORDER, "" + sortOrder.code).apply(); + } + + public static SortOrder getPrefGlobalSortedOrder() { + return SortOrder.fromCodeString(prefs.getString(PREF_GLOBAL_DEFAULT_SORTED_ORDER, + "" + SortOrder.DATE_NEW_OLD.code)); + } + public static void setAllEpisodesSortOrder(SortOrder s) { prefs.edit().putString(PREF_SORT_ALL_EPISODES, "" + s.code).apply(); } diff --git a/ui/i18n/src/main/res/values/strings.xml b/ui/i18n/src/main/res/values/strings.xml index e27659c8f..5be76a679 100644 --- a/ui/i18n/src/main/res/values/strings.xml +++ b/ui/i18n/src/main/res/values/strings.xml @@ -588,6 +588,8 @@ New episodes action Action to take for new episodes Episode information + Default sort order + Choose the default order for episodes on the podcast screen Report bug diff --git a/ui/preferences/src/main/res/xml/preferences_user_interface.xml b/ui/preferences/src/main/res/xml/preferences_user_interface.xml index c5752ca11..e4c3f9572 100644 --- a/ui/preferences/src/main/res/xml/preferences_user_interface.xml +++ b/ui/preferences/src/main/res/xml/preferences_user_interface.xml @@ -78,6 +78,10 @@ android:defaultValue="false"/> +