summaryrefslogtreecommitdiff
path: root/java/com/android/incallui/rtt/impl/RttChatAdapter.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui/rtt/impl/RttChatAdapter.java')
-rw-r--r--java/com/android/incallui/rtt/impl/RttChatAdapter.java107
1 files changed, 92 insertions, 15 deletions
diff --git a/java/com/android/incallui/rtt/impl/RttChatAdapter.java b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
index 692266335..f1cde759c 100644
--- a/java/com/android/incallui/rtt/impl/RttChatAdapter.java
+++ b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
@@ -18,8 +18,10 @@ package com.android.incallui.rtt.impl;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -27,11 +29,29 @@ import android.view.ViewGroup;
import com.android.dialer.common.LogUtil;
import com.android.dialer.rtt.RttTranscript;
import com.android.dialer.rtt.RttTranscriptMessage;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
/** Adapter class for holding RTT chat data. */
-public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolder> {
+public class RttChatAdapter extends RecyclerView.Adapter<ViewHolder> {
+
+ /** IntDef for the different types of rows that can be shown in the call log. */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ RowType.ADVISORY,
+ RowType.MESSAGE,
+ })
+ @interface RowType {
+ /** The transcript advisory message. */
+ int ADVISORY = 1;
+
+ /** RTT chat message. */
+ int MESSAGE = 2;
+ }
+
+ private static final int POSITION_ADVISORY = 0;
private Drawable avatarDrawable;
@@ -45,6 +65,7 @@ public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolde
private List<RttChatMessage> rttMessages = new ArrayList<>();
private int lastIndexOfLocalMessage = -1;
private final MessageListener messageListener;
+ private boolean shouldShowAdvisory;
RttChatAdapter(Context context, MessageListener listener) {
this.context = context;
@@ -52,29 +73,54 @@ public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolde
}
@Override
- public RttChatMessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ public ViewHolder onCreateViewHolder(ViewGroup parent, @RowType int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
- View view = layoutInflater.inflate(R.layout.rtt_chat_list_item, parent, false);
- return new RttChatMessageViewHolder(view);
+ switch (viewType) {
+ case RowType.ADVISORY:
+ View view = layoutInflater.inflate(R.layout.rtt_transcript_advisory, parent, false);
+ return new AdvisoryViewHolder(view);
+ case RowType.MESSAGE:
+ view = layoutInflater.inflate(R.layout.rtt_chat_list_item, parent, false);
+ return new RttChatMessageViewHolder(view);
+ default:
+ throw new RuntimeException("Unknown row type.");
+ }
}
@Override
public int getItemViewType(int position) {
- return super.getItemViewType(position);
+ if (shouldShowAdvisory && position == POSITION_ADVISORY) {
+ return RowType.ADVISORY;
+ } else {
+ return RowType.MESSAGE;
+ }
}
@Override
- public void onBindViewHolder(RttChatMessageViewHolder rttChatMessageViewHolder, int i) {
- boolean isSameGroup = false;
- if (i > 0) {
- isSameGroup = rttMessages.get(i).isRemote == rttMessages.get(i - 1).isRemote;
+ public void onBindViewHolder(ViewHolder viewHolder, int itemPosition) {
+ switch (getItemViewType(itemPosition)) {
+ case RowType.ADVISORY:
+ return;
+ case RowType.MESSAGE:
+ RttChatMessageViewHolder rttChatMessageViewHolder = (RttChatMessageViewHolder) viewHolder;
+ int messagePosition = toMessagePosition(itemPosition);
+ boolean isSameGroup = false;
+ if (messagePosition > 0) {
+ isSameGroup =
+ rttMessages.get(messagePosition).isRemote
+ == rttMessages.get(messagePosition - 1).isRemote;
+ }
+ rttChatMessageViewHolder.setMessage(
+ rttMessages.get(messagePosition), isSameGroup, avatarDrawable);
+ return;
+ default:
+ throw new RuntimeException("Unknown row type.");
}
- rttChatMessageViewHolder.setMessage(rttMessages.get(i), isSameGroup, avatarDrawable);
}
@Override
public int getItemCount() {
- return rttMessages.size();
+ return shouldShowAdvisory ? rttMessages.size() + 1 : rttMessages.size();
}
private void updateCurrentLocalMessage(String newMessage) {
@@ -96,11 +142,31 @@ public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolde
notifyItemRemoved(lastIndexOfLocalMessage);
lastIndexOfLocalMessage = -1;
} else {
- notifyItemChanged(lastIndexOfLocalMessage);
+ notifyItemChanged(toItemPosition(lastIndexOfLocalMessage));
}
}
}
+ private int toMessagePosition(int itemPosition) {
+ if (shouldShowAdvisory) {
+ return itemPosition - 1;
+ } else {
+ return itemPosition;
+ }
+ }
+
+ // Converts position in message list into item position in adapter.
+ private int toItemPosition(int messagePosition) {
+ if (messagePosition < 0) {
+ return messagePosition;
+ }
+ if (shouldShowAdvisory) {
+ return messagePosition + 1;
+ } else {
+ return messagePosition;
+ }
+ }
+
private void updateCurrentRemoteMessage(String newMessage) {
RttChatMessage.updateRemoteRttChatMessage(rttMessages, newMessage);
lastIndexOfLocalMessage = RttChatMessage.getLastIndexLocalMessage(rttMessages);
@@ -110,14 +176,14 @@ public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolde
void addLocalMessage(String message) {
updateCurrentLocalMessage(message);
if (messageListener != null) {
- messageListener.onUpdateLocalMessage(lastIndexOfLocalMessage);
+ messageListener.onUpdateLocalMessage(toItemPosition(lastIndexOfLocalMessage));
}
}
void submitLocalMessage() {
LogUtil.enterBlock("RttChatAdapater.submitLocalMessage");
rttMessages.get(lastIndexOfLocalMessage).finish();
- notifyItemChanged(lastIndexOfLocalMessage);
+ notifyItemChanged(toItemPosition(lastIndexOfLocalMessage));
lastIndexOfLocalMessage = -1;
}
@@ -139,10 +205,21 @@ public class RttChatAdapter extends RecyclerView.Adapter<RttChatMessageViewHolde
}
updateCurrentRemoteMessage(message);
if (messageListener != null) {
- messageListener.onUpdateRemoteMessage(RttChatMessage.getLastIndexRemoteMessage(rttMessages));
+ messageListener.onUpdateRemoteMessage(
+ toItemPosition(RttChatMessage.getLastIndexRemoteMessage(rttMessages)));
}
}
+ void hideAdvisory() {
+ shouldShowAdvisory = false;
+ notifyItemRemoved(POSITION_ADVISORY);
+ }
+
+ void showAdvisory() {
+ shouldShowAdvisory = true;
+ notifyItemInserted(POSITION_ADVISORY);
+ }
+
/**
* Retrieve last local message and update the index. This is used when deleting to previous
* message bubble.