Optimize characters sent to remote party for RTT chat.
Instead of using things provided by Android of onTextChanged, we compare the
text in EditText with the text in bubble before the change and compute the
delta string need to send to remote party. This way we could minimize
characters sent thus reduce latency.
Bug: 67596257
Test: RttChatMessageTest
PiperOrigin-RevId: 188389325
Change-Id: I3023b484c32b2369ca8720104da74cf6906bb46e
diff --git a/java/com/android/incallui/rtt/impl/RttChatAdapter.java b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
index 42bd2c6..9123149 100644
--- a/java/com/android/incallui/rtt/impl/RttChatAdapter.java
+++ b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
@@ -139,6 +139,18 @@
lastIndexOfLocalMessage = -1;
}
+ String computeChangeOfLocalMessage(String newMessage) {
+ RttChatMessage rttChatMessage = null;
+ if (lastIndexOfLocalMessage >= 0) {
+ rttChatMessage = rttMessages.get(lastIndexOfLocalMessage);
+ }
+ if (rttChatMessage == null || rttChatMessage.isFinished()) {
+ return newMessage;
+ } else {
+ return RttChatMessage.computeChangedString(rttChatMessage.getContent(), newMessage);
+ }
+ }
+
void addRemoteMessage(String message) {
LogUtil.enterBlock("RttChatAdapater.addRemoteMessage");
if (TextUtils.isEmpty(message)) {
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index 396b89e..5094c31 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -204,7 +204,7 @@
if (isClearingInput) {
return;
}
- String messageToAppend = RttChatMessage.getChangedString(s, start, before, count);
+ String messageToAppend = adapter.computeChangeOfLocalMessage(s.toString());
if (!TextUtils.isEmpty(messageToAppend)) {
adapter.addLocalMessage(messageToAppend);
rttCallScreenDelegate.onLocalMessage(messageToAppend);
diff --git a/java/com/android/incallui/rtt/impl/RttChatMessage.java b/java/com/android/incallui/rtt/impl/RttChatMessage.java
index fe30364..6c852cf 100644
--- a/java/com/android/incallui/rtt/impl/RttChatMessage.java
+++ b/java/com/android/incallui/rtt/impl/RttChatMessage.java
@@ -18,7 +18,6 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.text.TextWatcher;
import com.android.incallui.rtt.protocol.Constants;
import com.google.common.base.Splitter;
import java.util.ArrayList;
@@ -59,10 +58,7 @@
}
/**
- * Generates delta change to a text.
- *
- * <p>This is used to track text change of input. See more details in {@link
- * TextWatcher#onTextChanged}
+ * Computes delta change of two string.
*
* <p>e.g. "hello world" -> "hello" : "\b\b\b\b\b\b"
*
@@ -72,16 +68,19 @@
*
* <p>"hello world" -> "hello new world" : "\b\b\b\b\bnew world"
*/
- static String getChangedString(CharSequence s, int start, int before, int count) {
+ static String computeChangedString(String oldMessage, String newMesssage) {
StringBuilder modify = new StringBuilder();
- char c = '\b';
- int oldLength = s.length() - count + before;
- for (int i = 0; i < oldLength - start; i++) {
- modify.append(c);
+ int indexChangeStart = 0;
+ while (indexChangeStart < oldMessage.length()
+ && indexChangeStart < newMesssage.length()
+ && oldMessage.charAt(indexChangeStart) == newMesssage.charAt(indexChangeStart)) {
+ indexChangeStart++;
}
- modify.append(s, start, start + count);
- if (start + count < s.length()) {
- modify.append(s, start + count, s.length());
+ for (int i = indexChangeStart; i < oldMessage.length(); i++) {
+ modify.append('\b');
+ }
+ for (int i = indexChangeStart; i < newMesssage.length(); i++) {
+ modify.append(newMesssage.charAt(i));
}
return modify.toString();
}