Added context menu to itemlist

This commit is contained in:
daniel oeh 2013-01-20 20:54:56 +01:00
parent 7113656a0d
commit 1d5d72eb88
6 changed files with 140 additions and 127 deletions

View File

@ -62,7 +62,8 @@ public class ItemviewActivity extends SherlockFragmentActivity {
@Override @Override
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
if (AppConfig.DEBUG) Log.d(TAG, "Stopping Activity"); if (AppConfig.DEBUG)
Log.d(TAG, "Stopping Activity");
} }
/** Extracts FeedItem object the activity is supposed to display */ /** Extracts FeedItem object the activity is supposed to display */
@ -76,8 +77,10 @@ public class ItemviewActivity extends SherlockFragmentActivity {
} }
Feed feed = manager.getFeed(feedId); Feed feed = manager.getFeed(feedId);
item = manager.getFeedItem(itemId, feed); item = manager.getFeedItem(itemId, feed);
if (AppConfig.DEBUG) Log.d(TAG, "Title of item is " + item.getTitle()); if (AppConfig.DEBUG)
if (AppConfig.DEBUG) Log.d(TAG, "Title of feed is " + item.getFeed().getTitle()); Log.d(TAG, "Title of item is " + item.getTitle());
if (AppConfig.DEBUG)
Log.d(TAG, "Title of feed is " + item.getFeed().getTitle());
} }
private void populateUI() { private void populateUI() {
@ -95,21 +98,24 @@ public class ItemviewActivity extends SherlockFragmentActivity {
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction(); .beginTransaction();
ItemDescriptionFragment fragment = ItemDescriptionFragment.newInstance( ItemDescriptionFragment fragment = ItemDescriptionFragment
item); .newInstance(item);
fragmentTransaction.replace(R.id.description_fragment, fragment); fragmentTransaction.replace(R.id.description_fragment, fragment);
fragmentTransaction.commit(); fragmentTransaction.commit();
} }
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
return FeedItemMenuHandler.onCreateMenu(new MenuInflater(this), menu); MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.feeditem, menu);
return true;
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem menuItem) { public boolean onOptionsItemSelected(MenuItem menuItem) {
try { try {
if (!FeedItemMenuHandler.onMenuItemClicked(this, menuItem, item)) { if (!FeedItemMenuHandler.onMenuItemClicked(this,
menuItem.getItemId(), item)) {
switch (menuItem.getItemId()) { switch (menuItem.getItemId()) {
case android.R.id.home: case android.R.id.home:
finish(); finish();
@ -118,15 +124,23 @@ public class ItemviewActivity extends SherlockFragmentActivity {
} }
} catch (DownloadRequestException e) { } catch (DownloadRequestException e) {
e.printStackTrace(); e.printStackTrace();
DownloadRequestErrorDialogCreator.newRequestErrorDialog(this, e.getMessage()); DownloadRequestErrorDialogCreator.newRequestErrorDialog(this,
e.getMessage());
} }
invalidateOptionsMenu(); invalidateOptionsMenu();
return true; return true;
} }
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(final Menu menu) {
return FeedItemMenuHandler.onPrepareMenu(menu, item); return FeedItemMenuHandler.onPrepareMenu(
new FeedItemMenuHandler.MenuInterface() {
@Override
public void setItemVisibility(int id, boolean visible) {
menu.findItem(id).setVisible(visible);
}
}, item);
} }
} }

View File

