Search enterprise directory as well in SMS app

am: b7fc988f23

* commit 'b7fc988f231394077c08b5ede4d1a7310da57406':
  Search enterprise directory as well in SMS app

Change-Id: Ie22b0b974985251ce6fd34c57b8316e9529a1057
This commit is contained in:
Tony Mak
2016-05-16 15:43:53 +00:00
committed by android-build-merger
2 changed files with 101 additions and 24 deletions
@@ -34,6 +34,7 @@ import com.android.messaging.util.BugleGservices;
import com.android.messaging.util.BugleGservicesKeys; import com.android.messaging.util.BugleGservicesKeys;
import com.android.messaging.util.ContactRecipientEntryUtils; import com.android.messaging.util.ContactRecipientEntryUtils;
import com.android.messaging.util.ContactUtil; import com.android.messaging.util.ContactUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils; import com.android.messaging.util.PhoneUtils;
import java.text.Collator; import java.text.Collator;
@@ -101,15 +102,49 @@ public final class ContactRecipientAdapter extends BaseRecipientAdapter {
if (BugleGservices.get().getBoolean( if (BugleGservices.get().getBoolean(
BugleGservicesKeys.ALWAYS_AUTOCOMPLETE_EMAIL_ADDRESS, BugleGservicesKeys.ALWAYS_AUTOCOMPLETE_EMAIL_ADDRESS,
BugleGservicesKeys.ALWAYS_AUTOCOMPLETE_EMAIL_ADDRESS_DEFAULT)) { BugleGservicesKeys.ALWAYS_AUTOCOMPLETE_EMAIL_ADDRESS_DEFAULT)) {
return Pair.create((Cursor) new MergeCursor(new Cursor[] {
ContactUtil.filterPhones(getContext(), searchText) final Cursor personalFilterPhonesCursor = ContactUtil
.performSynchronousQuery(), .filterPhones(getContext(), searchText).performSynchronousQuery();
ContactUtil.filterEmails(getContext(), searchText) final Cursor personalFilterEmailsCursor = ContactUtil
.performSynchronousQuery() .filterEmails(getContext(), searchText).performSynchronousQuery();
}), false /* the merged cursor is not sorted */); 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 { } else {
return Pair.create(ContactUtil.filterDestination(getContext(), searchText) final Cursor personalFilterDestinationCursor = ContactUtil
.performSynchronousQuery(), true); .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);
} }
} }
+58 -16
View File
@@ -273,6 +273,18 @@ public class ContactUtil {
} }
} }
/**
* 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 * 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 * phone number. In case search is on contact name, all matching contact's phone number
@@ -282,19 +294,29 @@ public class ContactUtil {
*/ */
@VisibleForTesting @VisibleForTesting
public static CursorQueryData filterPhones(final Context context, final String query) { 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()) { if (!ContactUtil.hasReadContactsPermission()) {
return CursorQueryData.getEmptyQueryData(); return CursorQueryData.getEmptyQueryData();
} }
Uri phoneFilterUri = buildDirectorySearchUri(phoneFilterBaseUri, query, directoryId);
final Uri uri = Phone.CONTENT_FILTER_URI.buildUpon() return new CursorQueryData(context,
.appendPath(query).appendQueryParameter( phoneFilterUri,
ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)) PhoneQuery.PROJECTION, null, null,
.build();
return new CursorQueryData(context, uri, PhoneQuery.PROJECTION, null, null,
PhoneQuery.SORT_KEY); PhoneQuery.SORT_KEY);
} }
/** /**
* Lookup a phone based on a phone number. Supplied phone should be a relatively complete * 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 * phone number for this to succeed. PhoneLookup URI will apply some smartness to do a
@@ -336,17 +358,29 @@ public class ContactUtil {
*/ */
@VisibleForTesting @VisibleForTesting
public static CursorQueryData filterEmails(final Context context, final String query) { 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()) { if (!ContactUtil.hasReadContactsPermission()) {
return CursorQueryData.getEmptyQueryData(); return CursorQueryData.getEmptyQueryData();
} }
final Uri filterEmailsUri = buildDirectorySearchUri(filterEmailsBaseUri, query,
final Uri uri = Email.CONTENT_FILTER_URI.buildUpon() directoryId);
.appendPath(query).appendQueryParameter( return new CursorQueryData(context,
ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)) filterEmailsUri,
.build(); PhoneQuery.PROJECTION, null, null,
PhoneQuery.SORT_KEY);
return new CursorQueryData(context, uri, EmailQuery.PROJECTION, null, null,
EmailQuery.SORT_KEY);
} }
/** /**
@@ -522,4 +556,12 @@ public class ContactUtil {
public static boolean hasReadContactsPermission() { public static boolean hasReadContactsPermission() {
return OsUtil.hasPermission(Manifest.permission.READ_CONTACTS); 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();
}
} }