Merge changes I52729c45,Ia6cc29c4,I90da4789

* changes:
  Reduced jank when placing a call from search UI.
  Nearby places location permission request is now in a card view.
  Merge what's left in InCallActivityCommon into InCallActivity.
diff --git a/java/com/android/dialer/app/DialtactsActivity.java b/java/com/android/dialer/app/DialtactsActivity.java
index d9a63fa..755b335 100644
--- a/java/com/android/dialer/app/DialtactsActivity.java
+++ b/java/com/android/dialer/app/DialtactsActivity.java
@@ -907,8 +907,7 @@
 
   @Override
   public void onCallPlacedFromDialpad() {
-    hideDialpadFragment(false /* animate */, true /*clearDialpad */);
-    exitSearchUi();
+    mClearSearchOnPause = true;
   }
 
   @Override
@@ -1021,9 +1020,8 @@
   private void hideDialpadAndSearchUi() {
     if (mIsDialpadShown) {
       hideDialpadFragment(false, true);
-    } else {
-      exitSearchUi();
     }
+    exitSearchUi();
   }
 
   private void prepareVoiceSearchButton() {
@@ -1678,11 +1676,9 @@
   }
 
   @Override
-  public void onCallPlaced() {
-    if (mIsDialpadShown) {
-      hideDialpadFragment(false, true);
-    }
-    exitSearchUi();
+  public void onCallPlacedFromSearch() {
+    DialerUtils.hideInputMethod(mParentLayout);
+    mClearSearchOnPause = true;
   }
 
   protected int getPreviouslySelectedTabIndex() {
diff --git a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
index df27146..9a96b4a 100644
--- a/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
+++ b/java/com/android/dialer/searchfragment/list/NewSearchFragment.java
@@ -507,7 +507,7 @@
         new CallIntentBuilder(phoneNumber, callSpecificAppData)
             .setIsVideoCall(isVideoCall)
             .setAllowAssistedDial(allowAssistedDial));
-    FragmentUtils.getParentUnsafe(this, SearchFragmentListener.class).onCallPlaced();
+    FragmentUtils.getParentUnsafe(this, SearchFragmentListener.class).onCallPlacedFromSearch();
   }
 
   @Override
@@ -516,7 +516,7 @@
         .logImpression(DialerImpression.Type.LIGHTBRINGER_VIDEO_REQUESTED_FROM_SEARCH);
     Intent intent = DuoComponent.get(getContext()).getDuo().getIntent(getContext(), phoneNumber);
     getActivity().startActivityForResult(intent, ActivityRequestCodes.DIALTACTS_DUO);
-    FragmentUtils.getParentUnsafe(this, SearchFragmentListener.class).onCallPlaced();
+    FragmentUtils.getParentUnsafe(this, SearchFragmentListener.class).onCallPlacedFromSearch();
   }
 
   @Override
@@ -536,6 +536,6 @@
     boolean onSearchListTouch(MotionEvent event);
 
     /** Called when a call is placed from the search fragment. */
-    void onCallPlaced();
+    void onCallPlacedFromSearch();
   }
 }
diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml
index 66a3e0c..4373252 100644
--- a/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml
+++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/layout/location_permission_row.xml
@@ -14,53 +14,65 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
   -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<android.support.v7.widget.CardView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingStart="16dp"
-    android:paddingEnd="16dp"
-    android:paddingTop="16dp">
+    android:layout_marginStart="8dp"
+    android:layout_marginEnd="8dp"
+    android:layout_marginTop="8dp"
+    app:cardElevation="2dp">
 
-  <ImageView
-      android:id="@+id/permission_image"
-      android:layout_width="40dp"
-      android:layout_height="40dp"
-      android:layout_marginEnd="16dp"
-      android:src="@drawable/business_asset"/>
-
-  <TextView
-      android:id="@+id/permission_text"
-      android:layout_width="wrap_content"
+  <RelativeLayout
+      android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:layout_toEndOf="@id/permission_image"
-      android:minHeight="40dp"
-      android:text="@string/search_location_permission"
-      android:lineSpacingMultiplier="1.2"
-      android:textSize="16sp"
-      android:textColor="@color/dialer_secondary_text_color"/>
+      android:paddingStart="16dp"
+      android:paddingEnd="16dp"
+      android:paddingTop="16dp"
+      android:paddingBottom="12dp">
 
-  <Button
-      android:id="@+id/location_permission_allow"
-      android:layout_width="wrap_content"
-      android:layout_height="52dp"
-      android:layout_alignParentEnd="true"
-      android:layout_below="@id/permission_text"
-      android:layout_marginTop="16dp"
-      android:paddingTop="8dp"
-      android:paddingBottom="8dp"
-      android:text="@string/nearby_places_allow"/>
+    <ImageView
+        android:id="@+id/permission_image"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_marginEnd="16dp"
+        android:src="@drawable/business_asset"/>
 
-  <Button
-      android:id="@+id/location_permission_dismiss"
-      android:layout_width="wrap_content"
-      android:layout_height="52dp"
-      android:layout_toStartOf="@+id/location_permission_allow"
-      android:layout_below="@id/permission_text"
-      android:layout_marginEnd="8dp"
-      android:layout_marginTop="16dp"
-      android:paddingTop="8dp"
-      android:paddingBottom="8dp"
-      android:text="@string/nearby_places_dismiss"
-      android:textColor="@color/dialer_theme_color"
-      style="@style/Widget.AppCompat.Button.Borderless"/>
-</RelativeLayout>
+    <TextView
+        android:id="@+id/permission_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toEndOf="@id/permission_image"
+        android:minHeight="40dp"
+        android:text="@string/search_location_permission"
+        android:lineSpacingMultiplier="1.2"
+        android:textSize="16sp"
+        android:textColor="@color/dialer_secondary_text_color"/>
+
+    <Button
+        android:id="@+id/location_permission_allow"
+        android:layout_width="wrap_content"
+        android:layout_height="52dp"
+        android:layout_alignParentEnd="true"
+        android:layout_below="@id/permission_text"
+        android:layout_marginTop="18dp"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:text="@string/nearby_places_allow"/>
+
+    <Button
+        android:id="@+id/location_permission_dismiss"
+        android:layout_width="wrap_content"
+        android:layout_height="52dp"
+        android:layout_toStartOf="@+id/location_permission_allow"
+        android:layout_below="@id/permission_text"
+        android:layout_marginEnd="8dp"
+        android:layout_marginTop="18dp"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:text="@string/nearby_places_dismiss"
+        android:textColor="@color/dialer_theme_color"
+        style="@style/Widget.AppCompat.Button.Borderless"/>
+  </RelativeLayout>
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml b/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml
index 7fb38f6..f8f1071 100644
--- a/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml
+++ b/java/com/android/dialer/searchfragment/nearbyplaces/res/values/strings.xml
@@ -19,7 +19,7 @@
   <string name="nearby_places">Nearby places</string>
 
   <!-- Shown as a prompt to turn on location permissions and/or enable location to allow nearby places search [CHAR LIMIT=NONE]-->
-  <string name="search_location_permission">To get contact information for places near you, allow access to your location</string>
+  <string name="search_location_permission">To get contact information for places near you, allow access to your location.</string>
 
   <!-- Text on a button asking the user to grant the location permission -->
   <string name="nearby_places_allow">Allow</string>
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 1e5a5fc..28ff7da 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -16,42 +16,56 @@
 
 package com.android.incallui;
 
+import android.app.ActivityManager;
+import android.app.ActivityManager.AppTask;
 import android.app.ActivityManager.TaskDescription;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.KeyguardManager;
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
 import android.graphics.drawable.GradientDrawable;
 import android.graphics.drawable.GradientDrawable.Orientation;
 import android.os.Bundle;
 import android.os.Trace;
 import android.support.annotation.ColorInt;
 import android.support.annotation.FloatRange;
+import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.content.res.ResourcesCompat;
 import android.support.v4.graphics.ColorUtils;
+import android.telecom.CallAudioState;
+import android.telecom.PhoneAccountHandle;
 import android.telephony.TelephonyManager;
 import android.view.KeyEvent;
 import android.view.MenuItem;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
 import android.widget.CheckBox;
 import android.widget.Toast;
 import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
+import com.android.dialer.animation.AnimUtils;
+import com.android.dialer.animation.AnimationListenerAdapter;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.ThreadUtil;
 import com.android.dialer.compat.ActivityCompat;
+import com.android.dialer.compat.CompatUtils;
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.logging.LoggingBindings;
 import com.android.dialer.logging.ScreenEvent;
+import com.android.dialer.util.ViewUtil;
 import com.android.incallui.answer.bindings.AnswerBindings;
 import com.android.incallui.answer.protocol.AnswerScreen;
 import com.android.incallui.answer.protocol.AnswerScreenDelegate;
@@ -76,6 +90,11 @@
 import com.android.incallui.video.protocol.VideoCallScreen;
 import com.android.incallui.video.protocol.VideoCallScreenDelegate;
 import com.android.incallui.video.protocol.VideoCallScreenDelegateFactory;
+import com.google.common.base.Optional;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
 
 /** Version of {@link InCallActivity} that shows the new UI */
 public class InCallActivity extends TransactionSafeFragmentActivity
