From 1ffb9f94644b136aaf16ae13bc777485268cb247 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 09:58:18 +0100 Subject: Converted second-level fragments to stand-alone toolbar --- .../dialog/EpisodesApplyActionFragment.java | 73 ++++++++-------------- .../antennapod/fragment/DiscoveryFragment.java | 7 ++- .../antennapod/fragment/FeedInfoFragment.java | 49 ++++++--------- .../antennapod/fragment/FeedSettingsFragment.java | 3 +- .../antennapod/fragment/ItemPagerFragment.java | 35 ++++------- .../antennapod/fragment/OnlineSearchFragment.java | 19 +++--- .../danoeh/antennapod/fragment/SearchFragment.java | 18 +++--- .../fragment/gpodnet/GpodnetMainFragment.java | 3 +- .../fragment/gpodnet/PodcastListFragment.java | 62 ++++++++---------- 9 files changed, 103 insertions(+), 166 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java index f2524c40c..5aee3f2be 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java @@ -1,12 +1,8 @@ package de.danoeh.antennapod.dialog; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; import android.os.Bundle; 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; @@ -17,10 +13,8 @@ import androidx.annotation.NonNull; import androidx.annotation.PluralsRes; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.collection.ArrayMap; -import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import com.google.android.material.snackbar.Snackbar; import com.leinardi.android.speeddial.SpeedDialView; @@ -34,6 +28,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.FeedItemPermutors; import de.danoeh.antennapod.core.util.LongList; import de.danoeh.antennapod.core.util.SortOrder; +import de.danoeh.antennapod.core.util.ThemeUtils; import java.util.ArrayList; import java.util.Arrays; @@ -41,7 +36,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; -public class EpisodesApplyActionFragment extends Fragment { +public class EpisodesApplyActionFragment extends Fragment implements Toolbar.OnMenuItemClickListener { public static final String TAG = "EpisodeActionFragment"; @@ -53,7 +48,6 @@ public class EpisodesApplyActionFragment extends Fragment { public static final int ACTION_DELETE = 32; public static final int ACTION_ALL = ACTION_ADD_TO_QUEUE | ACTION_REMOVE_FROM_QUEUE | ACTION_MARK_PLAYED | ACTION_MARK_UNPLAYED | ACTION_DOWNLOAD | ACTION_DELETE; - private Toolbar toolbar; /** * Specify an action (defined by #flag) 's UI bindings. @@ -84,7 +78,7 @@ public class EpisodesApplyActionFragment extends Fragment { private ListView mListView; private ArrayAdapter mAdapter; private SpeedDialView mSpeedDialView; - private MenuItem mSelectToggle; + private Toolbar toolbar; public EpisodesApplyActionFragment() { actionBindings = Arrays.asList( @@ -117,7 +111,6 @@ public class EpisodesApplyActionFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); } @Override @@ -125,6 +118,12 @@ public class EpisodesApplyActionFragment extends Fragment { Bundle savedInstanceState) { View view = inflater.inflate(R.layout.episodes_apply_action_fragment, container, false); + toolbar = view.findViewById(R.id.toolbar); + toolbar.inflateMenu(R.menu.episodes_apply_action_options); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + toolbar.setOnMenuItemClickListener(this); + refreshToolbarState(); + mListView = view.findViewById(android.R.id.list); mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); mListView.setOnItemClickListener((listView, view1, position, rowId) -> { @@ -167,8 +166,6 @@ public class EpisodesApplyActionFragment extends Fragment { mAdapter = new ArrayAdapter<>(getActivity(), R.layout.simple_list_item_multiple_choice_on_start, titles); mListView.setAdapter(mAdapter); - toolbar = view.findViewById(R.id.toolbar); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); // Init action UI (via a FAB Speed Dial) mSpeedDialView = view.findViewById(R.id.fabSD); @@ -215,42 +212,15 @@ public class EpisodesApplyActionFragment extends Fragment { return view; } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.episodes_apply_action_options, menu); - - mSelectToggle = menu.findItem(R.id.select_toggle); - mSelectToggle.setOnMenuItemClickListener(item -> { - if (checkedIds.size() == episodes.size()) { - checkNone(); - } else { - checkAll(); - } - return true; - }); - } - - @Override - public void onPrepareOptionsMenu(@NonNull Menu menu) { - // Prepare icon for select toggle button - - int[] icon = new int[1]; - @StringRes int titleResId; + public void refreshToolbarState() { + MenuItem selectAllItem = toolbar.getMenu().findItem(R.id.select_toggle); if (checkedIds.size() == episodes.size()) { - icon[0] = R.attr.ic_select_none; - titleResId = R.string.deselect_all_label; + selectAllItem.setIcon(ThemeUtils.getDrawableFromAttr(getContext(), R.attr.ic_select_none)); + selectAllItem.setTitle(R.string.deselect_all_label); } else { - icon[0] = R.attr.ic_select_all; - titleResId = R.string.select_all_label; + selectAllItem.setIcon(ThemeUtils.getDrawableFromAttr(getContext(), R.attr.ic_select_all)); + selectAllItem.setTitle(R.string.select_all_label); } - - TypedArray a = getActivity().obtainStyledAttributes(icon); - Drawable iconDrawable = a.getDrawable(0); - a.recycle(); - - mSelectToggle.setIcon(iconDrawable); - mSelectToggle.setTitle(titleResId); } private static final Map menuItemIdToSortOrder; @@ -266,11 +236,18 @@ public class EpisodesApplyActionFragment extends Fragment { } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onMenuItemClick(MenuItem item) { @StringRes int resId = 0; - switch(item.getItemId()) { + switch (item.getItemId()) { case R.id.select_options: return true; + case R.id.select_toggle: + if (checkedIds.size() == episodes.size()) { + checkNone(); + } else { + checkAll(); + } + return true; case R.id.check_all: checkAll(); resId = R.string.selected_all_label; @@ -409,7 +386,7 @@ public class EpisodesApplyActionFragment extends Fragment { boolean checked = checkedIds.contains(episode.getId()); mListView.setItemChecked(i, checked); } - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); toolbar.setTitle(getResources().getQuantityString(R.plurals.num_selected_label, checkedIds.size(), checkedIds.size())); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java index 5bc950d50..034b111e1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DiscoveryFragment.java @@ -15,7 +15,7 @@ import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import org.greenrobot.eventbus.EventBus; @@ -90,7 +90,6 @@ public class DiscoveryFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setHasOptionsMenu(true); prefs = getActivity().getSharedPreferences(ItunesTopListLoader.PREFS, MODE_PRIVATE); countryCode = prefs.getString(ItunesTopListLoader.PREF_KEY_COUNTRY_CODE, Locale.getDefault().getCountry()); } @@ -100,11 +99,13 @@ public class DiscoveryFragment extends Fragment { Bundle savedInstanceState) { // Inflate the layout for this fragment View root = inflater.inflate(R.layout.fragment_itunes_search, container, false); - ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar)); gridView = root.findViewById(R.id.gridView); adapter = new ItunesAdapter(getActivity(), new ArrayList<>()); gridView.setAdapter(adapter); + Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + //Show information about the podcast when the list item is clicked gridView.setOnItemClickListener((parent, view1, position, id) -> { PodcastSearchResult podcast = searchResults.get(position); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java index 5fd2c3c8d..674ee5757 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedInfoFragment.java @@ -13,7 +13,6 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.Fragment; @@ -21,8 +20,6 @@ import android.text.TextUtils; import android.text.format.Formatter; 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; @@ -67,7 +64,7 @@ import java.util.Locale; /** * Displays information about a feed. */ -public class FeedInfoFragment extends Fragment { +public class FeedInfoFragment extends Fragment implements Toolbar.OnMenuItemClickListener { private static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId"; private static final String TAG = "FeedInfoActivity"; @@ -89,7 +86,7 @@ public class FeedInfoFragment extends Fragment { private ImageView imgvBackground; private View infoContainer; private View header; - private Menu optionsMenu; + private Toolbar toolbar; private ToolbarIconTintManager iconTintManager; public static FeedInfoFragment newInstance(Feed feed) { @@ -119,25 +116,25 @@ public class FeedInfoFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View root = inflater.inflate(R.layout.feedinfo, null); - Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(""); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar.inflateMenu(R.menu.feedinfo); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + toolbar.setOnMenuItemClickListener(this); + refreshToolbarState(); + AppBarLayout appBar = root.findViewById(R.id.appBar); CollapsingToolbarLayout collapsingToolbar = root.findViewById(R.id.collapsing_toolbar); iconTintManager = new ToolbarIconTintManager(getContext(), toolbar, collapsingToolbar) { @Override protected void doTint(Context themedContext) { - if (optionsMenu == null) { - return; - } - optionsMenu.findItem(R.id.visit_website_item) + toolbar.getMenu().findItem(R.id.visit_website_item) .setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.location_web_site)); } }; + iconTintManager.updateTint(); appBar.addOnOffsetChangedListener(iconTintManager); - setHasOptionsMenu(true); - imgvCover = root.findViewById(R.id.imgvCover); txtvTitle = root.findViewById(R.id.txtvTitle); txtvAuthorHeader = root.findViewById(R.id.txtvAuthor); @@ -234,7 +231,7 @@ public class FeedInfoFragment extends Fragment { txtvUrl.setText(feed.getDownload_url() + " {fa-paperclip}"); Iconify.addIcons(txtvUrl); - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } private void loadStatistics() { @@ -286,29 +283,19 @@ public class FeedInfoFragment extends Fragment { } } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.feedinfo, menu); - optionsMenu = menu; - iconTintManager.updateTint(); - } - - @Override - public void onPrepareOptionsMenu(@NonNull Menu menu) { - super.onPrepareOptionsMenu(menu); - menu.findItem(R.id.reconnect_local_folder).setVisible(feed != null && feed.isLocalFeed()); - menu.findItem(R.id.share_link_item).setVisible(feed != null && feed.getLink() != null); - menu.findItem(R.id.visit_website_item).setVisible(feed != null && feed.getLink() != null + private void refreshToolbarState() { + toolbar.getMenu().findItem(R.id.reconnect_local_folder).setVisible(feed != null && feed.isLocalFeed()); + toolbar.getMenu().findItem(R.id.share_link_item).setVisible(feed != null && feed.getLink() != null); + toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(feed != null && feed.getLink() != null && IntentUtils.isCallable(getContext(), new Intent(Intent.ACTION_VIEW, Uri.parse(feed.getLink())))); } @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { + public boolean onMenuItemClick(MenuItem item) { if (feed == null) { ((MainActivity) getActivity()).showSnackbarAbovePlayer( R.string.please_wait_for_data, Toast.LENGTH_LONG); - return super.onOptionsItemSelected(item); + return false; } boolean handled = false; try { @@ -335,7 +322,7 @@ public class FeedInfoFragment extends Fragment { return true; } - return handled || super.onOptionsItemSelected(item); + return handled; } @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java index 21280896a..568b56304 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -9,7 +9,6 @@ import android.view.View; 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.preference.ListPreference; @@ -65,7 +64,7 @@ public class FeedSettingsFragment extends Fragment { long feedId = getArguments().getLong(EXTRA_FEED_ID); Toolbar toolbar = root.findViewById(R.id.toolbar); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); getParentFragmentManager().beginTransaction() .replace(R.id.settings_fragment_container, diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java index 2425a174e..7b7a09082 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -2,15 +2,12 @@ package de.danoeh.antennapod.fragment; import android.os.Bundle; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; @@ -35,7 +32,7 @@ import io.reactivex.schedulers.Schedulers; /** * Displays information about a list of FeedItems. */ -public class ItemPagerFragment extends Fragment { +public class ItemPagerFragment extends Fragment implements Toolbar.OnMenuItemClickListener { private static final String ARG_FEEDITEMS = "feeditems"; private static final String ARG_FEEDITEM_POS = "feeditem_pos"; private static final String KEY_PAGER_ID = "pager_id"; @@ -60,21 +57,18 @@ public class ItemPagerFragment extends Fragment { private long[] feedItems; private FeedItem item; private Disposable disposable; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); - } + private Toolbar toolbar; @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View layout = inflater.inflate(R.layout.feeditem_pager_fragment, container, false); - Toolbar toolbar = layout.findViewById(R.id.toolbar); + toolbar = layout.findViewById(R.id.toolbar); toolbar.setTitle(""); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar.inflateMenu(R.menu.feeditem_options); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + toolbar.setOnMenuItemClickListener(this); feedItems = getArguments().getLongArray(ARG_FEEDITEMS); int feedItemPos = getArguments().getInt(ARG_FEEDITEM_POS); @@ -130,28 +124,25 @@ public class ItemPagerFragment extends Fragment { .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { item = result; - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); }, Throwable::printStackTrace); } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if (!isAdded() || item == null) { + public void refreshToolbarState() { + if (item == null) { return; } - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.feeditem_options, menu); if (item.hasMedia()) { - FeedItemMenuHandler.onPrepareMenu(menu, item); + FeedItemMenuHandler.onPrepareMenu(toolbar.getMenu(), item); } else { // these are already available via button1 and button2 - FeedItemMenuHandler.onPrepareMenu(menu, item, + FeedItemMenuHandler.onPrepareMenu(toolbar.getMenu(), item, R.id.mark_read_item, R.id.visit_website_item); } } @Override - public boolean onOptionsItemSelected(MenuItem menuItem) { + public boolean onMenuItemClick(MenuItem menuItem) { if (menuItem.getItemId() == R.id.open_podcast) { openPodcast(); return true; @@ -164,7 +155,7 @@ public class ItemPagerFragment extends Fragment { for (FeedItem item : event.items) { if (this.item != null && this.item.getId() == item.getId()) { this.item = item; - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); return; } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java index 435590a0c..ba817650b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java @@ -2,14 +2,11 @@ package de.danoeh.antennapod.fragment; import android.content.Intent; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; -import androidx.core.view.MenuItemCompat; import androidx.appcompat.widget.SearchView; 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; @@ -77,7 +74,6 @@ public class OnlineSearchFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setHasOptionsMenu(true); for (PodcastSearcherRegistry.SearcherInfo info : PodcastSearcherRegistry.getSearchProviders()) { if (info.searcher.getClass().getName().equals(getArguments().getString(ARG_SEARCHER))) { @@ -94,7 +90,7 @@ public class OnlineSearchFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View root = inflater.inflate(R.layout.fragment_itunes_search, container, false); - ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar)); + setupToolbar(root.findViewById(R.id.toolbar)); root.findViewById(R.id.spinner_country).setVisibility(INVISIBLE); gridView = root.findViewById(R.id.gridView); adapter = new ItunesAdapter(getActivity(), new ArrayList<>()); @@ -126,11 +122,11 @@ public class OnlineSearchFragment extends Fragment { adapter = null; } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.online_search, menu); - MenuItem searchItem = menu.findItem(R.id.action_search); + private void setupToolbar(Toolbar toolbar) { + toolbar.inflateMenu(R.menu.online_search); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + + MenuItem searchItem = toolbar.getMenu().findItem(R.id.action_search); final SearchView sv = (SearchView) searchItem.getActionView(); sv.setQueryHint(getString(R.string.search_podcast_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @@ -163,7 +159,6 @@ public class OnlineSearchFragment extends Fragment { if (getArguments().getString(ARG_QUERY, null) != null) { sv.setQuery(getArguments().getString(ARG_QUERY, null), true); } - } private void search(String query) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index 2061a8ba4..4526c789c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -4,16 +4,14 @@ import android.os.Bundle; import android.util.Log; import android.util.Pair; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; +import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -96,7 +94,6 @@ public class SearchFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); } @Override @@ -118,7 +115,7 @@ public class SearchFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.search_fragment, container, false); - ((AppCompatActivity) getActivity()).setSupportActionBar(layout.findViewById(R.id.toolbar)); + setupToolbar(layout.findViewById(R.id.toolbar)); progressBar = layout.findViewById(R.id.progressBar); recyclerView = layout.findViewById(R.id.recyclerView); @@ -154,11 +151,12 @@ public class SearchFragment extends Fragment { EventBus.getDefault().unregister(this); } - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.search, menu); - MenuItem item = menu.findItem(R.id.action_search); + private void setupToolbar(Toolbar toolbar) { + toolbar.setTitle(R.string.search_label); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + toolbar.inflateMenu(R.menu.gpodder_podcasts); + + MenuItem item = toolbar.getMenu().findItem(R.id.action_search); item.expandActionView(); final SearchView sv = (SearchView) item.getActionView(); sv.setQueryHint(getString(R.string.search_label)); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java index 4ccc53118..641e82b5a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java @@ -6,7 +6,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; @@ -33,7 +32,7 @@ public class GpodnetMainFragment extends Fragment { View root = inflater.inflate(R.layout.pager_fragment, container, false); Toolbar toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(R.string.gpodnet_main_label); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); ViewPager2 viewPager = root.findViewById(R.id.viewpager); GpodnetPagerAdapter pagerAdapter = new GpodnetPagerAdapter(this); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java index 4cb50e2f4..b3f56941b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java @@ -4,15 +4,11 @@ import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; -import androidx.core.view.MenuItemCompat; import androidx.appcompat.widget.SearchView; 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; @@ -46,16 +42,34 @@ public abstract class PodcastListFragment extends Fragment { private Button butRetry; @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setHasOptionsMenu(true); + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false); + setupToolbar(root.findViewById(R.id.toolbar)); + + gridView = root.findViewById(R.id.gridView); + progressBar = root.findViewById(R.id.progressBar); + txtvError = root.findViewById(R.id.txtvError); + butRetry = root.findViewById(R.id.butRetry); + + gridView.setOnItemClickListener((parent, view, position, id) -> + onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position))); + butRetry.setOnClickListener(v -> loadData()); + + loadData(); + return root; } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.gpodder_podcasts, menu); - MenuItem searchItem = menu.findItem(R.id.action_search); + private void setupToolbar(Toolbar toolbar) { + if (getArguments() != null && getArguments().getBoolean(ARGUMENT_HIDE_TOOLBAR, false)) { + toolbar.setVisibility(View.GONE); + return; + } + + toolbar.setTitle(R.string.gpodnet_main_label); + toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); + toolbar.inflateMenu(R.menu.gpodder_podcasts); + + MenuItem searchItem = toolbar.getMenu().findItem(R.id.action_search); final SearchView sv = (SearchView) searchItem.getActionView(); sv.setQueryHint(getString(R.string.gpodnet_search_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @@ -76,30 +90,6 @@ public abstract class PodcastListFragment extends Fragment { }); } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View root = inflater.inflate(R.layout.gpodnet_podcast_list, container, false); - Toolbar toolbar = root.findViewById(R.id.toolbar); - if (getArguments() == null || !getArguments().getBoolean(ARGUMENT_HIDE_TOOLBAR, false)) { - toolbar.setTitle(R.string.gpodnet_main_label); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); - } else { - toolbar.setVisibility(View.GONE); - } - - gridView = root.findViewById(R.id.gridView); - progressBar = root.findViewById(R.id.progressBar); - txtvError = root.findViewById(R.id.txtvError); - butRetry = root.findViewById(R.id.butRetry); - - gridView.setOnItemClickListener((parent, view, position, id) -> - onPodcastSelected((GpodnetPodcast) gridView.getAdapter().getItem(position))); - butRetry.setOnClickListener(v -> loadData()); - - loadData(); - return root; - } - private void onPodcastSelected(GpodnetPodcast selection) { Log.d(TAG, "Selected podcast: " + selection.toString()); Intent intent = new Intent(getActivity(), OnlineFeedViewActivity.class); -- cgit v1.2.3 From 8975b60ecd81acae9dd12ff20e73374322fa9137 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 11:30:01 +0100 Subject: Converted main fragments except pagers to stand-alone toolbar --- .../danoeh/antennapod/activity/MainActivity.java | 8 +- .../antennapod/fragment/AddFeedFragment.java | 10 +- .../antennapod/fragment/FeedItemlistFragment.java | 176 ++++++++--------- .../fragment/PlaybackHistoryFragment.java | 57 ++---- .../danoeh/antennapod/fragment/QueueFragment.java | 211 ++++++++++----------- .../antennapod/fragment/SubscriptionFragment.java | 40 ++-- .../antennapod/menuhandler/FeedMenuHandler.java | 5 - app/src/main/res/menu/playback_history.xml | 9 + 8 files changed, 225 insertions(+), 291 deletions(-) create mode 100644 app/src/main/res/menu/playback_history.xml (limited to 'app/src/main') diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index a398a5e94..e4a57e161 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -5,7 +5,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; -import android.content.res.Resources; import android.media.AudioManager; import android.os.Build; import android.os.Bundle; @@ -13,7 +12,6 @@ import android.os.Handler; import android.os.Looper; import android.util.DisplayMetrics; import android.util.Log; -import android.util.TypedValue; import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; @@ -194,8 +192,7 @@ public class MainActivity extends CastEnabledActivity { } }; - @Override - public void setSupportActionBar(@Nullable Toolbar toolbar) { + public void setupToolbarToggle(@Nullable Toolbar toolbar) { if (drawerLayout != null) { // Tablet layout does not have a drawer drawerLayout.removeDrawerListener(drawerToggle); drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, @@ -203,12 +200,13 @@ public class MainActivity extends CastEnabledActivity { drawerLayout.addDrawerListener(drawerToggle); drawerToggle.syncState(); drawerToggle.setDrawerIndicatorEnabled(getSupportFragmentManager().getBackStackEntryCount() == 0); + drawerToggle.setToolbarNavigationClickListener(v -> getSupportFragmentManager().popBackStack()); } else if (getSupportFragmentManager().getBackStackEntryCount() == 0) { toolbar.setNavigationIcon(null); } else { toolbar.setNavigationIcon(ThemeUtils.getDrawableFromAttr(this, R.attr.homeAsUpIndicator)); + toolbar.setNavigationOnClickListener(v -> getSupportFragmentManager().popBackStack()); } - super.setSupportActionBar(toolbar); } private void checkFirstLaunch() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java index fa0df9abb..3056f8955 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AddFeedFragment.java @@ -17,7 +17,7 @@ import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.Fragment; import com.google.android.material.snackbar.Snackbar; @@ -58,7 +58,8 @@ public class AddFeedFragment extends Fragment { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.addfeed, container, false); activity = (MainActivity) getActivity(); - ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar)); + Toolbar toolbar = root.findViewById(R.id.toolbar); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); root.findViewById(R.id.btn_search_itunes).setOnClickListener(v -> activity.loadChildFragment(OnlineSearchFragment.newInstance(ItunesPodcastSearcher.class))); @@ -143,11 +144,6 @@ public class AddFeedFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - - // So, we certainly *don't* have an options menu, - // but unless we say we do, old options menus sometimes - // persist. mfietz thinks this causes the ActionBar to be invalidated - setHasOptionsMenu(true); } @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index b66f15c7e..a02b60196 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -10,8 +10,6 @@ import android.os.Handler; 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; @@ -24,7 +22,6 @@ import android.widget.TextView; import android.widget.Toast; 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.recyclerview.widget.RecyclerView; @@ -90,7 +87,8 @@ import java.util.Set; /** * Displays a list of FeedItems. */ -public class FeedItemlistFragment extends Fragment implements AdapterView.OnItemClickListener { +public class FeedItemlistFragment extends Fragment implements AdapterView.OnItemClickListener, + Toolbar.OnMenuItemClickListener { private static final String TAG = "ItemlistFragment"; private static final String ARGUMENT_FEED_ID = "argument.de.danoeh.antennapod.feed_id"; @@ -108,7 +106,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem private ImageButton butShowInfo; private ImageButton butShowSettings; private View header; - private Menu optionsMenu; + private Toolbar toolbar; private ToolbarIconTintManager iconTintManager; private long feedID; @@ -136,7 +134,6 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); Bundle args = getArguments(); Validate.notNull(args); @@ -148,9 +145,11 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View root = inflater.inflate(R.layout.feed_item_list_fragment, container, false); - Toolbar toolbar = root.findViewById(R.id.toolbar); - toolbar.setTitle(""); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar = root.findViewById(R.id.toolbar); + toolbar.inflateMenu(R.menu.feedlist); + toolbar.setOnMenuItemClickListener(this); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); + refreshToolbarState(); recyclerView = root.findViewById(R.id.recyclerView); recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool()); @@ -172,19 +171,17 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem iconTintManager = new ToolbarIconTintManager(getContext(), toolbar, collapsingToolbar) { @Override protected void doTint(Context themedContext) { - if (optionsMenu == null) { - return; - } - optionsMenu.findItem(R.id.sort_items) + toolbar.getMenu().findItem(R.id.sort_items) .setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.ic_sort)); - optionsMenu.findItem(R.id.filter_items) + toolbar.getMenu().findItem(R.id.filter_items) .setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.ic_filter)); - optionsMenu.findItem(R.id.refresh_item) + toolbar.getMenu().findItem(R.id.refresh_item) .setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.navigation_refresh)); - optionsMenu.findItem(R.id.action_search) + toolbar.getMenu().findItem(R.id.action_search) .setIcon(ThemeUtils.getDrawableFromAttr(themedContext, R.attr.action_search)); } }; + iconTintManager.updateTint(); appBar.addOnOffsetChangedListener(iconTintManager); nextPageLoader = new MoreContentListFooterUtil(root.findViewById(R.id.more_content_list_footer)); @@ -243,33 +240,18 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem } }; - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - if (!isAdded()) { + private void refreshToolbarState() { + if (feed == null) { return; } - super.onCreateOptionsMenu(menu, inflater); - optionsMenu = menu; - FeedMenuHandler.onCreateOptionsMenu(inflater, menu); - iconTintManager.updateTint(); - if (feed != null) { - MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID, feed.getTitle()); - } else { - MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), feedID, ""); - } - if (feed == null || feed.getLink() == null) { - menu.findItem(R.id.share_link_item).setVisible(false); - menu.findItem(R.id.visit_website_item).setVisible(false); - } + MenuItemUtils.setupSearchItem(toolbar.getMenu(), (MainActivity) getActivity(), feedID, feed.getTitle()); - isUpdatingFeed = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); - } + toolbar.getMenu().findItem(R.id.share_link_item).setVisible(feed.getLink() != null); + toolbar.getMenu().findItem(R.id.visit_website_item).setVisible(feed.getLink() != null); - @Override - public void onPrepareOptionsMenu(@NonNull Menu menu) { - if (feed != null) { - FeedMenuHandler.onPrepareOptionsMenu(menu, feed); - } + isUpdatingFeed = MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(), + R.id.refresh_item, updateRefreshMenuItemChecker); + FeedMenuHandler.onPrepareOptionsMenu(toolbar.getMenu(), feed); } @Override @@ -280,71 +262,67 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem } @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { + public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == R.id.action_search) { item.getActionView().post(() -> iconTintManager.updateTint()); } - if (super.onOptionsItemSelected(item)) { + if (feed == null) { + ((MainActivity) getActivity()).showSnackbarAbovePlayer( + R.string.please_wait_for_data, Toast.LENGTH_LONG); return true; - } else { - if (feed == null) { - ((MainActivity) getActivity()).showSnackbarAbovePlayer( - R.string.please_wait_for_data, Toast.LENGTH_LONG); + } + boolean feedMenuHandled; + try { + feedMenuHandled = FeedMenuHandler.onOptionsItemClicked(getActivity(), item, feed); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage()); + return true; + } + if (feedMenuHandled) { + return true; + } + switch (item.getItemId()) { + case R.id.episode_actions: + int actions = EpisodesApplyActionFragment.ACTION_ALL; + if (feed.isLocalFeed()) { + // turn off download and delete actions for local feed + actions ^= EpisodesApplyActionFragment.ACTION_DOWNLOAD; + actions ^= EpisodesApplyActionFragment.ACTION_DELETE; + } + EpisodesApplyActionFragment fragment = EpisodesApplyActionFragment + .newInstance(feed.getItems(), actions); + ((MainActivity)getActivity()).loadChildFragment(fragment); return true; - } - try { - if (!FeedMenuHandler.onOptionsItemClicked(getActivity(), item, feed)) { - switch (item.getItemId()) { - case R.id.episode_actions: - int actions = EpisodesApplyActionFragment.ACTION_ALL; - if (feed.isLocalFeed()) { - // turn off download and delete actions for local feed - actions ^= EpisodesApplyActionFragment.ACTION_DOWNLOAD; - actions ^= EpisodesApplyActionFragment.ACTION_DELETE; - } - EpisodesApplyActionFragment fragment = EpisodesApplyActionFragment - .newInstance(feed.getItems(), actions); - ((MainActivity)getActivity()).loadChildFragment(fragment); - return true; - case R.id.rename_item: - new RenameFeedDialog(getActivity(), feed).show(); - return true; - case R.id.remove_item: - final FeedRemover remover = new FeedRemover( - getActivity(), feed) { - @Override - protected void onPostExecute(Void result) { - super.onPostExecute(result); - ((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null); - } - }; - int messageId = feed.isLocalFeed() ? R.string.feed_delete_confirmation_local_msg - : R.string.feed_delete_confirmation_msg; - ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), - R.string.remove_feed_label, - getString(messageId, feed.getTitle())) { - - @Override - public void onConfirmButtonPressed( - DialogInterface dialog) { - dialog.dismiss(); - remover.executeAsync(); - } - }; - conDialog.createNewDialog().show(); - return true; - default: - return false; - + case R.id.rename_item: + new RenameFeedDialog(getActivity(), feed).show(); + return true; + case R.id.remove_item: + final FeedRemover remover = new FeedRemover( + getActivity(), feed) { + @Override + protected void onPostExecute(Void result) { + super.onPostExecute(result); + ((MainActivity) getActivity()).loadFragment(EpisodesFragment.TAG, null); } - } else { - return true; - } - } catch (DownloadRequestException e) { - e.printStackTrace(); - DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage()); + }; + int messageId = feed.isLocalFeed() ? R.string.feed_delete_confirmation_local_msg + : R.string.feed_delete_confirmation_msg; + ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), + R.string.remove_feed_label, + getString(messageId, feed.getTitle())) { + + @Override + public void onConfirmButtonPressed( + DialogInterface dialog) { + dialog.dismiss(); + remover.executeAsync(); + } + }; + conDialog.createNewDialog().show(); return true; - } + default: + return false; } } @@ -450,7 +428,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem private void updateSyncProgressBarVisibility() { if (isUpdatingFeed != updateRefreshMenuItemChecker.isRefreshing()) { - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } if (!DownloadRequester.getInstance().isDownloadingFeeds()) { nextPageLoader.getRoot().setVisibility(View.GONE); @@ -474,7 +452,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem adapter.updateItems(feed.getItems()); } - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); updateSyncProgressBarVisibility(); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index db4bda1f5..4549e2a09 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -1,20 +1,15 @@ package de.danoeh.antennapod.fragment; -import android.content.res.TypedArray; import android.os.Bundle; 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; import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -import androidx.core.view.MenuItemCompat; import androidx.fragment.app.Fragment; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; @@ -43,7 +38,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; -public class PlaybackHistoryFragment extends Fragment { +public class PlaybackHistoryFragment extends Fragment implements Toolbar.OnMenuItemClickListener { public static final String TAG = "PlaybackHistoryFragment"; private List playbackHistory; @@ -52,21 +47,24 @@ public class PlaybackHistoryFragment extends Fragment { private EpisodeItemListRecyclerView recyclerView; private EmptyViewHandler emptyView; private ProgressBar progressBar; + private Toolbar toolbar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); } @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View root = inflater.inflate(R.layout.simple_list_fragment, container, false); - Toolbar toolbar = root.findViewById(R.id.toolbar); + toolbar = root.findViewById(R.id.toolbar); toolbar.setTitle(R.string.playback_history_label); - ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); + toolbar.setOnMenuItemClickListener(this); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); + toolbar.inflateMenu(R.menu.playback_history); + refreshToolbarState(); recyclerView = root.findViewById(R.id.recyclerView); recyclerView.setRecycledViewPool(((MainActivity) getActivity()).getRecycledViewPool()); @@ -146,39 +144,18 @@ public class PlaybackHistoryFragment extends Fragment { } } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if (!isAdded()) { - return; - } - super.onCreateOptionsMenu(menu, inflater); - MenuItem clearHistory = menu.add(Menu.NONE, R.id.clear_history_item, Menu.CATEGORY_CONTAINER, R.string.clear_history_label); - clearHistory.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.ic_delete}); - clearHistory.setIcon(drawables.getDrawable(0)); - drawables.recycle(); - } - - @Override - public void onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - MenuItem menuItem = menu.findItem(R.id.clear_history_item); - if (menuItem != null) { - menuItem.setVisible(playbackHistory != null && !playbackHistory.isEmpty()); - } + public void refreshToolbarState() { + boolean hasHistory = playbackHistory != null && !playbackHistory.isEmpty(); + toolbar.getMenu().findItem(R.id.clear_history_item).setVisible(hasHistory); } @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (!super.onOptionsItemSelected(item)) { - if (item.getItemId() == R.id.clear_history_item) { - DBWriter.clearPlaybackHistory(); - return true; - } - return false; - } else { + public boolean onMenuItemClick(MenuItem item) { + if (item.getItemId() == R.id.clear_history_item) { + DBWriter.clearPlaybackHistory(); return true; } + return false; } @Override @@ -194,18 +171,18 @@ public class PlaybackHistoryFragment extends Fragment { @Subscribe(threadMode = ThreadMode.MAIN) public void onHistoryUpdated(PlaybackHistoryEvent event) { loadItems(); - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerStatusChanged(PlayerStatusEvent event) { loadItems(); - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } private void onFragmentLoaded() { adapter.notifyDataSetChanged(); - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } private void loadItems() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 122524b48..11457e46d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -6,8 +6,6 @@ import android.content.SharedPreferences; import android.os.Bundle; 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; @@ -15,7 +13,7 @@ import android.widget.CheckBox; import android.widget.ProgressBar; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -67,7 +65,7 @@ import static de.danoeh.antennapod.dialog.EpisodesApplyActionFragment.ACTION_REM /** * Shows all items in the queue. */ -public class QueueFragment extends Fragment { +public class QueueFragment extends Fragment implements Toolbar.OnMenuItemClickListener { public static final String TAG = "QueueFragment"; private TextView infoBar; @@ -75,6 +73,7 @@ public class QueueFragment extends Fragment { private QueueRecyclerAdapter recyclerAdapter; private EmptyViewHandler emptyView; private ProgressBar progLoading; + private Toolbar toolbar; private List queue; @@ -91,7 +90,6 @@ public class QueueFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); prefs = getActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); } @@ -182,7 +180,7 @@ public class QueueFragment extends Fragment { Log.d(TAG, "onEventMainThread() called with DownloadEvent"); DownloaderUpdate update = event.update; if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } if (recyclerAdapter != null && update.mediaIds.length > 0) { for (long mediaId : update.mediaIds) { @@ -212,7 +210,7 @@ public class QueueFragment extends Fragment { public void onPlayerStatusChanged(PlayerStatusEvent event) { loadItems(false); if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } } @@ -221,7 +219,7 @@ public class QueueFragment extends Fragment { // Sent when playback position is reset loadItems(false); if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } } @@ -238,114 +236,93 @@ public class QueueFragment extends Fragment { private final MenuItemUtils.UpdateRefreshMenuItemChecker updateRefreshMenuItemChecker = () -> DownloadService.isRunning && DownloadRequester.getInstance().isDownloadingFeeds(); - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if(!isAdded()) { - return; - } - super.onCreateOptionsMenu(menu, inflater); - if (queue != null) { - inflater.inflate(R.menu.queue, menu); - MenuItemUtils.setupSearchItem(menu, (MainActivity) getActivity(), 0, ""); - MenuItemUtils.refreshLockItem(getActivity(), menu); - - // Show Lock Item only if queue is sorted manually - boolean keepSorted = UserPreferences.isQueueKeepSorted(); - MenuItem lockItem = menu.findItem(R.id.queue_lock); - lockItem.setVisible(!keepSorted); - - // Random sort is not supported in keep sorted mode - MenuItem sortRandomItem = menu.findItem(R.id.queue_sort_random); - sortRandomItem.setVisible(!keepSorted); - - // Set keep sorted checkbox - MenuItem keepSortedItem = menu.findItem(R.id.queue_keep_sorted); - keepSortedItem.setChecked(keepSorted); + private void refreshToolbarState() { + MenuItemUtils.refreshLockItem(getActivity(), toolbar.getMenu()); + boolean keepSorted = UserPreferences.isQueueKeepSorted(); + toolbar.getMenu().findItem(R.id.queue_lock).setVisible(!keepSorted); - isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); - } + toolbar.getMenu().findItem(R.id.queue_sort_random).setVisible(!keepSorted); + toolbar.getMenu().findItem(R.id.queue_keep_sorted).setChecked(keepSorted); + isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(), + R.id.refresh_item, updateRefreshMenuItemChecker); } @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (!super.onOptionsItemSelected(item)) { - switch (item.getItemId()) { - case R.id.queue_lock: - toggleQueueLock(); - return true; - case R.id.refresh_item: - AutoUpdateManager.runImmediate(requireContext()); - return true; - case R.id.clear_queue: - // make sure the user really wants to clear the queue - ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), - R.string.clear_queue_label, - R.string.clear_queue_confirmation_msg) { - - @Override - public void onConfirmButtonPressed( - DialogInterface dialog) { - dialog.dismiss(); - DBWriter.clearQueue(); - } - }; - conDialog.createNewDialog().show(); - return true; - case R.id.episode_actions: - ((MainActivity) requireActivity()).loadChildFragment( - EpisodesApplyActionFragment.newInstance(queue, ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE | ACTION_DOWNLOAD)); - return true; - case R.id.queue_sort_episode_title_asc: - setSortOrder(SortOrder.EPISODE_TITLE_A_Z); - return true; - case R.id.queue_sort_episode_title_desc: - setSortOrder(SortOrder.EPISODE_TITLE_Z_A); - return true; - case R.id.queue_sort_date_asc: - setSortOrder(SortOrder.DATE_OLD_NEW); - return true; - case R.id.queue_sort_date_desc: - setSortOrder(SortOrder.DATE_NEW_OLD); - return true; - case R.id.queue_sort_duration_asc: - setSortOrder(SortOrder.DURATION_SHORT_LONG); - return true; - case R.id.queue_sort_duration_desc: - setSortOrder(SortOrder.DURATION_LONG_SHORT); - return true; - case R.id.queue_sort_feed_title_asc: - setSortOrder(SortOrder.FEED_TITLE_A_Z); - return true; - case R.id.queue_sort_feed_title_desc: - setSortOrder(SortOrder.FEED_TITLE_Z_A); - return true; - case R.id.queue_sort_random: - setSortOrder(SortOrder.RANDOM); - return true; - case R.id.queue_sort_smart_shuffle_asc: - setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW); - return true; - case R.id.queue_sort_smart_shuffle_desc: - setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD); - return true; - case R.id.queue_keep_sorted: - boolean keepSortedOld = UserPreferences.isQueueKeepSorted(); - boolean keepSortedNew = !keepSortedOld; - UserPreferences.setQueueKeepSorted(keepSortedNew); - if (keepSortedNew) { - SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder(); - DBWriter.reorderQueue(sortOrder, true); - } - if (recyclerAdapter != null) { - recyclerAdapter.updateDragDropEnabled(); + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.queue_lock: + toggleQueueLock(); + return true; + case R.id.refresh_item: + AutoUpdateManager.runImmediate(requireContext()); + return true; + case R.id.clear_queue: + // make sure the user really wants to clear the queue + ConfirmationDialog conDialog = new ConfirmationDialog(getActivity(), + R.string.clear_queue_label, + R.string.clear_queue_confirmation_msg) { + + @Override + public void onConfirmButtonPressed( + DialogInterface dialog) { + dialog.dismiss(); + DBWriter.clearQueue(); } - getActivity().invalidateOptionsMenu(); - return true; - default: - return false; - } - } else { - return true; + }; + conDialog.createNewDialog().show(); + return true; + case R.id.episode_actions: + ((MainActivity) requireActivity()).loadChildFragment( + EpisodesApplyActionFragment.newInstance(queue, ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE | ACTION_DOWNLOAD)); + return true; + case R.id.queue_sort_episode_title_asc: + setSortOrder(SortOrder.EPISODE_TITLE_A_Z); + return true; + case R.id.queue_sort_episode_title_desc: + setSortOrder(SortOrder.EPISODE_TITLE_Z_A); + return true; + case R.id.queue_sort_date_asc: + setSortOrder(SortOrder.DATE_OLD_NEW); + return true; + case R.id.queue_sort_date_desc: + setSortOrder(SortOrder.DATE_NEW_OLD); + return true; + case R.id.queue_sort_duration_asc: + setSortOrder(SortOrder.DURATION_SHORT_LONG); + return true; + case R.id.queue_sort_duration_desc: + setSortOrder(SortOrder.DURATION_LONG_SHORT); + return true; + case R.id.queue_sort_feed_title_asc: + setSortOrder(SortOrder.FEED_TITLE_A_Z); + return true; + case R.id.queue_sort_feed_title_desc: + setSortOrder(SortOrder.FEED_TITLE_Z_A); + return true; + case R.id.queue_sort_random: + setSortOrder(SortOrder.RANDOM); + return true; + case R.id.queue_sort_smart_shuffle_asc: + setSortOrder(SortOrder.SMART_SHUFFLE_OLD_NEW); + return true; + case R.id.queue_sort_smart_shuffle_desc: + setSortOrder(SortOrder.SMART_SHUFFLE_NEW_OLD); + return true; + case R.id.queue_keep_sorted: + boolean keepSortedOld = UserPreferences.isQueueKeepSorted(); + boolean keepSortedNew = !keepSortedOld; + UserPreferences.setQueueKeepSorted(keepSortedNew); + if (keepSortedNew) { + SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder(); + DBWriter.reorderQueue(sortOrder, true); + } + if (recyclerAdapter != null) { + recyclerAdapter.updateDragDropEnabled(); + } + refreshToolbarState(); + return true; + default: + return false; } } @@ -378,7 +355,7 @@ public class QueueFragment extends Fragment { private void setQueueLocked(boolean locked) { UserPreferences.setQueueLocked(locked); - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); if (recyclerAdapter != null) { recyclerAdapter.updateDragDropEnabled(); } @@ -440,7 +417,13 @@ public class QueueFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.queue_fragment, container, false); - ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar)); + toolbar = root.findViewById(R.id.toolbar); + toolbar.setOnMenuItemClickListener(this); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); + toolbar.inflateMenu(R.menu.queue); + MenuItemUtils.setupSearchItem(toolbar.getMenu(), (MainActivity) getActivity(), 0, ""); + refreshToolbarState(); + infoBar = root.findViewById(R.id.info_bar); recyclerView = root.findViewById(R.id.recyclerView); RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator(); @@ -568,7 +551,7 @@ public class QueueFragment extends Fragment { // we need to refresh the options menu because it sometimes // needs data that may have just been loaded. - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); refreshInfoBar(); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java index 3b2a72210..7d3312e8e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SubscriptionFragment.java @@ -9,14 +9,13 @@ import android.os.Handler; import android.os.Looper; import android.widget.ProgressBar; import androidx.annotation.StringRes; -import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import android.util.Log; import android.view.ContextMenu; import android.view.LayoutInflater; -import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -65,7 +64,7 @@ import org.greenrobot.eventbus.ThreadMode; /** * Fragment for displaying feed subscriptions */ -public class SubscriptionFragment extends Fragment { +public class SubscriptionFragment extends Fragment implements Toolbar.OnMenuItemClickListener { public static final String TAG = "SubscriptionFragment"; private static final String PREFS = "SubscriptionFragment"; @@ -78,6 +77,7 @@ public class SubscriptionFragment extends Fragment { private ProgressBar progressBar; private EmptyViewHandler emptyView; private TextView feedsFilteredMsg; + private Toolbar toolbar; private int mPosition = -1; private boolean isUpdatingFeeds = false; @@ -89,7 +89,6 @@ public class SubscriptionFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - setHasOptionsMenu(true); prefs = requireActivity().getSharedPreferences(PREFS, Context.MODE_PRIVATE); } @@ -98,7 +97,12 @@ public class SubscriptionFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_subscriptions, container, false); - ((AppCompatActivity) getActivity()).setSupportActionBar(root.findViewById(R.id.toolbar)); + toolbar = root.findViewById(R.id.toolbar); + toolbar.setOnMenuItemClickListener(this); + ((MainActivity) getActivity()).setupToolbarToggle(toolbar); + toolbar.inflateMenu(R.menu.subscriptions); + refreshToolbarState(); + subscriptionGridLayout = root.findViewById(R.id.subscriptions_grid); subscriptionGridLayout.setNumColumns(prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns())); registerForContextMenu(subscriptionGridLayout); @@ -117,25 +121,19 @@ public class SubscriptionFragment extends Fragment { return root; } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.subscriptions, menu); - + private void refreshToolbarState() { int columns = prefs.getInt(PREF_NUM_COLUMNS, getDefaultNumOfColumns()); - menu.findItem(R.id.subscription_num_columns_2).setChecked(columns == 2); - menu.findItem(R.id.subscription_num_columns_3).setChecked(columns == 3); - menu.findItem(R.id.subscription_num_columns_4).setChecked(columns == 4); - menu.findItem(R.id.subscription_num_columns_5).setChecked(columns == 5); + toolbar.getMenu().findItem(R.id.subscription_num_columns_2).setChecked(columns == 2); + toolbar.getMenu().findItem(R.id.subscription_num_columns_3).setChecked(columns == 3); + toolbar.getMenu().findItem(R.id.subscription_num_columns_4).setChecked(columns == 4); + toolbar.getMenu().findItem(R.id.subscription_num_columns_5).setChecked(columns == 5); - isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); + isUpdatingFeeds = MenuItemUtils.updateRefreshMenuItem(toolbar.getMenu(), + R.id.refresh_item, updateRefreshMenuItemChecker); } @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (super.onOptionsItemSelected(item)) { - return true; - } + public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.refresh_item: AutoUpdateManager.runImmediate(requireContext()); @@ -166,7 +164,7 @@ public class SubscriptionFragment extends Fragment { private void setColumnNumber(int columns) { subscriptionGridLayout.setNumColumns(columns); prefs.edit().putInt(PREF_NUM_COLUMNS, columns).apply(); - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } private void setupEmptyView() { @@ -361,7 +359,7 @@ public class SubscriptionFragment extends Fragment { public void onEventMainThread(DownloadEvent event) { Log.d(TAG, "onEventMainThread() called with: " + "event = [" + event + "]"); if (event.hasChangedFeedUpdateStatus(isUpdatingFeeds)) { - getActivity().invalidateOptionsMenu(); + refreshToolbarState(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java index 5446d0191..9ceed9369 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java @@ -34,11 +34,6 @@ public class FeedMenuHandler { private static final String TAG = "FeedMenuHandler"; - public static boolean onCreateOptionsMenu(MenuInflater inflater, Menu menu) { - inflater.inflate(R.menu.feedlist, menu); - return true; - } - public static boolean onPrepareOptionsMenu(Menu menu, Feed selectedFeed) { if (selectedFeed == null) { return true; diff --git a/app/src/main/res/menu/playback_history.xml b/app/src/main/res/menu/playback_history.xml new file mode 100644 index 000000000..5362f0a25 --- /dev/null +++ b/app/src/main/res/menu/playback_history.xml @@ -0,0 +1,9 @@ + + + + -- cgit v1.2.3 From 5f2b436ddcbf33ea7c4525c93981cd70ce9f000d Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 11:54:54 +0100 Subject: Fixed toolbar state updates Do not modify up arrow state of background fragments's toolbars. They are invisible anyways and their state can be kept when resuming later. --- .../main/java/de/danoeh/antennapod/activity/MainActivity.java | 9 --------- .../java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java | 2 +- .../main/java/de/danoeh/antennapod/fragment/QueueFragment.java | 3 ++- .../main/java/de/danoeh/antennapod/fragment/SearchFragment.java | 2 +- 4 files changed, 4 insertions(+), 12 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index e4a57e161..d39edb9b2 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -112,15 +112,6 @@ public class MainActivity extends CastEnabledActivity { setNavDrawerSize(); final FragmentManager fm = getSupportFragmentManager(); - fm.addOnBackStackChangedListener(() -> { - boolean showArrow = fm.getBackStackEntryCount() != 0; - if (drawerToggle != null) { // Tablet layout does not have a drawer - drawerToggle.setDrawerIndicatorEnabled(!showArrow); - } else if (getActionBar() != null) { - getActionBar().setDisplayHomeAsUpEnabled(showArrow); - } - }); - if (fm.findFragmentByTag(MAIN_FRAGMENT_TAG) == null) { String lastFragment = NavDrawerFragment.getLastNavFragment(this); if (ArrayUtils.contains(NavDrawerFragment.NAV_DRAWER_TAGS, lastFragment)) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index a02b60196..681d3a88e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -292,7 +292,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem } EpisodesApplyActionFragment fragment = EpisodesApplyActionFragment .newInstance(feed.getItems(), actions); - ((MainActivity)getActivity()).loadChildFragment(fragment); + ((MainActivity) getActivity()).loadChildFragment(fragment); return true; case R.id.rename_item: new RenameFeedDialog(getActivity(), feed).show(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 11457e46d..983bf4de1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -273,7 +273,8 @@ public class QueueFragment extends Fragment implements Toolbar.OnMenuItemClickLi return true; case R.id.episode_actions: ((MainActivity) requireActivity()).loadChildFragment( - EpisodesApplyActionFragment.newInstance(queue, ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE | ACTION_DOWNLOAD)); + EpisodesApplyActionFragment.newInstance(queue, + ACTION_DELETE | ACTION_REMOVE_FROM_QUEUE | ACTION_DOWNLOAD)); return true; case R.id.queue_sort_episode_title_asc: setSortOrder(SortOrder.EPISODE_TITLE_A_Z); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index 4526c789c..e791da1c6 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -154,7 +154,7 @@ public class SearchFragment extends Fragment { private void setupToolbar(Toolbar toolbar) { toolbar.setTitle(R.string.search_label); toolbar.setNavigationOnClickListener(v -> getParentFragmentManager().popBackStack()); - toolbar.inflateMenu(R.menu.gpodder_podcasts); + toolbar.inflateMenu(R.menu.search); MenuItem item = toolbar.getMenu().findItem(R.id.action_search); item.expandActionView(); -- cgit v1.2.3 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') 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 From bec385a0a854de10b223f6bb3efdd35f506ceb48 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 15:33:40 +0100 Subject: Restore icon state after searching --- .../antennapod/menuhandler/MenuItemUtils.java | 56 ++++++++++++++++------ 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'app/src/main') diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java index 6b3c99975..9c54a529b 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/MenuItemUtils.java @@ -1,9 +1,10 @@ package de.danoeh.antennapod.menuhandler; +import android.annotation.SuppressLint; import android.content.Context; -import android.content.res.TypedArray; import android.view.Menu; import android.view.MenuItem; +import androidx.appcompat.view.menu.MenuItemImpl; import androidx.appcompat.widget.SearchView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; @@ -11,24 +12,23 @@ import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.ThemeUtils; import de.danoeh.antennapod.fragment.SearchFragment; +import java.util.HashMap; +import java.util.Map; + /** - * Utilities for menu items + * Utilities for menu items. */ public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuItemUtils { - @SuppressWarnings("ResourceType") public static void refreshLockItem(Context context, Menu menu) { - final MenuItem queueLock = menu.findItem(de.danoeh.antennapod.R.id.queue_lock); - int[] lockIcons = new int[] { de.danoeh.antennapod.R.attr.ic_lock_open, de.danoeh.antennapod.R.attr.ic_lock_closed }; - TypedArray ta = context.obtainStyledAttributes(lockIcons); + final MenuItem queueLock = menu.findItem(R.id.queue_lock); if (UserPreferences.isQueueLocked()) { queueLock.setTitle(de.danoeh.antennapod.R.string.unlock_queue); - queueLock.setIcon(ta.getDrawable(0)); + queueLock.setIcon(ThemeUtils.getDrawableFromAttr(context, R.attr.ic_lock_open)); } else { queueLock.setTitle(de.danoeh.antennapod.R.string.lock_queue); - queueLock.setIcon(ta.getDrawable(1)); + queueLock.setIcon(ThemeUtils.getDrawableFromAttr(context, R.attr.ic_lock_closed)); } - ta.recycle(); } public static void setupSearchItem(Menu menu, MainActivity activity, long feedId, String feedTitle) { @@ -51,21 +51,49 @@ public class MenuItemUtils extends de.danoeh.antennapod.core.menuhandler.MenuIte } }); searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { + private final Map oldShowAsActionState = new HashMap<>(); + @Override - public boolean onMenuItemActionExpand(MenuItem item) { + public boolean onMenuItemActionExpand(MenuItem clickedItem) { + oldShowAsActionState.clear(); for (int i = 0; i < menu.size(); i++) { - if (menu.getItem(i).getItemId() != searchItem.getItemId()) { - menu.getItem(i).setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + MenuItem item = menu.getItem(i); + if (item.getItemId() != searchItem.getItemId()) { + oldShowAsActionState.put(item.getItemId(), getShowAsActionFlag(item)); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } } return true; } @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - activity.invalidateOptionsMenu(); + public boolean onMenuItemActionCollapse(MenuItem collapsedItem) { + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + if (item.getItemId() != searchItem.getItemId() + && oldShowAsActionState.containsKey(item.getItemId())) { + item.setShowAsAction(oldShowAsActionState.get(item.getItemId())); + } + } return true; } }); } + + @SuppressLint("RestrictedApi") + private static int getShowAsActionFlag(MenuItem item) { + if (!(item instanceof MenuItemImpl)) { + return MenuItemImpl.SHOW_AS_ACTION_NEVER; + } + MenuItemImpl itemImpl = ((MenuItemImpl) item); + if (itemImpl.requiresActionButton()) { + return MenuItemImpl.SHOW_AS_ACTION_ALWAYS; + } else if (itemImpl.requestsActionButton()) { + return MenuItemImpl.SHOW_AS_ACTION_IF_ROOM; + } else if (itemImpl.showsTextAsAction()) { + return MenuItemImpl.SHOW_AS_ACTION_WITH_TEXT; + } else { + return MenuItemImpl.SHOW_AS_ACTION_NEVER; + } + } } -- cgit v1.2.3 From 87e7a6761036d5a700cbd4ffdebf87fa76ca7848 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 1 Nov 2020 16:06:02 +0100 Subject: Reduced lag when switching tabs --- .../antennapod/fragment/AllEpisodesFragment.java | 5 +++-- .../fragment/CompletedDownloadsFragment.java | 6 +----- .../antennapod/fragment/DownloadLogFragment.java | 8 ++------ .../antennapod/fragment/DownloadsFragment.java | 1 + .../antennapod/fragment/EpisodesFragment.java | 3 +++ .../antennapod/fragment/EpisodesListFragment.java | 21 ++++--------------- .../fragment/FavoriteEpisodesFragment.java | 9 ++++++++ .../antennapod/fragment/NewEpisodesFragment.java | 6 ++++-- .../antennapod/fragment/PagedToolbarFragment.java | 19 +++++++---------- .../fragment/RunningDownloadsFragment.java | 7 ++----- app/src/main/res/menu/downloads.xml | 24 ++++++++++++++++++++++ app/src/main/res/menu/downloads_completed.xml | 16 --------------- app/src/main/res/menu/downloads_log.xml | 16 --------------- app/src/main/res/menu/downloads_running.xml | 10 --------- 14 files changed, 60 insertions(+), 91 deletions(-) create mode 100644 app/src/main/res/menu/downloads.xml delete mode 100644 app/src/main/res/menu/downloads_completed.xml delete mode 100644 app/src/main/res/menu/downloads_log.xml delete mode 100644 app/src/main/res/menu/downloads_running.xml (limited to 'app/src/main') 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.xml b/app/src/main/res/menu/downloads.xml new file mode 100644 index 000000000..c8ee20e35 --- /dev/null +++ b/app/src/main/res/menu/downloads.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/menu/downloads_completed.xml b/app/src/main/res/menu/downloads_completed.xml deleted file mode 100644 index e07af520f..000000000 --- a/app/src/main/res/menu/downloads_completed.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/menu/downloads_log.xml b/app/src/main/res/menu/downloads_log.xml deleted file mode 100644 index d37d9bf3f..000000000 --- a/app/src/main/res/menu/downloads_log.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - \ 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 -- cgit v1.2.3