From e334b9cad6c627d5793898c110e7e0ad57613c20 Mon Sep 17 00:00:00 2001 From: asdoi <36813904+asdoi@users.noreply.github.com> Date: Fri, 16 Oct 2020 11:56:43 +0000 Subject: Extended subscriptions filter (#4502) --- .../danoeh/antennapod/adapter/NavListAdapter.java | 2 +- .../danoeh/antennapod/dialog/FeedFilterDialog.java | 38 ---------- .../dialog/SubscriptionsFilterDialog.java | 82 ++++++++++++++++++++++ .../antennapod/fragment/NavDrawerFragment.java | 6 +- .../antennapod/fragment/SubscriptionFragment.java | 8 +-- .../UserInterfacePreferencesFragment.java | 6 +- 6 files changed, 92 insertions(+), 50 deletions(-) delete mode 100644 app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java create mode 100644 app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java (limited to 'app/src/main/java/de/danoeh/antennapod') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java index a53adc719..92ed7b052 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java @@ -298,7 +298,7 @@ public class NavListAdapter extends BaseAdapter convertView = inflater.inflate(R.layout.nav_section_item, parent, false); TextView feedsFilteredMsg = convertView.findViewById(R.id.nav_feeds_filtered_message); - if (UserPreferences.getFeedFilter() != UserPreferences.FEED_FILTER_NONE && showSubscriptionList) { + if (UserPreferences.getSubscriptionsFilter().isEnabled() && showSubscriptionList) { convertView.setEnabled(true); feedsFilteredMsg.setText("{md-info-outline} " + context.getString(R.string.subscriptions_are_filtered)); Iconify.addIcons(feedsFilteredMsg); diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java deleted file mode 100644 index 3b0e2d04b..000000000 --- a/app/src/main/java/de/danoeh/antennapod/dialog/FeedFilterDialog.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.danoeh.antennapod.dialog; - -import android.content.Context; - -import androidx.appcompat.app.AlertDialog; - -import org.greenrobot.eventbus.EventBus; - -import java.util.Arrays; -import java.util.List; - -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent; -import de.danoeh.antennapod.core.preferences.UserPreferences; - -public class FeedFilterDialog { - public static void showDialog(Context context) { - AlertDialog.Builder dialog = new AlertDialog.Builder(context); - dialog.setTitle(context.getString(R.string.pref_filter_feed_title)); - dialog.setNegativeButton(android.R.string.cancel, (d, listener) -> d.dismiss()); - - int selected = UserPreferences.getFeedFilter(); - List entryValues = - Arrays.asList(context.getResources().getStringArray(R.array.nav_drawer_feed_filter_values)); - final int selectedIndex = entryValues.indexOf("" + selected); - - String[] items = context.getResources().getStringArray(R.array.nav_drawer_feed_filter_options); - dialog.setSingleChoiceItems(items, selectedIndex, (d, which) -> { - if (selectedIndex != which) { - UserPreferences.setFeedFilter(entryValues.get(which)); - //Update subscriptions - EventBus.getDefault().post(new UnreadItemsUpdateEvent()); - } - d.dismiss(); - }); - dialog.show(); - } -} diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java new file mode 100644 index 000000000..a8915480c --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/dialog/SubscriptionsFilterDialog.java @@ -0,0 +1,82 @@ +package de.danoeh.antennapod.dialog; + +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.RadioButton; + +import androidx.appcompat.app.AlertDialog; + +import org.greenrobot.eventbus.EventBus; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.event.UnreadItemsUpdateEvent; +import de.danoeh.antennapod.core.feed.SubscriptionsFilter; +import de.danoeh.antennapod.core.feed.SubscriptionsFilterGroup; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.view.RecursiveRadioGroup; + +public class SubscriptionsFilterDialog { + public static void showDialog(Context context) { + SubscriptionsFilter subscriptionsFilter = UserPreferences.getSubscriptionsFilter(); + final Set filterValues = new HashSet<>(Arrays.asList(subscriptionsFilter.getValues())); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(context.getString(R.string.pref_filter_feed_title)); + + LayoutInflater inflater = LayoutInflater.from(context); + LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.filter_dialog, null, false); + builder.setView(layout); + + for (SubscriptionsFilterGroup item : SubscriptionsFilterGroup.values()) { + RecursiveRadioGroup row = (RecursiveRadioGroup) inflater.inflate(R.layout.filter_dialog_row, null); + RadioButton filter1 = row.findViewById(R.id.filter_dialog_radioButton1); + RadioButton filter2 = row.findViewById(R.id.filter_dialog_radioButton2); + filter1.setText(item.values[0].displayName); + filter1.setTag(item.values[0].filterId); + if (item.values.length == 2) { + filter2.setText(item.values[1].displayName); + filter2.setTag(item.values[1].filterId); + } else { + filter2.setVisibility(View.GONE); + } + layout.addView(row); + } + + for (String filterId : filterValues) { + if (!TextUtils.isEmpty(filterId)) { + ((RadioButton) layout.findViewWithTag(filterId)).setChecked(true); + } + } + + builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> { + filterValues.clear(); + for (int i = 0; i < layout.getChildCount(); i++) { + if (!(layout.getChildAt(i) instanceof RecursiveRadioGroup)) { + continue; + } + RecursiveRadioGroup group = (RecursiveRadioGroup) layout.getChildAt(i); + if (group.getCheckedButton() != null) { + String tag = (String) group.getCheckedButton().getTag(); + if (tag != null) { // Clear buttons use no tag + filterValues.add((String) group.getCheckedButton().getTag()); + } + } + } + updateFilter(filterValues); + }); + builder.setNegativeButton(R.string.cancel_label, null); + builder.show(); + } + + private static void updateFilter(Set filterValues) { + SubscriptionsFilter subscriptionsFilter = new SubscriptionsFilter(filterValues.toArray(new String[0])); + UserPreferences.setSubscriptionsFilter(subscriptionsFilter); + EventBus.getDefault().post(new UnreadItemsUpdateEvent()); + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java index 9ecbd52a3..de31071af 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java @@ -39,7 +39,7 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.IntentUtils; -import de.danoeh.antennapod.dialog.FeedFilterDialog; +import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog; import de.danoeh.antennapod.dialog.RenameFeedDialog; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -398,9 +398,9 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli startActivity(intent); } } - } else if (UserPreferences.getFeedFilter() != UserPreferences.FEED_FILTER_NONE + } else if (UserPreferences.getSubscriptionsFilter().isEnabled() && navAdapter.showSubscriptionList) { - FeedFilterDialog.showDialog(requireContext()); + SubscriptionsFilterDialog.showDialog(requireContext()); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java index 433ebe740..70cd6fcb3 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java @@ -49,7 +49,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.download.AutoUpdateManager; -import de.danoeh.antennapod.dialog.FeedFilterDialog; +import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog; import de.danoeh.antennapod.dialog.FeedSortDialog; import de.danoeh.antennapod.dialog.RenameFeedDialog; import de.danoeh.antennapod.menuhandler.MenuItemUtils; @@ -106,7 +106,7 @@ public class SubscriptionFragment extends Fragment { progressBar = root.findViewById(R.id.progLoading); feedsFilteredMsg = root.findViewById(R.id.feeds_filtered_message); - feedsFilteredMsg.setOnClickListener((l) -> FeedFilterDialog.showDialog(requireContext())); + feedsFilteredMsg.setOnClickListener((l) -> SubscriptionsFilterDialog.showDialog(requireContext())); SwipeRefreshLayout swipeRefreshLayout = root.findViewById(R.id.swipeRefresh); swipeRefreshLayout.setOnRefreshListener(() -> { @@ -141,7 +141,7 @@ public class SubscriptionFragment extends Fragment { AutoUpdateManager.runImmediate(requireContext()); return true; case R.id.subscriptions_filter: - FeedFilterDialog.showDialog(requireContext()); + SubscriptionsFilterDialog.showDialog(requireContext()); return true; case R.id.subscriptions_sort: FeedSortDialog.showDialog(requireContext()); @@ -225,7 +225,7 @@ public class SubscriptionFragment extends Fragment { progressBar.setVisibility(View.GONE); }, error -> Log.e(TAG, Log.getStackTraceString(error))); - if (UserPreferences.getFeedFilter() != UserPreferences.FEED_FILTER_NONE) { + if (UserPreferences.getSubscriptionsFilter().isEnabled()) { feedsFilteredMsg.setText("{md-info-outline} " + getString(R.string.subscriptions_are_filtered)); Iconify.addIcons(feedsFilteredMsg); feedsFilteredMsg.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java index 12be76ba7..689a72ba7 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/UserInterfacePreferencesFragment.java @@ -1,7 +1,6 @@ package de.danoeh.antennapod.fragment.preferences; import android.content.Context; -import android.content.Intent; import android.os.Build; import android.os.Bundle; import com.google.android.material.snackbar.Snackbar; @@ -9,10 +8,9 @@ import androidx.appcompat.app.AlertDialog; import androidx.preference.PreferenceFragmentCompat; import android.widget.ListView; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.PreferenceActivity; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.dialog.FeedFilterDialog; +import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog; import de.danoeh.antennapod.dialog.FeedSortDialog; import de.danoeh.antennapod.fragment.NavDrawerFragment; import org.apache.commons.lang3.ArrayUtils; @@ -79,7 +77,7 @@ public class UserInterfacePreferencesFragment extends PreferenceFragmentCompat { findPreference(UserPreferences.PREF_FILTER_FEED) .setOnPreferenceClickListener((preference -> { - FeedFilterDialog.showDialog(requireContext()); + SubscriptionsFilterDialog.showDialog(requireContext()); return true; })); -- cgit v1.2.3