From 91f159a9f71a95d47bf88c939bd6970ef29321b8 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 15 Jan 2022 19:10:05 +0100 Subject: [PATCH] Prevent action mode crashes --- .../eu/faircode/email/EditTextCompose.java | 43 ++++++++++++++++ .../java/eu/faircode/email/FixedEditText.java | 51 +++++++++++++++++++ .../java/eu/faircode/email/FixedTextView.java | 51 +++++++++++++++++++ 3 files changed, 145 insertions(+) diff --git a/app/src/main/java/eu/faircode/email/EditTextCompose.java b/app/src/main/java/eu/faircode/email/EditTextCompose.java index 92090617d0..c9b5914ef5 100644 --- a/app/src/main/java/eu/faircode/email/EditTextCompose.java +++ b/app/src/main/java/eu/faircode/email/EditTextCompose.java @@ -22,6 +22,7 @@ package eu.faircode.email; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Typeface; import android.graphics.drawable.Drawable; @@ -43,6 +44,7 @@ import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; +import android.widget.Toast; import androidx.core.view.inputmethod.EditorInfoCompat; import androidx.core.view.inputmethod.InputConnectionCompat; @@ -127,6 +129,47 @@ public class EditTextCompose extends FixedEditText { } }); } + + setCustomSelectionActionModeCallback(new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + Intent intent = item.getIntent(); + if (intent != null) { + item.setIntent(null); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + try { + context.startActivity(intent); + } catch (Throwable ex) { + Log.e(ex); + ToastEx.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); + } + return true; + } + }); + } + } + + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + } + }); } private boolean can(int what) { diff --git a/app/src/main/java/eu/faircode/email/FixedEditText.java b/app/src/main/java/eu/faircode/email/FixedEditText.java index d9c4e5ac9a..f3f5372705 100644 --- a/app/src/main/java/eu/faircode/email/FixedEditText.java +++ b/app/src/main/java/eu/faircode/email/FixedEditText.java @@ -20,12 +20,17 @@ package eu.faircode.email; */ import android.content.Context; +import android.content.Intent; import android.graphics.Canvas; import android.os.Build; import android.util.AttributeSet; +import android.view.ActionMode; import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; import android.view.MotionEvent; import android.view.textclassifier.TextClassifier; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -35,14 +40,60 @@ import androidx.appcompat.widget.AppCompatEditText; public class FixedEditText extends AppCompatEditText { public FixedEditText(@NonNull Context context) { super(context); + init(context); } public FixedEditText(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); + init(context); } public FixedEditText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context) { + setCustomSelectionActionModeCallback(new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + Intent intent = item.getIntent(); + if (intent != null) { + item.setIntent(null); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + try { + context.startActivity(intent); + } catch (Throwable ex) { + Log.e(ex); + ToastEx.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); + } + return true; + } + }); + } + } + + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + } + }); } @Override diff --git a/app/src/main/java/eu/faircode/email/FixedTextView.java b/app/src/main/java/eu/faircode/email/FixedTextView.java index ee6fa5a60f..0eb4c5c605 100644 --- a/app/src/main/java/eu/faircode/email/FixedTextView.java +++ b/app/src/main/java/eu/faircode/email/FixedTextView.java @@ -22,6 +22,7 @@ package eu.faircode.email; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; +import android.content.Intent; import android.graphics.Canvas; import android.graphics.Rect; import android.os.Build; @@ -29,8 +30,12 @@ import android.text.Selection; import android.text.Spannable; import android.text.Spanned; import android.util.AttributeSet; +import android.view.ActionMode; import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; import android.view.MotionEvent; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -39,14 +44,60 @@ import androidx.appcompat.widget.AppCompatTextView; public class FixedTextView extends AppCompatTextView { public FixedTextView(@NonNull Context context) { super(context); + init(context); } public FixedTextView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); + init(context); } public FixedTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + init(context); + } + + private void init(Context context) { + setCustomSelectionActionModeCallback(new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + Intent intent = item.getIntent(); + if (intent != null) { + item.setIntent(null); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + try { + context.startActivity(intent); + } catch (Throwable ex) { + Log.e(ex); + ToastEx.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); + } + return true; + } + }); + } + } + + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + } + }); } @Override