diff --git a/app/src/main/java/eu/faircode/email/DeepL.java b/app/src/main/java/eu/faircode/email/DeepL.java index 8bb2f8297b..4de3217a7e 100644 --- a/app/src/main/java/eu/faircode/email/DeepL.java +++ b/app/src/main/java/eu/faircode/email/DeepL.java @@ -21,7 +21,6 @@ package eu.faircode.email; import android.content.Context; import android.content.SharedPreferences; -import android.util.Pair; import androidx.preference.PreferenceManager; @@ -54,14 +53,15 @@ public class DeepL { // -d auth_key=42c191db-21ba-9b96-2464-47a9a5e81b4a:fx \ // -d type=target - public static List> getTargetLanguages(Context context) { + public static List getTargetLanguages(Context context) { try (InputStream is = context.getAssets().open("deepl.json")) { String json = Helper.readStream(is); JSONArray jarray = new JSONArray(json); + String pkg = context.getPackageName(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - List> languages = new ArrayList<>(); + List languages = new ArrayList<>(); Map frequencies = new HashMap<>(); for (int i = 0; i < jarray.length(); i++) { JSONObject jlanguage = jarray.getJSONObject(i); @@ -76,20 +76,23 @@ public class DeepL { if (BuildConfig.DEBUG && frequency > 0) name += " ★"; - languages.add(new Pair<>(name, target)); + String resname = "language_" + target.toLowerCase().replace('-', '_'); + int resid = context.getResources().getIdentifier(resname, "drawable", pkg); + + languages.add(new Language(name, target, resid == 0 ? null : resid)); frequencies.put(target, frequency); } Collator collator = Collator.getInstance(Locale.getDefault()); collator.setStrength(Collator.SECONDARY); // Case insensitive, process accents etc - Collections.sort(languages, new Comparator>() { + Collections.sort(languages, new Comparator() { @Override - public int compare(Pair l1, Pair l2) { - int freq1 = frequencies.get(l1.second); - int freq2 = frequencies.get(l2.second); + public int compare(Language l1, Language l2) { + int freq1 = frequencies.get(l1.target); + int freq2 = frequencies.get(l2.target); if (freq1 == freq2) - return collator.compare(l1.first, l2.first); + return collator.compare(l1.name, l2.name); else return -Integer.compare(freq1, freq2); } @@ -190,4 +193,16 @@ public class DeepL { String domain = prefs.getString("deepl_domain", "api-free.deepl.com"); return "https://" + domain + "/v2/"; } + + public static class Language { + public String name; + public String target; + public Integer icon; + + private Language(String name, String target, Integer icon) { + this.name = name; + this.target = target; + this.icon = icon; + } + } } diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 36e8c05159..0bed463882 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -704,21 +704,18 @@ public class FragmentCompose extends FragmentBase { if (getParagraph() == null) return; + List languages = DeepL.getTargetLanguages(getContext()); + if (languages == null) + return; + PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(getContext(), getViewLifecycleOwner(), v); - List> languages = DeepL.getTargetLanguages(getContext()); - if (languages != null) { - String pkg = getContext().getPackageName(); - for (int i = 0; i < languages.size(); i++) { - Pair lang = languages.get(i); - MenuItem item = popupMenu.getMenu().add(R.id.group_translate, i + 1, i + 1, lang.first) - .setIntent(new Intent().putExtra("target", lang.second)); - - String resname = "language_" + lang.second.toLowerCase().replace('-', '_'); - int resid = getResources().getIdentifier(resname, "drawable", pkg); - if (resid > 0) - item.setIcon(resid); - } + for (int i = 0; i < languages.size(); i++) { + DeepL.Language lang = languages.get(i); + MenuItem item = popupMenu.getMenu().add(R.id.group_translate, i + 1, i + 1, lang.name) + .setIntent(new Intent().putExtra("target", lang.target)); + if (lang.icon != null) + item.setIcon(lang.icon); } popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @@ -1478,19 +1475,15 @@ public class FragmentCompose extends FragmentBase { } }); - List> languages = DeepL.getTargetLanguages(getContext()); + List languages = DeepL.getTargetLanguages(getContext()); if (languages != null) { - String pkg = getContext().getPackageName(); + SubMenu smenu = menu.findItem(R.id.menu_translate).getSubMenu(); for (int i = 0; i < languages.size(); i++) { - Pair lang = languages.get(i); - SubMenu smenu = menu.findItem(R.id.menu_translate).getSubMenu(); - MenuItem item = smenu.add(R.id.group_translate, i + 1, i + 1, lang.first) - .setIntent(new Intent().putExtra("target", lang.second)); - - String resname = "language_" + lang.second.toLowerCase().replace('-', '_'); - int resid = getResources().getIdentifier(resname, "drawable", pkg); - if (resid > 0) - item.setIcon(resid); + DeepL.Language lang = languages.get(i); + MenuItem item = smenu.add(R.id.group_translate, i + 1, i + 1, lang.name) + .setIntent(new Intent().putExtra("target", lang.target)); + if (lang.icon != null) + item.setIcon(lang.icon); } }