Merge pull request #193 from poisdeux/feature/187

Added context menu to TV episode list items
This commit is contained in:
Synced Synapse 2016-02-04 19:17:48 +00:00
commit 3be65d6724
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"/>