diff options
-rw-r--r-- | java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java index ba08fe9bf..f85b357e7 100644 --- a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java +++ b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java @@ -19,6 +19,7 @@ package com.android.dialer.phonelookup.composite; 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.DialerFutures; import com.android.dialer.phonelookup.PhoneLookup; import com.android.dialer.phonelookup.PhoneLookupInfo; @@ -85,9 +86,47 @@ public final class CompositePhoneLookup implements PhoneLookup { futures, Preconditions::checkNotNull, false /* defaultValue */); } + /** + * Delegates to a set of dependent lookups and combines results. + * + * <p>Note: If any of the dependent lookups fails, the returned future will also fail. If any of + * the dependent lookups does not complete, the returned future will also not complete. + */ @Override public ListenableFuture<ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>> bulkUpdate( ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> existingInfoMap, long lastModified) { - return null; + List<ListenableFuture<ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>>> futures = + new ArrayList<>(); + for (PhoneLookup phoneLookup : phoneLookups) { + futures.add(phoneLookup.bulkUpdate(existingInfoMap, lastModified)); + } + return Futures.transform( + Futures.allAsList(futures), + new Function< + List<ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>>, + ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>>() { + @Override + public ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> apply( + List<ImmutableMap<DialerPhoneNumber, PhoneLookupInfo>> allMaps) { + ImmutableMap.Builder<DialerPhoneNumber, PhoneLookupInfo> combinedMap = + ImmutableMap.builder(); + for (DialerPhoneNumber dialerPhoneNumber : existingInfoMap.keySet()) { + PhoneLookupInfo.Builder combinedInfo = PhoneLookupInfo.newBuilder(); + for (ImmutableMap<DialerPhoneNumber, PhoneLookupInfo> map : allMaps) { + PhoneLookupInfo subInfo = map.get(dialerPhoneNumber); + if (subInfo == null) { + throw new IllegalStateException( + "A sublookup didn't return an info for number: " + + LogUtil.sanitizePhoneNumber( + dialerPhoneNumber.getRawInput().getNumber())); + } + combinedInfo.mergeFrom(subInfo); + } + combinedMap.put(dialerPhoneNumber, combinedInfo.build()); + } + return combinedMap.build(); + } + }, + MoreExecutors.directExecutor()); } } |