Fix delay sending stuck mail after tapping "Send outgoing mail"

* Fixes #2317429
* When "Send outgoing messages" is tapped in Outbox MessageList view,
  we clear the error state for all "stuck" messages
* We didn't, however, clear the error state of the Mailbox, which doesn't
  clear itself until the end of a pingLoop, which can be up to 30 minutes
* The fix is in two parts:
  * We clear the error state of the Outbox when a sync is requested by
    the UI
  * We don't set the error state of the mailbox for non-auth errors when
    sending, because we don't want to block OTHER messages from getting sent.

Change-Id: I768138b6f31eb696811aa94f621b6fa758ec1a5e
diff --git a/src/com/android/exchange/EasOutboxService.java b/src/com/android/exchange/EasOutboxService.java
index 4e1e61c..38c9603 100644
--- a/src/com/android/exchange/EasOutboxService.java
+++ b/src/com/android/exchange/EasOutboxService.java
@@ -46,7 +46,7 @@
 
     public static final int SEND_FAILED = 1;
     public static final String MAILBOX_KEY_AND_NOT_SEND_FAILED =
-        MessageColumns.MAILBOX_KEY + "=? and (" + SyncColumns.SERVER_ID + " is null or " + 
+        MessageColumns.MAILBOX_KEY + "=? and (" + SyncColumns.SERVER_ID + " is null or " +
             SyncColumns.SERVER_ID + "!=" + SEND_FAILED + ')';
     public static final String[] BODY_SOURCE_PROJECTION =
         new String[] {BodyColumns.SOURCE_MESSAGE_KEY};
@@ -150,9 +150,13 @@
                 ContentValues cv = new ContentValues();
                 cv.put(SyncColumns.SERVER_ID, SEND_FAILED);
                 Message.update(mContext, Message.CONTENT_URI, msgId, cv);
-                result = EmailServiceStatus.REMOTE_EXCEPTION;
+                // We mark the result as SUCCESS on a non-auth failure since the message itself is
+                // already marked failed and we don't want to stop other messages from trying to
+                // send.
                 if (isAuthError(code)) {
                     result = EmailServiceStatus.LOGIN_FAILED;
+                } else {
+                    result = EmailServiceStatus.SUCCESS;
                 }
                 sendCallback(msgId, null, result);
 
diff --git a/src/com/android/exchange/SyncManager.java b/src/com/android/exchange/SyncManager.java
index 015e72c..42dcc9a 100644
--- a/src/com/android/exchange/SyncManager.java
+++ b/src/com/android/exchange/SyncManager.java
@@ -290,7 +290,8 @@
                 cv.put(SyncColumns.SERVER_ID, 0);
                 INSTANCE.getContentResolver().update(Message.CONTENT_URI,
                     cv, WHERE_MAILBOX_KEY, new String[] {Long.toString(mailboxId)});
-
+                // Clear the error state; the Outbox sync will be started from checkMailboxes
+                INSTANCE.mSyncErrorMap.remove(mailboxId);
                 kick("start outbox");
                 // Outbox can't be synced in EAS
                 return;