Initial B and I option in menu for formatting

Stephen Paul Weber created

Can't get them to have icons for some reason...

Change summary

src/cheogram/java/com/cheogram/android/EditMessageSelectionActionModeCallback.java | 60 
src/cheogram/res/drawable/format_bold_24dp.xml                                     | 10 
src/cheogram/res/drawable/format_italic_24dp.xml                                   | 10 
src/cheogram/res/menu/edit_message_selection_actions.xml                           | 16 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java                  |  3 
5 files changed, 99 insertions(+)

Detailed changes

src/cheogram/java/com/cheogram/android/EditMessageSelectionActionModeCallback.java 🔗

@@ -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) {}
+}

src/cheogram/res/drawable/format_bold_24dp.xml 🔗

@@ -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>

src/cheogram/res/drawable/format_italic_24dp.xml 🔗

@@ -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>

src/cheogram/res/menu/edit_message_selection_actions.xml 🔗

@@ -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>

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

@@ -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 -> {