Added context menu to TV episode list items

The context menu adds play and queue functionality for tv show
episode items in the tv show episode list.
This commit is contained in:
Martijn Brekhof 2016-01-29 23:15:02 +01:00
parent c39c9df714
commit 73dd123fb3
6 changed files with 85 additions and 41 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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();
}
};
}

View File

@ -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<PlaylistType.GetPlaylistsReturnType> 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<String>() {
@Override
public void onSuccess(String result) {

View File

@ -21,41 +21,48 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/small_padding">
<!--<ImageView-->
<!--android:id="@+id/art"-->
<!--android:layout_width="@dimen/episodelist_art_width"-->
<!--android:layout_height="@dimen/episodelist_art_heigth"-->
<!--android:layout_alignParentStart="true"-->
<!--android:contentDescription="@string/poster"-->
<!--android:scaleType="centerCrop"/>-->
<ImageView
android:id="@+id/checkmark"
android:id="@+id/list_context_menu"
android:layout_width="@dimen/default_icon_size"
android:layout_height="match_parent"
android:layout_height="@dimen/default_icon_size"
android:layout_alignParentRight="true"
android:layout_marginTop="@dimen/small_padding"
android:contentDescription="@string/seen"
android:src="?attr/iconSeen"/>
android:padding="@dimen/default_icon_padding"
style="@style/Widget.Button.Borderless"
android:src="?attr/iconOverflow"
android:contentDescription="@string/action_options"/>
<TextView
android:id="@+id/episode_number"
<RelativeLayout
android:id="@+id/relativelayout_checkmark_epnumber"
android:layout_width="@dimen/seasonlist_art_width"
android:layout_height="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:gravity="right"
style="@style/TextAppearance.Medialist.Title"
android:paddingTop="@dimen/small_padding"/>
android:layout_alignParentLeft="true">
<ImageView
android:id="@+id/checkmark"
android:layout_width="@dimen/default_icon_size"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_marginTop="@dimen/small_padding"
android:contentDescription="@string/seen"
android:src="?attr/iconSeen"/>
<TextView
android:id="@+id/episode_number"
android:layout_width="@dimen/seasonlist_art_width"
android:layout_height="wrap_content"
style="@style/TextAppearance.Medialist.Title"
android:gravity="right"/>
</RelativeLayout>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/episode_number"
android:layout_toRightOf="@id/episode_number"
android:layout_toLeftOf="@id/checkmark"
android:layout_alignTop="@id/relativelayout_checkmark_epnumber"
android:layout_toRightOf="@id/relativelayout_checkmark_epnumber"
android:layout_toLeftOf="@id/list_context_menu"
style="@style/TextAppearance.Medialist.Title"
android:paddingTop="@dimen/small_padding"/>