@ -291,7 +291,7 @@ public abstract class MediaplayerActivity extends SherlockFragmentActivity
} }
default: default:
try { try {
return FeedItemMenuHandler.onMenuItemClicked(this, item, return FeedItemMenuHandler.onMenuItemClicked(this, item.getItemId(),
controller.getMedia().getItem()); controller.getMedia().getItem());
} catch (DownloadRequestException e) { } catch (DownloadRequestException e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -3,13 +3,19 @@ package de.danoeh.antennapod.adapter;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.List; import java.util.List;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.View; import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Adapter; import android.widget.Adapter;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
@ -27,7 +33,7 @@ import de.danoeh.antennapod.util.EpisodeFilter;
import de.danoeh.antennapod.util.ThemeUtils; import de.danoeh.antennapod.util.ThemeUtils;
public class FeedItemlistAdapter extends ArrayAdapter<FeedItem> { public class FeedItemlistAdapter extends ArrayAdapter<FeedItem> {
private OnClickListener onButActionClicked; private FeedItemlistAdapter.Callback callback;
private boolean showFeedtitle; private boolean showFeedtitle;
private int selectedItemIndex; private int selectedItemIndex;
private List<FeedItem> objects; private List<FeedItem> objects;
@ -35,17 +41,17 @@ public class FeedItemlistAdapter extends ArrayAdapter<FeedItem> {
public static final int SELECTION_NONE = -1; public static final int SELECTION_NONE = -1;
public FeedItemlistAdapter(Context context, int textViewResourceId, public FeedItemlistAdapter(Context context, int textViewResourceId,
List<FeedItem> objects, OnClickListener onButActionClicked, List<FeedItem> objects, FeedItemlistAdapter.Callback callback,
boolean showFeedtitle) { boolean showFeedtitle) {
super(context, textViewResourceId, objects); super(context, textViewResourceId, objects);
this.objects = objects; this.objects = objects;
this.onButActionClicked = onButActionClicked; this.callback = callback;
this.showFeedtitle = showFeedtitle; this.showFeedtitle = showFeedtitle;
this.selectedItemIndex = SELECTION_NONE; this.selectedItemIndex = SELECTION_NONE;
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(final int position, View convertView, ViewGroup parent) {
Holder holder; Holder holder;
FeedItem item = getItem(position); FeedItem item = getItem(position);
@ -178,7 +184,14 @@ public class FeedItemlistAdapter extends ArrayAdapter<FeedItem> {
} }
holder.butAction.setFocusable(false); holder.butAction.setFocusable(false);
holder.butAction.setOnClickListener(onButActionClicked); holder.butAction.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
callback.onActionButtonPressed(position);
}
});
} else { } else {
convertView.setVisibility(View.GONE); convertView.setVisibility(View.GONE);
} }
@ -226,4 +239,9 @@ public class FeedItemlistAdapter extends ArrayAdapter<FeedItem> {
} }
} }
public interface Callback {
/** Is called when the action button of a list item has been pressed. */
abstract void onActionButtonPressed(int position);
}
} }

View File

