diff --git a/app/src/main/java/eu/faircode/email/FixedEditText.java b/app/src/main/java/eu/faircode/email/FixedEditText.java index 85d904058c..4fb7e20bd5 100644 --- a/app/src/main/java/eu/faircode/email/FixedEditText.java +++ b/app/src/main/java/eu/faircode/email/FixedEditText.java @@ -20,6 +20,7 @@ package eu.faircode.email; */ import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Canvas; import android.os.Build; import android.util.AttributeSet; @@ -32,6 +33,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.widget.AppCompatEditText; +import androidx.preference.PreferenceManager; public class FixedEditText extends AppCompatEditText { public FixedEditText(@NonNull Context context) { @@ -274,6 +276,8 @@ public class FixedEditText extends AppCompatEditText { @Override public ActionMode startActionMode(ActionMode.Callback callback) { try { + if (skipActionMode()) + return null; return super.startActionMode(callback); } catch (Throwable ex) { Log.e(ex); @@ -285,6 +289,8 @@ public class FixedEditText extends AppCompatEditText { public ActionMode startActionMode(ActionMode.Callback callback, int type) { try { // callback class: android.widget.Editor$TextActionModeCallback + if (skipActionMode()) + return null; return super.startActionMode(callback, type); } catch (Throwable ex) { Log.e(ex); @@ -292,6 +298,20 @@ public class FixedEditText extends AppCompatEditText { } } + private boolean skipActionMode() { + try { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + if (!prefs.contains("skip_action_mode")) { + if ("fuxi_eea".equals(Build.PRODUCT) && Build.VERSION.SDK_INT == Build.VERSION_CODES.TIRAMISU) + return true; + } + return prefs.getBoolean("skip_action_mode", false); + } catch (Throwable ex) { + Log.e(ex); + return false; + } + } + @NonNull @Override @RequiresApi(api = Build.VERSION_CODES.O) diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 25a90e84ac..9d9952d4b7 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -240,6 +240,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swDupMsgId; private SwitchCompat swThreadByRef; private SwitchCompat swMdn; + private SwitchCompat swSkipActionMode; private EditText etKeywords; private SwitchCompat swTestIab; private Button btnImportProviders; @@ -302,7 +303,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "max_backoff_power", "logarithmic_backoff", "exact_alarms", "native_dkim", "native_arc", "native_arc_whitelist", - "infra", "tld_flags", "dup_msgids", "thread_byref", "mdn", "global_keywords", "test_iab" + "infra", "tld_flags", "dup_msgids", "thread_byref", "mdn", "skip_action_mode", + "global_keywords", "test_iab" }; private final static String[] RESET_QUESTIONS = new String[]{ @@ -491,6 +493,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swDupMsgId = view.findViewById(R.id.swDupMsgId); swThreadByRef = view.findViewById(R.id.swThreadByRef); swMdn = view.findViewById(R.id.swMdn); + swSkipActionMode = view.findViewById(R.id.swSkipActionMode); etKeywords = view.findViewById(R.id.etKeywords); swTestIab = view.findViewById(R.id.swTestIab); btnImportProviders = view.findViewById(R.id.btnImportProviders); @@ -1857,6 +1860,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swSkipActionMode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("skip_action_mode", checked).apply(); + } + }); + etKeywords.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -2603,6 +2613,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swDupMsgId.setChecked(prefs.getBoolean("dup_msgids", false)); swThreadByRef.setChecked(prefs.getBoolean("thread_byref", true)); swMdn.setChecked(prefs.getBoolean("mdn", swExperiments.isChecked())); + swSkipActionMode.setChecked(prefs.getBoolean("skip_action_mode", false)); etKeywords.setText(prefs.getString("global_keywords", null)); swTestIab.setChecked(prefs.getBoolean("test_iab", false)); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 8a4a4e446f..f8408095fe 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -2283,6 +2283,17 @@ app:layout_constraintTop_toBottomOf="@id/swThreadByRef" app:switchPadding="12dp" /> + + + app:layout_constraintTop_toBottomOf="@id/swSkipActionMode" /> Duplicates by message ID Thread by common reference Process MDNs + Skip action mode Global keywords Test IAB Import providers