diff options
author | wangqi <wangqi@google.com> | 2018-04-26 10:57:09 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-04-26 20:36:24 -0700 |
commit | 305f7df04262dd01c41aa3d45676d5bcb874b9a1 (patch) | |
tree | 4e83cde662ce56e2fa9cfbac24787d1f0a99202d | |
parent | 52a161148b057ebd4b0c86228b82cba305f1102d (diff) |
Add advisory text to RTT call about transcript storage.
Bug: 78519871
Test: RttChatFragmentTest.java
PiperOrigin-RevId: 194421459
Change-Id: I4d04ee3045afdd4d5553032d7434ead280810543
7 files changed, 192 insertions, 16 deletions
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 000000000..f607d5312 --- /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 000000000..8f081bebf --- /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 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. diff --git a/java/com/android/incallui/rtt/impl/RttChatFragment.java b/java/com/android/incallui/rtt/impl/RttChatFragment.java index 47036cd43..13e013fd3 100644 --- a/java/com/android/incallui/rtt/impl/RttChatFragment.java +++ b/java/com/android/incallui/rtt/impl/RttChatFragment.java @@ -467,6 +467,7 @@ public class RttChatFragment extends Fragment 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 f995185b1..cff2b3f38 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 000000000..a2cf3e74f --- /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 1d09f5446..462eea563 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…</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 |