summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2013-02-22 23:10:13 +0100
committerdaniel oeh <daniel.oeh@gmail.com>2013-02-22 23:10:13 +0100
commit4fca178972637f288966cf2388330229cd41d47c (patch)
tree8c5e5b8c09687a96baac0bb9a901fa0bc3885821 /src
parentbd92dd3fb317fd3d38a505b8cc0d27cc6f3f4dd8 (diff)
parent668bae3354e289114d3dfc77fe470324d37c1170 (diff)
downloadAntennaPod-4fca178972637f288966cf2388330229cd41d47c.zip
Merge branch 'issue-39' into develop
Conflicts: res/values/ids.xml
Diffstat (limited to 'src')
-rw-r--r--src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java177
-rw-r--r--src/de/danoeh/antennapod/feed/FeedManager.java34
-rw-r--r--src/de/danoeh/antennapod/fragment/EpisodesFragment.java12
3 files changed, 212 insertions, 11 deletions
diff --git a/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
new file mode 100644
index 000000000..a7017d2fb
--- /dev/null
+++ b/src/de/danoeh/antennapod/activity/OrganizeQueueActivity.java
@@ -0,0 +1,177 @@
+package de.danoeh.antennapod.activity;
+
+import java.util.List;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.actionbarsherlock.app.SherlockListActivity;
+import com.actionbarsherlock.view.Menu;
+import com.actionbarsherlock.view.MenuItem;
+import com.mobeta.android.dslv.DragSortListView;
+
+import de.danoeh.antennapod.PodcastApp;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.asynctask.FeedImageLoader;
+import de.danoeh.antennapod.feed.FeedItem;
+import de.danoeh.antennapod.feed.FeedManager;
+
+public class OrganizeQueueActivity extends SherlockListActivity {
+ private static final String TAG = "OrganizeQueueActivity";
+
+ private static final int MENU_ID_ACCEPT = 2;
+
+ private OrganizeAdapter adapter;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setTheme(PodcastApp.getThemeResourceId());
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.organize_queue);
+
+ DragSortListView listView = (DragSortListView) getListView();
+ listView.setDropListener(dropListener);
+ listView.setRemoveListener(removeListener);
+
+ adapter = new OrganizeAdapter(this, 0, FeedManager.getInstance()
+ .getQueue());
+ setListAdapter(adapter);
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ try {
+ unregisterReceiver(contentUpdate);
+ } catch (IllegalArgumentException e) {
+
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ IntentFilter filter = new IntentFilter(FeedManager.ACTION_QUEUE_UPDATE);
+ filter.addAction(FeedManager.ACTION_FEED_LIST_UPDATE);
+ registerReceiver(contentUpdate, filter);
+ }
+
+ private BroadcastReceiver contentUpdate = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (adapter != null) {
+ adapter.notifyDataSetChanged();
+ }
+ }
+
+ };
+
+ private DragSortListView.DropListener dropListener = new DragSortListView.DropListener() {
+
+ @Override
+ public void drop(int from, int to) {
+ FeedManager manager = FeedManager.getInstance();
+ manager.moveQueueItem(OrganizeQueueActivity.this, from, to, false);
+ adapter.notifyDataSetChanged();
+ }
+ };
+
+ private DragSortListView.RemoveListener removeListener = new DragSortListView.RemoveListener() {
+
+ @Override
+ public void remove(int which) {
+ FeedManager manager = FeedManager.getInstance();
+ manager.removeQueueItem(OrganizeQueueActivity.this,
+ (FeedItem) getListAdapter().getItem(which));
+ }
+ };
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ super.onCreateOptionsMenu(menu);
+ TypedArray drawables = obtainStyledAttributes(new int[] { R.attr.navigation_accept });
+ menu.add(Menu.NONE, MENU_ID_ACCEPT, Menu.NONE, R.string.confirm_label)
+ .setIcon(drawables.getDrawable(0))
+ .setShowAsAction(
+ MenuItem.SHOW_AS_ACTION_IF_ROOM
+ | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_ID_ACCEPT:
+ finish();
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ private static class OrganizeAdapter extends ArrayAdapter<FeedItem> {
+
+ private Context context;
+
+ public OrganizeAdapter(Context context, int textViewResourceId,
+ List<FeedItem> objects) {
+ super(context, textViewResourceId, objects);
+ this.context = context;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ Holder holder;
+ final FeedItem item = getItem(position);
+
+ if (convertView == null) {
+ holder = new Holder();
+ LayoutInflater inflater = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ convertView = inflater.inflate(
+ R.layout.organize_queue_listitem, null);
+ holder.title = (TextView) convertView
+ .findViewById(R.id.txtvTitle);
+ holder.feedTitle = (TextView) convertView
+ .findViewById(R.id.txtvFeedname);
+
+ holder.feedImage = (ImageView) convertView
+ .findViewById(R.id.imgvFeedimage);
+ convertView.setTag(holder);
+ } else {
+ holder = (Holder) convertView.getTag();
+ }
+
+ holder.title.setText(item.getTitle());
+ holder.feedTitle.setText(item.getFeed().getTitle());
+
+ holder.feedImage.setTag(item.getFeed().getImage());
+ FeedImageLoader.getInstance().loadThumbnailBitmap(
+ item.getFeed().getImage(),
+ holder.feedImage,
+ (int) convertView.getResources().getDimension(
+ R.dimen.thumbnail_length));
+
+ return convertView;
+ }
+
+ static class Holder {
+ TextView title;
+ TextView feedTitle;
+ ImageView feedImage;
+ }
+
+ }
+
+}
diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java
index 3e5e838b0..6c3471e5c 100644
--- a/src/de/danoeh/antennapod/feed/FeedManager.java
+++ b/src/de/danoeh/antennapod/feed/FeedManager.java
@@ -765,16 +765,29 @@ public class FeedManager {
}
}
- public void moveQueueItem(final Context context, FeedItem item, int delta) {
+ /**
+ * Moves the queue item at the specified index to another position. If the
+ * indices are out of range, no operation will be performed.
+ *
+ * @param from
+ * index of the item that is going to be moved
+ * @param to
+ * destination index of item
+ * @param broadcastUpdate
+ * true if the method should send a queue update broadcast after
+ * the operation has been performed. This should be set to false
+ * if the order of the queue is changed through drag & drop
+ * reordering to avoid visual glitches.
+ */
+ public void moveQueueItem(final Context context, int from, int to,
+ boolean broadcastUpdate) {
if (AppConfig.DEBUG)
- Log.d(TAG, "Moving queue item");
- int itemIndex = queue.indexOf(item);
- int newIndex = itemIndex + delta;
- if (newIndex >= 0 && newIndex < queue.size()) {
- FeedItem oldItem = queue.set(newIndex, item);
- queue.set(itemIndex, oldItem);
+ Log.d(TAG, "Moving queue item from index " + from + " to index "
+ + to);
+ if (from >= 0 && from < queue.size() && to >= 0 && to < queue.size()) {
+ FeedItem item = queue.remove(from);
+ queue.add(to, item);
dbExec.execute(new Runnable() {
-
@Override
public void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
@@ -783,9 +796,10 @@ public class FeedManager {
adapter.close();
}
});
-
+ if (broadcastUpdate) {
+ sendQueueUpdateBroadcast(context, item);
+ }
}
- sendQueueUpdateBroadcast(context, item);
}
public boolean isInQueue(FeedItem item) {
diff --git a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
index 1ea0011ef..843cf5af0 100644
--- a/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
+++ b/src/de/danoeh/antennapod/fragment/EpisodesFragment.java
@@ -21,6 +21,7 @@ import com.actionbarsherlock.view.Menu;
import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.ItemviewActivity;
+import de.danoeh.antennapod.activity.OrganizeQueueActivity;
import de.danoeh.antennapod.adapter.ActionButtonCallback;
import de.danoeh.antennapod.adapter.ExternalEpisodesListAdapter;
import de.danoeh.antennapod.dialog.DownloadRequestErrorDialogCreator;
@@ -60,8 +61,11 @@ public class EpisodesFragment extends SherlockFragment {
filter.addAction(FeedManager.ACTION_QUEUE_UPDATE);
filter.addAction(FeedManager.ACTION_UNREAD_ITEMS_UPDATE);
filter.addAction(FeedManager.ACTION_FEED_LIST_UPDATE);
-
+
getActivity().registerReceiver(contentUpdate, filter);
+ if (adapter != null) {
+ adapter.notifyDataSetChanged();
+ }
}
@Override
@@ -158,6 +162,8 @@ public class EpisodesFragment extends SherlockFragment {
}, selectedItem, false);
} else if (selectedGroupId == ExternalEpisodesListAdapter.GROUP_POS_QUEUE) {
+ menu.add(Menu.NONE, R.id.organize_queue_item, Menu.NONE,
+ R.string.organize_queue_label);
menu.add(Menu.NONE, R.id.clear_queue_item, Menu.NONE, getActivity()
.getString(R.string.clear_queue_label));
menu.add(Menu.NONE, R.id.download_all_item, Menu.NONE,
@@ -187,6 +193,10 @@ public class EpisodesFragment extends SherlockFragment {
} else if (selectedGroupId == ExternalEpisodesListAdapter.GROUP_POS_QUEUE) {
handled = true;
switch (item.getItemId()) {
+ case R.id.organize_queue_item:
+ startActivity(new Intent(getActivity(),
+ OrganizeQueueActivity.class));
+ break;
case R.id.clear_queue_item:
manager.clearQueue(getActivity());
break;