Add default sort for episode list (#7972)

This commit is contained in:
tmatale
2025-12-05 16:19:27 -05:00
committed by GitHub
parent d7f279b7b3
commit eb4cc10c45
13 changed files with 110 additions and 6 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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),

View File

@ -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<FeedItem> comparator = null;
Permutor<FeedItem> 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));

View File

@ -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.

View File

@ -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:

View File

@ -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));

View File

@ -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();

View File

@ -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<Integer> 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<Integer> 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();
}

View File

@ -588,6 +588,8 @@
<string name="pref_new_episodes_action_title">New episodes action</string>
<string name="pref_new_episodes_action_sum">Action to take for new episodes</string>
<string name="episode_information">Episode information</string>
<string name="pref_global_default_episode_list_sort_order_title">Default sort order</string>
<string name="pref_global_default_episode_list_sort_order_sum">Choose the default order for episodes on the podcast screen</string>
<!-- Report bug -->
<string name="report_bug_title">Report bug</string>

View File

@ -78,6 +78,10 @@
android:defaultValue="false"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/episode_lists">
<Preference
android:key="prefGlobalDefaultSortedOrder"
android:title="@string/pref_global_default_episode_list_sort_order_title"
android:summary="@string/pref_global_default_episode_list_sort_order_sum" />
<Preference
android:key="prefSwipe"
android:summary="@string/swipeactions_summary"