aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjorn Bringert <bringert@android.com>2009-05-06 21:28:26 +0100
committerBjorn Bringert <bringert@android.com>2009-05-12 10:21:54 +0100
commitf07385e614cf88079e3e7767ea4b0507839ae1b6 (patch)
tree9c430723119b082fad1f3e56f199a7fcd974bebc
parentbe7b7a906dc628a7c019c212ad000ad71052b333 (diff)
downloadContactsProvider-f07385e614cf88079e3e7767ea4b0507839ae1b6.tar.gz
Richer info in contacts search suggestions.
Before, the search suggestions returned by the ContactsProvider only showed a single line, with the contact name, organization, phone number or e-mail. Global search had it's own version of contacts suggestions, adding contact photos, a second text line, and IM presence. This patch moves the richer information to the suggestions returned by Contactsprovider. Advantages of this: - The search suggestions in the Contacts app will now be richer. - In global search, contacts suggestions will now look the same when selecting the Contacts source as they do in the blended suggestion list. - The contacts-specific code can be removed from GlobalSearch.
-rw-r--r--src/com/android/providers/contacts/ContactsProvider.java78
1 files changed, 71 insertions, 7 deletions
diff --git a/src/com/android/providers/contacts/ContactsProvider.java b/src/com/android/providers/contacts/ContactsProvider.java
index dfef5ca9..ef34a90c 100644
--- a/src/com/android/providers/contacts/ContactsProvider.java
+++ b/src/com/android/providers/contacts/ContactsProvider.java
@@ -1357,8 +1357,10 @@ public class ContactsProvider extends AbstractSyncableContentProvider {
qb.appendWhere(buildPeopleLookupWhereClause(searchClause));
} else {
final String[] columnNames = new String[] {
+ "_id",
SearchManager.SUGGEST_COLUMN_TEXT_1,
SearchManager.SUGGEST_COLUMN_TEXT_2,
+ SearchManager.SUGGEST_COLUMN_ICON_1,
SearchManager.SUGGEST_COLUMN_INTENT_DATA,
SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
};
@@ -1367,7 +1369,8 @@ public class ContactsProvider extends AbstractSyncableContentProvider {
String s;
int i;
- ArrayList dialNumber = new ArrayList();
+ ArrayList<Object> dialNumber = new ArrayList<Object>();
+ dialNumber.add(0); // _id
s = r.getString(com.android.internal.R.string.dial_number_using, searchClause);
i = s.indexOf('\n');
if (i < 0) {
@@ -1377,10 +1380,12 @@ public class ContactsProvider extends AbstractSyncableContentProvider {
dialNumber.add(s.substring(0, i));
dialNumber.add(s.substring(i + 1));
}
+ dialNumber.add(String.valueOf(android.R.drawable.sym_action_call));
dialNumber.add("tel:" + searchClause);
dialNumber.add(Intents.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED);
- ArrayList createContact = new ArrayList();
+ ArrayList<Object> createContact = new ArrayList<Object>();
+ createContact.add(1); // _id
s = r.getString(com.android.internal.R.string.create_contact_using, searchClause);
i = s.indexOf('\n');
if (i < 0) {
@@ -1390,6 +1395,8 @@ public class ContactsProvider extends AbstractSyncableContentProvider {
createContact.add(s.substring(0, i));
createContact.add(s.substring(i + 1));
}
+ // TODO: add a "create contact" icon
+ createContact.add(String.valueOf(android.R.drawable.ic_menu_add));
createContact.add("tel:" + searchClause);
createContact.add(Intents.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED);
@@ -3927,6 +3934,59 @@ public class ContactsProvider extends AbstractSyncableContentProvider {
+ "END"
+ ")";
+ private static final String PRIMARY_ORGANIZATION_WHEN_SQL
+ = " WHEN primary_organization is NOT NULL THEN "
+ + "(SELECT company FROM organizations WHERE organizations._id = primary_organization)";
+
+ private static final String PRIMARY_PHONE_WHEN_SQL
+ = " WHEN primary_phone IS NOT NULL THEN "
+ + "(SELECT number FROM phones WHERE phones._id = primary_phone)";
+
+ private static final String PRIMARY_EMAIL_WHEN_SQL
+ = " WHEN primary_email IS NOT NULL THEN "
+ + "(SELECT data FROM contact_methods WHERE contact_methods._id = primary_email)";
+
+ // The outer CASE is for figuring out what info DISPLAY_NAME_SQL returned.
+ // We then pick the next piece of info, to avoid the two lines in the search
+ // suggestion being identical.
+ private static final String SUGGEST_DESCRIPTION_SQL
+ = "(CASE"
+ // DISPLAY_NAME_SQL returns name, try org, phone, email
+ + " WHEN (name IS NOT NULL AND name != '') THEN "
+ + "(CASE"
+ + PRIMARY_ORGANIZATION_WHEN_SQL
+ + PRIMARY_PHONE_WHEN_SQL
+ + PRIMARY_EMAIL_WHEN_SQL
+ + " ELSE null END)"
+ // DISPLAY_NAME_SQL returns org, try phone, email
+ + " WHEN primary_organization is NOT NULL THEN "
+ + "(CASE"
+ + PRIMARY_PHONE_WHEN_SQL
+ + PRIMARY_EMAIL_WHEN_SQL
+ + " ELSE null END)"
+ // DISPLAY_NAME_SQL returns phone, try email
+ + " WHEN primary_phone IS NOT NULL THEN "
+ + "(CASE"
+ + PRIMARY_EMAIL_WHEN_SQL
+ + " ELSE null END)"
+ // DISPLAY_NAME_SQL returns email or NULL, return NULL
+ + " ELSE null END)";
+
+ private static final String PRESENCE_ICON_SQL
+ = "(CASE"
+ + buildPresenceStatusWhen(People.OFFLINE)
+ + buildPresenceStatusWhen(People.INVISIBLE)
+ + buildPresenceStatusWhen(People.AWAY)
+ + buildPresenceStatusWhen(People.IDLE)
+ + buildPresenceStatusWhen(People.DO_NOT_DISTURB)
+ + buildPresenceStatusWhen(People.AVAILABLE)
+ + " ELSE null END)";
+
+ private static String buildPresenceStatusWhen(int status) {
+ return " WHEN " + Presence.PRESENCE_STATUS + " = " + status
+ + " THEN " + Presence.getPresenceIconResourceId(status);
+ }
+
private static final String[] sPhonesKeyColumns;
private static final String[] sContactMethodsKeyColumns;
private static final String[] sOrganizationsKeyColumns;
@@ -4214,16 +4274,20 @@ public class ContactsProvider extends AbstractSyncableContentProvider {
map = new HashMap<String, String>();
map.put(SearchManager.SUGGEST_COLUMN_TEXT_1,
DISPLAY_NAME_SQL + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_1);
+ map.put(SearchManager.SUGGEST_COLUMN_TEXT_2,
+ SUGGEST_DESCRIPTION_SQL + " AS " + SearchManager.SUGGEST_COLUMN_TEXT_2);
+ map.put(SearchManager.SUGGEST_COLUMN_ICON_1,
+ com.android.internal.R.drawable.ic_contact_picture
+ + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1);
+ map.put(SearchManager.SUGGEST_COLUMN_ICON_1_BITMAP,
+ Photos.DATA + " AS " + SearchManager.SUGGEST_COLUMN_ICON_1_BITMAP);
+ map.put(SearchManager.SUGGEST_COLUMN_ICON_2,
+ PRESENCE_ICON_SQL + " AS " + SearchManager.SUGGEST_COLUMN_ICON_2);
map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID,
"people._id AS " + SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID,
"people._id AS " + SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
map.put(People._ID, "people._id AS " + People._ID);
- map.put(Phones.NUMBER, Phones.NUMBER);
- map.put(Phones.TYPE, "phones.type AS " + Phones.TYPE);
- map.put(Organizations.COMPANY, Organizations.COMPANY);
- map.put(Photos.DATA, Photos.DATA);
- map.put(Presence.PRESENCE_STATUS, Presence.PRESENCE_STATUS);
sSearchSuggestionsProjectionMap = map;
// Photos projection map