From e48af3f094c2e104530018fc7ceca7f87936a4dc Mon Sep 17 00:00:00 2001 From: NWuensche Date: Fri, 31 Jan 2025 16:32:36 +0000 Subject: [PATCH] Fix multiselect with lazy loading on podcast screen (#7614) --- .../ui/screen/feed/FeedItemlistFragment.java | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) 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 6e1dfa56e..10a002a71 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 @@ -64,6 +64,7 @@ import de.danoeh.antennapod.ui.screen.episode.ItemPagerFragment; import de.danoeh.antennapod.ui.screen.feed.preferences.FeedSettingsFragment; import de.danoeh.antennapod.ui.screen.subscriptions.FeedMenuHandler; import de.danoeh.antennapod.ui.swipeactions.SwipeActions; +import io.reactivex.Completable; import io.reactivex.Maybe; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -201,14 +202,36 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem Snackbar.LENGTH_SHORT); return false; } - new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId()) - .handleAction(adapter.getSelectedItems()); - adapter.endSelectMode(); + EpisodeMultiSelectActionHandler handler + = new EpisodeMultiSelectActionHandler(getActivity(), menuItem.getItemId()); + Completable.fromAction(() -> handleActionForAllSelectedItems(handler)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> adapter.endSelectMode(), + error -> Log.e(TAG, Log.getStackTraceString(error))); return true; }); return viewBinding.getRoot(); } + private void handleActionForAllSelectedItems(EpisodeMultiSelectActionHandler handler) { + handler.handleAction(adapter.getSelectedItems()); + if (adapter.shouldSelectLazyLoadedItems()) { + int applyPage = page + 1; + List nextPage; + do { + nextPage = loadMoreData(applyPage); + handler.handleAction(nextPage); + applyPage++; + } while (nextPage.size() == EPISODES_PER_PAGE); + } + } + + private List loadMoreData(int page) { + Feed feed = DBReader.getFeed(feedID, true, (page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE); + return feed != null ? feed.getItems() : Collections.emptyList(); + } + private void updateRecyclerPadding() { boolean hasMorePages = feed != null && feed.isPaged() && feed.getNextPageLink() != null; boolean pageLoaderVisible = viewBinding.recyclerView.isScrolledToBottom() && hasMorePages; @@ -619,20 +642,19 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem isLoadingMore = true; adapter.setDummyViews(1); adapter.notifyItemInserted(adapter.getItemCount() - 1); - disposable = Observable.fromCallable(() -> DBReader.getFeed(feedID, true, - (page - 1) * EPISODES_PER_PAGE, EPISODES_PER_PAGE)) + disposable = Observable.fromCallable(() -> loadMoreData(page)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( - data -> { - if (data.getItems().size() < EPISODES_PER_PAGE) { + items -> { + if (items.size() < EPISODES_PER_PAGE) { hasMoreItems = false; } - feed.getItems().addAll(data.getItems()); + feed.getItems().addAll(items); adapter.setDummyViews(0); adapter.updateItems(feed.getItems()); if (adapter.shouldSelectLazyLoadedItems()) { - adapter.setSelected(feed.getItems().size() - data.getItems().size(), + adapter.setSelected(feed.getItems().size() - items.size(), feed.getItems().size(), true); } }, error -> {