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;
}
- };
+ }
}