diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2013-02-22 23:10:13 +0100 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2013-02-22 23:10:13 +0100 |
commit | 4fca178972637f288966cf2388330229cd41d47c (patch) | |
tree | 8c5e5b8c09687a96baac0bb9a901fa0bc3885821 /src | |
parent | bd92dd3fb317fd3d38a505b8cc0d27cc6f3f4dd8 (diff) | |
parent | 668bae3354e289114d3dfc77fe470324d37c1170 (diff) | |
download | AntennaPod-4fca178972637f288966cf2388330229cd41d47c.zip |
Merge branch 'issue-39' into develop
Conflicts:
res/values/ids.xml
Diffstat (limited to 'src')
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; |