diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index d7f2ba454d..26ad998b23 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -292,6 +292,7 @@ public class FragmentCompose extends FragmentBase { private int zoom = 0; private boolean nav_color; private boolean lt_enabled; + private boolean lt_sentence; private boolean lt_auto; private long working = -1; @@ -359,6 +360,7 @@ public class FragmentCompose extends FragmentBase { nav_color = prefs.getBoolean("send_nav_color", false); lt_enabled = LanguageTool.isEnabled(context); + lt_sentence = LanguageTool.isSentence(context); lt_auto = LanguageTool.isAuto(context); if (compose_color != Color.TRANSPARENT && Helper.isDarkTheme(context)) @@ -670,7 +672,7 @@ public class FragmentCompose extends FragmentBase { etBody.addTextChangedListener(StyleHelper.getTextWatcher(etBody)); etBody.addTextChangedListener(new TextWatcher() { - private boolean save = false; + private Integer save = null; private Integer added = null; private boolean inserted = false; private Pair lt = null; @@ -692,10 +694,11 @@ public class FragmentCompose extends FragmentBase { char c = text.charAt(index); char b = text.charAt(index - 1); - save = (auto_save_paragraph && c == '\n' && b != '\n') || - (auto_save_dot && Helper.isEndChar(c) && !Helper.isEndChar(b)); - if (save) + if ((auto_save_paragraph && c == '\n' && b != '\n') || + (auto_save_dot && Helper.isEndChar(c) && !Helper.isEndChar(b))) { Log.i("Save=" + index); + save = index; + } if (c == '\n') { Log.i("Added=" + index); @@ -734,15 +737,30 @@ public class FragmentCompose extends FragmentBase { added = null; } - if (save) + if (save != null) try { + if (lt == null && lt_sentence) { + int start = save; + while (start > 0 && + text.charAt(start - 1) != '\n' && + !Helper.isEndChar(text.charAt(start - 1))) + start--; + while (start < save) + if (Character.isWhitespace(text.charAt(start))) + start++; + else + break; + if (start < save) + lt = new Pair<>(start, save + 1); + } + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { Bundle extras = new Bundle(); extras.putBoolean("silent", true); onAction(R.id.action_save, extras, "paragraph"); } } finally { - save = false; + save = null; } if (lt != null) @@ -7625,7 +7643,7 @@ public class FragmentCompose extends FragmentBase { if (postShow != null) getMainHandler().post(postShow); - if (lt_auto) + if (lt_sentence || lt_auto) onLanguageTool(0, etBody.length(), true); } diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 55be71e558..579d99b528 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -144,6 +144,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swLanguageTool; private TextView tvLanguageToolPrivacy; + private SwitchCompat swLanguageToolSentence; private SwitchCompat swLanguageToolAuto; private SwitchCompat swLanguageToolPicky; private EditText etLanguageTool; @@ -285,7 +286,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "classification", "class_min_probability", "class_min_difference", "show_filtered", "language", - "lt_enabled", "lt_auto", "lt_picky", "lt_uri", "lt_user", "lt_key", + "lt_enabled", "lt_sentence", "lt_auto", "lt_picky", "lt_uri", "lt_user", "lt_key", "deepl_enabled", "vt_enabled", "vt_apikey", "send_enabled", "send_host", "send_dlimit", "send_tlimit", @@ -399,6 +400,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swLanguageTool = view.findViewById(R.id.swLanguageTool); tvLanguageToolPrivacy = view.findViewById(R.id.tvLanguageToolPrivacy); + swLanguageToolSentence = view.findViewById(R.id.swLanguageToolSentence); swLanguageToolAuto = view.findViewById(R.id.swLanguageToolAuto); swLanguageToolPicky = view.findViewById(R.id.swLanguageToolPicky); etLanguageTool = view.findViewById(R.id.etLanguageTool); @@ -858,6 +860,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { prefs.edit().putBoolean("lt_enabled", checked).apply(); + swLanguageToolSentence.setEnabled(checked); swLanguageToolAuto.setEnabled(checked); swLanguageToolPicky.setEnabled(checked); } @@ -871,6 +874,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swLanguageToolSentence.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("lt_sentence", checked).apply(); + } + }); + swLanguageToolAuto.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -2538,6 +2548,8 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc spLanguage.setSelection(selected); swLanguageTool.setChecked(prefs.getBoolean("lt_enabled", false)); + swLanguageToolSentence.setChecked(prefs.getBoolean("lt_sentence", false)); + swLanguageToolSentence.setEnabled(swLanguageTool.isChecked()); swLanguageToolAuto.setChecked(prefs.getBoolean("lt_auto", true)); swLanguageToolAuto.setEnabled(swLanguageTool.isChecked()); swLanguageToolPicky.setChecked(prefs.getBoolean("lt_picky", false)); diff --git a/app/src/main/java/eu/faircode/email/LanguageTool.java b/app/src/main/java/eu/faircode/email/LanguageTool.java index fefab0a14c..fc46446689 100644 --- a/app/src/main/java/eu/faircode/email/LanguageTool.java +++ b/app/src/main/java/eu/faircode/email/LanguageTool.java @@ -71,6 +71,13 @@ public class LanguageTool { return (lt_enabled && lt_auto); } + static boolean isSentence(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean lt_enabled = prefs.getBoolean("lt_enabled", false); + boolean lt_sentence = prefs.getBoolean("lt_sentence", false); + return (lt_enabled && lt_sentence); + } + static JSONArray getLanguages(Context context) throws IOException, JSONException { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String lt_uri = prefs.getString("lt_uri", LT_URI_PLUS); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index c3f75c9414..4225bab73a 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -648,6 +648,18 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvLanguageToolHint" /> + + Language System LanguageTool integration + Check every sentence Check paragraph after a new line Username (optional) API key (optional)