Search enterprise directory as well in SMS app
am: b7fc988f23
* commit 'b7fc988f231394077c08b5ede4d1a7310da57406':
Search enterprise directory as well in SMS app
Change-Id: I8f0facc0665d9c68e1afdd49c89cc7ccd2c56515
This commit is contained in:
@@ -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 {
|
} else {
|
||||||
return Pair.create(ContactUtil.filterDestination(getContext(), searchText)
|
resultCursor = new MergeCursor(
|
||||||
.performSynchronousQuery(), true);
|
new Cursor[]{personalFilterEmailsCursor, personalFilterPhonesCursor});
|
||||||
|
}
|
||||||
|
return Pair.create(
|
||||||
|
resultCursor,
|
||||||
|
false /* the merged cursor is not sorted */
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user