mirror of
https://github.com/AntennaPod/AntennaPod.git
synced 2026-02-05 08:15:43 +00:00
Add default sort for episode list (#7972)
This commit is contained in:
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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),
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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"
|
||||
|
||||
Reference in New Issue
Block a user