@ -8,10 +8,16 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuInflater;
import android.view.View; import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView; import android.widget.ListView;
import com.actionbarsherlock.app.SherlockListFragment; import com.actionbarsherlock.app.SherlockListFragment;
@ -33,8 +39,7 @@ import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler; import de.danoeh.antennapod.util.menuhandler.FeedItemMenuHandler;
/** Displays a list of FeedItems. */ /** Displays a list of FeedItems. */
public class ItemlistFragment extends SherlockListFragment implements public class ItemlistFragment extends SherlockListFragment {
ActionMode.Callback {
private static final String TAG = "ItemlistFragment"; private static final String TAG = "ItemlistFragment";
public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem"; public static final String EXTRA_SELECTED_FEEDITEM = "extra.de.danoeh.antennapod.activity.selected_feeditem";
@ -51,8 +56,8 @@ public class ItemlistFragment extends SherlockListFragment implements
*/ */
protected Feed feed; protected Feed feed;
protected FeedItem selectedItem; protected static final int NO_SELECTION = -1;
protected ActionMode mActionMode; protected int selectedPosition = NO_SELECTION;
/** Argument for FeeditemlistAdapter */ /** Argument for FeeditemlistAdapter */
protected boolean showFeedtitle; protected boolean showFeedtitle;
@ -101,16 +106,13 @@ public class ItemlistFragment extends SherlockListFragment implements
} }
fila = new FeedItemlistAdapter(getActivity(), 0, items, fila = new FeedItemlistAdapter(getActivity(), 0, items,
onButActionClicked, showFeedtitle); adapterCallback, showFeedtitle);
setListAdapter(fila); setListAdapter(fila);
} }
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
if (mActionMode != null) {
mActionMode.finish();
}
} }
@Override @Override
@ -184,26 +186,14 @@ public class ItemlistFragment extends SherlockListFragment implements
} }
} }
private final OnClickListener onButActionClicked = new OnClickListener() { private FeedItemlistAdapter.Callback adapterCallback = new FeedItemlistAdapter.Callback() {
@Override @Override
public void onClick(View v) { public void onActionButtonPressed(int position) {
int index = getListView().getPositionForView(v); if (AppConfig.DEBUG)
if (index != ListView.INVALID_POSITION) { Log.d(TAG, "adapterCallback; position = " + position);
FeedItem newSelectedItem = fila.getItem(index); selectedPosition = position;
if (newSelectedItem != selectedItem) { getListView().showContextMenu();
if (mActionMode != null) {
mActionMode.finish();
}
selectedItem = newSelectedItem;
mActionMode = getSherlockActivity().startActionMode(
ItemlistFragment.this);
fila.setSelectedItemIndex(index);
} else {
mActionMode.finish();
}
}
} }
}; };
@ -211,41 +201,56 @@ public class ItemlistFragment extends SherlockListFragment implements
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
this.getListView().setItemsCanFocus(true); this.getListView().setItemsCanFocus(true);
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
registerForContextMenu(getListView());
getListView().setOnItemLongClickListener(null);
} }
@Override @Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { public void onCreateContextMenu(final ContextMenu menu, View v,
return FeedItemMenuHandler.onPrepareMenu(menu, selectedItem); ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
if (selectedPosition != NO_SELECTION) {
new MenuInflater(ItemlistFragment.this.getActivity()).inflate(
R.menu.feeditem, menu);
FeedItem selection = fila.getItem(selectedPosition);
if (selection != null) {
menu.setHeaderTitle(selection.getTitle());
FeedItemMenuHandler.onPrepareMenu(
new FeedItemMenuHandler.MenuInterface() {
@Override
public void setItemVisibility(int id,
boolean visible) {
menu.findItem(id).setVisible(visible);
}
}, selection);
}
}
} }
@Override @Override
public void onDestroyActionMode(ActionMode mode) { public boolean onContextItemSelected(android.view.MenuItem item) {
mActionMode = null;
selectedItem = null;
fila.setSelectedItemIndex(FeedItemlistAdapter.SELECTION_NONE);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return FeedItemMenuHandler.onCreateMenu(mode.getMenuInflater(), menu);
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
boolean handled = false; boolean handled = false;
try {
handled = FeedItemMenuHandler.onMenuItemClicked( if (selectedPosition != NO_SELECTION) {
getSherlockActivity(), item, selectedItem); FeedItem selectedItem = fila.getItem(selectedPosition);
} catch (DownloadRequestException e) {
e.printStackTrace(); if (selectedItem != null) {
DownloadRequestErrorDialogCreator.newRequestErrorDialog( try {
getActivity(), e.getMessage()); handled = FeedItemMenuHandler.onMenuItemClicked(
getSherlockActivity(), item.getItemId(),
selectedItem);
} catch (DownloadRequestException e) {
e.printStackTrace();
DownloadRequestErrorDialogCreator.newRequestErrorDialog(
getActivity(), e.getMessage());
}
if (handled) {
fila.notifyDataSetChanged();
}
}
} }
if (handled) { selectedPosition = NO_SELECTION;
fila.notifyDataSetChanged();
}
mode.finish();
return handled; return handled;
} }

View File

@ -17,42 +17,12 @@ public class QueueFragment extends ItemlistFragment {
super(FeedManager.getInstance().getQueue(), true); super(FeedManager.getInstance().getQueue(), true);
} }
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
super.onCreateActionMode(mode, menu);
menu.add(Menu.NONE, R.id.move_up_item, Menu.NONE,
R.string.move_up_label);
menu.add(Menu.NONE, R.id.move_down_item, Menu.NONE,
R.string.move_down_label);
return true;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setHasOptionsMenu(true); setHasOptionsMenu(true);
} }
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
boolean handled = false;
switch (item.getItemId()) {
case R.id.move_up_item:
manager.moveQueueItem(getActivity(), selectedItem, -1);
handled = true;
break;
case R.id.move_down_item:
manager.moveQueueItem(getActivity(), selectedItem, 1);
handled = true;
break;
default:
handled = super.onActionItemClicked(mode, item);
}
fila.notifyDataSetChanged();
mode.finish();
return handled;
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater); super.onCreateOptionsMenu(menu, inflater);

View File

