From 52d1d26b60cb715f5efc6cfef67b4a6a761de7ec Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 27 Jun 2021 20:11:09 +0200 Subject: [PATCH] Translate paragraphs on demand --- .../eu/faircode/email/AdapterMessage.java | 96 +++++++++++++++---- app/src/main/res/layout/dialog_translate.xml | 29 ++---- 2 files changed, 90 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index ff54973d08..7175deadf4 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -70,6 +70,7 @@ import android.text.style.DynamicDrawableSpan; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; import android.text.style.QuoteSpan; +import android.text.style.StyleSpan; import android.text.style.URLSpan; import android.util.Pair; import android.util.TypedValue; @@ -6655,14 +6656,12 @@ public class AdapterMessage extends RecyclerView.Adapter() { + new SimpleTask() { @Override protected void onPreExecute(Bundle args) { pbWait.setVisibility(View.VISIBLE); @@ -6674,28 +6673,93 @@ public class AdapterMessage extends RecyclerView.Adapter 0 && buffer.charAt(start - 1) != '\n') + start--; + + int end = off; + while (end < buffer.length() && buffer.charAt(end) != '\n') + end++; + + if (end <= start) + return; + + StyleSpan[] spans = buffer.getSpans(start, end, StyleSpan.class); + if (spans != null && spans.length > 0) + return; + + Bundle args = new Bundle(); + args.putInt("start", start); + args.putInt("end", end); + args.putString("text", buffer.subSequence(start, end).toString()); + + new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + running = true; + pbWait.setVisibility(View.VISIBLE); + } + + @Override + protected void onPostExecute(Bundle args) { + running = false; + pbWait.setVisibility(View.GONE); + } + + @Override + protected DeepL.Translation onExecute(Context context, Bundle args) throws Throwable { + String text = args.getString("text"); + String language = DeepL.getCurrentLanguage(context); + return DeepL.translate(text, language, context); + } + + @Override + protected void onExecuted(Bundle args, DeepL.Translation translation) { + int start = args.getInt("start"); + int end = args.getInt("end"); + SpannableStringBuilder ssb = new SpannableStringBuilder(buffer); + ssb = ssb.replace(start, end, translation.translated_text); + ssb.setSpan(new StyleSpan(Typeface.ITALIC), start, start + translation.translated_text.length(), 0); + tvText.setText(ssb); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + tvText.setText(ex.toString()); + } + }.execute(FragmentDialogTranslate.this, args, "paragraph:translate"); + } + }); } @Override protected void onException(Bundle args, Throwable ex) { - tvTranslated.setText(ex.toString()); + tvText.setText(ex.toString()); } }.execute(this, getArguments(), "message:translate"); diff --git a/app/src/main/res/layout/dialog_translate.xml b/app/src/main/res/layout/dialog_translate.xml index c4c7b78607..71e13c0ba1 100644 --- a/app/src/main/res/layout/dialog_translate.xml +++ b/app/src/main/res/layout/dialog_translate.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" + android:fadeScrollbars="false" android:padding="24dp" android:scrollbarStyle="outsideOverlay"> @@ -21,10 +22,10 @@ app:layout_constraintTop_toTopOf="parent" /> - - + app:layout_constraintBottom_toBottomOf="@id/tvText" + app:layout_constraintEnd_toEndOf="@id/tvText" + app:layout_constraintStart_toStartOf="@id/tvText" + app:layout_constraintTop_toTopOf="@id/tvText" + app:show_delay="0" /> \ No newline at end of file