diff --git a/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java b/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java index c3341b380..af0740195 100644 --- a/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java @@ -25,6 +25,7 @@ public interface BindableConversationItem extends Unbindable { interface EventListener { void onQuoteClicked(DcMsg messageRecord); + void onJumpToOriginalClicked(DcMsg messageRecord); void onShowFullClicked(DcMsg messageRecord); void onDownloadClicked(DcMsg messageRecord); void onReactionClicked(DcMsg messageRecord); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index edbf0fd57..a97b5d692 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -841,20 +841,18 @@ public class ConversationFragment extends MessageSelectorFragment } } - @Override - public void onQuoteClicked(DcMsg messageRecord) { - DcMsg quoted = messageRecord.getQuotedMsg(); - if (quoted == null) { - Log.i(TAG, "Clicked on a quote whose original message we never had."); + private void jumpToOriginal(DcMsg original) { + if (original == null) { + Log.i(TAG, "Clicked on a quote or jump-to-original whose original message was deleted/non-existing."); Toast.makeText(getContext(), R.string.ConversationFragment_quoted_message_not_found, Toast.LENGTH_SHORT).show(); return; } - int foreignChatId = quoted.getChatId(); + int foreignChatId = original.getChatId(); if (foreignChatId != 0 && foreignChatId != chatId) { Intent intent = new Intent(getActivity(), ConversationActivity.class); intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, foreignChatId); - int start = DcMsg.getMessagePosition(quoted, dcContext); + int start = DcMsg.getMessagePosition(original, dcContext); intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, start); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); ((ConversationActivity) getActivity()).hideSoftKeyboard(); @@ -864,10 +862,20 @@ public class ConversationFragment extends MessageSelectorFragment Log.e(TAG, "Activity was null"); } } else { - scrollMaybeSmoothToMsgId(quoted.getId()); + scrollMaybeSmoothToMsgId(original.getId()); } } + @Override + public void onJumpToOriginalClicked(DcMsg messageRecord) { + jumpToOriginal(dcContext.getMsg(messageRecord.getOriginalMsgId())); + } + + @Override + public void onQuoteClicked(DcMsg messageRecord) { + jumpToOriginal(messageRecord.getQuotedMsg()); + } + @Override public void onShowFullClicked(DcMsg messageRecord) { Intent intent = new Intent(getActivity(), FullMsgActivity.class); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java index 7df490bde..6d9dcee25 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java @@ -100,6 +100,7 @@ public class ConversationItem extends BaseConversationItem protected ViewGroup bodyBubble; protected ReactionsConversationView reactionsView; protected View replyView; + protected View jumptoView; @Nullable private QuoteView quoteView; private ConversationItemFooter footer; private TextView groupSender; @@ -154,6 +155,7 @@ public class ConversationItem extends BaseConversationItem this.quoteView = findViewById(R.id.quote_view); this.container = findViewById(R.id.container); this.replyView = findViewById(R.id.reply_icon); + this.jumptoView = findViewById(R.id.jumpto_icon); this.msgActionButton = findViewById(R.id.msg_action_button); this.showFullButton = findViewById(R.id.show_full_button); @@ -181,6 +183,17 @@ public class ConversationItem extends BaseConversationItem this.dcContact = dcContext.getContact(messageRecord.getFromId()); } + if (dcChat.isSelfTalk() && messageRecord.getOriginalMsgId() != 0) { + jumptoView.setVisibility(View.VISIBLE); + jumptoView.setOnClickListener(view -> { + if (eventListener != null) { + eventListener.onJumpToOriginalClicked(messageRecord); + } + }); + } else { + jumptoView.setVisibility(View.GONE); + } + setGutterSizes(messageRecord, showSender); setMessageShape(messageRecord); setMediaAttributes(messageRecord, showSender); diff --git a/src/main/res/drawable-night/jumpto_btn_bg.xml b/src/main/res/drawable-night/jumpto_btn_bg.xml new file mode 100644 index 000000000..be9119122 --- /dev/null +++ b/src/main/res/drawable-night/jumpto_btn_bg.xml @@ -0,0 +1,5 @@ + + + + diff --git a/src/main/res/drawable/jumpto_btn_bg.xml b/src/main/res/drawable/jumpto_btn_bg.xml new file mode 100644 index 000000000..82142dd34 --- /dev/null +++ b/src/main/res/drawable/jumpto_btn_bg.xml @@ -0,0 +1,5 @@ + + + + diff --git a/src/main/res/drawable/rounded_arrow_forward_24.xml b/src/main/res/drawable/rounded_arrow_forward_24.xml new file mode 100644 index 000000000..29b2576d4 --- /dev/null +++ b/src/main/res/drawable/rounded_arrow_forward_24.xml @@ -0,0 +1,3 @@ + + + diff --git a/src/main/res/layout/conversation_item_received.xml b/src/main/res/layout/conversation_item_received.xml index 781d80eec..19cb8a2bc 100644 --- a/src/main/res/layout/conversation_item_received.xml +++ b/src/main/res/layout/conversation_item_received.xml @@ -3,7 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="fill_parent" + android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/conversation_item_background" @@ -13,9 +13,13 @@ android:clipToPadding="false" android:clipChildren="false"> + + + android:clipChildren="false" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@id/jumpto_icon" + > + + + diff --git a/src/main/res/layout/conversation_item_sent.xml b/src/main/res/layout/conversation_item_sent.xml index f4a48916f..567b4d690 100644 --- a/src/main/res/layout/conversation_item_sent.xml +++ b/src/main/res/layout/conversation_item_sent.xml @@ -13,6 +13,19 @@ android:clipToPadding="false" android:clipChildren="false"> + +