diff --git a/app/src/main/java/eu/faircode/email/EditTextCompose.java b/app/src/main/java/eu/faircode/email/EditTextCompose.java index bdbaf2e279..2df020ec4c 100644 --- a/app/src/main/java/eu/faircode/email/EditTextCompose.java +++ b/app/src/main/java/eu/faircode/email/EditTextCompose.java @@ -34,12 +34,12 @@ import android.text.Spanned; import android.text.style.QuoteSpan; import android.util.AttributeSet; import android.view.ActionMode; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; -import android.widget.TextView; import androidx.core.view.inputmethod.EditorInfoCompat; import androidx.core.view.inputmethod.InputConnectionCompat; @@ -47,7 +47,6 @@ import androidx.core.view.inputmethod.InputContentInfoCompat; import org.jsoup.nodes.Document; -import java.lang.reflect.Method; import java.util.concurrent.ExecutorService; public class EditTextCompose extends FixedEditText { @@ -55,6 +54,10 @@ public class EditTextCompose extends FixedEditText { private ISelection selectionListener = null; private IInputContentListener inputContentListener = null; + private Boolean canUndo = null; + private Boolean canRedo = null; + private boolean checkKeyEvent = false; + private static final ExecutorService executor = Helper.getBackgroundExecutor(1, "paste"); @@ -81,8 +84,8 @@ public class EditTextCompose extends FixedEditText { setCustomInsertionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { - boolean undo = can("Undo"); - boolean redo = can("Redo"); + boolean undo = can(android.R.id.undo); + boolean redo = can(android.R.id.redo); if (undo) menu.add(Menu.CATEGORY_ALTERNATIVE, R.string.title_undo, 1, R.string.title_undo); if (redo) @@ -115,15 +118,24 @@ public class EditTextCompose extends FixedEditText { } } - private boolean can(String can) { + private boolean can(int what) { + canUndo = null; + canRedo = null; + try { - Method mCan = TextView.class.getMethod("can" + can); - mCan.setAccessible(true); - return (boolean) mCan.invoke(this); - } catch (ReflectiveOperationException ex) { - Log.i(ex); - return true; + checkKeyEvent = true; + int meta = KeyEvent.META_CTRL_ON; + if (what == android.R.id.redo) + meta = meta | KeyEvent.META_SHIFT_ON; + KeyEvent ke = new KeyEvent(0, 0, 0, 0, 0, meta); + onKeyShortcut(KeyEvent.KEYCODE_Z, ke); + } catch (Throwable ex) { + Log.e(ex); + } finally { + checkKeyEvent = false; } + + return Boolean.TRUE.equals(what == android.R.id.redo ? canRedo : canUndo); } @Override @@ -289,6 +301,12 @@ public class EditTextCompose extends FixedEditText { } }); + return true; + } else if (id == android.R.id.undo) { + canUndo = true; + return true; + } else if (id == android.R.id.redo) { + canRedo = true; return true; }