From d8b61b4b5253e050276a653b46f11cdf924e2e89 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 6 Apr 2023 09:50:33 +0200 Subject: [PATCH] AutoCompleteTextView: prevent common crashes --- .../faircode/email/EditTextAutoComplete.java | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/app/src/main/java/eu/faircode/email/EditTextAutoComplete.java b/app/src/main/java/eu/faircode/email/EditTextAutoComplete.java index 11912e43b2..2e89f0fe04 100644 --- a/app/src/main/java/eu/faircode/email/EditTextAutoComplete.java +++ b/app/src/main/java/eu/faircode/email/EditTextAutoComplete.java @@ -20,10 +20,17 @@ package eu.faircode.email; */ import android.content.Context; +import android.graphics.Canvas; +import android.os.Build; import android.util.AttributeSet; +import android.view.ActionMode; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.textclassifier.TextClassifier; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.appcompat.widget.AppCompatAutoCompleteTextView; public class EditTextAutoComplete extends AppCompatAutoCompleteTextView { @@ -38,4 +45,159 @@ public class EditTextAutoComplete extends AppCompatAutoCompleteTextView { public EditTextAutoComplete(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + + @Override + public void setSelection(int index) { + try { + super.setSelection(index); + } catch (Throwable ex) { + Log.e(ex); + } + } + + @Override + public void setSelection(int start, int stop) { + try { + super.setSelection(start, stop); + } catch (Throwable ex) { + Log.e(ex); + } + } + + @Override + public void setText(CharSequence text, BufferType type) { + try { + super.setText(text, type); + } catch (Throwable ex) { + Log.w(ex); + } + } + + @Override + public boolean onPreDraw() { + try { + return super.onPreDraw(); + } catch (Throwable ex) { + Log.w(ex); + return true; + } + } + + @Override + protected void onDraw(Canvas canvas) { + try { + super.onDraw(canvas); + } catch (Throwable ex) { + Log.w(ex); + } + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + try { + return super.dispatchTouchEvent(event); + } catch (Throwable ex) { + Log.w(ex); + return false; + } + } + + @Override + public void dispatchWindowFocusChanged(boolean hasFocus) { + try { + super.dispatchWindowFocusChanged(hasFocus); + } catch (Throwable ex) { + Log.w(ex); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + try { + return super.onTouchEvent(event); + } catch (Throwable ex) { + Log.w(ex); + return false; + } + } + + @Override + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + try { + return super.onKeyPreIme(keyCode, event); + } catch (Throwable ex) { + Log.w(ex); + return false; + } + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + try { + return super.onKeyUp(keyCode, event); + } catch (Throwable ex) { + Log.w(ex); + return true; + } + } + + @Override + public boolean performClick() { + try { + return super.performClick(); + } catch (Throwable ex) { + Log.w(ex); + return false; + } + } + + @Override + public boolean performLongClick() { + try { + return super.performLongClick(); + } catch (Throwable ex) { + Log.w(ex); + return false; + } + } + + @Override + public ActionMode startActionMode(ActionMode.Callback callback) { + try { + return super.startActionMode(callback); + } catch (Throwable ex) { + Log.e(ex); + return null; + } + } + + @Override + public ActionMode startActionMode(ActionMode.Callback callback, int type) { + try { + return super.startActionMode(callback, type); + } catch (Throwable ex) { + Log.e(ex); + return null; + } + } + + @NonNull + @Override + @RequiresApi(api = Build.VERSION_CODES.O) + public TextClassifier getTextClassifier() { + if (BuildConfig.DEBUG /*|| Helper.isSamsung()*/) + return TextClassifier.NO_OP; + else + return super.getTextClassifier(); + } + + @Override + public boolean onTextContextMenuItem(int id) { + try { + return super.onTextContextMenuItem(id); + } catch (Throwable ex) { + Log.e(ex); + return false; + } + } }