From ce659f5cb22c4546969b7c544468b5f787e5e2de Mon Sep 17 00:00:00 2001 From: txtd Date: Thu, 9 Jan 2020 00:23:53 +0100 Subject: Show mark as read rather than mark as played in case item has no media --- .../menuhandler/FeedItemMenuHandler.java | 125 +++++++++++++-------- 1 file changed, 77 insertions(+), 48 deletions(-) (limited to 'app/src/main/java/de/danoeh/antennapod/menuhandler') diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java index 2f3459beb..4d3e1ff72 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java @@ -6,6 +6,8 @@ import androidx.annotation.NonNull; import com.google.android.material.snackbar.Snackbar; import androidx.fragment.app.Fragment; import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItem; @@ -31,94 +33,118 @@ public class FeedItemMenuHandler { private FeedItemMenuHandler() { } - /** - * Used by the MenuHandler to access different types of menus through one - * interface - */ - public interface MenuInterface { - /** - * Implementations of this method should call findItem(id) on their - * menu-object and call setVisibility(visibility) on the returned - * MenuItem object. - */ - void setItemVisibility(int id, boolean visible); - } - /** * This method should be called in the prepare-methods of menus. It changes * the visibility of the menu items depending on a FeedItem's attributes. * - * @param mi An instance of MenuInterface that the method uses to change a - * MenuItem's visibility + * @param menu An instance of Menu * @param selectedItem The FeedItem for which the menu is supposed to be prepared * @return Returns true if selectedItem is not null. */ - public static boolean onPrepareMenu(MenuInterface mi, + public static boolean onPrepareMenu(Menu menu, FeedItem selectedItem) { - if (selectedItem == null) { + if (menu == null || selectedItem == null) { return false; } boolean hasMedia = selectedItem.getMedia() != null; boolean isPlaying = hasMedia && selectedItem.getState() == FeedItem.State.PLAYING; if (!isPlaying) { - mi.setItemVisibility(R.id.skip_episode_item, false); + setItemVisibility(menu, R.id.skip_episode_item, false); } - boolean isInQueue = selectedItem.isTagged(FeedItem.TAG_QUEUE); if (!isInQueue) { - mi.setItemVisibility(R.id.remove_from_queue_item, false); + setItemVisibility(menu, R.id.remove_from_queue_item, false); } if (!(!isInQueue && selectedItem.getMedia() != null)) { - mi.setItemVisibility(R.id.add_to_queue_item, false); + setItemVisibility(menu, R.id.add_to_queue_item, false); } - if (!ShareUtils.hasLinkToShare(selectedItem)) { - mi.setItemVisibility(R.id.visit_website_item, false); - mi.setItemVisibility(R.id.share_link_item, false); - mi.setItemVisibility(R.id.share_link_with_position_item, false); + setItemVisibility(menu, R.id.visit_website_item, false); + setItemVisibility(menu, R.id.share_link_item, false); + setItemVisibility(menu, R.id.share_link_with_position_item, false); } if (!hasMedia || selectedItem.getMedia().getDownload_url() == null) { - mi.setItemVisibility(R.id.share_download_url_item, false); - mi.setItemVisibility(R.id.share_download_url_with_position_item, false); + setItemVisibility(menu, R.id.share_download_url_item, false); + setItemVisibility(menu, R.id.share_download_url_with_position_item, false); } if(!hasMedia || selectedItem.getMedia().getPosition() <= 0) { - mi.setItemVisibility(R.id.share_link_with_position_item, false); - mi.setItemVisibility(R.id.share_download_url_with_position_item, false); + setItemVisibility(menu, R.id.share_download_url_with_position_item, false); + setItemVisibility(menu, R.id.share_link_with_position_item, false); } boolean fileDownloaded = hasMedia && selectedItem.getMedia().fileExists(); - mi.setItemVisibility(R.id.share_file, fileDownloaded); + setItemVisibility(menu, R.id.share_file, fileDownloaded); - mi.setItemVisibility(R.id.remove_new_flag_item, selectedItem.isNew()); + setItemVisibility(menu, R.id.remove_new_flag_item, selectedItem.isNew()); if (selectedItem.isPlayed()) { - mi.setItemVisibility(R.id.mark_read_item, false); + setItemVisibility(menu, R.id.mark_read_item, false); } else { - mi.setItemVisibility(R.id.mark_unread_item, false); + setItemVisibility(menu, R.id.mark_unread_item, false); } - if(selectedItem.getMedia() == null || selectedItem.getMedia().getPosition() == 0) { - mi.setItemVisibility(R.id.reset_position, false); + if (selectedItem.getMedia() == null || selectedItem.getMedia().getPosition() == 0) { + setItemVisibility(menu, R.id.reset_position, false); } if(!UserPreferences.isEnableAutodownload() || fileDownloaded) { - mi.setItemVisibility(R.id.activate_auto_download, false); - mi.setItemVisibility(R.id.deactivate_auto_download, false); - } else if(selectedItem.getAutoDownload()) { - mi.setItemVisibility(R.id.activate_auto_download, false); + setItemVisibility(menu, R.id.activate_auto_download, false); + setItemVisibility(menu, R.id.deactivate_auto_download, false); + } else if (selectedItem.getAutoDownload()) { + setItemVisibility(menu, R.id.activate_auto_download, false); } else { - mi.setItemVisibility(R.id.deactivate_auto_download, false); + setItemVisibility(menu, R.id.deactivate_auto_download, false); + } + + // Display proper strings when item has no media + if (!hasMedia && !selectedItem.isPlayed()) { + setItemTitle(menu, R.id.mark_read_item, R.string.mark_read_no_media_label); + } + + if (!hasMedia && selectedItem.isPlayed()) { + setItemTitle(menu, R.id.mark_unread_item, R.string.mark_unread_label_no_media); } boolean isFavorite = selectedItem.isTagged(FeedItem.TAG_FAVORITE); - mi.setItemVisibility(R.id.add_to_favorites_item, !isFavorite); - mi.setItemVisibility(R.id.remove_from_favorites_item, isFavorite); + setItemVisibility(menu, R.id.add_to_favorites_item, !isFavorite); + setItemVisibility(menu, R.id.remove_from_favorites_item, isFavorite); - mi.setItemVisibility(R.id.remove_item, fileDownloaded); + setItemVisibility(menu, R.id.remove_item, fileDownloaded); return true; } + /** + * Used to set the viability of a menu item. + * This method also does some null-checking so that neither menu nor the menu item are null + * in order to prevent nullpointer exceptions. + * @param menu The menu that should be used + * @param menuId The id of the menu item that will be used + * @param visibility The new visibility status of given menu item + * */ + private static void setItemVisibility(Menu menu, int menuId, boolean visibility) { + if (menu == null) { + return; + } + MenuItem item = menu.findItem(menuId); + if (item != null) { + item.setVisible(visibility); + } + } + + /** + * This method allows to replace to String of a menu item with a different one. + * @param menu Menu item that should be used + * @param id The id of the string that is going to be replaced. + * @param noMedia The id of the new String that is going to be used. + * */ + public static void setItemTitle(Menu menu, int id, int noMedia){ + MenuItem item = menu.findItem(id); + if (item != null) { + item.setTitle(noMedia); + } + } + /** * The same method as onPrepareMenu(MenuInterface, FeedItem, boolean, QueueAccess), but lets the * caller also specify a list of menu items that should not be shown. @@ -126,13 +152,16 @@ public class FeedItemMenuHandler { * @param excludeIds Menu item that should be excluded * @return true if selectedItem is not null. */ - public static boolean onPrepareMenu(MenuInterface mi, + public static boolean onPrepareMenu(Menu menu, FeedItem selectedItem, int... excludeIds) { - boolean rc = onPrepareMenu(mi, selectedItem); + if (menu == null || selectedItem == null ) { + return false; + } + boolean rc = onPrepareMenu(menu, selectedItem); if (rc && excludeIds != null) { for (int id : excludeIds) { - mi.setItemVisibility(id, false); + setItemVisibility(menu, id, false); } } return rc; @@ -161,7 +190,7 @@ public class FeedItemMenuHandler { case R.id.mark_read_item: selectedItem.setPlayed(true); DBWriter.markItemPlayed(selectedItem, FeedItem.PLAYED, true); - if(GpodnetPreferences.loggedIn()) { + if (GpodnetPreferences.loggedIn()) { FeedMedia media = selectedItem.getMedia(); // not all items have media, Gpodder only cares about those that do if (media != null) { @@ -179,7 +208,7 @@ public class FeedItemMenuHandler { case R.id.mark_unread_item: selectedItem.setPlayed(false); DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, false); - if(GpodnetPreferences.loggedIn() && selectedItem.getMedia() != null) { + if (GpodnetPreferences.loggedIn() && selectedItem.getMedia() != null) { GpodnetEpisodeAction actionNew = new GpodnetEpisodeAction.Builder(selectedItem, Action.NEW) .currentDeviceId() .currentTimestamp() -- cgit v1.2.3