Allow filedAs to be ghosted by specifying other fields to upsync

* This is a highly starred bug in the public tracker
* Users will have to recreate their accounts to take advantage of the fix

Bug: 6454784
Change-Id: I4cc7af648555dbe82c42ffe426155a918c88e4d9
diff --git a/exchange2/src/com/android/exchange/EasSyncService.java b/exchange2/src/com/android/exchange/EasSyncService.java
index f1e544d..863e322 100644
--- a/exchange2/src/com/android/exchange/EasSyncService.java
+++ b/exchange2/src/com/android/exchange/EasSyncService.java
@@ -1668,14 +1668,14 @@
 
             // Start with the default timeout
             int timeout = COMMAND_TIMEOUT;
-            if (!syncKey.equals("0")) {
-                // EAS doesn't allow GetChanges in an initial sync; sending other options
-                // appears to cause the server to delay its response in some cases, and this delay
-                // can be long enough to result in an IOException and total failure to sync.
-                // Therefore, we don't send any options with the initial sync.
-                // Set the truncation amount, body preference, lookback, etc.
-                target.sendSyncOptions(mProtocolVersionDouble, s);
-            } else {
+            boolean initialSync = syncKey.equals("0");
+            // EAS doesn't allow GetChanges in an initial sync; sending other options
+            // appears to cause the server to delay its response in some cases, and this delay
+            // can be long enough to result in an IOException and total failure to sync.
+            // Therefore, we don't send any options with the initial sync.
+            // Set the truncation amount, body preference, lookback, etc.
+            target.sendSyncOptions(mProtocolVersionDouble, s, initialSync);
+            if (initialSync) {
                 // Use enormous timeout for initial sync, which empirically can take a while longer
                 timeout = 120*SECONDS;
             }
diff --git a/exchange2/src/com/android/exchange/adapter/AbstractSyncAdapter.java b/exchange2/src/com/android/exchange/adapter/AbstractSyncAdapter.java
index 52400c4..04a67d0 100644
--- a/exchange2/src/com/android/exchange/adapter/AbstractSyncAdapter.java
+++ b/exchange2/src/com/android/exchange/adapter/AbstractSyncAdapter.java
@@ -71,7 +71,8 @@
     public abstract void cleanup();
     public abstract boolean isSyncable();
     // Add sync options (filter, body type - html vs plain, and truncation)
-    public abstract void sendSyncOptions(Double protocolVersion, Serializer s) throws IOException;
+    public abstract void sendSyncOptions(Double protocolVersion, Serializer s, boolean initialSync)
+            throws IOException;
     /**
      * Delete all records of this class in this account
      */
diff --git a/exchange2/src/com/android/exchange/adapter/AccountSyncAdapter.java b/exchange2/src/com/android/exchange/adapter/AccountSyncAdapter.java
index cf54ed5..e56a7d3 100644
--- a/exchange2/src/com/android/exchange/adapter/AccountSyncAdapter.java
+++ b/exchange2/src/com/android/exchange/adapter/AccountSyncAdapter.java
@@ -40,6 +40,7 @@
     }
 
     @Override
-    public void sendSyncOptions(Double protocolVersion, Serializer s) throws IOException {
+    public void sendSyncOptions(Double protocolVersion, Serializer s, boolean initialSync)
+            throws IOException {
     }
 }
diff --git a/exchange2/src/com/android/exchange/adapter/CalendarSyncAdapter.java b/exchange2/src/com/android/exchange/adapter/CalendarSyncAdapter.java
index 4df45a9..c21be00 100644
--- a/exchange2/src/com/android/exchange/adapter/CalendarSyncAdapter.java
+++ b/exchange2/src/com/android/exchange/adapter/CalendarSyncAdapter.java
@@ -223,8 +223,11 @@
     }
 
     @Override
-    public void sendSyncOptions(Double protocolVersion, Serializer s) throws IOException  {
-        setPimSyncOptions(protocolVersion, Eas.FILTER_2_WEEKS, s);
+    public void sendSyncOptions(Double protocolVersion, Serializer s, boolean initialSync)
+            throws IOException  {
+        if (!initialSync) {
+            setPimSyncOptions(protocolVersion, Eas.FILTER_2_WEEKS, s);
+        }
     }
 
     @Override
diff --git a/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java b/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java
index 1b21d11..7b7be15 100644
--- a/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java
+++ b/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java
@@ -144,8 +144,73 @@
     }
 
     @Override
