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); - 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; - - } - } else { - return true; + } + 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; } - } catch (DownloadRequestException e) { - e.printStackTrace(); - DownloadRequestErrorDialogCreator.newRequestErrorDialog(getActivity(), e.getMessage()); + 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; } } @@ -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(); + public void refreshToolbarState() { + boolean hasHistory = playbackHistory != null && !playbackHistory.isEmpty(); + toolbar.getMenu().findItem(R.id.clear_history_item).setVisible(hasHistory); } @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()); - } - } - - @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); + private void refreshToolbarState() { + MenuItemUtils.refreshLockItem(getActivity(), toolbar.getMenu()); + boolean keepSorted = UserPreferences.isQueueKeepSorted(); + toolbar.getMenu().findItem(R.id.queue_lock).setVisible(!keepSorted); - // 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); - - 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) { + 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(); - } - }; - 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); + @Override + public void onConfirmButtonPressed( + DialogInterface dialog) { + dialog.dismiss(); + DBWriter.clearQueue(); } - if (recyclerAdapter != null) { - recyclerAdapter.updateDragDropEnabled(); - } - 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 @@ + + + +