Search enterprise directory as well in SMS app

TODO: Update the UI to show enterprise result separately (b/26021888)

Bug: 28016344, 25977180
(cherry picked from commit 5c621e57256f5068a43f1456f9bab1194f0d27b2)

Change-Id: I7130ae5e057ed750a29f64c5497a04b868613579
diff --git a/src/com/android/messaging/ui/contact/ContactRecipientAdapter.java b/src/com/android/messaging/ui/contact/ContactRecipientAdapter.java
index 25f422e..240f281 100644
--- a/src/com/android/messaging/ui/contact/ContactRecipientAdapter.java
+++ b/src/com/android/messaging/ui/contact/ContactRecipientAdapter.java
@@ -34,6 +34,7 @@
 import com.android.messaging.util.BugleGservicesKeys;
 import com.android.messaging.util.ContactRecipientEntryUtils;
 import com.android.messaging.util.ContactUtil;
+import com.android.messaging.util.OsUtil;
 import com.android.messaging.util.PhoneUtils;
 
 import java.text.Collator;
@@ -101,15 +102,49 @@
             if (BugleGservices.get().getBoolean(
                     BugleGservicesKeys.ALWAYS_AUTOCOMPLETE_EMAIL_ADDRESS,
                     BugleGservicesKeys.ALWAYS_AUTOCOMPLETE_EMAIL_ADDRESS_DEFAULT)) {
-                return Pair.create((Cursor) new MergeCursor(new Cursor[] {
-                        ContactUtil.filterPhones(getContext(), searchText)
-                                .performSynchronousQuery(),
-                        ContactUtil.filterEmails(getContext(), searchText)
-                                .performSynchronousQuery()
-                }), false /* the merged cursor is not sorted */);
+
+                final Cursor personalFilterPhonesCursor = ContactUtil
+                        .filterPhones(getContext(), searchText).performSynchronousQuery();
+                final Cursor personalFilterEmailsCursor = ContactUtil
+                        .filterEmails(getContext(), searchText).performSynchronousQuery();
+                Cursor resultCursor;
+                if (OsUtil.isAtLeastN()) {
+                    // Including enterprise result starting from N.
+                    final Cursor enterpriseFilterPhonesCursor = ContactUtil.filterPhonesEnterprise(
+                            getContext(), searchText).performSynchronousQuery();
+                    final Cursor enterpriseFilterEmailsCursor = ContactUtil.filterEmailsEnterprise(
+                            getContext(), searchText).performSynchronousQuery();
+                    // TODO: Separating enterprise result from personal result (b/26021888)
+                    resultCursor = new MergeCursor(
+                            new Cursor[]{personalFilterEmailsCursor, enterpriseFilterEmailsCursor,
+                                    personalFilterPhonesCursor, enterpriseFilterPhonesCursor});
+                } else {
+                    resultCursor = new MergeCursor(
+                            new Cursor[]{personalFilterEmailsCursor, personalFilterPhonesCursor});
+                }
+                return Pair.create(
+                        resultCursor,
+                        false /* the merged cursor is not sorted */
+                );
             } else {
-                return Pair.create(ContactUtil.filterDestination(getContext(), searchText)
-                        .performSynchronousQuery(), true);
+                final Cursor personalFilterDestinationCursor = ContactUtil
+                        .filterDestination(getContext(), searchText).performSynchronousQuery();
+                Cursor resultCursor;
+                boolean sorted;
+                if (OsUtil.isAtLeastN()) {
+                    // Including enterprise result starting from N.
+                    final Cursor enterpriseFilterDestinationCursor = ContactUtil
+                            .filterDestinationEnterprise(getContext(), searchText)
+                            .performSynchronousQuery();
+                    // TODO: Separating enterprise result from personal result (b/26021888)
+                    resultCursor = new MergeCursor(new Cursor[]{personalFilterDestinationCursor,
+                            enterpriseFilterDestinationCursor});
+                    sorted = false;
+                } else {
+                    resultCursor = personalFilterDestinationCursor;
+                    sorted = true;
+                }
+                return Pair.create(resultCursor, sorted);
             }
         }
 
