From 7c2c97c747d56c2d55b12ff91b9c0aac6c56244b Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 13:07:29 +0100 Subject: Converted pagers to stand-alone toolbar --- .../fragment/CompletedDownloadsFragment.java | 15 +++---- .../antennapod/fragment/DownloadLogFragment.java | 19 ++------ .../antennapod/fragment/DownloadsFragment.java | 9 ++-- .../antennapod/fragment/EpisodesFragment.java | 17 +++---- .../antennapod/fragment/EpisodesListFragment.java | 15 +++---- .../antennapod/fragment/NewEpisodesFragment.java | 5 ++- .../antennapod/fragment/PagedToolbarFragment.java | 52 ++++++++++++++++++++++ .../fragment/RunningDownloadsFragment.java | 13 +++--- 8 files changed, 88 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java (limited to 'app/src/main/java/de/danoeh/antennapod/fragment') 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 55a5d744e..a18d7acb9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -96,12 +96,6 @@ public class CompletedDownloadsFragment extends Fragment { loadItems(); } - @Override - public void onResume() { - super.onResume(); - setHasOptionsMenu(true); - } - @Override public void onStop() { super.onStop(); @@ -112,8 +106,11 @@ public class CompletedDownloadsFragment extends Fragment { @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.downloads_completed, menu); + } + + @Override + public void onPrepareOptionsMenu(@NonNull Menu menu) { menu.findItem(R.id.episode_actions).setVisible(items.size() > 0); isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } @@ -135,7 +132,7 @@ public class CompletedDownloadsFragment extends Fragment { public void onEventMainThread(DownloadEvent event) { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { - getActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } @@ -225,7 +222,7 @@ public class CompletedDownloadsFragment extends Fragment { .subscribe(result -> { items = result; adapter.updateItems(result); - requireActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); progressBar.setVisibility(View.GONE); }, error -> Log.e(TAG, Log.getStackTraceString(error))); } 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 055d88285..91b8ee5cb 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -65,12 +65,6 @@ public class DownloadLogFragment extends ListFragment { loadItems(); } - @Override - public void onResume() { - super.onResume(); - setHasOptionsMenu(true); - } - @Override public void onStop() { super.onStop(); @@ -108,7 +102,7 @@ public class DownloadLogFragment extends ListFragment { private void onFragmentLoaded() { setListShown(true); adapter.notifyDataSetChanged(); - getActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } @Override @@ -173,18 +167,13 @@ public class DownloadLogFragment extends ListFragment { @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.downloads_log, menu); - isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } @Override public void onPrepareOptionsMenu(@NonNull Menu menu) { - super.onPrepareOptionsMenu(menu); - MenuItem menuItem = menu.findItem(R.id.clear_history_item); - if (menuItem != null) { - menuItem.setVisible(!downloadLog.isEmpty()); - } + menu.findItem(R.id.clear_history_item).setVisible(!downloadLog.isEmpty()); + isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } @Override @@ -209,7 +198,7 @@ public class DownloadLogFragment extends ListFragment { public void onEventMainThread(DownloadEvent event) { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { - getActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } 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 bc2d85452..1a84fd69e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java @@ -9,7 +9,6 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.viewpager2.adapter.FragmentStateAdapter; @@ -19,11 +18,12 @@ import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; /** - * Shows the CompletedDownloadsFragment and the RunningDownloadsFragment + * Shows the CompletedDownloadsFragment and the RunningDownloadsFragment. */ -public class DownloadsFragment extends Fragment { +public class DownloadsFragment extends PagedToolbarFragment { public static final String TAG = "DownloadsFragment"; @@ -47,11 +47,12 @@ public class DownloadsFragment extends Fragment { View root = inflater.inflate(R.layout.pager_fragment, container, false); Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(R.string.downloads_label); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); viewPager = root.findViewById(R.id.viewpager); viewPager.setAdapter(new DownloadsPagerAdapter(this)); viewPager.setOffscreenPageLimit(2); + super.setupPagedToolbar(toolbar, viewPager); // Give the TabLayout the ViewPager tabLayout = root.findViewById(R.id.sliding_tabs); 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 afd027b3a..83f769207 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java @@ -8,7 +8,6 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.viewpager2.adapter.FragmentStateAdapter; @@ -18,8 +17,9 @@ import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; -public class EpisodesFragment extends Fragment { +public class EpisodesFragment extends PagedToolbarFragment { public static final String TAG = "EpisodesFragment"; private static final String PREF_LAST_TAB_POSITION = "tab_position"; @@ -29,18 +29,11 @@ public class EpisodesFragment extends Fragment { private static final int POS_FAV_EPISODES = 2; private static final int TOTAL_COUNT = 3; - private TabLayout tabLayout; - private ViewPager2 viewPager; - - //Mandatory Constructor - public EpisodesFragment() { - } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); } public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -48,10 +41,12 @@ public class EpisodesFragment extends Fragment { View rootView = inflater.inflate(R.layout.pager_fragment, container, false); Toolbar toolbar = rootView.findViewById(R.id.toolbar); toolbar.setTitle(R.string.episodes_label); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); - viewPager = rootView.findViewById(R.id.viewpager); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); + + ViewPager2 viewPager = rootView.findViewById(R.id.viewpager); viewPager.setAdapter(new EpisodesPagerAdapter(this)); viewPager.setOffscreenPageLimit(2); + super.setupPagedToolbar(toolbar, viewPager); // Give the TabLayout the ViewPager tabLayout = rootView.findViewById(R.id.sliding_tabs); 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 62400d81d..cfb38881d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesListFragment.java @@ -94,7 +94,6 @@ public abstract class EpisodesListFragment extends Fragment { @Override public void onResume() { super.onResume(); - setHasOptionsMenu(true); registerForContextMenu(recyclerView); } @@ -125,12 +124,12 @@ public abstract class EpisodesListFragment extends Fragment { @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - if (!isAdded()) { - return; - } - super.onCreateOptionsMenu(menu, 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); } @@ -290,7 +289,7 @@ public abstract class EpisodesListFragment extends Fragment { recyclerView.restoreScrollPosition(getPrefName()); } if (isMenuVisible && isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { - requireActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } @@ -345,7 +344,7 @@ public abstract class EpisodesListFragment extends Fragment { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); DownloaderUpdate update = event.update; if (isMenuVisible && event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { - requireActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } if (update.mediaIds.length > 0) { for (long mediaId : update.mediaIds) { @@ -360,7 +359,7 @@ public abstract class EpisodesListFragment extends Fragment { private void updateUi() { loadItems(); if (isMenuVisible && isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { - requireActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } 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 4577aed23..96c02f54d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -1,6 +1,7 @@ package de.danoeh.antennapod.fragment; import android.os.Bundle; +import android.view.MenuInflater; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.ItemTouchHelper; @@ -37,8 +38,8 @@ public class NewEpisodesFragment extends EpisodesListFragment { } @Override - public void onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); + public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); 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 new file mode 100644 index 000000000..686765b90 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PagedToolbarFragment.java @@ -0,0 +1,52 @@ +package de.danoeh.antennapod.fragment; + +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.widget.ViewPager2; + +/** + * Fragment with a ViewPager where the displayed items influence the top toolbar's menu. + */ +public abstract class PagedToolbarFragment extends Fragment { + private Toolbar toolbar; + private ViewPager2 viewPager; + private int currentInflatedMenu = -1; + + 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()); + } + child.onPrepareOptionsMenu(toolbar.getMenu()); + } + } + + protected void setupPagedToolbar(Toolbar toolbar, ViewPager2 viewPager) { + this.toolbar = toolbar; + this.viewPager = viewPager; + + toolbar.setOnMenuItemClickListener(item -> { + Fragment child = getChildFragmentManager().findFragmentByTag("f" + viewPager.getCurrentItem()); + if (child != null) { + return child.onOptionsItemSelected(item); + } + return false; + }); + viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @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; + + 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 ca9fba694..d02da8b36 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java @@ -75,12 +75,6 @@ public class RunningDownloadsFragment extends ListFragment { EventBus.getDefault().register(this); } - @Override - public void onResume() { - super.onResume(); - setHasOptionsMenu(true); - } - @Override public void onStop() { super.onStop(); @@ -95,8 +89,11 @@ public class RunningDownloadsFragment extends ListFragment { @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.downloads_running, menu); + } + + @Override + public void onPrepareOptionsMenu(@NonNull Menu menu) { isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } @@ -113,7 +110,7 @@ public class RunningDownloadsFragment extends ListFragment { public void onEventMainThread(DownloadEvent event) { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { - getActivity().invalidateOptionsMenu(); + ((PagedToolbarFragment) getParentFragment()).invalidateOptionsMenuIfActive(this); } } -- cgit v1.2.3