From ed677ef166d416743169a268664b072ace1fa93b Mon Sep 17 00:00:00 2001 From: wangqi Date: Wed, 4 Apr 2018 12:03:00 -0700 Subject: Migrate RTT chat history to use proto buffer. This change also moved chat history to be saved in DialerCall, thus it will be persist when switching calls. Bug: 67596257 Test: RttChatMessageTest PiperOrigin-RevId: 191626079 Change-Id: I65e9c6ac7aa41beb45dfe561b0a48506ea938e6f --- .../android/incallui/rtt/impl/RttChatAdapter.java | 50 ++++++++++------ .../android/incallui/rtt/impl/RttChatFragment.java | 35 ++++++++--- .../android/incallui/rtt/impl/RttChatMessage.java | 70 +++++++++++----------- 3 files changed, 93 insertions(+), 62 deletions(-) (limited to 'java/com/android/incallui/rtt/impl') diff --git a/java/com/android/incallui/rtt/impl/RttChatAdapter.java b/java/com/android/incallui/rtt/impl/RttChatAdapter.java index fb73d19c0..692266335 100644 --- a/java/com/android/incallui/rtt/impl/RttChatAdapter.java +++ b/java/com/android/incallui/rtt/impl/RttChatAdapter.java @@ -18,8 +18,6 @@ package com.android.incallui.rtt.impl; import android.content.Context; import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; @@ -27,6 +25,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.android.dialer.common.LogUtil; +import com.android.dialer.rtt.RttTranscript; +import com.android.dialer.rtt.RttTranscriptMessage; import java.util.ArrayList; import java.util.List; @@ -41,23 +41,14 @@ public class RttChatAdapter extends RecyclerView.Adapter rttMessages; + private List rttMessages = new ArrayList<>(); private int lastIndexOfLocalMessage = -1; private final MessageListener messageListener; - RttChatAdapter(Context context, MessageListener listener, @Nullable Bundle savedInstanceState) { + RttChatAdapter(Context context, MessageListener listener) { this.context = context; this.messageListener = listener; - if (savedInstanceState == null) { - rttMessages = new ArrayList<>(); - } else { - rttMessages = savedInstanceState.getParcelableArrayList(KEY_MESSAGE_DATA); - lastIndexOfLocalMessage = savedInstanceState.getInt(KEY_LAST_LOCAL_MESSAGE); - } } @Override @@ -168,12 +159,35 @@ public class RttChatAdapter extends RecyclerView.Adapter) rttMessages); - bundle.putInt(KEY_LAST_LOCAL_MESSAGE, lastIndexOfLocalMessage); - } - void setAvatarDrawable(Drawable drawable) { avatarDrawable = drawable; } + + /** + * Restores RTT chat history from {@code RttTranscript}. + * + * @param rttTranscript transcript saved previously. + * @return last unfinished local message, return null if there is no current editing local + * message. + */ + @Nullable + String onRestoreRttChat(RttTranscript rttTranscript) { + LogUtil.enterBlock("RttChatAdapater.onRestoreRttChat"); + rttMessages = RttChatMessage.fromTranscript(rttTranscript); + lastIndexOfLocalMessage = RttChatMessage.getLastIndexLocalMessage(rttMessages); + notifyDataSetChanged(); + if (lastIndexOfLocalMessage < 0) { + return null; + } + RttChatMessage message = rttMessages.get(lastIndexOfLocalMessage); + if (!message.isFinished()) { + return message.getContent(); + } else { + return null; + } + } + + List getRttTranscriptMessageList() { + return RttChatMessage.toTranscriptMessageList(rttMessages); + } } diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java index a889408c0..53ad5829e 100644 --- a/java/com/android/incallui/rtt/impl/RttChatFragment.java +++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java @@ -49,6 +49,8 @@ import com.android.dialer.common.FragmentUtils; import com.android.dialer.common.LogUtil; import com.android.dialer.common.UiUtil; import com.android.dialer.lettertile.LetterTileDrawable; +import com.android.dialer.rtt.RttTranscript; +import com.android.dialer.rtt.RttTranscriptMessage; import com.android.dialer.util.DrawableConverter; import com.android.incallui.audioroute.AudioRouteSelectorDialogFragment.AudioRouteSelectorPresenter; import com.android.incallui.call.DialerCall.State; @@ -69,6 +71,7 @@ import com.android.incallui.rtt.protocol.Constants; import com.android.incallui.rtt.protocol.RttCallScreen; import com.android.incallui.rtt.protocol.RttCallScreenDelegate; import com.android.incallui.rtt.protocol.RttCallScreenDelegateFactory; +import java.util.List; /** RTT chat fragment to show chat bubbles. */ public class RttChatFragment extends Fragment @@ -150,6 +153,11 @@ public class RttChatFragment extends Fragment inCallButtonUiDelegate.onInCallButtonUiReady(this); } + @Override + public List getRttTranscriptMessageList() { + return adapter.getRttTranscriptMessageList(); + } + @Nullable @Override public View onCreateView( @@ -172,10 +180,7 @@ public class RttChatFragment extends Fragment if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) { String lastMessage = adapter.retrieveLastLocalMessage(); if (lastMessage != null) { - isClearingInput = true; - editText.setText(lastMessage); - editText.setSelection(lastMessage.length()); - isClearingInput = false; + resumeInput(lastMessage); rttCallScreenDelegate.onLocalMessage("\b"); return true; } @@ -188,7 +193,7 @@ public class RttChatFragment extends Fragment layoutManager.setStackFromEnd(true); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(false); - adapter = new RttChatAdapter(getContext(), this, savedInstanceState); + adapter = new RttChatAdapter(getContext(), this); recyclerView.setAdapter(adapter); recyclerView.addOnScrollListener( new OnScrollListener() { @@ -215,9 +220,7 @@ public class RttChatFragment extends Fragment submitButton.setOnClickListener( v -> { adapter.submitLocalMessage(); - isClearingInput = true; - editText.setText(""); - isClearingInput = false; + resumeInput(""); rttCallScreenDelegate.onLocalMessage(Constants.BUBBLE_BREAKER); // Auto scrolling for new messages should be resumed since user has submit current // message. @@ -313,6 +316,21 @@ public class RttChatFragment extends Fragment } } + @Override + public void onRestoreRttChat(RttTranscript rttTranscript) { + String unfinishedLocalMessage = adapter.onRestoreRttChat(rttTranscript); + if (unfinishedLocalMessage != null) { + resumeInput(unfinishedLocalMessage); + } + } + + private void resumeInput(String input) { + isClearingInput = true; + editText.setText(input); + editText.setSelection(input.length()); + isClearingInput = false; + } + @Override public void onStart() { LogUtil.enterBlock("RttChatFragment.onStart"); @@ -324,7 +342,6 @@ public class RttChatFragment extends Fragment @Override public void onSaveInstanceState(@NonNull Bundle bundle) { super.onSaveInstanceState(bundle); - adapter.onSaveInstanceState(bundle); } @Override diff --git a/java/com/android/incallui/rtt/impl/RttChatMessage.java b/java/com/android/incallui/rtt/impl/RttChatMessage.java index 0060b1bd1..2f3933a50 100644 --- a/java/com/android/incallui/rtt/impl/RttChatMessage.java +++ b/java/com/android/incallui/rtt/impl/RttChatMessage.java @@ -16,22 +16,23 @@ package com.android.incallui.rtt.impl; -import android.os.Parcel; -import android.os.Parcelable; import android.support.annotation.NonNull; import com.android.dialer.common.Assert; +import com.android.dialer.rtt.RttTranscript; +import com.android.dialer.rtt.RttTranscriptMessage; import com.android.incallui.rtt.protocol.Constants; import com.google.common.base.Splitter; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** Message class that holds one RTT chat content. */ -final class RttChatMessage implements Parcelable { +final class RttChatMessage { private static final Splitter SPLITTER = Splitter.on(Constants.BUBBLE_BREAKER); boolean isRemote; - public boolean hasAvatar; + long timstamp; private final StringBuilder content = new StringBuilder(); private boolean isFinished; @@ -178,40 +179,39 @@ final class RttChatMessage implements Parcelable { return i; } - @Override - public int describeContents() { - return 0; + static List toTranscriptMessageList(List messageList) { + List transcriptMessageList = new ArrayList<>(); + for (RttChatMessage message : messageList) { + transcriptMessageList.add( + RttTranscriptMessage.newBuilder() + .setContent(message.getContent()) + .setTimestamp(message.timstamp) + .setIsRemote(message.isRemote) + .setIsFinished(message.isFinished) + .build()); + } + return transcriptMessageList; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(getContent()); - boolean[] values = new boolean[2]; - values[0] = isRemote; - values[1] = isFinished; - dest.writeBooleanArray(values); + static List fromTranscript(RttTranscript rttTranscript) { + List messageList = new ArrayList<>(); + if (rttTranscript == null) { + return messageList; + } + for (RttTranscriptMessage message : rttTranscript.getMessagesList()) { + RttChatMessage chatMessage = new RttChatMessage(); + chatMessage.append(message.getContent()); + chatMessage.timstamp = message.getTimestamp(); + chatMessage.isRemote = message.getIsRemote(); + if (message.getIsFinished()) { + chatMessage.finish(); + } + messageList.add(chatMessage); + } + return messageList; } - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public RttChatMessage createFromParcel(Parcel in) { - return new RttChatMessage(in); - } - - @Override - public RttChatMessage[] newArray(int size) { - return new RttChatMessage[size]; - } - }; - - private RttChatMessage(Parcel in) { - content.append(in.readString()); - boolean[] values = new boolean[2]; - in.readBooleanArray(values); - isRemote = values[0]; - isFinished = values[1]; + RttChatMessage() { + timstamp = System.currentTimeMillis(); } - - RttChatMessage() {} } -- cgit v1.2.3