diff --git a/app/src/main/java/org/xbmc/kore/ui/AlbumListFragment.java b/app/src/main/java/org/xbmc/kore/ui/AlbumListFragment.java index 30b0f21..89b9257 100644 --- a/app/src/main/java/org/xbmc/kore/ui/AlbumListFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/AlbumListFragment.java @@ -318,7 +318,7 @@ public class AlbumListFragment extends AbstractListFragment { MediaPlayerUtils.play(AlbumListFragment.this, playListItem); return true; case R.id.action_queue: - MediaPlayerUtils.queueAudio(AlbumListFragment.this, playListItem); + MediaPlayerUtils.queue(AlbumListFragment.this, playListItem, PlaylistType.GetPlaylistsReturnType.AUDIO); return true; } return false; diff --git a/app/src/main/java/org/xbmc/kore/ui/ArtistListFragment.java b/app/src/main/java/org/xbmc/kore/ui/ArtistListFragment.java index 917cda7..64a5dd3 100644 --- a/app/src/main/java/org/xbmc/kore/ui/ArtistListFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/ArtistListFragment.java @@ -40,6 +40,7 @@ import android.widget.TextView; import org.xbmc.kore.R; import org.xbmc.kore.host.HostInfo; import org.xbmc.kore.host.HostManager; +import org.xbmc.kore.jsonrpc.method.Playlist; import org.xbmc.kore.jsonrpc.type.PlaylistType; import org.xbmc.kore.provider.MediaContract; import org.xbmc.kore.provider.MediaDatabase; @@ -238,7 +239,7 @@ public class ArtistListFragment extends AbstractListFragment { MediaPlayerUtils.play(ArtistListFragment.this, playListItem); return true; case R.id.action_queue: - MediaPlayerUtils.queueAudio(ArtistListFragment.this, playListItem); + MediaPlayerUtils.queue(ArtistListFragment.this, playListItem, PlaylistType.GetPlaylistsReturnType.AUDIO); return true; } return false; diff --git a/app/src/main/java/org/xbmc/kore/ui/AudioGenresListFragment.java b/app/src/main/java/org/xbmc/kore/ui/AudioGenresListFragment.java index faebf4b..3605914 100644 --- a/app/src/main/java/org/xbmc/kore/ui/AudioGenresListFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/AudioGenresListFragment.java @@ -233,7 +233,7 @@ public class AudioGenresListFragment extends AbstractListFragment { MediaPlayerUtils.play(AudioGenresListFragment.this, playListItem); return true; case R.id.action_queue: - MediaPlayerUtils.queueAudio(AudioGenresListFragment.this, playListItem); + MediaPlayerUtils.queue(AudioGenresListFragment.this, playListItem, PlaylistType.GetPlaylistsReturnType.AUDIO); return true; } return false; diff --git a/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java b/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java index bfca8df..2375030 100644 --- a/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java +++ b/app/src/main/java/org/xbmc/kore/ui/TVShowEpisodeListFragment.java @@ -38,6 +38,7 @@ import android.view.ViewGroup; import android.widget.CursorTreeAdapter; import android.widget.ExpandableListView; import android.widget.ImageView; +import android.widget.PopupMenu; import android.widget.RelativeLayout; import android.widget.TextView; @@ -45,9 +46,11 @@ import org.xbmc.kore.R; import org.xbmc.kore.Settings; import org.xbmc.kore.host.HostManager; import org.xbmc.kore.jsonrpc.event.MediaSyncEvent; +import org.xbmc.kore.jsonrpc.type.PlaylistType; import org.xbmc.kore.provider.MediaContract; import org.xbmc.kore.service.LibrarySyncService; import org.xbmc.kore.utils.LogUtils; +import org.xbmc.kore.utils.MediaPlayerUtils; import org.xbmc.kore.utils.UIUtils; import java.util.HashMap; @@ -445,7 +448,6 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment private class SeasonsEpisodesAdapter extends CursorTreeAdapter { private int themeAccentColor; - private int separatorPadding; private int iconCollapseResId, iconExpandResId; @@ -476,7 +478,6 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment UIUtils.IMAGE_RESIZE_FACTOR); artHeight = (int)(resources.getDimension(R.dimen.seasonlist_art_heigth) / UIUtils.IMAGE_RESIZE_FACTOR); - separatorPadding = resources.getDimensionPixelSize(R.dimen.small_padding); } @Override @@ -497,7 +498,7 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment viewHolder.titleView = (TextView)view.findViewById(R.id.title); viewHolder.detailsView = (TextView)view.findViewById(R.id.details); viewHolder.episodenumberView = (TextView)view.findViewById(R.id.episode_number); -// viewHolder.artView = (ImageView)view.findViewById(R.id.art); + viewHolder.contextMenuView = (ImageView)view.findViewById(R.id.list_context_menu); viewHolder.checkmarkView = (ImageView)view.findViewById(R.id.checkmark); view.setTag(viewHolder); @@ -552,8 +553,13 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment viewHolder.checkmarkView.setVisibility(View.VISIBLE); viewHolder.checkmarkView.setColorFilter(themeAccentColor); } else { - viewHolder.checkmarkView.setVisibility(View.GONE); + viewHolder.checkmarkView.setVisibility(View.INVISIBLE); } + + // For the popupmenu + ImageView contextMenu = (ImageView)view.findViewById(R.id.list_context_menu); + contextMenu.setTag(viewHolder); + contextMenu.setOnClickListener(contextlistItemMenuClickListener); } @Override @@ -588,10 +594,39 @@ public class TVShowEpisodeListFragment extends AbstractDetailsFragment TextView titleView; TextView detailsView; TextView episodenumberView; - // ImageView artView; + ImageView contextMenuView; ImageView checkmarkView; + // ImageView artView; int episodeId; } + private View.OnClickListener contextlistItemMenuClickListener = new View.OnClickListener() { + @Override + public void onClick(final View v) { + final EpisodeViewHolder viewHolder = (EpisodeViewHolder)v.getTag(); + + final PlaylistType.Item playListItem = new PlaylistType.Item(); + playListItem.episodeid = viewHolder.episodeId; + + final PopupMenu popupMenu = new PopupMenu(getActivity(), v); + popupMenu.getMenuInflater().inflate(R.menu.musiclist_item, popupMenu.getMenu()); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_play: + MediaPlayerUtils.play(TVShowEpisodeListFragment.this, playListItem); + return true; + case R.id.action_queue: + MediaPlayerUtils.queue(TVShowEpisodeListFragment.this, playListItem, PlaylistType.GetPlaylistsReturnType.VIDEO); + return true; + } + return false; + } + }); + popupMenu.show(); + } + }; + } diff --git a/app/src/main/java/org/xbmc/kore/utils/MediaPlayerUtils.java b/app/src/main/java/org/xbmc/kore/utils/MediaPlayerUtils.java index 0db2bbc..554bf35 100644 --- a/app/src/main/java/org/xbmc/kore/utils/MediaPlayerUtils.java +++ b/app/src/main/java/org/xbmc/kore/utils/MediaPlayerUtils.java @@ -79,11 +79,12 @@ public class MediaPlayerUtils { } /** - * Clears current playlist and starts playing item + * Queues item to current playlist * @param fragment Fragment instance from which this method is called - * @param item PlaylistType.Item that needs to be added to the current audio playlist + * @param item PlaylistType.Item that needs to be added to the current playlist + * @param type {@link org.xbmc.kore.jsonrpc.type.PlaylistType.GetPlaylistsReturnType} */ - public static void queueAudio(final Fragment fragment, final PlaylistType.Item item) { + public static void queue(final Fragment fragment, final PlaylistType.Item item, final String type) { Playlist.GetPlaylists getPlaylists = new Playlist.GetPlaylists(); final Handler callbackHandler = new Handler(); @@ -96,17 +97,17 @@ public class MediaPlayerUtils { @Override public void onSuccess(ArrayList result) { if (!fragment.isAdded()) return; - // Ok, loop through the playlists, looking for the audio one - int audioPlaylistId = -1; + // Ok, loop through the playlists, looking for the correct one + int playlistId = -1; for (PlaylistType.GetPlaylistsReturnType playlist : result) { - if (playlist.type.equals(PlaylistType.GetPlaylistsReturnType.AUDIO)) { - audioPlaylistId = playlist.playlistid; + if (playlist.type.equals(type)) { + playlistId = playlist.playlistid; break; } } // If found, add to playlist - if (audioPlaylistId != -1) { - Playlist.Add action = new Playlist.Add(audioPlaylistId, item); + if (playlistId != -1) { + Playlist.Add action = new Playlist.Add(playlistId, item); action.execute(hostManager.getConnection(), new ApiCallback() { @Override public void onSuccess(String result) { diff --git a/app/src/main/res/layout/list_item_episode.xml b/app/src/main/res/layout/list_item_episode.xml index 1ab3e6b..28f0202 100644 --- a/app/src/main/res/layout/list_item_episode.xml +++ b/app/src/main/res/layout/list_item_episode.xml @@ -21,41 +21,48 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/small_padding"> - - - - - - - - - + + android:padding="@dimen/default_icon_padding" + style="@style/Widget.Button.Borderless" + android:src="?attr/iconOverflow" + android:contentDescription="@string/action_options"/> - + android:layout_alignParentLeft="true"> + + + + +