Merge "Handle empty sync responses in EAS 12.1"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e982ec6..c19863d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -191,6 +191,12 @@
         <activity
             android:name=".activity.MessageView"
             android:theme="@android:style/Theme.NoTitleBar" >
+            <intent-filter android:label="@string/app_name">
+                <action android:name="android.intent.action.VIEW" />
+                <data android:mimeType="application/eml" />
+                <data android:mimeType="message/rfc822" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
         </activity>
         <activity
             android:name=".activity.MessageCompose"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e209501..c7167c3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -308,6 +308,8 @@
     <string name="message_saved_toast">Message saved as draft.</string>
     <!-- String that is displayed when the attachment could not be displayed. -->
     <string name="message_view_display_attachment_toast">This attachment cannot be displayed.</string>
+    <!-- String that is displayed when a long message is being parsed. -->
+    <string name="message_view_parse_message_toast">Opening message\u2026</string>
 
     <!-- Title of screen when setting up new email account -->
     <string name="account_setup_basics_title">Set up email</string>
diff --git a/src/com/android/exchange/SyncManager.java b/src/com/android/exchange/SyncManager.java
index 651cf63..8c15fbf 100644
--- a/src/com/android/exchange/SyncManager.java
+++ b/src/com/android/exchange/SyncManager.java
@@ -1737,7 +1737,6 @@
     public void onCreate() {
         synchronized (sSyncLock) {
             alwaysLog("!!! EAS SyncManager, onCreate");
-            // If we're in the process of shutting down, try again in 5 seconds
             if (sStop) {
                 return;
             }
@@ -2187,15 +2186,24 @@
         serviceRequest(mailboxId, 5*SECONDS, reason);
     }
 
+    /**
+     * Return a boolean indicating whether the mailbox can be synced
+     * @param m the mailbox
+     * @return whether or not the mailbox can be synced
+     */
+    static /*package*/ boolean isSyncable(Mailbox m) {
+        if (m == null || m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX ||
+                m.mType >= Mailbox.TYPE_NOT_SYNCABLE) {
+            return false;
+        }
+        return true;
+    }
+
     static public void serviceRequest(long mailboxId, long ms, int reason) {
         SyncManager syncManager = INSTANCE;
         if (syncManager == null) return;
         Mailbox m = Mailbox.restoreMailboxWithId(syncManager, mailboxId);
-        // Never allow manual start of Drafts or Outbox via serviceRequest
-        if (m == null || m.mType == Mailbox.TYPE_DRAFTS || m.mType == Mailbox.TYPE_OUTBOX) {
-            log("Ignoring serviceRequest for drafts/outbox/null mailbox");
-            return;
-        }
+        if (!isSyncable(m)) return;
         try {
             AbstractSyncService service = syncManager.mServiceMap.get(mailboxId);
             if (service != null) {
diff --git a/tests/src/com/android/exchange/SyncManagerAccountTests.java b/tests/src/com/android/exchange/SyncManagerAccountTests.java
index 3b67dc1..6a325b5 100644
--- a/tests/src/com/android/exchange/SyncManagerAccountTests.java
+++ b/tests/src/com/android/exchange/SyncManagerAccountTests.java
@@ -211,4 +211,24 @@
         assertEquals(0, errorMap.keySet().size());
     }
 
+    public void testIsSyncable() {
+        Context context = mMockContext;
+        Account acct1 = ProviderTestUtils.setupAccount("acct1", true, context);
+        Mailbox box1 = ProviderTestUtils.setupMailbox("box1", acct1.mId, true, context,
+                Mailbox.TYPE_DRAFTS);
+        Mailbox box2 = ProviderTestUtils.setupMailbox("box2", acct1.mId, true, context,
+                Mailbox.TYPE_OUTBOX);
+        Mailbox box3 = ProviderTestUtils.setupMailbox("box2", acct1.mId, true, context,
+                Mailbox.TYPE_ATTACHMENT);
+        Mailbox box4 = ProviderTestUtils.setupMailbox("box2", acct1.mId, true, context,
+                Mailbox.TYPE_NOT_SYNCABLE + 64);
+        Mailbox box5 = ProviderTestUtils.setupMailbox("box2", acct1.mId, true, context,
+                Mailbox.TYPE_MAIL);
+        assertFalse(SyncManager.isSyncable(null));
+        assertFalse(SyncManager.isSyncable(box1));
+        assertFalse(SyncManager.isSyncable(box2));
+        assertFalse(SyncManager.isSyncable(box3));
+        assertFalse(SyncManager.isSyncable(box4));
+        assertTrue(SyncManager.isSyncable(box5));
+    }
 }