Merge changes I14a2c0b6,Ic67566c2,Id0ef9164,Iec48f030,Ibe1f9de6, ...
am: 5f57e30484

Change-Id: Iabe5ea0bad0851164161c3552ee5354789292e83
diff --git a/java/com/android/dialer/app/calllog/MissedCallNotifier.java b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
index 8a986dc..f50751e 100644
--- a/java/com/android/dialer/app/calllog/MissedCallNotifier.java
+++ b/java/com/android/dialer/app/calllog/MissedCallNotifier.java
@@ -260,9 +260,11 @@
       if (call.accountComponentName == null || call.accountId == null) {
         continue;
       }
-      PhoneAccountHandle phoneAccountHandle =
-          new PhoneAccountHandle(
-              ComponentName.unflattenFromString(call.accountComponentName), call.accountId);
+      ComponentName componentName = ComponentName.unflattenFromString(call.accountComponentName);
+      if (componentName == null) {
+        continue;
+      }
+      PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, call.accountId);
       PhoneAccount phoneAccount = telecomManager.getPhoneAccount(phoneAccountHandle);
       if (phoneAccount == null) {
         continue;
diff --git a/java/com/android/dialer/app/res/layout/search_edittext.xml b/java/com/android/dialer/app/res/layout/search_edittext.xml
index 63786df..5fc492d 100644
--- a/java/com/android/dialer/app/res/layout/search_edittext.xml
+++ b/java/com/android/dialer/app/res/layout/search_edittext.xml
@@ -39,6 +39,7 @@
       android:layout_width="@dimen/search_box_icon_size"
       android:layout_height="@dimen/search_box_icon_size"
       android:layout_marginStart="8dp"
+      android:layout_centerVertical="true"
       android:importantForAccessibility="no"
       android:scaleType="center"
       android:src="@drawable/quantum_ic_search_vd_theme_24"
diff --git a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
index 74ddff2..0a6f2c1 100644
--- a/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
+++ b/java/com/android/dialer/app/voicemail/LegacyVoicemailNotificationReceiver.java
@@ -32,6 +32,7 @@
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.PerAccountSharedPreferences;
+import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.util.DialerUtils;
 import com.android.voicemail.VoicemailClient;
 import com.android.voicemail.VoicemailComponent;
@@ -44,16 +45,8 @@
 @TargetApi(VERSION_CODES.O)
 public class LegacyVoicemailNotificationReceiver extends BroadcastReceiver {
 
-  private static final String LEGACY_VOICEMAIL_COUNT = "legacy_voicemail_count";
   @VisibleForTesting static final String LEGACY_VOICEMAIL_DISMISSED = "legacy_voicemail_dismissed";
 
-  /**
-   * Whether the notification is just a refresh or for a new voicemail. The phone should not play a
-   * ringtone or vibrate during a refresh if the notification is already showing. This is Hidden in
-   * O and public in O MR1.
-   */
-  @VisibleForTesting static final String EXTRA_IS_REFRESH = "is_refresh";
-
   @Override
   public void onReceive(Context context, Intent intent) {
 
@@ -79,7 +72,8 @@
     PhoneAccountHandle phoneAccountHandle =
         Assert.isNotNull(intent.getParcelableExtra(TelephonyManager.EXTRA_PHONE_ACCOUNT_HANDLE));
     int count = intent.getIntExtra(TelephonyManager.EXTRA_NOTIFICATION_COUNT, -1);
-    boolean isRefresh = intent.getBooleanExtra(EXTRA_IS_REFRESH, false);
+
+    boolean isRefresh = intent.getBooleanExtra(TelephonyManagerCompat.EXTRA_IS_REFRESH, false);
     LogUtil.i("LegacyVoicemailNotificationReceiver.onReceive", "isRefresh: " + isRefresh);
     PerAccountSharedPreferences preferences = getSharedPreferences(context, phoneAccountHandle);
     if (isRefresh) {
@@ -93,13 +87,6 @@
       setDismissed(context, phoneAccountHandle, false);
     }
 
-    if (!hasVoicemailCountChanged(preferences, count)) {
-      LogUtil.i(
-          "LegacyVoicemailNotificationReceiver.onReceive",
-          "voicemail count hasn't changed, ignoring");
-      return;
-    }
-
     if (count == -1) {
       // Carrier might not send voicemail count. Missing extra means there are unknown numbers of
       // voicemails (One or more). Treat it as 1 so the generic version will be shown. ("Voicemail"
@@ -149,21 +136,6 @@
         .apply();
   }
 
-  private static boolean hasVoicemailCountChanged(
-      PerAccountSharedPreferences preferences, int newCount) {
-    if (newCount == -1) {
-      // Carrier does not report voicemail count
-      return true;
-    }
-
-    // Carriers may send multiple notifications for the same voicemail.
-    if (newCount != 0 && newCount == preferences.getInt(LEGACY_VOICEMAIL_COUNT, -1)) {
-      return false;
-    }
-    preferences.edit().putInt(LEGACY_VOICEMAIL_COUNT, newCount).apply();
-    return true;
-  }
-
   @VisibleForTesting
   static PerAccountSharedPreferences getSharedPreferences(
       Context context, PhoneAccountHandle phoneAccountHandle) {
diff --git a/java/com/android/dialer/app/widget/SearchEditTextLayout.java b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
index 95bd12a..9da0e24 100644
--- a/java/com/android/dialer/app/widget/SearchEditTextLayout.java
+++ b/java/com/android/dialer/app/widget/SearchEditTextLayout.java
@@ -274,7 +274,6 @@
     mCollapsedSearchBox.setVisibility(collapsedViewVisibility);
     mVoiceSearchButtonView.setVisibility(collapsedViewVisibility);
     mOverflowButtonView.setVisibility(collapsedViewVisibility);
-    mBackButtonView.setVisibility(expandedViewVisibility);
     // TODO: Prevents keyboard from jumping up in landscape mode after exiting the
     // SearchFragment when the query string is empty. More elegant fix?
     //mExpandedSearchBox.setVisibility(expandedViewVisibility);
diff --git a/java/com/android/dialer/assisteddialing/TransformationInfo.java b/java/com/android/dialer/assisteddialing/TransformationInfo.java
index 03e565c..de8f27d 100644
--- a/java/com/android/dialer/assisteddialing/TransformationInfo.java
+++ b/java/com/android/dialer/assisteddialing/TransformationInfo.java
@@ -57,19 +57,20 @@
     return new AutoValue_TransformationInfo.Builder();
   }
 
+  /** A builder for TransformationInfo. */
   @AutoValue.Builder
-  abstract static class Builder {
-    abstract Builder setOriginalNumber(String value);
+  public abstract static class Builder {
+    public abstract Builder setOriginalNumber(String value);
 
-    abstract Builder setTransformedNumber(String value);
+    public abstract Builder setTransformedNumber(String value);
 
-    abstract Builder setUserHomeCountryCode(String value);
+    public abstract Builder setUserHomeCountryCode(String value);
 
-    abstract Builder setUserRoamingCountryCode(String value);
+    public abstract Builder setUserRoamingCountryCode(String value);
 
-    abstract Builder setTransformedNumberCountryCallingCode(int value);
+    public abstract Builder setTransformedNumberCountryCallingCode(int value);
 
-    abstract TransformationInfo build();
+    public abstract TransformationInfo build();
   }
 
   public static TransformationInfo newInstanceFromBundle(@NonNull Bundle transformationInfoBundle) {
diff --git a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
index 61c44b9..fbc7899 100644
--- a/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
+++ b/java/com/android/dialer/compat/telephony/TelephonyManagerCompat.java
@@ -73,6 +73,9 @@
   public static final String ASSISTED_DIALING_EXTRAS =
       "android.telecom.extra.ASSISTED_DIALING_EXTRAS";
 
+  public static final String EXTRA_IS_REFRESH =
+      BuildCompat.isAtLeastOMR1() ? "android.telephony.extra.IS_REFRESH" : "is_refresh";
+
   /**
    * Returns the number of phones available. Returns 1 for Single standby mode (Single SIM
    * functionality) Returns 2 for Dual standby mode.(Dual SIM functionality)
diff --git a/java/com/android/dialer/location/GeoUtil.java b/java/com/android/dialer/location/GeoUtil.java
index b39256d..27fbf23 100644
--- a/java/com/android/dialer/location/GeoUtil.java
+++ b/java/com/android/dialer/location/GeoUtil.java
@@ -17,6 +17,7 @@
 package com.android.dialer.location;
 
 import android.content.Context;
+import android.os.Trace;
 
 /** Static methods related to Geo. */
 public class GeoUtil {
@@ -24,6 +25,9 @@
   /** @return the ISO 3166-1 two letters country code of the country the user is in. */
   public static String getCurrentCountryIso(Context context) {
     // The {@link CountryDetector} should never return null so this is safe to return as-is.
-    return CountryDetector.getInstance(context).getCurrentCountryIso();
+    Trace.beginSection("GeoUtil.getCurrentCountryIso");
+    String countryIso = CountryDetector.getInstance(context).getCurrentCountryIso();
+    Trace.endSection();
+    return countryIso;
   }
 }
diff --git a/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java b/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
index b25e4d7..cc9b730 100644
--- a/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
+++ b/java/com/android/dialer/phonenumberutil/PhoneNumberHelper.java
@@ -17,6 +17,7 @@
 package com.android.dialer.phonenumberutil;
 
 import android.content.Context;
+import android.os.Trace;
 import android.provider.CallLog;
 import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
@@ -113,6 +114,7 @@
    */
   public static String getCurrentCountryIso(
       Context context, @Nullable PhoneAccountHandle phoneAccountHandle) {
+    Trace.beginSection("PhoneNumberHelper.getCurrentCountryIso");
     // Without framework function calls, this seems to be the most accurate location service
     // we can rely on.
     String countryIso =
@@ -125,6 +127,7 @@
           "No CountryDetector; falling back to countryIso based on locale: " + countryIso);
     }
     countryIso = countryIso.toUpperCase();
+    Trace.endSection();
 
     return countryIso;
   }
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index b3fb97f..aa17dc4 100644
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -118,7 +118,7 @@
       // OUTGOING.  We may want to do that once we start showing "Voice mail" label on
       // the dialpad too.)
       if (oldState == InCallState.OUTGOING && mCall != null) {
-        if (CallerInfoUtils.isVoiceMailNumber(mContext, mCall) && getActivity() != null) {
+        if (mCall.isVoiceMailNumber() && getActivity() != null) {
           getActivity().showDialpadFragment(true /* show */, true /* animate */);
         }
       }
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index d49d556..871243c 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -478,13 +478,14 @@
                   !TextUtils.isEmpty(mPrimary.getLastForwardedNumber()),
                   shouldShowContactPhoto,
                   mPrimary.getConnectTimeMillis(),
-                  CallerInfoUtils.isVoiceMailNumber(mContext, mPrimary),
+                  mPrimary.isVoiceMailNumber(),
                   mPrimary.isRemotelyHeld(),
                   isBusiness,
                   supports2ndCallOnHold(),
                   getSwapToSecondaryButtonState(),
                   mPrimary.isAssistedDialed(),
-                  null));
+                  null,
+                  mPrimary.getAssistedDialingExtras()));
 
       InCallActivity activity =
           (InCallActivity) (mInCallScreen.getInCallScreenFragment().getActivity());
diff --git a/java/com/android/incallui/CallerInfoAsyncQuery.java b/java/com/android/incallui/CallerInfoAsyncQuery.java
index 09752c7..8fc9c4f 100644
--- a/java/com/android/incallui/CallerInfoAsyncQuery.java
+++ b/java/com/android/incallui/CallerInfoAsyncQuery.java
@@ -29,6 +29,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
+import android.os.Trace;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
 import android.support.annotation.MainThread;
@@ -191,9 +192,11 @@
       CallerInfo info,
       OnQueryCompleteListener listener,
       Object cookie) {
+    Trace.beginSection("CallerInfoAsyncQuery.startOtherDirectoriesQuery");
     long[] directoryIds = StrictModeUtils.bypass(() -> getDirectoryIds(context));
     int size = directoryIds.length;
     if (size == 0) {
+      Trace.endSection();
       return false;
     }
 
@@ -213,6 +216,7 @@
       OnQueryCompleteListener intermediateListener = listenerFactory.newListener(directoryId);
       startQueryInternal(token, context, info, intermediateListener, cookie, uri);
     }
+    Trace.endSection();
     return true;
   }
 
diff --git a/java/com/android/incallui/CallerInfoUtils.java b/java/com/android/incallui/CallerInfoUtils.java
index bf586f5..38043ed 100644
--- a/java/com/android/incallui/CallerInfoUtils.java
+++ b/java/com/android/incallui/CallerInfoUtils.java
@@ -16,15 +16,10 @@
 
 package com.android.incallui;
 
-import android.Manifest.permission;
 import android.content.Context;
 import android.content.Loader;
 import android.content.Loader.OnLoadCompleteListener;
-import android.content.pm.PackageManager;
 import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
-import android.telecom.PhoneAccount;
 import android.telecom.TelecomManager;
 import android.text.TextUtils;
 import com.android.contacts.common.model.Contact;
@@ -34,7 +29,6 @@
 import com.android.dialer.phonenumbercache.CachedNumberLookupService.CachedContactInfo;
 import com.android.dialer.phonenumbercache.ContactInfo;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
-import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.util.PermissionsUtil;
 import com.android.incallui.call.DialerCall;
 import java.util.Arrays;
@@ -112,7 +106,7 @@
     // Because the InCallUI is immediately launched before the call is connected, occasionally
     // a voicemail call will be passed to InCallUI as a "voicemail:" URI without a number.
     // This call should still be handled as a voicemail call.
-    if (isVoiceMailNumber(context, call)) {
+    if (call.isVoiceMailNumber()) {
       info.markAsVoiceMail(context);
     }
 
@@ -146,20 +140,6 @@
     return cacheInfo;
   }
 
-  public static boolean isVoiceMailNumber(Context context, @NonNull DialerCall call) {
-    if (call.getHandle() != null
-        && PhoneAccount.SCHEME_VOICEMAIL.equals(call.getHandle().getScheme())) {
-      return true;
-    }
-
-    if (ContextCompat.checkSelfPermission(context, permission.READ_PHONE_STATE)
-        != PackageManager.PERMISSION_GRANTED) {
-      return false;
-    }
-
-    return TelecomUtil.isVoicemailNumber(context, call.getAccountHandle(), call.getNumber());
-  }
-
   /**
    * Handles certain "corner cases" for CNAP. When we receive weird phone numbers from the network
    * to indicate different number presentations, convert them to expected number and presentation
diff --git a/java/com/android/incallui/ContactInfoCache.java b/java/com/android/incallui/ContactInfoCache.java
index 2a93945..2fb18b8 100644
--- a/java/com/android/incallui/ContactInfoCache.java
+++ b/java/com/android/incallui/ContactInfoCache.java
@@ -807,10 +807,12 @@
 
     @Override
     public void onQueryComplete(int token, Object cookie, CallerInfo callerInfo) {
+      Trace.beginSection("ContactInfoCache.FindInfoCallback.onQueryComplete");
       Assert.isMainThread();
       DialerCallCookieWrapper cw = (DialerCallCookieWrapper) cookie;
       String callId = cw.callId;
       if (!isWaitingForThisQuery(cw.callId, mQueryToken.mQueryId)) {
+        Trace.endSection();
         return;
       }
       ContactCacheEntry cacheEntry = mInfoMap.get(callId);
@@ -818,6 +820,7 @@
       if (cacheEntry == null) {
         Log.w(TAG, "Contact lookup done, but cache entry is not found.");
         clearCallbacks(callId);
+        Trace.endSection();
         return;
       }
       // Before issuing a request for more data from other services, we only check that the
@@ -842,6 +845,7 @@
         }
         clearCallbacks(callId);
       }
+      Trace.endSection();
     }
   }
 
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 2ba4d98..2e3d721 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -95,6 +95,7 @@
   private boolean touchDownWhenPseudoScreenOff;
   private boolean isInShowMainInCallFragment;
   private boolean needDismissPendingDialogs;
+  private boolean allowOrientationChange;
 
   public InCallActivity() {
     common = new InCallActivityCommon(this);
@@ -161,7 +162,9 @@
   protected void onStart() {
     Trace.beginSection("InCallActivity.onStart");
     LogUtil.i("InCallActivity.onStart", "");
+    Trace.beginSection("call super");
     super.onStart();
+    Trace.endSection();
     isVisible = true;
     showMainInCallFragment();
     common.onStart();
@@ -514,6 +517,10 @@
   }
 
   public void setAllowOrientationChange(boolean allowOrientationChange) {
+    if (this.allowOrientationChange == allowOrientationChange) {
+      return;
+    }
+    this.allowOrientationChange = allowOrientationChange;
     if (!allowOrientationChange) {
       setRequestedOrientation(InCallOrientationEventListener.ACTIVITY_PREFERENCE_DISALLOW_ROTATION);
     } else {
diff --git a/java/com/android/incallui/InCallActivityCommon.java b/java/com/android/incallui/InCallActivityCommon.java
index 9ccda32..0a7c268 100644
--- a/java/com/android/incallui/InCallActivityCommon.java
+++ b/java/com/android/incallui/InCallActivityCommon.java
@@ -29,6 +29,7 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.Trace;
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -257,6 +258,7 @@
   }
 
   public void onStart() {
+    Trace.beginSection("InCallActivityCommon.onStart");
     // setting activity should be last thing in setup process
     InCallPresenter.getInstance().setActivity(inCallActivity);
     enableInCallOrientationEventListener(
@@ -267,9 +269,11 @@
     if (!isRecreating) {
       InCallPresenter.getInstance().onUiShowing(true);
     }
+    Trace.endSection();
   }
 
   public void onResume() {
+    Trace.beginSection("InCallActivityCommon.onResume");
     if (InCallPresenter.getInstance().isReadyForTearDown()) {
       LogUtil.i(
           "InCallActivityCommon.onResume",
@@ -309,6 +313,7 @@
     CallList.getInstance()
         .onInCallUiShown(
             inCallActivity.getIntent().getBooleanExtra(INTENT_EXTRA_FOR_FULL_SCREEN, false));
+    Trace.endSection();
   }
 
   // onPause is guaranteed to be called when the InCallActivity goes
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index a0069a6..70fe88b 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -444,6 +444,7 @@
    * activity is provided, it means that the activity was finished and we should attempt to cleanup.
    */
   private void updateActivity(InCallActivity inCallActivity) {
+    Trace.beginSection("InCallPresenter.updateActivity");
     boolean updateListeners = false;
     boolean doAttemptCleanup = false;
 
@@ -475,6 +476,7 @@
       if (mInCallState == InCallState.NO_CALLS) {
         LogUtil.i("InCallPresenter.updateActivity", "UI Initialized, but no calls left. Shut down");
         attemptFinishActivity();
+        Trace.endSection();
         return;
       }
     } else {
@@ -510,6 +512,7 @@
     if (doAttemptCleanup) {
       attemptCleanup();
     }
+    Trace.endSection();
   }
 
   public void setManageConferenceActivity(
@@ -842,7 +845,7 @@
     if (!mCallList.hasLiveCall()
         && !call.getLogState().isIncoming
         && !isSecretCode(call.getNumber())
-        && !CallerInfoUtils.isVoiceMailNumber(mContext, call)) {
+        && !call.isVoiceMailNumber()) {
       PostCall.onCallDisconnected(mContext, call.getNumber(), call.getConnectTimeMillis());
     }
   }
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java
index a08ee0a..8570c58 100644
--- a/java/com/android/incallui/InCallServiceImpl.java
+++ b/java/com/android/incallui/InCallServiceImpl.java
@@ -41,7 +41,9 @@
 
   @Override
   public void onCallAudioStateChanged(CallAudioState audioState) {
+    Trace.beginSection("InCallServiceImpl.onCallAudioStateChanged");
     AudioModeProvider.getInstance().onAudioStateChanged(audioState);
+    Trace.endSection();
   }
 
   @Override
