diff --git a/src/com/android/email/Preferences.java b/src/com/android/email/Preferences.java index 675430167..71b18e834 100644 --- a/src/com/android/email/Preferences.java +++ b/src/com/android/email/Preferences.java @@ -49,7 +49,7 @@ public class Preferences { public static final int AUTO_ADVANCE_OLDER = 1; public static final int AUTO_ADVANCE_MESSAGE_LIST = 2; // "move to older" was the behavior on older versions. - public static final int AUTO_ADVANCE_DEFAULT = AUTO_ADVANCE_OLDER; + private static final int AUTO_ADVANCE_DEFAULT = AUTO_ADVANCE_OLDER; // The following constants are used as offsets into TEXT_ZOOM_ARRAY (below) public static final int TEXT_ZOOM_TINY = 0; diff --git a/src/com/android/email/activity/MessageList.java b/src/com/android/email/activity/MessageList.java index 276015f35..de5d3ede3 100644 --- a/src/com/android/email/activity/MessageList.java +++ b/src/com/android/email/activity/MessageList.java @@ -16,7 +16,6 @@ package com.android.email.activity; -import com.android.email.Controller; import com.android.email.Email; import com.android.email.R; import com.android.email.RefreshManager; @@ -37,6 +36,8 @@ import android.view.View; import android.view.animation.AnimationUtils; import android.widget.TextView; +import java.util.Set; + public class MessageList extends Activity implements MessageListFragment.Callback { // Intent extras (internal to this activity) private static final String EXTRA_ACCOUNT_ID = "com.android.email.activity._ACCOUNT_ID"; @@ -203,6 +204,11 @@ public class MessageList extends Activity implements MessageListFragment.Callbac public void onEnterSelectionMode(boolean enter) { } + + @Override + public void onAdvancingOpAccepted(Set affectedMessages) { + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.message_list_option, menu); diff --git a/src/com/android/email/activity/MessageListFragment.java b/src/com/android/email/activity/MessageListFragment.java index 144c880b9..4ec94ab62 100644 --- a/src/com/android/email/activity/MessageListFragment.java +++ b/src/com/android/email/activity/MessageListFragment.java @@ -197,6 +197,13 @@ public class MessageListFragment extends ListFragment * @param enter true if entering, false if leaving */ public void onEnterSelectionMode(boolean enter); + + /** + * Called when an operation is initiated that can potentially advance the current + * message selection (e.g. a delete operation may advance the selection). + * @param affectedMessages the messages the operation will apply to + */ + public void onAdvancingOpAccepted(Set affectedMessages); } private static final class EmptyCallback implements Callback { @@ -216,6 +223,10 @@ public class MessageListFragment extends ListFragment @Override public void onEnterSelectionMode(boolean enter) { } + + @Override + public void onAdvancingOpAccepted(Set affectedMessages) { + } } @Override @@ -460,9 +471,9 @@ public class MessageListFragment extends ListFragment } /** - * @return the number of messages that are currently selecteed. + * @return the number of messages that are currently selected. */ - public int getSelectedCount() { + private int getSelectedCount() { return mListAdapter.getSelectedSet().size(); } @@ -1314,17 +1325,25 @@ public class MessageListFragment extends ListFragment Set selectedConversations = mListAdapter.getSelectedSet(); switch (item.getItemId()) { case R.id.mark_read: + // Note - marking as read does not trigger auto-advance. + toggleRead(selectedConversations); + break; case R.id.mark_unread: + mCallback.onAdvancingOpAccepted(selectedConversations); toggleRead(selectedConversations); break; case R.id.add_star: case R.id.remove_star: + // TODO: removing a star can be a destructive command and cause auto-advance + // if the current mailbox shown is favorites. toggleFavorite(selectedConversations); break; case R.id.delete: + mCallback.onAdvancingOpAccepted(selectedConversations); deleteMessages(selectedConversations); break; case R.id.move: + mCallback.onAdvancingOpAccepted(selectedConversations); moveMessages(selectedConversations); break; } diff --git a/src/com/android/email/activity/MessageListXLFragmentManager.java b/src/com/android/email/activity/MessageListXLFragmentManager.java index 0a1b17c22..0ff7cb8c5 100644 --- a/src/com/android/email/activity/MessageListXLFragmentManager.java +++ b/src/com/android/email/activity/MessageListXLFragmentManager.java @@ -31,6 +31,7 @@ import android.util.Log; import android.view.View; import java.security.InvalidParameterException; +import java.util.Set; /** * A class manages what are showing on {@link MessageListXL} (i.e. account id, mailbox id, and @@ -217,10 +218,48 @@ class MessageListXLFragmentManager implements public void onEnterSelectionMode(boolean enter) { } + /** + * Apply the auto-advance policy upon initation of a batch command that could potentially + * affect the currently selected conversation. + */ + @Override + public void onAdvancingOpAccepted(Set affectedMessages) { + int autoAdvanceDir = Preferences.getPreferences(mActivity).getAutoAdvanceDirection(); + if ((autoAdvanceDir == Preferences.AUTO_ADVANCE_MESSAGE_LIST) || (mOrderManager == null)) { + if (affectedMessages.contains(getMessageId())) { + goBackToMailbox(); + } + return; + } + + // Navigate to the first unselected item in the appropriate direction. + switch (autoAdvanceDir) { + case Preferences.AUTO_ADVANCE_NEWER: + while (affectedMessages.contains(mOrderManager.getCurrentMessageId())) { + if (!mOrderManager.moveToNewer()) { + goBackToMailbox(); + return; + } + } + selectMessage(mOrderManager.getCurrentMessageId()); + break; + + case Preferences.AUTO_ADVANCE_OLDER: + while (affectedMessages.contains(mOrderManager.getCurrentMessageId())) { + if (!mOrderManager.moveToOlder()) { + goBackToMailbox(); + return; + } + } + selectMessage(mOrderManager.getCurrentMessageId()); + break; + } + } + @Override public void onListLoaded() { } - + // MessageViewFragment$Callback @Override public void onMessageViewShown(int mailboxType) { @@ -600,24 +639,24 @@ class MessageListXLFragmentManager implements private class CommandButtonCallback implements MessageCommandButtonView.Callback { @Override public void onMoveToNewer() { - MessageListXLFragmentManager.this.onMoveToNewer(); + moveToNewer(); } @Override public void onMoveToOlder() { - MessageListXLFragmentManager.this.onMoveToOlder(); + moveToOlder(); } } private void onCurrentMessageGone() { switch (Preferences.getPreferences(mActivity).getAutoAdvanceDirection()) { case Preferences.AUTO_ADVANCE_NEWER: - if (onMoveToNewer()) return; - if (onMoveToOlder()) return; + if (moveToNewer()) return; + if (moveToOlder()) return; break; case Preferences.AUTO_ADVANCE_OLDER: - if (onMoveToOlder()) return; - if (onMoveToNewer()) return; + if (moveToOlder()) return; + if (moveToNewer()) return; break; } // Last message in the box or AUTO_ADVANCE_MESSAGE_LIST. Go back to message list. @@ -680,18 +719,16 @@ class MessageListXLFragmentManager implements } } - private boolean onMoveToOlder() { - if (isMessageSelected() && (mOrderManager != null) - && mOrderManager.moveToOlder()) { + private boolean moveToOlder() { + if ((mOrderManager != null) && mOrderManager.moveToOlder()) { selectMessage(mOrderManager.getCurrentMessageId()); return true; } return false; } - private boolean onMoveToNewer() { - if (isMessageSelected() && (mOrderManager != null) - && mOrderManager.moveToNewer()) { + private boolean moveToNewer() { + if ((mOrderManager != null) && mOrderManager.moveToNewer()) { selectMessage(mOrderManager.getCurrentMessageId()); return true; }