Merge changes I9ecd36ce,I917bac76

* changes:
  Add audio select menu.
  Introduce GlidePhotoManager to CallDetailsActivity
diff --git a/assets/quantum/res/drawable/quantum_ic_bluetooth_audio_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_bluetooth_audio_vd_theme_24.xml
new file mode 100644
index 0000000..f5a7e8b
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_bluetooth_audio_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M14.24,12.01l2.32,2.32c0.28,-0.72 0.44,-1.51 0.44,-2.33 0,-0.82 -0.16,-1.59 -0.43,-2.31l-2.33,2.32zM19.53,6.71l-1.26,1.26c0.63,1.21 0.98,2.57 0.98,4.02s-0.36,2.82 -0.98,4.02l1.2,1.2c0.97,-1.54 1.54,-3.36 1.54,-5.31 -0.01,-1.89 -0.55,-3.67 -1.48,-5.19zM15.71,7.71L10,2L9,2v7.59L4.41,5 3,6.41 8.59,12 3,17.59 4.41,19 9,14.41L9,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM11,5.83l1.88,1.88L11,9.59L11,5.83zM12.88,16.29L11,18.17v-3.76l1.88,1.88z"/>
+</vector>
diff --git a/assets/quantum/res/drawable/quantum_ic_headset_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_headset_vd_theme_24.xml
new file mode 100644
index 0000000..4d65b4d
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_headset_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z"/>
+</vector>
diff --git a/assets/quantum/res/drawable/quantum_ic_phone_in_talk_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_phone_in_talk_vd_theme_24.xml
new file mode 100644
index 0000000..d171551
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_phone_in_talk_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1L4,3c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM19,12h2c0,-4.97 -4.03,-9 -9,-9v2c3.87,0 7,3.13 7,7zM15,12h2c0,-2.76 -2.24,-5 -5,-5v2c1.66,0 3,1.34 3,3z"/>
+</vector>
diff --git a/java/com/android/dialer/calldetails/CallDetailsActivity.java b/java/com/android/dialer/calldetails/CallDetailsActivity.java
index 672043b..4dc294e 100644
--- a/java/com/android/dialer/calldetails/CallDetailsActivity.java
+++ b/java/com/android/dialer/calldetails/CallDetailsActivity.java
@@ -28,7 +28,6 @@
 import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener;
 import com.android.dialer.calllog.database.contract.AnnotatedCallLogContract.AnnotatedCallLog;
 import com.android.dialer.common.Assert;
-import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.protos.ProtoParsers;
 