-    public void sendSyncOptions(Double protocolVersion, Serializer s) throws IOException  {
-        setPimSyncOptions(protocolVersion, null, s);
+    public void sendSyncOptions(Double protocolVersion, Serializer s, boolean initialSync)
+            throws IOException  {
+        if (initialSync) {
+            // These are the tags we support for upload; whenever we add/remove support
+            // (in addData), we need to update this list
+            s.start(Tags.SYNC_SUPPORTED);
+            s.tag(Tags.CONTACTS_FIRST_NAME);
+            s.tag(Tags.CONTACTS_LAST_NAME);
+            s.tag(Tags.CONTACTS_MIDDLE_NAME);
+            s.tag(Tags.CONTACTS_SUFFIX);
+            s.tag(Tags.CONTACTS_COMPANY_NAME);
+            s.tag(Tags.CONTACTS_JOB_TITLE);
+            s.tag(Tags.CONTACTS_EMAIL1_ADDRESS);
+            s.tag(Tags.CONTACTS_EMAIL2_ADDRESS);
+            s.tag(Tags.CONTACTS_EMAIL3_ADDRESS);
+            s.tag(Tags.CONTACTS_BUSINESS2_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS_BUSINESS_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS2_MMS);
+            s.tag(Tags.CONTACTS_BUSINESS_FAX_NUMBER);
+            s.tag(Tags.CONTACTS2_COMPANY_MAIN_PHONE);
+            s.tag(Tags.CONTACTS_HOME_FAX_NUMBER);
+            s.tag(Tags.CONTACTS_HOME_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS_HOME2_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS_MOBILE_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS_CAR_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS_RADIO_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS_PAGER_NUMBER);
+            s.tag(Tags.CONTACTS_ASSISTANT_TELEPHONE_NUMBER);
+            s.tag(Tags.CONTACTS2_IM_ADDRESS);
+            s.tag(Tags.CONTACTS2_IM_ADDRESS_2);
+            s.tag(Tags.CONTACTS2_IM_ADDRESS_3);
+            s.tag(Tags.CONTACTS_BUSINESS_ADDRESS_CITY);
+            s.tag(Tags.CONTACTS_BUSINESS_ADDRESS_COUNTRY);
+            s.tag(Tags.CONTACTS_BUSINESS_ADDRESS_POSTAL_CODE);
+            s.tag(Tags.CONTACTS_BUSINESS_ADDRESS_STATE);
+            s.tag(Tags.CONTACTS_BUSINESS_ADDRESS_STREET);
+            s.tag(Tags.CONTACTS_HOME_ADDRESS_CITY);
+            s.tag(Tags.CONTACTS_HOME_ADDRESS_COUNTRY);
+            s.tag(Tags.CONTACTS_HOME_ADDRESS_POSTAL_CODE);
+            s.tag(Tags.CONTACTS_HOME_ADDRESS_STATE);
+            s.tag(Tags.CONTACTS_HOME_ADDRESS_STREET);
+            s.tag(Tags.CONTACTS_OTHER_ADDRESS_CITY);
+            s.tag(Tags.CONTACTS_OTHER_ADDRESS_COUNTRY);
+            s.tag(Tags.CONTACTS_OTHER_ADDRESS_POSTAL_CODE);
+            s.tag(Tags.CONTACTS_OTHER_ADDRESS_STATE);
+            s.tag(Tags.CONTACTS_OTHER_ADDRESS_STREET);
+            s.tag(Tags.CONTACTS_YOMI_COMPANY_NAME);
+            s.tag(Tags.CONTACTS_YOMI_FIRST_NAME);
+            s.tag(Tags.CONTACTS_YOMI_LAST_NAME);
+            s.tag(Tags.CONTACTS2_NICKNAME);
+            s.tag(Tags.CONTACTS_ASSISTANT_NAME);
+            s.tag(Tags.CONTACTS2_MANAGER_NAME);
+            s.tag(Tags.CONTACTS_SPOUSE);
+            s.tag(Tags.CONTACTS_DEPARTMENT);
+            s.tag(Tags.CONTACTS_TITLE);
+            s.tag(Tags.CONTACTS_OFFICE_LOCATION);
+            s.tag(Tags.CONTACTS2_CUSTOMER_ID);
+            s.tag(Tags.CONTACTS2_GOVERNMENT_ID);
+            s.tag(Tags.CONTACTS2_ACCOUNT_NAME);
+            s.tag(Tags.CONTACTS_ANNIVERSARY);
+            s.tag(Tags.CONTACTS_BIRTHDAY);
+            s.tag(Tags.CONTACTS_WEBPAGE);
+            s.tag(Tags.CONTACTS_PICTURE);
+            s.end(); // SYNC_SUPPORTED
+        } else {
+            setPimSyncOptions(protocolVersion, null, s);
+        }
     }
 
     @Override
@@ -352,7 +417,6 @@
 
         public void addData(String serverId, ContactOperations ops, Entity entity)
                 throws IOException {
-            String fileAs = null;
             String prefix = null;
             String firstName = null;
             String lastName = null;
@@ -390,9 +454,6 @@
                     case Tags.CONTACTS_MIDDLE_NAME:
                         middleName = getValue();
                         break;
-                    case Tags.CONTACTS_FILE_AS:
-                        fileAs = getValue();
-                        break;
                     case Tags.CONTACTS_SUFFIX:
                         suffix = getValue();
                         break;
@@ -568,11 +629,6 @@
                         categoriesParser(ops, entity);
                         break;
 
-                    case Tags.CONTACTS_COMPRESSED_RTF:
-                        // We don't use this, and it isn't necessary to upload, so we'll ignore it
-                        skipTag();
-                        break;
-
                     default:
                         skipTag();
                 }
@@ -593,7 +649,7 @@
             }
 
             ops.addName(entity, prefix, firstName, lastName, middleName, suffix, name,
-                    yomiFirstName, yomiLastName, fileAs);
+                    yomiFirstName, yomiLastName);
             ops.addBusiness(entity, business);
             ops.addPersonal(entity, personal);
 
