Implemented Cp2PhoneLookup#lookup.

Bug: 34672501
Test: unit
PiperOrigin-RevId: 179278530
Change-Id: If629aa2c31efad790c8c70e8066dc9a5612d1fc3
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
index fce6bba..b31d0e7 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2PhoneLookup.java
@@ -22,7 +22,6 @@
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.DeletedContacts;
-import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.util.ArrayMap;
 import android.support.v4.util.ArraySet;
@@ -39,6 +38,7 @@
 import com.android.dialer.phonelookup.PhoneLookupInfo.Cp2Info.Cp2ContactInfo;
 import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
 import com.android.dialer.storage.Unencrypted;
+import com.android.dialer.telecom.TelecomCallUtil;
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -96,9 +96,32 @@
   }
 
   @Override
-  public ListenableFuture<PhoneLookupInfo> lookup(@NonNull Call call) {
-    // TODO(zachh): Implementation.
-    return backgroundExecutorService.submit(PhoneLookupInfo::getDefaultInstance);
+  public ListenableFuture<PhoneLookupInfo> lookup(Call call) {
+    return backgroundExecutorService.submit(() -> lookupInternal(call));
+  }
+
+  private PhoneLookupInfo lookupInternal(Call call) {
+    String rawNumber = TelecomCallUtil.getNumber(call);
+    if (TextUtils.isEmpty(rawNumber)) {
+      return PhoneLookupInfo.getDefaultInstance();
+    }
+    Optional<String> e164 = TelecomCallUtil.getE164Number(appContext, call);
+    Set<Cp2ContactInfo> cp2ContactInfos = new ArraySet<>();
+    try (Cursor cursor =
+        e164.isPresent()
+            ? queryPhoneTableBasedOnE164(CP2_INFO_PROJECTION, ImmutableSet.of(e164.get()))
+            : queryPhoneTableBasedOnRawNumber(CP2_INFO_PROJECTION, ImmutableSet.of(rawNumber))) {
+      if (cursor == null) {
+        LogUtil.w("Cp2PhoneLookup.lookupInternal", "null cursor");
+        return PhoneLookupInfo.getDefaultInstance();
+      }
+      while (cursor.moveToNext()) {
+        cp2ContactInfos.add(buildCp2ContactInfoFromPhoneCursor(appContext, cursor));
+      }
+    }
+    return PhoneLookupInfo.newBuilder()
+        .setCp2Info(Cp2Info.newBuilder().addAllCp2ContactInfo(cp2ContactInfos))
+        .build();
   }
 
   @Override
@@ -226,10 +249,11 @@
   public ListenableFuture<ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>>
       getMostRecentPhoneLookupInfo(
           ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> existingInfoMap) {
-    return backgroundExecutorService.submit(() -> bulkUpdateInternal(existingInfoMap));
+    return backgroundExecutorService.submit(
+        () -> getMostRecentPhoneLookupInfoInternal(existingInfoMap));
   }
 
-  private ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> bulkUpdateInternal(
+  private ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> getMostRecentPhoneLookupInfoInternal(
       ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> existingInfoMap) {
     currentLastTimestampProcessed = null;
     long lastModified = sharedPreferences.getLong(PREF_LAST_TIMESTAMP_PROCESSED, 0L);
@@ -381,7 +405,7 @@
             String e164Number = cursor.getString(CP2_INFO_NORMALIZED_NUMBER_INDEX);
             Set<DialerPhoneNumber> dialerPhoneNumbers =
                 partitionedNumbers.dialerPhoneNumbersForE164(e164Number);
-            Cp2ContactInfo info = buildCp2ContactInfoFromUpdatedContactsCursor(appContext, cursor);
+            Cp2ContactInfo info = buildCp2ContactInfoFromPhoneCursor(appContext, cursor);
             addInfo(map, dialerPhoneNumbers, info);
           }
         }
@@ -398,7 +422,7 @@
             String unformattableNumber = cursor.getString(CP2_INFO_NUMBER_INDEX);
             Set<DialerPhoneNumber> dialerPhoneNumbers =
                 partitionedNumbers.dialerPhoneNumbersForUnformattable(unformattableNumber);
-            Cp2ContactInfo info = buildCp2ContactInfoFromUpdatedContactsCursor(appContext, cursor);
+            Cp2ContactInfo info = buildCp2ContactInfoFromPhoneCursor(appContext, cursor);
             addInfo(map, dialerPhoneNumbers, info);
           }
         }
