From 60dd96aa640ed4619de915576b5ed0df53081fc4 Mon Sep 17 00:00:00 2001 From: zachh Date: Fri, 3 Nov 2017 16:45:34 -0700 Subject: Implemented CompositePhoneLookup#bulkUpdate. Bug: 34672501 Test: unit PiperOrigin-RevId: 174532642 Change-Id: I0115fb26f99fe764bc90625e3ed51f3c4c99439d --- .../composite/CompositePhoneLookup.java | 41 +++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'java/com/android/dialer/phonelookup') 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. + * + *

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> bulkUpdate( ImmutableMap existingInfoMap, long lastModified) { - return null; + List>> futures = + new ArrayList<>(); + for (PhoneLookup phoneLookup : phoneLookups) { + futures.add(phoneLookup.bulkUpdate(existingInfoMap, lastModified)); + } + return Futures.transform( + Futures.allAsList(futures), + new Function< + List>, + ImmutableMap>() { + @Override + public ImmutableMap apply( + List> allMaps) { + ImmutableMap.Builder combinedMap = + ImmutableMap.builder(); + for (DialerPhoneNumber dialerPhoneNumber : existingInfoMap.keySet()) { + PhoneLookupInfo.Builder combinedInfo = PhoneLookupInfo.newBuilder(); + for (ImmutableMap 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()); } } -- cgit v1.2.3