diff --git a/src/com/android/messaging/util/ContactUtil.java b/src/com/android/messaging/util/ContactUtil.java
index 8555889..41a1704 100644
--- a/src/com/android/messaging/util/ContactUtil.java
+++ b/src/com/android/messaging/util/ContactUtil.java
@@ -274,6 +274,18 @@
     }
 
     /**
+     * Get a list of destinations (phone, email) matching the partial destination in work profile.
+     */
+    public static CursorQueryData filterDestinationEnterprise(final Context context,
+            final String destination) {
+        if (shouldFilterForEmail(destination)) {
+            return ContactUtil.filterEmailsEnterprise(context, destination);
+        } else {
+            return ContactUtil.filterPhonesEnterprise(context, destination);
+        }
+    }
+
+    /**
      * Get a list of phones matching a search criteria. The search may be on contact name or
      * phone number. In case search is on contact name, all matching contact's phone number
      * will be returned.
@@ -282,19 +294,29 @@
      */
     @VisibleForTesting
     public static CursorQueryData filterPhones(final Context context, final String query) {
+        return filterPhonesInternal(context, Phone.CONTENT_FILTER_URI, query, Directory.DEFAULT);
+    }
+
+    /**
+     * Similar to {@link #filterPhones(Context, String)}, but search in work profile instead.
+     */
+    public static CursorQueryData filterPhonesEnterprise(final Context context,
+            final String query) {
+        return filterPhonesInternal(context, Phone.ENTERPRISE_CONTENT_FILTER_URI, query,
+                Directory.ENTERPRISE_DEFAULT);
+    }
+
+    private static CursorQueryData filterPhonesInternal(final Context context,
+            final Uri phoneFilterBaseUri, final String query, final long directoryId) {
         if (!ContactUtil.hasReadContactsPermission()) {
             return CursorQueryData.getEmptyQueryData();
         }
-
-        final Uri uri = Phone.CONTENT_FILTER_URI.buildUpon()
-                .appendPath(query).appendQueryParameter(
-                        ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
-                        .build();
-
-        return new CursorQueryData(context, uri, PhoneQuery.PROJECTION, null, null,
+        Uri phoneFilterUri = buildDirectorySearchUri(phoneFilterBaseUri, query, directoryId);
+        return new CursorQueryData(context,
+                phoneFilterUri,
+                PhoneQuery.PROJECTION, null, null,
                 PhoneQuery.SORT_KEY);
     }
-
     /**
      * Lookup a phone based on a phone number. Supplied phone should be a relatively complete
      * phone number for this to succeed. PhoneLookup URI will apply some smartness to do a
@@ -336,17 +358,29 @@
      */
     @VisibleForTesting
     public static CursorQueryData filterEmails(final Context context, final String query) {
+        return filterEmailsInternal(context, Email.CONTENT_FILTER_URI, query, Directory.DEFAULT);
+    }
+
+    /**
+     * Similar to {@link #filterEmails(Context, String)}, but search in work profile instead.
+     */
+    public static CursorQueryData filterEmailsEnterprise(final Context context,
+            final String query) {
+        return filterEmailsInternal(context, Email.ENTERPRISE_CONTENT_FILTER_URI, query,
+                Directory.ENTERPRISE_DEFAULT);
+    }
+
+    private static CursorQueryData filterEmailsInternal(final Context context,
+            final Uri filterEmailsBaseUri, final String query, final long directoryId) {
         if (!ContactUtil.hasReadContactsPermission()) {
             return CursorQueryData.getEmptyQueryData();
         }
-
-        final Uri uri = Email.CONTENT_FILTER_URI.buildUpon()
-                .appendPath(query).appendQueryParameter(
-                        ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
-                        .build();
-
-        return new CursorQueryData(context, uri, EmailQuery.PROJECTION, null, null,
-                EmailQuery.SORT_KEY);
+        final Uri filterEmailsUri = buildDirectorySearchUri(filterEmailsBaseUri, query,
+                directoryId);
+        return new CursorQueryData(context,
+                filterEmailsUri,
+                PhoneQuery.PROJECTION, null, null,
+                PhoneQuery.SORT_KEY);
     }
 
     /**
@@ -522,4 +556,12 @@
     public static boolean hasReadContactsPermission() {
         return OsUtil.hasPermission(Manifest.permission.READ_CONTACTS);
     }
+
+    private static Uri buildDirectorySearchUri(final Uri uri, final String query,
+            final long directoryId) {
+        return uri.buildUpon()
+                .appendPath(query).appendQueryParameter(
+                        ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(directoryId))
+                .build();
+    }
 }