diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java index b554e1d31..443a582bc 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java @@ -299,7 +299,7 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O public boolean onContextItemSelected(@NonNull MenuItem item) { Feed selectedFeedItem = adapterFeeds.getLongPressedItem(); if (selectedFeedItem != null - && FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedFeedItem, () -> { })) { + && FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedFeedItem)) { return true; } FeedItem selectedItem = adapter.getLongPressedItem(); 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 8bff8cf2b..5f12c7418 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 @@ -198,7 +198,7 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS new RemoveFeedDialogClose(Collections.singletonList(feed)).show(getParentFragmentManager(), null); return true; } - if (FeedMenuHandler.onMenuItemClicked(this, itemId, feed, null)) { + if (FeedMenuHandler.onMenuItemClicked(this, itemId, feed)) { return true; } return super.onContextItemSelected(item); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java index da8925dce..d0496fcbc 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java @@ -335,9 +335,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem return true; } - Runnable showRemovedAllSnackbar = () -> EventBus.getDefault().post( - new MessageEvent(getString(R.string.removed_all_inbox_msg))); - return FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), feed, showRemovedAllSnackbar); + return FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), feed); } public static class RemoveFeedDialogClose extends RemoveFeedDialog { diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeSection.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeSection.java index e091726eb..942bf2a36 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeSection.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/HomeSection.java @@ -57,7 +57,7 @@ public abstract class HomeSection extends Fragment implements View.OnCreateConte HorizontalFeedListAdapter adapter = (HorizontalFeedListAdapter) viewBinding.recyclerView.getAdapter(); Feed selectedFeed = adapter.getLongPressedItem(); return selectedFeed != null - && FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedFeed, () -> { }); + && FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedFeed); } FeedItem longPressedItem; if (viewBinding.recyclerView.getAdapter() instanceof EpisodeItemListAdapter) { diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMenuHandler.java index 923f84e16..2a2376498 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMenuHandler.java @@ -1,37 +1,24 @@ package de.danoeh.antennapod.ui.screen.subscriptions; -import android.annotation.SuppressLint; import android.content.Context; -import android.content.DialogInterface; -import android.util.Log; import android.view.Menu; import android.view.MenuItem; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.ui.common.ConfirmationDialog; -import de.danoeh.antennapod.storage.database.DBWriter; +import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.ui.screen.feed.RemoveFeedDialog; import de.danoeh.antennapod.ui.screen.feed.RenameFeedDialog; import de.danoeh.antennapod.ui.screen.feed.preferences.TagSettingsDialog; -import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.ui.share.ShareUtils; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; -import io.reactivex.rxjava3.schedulers.Schedulers; import java.util.Collections; import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.Future; /** * Handles interactions with the FeedItemMenu. */ public abstract class FeedMenuHandler { - private static final String TAG = "FeedMenuHandler"; - public static boolean onPrepareMenu(Menu menu, List selectedItems) { if (menu == null || selectedItems == null || selectedItems.isEmpty() || selectedItems.get(0) == null) { return false; @@ -62,29 +49,13 @@ public abstract class FeedMenuHandler { } public static boolean onMenuItemClicked(@NonNull Fragment fragment, int menuItemId, - @NonNull Feed selectedFeed, @Nullable Runnable removeFromInboxCallback) { + @NonNull Feed selectedFeed) { @NonNull Context context = fragment.requireContext(); if (menuItemId == R.id.rename_folder_item) { new RenameFeedDialog(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 -> { - if (removeFromInboxCallback != null) { - removeFromInboxCallback.run(); - } - }, error -> Log.e(TAG, Log.getStackTraceString(error))); - } - }; - dialog.createNewDialog().show(); - + new FeedMultiSelectActionHandler(fragment.getActivity(), Collections.singletonList(selectedFeed)) + .handleAction(R.id.remove_all_inbox_item); } else if (menuItemId == R.id.edit_tags) { TagSettingsDialog.newInstance(Collections.singletonList(selectedFeed.getPreferences())) .show(fragment.getChildFragmentManager(), TagSettingsDialog.TAG); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMultiSelectActionHandler.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMultiSelectActionHandler.java index 792c43201..0d0d0c97f 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMultiSelectActionHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/FeedMultiSelectActionHandler.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.ui.screen.subscriptions; +import android.content.DialogInterface; import android.util.Log; import androidx.annotation.PluralsRes; @@ -15,12 +16,16 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.event.MessageEvent; import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.databinding.PlaybackSpeedFeedSettingDialogBinding; +import de.danoeh.antennapod.ui.common.ConfirmationDialog; import de.danoeh.antennapod.ui.screen.feed.RemoveFeedDialog; import de.danoeh.antennapod.ui.screen.feed.preferences.TagSettingsDialog; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedPreferences; import de.danoeh.antennapod.ui.screen.preferences.PreferenceListDialog; import de.danoeh.antennapod.ui.screen.preferences.PreferenceSwitchDialog; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.schedulers.Schedulers; import org.greenrobot.eventbus.EventBus; import de.danoeh.antennapod.ui.share.ShareUtils; @@ -53,6 +58,8 @@ public class FeedMultiSelectActionHandler { playbackSpeedPrefHandler(); } else if (id == R.id.edit_tags) { editFeedPrefTags(); + } else if (id == R.id.remove_all_inbox_item) { + removeAllFromInbox(); } else if (id == R.id.share_feed) { if (!selectedItems.get(0).isLocalFeed()) { ShareUtils.shareFeedLink(activity, selectedItems.get(0)); @@ -150,4 +157,21 @@ public class FeedMultiSelectActionHandler { TagSettingsDialog.newInstance(preferencesList).show(activity.getSupportFragmentManager(), TagSettingsDialog.TAG); } + + private void removeAllFromInbox() { + new ConfirmationDialog(activity, R.string.remove_all_inbox_label, R.string.remove_all_inbox_confirmation_msg) { + @Override + public void onConfirmButtonPressed(DialogInterface clickedDialog) { + clickedDialog.dismiss(); + Observable.fromAction(() -> { + for (Feed selectedFeed : selectedItems) { + DBWriter.removeFeedNewFlag(selectedFeed.getId()); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { }, error -> Log.e(TAG, Log.getStackTraceString(error))); + } + }.createNewDialog().show(); + } } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionFragment.java index a134ac059..b6fc9f7c6 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionFragment.java @@ -144,13 +144,6 @@ public class SubscriptionFragment extends Fragment subscriptionRecycler.addOnScrollListener(new LiftOnScrollListener(root.findViewById(R.id.appbar))); subscriptionRecycler.addOnScrollListener(new LiftOnScrollListener(collapsingContainer)); subscriptionAdapter = new SubscriptionsRecyclerAdapter((MainActivity) getActivity()) { - @Override - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - MenuItemUtils.setOnClickListeners(menu, SubscriptionFragment.this::onContextItemSelected); - FeedMenuHandler.onPrepareMenu(menu, Collections.singletonList(getLongPressedItem())); - } - @Override protected void onSelectedItemsUpdated() { super.onSelectedItemsUpdated(); @@ -201,8 +194,12 @@ public class SubscriptionFragment extends Fragment subscriptionAddButton.setVisibility(View.GONE); } floatingSelectMenu.setOnMenuItemClickListener(menuItem -> { - new FeedMultiSelectActionHandler(getActivity(), subscriptionAdapter.getSelectedItems()) + List selection = subscriptionAdapter.getSelectedItems(); + new FeedMultiSelectActionHandler(getActivity(), selection) .handleAction(menuItem.getItemId()); + if (selection.size() <= 1) { + subscriptionAdapter.endSelectMode(); + } return true; }); @@ -473,18 +470,6 @@ public class SubscriptionFragment extends Fragment return TagMenuHandler.onMenuItemClicked(this, selectedTag, item, tagAdapter); } - @Override - public boolean onContextItemSelected(@NonNull MenuItem item) { - Feed selectedFeed = subscriptionAdapter.getSelectedItem(); - if (selectedFeed == null) { - return false; - } - if (item.getItemId() == R.id.multi_select) { - return subscriptionAdapter.onContextItemSelected(item); - } - return FeedMenuHandler.onMenuItemClicked(this, item.getItemId(), selectedFeed, this::loadSubscriptionsAndTags); - } - @Subscribe(threadMode = ThreadMode.MAIN) public void onFeedListChanged(FeedListUpdateEvent event) { loadSubscriptionsAndTags(); diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionsRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionsRecyclerAdapter.java index 06b77d00e..56287e1d8 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionsRecyclerAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/subscriptions/SubscriptionsRecyclerAdapter.java @@ -3,13 +3,7 @@ package de.danoeh.antennapod.ui.screen.subscriptions; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; -import android.os.Build; -import android.view.ContextMenu; -import android.view.InputDevice; import android.view.LayoutInflater; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -32,13 +26,10 @@ import java.util.Map; /** * Adapter for subscriptions */ -public class SubscriptionsRecyclerAdapter extends SelectableAdapter - implements View.OnCreateContextMenuListener { +public class SubscriptionsRecyclerAdapter extends SelectableAdapter { private final WeakReference mainActivityRef; private List listItems; private Map feedCounters; - private Feed selectedItem = null; - int longPressedPosition = 0; // used to init actionMode private int columnCount = 3; public SubscriptionsRecyclerAdapter(MainActivity mainActivity) { @@ -57,10 +48,6 @@ public class SubscriptionsRecyclerAdapter extends SelectableAdapter { if (!inActionMode()) { - longPressedPosition = holder.getBindingAdapterPosition(); - selectedItem = feed; - } - return false; - }); - - holder.itemView.setOnTouchListener((v, e) -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (e.isFromSource(InputDevice.SOURCE_MOUSE) - && e.getButtonState() == MotionEvent.BUTTON_SECONDARY) { - if (!inActionMode()) { - longPressedPosition = holder.getBindingAdapterPosition(); - selectedItem = feed; - } - } + startSelectMode(holder.getBindingAdapterPosition()); + return true; } return false; }); @@ -143,7 +119,6 @@ public class SubscriptionsRecyclerAdapter extends SelectableAdapter getSelectedItems() { List items = new ArrayList<>(); for (int i = 0; i < getItemCount(); i++) { diff --git a/app/src/main/res/layout/subscription_grid_item.xml b/app/src/main/res/layout/subscription_grid_item.xml index d3d78c7f9..245c23e91 100644 --- a/app/src/main/res/layout/subscription_grid_item.xml +++ b/app/src/main/res/layout/subscription_grid_item.xml @@ -69,7 +69,7 @@ android:layout_height="48dp" android:layout_gravity="top" android:rotation="180" - android:alpha="0.6" + android:alpha="0.4" android:visibility="gone" tools:visibility="visible" app:srcCompat="@drawable/bg_gradient" diff --git a/app/src/main/res/menu/nav_feed_action_speeddial.xml b/app/src/main/res/menu/nav_feed_action_speeddial.xml index 399d529b8..528d11bab 100644 --- a/app/src/main/res/menu/nav_feed_action_speeddial.xml +++ b/app/src/main/res/menu/nav_feed_action_speeddial.xml @@ -12,6 +12,12 @@ android:title="@string/share_label" android:icon="@drawable/ic_share"/> + +