summaryrefslogtreecommitdiffstats
path: root/java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java')
-rw-r--r--java/com/android/dialer/enrichedcall/FuzzyPhoneNumberMatcher.java41
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;
}
}