From 18c3424ed3d3a4ed3ffefd2d38aa5e6596726d13 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 19 Jul 2022 18:18:03 +0200 Subject: [PATCH] Fix issue #244 - Add support for setting post language --- app/src/main/assets/languages/iso_639_1.json | 730 ++++++++++++++++++ .../android/activities/ComposeActivity.java | 44 +- .../client/entities/app/Languages.java | 62 ++ .../android/jobs/NotificationsWorker.java | 2 + .../android/jobs/ScheduleThreadWorker.java | 2 + .../android/services/PostMessageService.java | 7 +- .../services/ThreadMessageService.java | 3 +- .../res/drawable/ic_baseline_language_24.xml | 10 + app/src/main/res/menu/menu_compose.xml | 5 + app/src/main/res/values/strings.xml | 2 + 10 files changed, 864 insertions(+), 3 deletions(-) create mode 100644 app/src/main/assets/languages/iso_639_1.json create mode 100644 app/src/main/java/app/fedilab/android/client/entities/app/Languages.java create mode 100644 app/src/main/res/drawable/ic_baseline_language_24.xml diff --git a/app/src/main/assets/languages/iso_639_1.json b/app/src/main/assets/languages/iso_639_1.json new file mode 100644 index 00000000..00199b74 --- /dev/null +++ b/app/src/main/assets/languages/iso_639_1.json @@ -0,0 +1,730 @@ +[ + { + "code": "aa", + "language": "Afaraf" + }, + { + "code": "ab", + "language": "аҧсуа бызшәа" + }, + { + "code": "ae", + "language": "avesta" + }, + { + "code": "af", + "language": "Afrikaans" + }, + { + "code": "ak", + "language": "Akan" + }, + { + "code": "am", + "language": "አማርኛ" + }, + { + "code": "an", + "language": "aragonés" + }, + { + "code": "ar", + "language": "اللغة العربية" + }, + { + "code": "as", + "language": "অসমীয়া" + }, + { + "code": "av", + "language": "авар мацӀ" + }, + { + "code": "ay", + "language": "aymar aru" + }, + { + "code": "az", + "language": "azərbaycan dili" + }, + { + "code": "ba", + "language": "башҡорт теле" + }, + { + "code": "be", + "language": "беларуская мова" + }, + { + "code": "bg", + "language": "български език" + }, + { + "code": "bh", + "language": "भोजपुरी" + }, + { + "code": "bi", + "language": "Bislama" + }, + { + "code": "bm", + "language": "bamanankan" + }, + { + "code": "bn", + "language": "বাংলা" + }, + { + "code": "bo", + "language": "བོད་ཡིག" + }, + { + "code": "br", + "language": "brezhoneg" + }, + { + "code": "bs", + "language": "bosanski jezik" + }, + { + "code": "ca", + "language": "Català" + }, + { + "code": "ce", + "language": "нохчийн мотт" + }, + { + "code": "ch", + "language": "Chamoru" + }, + { + "code": "co", + "language": "corsu" + }, + { + "code": "cr", + "language": "ᓀᐦᐃᔭᐍᐏᐣ" + }, + { + "code": "cs", + "language": "čeština" + }, + { + "code": "cu", + "language": "ѩзыкъ словѣньскъ" + }, + { + "code": "cv", + "language": "чӑваш чӗлхи" + }, + { + "code": "cy", + "language": "Cymraeg" + }, + { + "code": "da", + "language": "dansk" + }, + { + "code": "de", + "language": "Deutsch" + }, + { + "code": "dv", + "language": "Dhivehi" + }, + { + "code": "dz", + "language": "རྫོང་ཁ" + }, + { + "code": "ee", + "language": "Eʋegbe" + }, + { + "code": "el", + "language": "Ελληνικά" + }, + { + "code": "en", + "language": "English" + }, + { + "code": "eo", + "language": "Esperanto" + }, + { + "code": "es", + "language": "Español" + }, + { + "code": "et", + "language": "eesti" + }, + { + "code": "eu", + "language": "euskara" + }, + { + "code": "fa", + "language": "فارسی" + }, + { + "code": "ff", + "language": "Fulfulde" + }, + { + "code": "fi", + "language": "suomi" + }, + { + "code": "fj", + "language": "Vakaviti" + }, + { + "code": "fo", + "language": "føroyskt" + }, + { + "code": "fr", + "language": "Français" + }, + { + "code": "fy", + "language": "Frysk" + }, + { + "code": "ga", + "language": "Gaeilge" + }, + { + "code": "gd", + "language": "Gàidhlig" + }, + { + "code": "gl", + "language": "galego" + }, + { + "code": "gu", + "language": "ગુજરાતી" + }, + { + "code": "gv", + "language": "Gaelg" + }, + { + "code": "ha", + "language": "هَوُسَ" + }, + { + "code": "he", + "language": "עברית" + }, + { + "code": "hi", + "language": "हिन्दी" + }, + { + "code": "ho", + "language": "Hiri Motu" + }, + { + "code": "hr", + "language": "Hrvatski" + }, + { + "code": "ht", + "language": "Kreyòl ayisyen" + }, + { + "code": "hu", + "language": "magyar" + }, + { + "code": "hy", + "language": "Հայերեն" + }, + { + "code": "hz", + "language": "Otjiherero" + }, + { + "code": "ia", + "language": "Interlingua" + }, + { + "code": "id", + "language": "Bahasa Indonesia" + }, + { + "code": "ie", + "language": "Interlingue" + }, + { + "code": "ig", + "language": "Asụsụ Igbo" + }, + { + "code": "ii", + "language": "ꆈꌠ꒿ Nuosuhxop" + }, + { + "code": "ik", + "language": "Iñupiaq" + }, + { + "code": "io", + "language": "Ido" + }, + { + "code": "is", + "language": "Íslenska" + }, + { + "code": "it", + "language": "Italiano" + }, + { + "code": "iu", + "language": "ᐃᓄᒃᑎᑐᑦ" + }, + { + "code": "ja", + "language": "日本語" + }, + { + "code": "jv", + "language": "basa Jawa" + }, + { + "code": "ka", + "language": "ქართული" + }, + { + "code": "kg", + "language": "Kikongo" + }, + { + "code": "ki", + "language": "Gĩkũyũ" + }, + { + "code": "kj", + "language": "Kuanyama" + }, + { + "code": "kk", + "language": "қазақ тілі" + }, + { + "code": "kl", + "language": "kalaallisut" + }, + { + "code": "km", + "language": "ខេមរភាសា" + }, + { + "code": "kn", + "language": "ಕನ್ನಡ" + }, + { + "code": "ko", + "language": "한국어" + }, + { + "code": "kr", + "language": "Kanuri" + }, + { + "code": "ks", + "language": "कश्मीरी" + }, + { + "code": "ku", + "language": "Kurmancî" + }, + { + "code": "kv", + "language": "коми кыв" + }, + { + "code": "kw", + "language": "Kernewek" + }, + { + "code": "ky", + "language": "Кыргызча" + }, + { + "code": "la", + "language": "latine" + }, + { + "code": "lb", + "language": "Lëtzebuergesch" + }, + { + "code": "lg", + "language": "Luganda" + }, + { + "code": "li", + "language": "Limburgs" + }, + { + "code": "ln", + "language": "Lingála" + }, + { + "code": "lo", + "language": "ພາສາ" + }, + { + "code": "lt", + "language": "lietuvių kalba" + }, + { + "code": "lu", + "language": "Tshiluba" + }, + { + "code": "lv", + "language": "latviešu valoda" + }, + { + "code": "mg", + "language": "fiteny malagasy" + }, + { + "code": "mh", + "language": "Kajin M̧ajeļ" + }, + { + "code": "mi", + "language": "te reo Māori" + }, + { + "code": "mk", + "language": "македонски јазик" + }, + { + "code": "ml", + "language": "മലയാളം" + }, + { + "code": "mn", + "language": "Монгол хэл" + }, + { + "code": "mr", + "language": "मराठी" + }, + { + "code": "ms", + "language": "Bahasa Melayu" + }, + { + "code": "mt", + "language": "Malti" + }, + { + "code": "my", + "language": "ဗမာစာ" + }, + { + "code": "na", + "language": "Ekakairũ Naoero" + }, + { + "code": "nb", + "language": "Norsk bokmål" + }, + { + "code": "nd", + "language": "isiNdebele" + }, + { + "code": "ne", + "language": "नेपाली" + }, + { + "code": "ng", + "language": "Owambo" + }, + { + "code": "nl", + "language": "Nederlands" + }, + { + "code": "nn", + "language": "Norsk Nynorsk" + }, + { + "code": "no", + "language": "Norsk" + }, + { + "code": "nr", + "language": "isiNdebele" + }, + { + "code": "nv", + "language": "Diné bizaad" + }, + { + "code": "ny", + "language": "chiCheŵa" + }, + { + "code": "oc", + "language": "occitan" + }, + { + "code": "oj", + "language": "ᐊᓂᔑᓈᐯᒧᐎᓐ" + }, + { + "code": "om", + "language": "Afaan Oromoo" + }, + { + "code": "or", + "language": "ଓଡ଼ିଆ" + }, + { + "code": "os", + "language": "ирон æвзаг" + }, + { + "code": "pa", + "language": "ਪੰਜਾਬੀ" + }, + { + "code": "pi", + "language": "पाऴि" + }, + { + "code": "pl", + "language": "Polski" + }, + { + "code": "ps", + "language": "پښتو" + }, + { + "code": "pt", + "language": "Português" + }, + { + "code": "qu", + "language": "Runa Simi" + }, + { + "code": "rm", + "language": "rumantsch grischun" + }, + { + "code": "rn", + "language": "Ikirundi" + }, + { + "code": "ro", + "language": "Română" + }, + { + "code": "ru", + "language": "Русский" + }, + { + "code": "rw", + "language": "Ikinyarwanda" + }, + { + "code": "sa", + "language": "संस्कृतम्" + }, + { + "code": "sc", + "language": "sardu" + }, + { + "code": "sd", + "language": "सिन्धी" + }, + { + "code": "se", + "language": "Davvisámegiella" + }, + { + "code": "sg", + "language": "yângâ tî sängö" + }, + { + "code": "si", + "language": "සිංහල" + }, + { + "code": "sk", + "language": "slovenčina" + }, + { + "code": "sl", + "language": "slovenščina" + }, + { + "code": "sn", + "language": "chiShona" + }, + { + "code": "so", + "language": "Soomaaliga" + }, + { + "code": "sq", + "language": "Shqip" + }, + { + "code": "sr", + "language": "српски језик" + }, + { + "code": "ss", + "language": "SiSwati" + }, + { + "code": "st", + "language": "Sesotho" + }, + { + "code": "su", + "language": "Basa Sunda" + }, + { + "code": "sv", + "language": "Svenska" + }, + { + "code": "sw", + "language": "Kiswahili" + }, + { + "code": "ta", + "language": "தமிழ்" + }, + { + "code": "te", + "language": "తెలుగు" + }, + { + "code": "tg", + "language": "тоҷикӣ" + }, + { + "code": "th", + "language": "ไทย" + }, + { + "code": "ti", + "language": "ትግርኛ" + }, + { + "code": "tk", + "language": "Türkmen" + }, + { + "code": "tl", + "language": "Wikang Tagalog" + }, + { + "code": "tn", + "language": "Setswana" + }, + { + "code": "to", + "language": "faka Tonga" + }, + { + "code": "tr", + "language": "Türkçe" + }, + { + "code": "ts", + "language": "Xitsonga" + }, + { + "code": "tt", + "language": "татар теле" + }, + { + "code": "tw", + "language": "Twi" + }, + { + "code": "ty", + "language": "Reo Tahiti" + }, + { + "code": "ug", + "language": "ئۇيغۇرچە‎" + }, + { + "code": "uk", + "language": "Українська" + }, + { + "code": "ur", + "language": "اردو" + }, + { + "code": "uz", + "language": "Ўзбек" + }, + { + "code": "ve", + "language": "Tshivenḓa" + }, + { + "code": "vi", + "language": "Tiếng Việt" + }, + { + "code": "vo", + "language": "Volapük" + }, + { + "code": "wa", + "language": "walon" + }, + { + "code": "wo", + "language": "Wollof" + }, + { + "code": "xh", + "language": "isiXhosa" + }, + { + "code": "yi", + "language": "ייִדיש" + }, + { + "code": "yo", + "language": "Yorùbá" + }, + { + "code": "za", + "language": "Saɯ cueŋƅ" + }, + { + "code": "zh", + "language": "中文" + }, + { + "code": "zu", + "language": "isiZulu" + } +] \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java b/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java index 36143c30..5df7503a 100644 --- a/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ComposeActivity.java @@ -76,6 +76,7 @@ import app.fedilab.android.client.entities.api.Mention; import app.fedilab.android.client.entities.api.ScheduledStatus; import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.client.entities.app.BaseAccount; +import app.fedilab.android.client.entities.app.Languages; import app.fedilab.android.client.entities.app.StatusDraft; import app.fedilab.android.databinding.ActivityPaginationBinding; import app.fedilab.android.databinding.PopupContactBinding; @@ -577,6 +578,46 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana } else { Toasty.info(ComposeActivity.this, getString(R.string.toot_error_no_content), Toasty.LENGTH_SHORT).show(); } + } else if (item.getItemId() == R.id.action_language) { + final SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(ComposeActivity.this); + List languages = Languages.get(ComposeActivity.this); + String[] codesArr = new String[0]; + String[] languagesArr = new String[0]; + + String currentCode = sharedpreferences.getString(getString(R.string.SET_COMPOSE_LANGUAGE) + account.user_id + account.instance, null); + int selection = 0; + + if (languages != null) { + codesArr = new String[languages.size()]; + languagesArr = new String[languages.size()]; + int i = 0; + for (Languages.Language language : languages) { + codesArr[i] = language.code; + languagesArr[i] = language.language; + if (currentCode != null && currentCode.equalsIgnoreCase(language.code)) { + selection = i; + } + i++; + } + } + SharedPreferences.Editor editor = sharedpreferences.edit(); + AlertDialog.Builder builder = new AlertDialog.Builder(ComposeActivity.this, Helper.dialogStyle()); + builder.setTitle(getString(R.string.message_language)); + + builder.setSingleChoiceItems(languagesArr, selection, null); + String[] finalCodesArr = codesArr; + builder.setPositiveButton(R.string.validate, (dialog, which) -> { + int selectedPosition = ((AlertDialog) dialog).getListView().getCheckedItemPosition(); + editor.putString(getString(R.string.SET_COMPOSE_LANGUAGE) + account.user_id + account.instance, finalCodesArr[selectedPosition]); + editor.apply(); + dialog.dismiss(); + }); + builder.setNegativeButton(R.string.reset, (dialog, which) -> { + editor.putString(getString(R.string.SET_COMPOSE_LANGUAGE) + account.user_id + account.instance, null); + editor.apply(); + dialog.dismiss(); + }); + builder.create().show(); } return true; } @@ -751,6 +792,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft); intent.putExtra(Helper.ARG_INSTANCE, instance); intent.putExtra(Helper.ARG_TOKEN, token); + intent.putExtra(Helper.ARG_USER_ID, account.user_id); intent.putExtra(Helper.ARG_SCHEDULED_DATE, scheduledDate); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(intent); @@ -758,7 +800,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana startService(intent); } } else { - new ThreadMessageService(ComposeActivity.this, instance, token, statusDraft, scheduledDate); + new ThreadMessageService(ComposeActivity.this, instance, account.user_id, token, statusDraft, scheduledDate); } finish(); } diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/Languages.java b/app/src/main/java/app/fedilab/android/client/entities/app/Languages.java new file mode 100644 index 00000000..23445a9a --- /dev/null +++ b/app/src/main/java/app/fedilab/android/client/entities/app/Languages.java @@ -0,0 +1,62 @@ +package app.fedilab.android.client.entities.app; +/* 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 . */ + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.nio.charset.StandardCharsets; +import java.util.List; + + +public class Languages implements Serializable { + + @SerializedName("languages") + public List languages; + + public static List get(AppCompatActivity activity) { + try { + InputStream is = activity.getAssets().open("languages/iso_639_1.json"); + int size = is.available(); + byte[] buffer = new byte[size]; + is.read(buffer); + is.close(); + String json = new String(buffer, StandardCharsets.UTF_8); + Gson gson = new Gson(); + try { + return gson.fromJson(json, new TypeToken>() { + }.getType()); + } catch (Exception e) { + return null; + } + } catch (IOException ex) { + ex.printStackTrace(); + return null; + } + } + + public static class Language implements Serializable { + @SerializedName("code") + public String code; + @SerializedName("language") + public String language; + } +} diff --git a/app/src/main/java/app/fedilab/android/jobs/NotificationsWorker.java b/app/src/main/java/app/fedilab/android/jobs/NotificationsWorker.java index 62094117..c9566e9c 100644 --- a/app/src/main/java/app/fedilab/android/jobs/NotificationsWorker.java +++ b/app/src/main/java/app/fedilab/android/jobs/NotificationsWorker.java @@ -75,6 +75,7 @@ public class NotificationsWorker extends Worker { String instance = getInputData().getString(Helper.ARG_INSTANCE); String token = getInputData().getString(Helper.ARG_TOKEN); String statusDraftId = getInputData().getString(Helper.ARG_STATUS_DRAFT_ID); + String userId = getInputData().getString(Helper.ARG_USER_ID); StatusDraft statusDraft; try { statusDraft = new StatusDraft(getApplicationContext()).geStatusDraft(statusDraftId); @@ -82,6 +83,7 @@ public class NotificationsWorker extends Worker { intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft); intent.putExtra(Helper.ARG_INSTANCE, instance); intent.putExtra(Helper.ARG_TOKEN, token); + intent.putExtra(Helper.ARG_USER_ID, userId); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { getApplicationContext().startForegroundService(intent); } else { diff --git a/app/src/main/java/app/fedilab/android/jobs/ScheduleThreadWorker.java b/app/src/main/java/app/fedilab/android/jobs/ScheduleThreadWorker.java index 5f127590..5a6da3ba 100644 --- a/app/src/main/java/app/fedilab/android/jobs/ScheduleThreadWorker.java +++ b/app/src/main/java/app/fedilab/android/jobs/ScheduleThreadWorker.java @@ -74,6 +74,7 @@ public class ScheduleThreadWorker extends Worker { Data outputData; String instance = getInputData().getString(Helper.ARG_INSTANCE); String token = getInputData().getString(Helper.ARG_TOKEN); + String userId = getInputData().getString(Helper.ARG_USER_ID); String statusDraftId = getInputData().getString(Helper.ARG_STATUS_DRAFT_ID); StatusDraft statusDraft; try { @@ -82,6 +83,7 @@ public class ScheduleThreadWorker extends Worker { intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft); intent.putExtra(Helper.ARG_INSTANCE, instance); intent.putExtra(Helper.ARG_TOKEN, token); + intent.putExtra(Helper.ARG_USER_ID, userId); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { getApplicationContext().startForegroundService(intent); } else { diff --git a/app/src/main/java/app/fedilab/android/services/PostMessageService.java b/app/src/main/java/app/fedilab/android/services/PostMessageService.java index a4a73ab2..f622a3ae 100644 --- a/app/src/main/java/app/fedilab/android/services/PostMessageService.java +++ b/app/src/main/java/app/fedilab/android/services/PostMessageService.java @@ -202,9 +202,10 @@ public class PostMessageService extends IntentService { if (error) { return; } + String language = sharedPreferences.getString(context.getString(R.string.SET_COMPOSE_LANGUAGE) + dataPost.userId + dataPost.instance, null); if (dataPost.scheduledDate == null) { statusCall = mastodonStatusesService.createStatus(null, dataPost.token, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in, - poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoiler_text, statuses.get(i).visibility.toLowerCase(), statuses.get(i).language); + poll_multiple, poll_hide_totals, in_reply_to_status, statuses.get(i).sensitive, statuses.get(i).spoiler_text, statuses.get(i).visibility.toLowerCase(), language); try { Response statusResponse = statusCall.execute(); if (statusResponse.isSuccessful()) { @@ -339,11 +340,13 @@ public class PostMessageService extends IntentService { StatusDraft statusDraft = null; String token = null, instance = null; String scheduledDate = null; + String userId = null; if (intent != null && intent.getExtras() != null) { Bundle b = intent.getExtras(); statusDraft = (StatusDraft) b.getSerializable(Helper.ARG_STATUS_DRAFT); token = b.getString(Helper.ARG_TOKEN); instance = b.getString(Helper.ARG_INSTANCE); + userId = b.getString(Helper.ARG_USER_ID); scheduledDate = b.getString(Helper.ARG_SCHEDULED_DATE); } //Should not be null, but a simple security @@ -356,6 +359,7 @@ public class PostMessageService extends IntentService { DataPost dataPost = new DataPost(); dataPost.instance = instance; dataPost.token = token; + dataPost.userId = userId; dataPost.statusDraft = statusDraft; dataPost.scheduledDate = scheduledDate; dataPost.notificationBuilder = notificationBuilder; @@ -367,6 +371,7 @@ public class PostMessageService extends IntentService { static class DataPost { String instance; String token; + String userId; StatusDraft statusDraft; int messageToSend; int messageSent; diff --git a/app/src/main/java/app/fedilab/android/services/ThreadMessageService.java b/app/src/main/java/app/fedilab/android/services/ThreadMessageService.java index aba6d977..a6fa0596 100644 --- a/app/src/main/java/app/fedilab/android/services/ThreadMessageService.java +++ b/app/src/main/java/app/fedilab/android/services/ThreadMessageService.java @@ -22,9 +22,10 @@ import app.fedilab.android.client.entities.app.StatusDraft; public class ThreadMessageService { - public ThreadMessageService(Context context, String instance, String token, StatusDraft statusDraft, String scheduledDate) { + public ThreadMessageService(Context context, String instance, String userId, String token, StatusDraft statusDraft, String scheduledDate) { PostMessageService.DataPost dataPost = new PostMessageService.DataPost(); dataPost.instance = instance; + dataPost.userId = userId; dataPost.token = token; dataPost.scheduledDate = scheduledDate; dataPost.statusDraft = statusDraft; diff --git a/app/src/main/res/drawable/ic_baseline_language_24.xml b/app/src/main/res/drawable/ic_baseline_language_24.xml new file mode 100644 index 00000000..b0fd1af3 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_language_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/menu_compose.xml b/app/src/main/res/menu/menu_compose.xml index 8fc21461..88ed2086 100644 --- a/app/src/main/res/menu/menu_compose.xml +++ b/app/src/main/res/menu/menu_compose.xml @@ -11,6 +11,11 @@ android:icon="@drawable/ic_baseline_contact_page_24" android:title="@string/contact" app:showAsAction="ifRoom" /> + SET_TIME_FROM SET_TIME_TO SET_MED_DESC_TIMEOUT + SET_COMPOSE_LANGUAGE SET_NOTIF_FOLLOW @@ -980,6 +981,7 @@ Clear cache Are you sure you want to delete cache? If you have drafts with media, the attached media will be lost. Use the default system language + Language for messages