Removed on device translation

The quality is bad and practically unusuable
This commit is contained in:
M66B 2020-06-28 10:12:53 +02:00
parent 7c733c39c6
commit 5ac6155699
9 changed files with 9 additions and 287 deletions

View File

@ -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"

View File

@ -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);
}

View File

@ -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");

View File

@ -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>

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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);
}
}

View File

@ -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);
}
}