Add date windowing to exchange search

b/11027351

Change-Id: Ifc767d4403a27e7c961251dac475a68e189328a4
diff --git a/src/com/android/exchange/adapter/Search.java b/src/com/android/exchange/adapter/Search.java
index 7577c69..d4c9bcd 100644
--- a/src/com/android/exchange/adapter/Search.java
+++ b/src/com/android/exchange/adapter/Search.java
@@ -40,7 +40,11 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
 
 /**
  * Implementation of server-side search for EAS using the EmailService API
@@ -52,6 +56,14 @@
     // The largest number of results we'll ask for per server request
     private static final int MAX_SEARCH_RESULTS = 100;
 
+    // TODO: move this somewhere more unified
+    // Time format documented at http://msdn.microsoft.com/en-us/library/ee201818(v=exchg.80).aspx
+    private static final SimpleDateFormat DATE_FORMAT;
+    static {
+        DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S'Z'", Locale.US);
+        DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+    }
+
     public static int searchMessages(Context context, long accountId, SearchParams searchParams,
             long destMailboxId) {
         // Sanity check for arguments
@@ -93,6 +105,20 @@
             }
 
             s.data(Tags.SEARCH_FREE_TEXT, filter);
+
+            // Add the date window if appropriate
+            if (searchParams.mStartDate != null) {
+                s.start(Tags.SEARCH_GREATER_THAN);
+                s.tag(Tags.EMAIL_DATE_RECEIVED);
+                s.data(Tags.SEARCH_VALUE, DATE_FORMAT.format(searchParams.mStartDate));
+                s.end(); // SEARCH_GREATER_THAN
+            }
+            if (searchParams.mEndDate != null) {
+                s.start(Tags.SEARCH_LESS_THAN);
+                s.tag(Tags.EMAIL_DATE_RECEIVED);
+                s.data(Tags.SEARCH_VALUE, DATE_FORMAT.format(searchParams.mEndDate));
+                s.end(); // SEARCH_LESS_THAN
+            }
             s.end().end();              // SEARCH_AND, SEARCH_QUERY
             s.start(Tags.SEARCH_OPTIONS);
             if (offset == 0) {