mirror of https://github.com/M66B/FairEmail.git
Removed on device translation
The quality is bad and practically unusuable
This commit is contained in:
parent
7c733c39c6
commit
5ac6155699
|
@ -50,17 +50,14 @@ android {
|
|||
}
|
||||
|
||||
sourceSets {
|
||||
githubDebug {
|
||||
java.srcDirs = ['src/main/java', 'src/iab/java', 'src/xlat/java']
|
||||
}
|
||||
githubRelease {
|
||||
java.srcDirs = ['src/main/java', 'src/iab/java', 'src/stub/java']
|
||||
github {
|
||||
java.srcDirs = ['src/main/java', 'src/iab/java']
|
||||
}
|
||||
fdroid {
|
||||
java.srcDirs = ['src/main/java', 'src/fdroid/java', 'src/stub/java']
|
||||
java.srcDirs = ['src/main/java', 'src/fdroid/java']
|
||||
}
|
||||
play {
|
||||
java.srcDirs = ['src/main/java', 'src/iab/java', 'src/stub/java']
|
||||
java.srcDirs = ['src/main/java', 'src/iab/java']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -250,8 +247,6 @@ 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_identify = "16.0.0"
|
||||
def mlkit_translate = "16.0.0"
|
||||
def billingclient_version = "3.0.0"
|
||||
def javamail_version = "1.6.5"
|
||||
def jsoup_version = "1.13.1"
|
||||
|
@ -345,11 +340,6 @@ dependencies {
|
|||
// https://developer.android.com/jetpack/androidx/releases/textclassifier
|
||||
//implementation "androidx.textclassifier:textclassifier:$textclassifier_version"
|
||||
|
||||
// https://developers.google.com/ml-kit/language/identification/android
|
||||
// https://developers.google.com/ml-kit/language/translation/android
|
||||
debugImplementation "com.google.mlkit:language-id:$mlkit_identify"
|
||||
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"
|
||||
|
|
|
@ -410,7 +410,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
private ImageButton ibDecrypt;
|
||||
private ImageButton ibVerify;
|
||||
private ImageButton ibUndo;
|
||||
private ImageButton ibTranslate;
|
||||
private ImageButton ibRule;
|
||||
private ImageButton ibUnsubscribe;
|
||||
private ImageButton ibAnswer;
|
||||
|
@ -615,7 +614,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
ibDecrypt = vsBody.findViewById(R.id.ibDecrypt);
|
||||
ibVerify = vsBody.findViewById(R.id.ibVerify);
|
||||
ibUndo = vsBody.findViewById(R.id.ibUndo);
|
||||
ibTranslate = vsBody.findViewById(R.id.ibTranslate);
|
||||
ibRule = vsBody.findViewById(R.id.ibRule);
|
||||
ibUnsubscribe = vsBody.findViewById(R.id.ibUnsubscribe);
|
||||
ibAnswer = vsBody.findViewById(R.id.ibAnswer);
|
||||
|
@ -705,7 +703,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
|
||||
ibFull.setOnClickListener(this);
|
||||
ibImages.setOnClickListener(this);
|
||||
ibTranslate.setOnClickListener(this);
|
||||
ibRule.setOnClickListener(this);
|
||||
ibUnsubscribe.setOnClickListener(this);
|
||||
ibDecrypt.setOnClickListener(this);
|
||||
|
@ -795,7 +792,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
|
||||
ibFull.setOnClickListener(null);
|
||||
ibImages.setOnClickListener(null);
|
||||
ibTranslate.setOnClickListener(null);
|
||||
ibRule.setOnClickListener(null);
|
||||
ibUnsubscribe.setOnClickListener(null);
|
||||
ibDecrypt.setOnClickListener(null);
|
||||
|
@ -1269,7 +1265,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
ibDecrypt.setVisibility(View.GONE);
|
||||
ibVerify.setVisibility(View.GONE);
|
||||
ibUndo.setVisibility(View.GONE);
|
||||
ibTranslate.setVisibility(View.GONE);
|
||||
ibRule.setVisibility(View.GONE);
|
||||
ibUnsubscribe.setVisibility(View.GONE);
|
||||
ibAnswer.setVisibility(View.GONE);
|
||||
|
@ -1402,7 +1397,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
ibDecrypt.setVisibility(View.GONE);
|
||||
ibVerify.setVisibility(View.GONE);
|
||||
ibUndo.setVisibility(View.GONE);
|
||||
ibTranslate.setVisibility(View.GONE);
|
||||
ibRule.setVisibility(View.GONE);
|
||||
ibUnsubscribe.setVisibility(View.GONE);
|
||||
ibAnswer.setVisibility(View.GONE);
|
||||
|
@ -1544,12 +1538,9 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
boolean button_unsubscribe = prefs.getBoolean("button_unsubscribe", true);
|
||||
boolean button_rule = prefs.getBoolean("button_rule", false);
|
||||
|
||||
boolean full = properties.getValue("full", message.id);
|
||||
|
||||
ibTrash.setTag(delete);
|
||||
|
||||
ibUndo.setVisibility(outbox ? View.VISIBLE : View.GONE);
|
||||
ibTranslate.setVisibility(tools && !full && !outbox ? View.VISIBLE : View.GONE);
|
||||
ibRule.setVisibility(tools && button_rule && !outbox &&
|
||||
message.accountProtocol == EntityAccount.TYPE_IMAP ? View.VISIBLE : View.GONE);
|
||||
ibUnsubscribe.setVisibility(tools && button_unsubscribe && message.unsubscribe != null ? View.VISIBLE : View.GONE);
|
||||
|
@ -2752,9 +2743,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
case R.id.ibUndo:
|
||||
onActionUndo(message);
|
||||
break;
|
||||
case R.id.ibTranslate:
|
||||
onActionTranslate(message);
|
||||
break;
|
||||
case R.id.ibRule:
|
||||
onMenuCreateRule(message);
|
||||
break;
|
||||
|
@ -3548,10 +3536,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
properties.setHeight(message.id, null);
|
||||
properties.setPosition(message.id, null);
|
||||
|
||||
if (BuildConfig.DEBUG)
|
||||
setupTools(message, false, true);
|
||||
else
|
||||
bindBody(message, false);
|
||||
bindBody(message, false);
|
||||
}
|
||||
|
||||
private void onShowImagesConfirmed(TupleMessageEx message) {
|
||||
|
@ -3574,30 +3559,6 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
|
|||
.putExtra("type", encrypt));
|
||||
}
|
||||
|
||||
private void onActionTranslate(TupleMessageEx message) {
|
||||
CharSequence seq = (tvBody.hasSelection()
|
||||
? tvBody.getText().subSequence(tvBody.getSelectionStart(), tvBody.getSelectionEnd())
|
||||
: tvBody.getText());
|
||||
|
||||
FragmentDialogTranslate.Translate(
|
||||
seq.toString(),
|
||||
Locale.getDefault().getLanguage(),
|
||||
new FragmentDialogTranslate.ITranslate() {
|
||||
@Override
|
||||
public void onTranslated(String language, String text) {
|
||||
new AlertDialog.Builder(context)
|
||||
.setTitle(new Locale(language).getDisplayLanguage())
|
||||
.setMessage(text)
|
||||
.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable ex) {
|
||||
Log.unexpectedError(parentFragment.getParentFragmentManager(), ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void onActionAnswer(TupleMessageEx message, View anchor) {
|
||||
properties.reply(message, getSelectedText(), anchor);
|
||||
}
|
||||
|
|
|
@ -278,10 +278,9 @@ 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_TRANSLATE = 13;
|
||||
private static final int REQUEST_LINK = 14;
|
||||
private static final int REQUEST_DISCARD = 15;
|
||||
private static final int REQUEST_SEND = 16;
|
||||
private static final int REQUEST_LINK = 13;
|
||||
private static final int REQUEST_DISCARD = 14;
|
||||
private static final int REQUEST_SEND = 15;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
|
@ -1214,11 +1213,8 @@ 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);
|
||||
|
@ -1279,9 +1275,6 @@ 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;
|
||||
|
@ -1451,20 +1444,6 @@ 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);
|
||||
|
||||
|
@ -1773,10 +1752,6 @@ 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"));
|
||||
|
@ -2763,15 +2738,6 @@ 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");
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z"/>
|
||||
</vector>
|
|
@ -41,7 +41,7 @@
|
|||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="3dp"
|
||||
app:constraint_referenced_ids="ibMore,ibInbox,ibJunk,ibTrash,ibArchive,ibMove,ibCopy,ibLabels,ibAnswer,ibUnsubscribe,ibRule,ibTranslate,ibUndo"
|
||||
app:constraint_referenced_ids="ibMore,ibInbox,ibJunk,ibTrash,ibArchive,ibMove,ibCopy,ibLabels,ibAnswer,ibUnsubscribe,ibRule,ibUndo"
|
||||
app:flow_horizontalBias="0"
|
||||
app:flow_horizontalGap="3dp"
|
||||
app:flow_horizontalStyle="packed"
|
||||
|
@ -180,18 +180,6 @@
|
|||
app:srcCompat="@drawable/baseline_rule_24"
|
||||
tools:ignore="MissingConstraints" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/ibTranslate"
|
||||
android:layout_width="36dp"
|
||||
android:layout_height="36dp"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/title_translate"
|
||||
android:padding="6dp"
|
||||
android:scaleType="fitCenter"
|
||||
android:tooltipText="@string/title_translate"
|
||||
app:srcCompat="@drawable/baseline_translate_24"
|
||||
tools:ignore="MissingConstraints" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/ibUndo"
|
||||
android:layout_width="36dp"
|
||||
|
|
|
@ -50,11 +50,6 @@
|
|||
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"
|
||||
|
|
|
@ -887,7 +887,6 @@
|
|||
<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>
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
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();
|
||||
}
|
||||
|
||||
static void Translate(String text, String targetLanguage, ITranslate intf) {
|
||||
// Stub
|
||||
}
|
||||
|
||||
interface ITranslate {
|
||||
void onTranslated(String language, String text);
|
||||
|
||||
void onError(Throwable ex);
|
||||
}
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
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.languageid.LanguageIdentification;
|
||||
import com.google.mlkit.nl.languageid.LanguageIdentificationOptions;
|
||||
import com.google.mlkit.nl.languageid.LanguageIdentifier;
|
||||
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 targetLanguage = map.get(items[which]);
|
||||
|
||||
Translate(text, targetLanguage, new ITranslate() {
|
||||
@Override
|
||||
public void onTranslated(String language, String text) {
|
||||
getArguments().putString("translated", text);
|
||||
sendResult(RESULT_OK);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable ex) {
|
||||
Log.unexpectedError(getParentFragmentManager(), ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
.create();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDismiss(@NonNull DialogInterface dialog) {
|
||||
}
|
||||
|
||||
static void Translate(String text, String targetLanguage, ITranslate intf) {
|
||||
LanguageIdentifier languageIdentifier = LanguageIdentification.getClient(
|
||||
new LanguageIdentificationOptions.Builder()
|
||||
.setConfidenceThreshold(0.34f)
|
||||
.build());
|
||||
languageIdentifier.identifyLanguage(text)
|
||||
.addOnSuccessListener(
|
||||
new OnSuccessListener<String>() {
|
||||
@Override
|
||||
public void onSuccess(@Nullable String language) {
|
||||
Log.i("Translate source=" + language);
|
||||
final String sourceLanguage = (language.equals("und") ? TranslateLanguage.ENGLISH : language);
|
||||
|
||||
if (sourceLanguage.equals(targetLanguage)) {
|
||||
intf.onTranslated(sourceLanguage, text);
|
||||
return;
|
||||
}
|
||||
|
||||
TranslatorOptions options = new TranslatorOptions.Builder()
|
||||
.setSourceLanguage(sourceLanguage)
|
||||
.setTargetLanguage(targetLanguage)
|
||||
.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) {
|
||||
intf.onTranslated(sourceLanguage, translatedText);
|
||||
}
|
||||
})
|
||||
.addOnFailureListener(
|
||||
new OnFailureListener() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Exception ex) {
|
||||
intf.onError(ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
.addOnFailureListener(
|
||||
new OnFailureListener() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Exception ex) {
|
||||
intf.onError(ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
.addOnFailureListener(
|
||||
new OnFailureListener() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Exception ex) {
|
||||
intf.onError(ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
interface ITranslate {
|
||||
void onTranslated(String language, String text);
|
||||
|
||||
void onError(Throwable ex);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue