Merge "UI adjustment to RTT screen."
diff --git a/java/com/android/incallui/rtt/impl/AudioSelectMenu.java b/java/com/android/incallui/rtt/impl/AudioSelectMenu.java
index 2d4ab39..01c3950 100644
--- a/java/com/android/incallui/rtt/impl/AudioSelectMenu.java
+++ b/java/com/android/incallui/rtt/impl/AudioSelectMenu.java
@@ -39,7 +39,7 @@
       Context context,
       InCallButtonUiDelegate inCallButtonUiDelegate,
       OnButtonClickListener onButtonClickListener) {
-    super(context);
+    super(context, null, 0, R.style.OverflowMenu);
     this.context = context;
     this.inCallButtonUiDelegate = inCallButtonUiDelegate;
     this.onButtonClickListener = onButtonClickListener;
@@ -76,7 +76,6 @@
     }
     item.setOnClickListener(
         (v) -> {
-          dismiss();
           inCallButtonUiDelegate.setAudioRoute(itemRoute);
         });
   }
diff --git a/java/com/android/incallui/rtt/impl/RttChatAdapter.java b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
index 8d924c9..955fc9f 100644
--- a/java/com/android/incallui/rtt/impl/RttChatAdapter.java
+++ b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
@@ -33,7 +33,9 @@
 public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolder> {
 
   interface MessageListener {
-    void newMessageAdded();
+    void onUpdateRemoteMessage(int position);
+
+    void onUpdateLocalMessage(int position);
   }
 
   private static final String KEY_MESSAGE_DATA = "key_message_data";
@@ -114,7 +116,7 @@
   void addLocalMessage(String message) {
     updateCurrentLocalMessage(message);
     if (messageListener != null) {
-      messageListener.newMessageAdded();
+      messageListener.onUpdateLocalMessage(lastIndexOfLocalMessage);
     }
   }
 
@@ -143,7 +145,7 @@
     }
     updateCurrentRemoteMessage(message);
     if (messageListener != null) {
-      messageListener.newMessageAdded();
+      messageListener.onUpdateRemoteMessage(RttChatMessage.getLastIndexRemoteMessage(rttMessages));
     }
   }
 
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index 56ac242..a181f88 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -85,15 +85,6 @@
   private ImageButton submitButton;
   private boolean isClearingInput;
 
-  private final OnScrollListener onScrollListener =
-      new OnScrollListener() {
-        @Override
-        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-          if (dy < 0) {
-            UiUtil.hideKeyboardFrom(getContext(), editText);
-          }
-        }
-      };
   private InCallScreenDelegate inCallScreenDelegate;
   private RttCallScreenDelegate rttCallScreenDelegate;
   private InCallButtonUiDelegate inCallButtonUiDelegate;
@@ -105,6 +96,8 @@
   private SecondaryInfo savedSecondaryInfo;
   private TextView statusBanner;
   private PrimaryInfo primaryInfo;
