diff options
Diffstat (limited to 'java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java')
-rw-r--r-- | java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java b/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java index 250c64313..27dc0e90c 100644 --- a/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java +++ b/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java @@ -16,20 +16,41 @@ package com.android.dialer.enrichedcall; import android.support.annotation.NonNull; -import com.android.dialer.common.Assert; /** Utility for comparing phone numbers. */ public class FuzzyPhoneNumberMatcher { - /** Returns {@code true} if the given numbers can be interpreted to be the same. */ - public static boolean matches(@NonNull String a, @NonNull String b) { - String aNormalized = Assert.isNotNull(a).replaceAll("[^0-9]", ""); - String bNormalized = Assert.isNotNull(b).replaceAll("[^0-9]", ""); - if (aNormalized.length() < 7 || bNormalized.length() < 7) { - return false; + private static final int REQUIRED_MATCHED_DIGITS = 7; + + /** + * Returns {@code true} if the given numbers can be interpreted to be the same. + * + * <p>This method is called numerous times when rendering the call log. Using string methods is + * too slow, so character by character matching is used instead. + */ + public static boolean matches(@NonNull String lhs, @NonNull String rhs) { + int aIndex = lhs.length() - 1; + int bIndex = rhs.length() - 1; + + int matchedDigits = 0; + + while (aIndex >= 0 && bIndex >= 0) { + if (!Character.isDigit(lhs.charAt(aIndex))) { + --aIndex; + continue; + } + if (!Character.isDigit(rhs.charAt(bIndex))) { + --bIndex; + continue; + } + if (lhs.charAt(aIndex) != rhs.charAt(bIndex)) { + return false; + } + --aIndex; + --bIndex; + ++matchedDigits; } - String aMatchable = aNormalized.substring(aNormalized.length() - 7); - String bMatchable = bNormalized.substring(bNormalized.length() - 7); - return aMatchable.equals(bMatchable); + + return matchedDigits >= REQUIRED_MATCHED_DIGITS; } } |