summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/de/danoeh/antennapod/fragment/EpisodesFragment.java38
-rw-r--r--src/de/danoeh/antennapod/storage/DBWriter.java117
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();
}
/**