in reply to indicator and jump to

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java   | 12 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 15 
src/main/res/layout/item_message_content.xml                        | 26 
3 files changed, 53 insertions(+)

Detailed changes

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -2752,6 +2752,18 @@ public class ConversationFragment extends XmppFragment
         return null;
     }
 
+    public void jumpTo(final Message message) {
+        if (message.getUuid() == null) return;
+        for (int i = 0; i < messageList.size(); i++) {
+            final var m = messageList.get(i);
+            if (m == null) continue;
+            if (message.getUuid().equals(m.getUuid())) {
+                binding.messagesView.setSelection(i);
+                return;
+            }
+        }
+    }
+
     private void openWith(final Message message) {
         if (message.isGeoUri()) {
             GeoHelper.view(getActivity(), message);

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -1074,6 +1074,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     viewHolder.messageBody = view.findViewById(R.id.message_body);
                     viewHolder.time = view.findViewById(R.id.message_time);
                     viewHolder.subject = view.findViewById(R.id.message_subject);
+                    viewHolder.inReplyTo = view.findViewById(R.id.in_reply_to);
+                    viewHolder.inReplyToBox = view.findViewById(R.id.in_reply_to_box);
                     viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received);
                     viewHolder.audioPlayer = view.findViewById(R.id.audio_player);
                     viewHolder.thread_identicon = view.findViewById(R.id.thread_identicon);
@@ -1091,6 +1093,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                     viewHolder.messageBody = view.findViewById(R.id.message_body);
                     viewHolder.time = view.findViewById(R.id.message_time);
                     viewHolder.subject = view.findViewById(R.id.message_subject);
+                    viewHolder.inReplyTo = view.findViewById(R.id.in_reply_to);
+                    viewHolder.inReplyToBox = view.findViewById(R.id.in_reply_to_box);
                     viewHolder.indicatorReceived = view.findViewById(R.id.indicator_received);
                     viewHolder.encryption = view.findViewById(R.id.message_encryption);
                     viewHolder.audioPlayer = view.findViewById(R.id.audio_player);
@@ -1468,6 +1472,15 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 viewHolder.subject.setVisibility(View.VISIBLE);
                 viewHolder.subject.setText(subject);
             }
+
+            if (message.getInReplyTo() == null) {
+                viewHolder.inReplyToBox.setVisibility(View.GONE);
+            } else {
+                viewHolder.inReplyToBox.setVisibility(View.VISIBLE);
+                viewHolder.inReplyTo.setText(UIHelper.getMessageDisplayName(message.getInReplyTo()));
+                viewHolder.inReplyTo.setOnClickListener((v) -> mConversationFragment.jumpTo(message.getInReplyTo()));
+                setTextColor(viewHolder.inReplyTo, bubbleColor);
+            }
         }
 
         displayStatus(viewHolder, message, type, bubbleColor);
@@ -1687,6 +1700,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
         protected ImageView indicatorReceived;
         protected TextView time;
         protected TextView subject;
+        protected TextView inReplyTo;
+        protected LinearLayout inReplyToBox;
         protected TextView messageBody;
         protected ImageView contact_picture;
         protected TextView status_message;

src/main/res/layout/item_message_content.xml 🔗

@@ -21,6 +21,32 @@
                 app:shapeAppearance="@style/ShapeAppearanceOverlay.MessageImage" />
         </LinearLayout>
 
+        <LinearLayout
+            android:id="@+id/in_reply_to_box"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:visibility="gone">
+
+            <ImageView
+                android:src="@drawable/ic_reply_24dp"
+                android:layout_width="14sp"
+                android:layout_height="14sp"
+                android:layout_gravity="center_vertical"
+                android:layout_marginStart="5dp"
+                android:layout_marginEnd="2dp"
+                android:contentDescription="in reply to" />
+
+            <TextView
+                android:id="@+id/in_reply_to"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="10dp"
+                android:textStyle="bold|italic"
+                android:longClickable="false"
+                android:textAppearance="?textAppearanceBodyMedium" />
+        </LinearLayout>
+
         <TextView
             android:id="@+id/message_body"
             android:layout_width="wrap_content"