From ddc5c434b198de3d47f589133a7752f9100c1b78 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 15 Mar 2022 09:31:04 +0100 Subject: [PATCH] Experiment: delete translated text --- .../eu/faircode/email/FragmentCompose.java | 23 +++++++++++++++++++ .../java/eu/faircode/email/StyleHelper.java | 14 ++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 2dbb0cbd5e..ed6c795239 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -591,6 +591,7 @@ public class FragmentCompose extends FragmentBase { etBody.addTextChangedListener(new TextWatcher() { private Integer added = null; private Integer removed = null; + private Integer replaced = null; @Override public void beforeTextChanged(CharSequence text, int start, int count, int after) { @@ -598,6 +599,10 @@ public class FragmentCompose extends FragmentBase { Log.i("Removed=" + start); removed = start; } + if (BuildConfig.DEBUG && count - after == 1) { + replaced = start + after; + Log.i("Replaced=" + replaced); + } } @Override @@ -736,6 +741,22 @@ public class FragmentCompose extends FragmentBase { removed = null; } + if (replaced != null && replaced > 0) { + StyleHelper.TranslatedSpan[] nc = + text.getSpans(replaced - 1, replaced, StyleHelper.TranslatedSpan.class); + if (nc != null) + for (StyleHelper.TranslatedSpan p : nc) { + int start = text.getSpanStart(p); + int end = text.getSpanEnd(p); + if (end == replaced) { + text.delete(start, end); + text.removeSpan(p); + } + } + + replaced = null; + } + if (lp != null) TextUtils.dumpSpans(text, lp, "---after>"); } @@ -2154,6 +2175,8 @@ public class FragmentCompose extends FragmentBase { */ int len = 2 + translation.translated_text.length(); edit.insert(paragraph.second, "\n\n" + translation.translated_text); + StyleHelper.markAsTranslated(edit, paragraph.second, paragraph.second + len); + etBody.setSelection(paragraph.second + len); boolean small = prefs.getBoolean("deepl_small", false); diff --git a/app/src/main/java/eu/faircode/email/StyleHelper.java b/app/src/main/java/eu/faircode/email/StyleHelper.java index e9f8985961..5a34c31b46 100644 --- a/app/src/main/java/eu/faircode/email/StyleHelper.java +++ b/app/src/main/java/eu/faircode/email/StyleHelper.java @@ -27,6 +27,8 @@ import android.graphics.Typeface; import android.os.Build; import android.text.Editable; import android.text.Layout; +import android.text.NoCopySpan; +import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -79,7 +81,8 @@ public class StyleHelper { QuoteSpan.class, IndentSpan.class, StrikethroughSpan.class, URLSpan.class, - TypefaceSpan.class, CustomTypefaceSpan.class + TypefaceSpan.class, CustomTypefaceSpan.class, + TranslatedSpan.class )); static boolean apply(int action, LifecycleOwner owner, View anchor, EditText etBody, Object... args) { @@ -925,6 +928,15 @@ public class StyleHelper { } } + static void markAsTranslated(Editable text, int start, int end) { + for (TranslatedSpan span : text.getSpans(0, text.length(), TranslatedSpan.class)) + text.removeSpan(span); + text.setSpan(new TranslatedSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + + static class TranslatedSpan implements NoCopySpan { + } + static String getFamily(String family) { // https://web.mit.edu/jmorzins/www/fonts.html // https://en.wikipedia.org/wiki/Croscore_fonts