diff options
author | Tadashi G. Takaoka <takaoka@google.com> | 2009-09-21 22:06:18 +0900 |
---|---|---|
committer | Tadashi G. Takaoka <takaoka@google.com> | 2009-09-23 14:02:39 -0700 |
commit | a5d05d90333a70d471d78e82caeb5cfa2e4d4c59 (patch) | |
tree | 034b914db07a17b5979bae42084f6d15e57fdca7 /src | |
parent | 70c314fb9b2ef3d47340b93816d46200aba9f5ec (diff) | |
download | ContactsProvider-a5d05d90333a70d471d78e82caeb5cfa2e4d4c59.tar.gz |
ContactProvider: Make nickname, company and title searchable.
If contact entry doesn't have a name, then nickname, company and title
are used as display name in order of preference.
Internal Bug: 1360100
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 75 | ||||
-rw-r--r-- | src/com/android/providers/contacts/OpenHelper.java | 4 |
2 files changed, 57 insertions, 22 deletions
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index 671cd9fe..51389e83 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -16,6 +16,10 @@ package com.android.providers.contacts; +import com.google.android.collect.Lists; +import com.google.android.collect.Maps; +import com.google.android.collect.Sets; + import com.android.internal.content.SyncStateContentProviderHelper; import com.android.providers.contacts.ContactLookupKey.LookupKeySegment; import com.android.providers.contacts.OpenHelper.AggregatedPresenceColumns; @@ -35,9 +39,6 @@ import com.android.providers.contacts.OpenHelper.PresenceColumns; import com.android.providers.contacts.OpenHelper.RawContactsColumns; import com.android.providers.contacts.OpenHelper.SettingsColumns; import com.android.providers.contacts.OpenHelper.Tables; -import com.google.android.collect.Lists; -import com.google.android.collect.Maps; -import com.google.android.collect.Sets; import android.accounts.Account; import android.accounts.AccountManager; @@ -240,13 +241,13 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun MimetypesColumns.MIMETYPE, Data.IS_PRIMARY, Data.DATA1, - StructuredName.DISPLAY_NAME, + Organization.TITLE, }; public static final int MIMETYPE = 0; public static final int IS_PRIMARY = 1; - public static final int DATA1 = 2; - public static final int DISPLAY_NAME = 3; + public static final int DATA = 2; + public static final int TITLE = 3; } private interface DataDeleteQuery { @@ -299,6 +300,8 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun sDisplayNameSources = new HashMap<String, Integer>(); sDisplayNameSources.put(StructuredName.CONTENT_ITEM_TYPE, DisplayNameSources.STRUCTURED_NAME); + sDisplayNameSources.put(Nickname.CONTENT_ITEM_TYPE, + DisplayNameSources.NICKNAME); sDisplayNameSources.put(Organization.CONTENT_ITEM_TYPE, DisplayNameSources.ORGANIZATION); sDisplayNameSources.put(Phone.CONTENT_ITEM_TYPE, @@ -726,6 +729,14 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun public DataRowHandler(String mimetype) { mMimetype = mimetype; + + // To ensure the data column position. This is dead code if properly configured. + if (StructuredName.DISPLAY_NAME != Data.DATA1 || Nickname.NAME != Data.DATA1 + || Organization.COMPANY != Data.DATA1 || Phone.NUMBER != Data.DATA1 + || Email.DATA != Data.DATA1) { + throw new AssertionError("Some of ContactsContract.CommonDataKinds class primary" + + " data is not in DATA1 column"); + } } protected long getMimeTypeId() { @@ -843,16 +854,15 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun try { while (c.moveToNext()) { String mimeType = c.getString(DisplayNameQuery.MIMETYPE); - boolean primary; - String name; - - if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) { - name = c.getString(DisplayNameQuery.DISPLAY_NAME); - primary = true; - } else { - name = c.getString(DisplayNameQuery.DATA1); - primary = (c.getInt(DisplayNameQuery.IS_PRIMARY) != 0); + + // Display name is at DATA1 in all type. This is ensured in the constructor. + String name = c.getString(DisplayNameQuery.DATA); + if (TextUtils.isEmpty(name) + && Organization.CONTENT_ITEM_TYPE.equals(mimeType)) { + name = c.getString(DisplayNameQuery.TITLE); } + boolean primary = StructuredName.CONTENT_ITEM_TYPE.equals(mimeType) + || (c.getInt(DisplayNameQuery.IS_PRIMARY) != 0); if (name != null) { Integer source = sDisplayNameSources.get(mimeType); @@ -1102,27 +1112,39 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun @Override public long insert(SQLiteDatabase db, long rawContactId, ContentValues values) { - long id = super.insert(db, rawContactId, values); + String company = values.getAsString(Organization.COMPANY); + String title = values.getAsString(Organization.TITLE); + + long dataId = super.insert(db, rawContactId, values); + fixRawContactDisplayName(db, rawContactId); - return id; + insertNameLookupForOrganization(rawContactId, dataId, company, title); + return dataId; } @Override public void update(SQLiteDatabase db, ContentValues values, Cursor c, boolean callerIsSyncAdapter) { + String company = values.getAsString(Organization.COMPANY); + String title = values.getAsString(Organization.TITLE); + long dataId = c.getLong(DataUpdateQuery._ID); long rawContactId = c.getLong(DataUpdateQuery.RAW_CONTACT_ID); super.update(db, values, c, callerIsSyncAdapter); fixRawContactDisplayName(db, rawContactId); + deleteNameLookup(dataId); + insertNameLookupForOrganization(rawContactId, dataId, company, title); } @Override public int delete(SQLiteDatabase db, Cursor c) { + long dataId = c.getLong(DataUpdateQuery._ID); long rawContactId = c.getLong(DataDeleteQuery.RAW_CONTACT_ID); int count = super.delete(db, c); fixRawContactDisplayName(db, rawContactId); + deleteNameLookup(dataId); return count; } @@ -4303,6 +4325,17 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun NameLookupType.NICKNAME, NameNormalizer.normalize(nickname)); } + public void insertNameLookupForOrganization(long rawContactId, long dataId, String company, + String title) { + if (!TextUtils.isEmpty(company)) { + insertNameLookup(rawContactId, dataId, + NameLookupType.ORGANIZATION, NameNormalizer.normalize(company)); + } + if (!TextUtils.isEmpty(title)) { + insertNameLookup(rawContactId, dataId, + NameLookupType.ORGANIZATION, NameNormalizer.normalize(title)); + } + } public void insertNameLookupForStructuredName(long rawContactId, long dataId, String name) { mNameLookupBuilder.insertNameLookup(rawContactId, dataId, name); @@ -4418,10 +4451,10 @@ public class ContactsProvider2 extends SQLiteContentProvider implements OnAccoun String limit) { sb.append("(SELECT DISTINCT raw_contact_id FROM name_lookup WHERE normalized_name GLOB '"); sb.append(normalizedName); - sb.append("*' AND (" - + NameLookupColumns.NAME_TYPE + "=" + NameLookupType.NAME_COLLATION_KEY - + " OR " - + NameLookupColumns.NAME_TYPE + "=" + NameLookupType.NICKNAME + ")"); + sb.append("*' AND " + NameLookupColumns.NAME_TYPE + " IN (" + + NameLookupType.NAME_COLLATION_KEY + "," + + NameLookupType.NICKNAME + "," + + NameLookupType.ORGANIZATION + ")"); if (limit != null) { sb.append(" LIMIT ").append(limit); diff --git a/src/com/android/providers/contacts/OpenHelper.java b/src/com/android/providers/contacts/OpenHelper.java index 9ac205fa..97a83cab 100644 --- a/src/com/android/providers/contacts/OpenHelper.java +++ b/src/com/android/providers/contacts/OpenHelper.java @@ -293,6 +293,7 @@ import java.util.HashMap; int EMAIL = 10; int PHONE = 20; int ORGANIZATION = 30; + int NICKNAME = 35; int STRUCTURED_NAME = 40; } @@ -376,9 +377,10 @@ import java.util.HashMap; public static final int NAME_COLLATION_KEY = 2; public static final int NICKNAME = 3; public static final int EMAIL_BASED_NICKNAME = 4; + public static final int ORGANIZATION = 5; // This is the highest name lookup type code plus one - public static final int TYPE_COUNT = 5; + public static final int TYPE_COUNT = 6; public static boolean isBasedOnStructuredName(int nameLookupType) { return nameLookupType == NameLookupType.NAME_EXACT |