diff --git a/src/main/java/com/github/nutomic/controldlna/gui/RouteFragment.java b/src/main/java/com/github/nutomic/controldlna/gui/RouteFragment.java index b8904df..3480399 100644 --- a/src/main/java/com/github/nutomic/controldlna/gui/RouteFragment.java +++ b/src/main/java/com/github/nutomic/controldlna/gui/RouteFragment.java @@ -45,7 +45,10 @@ import android.support.v7.media.MediaRouter; import android.support.v7.media.MediaRouter.Callback; import android.support.v7.media.MediaRouter.ProviderInfo; import android.support.v7.media.MediaRouter.RouteInfo; +import android.view.ContextMenu; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewConfiguration; @@ -53,6 +56,7 @@ import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; +import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageButton; import android.widget.ListView; @@ -68,8 +72,10 @@ import com.github.nutomic.controldlna.mediarouter.MediaRouterPlayServiceBinder; import com.github.nutomic.controldlna.utility.FileArrayAdapter; import com.github.nutomic.controldlna.utility.RouteAdapter; +import org.fourthline.cling.support.model.DIDLObject; import org.fourthline.cling.support.model.item.Item; +import java.util.ArrayList; import java.util.List; /** @@ -174,6 +180,8 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements mEmptyView = (TextView) getView().findViewById(android.R.id.empty); mListView.setEmptyView(mEmptyView); + registerForContextMenu(mListView); + mControls = getView().findViewById(R.id.controls); mProgressBar = (SeekBar) getView().findViewById(R.id.progressBar); mProgressBar.setOnSeekBarChangeListener(this); @@ -315,6 +323,66 @@ public class RouteFragment extends MediaRouteDiscoveryFragment implements } } + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo info) + { + super.onCreateContextMenu(menu, v, info); + if (mListView.getAdapter() == mRouteAdapter) + return; + + int position = ((AdapterContextMenuInfo)info).position; + + if (position != 0) + menu.add(Menu.NONE, 3, Menu.NONE, "Move Up"); + + menu.add(Menu.NONE, 4, Menu.NONE, "Remove from playlist"); + + if (position != mPlaylistAdapter.getCount()-1) + menu.add(Menu.NONE, 5, Menu.NONE, "Move Down"); + } + + /** + * Process a context menu item selection + * @param item - the menu entry that was selected + * @return - true if the entry was processed + */ + @Override + public boolean onContextItemSelected(MenuItem item) + { + AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); + DIDLObject i = mPlaylistAdapter.getItem(info.position); + + switch(item.getItemId()) + { + case 3: + mPlaylistAdapter.remove(i); + mMediaRouterPlayService.remove(info.position); + mPlaylistAdapter.insert(i, info.position - 1); + mMediaRouterPlayService.insert((Item) i, info.position - 1); + if ((mMediaRouterPlayService.getCurrentTrack() == info.position) || + (mMediaRouterPlayService.getCurrentTrack() == info.position - 1)) + mMediaRouterPlayService.play(mMediaRouterPlayService.getCurrentTrack()); + return true; + case 4: + mPlaylistAdapter.remove(i); + mMediaRouterPlayService.remove(info.position); + if (mMediaRouterPlayService.getCurrentTrack() == info.position) + mMediaRouterPlayService.play(mMediaRouterPlayService.getCurrentTrack()); + return true; + case 5: + mPlaylistAdapter.remove(i); + mMediaRouterPlayService.remove(info.position); + mPlaylistAdapter.insert(i, info.position + 1); + mMediaRouterPlayService.insert((Item) i, info.position + 1); + if ((mMediaRouterPlayService.getCurrentTrack() == info.position) || + (mMediaRouterPlayService.getCurrentTrack() == info.position + 1)) + mMediaRouterPlayService.play(mMediaRouterPlayService.getCurrentTrack()); + return true; + default: + return super.onContextItemSelected(item); + } + } + /** * Displays UPNP devices in the ListView. */ diff --git a/src/main/java/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java b/src/main/java/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java index 4e0b7aa..ef45db5 100644 --- a/src/main/java/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java +++ b/src/main/java/com/github/nutomic/controldlna/mediarouter/MediaRouterPlayService.java @@ -369,12 +369,24 @@ public class MediaRouterPlayService extends Service { * @param playlist The media files in the playlist. */ public void setPlaylist(List playlist) { - - - mPlaylist = playlist; } + public void append(List list) + { + mPlaylist.addAll(list); + } + + public void remove(int index) + { + mPlaylist.remove(index); + } + + public void insert(Item obj, int pos) + { + mPlaylist.add(pos,obj); + } + /** * Plays the track after current in the playlist. * @@ -507,11 +519,6 @@ public class MediaRouterPlayService extends Service { return mPlaylist; } - public void append(List list) - { - mPlaylist.addAll(list); - } - public void toggleShuffleEnabled() { mShuffle = !mShuffle; }