@@ -42,26 +41,27 @@
  */
 public final class CallDetailsActivity extends CallDetailsActivityCommon {
   public static final String EXTRA_COALESCED_CALL_LOG_IDS = "coalesced_call_log_ids";
-  public static final String EXTRA_CONTACT = "contact";
+  public static final String EXTRA_HEADER_INFO = "header_info";
 
   private static final int CALL_DETAILS_LOADER_ID = 0;
 
   /** IDs of call log entries, used to retrieve them from the annotated call log. */
   private CoalescedIds coalescedCallLogIds;
 
-  private DialerContact contact;
+  /** Info to be shown in the header. */
+  private CallDetailsHeaderInfo headerInfo;
 
   /** Returns an {@link Intent} to launch this activity. */
   public static Intent newInstance(
       Context context,
       CoalescedIds coalescedAnnotatedCallLogIds,
-      DialerContact contact,
+      CallDetailsHeaderInfo callDetailsHeaderInfo,
       boolean canReportCallerId,
       boolean canSupportAssistedDialing) {
     Intent intent = new Intent(context, CallDetailsActivity.class);
-    ProtoParsers.put(intent, EXTRA_CONTACT, Assert.isNotNull(contact));
     ProtoParsers.put(
         intent, EXTRA_COALESCED_CALL_LOG_IDS, Assert.isNotNull(coalescedAnnotatedCallLogIds));
+    ProtoParsers.put(intent, EXTRA_HEADER_INFO, Assert.isNotNull(callDetailsHeaderInfo));
     intent.putExtra(EXTRA_CAN_REPORT_CALLER_ID, canReportCallerId);
     intent.putExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING, canSupportAssistedDialing);
     return intent;
@@ -70,14 +70,17 @@
   @Override
   protected void handleIntent(Intent intent) {
     Assert.checkArgument(intent.hasExtra(EXTRA_COALESCED_CALL_LOG_IDS));
+    Assert.checkArgument(intent.hasExtra(EXTRA_HEADER_INFO));
     Assert.checkArgument(intent.hasExtra(EXTRA_CAN_REPORT_CALLER_ID));
     Assert.checkArgument(intent.hasExtra(EXTRA_CAN_SUPPORT_ASSISTED_DIALING));
 
-    contact = ProtoParsers.getTrusted(intent, EXTRA_CONTACT, DialerContact.getDefaultInstance());
     setCallDetailsEntries(CallDetailsEntries.getDefaultInstance());
     coalescedCallLogIds =
         ProtoParsers.getTrusted(
             intent, EXTRA_COALESCED_CALL_LOG_IDS, CoalescedIds.getDefaultInstance());
+    headerInfo =
+        ProtoParsers.getTrusted(
+            intent, EXTRA_HEADER_INFO, CallDetailsHeaderInfo.getDefaultInstance());
 
     getLoaderManager()
         .initLoader(
@@ -91,7 +94,7 @@
       DeleteCallDetailsListener deleteCallDetailsListener) {
     return new CallDetailsAdapter(
         this,
-        contact,
+        headerInfo,
         getCallDetailsEntries(),
         callDetailsHeaderListener,
         reportCallIdListener,
@@ -100,7 +103,7 @@
 
   @Override
   protected String getNumber() {
-    return contact.getNumber();
+    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
   }
 
   /**
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapter.java b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
index dfa472a..2a4c1ef 100644
--- a/java/com/android/dialer/calldetails/CallDetailsAdapter.java
+++ b/java/com/android/dialer/calldetails/CallDetailsAdapter.java
@@ -16,12 +16,12 @@
 
 package com.android.dialer.calldetails;
 
+
 import android.content.Context;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import com.android.dialer.calldetails.CallDetailsFooterViewHolder.DeleteCallDetailsListener;
 import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener;
-import com.android.dialer.dialercontact.DialerContact;
 
 /**
  * A {@link RecyclerView.Adapter} for {@link CallDetailsActivity}.
@@ -31,11 +31,12 @@
  */
 final class CallDetailsAdapter extends CallDetailsAdapterCommon {
 
-  private final DialerContact contact;
+  /** Info to be shown in the header. */
+  private final CallDetailsHeaderInfo headerInfo;
 
   CallDetailsAdapter(
       Context context,
-      DialerContact contact,
+      CallDetailsHeaderInfo calldetailsHeaderInfo,
       CallDetailsEntries callDetailsEntries,
       CallDetailsHeaderListener callDetailsHeaderListener,
       CallDetailsFooterViewHolder.ReportCallIdListener reportCallIdListener,
@@ -46,26 +47,29 @@
         callDetailsHeaderListener,
         reportCallIdListener,
         deleteCallDetailsListener);
-    this.contact = contact;
+    this.headerInfo = calldetailsHeaderInfo;
   }
 
   @Override
   protected CallDetailsHeaderViewHolder createCallDetailsHeaderViewHolder(
       View container, CallDetailsHeaderListener callDetailsHeaderListener) {
     return new CallDetailsHeaderViewHolder(
-        container, contact.getNumber(), contact.getPostDialDigits(), callDetailsHeaderListener);
+        container,
+        headerInfo.getDialerPhoneNumber().getNormalizedNumber(),
+        headerInfo.getDialerPhoneNumber().getPostDialPortion(),
+        callDetailsHeaderListener);
   }
 
   @Override
   protected void bindCallDetailsHeaderViewHolder(
       CallDetailsHeaderViewHolder callDetailsHeaderViewHolder, int position) {
-    callDetailsHeaderViewHolder.updateContactInfo(contact, getCallbackAction());
+    callDetailsHeaderViewHolder.updateContactInfo(headerInfo, getCallbackAction());
     callDetailsHeaderViewHolder.updateAssistedDialingInfo(
         getCallDetailsEntries().getEntries(position));
   }
 
   @Override
   protected String getNumber() {
-    return contact.getNumber();
+    return headerInfo.getDialerPhoneNumber().getNormalizedNumber();
   }
 }
diff --git a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
index 34ed688..e4fded1 100644
--- a/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
+++ b/java/com/android/dialer/calldetails/CallDetailsHeaderViewHolder.java
@@ -37,6 +37,7 @@
 import com.android.dialer.compat.telephony.TelephonyManagerCompat;
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.glidephotomanager.GlidePhotoManagerComponent;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 
@@ -182,6 +183,19 @@
     setCallbackAction(callbackAction);
   }
 
+  void updateContactInfo(CallDetailsHeaderInfo headerInfo, @CallbackAction int callbackAction) {
+    GlidePhotoManagerComponent.get(context)
+        .glidePhotoManager()
+        .loadQuickContactBadge(contactPhoto, headerInfo.getPhotoInfo());
+
+    nameView.setText(headerInfo.getPrimaryText());
+    numberView.setText(headerInfo.getSecondaryText());
+
+    // TODO(a bug): show SIM info in the TextView returned by getNetworkView().
+
+    setCallbackAction(callbackAction);
+  }
+
   private void setCallbackAction(@CallbackAction int callbackAction) {
     this.callbackAction = callbackAction;
     switch (callbackAction) {
diff --git a/java/com/android/dialer/calldetails/proto/call_details_header_info.proto b/java/com/android/dialer/calldetails/proto/call_details_header_info.proto
new file mode 100644
index 0000000..ea7ba1e
--- /dev/null
+++ b/java/com/android/dialer/calldetails/proto/call_details_header_info.proto
@@ -0,0 +1,36 @@
+syntax = "proto2";
+
+option java_package = "com.android.dialer.calldetails";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+
+import "java/com/android/dialer/phonenumberproto/dialer_phone_number.proto";
+import "java/com/android/dialer/glidephotomanager/photo_info.proto";
+
+package com.android.dialer.calldetails;
+
+// Contains information for the header in CallDetailsActivity
+// Next ID: 5
+message CallDetailsHeaderInfo {
+  // The number of all call detail entries.
+  optional com.android.dialer.DialerPhoneNumber dialer_phone_number = 1;
+
+  // Information used to load the contact photo.
+  optional com.android.dialer.glidephotomanager.PhotoInfo photo_info = 2;
+
+  // Primary text of the header, which can be
+  // (1) a presentation name (e.g., "Restricted", "Unknown", etc.),
+  // (2) the contact name, or
+  // (3) the formatted number.
+  optional string primary_text = 3;
+
+  // Secondary test of the header, which describes the number.
+  // Some examples are:
+  //   "Mobile • 555-1234",
+  //   "Blocked • Mobile • 555-1234", and
+  //   "Spam • Mobile • 555-1234".
+  optional string secondary_text = 4;
+
+  // TODO(a bug): Add SIM info.
+}
\ No newline at end of file
diff --git a/java/com/android/dialer/calllog/ui/menu/Modules.java b/java/com/android/dialer/calllog/ui/menu/Modules.java
index 184f7ab..fd5f6a3 100644
--- a/java/com/android/dialer/calllog/ui/menu/Modules.java
+++ b/java/com/android/dialer/calllog/ui/menu/Modules.java
@@ -22,11 +22,12 @@
 import android.text.TextUtils;
 import com.android.dialer.blockreportspam.BlockReportSpamDialogInfo;
 import com.android.dialer.calldetails.CallDetailsActivity;
+import com.android.dialer.calldetails.CallDetailsHeaderInfo;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.calllog.model.CoalescedRow;
-import com.android.dialer.calllogutils.CallLogContactTypes;
-import com.android.dialer.calllogutils.PhoneNumberDisplayUtil;
-import com.android.dialer.dialercontact.DialerContact;
+import com.android.dialer.calllogutils.CallLogEntryText;
+import com.android.dialer.calllogutils.NumberAttributesConverter;
+import com.android.dialer.glidephotomanager.PhotoInfo;
 import com.android.dialer.historyitemactions.DividerModule;
 import com.android.dialer.historyitemactions.HistoryItemActionModule;
 import com.android.dialer.historyitemactions.IntentModule;
@@ -106,8 +107,6 @@
       }
     }
 
-    // TODO(zachh): Revisit if DialerContact is the best thing to pass to CallDetails; could
-    // it use a HistoryItemPrimaryActionInfo instead?
     modules.add(createModuleForAccessingCallDetails(context, row));
 
     modules.add(new DeleteCallLogItemModule(context, row.coalescedIds()));
@@ -156,43 +155,31 @@
         CallDetailsActivity.newInstance(
             context,
             row.coalescedIds(),
-            createDialerContactFromRow(context, row),
+            createCallDetailsHeaderInfoFromRow(context, row),
             canReportAsInvalidNumber,
             canSupportAssistedDialing),
         R.string.call_details_menu_label,
         R.drawable.quantum_ic_info_outline_vd_theme_24);
   }
 
