Merge "Support non-standard ports in EAS" into jb-dev
diff --git a/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java b/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java
index 7b7be15..c0c3a48 100644
--- a/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java
+++ b/exchange2/src/com/android/exchange/adapter/ContactsSyncAdapter.java
@@ -58,13 +58,17 @@
 import android.util.Base64;
 import android.util.Log;
 
+import com.android.emailcommon.utility.Utility;
 import com.android.exchange.CommandStatusException;
 import com.android.exchange.Eas;
 import com.android.exchange.EasSyncService;
+import com.android.exchange.utility.CalendarUtilities;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
 
 /**
  * Sync adapter for EAS Contacts
@@ -359,11 +363,13 @@
             }
         }
 
+        @Override
         public void addValues(RowBuilder builder) {
             builder.withValue(Email.DATA, email);
             builder.withValue(Email.DISPLAY_NAME, displayName);
         }
 
+        @Override
         public boolean isSameAs(int type, String value) {
             return email.equalsIgnoreCase(value);
         }
@@ -376,10 +382,12 @@
             im = _im;
         }
 
+        @Override
         public void addValues(RowBuilder builder) {
             builder.withValue(Im.DATA, im);
         }
 
+        @Override
         public boolean isSameAs(int type, String value) {
             return im.equalsIgnoreCase(value);
         }
@@ -394,11 +402,13 @@
             type = _type;
         }
 
+        @Override
         public void addValues(RowBuilder builder) {
             builder.withValue(Im.DATA, phone);
             builder.withValue(Phone.TYPE, type);
         }
 
+        @Override
         public boolean isSameAs(int _type, String value) {
             return type == _type && phone.equalsIgnoreCase(value);
         }
@@ -1258,7 +1268,14 @@
             if (cv != null && cvCompareString(cv, Event.START_DATE, birthday)) {
                 return;
             }
-            builder.withValue(Event.START_DATE, birthday);
+            long millis = Utility.parseEmailDateTimeToMillis(birthday);
+            GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
+            cal.setTimeInMillis(millis);
+            if (cal.get(GregorianCalendar.HOUR_OF_DAY) >= 12) {
+                cal.add(GregorianCalendar.DATE, 1);
+            }
+            String realBirthday = CalendarUtilities.calendarToBirthdayString(cal);
+            builder.withValue(Event.START_DATE, realBirthday);
             builder.withValue(Event.TYPE, Event.TYPE_BIRTHDAY);
             add(builder.build());
         }
diff --git a/exchange2/src/com/android/exchange/utility/CalendarUtilities.java b/exchange2/src/com/android/exchange/utility/CalendarUtilities.java
index 00e3f1b..792d065 100644
--- a/exchange2/src/com/android/exchange/utility/CalendarUtilities.java
+++ b/exchange2/src/com/android/exchange/utility/CalendarUtilities.java
@@ -903,6 +903,22 @@
     }
 
     /**
+     * Generate a birthday string from a GregorianCalendar set appropriately; the format of this
+     * string is YYYY-MM-DD
+     * @param cal the calendar
+     * @return the birthday string
+     */
+    static public String calendarToBirthdayString(GregorianCalendar cal) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(cal.get(Calendar.YEAR));
+        sb.append('-');
+        sb.append(formatTwo(cal.get(Calendar.MONTH) + 1));
+        sb.append('-');
+        sb.append(formatTwo(cal.get(Calendar.DAY_OF_MONTH)));
+        return sb.toString();
+    }
+
+    /**
      * Generate an EAS formatted local date/time string from a time and a time zone. If the final
      * argument is false, only a date will be returned (e.g. 20100331)
      * @param millis a time in milliseconds