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 c9fc4a7..871243c 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -478,7 +478,7 @@
                   !TextUtils.isEmpty(mPrimary.getLastForwardedNumber()),
                   shouldShowContactPhoto,
                   mPrimary.getConnectTimeMillis(),
-                  CallerInfoUtils.isVoiceMailNumber(mContext, mPrimary),
+                  mPrimary.isVoiceMailNumber(),
                   mPrimary.isRemotelyHeld(),
                   isBusiness,
                   supports2ndCallOnHold(),
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 6829203..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;
@@ -58,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;
@@ -158,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();
@@ -450,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();
@@ -475,6 +506,7 @@
     Trace.endSection();
   }
 
+  @SuppressWarnings("MissingPermission")
   private void updateFromTelecomCall() {
     Trace.beginSection("DialerCall.updateFromTelecomCall");
     LogUtil.v("DialerCall.updateFromTelecomCall", mTelecomCall.toString());
@@ -510,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();
@@ -517,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();
   }
 
@@ -1148,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();
         }
       }
@@ -1220,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/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))