diff --git a/java/com/android/incallui/ProximitySensor.java b/java/com/android/incallui/ProximitySensor.java
index db538ab..339a2e9 100644
--- a/java/com/android/incallui/ProximitySensor.java
+++ b/java/com/android/incallui/ProximitySensor.java
@@ -20,6 +20,7 @@
 import android.hardware.display.DisplayManager;
 import android.hardware.display.DisplayManager.DisplayListener;
 import android.os.PowerManager;
+import android.os.Trace;
 import android.support.annotation.NonNull;
 import android.telecom.CallAudioState;
 import android.view.Display;
@@ -206,6 +207,7 @@
    * request for, or is in a video call; or the phone is horizontal while in a call.
    */
   private synchronized void updateProximitySensorMode() {
+    Trace.beginSection("ProximitySensor.updateProximitySensorMode");
     final int audioRoute = mAudioModeProvider.getAudioState().getRoute();
 
     boolean screenOnImmediately =
@@ -249,6 +251,7 @@
       // behavior in either case.
       turnOffProximitySensor(screenOnImmediately);
     }
+    Trace.endSection();
   }
 
   /**
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 7146c72..e5908f1 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -541,6 +541,18 @@
             || !Objects.equals(mRingtone, ringtone)
             || !Objects.equals(savedCallAudioState, callAudioState);
 
+    LogUtil.d(
+        "StatusBarNotifier.checkForChangeAndSaveData",
+        "data changed: icon: %b, content: %b, state: %b, largeIcon: %b, title: %b, ringtone: %b, "
+            + "audioState: %b, type: %b",
+        (mSavedIcon != icon),
+        !Objects.equals(mSavedContent, content),
+        (mCallState != state),
+        largeIconChanged,
+        contentTitleChanged,
+        !Objects.equals(mRingtone, ringtone),
+        !Objects.equals(savedCallAudioState, callAudioState),
+        mCurrentNotification != notificationType);
     // If we aren't showing a notification right now or the notification type is changing,
     // definitely do an update.
     if (mCurrentNotification != notificationType) {
@@ -614,7 +626,7 @@
       @ContactType
       int contactType =
           LetterTileDrawable.getContactTypeFromPrimitives(
-              CallerInfoUtils.isVoiceMailNumber(context, call),
+              call.isVoiceMailNumber(),
               call.isSpam(),
               contactInfo.isBusiness,
               call.getNumberPresentation(),
@@ -709,7 +721,7 @@
         resId = getECIncomingCallText(call.getEnrichedCallSession());
       } else if (call.hasProperty(Details.PROPERTY_WIFI)) {
         resId = R.string.notification_incoming_call_wifi_template;
-      } else if (call.getAccountHandle() != null && hasMultiplePhoneAccounts()) {
+      } else if (call.getAccountHandle() != null && hasMultiplePhoneAccounts(call)) {
         return getMultiSimIncomingText(call);
       } else if (call.isVideoCall()) {
         resId = R.string.notification_incoming_video_call;
@@ -1043,9 +1055,11 @@
     mStatusBarCallListener = listener;
   }
 
-  @SuppressWarnings("MissingPermission")
-  private boolean hasMultiplePhoneAccounts() {
-    return mContext.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts().size() > 1;
+  private boolean hasMultiplePhoneAccounts(DialerCall call) {
+    if (call.getCallCapableAccounts() == null) {
+      return false;
+    }
+    return call.getCallCapableAccounts().size() > 1;
   }
 
   @Override
diff --git a/java/com/android/incallui/answer/impl/AnswerFragment.java b/java/com/android/incallui/answer/impl/AnswerFragment.java
index 3476557..f0b0c0f 100644
--- a/java/com/android/incallui/answer/impl/AnswerFragment.java
+++ b/java/com/android/incallui/answer/impl/AnswerFragment.java
@@ -744,6 +744,7 @@
 
   @Override
   public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
+    Trace.beginSection("AnswerFragment.onViewCreated");
     super.onViewCreated(view, savedInstanceState);
     createInCallScreenDelegate();
     updateUI();
@@ -751,18 +752,22 @@
     if (savedInstanceState == null || !savedInstanceState.getBoolean(STATE_HAS_ANIMATED_ENTRY)) {
       ViewUtil.doOnGlobalLayout(view, this::animateEntry);
     }
+    Trace.endSection();
   }
 
   @Override
   public void onResume() {
+    Trace.beginSection("AnswerFragment.onResume");
     super.onResume();
     LogUtil.i("AnswerFragment.onResume", null);
     restoreSwipeHintTexts();
     inCallScreenDelegate.onInCallScreenResumed();
+    Trace.endSection();
   }
 
   @Override
   public void onStart() {
+    Trace.beginSection("AnswerFragment.onStart");
     super.onStart();
     LogUtil.i("AnswerFragment.onStart", null);
 
@@ -770,10 +775,12 @@
     if (answerVideoCallScreen != null) {
       answerVideoCallScreen.onVideoScreenStart();
     }
+    Trace.endSection();
   }
 
   @Override
   public void onStop() {
+    Trace.beginSection("AnswerFragment.onStop");
     super.onStop();
     LogUtil.i("AnswerFragment.onStop", null);
 
@@ -781,13 +788,16 @@
     if (answerVideoCallScreen != null) {
       answerVideoCallScreen.onVideoScreenStop();
     }
+    Trace.endSection();
   }
 
   @Override
   public void onPause() {
+    Trace.beginSection("AnswerFragment.onPause");
     super.onPause();
     LogUtil.i("AnswerFragment.onPause", null);
     inCallScreenDelegate.onInCallScreenPaused();
+    Trace.endSection();
   }
 
   @Override
diff --git a/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java b/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
index 5c1ee47..ea5956c 100644
--- a/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
+++ b/java/com/android/incallui/answer/impl/answermethod/FlingUpDownMethod.java
@@ -28,6 +28,7 @@
 import android.graphics.PorterDuff.Mode;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.os.Trace;
 import android.support.annotation.ColorInt;
 import android.support.annotation.FloatRange;
 import android.support.annotation.IntDef;
@@ -157,6 +158,7 @@
 
   @Override
   public void onStart() {
+    Trace.beginSection("FlingUpDownMethod.onStart");
     super.onStart();
     falsingManager.onScreenOn();
     if (getView() != null) {
@@ -170,22 +172,26 @@
         startSwipeToAnswerEntryAnimation();
       }
     }
+    Trace.endSection();
   }
 
   @Override
   public void onStop() {
+    Trace.beginSection("FlingUpDownMethod.onStop");
     endAnimation();
     falsingManager.onScreenOff();
     if (getActivity().isFinishing()) {
       setAnimationState(AnimationState.COMPLETED);
     }
     super.onStop();
+    Trace.endSection();
   }
 
   @Nullable
   @Override
   public View onCreateView(
       LayoutInflater layoutInflater, @Nullable ViewGroup viewGroup, @Nullable Bundle bundle) {
+    Trace.beginSection("FlingUpDownMethod.onCreateView");
     View view = layoutInflater.inflate(R.layout.swipe_up_down_method, viewGroup, false);
 
     contactPuckContainer = view.findViewById(R.id.incoming_call_puck_container);
@@ -242,6 +248,7 @@
         (ViewGroup) view.findViewById(R.id.hint_container),
         contactPuckContainer,
         swipeToAnswerText);
+    Trace.endSection();
     return view;
   }
 
@@ -400,6 +407,7 @@
   }
 
   private void updateSwipeTextAndPuckForTouch() {
+    Trace.beginSection("FlingUpDownMethod.updateSwipeTextAndPuckForTouch");
     // Clamp progress value between -1 and 1.
     final float clampedProgress = MathUtil.clamp(swipeProgress, -1 /* min */, 1 /* max */);
     final float positiveAdjustedProgress = Math.abs(clampedProgress);
