Compose translate subject

pull/213/head
M66B 2 years ago
parent e696cadaf0
commit 479aa72faa

@ -2643,16 +2643,24 @@ public class FragmentCompose extends FragmentBase {
if (languages == null) if (languages == null)
languages = new ArrayList<>(); languages = new ArrayList<>();
int s = etBody.getSelectionStart(); boolean subjectHasFocus = etSubject.hasFocus();
Editable edit = etBody.getText();
if (s > 1 && s <= edit.length() &&
edit.charAt(s - 1) == '\n' &&
edit.charAt(s - 2) != '\n' &&
(s == edit.length() || edit.charAt(s) == '\n'))
etBody.setSelection(s - 1, s - 1);
Pair<Integer, Integer> paragraph = StyleHelper.getParagraph(etBody); boolean canTranslate;
boolean canTranslate = (DeepL.canTranslate(context) && paragraph != null); if (subjectHasFocus) {
CharSequence text = etSubject.getText();
canTranslate = (text != null && !TextUtils.isEmpty(text.toString().trim()));
} else {
int s = etBody.getSelectionStart();
Editable edit = etBody.getText();
if (s > 1 && s <= edit.length() &&
edit.charAt(s - 1) == '\n' &&
edit.charAt(s - 2) != '\n' &&
(s == edit.length() || edit.charAt(s) == '\n'))
etBody.setSelection(s - 1, s - 1);
Pair<Integer, Integer> paragraph = StyleHelper.getParagraph(etBody);
canTranslate = (DeepL.canTranslate(context) && paragraph != null);
}
PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, getViewLifecycleOwner(), anchor); PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, getViewLifecycleOwner(), anchor);
@ -2696,62 +2704,90 @@ public class FragmentCompose extends FragmentBase {
} }
private void onMenuTranslate(String target) { private void onMenuTranslate(String target) {
final Pair<Integer, Integer> paragraph = StyleHelper.getParagraph(etBody); if (subjectHasFocus) {
if (paragraph == null) CharSequence text = etSubject.getText();
return; if (text == null && TextUtils.isEmpty(text.toString().trim()))
return;
etBody.clearComposingText(); Bundle args = new Bundle();
args.putString("target", target);
args.putCharSequence("text", text);
Editable edit = etBody.getText(); new SimpleTask<DeepL.Translation>() {
CharSequence text = edit.subSequence(paragraph.first, paragraph.second); @Override
protected DeepL.Translation onExecute(Context context, Bundle args) throws Throwable {
String target = args.getString("target");
CharSequence text = args.getCharSequence("text");
return DeepL.translate(text, true, target, context);
}
Bundle args = new Bundle(); @Override
args.putString("target", target); protected void onExecuted(Bundle args, DeepL.Translation translation) {
args.putCharSequence("text", text); etSubject.setText(translation.translated_text);
}
new SimpleTask<DeepL.Translation>() { @Override
private Object highlightSpan; protected void onException(Bundle args, Throwable ex) {
private Toast toast = null; Log.unexpectedError(getParentFragmentManager(), ex, !(ex instanceof IOException));
}
}.serial().execute(FragmentCompose.this, args, "compose:translate");
} else {
final Pair<Integer, Integer> paragraph = StyleHelper.getParagraph(etBody);
if (paragraph == null)
return;
@Override etBody.clearComposingText();
protected void onPreExecute(Bundle args) {
int textColorHighlight = Helper.resolveColor(getContext(), android.R.attr.textColorHighlight);
highlightSpan = new BackgroundColorSpan(textColorHighlight);
etBody.getText().setSpan(highlightSpan, paragraph.first, paragraph.second,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING);
toast = ToastEx.makeText(context, R.string.title_translating, Toast.LENGTH_SHORT);
toast.show();
}
@Override Editable edit = etBody.getText();
protected void onPostExecute(Bundle args) { CharSequence text = edit.subSequence(paragraph.first, paragraph.second);
if (highlightSpan != null)
etBody.getText().removeSpan(highlightSpan);
if (toast != null)
toast.cancel();
}
@Override Bundle args = new Bundle();
protected DeepL.Translation onExecute(Context context, Bundle args) throws Throwable { args.putString("target", target);
String target = args.getString("target"); args.putCharSequence("text", text);
CharSequence text = args.getCharSequence("text");
return DeepL.translate(text, true, target, context);
}
@Override new SimpleTask<DeepL.Translation>() {
protected void onExecuted(Bundle args, DeepL.Translation translation) { private Object highlightSpan;
if (paragraph.second > edit.length()) private Toast toast = null;
return;
FragmentActivity activity = getActivity(); @Override
if (activity == null) protected void onPreExecute(Bundle args) {
return; int textColorHighlight = Helper.resolveColor(getContext(), android.R.attr.textColorHighlight);
highlightSpan = new BackgroundColorSpan(textColorHighlight);
etBody.getText().setSpan(highlightSpan, paragraph.first, paragraph.second,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_COMPOSING);
toast = ToastEx.makeText(context, R.string.title_translating, Toast.LENGTH_SHORT);
toast.show();
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); @Override
boolean small = prefs.getBoolean("deepl_small", false); protected void onPostExecute(Bundle args) {
boolean replace = (!small && prefs.getBoolean("deepl_replace", false)); if (highlightSpan != null)
etBody.getText().removeSpan(highlightSpan);
if (toast != null)
toast.cancel();
}
@Override
protected DeepL.Translation onExecute(Context context, Bundle args) throws Throwable {
String target = args.getString("target");
CharSequence text = args.getCharSequence("text");
return DeepL.translate(text, true, target, context);
}
@Override
protected void onExecuted(Bundle args, DeepL.Translation translation) {
if (paragraph.second > edit.length())
return;
// Insert translated text FragmentActivity activity = getActivity();
if (activity == null)
return;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean small = prefs.getBoolean("deepl_small", false);
boolean replace = (!small && prefs.getBoolean("deepl_replace", false));
// Insert translated text
/* /*
java.lang.IndexOutOfBoundsException: charAt: -1 < 0 java.lang.IndexOutOfBoundsException: charAt: -1 < 0
at android.text.SpannableStringBuilder.charAt(SpannableStringBuilder.java:123) at android.text.SpannableStringBuilder.charAt(SpannableStringBuilder.java:123)
@ -2772,52 +2808,53 @@ public class FragmentCompose extends FragmentBase {
at android.text.SpannableStringBuilder.insert(SpannableStringBuilder.java:226) at android.text.SpannableStringBuilder.insert(SpannableStringBuilder.java:226)
at android.text.SpannableStringBuilder.insert(SpannableStringBuilder.java:38) at android.text.SpannableStringBuilder.insert(SpannableStringBuilder.java:38)
*/ */
int len = translation.translated_text.length(); int len = translation.translated_text.length();
edit.insert(paragraph.second, translation.translated_text); edit.insert(paragraph.second, translation.translated_text);
if (!replace) { if (!replace) {
edit.insert(paragraph.second, "\n\n"); edit.insert(paragraph.second, "\n\n");
len += 2; len += 2;
} }
StyleHelper.markAsInserted(edit, paragraph.second, paragraph.second + len); StyleHelper.markAsInserted(edit, paragraph.second, paragraph.second + len);
etBody.setSelection(paragraph.second + len); etBody.setSelection(paragraph.second + len);
if (small) { if (small) {
RelativeSizeSpan[] spans = edit.getSpans( RelativeSizeSpan[] spans = edit.getSpans(
paragraph.first, paragraph.second, RelativeSizeSpan.class); paragraph.first, paragraph.second, RelativeSizeSpan.class);
for (RelativeSizeSpan span : spans) for (RelativeSizeSpan span : spans)
edit.removeSpan(span); edit.removeSpan(span);
edit.setSpan(new RelativeSizeSpan(HtmlHelper.FONT_SMALL), edit.setSpan(new RelativeSizeSpan(HtmlHelper.FONT_SMALL),
paragraph.first, paragraph.second, paragraph.first, paragraph.second,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (replace) { } else if (replace) {
edit.delete(paragraph.first, paragraph.second); edit.delete(paragraph.first, paragraph.second);
} }
// Updated frequency // Updated frequency
String key = "translated_" + args.getString("target"); String key = "translated_" + args.getString("target");
int count = prefs.getInt(key, 0); int count = prefs.getInt(key, 0);
prefs.edit().putInt(key, count + 1).apply(); prefs.edit().putInt(key, count + 1).apply();
activity.invalidateOptionsMenu(); activity.invalidateOptionsMenu();
} }
@Override @Override
protected void onDestroyed(Bundle args) { protected void onDestroyed(Bundle args) {
if (toast != null) { if (toast != null) {
toast.cancel(); toast.cancel();
toast = null; toast = null;
}
} }
}
@Override @Override
protected void onException(Bundle args, Throwable ex) { protected void onException(Bundle args, Throwable ex) {
etBody.setSelection(paragraph.second); etBody.setSelection(paragraph.second);
Log.unexpectedError(getParentFragmentManager(), ex, !(ex instanceof IOException)); Log.unexpectedError(getParentFragmentManager(), ex, !(ex instanceof IOException));
} }
}.serial().execute(FragmentCompose.this, args, "compose:translate"); }.serial().execute(FragmentCompose.this, args, "compose:translate");
}
} }
}); });

Loading…
Cancel
Save