diff --git a/res/drawable-hdpi/ic_action_flag_light.png b/res/drawable-hdpi/ic_action_flag_light.png new file mode 100644 index 000000000..eb0a3f7b8 Binary files /dev/null and b/res/drawable-hdpi/ic_action_flag_light.png differ diff --git a/res/drawable-hdpi/ic_action_mark_as_read_light.png b/res/drawable-hdpi/ic_action_mark_as_read_light.png new file mode 100644 index 000000000..003b9b0e4 Binary files /dev/null and b/res/drawable-hdpi/ic_action_mark_as_read_light.png differ diff --git a/res/drawable-hdpi/ic_action_read_dark.png b/res/drawable-hdpi/ic_action_mark_as_unread_dark.png similarity index 100% rename from res/drawable-hdpi/ic_action_read_dark.png rename to res/drawable-hdpi/ic_action_mark_as_unread_dark.png diff --git a/res/drawable-hdpi/ic_action_read_light.png b/res/drawable-hdpi/ic_action_mark_as_unread_light.png similarity index 100% rename from res/drawable-hdpi/ic_action_read_light.png rename to res/drawable-hdpi/ic_action_mark_as_unread_light.png diff --git a/res/drawable-hdpi/ic_action_unflag_light.png b/res/drawable-hdpi/ic_action_unflag_light.png new file mode 100644 index 000000000..23608f041 Binary files /dev/null and b/res/drawable-hdpi/ic_action_unflag_light.png differ diff --git a/res/drawable-ldpi/ic_action_flag_light.png b/res/drawable-ldpi/ic_action_flag_light.png new file mode 100644 index 000000000..8ab54155a Binary files /dev/null and b/res/drawable-ldpi/ic_action_flag_light.png differ diff --git a/res/drawable-ldpi/ic_action_mark_as_read_light.png b/res/drawable-ldpi/ic_action_mark_as_read_light.png new file mode 100644 index 000000000..ca5b9e53d Binary files /dev/null and b/res/drawable-ldpi/ic_action_mark_as_read_light.png differ diff --git a/res/drawable-ldpi/ic_action_read_dark.png b/res/drawable-ldpi/ic_action_mark_as_unread_dark.png similarity index 100% rename from res/drawable-ldpi/ic_action_read_dark.png rename to res/drawable-ldpi/ic_action_mark_as_unread_dark.png diff --git a/res/drawable-ldpi/ic_action_read_light.png b/res/drawable-ldpi/ic_action_mark_as_unread_light.png similarity index 100% rename from res/drawable-ldpi/ic_action_read_light.png rename to res/drawable-ldpi/ic_action_mark_as_unread_light.png diff --git a/res/drawable-ldpi/ic_action_unflag_light.png b/res/drawable-ldpi/ic_action_unflag_light.png new file mode 100644 index 000000000..74f573049 Binary files /dev/null and b/res/drawable-ldpi/ic_action_unflag_light.png differ diff --git a/res/drawable-mdpi/ic_action_flag_light.png b/res/drawable-mdpi/ic_action_flag_light.png new file mode 100644 index 000000000..2cbff776c Binary files /dev/null and b/res/drawable-mdpi/ic_action_flag_light.png differ diff --git a/res/drawable-mdpi/ic_action_mark_as_read_light.png b/res/drawable-mdpi/ic_action_mark_as_read_light.png new file mode 100644 index 000000000..07f011975 Binary files /dev/null and b/res/drawable-mdpi/ic_action_mark_as_read_light.png differ diff --git a/res/drawable-mdpi/ic_action_read_dark.png b/res/drawable-mdpi/ic_action_mark_as_unread_dark.png similarity index 100% rename from res/drawable-mdpi/ic_action_read_dark.png rename to res/drawable-mdpi/ic_action_mark_as_unread_dark.png diff --git a/res/drawable-mdpi/ic_action_read_light.png b/res/drawable-mdpi/ic_action_mark_as_unread_light.png similarity index 100% rename from res/drawable-mdpi/ic_action_read_light.png rename to res/drawable-mdpi/ic_action_mark_as_unread_light.png diff --git a/res/drawable-mdpi/ic_action_unflag_light.png b/res/drawable-mdpi/ic_action_unflag_light.png new file mode 100644 index 000000000..983d6016d Binary files /dev/null and b/res/drawable-mdpi/ic_action_unflag_light.png differ diff --git a/res/drawable-xhdpi/ic_action_flag_light.png b/res/drawable-xhdpi/ic_action_flag_light.png new file mode 100644 index 000000000..d0bdfd64d Binary files /dev/null and b/res/drawable-xhdpi/ic_action_flag_light.png differ diff --git a/res/drawable-xhdpi/ic_action_mark_as_read_light.png b/res/drawable-xhdpi/ic_action_mark_as_read_light.png new file mode 100644 index 000000000..4dec46208 Binary files /dev/null and b/res/drawable-xhdpi/ic_action_mark_as_read_light.png differ diff --git a/res/drawable-xhdpi/ic_action_read_dark.png b/res/drawable-xhdpi/ic_action_mark_as_unread_dark.png similarity index 100% rename from res/drawable-xhdpi/ic_action_read_dark.png rename to res/drawable-xhdpi/ic_action_mark_as_unread_dark.png diff --git a/res/drawable-xhdpi/ic_action_read_light.png b/res/drawable-xhdpi/ic_action_mark_as_unread_light.png similarity index 100% rename from res/drawable-xhdpi/ic_action_read_light.png rename to res/drawable-xhdpi/ic_action_mark_as_unread_light.png diff --git a/res/drawable-xhdpi/ic_action_unflag_light.png b/res/drawable-xhdpi/ic_action_unflag_light.png new file mode 100644 index 000000000..5b3f34471 Binary files /dev/null and b/res/drawable-xhdpi/ic_action_unflag_light.png differ diff --git a/res/menu/message_list_context.xml b/res/menu/message_list_context.xml index 9d1cb9a7a..44ff9c361 100644 --- a/res/menu/message_list_context.xml +++ b/res/menu/message_list_context.xml @@ -7,10 +7,16 @@ android:icon="?attr/iconActionDelete" /> + - - + - + - - + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 2c50a744a..662cc1d02 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -14,7 +14,6 @@ - @@ -22,8 +21,10 @@ - - + + + + diff --git a/res/values/themes.xml b/res/values/themes.xml index e052da581..20c0d60dd 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -15,7 +15,6 @@ @drawable/ic_action_move_or_copy_light @drawable/ic_action_next_message_light @drawable/ic_action_previous_message_light - @drawable/ic_action_read_light @drawable/ic_action_refresh_light @drawable/ic_action_search_light @drawable/ic_action_send_light @@ -23,8 +22,10 @@ @drawable/ic_action_single_message_options_light @drawable/ic_action_sort_light @drawable/ic_action_spam_light - @drawable/ic_action_toggle_flag_light - @drawable/ic_action_toggle_read_light + @drawable/ic_action_flag_light + @drawable/ic_action_unflag_light + @drawable/ic_action_mark_as_read_light + @drawable/ic_action_mark_as_unread_light @drawable/ic_menu_add @drawable/ic_menu_attachment @drawable/ic_menu_clear @@ -55,7 +56,6 @@ @drawable/ic_action_move_or_copy_dark @drawable/ic_action_next_message_dark @drawable/ic_action_previous_message_dark - @drawable/ic_action_read_dark @drawable/ic_action_refresh_dark @drawable/ic_action_search_dark @drawable/ic_action_send_dark @@ -63,8 +63,10 @@ @drawable/ic_action_single_message_options_dark @drawable/ic_action_sort_dark @drawable/ic_action_spam_dark - @drawable/ic_action_toggle_flag_dark - @drawable/ic_action_toggle_read_dark + @drawable/ic_action_flag_light + @drawable/ic_action_unflag_light + @drawable/ic_action_mark_as_read_light + @drawable/ic_action_mark_as_unread_light @drawable/ic_menu_add @drawable/ic_menu_attachment @drawable/ic_menu_clear @@ -81,4 +83,4 @@ @drawable/ic_show_folders - \ No newline at end of file + diff --git a/src/com/fsck/k9/activity/MessageList.java b/src/com/fsck/k9/activity/MessageList.java index 10dae5347..e078a23c4 100644 --- a/src/com/fsck/k9/activity/MessageList.java +++ b/src/com/fsck/k9/activity/MessageList.java @@ -26,10 +26,8 @@ import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.util.Log; import android.util.TypedValue; -import android.view.GestureDetector; import android.view.KeyEvent; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -1402,6 +1400,8 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { messageInfo.flagged = !messageInfo.flagged; mAdapter.sortMessages(); } + + computeBatchDirection(); } private void checkMail(Account account, String folderName) { @@ -2368,6 +2368,7 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { mSelectedCount += (isSelected ? 1 : 0); } + computeBatchDirection(); mAdapter.notifyDataSetChanged(); if (isSelected) { @@ -2395,6 +2396,7 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { mActionMode = MessageList.this.startActionMode(mActionModeCallback); updateActionModeTitle(); computeSelectAllVisibility(); + computeBatchDirection(); } else { mSelectedCount = 0; mActionMode.finish(); @@ -2408,8 +2410,8 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { return; } } else { - mActionMode = MessageList.this.startActionMode(mActionModeCallback); - } + mActionMode = startActionMode(mActionModeCallback); + } if (holder.selected) { holder.selected = false; @@ -2419,6 +2421,8 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { mSelectedCount += 1; } mAdapter.notifyDataSetChanged(); + + computeBatchDirection(); updateActionModeTitle(); // make sure the onPrepareActionMode is called @@ -2435,6 +2439,29 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { mActionModeCallback.showSelectAll(mSelectedCount != mAdapter.getCount()); } + private void computeBatchDirection() { + boolean isBatchFlag = false; + boolean isBatchRead = false; + + for (MessageInfoHolder holder : mAdapter.getMessages()) { + if (holder.selected) { + if (!holder.flagged) { + isBatchFlag = true; + } + if (!holder.read) { + isBatchRead = true; + } + + if (isBatchFlag && isBatchRead) { + break; + } + } + } + + mActionModeCallback.showMarkAsRead(isBatchRead); + mActionModeCallback.showFlag(isBatchFlag); + } + /** * @param holders * Messages to update. Never {@code null}. @@ -2744,10 +2771,18 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { class ActionModeCallback implements ActionMode.Callback { private MenuItem mSelectAll; + private MenuItem mMarkAsRead; + private MenuItem mMarkAsUnread; + private MenuItem mFlag; + private MenuItem mUnflag; @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { mSelectAll = menu.findItem(R.id.select_all); + mMarkAsRead = menu.findItem(R.id.mark_as_read); + mMarkAsUnread = menu.findItem(R.id.mark_as_unread); + mFlag = menu.findItem(R.id.flag); + mUnflag = menu.findItem(R.id.unflag); if (mQueryString != null) { // show all @@ -2777,6 +2812,10 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { public void onDestroyActionMode(ActionMode mode) { mActionMode = null; mSelectAll = null; + mMarkAsRead = null; + mMarkAsUnread = null; + mFlag = null; + mUnflag = null; setAllSelected(false); } @@ -2842,6 +2881,20 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { } } + public void showMarkAsRead(boolean show) { + if (mActionMode != null) { + mMarkAsRead.setVisible(show); + mMarkAsUnread.setVisible(!show); + } + } + + public void showFlag(boolean show) { + if (mActionMode != null) { + mFlag.setVisible(show); + mUnflag.setVisible(!show); + } + } + @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { final List selection = getSelectionFromCheckboxes(); @@ -2859,12 +2912,24 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { mSelectedCount = 0; break; } - case R.id.read_toggle: { - onToggleRead(selection); + case R.id.mark_as_read: { + setFlag(selection, Flag.SEEN, true); + computeBatchDirection(); break; } - case R.id.flag_toggle: { - onToggleFlag(selection); + case R.id.mark_as_unread: { + setFlag(selection, Flag.SEEN, false); + computeBatchDirection(); + break; + } + case R.id.flag: { + setFlag(selection, Flag.FLAGGED, true); + computeBatchDirection(); + break; + } + case R.id.unflag: { + setFlag(selection, Flag.FLAGGED, false); + computeBatchDirection(); break; } case R.id.select_all: { @@ -2900,6 +2965,6 @@ public class MessageList extends K9ListActivity implements OnItemClickListener { return true; } - }; + } }