summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanny Baumann <dannybaumann@web.de>2012-09-06 11:25:43 +0200
committerDanny Baumann <dannybaumann@web.de>2012-09-06 11:36:25 +0200
commit074967d89a86b860c61ac5dc90786ba48fa64d8e (patch)
tree96994867e066b1899f2377582e746316ae2b2073
parent3a8badff00fb085ff30b51afff58ab79c5e33425 (diff)
downloadpackages_apps_Contacts-074967d89a86b860c61ac5dc90786ba48fa64d8e.tar.gz
packages_apps_Contacts-074967d89a86b860c61ac5dc90786ba48fa64d8e.tar.bz2
packages_apps_Contacts-074967d89a86b860c61ac5dc90786ba48fa64d8e.zip
Include nickname and organization in T9 search.
Change-Id: I3f0849f13d6f6d805af9d9629ca3169ff3498541
-rw-r--r--src/com/android/contacts/T9Search.java188
1 files changed, 143 insertions, 45 deletions
diff --git a/src/com/android/contacts/T9Search.java b/src/com/android/contacts/T9Search.java
index 5a704397d..3d51ed49c 100644
--- a/src/com/android/contacts/T9Search.java
+++ b/src/com/android/contacts/T9Search.java
@@ -33,10 +33,14 @@ import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
+import android.provider.ContactsContract.CommonDataKinds.Nickname;
+import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
import android.telephony.PhoneNumberUtils;
import android.text.Spannable;
+import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.view.LayoutInflater;
@@ -58,25 +62,33 @@ class T9Search {
private static final int NAME_FIRST = 1;
private static final int NUMBER_FIRST = 2;
- // Phone number queries
- private static final String[] PHONE_PROJECTION = new String[] {
+ // Phone number, nickname, organization query
+ private static final String[] DATA_PROJECTION = new String[] {
+ Data.CONTACT_ID,
+ Data.MIMETYPE,
Phone.NUMBER,
- Phone.CONTACT_ID,
Phone.IS_SUPER_PRIMARY,
Phone.TYPE,
- Phone.LABEL
+ Phone.LABEL,
+ Organization.COMPANY,
+ Nickname.NAME
};
- private static final int PHONE_COLUMN_NUMBER = 0;
- private static final int PHONE_COLUMN_CONTACT = 1;
- private static final int PHONE_COLUMN_PRIMARY = 2;
- private static final int PHONE_COLUMN_TYPE = 3;
- private static final int PHONE_COLUMN_LABEL = 4;
-
- private static final String PHONE_ID_SELECTION = Contacts.Data.MIMETYPE + " = ? ";
- private static final String[] PHONE_ID_SELECTION_ARGS = new String[] {
- Phone.CONTENT_ITEM_TYPE
+
+ private static final int DATA_COLUMN_CONTACT = 0;
+ private static final int DATA_COLUMN_MIMETYPE = 1;
+ private static final int DATA_COLUMN_PHONENUMBER = 2;
+ private static final int DATA_COLUMN_PRIMARY = 3;
+ private static final int DATA_COLUMN_PHONETYPE = 4;
+ private static final int DATA_COLUMN_PHONELABEL = 5;
+ private static final int DATA_COLUMN_ORGANIZATION = 6;
+ private static final int DATA_COLUMN_NICKNAME = 7;
+
+ private static final String DATA_SELECTION =
+ Data.MIMETYPE + " = ? or " + Data.MIMETYPE + " = ? or " + Data.MIMETYPE + " = ?";
+ private static final String[] DATA_SELECTION_ARGS = new String[] {
+ Phone.CONTENT_ITEM_TYPE, Organization.CONTENT_ITEM_TYPE, Nickname.CONTENT_ITEM_TYPE
};
- private static final String PHONE_SORT = Phone.CONTACT_ID + " ASC";
+ private static final String DATA_SORT = Data.CONTACT_ID + " ASC";
private static final String[] CONTACT_PROJECTION = new String[] {
Contacts._ID,
@@ -125,37 +137,62 @@ class T9Search {
Cursor contact = mContext.getContentResolver().query(
Contacts.CONTENT_URI, CONTACT_PROJECTION, CONTACT_QUERY,
null, CONTACT_SORT);
- Cursor phone = mContext.getContentResolver().query(
- Phone.CONTENT_URI, PHONE_PROJECTION, PHONE_ID_SELECTION,
- PHONE_ID_SELECTION_ARGS, PHONE_SORT);
+ Cursor data = mContext.getContentResolver().query(
+ Data.CONTENT_URI, DATA_PROJECTION, DATA_SELECTION,
+ DATA_SELECTION_ARGS, DATA_SORT);
- phone.moveToFirst();
+ data.moveToFirst();
while (contact.moveToNext()) {
long contactId = contact.getLong(CONTACT_COLUMN_ID);
- String contactName = contact.getString(CONTACT_COLUMN_NAME);
+ String nickName = null, organization = null;
int contactContactedCount = contact.getInt(CONTACT_COLUMN_CONTACTED);
+ ArrayList<ContactItem> contactItems = new ArrayList<ContactItem>();
+
+ while (!data.isAfterLast() && data.getLong(DATA_COLUMN_CONTACT) < contactId) {
+ data.moveToNext();
+ }
+
+ while (!data.isAfterLast() && data.getLong(DATA_COLUMN_CONTACT) == contactId) {
+ final String mimeType = data.getString(DATA_COLUMN_MIMETYPE);
+ if (TextUtils.equals(mimeType, Phone.CONTENT_ITEM_TYPE)) {
+ String num = data.getString(DATA_COLUMN_PHONENUMBER);
+ ContactItem contactInfo = new BitmapContactItem();
+
+ contactInfo.id = contactId;
+ contactInfo.number = PhoneNumberUtils.formatNumber(num);
+ contactInfo.normalNumber = removeNonDigits(num);
+ contactInfo.timesContacted = contactContactedCount;
+ contactInfo.isSuperPrimary = data.getInt(DATA_COLUMN_PRIMARY) > 0;
+ contactInfo.groupType = Phone.getTypeLabel(mContext.getResources(),
+ data.getInt(DATA_COLUMN_PHONETYPE), data.getString(DATA_COLUMN_PHONELABEL));
+ contactItems.add(contactInfo);
+ } else if (TextUtils.equals(mimeType, Organization.CONTENT_ITEM_TYPE)) {
+ organization = data.getString(DATA_COLUMN_ORGANIZATION);
+ } else if (TextUtils.equals(mimeType, Nickname.CONTENT_ITEM_TYPE)) {
+ nickName = data.getString(DATA_COLUMN_NICKNAME);
+ }
+ data.moveToNext();
+ }
- while (!phone.isAfterLast() && phone.getLong(PHONE_COLUMN_CONTACT) == contactId) {
- String num = phone.getString(PHONE_COLUMN_NUMBER);
- ContactItem contactInfo = new BitmapContactItem();
-
- contactInfo.id = contactId;
- contactInfo.name = contactName;
- contactInfo.number = PhoneNumberUtils.formatNumber(num);
- contactInfo.normalNumber = removeNonDigits(num);
- contactInfo.normalName = nameToNumber(contactName);
- contactInfo.timesContacted = contactContactedCount;
- contactInfo.isSuperPrimary = phone.getInt(PHONE_COLUMN_PRIMARY) > 0;
- contactInfo.groupType = Phone.getTypeLabel(mContext.getResources(),
- phone.getInt(PHONE_COLUMN_TYPE), phone.getString(PHONE_COLUMN_LABEL));
- mContacts.add(contactInfo);
- phone.moveToNext();
+ String contactName = contact.getString(CONTACT_COLUMN_NAME);
+ String normalName = nameToNumber(contactName);
+ String normalNickName = nickName != null ? nameToNumber(nickName) : null;
+ String normalOrganization = organization != null ? nameToNumber(organization) : null;
+
+ for (ContactItem item : contactItems) {
+ item.name = contactName;
+ item.normalName = normalName;
+ item.nickName = nickName;
+ item.normalNickName = normalNickName;
+ item.organization = organization;
+ item.normalOrganization = normalOrganization;
+ mContacts.add(item);
}
}
contact.close();
- phone.close();
+ data.close();
return null;
}
@@ -193,11 +230,17 @@ class T9Search {
public static class ContactItem {
String name;
+ String nickName;
+ String organization;
String number;
String normalNumber;
String normalName;
+ String normalNickName;
+ String normalOrganization;
int timesContacted;
int nameMatchId;
+ int nickNameMatchId;
+ int organizationMatchId;
int numberMatchId;
CharSequence groupType;
long id;
@@ -241,6 +284,9 @@ class T9Search {
for (ContactItem item : (newQuery ? mContacts : mAllResults)) {
item.numberMatchId = -1;
item.nameMatchId = -1;
+ item.nickNameMatchId = -1;
+ item.organizationMatchId = -1;
+
pos = item.normalNumber.indexOf(number);
if (pos != -1) {
item.numberMatchId = pos;
@@ -253,6 +299,28 @@ class T9Search {
lastSpace = 0;
}
item.nameMatchId = pos - lastSpace;
+ }
+ if (item.normalNickName != null) {
+ pos = item.normalNickName.indexOf(number);
+ if (pos != -1) {
+ int lastSpace = item.normalNickName.lastIndexOf("0", pos);
+ if (lastSpace == -1) {
+ lastSpace = 0;
+ }
+ item.nickNameMatchId = pos - lastSpace;
+ }
+ }
+ if (item.normalOrganization != null) {
+ pos = item.normalOrganization.indexOf(number);
+ if (pos != -1) {
+ int lastSpace = item.normalOrganization.lastIndexOf("0", pos);
+ if (lastSpace == -1) {
+ lastSpace = 0;
+ }
+ item.organizationMatchId = pos - lastSpace;
+ }
+ }
+ if (item.nameMatchId >= 0 || item.nickNameMatchId >= 0 || item.organizationMatchId >= 0) {
nameResults.add(item);
}
}
@@ -290,6 +358,8 @@ class T9Search {
@Override
public int compare(ContactItem lhs, ContactItem rhs) {
int ret = compareInt(lhs.nameMatchId, rhs.nameMatchId);
+ if (ret == 0) ret = compareInt(lhs.nickNameMatchId, rhs.nickNameMatchId);
+ if (ret == 0) ret = compareInt(lhs.organizationMatchId, rhs.organizationMatchId);
if (ret == 0) ret = compareInt(rhs.timesContacted, lhs.timesContacted);
if (ret == 0) ret = compareBool(rhs.isSuperPrimary, lhs.isSuperPrimary);
return ret;
@@ -394,26 +464,54 @@ class T9Search {
holder.icon.setImageResource(R.drawable.sym_action_add);
holder.icon.assignContactFromPhone(o.number, true);
} else {
- holder.name.setText(o.name, TextView.BufferType.SPANNABLE);
- holder.number.setText(o.normalNumber + " (" + o.groupType + ")",
- TextView.BufferType.SPANNABLE);
- holder.number.setVisibility(View.VISIBLE);
+ SpannableStringBuilder nameBuilder = new SpannableStringBuilder();
+ nameBuilder.append(o.name);
if (o.nameMatchId != -1) {
- Spannable s = (Spannable) holder.name.getText();
int nameStart = o.normalName.indexOf(mPrevInput);
- s.setSpan(new ForegroundColorSpan(Color.WHITE),
+ nameBuilder.setSpan(new ForegroundColorSpan(Color.WHITE),
nameStart, nameStart + mPrevInput.length(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- holder.name.setText(s);
}
+ if (!TextUtils.isEmpty(o.nickName)) {
+ nameBuilder.append(" (");
+ nameBuilder.append(o.nickName);
+ nameBuilder.append(")");
+ if (o.nickNameMatchId != -1) {
+ int nickNameStart = o.normalNickName.indexOf(mPrevInput) +
+ nameBuilder.length() - o.nickName.length() - 1;
+ nameBuilder.setSpan(new ForegroundColorSpan(Color.WHITE),
+ nickNameStart, nickNameStart + mPrevInput.length(),
+ Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ }
+ }
+ if (!TextUtils.isEmpty(o.organization)) {
+ nameBuilder.append(" - ");
+ nameBuilder.append(o.organization);
+ if (o.organizationMatchId != -1) {
+ int organizationStart = o.normalOrganization.indexOf(mPrevInput) +
+ nameBuilder.length() - o.organization.length();
+ nameBuilder.setSpan(new ForegroundColorSpan(Color.WHITE),
+ organizationStart, organizationStart + mPrevInput.length(),
+ Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ }
+ }
+
+ SpannableStringBuilder numberBuilder = new SpannableStringBuilder();
+ numberBuilder.append(o.normalNumber);
+ numberBuilder.append(" (");
+ numberBuilder.append(o.groupType);
+ numberBuilder.append(")");
if (o.numberMatchId != -1) {
- Spannable s = (Spannable) holder.number.getText();
int numberStart = o.numberMatchId;
- s.setSpan(new ForegroundColorSpan(Color.WHITE),
+ numberBuilder.setSpan(new ForegroundColorSpan(Color.WHITE),
numberStart, numberStart + mPrevInput.length(),
Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- holder.number.setText(s);
}
+
+ holder.name.setText(nameBuilder);
+ holder.number.setText(numberBuilder);
+ holder.number.setVisibility(View.VISIBLE);
+
Bitmap photo = o.getPhoto();
if (photo != null) {
holder.icon.setImageBitmap(photo);