diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java
index c9ee476a1b..d2feb6ec4a 100644
--- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java
+++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java
@@ -122,9 +122,10 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private TextView tvFtsPro;
private Spinner spLanguage;
private SwitchCompat swLanguageTool;
+ private TextView tvLanguageToolPrivacy;
private SwitchCompat swLanguageToolAuto;
private SwitchCompat swLanguageToolPicky;
- private TextView tvLanguageToolPrivacy;
+ private EditText etLanguageTool;
private ImageButton ibLanguageTool;
private SwitchCompat swDeepL;
private TextView tvDeepLPrivacy;
@@ -243,7 +244,11 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private final static String[] RESET_OPTIONS = new String[]{
"sort_answers", "shortcuts", "fts",
"classification", "class_min_probability", "class_min_difference",
- "language", "lt_enabled", "lt_auto", "lt_picky", "deepl_enabled", "vt_enabled", "vt_apikey", "send_enabled", "send_host",
+ "language",
+ "lt_enabled", "lt_auto", "lt_picky", "lt_uri",
+ "deepl_enabled",
+ "vt_enabled", "vt_apikey",
+ "send_enabled", "send_host",
"updates", "weekly", "show_changelog",
"crash_reports", "cleanup_attachments",
"watchdog", "experiments", "main_log", "main_log_memory", "protocol", "log_level", "debug", "leak_canary",
@@ -328,9 +333,10 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
tvFtsPro = view.findViewById(R.id.tvFtsPro);
spLanguage = view.findViewById(R.id.spLanguage);
swLanguageTool = view.findViewById(R.id.swLanguageTool);
+ tvLanguageToolPrivacy = view.findViewById(R.id.tvLanguageToolPrivacy);
swLanguageToolAuto = view.findViewById(R.id.swLanguageToolAuto);
swLanguageToolPicky = view.findViewById(R.id.swLanguageToolPicky);
- tvLanguageToolPrivacy = view.findViewById(R.id.tvLanguageToolPrivacy);
+ etLanguageTool = view.findViewById(R.id.etLanguageTool);
ibLanguageTool = view.findViewById(R.id.ibLanguageTool);
swDeepL = view.findViewById(R.id.swDeepL);
tvDeepLPrivacy = view.findViewById(R.id.tvDeepLPrivacy);
@@ -642,6 +648,14 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
+ tvLanguageToolPrivacy.getPaint().setUnderlineText(true);
+ tvLanguageToolPrivacy.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Helper.view(v.getContext(), Uri.parse(Helper.LT_PRIVACY_URI), true);
+ }
+ });
+
swLanguageToolAuto.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@@ -656,11 +670,25 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
- tvLanguageToolPrivacy.getPaint().setUnderlineText(true);
- tvLanguageToolPrivacy.setOnClickListener(new View.OnClickListener() {
+ etLanguageTool.setHint(LanguageTool.LT_URI);
+ etLanguageTool.addTextChangedListener(new TextWatcher() {
@Override
- public void onClick(View v) {
- Helper.view(v.getContext(), Uri.parse(Helper.LT_PRIVACY_URI), true);
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // Do nothing
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ // Do nothing
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ String apikey = s.toString().trim();
+ if (TextUtils.isEmpty(apikey))
+ prefs.edit().remove("lt_uri").apply();
+ else
+ prefs.edit().putString("lt_uri", apikey).apply();
}
});
@@ -1869,7 +1897,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
if ("last_cleanup".equals(key))
setLastCleanup(prefs.getLong(key, -1));
- if ("vt_apikey".equals(key) || "send_host".equals(key))
+ if ("lt_uri".equals(key) || "vt_apikey".equals(key) || "send_host".equals(key))
return;
if ("global_keywords".equals(key))
@@ -2020,6 +2048,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swLanguageToolAuto.setEnabled(swLanguageTool.isChecked());
swLanguageToolPicky.setChecked(prefs.getBoolean("lt_picky", false));
swLanguageToolPicky.setEnabled(swLanguageTool.isChecked());
+ etLanguageTool.setText(prefs.getString("lt_uri", null));
swDeepL.setChecked(prefs.getBoolean("deepl_enabled", false));
swVirusTotal.setChecked(prefs.getBoolean("vt_enabled", false));
etVirusTotal.setText(prefs.getString("vt_apikey", null));
diff --git a/app/src/main/java/eu/faircode/email/LanguageTool.java b/app/src/main/java/eu/faircode/email/LanguageTool.java
index fe59137588..a8fdfa240c 100644
--- a/app/src/main/java/eu/faircode/email/LanguageTool.java
+++ b/app/src/main/java/eu/faircode/email/LanguageTool.java
@@ -46,7 +46,7 @@ import java.util.Locale;
import javax.net.ssl.HttpsURLConnection;
public class LanguageTool {
- private static final String LT_URI = "https://api.languagetool.org/v2/";
+ static final String LT_URI = "https://api.languagetool.org/v2/";
private static final int LT_TIMEOUT = 20; // seconds
static boolean isEnabled(Context context) {
@@ -94,9 +94,13 @@ public class LanguageTool {
if (lt_picky)
request += "&level=picky";
- Log.i("LT locale=" + locale + " request=" + request);
+ String uri = prefs.getString("lt_uri", LT_URI);
+ if (!uri.endsWith("/"))
+ uri += '/';
- URL url = new URL(LT_URI + "check");
+ Log.i("LT locale=" + locale + " uri=" + uri + " request=" + request);
+
+ URL url = new URL(uri + "check");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml
index 918c9a20f8..ef57fd21e7 100644
--- a/app/src/main/res/layout/fragment_options_misc.xml
+++ b/app/src/main/res/layout/fragment_options_misc.xml
@@ -367,6 +367,18 @@
app:layout_constraintTop_toBottomOf="@id/swLanguageToolAuto"
app:switchPadding="12dp" />
+
+