@@ -0,0 +1,60 @@
+package com.cheogram.android;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+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 eu.siacs.conversations.R;
+import eu.siacs.conversations.ui.widget.EditMessage;
+
+public class EditMessageSelectionActionModeCallback implements ActionMode.Callback {
+
+ private final EditMessage editMessage;
+
+ public EditMessageSelectionActionModeCallback(EditMessage editMessage) {
+ this.editMessage = editMessage;
+ }
+
+ @Override
+ public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
+ final MenuInflater inflater = mode.getMenuInflater();
+ inflater.inflate(R.menu.edit_message_selection_actions, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ menu.findItem(R.id.bold).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ menu.findItem(R.id.italic).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ return true;
+ }
+
+ @Override
+ public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
+ if (item.getItemId() == R.id.bold) {
+ final var start = editMessage.getSelectionStart();
+ final var end = editMessage.getSelectionEnd();
+ if (start < 0 || end < 0) return false;
+ editMessage.getText().insert(start, "*");
+ editMessage.getText().insert(end+1, "*");
+ return true;
+ }
+ if (item.getItemId() == R.id.italic) {
+ final var start = editMessage.getSelectionStart();
+ final var end = editMessage.getSelectionEnd();
+ if (start < 0 || end < 0) return false;
+ editMessage.getText().insert(start, "_");
+ editMessage.getText().insert(end+1, "_");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {}
+}
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M272,760L272,200L493,200Q558,200 613,240Q668,280 668,351Q668,402 645,429.5Q622,457 602,469L602,469Q627,480 657.5,510Q688,540 688,600Q688,689 623,724.5Q558,760 501,760L272,760ZM393,648L497,648Q545,648 555.5,623.5Q566,599 566,588Q566,577 555.5,552.5Q545,528 494,528L393,528L393,648ZM393,420L486,420Q519,420 534,403Q549,386 549,365Q549,341 532,326Q515,311 488,311L393,311L393,420Z"/>
+</vector>
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960"
+ android:tint="?attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M200,760L200,660L360,660L480,300L320,300L320,200L720,200L720,300L580,300L460,660L600,660L600,760L200,760Z"/>
+</vector>
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item
+ android:id="@+id/bold"
+ android:title="B"
+ android:icon="@drawable/format_bold_24dp"
+ android:orderInCategory="1"/>
+
+ <item
+ android:id="@+id/italic"
+ android:title="I"
+ android:icon="@drawable/format_italic_24dp"
+ android:orderInCategory="1"/>
+
+</menu>
@@ -89,6 +89,7 @@ import androidx.viewpager.widget.ViewPager;
import com.cheogram.android.BobTransfer;
import com.cheogram.android.EmojiSearch;
+import com.cheogram.android.EditMessageSelectionActionModeCallback;
import com.cheogram.android.WebxdcPage;
import com.cheogram.android.WebxdcStore;
@@ -1469,6 +1470,8 @@ public class ConversationFragment extends XmppFragment
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
this.binding.textinput.setCustomInsertionActionModeCallback(
new EditMessageActionModeCallback(this.binding.textinput));
+ this.binding.textinput.setCustomSelectionActionModeCallback(
+ new EditMessageSelectionActionModeCallback(this.binding.textinput));
}
messageListAdapter.setOnMessageBoxClicked(message -> {