@@ -473,6 +481,7 @@
     }
 
     getParent().onAnswerProgressUpdate(clampedProgress);
+    Trace.endSection();
   }
 
   private void startSwipeToAnswerSwipeAnimation() {
diff --git a/java/com/android/incallui/answer/impl/classifier/FalsingManager.java b/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
index fdcc0a3..9cdd888 100644
--- a/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
+++ b/java/com/android/incallui/answer/impl/classifier/FalsingManager.java
@@ -22,6 +22,7 @@
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
 import android.os.PowerManager;
+import android.os.Trace;
 import android.view.MotionEvent;
 import android.view.accessibility.AccessibilityManager;
 
@@ -130,11 +131,17 @@
   }
 
   private void registerSensors(int[] sensors) {
+    Trace.beginSection("FalsingManager.registerSensors");
     for (int sensorType : sensors) {
+      Trace.beginSection("get sensor " + sensorType);
       Sensor s = mSensorManager.getDefaultSensor(sensorType);
+      Trace.endSection();
       if (s != null) {
+        Trace.beginSection("register");
         mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME);
+        Trace.endSection();
       }
     }
+    Trace.endSection();
   }
 }
diff --git a/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java b/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java
index 16fad8b..113144b 100644
--- a/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java
+++ b/java/com/android/incallui/answerproximitysensor/AnswerProximitySensor.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.hardware.display.DisplayManager;
 import android.os.PowerManager;
+import android.os.Trace;
 import android.view.Display;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderBindings;
@@ -43,16 +44,19 @@
   private final AnswerProximityWakeLock answerProximityWakeLock;
 
   public static boolean shouldUse(Context context, DialerCall call) {
+    Trace.beginSection("AnswerProximitySensor.shouldUse");
     // Don't use the AnswerProximitySensor for call waiting and other states. Those states are
     // handled by the general ProximitySensor code.
     if (call.getState() != State.INCOMING) {
       LogUtil.i("AnswerProximitySensor.shouldUse", "call state is not incoming");
+      Trace.endSection();
       return false;
     }
 
     if (!ConfigProviderBindings.get(context)
         .getBoolean(CONFIG_ANSWER_PROXIMITY_SENSOR_ENABLED, true)) {
       LogUtil.i("AnswerProximitySensor.shouldUse", "disabled by config");
+      Trace.endSection();
       return false;
     }
 
@@ -60,19 +64,23 @@
         .getSystemService(PowerManager.class)
         .isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
       LogUtil.i("AnswerProximitySensor.shouldUse", "wake lock level not supported");
+      Trace.endSection();
       return false;
     }
 
     if (isDefaultDisplayOn(context)) {
       LogUtil.i("AnswerProximitySensor.shouldUse", "display is already on");
+      Trace.endSection();
       return false;
     }
 
