Loading app/build.gradle +2 −2 Original line number Diff line number Diff line Loading @@ -13,8 +13,8 @@ android { defaultConfig { minSdk 21 targetSdk 33 versionCode 454 versionName "3.13.0" versionCode 455 versionName "3.13.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" Loading app/src/main/assets/release_notes/notes.json +5 −0 Original line number Diff line number Diff line [ { "version": "3.13.1", "code": "455", "note": "Added:\n- DeepL translation support free/pro keys\n\nChanged:\n- Hide buttons for media when editing\n\nFixed:\n- GIF loaded as static images\n- Suggested accounts cannot be followed" }, { "version": "3.13.0", "code": "454", Loading app/src/main/java/app/fedilab/android/activities/MediaActivity.java +17 −77 Original line number Diff line number Diff line Loading @@ -21,14 +21,12 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Point; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.Html; import android.view.Display; import android.view.Menu; import android.view.MenuItem; Loading @@ -44,15 +42,8 @@ import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.preference.PreferenceManager; import androidx.viewpager.widget.ViewPager; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; import com.github.stom79.mytransl.translate.Params; import com.github.stom79.mytransl.translate.Translate; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; Loading @@ -63,6 +54,7 @@ import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.databinding.ActivityMediaPagerBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MediaHelper; import app.fedilab.android.helper.TranslateHelper; import app.fedilab.android.interfaces.OnDownloadInterface; import app.fedilab.android.ui.fragment.media.FragmentMedia; import es.dmoral.toasty.Toasty; Loading Loading @@ -157,41 +149,15 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload binding.mediaDescription.setText(description); binding.translate.setOnClickListener(v -> { String descriptionToTranslate = attachments.get(mediaPosition - 1).description; MyTransL.translatorEngine et = MyTransL.translatorEngine.LIBRETRANSLATE; final MyTransL myTransL = MyTransL.getInstance(et); myTransL.setObfuscation(true); Params params = new Params(); params.setSplit_sentences(false); params.setFormat(Params.fType.TEXT); params.setSource_lang("auto"); myTransL.setLibretranslateDomain("translate.fedilab.app"); String statusToTranslate; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) statusToTranslate = Html.fromHtml(descriptionToTranslate, Html.FROM_HTML_MODE_LEGACY).toString(); else statusToTranslate = Html.fromHtml(descriptionToTranslate).toString(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(MediaActivity.this); String translate = sharedpreferences.getString(getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale()); if (translate != null && translate.equalsIgnoreCase("default")) { translate = MyTransL.getLocale(); } myTransL.translate(statusToTranslate, translate, params, new Results() { @Override public void onSuccess(Translate translate) { if (translate.getTranslatedContent() != null) { attachments.get(mediaPosition - 1).translation = translate.getTranslatedContent(); binding.mediaDescriptionTranslated.setText(translate.getTranslatedContent()); TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, translated -> { if (translated != null) { attachments.get(mediaPosition - 1).translation = translated; binding.mediaDescriptionTranslated.setText(translated); binding.mediaDescriptionTranslated.setVisibility(View.VISIBLE); binding.mediaDescription.setVisibility(View.GONE); } else { Toasty.error(MediaActivity.this, getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } } @Override public void onFail(HttpsConnectionException httpsConnectionException) { } }); }); if (attachments.get(mediaPosition - 1).translation != null) { Loading Loading @@ -222,41 +188,15 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload } binding.translate.setOnClickListener(v -> { String descriptionToTranslate = attachments.get(position).description; MyTransL.translatorEngine et = MyTransL.translatorEngine.LIBRETRANSLATE; final MyTransL myTransL = MyTransL.getInstance(et); myTransL.setObfuscation(true); Params params = new Params(); params.setSplit_sentences(false); params.setFormat(Params.fType.TEXT); params.setSource_lang("auto"); myTransL.setLibretranslateDomain("translate.fedilab.app"); String statusToTranslate; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) statusToTranslate = Html.fromHtml(descriptionToTranslate, Html.FROM_HTML_MODE_LEGACY).toString(); else statusToTranslate = Html.fromHtml(descriptionToTranslate).toString(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(MediaActivity.this); String translate = sharedpreferences.getString(getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale()); if (translate != null && translate.equalsIgnoreCase("default")) { translate = MyTransL.getLocale(); } myTransL.translate(statusToTranslate, translate, params, new Results() { @Override public void onSuccess(Translate translate) { if (translate.getTranslatedContent() != null) { attachments.get(position).translation = translate.getTranslatedContent(); binding.mediaDescriptionTranslated.setText(translate.getTranslatedContent()); TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, translated -> { if (translated != null) { attachments.get(position).translation = translated; binding.mediaDescriptionTranslated.setText(translated); binding.mediaDescriptionTranslated.setVisibility(View.VISIBLE); binding.mediaDescription.setVisibility(View.GONE); } else { Toasty.error(MediaActivity.this, getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } } @Override public void onFail(HttpsConnectionException httpsConnectionException) { } }); }); if (!fullscreen) { Loading app/src/main/java/app/fedilab/android/helper/Helper.java +5 −1 Original line number Diff line number Diff line Loading @@ -124,14 +124,17 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.TimeZone; import java.util.UUID; import java.util.regex.Matcher; Loading Loading @@ -1236,7 +1239,8 @@ public class Helper { counter++; Date now = new Date(); attachment.filename = formatter.format(now) + "." + extension; if (attachment.mimeType.startsWith("image")) { Set<String> imageType = new HashSet<>(Arrays.asList("image/png", "image/jpeg", "image/jpg")); if (imageType.contains(attachment.mimeType)) { final File certCacheDir = new File(context.getCacheDir(), TEMP_MEDIA_DIRECTORY); boolean isCertCacheDirExists = certCacheDir.exists(); if (!isCertCacheDirExists) { Loading app/src/main/java/app/fedilab/android/helper/TranslateHelper.java 0 → 100644 +91 −0 Original line number Diff line number Diff line package app.fedilab.android.helper; /* Copyright 2022 Thomas Schneider * * This file is a part of Fedilab * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.text.Html; import android.widget.Toast; import androidx.preference.PreferenceManager; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; import com.github.stom79.mytransl.translate.Params; import app.fedilab.android.R; import es.dmoral.toasty.Toasty; public class TranslateHelper { public static void translate(Context context, String toTranslate, Translate callback) { String statusToTranslate; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) statusToTranslate = Html.fromHtml(toTranslate, Html.FROM_HTML_MODE_LEGACY).toString(); else statusToTranslate = Html.fromHtml(toTranslate).toString(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); String translator = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR), "FEDILAB"); MyTransL.translatorEngine et; if (translator.compareToIgnoreCase("FEDILAB") == 0) { et = MyTransL.translatorEngine.LIBRETRANSLATE; } else { et = MyTransL.translatorEngine.DEEPL; } final MyTransL myTransL = MyTransL.getInstance(et); myTransL.setObfuscation(true); Params params = new Params(); params.setSplit_sentences(false); params.setFormat(Params.fType.TEXT); params.setSource_lang("auto"); if (translator.compareToIgnoreCase("FEDILAB") == 0) { myTransL.setLibretranslateDomain("translate.fedilab.app"); } else { String translatorVersion = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_VERSION), "PRO"); params.setPro(translatorVersion.equals("PRO")); String apikey = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_API_KEY), null); myTransL.setDeeplAPIKey(apikey.trim()); } String translate = sharedpreferences.getString(context.getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale()); if (translate.equalsIgnoreCase("default")) { translate = MyTransL.getLocale(); } myTransL.translate(statusToTranslate, translate, params, new Results() { @Override public void onSuccess(com.github.stom79.mytransl.translate.Translate translate) { if (translate.getTranslatedContent() != null) { callback.onTranslate(translate.getTranslatedContent()); } else { callback.onTranslate(""); Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } } @Override public void onFail(HttpsConnectionException httpsConnectionException) { callback.onTranslate(""); Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } }); } public interface Translate { void onTranslate(String translated); } } Loading
app/build.gradle +2 −2 Original line number Diff line number Diff line Loading @@ -13,8 +13,8 @@ android { defaultConfig { minSdk 21 targetSdk 33 versionCode 454 versionName "3.13.0" versionCode 455 versionName "3.13.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } flavorDimensions "default" Loading
app/src/main/assets/release_notes/notes.json +5 −0 Original line number Diff line number Diff line [ { "version": "3.13.1", "code": "455", "note": "Added:\n- DeepL translation support free/pro keys\n\nChanged:\n- Hide buttons for media when editing\n\nFixed:\n- GIF loaded as static images\n- Suggested accounts cannot be followed" }, { "version": "3.13.0", "code": "454", Loading
app/src/main/java/app/fedilab/android/activities/MediaActivity.java +17 −77 Original line number Diff line number Diff line Loading @@ -21,14 +21,12 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Point; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.text.Html; import android.view.Display; import android.view.Menu; import android.view.MenuItem; Loading @@ -44,15 +42,8 @@ import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.preference.PreferenceManager; import androidx.viewpager.widget.ViewPager; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; import com.github.stom79.mytransl.translate.Params; import com.github.stom79.mytransl.translate.Translate; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; Loading @@ -63,6 +54,7 @@ import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.databinding.ActivityMediaPagerBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MediaHelper; import app.fedilab.android.helper.TranslateHelper; import app.fedilab.android.interfaces.OnDownloadInterface; import app.fedilab.android.ui.fragment.media.FragmentMedia; import es.dmoral.toasty.Toasty; Loading Loading @@ -157,41 +149,15 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload binding.mediaDescription.setText(description); binding.translate.setOnClickListener(v -> { String descriptionToTranslate = attachments.get(mediaPosition - 1).description; MyTransL.translatorEngine et = MyTransL.translatorEngine.LIBRETRANSLATE; final MyTransL myTransL = MyTransL.getInstance(et); myTransL.setObfuscation(true); Params params = new Params(); params.setSplit_sentences(false); params.setFormat(Params.fType.TEXT); params.setSource_lang("auto"); myTransL.setLibretranslateDomain("translate.fedilab.app"); String statusToTranslate; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) statusToTranslate = Html.fromHtml(descriptionToTranslate, Html.FROM_HTML_MODE_LEGACY).toString(); else statusToTranslate = Html.fromHtml(descriptionToTranslate).toString(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(MediaActivity.this); String translate = sharedpreferences.getString(getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale()); if (translate != null && translate.equalsIgnoreCase("default")) { translate = MyTransL.getLocale(); } myTransL.translate(statusToTranslate, translate, params, new Results() { @Override public void onSuccess(Translate translate) { if (translate.getTranslatedContent() != null) { attachments.get(mediaPosition - 1).translation = translate.getTranslatedContent(); binding.mediaDescriptionTranslated.setText(translate.getTranslatedContent()); TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, translated -> { if (translated != null) { attachments.get(mediaPosition - 1).translation = translated; binding.mediaDescriptionTranslated.setText(translated); binding.mediaDescriptionTranslated.setVisibility(View.VISIBLE); binding.mediaDescription.setVisibility(View.GONE); } else { Toasty.error(MediaActivity.this, getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } } @Override public void onFail(HttpsConnectionException httpsConnectionException) { } }); }); if (attachments.get(mediaPosition - 1).translation != null) { Loading Loading @@ -222,41 +188,15 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload } binding.translate.setOnClickListener(v -> { String descriptionToTranslate = attachments.get(position).description; MyTransL.translatorEngine et = MyTransL.translatorEngine.LIBRETRANSLATE; final MyTransL myTransL = MyTransL.getInstance(et); myTransL.setObfuscation(true); Params params = new Params(); params.setSplit_sentences(false); params.setFormat(Params.fType.TEXT); params.setSource_lang("auto"); myTransL.setLibretranslateDomain("translate.fedilab.app"); String statusToTranslate; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) statusToTranslate = Html.fromHtml(descriptionToTranslate, Html.FROM_HTML_MODE_LEGACY).toString(); else statusToTranslate = Html.fromHtml(descriptionToTranslate).toString(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(MediaActivity.this); String translate = sharedpreferences.getString(getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale()); if (translate != null && translate.equalsIgnoreCase("default")) { translate = MyTransL.getLocale(); } myTransL.translate(statusToTranslate, translate, params, new Results() { @Override public void onSuccess(Translate translate) { if (translate.getTranslatedContent() != null) { attachments.get(position).translation = translate.getTranslatedContent(); binding.mediaDescriptionTranslated.setText(translate.getTranslatedContent()); TranslateHelper.translate(MediaActivity.this, descriptionToTranslate, translated -> { if (translated != null) { attachments.get(position).translation = translated; binding.mediaDescriptionTranslated.setText(translated); binding.mediaDescriptionTranslated.setVisibility(View.VISIBLE); binding.mediaDescription.setVisibility(View.GONE); } else { Toasty.error(MediaActivity.this, getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } } @Override public void onFail(HttpsConnectionException httpsConnectionException) { } }); }); if (!fullscreen) { Loading
app/src/main/java/app/fedilab/android/helper/Helper.java +5 −1 Original line number Diff line number Diff line Loading @@ -124,14 +124,17 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.TimeZone; import java.util.UUID; import java.util.regex.Matcher; Loading Loading @@ -1236,7 +1239,8 @@ public class Helper { counter++; Date now = new Date(); attachment.filename = formatter.format(now) + "." + extension; if (attachment.mimeType.startsWith("image")) { Set<String> imageType = new HashSet<>(Arrays.asList("image/png", "image/jpeg", "image/jpg")); if (imageType.contains(attachment.mimeType)) { final File certCacheDir = new File(context.getCacheDir(), TEMP_MEDIA_DIRECTORY); boolean isCertCacheDirExists = certCacheDir.exists(); if (!isCertCacheDirExists) { Loading
app/src/main/java/app/fedilab/android/helper/TranslateHelper.java 0 → 100644 +91 −0 Original line number Diff line number Diff line package app.fedilab.android.helper; /* Copyright 2022 Thomas Schneider * * This file is a part of Fedilab * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General * Public License for more details. * * You should have received a copy of the GNU General Public License along with Fedilab; if not, * see <http://www.gnu.org/licenses>. */ import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.text.Html; import android.widget.Toast; import androidx.preference.PreferenceManager; import com.github.stom79.mytransl.MyTransL; import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; import com.github.stom79.mytransl.translate.Params; import app.fedilab.android.R; import es.dmoral.toasty.Toasty; public class TranslateHelper { public static void translate(Context context, String toTranslate, Translate callback) { String statusToTranslate; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) statusToTranslate = Html.fromHtml(toTranslate, Html.FROM_HTML_MODE_LEGACY).toString(); else statusToTranslate = Html.fromHtml(toTranslate).toString(); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); String translator = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR), "FEDILAB"); MyTransL.translatorEngine et; if (translator.compareToIgnoreCase("FEDILAB") == 0) { et = MyTransL.translatorEngine.LIBRETRANSLATE; } else { et = MyTransL.translatorEngine.DEEPL; } final MyTransL myTransL = MyTransL.getInstance(et); myTransL.setObfuscation(true); Params params = new Params(); params.setSplit_sentences(false); params.setFormat(Params.fType.TEXT); params.setSource_lang("auto"); if (translator.compareToIgnoreCase("FEDILAB") == 0) { myTransL.setLibretranslateDomain("translate.fedilab.app"); } else { String translatorVersion = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_VERSION), "PRO"); params.setPro(translatorVersion.equals("PRO")); String apikey = sharedpreferences.getString(context.getString(R.string.SET_TRANSLATOR_API_KEY), null); myTransL.setDeeplAPIKey(apikey.trim()); } String translate = sharedpreferences.getString(context.getString(R.string.SET_LIVE_TRANSLATE), MyTransL.getLocale()); if (translate.equalsIgnoreCase("default")) { translate = MyTransL.getLocale(); } myTransL.translate(statusToTranslate, translate, params, new Results() { @Override public void onSuccess(com.github.stom79.mytransl.translate.Translate translate) { if (translate.getTranslatedContent() != null) { callback.onTranslate(translate.getTranslatedContent()); } else { callback.onTranslate(""); Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } } @Override public void onFail(HttpsConnectionException httpsConnectionException) { callback.onTranslate(""); Toasty.error(context, context.getString(R.string.toast_error_translate), Toast.LENGTH_LONG).show(); } }); } public interface Translate { void onTranslate(String translated); } }