Update the duplicate message deletion trigger

b/11535121
Now we only delete messages with the same serverId and account
if the account is an exchange account.

Change-Id: Ic2ebb465ccdb38724b88daac8ac40771c7a24bed
diff --git a/src/com/android/email/provider/DBHelper.java b/src/com/android/email/provider/DBHelper.java
index d541f2a..3a29c4a 100644
--- a/src/com/android/email/provider/DBHelper.java
+++ b/src/com/android/email/provider/DBHelper.java
@@ -68,6 +68,7 @@
     private static final String LEGACY_SCHEME_POP3 = "pop3";
     private static final String LEGACY_SCHEME_EAS = "eas";
 
+
     private static final String WHERE_ID = EmailContent.RECORD_ID + "=?";
 
     private static final String TRIGGER_MAILBOX_DELETE =
@@ -160,7 +161,9 @@
     //              "search_results" folder to reflect the mailbox that the server considers
     //              the message to be in. Also, wipe out any stale search_result folders.
     // Version 122: Need to update Message_Updates and Message_Deletes to match previous.
-    public static final int DATABASE_VERSION = 122;
+    // Version 123: Changed the duplicateMesage deletion trigger to ignore accounts that aren't
+    //              exchange accounts.
+    public static final int DATABASE_VERSION = 123;
 
     // Any changes to the database format *must* include update-in-place code.
     // Original version: 2
@@ -219,21 +222,37 @@
 
     /**
      * Add a trigger to delete duplicate server side messages before insertion.
+     * This should delete any messages older messages that have the same serverId and account as
+     * the new message, if:
+     *    Neither message is in a SEARCH type mailbox, and
+     *    The new message's mailbox's account is an exchange account.
+     *
      * Here is the plain text of this sql:
      *   create trigger message_delete_duplicates_on_insert before insert on
-     *   Message for each row when new.serverId is not null and
-     *   (select Mailbox.type from Mailbox where _id=new.mailboxKey) != 8
-     *   begin delete from Message where new.serverId=severId and
+     *   Message for each row when new.syncServerId is not null and
+     *    (select type from Mailbox where _id=new.mailboxKey) != 8 and
+     *    (select HostAuth.protocol from HostAuth, Account where
+     *       new.accountKey=account._id and account.hostAuthKeyRecv=hostAuth._id) = 'gEas'
+     *   begin delete from Message where new.syncServerId=syncSeverId and
      *   new.accountKey=accountKey and
-     *   (select Mailbox.type from Mailbox where _id=mailboxKey) != 8; end
+     *    (select Mailbox.type from Mailbox where _id=mailboxKey) != 8; end
      */
