Changed PhoneLookup#lookup to accept a DialerPhoneNumber.
There's a problem with the existing implementation of RealtimeRowProcessor; when CP2 information is not present, data from other sources can potentially be erased.
This CL fixes the problem by fetching the latest data from all sources, instead of just CP2. This requires being able to fetch PhoneLookup info without a Call, using only a number, so I changed PhoneLookup#lookup to accept a DialerPhoneNumber rather than a Call.
(The reason that it accepted a Call was to support CNAP so we'll need a revised solution for that later.)
There is a potential concern with performance in RealtimeRowProcessor due to performing a full [Composite]PhoneLookup vs. a CP2 lookup, because the full lookup includes network requests. However, it's anticipated that the real time lookups will very rarely have changes to apply so this might be OK as-is. If not, a mitigation strategy could be improving the performance of CompositePhoneLookup#lookup by short-circutiing slower sources when faster, higher priority sources have already completed.
A follow-up CL will write the result of RealtimeRowProcessor queries to PhoneLookupHistory to further reduce how frequently real time updates need to be applied.
Bug: 72229553
Test: existing unit
PiperOrigin-RevId: 182839130
Change-Id: I8cb26827b4f4dc4702fb416234c8938179cd5ac5
diff --git a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
index d382517..96a6409 100644
--- a/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
+++ b/java/com/android/dialer/calllog/database/contract/AnnotatedCallLogContract.java
@@ -119,7 +119,7 @@
*
* <p>TYPE: BLOB
*
- * @see com.android.dialer.calllog.model.NumberAttributes
+ * @see com.android.dialer.NumberAttributes
*/
String NUMBER_ATTRIBUTES = "number_attributes";
diff --git a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
index a0daae1..67fb4f0 100644
--- a/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
+++ b/java/com/android/dialer/calllog/ui/NewCallLogViewHolder.java
@@ -74,7 +74,7 @@
this.clock = clock;
this.realtimeRowProcessor = realtimeRowProcessor;
- uiExecutorService = DialerExecutorComponent.get(context).uiExecutorService();
+ uiExecutorService = DialerExecutorComponent.get(context).uiExecutor();
}
/** @param cursor a cursor from {@link CoalescedAnnotatedCallLogCursorLoader}. */
diff --git a/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java b/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
index 57ad965..9e58e53 100644
--- a/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
+++ b/java/com/android/dialer/calllog/ui/RealtimeRowProcessor.java
@@ -25,10 +25,9 @@
import com.android.dialer.common.Assert;
import com.android.dialer.common.concurrent.Annotations.Ui;
import com.android.dialer.inject.ApplicationContext;
+import com.android.dialer.phonelookup.PhoneLookup;
import com.android.dialer.phonelookup.PhoneLookupInfo;
-import com.android.dialer.phonelookup.PhoneLookupInfo.Cp2Info;
import com.android.dialer.phonelookup.consolidator.PhoneLookupInfoConsolidator;
-import com.android.dialer.phonelookup.cp2.Cp2LocalPhoneLookup;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
@@ -49,19 +48,19 @@
public final class RealtimeRowProcessor {
private final Context appContext;
- private final Cp2LocalPhoneLookup cp2LocalPhoneLookup;
+ private final PhoneLookup<PhoneLookupInfo> phoneLookup;
private final ListeningExecutorService uiExecutor;
- private final Map<DialerPhoneNumber, Cp2Info> cache = new ArrayMap<>();
+ private final Map<DialerPhoneNumber, PhoneLookupInfo> cache = new ArrayMap<>();
@Inject
RealtimeRowProcessor(
@ApplicationContext Context appContext,
@Ui ListeningExecutorService uiExecutor,
- Cp2LocalPhoneLookup cp2LocalPhoneLookup) {
+ PhoneLookup<PhoneLookupInfo> phoneLookup) {
this.appContext = appContext;
this.uiExecutor = uiExecutor;
- this.cp2LocalPhoneLookup = cp2LocalPhoneLookup;
+ this.phoneLookup = phoneLookup;
}
/**
@@ -75,17 +74,17 @@
return Futures.immediateFuture(row);
}
- Cp2Info cachedCp2Info = cache.get(row.number());
- if (cachedCp2Info != null) {
- return Futures.immediateFuture(applyCp2LocalInfoToRow(cachedCp2Info, row));
+ PhoneLookupInfo cachedPhoneLookupInfo = cache.get(row.number());
+ if (cachedPhoneLookupInfo != null) {
+ return Futures.immediateFuture(applyPhoneLookupInfoToRow(cachedPhoneLookupInfo, row));
}
- ListenableFuture<Cp2Info> cp2InfoFuture = cp2LocalPhoneLookup.lookupByNumber(row.number());
+ ListenableFuture<PhoneLookupInfo> phoneLookupInfoFuture = phoneLookup.lookup(row.number());
return Futures.transform(
- cp2InfoFuture,
- cp2Info -> {
- cache.put(row.number(), cp2Info);
- return applyCp2LocalInfoToRow(cp2Info, row);
+ phoneLookupInfoFuture,
+ phoneLookupInfo -> {
+ cache.put(row.number(), phoneLookupInfo);
+ return applyPhoneLookupInfoToRow(phoneLookupInfo, row);
},
uiExecutor /* ensures the cache is updated on a single thread */);
}
@@ -97,13 +96,13 @@
cache.clear();
}
- private CoalescedRow applyCp2LocalInfoToRow(Cp2Info cp2Info, CoalescedRow row) {
- PhoneLookupInfo phoneLookupInfo = PhoneLookupInfo.newBuilder().setCp2LocalInfo(cp2Info).build();
+ private CoalescedRow applyPhoneLookupInfoToRow(
+ PhoneLookupInfo phoneLookupInfo, CoalescedRow row) {
PhoneLookupInfoConsolidator phoneLookupInfoConsolidator =
new PhoneLookupInfoConsolidator(appContext, phoneLookupInfo);
- // It is safe to overwrite any existing data because CP2 always has highest priority.
return row.toBuilder()
.setNumberAttributes(
+ // TODO(zachh): Put this in a common location.
NumberAttributes.newBuilder()
.setName(phoneLookupInfoConsolidator.getName())
.setPhotoUri(phoneLookupInfoConsolidator.getPhotoUri())
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java b/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java
index 28abf96..7348914 100644
--- a/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java
+++ b/java/com/android/dialer/common/concurrent/DialerExecutorComponent.java
@@ -18,6 +18,8 @@
import android.app.FragmentManager;
import android.content.Context;
+import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
+import com.android.dialer.common.concurrent.Annotations.LightweightExecutor;
import com.android.dialer.common.concurrent.Annotations.NonUiParallel;
import com.android.dialer.common.concurrent.Annotations.Ui;
import com.android.dialer.inject.HasRootComponent;
@@ -31,17 +33,23 @@
public abstract DialerExecutorFactory dialerExecutorFactory();
+ @NonUiParallel
+ public abstract ExecutorService lowPriorityThreadPool();
+
@Ui
- public abstract ListeningExecutorService uiExecutorService();
+ public abstract ListeningExecutorService uiExecutor();
+
+ @BackgroundExecutor
+ public abstract ListeningExecutorService backgroundExecutor();
+
+ @LightweightExecutor
+ public abstract ListeningExecutorService lightweightExecutor();
public <OutputT> UiListener<OutputT> createUiListener(
FragmentManager fragmentManager, String taskId) {
return UiListener.create(fragmentManager, taskId);
}
- @NonUiParallel
- public abstract ExecutorService lowPriorityThreadPool();
-
public static DialerExecutorComponent get(Context context) {
return ((DialerExecutorComponent.HasComponent)
((HasRootComponent) context.getApplicationContext()).component())
diff --git a/java/com/android/dialer/common/concurrent/UiListener.java b/java/com/android/dialer/common/concurrent/UiListener.java
index df79130..b5922f9 100644
--- a/java/com/android/dialer/common/concurrent/UiListener.java
+++ b/java/com/android/dialer/common/concurrent/UiListener.java
@@ -96,7 +96,7 @@
Futures.addCallback(
Assert.isNotNull(future),
callbackWrapper,
- DialerExecutorComponent.get(context).uiExecutorService());
+ DialerExecutorComponent.get(context).uiExecutor());
}
private static class CallbackWrapper<OutputT> implements FutureCallback<OutputT> {
diff --git a/java/com/android/dialer/phonelookup/PhoneLookup.java b/java/com/android/dialer/phonelookup/PhoneLookup.java
index 118ae60..76ff98e 100644
--- a/java/com/android/dialer/phonelookup/PhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/PhoneLookup.java
@@ -18,8 +18,6 @@
import android.content.Context;
import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
-import android.telecom.Call;
import com.android.dialer.DialerPhoneNumber;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -35,13 +33,13 @@
public interface PhoneLookup<T> {
/**
- * Returns a future containing a new info for the provided call.
+ * Returns a future containing a new info for the provided number.
*
* <p>The returned message should contain populated data for the sub-message corresponding to this
* {@link PhoneLookup}. For example, the CP2 implementation returns a {@link
* PhoneLookupInfo.Cp2Info} sub-message.
*/
- ListenableFuture<T> lookup(@NonNull Call call);
+ ListenableFuture<T> lookup(DialerPhoneNumber dialerPhoneNumber);
/**
* Returns a future which returns true if the information for any of the provided phone numbers
diff --git a/java/com/android/dialer/phonelookup/blockednumber/DialerBlockedNumberPhoneLookup.java b/java/com/android/dialer/phonelookup/blockednumber/DialerBlockedNumberPhoneLookup.java
index fa67fee..ce12177 100644
--- a/java/com/android/dialer/phonelookup/blockednumber/DialerBlockedNumberPhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/blockednumber/DialerBlockedNumberPhoneLookup.java
@@ -21,9 +21,7 @@
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
import android.support.annotation.WorkerThread;
-import android.telecom.Call;
import android.util.ArraySet;
import com.android.dialer.DialerPhoneNumber;
import com.android.dialer.common.Assert;
@@ -39,15 +37,12 @@
import com.android.dialer.phonelookup.PhoneLookupInfo;
import com.android.dialer.phonelookup.PhoneLookupInfo.BlockedState;
import com.android.dialer.phonelookup.PhoneLookupInfo.DialerBlockedNumberInfo;
-import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
import com.android.dialer.phonenumberproto.PartitionedNumbers;
-import com.android.dialer.telecom.TelecomCallUtil;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.i18n.phonenumbers.PhoneNumberUtil;
import java.util.Set;
import javax.inject.Inject;
@@ -69,18 +64,9 @@
}
@Override
- public ListenableFuture<DialerBlockedNumberInfo> lookup(@NonNull Call call) {
+ public ListenableFuture<DialerBlockedNumberInfo> lookup(DialerPhoneNumber dialerPhoneNumber) {
return executorService.submit(
- () -> {
- DialerPhoneNumberUtil dialerPhoneNumberUtil =
- new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
-
- DialerPhoneNumber number =
- dialerPhoneNumberUtil.parse(
- TelecomCallUtil.getNumber(call),
- TelecomCallUtil.getCountryCode(appContext, call).orNull());
- return queryNumbers(ImmutableSet.of(number)).get(number);
- });
+ () -> queryNumbers(ImmutableSet.of(dialerPhoneNumber)).get(dialerPhoneNumber));
}
@Override
diff --git a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java
index 68695b7..622b4db 100644
--- a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java
@@ -18,8 +18,6 @@
import android.content.Context;
import android.support.annotation.MainThread;
-import android.support.annotation.NonNull;
-import android.telecom.Call;
import com.android.dialer.DialerPhoneNumber;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.LightweightExecutor;
@@ -65,12 +63,12 @@
*/
@SuppressWarnings({"unchecked", "rawtype"})
@Override
- public ListenableFuture<PhoneLookupInfo> lookup(@NonNull Call call) {
+ public ListenableFuture<PhoneLookupInfo> lookup(DialerPhoneNumber dialerPhoneNumber) {
// TODO(zachh): Add short-circuiting logic so that this call is not blocked on low-priority
// lookups finishing when a higher-priority one has already finished.
List<ListenableFuture<?>> futures = new ArrayList<>();
for (PhoneLookup<?> phoneLookup : phoneLookups) {
- futures.add(phoneLookup.lookup(call));
+ futures.add(phoneLookup.lookup(dialerPhoneNumber));
}
return Futures.transform(
Futures.allAsList(futures),
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java
index 995950d..127569b 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2LocalPhoneLookup.java
@@ -27,7 +27,6 @@
import android.support.annotation.Nullable;
import android.support.v4.util.ArrayMap;
import android.support.v4.util.ArraySet;
-import android.telecom.Call;
import android.text.TextUtils;
import com.android.dialer.DialerPhoneNumber;
import com.android.dialer.common.Assert;
@@ -43,7 +42,6 @@
import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
import com.android.dialer.phonenumberproto.PartitionedNumbers;
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;
@@ -93,16 +91,18 @@
}
@Override
- public ListenableFuture<Cp2Info> lookup(Call call) {
- return backgroundExecutorService.submit(() -> lookupInternal(call));
+ public ListenableFuture<Cp2Info> lookup(DialerPhoneNumber dialerPhoneNumber) {
+ return backgroundExecutorService.submit(() -> lookupInternal(dialerPhoneNumber));
}
- private Cp2Info lookupInternal(Call call) {
- String rawNumber = TelecomCallUtil.getNumber(call);
- if (TextUtils.isEmpty(rawNumber)) {
+ private Cp2Info lookupInternal(DialerPhoneNumber dialerPhoneNumber) {
+ DialerPhoneNumberUtil dialerPhoneNumberUtil =
+ new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
+ String number = dialerPhoneNumberUtil.normalizeNumber(dialerPhoneNumber);
+ if (TextUtils.isEmpty(number)) {
return Cp2Info.getDefaultInstance();
}
- Optional<String> validE164 = TelecomCallUtil.getValidE164Number(appContext, call);
+ Optional<String> validE164 = dialerPhoneNumberUtil.formatToValidE164(dialerPhoneNumber);
Set<Cp2ContactInfo> cp2ContactInfos = new ArraySet<>();
// Note: It would make sense to use PHONE_LOOKUP for E164 numbers as well, but we use PHONE to
// ensure consistency when the batch methods are used to update data.
@@ -110,7 +110,7 @@
validE164.isPresent()
? queryPhoneTableBasedOnE164(
Cp2Projections.getProjectionForPhoneTable(), ImmutableSet.of(validE164.get()))
- : queryPhoneLookup(Cp2Projections.getProjectionForPhoneLookupTable(), rawNumber)) {
+ : queryPhoneLookup(Cp2Projections.getProjectionForPhoneLookupTable(), number)) {
if (cursor == null) {
LogUtil.w("Cp2LocalPhoneLookup.lookupInternal", "null cursor");
return Cp2Info.getDefaultInstance();
@@ -122,35 +122,6 @@
return Cp2Info.newBuilder().addAllCp2ContactInfo(cp2ContactInfos).build();
}
- /**
- * Queries ContactsContract.PhoneLookup for the {@link Cp2Info} associated with the provided
- * {@link DialerPhoneNumber}. Returns {@link Cp2Info#getDefaultInstance()} if there is no
- * information.
- */
- public ListenableFuture<Cp2Info> lookupByNumber(DialerPhoneNumber dialerPhoneNumber) {
- return backgroundExecutorService.submit(
- () -> {
- DialerPhoneNumberUtil dialerPhoneNumberUtil =
- new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
- String rawNumber = dialerPhoneNumberUtil.normalizeNumber(dialerPhoneNumber);
- if (rawNumber.isEmpty()) {
- return Cp2Info.getDefaultInstance();
- }
- Set<Cp2ContactInfo> cp2ContactInfos = new ArraySet<>();
- try (Cursor cursor =
- queryPhoneLookup(Cp2Projections.getProjectionForPhoneLookupTable(), rawNumber)) {
- if (cursor == null) {
- LogUtil.w("Cp2LocalPhoneLookup.lookupByNumber", "null cursor");
- return Cp2Info.getDefaultInstance();
- }
- while (cursor.moveToNext()) {
- cp2ContactInfos.add(Cp2Projections.buildCp2ContactInfoFromCursor(appContext, cursor));
- }
- }
- return Cp2Info.newBuilder().addAllCp2ContactInfo(cp2ContactInfos).build();
- });
- }
-
@Override
public ListenableFuture<Boolean> isDirty(ImmutableSet<DialerPhoneNumber> phoneNumbers) {
PartitionedNumbers partitionedNumbers = new PartitionedNumbers(phoneNumbers);
diff --git a/java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java b/java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java
index 6a46829..9596f15 100644
--- a/java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java
+++ b/java/com/android/dialer/phonelookup/cp2/Cp2RemotePhoneLookup.java
@@ -24,7 +24,6 @@
import android.provider.ContactsContract;
import android.provider.ContactsContract.Directory;
import android.support.annotation.VisibleForTesting;
-import android.telecom.Call;
import com.android.dialer.DialerPhoneNumber;
import com.android.dialer.common.LogUtil;
import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
@@ -33,13 +32,14 @@
import com.android.dialer.phonelookup.PhoneLookup;
import com.android.dialer.phonelookup.PhoneLookupInfo;
import com.android.dialer.phonelookup.PhoneLookupInfo.Cp2Info;
+import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.android.dialer.telecom.TelecomCallUtil;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.i18n.phonenumbers.PhoneNumberUtil;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
@@ -62,15 +62,10 @@
}
@Override
- public ListenableFuture<Cp2Info> lookup(Call call) {
- String number = TelecomCallUtil.getNumber(call);
- if (number == null) {
- return Futures.immediateFuture(Cp2Info.getDefaultInstance());
- }
-
+ public ListenableFuture<Cp2Info> lookup(DialerPhoneNumber dialerPhoneNumber) {
return Futures.transformAsync(
queryCp2ForRemoteDirectoryIds(),
- remoteDirectoryIds -> queryCp2ForRemoteContact(number, remoteDirectoryIds),
+ remoteDirectoryIds -> queryCp2ForRemoteContact(dialerPhoneNumber, remoteDirectoryIds),
lightweightExecutorService);
}
@@ -114,11 +109,15 @@
}
private ListenableFuture<Cp2Info> queryCp2ForRemoteContact(
- String number, List<Long> remoteDirectoryIds) {
+ DialerPhoneNumber dialerPhoneNumber, List<Long> remoteDirectoryIds) {
if (remoteDirectoryIds.isEmpty()) {
return Futures.immediateFuture(Cp2Info.getDefaultInstance());
}
+ DialerPhoneNumberUtil dialerPhoneNumberUtil =
+ new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
+ String number = dialerPhoneNumberUtil.normalizeNumber(dialerPhoneNumber);
+
List<ListenableFuture<Cp2Info>> cp2InfoFutures = new ArrayList<>();
for (long remoteDirectoryId : remoteDirectoryIds) {
cp2InfoFutures.add(queryCp2ForRemoteContact(number, remoteDirectoryId));
diff --git a/java/com/android/incallui/PhoneLookupHistoryRecorder.java b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
index 8517deb..abbf934 100644
--- a/java/com/android/incallui/PhoneLookupHistoryRecorder.java
+++ b/java/com/android/incallui/PhoneLookupHistoryRecorder.java
@@ -19,18 +19,23 @@
import android.content.Context;
import android.support.annotation.Nullable;
import android.telecom.Call;
+import com.android.dialer.DialerPhoneNumber;
import com.android.dialer.buildtype.BuildType;
import com.android.dialer.common.Assert;
import com.android.dialer.common.LogUtil;
-import com.android.dialer.common.concurrent.DialerExecutors;
+import com.android.dialer.common.concurrent.DialerExecutorComponent;
import com.android.dialer.phonelookup.PhoneLookupComponent;
import com.android.dialer.phonelookup.PhoneLookupInfo;
import com.android.dialer.phonelookup.database.contract.PhoneLookupHistoryContract.PhoneLookupHistory;
+import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil;
import com.android.dialer.telecom.TelecomCallUtil;
import com.google.common.base.Optional;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
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
@@ -46,10 +51,29 @@
if (!(BuildType.get() == BuildType.BUGFOOD || LogUtil.isDebugEnabled())) {
return;
}
- ListenableFuture<PhoneLookupInfo> future =
- PhoneLookupComponent.get(appContext).phoneLookup().lookup(call);
+
+ ListeningExecutorService backgroundExecutor =
+ DialerExecutorComponent.get(appContext).backgroundExecutor();
+
+ ListenableFuture<DialerPhoneNumber> numberFuture =
+ backgroundExecutor.submit(
+ () -> {
+ DialerPhoneNumberUtil dialerPhoneNumberUtil =
+ new DialerPhoneNumberUtil(PhoneNumberUtil.getInstance());
+ return dialerPhoneNumberUtil.parse(
+ TelecomCallUtil.getNumber(call),
+ TelecomCallUtil.getCountryCode(appContext, call).orNull());
+ });
+
+ ListenableFuture<PhoneLookupInfo> infoFuture =
+ Futures.transformAsync(
+ numberFuture,
+ dialerPhoneNumber ->
+ PhoneLookupComponent.get(appContext).phoneLookup().lookup(dialerPhoneNumber),
+ MoreExecutors.directExecutor());
+
Futures.addCallback(
- future,
+ infoFuture,
new FutureCallback<PhoneLookupInfo>() {
@Override
public void onSuccess(@Nullable PhoneLookupInfo result) {
@@ -79,6 +103,6 @@
"PhoneLookupHistoryRecorder.onFailure", "could not write PhoneLookupHistory", t);
}
},
- DialerExecutors.getLowPriorityThreadPool(appContext));
+ backgroundExecutor);
}
}