diff --git a/res/layout/message_list_item.xml b/res/layout/message_list_item.xml
index 3a7a44c77..f41a9b0fd 100644
--- a/res/layout/message_list_item.xml
+++ b/res/layout/message_list_item.xml
@@ -66,17 +66,5 @@
-
-
diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java
index 77916a6fc..e7aedd3a9 100644
--- a/src/com/fsck/k9/activity/MessageList.java
+++ b/src/com/fsck/k9/activity/MessageList.java
@@ -25,6 +25,8 @@ import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.util.Log;
import android.util.TypedValue;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -33,6 +35,7 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
@@ -680,16 +683,6 @@ public class MessageList extends K9ListActivity implements OnItemClickListener,
// Enable gesture detection for MessageLists
mGestureDetector = new GestureDetector(new SwipeGestureDetector(this, this));
- // Enable context action bar behaviour
- mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
- @Override
- public boolean onItemLongClick(AdapterView> parent, View view,
- int position, long id) {
- final MessageInfoHolder message = (MessageInfoHolder) parent.getItemAtPosition(position);
- toggleMessageSelect(message);
- return true;
- }});
-
// Correcting for screen rotation when in ActionMode
mSelectedCount = getSelectionFromCheckboxes().size();
if (mSelectedCount > 0) {
@@ -1477,6 +1470,124 @@ public class MessageList extends K9ListActivity implements OnItemClickListener,
}
}
}
+ @Override
+ public boolean onContextItemSelected(android.view.MenuItem item) {
+ AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
+ final MessageInfoHolder message = (MessageInfoHolder) mListView.getItemAtPosition(info.position);
+
+
+ final List selection = getSelectionFromMessage(message);
+ switch (item.getItemId()) {
+ case R.id.reply: {
+ onReply(message);
+ break;
+ }
+ case R.id.reply_all: {
+ onReplyAll(message);
+ break;
+ }
+ case R.id.forward: {
+ onForward(message);
+ break;
+ }
+ case R.id.send_again: {
+ onResendMessage(message);
+ mSelectedCount = 0;
+ break;
+ }
+ case R.id.same_sender: {
+ MessageList.actionHandle(MessageList.this, "From " + message.sender,
+ message.senderAddress, false, null, null);
+ break;
+ }
+ case R.id.delete: {
+ onDelete(selection);
+ break;
+ }
+ case R.id.mark_as_read: {
+ setFlag(selection, Flag.SEEN, true);
+ break;
+ }
+ case R.id.mark_as_unread: {
+ setFlag(selection, Flag.SEEN, false);
+ break;
+ }
+ case R.id.flag: {
+ setFlag(selection, Flag.FLAGGED, true);
+ break;
+ }
+ case R.id.unflag: {
+ setFlag(selection, Flag.FLAGGED, false);
+ break;
+ }
+
+ // only if the account supports this
+ case R.id.archive: {
+ onArchive(selection);
+ break;
+ }
+ case R.id.spam: {
+ onSpam(selection);
+ break;
+ }
+ case R.id.move: {
+ onMove(selection);
+ break;
+ }
+ case R.id.copy: {
+ onCopy(selection);
+ break;
+ }
+ }
+
+ return true;
+ }
+
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+
+ AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
+ MessageInfoHolder message = (MessageInfoHolder) mListView.getItemAtPosition(info.position);
+
+ if (message == null) {
+ return;
+ }
+
+ getMenuInflater().inflate(R.menu.message_list_item_context, menu);
+
+ menu.setHeaderTitle(message.message.getSubject());
+
+ if (message.read) {
+ menu.findItem(R.id.mark_as_read).setTitle(R.string.mark_as_unread_action);
+ }
+
+ if (message.flagged) {
+ menu.findItem(R.id.flag).setTitle(R.string.unflag_action);
+ }
+
+ Account account = message.message.getFolder().getAccount();
+ if (!mController.isCopyCapable(account)) {
+ menu.findItem(R.id.copy).setVisible(false);
+ }
+
+ if (!mController.isMoveCapable(account)) {
+ menu.findItem(R.id.move).setVisible(false);
+ menu.findItem(R.id.archive).setVisible(false);
+ menu.findItem(R.id.spam).setVisible(false);
+ }
+
+ if (!account.hasArchiveFolder()) {
+ menu.findItem(R.id.archive).setVisible(false);
+ }
+
+ if (!account.hasSpamFolder()) {
+ menu.findItem(R.id.spam).setVisible(false);
+ }
+
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
@@ -1967,103 +2078,6 @@ public class MessageList extends K9ListActivity implements OnItemClickListener,
}
}
- private final OnClickListener itemMenuClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // Deselect all messages
- setSelectionState(false);
-
- final MessageInfoHolder message = (MessageInfoHolder) getItem((Integer)v.getTag());
- final MenuBuilder menu = new MenuBuilder(MessageList.this);
- getSupportMenuInflater().inflate(R.menu.message_list_item_context, menu);
-
- if (message.read) {
- menu.findItem(R.id.mark_as_read).setVisible(false);
- } else {
- menu.findItem(R.id.mark_as_unread).setVisible(false);
- }
-
- if (message.flagged) {
- menu.findItem(R.id.flag).setVisible(false);
- } else {
- menu.findItem(R.id.unflag).setVisible(false);
- }
-
- MenuPopup popup = new MenuPopup(MessageList.this, menu, v);
- popup.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- final List selection = getSelectionFromMessage(message);
- switch (item.getItemId()) {
- case R.id.reply: {
- onReply(message);
- break;
- }
- case R.id.reply_all: {
- onReplyAll(message);
- break;
- }
- case R.id.forward: {
- onForward(message);
- break;
- }
- case R.id.send_again: {
- onResendMessage(message);
- mSelectedCount = 0;
- break;
- }
- case R.id.same_sender: {
- MessageList.actionHandle(MessageList.this, "From " + message.sender,
- message.senderAddress, false, null, null);
- break;
- }
- case R.id.delete: {
- onDelete(selection);
- break;
- }
- case R.id.mark_as_read: {
- setFlag(selection, Flag.SEEN, true);
- break;
- }
- case R.id.mark_as_unread: {
- setFlag(selection, Flag.SEEN, false);
- break;
- }
- case R.id.flag: {
- setFlag(selection, Flag.FLAGGED, true);
- break;
- }
- case R.id.unflag: {
- setFlag(selection, Flag.FLAGGED, false);
- break;
- }
-
- // only if the account supports this
- case R.id.archive: {
- onArchive(selection);
- break;
- }
- case R.id.spam: {
- onSpam(selection);
- break;
- }
- case R.id.move: {
- onMove(selection);
- break;
- }
- case R.id.copy: {
- onCopy(selection);
- break;
- }
- }
-
- return true;
- }
- });
- popup.show();
- }
- };
-
@Override
public int getCount() {
@@ -2116,15 +2130,12 @@ public class MessageList extends K9ListActivity implements OnItemClickListener,
holder.date = (TextView) view.findViewById(R.id.date);
holder.chip = view.findViewById(R.id.chip);
holder.preview = (TextView) view.findViewById(R.id.preview);
- holder.itemMenu = (ImageButton) view.findViewById(R.id.item_menu);
- holder.itemMenu.setOnClickListener(itemMenuClickListener);
holder.subject.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListSubject());
holder.date.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListDate());
holder.preview.setLines(mPreviewLines);
holder.preview.setTextSize(TypedValue.COMPLEX_UNIT_SP, mFontSizes.getMessageListPreview());
- holder.itemMenu.setFocusable(false);
view.setTag(holder);
}
@@ -2185,8 +2196,6 @@ public class MessageList extends K9ListActivity implements OnItemClickListener,
final MessageInfoHolder message) {
holder.subject.setTypeface(null, message.read ? Typeface.NORMAL : Typeface.BOLD);
- // XXX TODO there has to be some way to walk our view hierarchy and get this
- holder.itemMenu.setTag(position);
// So that the mSelectedCount is only incremented/decremented
// when a user checks the checkbox (vs code)
@@ -2298,7 +2307,6 @@ public class MessageList extends K9ListActivity implements OnItemClickListener,
public TextView time;
public TextView date;
public View chip;
- public ImageButton itemMenu;
public int position = -1;
@Override