From e1ec439563705d47f699a565c35eff4bc0dcbf61 Mon Sep 17 00:00:00 2001 From: zachh Date: Fri, 22 Dec 2017 16:59:32 -0800 Subject: Parameterized PhoneLookup with submessage type. This allows indvidual PhoneLookups to define and deal mostly with their own submessage type (with the exception of trivial setter and getter methods for converting from/to PhoneLookupInfo). This also simplifies the FakePhoneLookup and tests which use it a bit, I think. Bug: 34672501 Test: unit PiperOrigin-RevId: 179976215 Change-Id: I2db1fc85771621be2f2afcd6af114d82680e30d0 --- .../composite/CompositePhoneLookup.java | 57 +++++++++++++++------- 1 file changed, 39 insertions(+), 18 deletions(-) (limited to 'java/com/android/dialer/phonelookup/composite') diff --git a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java index bb7856fff..da4378bb7 100644 --- a/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java +++ b/java/com/android/dialer/phonelookup/composite/CompositePhoneLookup.java @@ -28,18 +28,20 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import java.util.ArrayList; import java.util.List; +import java.util.Map; import javax.inject.Inject; /** * {@link PhoneLookup} which delegates to a configured set of {@link PhoneLookup PhoneLookups}, * iterating, prioritizing, and coalescing data as necessary. */ -public final class CompositePhoneLookup implements PhoneLookup { +public final class CompositePhoneLookup implements PhoneLookup { private final ImmutableList phoneLookups; private final ListeningExecutorService lightweightExecutorService; @@ -58,20 +60,22 @@ public final class CompositePhoneLookup implements PhoneLookup { *

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. */ + @SuppressWarnings("unchecked") @Override public ListenableFuture lookup(@NonNull Call call) { // 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> futures = new ArrayList<>(); - for (PhoneLookup phoneLookup : phoneLookups) { + List> futures = new ArrayList<>(); + for (PhoneLookup phoneLookup : phoneLookups) { futures.add(phoneLookup.lookup(call)); } return Futures.transform( Futures.allAsList(futures), infos -> { PhoneLookupInfo.Builder mergedInfo = PhoneLookupInfo.newBuilder(); - for (PhoneLookupInfo info : infos) { - mergedInfo.mergeFrom(info); + for (int i = 0; i < infos.size(); i++) { + PhoneLookup phoneLookup = phoneLookups.get(i); + phoneLookup.setSubMessage(mergedInfo, infos.get(i)); } return mergedInfo.build(); }, @@ -81,7 +85,7 @@ public final class CompositePhoneLookup implements PhoneLookup { @Override public ListenableFuture isDirty(ImmutableSet phoneNumbers) { List> futures = new ArrayList<>(); - for (PhoneLookup phoneLookup : phoneLookups) { + for (PhoneLookup phoneLookup : phoneLookups) { futures.add(phoneLookup.isDirty(phoneNumbers)); } // Executes all child lookups (possibly in parallel), completing when the first composite lookup @@ -96,14 +100,13 @@ public final class CompositePhoneLookup implements PhoneLookup { *

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. */ + @SuppressWarnings("unchecked") @Override - public ListenableFuture> - getMostRecentPhoneLookupInfo( - ImmutableMap existingInfoMap) { - List>> futures = - new ArrayList<>(); + public ListenableFuture> getMostRecentInfo( + ImmutableMap existingInfoMap) { + List>> futures = new ArrayList<>(); for (PhoneLookup phoneLookup : phoneLookups) { - futures.add(phoneLookup.getMostRecentPhoneLookupInfo(existingInfoMap)); + futures.add(buildSubmapAndGetMostRecentInfo(existingInfoMap, phoneLookup)); } return Futures.transform( Futures.allAsList(futures), @@ -113,14 +116,14 @@ public final class CompositePhoneLookup implements PhoneLookup { for (DialerPhoneNumber dialerPhoneNumber : existingInfoMap.keySet()) { PhoneLookupInfo.Builder combinedInfo = PhoneLookupInfo.newBuilder(); for (int i = 0; i < allMaps.size(); i++) { - ImmutableMap map = allMaps.get(i); - PhoneLookupInfo subInfo = map.get(dialerPhoneNumber); + ImmutableMap map = allMaps.get(i); + Object subInfo = map.get(dialerPhoneNumber); if (subInfo == null) { throw new IllegalStateException( "A sublookup didn't return an info for number: " + LogUtil.sanitizePhoneNumber(dialerPhoneNumber.getRawInput().getNumber())); } - phoneLookups.get(i).copySubMessage(combinedInfo, subInfo); + phoneLookups.get(i).setSubMessage(combinedInfo, subInfo); } combinedMap.put(dialerPhoneNumber, combinedInfo.build()); } @@ -129,15 +132,33 @@ public final class CompositePhoneLookup implements PhoneLookup { lightweightExecutorService); } + private ListenableFuture> buildSubmapAndGetMostRecentInfo( + ImmutableMap existingInfoMap, + PhoneLookup phoneLookup) { + Map submap = + Maps.transformEntries( + existingInfoMap, + (dialerPhoneNumber, phoneLookupInfo) -> + phoneLookup.getSubMessage(existingInfoMap.get(dialerPhoneNumber))); + return phoneLookup.getMostRecentInfo(ImmutableMap.copyOf(submap)); + } + @Override - public void copySubMessage(PhoneLookupInfo.Builder destination, PhoneLookupInfo source) { - throw new UnsupportedOperationException(); + public void setSubMessage(PhoneLookupInfo.Builder destination, PhoneLookupInfo source) { + throw new UnsupportedOperationException( + "This method is only expected to be called by CompositePhoneLookup itself"); + } + + @Override + public PhoneLookupInfo getSubMessage(PhoneLookupInfo phoneLookupInfo) { + throw new UnsupportedOperationException( + "This method is only expected to be called by CompositePhoneLookup itself"); } @Override public ListenableFuture onSuccessfulBulkUpdate() { List> futures = new ArrayList<>(); - for (PhoneLookup phoneLookup : phoneLookups) { + for (PhoneLookup phoneLookup : phoneLookups) { futures.add(phoneLookup.onSuccessfulBulkUpdate()); } return Futures.transform( -- cgit v1.2.3