diff --git a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java index 0246cf890..57385f62a 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java @@ -1,20 +1,15 @@ package de.test.antennapod.ui; import android.content.Intent; -import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.espresso.contrib.DrawerActions; import androidx.test.espresso.intent.rule.IntentsTestRule; import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; -import de.danoeh.antennapod.ui.screen.preferences.PreferenceActivity; -import de.danoeh.antennapod.ui.screen.download.CompletedDownloadsFragment; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.storage.preferences.UserPreferences; -import de.danoeh.antennapod.ui.screen.AllEpisodesFragment; -import de.danoeh.antennapod.ui.screen.drawer.NavDrawerFragment; -import de.danoeh.antennapod.ui.screen.PlaybackHistoryFragment; -import de.danoeh.antennapod.ui.screen.queue.QueueFragment; +import de.danoeh.antennapod.ui.screen.preferences.PreferenceActivity; import de.test.antennapod.EspressoTestUtils; import org.junit.After; import org.junit.Before; @@ -23,13 +18,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.Collections; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.action.ViewActions.longClick; import static androidx.test.espresso.action.ViewActions.swipeUp; import static androidx.test.espresso.intent.Intents.intended; import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent; @@ -40,10 +32,7 @@ import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static de.test.antennapod.EspressoTestUtils.onDrawerItem; import static de.test.antennapod.EspressoTestUtils.waitForView; -import static de.test.antennapod.NthMatcher.first; import static org.hamcrest.Matchers.allOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; /** * User interface tests for MainActivity drawer. @@ -78,7 +67,7 @@ public class NavigationDrawerTest { @Test public void testClickNavDrawer() throws Exception { uiTestUtils.addLocalFeedData(false); - UserPreferences.setHiddenDrawerItems(new ArrayList<>()); + UserPreferences.setDrawerItemOrder(Collections.emptyList(), Collections.emptyList()); activityRule.launchActivity(new Intent()); // home @@ -147,85 +136,4 @@ public class NavigationDrawerTest { onView(withText(R.string.settings_label)).perform(click()); intended(hasComponent(PreferenceActivity.class.getName())); } - - @Test - public void testDrawerPreferencesHideSomeElements() { - UserPreferences.setHiddenDrawerItems(new ArrayList<>()); - activityRule.launchActivity(new Intent()); - openNavDrawer(); - onDrawerItem(withText(R.string.queue_label)).perform(longClick()); - onView(withText(R.string.episodes_label)).perform(click()); - onView(withId(R.id.contentPanel)).perform(swipeUp()); - onView(withText(R.string.playback_history_label)).perform(click()); - onView(withText(R.string.confirm_label)).perform(click()); - - List hidden = UserPreferences.getHiddenDrawerItems(); - assertEquals(2, hidden.size()); - assertTrue(hidden.contains(AllEpisodesFragment.TAG)); - assertTrue(hidden.contains(PlaybackHistoryFragment.TAG)); - } - - @Test - public void testDrawerPreferencesUnhideSomeElements() { - List hidden = Arrays.asList(PlaybackHistoryFragment.TAG, CompletedDownloadsFragment.TAG); - UserPreferences.setHiddenDrawerItems(hidden); - activityRule.launchActivity(new Intent()); - openNavDrawer(); - onView(first(withText(R.string.queue_label))).perform(longClick()); - - onView(withText(R.string.queue_label)).perform(click()); - onView(withId(R.id.contentPanel)).perform(swipeUp()); - onView(withText(R.string.downloads_label)).perform(click()); - onView(withText(R.string.confirm_label)).perform(click()); - - hidden = UserPreferences.getHiddenDrawerItems(); - assertEquals(2, hidden.size()); - assertTrue(hidden.contains(QueueFragment.TAG)); - assertTrue(hidden.contains(PlaybackHistoryFragment.TAG)); - } - - - @Test - public void testDrawerPreferencesHideAllElements() { - UserPreferences.setHiddenDrawerItems(new ArrayList<>()); - activityRule.launchActivity(new Intent()); - String[] titles = activityRule.getActivity().getResources().getStringArray(R.array.nav_drawer_titles); - - openNavDrawer(); - onView(first(withText(R.string.queue_label))).perform(longClick()); - for (int i = 0; i < titles.length; i++) { - String title = titles[i]; - onView(allOf(withText(title), isDisplayed())).perform(click()); - - if (i == 3) { - onView(withId(R.id.contentPanel)).perform(swipeUp()); - } - } - - onView(withText(R.string.confirm_label)).perform(click()); - - List hidden = UserPreferences.getHiddenDrawerItems(); - assertEquals(titles.length, hidden.size()); - for (String tag : NavDrawerFragment.NAV_DRAWER_TAGS) { - assertTrue(hidden.contains(tag)); - } - } - - @Test - public void testDrawerPreferencesHideCurrentElement() { - UserPreferences.setHiddenDrawerItems(new ArrayList<>()); - activityRule.launchActivity(new Intent()); - openNavDrawer(); - onView(withText(R.string.downloads_label)).perform(click()); - openNavDrawer(); - - onView(first(withText(R.string.queue_label))).perform(longClick()); - onView(withId(R.id.contentPanel)).perform(swipeUp()); - onView(first(withText(R.string.downloads_label))).perform(click()); - onView(withText(R.string.confirm_label)).perform(click()); - - List hidden = UserPreferences.getHiddenDrawerItems(); - assertEquals(1, hidden.size()); - assertTrue(hidden.contains(CompletedDownloadsFragment.TAG)); - } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index 4b7c59257..15fa614a4 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -139,7 +139,7 @@ public class MainActivity extends CastEnabledActivity { loadFragment(UserPreferences.getDefaultPage(), null); } else { String lastFragment = NavDrawerFragment.getLastNavFragment(this); - if (ArrayUtils.contains(NavDrawerFragment.NAV_DRAWER_TAGS, lastFragment)) { + if (ArrayUtils.contains(getResources().getStringArray(R.array.nav_drawer_section_tags), lastFragment)) { loadFragment(lastFragment, null); } else { try { diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/DrawerPreferencesDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/DrawerPreferencesDialog.java index 4923df19c..12bf673f6 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/DrawerPreferencesDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/DrawerPreferencesDialog.java @@ -1,50 +1,86 @@ package de.danoeh.antennapod.ui.screen.drawer; import android.content.Context; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import androidx.annotation.NonNull; import de.danoeh.antennapod.R; import de.danoeh.antennapod.storage.preferences.UserPreferences; -import de.danoeh.antennapod.ui.screen.drawer.NavDrawerFragment; +import de.danoeh.antennapod.ui.screen.preferences.ReorderDialog; +import de.danoeh.antennapod.ui.screen.preferences.ReorderDialogItem; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -public class DrawerPreferencesDialog { - public static void show(Context context, Runnable callback) { - final List hiddenDrawerItems = UserPreferences.getHiddenDrawerItems(); - final String[] navTitles = context.getResources().getStringArray(R.array.nav_drawer_titles); - boolean[] checked = new boolean[NavDrawerFragment.NAV_DRAWER_TAGS.length]; - for (int i = 0; i < NavDrawerFragment.NAV_DRAWER_TAGS.length; i++) { - String tag = NavDrawerFragment.NAV_DRAWER_TAGS[i]; - if (!hiddenDrawerItems.contains(tag)) { - checked[i] = true; - } - } - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context); - builder.setTitle(R.string.drawer_preferences); - builder.setMultiChoiceItems(navTitles, checked, (dialog, which, isChecked) -> { - if (isChecked) { - hiddenDrawerItems.remove(NavDrawerFragment.NAV_DRAWER_TAGS[which]); - } else { - hiddenDrawerItems.add(NavDrawerFragment.NAV_DRAWER_TAGS[which]); - } - }); - builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> { - UserPreferences.setHiddenDrawerItems(hiddenDrawerItems); +public class DrawerPreferencesDialog extends ReorderDialog { + private static final String TAG_HIDDEN = "hidden"; + private static final String TAG_SHOWN = "shown"; + private final Runnable onSettingsChanged; - if (hiddenDrawerItems.contains(UserPreferences.getDefaultPage())) { - for (String tag : NavDrawerFragment.NAV_DRAWER_TAGS) { - if (!hiddenDrawerItems.contains(tag)) { - UserPreferences.setDefaultPage(tag); - break; - } + public DrawerPreferencesDialog(Context context, Runnable onSettingsChanged) { + super(context); + this.onSettingsChanged = onSettingsChanged; + } + + @Override + protected int getTitle() { + return R.string.drawer_preferences; + } + + @NonNull + protected List getInitialItems() { + ArrayList settingsDialogItems = new ArrayList<>(); + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Header, + TAG_SHOWN, context.getString(R.string.section_shown))); + + final List drawerItemOrder = UserPreferences.getVisibleDrawerItemOrder(); + for (String tag : drawerItemOrder) { + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Section, + tag, context.getString(NavListAdapter.getLabel(tag)))); + } + + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Header, + TAG_HIDDEN, context.getString(R.string.section_hidden))); + + final List hiddenDrawerItems = UserPreferences.getHiddenDrawerItems(); + for (String sectionTag : hiddenDrawerItems) { + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Section, + sectionTag, context.getString(NavListAdapter.getLabel(sectionTag)))); + } + return settingsDialogItems; + } + + @Override + protected boolean onItemMove(int fromPosition, int toPosition) { + if (toPosition == 0 || fromPosition == 0) { + return false; + } + return super.onItemMove(fromPosition, toPosition); + } + + @Override + protected void onReset() { + UserPreferences.setDrawerItemOrder(Collections.emptyList(), Collections.emptyList()); + if (onSettingsChanged != null) { + onSettingsChanged.run(); + } + } + + @Override + protected void onConfirmed() { + final List hiddenDrawerItems = getTagsAfterHeader(TAG_HIDDEN); + UserPreferences.setDrawerItemOrder(hiddenDrawerItems, getTagsWithoutHeaders()); + + if (hiddenDrawerItems.contains(UserPreferences.getDefaultPage())) { + for (String tag : context.getResources().getStringArray(R.array.nav_drawer_section_tags)) { + if (!hiddenDrawerItems.contains(tag)) { + UserPreferences.setDefaultPage(tag); + break; } } + } - if (callback != null) { - callback.run(); - } - }); - builder.setNegativeButton(R.string.cancel_label, null); - builder.create().show(); + if (onSettingsChanged != null) { + onSettingsChanged.run(); + } } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavDrawerFragment.java index b4d7bbb0d..d6d8bea93 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavDrawerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavDrawerFragment.java @@ -34,13 +34,6 @@ import com.google.android.material.shape.MaterialShapeDrawable; import com.google.android.material.shape.ShapeAppearanceModel; import de.danoeh.antennapod.net.download.service.episode.autodownload.EpisodeCleanupAlgorithmFactory; -import de.danoeh.antennapod.ui.screen.AddFeedFragment; -import de.danoeh.antennapod.ui.screen.AllEpisodesFragment; -import de.danoeh.antennapod.ui.screen.InboxFragment; -import de.danoeh.antennapod.ui.screen.PlaybackHistoryFragment; -import de.danoeh.antennapod.ui.screen.queue.QueueFragment; -import de.danoeh.antennapod.ui.screen.download.CompletedDownloadsFragment; -import de.danoeh.antennapod.ui.screen.subscriptions.SubscriptionFragment; import org.apache.commons.lang3.StringUtils; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -85,18 +78,6 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS public static final String PREF_NAME = "NavDrawerPrefs"; public static final String TAG = "NavDrawerFragment"; - public static final String[] NAV_DRAWER_TAGS = { - HomeFragment.TAG, - QueueFragment.TAG, - InboxFragment.TAG, - AllEpisodesFragment.TAG, - SubscriptionFragment.TAG, - CompletedDownloadsFragment.TAG, - PlaybackHistoryFragment.TAG, - AddFeedFragment.TAG, - NavListAdapter.SUBSCRIPTION_LIST_TAG - }; - private NavDrawerData navDrawerData; private int reclaimableSpace = 0; private List flatItemList; @@ -396,7 +377,7 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS @Override public boolean onItemLongClick(int position) { if (position < navAdapter.getFragmentTags().size()) { - DrawerPreferencesDialog.show(getContext(), () -> { + new DrawerPreferencesDialog(getContext(), () -> { navAdapter.notifyDataSetChanged(); if (UserPreferences.getHiddenDrawerItems().contains(getLastNavFragment(getContext()))) { new MainActivityStarter(getContext()) @@ -404,7 +385,7 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS .withDrawerOpen() .start(); } - }); + }).show(); return true; } else { contextPressedItem = flatItemList.get(position - navAdapter.getSubscriptionOffset()); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavListAdapter.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavListAdapter.java index 601a3954a..a4ffb7566 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/drawer/NavListAdapter.java @@ -7,9 +7,6 @@ import android.os.Build; import android.view.ContextMenu; import android.view.InputDevice; import android.view.LayoutInflater; -import androidx.annotation.DrawableRes; -import androidx.annotation.NonNull; -import androidx.preference.PreferenceManager; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -17,32 +14,34 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import com.bumptech.glide.load.resource.bitmap.FitCenter; -import com.bumptech.glide.load.resource.bitmap.RoundedCorners; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.FitCenter; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.ui.common.ImagePlaceholder; -import de.danoeh.antennapod.ui.screen.preferences.PreferenceActivity; -import de.danoeh.antennapod.ui.screen.AllEpisodesFragment; -import de.danoeh.antennapod.ui.screen.download.CompletedDownloadsFragment; -import de.danoeh.antennapod.ui.screen.InboxFragment; import de.danoeh.antennapod.model.feed.Feed; -import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.storage.database.NavDrawerData; +import de.danoeh.antennapod.storage.preferences.UserPreferences; +import de.danoeh.antennapod.ui.common.ImagePlaceholder; import de.danoeh.antennapod.ui.screen.AddFeedFragment; +import de.danoeh.antennapod.ui.screen.AllEpisodesFragment; +import de.danoeh.antennapod.ui.screen.InboxFragment; import de.danoeh.antennapod.ui.screen.PlaybackHistoryFragment; +import de.danoeh.antennapod.ui.screen.download.CompletedDownloadsFragment; +import de.danoeh.antennapod.ui.screen.home.HomeFragment; +import de.danoeh.antennapod.ui.screen.preferences.PreferenceActivity; import de.danoeh.antennapod.ui.screen.queue.QueueFragment; import de.danoeh.antennapod.ui.screen.subscriptions.SubscriptionFragment; -import de.danoeh.antennapod.ui.screen.home.HomeFragment; -import org.apache.commons.lang3.ArrayUtils; import java.lang.ref.WeakReference; import java.text.NumberFormat; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -63,7 +62,6 @@ public class NavListAdapter extends RecyclerView.Adapter public static final String SUBSCRIPTION_LIST_TAG = "SubscriptionList"; private final List fragmentTags = new ArrayList<>(); - private final String[] titles; private final ItemAccess itemAccess; private final WeakReference activity; public boolean showSubscriptionList = true; @@ -71,24 +69,20 @@ public class NavListAdapter extends RecyclerView.Adapter public NavListAdapter(ItemAccess itemAccess, Activity context) { this.itemAccess = itemAccess; this.activity = new WeakReference<>(context); - - titles = context.getResources().getStringArray(R.array.nav_drawer_titles); loadItems(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.registerOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (UserPreferences.PREF_HIDDEN_DRAWER_ITEMS.equals(key)) { + if (UserPreferences.PREF_HIDDEN_DRAWER_ITEMS.equals(key) + || UserPreferences.PREF_DRAWER_ITEM_ORDER.equals(key)) { loadItems(); } } private void loadItems() { - List newTags = new ArrayList<>(Arrays.asList(NavDrawerFragment.NAV_DRAWER_TAGS)); - List hiddenFragments = UserPreferences.getHiddenDrawerItems(); - newTags.removeAll(hiddenFragments); + List newTags = UserPreferences.getVisibleDrawerItemOrder(); if (newTags.contains(SUBSCRIPTION_LIST_TAG)) { // we never want SUBSCRIPTION_LIST_TAG to be in 'tags' @@ -106,12 +100,32 @@ public class NavListAdapter extends RecyclerView.Adapter notifyDataSetChanged(); } - public String getLabel(String tag) { - int index = ArrayUtils.indexOf(NavDrawerFragment.NAV_DRAWER_TAGS, tag); - return titles[index]; + public static @StringRes int getLabel(String tag) { + switch (tag) { + case HomeFragment.TAG: + return R.string.home_label; + case QueueFragment.TAG: + return R.string.queue_label; + case InboxFragment.TAG: + return R.string.inbox_label; + case AllEpisodesFragment.TAG: + return R.string.episodes_label; + case SubscriptionFragment.TAG: + return R.string.subscriptions_label; + case CompletedDownloadsFragment.TAG: + return R.string.downloads_label; + case PlaybackHistoryFragment.TAG: + return R.string.playback_history_label; + case AddFeedFragment.TAG: + return R.string.add_feed_label; + case NavListAdapter.SUBSCRIPTION_LIST_TAG: + return R.string.subscriptions_list_label; + default: + return 0; + } } - private @DrawableRes int getDrawable(String tag) { + private static @DrawableRes int getDrawable(String tag) { switch (tag) { case HomeFragment.TAG: return R.drawable.ic_home; @@ -224,7 +238,7 @@ public class NavListAdapter extends RecyclerView.Adapter } } - private void bindNavView(String title, int position, NavHolder holder) { + private void bindNavView(@StringRes int title, int position, NavHolder holder) { Activity context = activity.get(); if (context == null) { return; diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java index 03a61b687..0b6132ef0 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeFragment.java @@ -139,7 +139,7 @@ public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickLis @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == R.id.homesettings_items) { - HomeSectionsSettingsDialog.open(getContext(), this::populateSectionList); + new HomeSectionsSettingsDialog(getContext(), this::populateSectionList).show(); return true; } else if (item.getItemId() == R.id.refresh_item) { FeedUpdateManager.getInstance().runOnceOrAsk(requireContext()); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeScreenSettingDialogAdapter.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeScreenSettingDialogAdapter.java deleted file mode 100644 index 95ead011a..000000000 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeScreenSettingDialogAdapter.java +++ /dev/null @@ -1,148 +0,0 @@ -package de.danoeh.antennapod.ui.screen.home.settingsdialog; - -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.util.Consumer; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import de.danoeh.antennapod.databinding.ChooseHomeScreenOrderDialogEntryBinding; -import de.danoeh.antennapod.databinding.ChooseHomeScreenOrderDialogHeaderBinding; - -class HomeScreenSettingDialogAdapter extends RecyclerView.Adapter { - private static final int HEADER_VIEW = 0; - private static final int ITEM_VIEW = 1; - private final List settingsDialogItems; - @Nullable private Consumer dragListener; - - public HomeScreenSettingDialogAdapter(@NonNull List dialogItems) { - settingsDialogItems = dialogItems; - } - - public void setDragListener(@Nullable Consumer dragListener) { - this.dragListener = dragListener; - } - - @NonNull - public List getOrderedSectionTags() { - List orderedSectionTags = new ArrayList<>(); - for (HomeScreenSettingsDialogItem item: settingsDialogItems) { - if (item.getViewType() == HomeScreenSettingsDialogItem.ViewType.Header) { - continue; - } - - orderedSectionTags.add(item.getTitle()); - } - - return orderedSectionTags; - } - - public List getHiddenSectionTags() { - List hiddenSections = new ArrayList<>(); - for (int i = settingsDialogItems.size() - 1; i >= 0; i--) { - HomeScreenSettingsDialogItem item = settingsDialogItems.get(i); - if (item.getViewType() == HomeScreenSettingsDialogItem.ViewType.Header) { - return hiddenSections; - } - - hiddenSections.add(item.getTitle()); - } - - Collections.reverse(hiddenSections); - return hiddenSections; - } - - @NonNull - @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - if (viewType == HEADER_VIEW) { - ChooseHomeScreenOrderDialogHeaderBinding binding = ChooseHomeScreenOrderDialogHeaderBinding.inflate( - inflater, parent, false); - return new HeaderViewHolder(binding.getRoot(), binding.headerLabel); - } - - ChooseHomeScreenOrderDialogEntryBinding binding = ChooseHomeScreenOrderDialogEntryBinding.inflate( - inflater, parent, false); - return new ItemViewHolder(binding.getRoot(), binding.sectionLabel, binding.dragHandle); - } - - @Override - public int getItemViewType(int position) { - HomeScreenSettingsDialogItem.ViewType viewType = settingsDialogItems.get(position).getViewType(); - boolean isHeader = viewType == HomeScreenSettingsDialogItem.ViewType.Header; - return isHeader ? HEADER_VIEW : ITEM_VIEW; - } - - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - String title = settingsDialogItems.get(position).getTitle(); - if (holder instanceof HeaderViewHolder) { - HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; - headerViewHolder.categoryLabel.setText(title); - } else if (holder instanceof ItemViewHolder) { - ItemViewHolder itemViewHolder = (ItemViewHolder) holder; - String sectionName = HomePreferences.getNameFromTag(itemViewHolder.nameLabel.getContext(), title); - itemViewHolder.nameLabel.setText(sectionName); - itemViewHolder.dragImage.setOnTouchListener((view, motionEvent) -> { - if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { - if (dragListener != null) { - dragListener.accept(itemViewHolder); - } - } - return true; - }); - } - } - - @Override - public int getItemCount() { - return settingsDialogItems.size(); - } - - public boolean onItemMove(int fromPosition, int toPosition) { - if (fromPosition < toPosition) { - for (int i = fromPosition; i < toPosition; i++) { - Collections.swap(settingsDialogItems, i, i + 1); - } - } else { - for (int i = fromPosition; i > toPosition; i--) { - Collections.swap(settingsDialogItems, i, i - 1); - } - } - - notifyItemMoved(fromPosition, toPosition); - return true; - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - private final TextView nameLabel; - private final ImageView dragImage; - - ItemViewHolder(@NonNull View itemView, TextView nameLabel, ImageView dragImage) { - super(itemView); - this.nameLabel = nameLabel; - this.dragImage = dragImage; - } - } - - static class HeaderViewHolder extends RecyclerView.ViewHolder { - - private final TextView categoryLabel; - - HeaderViewHolder(@NonNull View itemView, @NonNull TextView categoryLabel) { - super(itemView); - this.categoryLabel = categoryLabel; - } - } -} diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeSectionsSettingsDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeSectionsSettingsDialog.java index 7d2c71642..8d2f9670f 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeSectionsSettingsDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeSectionsSettingsDialog.java @@ -1,82 +1,71 @@ package de.danoeh.antennapod.ui.screen.home.settingsdialog; import android.content.Context; -import android.view.LayoutInflater; - import androidx.annotation.NonNull; -import androidx.recyclerview.widget.ItemTouchHelper; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.databinding.ChooseHomeScreenOrderDialogBinding; +import de.danoeh.antennapod.ui.screen.preferences.ReorderDialog; +import de.danoeh.antennapod.ui.screen.preferences.ReorderDialogItem; import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class HomeSectionsSettingsDialog { - public static void open(Context context, Runnable onSettingsChanged) { - LayoutInflater layoutInflater = LayoutInflater.from(context); - ChooseHomeScreenOrderDialogBinding viewBinding = ChooseHomeScreenOrderDialogBinding.inflate(layoutInflater); +public class HomeSectionsSettingsDialog extends ReorderDialog { + private final Runnable onSettingsChanged; + private static final String TAG_HIDDEN = "hidden"; + private static final String TAG_SHOWN = "shown"; - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context); - builder.setTitle(R.string.configure_home); - builder.setView(viewBinding.getRoot()); - RecyclerView recyclerView = viewBinding.recyclerView; - List dialogItems = initialItemsSettingsDialog(context); - HomeScreenSettingDialogAdapter adapter = new HomeScreenSettingDialogAdapter(dialogItems); - - configureRecyclerView(recyclerView, adapter, context); - - builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> { - final List sectionOrder = adapter.getOrderedSectionTags(); - final List hiddenSections = adapter.getHiddenSectionTags(); - HomePreferences.saveChanges(context, hiddenSections, sectionOrder); - onSettingsChanged.run(); - }); - builder.setNegativeButton(R.string.cancel_label, null); - builder.setNeutralButton(R.string.reset, (dialog, which) -> { - HomePreferences.saveChanges(context, Collections.emptyList(), Collections.emptyList()); - onSettingsChanged.run(); - }); - builder.show(); + public HomeSectionsSettingsDialog(Context context, Runnable onSettingsChanged) { + super(context); + this.onSettingsChanged = onSettingsChanged; } - private static void configureRecyclerView(RecyclerView recyclerView, - HomeScreenSettingDialogAdapter adapter, Context context) { - ItemTouchCallback itemMoveCallback = new ItemTouchCallback() { - @Override - protected boolean onItemMove(int fromPosition, int toPosition) { - return adapter.onItemMove(fromPosition, toPosition); - } - }; - ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemMoveCallback); - itemTouchHelper.attachToRecyclerView(recyclerView); - adapter.setDragListener(itemTouchHelper::startDrag); - recyclerView.setLayoutManager(new LinearLayoutManager(context)); - recyclerView.setAdapter(adapter); + @Override + protected int getTitle() { + return R.string.configure_home; } @NonNull - private static List initialItemsSettingsDialog(@NonNull Context context) { + protected List getInitialItems() { final List sectionTags = HomePreferences.getSortedSectionTags(context); final List hiddenSectionTags = HomePreferences.getHiddenSectionTags(context); - ArrayList settingsDialogItems = new ArrayList<>(); + ArrayList settingsDialogItems = new ArrayList<>(); + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Header, + TAG_SHOWN, context.getString(R.string.section_shown))); for (String sectionTag: sectionTags) { - settingsDialogItems.add(new HomeScreenSettingsDialogItem( - HomeScreenSettingsDialogItem.ViewType.Section, sectionTag)); - } - String hiddenText = context.getString(R.string.section_hidden); - settingsDialogItems.add(new HomeScreenSettingsDialogItem( - HomeScreenSettingsDialogItem.ViewType.Header, hiddenText)); - for (String sectionTag: hiddenSectionTags) { - settingsDialogItems.add(new HomeScreenSettingsDialogItem( - HomeScreenSettingsDialogItem.ViewType.Section, sectionTag)); + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Section, sectionTag, + HomePreferences.getNameFromTag(context, sectionTag))); } + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Header, + TAG_HIDDEN, context.getString(R.string.section_hidden))); + for (String sectionTag: hiddenSectionTags) { + settingsDialogItems.add(new ReorderDialogItem(ReorderDialogItem.ViewType.Section, sectionTag, + HomePreferences.getNameFromTag(context, sectionTag))); + } return settingsDialogItems; } + + @Override + protected boolean onItemMove(int fromPosition, int toPosition) { + if (toPosition == 0 || fromPosition == 0) { + return false; + } + return super.onItemMove(fromPosition, toPosition); + } + + @Override + protected void onReset() { + HomePreferences.saveChanges(context, Collections.emptyList(), Collections.emptyList()); + onSettingsChanged.run(); + } + + @Override + protected void onConfirmed() { + final List sectionOrder = getTagsWithoutHeaders(); + final List hiddenSections = getTagsAfterHeader(TAG_HIDDEN); + HomePreferences.saveChanges(context, hiddenSections, sectionOrder); + onSettingsChanged.run(); + } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialog.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialog.java new file mode 100644 index 000000000..83095d6f9 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialog.java @@ -0,0 +1,111 @@ +package de.danoeh.antennapod.ui.screen.preferences; + +import android.content.Context; +import android.view.LayoutInflater; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.databinding.ReorderDialogBinding; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public abstract class ReorderDialog { + protected final Context context; + protected final List dialogItems; + private final ReorderDialogAdapter adapter; + + public ReorderDialog(Context context) { + this.context = context; + dialogItems = getInitialItems(); + adapter = new ReorderDialogAdapter(dialogItems); + } + + public void show() { + LayoutInflater layoutInflater = LayoutInflater.from(context); + ReorderDialogBinding viewBinding = ReorderDialogBinding.inflate(layoutInflater); + + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context); + builder.setTitle(getTitle()); + builder.setView(viewBinding.getRoot()); + configureRecyclerView(viewBinding.recyclerView); + + builder.setPositiveButton(android.R.string.ok, (dialog, which) -> onConfirmed()); + builder.setNegativeButton(R.string.cancel_label, null); + builder.setNeutralButton(R.string.reset, (dialog, which) -> onReset()); + builder.show(); + } + + private void configureRecyclerView(RecyclerView recyclerView) { + ReorderItemTouchCallback itemMoveCallback = new ReorderItemTouchCallback() { + @Override + protected boolean onItemMove(int fromPosition, int toPosition) { + return ReorderDialog.this.onItemMove(fromPosition, toPosition); + } + }; + ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemMoveCallback); + itemTouchHelper.attachToRecyclerView(recyclerView); + adapter.setDragListener(itemTouchHelper::startDrag); + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(adapter); + recyclerView.addItemDecoration(new DividerItemDecoration(context, layoutManager.getOrientation())); + } + + protected boolean onItemMove(int fromPosition, int toPosition) { + if (fromPosition < toPosition) { + for (int i = fromPosition; i < toPosition; i++) { + Collections.swap(dialogItems, i, i + 1); + } + } else { + for (int i = fromPosition; i > toPosition; i--) { + Collections.swap(dialogItems, i, i - 1); + } + } + adapter.notifyItemMoved(fromPosition, toPosition); + return true; + } + + @NonNull + public List getTagsWithoutHeaders() { + List orderedSectionTags = new ArrayList<>(); + for (ReorderDialogItem item : dialogItems) { + if (item.getViewType() == ReorderDialogItem.ViewType.Header) { + continue; + } + orderedSectionTags.add(item.getTag()); + } + return orderedSectionTags; + } + + @NonNull + public List getTagsAfterHeader(String tag) { + List itemsAfterHeader = new ArrayList<>(); + int i = 0; + while (dialogItems.get(i).getViewType() != ReorderDialogItem.ViewType.Header + || !dialogItems.get(i).getTag().equals(tag)) { + i++; + } + i++; + while (i < dialogItems.size() && dialogItems.get(i).getViewType() != ReorderDialogItem.ViewType.Header) { + itemsAfterHeader.add(dialogItems.get(i).getTag()); + i++; + } + return itemsAfterHeader; + } + + protected abstract @StringRes int getTitle(); + + @NonNull + protected abstract List getInitialItems(); + + protected abstract void onReset(); + + protected abstract void onConfirmed(); +} diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialogAdapter.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialogAdapter.java new file mode 100644 index 000000000..e2d69209e --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialogAdapter.java @@ -0,0 +1,96 @@ +package de.danoeh.antennapod.ui.screen.preferences; + +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.util.Consumer; +import androidx.recyclerview.widget.RecyclerView; +import de.danoeh.antennapod.databinding.ReorderDialogEntryBinding; +import de.danoeh.antennapod.databinding.ReorderDialogHeaderBinding; + +import java.util.List; + +public class ReorderDialogAdapter extends RecyclerView.Adapter { + private static final int HEADER_VIEW = 0; + private static final int ITEM_VIEW = 1; + private final List settingsDialogItems; + @Nullable private Consumer dragListener; + + public ReorderDialogAdapter(@NonNull List dialogItems) { + settingsDialogItems = dialogItems; + } + + public void setDragListener(@Nullable Consumer dragListener) { + this.dragListener = dragListener; + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + if (viewType == HEADER_VIEW) { + ReorderDialogHeaderBinding binding = ReorderDialogHeaderBinding.inflate(inflater, parent, false); + return new HeaderViewHolder(binding.getRoot(), binding.headerLabel); + } + + ReorderDialogEntryBinding binding = ReorderDialogEntryBinding.inflate(inflater, parent, false); + return new ItemViewHolder(binding.getRoot(), binding.sectionLabel, binding.dragHandle); + } + + @Override + public int getItemViewType(int position) { + ReorderDialogItem.ViewType viewType = settingsDialogItems.get(position).getViewType(); + boolean isHeader = viewType == ReorderDialogItem.ViewType.Header; + return isHeader ? HEADER_VIEW : ITEM_VIEW; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if (holder instanceof HeaderViewHolder) { + HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; + headerViewHolder.categoryLabel.setText(settingsDialogItems.get(position).getTitle()); + } else if (holder instanceof ItemViewHolder) { + ItemViewHolder itemViewHolder = (ItemViewHolder) holder; + itemViewHolder.nameLabel.setText(settingsDialogItems.get(position).getTitle()); + itemViewHolder.dragImage.setOnTouchListener((view, motionEvent) -> { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + if (dragListener != null) { + dragListener.accept(itemViewHolder); + } + } + return true; + }); + } + } + + @Override + public int getItemCount() { + return settingsDialogItems.size(); + } + + public static class ItemViewHolder extends RecyclerView.ViewHolder { + private final TextView nameLabel; + private final ImageView dragImage; + + ItemViewHolder(@NonNull View itemView, TextView nameLabel, ImageView dragImage) { + super(itemView); + this.nameLabel = nameLabel; + this.dragImage = dragImage; + } + } + + public static class HeaderViewHolder extends RecyclerView.ViewHolder { + + private final TextView categoryLabel; + + HeaderViewHolder(@NonNull View itemView, @NonNull TextView categoryLabel) { + super(itemView); + this.categoryLabel = categoryLabel; + } + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeScreenSettingsDialogItem.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialogItem.java similarity index 50% rename from app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeScreenSettingsDialogItem.java rename to app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialogItem.java index 8e5997625..79e90431d 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/HomeScreenSettingsDialogItem.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderDialogItem.java @@ -1,16 +1,18 @@ -package de.danoeh.antennapod.ui.screen.home.settingsdialog; +package de.danoeh.antennapod.ui.screen.preferences; -final class HomeScreenSettingsDialogItem { - enum ViewType { +public final class ReorderDialogItem { + public enum ViewType { Section, Header } private final ViewType viewType; + private final String tag; private final String title; - HomeScreenSettingsDialogItem(ViewType viewType, String title) { + public ReorderDialogItem(ViewType viewType, String tag, String title) { this.viewType = viewType; + this.tag = tag; this.title = title; } @@ -21,4 +23,8 @@ final class HomeScreenSettingsDialogItem { public String getTitle() { return title; } + + public String getTag() { + return tag; + } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/ItemTouchCallback.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderItemTouchCallback.java similarity index 88% rename from app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/ItemTouchCallback.java rename to app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderItemTouchCallback.java index 9ccefda6f..7cd7834e2 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/settingsdialog/ItemTouchCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/preferences/ReorderItemTouchCallback.java @@ -1,10 +1,10 @@ -package de.danoeh.antennapod.ui.screen.home.settingsdialog; +package de.danoeh.antennapod.ui.screen.preferences; import androidx.annotation.NonNull; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; -public abstract class ItemTouchCallback extends ItemTouchHelper.Callback { +public abstract class ReorderItemTouchCallback extends ItemTouchHelper.Callback { @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; 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 86840f759..2cd4e4f5c 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 @@ -65,7 +65,7 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat { findPreference(UserPreferences.PREF_HIDDEN_DRAWER_ITEMS) .setOnPreferenceClickListener(preference -> { - DrawerPreferencesDialog.show(getContext(), null); + new DrawerPreferencesDialog(getContext(), null).show(); return true; }); diff --git a/app/src/main/res/layout/choose_home_screen_order_dialog.xml b/app/src/main/res/layout/reorder_dialog.xml similarity index 100% rename from app/src/main/res/layout/choose_home_screen_order_dialog.xml rename to app/src/main/res/layout/reorder_dialog.xml diff --git a/app/src/main/res/layout/choose_home_screen_order_dialog_entry.xml b/app/src/main/res/layout/reorder_dialog_entry.xml similarity index 78% rename from app/src/main/res/layout/choose_home_screen_order_dialog_entry.xml rename to app/src/main/res/layout/reorder_dialog_entry.xml index 118e7aadb..70bbb5f71 100644 --- a/app/src/main/res/layout/choose_home_screen_order_dialog_entry.xml +++ b/app/src/main/res/layout/reorder_dialog_entry.xml @@ -9,21 +9,22 @@ + android:textSize="16sp" /> diff --git a/app/src/main/res/layout/choose_home_screen_order_dialog_header.xml b/app/src/main/res/layout/reorder_dialog_header.xml similarity index 68% rename from app/src/main/res/layout/choose_home_screen_order_dialog_header.xml rename to app/src/main/res/layout/reorder_dialog_header.xml index 410ec664d..df03eddaa 100644 --- a/app/src/main/res/layout/choose_home_screen_order_dialog_header.xml +++ b/app/src/main/res/layout/reorder_dialog_header.xml @@ -6,14 +6,15 @@ android:gravity="center_vertical" android:orientation="horizontal" android:paddingHorizontal="16dp" - android:paddingVertical="16dp"> + android:paddingVertical="4dp" + android:background="?attr/colorSurfaceVariant"> + android:layout_margin="4dp" + android:textColor="?attr/colorOnSurfaceVariant" + android:textSize="16sp" /> 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 67002c986..771ad5632 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 @@ -49,6 +49,7 @@ public abstract class UserPreferences { public static final String PREF_THEME_BLACK = "prefThemeBlack"; public static final String PREF_TINTED_COLORS = "prefTintedColors"; public static final String PREF_HIDDEN_DRAWER_ITEMS = "prefHiddenDrawerItems"; + public static final String PREF_DRAWER_ITEM_ORDER = "prefDrawerItemOrder"; public static final String PREF_DRAWER_FEED_ORDER = "prefDrawerFeedOrder"; public static final String PREF_DRAWER_FEED_COUNTER = "prefDrawerFeedIndicator"; public static final String PREF_EXPANDED_NOTIFICATION = "prefExpandNotify"; @@ -194,6 +195,33 @@ public abstract class UserPreferences { return new ArrayList<>(Arrays.asList(TextUtils.split(hiddenItems, ","))); } + public static List getVisibleDrawerItemOrder() { + String itemOrderStr = prefs.getString(PREF_DRAWER_ITEM_ORDER, ""); + List itemOrderTags = new ArrayList<>(Arrays.asList(TextUtils.split(itemOrderStr, ","))); + List hiddenItemTags = getHiddenDrawerItems(); + String[] sectionTags = context.getResources().getStringArray(R.array.nav_drawer_section_tags); + Arrays.sort(sectionTags, (String a, String b) -> Integer.signum( + indexOfOrMaxValue(itemOrderTags, a) - indexOfOrMaxValue(itemOrderTags, b))); + List finalItemTags = new ArrayList<>(); + for (String sectionTag: sectionTags) { + if (hiddenItemTags.contains(sectionTag)) { + continue; + } + finalItemTags.add(sectionTag); + } + return finalItemTags; + } + + private static int indexOfOrMaxValue(List haystack, String needle) { + int index = haystack.indexOf(needle); + return index == -1 ? Integer.MAX_VALUE : index; + } + + public static void setDrawerItemOrder(List hiddenItems, List visibleItemsOrder) { + prefs.edit().putString(PREF_HIDDEN_DRAWER_ITEMS, TextUtils.join(",", hiddenItems)).apply(); + prefs.edit().putString(PREF_DRAWER_ITEM_ORDER, TextUtils.join(",", visibleItemsOrder)).apply(); + } + public static List getFullNotificationButtons() { String[] buttons = TextUtils.split( prefs.getString(PREF_FULL_NOTIFICATION_BUTTONS, @@ -621,11 +649,6 @@ public abstract class UserPreferences { prefs.edit().putBoolean(PREF_GPODNET_NOTIFICATIONS, true).apply(); } - public static void setHiddenDrawerItems(List items) { - String str = TextUtils.join(",", items); - prefs.edit().putString(PREF_HIDDEN_DRAWER_ITEMS, str).apply(); - } - public static void setFullNotificationButtons(List items) { String str = TextUtils.join(",", items); prefs.edit().putString(PREF_FULL_NOTIFICATION_BUTTONS, str).apply(); diff --git a/storage/preferences/src/main/res/values/arrays.xml b/storage/preferences/src/main/res/values/arrays.xml new file mode 100644 index 000000000..243e8b716 --- /dev/null +++ b/storage/preferences/src/main/res/values/arrays.xml @@ -0,0 +1,14 @@ + + + + HomeFragment + QueueFragment + NewEpisodesFragment + EpisodesFragment + SubscriptionFragment + DownloadsFragment + PlaybackHistoryFragment + AddFeedFragment + SubscriptionList + + diff --git a/ui/i18n/src/main/res/values/strings.xml b/ui/i18n/src/main/res/values/strings.xml index 687886b2d..0f394c792 100644 --- a/ui/i18n/src/main/res/values/strings.xml +++ b/ui/i18n/src/main/res/values/strings.xml @@ -70,6 +70,7 @@ Open settings Configure Home Screen Hidden + Shown Total size of episodes on the device diff --git a/ui/preferences/src/main/res/values/arrays.xml b/ui/preferences/src/main/res/values/arrays.xml index a4f5d7f38..a39373ad8 100644 --- a/ui/preferences/src/main/res/values/arrays.xml +++ b/ui/preferences/src/main/res/values/arrays.xml @@ -194,18 +194,6 @@ -2 - - @string/home_label - @string/queue_label - @string/inbox_label - @string/episodes_label - @string/subscriptions_label - @string/downloads_label - @string/playback_history_label - @string/add_feed_label - @string/subscriptions_list_label - - @string/drawer_feed_order_unplayed_episodes @string/drawer_feed_order_alphabetical