+    Trace.endSection();
     return true;
   }
 
   public AnswerProximitySensor(
       Context context, DialerCall call, PseudoScreenState pseudoScreenState) {
+    Trace.beginSection("AnswerProximitySensor Constructor");
     this.call = call;
 
     LogUtil.i("AnswerProximitySensor.constructor", "acquiring lock");
@@ -90,11 +98,14 @@
     answerProximityWakeLock.acquire();
 
     call.addListener(this);
+    Trace.endSection();
   }
 
   private void cleanup() {
+    Trace.beginSection("AnswerProximitySensor.Cleanup");
     call.removeListener(this);
     releaseProximityWakeLock();
+    Trace.endSection();
   }
 
   private void releaseProximityWakeLock() {
diff --git a/java/com/android/incallui/call/CallList.java b/java/com/android/incallui/call/CallList.java
index 8d66206..7c35e4b 100644
--- a/java/com/android/incallui/call/CallList.java
+++ b/java/com/android/incallui/call/CallList.java
@@ -34,7 +34,6 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.enrichedcall.EnrichedCallManager;
-import com.android.dialer.location.GeoUtil;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.shortcuts.ShortcutUsageReporter;
@@ -139,7 +138,7 @@
       Spam.get(context)
           .checkSpamStatus(
               number,
-              null,
+              call.getCountryIso(),
               new SpamBindings.Listener() {
                 @Override
                 public void onComplete(boolean isSpam) {
@@ -196,7 +195,7 @@
           }
         },
         call.getNumber(),
-        GeoUtil.getCurrentCountryIso(context));
+        call.getCountryIso());
     Trace.endSection();
 
     if (call.getState() == DialerCall.State.INCOMING
@@ -257,7 +256,7 @@
     Spam.get(context)
         .checkUserMarkedNonSpamStatus(
             number,
-            null,
+            call.getCountryIso(),
             new SpamBindings.Listener() {
               @Override
               public void onComplete(boolean isInUserWhiteList) {
@@ -268,7 +267,7 @@
     Spam.get(context)
         .checkGlobalSpamListStatus(
             number,
-            null,
+            call.getCountryIso(),
             new SpamBindings.Listener() {
               @Override
               public void onComplete(boolean isInGlobalSpamList) {
@@ -279,7 +278,7 @@
     Spam.get(context)
         .checkUserMarkedSpamStatus(
             number,
-            null,
+            call.getCountryIso(),
             new SpamBindings.Listener() {
               @Override
               public void onComplete(boolean isInUserSpamList) {
@@ -626,9 +625,11 @@
    * listeners to call back to determine what changed.
    */
   private void notifyGenericListeners() {
+    Trace.beginSection("CallList.notifyGenericListeners");
     for (Listener listener : mListeners) {
       listener.onCallListChange(this);
     }
+    Trace.endSection();
   }
 
   private void notifyListenersOfDisconnect(DialerCall call) {
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 2511bb8..47a4a70 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -16,6 +16,7 @@
 
 package com.android.incallui.call;
 
+import android.Manifest.permission;
 import android.content.Context;
 import android.hardware.camera2.CameraCharacteristics;
 import android.net.Uri;
@@ -42,6 +43,7 @@
 import android.text.TextUtils;
 import com.android.contacts.common.compat.CallCompat;
 import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.dialer.assisteddialing.TransformationInfo;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentParser;
 import com.android.dialer.callintent.CallSpecificAppData;
@@ -57,11 +59,14 @@
 import com.android.dialer.enrichedcall.EnrichedCallManager.StateChangedListener;
 import com.android.dialer.enrichedcall.Session;
 import com.android.dialer.lightbringer.LightbringerComponent;
+import com.android.dialer.location.GeoUtil;
 import com.android.dialer.logging.ContactLookupResult;
 import com.android.dialer.logging.ContactLookupResult.Type;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
+import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.theme.R;
+import com.android.dialer.util.PermissionsUtil;
 import com.android.incallui.audiomode.AudioModeProvider;
 import com.android.incallui.latencyreport.LatencyReport;
 import com.android.incallui.util.TelecomCallUtil;
@@ -157,6 +162,9 @@
 
   private com.android.dialer.logging.VideoTech.Type selectedAvailableVideoTechType =
       com.android.dialer.logging.VideoTech.Type.NONE;
+  private boolean isVoicemailNumber;
+  private List<PhoneAccountHandle> callCapableAccounts;
+  private String countryIso;
 
   public static String getNumberFromHandle(Uri handle) {
     return handle == null ? "" : handle.getSchemeSpecificPart();
@@ -449,6 +457,30 @@
     return mLogState.conferencedCalls != 0;
   }
 
+  public boolean isVoiceMailNumber() {
+    return isVoicemailNumber;
+  }
+
+  public List<PhoneAccountHandle> getCallCapableAccounts() {
+    return callCapableAccounts;
+  }
+
+  public String getCountryIso() {
+    return countryIso;
+  }
+
+  private void updateIsVoiceMailNumber() {
+    if (getHandle() != null && PhoneAccount.SCHEME_VOICEMAIL.equals(getHandle().getScheme())) {
+      isVoicemailNumber = true;
+    }
+
+    if (!PermissionsUtil.hasPermission(mContext, permission.READ_PHONE_STATE)) {
+      isVoicemailNumber = false;
+    }
+
+    isVoicemailNumber = TelecomUtil.isVoicemailNumber(mContext, getAccountHandle(), getNumber());
+  }
+
   private void update() {
     Trace.beginSection("DialerCall.update");
     int oldState = getState();
@@ -474,6 +506,7 @@
     Trace.endSection();
   }
 
+  @SuppressWarnings("MissingPermission")
   private void updateFromTelecomCall() {
     Trace.beginSection("DialerCall.updateFromTelecomCall");
     LogUtil.v("DialerCall.updateFromTelecomCall", mTelecomCall.toString());
@@ -509,6 +542,7 @@
       updateEmergencyCallState();
     }
 
+    TelecomManager telecomManager = mContext.getSystemService(TelecomManager.class);
     // If the phone account handle of the call is set, cache capability bit indicating whether
     // the phone account supports call subjects.
     PhoneAccountHandle newPhoneAccountHandle = mTelecomCall.getDetails().getAccountHandle();
@@ -516,14 +550,18 @@
       mPhoneAccountHandle = newPhoneAccountHandle;
 
       if (mPhoneAccountHandle != null) {
-        PhoneAccount phoneAccount =
-            mContext.getSystemService(TelecomManager.class).getPhoneAccount(mPhoneAccountHandle);
+        PhoneAccount phoneAccount = telecomManager.getPhoneAccount(mPhoneAccountHandle);
         if (phoneAccount != null) {
           mIsCallSubjectSupported =
               phoneAccount.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT);
         }
       }
     }
+    if (PermissionsUtil.hasPermission(mContext, permission.READ_PHONE_STATE)) {
+      updateIsVoiceMailNumber();
+      callCapableAccounts = telecomManager.getCallCapablePhoneAccounts();
+      countryIso = GeoUtil.getCurrentCountryIso(mContext);
+    }
     Trace.endSection();
   }
 
@@ -856,7 +894,7 @@
   }
 
   public boolean isVideoCall() {
-    return getVideoTech().isTransmittingOrReceiving();
+    return getVideoTech().isTransmittingOrReceiving() || VideoProfile.isVideo(getVideoState());
   }
 
   public boolean hasReceivedVideoUpgradeRequest() {
@@ -1036,6 +1074,14 @@
     return false;
   }
 
+  public TransformationInfo getAssistedDialingExtras() {
+    if (isAssistedDialed()) {
+      return TransformationInfo.newInstanceFromBundle(
+          getIntentExtras().getBundle(TelephonyManagerCompat.ASSISTED_DIALING_EXTRAS));
+    }
+    return null;
+  }
+
   public LatencyReport getLatencyReport() {
     return mLatencyReport;
   }
@@ -1139,9 +1185,7 @@
     if (callProviderLabel == null) {
       PhoneAccount account = getPhoneAccount();
       if (account != null && !TextUtils.isEmpty(account.getLabel())) {
-        List<PhoneAccountHandle> accounts =
-            mContext.getSystemService(TelecomManager.class).getCallCapablePhoneAccounts();
-        if (accounts != null && accounts.size() > 1) {
+        if (callCapableAccounts != null && callCapableAccounts.size() > 1) {
           callProviderLabel = account.getLabel().toString();
         }
       }
@@ -1211,9 +1255,11 @@
 
   @Override
   public void onSessionModificationStateChanged() {
+    Trace.beginSection("DialerCall.onSessionModificationStateChanged");
     for (DialerCallListener listener : mListeners) {
       listener.onDialerCallSessionModificationStateChange();
     }
+    Trace.endSection();
   }
 
   @Override
diff --git a/java/com/android/incallui/contactgrid/BottomRow.java b/java/com/android/incallui/contactgrid/BottomRow.java
index 91f08ef..a0d1185 100644
--- a/java/com/android/incallui/contactgrid/BottomRow.java
+++ b/java/com/android/incallui/contactgrid/BottomRow.java
@@ -49,7 +49,6 @@
     public final boolean isForwardIconVisible;
     public final boolean isSpamIconVisible;
     public final boolean shouldPopulateAccessibilityEvent;
-    public final boolean isAssistedDialedVisisble;
 
     public Info(
         @Nullable CharSequence label,
@@ -59,8 +58,7 @@
         boolean isHdIconVisible,
         boolean isForwardIconVisible,
         boolean isSpamIconVisible,
-        boolean shouldPopulateAccessibilityEvent,
-        boolean isAssistedDialedVisisble) {
+        boolean shouldPopulateAccessibilityEvent) {
       this.label = label;
       this.isTimerVisible = isTimerVisible;
       this.isWorkIconVisible = isWorkIconVisible;
@@ -69,7 +67,6 @@
       this.isForwardIconVisible = isForwardIconVisible;
       this.isSpamIconVisible = isSpamIconVisible;
       this.shouldPopulateAccessibilityEvent = shouldPopulateAccessibilityEvent;
-      this.isAssistedDialedVisisble = isAssistedDialedVisisble;
     }
   }
 
@@ -84,7 +81,6 @@
     boolean isHdAttemptingIconVisible = state.isHdAttempting;
     boolean isSpamIconVisible = false;
     boolean shouldPopulateAccessibilityEvent = true;
-    boolean isAssistedDialedVisisble = state.isAssistedDialed;
 
     if (isIncoming(state) && primaryInfo.isSpam) {
       label = context.getString(R.string.contact_grid_incoming_suspected_spam);
@@ -118,8 +114,7 @@
         isHdIconVisible,
         isForwardIconVisible,
         isSpamIconVisible,
-        shouldPopulateAccessibilityEvent,
-        isAssistedDialedVisisble);
+        shouldPopulateAccessibilityEvent);
   }
 
   private static CharSequence getLabelForPhoneNumber(PrimaryInfo primaryInfo) {
diff --git a/java/com/android/incallui/contactgrid/ContactGridManager.java b/java/com/android/incallui/contactgrid/ContactGridManager.java
index c0ab960..8deee82 100644
--- a/java/com/android/incallui/contactgrid/ContactGridManager.java
+++ b/java/com/android/incallui/contactgrid/ContactGridManager.java
@@ -61,7 +61,7 @@
   @Nullable private ImageView avatarImageView;
 
   // Row 2: Mobile +1 (650) 253-0000
-  // Row 2: [HD attempting icon]/[HD icon] [Assisted Dialing Icon] 00:15
+  // Row 2: [HD attempting icon]/[HD icon] 00:15
   // Row 2: Call ended
   // Row 2: Hanging up
   // Row 2: [Alert sign] Suspected spam caller
@@ -69,7 +69,6 @@
   private final ImageView workIconImageView;
   private final ImageView hdIconImageView;
   private final ImageView forwardIconImageView;
-  private final ImageView assistedDialingImageView;
   private final TextView forwardedNumberView;
   private final ImageView spamIconImageView;
   private final ViewAnimator bottomTextSwitcher;
@@ -101,7 +100,6 @@
     hdIconImageView = view.findViewById(R.id.contactgrid_hdIcon);
     forwardIconImageView = view.findViewById(R.id.contactgrid_forwardIcon);
     forwardedNumberView = view.findViewById(R.id.contactgrid_forwardNumber);
-    assistedDialingImageView = view.findViewById(R.id.contactgrid_assistedDialingIcon);
     spamIconImageView = view.findViewById(R.id.contactgrid_spamIcon);
     bottomTextSwitcher = view.findViewById(R.id.contactgrid_bottom_text_switcher);
     bottomTextView = view.findViewById(R.id.contactgrid_bottom_text);
@@ -321,8 +319,6 @@
     bottomTextView.setText(info.label);
     bottomTextView.setAllCaps(info.isSpamIconVisible);
     workIconImageView.setVisibility(info.isWorkIconVisible ? View.VISIBLE : View.GONE);
-    assistedDialingImageView.setVisibility(
-        info.isAssistedDialedVisisble ? View.VISIBLE : View.GONE);
     if (hdIconImageView.getVisibility() == View.GONE) {
       if (info.isHdAttemptingIconVisible) {
         hdIconImageView.setImageResource(R.drawable.asd_hd_icon);
diff --git a/java/com/android/incallui/contactgrid/TopRow.java b/java/com/android/incallui/contactgrid/TopRow.java
index 3593c99..cfa7e1b 100644
--- a/java/com/android/incallui/contactgrid/TopRow.java
+++ b/java/com/android/incallui/contactgrid/TopRow.java
@@ -173,6 +173,15 @@
           return context.getString(R.string.incall_video_call_requesting);
         }
       }
+
+      if (state.isAssistedDialed) {
+        String countryCode =
+            String.valueOf(state.assistedDialingExtras.transformedNumberCountryCallingCode());
+        return context.getString(
+            R.string.incall_connecting_assited_dialed,
+            countryCode,
+            state.assistedDialingExtras.userHomeCountryCode());
+      }
       return context.getString(R.string.incall_connecting);
     }
   }
diff --git a/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_bottom_row.xml b/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_bottom_row.xml
index c545c25..ce355ea 100644
--- a/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_bottom_row.xml
+++ b/java/com/android/incallui/contactgrid/res/layout/incall_contactgrid_bottom_row.xml
@@ -31,10 +31,6 @@
       style="@style/BottomRowIcon"
       android:visibility="gone"/>
   <ImageView
-      android:id="@+id/contactgrid_assistedDialingIcon"
-      style="@style/BottomRowIcon"
-      android:src="@drawable/quantum_ic_language_vd_theme_24"/>
-  <ImageView
       android:id="@id/contactgrid_forwardIcon"
       style="@style/BottomRowIcon"
       android:src="@drawable/quantum_ic_forward_vd_theme_24"/>
diff --git a/java/com/android/incallui/contactgrid/res/values/strings.xml b/java/com/android/incallui/contactgrid/res/values/strings.xml
index eba4abf..c6bdb11 100644
--- a/java/com/android/incallui/contactgrid/res/values/strings.xml
+++ b/java/com/android/incallui/contactgrid/res/values/strings.xml
@@ -24,6 +24,9 @@
        in the connecting stage. -->
   <string name="incall_connecting">Calling…</string>
 
+  <!-- Display information related to assisted dialing, for example Calling using +1 (US)… -->
+  <string name="incall_connecting_assited_dialed">Calling using +<xliff:g example="1" id="ad_country_code">%1$s</xliff:g> (<xliff:g example="1" id="ad_user_home_locale">%2$s</xliff:g>)\u2026</string>
+
   <!-- Displayed above the contact name when an external call is being pulled to the local
        device. -->
   <string name="incall_transferring">Transferring…</string>
diff --git a/java/com/android/incallui/incall/protocol/PrimaryCallState.java b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
index fe80276..4a50fbe 100644
--- a/java/com/android/incallui/incall/protocol/PrimaryCallState.java
+++ b/java/com/android/incallui/incall/protocol/PrimaryCallState.java
@@ -21,6 +21,7 @@
 import android.support.annotation.Nullable;
 import android.telecom.DisconnectCause;
 import android.text.TextUtils;
+import com.android.dialer.assisteddialing.TransformationInfo;
 import com.android.dialer.common.Assert;
 import com.android.incallui.call.DialerCall;
 import com.android.incallui.call.DialerCall.State;
@@ -68,6 +69,7 @@
   public final @ButtonState int swapToSecondaryButtonState;
   public final boolean isAssistedDialed;
   @Nullable public final String customLabel;
+  @Nullable public final TransformationInfo assistedDialingExtras;
 
   // TODO: Convert to autovalue. b/34502119
   public static PrimaryCallState createEmptyPrimaryCallState() {
@@ -100,7 +102,8 @@
         true /* supportsCallOnHold */,
         ButtonState.NOT_SUPPORT /* swapToSecondaryButtonState */,
         false /* isAssistedDialed */,
-        customLabel);
+        customLabel,
+        null /* assistedDialingExtras */);
   }
 
   public PrimaryCallState(
@@ -127,7 +130,8 @@
       boolean supportsCallOnHold,
       @ButtonState int swapToSecondaryButtonState,
       boolean isAssistedDialed,
-      @Nullable String customLabel) {
+      @Nullable String customLabel,
+      @Nullable TransformationInfo assistedDialingExtras) {
     this.state = state;
     this.isVideoCall = isVideoCall;
     this.sessionModificationState = sessionModificationState;
@@ -155,6 +159,7 @@
       Assert.checkArgument(state == State.CALL_PENDING);
     }
     this.customLabel = customLabel;
+    this.assistedDialingExtras = assistedDialingExtras;
   }
 
   @Override
diff --git a/java/com/android/incallui/spam/SpamCallListListener.java b/java/com/android/incallui/spam/SpamCallListListener.java
index 6b2bdce..cf545c0 100644
--- a/java/com/android/incallui/spam/SpamCallListListener.java
+++ b/java/com/android/incallui/spam/SpamCallListListener.java
@@ -150,7 +150,7 @@
     }
 
     NumberInCallHistoryWorker historyTask =
-        new NumberInCallHistoryWorker(context, number, GeoUtil.getCurrentCountryIso(context));
+        new NumberInCallHistoryWorker(context, number, call.getCountryIso());
     dialerExecutorFactory
         .createNonUiTaskBuilder(historyTask)
         .onSuccess((result) -> call.setCallHistoryStatus(result))