@ -3,10 +3,9 @@ package de.danoeh.antennapod.util.menuhandler;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.view.Menu;
import com.actionbarsherlock.view.Menu; import android.view.MenuInflater;
import com.actionbarsherlock.view.MenuInflater; import android.view.MenuItem;
import com.actionbarsherlock.view.MenuItem;
import de.danoeh.antennapod.AppConfig; import de.danoeh.antennapod.AppConfig;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
@ -24,7 +23,20 @@ public class FeedItemMenuHandler {
} }
public static boolean onPrepareMenu(Menu menu, FeedItem selectedItem) { /**
* Used by the MenuHandler to access different types of menus through one
* interface (for example android.view.Menu and com.actionbarsherlock.Menu)
*/
public interface MenuInterface {
/**
* Implementations of this method should call findItem(id) on their
* menu-object and call setVisibility(visibility) on the returned
* MenuItem object.
*/
abstract void setItemVisibility(int id, boolean visible);
}
public static boolean onPrepareMenu(MenuInterface mi, FeedItem selectedItem) {
FeedManager manager = FeedManager.getInstance(); FeedManager manager = FeedManager.getInstance();
DownloadRequester requester = DownloadRequester.getInstance(); DownloadRequester requester = DownloadRequester.getInstance();
boolean hasMedia = selectedItem.getMedia() != null; boolean hasMedia = selectedItem.getMedia() != null;
@ -35,45 +47,44 @@ public class FeedItemMenuHandler {
&& (!downloading); && (!downloading);
FeedItem.State state = selectedItem.getState(); FeedItem.State state = selectedItem.getState();
menu.findItem(R.id.play_item).setVisible(downloaded); mi.setItemVisibility(R.id.play_item, downloaded);
menu.findItem(R.id.remove_item).setVisible(downloaded); mi.setItemVisibility(R.id.remove_item, downloaded);
menu.findItem(R.id.download_item).setVisible(notLoadedAndNotLoading); mi.setItemVisibility(R.id.download_item, notLoadedAndNotLoading);
menu.findItem(R.id.stream_item).setVisible( mi.setItemVisibility(R.id.stream_item, notLoadedAndNotLoading
notLoadedAndNotLoading | downloading); | downloading);
menu.findItem(R.id.cancel_download_item).setVisible(downloading); mi.setItemVisibility(R.id.cancel_download_item, downloading);
boolean isInQueue = manager.isInQueue(selectedItem); boolean isInQueue = manager.isInQueue(selectedItem);
menu.findItem(R.id.remove_from_queue_item).setVisible(isInQueue); mi.setItemVisibility(R.id.remove_from_queue_item, isInQueue);
menu.findItem(R.id.add_to_queue_item).setVisible( mi.setItemVisibility(R.id.add_to_queue_item,
!isInQueue && selectedItem.getMedia() != null); !isInQueue && selectedItem.getMedia() != null);
menu.findItem(R.id.share_link_item).setVisible( mi.setItemVisibility(R.id.share_link_item,
selectedItem.getLink() != null); selectedItem.getLink() != null);
menu.findItem(R.id.mark_unread_item).setVisible( mi.setItemVisibility(R.id.mark_unread_item,
state == FeedItem.State.IN_PROGRESS state == FeedItem.State.IN_PROGRESS
|| state == FeedItem.State.READ); || state == FeedItem.State.READ);
menu.findItem(R.id.mark_read_item).setVisible( mi.setItemVisibility(R.id.mark_read_item, state == FeedItem.State.NEW
state == FeedItem.State.NEW || state == FeedItem.State.IN_PROGRESS);
|| state == FeedItem.State.IN_PROGRESS);
if (selectedItem.getLink() != null) { if (selectedItem.getLink() != null) {
menu.findItem(R.id.visit_website_item).setVisible(true); mi.setItemVisibility(R.id.visit_website_item, true);
} }
if (selectedItem.getPaymentLink() != null) { if (selectedItem.getPaymentLink() != null) {
menu.findItem(R.id.support_item).setVisible(true); mi.setItemVisibility(R.id.support_item, true);
} }
return true; return true;
} }
public static boolean onMenuItemClicked(Context context, MenuItem item, public static boolean onMenuItemClicked(Context context, int menuItemId,
FeedItem selectedItem) throws DownloadRequestException { FeedItem selectedItem) throws DownloadRequestException {
DownloadRequester requester = DownloadRequester.getInstance(); DownloadRequester requester = DownloadRequester.getInstance();
FeedManager manager = FeedManager.getInstance(); FeedManager manager = FeedManager.getInstance();
switch (item.getItemId()) { switch (menuItemId) {
case R.id.download_item: case R.id.download_item:
manager.downloadFeedItem(context, selectedItem); manager.downloadFeedItem(context, selectedItem);
break; break;
@ -122,9 +133,4 @@ public class FeedItemMenuHandler {
return true; return true;
} }
public static boolean onCreateMenu(MenuInflater inflater, Menu menu) {
inflater.inflate(R.menu.feeditem, menu);
return true;
}
} }