Show all tags on subscriptions screen, even if filtered (#7994)

This commit is contained in:
Hans-Peter Lehmann 2025-09-16 20:19:17 +02:00 committed by GitHub
parent de0f09f1e2
commit af187ca551
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 75 additions and 37 deletions

View File

@ -1,7 +1,6 @@
package de.danoeh.antennapod.ui.screen.subscriptions;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
@ -31,14 +30,11 @@ import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.storage.database.NavDrawerData;
import de.danoeh.antennapod.storage.preferences.UserPreferences;
import de.danoeh.antennapod.ui.MenuItemUtils;
import de.danoeh.antennapod.ui.common.ConfirmationDialog;
import de.danoeh.antennapod.ui.screen.AddFeedFragment;
import de.danoeh.antennapod.ui.screen.SearchFragment;
import de.danoeh.antennapod.ui.screen.feed.RenameFeedDialog;
import de.danoeh.antennapod.ui.statistics.StatisticsFragment;
import de.danoeh.antennapod.ui.view.EmptyViewHandler;
import de.danoeh.antennapod.ui.view.FloatingSelectMenu;
@ -201,9 +197,6 @@ public class SubscriptionFragment extends Fragment
};
tagAdapter.setSelectedTag(prefs.getString(PREF_LAST_TAG, FeedPreferences.TAG_ROOT));
tagsRecycler.setAdapter(tagAdapter);
if (getArguments() != null) {
tagAdapter.setSelectedTag(getArguments().getString(ARGUMENT_FOLDER, null));
}
return root;
}
@ -331,14 +324,19 @@ public class SubscriptionFragment extends Fragment
}
emptyView.hide();
disposable = Observable.fromCallable(
() -> DBReader.getNavDrawerData(UserPreferences.getSubscriptionsFilter(),
UserPreferences.getFeedOrder(), UserPreferences.getFeedCounterSetting()))
() -> {
NavDrawerData navDrawerData = DBReader.getNavDrawerData(
UserPreferences.getSubscriptionsFilter(),
UserPreferences.getFeedOrder(), UserPreferences.getFeedCounterSetting());
List<NavDrawerData.TagItem> tags = DBReader.getAllTags();
return new Pair<>(navDrawerData, tags);
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> {
List<Feed> openedFolderFeeds = result.feeds;
for (NavDrawerData.TagItem tag : result.tags) {
List<Feed> openedFolderFeeds = result.first.feeds;
for (NavDrawerData.TagItem tag : result.first.tags) { // Filtered list
if (tag.getTitle().equals(tagAdapter.getSelectedTag())) {
openedFolderFeeds = tag.getFeeds();
break;
@ -352,14 +350,14 @@ public class SubscriptionFragment extends Fragment
}
feeds = openedFolderFeeds;
progressBar.setVisibility(View.GONE);
subscriptionAdapter.setItems(feeds, result.feedCounters);
subscriptionAdapter.setItems(feeds, result.first.feedCounters);
if (firstLoaded) {
restoreScrollPosition(scrollPosition);
}
emptyView.updateVisibility();
if (tagAdapter != null) {
tagAdapter.setTags(result.tags);
tagsRecycler.setVisibility(result.tags.size() > 1 ? View.VISIBLE : View.GONE);
tagAdapter.setTags(result.second);
tagsRecycler.setVisibility(result.second.size() > 1 ? View.VISIBLE : View.GONE);
}
}, error -> {
Log.e(TAG, Log.getStackTraceString(error));
@ -386,29 +384,7 @@ public class SubscriptionFragment extends Fragment
if (selectedTag == null) {
return false;
}
int itemId = item.getItemId();
if (itemId == R.id.rename_folder_item) {
new RenameFeedDialog(getActivity(), selectedTag).show();
return true;
} else if (itemId == R.id.delete_folder_item) {
ConfirmationDialog dialog = new ConfirmationDialog(getContext(), R.string.delete_tag_label,
getString(R.string.delete_tag_confirmation, selectedTag.getTitle())) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
tagAdapter.setSelectedTag(FeedPreferences.TAG_ROOT);
for (Feed feed : selectedTag.getFeeds()) {
FeedPreferences preferences = feed.getPreferences();
preferences.getTags().remove(selectedTag.getTitle());
DBWriter.setFeedPreferences(preferences);
}
}
};
dialog.createNewDialog().show();
return true;
}
return false;
return TagMenuHandler.onMenuItemClicked(this, selectedTag, item, tagAdapter);
}
@Override

View File

@ -66,6 +66,7 @@ public class SubscriptionTagAdapter extends RecyclerView.Adapter<SubscriptionTag
holder.chip.setText(title);
}
holder.chip.setChecked(tag.getTitle().equals(selectedTag));
holder.chip.setElevation(0);
holder.chip.setOnClickListener(v -> onTagClick(tag));
holder.chip.setOnTouchListener((v, e) -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

View File

@ -0,0 +1,44 @@
package de.danoeh.antennapod.ui.screen.subscriptions;
import android.content.DialogInterface;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.storage.database.DBWriter;
import de.danoeh.antennapod.storage.database.NavDrawerData;
import de.danoeh.antennapod.ui.common.ConfirmationDialog;
import de.danoeh.antennapod.ui.screen.feed.RenameFeedDialog;
public class TagMenuHandler {
private TagMenuHandler() {
}
public static boolean onMenuItemClicked(@NonNull Fragment fragment, NavDrawerData.TagItem selectedTag,
MenuItem item, SubscriptionTagAdapter tagAdapter) {
int itemId = item.getItemId();
if (itemId == R.id.rename_folder_item) {
new RenameFeedDialog(fragment.getActivity(), selectedTag).show();
return true;
} else if (itemId == R.id.delete_folder_item) {
ConfirmationDialog dialog = new ConfirmationDialog(fragment.getContext(), R.string.delete_tag_label,
fragment.getString(R.string.delete_tag_confirmation, selectedTag.getTitle())) {
@Override
public void onConfirmButtonPressed(DialogInterface dialog) {
tagAdapter.setSelectedTag(FeedPreferences.TAG_ROOT);
for (Feed feed : selectedTag.getFeeds()) {
FeedPreferences preferences = feed.getPreferences();
preferences.getTags().remove(selectedTag.getTitle());
DBWriter.setFeedPreferences(preferences);
}
}
};
dialog.createNewDialog().show();
return true;
}
return false;
}
}

View File

@ -4,6 +4,7 @@
android:id="@+id/tag_chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="0dp"
android:checkable="true"
android:longClickable="true"
style="@style/Widget.Material3.Chip.Filter" />

View File

@ -755,6 +755,22 @@ public final class DBReader {
return result;
}
public static List<NavDrawerData.TagItem> getAllTags() {
Map<String, NavDrawerData.TagItem> tags = new HashMap<>();
List<Feed> feeds = getFeedList();
for (Feed feed : feeds) {
for (String tag : feed.getPreferences().getTags()) {
if (!tags.containsKey(tag)) {
tags.put(tag, new NavDrawerData.TagItem(tag));
}
tags.get(tag).addFeed(feed, 0);
}
}
List<NavDrawerData.TagItem> tagsSorted = new ArrayList<>(tags.values());
Collections.sort(tagsSorted, (o1, o2) -> o1.getTitle().compareToIgnoreCase(o2.getTitle()));
return tagsSorted;
}
public static List<FeedItem> searchFeedItems(final long feedId, final String query) {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();