@@ -453,7 +477,7 @@
    * @param cursor with projection {@link #CP2_INFO_PROJECTION}.
    * @return new {@link Cp2ContactInfo} based on current row of {@code cursor}.
    */
-  private static Cp2ContactInfo buildCp2ContactInfoFromUpdatedContactsCursor(
+  private static Cp2ContactInfo buildCp2ContactInfoFromPhoneCursor(
       Context appContext, Cursor cursor) {
     String displayName = cursor.getString(CP2_INFO_NAME_INDEX);
     String photoUri = cursor.getString(CP2_INFO_PHOTO_URI_INDEX);
diff --git a/java/com/android/dialer/telecom/TelecomCallUtil.java b/java/com/android/dialer/telecom/TelecomCallUtil.java
index acec498..b877a73 100644
--- a/java/com/android/dialer/telecom/TelecomCallUtil.java
+++ b/java/com/android/dialer/telecom/TelecomCallUtil.java
@@ -72,13 +72,37 @@
   }
 
   /**
-   * Normalizes the number of the {@code call} to E.164. If the country code is missing in the
-   * number the SIM's country will be used. Only removes non-dialable digits if the country code is
-   * missing.
+   * Normalizes the number of the {@code call} to E.164. The country of the SIM associated with the
+   * call is used to determine the country.
+   *
+   * <p>If the number cannot be formatted (because for example the country cannot be determined),
+   * returns the number with non-dialable digits removed.
    */
   @WorkerThread
   public static Optional<String> getNormalizedNumber(Context appContext, Call call) {
     Assert.isWorkerThread();
+
+    Optional<String> e164 = getE164Number(appContext, call);
+    if (e164.isPresent()) {
+      return e164;
+    }
+    String rawNumber = getNumber(call);
+    if (TextUtils.isEmpty(rawNumber)) {
+      return Optional.absent();
+    }
+    return Optional.of(PhoneNumberUtils.normalizeNumber(rawNumber));
+  }
+
+  /**
+   * Formats the number of the {@code call} to E.164. The country of the SIM associated with the
+   * call is used to determine the country.
+   *
+   * <p>If the number cannot be formatted (because for example the country cannot be determined),
+   * returns {@link Optional#absent()}.
+   */
+  @WorkerThread
+  public static Optional<String> getE164Number(Context appContext, Call call) {
+    Assert.isWorkerThread();
     PhoneAccountHandle phoneAccountHandle = call.getDetails().getAccountHandle();
     Optional<SubscriptionInfo> subscriptionInfo =
         TelecomUtil.getSubscriptionInfo(appContext, phoneAccountHandle);
@@ -86,21 +110,13 @@
     if (TextUtils.isEmpty(rawNumber)) {
       return Optional.absent();
     }
-    String normalizedNumber = PhoneNumberUtils.normalizeNumber(rawNumber);
-    if (TextUtils.isEmpty(normalizedNumber)) {
-      return Optional.absent();
-    }
     String countryCode =
         subscriptionInfo.isPresent() ? subscriptionInfo.get().getCountryIso() : null;
     if (countryCode == null) {
-      LogUtil.w(
-          "PhoneLookupHistoryRecorder.getNormalizedNumber",
-          "couldn't find a country code for call");
-      return Optional.of(normalizedNumber);
+      LogUtil.w("TelecomCallUtil.getE164Number", "couldn't find a country code for call");
+      return Optional.absent();
     }
-
-    String e164Number =
-        PhoneNumberUtils.formatNumberToE164(rawNumber, countryCode.toUpperCase(Locale.US));
-    return e164Number == null ? Optional.of(normalizedNumber) : Optional.of(e164Number);
+    return Optional.fromNullable(
+        PhoneNumberUtils.formatNumberToE164(rawNumber, countryCode.toUpperCase(Locale.US)));
   }
 }