summaryrefslogtreecommitdiffstats
path: root/services/core/java/com
diff options
context:
space:
mode:
authorChris Wren <cwren@android.com>2014-05-14 17:38:05 -0400
committerChris Wren <cwren@android.com>2014-05-15 13:27:31 -0400
commit44d81a4b86f73ecf79861bc576c90b8f8e4ba761 (patch)
tree645da2d71f74171da05ba09c4b16585052c3f8c9 /services/core/java/com
parent95f7b135ce17ad270cb586ea0b1aea58e35d8987 (diff)
downloadframeworks_base-44d81a4b86f73ecf79861bc576c90b8f8e4ba761.zip
frameworks_base-44d81a4b86f73ecf79861bc576c90b8f8e4ba761.tar.gz
frameworks_base-44d81a4b86f73ecf79861bc576c90b8f8e4ba761.tar.bz2
Add email validation and star support to ValidateNotificationPeople.
Also fix a bug with multiple pending lookups dropping information. Change-Id: I8348f126e6b0a17cf762ebb720d1c306d3b4923a
Diffstat (limited to 'services/core/java/com')
-rw-r--r--services/core/java/com/android/server/notification/ValidateNotificationPeople.java112
1 files changed, 59 insertions, 53 deletions
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index 8cd2f9b2..b5c2730 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -45,13 +45,13 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor {
private static final boolean ENABLE_PEOPLE_VALIDATOR = true;
private static final String SETTING_ENABLE_PEOPLE_VALIDATOR =
"validate_notification_people_enabled";
- private static final String[] LOOKUP_PROJECTION = { Contacts._ID };
+ private static final String[] LOOKUP_PROJECTION = { Contacts._ID, Contacts.STARRED };
private static final int MAX_PEOPLE = 10;
private static final int PEOPLE_CACHE_SIZE = 200;
private static final float NONE = 0f;
private static final float VALID_CONTACT = 0.5f;
- // TODO private static final float STARRED_CONTACT = 1f;
+ private static final float STARRED_CONTACT = 1f;
protected boolean mEnabled;
private Context mContext;
@@ -104,23 +104,29 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor {
public void work() {
if (INFO) Slog.i(TAG, "Executing: validation for: " + mRecord.sbn.getKey());
float affinity = NONE;
- LookupResult lookupResult = null;
for (final String handle: pendingLookups) {
+ LookupResult lookupResult = null;
final Uri uri = Uri.parse(handle);
if ("tel".equals(uri.getScheme())) {
if (DEBUG) Slog.d(TAG, "checking telephone URI: " + handle);
- lookupResult = resolvePhoneContact(handle, uri.getSchemeSpecificPart());
+ lookupResult = resolvePhoneContact(uri.getSchemeSpecificPart());
+ } else if ("mailto".equals(uri.getScheme())) {
+ if (DEBUG) Slog.d(TAG, "checking mailto URI: " + handle);
+ lookupResult = resolveEmailContact(uri.getSchemeSpecificPart());
} else if (handle.startsWith(Contacts.CONTENT_LOOKUP_URI.toString())) {
if (DEBUG) Slog.d(TAG, "checking lookup URI: " + handle);
- lookupResult = resolveContactsUri(handle, uri);
+ lookupResult = searchContacts(uri);
} else {
+ lookupResult = new LookupResult(); // invalid person for the cache
Slog.w(TAG, "unsupported URI " + handle);
}
+ if (lookupResult != null) {
+ synchronized (mPeopleCache) {
+ mPeopleCache.put(handle, lookupResult);
+ }
+ affinity = Math.max(affinity, lookupResult.getAffinity());
+ }
}
- if (lookupResult != null) {
- affinity = Math.max(affinity, lookupResult.getAffinity());
- }
-
float affinityBound = mRecord.getContactAffinity();
affinity = Math.max(affinity, affinityBound);
mRecord.setContactAffinity(affinity);
@@ -183,47 +189,27 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor {
return null;
}
- private LookupResult resolvePhoneContact(final String handle, final String number) {
- LookupResult lookupResult = null;
- Cursor c = null;
- try {
- Uri numberUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
- Uri.encode(number));
- c = mContext.getContentResolver().query(numberUri, LOOKUP_PROJECTION, null, null, null);
- if (c != null && c.getCount() > 0) {
- c.moveToFirst();
- final int idIdx = c.getColumnIndex(Contacts._ID);
- final int id = c.getInt(idIdx);
- if (DEBUG) Slog.d(TAG, "is valid: " + id);
- lookupResult = new LookupResult(id);
- }
- } catch(Throwable t) {
- Slog.w(TAG, "Problem getting content resolver or performing contacts query.", t);
- } finally {
- if (c != null) {
- c.close();
- }
- }
- if (lookupResult == null) {
- lookupResult = new LookupResult(LookupResult.INVALID_ID);
- }
- synchronized (mPeopleCache) {
- mPeopleCache.put(handle, lookupResult);
- }
- return lookupResult;
+ private LookupResult resolvePhoneContact(final String number) {
+ Uri phoneUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
+ Uri.encode(number));
+ return searchContacts(phoneUri);
+ }
+
+ private LookupResult resolveEmailContact(final String email) {
+ Uri numberUri = Uri.withAppendedPath(
+ ContactsContract.CommonDataKinds.Email.CONTENT_LOOKUP_URI,
+ Uri.encode(email));
+ return searchContacts(numberUri);
}
- private LookupResult resolveContactsUri(String handle, final Uri personUri) {
- LookupResult lookupResult = null;
+ private LookupResult searchContacts(Uri lookupUri) {
+ LookupResult lookupResult = new LookupResult();
Cursor c = null;
try {
- c = mContext.getContentResolver().query(personUri, LOOKUP_PROJECTION, null, null, null);
+ c = mContext.getContentResolver().query(lookupUri, LOOKUP_PROJECTION, null, null, null);
if (c != null && c.getCount() > 0) {
c.moveToFirst();
- final int idIdx = c.getColumnIndex(Contacts._ID);
- final int id = c.getInt(idIdx);
- if (DEBUG) Slog.d(TAG, "is valid: " + id);
- lookupResult = new LookupResult(id);
+ lookupResult.readContact(c);
}
} catch(Throwable t) {
Slog.w(TAG, "Problem getting content resolver or performing contacts query.", t);
@@ -232,12 +218,6 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor {
c.close();
}
}
- if (lookupResult == null) {
- lookupResult = new LookupResult(LookupResult.INVALID_ID);
- }
- synchronized (mPeopleCache) {
- mPeopleCache.put(handle, lookupResult);
- }
return lookupResult;
}
@@ -267,12 +247,31 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor {
private final long mExpireMillis;
private int mId;
+ private boolean mStarred;
- public LookupResult(int id) {
- mId = id;
+ public LookupResult() {
+ mId = INVALID_ID;
+ mStarred = false;
mExpireMillis = System.currentTimeMillis() + CONTACT_REFRESH_MILLIS;
}
+ public void readContact(Cursor cursor) {
+ final int idIdx = cursor.getColumnIndex(Contacts._ID);
+ if (idIdx >= 0) {
+ mId = cursor.getInt(idIdx);
+ if (DEBUG) Slog.d(TAG, "contact _ID is: " + mId);
+ } else {
+ if (DEBUG) Slog.d(TAG, "invalid cursor: no _ID");
+ }
+ final int starIdx = cursor.getColumnIndex(Contacts.STARRED);
+ if (starIdx >= 0) {
+ mStarred = cursor.getInt(starIdx) != 0;
+ if (DEBUG) Slog.d(TAG, "contact STARRED is: " + mStarred);
+ } else {
+ if (DEBUG) Slog.d(TAG, "invalid cursor: no STARRED");
+ }
+ }
+
public boolean isExpired() {
return mExpireMillis < System.currentTimeMillis();
}
@@ -284,11 +283,18 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor {
public float getAffinity() {
if (isInvalid()) {
return NONE;
+ } else if (mStarred) {
+ return STARRED_CONTACT;
} else {
- return VALID_CONTACT; // TODO: finer grained result: stars
+ return VALID_CONTACT;
}
}
+ public LookupResult setStarred(boolean starred) {
+ mStarred = starred;
+ return this;
+ }
+
public LookupResult setId(int id) {
mId = id;
return this;