UI adjustment to RTT screen.
1. Don't close overflow menu after menu item is clicked.
2. Add correct shadow and animation to overflow menu.
3. Only scroll when remote message is updated if input box is empty.
4. Only hide keyboard if scrolling up is triggered by user.
5. Add paddingTop to recyclerView so that first message won't be covered by toolbar.
Bug: 70177426
Test: manual
PiperOrigin-RevId: 191002774
Change-Id: Ic69f80323e3d31d7853d4e8d0c6e4c100fe4a776
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