+  private boolean isUserScrolling;
+  private boolean shouldAutoScrolling;
 
   /**
    * Create a new instance of RttChatFragment.
@@ -193,7 +186,27 @@
     recyclerView.setHasFixedSize(false);
     adapter = new RttChatAdapter(getContext(), this, savedInstanceState);
     recyclerView.setAdapter(adapter);
-    recyclerView.addOnScrollListener(onScrollListener);
+    recyclerView.addOnScrollListener(
+        new OnScrollListener() {
+          @Override
+          public void onScrollStateChanged(RecyclerView recyclerView, int i) {
+            if (i == RecyclerView.SCROLL_STATE_DRAGGING) {
+              isUserScrolling = true;
+            } else if (i == RecyclerView.SCROLL_STATE_IDLE) {
+              isUserScrolling = false;
+              // Auto scrolling for new messages should be resumed if it's scrolled to bottom.
+              shouldAutoScrolling = !recyclerView.canScrollVertically(1);
+            }
+          }
+
+          @Override
+          public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+            if (dy < 0 && isUserScrolling) {
+              UiUtil.hideKeyboardFrom(getContext(), editText);
+            }
+          }
+        });
+
     submitButton = view.findViewById(R.id.rtt_chat_submit_button);
     submitButton.setOnClickListener(
         v -> {
@@ -202,6 +215,9 @@
           editText.setText("");
           isClearingInput = false;
           rttCallScreenDelegate.onLocalMessage(Constants.BUBBLE_BREAKER);
+          // Auto scrolling for new messages should be resumed since user has submit current
+          // message.
+          shouldAutoScrolling = true;
         });
     submitButton.setEnabled(false);
     endCallButton = view.findViewById(R.id.rtt_end_call_button);
@@ -276,8 +292,21 @@
   }
 
   @Override
-  public void newMessageAdded() {
-    recyclerView.smoothScrollToPosition(adapter.getItemCount());
+  public void onUpdateLocalMessage(int position) {
+    if (position < 0) {
+      return;
+    }
+    recyclerView.smoothScrollToPosition(position);
+  }
+
+  @Override
+  public void onUpdateRemoteMessage(int position) {
+    if (position < 0) {
+      return;
+    }
+    if (shouldAutoScrolling) {
+      recyclerView.smoothScrollToPosition(position);
+    }
   }
 
   @Override
diff --git a/java/com/android/incallui/rtt/impl/RttChatMessage.java b/java/com/android/incallui/rtt/impl/RttChatMessage.java
index cbc53ef..0060b1b 100644
--- a/java/com/android/incallui/rtt/impl/RttChatMessage.java
+++ b/java/com/android/incallui/rtt/impl/RttChatMessage.java
@@ -162,7 +162,7 @@
     return i;
   }
 
-  private static int getLastIndexRemoteMessage(List<RttChatMessage> messageList) {
+  static int getLastIndexRemoteMessage(List<RttChatMessage> messageList) {
     int i = messageList.size() - 1;
     while (i >= 0 && !messageList.get(i).isRemote) {
       i--;
diff --git a/java/com/android/incallui/rtt/impl/RttOverflowMenu.java b/java/com/android/incallui/rtt/impl/RttOverflowMenu.java
index 6a7aeba..deee8ee 100644
--- a/java/com/android/incallui/rtt/impl/RttOverflowMenu.java
+++ b/java/com/android/incallui/rtt/impl/RttOverflowMenu.java
@@ -42,7 +42,7 @@
       Context context,
       InCallButtonUiDelegate inCallButtonUiDelegate,
       InCallScreenDelegate inCallScreenDelegate) {
-    super(context);
+    super(context, null, 0, R.style.OverflowMenu);
     this.inCallButtonUiDelegate = inCallButtonUiDelegate;
     this.inCallScreenDelegate = inCallScreenDelegate;
     View view = View.inflate(context, R.layout.overflow_menu, null);
@@ -67,7 +67,6 @@
           if (isSwitchToSecondaryButtonEnabled) {
             this.inCallScreenDelegate.onSecondaryInfoClicked();
           }
-          dismiss();
         });
   }
 
@@ -80,7 +79,6 @@
     } else if (button == dialpadButton) {
       inCallButtonUiDelegate.showDialpadClicked(isChecked);
     }
-    dismiss();
   }
 
   void setMuteButtonChecked(boolean isChecked) {
diff --git a/java/com/android/incallui/rtt/impl/res/drawable/overflow_menu_background.xml b/java/com/android/incallui/rtt/impl/res/drawable/overflow_menu_background.xml
index 6142986..2af14fd 100644
--- a/java/com/android/incallui/rtt/impl/res/drawable/overflow_menu_background.xml
+++ b/java/com/android/incallui/rtt/impl/res/drawable/overflow_menu_background.xml
@@ -18,4 +18,4 @@
     android:shape="rectangle">
   <solid android:color="@android:color/white"/>
   <corners android:radius="2dp"/>
-</shape>
\ No newline at end of file
+</shape>
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
index 89b5c76..f098316 100644
--- a/java/com/android/incallui/rtt/impl/res/layout/audio_route.xml
+++ b/java/com/android/incallui/rtt/impl/res/layout/audio_route.xml
@@ -20,7 +20,6 @@
     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"
diff --git a/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml b/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml
index 34a9954..ea7ff10 100644
--- a/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml
+++ b/java/com/android/incallui/rtt/impl/res/layout/frag_rtt_chat.xml
@@ -23,6 +23,7 @@
       android:id="@+id/rtt_recycler_view"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
+      android:paddingTop="70dp"
       android:paddingBottom="70dp"
       android:clipToPadding="false"/>
 
diff --git a/java/com/android/incallui/rtt/impl/res/layout/overflow_menu.xml b/java/com/android/incallui/rtt/impl/res/layout/overflow_menu.xml
index eb7e386..0ec36f3 100644
--- a/java/com/android/incallui/rtt/impl/res/layout/overflow_menu.xml
+++ b/java/com/android/incallui/rtt/impl/res/layout/overflow_menu.xml
@@ -20,7 +20,6 @@
     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/menu_mute"
diff --git a/java/com/android/incallui/rtt/impl/res/values/dimens.xml b/java/com/android/incallui/rtt/impl/res/values/dimens.xml
index 4c3fe02..a6418d7 100644
--- a/java/com/android/incallui/rtt/impl/res/values/dimens.xml
+++ b/java/com/android/incallui/rtt/impl/res/values/dimens.xml
@@ -18,4 +18,5 @@
   <dimen name="rtt_message_margin_top">16dp</dimen>
   <dimen name="rtt_same_group_message_margin_top">2dp</dimen>
   <dimen name="rtt_overflow_menu_width">180dp</dimen>
+  <dimen name="rtt_overflow_menu_elevation">8dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/java/com/android/incallui/rtt/impl/res/values/styles.xml b/java/com/android/incallui/rtt/impl/res/values/styles.xml
index bbacde8..667cd12 100644
--- a/java/com/android/incallui/rtt/impl/res/values/styles.xml
+++ b/java/com/android/incallui/rtt/impl/res/values/styles.xml
@@ -40,4 +40,10 @@
     <item name="android:theme">@style/ButtonTheme</item>
     <item name="android:background">?attr/selectableItemBackground</item>
   </style>
+
+  <style name="OverflowMenu">
+    <item name="android:popupAnimationStyle">@android:style/Animation.Dialog</item>
+    <item name="android:popupBackground">@drawable/overflow_menu_background</item>
+    <item name="android:popupElevation">@dimen/rtt_overflow_menu_elevation</item>
+  </style>
 </resources>
\ No newline at end of file