From 4baa0f66a0f4c452d0cde5169b1fb547541f80a0 Mon Sep 17 00:00:00 2001 From: DrKLO Date: Sat, 4 Oct 2014 19:56:09 +0400 Subject: [PATCH] added Android Wear support --- TMessagesProj/build.gradle | 4 +- TMessagesProj/src/main/AndroidManifest.xml | 2 + .../telegram/android/ContactsController.java | 12 +- .../telegram/android/LocaleController.java | 61 ++++++---- .../telegram/android/MessagesController.java | 2 +- .../android/NotificationsController.java | 115 +++++++++++++++++- .../telegram/android/WearReplyReceiver.java | 37 ++++++ .../org/telegram/ui/Cells/ChatMediaCell.java | 1 + .../java/org/telegram/ui/ChatActivity.java | 2 + .../org/telegram/ui/ContactsActivity.java | 1 - .../java/org/telegram/ui/LaunchActivity.java | 1 + .../org/telegram/ui/MessagesActivity.java | 8 +- .../main/res/drawable-hdpi/ic_reply_icon.png | Bin 0 -> 1486 bytes .../main/res/drawable-mdpi/ic_reply_icon.png | Bin 0 -> 991 bytes .../main/res/drawable-xhdpi/ic_reply_icon.png | Bin 0 -> 679 bytes .../src/main/res/values-ar/strings.xml | 10 ++ .../src/main/res/values-de/strings.xml | 10 ++ .../src/main/res/values-es/strings.xml | 10 ++ .../src/main/res/values-it/strings.xml | 10 ++ .../src/main/res/values-nl/strings.xml | 10 ++ .../src/main/res/values-pt-rBR/strings.xml | 10 ++ .../src/main/res/values-pt-rPT/strings.xml | 10 ++ TMessagesProj/src/main/res/values/strings.xml | 10 ++ 23 files changed, 283 insertions(+), 43 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/ic_reply_icon.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/ic_reply_icon.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/ic_reply_icon.png diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 7998b5637..3458dd885 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -80,7 +80,7 @@ android { defaultConfig { minSdkVersion 8 targetSdkVersion 19 - versionCode 344 - versionName "1.9.2" + versionCode 345 + versionName "1.9.3" } } diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index f7bfaaa0c..b6a7aa8a3 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -147,6 +147,8 @@ + + diff --git a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java index 6278d4e5d..59ef6766d 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/ContactsController.java @@ -17,7 +17,6 @@ import android.database.Cursor; import android.net.Uri; import android.provider.BaseColumns; import android.provider.ContactsContract; -import android.provider.Settings; import android.util.SparseArray; import org.telegram.PhoneFormat.PhoneFormat; @@ -49,7 +48,6 @@ public class ContactsController { private boolean contactsBookLoaded = false; private String lastContactsVersions = ""; private ArrayList delayedContactsUpdate = new ArrayList(); - public int nameDisplayOrder = 1; public static class Contact { public int id; @@ -101,14 +99,6 @@ public class ContactsController { return localInstance; } - public ContactsController() { - try { - nameDisplayOrder = Settings.System.getInt(ApplicationLoader.applicationContext.getContentResolver(), "android.contacts.DISPLAY_ORDER"); - } catch (Exception e) { - //don't promt - } - } - public void cleanup() { contactsBook.clear(); contactsBookSPhones.clear(); @@ -1576,7 +1566,7 @@ public class ContactsController { public static String formatName(String firstName, String lastName) { String result = null; - if (ContactsController.getInstance().nameDisplayOrder == 1) { + if (LocaleController.nameDisplayOrder == 1) { result = firstName; if (result == null || result.length() == 0) { result = lastName; diff --git a/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java b/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java index c582bc0e4..febbab75d 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/LocaleController.java @@ -47,6 +47,7 @@ public class LocaleController { static final int QUANTITY_MANY = 0x0010; public static boolean isRTL = false; + public static int nameDisplayOrder = 1; private static boolean is24HourFormat = false; public static FastDateFormat formatterDay; public static FastDateFormat formatterWeek; @@ -74,7 +75,7 @@ public class LocaleController { @Override public void run() { if (!formatterMonth.getTimeZone().equals(TimeZone.getDefault())) { - LocaleController.recreateFormatters(); + LocaleController.getInstance().recreateFormatters(); } } }); @@ -541,14 +542,18 @@ public class LocaleController { return getString("LanguageName", R.string.LanguageName); } - public static String getString(String key, int res) { - String value = getInstance().localeValues.get(key); + private String getStringInternal(String key, int res) { + String value = localeValues.get(key); if (value == null) { value = ApplicationLoader.applicationContext.getString(res); } return value; } + public static String getString(String key, int res) { + return getInstance().getStringInternal(key, res); + } + public static String formatPluralString(String key, int plural) { if (key == null || key.length() == 0 || getInstance().currentPluralRules == null) { return "LOC_ERR:" + key; @@ -664,32 +669,44 @@ public class LocaleController { } } - public static void recreateFormatters() { + public void recreateFormatters() { Locale locale = Locale.getDefault(); String lang = locale.getLanguage(); if (lang == null) { lang = "en"; } isRTL = lang.toLowerCase().equals("ar"); - if (lang.equals("en")) { - formatterMonth = FastDateFormat.getInstance("MMM dd", locale); - formatterYear = FastDateFormat.getInstance("dd.MM.yy", locale); - formatterYearMax = FastDateFormat.getInstance("dd.MM.yyyy", locale); - chatDate = FastDateFormat.getInstance("MMMM d", locale); - chatFullDate = FastDateFormat.getInstance("MMMM d, yyyy", locale); - } else if (lang.startsWith("es")) { - formatterMonth = FastDateFormat.getInstance("dd 'de' MMM", locale); - formatterYear = FastDateFormat.getInstance("dd.MM.yy", locale); - formatterYearMax = FastDateFormat.getInstance("dd.MM.yyyy", locale); - chatDate = FastDateFormat.getInstance("d 'de' MMMM", locale); - chatFullDate = FastDateFormat.getInstance("d 'de' MMMM 'de' yyyy", locale); - } else { - formatterMonth = FastDateFormat.getInstance("dd MMM", locale); - formatterYear = FastDateFormat.getInstance("dd.MM.yy", locale); - formatterYearMax = FastDateFormat.getInstance("dd.MM.yyyy", locale); - chatDate = FastDateFormat.getInstance("d MMMM", locale); - chatFullDate = FastDateFormat.getInstance("d MMMM yyyy", locale); + nameDisplayOrder = lang.toLowerCase().equals("ko") ? 2 : 1; + String formatString = getStringInternal("formatterMonth", R.string.formatterMonth); + if (formatString == null || formatString.length() == 0) { + formatString = "dd MMM"; } + formatterMonth = FastDateFormat.getInstance(formatString, locale); + + formatString = getStringInternal("formatterYear", R.string.formatterYear); + if (formatString == null || formatString.length() == 0) { + formatString = "dd.MM.yy"; + } + formatterYear = FastDateFormat.getInstance(formatString, locale); + + formatString = getStringInternal("formatterYearMax", R.string.formatterYearMax); + if (formatString == null || formatString.length() == 0) { + formatString = "dd.MM.yyyy"; + } + formatterYearMax = FastDateFormat.getInstance(formatString, locale); + + formatString = getStringInternal("chatDate", R.string.chatDate); + if (formatString == null || formatString.length() == 0) { + formatString = "d MMMM"; + } + chatDate = FastDateFormat.getInstance(formatString, locale); + + formatString = getStringInternal("chatFullDate", R.string.chatFullDate); + if (formatString == null || formatString.length() == 0) { + formatString = "d MMMM yyyy"; + } + chatFullDate = FastDateFormat.getInstance(formatString, locale); + formatterWeek = FastDateFormat.getInstance("EEE", locale); if (lang != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java index 5a3951682..d48d7b700 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/MessagesController.java @@ -1648,7 +1648,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter int high_id = (int)(dialog_id >> 32); if (lower_part != 0) { - if (max_id == 0 && offset == 0 || high_id == 1) { + if (max_positive_id == 0 && offset == 0 || high_id == 1) { return; } TLRPC.TL_messages_readHistory req = new TLRPC.TL_messages_readHistory(); diff --git a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java index cc3327a4f..9bcfcf38c 100644 --- a/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java +++ b/TMessagesProj/src/main/java/org/telegram/android/NotificationsController.java @@ -18,10 +18,12 @@ import android.content.pm.ResolveInfo; import android.graphics.drawable.BitmapDrawable; import android.media.AudioManager; import android.net.Uri; +import android.os.Build; import android.os.SystemClock; import android.provider.Settings; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; +import android.support.v4.app.RemoteInput; import org.json.JSONArray; import org.json.JSONObject; @@ -47,6 +49,8 @@ public class NotificationsController { private HashMap pushMessagesDict = new HashMap(); private NotificationManagerCompat notificationManager = null; private HashMap pushDialogs = new HashMap(); + private HashMap wearNoticationsIds = new HashMap(); + private int wearNotificationId = 10000; public ArrayList popupMessages = new ArrayList(); private long openned_dialog_id = 0; private int total_unread_count = 0; @@ -79,6 +83,7 @@ public class NotificationsController { pushMessagesDict.clear(); pushDialogs.clear(); popupMessages.clear(); + wearNoticationsIds.clear(); notifyCheck = false; SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); @@ -261,6 +266,7 @@ public class NotificationsController { MessageObject lastMessageObject = pushMessages.get(0); long dialog_id = lastMessageObject.getDialogId(); + int mid = lastMessageObject.messageOwner.id; int chat_id = lastMessageObject.messageOwner.to_id.chat_id; int user_id = lastMessageObject.messageOwner.to_id.user_id; if (user_id == 0) { @@ -387,7 +393,9 @@ public class NotificationsController { .setSmallIcon(R.drawable.notification) .setAutoCancel(true) .setNumber(total_unread_count) - .setContentIntent(contentIntent); + .setContentIntent(contentIntent) + .setGroup("messages") + .setGroupSummary(true); String lastMessage = null; String lastMessageFull = null; @@ -479,18 +487,119 @@ public class NotificationsController { mBuilder.setVibrate(new long[]{0, 0}); } - //RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY).setLabel(LocaleController.getString("Reply", R.string.Reply)).build(); - notificationManager.notify(1, mBuilder.build()); if (preferences.getBoolean("EnablePebbleNotifications", false)) { sendAlertToPebble(lastMessageFull); } + showWearNotifications(notifyAboutLast); scheduleNotificationRepeat(); } catch (Exception e) { FileLog.e("tmessages", e); } } + public void showWearNotifications(boolean notifyAboutLast) { + if (Build.VERSION.SDK_INT < 19) { + return; + } + ArrayList sortedDialogs = new ArrayList(); + HashMap> messagesByDialogs = new HashMap>(); + for (MessageObject messageObject : pushMessages) { + long dialog_id = messageObject.getDialogId(); + if ((int)dialog_id == 0) { + continue; + } + + ArrayList arrayList = messagesByDialogs.get(dialog_id); + if (arrayList == null) { + arrayList = new ArrayList(); + messagesByDialogs.put(dialog_id, arrayList); + sortedDialogs.add(0, dialog_id); + } + arrayList.add(messageObject); + } + + HashMap oldIds = new HashMap(); + oldIds.putAll(wearNoticationsIds); + wearNoticationsIds.clear(); + + for (long dialog_id : sortedDialogs) { + ArrayList messageObjects = messagesByDialogs.get(dialog_id); + int max_id = messageObjects.get(0).messageOwner.id; + TLRPC.Chat chat = null; + TLRPC.User user = null; + String name = null; + if (dialog_id > 0) { + user = MessagesController.getInstance().getUser((int)dialog_id); + if (user == null) { + continue; + } + } else { + chat = MessagesController.getInstance().getChat(-(int)dialog_id); + if (chat == null) { + continue; + } + } + if (chat != null) { + name = chat.title; + } else { + name = ContactsController.formatName(user.first_name, user.last_name); + } + + Integer notificationId = oldIds.get(dialog_id); + if (notificationId == null) { + notificationId = wearNotificationId++; + } else { + oldIds.remove(dialog_id); + } + + Intent replyIntent = new Intent(ApplicationLoader.applicationContext, WearReplyReceiver.class); + replyIntent.putExtra("dialog_id", dialog_id); + replyIntent.putExtra("max_id", max_id); + PendingIntent replyPendingIntent = PendingIntent.getBroadcast(ApplicationLoader.applicationContext, notificationId, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT); + RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY).setLabel(LocaleController.getString("Reply", R.string.Reply)).build(); + String replyToString; + if (chat != null) { + replyToString = LocaleController.formatString("ReplyToGroup", R.string.ReplyToGroup, name); + } else { + replyToString = LocaleController.formatString("ReplyToUser", R.string.ReplyToUser, name); + } + NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon, replyToString, replyPendingIntent).addRemoteInput(remoteInput).build(); + + String text = ""; + for (MessageObject messageObject : messageObjects) { + String message = getStringForMessage(messageObject, false); + if (message == null) { + continue; + } + if (chat != null) { + message = message.replace(" @ " + name, ""); + } else { + message = message.replace(name + ": ", "").replace(name + " ", ""); + } + if (text.length() > 0) { + text += "\n\n"; + } + text += message; + } + + NotificationCompat.Builder builder = new NotificationCompat.Builder(ApplicationLoader.applicationContext) + .setContentTitle(name) + .setSmallIcon(R.drawable.notification) + .setGroup("messages") + .setContentText(text) + .setGroupSummary(false) + .extend(new NotificationCompat.WearableExtender().addAction(action)); + + notificationManager.notify(notificationId, builder.build()); + wearNoticationsIds.put(dialog_id, notificationId); + } + + for (HashMap.Entry entry : oldIds.entrySet()) { + notificationManager.cancel(entry.getValue()); + } + } + private void dismissNotification() { try { notificationManager.cancel(1); diff --git a/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java b/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java new file mode 100644 index 000000000..9e32dc6a6 --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/android/WearReplyReceiver.java @@ -0,0 +1,37 @@ +/* + * This is the source code of Telegram for Android v. 1.7.x. + * It is licensed under GNU GPL v. 2 or later. + * You should have received a copy of the license in this archive (see LICENSE). + * + * Copyright Nikolai Kudashov, 2013-2014. + */ + +package org.telegram.android; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.RemoteInput; + +public class WearReplyReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput == null) { + return; + } + CharSequence text = remoteInput.getCharSequence(NotificationsController.EXTRA_VOICE_REPLY); + if (text == null || text.length() == 0) { + return; + } + long dialog_id = intent.getLongExtra("dialog_id", 0); + int max_id = intent.getIntExtra("max_id", 0); + if (dialog_id == 0 || max_id == 0) { + return; + } + SendMessagesHelper.getInstance().sendMessage(text.toString(), dialog_id); + MessagesController.getInstance().markDialogAsRead(dialog_id, max_id, max_id, 0, 0, true, false); + } +} diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java index 136883bbd..1b58638cc 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMediaCell.java @@ -136,6 +136,7 @@ public class ChatMediaCell extends ChatBaseCell implements MediaController.FileD progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG); progressPaint.setStyle(Paint.Style.STROKE); + progressPaint.setStrokeCap(Paint.Cap.ROUND); progressPaint.setStrokeWidth(AndroidUtilities.dp(2)); decelerateInterpolator = new DecelerateInterpolator(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index c8e44a030..59b2734fd 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -544,6 +544,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not args.putBoolean("onlySelect", true); args.putBoolean("serverOnly", true); args.putString("selectAlertString", LocaleController.getString("ForwardMessagesTo", R.string.ForwardMessagesTo)); + args.putString("selectAlertStringGroup", LocaleController.getString("ForwardMessagesToGroup", R.string.ForwardMessagesToGroup)); MessagesActivity fragment = new MessagesActivity(args); fragment.setDelegate(ChatActivity.this); presentFragment(fragment); @@ -2914,6 +2915,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not args.putBoolean("onlySelect", true); args.putBoolean("serverOnly", true); args.putString("selectAlertString", LocaleController.getString("ForwardMessagesTo", R.string.ForwardMessagesTo)); + args.putString("selectAlertStringGroup", LocaleController.getString("ForwardMessagesToGroup", R.string.ForwardMessagesToGroup)); MessagesActivity fragment = new MessagesActivity(args); fragment.setDelegate(this); presentFragment(fragment); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java index e2d872e39..8076f0454 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ContactsActivity.java @@ -39,7 +39,6 @@ import org.telegram.android.NotificationCenter; import org.telegram.messenger.R; import org.telegram.messenger.RPCRequest; import org.telegram.messenger.UserConfig; -import org.telegram.messenger.Utilities; import org.telegram.ui.Adapters.ContactsActivityAdapter; import org.telegram.ui.Adapters.ContactsActivitySearchAdapter; import org.telegram.ui.Cells.ChatOrUserCell; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 67534eb82..d5770b107 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -576,6 +576,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa Bundle args = new Bundle(); args.putBoolean("onlySelect", true); args.putString("selectAlertString", LocaleController.getString("SendMessagesTo", R.string.SendMessagesTo)); + args.putString("selectAlertStringGroup", LocaleController.getString("SendMessagesToGroup", R.string.SendMessagesToGroup)); MessagesActivity fragment = new MessagesActivity(args); fragment.setDelegate(this); actionBarLayout.presentFragment(fragment, false, true, true); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java index 552f17527..1bceb8cf3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/MessagesActivity.java @@ -53,6 +53,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter private View progressView; private View empryView; private String selectAlertString; + private String selectAlertStringGroup; private boolean serverOnly = false; private static boolean dialogsLoaded = false; @@ -101,6 +102,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter onlySelect = arguments.getBoolean("onlySelect", false); serverOnly = arguments.getBoolean("serverOnly", false); selectAlertString = arguments.getString("selectAlertString"); + selectAlertStringGroup = arguments.getString("selectAlertStringGroup"); } if (!dialogsLoaded) { MessagesController.getInstance().loadDialogs(0, 0, 100, true); @@ -538,7 +540,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter } private void didSelectResult(final long dialog_id, boolean useAlert, final boolean param) { - if (useAlert && selectAlertString != null) { + if (useAlert && selectAlertString != null && selectAlertStringGroup != null) { if (getParentActivity() == null) { return; } @@ -552,7 +554,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter if (chat == null) { return; } - builder.setMessage(LocaleController.formatStringSimple(selectAlertString, chat.title)); + builder.setMessage(LocaleController.formatStringSimple(selectAlertStringGroup, chat.title)); } else { if (lower_part > 0) { TLRPC.User user = MessagesController.getInstance().getUser(lower_part); @@ -565,7 +567,7 @@ public class MessagesActivity extends BaseFragment implements NotificationCenter if (chat == null) { return; } - builder.setMessage(LocaleController.formatStringSimple(selectAlertString, chat.title)); + builder.setMessage(LocaleController.formatStringSimple(selectAlertStringGroup, chat.title)); } } } else { diff --git a/TMessagesProj/src/main/res/drawable-hdpi/ic_reply_icon.png b/TMessagesProj/src/main/res/drawable-hdpi/ic_reply_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..f483f34271ac28a38a86ffccc9a81b32aa8cdeb1 GIT binary patch literal 1486 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wF4y>X9xI%xB|KVN5P;B0iB|0e}K`` zSrX(I42&-BMoVTUmRaA;C;xwA`qymg@3&L_{4;rH`{UBu7H3V~kNf*#L~gDO`1Q0$ z@8_~F>n#>2vE}e=Qr`A5kbh_Wo+Yd^mkXbg-CN*xEAoNFy6MMH96SH{TQ3Kvj#F~i zmM5RIHEK7m@P2L2xAntzo6cun>lUh9%op#Ee=+aIs#f;h8{QxGSDO}ovg}r7mK6g7 zbEKz>V@Srmw=*)Mg$)H7th;l>QVR+b7cXFvTj9zwRZAmIG(eD5RP-YQe~3+>;QQZy zZl+xlyLBmfTh6@W{MPaf>>2mwn%_(@+87}c=pyJU68OiQ(Qv~R@#4qK5eWhghn=Td zHptb7mYy*)-&c?ow%(AHLBQ!s(%mR$hPTVb?(V8GW_X(}TXiFWZNXoYMX#lqmi+w@ zG>dV`-yI!k43hSj1QIUt&tla1X~=xyQ!>khx5rr&j{8e7n6+$6eg4an@mlkS9KmxN zCp>p&HZ!qwnrr>QLagPjdTYkL9ht@6*|U>wxNu$e56ii^E4SKORY}W!(e&RZpFH>_ zS9^bB@$^%NHz~TP#^VQp6Ph-w0dAAjR ziCABWtlbf>ug=G$^ZLZaO`mt`bp9|rHHUe_f>#v_p8NZ@9ufB3d$CAlF3&87EL&cl zO=6R)S{E7~5J}IJvO2mkq-wH;uf<%JZr2BUj@YNnsU3N>-mKfRgc4xUh-J< zEDhPH`m&6Fvsm`gX*D*t*G+rq#Xl$LHe1=pdoPlv#e}cYn0c6Edce1U&wrWfOF!PJ zoVLVinu=L}U+j*G%s-z*_5c3fF@62T!>hB>*KYX`G&T0nwz-|zldtFB*<)(wy7+hH z(#do7o%LRr@G@fk{Us$G)_=?2mu46mMPK4E@SmS_RNqv$WrOT5#hbZYAK(V&R5#;?uzz19fS27xg6CU|J%Guv900#!_D$u ziEr1HxQfN5o|gIST3;j9vP^CL^yS;!YbvXCwF3-KX0=`T@A!Oz(vBZ-7Z2q>zi^g| z&E4?b)G-o{LeM6LjlRtIJobBWM|3EE{HyT>(cqQ_=D@`zjt&Q zpOALhDRZ~yuAj$V)_9!vtjd2k_sqF72OR8w6|QGi5MY?VDxcC|EXO9#QxzQX*O`B> zZbS{==Y1?<_B|GlJTDyRe>6khky(GKx}$LaJQni`|EB0YsxNjzT*XrLyv_8%<1o3+DP zC41(3sz}Y5JKJC2;URaKQx6U)bHJFR)gSE&!?8S_8-nQv+1Htk~dT713fpfl4c*O(PMFH7uy6wzkyCD-&J zW>bf0%l;qyPWMgE8_C2Tt7%)}dRZ*&VSSF!r0pj*ukNYNSY~T>X+rNp`R_XG7@fYF V%m3cjp#e;b44$rjF6*2UngD>;R>S}R literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/ic_reply_icon.png b/TMessagesProj/src/main/res/drawable-xhdpi/ic_reply_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..9caeae67ce29c7c4825734de6ea91ea776fbac26 GIT binary patch literal 679 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&nFaWSxc>kDAIJofB!S@l>`#H( zgi3<^f*BYL<~RJ`?{L09K%hV&;r{#e`=(_tU|?Y4^K@|xskrra*3DVX3OsJw-5MRI zfA4>jFt@BLTG`1++*1F;e11Wv2Okq8+7clsNlRdnms)p2$QGuc%UmA5+5(?ES)bK- zHKyAwJTS>${ljd3wGXG33spQ9=KS;YGDppm$s9G$f;n7%vM?3e?K_|)ADb|@Uw6Yv zcd;AK9&^2UvY6}5(`2qU&)Bn8^0XZY{O5EzDm?6gP5s0dHI|GH|5DqvnGXDUKIH{B zN6ZO+o>Qq}JEqA?IC3R4p8n~;y28Qh-3xp*M%;w+2NvhMz5aUOVczj*wKGjF%zTEd-kX$p`~s_j)>*Y|lCk6UlJVJ>8YlOMqvGwa-X_QW8w@_SPhbf*tKAY()#R;hzV`f? z7uUGrjaWf2!jZ=kX*10lTC~ z9+rp3^Oifh|D2F%w&F8~irv#qi5y0pDni$oowW?k%SAP=n%Tkn$3Z6`vToB!1D?Y` d^vAl6VV9v_jn1q3RA9Pc@O1TaS?83{1OO#%1$s,\nتم تسجيل الدخول لحسابك من جهاز جديد يوم %2$s\n\nالجهاز: %3$s\nالموقع: %4$s\n\nإذا لم يكن أنت من سجل الدخول، يمكنك الذهاب للإعدادات ثم تسجيل الخروج من كافة الأجهزة الأخرى.\n\nشكرًا,\nفريق عمل تيليجرام %1$s قام بتغيير صورته الشخصية الرد + Reply to %1$s + Reply to %1$s اختر جهة اتصال لا توجد جهات اتصال بعد @@ -377,6 +379,8 @@ هل أنت متأكد من رغبتك في حذف جهة الاتصال هذه؟ هل أنت متأكد من أنك تريد بدء محادثة سرية؟ أعد الإرسال باستخدام اسمي + هل ترغب في إرسال رسالة إلى %1$s؟ + ؟%1$s هل تريد إعادة توجيه الرسائل إلى تيليجرام سريع @@ -424,6 +428,12 @@ من %1$d جهات اتصال من %1$d جهة اتصال من %1$d جهة اتصال + + dd MMM + dd.MM.yy + dd.MM.yyyy + d MMMM + d MMMM yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-de/strings.xml b/TMessagesProj/src/main/res/values-de/strings.xml index 19d79b04d..97e1b0009 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -152,6 +152,8 @@ %1$s,\nWir haben eine Anmeldung von einem neuen Gerät am %2$s festgestellt.\n\nGerät: %3$s\nStandort: %4$s\n\nWenn du das nicht selbst gewesen bist, melde alle anderen Sitzungen in den Telegram Einstellungen unverzüglich ab.\n\nMit freundlichen Grüßen,\nDas Telegram Team %1$s hat das Profilbild geändert Beantworten + Reply to %1$s + Reply to %1$s Kontakt auswählen Noch keine Kontakte @@ -377,6 +379,8 @@ Diesen Kontakt wirklich löschen? Geheimen Chat starten? mit meinem Namen weiterleiten + Nachricht an %1$s senden? + Nachrichten an %1$s weiterleiten? Telegram Schnell @@ -424,6 +428,12 @@ von %1$d Kontakten von %1$d Kontakten von %1$d Kontakten + + dd MMM + dd.MM.yy + dd.MM.yyyy + d MMMM + d MMMM yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-es/strings.xml b/TMessagesProj/src/main/res/values-es/strings.xml index 66d490e89..3ef00b5dd 100644 --- a/TMessagesProj/src/main/res/values-es/strings.xml +++ b/TMessagesProj/src/main/res/values-es/strings.xml @@ -152,6 +152,8 @@ %1$s,\nDetectamos un inicio de sesión en tu cuenta desde un nuevo dispositivo, el %2$s\n\nDispositivo: %3$s\nUbicación: %4$s\n\nSi no eras tú, puedes ir a Ajustes - Cerrar todas las otras sesiones.\n\nAtentamente,\nEl equipo de Telegram %1$s actualizó su foto de perfil Responder + Reply to %1$s + Reply to %1$s Elegir contacto Aún sin contactos @@ -377,6 +379,8 @@ ¿Quieres eliminar este contacto? ¿Quieres iniciar un chat secreto? reenviar desde mi nombre + ¿Enviar mensajes a %1$s? + ¿Reenviar mensajes a %1$s? Telegram Rápida @@ -424,6 +428,12 @@ de %1$d contactos de %1$d contactos de %1$d contactos + + dd \'de\' MMM + dd.MM.yy + dd.MM.yyyy + d \'de\' MMMM + d \'de\' MMMM \'de\' yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-it/strings.xml b/TMessagesProj/src/main/res/values-it/strings.xml index 954886b66..befdbb860 100644 --- a/TMessagesProj/src/main/res/values-it/strings.xml +++ b/TMessagesProj/src/main/res/values-it/strings.xml @@ -152,6 +152,8 @@ %1$s,\nAbbiamo rilevato un accesso al tuo account da un nuovo dispositivo %2$s\n\nDispositivo: %3$s\nPosizione: %4$s\n\nSe non sei stato tu, puoi andare su Impostazioni - Termina tutte le sessioni.\n\nGrazie,\nil team di Telegram %1$s ha aggiornato la foto del profilo Rispondi + Reply to %1$s + Reply to %1$s Seleziona contatto Ancora nessun contatto @@ -377,6 +379,8 @@ Eliminare questo contatto? Iniziare una chat segreta? inoltra dal mio nome + Inviare i messaggi a %1$s? + Vuoi inoltrare i messaggi a %1$s? Telegram Veloce @@ -424,6 +428,12 @@ da %1$d contatti da %1$d contatti da %1$d contatti + + dd MMM + dd.MM.yy + dd.MM.yyyy + d MMMM + d MMMM yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml index 0699e32b2..403e510cd 100644 --- a/TMessagesProj/src/main/res/values-nl/strings.xml +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -152,6 +152,8 @@ %1$s,\nEr is op je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je alle sessies beëindigen via Instellingen – Beëindig alle andere sessies.\n\nBedankt,\nHet Telegram-team %1$s heeft zijn/haar profielfoto gewijzigd Antwoord + Reply to %1$s + Reply to %1$s Kies een contact Nog geen contacten @@ -377,6 +379,8 @@ Weet je zeker dat je deze contactpersoon wilt verwijderen? Weet je zeker dat je een geheime chat wilt starten? doorsturen via mijn eigen naam + Berichten naar %1$s verzenden? + Berichten doorsturen naar %1$s? Telegram Snel @@ -424,6 +428,12 @@ van %1$d contactpersonen van %1$d contactpersonen van %1$d contactpersonen + + dd MMM + dd.MM.yy + dd.MM.yyyy + d MMMM + d MMMM yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml index 52e2cc57d..515b1dfb1 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings.xml @@ -152,6 +152,8 @@ %1$s,\nNós detectamos um login na sua conta de um novo dispositivo %2$s\n\nDispositivo: %3$s\nLocalização: %4$s\nSe não foi você, você pode ir em Configurações - Terminar todas as sessões.\n\nAtenciosamente,\nTime do Telegram %1$s atualizou a foto do perfil Responder + Reply to %1$s + Reply to %1$s Selecionar Contato Ainda não há contatos @@ -377,6 +379,8 @@ Você tem certeza que deseja deletar este contato? Você tem certeza que deseja começar uma conversa secreta? encaminhar pelo meu nome + Enviar mensagens para %1$s? + Encaminhar mensagem para %1$s? Telegram Rápido @@ -424,6 +428,12 @@ de %1$d contatos de %1$d contatos de %1$d contatos + + dd MMM + dd.MM.yy + dd.MM.yyyy + d MMMM + d MMMM yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml index 6c6ffea9d..85c128467 100644 --- a/TMessagesProj/src/main/res/values-pt-rPT/strings.xml +++ b/TMessagesProj/src/main/res/values-pt-rPT/strings.xml @@ -152,6 +152,8 @@ %1$s,\nNós detectamos um login na sua conta de um novo dispositivo %2$s\n\nDispositivo: %3$s\nLocalização: %4$s\nSe não foi você, você pode ir em Configurações - Terminar todas as sessões.\n\nAtenciosamente,\nTime do Telegram %1$s atualizou a foto do perfil Responder + Reply to %1$s + Reply to %1$s Selecionar Contato Ainda não há contatos @@ -377,6 +379,8 @@ Você tem certeza que deseja deletar este contato? Você tem certeza que deseja começar uma conversa secreta? encaminhar pelo meu nome + Enviar mensagens para %1$s? + Encaminhar mensagem para %1$s? Telegram Rápido @@ -424,6 +428,12 @@ de %1$d contatos de %1$d contatos de %1$d contatos + + dd MMM + dd.MM.yy + dd.MM.yyyy + d MMMM + d MMMM yyyy CACHE_TAG \ No newline at end of file diff --git a/TMessagesProj/src/main/res/values/strings.xml b/TMessagesProj/src/main/res/values/strings.xml index 558965227..f139a53e4 100644 --- a/TMessagesProj/src/main/res/values/strings.xml +++ b/TMessagesProj/src/main/res/values/strings.xml @@ -152,6 +152,8 @@ %1$s,\nWe detected a login into your account from a new device on %2$s\n\nDevice: %3$s\nLocation: %4$s\n\nIf this wasn\'t you, you can go to Settings - Terminate all sessions.\n\nSincerely,\nThe Telegram Team %1$s updated profile photo Reply + Reply to %1$s + Reply to %1$s Select Contact No contacts yet @@ -377,6 +379,8 @@ Are you sure you want to delete this contact? Are you sure you want to start a secret chat? forward from my name + Send messages to %1$s? + Forward messages to %1$s? Telegram Fast @@ -424,6 +428,12 @@ from %1$d contacts from %1$d contacts from %1$d contacts + + MMM dd + dd.MM.yy + dd.MM.yyyy + MMMM d + MMMM d, yyyy CACHE_TAG \ No newline at end of file