summaryrefslogtreecommitdiff
path: root/java/com
diff options
context:
space:
mode:
authorwangqi <wangqi@google.com>2018-03-08 14:24:06 -0800
committerCopybara-Service <copybara-piper@google.com>2018-03-08 17:04:17 -0800
commit6b4f264f40a2b3386c4cd1d8134a8d821be94052 (patch)
tree7537651b60ee929180a9d93233671e3e49b9ba05 /java/com
parentdb30a13b91ff62021a3a14b30c6b2c1b2f1d5e3d (diff)
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
Diffstat (limited to 'java/com')
-rw-r--r--java/com/android/incallui/rtt/impl/RttChatAdapter.java12
-rw-r--r--java/com/android/incallui/rtt/impl/RttChatFragment.java2
-rw-r--r--java/com/android/incallui/rtt/impl/RttChatMessage.java25
3 files changed, 25 insertions, 14 deletions
diff --git a/java/com/android/incallui/rtt/impl/RttChatAdapter.java b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
index 42bd2c60c..912314945 100644
--- a/java/com/android/incallui/rtt/impl/RttChatAdapter.java
+++ b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
@@ -139,6 +139,18 @@ public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolde
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 396b89e75..5094c318e 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -204,7 +204,7 @@ public class RttChatFragment extends Fragment
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 fe30364b8..6c852cf92 100644
--- a/java/com/android/incallui/rtt/impl/RttChatMessage.java
+++ b/java/com/android/incallui/rtt/impl/RttChatMessage.java
@@ -18,7 +18,6 @@ package com.android.incallui.rtt.impl;
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 @@ final class RttChatMessage {
}
/**
- * 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 @@ final class RttChatMessage {
*
* <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++;
+ }
+ for (int i = indexChangeStart; i < oldMessage.length(); i++) {
+ modify.append('\b');
}
- modify.append(s, start, start + count);
- if (start + count < s.length()) {
- modify.append(s, start + count, s.length());
+ for (int i = indexChangeStart; i < newMesssage.length(); i++) {
+ modify.append(newMesssage.charAt(i));
}
return modify.toString();
}