Use built-in rows for Birthday and OfficeLocation (fixes #2154423)

Change-Id: I9c6976121c662b5071fb7c86e70ab91d3ae47e53
diff --git a/src/com/android/exchange/adapter/ContactsSyncAdapter.java b/src/com/android/exchange/adapter/ContactsSyncAdapter.java
index 4b976d6..b38d866 100644
--- a/src/com/android/exchange/adapter/ContactsSyncAdapter.java
+++ b/src/com/android/exchange/adapter/ContactsSyncAdapter.java
@@ -43,6 +43,7 @@
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.Settings;
 import android.provider.ContactsContract.SyncState;
+import android.provider.ContactsContract.CommonDataKinds.Birthday;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.CommonDataKinds.Im;
@@ -211,36 +212,31 @@
 
     public static final class EasPersonal {
         String anniversary;
-        String birthday;
         String fileAs;
 
             /** MIME type used when storing this in data table. */
         public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/eas_personal";
         public static final String ANNIVERSARY = "data2";
-        public static final String BIRTHDAY = "data3";
         public static final String FILE_AS = "data4";
 
         boolean hasData() {
-            return anniversary != null || birthday != null || fileAs != null;
+            return anniversary != null || fileAs != null;
         }
     }
 
     public static final class EasBusiness {
-        String officeLocation;
         String customerId;
         String governmentId;
         String accountName;
 
         /** MIME type used when storing this in data table. */
         public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/eas_business";
-        public static final String OFFICE_LOCATION = "data4";
         public static final String CUSTOMER_ID = "data6";
         public static final String GOVERNMENT_ID = "data7";
         public static final String ACCOUNT_NAME = "data8";
 
         boolean hasData() {
-            return officeLocation != null || customerId != null || governmentId != null
-                || accountName != null;
+            return customerId != null || governmentId != null || accountName != null;
         }
     }
 
@@ -351,6 +347,7 @@
             String yomiCompanyName = null;
             String title = null;
             String department = null;
+            String officeLocation = null;
             Address home = new Address();
             Address work = new Address();
             Address other = new Address();
@@ -515,7 +512,7 @@
 
                     // EAS Business
                     case Tags.CONTACTS_OFFICE_LOCATION:
-                        business.officeLocation = getValue();
+                        officeLocation = getValue();
                         break;
                     case Tags.CONTACTS2_CUSTOMER_ID:
                         business.customerId = getValue();
@@ -532,7 +529,7 @@
                         personal.anniversary = getValue();
                         break;
                     case Tags.CONTACTS_BIRTHDAY:
-                        personal.birthday = getValue();
+                        ops.addBirthday(entity, getValue());
                         break;
                     case Tags.CONTACTS_WEBPAGE:
                         ops.addWebpage(entity, getValue());
@@ -609,7 +606,7 @@
 
             if (companyName != null) {
                 ops.addOrganization(entity, Organization.TYPE_WORK, companyName, title, department,
-                        yomiCompanyName);
+                        yomiCompanyName, officeLocation);
             }
 
             if (entity != null) {
@@ -1179,6 +1176,13 @@
             add(builder.build());
         }
 