-    static void createDeleteDuplicateMessagesTrigger(final SQLiteDatabase db) {
+    static void createDeleteDuplicateMessagesTrigger(final Context context,
+            final SQLiteDatabase db) {
         db.execSQL("create trigger message_delete_duplicates_on_insert before insert on "
                 + Message.TABLE_NAME + " for each row when new." + SyncColumns.SERVER_ID
                 + " is not null and "
-                + "(select " + Mailbox.TABLE_NAME + "." + MailboxColumns.TYPE + " from "
-                + Mailbox.TABLE_NAME + " where " + MailboxColumns.ID + "=new."
+                + "(select " + MailboxColumns.TYPE + " from " + Mailbox.TABLE_NAME
+                + " where " + MailboxColumns.ID + "=new."
                 + MessageColumns.MAILBOX_KEY + ")!=" + Mailbox.TYPE_SEARCH
+                + " and (select "
+                + HostAuth.TABLE_NAME + "." + HostAuthColumns.PROTOCOL + " from "
+                + HostAuth.TABLE_NAME + "," + Account.TABLE_NAME
+                + " where new." + MessageColumns.ACCOUNT_KEY
+                + "=" + Account.TABLE_NAME + "." + AccountColumns.ID
+                + " and " + Account.TABLE_NAME + "." + AccountColumns.HOST_AUTH_KEY_RECV
+                + "=" + HostAuth.TABLE_NAME + "." + HostAuthColumns.ID
+                + ")='" + context.getString(R.string.protocol_eas) + "'"
                 + " begin delete from " + Message.TABLE_NAME + " where new."
                 + SyncColumns.SERVER_ID + "=" + SyncColumns.SERVER_ID + " and new."
                 + MessageColumns.ACCOUNT_KEY + "=" + MessageColumns.ACCOUNT_KEY
@@ -242,7 +261,7 @@
                 + MessageColumns.MAILBOX_KEY + ")!=" + Mailbox.TYPE_SEARCH +"; end");
     }
 
-    static void createMessageTable(SQLiteDatabase db) {
+    static void createMessageTable(Context context, SQLiteDatabase db) {
         String messageColumns = MessageColumns.DISPLAY_NAME + " text, "
             + MessageColumns.TIMESTAMP + " integer, "
             + MessageColumns.SUBJECT + " text, "
@@ -354,17 +373,18 @@
 
         // Add triggers to maintain message_count.
         createMessageCountTriggers(db);
-        createDeleteDuplicateMessagesTrigger(db);
+        createDeleteDuplicateMessagesTrigger(context, db);
     }
 
-    static void resetMessageTable(SQLiteDatabase db, int oldVersion, int newVersion) {
+    static void resetMessageTable(Context context, SQLiteDatabase db,
+            int oldVersion, int newVersion) {
         try {
             db.execSQL("drop table " + Message.TABLE_NAME);
             db.execSQL("drop table " + Message.UPDATED_TABLE_NAME);
             db.execSQL("drop table " + Message.DELETED_TABLE_NAME);
         } catch (SQLException e) {
         }
-        createMessageTable(db);
+        createMessageTable(context, db);
     }
 
     /**
@@ -704,7 +724,7 @@
         public void onCreate(SQLiteDatabase db) {
             LogUtils.d(TAG, "Creating EmailProvider database");
             // Create all tables here; each class has its own method
-            createMessageTable(db);
+            createMessageTable(mContext, db);
             createAttachmentTable(db);
             createMailboxTable(db);
             createHostAuthTable(db);
@@ -731,11 +751,11 @@
             // Versions >= 5 require that data be preserved!
             if (oldVersion < 5) {
                 android.accounts.Account[] accounts = AccountManager.get(mContext)
-                        .getAccountsByType("eas");
+                        .getAccountsByType(LEGACY_SCHEME_EAS);
                 for (android.accounts.Account account: accounts) {
                     AccountManager.get(mContext).removeAccount(account, null, null);
                 }
-                resetMessageTable(db, oldVersion, newVersion);
+                resetMessageTable(mContext, db, oldVersion, newVersion);
                 resetAttachmentTable(db, oldVersion, newVersion);
                 resetMailboxTable(db, oldVersion, newVersion);
                 resetHostAuthTable(db, oldVersion, newVersion);
@@ -1259,23 +1279,12 @@
                         + MailboxColumns.TYPE + "=" + Mailbox.TYPE_DRAFTS + ")");
             }
 
-            if (oldVersion <= 119) {
-                if (oldVersion >= 117) {
-                    /**
-                     * This trigger was originally created at version 117, but we needed to change
-                     * it for version 120. So if our oldVersion is 117 or more, we know we have that
-                     * trigger and must drop it before re creating it.
-                     */
-                    dropDeleteDuplicateMessagesTrigger(db);
-                }
-                createDeleteDuplicateMessagesTrigger(db);
-            }
-
+            // We originally dropped and recreated the deleteDuplicateMessagesTrigger here at
+            // version 120. We needed to update it again at version 123, so there's no reason
+            // to do it twice.
 
             // Add the mainMailboxKey column, and get rid of any messages in the search_results
             // folder.
-            //
-
             if (oldVersion <= 120) {
                 db.execSQL("alter table " + Message.TABLE_NAME
                         + " add " + MessageColumns.MAIN_MAILBOX_KEY + " integer");
@@ -1296,6 +1305,18 @@
                 db.execSQL("alter table " + Message.DELETED_TABLE_NAME
                         + " add " + MessageColumns.MAIN_MAILBOX_KEY + " integer");
             }
+
+            if (oldVersion <= 122) {
+                if (oldVersion >= 117) {
+                    /**
+                     * This trigger was originally created at version 117, but we needed to change
+                     * it for version 122. So if our oldVersion is 117 or more, we know we have that
+                     * trigger and must drop it before re creating it.
+                     */
+                    dropDeleteDuplicateMessagesTrigger(db);
+                }
+                createDeleteDuplicateMessagesTrigger(mContext, db);
+            }
         }
 
         @Override