From 87e7a6761036d5a700cbd4ffdebf87fa76ca7848 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 16:06:02 +0100 Subject: [PATCH] Reduced lag when switching tabs --- .../fragment/AllEpisodesFragment.java | 5 +++-- .../fragment/CompletedDownloadsFragment.java | 6 +----- .../fragment/DownloadLogFragment.java | 8 ++----- .../fragment/DownloadsFragment.java | 1 + .../antennapod/fragment/EpisodesFragment.java | 3 +++ .../fragment/EpisodesListFragment.java | 21 ++++--------------- .../fragment/FavoriteEpisodesFragment.java | 9 ++++++++ .../fragment/NewEpisodesFragment.java | 6 ++++-- .../fragment/PagedToolbarFragment.java | 19 +++++++---------- .../fragment/RunningDownloadsFragment.java | 7 ++----- ...{downloads_completed.xml => downloads.xml} | 8 +++++++ app/src/main/res/menu/downloads_log.xml | 16 -------------- app/src/main/res/menu/downloads_running.xml | 10 --------- 13 files changed, 44 insertions(+), 75 deletions(-) rename app/src/main/res/menu/{downloads_completed.xml => downloads.xml} (68%) delete mode 100644 app/src/main/res/menu/downloads_log.xml delete mode 100644 app/src/main/res/menu/downloads_running.xml diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 0c75b7eea..ae3ba3a54 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -56,10 +56,11 @@ public class AllEpisodesFragment extends EpisodesListFragment { } @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); + public void onPrepareOptionsMenu(@NonNull Menu menu) { + super.onPrepareOptionsMenu(menu); menu.findItem(R.id.filter_items).setVisible(true); menu.findItem(R.id.mark_all_read_item).setVisible(true); + menu.findItem(R.id.remove_all_new_flags_item).setVisible(false); } @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index a18d7acb9..59b2cd234 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -104,13 +104,9 @@ public class CompletedDownloadsFragment extends Fragment { } } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.downloads_completed, menu); - } - @Override public void onPrepareOptionsMenu(@NonNull Menu menu) { + menu.findItem(R.id.clear_logs_item).setVisible(false); menu.findItem(R.id.episode_actions).setVisible(items.size() > 0); isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index 91b8ee5cb..98d6a946b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -165,14 +165,10 @@ public class DownloadLogFragment extends ListFragment { loadItems(); } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.downloads_log, menu); - } - @Override public void onPrepareOptionsMenu(@NonNull Menu menu) { - menu.findItem(R.id.clear_history_item).setVisible(!downloadLog.isEmpty()); + menu.findItem(R.id.episode_actions).setVisible(false); + menu.findItem(R.id.clear_logs_item).setVisible(!downloadLog.isEmpty()); isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java index 1a84fd69e..ffb3e71fa 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java @@ -47,6 +47,7 @@ public class DownloadsFragment extends PagedToolbarFragment { View root = inflater.inflate(R.layout.pager_fragment, container, false); Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(R.string.downloads_label); + toolbar.inflateMenu(R.menu.downloads); ((MainActivity) getActivity()).setupToolbarToggle(toolbar); viewPager = root.findViewById(R.id.viewpager); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java index 83f769207..eff23f7a3 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java @@ -18,6 +18,7 @@ import com.google.android.material.tabs.TabLayoutMediator; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.menuhandler.MenuItemUtils; public class EpisodesFragment extends PagedToolbarFragment { @@ -41,6 +42,8 @@ public class EpisodesFragment extends PagedToolbarFragment { View rootView = inflater.inflate(R.layout.pager_fragment, container, false); Toolbar toolbar = rootView.findViewById(R.id.toolbar); toolbar.setTitle(R.string.episodes_label); + toolbar.inflateMenu(R.menu.episodes); + MenuItemUtils.setupSearchItem(toolbar.getMenu(), (MainActivity) getActivity(), 0, ""); ((MainActivity) getActivity()).setupToolbarToggle(toolbar); ViewPager2 viewPager = rootView.findViewById(R.id.viewpager); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java index cfb38881d..8dae310ba 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java @@ -13,7 +13,6 @@ import android.os.Looper; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -76,7 +75,6 @@ public abstract class EpisodesListFragment extends Fragment { List episodes = new ArrayList<>(); private volatile boolean isUpdatingFeeds; - private boolean isMenuVisible = true; protected Disposable disposable; protected TextView txtvInformation; @@ -116,18 +114,6 @@ public abstract class EpisodesListFragment extends Fragment { private final MenuItemUtils.UpdateRefreshMenuItemChecker updateRefreshMenuItemChecker = () -> DownloadService.isRunning && DownloadRequester.getInstance().isDownloadingFeeds(); - @Override - public void setMenuVisibility(final boolean visible) { - super.setMenuVisibility(visible); - isMenuVisible = visible; - } - - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.episodes, menu); - MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0, ""); - } - @Override public void onPrepareOptionsMenu(@NonNull Menu menu) { isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); @@ -288,7 +274,7 @@ public abstract class EpisodesListFragment extends Fragment { if (restoreScrollPosition) { recyclerView.restoreScrollPosition(getPrefName()); } - if (isMenuVisible && isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { + if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } @@ -343,7 +329,7 @@ public abstract class EpisodesListFragment extends Fragment { public void onEventMainThread(DownloadEvent event) { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); DownloaderUpdate update = event.update; - if (isMenuVisible && event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { + if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } if (update.mediaIds.length > 0) { @@ -358,7 +344,7 @@ public abstract class EpisodesListFragment extends Fragment { private void updateUi() { loadItems(); - if (isMenuVisible && isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { + if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } @@ -390,6 +376,7 @@ public abstract class EpisodesListFragment extends Fragment { hasMoreItems = true; episodes = data; onFragmentLoaded(episodes); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); }, error -> Log.e(TAG, Log.getStackTraceString(error))); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java index d50be88c5..e1fd36731 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FavoriteEpisodesFragment.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.fragment; import android.os.Bundle; +import android.view.Menu; import androidx.annotation.NonNull; import com.google.android.material.snackbar.Snackbar; import androidx.recyclerview.widget.RecyclerView; @@ -42,6 +43,14 @@ public class FavoriteEpisodesFragment extends EpisodesListFragment { loadItems(); } + @Override + public void onPrepareOptionsMenu(@NonNull Menu menu) { + super.onPrepareOptionsMenu(menu); + menu.findItem(R.id.filter_items).setVisible(false); + menu.findItem(R.id.mark_all_read_item).setVisible(false); + menu.findItem(R.id.remove_all_new_flags_item).setVisible(false); + } + @NonNull @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java index 96c02f54d..d748d14c9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -38,8 +38,10 @@ public class NewEpisodesFragment extends EpisodesListFragment { } @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); + public void onPrepareOptionsMenu(@NonNull Menu menu) { + super.onPrepareOptionsMenu(menu); + menu.findItem(R.id.filter_items).setVisible(false); + menu.findItem(R.id.mark_all_read_item).setVisible(false); menu.findItem(R.id.remove_all_new_flags_item).setVisible(true); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java index 686765b90..2ed26b1c0 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java @@ -6,20 +6,19 @@ import androidx.viewpager2.widget.ViewPager2; /** * Fragment with a ViewPager where the displayed items influence the top toolbar's menu. + * All items share the same general menu items and are just allowed to show/hide them. */ public abstract class PagedToolbarFragment extends Fragment { private Toolbar toolbar; private ViewPager2 viewPager; - private int currentInflatedMenu = -1; + /** + * Invalidate the toolbar menu if the current child fragment is visible. + * @param child The fragment, or null to force-refresh whatever the active fragment is. + */ void invalidateOptionsMenuIfActive(Fragment child) { Fragment visibleChild = getChildFragmentManager().findFragmentByTag("f" + viewPager.getCurrentItem()); - if (visibleChild == child) { - if (currentInflatedMenu != viewPager.getCurrentItem()) { - currentInflatedMenu = viewPager.getCurrentItem(); - toolbar.getMenu().clear(); - child.onCreateOptionsMenu(toolbar.getMenu(), getActivity().getMenuInflater()); - } + if (visibleChild == child || child == null) { child.onPrepareOptionsMenu(toolbar.getMenu()); } } @@ -39,11 +38,7 @@ public abstract class PagedToolbarFragment extends Fragment { @Override public void onPageSelected(int position) { Fragment child = getChildFragmentManager().findFragmentByTag("f" + position); - if (child != null && getActivity() != null) { - toolbar.getMenu().clear(); - child.onCreateOptionsMenu(toolbar.getMenu(), getActivity().getMenuInflater()); - currentInflatedMenu = position; - + if (child != null) { child.onPrepareOptionsMenu(toolbar.getMenu()); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java index d02da8b36..087abc327 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java @@ -87,13 +87,10 @@ public class RunningDownloadsFragment extends ListFragment { setListAdapter(null); } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - inflater.inflate(R.menu.downloads_running, menu); - } - @Override public void onPrepareOptionsMenu(@NonNull Menu menu) { + menu.findItem(R.id.clear_logs_item).setVisible(false); + menu.findItem(R.id.episode_actions).setVisible(false); isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } diff --git a/app/src/main/res/menu/downloads_completed.xml b/app/src/main/res/menu/downloads.xml similarity index 68% rename from app/src/main/res/menu/downloads_completed.xml rename to app/src/main/res/menu/downloads.xml index e07af520f..c8ee20e35 100644 --- a/app/src/main/res/menu/downloads_completed.xml +++ b/app/src/main/res/menu/downloads.xml @@ -6,6 +6,14 @@ android:menuCategory="container" android:title="@string/multi_select" android:icon="?attr/checkbox_multiple" + android:visible="false" + app:showAsAction="ifRoom" /> + - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/downloads_running.xml b/app/src/main/res/menu/downloads_running.xml deleted file mode 100644 index a2240d4aa..000000000 --- a/app/src/main/res/menu/downloads_running.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - \ No newline at end of file