Loading services/core/java/com/android/server/notification/ValidateNotificationPeople.java +18 −7 Original line number Diff line number Diff line Loading @@ -70,11 +70,15 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor { "validate_notification_people_enabled"; private static final String[] LOOKUP_PROJECTION = { Contacts._ID, Contacts.LOOKUP_KEY, Contacts.STARRED, Contacts.HAS_PHONE_NUMBER }; private static final String[] PHONE_LOOKUP_PROJECTION = { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }; private static final int MAX_PEOPLE = 10; private static final int PEOPLE_CACHE_SIZE = 200; /** Columns used to look up phone numbers for contacts. */ @VisibleForTesting static final String[] PHONE_LOOKUP_PROJECTION = { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER, ContactsContract.CommonDataKinds.Phone.NUMBER }; /** Indicates that the notification does not reference any valid contacts. */ static final float NONE = 0f; Loading Loading @@ -548,14 +552,21 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor { return mPhoneLookupKey; } // Merge phone number found in this lookup and store it in mPhoneNumbers. // Merge phone numbers found in this lookup and store them in mPhoneNumbers. public void mergePhoneNumber(Cursor cursor) { final int phoneNumIdx = cursor.getColumnIndex( final int normalizedNumIdx = cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER); if (phoneNumIdx >= 0) { mPhoneNumbers.add(cursor.getString(phoneNumIdx)); if (normalizedNumIdx >= 0) { mPhoneNumbers.add(cursor.getString(normalizedNumIdx)); } else { if (DEBUG) Slog.d(TAG, "cursor data not found: no NORMALIZED_NUMBER"); } final int numIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); if (numIdx >= 0) { mPhoneNumbers.add(cursor.getString(numIdx)); } else { if (DEBUG) Slog.d(TAG, "invalid cursor: no NORMALIZED_NUMBER"); if (DEBUG) Slog.d(TAG, "cursor data not found: no NUMBER"); } } Loading services/core/java/com/android/server/notification/ZenModeFiltering.java +12 −24 Original line number Diff line number Diff line Loading @@ -40,8 +40,6 @@ import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.util.NotificationMessagingUtil; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Date; public class ZenModeFiltering { Loading Loading @@ -402,16 +400,10 @@ public class ZenModeFiltering { if (person == null) continue; final Uri uri = Uri.parse(person); if ("tel".equals(uri.getScheme())) { String tel = uri.getSchemeSpecificPart(); // while ideally we should not need to do this, sometimes we have seen tel // numbers given in a url-encoded format try { tel = URLDecoder.decode(tel, "UTF-8"); } catch (UnsupportedEncodingException e) { // ignore, keep the original tel string Slog.w(TAG, "unsupported encoding in tel: uri input"); } mTelCalls.put(tel, now); // while ideally we should not need to decode this, sometimes we have seen tel // numbers given in an encoded format String tel = Uri.decode(uri.getSchemeSpecificPart()); if (tel != null) mTelCalls.put(tel, now); } else { // for non-tel calls, store the entire string, uri-component and all mOtherCalls.put(person, now); Loading @@ -422,7 +414,7 @@ public class ZenModeFiltering { // provided; these are in the format of just a phone number string if (phoneNumbers != null) { for (String num : phoneNumbers) { mTelCalls.put(num, now); if (num != null) mTelCalls.put(num, now); } } } Loading @@ -442,13 +434,8 @@ public class ZenModeFiltering { return true; } else { // see if a number that matches via areSameNumber exists String numberToCheck = number; try { numberToCheck = URLDecoder.decode(number, "UTF-8"); } catch (UnsupportedEncodingException e) { // ignore, continue to use the original string Slog.w(TAG, "unsupported encoding in tel: uri input"); } String numberToCheck = Uri.decode(number); if (numberToCheck != null) { for (String prev : mTelCalls.keySet()) { if (PhoneNumberUtils.areSamePhoneNumber( numberToCheck, prev, defaultCountryCode)) { Loading @@ -456,6 +443,7 @@ public class ZenModeFiltering { } } } } } else { if (mOtherCalls.containsKey(person)) { return true; Loading services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -274,7 +274,7 @@ public class ValidateNotificationPeopleTest extends UiServiceTestCase { new ValidateNotificationPeople().searchContactsAndLookupNumbers(mockContext, lookupUri); verify(mockContentResolver, never()).query( eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI), eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }), eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION), contains(ContactsContract.Contacts.LOOKUP_KEY), any(), // selection args isNull()); // sort order Loading Loading @@ -308,7 +308,7 @@ public class ValidateNotificationPeopleTest extends UiServiceTestCase { // in the case of a phone lookup, return null cursor; that's not an error case // and we're not checking the actual storing of the phone data here. when(mockContentResolver.query(eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI), eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }), eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION), contains(ContactsContract.Contacts.LOOKUP_KEY), any(), isNull())).thenReturn(null); Loading @@ -317,7 +317,7 @@ public class ValidateNotificationPeopleTest extends UiServiceTestCase { new ValidateNotificationPeople().searchContactsAndLookupNumbers(mockContext, lookupUri); verify(mockContentResolver, times(1)).query( eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI), eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }), eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION), contains(ContactsContract.Contacts.LOOKUP_KEY), eq(new String[] { "testlookupkey" }), // selection args isNull()); // sort order Loading Loading
services/core/java/com/android/server/notification/ValidateNotificationPeople.java +18 −7 Original line number Diff line number Diff line Loading @@ -70,11 +70,15 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor { "validate_notification_people_enabled"; private static final String[] LOOKUP_PROJECTION = { Contacts._ID, Contacts.LOOKUP_KEY, Contacts.STARRED, Contacts.HAS_PHONE_NUMBER }; private static final String[] PHONE_LOOKUP_PROJECTION = { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }; private static final int MAX_PEOPLE = 10; private static final int PEOPLE_CACHE_SIZE = 200; /** Columns used to look up phone numbers for contacts. */ @VisibleForTesting static final String[] PHONE_LOOKUP_PROJECTION = { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER, ContactsContract.CommonDataKinds.Phone.NUMBER }; /** Indicates that the notification does not reference any valid contacts. */ static final float NONE = 0f; Loading Loading @@ -548,14 +552,21 @@ public class ValidateNotificationPeople implements NotificationSignalExtractor { return mPhoneLookupKey; } // Merge phone number found in this lookup and store it in mPhoneNumbers. // Merge phone numbers found in this lookup and store them in mPhoneNumbers. public void mergePhoneNumber(Cursor cursor) { final int phoneNumIdx = cursor.getColumnIndex( final int normalizedNumIdx = cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER); if (phoneNumIdx >= 0) { mPhoneNumbers.add(cursor.getString(phoneNumIdx)); if (normalizedNumIdx >= 0) { mPhoneNumbers.add(cursor.getString(normalizedNumIdx)); } else { if (DEBUG) Slog.d(TAG, "cursor data not found: no NORMALIZED_NUMBER"); } final int numIdx = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); if (numIdx >= 0) { mPhoneNumbers.add(cursor.getString(numIdx)); } else { if (DEBUG) Slog.d(TAG, "invalid cursor: no NORMALIZED_NUMBER"); if (DEBUG) Slog.d(TAG, "cursor data not found: no NUMBER"); } } Loading
services/core/java/com/android/server/notification/ZenModeFiltering.java +12 −24 Original line number Diff line number Diff line Loading @@ -40,8 +40,6 @@ import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.util.NotificationMessagingUtil; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.Date; public class ZenModeFiltering { Loading Loading @@ -402,16 +400,10 @@ public class ZenModeFiltering { if (person == null) continue; final Uri uri = Uri.parse(person); if ("tel".equals(uri.getScheme())) { String tel = uri.getSchemeSpecificPart(); // while ideally we should not need to do this, sometimes we have seen tel // numbers given in a url-encoded format try { tel = URLDecoder.decode(tel, "UTF-8"); } catch (UnsupportedEncodingException e) { // ignore, keep the original tel string Slog.w(TAG, "unsupported encoding in tel: uri input"); } mTelCalls.put(tel, now); // while ideally we should not need to decode this, sometimes we have seen tel // numbers given in an encoded format String tel = Uri.decode(uri.getSchemeSpecificPart()); if (tel != null) mTelCalls.put(tel, now); } else { // for non-tel calls, store the entire string, uri-component and all mOtherCalls.put(person, now); Loading @@ -422,7 +414,7 @@ public class ZenModeFiltering { // provided; these are in the format of just a phone number string if (phoneNumbers != null) { for (String num : phoneNumbers) { mTelCalls.put(num, now); if (num != null) mTelCalls.put(num, now); } } } Loading @@ -442,13 +434,8 @@ public class ZenModeFiltering { return true; } else { // see if a number that matches via areSameNumber exists String numberToCheck = number; try { numberToCheck = URLDecoder.decode(number, "UTF-8"); } catch (UnsupportedEncodingException e) { // ignore, continue to use the original string Slog.w(TAG, "unsupported encoding in tel: uri input"); } String numberToCheck = Uri.decode(number); if (numberToCheck != null) { for (String prev : mTelCalls.keySet()) { if (PhoneNumberUtils.areSamePhoneNumber( numberToCheck, prev, defaultCountryCode)) { Loading @@ -456,6 +443,7 @@ public class ZenModeFiltering { } } } } } else { if (mOtherCalls.containsKey(person)) { return true; Loading
services/tests/uiservicestests/src/com/android/server/notification/ValidateNotificationPeopleTest.java +3 −3 Original line number Diff line number Diff line Loading @@ -274,7 +274,7 @@ public class ValidateNotificationPeopleTest extends UiServiceTestCase { new ValidateNotificationPeople().searchContactsAndLookupNumbers(mockContext, lookupUri); verify(mockContentResolver, never()).query( eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI), eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }), eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION), contains(ContactsContract.Contacts.LOOKUP_KEY), any(), // selection args isNull()); // sort order Loading Loading @@ -308,7 +308,7 @@ public class ValidateNotificationPeopleTest extends UiServiceTestCase { // in the case of a phone lookup, return null cursor; that's not an error case // and we're not checking the actual storing of the phone data here. when(mockContentResolver.query(eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI), eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }), eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION), contains(ContactsContract.Contacts.LOOKUP_KEY), any(), isNull())).thenReturn(null); Loading @@ -317,7 +317,7 @@ public class ValidateNotificationPeopleTest extends UiServiceTestCase { new ValidateNotificationPeople().searchContactsAndLookupNumbers(mockContext, lookupUri); verify(mockContentResolver, times(1)).query( eq(ContactsContract.CommonDataKinds.Phone.CONTENT_URI), eq(new String[] { ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER }), eq(ValidateNotificationPeople.PHONE_LOOKUP_PROJECTION), contains(ContactsContract.Contacts.LOOKUP_KEY), eq(new String[] { "testlookupkey" }), // selection args isNull()); // sort order Loading