Add advisory text to RTT call about transcript storage.

Bug: 78519871
Test: RttChatFragmentTest.java
PiperOrigin-RevId: 194421459
Change-Id: I4d04ee3045afdd4d5553032d7434ead280810543
diff --git a/assets/quantum/res/drawable/quantum_ic_question_answer_vd_theme_24.xml b/assets/quantum/res/drawable/quantum_ic_question_answer_vd_theme_24.xml
new file mode 100644
index 0000000..f607d53
--- /dev/null
+++ b/assets/quantum/res/drawable/quantum_ic_question_answer_vd_theme_24.xml
@@ -0,0 +1,25 @@
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M21,6h-2v9L6,15v2c0,0.55 0.45,1 1,1h11l4,4L22,7c0,-0.55 -0.45,-1 -1,-1zM17,12L17,3c0,-0.55 -0.45,-1 -1,-1L3,2c-0.55,0 -1,0.45 -1,1v14l4,-4h10c0.55,0 1,-0.45 1,-1z"/>
+</vector>
diff --git a/java/com/android/incallui/rtt/impl/AdvisoryViewHolder.java b/java/com/android/incallui/rtt/impl/AdvisoryViewHolder.java
new file mode 100644
index 0000000..8f081be
--- /dev/null
+++ b/java/com/android/incallui/rtt/impl/AdvisoryViewHolder.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.rtt.impl;
+
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView.ViewHolder;
+import android.view.View;
+
+/** ViewHolder class for RTT advisory text. */
+public class AdvisoryViewHolder extends ViewHolder {
+
+  public AdvisoryViewHolder(@NonNull View itemView) {
+    super(itemView);
+  }
+}
diff --git a/java/com/android/incallui/rtt/impl/RttChatAdapter.java b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
index 6922663..f1cde75 100644
--- a/java/com/android/incallui/rtt/impl/RttChatAdapter.java
+++ b/java/com/android/incallui/rtt/impl/RttChatAdapter.java
@@ -18,8 +18,10 @@
 
 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 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 @@
   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 @@
   }
 
   @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 @@
         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 @@
   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 @@
     }
     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.
diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java
index 47036cd..13e013f 100644
--- a/java/com/android/incallui/rtt/impl/RttChatFragment.java
+++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java
@@ -467,6 +467,7 @@
       if (editText.requestFocus()) {
         UiUtil.openKeyboardFrom(getContext(), editText);
       }
+      adapter.showAdvisory();
     }
     if (primaryCallState.state() == State.DIALING) {
       showWaitingForJoinBanner();
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 f995185..cff2b3f 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,7 +23,7 @@
       android:id="@+id/rtt_recycler_view"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
-      android:paddingTop="70dp"
+      android:paddingTop="56dp"
       android:paddingBottom="70dp"
       android:clipToPadding="false"/>
 
diff --git a/java/com/android/incallui/rtt/impl/res/layout/rtt_transcript_advisory.xml b/java/com/android/incallui/rtt/impl/res/layout/rtt_transcript_advisory.xml
new file mode 100644
index 0000000..a2cf3e7
--- /dev/null
+++ b/java/com/android/incallui/rtt/impl/res/layout/rtt_transcript_advisory.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="24dp"
+    android:paddingBottom="16dp"
+    android:orientation="vertical">
+  <ImageView
+      android:layout_width="16dp"
+      android:layout_height="16dp"
+      android:layout_gravity="center_horizontal"
+      android:src="@drawable/quantum_ic_question_answer_vd_theme_24"
+      android:tint="#DEFFFFFF"
+      android:tintMode="src_in"/>
+  <TextView
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:paddingTop="4dp"
+      android:paddingBottom="9dp"
+      android:paddingStart="64dp"
+      android:paddingEnd="64dp"
+      android:gravity="center_horizontal"
+      android:text="@string/rtt_transcript_advisory"
+      android:textColor="#FFFFFF"
+      android:textSize="12sp"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/java/com/android/incallui/rtt/impl/res/values/strings.xml b/java/com/android/incallui/rtt/impl/res/values/strings.xml
index 1d09f54..462eea5 100644
--- a/java/com/android/incallui/rtt/impl/res/values/strings.xml
+++ b/java/com/android/incallui/rtt/impl/res/values/strings.xml
@@ -30,4 +30,7 @@
   <!-- Text for status banner. [CHAR LIMIT=100] -->
   <string name="rtt_status_banner_text">Waiting for <xliff:g id="name">%s</xliff:g> to join RTT call&#8230;</string>
 
+  <!-- Text for RTT transcript advisory. [CHAR LIMIT=NONE] -->
+  <string name="rtt_transcript_advisory">The other party can see you typing. Transcripts stored on your device in the call history.</string>
+
 </resources>
\ No newline at end of file