Merge "Improved support for short codes in Coalescer."
diff --git a/java/com/android/dialer/calllog/database/Coalescer.java b/java/com/android/dialer/calllog/database/Coalescer.java
index 5fdf0df..8a16be2 100644
--- a/java/com/android/dialer/calllog/database/Coalescer.java
+++ b/java/com/android/dialer/calllog/database/Coalescer.java
@@ -33,7 +33,6 @@
 import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
 import com.android.dialer.telecom.TelecomUtil;
 import com.google.common.base.Preconditions;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.protobuf.InvalidProtocolBufferException;
 import java.util.ArrayList;
 import java.util.List;
@@ -73,8 +72,7 @@
     // Note: This method relies on rowsShouldBeCombined to determine which rows should be combined,
     // but delegates to data sources to actually aggregate column values.
 
-    DialerPhoneNumberUtil dialerPhoneNumberUtil =
-        new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
+    DialerPhoneNumberUtil dialerPhoneNumberUtil = new DialerPhoneNumberUtil();
 
     MatrixCursor allCoalescedRowsMatrixCursor =
         new MatrixCursor(
diff --git a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
index 99c3c9d..661b249 100644
--- a/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
+++ b/java/com/android/dialer/calllog/datasources/systemcalllog/SystemCallLogDataSource.java
@@ -57,7 +57,6 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -251,8 +250,7 @@
       Context appContext, CallLogMutations mutations, Set<Long> existingAnnotatedCallLogIds) {
     long previousTimestampProcessed = sharedPreferences.getLong(PREF_LAST_TIMESTAMP_PROCESSED, 0L);
 
-    DialerPhoneNumberUtil dialerPhoneNumberUtil =
-        new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
+    DialerPhoneNumberUtil dialerPhoneNumberUtil = new DialerPhoneNumberUtil();
 
     // TODO(zachh): Really should be getting last 1000 by timestamp, not by last modified.
     try (Cursor cursor =
diff --git a/java/com/android/dialer/commandline/impl/BlockingCommand.java b/java/com/android/dialer/commandline/impl/BlockingCommand.java
index c8f8934..f06e240 100644
--- a/java/com/android/dialer/commandline/impl/BlockingCommand.java
+++ b/java/com/android/dialer/commandline/impl/BlockingCommand.java
@@ -32,7 +32,6 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import javax.inject.Inject;
 
 /** Block or unblock a number. */
@@ -88,8 +87,7 @@
     if ("isblocked".equals(command)) {
       String number = args.getPositionals().get(1);
       ListenableFuture<DialerPhoneNumber> dialerPhoneNumberFuture =
-          executorService.submit(
-              () -> new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance()).parse(number, null));
+          executorService.submit(() -> new DialerPhoneNumberUtil().parse(number, null));
 
       ListenableFuture<PhoneLookupInfo> lookupFuture =
           Futures.transformAsync(
diff --git a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
index a5b9520..d8079ef 100644
--- a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
+++ b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
@@ -29,6 +29,7 @@
 import com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType;
 import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
+import com.google.i18n.phonenumbers.ShortNumberInfo;
 
 /**
  * Wrapper for selected methods in {@link PhoneNumberUtil} which uses the {@link DialerPhoneNumber}
@@ -38,11 +39,13 @@
  */
 public class DialerPhoneNumberUtil {
   private final PhoneNumberUtil phoneNumberUtil;
+  private final ShortNumberInfo shortNumberInfo;
 
   @WorkerThread
-  public DialerPhoneNumberUtil(@NonNull PhoneNumberUtil phoneNumberUtil) {
+  public DialerPhoneNumberUtil() {
     Assert.isWorkerThread();
-    this.phoneNumberUtil = Assert.isNotNull(phoneNumberUtil);
+    this.phoneNumberUtil = PhoneNumberUtil.getInstance();
+    this.shortNumberInfo = ShortNumberInfo.getInstance();
   }
 
   /**
@@ -159,6 +162,13 @@
       return firstNumberIn.getNormalizedNumber().equals(secondNumberIn.getNormalizedNumber());
     }
 
+    // Both numbers are parseable, first check for short codes to so that a number like "5555"
+    // doesn't match "55555" (due to those being a SHORT_NSN_MATCH below).
+    if (shortNumberInfo.isPossibleShortNumber(phoneNumber1)
+        || shortNumberInfo.isPossibleShortNumber(phoneNumber2)) {
+      return firstNumberIn.getNormalizedNumber().equals(secondNumberIn.getNormalizedNumber());
+    }
+
     // Both numbers are parseable, use more sophisticated libphonenumber matching.
     MatchType matchType = phoneNumberUtil.isNumberMatch(phoneNumber1, phoneNumber2);
 
diff --git a/java/com/android/incallui/PhoneLookupHistoryRecorder.java b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
index 2b80758..4f41370 100644
--- a/java/com/android/incallui/PhoneLookupHistoryRecorder.java
+++ b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
@@ -36,7 +36,6 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
 
 /**
  * Fetches the current {@link PhoneLookupInfo} for the provided call and writes it to the
@@ -59,8 +58,7 @@
     ListenableFuture<DialerPhoneNumber> numberFuture =
         backgroundExecutor.submit(
             () -> {
-              DialerPhoneNumberUtil dialerPhoneNumberUtil =
-                  new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
+              DialerPhoneNumberUtil dialerPhoneNumberUtil = new DialerPhoneNumberUtil();
               return dialerPhoneNumberUtil.parse(
                   TelecomCallUtil.getNumber(call), GeoUtil.getCurrentCountryIso(appContext));
             });