Loading java/com/android/dialer/calllog/database/Coalescer.java +4 −9 Original line number Diff line number Diff line Loading @@ -156,6 +156,10 @@ public class Coalescer { return false; } if (!meetsAssistedDialingCriteria(row1, row2)) { return false; } DialerPhoneNumber number1; DialerPhoneNumber number2; try { Loading @@ -172,15 +176,6 @@ public class Coalescer { } catch (InvalidProtocolBufferException e) { throw Assert.createAssertionFailException("error parsing DialerPhoneNumber proto", e); } if (!number1.hasDialerInternalPhoneNumber() || !number2.hasDialerInternalPhoneNumber()) { // An empty number should not be combined with any other number. return false; } if (!meetsAssistedDialingCriteria(row1, row2)) { return false; } return dialerPhoneNumberUtil.isMatch(number1, number2); } Loading java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java +15 −7 Original line number Diff line number Diff line Loading @@ -235,7 +235,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { new String[] { Calls._ID, Calls.DATE, Calls.LAST_MODIFIED, Calls.LAST_MODIFIED, // TODO(a bug): Not available in M Calls.NUMBER, Calls.TYPE, Calls.COUNTRY_ISO, Loading @@ -248,8 +248,10 @@ public class SystemCallLogDataSource implements CallLogDataSource { Calls.GEOCODED_LOCATION, Calls.PHONE_ACCOUNT_COMPONENT_NAME, Calls.PHONE_ACCOUNT_ID, Calls.FEATURES Calls.FEATURES, Calls.POST_DIAL_DIGITS, // TODO(a bug): Not available in M }, // TODO(a bug): LAST_MODIFIED not available on M Calls.LAST_MODIFIED + " > ? AND " + Voicemails.DELETED + " = 0", new String[] {String.valueOf(previousTimestampProcessed)}, Calls.LAST_MODIFIED + " DESC LIMIT 1000")) { Loading Loading @@ -282,6 +284,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_COMPONENT_NAME); int phoneAccountIdColumn = cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_ID); int featuresColumn = cursor.getColumnIndexOrThrow(Calls.FEATURES); int postDialDigitsColumn = cursor.getColumnIndexOrThrow(Calls.POST_DIAL_DIGITS); // The cursor orders by LAST_MODIFIED DESC, so the first result is the most recent timestamp // processed. Loading @@ -302,19 +305,24 @@ public class SystemCallLogDataSource implements CallLogDataSource { String phoneAccountComponentName = cursor.getString(phoneAccountComponentColumn); String phoneAccountId = cursor.getString(phoneAccountIdColumn); int features = cursor.getInt(featuresColumn); String postDialDigits = cursor.getString(postDialDigitsColumn); ContentValues contentValues = new ContentValues(); contentValues.put(AnnotatedCallLog.TIMESTAMP, date); if (!TextUtils.isEmpty(numberAsStr)) { String numberWithPostDialDigits = postDialDigits == null ? numberAsStr : numberAsStr + postDialDigits; DialerPhoneNumber dialerPhoneNumber = dialerPhoneNumberUtil.parse(numberAsStr, countryIso); dialerPhoneNumberUtil.parse(numberWithPostDialDigits, countryIso); contentValues.put(AnnotatedCallLog.NUMBER, dialerPhoneNumber.toByteArray()); contentValues.put( AnnotatedCallLog.FORMATTED_NUMBER, PhoneNumberUtils.formatNumber(numberAsStr, countryIso)); // TODO(zachh): Need to handle post-dial digits; different on N and M. String formattedNumber = PhoneNumberUtils.formatNumber(numberWithPostDialDigits, countryIso); if (formattedNumber == null) { formattedNumber = numberWithPostDialDigits; } contentValues.put(AnnotatedCallLog.FORMATTED_NUMBER, formattedNumber); } else { contentValues.put( AnnotatedCallLog.NUMBER, DialerPhoneNumber.getDefaultInstance().toByteArray()); Loading java/com/android/dialer/calllog/ui/menu/Modules.java +5 −5 Original line number Diff line number Diff line Loading @@ -130,17 +130,17 @@ final class Modules { if (!row.numberAttributes().getName().isEmpty()) { dialerContactBuilder.setNameOrNumber(row.numberAttributes().getName()); } else if (!TextUtils.isEmpty(originalNumber)) { dialerContactBuilder.setNameOrNumber(originalNumber); if (row.formattedNumber() != null) { dialerContactBuilder.setDisplayNumber(row.formattedNumber()); } } else if (!TextUtils.isEmpty(row.formattedNumber())) { dialerContactBuilder.setNameOrNumber(row.formattedNumber()); } dialerContactBuilder.setNumberLabel(row.numberAttributes().getNumberTypeLabel()); dialerContactBuilder.setPhotoUri(row.numberAttributes().getPhotoUri()); dialerContactBuilder.setContactUri(row.numberAttributes().getLookupUri()); if (row.formattedNumber() != null) { dialerContactBuilder.setDisplayNumber(row.formattedNumber()); } return dialerContactBuilder.build(); } } java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java +36 −7 Original line number Diff line number Diff line Loading @@ -103,9 +103,19 @@ public class DialerPhoneNumberUtil { } /** * Returns true if the two numbers were parseable by libphonenumber and are a {@link * MatchType#SHORT_NSN_MATCH} or {@link MatchType#NSN_MATCH} or {@link MatchType#EXACT_MATCH} or * if they have the same raw input. * Returns true if the two numbers: * * <ul> * <li>were parseable by libphonenumber (see {@link #parse(String, String)}), * <li>are a {@link MatchType#SHORT_NSN_MATCH}, {@link MatchType#NSN_MATCH}, or {@link * MatchType#EXACT_MATCH}, and * <li>have the same post-dial digits. * </ul> * * <p>If either number is not parseable, returns true if their raw inputs have the same network * and post-dial portions. * * <p>An empty number is never considered to match another number. * * @see PhoneNumberUtil#isNumberMatch(PhoneNumber, PhoneNumber) */ Loading @@ -115,15 +125,34 @@ public class DialerPhoneNumberUtil { Assert.isWorkerThread(); if (!Assert.isNotNull(firstNumberIn).hasDialerInternalPhoneNumber() || !Assert.isNotNull(secondNumberIn).hasDialerInternalPhoneNumber()) { return firstNumberIn.getRawInput().equals(secondNumberIn.getRawInput()); // An empty number should not be combined with any other number. if (firstNumberIn.getRawInput().getNumber().isEmpty() || secondNumberIn.getRawInput().getNumber().isEmpty()) { return false; } // Both the network and post-dial portions of the number should match. return sameNetworkPortion(firstNumberIn, secondNumberIn) && samePostDialPortion(firstNumberIn, secondNumberIn); } MatchType matchType = isNumberMatch( firstNumberIn.getDialerInternalPhoneNumber(), secondNumberIn.getDialerInternalPhoneNumber()); return matchType == MatchType.SHORT_NSN_MATCH return (matchType == MatchType.SHORT_NSN_MATCH || matchType == MatchType.NSN_MATCH || matchType == MatchType.EXACT_MATCH; || matchType == MatchType.EXACT_MATCH) && samePostDialPortion(firstNumberIn, secondNumberIn); } private static boolean sameNetworkPortion(DialerPhoneNumber number1, DialerPhoneNumber number2) { return PhoneNumberUtils.extractNetworkPortion(number1.getRawInput().getNumber()) .equals(PhoneNumberUtils.extractNetworkPortion(number2.getRawInput().getNumber())); } private static boolean samePostDialPortion(DialerPhoneNumber number1, DialerPhoneNumber number2) { return PhoneNumberUtils.extractPostDialPortion(number1.getRawInput().getNumber()) .equals(PhoneNumberUtils.extractPostDialPortion(number2.getRawInput().getNumber())); } /** Loading java/com/android/dialer/phonenumberproto/PartitionedNumbers.java +18 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.support.annotation.NonNull; import android.support.annotation.WorkerThread; import android.support.v4.util.ArrayMap; import android.support.v4.util.ArraySet; import android.telephony.PhoneNumberUtils; import com.android.dialer.DialerPhoneNumber; import com.android.dialer.common.Assert; import com.google.common.base.Optional; Loading Loading @@ -49,7 +50,18 @@ public final class PartitionedNumbers { for (DialerPhoneNumber dialerPhoneNumber : dialerPhoneNumbers) { Optional<String> optValidE164 = dialerPhoneNumberUtil.formatToValidE164(dialerPhoneNumber); if (optValidE164.isPresent()) { /* * Numbers with post-dial digits are considered valid and can be converted to E164, but their * post dial digits are lost in the process. Similarly, if a contact's number has a post-dial * digits, the normalized version of it stored in the contacts database does not include the * post dial digits. * * A number with post-dial digits should not match a contact whose number does not have * post-dial digits, which means that we cannot normalize such numbers for use in bulk lookup. * Treat them as invalid which will cause them to be processed individually using * ContactsContract.PHONE_LOOKUP. */ if (optValidE164.isPresent() && !hasPostDialDigits(dialerPhoneNumber)) { String validE164 = optValidE164.get(); Set<DialerPhoneNumber> currentNumbers = e164MapBuilder.get(validE164); if (currentNumbers == null) { Loading @@ -72,6 +84,11 @@ public final class PartitionedNumbers { invalidNumbersToDialerPhoneNumbers = makeImmutable(invalidMapBuilder); } private boolean hasPostDialDigits(DialerPhoneNumber dialerPhoneNumber) { return !PhoneNumberUtils.extractPostDialPortion(dialerPhoneNumber.getRawInput().getNumber()) .isEmpty(); } /** Returns the set of invalid numbers from the original DialerPhoneNumbers */ @NonNull public ImmutableSet<String> invalidNumbers() { Loading Loading
java/com/android/dialer/calllog/database/Coalescer.java +4 −9 Original line number Diff line number Diff line Loading @@ -156,6 +156,10 @@ public class Coalescer { return false; } if (!meetsAssistedDialingCriteria(row1, row2)) { return false; } DialerPhoneNumber number1; DialerPhoneNumber number2; try { Loading @@ -172,15 +176,6 @@ public class Coalescer { } catch (InvalidProtocolBufferException e) { throw Assert.createAssertionFailException("error parsing DialerPhoneNumber proto", e); } if (!number1.hasDialerInternalPhoneNumber() || !number2.hasDialerInternalPhoneNumber()) { // An empty number should not be combined with any other number. return false; } if (!meetsAssistedDialingCriteria(row1, row2)) { return false; } return dialerPhoneNumberUtil.isMatch(number1, number2); } Loading
java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java +15 −7 Original line number Diff line number Diff line Loading @@ -235,7 +235,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { new String[] { Calls._ID, Calls.DATE, Calls.LAST_MODIFIED, Calls.LAST_MODIFIED, // TODO(a bug): Not available in M Calls.NUMBER, Calls.TYPE, Calls.COUNTRY_ISO, Loading @@ -248,8 +248,10 @@ public class SystemCallLogDataSource implements CallLogDataSource { Calls.GEOCODED_LOCATION, Calls.PHONE_ACCOUNT_COMPONENT_NAME, Calls.PHONE_ACCOUNT_ID, Calls.FEATURES Calls.FEATURES, Calls.POST_DIAL_DIGITS, // TODO(a bug): Not available in M }, // TODO(a bug): LAST_MODIFIED not available on M Calls.LAST_MODIFIED + " > ? AND " + Voicemails.DELETED + " = 0", new String[] {String.valueOf(previousTimestampProcessed)}, Calls.LAST_MODIFIED + " DESC LIMIT 1000")) { Loading Loading @@ -282,6 +284,7 @@ public class SystemCallLogDataSource implements CallLogDataSource { cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_COMPONENT_NAME); int phoneAccountIdColumn = cursor.getColumnIndexOrThrow(Calls.PHONE_ACCOUNT_ID); int featuresColumn = cursor.getColumnIndexOrThrow(Calls.FEATURES); int postDialDigitsColumn = cursor.getColumnIndexOrThrow(Calls.POST_DIAL_DIGITS); // The cursor orders by LAST_MODIFIED DESC, so the first result is the most recent timestamp // processed. Loading @@ -302,19 +305,24 @@ public class SystemCallLogDataSource implements CallLogDataSource { String phoneAccountComponentName = cursor.getString(phoneAccountComponentColumn); String phoneAccountId = cursor.getString(phoneAccountIdColumn); int features = cursor.getInt(featuresColumn); String postDialDigits = cursor.getString(postDialDigitsColumn); ContentValues contentValues = new ContentValues(); contentValues.put(AnnotatedCallLog.TIMESTAMP, date); if (!TextUtils.isEmpty(numberAsStr)) { String numberWithPostDialDigits = postDialDigits == null ? numberAsStr : numberAsStr + postDialDigits; DialerPhoneNumber dialerPhoneNumber = dialerPhoneNumberUtil.parse(numberAsStr, countryIso); dialerPhoneNumberUtil.parse(numberWithPostDialDigits, countryIso); contentValues.put(AnnotatedCallLog.NUMBER, dialerPhoneNumber.toByteArray()); contentValues.put( AnnotatedCallLog.FORMATTED_NUMBER, PhoneNumberUtils.formatNumber(numberAsStr, countryIso)); // TODO(zachh): Need to handle post-dial digits; different on N and M. String formattedNumber = PhoneNumberUtils.formatNumber(numberWithPostDialDigits, countryIso); if (formattedNumber == null) { formattedNumber = numberWithPostDialDigits; } contentValues.put(AnnotatedCallLog.FORMATTED_NUMBER, formattedNumber); } else { contentValues.put( AnnotatedCallLog.NUMBER, DialerPhoneNumber.getDefaultInstance().toByteArray()); Loading
java/com/android/dialer/calllog/ui/menu/Modules.java +5 −5 Original line number Diff line number Diff line Loading @@ -130,17 +130,17 @@ final class Modules { if (!row.numberAttributes().getName().isEmpty()) { dialerContactBuilder.setNameOrNumber(row.numberAttributes().getName()); } else if (!TextUtils.isEmpty(originalNumber)) { dialerContactBuilder.setNameOrNumber(originalNumber); if (row.formattedNumber() != null) { dialerContactBuilder.setDisplayNumber(row.formattedNumber()); } } else if (!TextUtils.isEmpty(row.formattedNumber())) { dialerContactBuilder.setNameOrNumber(row.formattedNumber()); } dialerContactBuilder.setNumberLabel(row.numberAttributes().getNumberTypeLabel()); dialerContactBuilder.setPhotoUri(row.numberAttributes().getPhotoUri()); dialerContactBuilder.setContactUri(row.numberAttributes().getLookupUri()); if (row.formattedNumber() != null) { dialerContactBuilder.setDisplayNumber(row.formattedNumber()); } return dialerContactBuilder.build(); } }
java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java +36 −7 Original line number Diff line number Diff line Loading @@ -103,9 +103,19 @@ public class DialerPhoneNumberUtil { } /** * Returns true if the two numbers were parseable by libphonenumber and are a {@link * MatchType#SHORT_NSN_MATCH} or {@link MatchType#NSN_MATCH} or {@link MatchType#EXACT_MATCH} or * if they have the same raw input. * Returns true if the two numbers: * * <ul> * <li>were parseable by libphonenumber (see {@link #parse(String, String)}), * <li>are a {@link MatchType#SHORT_NSN_MATCH}, {@link MatchType#NSN_MATCH}, or {@link * MatchType#EXACT_MATCH}, and * <li>have the same post-dial digits. * </ul> * * <p>If either number is not parseable, returns true if their raw inputs have the same network * and post-dial portions. * * <p>An empty number is never considered to match another number. * * @see PhoneNumberUtil#isNumberMatch(PhoneNumber, PhoneNumber) */ Loading @@ -115,15 +125,34 @@ public class DialerPhoneNumberUtil { Assert.isWorkerThread(); if (!Assert.isNotNull(firstNumberIn).hasDialerInternalPhoneNumber() || !Assert.isNotNull(secondNumberIn).hasDialerInternalPhoneNumber()) { return firstNumberIn.getRawInput().equals(secondNumberIn.getRawInput()); // An empty number should not be combined with any other number. if (firstNumberIn.getRawInput().getNumber().isEmpty() || secondNumberIn.getRawInput().getNumber().isEmpty()) { return false; } // Both the network and post-dial portions of the number should match. return sameNetworkPortion(firstNumberIn, secondNumberIn) && samePostDialPortion(firstNumberIn, secondNumberIn); } MatchType matchType = isNumberMatch( firstNumberIn.getDialerInternalPhoneNumber(), secondNumberIn.getDialerInternalPhoneNumber()); return matchType == MatchType.SHORT_NSN_MATCH return (matchType == MatchType.SHORT_NSN_MATCH || matchType == MatchType.NSN_MATCH || matchType == MatchType.EXACT_MATCH; || matchType == MatchType.EXACT_MATCH) && samePostDialPortion(firstNumberIn, secondNumberIn); } private static boolean sameNetworkPortion(DialerPhoneNumber number1, DialerPhoneNumber number2) { return PhoneNumberUtils.extractNetworkPortion(number1.getRawInput().getNumber()) .equals(PhoneNumberUtils.extractNetworkPortion(number2.getRawInput().getNumber())); } private static boolean samePostDialPortion(DialerPhoneNumber number1, DialerPhoneNumber number2) { return PhoneNumberUtils.extractPostDialPortion(number1.getRawInput().getNumber()) .equals(PhoneNumberUtils.extractPostDialPortion(number2.getRawInput().getNumber())); } /** Loading
java/com/android/dialer/phonenumberproto/PartitionedNumbers.java +18 −1 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.support.annotation.NonNull; import android.support.annotation.WorkerThread; import android.support.v4.util.ArrayMap; import android.support.v4.util.ArraySet; import android.telephony.PhoneNumberUtils; import com.android.dialer.DialerPhoneNumber; import com.android.dialer.common.Assert; import com.google.common.base.Optional; Loading Loading @@ -49,7 +50,18 @@ public final class PartitionedNumbers { for (DialerPhoneNumber dialerPhoneNumber : dialerPhoneNumbers) { Optional<String> optValidE164 = dialerPhoneNumberUtil.formatToValidE164(dialerPhoneNumber); if (optValidE164.isPresent()) { /* * Numbers with post-dial digits are considered valid and can be converted to E164, but their * post dial digits are lost in the process. Similarly, if a contact's number has a post-dial * digits, the normalized version of it stored in the contacts database does not include the * post dial digits. * * A number with post-dial digits should not match a contact whose number does not have * post-dial digits, which means that we cannot normalize such numbers for use in bulk lookup. * Treat them as invalid which will cause them to be processed individually using * ContactsContract.PHONE_LOOKUP. */ if (optValidE164.isPresent() && !hasPostDialDigits(dialerPhoneNumber)) { String validE164 = optValidE164.get(); Set<DialerPhoneNumber> currentNumbers = e164MapBuilder.get(validE164); if (currentNumbers == null) { Loading @@ -72,6 +84,11 @@ public final class PartitionedNumbers { invalidNumbersToDialerPhoneNumbers = makeImmutable(invalidMapBuilder); } private boolean hasPostDialDigits(DialerPhoneNumber dialerPhoneNumber) { return !PhoneNumberUtils.extractPostDialPortion(dialerPhoneNumber.getRawInput().getNumber()) .isEmpty(); } /** Returns the set of invalid numbers from the original DialerPhoneNumbers */ @NonNull public ImmutableSet<String> invalidNumbers() { Loading