summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/menuhandler
diff options
context:
space:
mode:
authorH. Lehmann <ByteHamster@users.noreply.github.com>2020-01-11 12:47:22 +0100
committerGitHub <noreply@github.com>2020-01-11 12:47:22 +0100
commit2c45c4cd10ca23e293755e8a2049bb82e43e882f (patch)
tree1ffe80b1dafb04581aadfaba9823d7cc3f917428 /app/src/main/java/de/danoeh/antennapod/menuhandler
parent970cdd99054ac6e6b983c7f5664c5b6c5524107d (diff)
parent7f1c24e26c831a9c73c83a15d03d51cc4a15f81e (diff)
downloadAntennaPod-2c45c4cd10ca23e293755e8a2049bb82e43e882f.zip
Merge pull request #3743 from txtd/mark-as-played
Show "mark as read" rather than "mark as play" in case item has no media
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/menuhandler')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java125
1 files changed, 77 insertions, 48 deletions
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;
@@ -32,107 +34,134 @@ public class 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.
*
* @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()