diff --git a/src/cheogram/java/com/cheogram/android/MessageTextActionModeCallback.java b/src/cheogram/java/com/cheogram/android/MessageTextActionModeCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..5f3bad642b3faa2f13accdb3f4d492cc0efd2a45 --- /dev/null +++ b/src/cheogram/java/com/cheogram/android/MessageTextActionModeCallback.java @@ -0,0 +1,49 @@ +package com.cheogram.android; + +import android.content.Context; +import android.text.TextUtils; +import android.view.ActionMode; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.TextView; + +import eu.siacs.conversations.R; +import eu.siacs.conversations.ui.adapter.MessageAdapter; + +public class MessageTextActionModeCallback implements ActionMode.Callback { + final MessageAdapter adapter; + final TextView text; + + public MessageTextActionModeCallback(MessageAdapter adapter, TextView text) { + this.adapter = adapter; + this.text = text; + } + + @Override + public boolean onCreateActionMode(final ActionMode mode, final Menu menu) { + final MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.message_text_actions, menu); + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) { + if (item.getItemId() == R.id.quote) { + int start = text.getSelectionStart(); + int end = text.getSelectionEnd(); + if (start < 0 || end < 0) return false; + adapter.quoteText(text.getText().subSequence(start, end).toString()); + return true; + } + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) {} +} diff --git a/src/cheogram/res/menu/message_text_actions.xml b/src/cheogram/res/menu/message_text_actions.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b7af93876830ba620e191923fca28c506225773 --- /dev/null +++ b/src/cheogram/res/menu/message_text_actions.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index ab81bb1087fea5cd0e8b1dfae4e7628a9962a611..4c347a95312bca5711f00ff888ce1cfbbc179ad7 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1358,6 +1358,7 @@ public class ConversationFragment extends XmppFragment messageListAdapter.setOnContactPictureClicked(this); messageListAdapter.setOnContactPictureLongClicked(this); messageListAdapter.setOnInlineImageLongClicked(this); + messageListAdapter.setConversationFragment(this); binding.messagesView.setAdapter(messageListAdapter); registerForContextMenu(binding.messagesView); @@ -1483,11 +1484,12 @@ public class ConversationFragment extends XmppFragment messageListAdapter.setOnContactPictureClicked(null); messageListAdapter.setOnContactPictureLongClicked(null); messageListAdapter.setOnInlineImageLongClicked(null); + messageListAdapter.setConversationFragment(null); binding.conversationViewPager.setAdapter(null); if (conversation != null) conversation.setupViewPager(null, null, false, null); } - private void quoteText(String text) { + public void quoteText(String text) { if (binding.textinput.isEnabled()) { binding.textinput.insertAsQuote(text); binding.textinput.requestFocus(); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 4ba064de815373b7e7d449a8d11141ce2fd49a82..dc3c7b74f3e3828dc0fdfbb0d809e56b320fa0ef 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -43,6 +43,7 @@ import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; import com.cheogram.android.BobTransfer; +import com.cheogram.android.MessageTextActionModeCallback; import com.cheogram.android.SwipeDetector; import com.cheogram.android.WebxdcPage; import com.cheogram.android.WebxdcUpdate; @@ -117,6 +118,7 @@ public class MessageAdapter extends ArrayAdapter { private final AudioPlayer audioPlayer; private List highlightedTerm = null; private final DisplayMetrics metrics; + private ConversationFragment mConversationFragment = null; private OnContactPictureClicked mOnContactPictureClickedListener; private OnContactPictureClicked mOnMessageBoxClickedListener; private OnContactPictureClicked mOnMessageBoxSwipedListener; @@ -169,6 +171,14 @@ public class MessageAdapter extends ArrayAdapter { this.mOnMessageBoxSwipedListener = listener; } + public void setConversationFragment(ConversationFragment frag) { + mConversationFragment = frag; + } + + public void quoteText(String text) { + if (mConversationFragment != null) mConversationFragment.quoteText(text); + } + public Activity getActivity() { return activity; } @@ -910,6 +920,10 @@ public class MessageAdapter extends ArrayAdapter { } } + if (viewHolder.messageBody != null) { + viewHolder.messageBody.setCustomSelectionActionModeCallback(new MessageTextActionModeCallback(this, viewHolder.messageBody)); + } + if (viewHolder.thread_identicon != null) { viewHolder.thread_identicon.setVisibility(View.GONE); final Element thread = message.getThread(); diff --git a/src/main/res/layout/message_content.xml b/src/main/res/layout/message_content.xml index 38ba2e2f35bdc29c529eb931f8e114b6098a657c..bcceee0220aec9a1116d1352a38926486c8433c4 100644 --- a/src/main/res/layout/message_content.xml +++ b/src/main/res/layout/message_content.xml @@ -7,6 +7,7 @@ android:layout_height="wrap_content" android:autoLink="web" android:longClickable="false" + android:textIsSelectable="true" android:textAppearance="@style/TextAppearance.Conversations.Body1"/> Check %s size Check %1$s size on %2$s Message options - Reply + Quote Paste as quote Copy original URL Send again