-  private static DialerContact createDialerContactFromRow(Context context, CoalescedRow row) {
-    Optional<String> presentationName =
-        PhoneNumberDisplayUtil.getNameForPresentation(context, row.numberPresentation());
-    if (presentationName.isPresent()) {
-      return DialerContact.newBuilder()
-          .setNameOrNumber(presentationName.get())
-          .setContactType(CallLogContactTypes.getContactType(row))
-          .build();
+  private static CallDetailsHeaderInfo createCallDetailsHeaderInfoFromRow(
+      Context context, CoalescedRow row) {
+    return CallDetailsHeaderInfo.newBuilder()
+        .setDialerPhoneNumber(row.number())
+        .setPhotoInfo(createPhotoInfoFromRow(row))
+        .setPrimaryText(CallLogEntryText.buildPrimaryText(context, row).toString())
+        .setSecondaryText(
+            CallLogEntryText.buildSecondaryTextForBottomSheet(context, row).toString())
+        .build();
+  }
+
+  private static PhotoInfo createPhotoInfoFromRow(CoalescedRow row) {
+    PhotoInfo.Builder photoInfoBuilder =
+        NumberAttributesConverter.toPhotoInfoBuilder(row.numberAttributes())
+            .setIsVideo((row.features() & Calls.FEATURES_VIDEO) == Calls.FEATURES_VIDEO);
+    if (!TextUtils.isEmpty(row.formattedNumber())) {
+      photoInfoBuilder.setFormattedNumber(row.formattedNumber());
     }
-
-    String normalizedNumber = row.number().getNormalizedNumber();
-    DialerContact.Builder dialerContactBuilder =
-        DialerContact.newBuilder()
-            .setNumber(normalizedNumber)
-            .setContactType(CallLogContactTypes.getContactType(row))
-            .setPhotoId(row.numberAttributes().getPhotoId());
-
-    if (!row.numberAttributes().getName().isEmpty()) {
-      dialerContactBuilder.setNameOrNumber(row.numberAttributes().getName());
-      if (row.formattedNumber() != null) {
-        dialerContactBuilder.setDisplayNumber(row.formattedNumber());
-      }
-    } else if (!TextUtils.isEmpty(row.formattedNumber())) {
-      dialerContactBuilder.setNameOrNumber(row.formattedNumber());
-    }
-
-    dialerContactBuilder.setNumberLabel(row.numberAttributes().getNumberTypeLabel());
-    dialerContactBuilder.setPhotoUri(row.numberAttributes().getPhotoUri());
-    dialerContactBuilder.setContactUri(row.numberAttributes().getLookupUri());
-
-    return dialerContactBuilder.build();
+    return photoInfoBuilder.build();
   }
 }
diff --git a/java/com/android/dialer/calllogutils/CallLogContactTypes.java b/java/com/android/dialer/calllogutils/CallLogContactTypes.java
deleted file mode 100644
index 5865156..0000000
--- a/java/com/android/dialer/calllogutils/CallLogContactTypes.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2018 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.dialer.calllogutils;
-
-import com.android.dialer.calllog.model.CoalescedRow;
-import com.android.dialer.lettertile.LetterTileDrawable;
-
-/** Determines the {@link LetterTileDrawable.ContactType} for a {@link CoalescedRow}. */
-public class CallLogContactTypes {
-
-  /** Determines the {@link LetterTileDrawable.ContactType} for a {@link CoalescedRow}. */
-  @LetterTileDrawable.ContactType
-  public static int getContactType(CoalescedRow row) {
-    // TODO(zachh): Set these fields correctly.
-    boolean isVoicemail = false;
-    boolean isSpam = false;
-    boolean isBusiness = false;
-    int numberPresentation = row.numberPresentation();
-    boolean isConference = false;
-
-    return LetterTileDrawable.getContactTypeFromPrimitives(
-        isVoicemail, isSpam, isBusiness, numberPresentation, isConference);
-  }
-}
diff --git a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
index f4338ce..ccc9420 100644
--- a/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
+++ b/java/com/android/dialer/historyitemactions/HistoryItemPrimaryActionInfo.java
@@ -49,7 +49,7 @@
   @Nullable
   public abstract Intent intent();
 
-  // TODO(zachh): Add SIM info here if should be shown in bottom sheet.
+  // TODO(a bug): Add SIM info.
 
   /** Builder for {@link HistoryItemPrimaryActionInfo}. */
   @AutoValue.Builder
diff --git a/java/com/android/incallui/commontheme/res/values/colors.xml b/java/com/android/incallui/commontheme/res/values/colors.xml
index 50b0617..27c1b6c 100644
--- a/java/com/android/incallui/commontheme/res/values/colors.xml
+++ b/java/com/android/incallui/commontheme/res/values/colors.xml
@@ -21,4 +21,6 @@
 
   <!-- Background color for spam. This color must match one of background_colors_dark in call UI. -->
   <color name="incall_call_spam_background_color">@color/blocked_contact_background</color>
+
+  <color name="divider_line_color">#D8D8D8</color>
 </resources>
diff --git a/java/com/android/incallui/rtt/impl/AudioSelectMenu.java b/java/com/android/incallui/rtt/impl/AudioSelectMenu.java
new file mode 100644
index 0000000..2d4ab39
--- /dev/null
+++ b/java/com/android/incallui/rtt/impl/AudioSelectMenu.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2018 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.rtt.impl;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff.Mode;
+import android.telecom.CallAudioState;
+import android.view.View;
+import android.widget.PopupWindow;
+import com.android.incallui.incall.protocol.InCallButtonUiDelegate;
+
+/** Audio select menu for RTT call. */
+public class AudioSelectMenu extends PopupWindow {
+
+  private final InCallButtonUiDelegate inCallButtonUiDelegate;
+  private final Context context;
+  private final OnButtonClickListener onButtonClickListener;
+
+  interface OnButtonClickListener {
+    void onBackPressed();
+  }
+
+  AudioSelectMenu(
+      Context context,
+      InCallButtonUiDelegate inCallButtonUiDelegate,
+      OnButtonClickListener onButtonClickListener) {
+    super(context);
+    this.context = context;
+    this.inCallButtonUiDelegate = inCallButtonUiDelegate;
+    this.onButtonClickListener = onButtonClickListener;
+    View view = View.inflate(context, R.layout.audio_route, null);
+    setContentView(view);
+    setOnDismissListener(this::dismiss);
+    setFocusable(true);
+    setWidth(context.getResources().getDimensionPixelSize(R.dimen.rtt_overflow_menu_width));
+    view.findViewById(R.id.audioroute_back)
+        .setOnClickListener(
+            v -> {
+              dismiss();
+              this.onButtonClickListener.onBackPressed();
+            });
+    CallAudioState audioState = inCallButtonUiDelegate.getCurrentAudioState();
+    initItem(
+        view.findViewById(R.id.audioroute_bluetooth), CallAudioState.ROUTE_BLUETOOTH, audioState);
+    initItem(view.findViewById(R.id.audioroute_speaker), CallAudioState.ROUTE_SPEAKER, audioState);
+    initItem(
+        view.findViewById(R.id.audioroute_headset), CallAudioState.ROUTE_WIRED_HEADSET, audioState);
+    initItem(
+        view.findViewById(R.id.audioroute_earpiece), CallAudioState.ROUTE_EARPIECE, audioState);
+  }
+
+  private void initItem(RttCheckableButton item, final int itemRoute, CallAudioState audioState) {
+    int selectedColor =
+        context.getColor(com.android.incallui.audioroute.R.color.dialer_theme_color);
+    if ((audioState.getSupportedRouteMask() & itemRoute) == 0) {
+      item.setVisibility(View.GONE);
+    } else if (audioState.getRoute() == itemRoute) {
+      item.setTextColor(selectedColor);
+      item.setCompoundDrawableTintList(ColorStateList.valueOf(selectedColor));
+      item.setCompoundDrawableTintMode(Mode.SRC_ATOP);
+    }
+    item.setOnClickListener(
+        (v) -> {
+          dismiss();
+          inCallButtonUiDelegate.setAudioRoute(itemRoute);
+        });
+  }
+}
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index c6eef9c..dd55ccf 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -48,7 +48,6 @@
 import com.android.dialer.common.FragmentUtils;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.UiUtil;
-import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment;
 import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment.AudioRouteSelectorPresenter;
 import com.android.incallui.call.DialerCall.State;
 import com.android.incallui.hold.OnHoldFragment;
@@ -447,8 +446,12 @@
 
   @Override
   public void showAudioRouteSelector() {
-    AudioRouteSelectorDialogFragment.newInstance(inCallButtonUiDelegate.getCurrentAudioState())
-        .show(getChildFragmentManager(), null);
+    AudioSelectMenu audioSelectMenu =
+        new AudioSelectMenu(
+            getContext(),
+            inCallButtonUiDelegate,
+            () -> overflowMenu.showAtLocation(getView(), Gravity.TOP | Gravity.RIGHT, 0, 0));
+    audioSelectMenu.showAtLocation(getView(), Gravity.TOP | Gravity.RIGHT, 0, 0);
   }
 
   @Override
diff --git a/java/com/android/incallui/rtt/impl/res/layout/audio_route.xml b/java/com/android/incallui/rtt/impl/res/layout/audio_route.xml
new file mode 100644
index 0000000..89b5c76
--- /dev/null
+++ b/java/com/android/incallui/rtt/impl/res/layout/audio_route.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="180dp"
+    android:layout_height="wrap_content"
+    android:paddingTop="8dp"
+    android:paddingBottom="8dp"
+    android:background="@drawable/overflow_menu_background"
+    android:orientation="vertical">
+  <com.android.incallui.rtt.impl.RttCheckableButton
+      android:id="@+id/audioroute_back"
+      style="@style/RttButton"
+      android:drawableStart="@drawable/quantum_ic_arrow_back_vd_theme_24"
+      android:text="@string/rtt_button_back"/>
+  <View
+      android:layout_width="match_parent"
+      android:layout_height="1dp"
+      android:background="@color/divider_line_color"/>
+  <com.android.incallui.rtt.impl.RttCheckableButton
+      android:id="@+id/audioroute_bluetooth"
+      style="@style/RttButton"
+      android:drawableStart="@drawable/quantum_ic_bluetooth_audio_vd_theme_24"
+      android:text="@string/audioroute_bluetooth"/>
+  <com.android.incallui.rtt.impl.RttCheckableButton
+      android:id="@+id/audioroute_speaker"
+      style="@style/RttButton"
+      android:drawableStart="@drawable/quantum_ic_volume_up_vd_theme_24"
+      android:text="@string/audioroute_speaker"/>
+  <com.android.incallui.rtt.impl.RttCheckableButton
+      android:id="@+id/audioroute_earpiece"
+      style="@style/RttButton"
+      android:drawableStart="@drawable/quantum_ic_phone_in_talk_vd_theme_24"
+      android:text="@string/audioroute_phone"/>
+  <com.android.incallui.rtt.impl.RttCheckableButton
+      android:id="@+id/audioroute_headset"
+      style="@style/RttButton"
+      android:drawableStart="@drawable/quantum_ic_headset_vd_theme_24"
+      android:text="@string/audioroute_headset"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/java/com/android/incallui/rtt/impl/res/values/strings.xml b/java/com/android/incallui/rtt/impl/res/values/strings.xml
index 0b9eb71..dce16fd 100644
--- a/java/com/android/incallui/rtt/impl/res/values/strings.xml
+++ b/java/com/android/incallui/rtt/impl/res/values/strings.xml
@@ -23,4 +23,8 @@
 
   <!-- Content description for avatar of RTT chat message. [CHAR LIMIT=NONE] -->
   <string name="content_description_rtt_chat_avatar">Avatar</string>
+
+  <!-- Text for back button. [CHAR LIMIT=20] -->
+  <string name="rtt_button_back">Back</string>
+
 </resources>
\ No newline at end of file