Reduced lag when switching tabs

This commit is contained in:
ByteHamster 2020-11-01 16:06:02 +01:00
parent bec385a0a8
commit 87e7a67610
13 changed files with 44 additions and 75 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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<FeedItem> 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)));
}

View File

@ -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) {

View File

@ -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);
}

View File

@ -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());
}
}

View File

@ -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);
}

View File

@ -6,6 +6,14 @@
android:menuCategory="container"
android:title="@string/multi_select"
android:icon="?attr/checkbox_multiple"
android:visible="false"
app:showAsAction="ifRoom" />
<item
android:id="@+id/clear_logs_item"
android:menuCategory="container"
android:title="@string/clear_history_label"
android:icon="?attr/ic_delete"
android:visible="false"
app:showAsAction="ifRoom" />
<item
android:id="@+id/refresh_item"

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/clear_history_item"
android:menuCategory="container"
android:title="@string/clear_history_label"
android:icon="?attr/ic_delete"
app:showAsAction="ifRoom" />
<item
android:id="@+id/refresh_item"
android:title="@string/refresh_label"
android:menuCategory="container"
app:showAsAction="ifRoom"
android:icon="?attr/navigation_refresh"/>
</menu>

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/refresh_item"
android:title="@string/refresh_label"
android:menuCategory="container"
app:showAsAction="ifRoom"
android:icon="?attr/navigation_refresh"/>
</menu>