Added ML kit translate (debug only)

This commit is contained in:
M66B 2020-06-27 13:26:19 +02:00
parent 1a2fb489ce
commit 1076cf9498
19 changed files with 187 additions and 19 deletions

View File

@ -50,14 +50,17 @@ android {
}
sourceSets {
github {
java.srcDirs = ['src/main/java', 'src/iab/java']
githubDebug {
java.srcDirs = ['src/main/java', 'src/iab/java', 'src/xlat/java']
}
githubRelease {
java.srcDirs = ['src/main/java', 'src/iab/java', 'src/stub/java']
}
fdroid {
java.srcDirs = ['src/main/java', 'src/fdroid/java']
java.srcDirs = ['src/main/java', 'src/fdroid/java', 'src/stub/java']
}
play {
java.srcDirs = ['src/main/java', 'src/iab/java']
java.srcDirs = ['src/main/java', 'src/iab/java', 'src/stub/java']
}
}
}
@ -247,6 +250,7 @@ dependencies {
def exif_version = "1.3.0-alpha01"
def biometric_version = "1.0.1" // https://issuetracker.google.com/issues/159983244
def textclassifier_version = "1.0.0-alpha03"
def mlkit_translate = "16.0.0"
def billingclient_version = "3.0.0"
def javamail_version = "1.6.5"
def jsoup_version = "1.13.1"
@ -340,6 +344,9 @@ dependencies {
// https://developer.android.com/jetpack/androidx/releases/textclassifier
//implementation "androidx.textclassifier:textclassifier:$textclassifier_version"
// https://developers.google.com/ml-kit/language/translation/android
debugImplementation "com.google.mlkit:translate:$mlkit_translate"
// https://developer.android.com/google/play/billing/billing_library_releases_notes
// https://android-developers.googleblog.com/2020/06/meet-google-play-billing-library.html
githubImplementation "com.android.billingclient:billing:$billingclient_version"

View File

@ -278,9 +278,10 @@ public class FragmentCompose extends FragmentBase {
private static final int REQUEST_COLOR = 10;
private static final int REQUEST_CONTACT_GROUP = 11;
private static final int REQUEST_ANSWER = 12;
private static final int REQUEST_LINK = 13;
private static final int REQUEST_DISCARD = 14;
private static final int REQUEST_SEND = 15;
private static final int REQUEST_TRANSLATE = 13;
private static final int REQUEST_LINK = 14;
private static final int REQUEST_DISCARD = 15;
private static final int REQUEST_SEND = 16;
@Override
public void onCreate(Bundle savedInstanceState) {
@ -1213,8 +1214,11 @@ public class FragmentCompose extends FragmentBase {
menu.findItem(R.id.menu_contact_group).setEnabled(
state == State.LOADED && hasPermission(Manifest.permission.READ_CONTACTS));
menu.findItem(R.id.menu_answer).setEnabled(state == State.LOADED);
menu.findItem(R.id.menu_translate).setEnabled(state == State.LOADED);
menu.findItem(R.id.menu_clear).setEnabled(state == State.LOADED);
menu.findItem(R.id.menu_translate).setVisible(BuildConfig.DEBUG);
int colorEncrypt = Helper.resolveColor(getContext(), R.attr.colorEncrypt);
ImageButton ib = (ImageButton) menu.findItem(R.id.menu_encrypt).getActionView();
ib.setEnabled(state == State.LOADED);
@ -1275,6 +1279,9 @@ public class FragmentCompose extends FragmentBase {
case R.id.menu_answer:
onMenuAnswer();
return true;
case R.id.menu_translate:
onMenuTranslate();
return true;
case R.id.menu_clear:
StyleHelper.apply(R.id.menu_clear, etBody);
return true;
@ -1444,6 +1451,20 @@ public class FragmentCompose extends FragmentBase {
fragment.show(getParentFragmentManager(), "compose:answer");
}
private void onMenuTranslate() {
Bundle args = new Bundle();
CharSequence seq = (etBody.hasSelection()
? etBody.getText().subSequence(etBody.getSelectionStart(), etBody.getSelectionEnd())
: etBody.getText());
args.putString("text", seq.toString());
FragmentDialogTranslate fragment = new FragmentDialogTranslate();
fragment.setArguments(args);
fragment.setTargetFragment(this, REQUEST_TRANSLATE);
fragment.show(getParentFragmentManager(), "compose:answer");
}
private boolean onActionStyle(int action) {
Log.i("Style action=" + action);
@ -1752,6 +1773,10 @@ public class FragmentCompose extends FragmentBase {
if (resultCode == RESULT_OK && data != null)
onAnswerSelected(data.getBundleExtra("args"));
break;
case REQUEST_TRANSLATE:
if (resultCode == RESULT_OK && data != null)
onTranslated(data.getBundleExtra("args"));
break;
case REQUEST_COLOR:
if (resultCode == RESULT_OK && data != null)
onColorSelected(data.getBundleExtra("args"));
@ -2732,6 +2757,15 @@ public class FragmentCompose extends FragmentBase {
etBody.getText().insert(etBody.getSelectionStart(), spanned);
}
private void onTranslated(Bundle args) {
String translated = "\n" + args.getString("translated");
if (etBody.hasSelection())
etBody.getEditableText().insert(etBody.getSelectionEnd(), translated);
else
etBody.getEditableText().append(translated);
}
private void onColorSelected(Bundle args) {
int color = args.getInt("color");
int start = args.getInt("start");

View File

@ -50,6 +50,11 @@
android:title="@string/title_insert_template"
app:showAsAction="never" />
<item
android:id="@+id/menu_translate"
android:title="@string/title_translate"
app:showAsAction="never" />
<item
android:id="@+id/menu_clear"
android:title="@string/title_style_clear"

View File

@ -685,7 +685,7 @@
<string name="title_more">Více</string>
<string name="title_spam">Nevyžádané</string>
<string name="title_move">Přesunout</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Kopírovat</string>
<string name="title_copy_btn">Kopírovat</string>
<string name="title_unsubscribe">Odhlásit odběr</string>
<string name="title_message_rule">Vytvořit pravidlo</string>
<string name="title_no_junk">Není spam</string>

View File

@ -663,7 +663,7 @@
<string name="title_more">Mere</string>
<string name="title_spam">Spam</string>
<string name="title_move">Flyt</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Kopiér</string>
<string name="title_copy_btn">Kopiér</string>
<string name="title_unsubscribe">Afmeld</string>
<string name="title_message_rule">Opret regel</string>
<string name="title_no_junk">Ikke spam</string>

View File

@ -663,7 +663,7 @@ Protokolle, die dem Standard nicht entsprechen, wie „Microsoft Exchange Web Se
<string name="title_more">Mehr</string>
<string name="title_spam">Spam</string>
<string name="title_move">Verschieben</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Kopieren</string>
<string name="title_copy_btn">Kopieren</string>
<string name="title_unsubscribe">Aus Liste abmelden</string>
<string name="title_message_rule">Regel erstellen</string>
<string name="title_no_junk">Kein Spam</string>
@ -780,6 +780,7 @@ Protokolle, die dem Standard nicht entsprechen, wie „Microsoft Exchange Web Se
<string name="title_media_toolbar">Mediensymbolleiste</string>
<string name="title_insert_contact_group">Kontaktgruppe einfügen</string>
<string name="title_insert_template">Vorlage einfügen</string>
<string name="title_translate">Übersetzen</string>
<string name="title_edit_plain_text">Als einfachen Text bearbeiten</string>
<string name="title_edit_formatted_text">Als neu formatierten Text bearbeiten</string>
<string name="title_select_certificate">Öffentlichen Schlüssel auswählen</string>

View File

@ -664,7 +664,7 @@
<string name="title_more">Más</string>
<string name="title_spam">Spam</string>
<string name="title_move">Mover</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Copiar</string>
<string name="title_copy_btn">Copiar</string>
<string name="title_unsubscribe">Darse de baja</string>
<string name="title_message_rule">Crear regla</string>
<string name="title_no_junk">No es Spam</string>

View File

@ -6,6 +6,7 @@
<string name="app_limitations">Esimerkiksi viestit muotoillaan aina uudelleen vaarallisten elementtien poistamiseksi ja luettavuuden parantamiseksi, ja linkkien avaaminen pitää turvallisuuden takia erikseen vahvistaa.</string>
<string name="app_crash">FairEmailia ei tueta tässä laitteessa, koska bugit Androidissa aiheuttavat kaatumisia</string>
<string name="app_exit">Mene \'takaisin\' uudelleen poistuaksesi</string>
<string name="channel_service">Vastaanottaminen</string>
<string name="channel_send">Lähettäminen</string>
<string name="channel_notification">Ilmoitukset</string>
<string name="channel_update">Päivitykset</string>
@ -75,6 +76,7 @@
<string name="title_notification_idle">Toimeton</string>
<string name="title_notification_failed">\'%1$s\' epäonnistui</string>
<string name="title_notification_alert">Palvelimen \'%1$s\' hälytys</string>
<string name="title_notification_sending_failed">Lähettäminen vastaanottajalle %1$s epäonnistui</string>
<string name="title_of">%1$s/%2$s</string>
<string name="title_name_count">%1$s (%2$s)</string>
<string name="title_name_plus">%1$s +%2$d</string>
@ -620,6 +622,7 @@
<string name="title_duplicate_in">Tee viestistä kopio kansioon %1$s</string>
<string name="title_subject_reply">Re: %1$s</string>
<string name="title_subject_forward">Fwd: %1$s</string>
<string name="title_buttons">Painikkeet</string>
<string name="title_seen">Merkitse luetuksi</string>
<string name="title_unseen">Merkitse lukemattomaksi</string>
<string name="title_hide">Piilota</string>
@ -658,6 +661,9 @@
<string name="title_more">Lisää</string>
<string name="title_spam">Siirrä roskapostikansioon</string>
<string name="title_move">Siirrä</string>
<string name="title_copy_btn">Kopioi</string>
<string name="title_unsubscribe">Peru tilaus</string>
<string name="title_message_rule">Luo sääntö</string>
<string name="title_no_junk">Ei roskaposti</string>
<string name="title_move_to">Siirrä kansioon &#8230;</string>
<string name="title_move_to_folder">Siirrä kansioon &#8230;</string>
@ -772,6 +778,7 @@
<string name="title_media_toolbar">Mediatyökalupalkki</string>
<string name="title_insert_contact_group">Lisää yhteystietoryhmä</string>
<string name="title_insert_template">Lisää viestipohja</string>
<string name="title_translate">Käännä</string>
<string name="title_edit_plain_text">Muokkaa pelkkänä tekstinä</string>
<string name="title_edit_formatted_text">Muokkaa uudelleenmuotoiltuna tekstinä</string>
<string name="title_select_certificate">Valitse julkinen avain</string>

View File

@ -663,7 +663,7 @@
<string name="title_more">Plus</string>
<string name="title_spam">Indésirables</string>
<string name="title_move">Déplacer</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Copier</string>
<string name="title_copy_btn">Copier</string>
<string name="title_unsubscribe">Se désabonner</string>
<string name="title_message_rule">Créer une règle</string>
<string name="title_no_junk">Non indésirable</string>
@ -780,6 +780,7 @@
<string name="title_media_toolbar">Barre doutils média</string>
<string name="title_insert_contact_group">Insérer un groupe de contacts</string>
<string name="title_insert_template">Insérer un modèle</string>
<string name="title_translate">Traduire</string>
<string name="title_edit_plain_text">Modifier comme texte brut</string>
<string name="title_edit_formatted_text">Modifier comme texte reformaté</string>
<string name="title_select_certificate">Sélectionner la clé publique</string>

View File

@ -663,7 +663,7 @@
<string name="title_more">Plus</string>
<string name="title_spam">Spam</string>
<string name="title_move">Déplacer</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Copier</string>
<string name="title_copy_btn">Copier</string>
<string name="title_unsubscribe">Se désabonner</string>
<string name="title_message_rule">Créer une règle</string>
<string name="title_no_junk">Non spam</string>
@ -780,6 +780,7 @@
<string name="title_media_toolbar">Barre d\'outils média</string>
<string name="title_insert_contact_group">Insérer un groupe de contacts</string>
<string name="title_insert_template">Insérer un modèle</string>
<string name="title_translate">Traduire</string>
<string name="title_edit_plain_text">Modifier comme texte brut</string>
<string name="title_edit_formatted_text">Modifier comme texte reformaté</string>
<string name="title_select_certificate">Sélectionner la clé publique</string>

View File

@ -663,7 +663,7 @@
<string name="title_more">Altro</string>
<string name="title_spam">Posta indesiderata</string>
<string name="title_move">Sposta</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Copia</string>
<string name="title_copy_btn">Copia</string>
<string name="title_unsubscribe">Disiscriviti</string>
<string name="title_message_rule">Crea una regola</string>
<string name="title_no_junk">Non spam</string>

View File

@ -662,7 +662,7 @@
<string name="title_more">Meer</string>
<string name="title_spam">Spam</string>
<string name="title_move">Verplaatsen</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Kopiëren</string>
<string name="title_copy_btn">Kopiëren</string>
<string name="title_unsubscribe">Uitschrijven</string>
<string name="title_message_rule">Maak regel</string>
<string name="title_no_junk">Geen spam</string>
@ -779,6 +779,7 @@
<string name="title_media_toolbar">Media werkbalk</string>
<string name="title_insert_contact_group">Contactgroep toevoegen</string>
<string name="title_insert_template">Sjabloon invoegen</string>
<string name="title_translate">Vertalen</string>
<string name="title_edit_plain_text">Bewerk als platte tekst</string>
<string name="title_edit_formatted_text">Bewerk als geformatteerde tekst</string>
<string name="title_select_certificate">Selecteer publieke sleutel</string>

View File

@ -684,7 +684,7 @@
<string name="title_more">Więcej</string>
<string name="title_spam">Spam</string>
<string name="title_move">Przenieś</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Kopiuj</string>
<string name="title_copy_btn">Kopiuj</string>
<string name="title_unsubscribe">Anuluj subskrypcję</string>
<string name="title_message_rule">Utwórz regułę</string>
<string name="title_no_junk">To nie jest spam</string>

View File

@ -685,7 +685,7 @@
<string name="title_more">Ещё</string>
<string name="title_spam">Спам</string>
<string name="title_move">Переместить</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Копировать</string>
<string name="title_copy_btn">Копировать</string>
<string name="title_unsubscribe">Отписаться</string>
<string name="title_message_rule">Создать правило</string>
<string name="title_no_junk">Не спам</string>
@ -802,6 +802,7 @@
<string name="title_media_toolbar">Панель медиа</string>
<string name="title_insert_contact_group">Добавить группу контактов</string>
<string name="title_insert_template">Вставить шаблон</string>
<string name="title_translate">Перевод</string>
<string name="title_edit_plain_text">Редактировать как простой текст</string>
<string name="title_edit_formatted_text">Редактировать как исходный текст</string>
<string name="title_select_certificate">Выбор публичного ключа</string>

View File

@ -662,7 +662,7 @@
<string name="title_more">Mer</string>
<string name="title_spam">Skräppost</string>
<string name="title_move">Flytta</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">Kopiera</string>
<string name="title_copy_btn">Kopiera</string>
<string name="title_unsubscribe">Avbryt prenumeration</string>
<string name="title_message_rule">Skapa regel</string>
<string name="title_no_junk">Inte skräppost</string>
@ -779,6 +779,7 @@
<string name="title_media_toolbar">Verktygsfält för media</string>
<string name="title_insert_contact_group">Infoga kontaktgrupp</string>
<string name="title_insert_template">Infoga mall</string>
<string name="title_translate">Översätt</string>
<string name="title_edit_plain_text">Redigera som oformaterad text</string>
<string name="title_edit_formatted_text">Redigera som formaterad text</string>
<string name="title_select_certificate">Välj publik nyckel</string>

View File

@ -651,7 +651,7 @@
<string name="title_more">更多</string>
<string name="title_spam">垃圾邮件</string>
<string name="title_move">移动</string>
<string name="title_copy_btn" comment="title_copy_btn&#10;Title for menu to enable/disable copy button (verb)">复制</string>
<string name="title_copy_btn">复制</string>
<string name="title_unsubscribe">取消订阅</string>
<string name="title_message_rule">创建规则</string>
<string name="title_no_junk">不是垃圾邮件</string>

View File

@ -887,6 +887,7 @@
<string name="title_media_toolbar">Media toolbar</string>
<string name="title_insert_contact_group">Insert contact group</string>
<string name="title_insert_template">Insert template</string>
<string name="title_translate">Translate</string>
<string name="title_edit_plain_text">Edit as plain text</string>
<string name="title_edit_formatted_text">Edit as reformatted text</string>
<string name="title_select_certificate">Select public key</string>

View File

@ -0,0 +1,18 @@
package eu.faircode.email;
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class FragmentDialogTranslate extends FragmentDialogBase {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
return new AlertDialog.Builder(getContext())
.setTitle(R.string.title_translate)
.create();
}
}

View File

@ -0,0 +1,90 @@
package eu.faircode.email;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.mlkit.common.model.DownloadConditions;
import com.google.mlkit.nl.translate.TranslateLanguage;
import com.google.mlkit.nl.translate.Translation;
import com.google.mlkit.nl.translate.Translator;
import com.google.mlkit.nl.translate.TranslatorOptions;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import static android.app.Activity.RESULT_OK;
public class FragmentDialogTranslate extends FragmentDialogBase {
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
final String text = getArguments().getString("text");
Map<String, String> map = new TreeMap<>();
for (String lc : TranslateLanguage.getAllLanguages())
map.put(new Locale(lc).getDisplayLanguage(), lc);
String[] items = map.keySet().toArray(new String[0]);
return new AlertDialog.Builder(getContext())
.setTitle(R.string.title_translate)
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String language = map.get(items[which]);
TranslatorOptions options = new TranslatorOptions.Builder()
.setSourceLanguage(TranslateLanguage.ENGLISH)
.setTargetLanguage(language)
.build();
Translator translator = Translation.getClient(options);
DownloadConditions conditions = new DownloadConditions.Builder()
.requireWifi()
.build();
translator.downloadModelIfNeeded(conditions)
.addOnSuccessListener(
new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void v) {
translator.translate(text)
.addOnSuccessListener(
new OnSuccessListener<String>() {
@Override
public void onSuccess(@NonNull String translatedText) {
getArguments().putString("translated", translatedText);
sendResult(RESULT_OK);
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception ex) {
Log.unexpectedError(getParentFragmentManager(), ex);
}
});
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception ex) {
Log.unexpectedError(getParentFragmentManager(), ex);
}
});
}
})
.create();
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
}
}