From fa3cd3bfb14f4b8ac65c0ee6757bc78b40a73573 Mon Sep 17 00:00:00 2001 From: linyuh Date: Thu, 26 Apr 2018 20:21:01 -0700 Subject: Implement CequintPhoneLookup Bug: 70989584 Test: CequintPhoneLookupTest PiperOrigin-RevId: 194493484 Change-Id: I59f9b334f0a218e7ba1c34948db4ddbf11490df3 --- .../phonelookup/cequint/CequintPhoneLookup.java | 90 ++++++++++++++++++++-- 1 file changed, 82 insertions(+), 8 deletions(-) (limited to 'java/com/android/dialer/phonelookup/cequint') diff --git a/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java b/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java index ce2cd18ad..36d0be40f 100644 --- a/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java +++ b/java/com/android/dialer/phonelookup/cequint/CequintPhoneLookup.java @@ -18,33 +18,85 @@ package com.android.dialer.phonelookup.cequint; import android.content.Context; import android.telecom.Call; +import android.text.TextUtils; import com.android.dialer.DialerPhoneNumber; +import com.android.dialer.common.Assert; +import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor; +import com.android.dialer.common.concurrent.Annotations.LightweightExecutor; +import com.android.dialer.inject.ApplicationContext; +import com.android.dialer.location.GeoUtil; +import com.android.dialer.oem.CequintCallerIdManager; +import com.android.dialer.oem.CequintCallerIdManager.CequintCallerIdContact; import com.android.dialer.phonelookup.PhoneLookup; import com.android.dialer.phonelookup.PhoneLookupInfo; import com.android.dialer.phonelookup.PhoneLookupInfo.CequintInfo; +import com.android.dialer.phonenumberproto.DialerPhoneNumberUtil; +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 javax.inject.Inject; /** PhoneLookup implementation for Cequint. */ public class CequintPhoneLookup implements PhoneLookup { + private final Context appContext; + private final ListeningExecutorService backgroundExecutorService; + private final ListeningExecutorService lightweightExecutorService; + @Inject - CequintPhoneLookup() {} + CequintPhoneLookup( + @ApplicationContext Context appContext, + @BackgroundExecutor ListeningExecutorService backgroundExecutorService, + @LightweightExecutor ListeningExecutorService lightweightExecutorService) { + this.appContext = appContext; + this.backgroundExecutorService = backgroundExecutorService; + this.lightweightExecutorService = lightweightExecutorService; + } @Override public ListenableFuture lookup(Context appContext, Call call) { - // TODO(a bug): Override the default implementation in the PhoneLookup interface - // as a Cequint lookup requires info in the provided call. - return Futures.immediateFuture(CequintInfo.getDefaultInstance()); + if (!CequintCallerIdManager.isCequintCallerIdEnabled(appContext)) { + return Futures.immediateFuture(CequintInfo.getDefaultInstance()); + } + + ListenableFuture dialerPhoneNumberFuture = + backgroundExecutorService.submit( + () -> { + DialerPhoneNumberUtil dialerPhoneNumberUtil = new DialerPhoneNumberUtil(); + return dialerPhoneNumberUtil.parse( + TelecomCallUtil.getNumber(call), GeoUtil.getCurrentCountryIso(appContext)); + }); + String callerDisplayName = call.getDetails().getCallerDisplayName(); + boolean isIncomingCall = (call.getState() == Call.STATE_RINGING); + + return Futures.transformAsync( + dialerPhoneNumberFuture, + dialerPhoneNumber -> + backgroundExecutorService.submit( + () -> + buildCequintInfo( + CequintCallerIdManager.getCequintCallerIdContactForCall( + appContext, + Assert.isNotNull(dialerPhoneNumber).getNormalizedNumber(), + callerDisplayName, + isIncomingCall))), + lightweightExecutorService); } @Override public ListenableFuture lookup(DialerPhoneNumber dialerPhoneNumber) { - // TODO(a bug): Implement this method. - return Futures.immediateFuture(CequintInfo.getDefaultInstance()); + if (!CequintCallerIdManager.isCequintCallerIdEnabled(appContext)) { + return Futures.immediateFuture(CequintInfo.getDefaultInstance()); + } + + return backgroundExecutorService.submit( + () -> + buildCequintInfo( + CequintCallerIdManager.getCequintCallerIdContactForNumber( + appContext, dialerPhoneNumber.getNormalizedNumber()))); } @Override @@ -75,16 +127,38 @@ public class CequintPhoneLookup implements PhoneLookup { @Override public void registerContentObservers() { - // No content observers for Cequint info. + // No need to register a content observer as the Cequint content provider doesn't support batch + // queries. } @Override public void unregisterContentObservers() { - // No content observers for Cequint info. + // Nothing to be done as no content observer is registered. } @Override public ListenableFuture clearData() { return Futures.immediateFuture(null); } + + /** + * Builds a {@link CequintInfo} proto based on the given {@link CequintCallerIdContact} returned + * by {@link CequintCallerIdManager}. + */ + private static CequintInfo buildCequintInfo(CequintCallerIdContact cequintCallerIdContact) { + CequintInfo.Builder cequintInfoBuilder = CequintInfo.newBuilder(); + + // Every field in CequintCallerIdContact can be null. + if (!TextUtils.isEmpty(cequintCallerIdContact.name())) { + cequintInfoBuilder.setName(cequintCallerIdContact.name()); + } + if (!TextUtils.isEmpty(cequintCallerIdContact.geolocation())) { + cequintInfoBuilder.setGeolocation(cequintCallerIdContact.geolocation()); + } + if (!TextUtils.isEmpty(cequintCallerIdContact.photoUri())) { + cequintInfoBuilder.setPhotoUri(cequintCallerIdContact.photoUri()); + } + + return cequintInfoBuilder.build(); + } } -- cgit v1.2.3