diff --git a/app/src/main/java/eu/faircode/email/EditTextCompose.java b/app/src/main/java/eu/faircode/email/EditTextCompose.java index acde3d5c62..9a62d9e491 100644 --- a/app/src/main/java/eu/faircode/email/EditTextCompose.java +++ b/app/src/main/java/eu/faircode/email/EditTextCompose.java @@ -77,6 +77,10 @@ public class EditTextCompose extends FixedEditText { private int colorBlockquote; private int quoteGap; private int quoteStripe; + private boolean lt_description; + + private int lastStart = -1; + private int lastEnd = -1; public EditTextCompose(Context context) { super(context); @@ -96,12 +100,13 @@ public class EditTextCompose extends FixedEditText { void init(Context context) { Helper.setKeyboardIncognitoMode(this, context); - colorPrimary = Helper.resolveColor(context, androidx.appcompat.R.attr.colorPrimary); - colorBlockquote = Helper.resolveColor(context, R.attr.colorBlockquote, colorPrimary); - quoteGap = context.getResources().getDimensionPixelSize(R.dimen.quote_gap_size); - quoteStripe = context.getResources().getDimensionPixelSize(R.dimen.quote_stripe_width); + this.colorPrimary = Helper.resolveColor(context, androidx.appcompat.R.attr.colorPrimary); + this.colorBlockquote = Helper.resolveColor(context, R.attr.colorBlockquote, colorPrimary); + this.quoteGap = context.getResources().getDimensionPixelSize(R.dimen.quote_gap_size); + this.quoteStripe = context.getResources().getDimensionPixelSize(R.dimen.quote_stripe_width); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + this.lt_description = prefs.getBoolean("lt_description", false); boolean undo_manager = prefs.getBoolean("undo_manager", false); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -114,8 +119,6 @@ public class EditTextCompose extends FixedEditText { order++, context.getString(R.string.title_insert_brackets)); menu.add(Menu.CATEGORY_SECONDARY, R.string.title_insert_quotes, order++, context.getString(R.string.title_insert_quotes)); - menu.add(Menu.CATEGORY_SECONDARY, R.string.title_setup_help, - order++, context.getString(R.string.title_setup_help)); menu.add(Menu.CATEGORY_SECONDARY, R.string.title_lt_add, order++, context.getString(R.string.title_lt_add)); menu.add(Menu.CATEGORY_SECONDARY, R.string.title_lt_delete, @@ -144,7 +147,6 @@ public class EditTextCompose extends FixedEditText { edit.subSequence(start, end).toString().indexOf(' ') < 0); menu.findItem(R.string.title_insert_brackets).setVisible(selection); menu.findItem(R.string.title_insert_quotes).setVisible(selection); - menu.findItem(R.string.title_setup_help).setVisible(hasSuggestions); menu.findItem(R.string.title_lt_add).setVisible(dictionary); menu.findItem(R.string.title_lt_delete).setVisible(dictionary); return false; @@ -158,13 +160,6 @@ public class EditTextCompose extends FixedEditText { return surround("(", ")"); else if (id == R.string.title_insert_quotes) return surround("\"", "\""); - else if (id == R.string.title_setup_help) { - if (showSuggestion()) { - mode.finish(); - return true; - } - } else if (id == R.string.title_lt_add) - return modifyDictionary(true); else if (id == R.string.title_lt_delete) return modifyDictionary(false); } @@ -240,21 +235,6 @@ public class EditTextCompose extends FixedEditText { return true; } - - private boolean showSuggestion() { - Editable edit = getText(); - if (edit == null) - return false; - int start = getSelectionStart(); - int end = getSelectionEnd(); - if (end <= start) - return false; - SuggestionSpanEx[] suggestions = edit.getSpans(start, end, SuggestionSpanEx.class); - if (suggestions == null || suggestions.length == 0) - return false; - ToastEx.makeText(getContext(), suggestions[0].getDescription(), Toast.LENGTH_LONG).show(); - return true; - } }); setCustomInsertionActionModeCallback(new ActionMode.Callback() { @@ -477,6 +457,20 @@ public class EditTextCompose extends FixedEditText { super.onSelectionChanged(selStart, selEnd); if (selectionListener != null) selectionListener.onSelected(hasSelection()); + + if (selStart != lastStart && selEnd != lastEnd) { + lastStart = selStart; + lastEnd = selEnd; + Editable edit = getText(); + if (lastStart >= 0 && edit != null && lt_description) { + SuggestionSpanEx[] suggestions = getText().getSpans(selStart, selEnd, SuggestionSpanEx.class); + if (suggestions != null && suggestions.length > 0) { + String description = suggestions[0].getDescription(); + if (!TextUtils.isEmpty(description)) + ToastEx.makeText(getContext(), description, Toast.LENGTH_LONG).show(); + } + } + } } @Override diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 868ebd51e6..b9205f9c2c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -148,6 +148,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swLanguageToolAuto; private SwitchCompat swLanguageToolPicky; private SwitchCompat swLanguageToolHighlight; + private SwitchCompat swLanguageToolDescription; private EditText etLanguageTool; private EditText etLanguageToolUser; private TextInputLayout tilLanguageToolKey; @@ -287,7 +288,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "classification", "class_min_probability", "class_min_difference", "show_filtered", "language", - "lt_enabled", "lt_sentence", "lt_auto", "lt_picky", "lt_highlight", "lt_uri", "lt_user", "lt_key", + "lt_enabled", "lt_sentence", "lt_auto", "lt_picky", "lt_highlight", "lt_description", "lt_uri", "lt_user", "lt_key", "deepl_enabled", "vt_enabled", "vt_apikey", "send_enabled", "send_host", "send_dlimit", "send_tlimit", @@ -405,6 +406,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swLanguageToolAuto = view.findViewById(R.id.swLanguageToolAuto); swLanguageToolPicky = view.findViewById(R.id.swLanguageToolPicky); swLanguageToolHighlight = view.findViewById(R.id.swLanguageToolHighlight); + swLanguageToolDescription = view.findViewById(R.id.swLanguageToolDescription); etLanguageTool = view.findViewById(R.id.etLanguageTool); etLanguageToolUser = view.findViewById(R.id.etLanguageToolUser); tilLanguageToolKey = view.findViewById(R.id.tilLanguageToolKey); @@ -866,6 +868,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swLanguageToolAuto.setEnabled(checked); swLanguageToolPicky.setEnabled(checked); swLanguageToolHighlight.setEnabled(checked); + swLanguageToolDescription.setEnabled(checked); } }); @@ -905,6 +908,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swLanguageToolDescription.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("lt_description", checked).apply(); + } + }); + etLanguageTool.setHint(LanguageTool.LT_URI); etLanguageTool.addTextChangedListener(new TextWatcher() { @Override @@ -2574,6 +2584,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swLanguageToolPicky.setEnabled(swLanguageTool.isChecked()); swLanguageToolHighlight.setChecked(prefs.getBoolean("lt_highlight", !BuildConfig.PLAY_STORE_RELEASE)); swLanguageToolHighlight.setEnabled(swLanguageTool.isChecked()); + swLanguageToolDescription.setChecked(prefs.getBoolean("lt_description", false)); + swLanguageToolDescription.setEnabled(swLanguageTool.isChecked()); etLanguageTool.setText(prefs.getString("lt_uri", null)); etLanguageToolUser.setText(prefs.getString("lt_user", null)); tilLanguageToolKey.getEditText().setText(prefs.getString("lt_key", null)); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 80eeaa4645..f0f27429c9 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -696,6 +696,18 @@ app:layout_constraintTop_toBottomOf="@id/swLanguageToolPicky" app:switchPadding="12dp" /> + + + app:layout_constraintTop_toBottomOf="@id/swLanguageToolDescription" /> Check every sentence Check paragraph after a new line Highlight the text being checked + Show popup with problem description Username (optional) API key (optional) DeepL integration