@@ -85,51 +104,60 @@
         VideoCallScreenDelegateFactory,
         PseudoScreenState.StateChangedListener {
 
-  public static final int PENDING_INTENT_REQUEST_CODE_NON_FULL_SCREEN = 0;
-  public static final int PENDING_INTENT_REQUEST_CODE_FULL_SCREEN = 1;
-  public static final int PENDING_INTENT_REQUEST_CODE_BUBBLE = 2;
+  @Retention(RetentionPolicy.SOURCE)
+  @IntDef({
+    DIALPAD_REQUEST_NONE,
+    DIALPAD_REQUEST_SHOW,
+    DIALPAD_REQUEST_HIDE,
+  })
+  @interface DialpadRequestType {}
 
-  private static final String DIALPAD_TEXT_KEY = "InCallActivity.dialpad_text";
+  private static final int DIALPAD_REQUEST_NONE = 1;
+  private static final int DIALPAD_REQUEST_SHOW = 2;
+  private static final int DIALPAD_REQUEST_HIDE = 3;
 
-  private static final String INTENT_EXTRA_SHOW_DIALPAD = "InCallActivity.show_dialpad";
+  private static Optional<Integer> audioRouteForTesting = Optional.absent();
 
-  private static final String TAG_ANSWER_SCREEN = "tag_answer_screen";
-  private static final String TAG_DIALPAD_FRAGMENT = "tag_dialpad_fragment";
-  private static final String TAG_INTERNATIONAL_CALL_ON_WIFI = "tag_international_call_on_wifi";
-  private static final String TAG_IN_CALL_SCREEN = "tag_in_call_screen";
-  private static final String TAG_VIDEO_CALL_SCREEN = "tag_video_call_screen";
+  private final InternationalCallOnWifiCallback internationalCallOnWifiCallback =
+      new InternationalCallOnWifiCallback();
+  private final SelectPhoneAccountListener selectPhoneAccountListener =
+      new SelectPhoneAccountListener();
 
-  private static final String DID_SHOW_ANSWER_SCREEN_KEY = "did_show_answer_screen";
-  private static final String DID_SHOW_IN_CALL_SCREEN_KEY = "did_show_in_call_screen";
-  private static final String DID_SHOW_VIDEO_CALL_SCREEN_KEY = "did_show_video_call_screen";
-
-  private static final String CONFIG_ANSWER_AND_RELEASE_ENABLED = "answer_and_release_enabled";
-
-  private final InCallActivityCommon common;
+  private Animation dialpadSlideInAnimation;
+  private Animation dialpadSlideOutAnimation;
+  private Dialog errorDialog;
+  private GradientDrawable backgroundDrawable;
   private InCallOrientationEventListener inCallOrientationEventListener;
+  private View pseudoBlackScreenOverlay;
+  private SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment;
+  private String dtmfTextToPrepopulate;
+  private String showPostCharWaitDialogCallId;
+  private String showPostCharWaitDialogChars;
+  private boolean allowOrientationChange;
+  private boolean animateDialpadOnShow;
   private boolean didShowAnswerScreen;
   private boolean didShowInCallScreen;
   private boolean didShowVideoCallScreen;
   private boolean dismissKeyguard;
-  private int[] backgroundDrawableColors;
-  private GradientDrawable backgroundDrawable;
-  private boolean isVisible;
-  private View pseudoBlackScreenOverlay;
-  private boolean touchDownWhenPseudoScreenOff;
   private boolean isInShowMainInCallFragment;
+  private boolean isRecreating; // whether the activity is going to be recreated
+  private boolean isVisible;
   private boolean needDismissPendingDialogs;
-  private boolean allowOrientationChange;
-
-  public InCallActivity() {
-    common = new InCallActivityCommon(this);
-  }
+  private boolean showPostCharWaitDialogOnResume;
+  private boolean touchDownWhenPseudoScreenOff;
+  private int[] backgroundDrawableColors;
+  @DialpadRequestType private int showDialpadRequest = DIALPAD_REQUEST_NONE;
 
   public static Intent getIntent(
       Context context, boolean showDialpad, boolean newOutgoingCall, boolean isForFullScreen) {
     Intent intent = new Intent(Intent.ACTION_MAIN, null);
     intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
     intent.setClass(context, InCallActivity.class);
-    InCallActivityCommon.setIntentExtras(intent, showDialpad, newOutgoingCall, isForFullScreen);
+    if (showDialpad) {
+      intent.putExtra(IntentExtraNames.SHOW_DIALPAD, true);
+    }
+    intent.putExtra(IntentExtraNames.NEW_OUTGOING_CALL, newOutgoingCall);
+    intent.putExtra(IntentExtraNames.FOR_FULL_SCREEN, isForFullScreen);
     return intent;
   }
 
@@ -142,23 +170,75 @@
   }
 
   @Override
-  protected void onCreate(Bundle icicle) {
+  protected void onCreate(Bundle bundle) {
     Trace.beginSection("InCallActivity.onCreate");
-    LogUtil.i("InCallActivity.onCreate", "");
-    super.onCreate(icicle);
+    super.onCreate(bundle);
 
     if (getIntent().getBooleanExtra(ReturnToCallController.RETURN_TO_CALL_EXTRA_KEY, false)) {
       Logger.get(this).logImpression(DialerImpression.Type.BUBBLE_PRIMARY_BUTTON_RETURN_TO_CALL);
       getIntent().removeExtra(ReturnToCallController.RETURN_TO_CALL_EXTRA_KEY);
     }
 
-    if (icicle != null) {
-      didShowAnswerScreen = icicle.getBoolean(DID_SHOW_ANSWER_SCREEN_KEY);
-      didShowInCallScreen = icicle.getBoolean(DID_SHOW_IN_CALL_SCREEN_KEY);
-      didShowVideoCallScreen = icicle.getBoolean(DID_SHOW_VIDEO_CALL_SCREEN_KEY);
+    if (bundle != null) {
+      didShowAnswerScreen = bundle.getBoolean(KeysForSavedInstance.DID_SHOW_ANSWER_SCREEN);
+      didShowInCallScreen = bundle.getBoolean(KeysForSavedInstance.DID_SHOW_IN_CALL_SCREEN);
+      didShowVideoCallScreen = bundle.getBoolean(KeysForSavedInstance.DID_SHOW_VIDEO_CALL_SCREEN);
     }
 
-    common.onCreate(icicle);
+    setWindowFlags();
+    setContentView(R.layout.incall_screen);
+    internalResolveIntent(getIntent());
+
+    boolean isLandscape =
+        getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
+    boolean isRtl = ViewUtil.isRtl();
+    if (isLandscape) {
+      dialpadSlideInAnimation =
+          AnimationUtils.loadAnimation(
+              this, isRtl ? R.anim.dialpad_slide_in_left : R.anim.dialpad_slide_in_right);
+      dialpadSlideOutAnimation =
+          AnimationUtils.loadAnimation(
+              this, isRtl ? R.anim.dialpad_slide_out_left : R.anim.dialpad_slide_out_right);
+    } else {
+      dialpadSlideInAnimation = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_in_bottom);
+      dialpadSlideOutAnimation =
+          AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_out_bottom);
+    }
+    dialpadSlideInAnimation.setInterpolator(AnimUtils.EASE_IN);
+    dialpadSlideOutAnimation.setInterpolator(AnimUtils.EASE_OUT);
+    dialpadSlideOutAnimation.setAnimationListener(
+        new AnimationListenerAdapter() {
+          @Override
+          public void onAnimationEnd(Animation animation) {
+            hideDialpadFragment();
+          }
+        });
+
+    if (bundle != null && showDialpadRequest == DIALPAD_REQUEST_NONE) {
+      // If the dialpad was shown before, set related variables so that it can be shown and
+      // populated with the previous DTMF text during onResume().
+      if (bundle.containsKey(IntentExtraNames.SHOW_DIALPAD)) {
+        boolean showDialpad = bundle.getBoolean(IntentExtraNames.SHOW_DIALPAD);
+        showDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_HIDE;
+        animateDialpadOnShow = false;
+      }
+      dtmfTextToPrepopulate = bundle.getString(KeysForSavedInstance.DIALPAD_TEXT);
+
+      SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment =
+          (SelectPhoneAccountDialogFragment)
+              getFragmentManager().findFragmentByTag(Tags.SELECT_ACCOUNT_FRAGMENT);
+      if (selectPhoneAccountDialogFragment != null) {
+        selectPhoneAccountDialogFragment.setListener(selectPhoneAccountListener);
+      }
+    }
+
+    InternationalCallOnWifiDialogFragment existingInternationalCallOnWifiDialogFragment =
+        (InternationalCallOnWifiDialogFragment)
+            getSupportFragmentManager().findFragmentByTag(Tags.INTERNATIONAL_CALL_ON_WIFI);
+    if (existingInternationalCallOnWifiDialogFragment != null) {
+      existingInternationalCallOnWifiDialogFragment.setCallback(internationalCallOnWifiCallback);
+    }
+
     inCallOrientationEventListener = new InCallOrientationEventListener(this);
 
     getWindow()
@@ -175,20 +255,138 @@
         .logStopLatencyTimer(LoggingBindings.ON_CALL_ADDED_TO_ON_INCALL_UI_SHOWN_OUTGOING);
   }
 
