From f9e344e2154bb43fa25fabaf4c05114b15d10456 Mon Sep 17 00:00:00 2001 From: GitStart <1501599+gitstart@users.noreply.github.com> Date: Thu, 2 Feb 2023 07:04:07 +0800 Subject: Add long press menu to search results in subscriptions list (#6267) --- .../adapter/HorizontalFeedListAdapter.java | 31 +++++++++++++- .../danoeh/antennapod/fragment/SearchFragment.java | 30 +++++++++++--- .../antennapod/fragment/SubscriptionFragment.java | 46 ++------------------- .../antennapod/menuhandler/FeedMenuHandler.java | 47 ++++++++++++++++++++++ 4 files changed, 105 insertions(+), 49 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java index 9d2713f48..9a578da6a 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/HorizontalFeedListAdapter.java @@ -16,10 +16,17 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -public class HorizontalFeedListAdapter extends RecyclerView.Adapter { +import android.view.ContextMenu; +import android.view.MenuInflater; +import androidx.annotation.Nullable; + +public class HorizontalFeedListAdapter extends RecyclerView.Adapter + implements View.OnCreateContextMenuListener { private final WeakReference mainActivityRef; private final List data = new ArrayList<>(); private int dummyViews = 0; + private Feed longPressedItem; + public HorizontalFeedListAdapter(MainActivity mainActivity) { this.mainActivityRef = new WeakReference<>(mainActivity); @@ -57,6 +64,13 @@ public class HorizontalFeedListAdapter extends RecyclerView.Adapter mainActivityRef.get().loadChildFragment(FeedItemlistFragment.newInstance(podcast.getId()))); + holder.imageView.setOnCreateContextMenuListener(this); + holder.imageView.setOnLongClickListener(v -> { + int currentItemPosition = holder.getBindingAdapterPosition(); + longPressedItem = data.get(currentItemPosition); + return false; + }); + Glide.with(mainActivityRef.get()) .load(podcast.getImageUrl()) .apply(new RequestOptions() @@ -66,6 +80,11 @@ public class HorizontalFeedListAdapter extends RecyclerView.Adapter= data.size()) { @@ -79,6 +98,16 @@ public class HorizontalFeedListAdapter extends RecyclerView.Adapter { })) { + return true; + } FeedItem selectedItem = adapter.getLongPressedItem(); - if (selectedItem == null) { - Log.i(TAG, "Selected item at current position was null, ignoring selection"); - return super.onContextItemSelected(item); + if (selectedItem != null && FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedItem)) { + return true; } - return FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedItem); + return super.onContextItemSelected(item); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onFeedListChanged(FeedListUpdateEvent event) { + search(); } @Subscribe(threadMode = ThreadMode.MAIN) 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 2800537e2..15886cf9a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java @@ -1,8 +1,6 @@ package de.danoeh.antennapod.fragment; -import android.annotation.SuppressLint; import android.content.Context; -import android.content.DialogInterface; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; @@ -17,7 +15,6 @@ import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.StringRes; import com.google.android.material.appbar.MaterialToolbar; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.GridLayoutManager; @@ -28,7 +25,6 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.joanzapata.iconify.Iconify; import com.leinardi.android.speeddial.SpeedDialView; -import de.danoeh.antennapod.dialog.TagSettingsDialog; import de.danoeh.antennapod.ui.statistics.StatisticsFragment; import de.danoeh.antennapod.view.LiftOnScrollListener; import org.greenrobot.eventbus.EventBus; @@ -36,15 +32,12 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Locale; -import java.util.concurrent.Callable; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.adapter.SubscriptionsRecyclerAdapter; -import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.event.DownloadEvent; import de.danoeh.antennapod.event.FeedListUpdateEvent; import de.danoeh.antennapod.event.UnreadItemsUpdateEvent; @@ -52,16 +45,15 @@ import de.danoeh.antennapod.core.menuhandler.MenuItemUtils; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.NavDrawerData; import de.danoeh.antennapod.core.util.download.AutoUpdateManager; import de.danoeh.antennapod.dialog.FeedSortDialog; -import de.danoeh.antennapod.dialog.RemoveFeedDialog; import de.danoeh.antennapod.dialog.RenameItemDialog; import de.danoeh.antennapod.dialog.SubscriptionsFilterDialog; import de.danoeh.antennapod.fragment.actions.FeedMultiSelectActionHandler; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.view.EmptyViewHandler; +import de.danoeh.antennapod.menuhandler.FeedMenuHandler; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -350,43 +342,11 @@ public class SubscriptionFragment extends Fragment } Feed feed = ((NavDrawerData.FeedDrawerItem) drawerItem).feed; - if (itemId == R.id.remove_all_inbox_item) { - displayConfirmationDialog( - R.string.remove_all_inbox_label, - R.string.remove_all_inbox_confirmation_msg, - () -> DBWriter.removeFeedNewFlag(feed.getId())); - return true; - } else if (itemId == R.id.edit_tags) { - TagSettingsDialog.newInstance(Collections.singletonList(feed.getPreferences())) - .show(getChildFragmentManager(), TagSettingsDialog.TAG); - return true; - } else if (itemId == R.id.rename_item) { - new RenameItemDialog(getActivity(), feed).show(); - return true; - } else if (itemId == R.id.remove_feed) { - RemoveFeedDialog.show(getContext(), feed); - return true; - } else if (itemId == R.id.multi_select) { + if (itemId == R.id.multi_select) { speedDialView.setVisibility(View.VISIBLE); return subscriptionAdapter.onContextItemSelected(item); } - return super.onContextItemSelected(item); - } - - private void displayConfirmationDialog(@StringRes int title, @StringRes int message, Callable task) { - ConfirmationDialog dialog = new ConfirmationDialog(getActivity(), title, message) { - @Override - @SuppressLint("CheckResult") - public void onConfirmButtonPressed(DialogInterface clickedDialog) { - clickedDialog.dismiss(); - Observable.fromCallable(task) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(result -> loadSubscriptions(), - error -> Log.e(TAG, Log.getStackTraceString(error))); - } - }; - dialog.createNewDialog().show(); + return FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), feed, this::loadSubscriptions); } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java index de6056063..7aee499da 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java @@ -14,6 +14,19 @@ import de.danoeh.antennapod.dialog.IntraFeedSortDialog; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.SortOrder; import org.apache.commons.lang3.StringUtils; +import android.content.DialogInterface; +import android.annotation.SuppressLint; +import androidx.fragment.app.Fragment; +import de.danoeh.antennapod.core.dialog.ConfirmationDialog; +import de.danoeh.antennapod.dialog.RemoveFeedDialog; +import de.danoeh.antennapod.dialog.RenameItemDialog; +import de.danoeh.antennapod.dialog.TagSettingsDialog; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import java.util.Collections; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; /** * Handles interactions with the FeedItemMenu. @@ -75,4 +88,38 @@ public class FeedMenuHandler { sortDialog.openDialog(); } + public static boolean onMenuItemClicked(@NonNull Fragment fragment, int menuItemId, + @NonNull Feed selectedFeed, Runnable callback) { + @NonNull Context context = fragment.requireContext(); + if (menuItemId == R.id.rename_folder_item) { + new RenameItemDialog(fragment.getActivity(), selectedFeed).show(); + } else if (menuItemId == R.id.remove_all_inbox_item) { + ConfirmationDialog dialog = new ConfirmationDialog(fragment.getActivity(), + R.string.remove_all_inbox_label, R.string.remove_all_inbox_confirmation_msg) { + @Override + @SuppressLint("CheckResult") + public void onConfirmButtonPressed(DialogInterface clickedDialog) { + clickedDialog.dismiss(); + Observable.fromCallable((Callable) () -> DBWriter.removeFeedNewFlag(selectedFeed.getId())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> callback.run(), + error -> Log.e(TAG, Log.getStackTraceString(error))); + } + }; + dialog.createNewDialog().show(); + + } else if (menuItemId == R.id.edit_tags) { + TagSettingsDialog.newInstance(Collections.singletonList(selectedFeed.getPreferences())) + .show(fragment.getChildFragmentManager(), TagSettingsDialog.TAG); + } else if (menuItemId == R.id.rename_item) { + new RenameItemDialog(fragment.getActivity(), selectedFeed).show(); + } else if (menuItemId == R.id.remove_feed) { + RemoveFeedDialog.show(context, selectedFeed); + } else { + return false; + } + return true; + } + } -- cgit v1.2.3