@@ -1209,7 +1265,7 @@
 
         public void addName(Entity entity, String prefix, String givenName, String familyName,
                 String middleName, String suffix, String displayName, String yomiFirstName,
-                String yomiLastName, String fileAs) {
+                String yomiLastName) {
             RowBuilder builder = untypedRowBuilder(entity, StructuredName.CONTENT_ITEM_TYPE);
             ContentValues cv = builder.cv;
             if (cv != null && cvCompareString(cv, StructuredName.GIVEN_NAME, givenName) &&
@@ -1218,7 +1274,6 @@
                     cvCompareString(cv, StructuredName.PREFIX, prefix) &&
                     cvCompareString(cv, StructuredName.PHONETIC_GIVEN_NAME, yomiFirstName) &&
                     cvCompareString(cv, StructuredName.PHONETIC_FAMILY_NAME, yomiLastName) &&
-                    //cvCompareString(cv, StructuredName.DISPLAY_NAME, fileAs) &&
                     cvCompareString(cv, StructuredName.SUFFIX, suffix)) {
                 return;
             }
@@ -1229,7 +1284,6 @@
             builder.withValue(StructuredName.PHONETIC_GIVEN_NAME, yomiFirstName);
             builder.withValue(StructuredName.PHONETIC_FAMILY_NAME, yomiLastName);
             builder.withValue(StructuredName.PREFIX, prefix);
-            //builder.withValue(StructuredName.DISPLAY_NAME, fileAs);
             add(builder.build());
         }
 
@@ -1601,12 +1655,6 @@
         sendStringData(s, cv, StructuredName.PHONETIC_GIVEN_NAME, Tags.CONTACTS_YOMI_FIRST_NAME);
         sendStringData(s, cv, StructuredName.PHONETIC_FAMILY_NAME, Tags.CONTACTS_YOMI_LAST_NAME);
         sendStringData(s, cv, StructuredName.PREFIX, Tags.CONTACTS_TITLE);
-        if (cv.containsKey(StructuredName.DISPLAY_NAME)) {
-            displayName = cv.getAsString(StructuredName.DISPLAY_NAME);
-            if (!TextUtils.isEmpty(displayName)) {
-                s.data(Tags.CONTACTS_FILE_AS, displayName);
-            }
-        }
         return displayName;
     }
 
diff --git a/exchange2/src/com/android/exchange/adapter/EmailSyncAdapter.java b/exchange2/src/com/android/exchange/adapter/EmailSyncAdapter.java
index 73199f8..5a6523c 100644
--- a/exchange2/src/com/android/exchange/adapter/EmailSyncAdapter.java
+++ b/exchange2/src/com/android/exchange/adapter/EmailSyncAdapter.java
@@ -193,8 +193,9 @@
     }
 
     @Override
-    public void sendSyncOptions(Double protocolVersion, Serializer s)
+    public void sendSyncOptions(Double protocolVersion, Serializer s, boolean initialSync)
             throws IOException  {
+        if (initialSync) return;
         mFetchRequestList.clear();
         // Find partially loaded messages; this should typically be a rare occurrence
         Cursor c = mContext.getContentResolver().query(Message.CONTENT_URI,