+  private void setWindowFlags() {
+    // Allow the activity to be shown when the screen is locked and filter out touch events that are
+    // "too fat".
+    int flags =
+        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+            | WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
+
+    // When the audio stream is not directed through Bluetooth, turn the screen on once the
+    // activity is shown.
+    final int audioRoute = getAudioRoute();
+    if (audioRoute != CallAudioState.ROUTE_BLUETOOTH) {
+      flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+    }
+
+    getWindow().addFlags(flags);
+  }
+
+  private static int getAudioRoute() {
+    if (audioRouteForTesting.isPresent()) {
+      return audioRouteForTesting.get();
+    }
+
+    return AudioModeProvider.getInstance().getAudioState().getRoute();
+  }
+
+  @VisibleForTesting(otherwise = VisibleForTesting.NONE)
+  public static void setAudioRouteForTesting(int audioRoute) {
+    audioRouteForTesting = Optional.of(audioRoute);
+  }
+
+  private void internalResolveIntent(Intent intent) {
+    if (!intent.getAction().equals(Intent.ACTION_MAIN)) {
+      return;
+    }
+
+    if (intent.hasExtra(IntentExtraNames.SHOW_DIALPAD)) {
+      // IntentExtraNames.SHOW_DIALPAD can be used to specify whether the DTMF dialpad should be
+      // initially visible.  If the extra is absent, leave the dialpad in its previous state.
+      boolean showDialpad = intent.getBooleanExtra(IntentExtraNames.SHOW_DIALPAD, false);
+      relaunchedFromDialer(showDialpad);
+    }
+
+    DialerCall outgoingCall = CallList.getInstance().getOutgoingCall();
+    if (outgoingCall == null) {
+      outgoingCall = CallList.getInstance().getPendingOutgoingCall();
+    }
+    if (intent.getBooleanExtra(IntentExtraNames.NEW_OUTGOING_CALL, false)) {
+      intent.removeExtra(IntentExtraNames.NEW_OUTGOING_CALL);
+
+      // InCallActivity is responsible for disconnecting a new outgoing call if there is no way of
+      // making it (i.e. no valid call capable accounts).
+      // If the version is not MSIM compatible, ignore this code.
+      if (CompatUtils.isMSIMCompatible()
+          && InCallPresenter.isCallWithNoValidAccounts(outgoingCall)) {
+        LogUtil.i(
+            "InCallActivity.internalResolveIntent", "Call with no valid accounts, disconnecting");
+        outgoingCall.disconnect();
+      }
+
+      dismissKeyguard(true);
+    }
+
+    if (showPhoneAccountSelectionDialog()) {
+      hideMainInCallFragment();
+    }
+  }
+
+  /**
+   * When relaunching from the dialer app, {@code showDialpad} indicates whether the dialpad should
+   * be shown on launch.
+   *
+   * @param showDialpad {@code true} to indicate the dialpad should be shown on launch, and {@code
+   *     false} to indicate no change should be made to the dialpad visibility.
+   */
+  private void relaunchedFromDialer(boolean showDialpad) {
+    showDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_NONE;
+    animateDialpadOnShow = true;
+
+    if (showDialpadRequest == DIALPAD_REQUEST_SHOW) {
+      // If there's only one line in use, AND it's on hold, then we're sure the user
+      // wants to use the dialpad toward the exact line, so un-hold the holding line.
+      DialerCall call = CallList.getInstance().getActiveOrBackgroundCall();
+      if (call != null && call.getState() == State.ONHOLD) {
+        call.unhold();
+      }
+    }
+  }
+
+  /**
+   * Show a phone account selection dialog if there is a call waiting for phone account selection.
+   *
+   * @return true if the dialog was shown.
+   */
+  private boolean showPhoneAccountSelectionDialog() {
+    DialerCall waitingForAccountCall = CallList.getInstance().getWaitingForAccountCall();
+    if (waitingForAccountCall == null) {
+      return false;
+    }
+
+    Bundle extras = waitingForAccountCall.getIntentExtras();
+    List<PhoneAccountHandle> phoneAccountHandles =
+        extras == null
+            ? new ArrayList<>()
+            : extras.getParcelableArrayList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+
+    selectPhoneAccountDialogFragment =
+        SelectPhoneAccountDialogFragment.newInstance(
+            R.string.select_phone_account_for_calls,
+            true /* canSetDefault */,
+            0 /* setDefaultResId */,
+            phoneAccountHandles,
+            selectPhoneAccountListener,
+            waitingForAccountCall.getId(),
+            null /* hints */);
+    selectPhoneAccountDialogFragment.show(getFragmentManager(), Tags.SELECT_ACCOUNT_FRAGMENT);
+    return true;
+  }
+
   @Override
   protected void onSaveInstanceState(Bundle out) {
     LogUtil.enterBlock("InCallActivity.onSaveInstanceState");
 
     // TODO: DialpadFragment should handle this as part of its own state
-    out.putBoolean(INTENT_EXTRA_SHOW_DIALPAD, isDialpadVisible());
+    out.putBoolean(IntentExtraNames.SHOW_DIALPAD, isDialpadVisible());
     DialpadFragment dialpadFragment = getDialpadFragment();
     if (dialpadFragment != null) {
-      out.putString(DIALPAD_TEXT_KEY, dialpadFragment.getDtmfText());
+      out.putString(KeysForSavedInstance.DIALPAD_TEXT, dialpadFragment.getDtmfText());
     }
 
-    out.putBoolean(DID_SHOW_ANSWER_SCREEN_KEY, didShowAnswerScreen);
-    out.putBoolean(DID_SHOW_IN_CALL_SCREEN_KEY, didShowInCallScreen);
-    out.putBoolean(DID_SHOW_VIDEO_CALL_SCREEN_KEY, didShowVideoCallScreen);
+    out.putBoolean(KeysForSavedInstance.DID_SHOW_ANSWER_SCREEN, didShowAnswerScreen);
+    out.putBoolean(KeysForSavedInstance.DID_SHOW_IN_CALL_SCREEN, didShowInCallScreen);
+    out.putBoolean(KeysForSavedInstance.DID_SHOW_VIDEO_CALL_SCREEN, didShowVideoCallScreen);
 
     super.onSaveInstanceState(out);
     isVisible = false;
@@ -220,9 +418,45 @@
   @Override
   protected void onResume() {
     Trace.beginSection("InCallActivity.onResume");
-    LogUtil.i("InCallActivity.onResume", "");
     super.onResume();
-    common.onResume();
+
+    if (!InCallPresenter.getInstance().isReadyForTearDown()) {
+      updateTaskDescription();
+      InCallPresenter.getInstance().onUiShowing(true);
+    }
+
+    // If there is a pending request to show or hide the dialpad, handle that now.
+    if (showDialpadRequest != DIALPAD_REQUEST_NONE) {
+      if (showDialpadRequest == DIALPAD_REQUEST_SHOW) {
+        // Exit fullscreen so that the user has access to the dialpad hide/show button.
+        // This is important when showing the dialpad from within dialer.
+        InCallPresenter.getInstance().setFullScreen(false /* isFullScreen */, true /* force */);
+
+        showDialpadFragment(true /* show */, animateDialpadOnShow /* animate */);
+        animateDialpadOnShow = false;
+
+        DialpadFragment dialpadFragment = getDialpadFragment();
+        if (dialpadFragment != null) {
+          dialpadFragment.setDtmfText(dtmfTextToPrepopulate);
+          dtmfTextToPrepopulate = null;
+        }
+      } else {
+        LogUtil.i("InCallActivity.onResume", "Force-hide the dialpad");
+        if (getDialpadFragment() != null) {
+          showDialpadFragment(false /* show */, false /* animate */);
+        }
+      }
+      showDialpadRequest = DIALPAD_REQUEST_NONE;
+    }
+    updateNavigationBar(isDialpadVisible());
+
+    if (showPostCharWaitDialogOnResume) {
+      showDialogForPostCharWait(showPostCharWaitDialogCallId, showPostCharWaitDialogChars);
+    }
+
+    CallList.getInstance()
+        .onInCallUiShown(getIntent().getBooleanExtra(IntentExtraNames.FOR_FULL_SCREEN, false));
+
     PseudoScreenState pseudoScreenState = InCallPresenter.getInstance().getPseudoScreenState();
     pseudoScreenState.addListener(this);
     onPseudoScreenStateChanged(pseudoScreenState.isOn());
@@ -266,7 +500,7 @@
     // be created.
     // Skip this when the screen is locked since the activity may complete its current life cycle
     // and restart.
-    if (!common.getIsRecreating() && !getSystemService(KeyguardManager.class).isKeyguardLocked()) {
+    if (!isRecreating && !getSystemService(KeyguardManager.class).isKeyguardLocked()) {
       DialerCall waitingForAccountCall = CallList.getInstance().getWaitingForAccountCall();
       if (waitingForAccountCall != null) {
         waitingForAccountCall.disconnect();
@@ -276,8 +510,7 @@
     enableInCallOrientationEventListener(false);
     InCallPresenter.getInstance().updateIsChangingConfigurations();
     InCallPresenter.getInstance().onActivityStopped();
-    if (!common.getIsRecreating()) {
-      Dialog errorDialog = common.getErrorDialog();
+    if (!isRecreating) {
       if (errorDialog != null) {
         errorDialog.dismiss();
       }
@@ -319,7 +552,7 @@
   }
 
   private boolean shouldCloseActivityOnFinish() {
-    if (!isVisible()) {
+    if (!isVisible) {
       LogUtil.i(
           "InCallActivity.shouldCloseActivityOnFinish",
           "allowing activity to be closed because it's not visible");
@@ -341,19 +574,40 @@
 
   @Override
   protected void onNewIntent(Intent intent) {
-    LogUtil.i("InCallActivity.onNewIntent", "");
+    LogUtil.enterBlock("InCallActivity.onNewIntent");
 
     // If the screen is off, we need to make sure it gets turned on for incoming calls.
     // This normally works just fine thanks to FLAG_TURN_SCREEN_ON but that only works
     // when the activity is first created. Therefore, to ensure the screen is turned on
     // for the call waiting case, we recreate() the current activity. There should be no jank from
     // this since the screen is already off and will remain so until our new activity is up.
-    if (!isVisible()) {
-      common.onNewIntent(intent, true /* isRecreating */);
+    if (!isVisible) {
+      onNewIntent(intent, true /* isRecreating */);
       LogUtil.i("InCallActivity.onNewIntent", "Restarting InCallActivity to force screen on.");
       recreate();
     } else {
-      common.onNewIntent(intent, false /* isRecreating */);
+      onNewIntent(intent, false /* isRecreating */);
+    }
+  }
+
+  private void onNewIntent(Intent intent, boolean isRecreating) {
+    this.isRecreating = isRecreating;
+
+    // We're being re-launched with a new Intent.  Since it's possible for a single InCallActivity
+    // instance to persist indefinitely (even if we finish() ourselves), this sequence can
+    // happen any time the InCallActivity needs to be displayed.
+
+    // Stash away the new intent so that we can get it in the future by calling getIntent().
+    // Otherwise getIntent() will return the original Intent from when we first got created.
+    setIntent(intent);
+
+    // Activities are always paused before receiving a new intent, so we can count on our onResume()
+    // method being called next.
+
+    // Just like in onCreate(), handle the intent.
+    // Skip if InCallActivity is going to be recreated since this will be called in onCreate().
+    if (!isRecreating) {
+      internalResolveIntent(intent);
     }
   }
 
@@ -361,7 +615,7 @@
   public void onBackPressed() {
     LogUtil.enterBlock("InCallActivity.onBackPressed");
 
-    if (!isVisible()) {
+    if (!isVisible) {
       return;
     }
 
@@ -483,14 +737,78 @@
     }
   }
 
-  public boolean showDialpadFragment(boolean show, boolean animate) {
-    boolean didChange = common.showDialpadFragment(show, animate);
-    if (didChange) {
-      // Note:  onInCallScreenDialpadVisibilityChange is called here to ensure that the dialpad FAB
-      // repositions itself.
-      getInCallScreen().onInCallScreenDialpadVisibilityChange(show);
+  public void showDialpadFragment(boolean show, boolean animate) {
+    if (show == isDialpadVisible()) {
+      return;
     }
-    return didChange;
+
+    FragmentManager dialpadFragmentManager = getDialpadFragmentManager();
+    if (dialpadFragmentManager == null) {
+      LogUtil.i("InCallActivity.showDialpadFragment", "Unable to obtain a FragmentManager");
+      return;
+    }
+
+    if (!animate) {
+      if (show) {
+        showDialpadFragment();
+      } else {
+        hideDialpadFragment();
+      }
+    } else {
+      if (show) {
+        showDialpadFragment();
+        getDialpadFragment().animateShowDialpad();
+      }
+      getDialpadFragment()
+          .getView()
+          .startAnimation(show ? dialpadSlideInAnimation : dialpadSlideOutAnimation);
+    }
+
+    ProximitySensor sensor = InCallPresenter.getInstance().getProximitySensor();
+    if (sensor != null) {
+      sensor.onDialpadVisible(show);
+    }
+    showDialpadRequest = DIALPAD_REQUEST_NONE;
+
+    // Note:  onInCallScreenDialpadVisibilityChange is called here to ensure that the dialpad FAB
+    // repositions itself.
+    getInCallScreen().onInCallScreenDialpadVisibilityChange(show);
+  }
+
+  private void showDialpadFragment() {
+    FragmentManager dialpadFragmentManager = getDialpadFragmentManager();
+    if (dialpadFragmentManager == null) {
+      return;
+    }
+
+    FragmentTransaction transaction = dialpadFragmentManager.beginTransaction();
+    DialpadFragment dialpadFragment = getDialpadFragment();
+    if (dialpadFragment == null) {
+      transaction.add(getDialpadContainerId(), new DialpadFragment(), Tags.DIALPAD_FRAGMENT);
+    } else {
+      transaction.show(dialpadFragment);
+    }
+    transaction.commitAllowingStateLoss();
+    dialpadFragmentManager.executePendingTransactions();
+
+    Logger.get(this).logScreenView(ScreenEvent.Type.INCALL_DIALPAD, this);
+    updateNavigationBar(true /* isDialpadVisible */);
+  }
+
+  private void hideDialpadFragment() {
+    FragmentManager dialpadFragmentManager = getDialpadFragmentManager();
+    if (dialpadFragmentManager == null) {
+      return;
+    }
+
+    Fragment dialpadFragment = dialpadFragmentManager.findFragmentByTag(Tags.DIALPAD_FRAGMENT);
+    if (dialpadFragment != null) {
+      FragmentTransaction transaction = dialpadFragmentManager.beginTransaction();
+      transaction.hide(dialpadFragment);
+      transaction.commitAllowingStateLoss();
+      dialpadFragmentManager.executePendingTransactions();
+    }
+    updateNavigationBar(false /* isDialpadVisible */);
   }
 
   public boolean isDialpadVisible() {
@@ -498,17 +816,14 @@
     return dialpadFragment != null && dialpadFragment.isVisible();
   }
 
-  /**
-   * Returns the {@link DialpadFragment} that's shown by this activity, or {@code null}
-   * TODO(a bug): Make this method private after InCallActivityCommon is deleted.
-   */
+  /** Returns the {@link DialpadFragment} that's shown by this activity, or {@code null} */
   @Nullable
-  DialpadFragment getDialpadFragment() {
+  private DialpadFragment getDialpadFragment() {
     FragmentManager fragmentManager = getDialpadFragmentManager();
     if (fragmentManager == null) {
       return null;
     }
-    return (DialpadFragment) fragmentManager.findFragmentByTag(TAG_DIALPAD_FRAGMENT);
+    return (DialpadFragment) fragmentManager.findFragmentByTag(Tags.DIALPAD_FRAGMENT);
   }
 
   public void onForegroundCallChanged(DialerCall newForegroundCall) {
@@ -520,8 +835,7 @@
     }
   }
 
-  // TODO(a bug): Make this method private after InCallActivityCommon is deleted.
-  void updateTaskDescription() {
+  private void updateTaskDescription() {
     int color =
         getResources().getBoolean(R.bool.is_layout_landscape)
             ? ResourcesCompat.getColor(
@@ -605,8 +919,19 @@
     }
   }
 
-  public void showPostCharWaitDialog(String callId, String chars) {
-    common.showPostCharWaitDialog(callId, chars);
+  public void showDialogForPostCharWait(String callId, String chars) {
+    if (isVisible) {
+      PostCharDialogFragment fragment = new PostCharDialogFragment(callId, chars);
+      fragment.show(getSupportFragmentManager(), Tags.POST_CHAR_DIALOG_FRAGMENT);
+
+      showPostCharWaitDialogOnResume = false;
+      showPostCharWaitDialogCallId = null;
+      showPostCharWaitDialogChars = null;
+    } else {
+      showPostCharWaitDialogOnResume = true;
+      showPostCharWaitDialogCallId = callId;
+      showPostCharWaitDialogChars = chars;
+    }
   }
 
   public void showDialogOrToastForDisconnectedCall(DisconnectMessage disconnectMessage) {
@@ -629,7 +954,7 @@
     }
 
     // Show the dialog.
-    common.setErrorDialog(disconnectMessage.dialog);
+    errorDialog = disconnectMessage.dialog;
     InCallUiLock lock = InCallPresenter.getInstance().acquireInCallUiLock("showErrorDialog");
     disconnectMessage.dialog.setOnDismissListener(
         dialogInterface -> {
@@ -641,12 +966,12 @@
   }
 
   private void onDialogDismissed() {
-    common.setErrorDialog(null);
+    errorDialog = null;
     CallList.getInstance().onErrorDialogDismissed();
   }
 
   public void dismissPendingDialogs() {
-    LogUtil.i("InCallActivity.dismissPendingDialogs", "");
+    LogUtil.enterBlock("InCallActivity.dismissPendingDialogs");
 
     if (!isVisible) {
       // Defer the dismissing action as the activity is not visible and onSaveInstanceState may have
@@ -658,24 +983,21 @@
     }
 
     // Dismiss the error dialog
-    Dialog errorDialog = common.getErrorDialog();
     if (errorDialog != null) {
       errorDialog.dismiss();
-      common.setErrorDialog(null);
+      errorDialog = null;
     }
 
     // Dismiss the phone account selection dialog
-    SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment =
-        common.getSelectPhoneAccountDialogFragment();
     if (selectPhoneAccountDialogFragment != null) {
       selectPhoneAccountDialogFragment.dismiss();
-      common.setSelectPhoneAccountDialogFragment(null);
+      selectPhoneAccountDialogFragment = null;
     }
 
     // Dismiss the dialog for international call on WiFi
     InternationalCallOnWifiDialogFragment internationalCallOnWifiFragment =
         (InternationalCallOnWifiDialogFragment)
-            getSupportFragmentManager().findFragmentByTag(TAG_INTERNATIONAL_CALL_ON_WIFI);
+            getSupportFragmentManager().findFragmentByTag(Tags.INTERNATIONAL_CALL_ON_WIFI);
     if (internationalCallOnWifiFragment != null) {
       internationalCallOnWifiFragment.dismiss();
     }
@@ -689,8 +1011,7 @@
     needDismissPendingDialogs = false;
   }
 
-  // TODO(a bug): Make this method private after InCallActivityCommon is deleted.
-  void enableInCallOrientationEventListener(boolean enable) {
+  private void enableInCallOrientationEventListener(boolean enable) {
     if (enable) {
       inCallOrientationEventListener.enable(true /* notifyDeviceOrientationChange */);
     } else {
@@ -699,7 +1020,18 @@
   }
 
   public void setExcludeFromRecents(boolean exclude) {
-    common.setExcludeFromRecents(exclude);
+    int taskId = getTaskId();
+
+    List<AppTask> tasks = getSystemService(ActivityManager.class).getAppTasks();
+    for (AppTask task : tasks) {
+      try {
+        if (task.getTaskInfo().id == taskId) {
+          task.setExcludeFromRecents(exclude);
+        }
+      } catch (RuntimeException e) {
+        LogUtil.e("InCallActivity.setExcludeFromRecents", "RuntimeException:\n%s", e);
+      }
+    }
   }
 
   @Nullable
@@ -756,7 +1088,6 @@
 
   public void onPrimaryCallStateChanged() {
     Trace.beginSection("InCallActivity.onPrimaryCallStateChanged");
-    LogUtil.i("InCallActivity.onPrimaryCallStateChanged", "");
     showMainInCallFragment();
     Trace.endSection();
   }
@@ -790,7 +1121,7 @@
     wifiHandoverFailureCheckbox.setChecked(false);
 
     InCallUiLock lock = InCallPresenter.getInstance().acquireInCallUiLock("WifiFailedDialog");
-    Dialog errorDialog =
+    errorDialog =
         builder
             .setView(dialogCheckBoxView)
             .setMessage(R.string.video_call_lte_to_wifi_failed_message)
@@ -805,8 +1136,6 @@
                 })
             .setOnDismissListener(dialogInterface -> lock.release())
             .create();
-
-    common.setErrorDialog(errorDialog);
     errorDialog.show();
   }
 
@@ -820,8 +1149,8 @@
 
     InternationalCallOnWifiDialogFragment fragment =
         InternationalCallOnWifiDialogFragment.newInstance(
-            call.getId(), common.getCallbackForInternationalCallOnWifiDialog());
-    fragment.show(getSupportFragmentManager(), TAG_INTERNATIONAL_CALL_ON_WIFI);
+            call.getId(), internationalCallOnWifiCallback);
+    fragment.show(getSupportFragmentManager(), Tags.INTERNATIONAL_CALL_ON_WIFI);
   }
 
   @Override
@@ -830,8 +1159,7 @@
     updateNavigationBar(isDialpadVisible());
   }
 
-  // TODO(a bug): Make this method private after InCallActivityCommon is deleted.
-  void updateNavigationBar(boolean isDialpadVisible) {
+  private void updateNavigationBar(boolean isDialpadVisible) {
     if (ActivityCompat.isInMultiWindowMode(this)) {
       return;
     }
@@ -856,8 +1184,8 @@
   }
 
   public void hideMainInCallFragment() {
-    LogUtil.i("InCallActivity.hideMainInCallFragment", "");
-    if (didShowInCallScreen || didShowVideoCallScreen) {
+    LogUtil.enterBlock("InCallActivity.hideMainInCallFragment");
+    if (getCallCardFragmentVisible()) {
       FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
       hideInCallScreenFragment(transaction);
       hideVideoCallScreenFragment(transaction);
@@ -1017,7 +1345,7 @@
             call.getVideoTech().isSelfManagedCamera(),
             shouldAllowAnswerAndRelease(call),
             CallList.getInstance().getBackgroundCall() != null);
-    transaction.add(R.id.main, answerScreen.getAnswerScreenFragment(), TAG_ANSWER_SCREEN);
+    transaction.add(R.id.main, answerScreen.getAnswerScreenFragment(), Tags.ANSWER_SCREEN);
 
     Logger.get(this).logScreenView(ScreenEvent.Type.INCOMING_CALL, this);
     didShowAnswerScreen = true;
@@ -1038,7 +1366,8 @@
       LogUtil.i("InCallActivity.shouldAllowAnswerAndRelease", "video call");
       return false;
     }
-    if (!ConfigProviderBindings.get(this).getBoolean(CONFIG_ANSWER_AND_RELEASE_ENABLED, true)) {
+    if (!ConfigProviderBindings.get(this)
+        .getBoolean(ConfigNames.ANSWER_AND_RELEASE_ENABLED, true)) {
       LogUtil.i("InCallActivity.shouldAllowAnswerAndRelease", "disabled by config");
       return false;
     }
@@ -1064,7 +1393,7 @@
       return false;
     }
     InCallScreen inCallScreen = InCallBindings.createInCallScreen();
-    transaction.add(R.id.main, inCallScreen.getInCallScreenFragment(), TAG_IN_CALL_SCREEN);
+    transaction.add(R.id.main, inCallScreen.getInCallScreenFragment(), Tags.IN_CALL_SCREEN);
     Logger.get(this).logScreenView(ScreenEvent.Type.INCALL, this);
     didShowInCallScreen = true;
     return true;
@@ -1099,7 +1428,8 @@
     VideoCallScreen videoCallScreen =
         VideoBindings.createVideoCallScreen(
             call.getId(), call.getVideoTech().shouldUseSurfaceView());
-    transaction.add(R.id.main, videoCallScreen.getVideoCallScreenFragment(), TAG_VIDEO_CALL_SCREEN);
+    transaction.add(
+        R.id.main, videoCallScreen.getVideoCallScreenFragment(), Tags.VIDEO_CALL_SCREEN);
 
     Logger.get(this).logScreenView(ScreenEvent.Type.INCALL, this);
     didShowVideoCallScreen = true;
@@ -1118,16 +1448,16 @@
     return true;
   }
 
-  AnswerScreen getAnswerScreen() {
-    return (AnswerScreen) getSupportFragmentManager().findFragmentByTag(TAG_ANSWER_SCREEN);
+  private AnswerScreen getAnswerScreen() {
+    return (AnswerScreen) getSupportFragmentManager().findFragmentByTag(Tags.ANSWER_SCREEN);
   }
 
-  InCallScreen getInCallScreen() {
-    return (InCallScreen) getSupportFragmentManager().findFragmentByTag(TAG_IN_CALL_SCREEN);
+  private InCallScreen getInCallScreen() {
+    return (InCallScreen) getSupportFragmentManager().findFragmentByTag(Tags.IN_CALL_SCREEN);
   }
 
-  VideoCallScreen getVideoCallScreen() {
-    return (VideoCallScreen) getSupportFragmentManager().findFragmentByTag(TAG_VIDEO_CALL_SCREEN);
+  private VideoCallScreen getVideoCallScreen() {
+    return (VideoCallScreen) getSupportFragmentManager().findFragmentByTag(Tags.VIDEO_CALL_SCREEN);
   }
 
   @Override
@@ -1171,4 +1501,86 @@
       this.call = call;
     }
   }
+
+  private static final class IntentExtraNames {
+    static final String FOR_FULL_SCREEN = "InCallActivity.for_full_screen_intent";
+    static final String NEW_OUTGOING_CALL = "InCallActivity.new_outgoing_call";
+    static final String SHOW_DIALPAD = "InCallActivity.show_dialpad";
+  }
+
+  private static final class KeysForSavedInstance {
+    static final String DIALPAD_TEXT = "InCallActivity.dialpad_text";
+    static final String DID_SHOW_ANSWER_SCREEN = "did_show_answer_screen";
+    static final String DID_SHOW_IN_CALL_SCREEN = "did_show_in_call_screen";
+    static final String DID_SHOW_VIDEO_CALL_SCREEN = "did_show_video_call_screen";
+  }
+
+  /** Request codes for pending intents. */
+  public static final class PendingIntentRequestCodes {
+    static final int NON_FULL_SCREEN = 0;
+    static final int FULL_SCREEN = 1;
+    static final int BUBBLE = 2;
+  }
+
+  private static final class Tags {
+    static final String ANSWER_SCREEN = "tag_answer_screen";
+    static final String DIALPAD_FRAGMENT = "tag_dialpad_fragment";
+    static final String IN_CALL_SCREEN = "tag_in_call_screen";
+    static final String INTERNATIONAL_CALL_ON_WIFI = "tag_international_call_on_wifi";
+    static final String SELECT_ACCOUNT_FRAGMENT = "tag_select_account_fragment";
+    static final String VIDEO_CALL_SCREEN = "tag_video_call_screen";
+    static final String POST_CHAR_DIALOG_FRAGMENT = "tag_post_char_dialog_fragment";
+  }
+
+  private static final class ConfigNames {
+    static final String ANSWER_AND_RELEASE_ENABLED = "answer_and_release_enabled";
+  }
+
+  private static final class InternationalCallOnWifiCallback
+      implements InternationalCallOnWifiDialogFragment.Callback {
+    private static final String TAG = InternationalCallOnWifiCallback.class.getCanonicalName();
+
+    @Override
+    public void continueCall(@NonNull String callId) {
+      LogUtil.i(TAG, "Continuing call with ID: %s", callId);
+    }
+
+    @Override
+    public void cancelCall(@NonNull String callId) {
+      DialerCall call = CallList.getInstance().getCallById(callId);
+      if (call == null) {
+        LogUtil.i(TAG, "Call destroyed before the dialog is closed");
+        return;
+      }
+
+      LogUtil.i(TAG, "Disconnecting international call on WiFi");
+      call.disconnect();
+    }
+  }
+
+  private static final class SelectPhoneAccountListener
+      extends SelectPhoneAccountDialogFragment.SelectPhoneAccountListener {
+    private static final String TAG = SelectPhoneAccountListener.class.getCanonicalName();
+
+    @Override
+    public void onPhoneAccountSelected(
+        PhoneAccountHandle selectedAccountHandle, boolean setDefault, String callId) {
+      DialerCall call = CallList.getInstance().getCallById(callId);
+      LogUtil.i(TAG, "Phone account select with call:\n%s", call);
+
+      if (call != null) {
+        call.phoneAccountSelected(selectedAccountHandle, setDefault);
+      }
+    }
+
+    @Override
+    public void onDialogDismissed(String callId) {
+      DialerCall call = CallList.getInstance().getCallById(callId);
+      LogUtil.i(TAG, "Disconnecting call:\n%s" + call);
+
+      if (call != null) {
+        call.disconnect();
+      }
+    }
+  }
 }
diff --git a/java/com/android/incallui/InCallActivityCommon.java b/java/com/android/incallui/InCallActivityCommon.java
deleted file mode 100644
index d2aae48..0000000
--- a/java/com/android/incallui/InCallActivityCommon.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.incallui;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.AppTask;
-import android.app.Dialog;
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.os.Trace;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
-import android.telecom.CallAudioState;
-import android.telecom.PhoneAccountHandle;
-import android.view.WindowManager;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
-import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener;
-import com.android.dialer.animation.AnimUtils;
-import com.android.dialer.animation.AnimationListenerAdapter;
-import com.android.dialer.common.LogUtil;
-import com.android.dialer.compat.CompatUtils;
-import com.android.dialer.logging.Logger;
-import com.android.dialer.logging.ScreenEvent;
-import com.android.dialer.util.ViewUtil;
-import com.android.incallui.audiomode.AudioModeProvider;
-import com.android.incallui.call.CallList;
-import com.android.incallui.call.DialerCall;
-import com.android.incallui.call.DialerCall.State;
-import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogFragment;
-import com.android.incallui.telecomeventui.InternationalCallOnWifiDialogFragment.Callback;
-import com.google.common.base.Optional;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.List;
-
-/** Shared functionality between the new and old in call activity. */
-public class InCallActivityCommon {
-
-  private static final String INTENT_EXTRA_SHOW_DIALPAD = "InCallActivity.show_dialpad";
-  private static final String INTENT_EXTRA_NEW_OUTGOING_CALL = "InCallActivity.new_outgoing_call";
-  private static final String INTENT_EXTRA_FOR_FULL_SCREEN =
-      "InCallActivity.for_full_screen_intent";
-
-  private static final String DIALPAD_TEXT_KEY = "InCallActivity.dialpad_text";
-
-  private static final String TAG_SELECT_ACCOUNT_FRAGMENT = "tag_select_account_fragment";
-  private static final String TAG_DIALPAD_FRAGMENT = "tag_dialpad_fragment";
-  private static final String TAG_INTERNATIONAL_CALL_ON_WIFI = "tag_international_call_on_wifi";
-
-  @Retention(RetentionPolicy.SOURCE)
-  @IntDef({
-    DIALPAD_REQUEST_NONE,
-    DIALPAD_REQUEST_SHOW,
-    DIALPAD_REQUEST_HIDE,
-  })
-  @interface DialpadRequestType {}
-
-  private static final int DIALPAD_REQUEST_NONE = 1;
-  private static final int DIALPAD_REQUEST_SHOW = 2;
-  private static final int DIALPAD_REQUEST_HIDE = 3;
-
-  private static Optional<Integer> audioRouteForTesting = Optional.absent();
-
-  private final InCallActivity inCallActivity;
-  private boolean showPostCharWaitDialogOnResume;
-  private String showPostCharWaitDialogCallId;
-  private String showPostCharWaitDialogChars;
-  private Dialog errorDialog;
-  private SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment;
-  private Animation dialpadSlideInAnimation;
-  private Animation dialpadSlideOutAnimation;
-  private boolean animateDialpadOnShow;
-  private String dtmfTextToPreopulate;
-  @DialpadRequestType private int showDialpadRequest = DIALPAD_REQUEST_NONE;
-  // If activity is going to be recreated. This is usually happening in {@link onNewIntent}.
-  private boolean isRecreating;
-
-  private final SelectPhoneAccountListener selectAccountListener =
-      new SelectPhoneAccountListener() {
-        @Override
-        public void onPhoneAccountSelected(
-            PhoneAccountHandle selectedAccountHandle, boolean setDefault, String callId) {
-          DialerCall call = CallList.getInstance().getCallById(callId);
-          LogUtil.i(
-              "InCallActivityCommon.SelectPhoneAccountListener.onPhoneAccountSelected",
-              "call: " + call);
-          if (call != null) {
-            call.phoneAccountSelected(selectedAccountHandle, setDefault);
-          }
-        }
-
-        @Override
-        public void onDialogDismissed(String callId) {
-          DialerCall call = CallList.getInstance().getCallById(callId);
-          LogUtil.i(
-              "InCallActivityCommon.SelectPhoneAccountListener.onDialogDismissed",
-              "disconnecting call: " + call);
-          if (call != null) {
-            call.disconnect();
-          }
-        }
-      };
-
-  private InternationalCallOnWifiDialogFragment.Callback internationalCallOnWifiCallback =
-      new Callback() {
-        @Override
-        public void continueCall(@NonNull String callId) {
-          LogUtil.i("InCallActivityCommon.continueCall", "continuing call with id: %s", callId);
-        }
-
-        @Override
-        public void cancelCall(@NonNull String callId) {
-          DialerCall call = CallList.getInstance().getCallById(callId);
-          if (call == null) {
-            LogUtil.i("InCallActivityCommon.cancelCall", "call destroyed before dialog closed");
-            return;
-          }
-          LogUtil.i("InCallActivityCommon.cancelCall", "disconnecting international call on wifi");
-          call.disconnect();
-        }
-      };
-
-  public static void setIntentExtras(
-      Intent intent, boolean showDialpad, boolean newOutgoingCall, boolean isForFullScreen) {
-    if (showDialpad) {
-      intent.putExtra(INTENT_EXTRA_SHOW_DIALPAD, true);
-    }
-    intent.putExtra(INTENT_EXTRA_NEW_OUTGOING_CALL, newOutgoingCall);
-    intent.putExtra(INTENT_EXTRA_FOR_FULL_SCREEN, isForFullScreen);
-  }
-
-  public InCallActivityCommon(InCallActivity inCallActivity) {
-    this.inCallActivity = inCallActivity;
-  }
-
-  public void onCreate(Bundle icicle) {
-    setWindowFlags();
-
-    inCallActivity.setContentView(R.layout.incall_screen);
-
-    internalResolveIntent(inCallActivity.getIntent());
-
-    boolean isLandscape =
-        inCallActivity.getResources().getConfiguration().orientation
-            == Configuration.ORIENTATION_LANDSCAPE;
-    boolean isRtl = ViewUtil.isRtl();
-
-    if (isLandscape) {
-      dialpadSlideInAnimation =
-          AnimationUtils.loadAnimation(
-              inCallActivity, isRtl ? R.anim.dialpad_slide_in_left : R.anim.dialpad_slide_in_right);
-      dialpadSlideOutAnimation =
-          AnimationUtils.loadAnimation(
-              inCallActivity,
-              isRtl ? R.anim.dialpad_slide_out_left : R.anim.dialpad_slide_out_right);
-    } else {
-      dialpadSlideInAnimation =
-          AnimationUtils.loadAnimation(inCallActivity, R.anim.dialpad_slide_in_bottom);
-      dialpadSlideOutAnimation =
-          AnimationUtils.loadAnimation(inCallActivity, R.anim.dialpad_slide_out_bottom);
-    }
-
-    dialpadSlideInAnimation.setInterpolator(AnimUtils.EASE_IN);
-    dialpadSlideOutAnimation.setInterpolator(AnimUtils.EASE_OUT);
-
-    dialpadSlideOutAnimation.setAnimationListener(
-        new AnimationListenerAdapter() {
-          @Override
-          public void onAnimationEnd(Animation animation) {
-            performHideDialpadFragment();
-          }
-        });
-
-    // Don't override the value if show dialpad request is true in intent extras.
-    if (icicle != null && showDialpadRequest == DIALPAD_REQUEST_NONE) {
-      // If the dialpad was shown before, set variables indicating it should be shown and
-      // populated with the previous DTMF text.  The dialpad is actually shown and populated
-      // in onResume() to ensure the hosting fragment has been inflated and is ready to receive it.
-      if (icicle.containsKey(INTENT_EXTRA_SHOW_DIALPAD)) {
-        boolean showDialpad = icicle.getBoolean(INTENT_EXTRA_SHOW_DIALPAD);
-        showDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_HIDE;
-        animateDialpadOnShow = false;
-      }
-      dtmfTextToPreopulate = icicle.getString(DIALPAD_TEXT_KEY);
-
-      SelectPhoneAccountDialogFragment dialogFragment =
-          (SelectPhoneAccountDialogFragment)
-              inCallActivity.getFragmentManager().findFragmentByTag(TAG_SELECT_ACCOUNT_FRAGMENT);
-      if (dialogFragment != null) {
-        dialogFragment.setListener(selectAccountListener);
-      }
-    }
-
-    InternationalCallOnWifiDialogFragment existingInternationalFragment =
-        (InternationalCallOnWifiDialogFragment)
-            inCallActivity
-                .getSupportFragmentManager()
-                .findFragmentByTag(TAG_INTERNATIONAL_CALL_ON_WIFI);
-    if (existingInternationalFragment != null) {
-      LogUtil.i(
-          "InCallActivityCommon.onCreate", "international fragment exists attaching callback");
-      existingInternationalFragment.setCallback(internationalCallOnWifiCallback);
-    }
-  }
-
-  public void onResume() {
-    Trace.beginSection("InCallActivityCommon.onResume");
-    if (InCallPresenter.getInstance().isReadyForTearDown()) {
-      LogUtil.i(
-          "InCallActivityCommon.onResume",
-          "InCallPresenter is ready for tear down, not sending updates");
-    } else {
-      inCallActivity.updateTaskDescription();
-      InCallPresenter.getInstance().onUiShowing(true);
-    }
-
-    // If there is a pending request to show or hide the dialpad, handle that now.
-    if (showDialpadRequest != DIALPAD_REQUEST_NONE) {
-      if (showDialpadRequest == DIALPAD_REQUEST_SHOW) {
-        // Exit fullscreen so that the user has access to the dialpad hide/show button and
-        // can hide the dialpad.  Important when showing the dialpad from within dialer.
-        InCallPresenter.getInstance().setFullScreen(false, true /* force */);
-
-        inCallActivity.showDialpadFragment(true /* show */, animateDialpadOnShow /* animate */);
-        animateDialpadOnShow = false;
-
-        DialpadFragment dialpadFragment = inCallActivity.getDialpadFragment();
-        if (dialpadFragment != null) {
-          dialpadFragment.setDtmfText(dtmfTextToPreopulate);
-          dtmfTextToPreopulate = null;
-        }
-      } else {
-        LogUtil.i("InCallActivityCommon.onResume", "force hide dialpad");
-        if (inCallActivity.getDialpadFragment() != null) {
-          inCallActivity.showDialpadFragment(false /* show */, false /* animate */);
-        }
-      }
-      showDialpadRequest = DIALPAD_REQUEST_NONE;
-    }
-    inCallActivity.updateNavigationBar(inCallActivity.isDialpadVisible());
-
-    if (showPostCharWaitDialogOnResume) {
-      showPostCharWaitDialog(showPostCharWaitDialogCallId, showPostCharWaitDialogChars);
-    }
-
-    CallList.getInstance()
-        .onInCallUiShown(
-            inCallActivity.getIntent().getBooleanExtra(INTENT_EXTRA_FOR_FULL_SCREEN, false));
-    Trace.endSection();
-  }
-
-  void onNewIntent(Intent intent, boolean isRecreating) {
-    LogUtil.i("InCallActivityCommon.onNewIntent", "");
-    this.isRecreating = isRecreating;
-
-    // We're being re-launched with a new Intent.  Since it's possible for a
-    // single InCallActivity instance to persist indefinitely (even if we
-    // finish() ourselves), this sequence can potentially happen any time
-    // the InCallActivity needs to be displayed.
-
-    // Stash away the new intent so that we can get it in the future
-    // by calling getIntent().  (Otherwise getIntent() will return the
-    // original Intent from when we first got created!)
-    inCallActivity.setIntent(intent);
-
-    // Activities are always paused before receiving a new intent, so
-    // we can count on our onResume() method being called next.
-
-    // Just like in onCreate(), handle the intent.
-    // Skip if InCallActivity is going to recreate since this will be called in onCreate().
-    if (!isRecreating) {
-      internalResolveIntent(intent);
-    }
-  }
-
-  private void setWindowFlags() {
-    // Allow the activity to be shown when the screen is locked and filter out touch events that are
-    // "too fat".
-    int flags =
-        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
-            | WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
-
-    // When the audio stream is not directed through Bluetooth, turn the screen on once the
-    // activity is shown.
-    final int audioRoute = getAudioRoute();
-    if (audioRoute != CallAudioState.ROUTE_BLUETOOTH) {
-      flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
-    }
-
-    inCallActivity.getWindow().addFlags(flags);
-  }
-
-  private static int getAudioRoute() {
-    if (audioRouteForTesting.isPresent()) {
-      return audioRouteForTesting.get();
-    }
-
-    return AudioModeProvider.getInstance().getAudioState().getRoute();
-  }
-
-  @VisibleForTesting(otherwise = VisibleForTesting.NONE)
-  public static void setAudioRouteForTesting(int audioRoute) {
-    audioRouteForTesting = Optional.of(audioRoute);
-  }
-
-  public void showPostCharWaitDialog(String callId, String chars) {
-    if (inCallActivity.isVisible()) {
-      PostCharDialogFragment fragment = new PostCharDialogFragment(callId, chars);
-      fragment.show(inCallActivity.getSupportFragmentManager(), "postCharWait");
-
-      showPostCharWaitDialogOnResume = false;
-      showPostCharWaitDialogCallId = null;
-      showPostCharWaitDialogChars = null;
-    } else {
-      showPostCharWaitDialogOnResume = true;
-      showPostCharWaitDialogCallId = callId;
-      showPostCharWaitDialogChars = chars;
-    }
-  }
-
-  /**
-   * When relaunching from the dialer app, {@code showDialpad} indicates whether the dialpad should
-   * be shown on launch.
-   *
-   * @param showDialpad {@code true} to indicate the dialpad should be shown on launch, and {@code
-   *     false} to indicate no change should be made to the dialpad visibility.
-   */
-  private void relaunchedFromDialer(boolean showDialpad) {
-    showDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_NONE;
-    animateDialpadOnShow = true;
-
-    if (showDialpadRequest == DIALPAD_REQUEST_SHOW) {
-      // If there's only one line in use, AND it's on hold, then we're sure the user
-      // wants to use the dialpad toward the exact line, so un-hold the holding line.
-      DialerCall call = CallList.getInstance().getActiveOrBackgroundCall();
-      if (call != null && call.getState() == State.ONHOLD) {
-        call.unhold();
-      }
-    }
-  }
-
-  public void setExcludeFromRecents(boolean exclude) {
-    List<AppTask> tasks = inCallActivity.getSystemService(ActivityManager.class).getAppTasks();
-    int taskId = inCallActivity.getTaskId();
-    for (int i = 0; i < tasks.size(); i++) {
-      ActivityManager.AppTask task = tasks.get(i);
-      try {
-        if (task.getTaskInfo().id == taskId) {
-          task.setExcludeFromRecents(exclude);
-        }
-      } catch (RuntimeException e) {
-        LogUtil.e(
-            "InCallActivityCommon.setExcludeFromRecents",
-            "RuntimeException when excluding task from recents.",
-            e);
-      }
-    }
-  }
-
-  public boolean showDialpadFragment(boolean show, boolean animate) {
-    // If the dialpad is already visible, don't animate in. If it's gone, don't animate out.
-    boolean isDialpadVisible = inCallActivity.isDialpadVisible();
-    LogUtil.i(
-        "InCallActivityCommon.showDialpadFragment",
-        "show: %b, animate: %b, " + "isDialpadVisible: %b",
-        show,
-        animate,
-        isDialpadVisible);
-    if (show == isDialpadVisible) {
-      return false;
-    }
-
-    FragmentManager dialpadFragmentManager = inCallActivity.getDialpadFragmentManager();
-    if (dialpadFragmentManager == null) {
-      LogUtil.i(
-          "InCallActivityCommon.showDialpadFragment", "unable to show or hide dialpad fragment");
-      return false;
-    }
-
-    // We don't do a FragmentTransaction on the hide case because it will be dealt with when
-    // the listener is fired after an animation finishes.
-    if (!animate) {
-      if (show) {
-        performShowDialpadFragment(dialpadFragmentManager);
-      } else {
-        performHideDialpadFragment();
-      }
-    } else {
-      if (show) {
-        performShowDialpadFragment(dialpadFragmentManager);
-        inCallActivity.getDialpadFragment().animateShowDialpad();
-      }
-      inCallActivity
-          .getDialpadFragment()
-          .getView()
-          .startAnimation(show ? dialpadSlideInAnimation : dialpadSlideOutAnimation);
-    }
-
-    ProximitySensor sensor = InCallPresenter.getInstance().getProximitySensor();
-    if (sensor != null) {
-      sensor.onDialpadVisible(show);
-    }
-    showDialpadRequest = DIALPAD_REQUEST_NONE;
-    return true;
-  }
-
-  private void performShowDialpadFragment(@NonNull FragmentManager dialpadFragmentManager) {
-    FragmentTransaction transaction = dialpadFragmentManager.beginTransaction();
-    DialpadFragment dialpadFragment = inCallActivity.getDialpadFragment();
-    if (dialpadFragment == null) {
-      transaction.add(
-          inCallActivity.getDialpadContainerId(), new DialpadFragment(), TAG_DIALPAD_FRAGMENT);
-    } else {
-      transaction.show(dialpadFragment);
-    }
-
-    transaction.commitAllowingStateLoss();
-    dialpadFragmentManager.executePendingTransactions();
-
-    Logger.get(inCallActivity).logScreenView(ScreenEvent.Type.INCALL_DIALPAD, inCallActivity);
-    inCallActivity.updateNavigationBar(true /* isDialpadVisible */);
-  }
-
-  private void performHideDialpadFragment() {
-    FragmentManager fragmentManager = inCallActivity.getDialpadFragmentManager();
-    if (fragmentManager == null) {
-      LogUtil.e(
-          "InCallActivityCommon.performHideDialpadFragment", "child fragment manager is null");
-      return;
-    }
-
-    Fragment fragment = fragmentManager.findFragmentByTag(TAG_DIALPAD_FRAGMENT);
-    if (fragment != null) {
-      FragmentTransaction transaction = fragmentManager.beginTransaction();
-      transaction.hide(fragment);
-      transaction.commitAllowingStateLoss();
-      fragmentManager.executePendingTransactions();
-    }
-    inCallActivity.updateNavigationBar(false /* isDialpadVisible */);
-  }
-
-  private void internalResolveIntent(Intent intent) {
-    if (!intent.getAction().equals(Intent.ACTION_MAIN)) {
-      return;
-    }
-
-    if (intent.hasExtra(INTENT_EXTRA_SHOW_DIALPAD)) {
-      // SHOW_DIALPAD_EXTRA can be used here to specify whether the DTMF
-      // dialpad should be initially visible.  If the extra isn't
-      // present at all, we just leave the dialpad in its previous state.
-      boolean showDialpad = intent.getBooleanExtra(INTENT_EXTRA_SHOW_DIALPAD, false);
-      LogUtil.i("InCallActivityCommon.internalResolveIntent", "SHOW_DIALPAD_EXTRA: " + showDialpad);
-
-      relaunchedFromDialer(showDialpad);
-    }
-
-    DialerCall outgoingCall = CallList.getInstance().getOutgoingCall();
-    if (outgoingCall == null) {
-      outgoingCall = CallList.getInstance().getPendingOutgoingCall();
-    }
-
-    if (intent.getBooleanExtra(INTENT_EXTRA_NEW_OUTGOING_CALL, false)) {
-      intent.removeExtra(INTENT_EXTRA_NEW_OUTGOING_CALL);
-
-      // InCallActivity is responsible for disconnecting a new outgoing call if there
-      // is no way of making it (i.e. no valid call capable accounts).
-      // If the version is not MSIM compatible, then ignore this code.
-      if (CompatUtils.isMSIMCompatible()
-          && InCallPresenter.isCallWithNoValidAccounts(outgoingCall)) {
-        LogUtil.i(
-            "InCallActivityCommon.internalResolveIntent",
-            "call with no valid accounts, disconnecting");
-        outgoingCall.disconnect();
-      }
-
-      inCallActivity.dismissKeyguard(true);
-    }
-
-    boolean didShowAccountSelectionDialog = maybeShowAccountSelectionDialog();
-    if (didShowAccountSelectionDialog) {
-      inCallActivity.hideMainInCallFragment();
-    }
-  }
-
-  private boolean maybeShowAccountSelectionDialog() {
-    DialerCall waitingForAccountCall = CallList.getInstance().getWaitingForAccountCall();
-    if (waitingForAccountCall == null) {
-      return false;
-    }
-
-    Bundle extras = waitingForAccountCall.getIntentExtras();
-    List<PhoneAccountHandle> phoneAccountHandles;
-    if (extras != null) {
-      phoneAccountHandles =
-          extras.getParcelableArrayList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
-    } else {
-      phoneAccountHandles = new ArrayList<>();
-    }
-
-    selectPhoneAccountDialogFragment =
-        SelectPhoneAccountDialogFragment.newInstance(
-            R.string.select_phone_account_for_calls,
-            true,
-            0,
-            phoneAccountHandles,
-            selectAccountListener,
-            waitingForAccountCall.getId(),
-            null);
-    selectPhoneAccountDialogFragment.show(
-        inCallActivity.getFragmentManager(), TAG_SELECT_ACCOUNT_FRAGMENT);
-    return true;
-  }
-
-  /** @deprecated Only for temporary use during the deprecation of {@link InCallActivityCommon} */
-  @Deprecated
-  @Nullable
-  Dialog getErrorDialog() {
-    return errorDialog;
-  }
-
-  /** @deprecated Only for temporary use during the deprecation of {@link InCallActivityCommon} */
-  @Deprecated
-  void setErrorDialog(@Nullable Dialog errorDialog) {
-    this.errorDialog = errorDialog;
-  }
-
-  /** @deprecated Only for temporary use during the deprecation of {@link InCallActivityCommon} */
-  @Deprecated
-  boolean getIsRecreating() {
-    return isRecreating;
-  }
-
-  /** @deprecated Only for temporary use during the deprecation of {@link InCallActivityCommon} */
-  @Deprecated
-  @Nullable
-  SelectPhoneAccountDialogFragment getSelectPhoneAccountDialogFragment() {
-    return selectPhoneAccountDialogFragment;
-  }
-
-  /** @deprecated Only for temporary use during the deprecation of {@link InCallActivityCommon} */
-  @Deprecated
-  void setSelectPhoneAccountDialogFragment(
-      @Nullable SelectPhoneAccountDialogFragment selectPhoneAccountDialogFragment) {
-    this.selectPhoneAccountDialogFragment = selectPhoneAccountDialogFragment;
-  }
-
-  /** @deprecated Only for temporary use during the deprecation of {@link InCallActivityCommon} */
-  @Deprecated
-  InternationalCallOnWifiDialogFragment.Callback getCallbackForInternationalCallOnWifiDialog() {
-    return internationalCallOnWifiCallback;
-  }
-}
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 3ba2ccf..c5310b9 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -1110,7 +1110,7 @@
 
   public void onPostDialCharWait(String callId, String chars) {
     if (isActivityStarted()) {
-      mInCallActivity.showPostCharWaitDialog(callId, chars);
+      mInCallActivity.showDialogForPostCharWait(callId, chars);
     }
   }
 
diff --git a/java/com/android/incallui/NewReturnToCallController.java b/java/com/android/incallui/NewReturnToCallController.java
index 97bf7ad..8f2463e 100644
--- a/java/com/android/incallui/NewReturnToCallController.java
+++ b/java/com/android/incallui/NewReturnToCallController.java
@@ -93,7 +93,7 @@
     activityIntent.putExtra(RETURN_TO_CALL_EXTRA_KEY, true);
     fullScreen =
         PendingIntent.getActivity(
-            context, InCallActivity.PENDING_INTENT_REQUEST_CODE_BUBBLE, activityIntent, 0);
+            context, InCallActivity.PendingIntentRequestCodes.BUBBLE, activityIntent, 0);
 
     InCallPresenter.getInstance().addInCallUiListener(this);
     CallList.getInstance().addListener(this);
diff --git a/java/com/android/incallui/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
index 89731bc..5f4cc5f 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -236,7 +236,7 @@
             context.getResources().getDimensionPixelOffset(R.dimen.return_to_call_initial_offset_y))
         .setPrimaryIntent(
             PendingIntent.getActivity(
-                context, InCallActivity.PENDING_INTENT_REQUEST_CODE_BUBBLE, activityIntent, 0))
+                context, InCallActivity.PendingIntentRequestCodes.BUBBLE, activityIntent, 0))
         .setActions(generateActions())
         .build();
   }
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 0a0aa5e..4da858f 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -1007,11 +1007,11 @@
         InCallActivity.getIntent(
             mContext, false /* showDialpad */, false /* newOutgoingCall */, isFullScreen);
 
-    int requestCode = InCallActivity.PENDING_INTENT_REQUEST_CODE_NON_FULL_SCREEN;
+    int requestCode = InCallActivity.PendingIntentRequestCodes.NON_FULL_SCREEN;
     if (isFullScreen) {
       // Use a unique request code so that the pending intent isn't clobbered by the
       // non-full screen pending intent.
-      requestCode = InCallActivity.PENDING_INTENT_REQUEST_CODE_FULL_SCREEN;
+      requestCode = InCallActivity.PendingIntentRequestCodes.FULL_SCREEN;
     }
 
     // PendingIntent that can be used to launch the InCallActivity.  The