diff options
Diffstat (limited to 'src/de')
-rw-r--r-- | src/de/danoeh/antennapod/fragment/EpisodesFragment.java | 38 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/storage/DBWriter.java | 117 |
2 files changed, 131 insertions, 24 deletions
diff --git a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java index a99056c9a..6b228662f 100644 --- a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java +++ b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java @@ -222,6 +222,12 @@ public class EpisodesFragment extends Fragment { } }, selectedItem, false, QueueAccess.ItemListAccess(queue)); + // check to see if the item is in the queue, if so add queue menu items + int itemIndex = queue.indexOf(selectedItem); + if (itemIndex != -1) { + addQueueOnlyMenus(menu, itemIndex); + } + } else if (selectedGroupId == ExternalEpisodesListAdapter.GROUP_POS_QUEUE) { menu.add(Menu.NONE, R.id.organize_queue_item, Menu.NONE, R.string.organize_queue_label); @@ -237,6 +243,24 @@ public class EpisodesFragment extends Fragment { } } + /** + * Adds submenus to the ContextMenu if the item selected is in the queue. + * @param menu the ContextMenu to add the submenus to + * @param itemIndex the index of the selected item within the queue. + */ + private void addQueueOnlyMenus(ContextMenu menu, int itemIndex) { + if (itemIndex != 0) { + // don't add move to top if this item is already on the top + menu.add(Menu.NONE, R.id.move_to_top_item, Menu.NONE, getActivity() + .getString(R.string.move_to_top_label)); + } + if (itemIndex != queue.size() - 1) { + // don't add move to bottom if this item is already on the bottom + menu.add(Menu.NONE, R.id.move_to_bottom_item, Menu.NONE, getActivity() + .getString(R.string.move_to_bottom_label)); + } + } + @Override public boolean onContextItemSelected(android.view.MenuItem item) { boolean handled = false; @@ -249,7 +273,19 @@ public class EpisodesFragment extends Fragment { DownloadRequestErrorDialogCreator.newRequestErrorDialog( getActivity(), e.getMessage()); } - + if (!handled) { + // if it wasn't handled by the FeedItemMenuHandler it might be one of ours + switch (item.getItemId()) { + case R.id.move_to_top_item: + DBWriter.moveQueueItemToTop(getActivity(), selectedItem.getId(), true); + handled = true; + break; + case R.id.move_to_bottom_item: + DBWriter.moveQueueItemToBottom(getActivity(), selectedItem.getId(), true); + handled = true; + break; + } + } } else if (selectedGroupId == ExternalEpisodesListAdapter.GROUP_POS_QUEUE) { handled = true; switch (item.getItemId()) { diff --git a/src/de/danoeh/antennapod/storage/DBWriter.java b/src/de/danoeh/antennapod/storage/DBWriter.java index b5cab8b5a..9eb0ab643 100644 --- a/src/de/danoeh/antennapod/storage/DBWriter.java +++ b/src/de/danoeh/antennapod/storage/DBWriter.java @@ -466,7 +466,61 @@ public class DBWriter { }); } - + + /** + * Moves the specified item to the top of the queue. + * + * @param context A context that is used for opening a database connection. + * @param itemId The item to move to the top of the queue + * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to + * false if the caller wants to avoid unexpected updates of the GUI. + */ + public static Future<?> moveQueueItemToTop(final Context context, final long itemId, final boolean broadcastUpdate) { + return dbExec.submit(new Runnable() { + @Override + public void run() { + List<Long> queueIdList = DBReader.getQueueIDList(context); + int currentLocation = 0; + for (long id : queueIdList) { + if (id == itemId) { + moveQueueItemHelper(context, currentLocation, 0, broadcastUpdate); + return; + } + currentLocation++; + } + Log.e(TAG, "moveQueueItemToTop: item not found"); + } + }); + } + + /** + * Moves the specified item to the bottom of the queue. + * + * @param context A context that is used for opening a database connection. + * @param itemId The item to move to the bottom of the queue + * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to + * false if the caller wants to avoid unexpected updates of the GUI. + */ + public static Future<?> moveQueueItemToBottom(final Context context, final long itemId, + final boolean broadcastUpdate) { + return dbExec.submit(new Runnable() { + @Override + public void run() { + List<Long> queueIdList = DBReader.getQueueIDList(context); + int currentLocation = 0; + for (long id : queueIdList) { + if (id == itemId) { + moveQueueItemHelper(context, currentLocation, queueIdList.size() - 1, + broadcastUpdate); + return; + } + currentLocation++; + } + Log.e(TAG, "moveQueueItemToBottom: item not found"); + } + }); + } + /** * Changes the position of a FeedItem in the queue. * @@ -483,31 +537,48 @@ public class DBWriter { @Override public void run() { - final PodDBAdapter adapter = new PodDBAdapter(context); - adapter.open(); - final List<FeedItem> queue = DBReader - .getQueue(context, adapter); - - if (queue != null) { - if (from >= 0 && from < queue.size() && to >= 0 - && to < queue.size()) { - - final FeedItem item = queue.remove(from); - queue.add(to, item); - - adapter.setQueue(queue); - if (broadcastUpdate) { - EventDistributor.getInstance() - .sendQueueUpdateBroadcast(); - } + moveQueueItemHelper(context, from, to, broadcastUpdate); + } + }); + } - } - } else { - Log.e(TAG, "moveQueueItem: Could not load queue"); + /** + * Changes the position of a FeedItem in the queue. + * + * This function must be run using the ExecutorService (dbExec). + * + * @param context A context that is used for opening a database connection. + * @param from Source index. Must be in range 0..queue.size()-1. + * @param to Destination index. Must be in range 0..queue.size()-1. + * @param broadcastUpdate true if this operation should trigger a QueueUpdateBroadcast. This option should be set to + * false if the caller wants to avoid unexpected updates of the GUI. + * @throws IndexOutOfBoundsException if (to < 0 || to >= queue.size()) || (from < 0 || from >= queue.size()) + */ + private static void moveQueueItemHelper(final Context context, final int from, + final int to, final boolean broadcastUpdate) { + final PodDBAdapter adapter = new PodDBAdapter(context); + adapter.open(); + final List<FeedItem> queue = DBReader + .getQueue(context, adapter); + + if (queue != null) { + if (from >= 0 && from < queue.size() && to >= 0 + && to < queue.size()) { + + final FeedItem item = queue.remove(from); + queue.add(to, item); + + adapter.setQueue(queue); + if (broadcastUpdate) { + EventDistributor.getInstance() + .sendQueueUpdateBroadcast(); } - adapter.close(); + } - }); + } else { + Log.e(TAG, "moveQueueItemHelper: Could not load queue"); + } + adapter.close(); } /** |