+        public void addBirthday(Entity entity, String birthday) {
+            RowBuilder builder =
+                createBuilder(entity, Birthday.CONTENT_ITEM_TYPE, -1, birthday);
+            builder.withValue(Birthday.BIRTHDAY, birthday);
+            add(builder.build());
+        }
+
         public void addName(Entity entity, String prefix, String givenName, String familyName,
                 String middleName, String suffix, String displayName, String yomiFirstName,
                 String yomiLastName, String fileAs) {
@@ -1209,14 +1213,12 @@
             RowBuilder builder = untypedRowBuilder(entity, EasPersonal.CONTENT_ITEM_TYPE);
             ContentValues cv = builder.cv;
             if (cv != null && cvCompareString(cv, EasPersonal.ANNIVERSARY, personal.anniversary) &&
-                    cvCompareString(cv, EasPersonal.BIRTHDAY, personal.birthday) &&
                     cvCompareString(cv, EasPersonal.FILE_AS , personal.fileAs)) {
                 return;
             }
             if (!personal.hasData()) {
                 return;
             }
-            builder.withValue(EasPersonal.BIRTHDAY, personal.birthday);
             builder.withValue(EasPersonal.FILE_AS, personal.fileAs);
             builder.withValue(EasPersonal.ANNIVERSARY, personal.anniversary);
             add(builder.build());
@@ -1227,8 +1229,7 @@
             ContentValues cv = builder.cv;
             if (cv != null && cvCompareString(cv, EasBusiness.ACCOUNT_NAME, business.accountName) &&
                     cvCompareString(cv, EasBusiness.CUSTOMER_ID, business.customerId) &&
-                    cvCompareString(cv, EasBusiness.GOVERNMENT_ID, business.governmentId) &&
-                    cvCompareString(cv, EasBusiness.OFFICE_LOCATION, business.officeLocation)) {
+                    cvCompareString(cv, EasBusiness.GOVERNMENT_ID, business.governmentId)) {
                 return;
             }
             if (!business.hasData()) {
@@ -1237,7 +1238,6 @@
             builder.withValue(EasBusiness.ACCOUNT_NAME, business.accountName);
             builder.withValue(EasBusiness.CUSTOMER_ID, business.customerId);
             builder.withValue(EasBusiness.GOVERNMENT_ID, business.governmentId);
-            builder.withValue(EasBusiness.OFFICE_LOCATION, business.officeLocation);
             add(builder.build());
         }
 
@@ -1386,13 +1386,14 @@
         }
 
         public void addOrganization(Entity entity, int type, String company, String title,
-                String department, String yomiCompanyName) {
+                String department, String yomiCompanyName, String officeLocation) {
             RowBuilder builder = typedRowBuilder(entity, Organization.CONTENT_ITEM_TYPE, type);
             ContentValues cv = builder.cv;
             if (cv != null && cvCompareString(cv, Organization.COMPANY, company) &&
                     cvCompareString(cv, Organization.PHONETIC_NAME, yomiCompanyName) &&
                     cvCompareString(cv, Organization.DEPARTMENT, department) &&
-                    cvCompareString(cv, Organization.TITLE, title)) {
+                    cvCompareString(cv, Organization.TITLE, title) &&
+                    cvCompareString(cv, Organization.OFFICE_LOCATION, officeLocation)) {
                 return;
             }
             builder.withValue(Organization.TYPE, type);
@@ -1400,6 +1401,7 @@
             builder.withValue(Organization.TITLE, title);
             builder.withValue(Organization.DEPARTMENT, department);
             builder.withValue(Organization.PHONETIC_NAME, yomiCompanyName);
+            builder.withValue(Organization.OFFICE_LOCATION, officeLocation);
             add(builder.build());
         }
 
@@ -1597,23 +1599,23 @@
         if (cv.containsKey(EasBusiness.GOVERNMENT_ID)) {
             s.data(Tags.CONTACTS2_GOVERNMENT_ID, cv.getAsString(EasBusiness.GOVERNMENT_ID));
         }
-        if (cv.containsKey(EasBusiness.OFFICE_LOCATION)) {
-            s.data(Tags.CONTACTS_OFFICE_LOCATION, cv.getAsString(EasBusiness.OFFICE_LOCATION));
-        }
     }
 
     private void sendPersonal(Serializer s, ContentValues cv) throws IOException {
         if (cv.containsKey(EasPersonal.ANNIVERSARY)) {
             s.data(Tags.CONTACTS_ANNIVERSARY, cv.getAsString(EasPersonal.ANNIVERSARY));
         }
-        if (cv.containsKey(EasPersonal.BIRTHDAY)) {
-            s.data(Tags.CONTACTS_BIRTHDAY, cv.getAsString(EasPersonal.BIRTHDAY));
-        }
         if (cv.containsKey(EasPersonal.FILE_AS)) {
             s.data(Tags.CONTACTS_FILE_AS, cv.getAsString(EasPersonal.FILE_AS));
         }
     }
 
+    private void sendBirthday(Serializer s, ContentValues cv) throws IOException {
+        if (cv.containsKey(Birthday.BIRTHDAY)) {
+            s.data(Tags.CONTACTS_BIRTHDAY, cv.getAsString(Birthday.BIRTHDAY));
+        }
+    }
+
     private void sendOrganization(Serializer s, ContentValues cv) throws IOException {
         if (cv.containsKey(Organization.TITLE)) {
             s.data(Tags.CONTACTS_JOB_TITLE, cv.getAsString(Organization.TITLE));
@@ -1624,6 +1626,9 @@
         if (cv.containsKey(Organization.DEPARTMENT)) {
             s.data(Tags.CONTACTS_DEPARTMENT, cv.getAsString(Organization.DEPARTMENT));
         }
+        if (cv.containsKey(Organization.OFFICE_LOCATION)) {
+            s.data(Tags.CONTACTS_OFFICE_LOCATION, cv.getAsString(Organization.OFFICE_LOCATION));
+        }
     }
 
     private void sendNickname(Serializer s, ContentValues cv) throws IOException {
@@ -1826,6 +1831,8 @@
                             sendOrganization(s, cv);
                         } else if (mimeType.equals(Im.CONTENT_ITEM_TYPE)) {
                             sendIm(s, cv, imCount++);
+                        } else if (mimeType.equals(Birthday.CONTENT_ITEM_TYPE)) {
+                            sendBirthday(s, cv);
                         } else if (mimeType.equals(GroupMembership.CONTENT_ITEM_TYPE)) {
                             // We must gather these, and send them together (below)
                             groupIds.add(cv.getAsInteger(GroupMembership.GROUP_ROW_ID));