diff --git a/src/com/android/email/Controller.java b/src/com/android/email/Controller.java index d4fc04d15..a81a5b84e 100644 --- a/src/com/android/email/Controller.java +++ b/src/com/android/email/Controller.java @@ -24,7 +24,6 @@ import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; -import android.os.AsyncTask; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteCallbackList; @@ -857,10 +856,25 @@ public class Controller { * * @param messageId the message to update * @param isRead the new value for the isRead flag - * @return the AsyncTask that will execute the changes (for testing only) */ - public AsyncTask setMessageRead(final long messageId, final boolean isRead) { - return setMessageBoolean(messageId, EmailContent.MessageColumns.FLAG_READ, isRead); + public void setMessageReadSync(long messageId, boolean isRead) { + setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_READ, isRead); + } + + /** + * Set/clear the unread status of a message from UI thread + * + * @param messageId the message to update + * @param isRead the new value for the isRead flag + * @return the EmailAsyncTask created + */ + public EmailAsyncTask setMessageRead(final long messageId, + final boolean isRead) { + return EmailAsyncTask.runAsyncParallel(new Runnable() { + @Override + public void run() { + setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_READ, isRead); + }}); } /** @@ -903,16 +917,30 @@ public class Controller { }); } + /** + * Set/clear the favorite status of a message from UI thread + * + * @param messageId the message to update + * @param isFavorite the new value for the isFavorite flag + * @return the EmailAsyncTask created + */ + public EmailAsyncTask setMessageFavorite(final long messageId, + final boolean isFavorite) { + return EmailAsyncTask.runAsyncParallel(new Runnable() { + @Override + public void run() { + setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_FAVORITE, + isFavorite); + }}); + } /** * Set/clear the favorite status of a message * * @param messageId the message to update * @param isFavorite the new value for the isFavorite flag - * @return the AsyncTask that will execute the changes (for testing only) */ - public AsyncTask setMessageFavorite(final long messageId, - final boolean isFavorite) { - return setMessageBoolean(messageId, EmailContent.MessageColumns.FLAG_FAVORITE, isFavorite); + public void setMessageFavoriteSync(long messageId, boolean isFavorite) { + setMessageBooleanSync(messageId, EmailContent.MessageColumns.FLAG_FAVORITE, isFavorite); } /** @@ -921,19 +949,14 @@ public class Controller { * @param messageId the message to update * @param columnName the column to update * @param columnValue the new value for the column - * @return the AsyncTask that will execute the changes (for testing only) */ - private AsyncTask setMessageBoolean(final long messageId, - final String columnName, final boolean columnValue) { - return Utility.runAsync(new Runnable() { - public void run() { - ContentValues cv = new ContentValues(); - cv.put(columnName, columnValue); - updateMessageSync(messageId, cv); - } - }); + private void setMessageBooleanSync(long messageId, String columnName, boolean columnValue) { + ContentValues cv = new ContentValues(); + cv.put(columnName, columnValue); + updateMessageSync(messageId, cv); } + private static final HashMap sSearchParamsMap = new HashMap(); diff --git a/src/com/android/email/activity/MessageListFragment.java b/src/com/android/email/activity/MessageListFragment.java index 87224cc5c..a426af7b4 100644 --- a/src/com/android/email/activity/MessageListFragment.java +++ b/src/com/android/email/activity/MessageListFragment.java @@ -857,17 +857,9 @@ public class MessageListFragment extends ListFragment } } - private void onSetMessageRead(long messageId, boolean newRead) { - mController.setMessageRead(messageId, newRead); - } - - private void onSetMessageFavorite(long messageId, boolean newFavorite) { - mController.setMessageFavorite(messageId, newFavorite); - } - /** * Toggles a set read/unread states. Note, the default behavior is "mark unread", so the - * sense of the helper methods is "true=unread". + * sense of the helper methods is "true=unread"; this may be called from the UI thread * * @param selectedSet The current list of selected items */ @@ -880,19 +872,17 @@ public class MessageListFragment extends ListFragment } @Override - public boolean setField(long messageId, Cursor c, boolean newValue) { + public void setField(long messageId, Cursor c, boolean newValue) { boolean oldValue = getField(messageId, c); if (oldValue != newValue) { - onSetMessageRead(messageId, !newValue); - return true; - } - return false; + mController.setMessageReadSync(messageId, !newValue); + } } }); } /** - * Toggles a set of favorites (stars) + * Toggles a set of favorites (stars); this may be called from the UI thread * * @param selectedSet The current list of selected items */ @@ -905,14 +895,12 @@ public class MessageListFragment extends ListFragment } @Override - public boolean setField(long messageId, Cursor c, boolean newValue) { + public void setField(long messageId, Cursor c, boolean newValue) { boolean oldValue = getField(messageId, c); if (oldValue != newValue) { - onSetMessageFavorite(messageId, newValue); - return true; + mController.setMessageFavoriteSync(messageId, newValue); } - return false; - } + } }); } @@ -936,25 +924,25 @@ public class MessageListFragment extends ListFragment public boolean getField(long messageId, Cursor c); /** - * Set or clear the field of interest. Return true if a change was made. + * Set or clear the field of interest; setField is called asynchronously via EmailAsyncTask * @param messageId the message id of the current message * @param c the cursor, positioned to the item of interest * @param newValue the new value to be set at this row * @return true if a change was actually made */ - public boolean setField(long messageId, Cursor c, boolean newValue); + public void setField(long messageId, Cursor c, boolean newValue); } /** * Toggle multiple fields in a message, using the following logic: If one or more fields - * are "clear", then "set" them. If all fields are "set", then "clear" them all. + * are "clear", then "set" them. If all fields are "set", then "clear" them all. Provider + * calls are applied asynchronously in setField * * @param selectedSet the set of messages that are selected * @param helper functions to implement the specific getter & setter - * @return the number of messages that were updated */ - private int toggleMultiple(Set selectedSet, MultiToggleHelper helper) { - Cursor c = mListAdapter.getCursor(); + private void toggleMultiple(final Set selectedSet, final MultiToggleHelper helper) { + final Cursor c = mListAdapter.getCursor(); boolean anyWereFound = false; boolean allWereSet = true; @@ -970,22 +958,20 @@ public class MessageListFragment extends ListFragment } } - int numChanged = 0; - if (anyWereFound) { - boolean newValue = !allWereSet; + final boolean newValue = !allWereSet; c.moveToPosition(-1); - while (c.moveToNext()) { - long id = c.getInt(MessagesAdapter.COLUMN_ID); - if (selectedSet.contains(Long.valueOf(id))) { - if (helper.setField(id, c, newValue)) { - ++numChanged; + EmailAsyncTask.runAsyncParallel(new Runnable() { + @Override + public void run() { + while (c.moveToNext()) { + long id = c.getInt(MessagesAdapter.COLUMN_ID); + if (selectedSet.contains(Long.valueOf(id))) { + helper.setField(id, c, newValue); + } } - } - } + }}); } - - return numChanged; } /** @@ -1048,13 +1034,13 @@ public class MessageListFragment extends ListFragment /** Implements {@link MessagesAdapter.Callback} */ @Override public void onAdapterFavoriteChanged(MessageListItem itemView, boolean newFavorite) { - onSetMessageFavorite(itemView.mMessageId, newFavorite); + mController.setMessageFavorite(itemView.mMessageId, newFavorite); } /** Implements {@link MessagesAdapter.Callback} */ @Override - public void onAdapterSelectedChanged( - MessageListItem itemView, boolean newSelected, int mSelectedCount) { + public void onAdapterSelectedChanged(MessageListItem itemView, boolean newSelected, + int mSelectedCount) { updateSelectionMode(); } diff --git a/tests/src/com/android/email/ControllerProviderOpsTests.java b/tests/src/com/android/email/ControllerProviderOpsTests.java index 229e34137..d7e5e7dae 100644 --- a/tests/src/com/android/email/ControllerProviderOpsTests.java +++ b/tests/src/com/android/email/ControllerProviderOpsTests.java @@ -16,6 +16,10 @@ package com.android.email; +import android.content.Context; +import android.net.Uri; +import android.test.ProviderTestCase2; + import com.android.email.provider.ContentCache; import com.android.email.provider.EmailProvider; import com.android.email.provider.ProviderTestUtils; @@ -26,10 +30,6 @@ import com.android.emailcommon.provider.EmailContent.Message; import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Mailbox; -import android.content.Context; -import android.net.Uri; -import android.test.ProviderTestCase2; - import java.util.Locale; import java.util.concurrent.ExecutionException;