From 01103c6e94a827f1aca4050581f84051b054f7bc Mon Sep 17 00:00:00 2001 From: DrKLO Date: Mon, 10 Mar 2014 13:27:49 +0400 Subject: [PATCH] Update to 1.3.30 --- TMessagesProj/src/main/AndroidManifest.xml | 11 +- .../messenger/ContactsController.java | 86 +++-- .../messenger/GcmBroadcastReceiver.java | 34 +- .../telegram/messenger/MediaController.java | 56 +-- .../org/telegram/objects/MessageObject.java | 70 +++- .../ContactsActivitySearchAdapter.java | 47 ++- .../java/org/telegram/ui/Cells/BaseCell.java | 1 + .../telegram/ui/Cells/ChatMessageCell.java | 38 +- .../java/org/telegram/ui/ChatActivity.java | 90 ++++- .../org/telegram/ui/GalleryImageViewer.java | 5 +- .../org/telegram/ui/GroupCreateActivity.java | 47 ++- .../java/org/telegram/ui/LaunchActivity.java | 18 +- .../java/org/telegram/ui/LoginActivity.java | 3 + .../telegram/ui/LoginActivityPhoneView.java | 1 + .../org/telegram/ui/SettingsActivity.java | 3 + .../org/telegram/ui/Views/TimerButton.java | 117 ++++++ .../main/res/drawable-hdpi/header_timer.png | Bin 0 -> 1032 bytes .../main/res/drawable-hdpi/header_timer2.png | Bin 0 -> 1072 bytes .../main/res/drawable-ldpi/header_timer.png | Bin 0 -> 542 bytes .../main/res/drawable-ldpi/header_timer2.png | Bin 0 -> 558 bytes .../main/res/drawable-mdpi/header_timer.png | Bin 0 -> 698 bytes .../main/res/drawable-mdpi/header_timer2.png | Bin 0 -> 715 bytes .../main/res/drawable-xhdpi/header_timer.png | Bin 0 -> 1281 bytes .../main/res/drawable-xhdpi/header_timer2.png | Bin 0 -> 1329 bytes .../main/res/drawable-xxhdpi/header_timer.png | Bin 0 -> 1928 bytes .../res/drawable-xxhdpi/header_timer2.png | Bin 0 -> 2031 bytes .../res/layout/chat_header_enc_layout.xml | 14 + .../src/main/res/menu/chat_enc_menu.xml | 50 +++ .../src/main/res/values-de/strings.xml | 2 +- .../src/main/res/values-nl/strings.xml | 354 ++++++++++++++++++ 30 files changed, 901 insertions(+), 146 deletions(-) create mode 100644 TMessagesProj/src/main/java/org/telegram/ui/Views/TimerButton.java create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/header_timer.png create mode 100755 TMessagesProj/src/main/res/drawable-hdpi/header_timer2.png create mode 100755 TMessagesProj/src/main/res/drawable-ldpi/header_timer.png create mode 100755 TMessagesProj/src/main/res/drawable-ldpi/header_timer2.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/header_timer.png create mode 100755 TMessagesProj/src/main/res/drawable-mdpi/header_timer2.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/header_timer.png create mode 100755 TMessagesProj/src/main/res/drawable-xhdpi/header_timer2.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/header_timer.png create mode 100755 TMessagesProj/src/main/res/drawable-xxhdpi/header_timer2.png create mode 100644 TMessagesProj/src/main/res/layout/chat_header_enc_layout.xml create mode 100644 TMessagesProj/src/main/res/menu/chat_enc_menu.xml create mode 100644 TMessagesProj/src/main/res/values-nl/strings.xml diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 6f350b9f1..24f68fb69 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="194" + android:versionName="1.3.30"> - + @@ -50,7 +50,6 @@ - @@ -65,9 +64,9 @@ android:largeHeap="true"> - + - + c : contactHashMap.entrySet()) { -// Contact contact = c.getValue(); -// FileLog.e("tmessages", "delete contact " + contact.first_name + " " + contact.last_name); -// for (String phone : contact.phones) { -// FileLog.e("tmessages", phone); -// } -// } -// } + if (ConnectionsManager.DEBUG_VERSION) { + FileLog.e("tmessages", "need delete contacts"); + for (HashMap.Entry c : contactHashMap.entrySet()) { + Contact contact = c.getValue(); + FileLog.e("tmessages", "delete contact " + contact.first_name + " " + contact.last_name); + for (String phone : contact.phones) { + FileLog.e("tmessages", phone); + } + } + } final ArrayList toDelete = new ArrayList(); if (contactHashMap != null && !contactHashMap.isEmpty()) { @@ -577,12 +577,12 @@ public class ContactsController { if (request) { if (!toImport.isEmpty()) { -// if (ConnectionsManager.DEBUG_VERSION) { -// FileLog.e("tmessages", "start import contacts"); -// for (TLRPC.TL_inputPhoneContact contact : toImport) { -// FileLog.e("tmessages", "add contact " + contact.first_name + " " + contact.last_name + " " + contact.phone); -// } -// } + if (ConnectionsManager.DEBUG_VERSION) { + FileLog.e("tmessages", "start import contacts"); + for (TLRPC.TL_inputPhoneContact contact : toImport) { + FileLog.e("tmessages", "add contact " + contact.first_name + " " + contact.last_name + " " + contact.phone); + } + } final int count = (int)Math.ceil(toImport.size() / 500.0f); for (int a = 0; a < count; a++) { ArrayList finalToImport = new ArrayList(); @@ -600,6 +600,11 @@ public class ContactsController { MessagesStorage.Instance.putCachedPhoneBook(contactsMap); } TLRPC.TL_contacts_importedContacts res = (TLRPC.TL_contacts_importedContacts)response; + if (ConnectionsManager.DEBUG_VERSION) { + for (TLRPC.User user : res.users) { + FileLog.e("tmessages", "received user " + user.first_name + " " + user.last_name + " " + user.phone); + } + } MessagesStorage.Instance.putUsersAndChats(res.users, null, true, true); ArrayList cArr = new ArrayList(); for (TLRPC.TL_importedContact c : res.imported) { @@ -740,6 +745,8 @@ public class ContactsController { } } + final HashMap usersDict = new HashMap(); + if (!contacts.isEmpty()) { for (int a = 0; a < contactsArr.size(); a++) { TLRPC.TL_contact contact = contactsArr.get(a); @@ -751,6 +758,17 @@ public class ContactsController { contactsArr.addAll(contacts); } + for (TLRPC.TL_contact contact : contactsArr) { + TLRPC.User user = MessagesController.Instance.users.get(contact.user_id); + if (user != null) { + usersDict.put(user.id, user); + + if (ConnectionsManager.DEBUG_VERSION) { + FileLog.e("tmessages", "loaded user contact " + user.first_name + " " + user.last_name + " " + user.phone); + } + } + } + Utilities.stageQueue.postRunnable(new Runnable() { @Override public void run() { @@ -760,15 +778,15 @@ public class ContactsController { return; } - if (from == 1) { - for (TLRPC.TL_contact contact : contactsArr) { - if (MessagesController.Instance.users.get(contact.user_id) == null && contact.user_id != UserConfig.clientUserId) { - loadContacts(false, true); - FileLog.e("tmessages", "contacts are broken, load from server"); - return; - } + for (TLRPC.TL_contact contact : contactsArr) { + if (usersDict.get(contact.user_id) == null && contact.user_id != UserConfig.clientUserId) { + loadContacts(false, true); + FileLog.e("tmessages", "contacts are broken, load from server"); + return; } - } else { + } + + if (from != 1) { MessagesStorage.Instance.putUsersAndChats(usersArr, null, true, true); MessagesStorage.Instance.putContacts(contactsArr, from != 2); Collections.sort(contactsArr, new Comparator() { @@ -796,8 +814,8 @@ public class ContactsController { Collections.sort(contactsArr, new Comparator() { @Override public int compare(TLRPC.TL_contact tl_contact, TLRPC.TL_contact tl_contact2) { - TLRPC.User user1 = MessagesController.Instance.users.get(tl_contact.user_id); - TLRPC.User user2 = MessagesController.Instance.users.get(tl_contact2.user_id); + TLRPC.User user1 = usersDict.get(tl_contact.user_id); + TLRPC.User user2 = usersDict.get(tl_contact2.user_id); String name1 = user1.first_name; if (name1 == null || name1.length() == 0) { name1 = user1.last_name; @@ -822,7 +840,7 @@ public class ContactsController { final HashMap contactsByPhonesDictFinal = contactsByPhonesDict; for (TLRPC.TL_contact value : contactsArr) { - TLRPC.User user = MessagesController.Instance.users.get(value.user_id); + TLRPC.User user = usersDict.get(value.user_id); if (user == null) { continue; } @@ -1350,7 +1368,7 @@ public class ContactsController { } public void addContact(TLRPC.User user) { - if (user == null) { + if (user == null || user.phone == null) { return; } @@ -1358,12 +1376,18 @@ public class ContactsController { ArrayList contactsParams = new ArrayList(); TLRPC.TL_inputPhoneContact c = new TLRPC.TL_inputPhoneContact(); c.phone = user.phone; + if (!c.phone.startsWith("+")) { + c.phone = "+" + c.phone; + } c.first_name = user.first_name; c.last_name = user.last_name; c.client_id = 0; contactsParams.add(c); req.contacts = contactsParams; req.replace = false; + if (ConnectionsManager.DEBUG_VERSION) { + FileLog.e("tmessages", "add contact " + user.first_name + " " + user.last_name + " " + user.phone); + } ConnectionsManager.Instance.performRpc(req, new RPCRequest.RPCRequestDelegate() { @Override public void run(TLObject response, TLRPC.TL_error error) { @@ -1373,6 +1397,12 @@ public class ContactsController { final TLRPC.TL_contacts_importedContacts res = (TLRPC.TL_contacts_importedContacts)response; MessagesStorage.Instance.putUsersAndChats(res.users, null, true, true); + if (ConnectionsManager.DEBUG_VERSION) { + for (TLRPC.User user : res.users) { + FileLog.e("tmessages", "received user " + user.first_name + " " + user.last_name + " " + user.phone); + } + } + for (final TLRPC.User u : res.users) { Utilities.globalQueue.postRunnable(new Runnable() { @Override diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/GcmBroadcastReceiver.java b/TMessagesProj/src/main/java/org/telegram/messenger/GcmBroadcastReceiver.java index 3e614867b..f505fb57a 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/GcmBroadcastReceiver.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/GcmBroadcastReceiver.java @@ -17,15 +17,34 @@ import android.os.PowerManager; public class GcmBroadcastReceiver extends BroadcastReceiver { public static final int NOTIFICATION_ID = 1; + private static PowerManager.WakeLock wakeLock = null; + private static final Integer sync = 1; @Override public void onReceive(final Context context, final Intent intent) { FileLog.d("tmessages", "GCM received intent: " + intent); if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) { - PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); - final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "lock"); - wl.acquire(); + synchronized (sync) { + try { + if (wakeLock == null) { + PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "lock"); + } + if (!wakeLock.isHeld()) { + wakeLock.acquire(5000); + } + } catch (Exception e) { + try { + if (wakeLock != null) { + wakeLock.release(); + } + } catch (Exception e2) { + FileLog.e("tmessages", e2); + } + FileLog.e("tmessages", e); + } + } // SharedPreferences preferences = context.getSharedPreferences("Notifications", Context.MODE_PRIVATE); // boolean globalEnabled = preferences.getBoolean("EnableAll", true); @@ -34,14 +53,7 @@ public class GcmBroadcastReceiver extends BroadcastReceiver { // return; // } - Thread thread = new Thread(new Runnable() { - public void run() { - ConnectionsManager.Instance.resumeNetworkMaybe(); - wl.release(); - } - }); - thread.setPriority(Thread.MAX_PRIORITY); - thread.start(); + ConnectionsManager.Instance.resumeNetworkMaybe(); } else if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) { String registration = intent.getStringExtra("registration_id"); if (intent.getStringExtra("error") != null) { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java index fbadb02e9..f84d82e75 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MediaController.java @@ -65,37 +65,39 @@ public class MediaController implements NotificationCenter.NotificationCenterDel NotificationCenter.Instance.addObserver(this, FileLoader.FileDidLoaded); NotificationCenter.Instance.addObserver(this, FileLoader.FileLoadProgressChanged); - Timer progressTimer = new Timer(); - progressTimer.schedule(new TimerTask() { - @Override - public void run() { - synchronized (sync) { - Utilities.RunOnUIThread(new Runnable() { - @Override - public void run() { - if (playingMessageObject != null && audioPlayer != null && !isPaused) { - try { - int progress = audioPlayer.getCurrentPosition(); - if (progress <= lastProgress) { - return; + if (ConnectionsManager.enableAudio) { + Timer progressTimer = new Timer(); + progressTimer.schedule(new TimerTask() { + @Override + public void run() { + synchronized (sync) { + Utilities.RunOnUIThread(new Runnable() { + @Override + public void run() { + if (playingMessageObject != null && audioPlayer != null && !isPaused) { + try { + int progress = audioPlayer.getCurrentPosition(); + if (progress <= lastProgress) { + return; + } + lastProgress = progress; + final float value = (float)lastProgress / (float)audioPlayer.getDuration(); + playingMessageObject.audioProgress = value; + playingMessageObject.audioProgressSec = lastProgress / 1000; + NotificationCenter.Instance.postNotificationName(audioProgressDidChanged, playingMessageObject.messageOwner.id, value); + } catch (Exception e) { + FileLog.e("tmessages", e); } - lastProgress = progress; - final float value = (float)lastProgress / (float)audioPlayer.getDuration(); - playingMessageObject.audioProgress = value; - playingMessageObject.audioProgressSec = lastProgress / 1000; - NotificationCenter.Instance.postNotificationName(audioProgressDidChanged, playingMessageObject.messageOwner.id, value); - } catch (Exception e) { - FileLog.e("tmessages", e); + } + if (audioRecorder != null) { + NotificationCenter.Instance.postNotificationName(recordProgressChanged, System.currentTimeMillis() - recordStartTime); } } - if (audioRecorder != null) { - NotificationCenter.Instance.postNotificationName(recordProgressChanged, System.currentTimeMillis() - recordStartTime); - } - } - }); + }); + } } - } - }, 100, 17); + }, 100, 17); + } } public void cleanup() { diff --git a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java index b839212dc..f020bf51f 100644 --- a/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java +++ b/TMessagesProj/src/main/java/org/telegram/objects/MessageObject.java @@ -16,6 +16,7 @@ import android.text.StaticLayout; import android.text.TextPaint; import android.text.util.Linkify; +import org.telegram.messenger.ConnectionsManager; import org.telegram.messenger.FileLog; import org.telegram.messenger.TLObject; import org.telegram.messenger.TLRPC; @@ -26,6 +27,7 @@ import org.telegram.messenger.UserConfig; import org.telegram.messenger.Utilities; import org.telegram.ui.ApplicationLoader; +import java.io.File; import java.util.AbstractMap; import java.util.ArrayList; import java.util.Calendar; @@ -298,9 +300,17 @@ public class MessageObject { } } else if (message.media != null && message.media instanceof TLRPC.TL_messageMediaAudio) { if (message.from_id == UserConfig.clientUserId) { - type = 18; + if (ConnectionsManager.enableAudio) { + type = 18; + } else { + type = 0; + } } else { - type = 19; + if (ConnectionsManager.enableAudio) { + type = 19; + } else { + type = 1; + } } } } else if (message instanceof TLRPC.TL_messageService) { @@ -369,7 +379,7 @@ public class MessageObject { } private void generateLayout() { - if (type != 0 && type != 1 && type != 8 && type != 9 || messageOwner.to_id == null || messageText == null || messageText.length() == 0 || !(messageOwner.media instanceof TLRPC.TL_messageMediaEmpty) && !(messageOwner.media instanceof TLRPC.TL_messageMediaUnsupported) && !(messageOwner.media == null)) { + if (type != 0 && type != 1 && type != 8 && type != 9 || messageOwner.to_id == null || messageText == null || messageText.length() == 0) { return; } @@ -392,7 +402,15 @@ public class MessageObject { maxWidth = Math.min(Utilities.displaySize.x, Utilities.displaySize.y) - Utilities.dp(80); } - StaticLayout textLayout = new StaticLayout(messageText, textPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + StaticLayout textLayout = null; + + try { + textLayout = new StaticLayout(messageText, textPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + } catch (Exception e) { + FileLog.e("tmessages", e); + return; + } + textHeight = textLayout.getHeight(); int linesCount = textLayout.getLineCount(); @@ -416,18 +434,35 @@ public class MessageObject { continue; } block.charactersOffset = startCharacter; - CharSequence str = messageText.subSequence(startCharacter, endCharacter); - block.textLayout = new StaticLayout(str, textPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); - block.textYOffset = textLayout.getLineTop(linesOffset); - if (a != blocksCount - 1) { - blockHeight = Math.min(blockHeight, block.textLayout.getHeight()); + try { + CharSequence str = messageText.subSequence(startCharacter, endCharacter); + block.textLayout = new StaticLayout(str, textPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + block.textYOffset = textLayout.getLineTop(linesOffset); + if (a != blocksCount - 1) { + blockHeight = Math.min(blockHeight, block.textLayout.getHeight()); + } + } catch (Exception e) { + FileLog.e("tmessages", e); + continue; } } textLayoutBlocks.add(block); - float lastLeft = block.textXOffset = block.textLayout.getLineLeft(currentBlockLinesCount - 1); - float lastLine = block.textLayout.getLineWidth(currentBlockLinesCount - 1); + float lastLeft = block.textXOffset = 0; + try { + lastLeft = block.textXOffset = block.textLayout.getLineLeft(currentBlockLinesCount - 1); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + + float lastLine = 0; + try { + lastLine = block.textLayout.getLineWidth(currentBlockLinesCount - 1); + } catch (Exception e) { + FileLog.e("tmessages", e); + } + int linesMaxWidth; int lastLineWidthWithLeft; int linesMaxWidthWithLeft; @@ -449,13 +484,20 @@ public class MessageObject { for (int n = 0; n < currentBlockLinesCount; ++n) { try { lineWidth = block.textLayout.getLineWidth(n); - lineLeft = block.textLayout.getLineLeft(n); - block.textXOffset = Math.min(block.textXOffset, lineLeft); } catch (Exception e) { FileLog.e("tmessages", e); - return; + lineWidth = 0; } + try { + lineLeft = block.textLayout.getLineLeft(n); + } catch (Exception e) { + FileLog.e("tmessages", e); + lineLeft = 0; + } + + block.textXOffset = Math.min(block.textXOffset, lineLeft); + if (lineLeft == 0) { hasNonRTL = true; } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsActivitySearchAdapter.java b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsActivitySearchAdapter.java index 774eb4ac6..930989e00 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsActivitySearchAdapter.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Adapters/ContactsActivitySearchAdapter.java @@ -67,30 +67,37 @@ public class ContactsActivitySearchAdapter extends BaseFragmentAdapter { } private void processSearch(final String query) { - Utilities.globalQueue.postRunnable(new Runnable() { + Utilities.RunOnUIThread(new Runnable() { @Override public void run() { - String q = query.trim().toLowerCase(); - if (q.length() == 0) { - updateSearchResults(new ArrayList(), new ArrayList()); - return; - } - long time = System.currentTimeMillis(); - ArrayList resultArray = new ArrayList(); - ArrayList resultArrayNames = new ArrayList(); - - for (TLRPC.TL_contact contact : ContactsController.Instance.contacts) { - TLRPC.User user = MessagesController.Instance.users.get(contact.user_id); - if (user.first_name != null && user.first_name.toLowerCase().startsWith(q) || user.last_name != null && user.last_name.toLowerCase().startsWith(q)) { - if (user.id == UserConfig.clientUserId) { - continue; + final ArrayList contactsCopy = new ArrayList(); + contactsCopy.addAll(ContactsController.Instance.contacts); + Utilities.globalQueue.postRunnable(new Runnable() { + @Override + public void run() { + String q = query.trim().toLowerCase(); + if (q.length() == 0) { + updateSearchResults(new ArrayList(), new ArrayList()); + return; } - resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q)); - resultArray.add(user); - } - } + long time = System.currentTimeMillis(); + ArrayList resultArray = new ArrayList(); + ArrayList resultArrayNames = new ArrayList(); - updateSearchResults(resultArray, resultArrayNames); + for (TLRPC.TL_contact contact : contactsCopy) { + TLRPC.User user = MessagesController.Instance.users.get(contact.user_id); + if (user.first_name != null && user.first_name.toLowerCase().startsWith(q) || user.last_name != null && user.last_name.toLowerCase().startsWith(q)) { + if (user.id == UserConfig.clientUserId) { + continue; + } + resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q)); + resultArray.add(user); + } + } + + updateSearchResults(resultArray, resultArrayNames); + } + }); } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java index 09914d8af..d5eb49982 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/BaseCell.java @@ -13,6 +13,7 @@ import android.graphics.drawable.Drawable; import android.view.View; public class BaseCell extends View { + public BaseCell(Context context) { super(context); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java index 79a7183dd..0ed5388a3 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Cells/ChatMessageCell.java @@ -14,6 +14,7 @@ import android.text.Spannable; import android.text.style.ClickableSpan; import android.view.MotionEvent; +import org.telegram.messenger.FileLog; import org.telegram.messenger.Utilities; import org.telegram.objects.MessageObject; @@ -34,7 +35,7 @@ public class ChatMessageCell extends ChatBaseCell { @Override public boolean onTouchEvent(MotionEvent event) { - if (currentMessageObject != null && currentMessageObject.messageText instanceof Spannable && !isPressed) { + if (currentMessageObject != null && currentMessageObject.textLayoutBlocks != null && !currentMessageObject.textLayoutBlocks.isEmpty() && currentMessageObject.messageText instanceof Spannable && !isPressed) { if (event.getAction() == MotionEvent.ACTION_DOWN || pressedLink != null && event.getAction() == MotionEvent.ACTION_UP) { int x = (int)event.getX(); int y = (int)event.getY(); @@ -59,7 +60,11 @@ public class ChatMessageCell extends ChatBaseCell { return true; } else { if (link[0] == pressedLink) { - pressedLink.onClick(this); + try { + pressedLink.onClick(this); + } catch (Exception e) { + FileLog.e("tmessages", e); + } return true; } } @@ -83,6 +88,9 @@ public class ChatMessageCell extends ChatBaseCell { } public void setVisiblePart(int position, int height) { + if (currentMessageObject == null || currentMessageObject.textLayoutBlocks == null) { + return; + } int newFirst = -1, newLast = -1, newCount = 0; for (int a = Math.max(0, (position - textY) / currentMessageObject.blockHeight); a < currentMessageObject.textLayoutBlocks.size(); a++) { @@ -117,6 +125,10 @@ public class ChatMessageCell extends ChatBaseCell { @Override public void setMessageObject(MessageObject messageObject) { if (currentMessageObject != messageObject || isUserDataChanged()) { + if (currentMessageObject != messageObject) { + firstVisibleBlockNum = 0; + lastVisibleBlockNum = 0; + } pressedLink = null; int maxWidth; if (chat) { @@ -160,6 +172,19 @@ public class ChatMessageCell extends ChatBaseCell { setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), totalHeight); } + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + + if (currentMessageObject.messageOwner.out) { + textX = layoutWidth - backgroundWidth + Utilities.dp(10); + textY = Utilities.dp(10) + namesOffset; + } else { + textX = Utilities.dp(19) + (chat ? Utilities.dp(52) : 0); + textY = Utilities.dp(10) + namesOffset; + } + } + @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); @@ -176,10 +201,17 @@ public class ChatMessageCell extends ChatBaseCell { } for (int a = firstVisibleBlockNum; a <= lastVisibleBlockNum; a++) { + if (a >= currentMessageObject.textLayoutBlocks.size()) { + break; + } MessageObject.TextLayoutBlock block = currentMessageObject.textLayoutBlocks.get(a); canvas.save(); canvas.translate(textX - (int)Math.ceil(block.textXOffset), textY + block.textYOffset); - block.textLayout.draw(canvas); + try { + block.textLayout.draw(canvas); + } catch (Exception e) { + FileLog.e("tmessages", e); + } canvas.restore(); } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java index cf4f78551..1e26ebe9a 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ChatActivity.java @@ -68,6 +68,7 @@ import android.widget.TextView; import org.telegram.PhoneFormat.PhoneFormat; import org.telegram.messenger.MediaController; +import org.telegram.messenger.MessagesStorage; import org.telegram.messenger.TLRPC; import org.telegram.messenger.ContactsController; import org.telegram.messenger.FileLog; @@ -91,6 +92,7 @@ import org.telegram.ui.Views.LayoutListView; import org.telegram.ui.Views.MessageActionLayout; import org.telegram.ui.Views.OnSwipeTouchListener; import org.telegram.ui.Views.SizeNotifierRelativeLayout; +import org.telegram.ui.Views.TimerButton; import java.io.File; import java.util.ArrayList; @@ -128,6 +130,7 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa private MessageObject selectedObject; private MessageObject forwaringMessage; private TextView secretViewStatusTextView; + private TimerButton timerButton; private Point displaySize = new Point(); private boolean paused = true; private boolean readWhenResume = false; @@ -777,14 +780,17 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa } private void checkSendButton() { -// sendButton.setVisibility(View.VISIBLE); -// audioSendButton.setVisibility(View.INVISIBLE); - if (messsageEditText.length() > 0) { + if (ConnectionsManager.enableAudio) { + if (messsageEditText.length() > 0) { + sendButton.setVisibility(View.VISIBLE); + audioSendButton.setVisibility(View.INVISIBLE); + } else { + sendButton.setVisibility(View.INVISIBLE); + audioSendButton.setVisibility(View.VISIBLE); + } + } else { sendButton.setVisibility(View.VISIBLE); audioSendButton.setVisibility(View.INVISIBLE); - } else { - sendButton.setVisibility(View.INVISIBLE); - audioSendButton.setVisibility(View.VISIBLE); } } @@ -1172,6 +1178,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa parentActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(localRect); WindowManager manager = (WindowManager) ApplicationLoader.applicationContext.getSystemService(Activity.WINDOW_SERVICE); + if (manager == null || manager.getDefaultDisplay() == null) { + return; + } int rotation = manager.getDefaultDisplay().getRotation(); if (height > Emoji.scale(50)) { @@ -1638,6 +1647,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa boolean currentMarkAsRead = false; for (MessageObject obj : arr) { + if (currentEncryptedChat != null && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageActionTTLChange && timerButton != null) { + timerButton.setTime(obj.messageOwner.action.ttl); + } if (messagesDict.containsKey(obj.messageOwner.id)) { continue; } @@ -1673,6 +1685,9 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa boolean markAsRead = false; int oldCount = messages.size(); for (MessageObject obj : arr) { + if (currentEncryptedChat != null && obj.messageOwner.action != null && obj.messageOwner.action instanceof TLRPC.TL_messageActionTTLChange && timerButton != null) { + timerButton.setTime(obj.messageOwner.action.ttl); + } if (messagesDict.containsKey(obj.messageOwner.id)) { continue; } @@ -2356,10 +2371,69 @@ public class ChatActivity extends BaseFragment implements SizeNotifierRelativeLa @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); - inflater.inflate(R.menu.chat_menu, menu); + if (currentEncryptedChat != null) { + inflater.inflate(R.menu.chat_enc_menu, menu); + } else { + inflater.inflate(R.menu.chat_menu, menu); + } + SupportMenuItem timeItem = (SupportMenuItem)menu.findItem(R.id.chat_enc_timer); if (currentEncryptedChat != null && !(currentEncryptedChat instanceof TLRPC.TL_encryptedChat) || currentChat != null && (currentChat instanceof TLRPC.TL_chatForbidden || currentChat.left)) { SupportMenuItem item = (SupportMenuItem)menu.findItem(R.id.chat_menu_attach); - item.setVisible(false); + if (item != null) { + item.setVisible(false); + } + + if (timeItem != null) { + timeItem.setVisible(false); + } + } + + if (timeItem != null && timeItem.getActionView() != null) { + timerButton = (TimerButton)timeItem.getActionView().findViewById(R.id.chat_timer); + timerButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity); + builder.setTitle(getStringEntry(R.string.MessageLifetime)); + builder.setItems(new CharSequence[]{ + getStringEntry(R.string.ShortMessageLifetimeForever), + getStringEntry(R.string.ShortMessageLifetime2s), + getStringEntry(R.string.ShortMessageLifetime5s), + getStringEntry(R.string.ShortMessageLifetime1m), + getStringEntry(R.string.ShortMessageLifetime1h), + getStringEntry(R.string.ShortMessageLifetime1d), + getStringEntry(R.string.ShortMessageLifetime1w) + + }, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int oldValue = currentEncryptedChat.ttl; + if (which == 0) { + currentEncryptedChat.ttl = 0; + } else if (which == 1) { + currentEncryptedChat.ttl = 2; + } else if (which == 2) { + currentEncryptedChat.ttl = 5; + } else if (which == 3) { + currentEncryptedChat.ttl = 60; + } else if (which == 4) { + currentEncryptedChat.ttl = 60 * 60; + } else if (which == 5) { + currentEncryptedChat.ttl = 60 * 60 * 24; + } else if (which == 6) { + currentEncryptedChat.ttl = 60 * 60 * 24 * 7; + } + if (oldValue != currentEncryptedChat.ttl) { + MessagesController.Instance.sendTTLMessage(currentEncryptedChat); + MessagesStorage.Instance.updateEncryptedChat(currentEncryptedChat); + } + } + }); + builder.setNegativeButton(getStringEntry(R.string.Cancel), null); + builder.show().setCanceledOnTouchOutside(true); + } + }); + timerButton.setTime(currentEncryptedChat.ttl); } SupportMenuItem avatarItem = (SupportMenuItem)menu.findItem(R.id.chat_menu_avatar); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GalleryImageViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/GalleryImageViewer.java index f16cc2db8..e1b4474ea 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GalleryImageViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GalleryImageViewer.java @@ -691,6 +691,9 @@ public class GalleryImageViewer extends AbstractGalleryActivity implements Notif break; case R.id.gallery_menu_save: TLRPC.FileLocation file = getCurrentFile(); + if (file == null) { + return; + } File f = new File(Utilities.getCacheDir(), file.volume_id + "_" + file.local_id + ".jpg"); File dstFile = Utilities.generatePicturePath(); try { @@ -710,7 +713,7 @@ public class GalleryImageViewer extends AbstractGalleryActivity implements Notif if (fromAll) { finish(); } else { - if (!localPagerAdapter.imagesArr.isEmpty() && currentDialog != 0) { + if (localPagerAdapter != null && localPagerAdapter.imagesArr != null && !localPagerAdapter.imagesArr.isEmpty() && currentDialog != 0) { finish(); NotificationCenter.Instance.postNotificationName(needShowAllMedia, currentDialog); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java index da629ca7d..58ca5d715 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/GroupCreateActivity.java @@ -361,30 +361,37 @@ public class GroupCreateActivity extends BaseFragment implements NotificationCen } private void processSearch(final String query) { - Utilities.globalQueue.postRunnable(new Runnable() { + Utilities.RunOnUIThread(new Runnable() { @Override public void run() { - if (query.length() == 0) { - updateSearchResults(new ArrayList(), new ArrayList()); - return; - } - long time = System.currentTimeMillis(); - ArrayList resultArray = new ArrayList(); - ArrayList resultArrayNames = new ArrayList(); - String q = query.toLowerCase(); - - for (TLRPC.TL_contact contact : ContactsController.Instance.contacts) { - TLRPC.User user = MessagesController.Instance.users.get(contact.user_id); - if (user.first_name.toLowerCase().startsWith(q) || user.last_name.toLowerCase().startsWith(q)) { - if (user.id == UserConfig.clientUserId) { - continue; + final ArrayList contactsCopy = new ArrayList(); + contactsCopy.addAll(ContactsController.Instance.contacts); + Utilities.globalQueue.postRunnable(new Runnable() { + @Override + public void run() { + if (query.length() == 0) { + updateSearchResults(new ArrayList(), new ArrayList()); + return; } - resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q)); - resultArray.add(user); - } - } + long time = System.currentTimeMillis(); + ArrayList resultArray = new ArrayList(); + ArrayList resultArrayNames = new ArrayList(); + String q = query.toLowerCase(); - updateSearchResults(resultArray, resultArrayNames); + for (TLRPC.TL_contact contact : contactsCopy) { + TLRPC.User user = MessagesController.Instance.users.get(contact.user_id); + if (user.first_name.toLowerCase().startsWith(q) || user.last_name.toLowerCase().startsWith(q)) { + if (user.id == UserConfig.clientUserId) { + continue; + } + resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q)); + resultArray.add(user); + } + } + + updateSearchResults(resultArray, resultArrayNames); + } + }); } }); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index 259926654..f13b3c795 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -132,7 +132,7 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen ApplicationLoader.fragmentsStack.add(fragment); } - handleIntent(getIntent(), false); + handleIntent(getIntent(), false, savedInstanceState != null); } @SuppressWarnings("unchecked") @@ -164,7 +164,7 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen getSupportActionBar().hide(); } - private void handleIntent(Intent intent, boolean isNew) { + private void handleIntent(Intent intent, boolean isNew, boolean restore) { boolean pushOpened = false; Integer push_user_id = 0; @@ -179,7 +179,7 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen imagesPathArray = null; documentsPathArray = null; - if (intent != null && intent.getAction() != null) { + if (intent != null && intent.getAction() != null && !restore) { if (Intent.ACTION_SEND.equals(intent.getAction())) { boolean error = false; String type = intent.getType(); @@ -282,7 +282,7 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen } } - if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) { + if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0 && !restore) { int chatId = getIntent().getIntExtra("chatId", 0); int userId = getIntent().getIntExtra("userId", 0); int encId = getIntent().getIntExtra("encId", 0); @@ -373,7 +373,7 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - handleIntent(intent, true); + handleIntent(intent, true, false); } @Override @@ -750,8 +750,12 @@ public class LaunchActivity extends ActionBarActivity implements NotificationCen fTrans.setCustomAnimations(R.anim.scale_in, R.anim.no_anim); } } - fTrans.replace(R.id.container, fragment, tag); - fTrans.commitAllowingStateLoss(); + try { + fTrans.replace(R.id.container, fragment, tag); + fTrans.commitAllowingStateLoss(); + } catch (Exception e) { + FileLog.e("tmessages", e); + } ApplicationLoader.fragmentsStack.add(fragment); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java index ea2ef46e1..40ee559c2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivity.java @@ -141,6 +141,9 @@ public class LoginActivity extends ActionBarActivity implements SlideView.SlideV @Override public void needShowAlert(String text) { + if (text == null) { + return; + } ShowAlertDialog(LoginActivity.this, text); } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java index 4bdd64574..1b28be738 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LoginActivityPhoneView.java @@ -264,6 +264,7 @@ public class LoginActivityPhoneView extends SlideView implements AdapterView.OnI ignoreOnTextChange = true; codeField.setText(countriesMap.get(name)); countryButton.setText(name); + countryState = 0; } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 5152cf12b..add8cbf94 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -270,6 +270,9 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter Utilities.RunOnUIThread(new Runnable() { @Override public void run() { + if (parentActivity == null) { + return; + } SharedPreferences.Editor editor = preferences.edit(); editor.putInt("support_id", res.user.id); SerializedData data = new SerializedData(); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Views/TimerButton.java b/TMessagesProj/src/main/java/org/telegram/ui/Views/TimerButton.java new file mode 100644 index 000000000..1a4cb5b2f --- /dev/null +++ b/TMessagesProj/src/main/java/org/telegram/ui/Views/TimerButton.java @@ -0,0 +1,117 @@ +/* + * This is the source code of Telegram for Android v. 1.3.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.ui.Views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.util.AttributeSet; +import android.view.View; + +import org.telegram.messenger.FileLog; +import org.telegram.messenger.R; +import org.telegram.messenger.Utilities; + +public class TimerButton extends View { + + private static Drawable emptyTimerDrawable; + private static Drawable timerDrawable; + private static TextPaint timePaint; + private StaticLayout timeLayout; + private float timeWidth = 0; + private int timeHeight = 0; + private int time = 0; + + private void init() { + if (emptyTimerDrawable == null) { + emptyTimerDrawable = getResources().getDrawable(R.drawable.header_timer); + timerDrawable = getResources().getDrawable(R.drawable.header_timer2); + timePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG); + timePaint.setTextSize(Utilities.dp(10)); + timePaint.setColor(0xffd7e8f7); + timePaint.setTypeface(Typeface.DEFAULT_BOLD); + } + + setBackgroundResource(R.drawable.bar_selector); + } + + public TimerButton(Context context) { + super(context); + init(); + } + + public TimerButton(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public TimerButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + public void setTime(int value) { + time = value; + + String timeString = null; + if (time == 2) { + timeString = getResources().getString(R.string.ShortMessageLifetime2s); + } else if (time == 5) { + timeString = getResources().getString(R.string.ShortMessageLifetime5s); + } else if (time == 60) { + timeString = getResources().getString(R.string.ShortMessageLifetime1m); + } else if (time == 60 * 60) { + timeString = getResources().getString(R.string.ShortMessageLifetime1h); + } else if (time == 60 * 60 * 24) { + timeString = getResources().getString(R.string.ShortMessageLifetime1d); + } else if (time == 60 * 60 * 24 * 7) { + timeString = getResources().getString(R.string.ShortMessageLifetime1w); + } else { + timeString = "c"; + } + + timeWidth = timePaint.measureText(timeString); + try { + timeLayout = new StaticLayout(timeString, timePaint, (int)Math.ceil(timeWidth), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); + timeHeight = timeLayout.getHeight(); + } catch (Exception e) { + timeLayout = null; + FileLog.e("tmessages", e); + } + + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); + Drawable drawable = null; + if (time == 0) { + drawable = timerDrawable; + } else { + drawable = emptyTimerDrawable; + } + + int x = (width - drawable.getIntrinsicWidth()) / 2; + int y = (height - drawable.getIntrinsicHeight()) / 2; + drawable.setBounds(x, y, x + drawable.getIntrinsicWidth(), y + drawable.getIntrinsicHeight()); + drawable.draw(canvas); + + if (time != 0 && timeLayout != null) { + canvas.translate((width - timeWidth) / 2, (height - timeHeight) / 2 + Utilities.dp(1)); + timeLayout.draw(canvas); + } + } +} diff --git a/TMessagesProj/src/main/res/drawable-hdpi/header_timer.png b/TMessagesProj/src/main/res/drawable-hdpi/header_timer.png new file mode 100755 index 0000000000000000000000000000000000000000..d9ad068b2d84dc95933de6fcffa1a3fe0adf23cf GIT binary patch literal 1032 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 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-mdpi/header_timer2.png b/TMessagesProj/src/main/res/drawable-mdpi/header_timer2.png new file mode 100755 index 0000000000000000000000000000000000000000..d1db00048b0a2064ab9763099c185016a7128434 GIT binary patch literal 715 zcmV;+0yO=JP)&Ev~6PP)NLCh>*Ly6KJ zi`CL8qB=xcO04Pk@hxMTdHde(5b5#rW_G^${`}^BzxP%*3_~k5?w&t2)zQ&ZD`i)u z{qp!vpppdM0fRx;b>%pzt{?%g>Dps`n0xuTaQ%(7?l7S1njeUm?pJ_z(|rx5dRG~M zQy->fUq4Tp7 zU>?ZZeS(q+Ab1>847dkY;pA9gt8o%rKnwqz2ikyF!HLofAOj2|_=k;+!K+)hVS>8k8t4MXfV3(D+W-X(+65O43dHXOfiEC#*Q$;Q zaP>Vv0*)Tb6$-pd>n6dUWLiZD!#p3jpteOHA(aIBXw{>FY^BlR;}+8s(65pJ3C)9x zd(OR$cnOuzXA&71p)xF0>lPEz0uSswcvg^MfGBHrk%0zQ!h$RVL|MQt;}VtHvEyZV z&Z?||H0%423)PRXD5X^rpdE}VkGhaRjD01g69Bc;0eiqCD4Z=fGTsd_i%F-J7VQP} z32ykPHOT#}61<1^66%0%Cq=CiEHK)^CIC9!T*6^gA^13^GrpY?$+^sVfGRm+A)zfc z;zTEGY3Ex97PysXV4HE{L_~eO$;UC;)pDH7E8mlFjRM7U;Xbf|;7=uwdNK)^5}^Q# x+*;Naz2a6&A#hImtf`W~|39NYnZUOI0{|TC$Q2C4^@#ug002ovPDHLkV1h83I+Oqa literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/header_timer.png b/TMessagesProj/src/main/res/drawable-xhdpi/header_timer.png new file mode 100755 index 0000000000000000000000000000000000000000..41d06be9f6f9dea993e26eaed37fa01df16a0f21 GIT binary patch literal 1281 zcmV+c1^)VpP)p=A~ zua5z}JaThX!pIjT(*9eH#|S9yO1_?fIks0C;R){AG2z#ibG2kmz< ziMLjGr_m_^uBHIYzX6vv@rc4!4SR1LLQ~?Q5>b8tS!P)DZ3;m7GF=TM&(Uw z*bhvKXB&ZfU-JMcPu~6mkjamxSou-IA0a3C4oDYHa4-1|zbv3tC{Lz$$VcT(Cs`xz z$^Sg!kgAsejD7{DrKU7-+UmEw;k4M4Le4t%P65u@3;C8teV5F{e3lJLicEee2h(6) ziv>XWa-lrQR^Mx91+ALB@&Z3@&%K7i)|sA!*Ztzgwh?+C!?r*V2}N{1a&(R*ws1$vT>9BwjB?0LU(7J}~OOy*L&k2yF?I@TZ4~q8a%OK|>a{Ff&0&*1x7&IBtO+cpjJsCg(WS=tN2%}yTkgn9yh@fv{^3m~~5b8chl-hkiI zrZ~T=c9eHS06x&CI2m$4wMjDlN^w7czS&-+aas#pRGi;^pv*_*N%0nOPg&ntCk;6w z08CR-bY487jfoe^i0BM?T}rXjh(7iEMgWuW0GD>97$FiaX;hvLU(h)rxi;B}zBD^+ z(Czj(nO&zvC%ZUIdRgeavLKgyQJtHHT@k<)7ad?wN1&R+(-oJcGewzez!zibb{xq) zpvtb-cbx}V!xrXg*5!0AsGF}d2`GJl+bg%I^GV^;X2N54H&`bDBn8IeE^Waw zuam`mHWrV$QSvm#&vRMv0%Pgcn^i@6N)~28BfyjfHvepoe83b>vv#E*b4`G*qq6N> zC>=Kz&j~pxn9PHcCxNZNT|>i0tnQPdrlj$FHg}gPZ^$?P9;`B_#yn4tUPe3tN1R*& r{&xxg!$e3xNI*zHNWfZ_UjhsO7M4snBxSVU00000NkvXXu0mjf$m}&0 literal 0 HcmV?d00001 diff --git a/TMessagesProj/src/main/res/drawable-xhdpi/header_timer2.png b/TMessagesProj/src/main/res/drawable-xhdpi/header_timer2.png new file mode 100755 index 0000000000000000000000000000000000000000..02ce1d00b23be637edcef6089cc1938e41a33f15 GIT binary patch literal 1329 zcmV-11zvwF$GL~H>u0WkqF0bxlZSE;b-44s_c@Ry(3?UpWH z7+XN7VbJ9$FE+{K!=z)C#l#3&gV~U_J0SfcCqX z#LF|h)8v%^UsC|)--t`Qctl}qH+ydrLQ~?F5>dVZ#dcT>Z3;m78eFc5M<0PIgUZ|1 zuo?Iyo-G3EL(K!AJbC+9KoLLs%F2&e;Rrd&7eIk>=pczMt!Z! z#561*qol%KmcsIt6q)=`38ulM5etCwwL*E4GhUPrP|_R%ZAo#YFg67aNIrmv5vXYI zajoFg$KVLS=;v{IYD=e%shJY=fh_QjcvOwPrc7ACCM5ysiO{-+>`Rghs=x`5rR@lq z{}>hR(U$?vMdV-wPC%Ks?~mZ>mh4lh2?ACs4lrsmY?^=~asMgk-ixfz32rh)*{4D{ z!er0{6e#s~nBpc=Ogkh=#%h6N1gAjKOCNOzNKa!8Ugc)M@8&zK63r?)`vMeZ3PsB4 zOOX3F;L;GF1;{?7-6m-|7U0RthM5j{iBdWQ40=g4LWzG_k6)>*7X(g#toe)a(Xt3} zP^tKU*Cq()Q%c``5h6hCi|chstpyQ``U6oBQsPl!d0dVTP$(jO5Rs`L4zSA9dVnlD zi!C3ku>s0)B`kMpMI)a}V&lLnzUD$`DQrm0|KCe=yhdQe0!U8EoZFhZHxRb8E6(qn zj`E%ezz6yiCqoYCK#oj*tN8sEebZi~@mdRCsS zMJL1~+L(BxjEKpQ*R2#gP3Tj9Xaq0`RG@Sy#R!pb+Mx1u_=3&}$+gKY^rgjXgMPQi z$?UouI@!%(GRQ*bi37Rhiw^o}*cSm@anS(=bp&>CcslE|bfzeC9(Zp}-Hs!<4s6r) z`o8l3hrGbP-RWSSc3n>Af_nJ+-G$OyxV>73I-e9iVkbPhyTK+2ASt)9yR_xgyiOML z&dMHhqvUCnpRZ)a%dM$fZ%!3ygDlLVMu07iZ2rpv@&R9Ynsq1znQsD29hL3iLTSI1 zJtyR)V6qQN9tM^J*DM1Yv8GRo+LFif+1_2IyrIncd$7u$8k0OddKqaKjySgj{O=O~ n!$eF#Oh8OPOu$^0UjhsO+D>&WN_uY5jz2EPg z@BGep{wy;$Hzxwjp~ln?-~H>M@t0rsM4jVm%$6RgI$3=e=~eLw1|4nT>c`+_R1BYqHt6 z?_4bznQF&`Deu5YKqb+USpM)nrB zAF0&_s|X;6G}2)k8A@_jT=FvITL3ut0*t;t$=6?Hl1nI(ogn)-YHjd>0CGe#9S)N1 zB&)5o_GF?r!Gm1VKU2LH*$%Ej{t`eAYob3t;Sz6K@(i`%G}%$I8Q%ziv-gr66Va1q zi0R{Ox7a}oQO}KO8@Crv>Jm%bHe5@B024A4&KV->h;S`l`ZC!tJ0cFCZeAsOovgiz z=gpG+Om>Rw1MSK#=N0eruSUSzrC0Lt`yJk^J%LAX{I8MamiOX zAI^RoI-jgxqw`DQ3-SDEvIArfD!9jt=4VQc0L1$*$UahhK1FtftcC2HB)03sEECbf zA!R1Uch6KvobeEJk*r7Y89GVZ$^JH^bRd7fjnGEiBU>jV2|n9H(8)5+hrHWl(D?v* z$1iewQx1njLfO?M3D{5ez9I~~$-PY*0LQ+@J>YVUuW*R~bnib^IDdkEBrSLAteOocefkZ^gA2pAFK@mUotJd6{tSrLAG z!v#g#R~4#CN9XT9#5n9fVtzb!A)aCx=M#{!{!MbeCA+3>!c-0Dk~lx_q4R;;ijG;% zWC&U>IX5c&#Wh9EFh)SDqNMnWJCbu*lLTZVKBO-ACe`2SzpY2QMi@&kBeDr2%ye~>|s`l2-C|QM!oJE zu1KInGfNSH5g?mX)#xz+vMKLHiU!6ADCm}DmLnU{2dNP-E;-k>%m~PvBtX_N z>GGI>&WMFDH3Du)&UJgNfI1`kATDbSotG6=MWY>yMtHEJfSvApx?{ zuLAkNXd?`aNY2T|iCqsrG6F7}?uY@hu~N*G*z6Gjy^3_hunh!^E5guWPn?gMEL&)T zVb@U`2mtyOa?}S!gm5YwbopFpNIdFVqz85ICx@QJ672;cB5xgI8xVHxO5O|N12aFS zY+0lS2g_!UVdmI=hfDuqiSvQ8Leq?Ioy%0A6#kGrFy`7nFWeg|#&naPBx(+$Vpy~{ z$x_^k8c=fdK81uE5((te69i^If2EMpM})=|^SYNP4J))U5_A_G=^NCt^P3cDhkl(u zmc$~x_k?`#8oQSCIUqTQ6zUB%e236HAFzQc0R8=^dwC{sj(VVe721hh7F@00!Ze`PXE0k!c*q2AsM%agWgG+s1nNWz5 zzeyy##5Ro$n@WqG&y~4mBiZj_ek*_^iNJLFZ@A`lmbvZ{J3sMhmT7HS2I+bamfQWEo2vI>nt=2?8b-IIULvKVvOh!TnGp&vMC+9dexAIhTO} zeC(XN%TT`n`u?b>Vse#B+g7SdGc-1`i)rqng_ZBmu}n6)n%|axVN%-C2K#zqFS#UE zSt5gZnjQbLsB%7!%Z+fH#(E<+q8lnuL`816$M`ss#6!BccXU+T5RdL!1=ZBbNAz5q zBr2xBwP##7vQA zqu2Bft^h;0SO8I5+|v0T$ys zl6j9ZLh`61KrdeLacw)vN=JZ$Bft^h;0SO8=)tg$Yj2RuCgG*35=6jDe5@h)TX9V$ zX+5B7Id}j3bg)68+~X_kAt2~W1VJVv*3#iw)hH@`-c5(wB)90Ag2&t9o=qfQlN9{E zb67GmVaJ4n60p?Ik}_9wLWKmZm85a0?`9q}K$9fbNG?O@I}?)Yo9S?sBn#3=-eUg| zTW_$608&UT9k!65CAaw{FH_kAK*8rB^!+KmeuPObp-6I^$DHP8ij4r+`_D)|P<%c^a+sunqLQxXke2v z=i|Gl0}^N41YIEMRD6acsf*-KLy-=`-)}wmh`S_fgrvY{y9qi`LHP*pHW*Ysfb951 z_BWMqP()N+jgo+UB=0KBz?+5pafjEUjiSHwaYyc}JN39=~)LcIUE z0fkc= z7Rd#ke^e1-ue6DP&63t%Swp~f$vF)FO{Rc=8yrNGW0x%iz$SJm z!nw5Iq~sh1ep+lGpi?|NoQSd1e2NGd65`=m6&!dNCt#z({G<)%6~510B1TCVV(-5s zG5Av)#%TvXuIiyPndl}bqGbJx#F9Y0P_HJ2<2CGdGAS+1CCZsiY3;zYRSs!|cmH=kGocW@Nc3zKe_?-}3u!aCi zJ_?E#sut-*R`(6VnxKM5zn~lcX}CvG2+zxymU_1tQv}E+Rn^8oz|N4)9?y-jiaDR( zlTCRqk~IiSK-fG0_5M0ZSQd39^b3}_kyGfvm5OGpCpCJB%wCT%Hp z!mS<~VQd84l$`5GaRk)rQ3tURFe-`r;e?x0NI-`o#J+5d0P_CG4965%X4)Vd{hA~l z7$mF+es}iqLdpiU?5EjRtKXU|eB_4y8o-=*hB$CKz@d zwt)bkR}qe;AtHh~l?}RlDl`-xbxlu4bnv?*D@KU+g79B+u>~+YcO>tH-~%&1W^9?B z4h73*k74H6z67`aLlWf!XN0C1-#Qm)AX4~E^1vu~JueK86$b#On_Q7Zb0`90(cTn? z;#Ty4lA`x2Lbw4DK`lK(VD|G@ictEn(70k=_ZqQ5MQn@$-GzkY2Gy+mIz`!`SLcsK zu}JS7A+ObA*OHzDgq#D4=nXx5tI#~;8U+E9{Gc-IvY3P{w|v!lV3=3!lg^@As0}l8 zO!3)neo>pojxoRKs!-2%KBwFCL`^`+S@kPE+rkk>y#>l|XXUFZxT9=VMbZcWu+^8U zT#HQkXC}iG&>Mdg>g~<2JZY2gKXz;l0Z7oW5r%3vk{UKgKZuZ%Tz#U2TYXOjQ;3$o zK}5X7HjWLON{gP)R=8$8$**EzD}X48z;ya=xaYN2xb7k=Kk{joacxb{|mlmw^F% z?3}yZP+oxe{)h-MxhhH9R;pSvVr*0w + + + + + + \ No newline at end of file diff --git a/TMessagesProj/src/main/res/menu/chat_enc_menu.xml b/TMessagesProj/src/main/res/menu/chat_enc_menu.xml new file mode 100644 index 000000000..44a62e3ed --- /dev/null +++ b/TMessagesProj/src/main/res/menu/chat_enc_menu.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + \ 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 1f82bfe3b..de1e0c829 100644 --- a/TMessagesProj/src/main/res/values-de/strings.xml +++ b/TMessagesProj/src/main/res/values-de/strings.xml @@ -240,7 +240,7 @@ SUPPORT Chat-Hintergrundbild NACHRICHTEN - Mit Enter]]> senden + Mit Enter senden Alle anderen Sitzungen beenden AUTOMATISCHER BILDERDOWNLOAD Gruppen diff --git a/TMessagesProj/src/main/res/values-nl/strings.xml b/TMessagesProj/src/main/res/values-nl/strings.xml new file mode 100644 index 000000000..b116d3f8b --- /dev/null +++ b/TMessagesProj/src/main/res/values-nl/strings.xml @@ -0,0 +1,354 @@ + + + + + + Telegram + + + Uw telefoon + Bevestig uw landcode\nen voer uw telefoonnummer in. + Kies een land + Onjuist landcode + + + Uw code + We hebben een sms met een activatiecode verzonden naar uw telefoon + We bellen u over + We bellen u… + Code + Verkeerde nummer? + + + Uw naam + Voer uw voor- en achternaam in + + Voornaam (verplicht) + Achternaam (optioneel) + Registratie annuleren + + + Gesprekken + Zoeken + Nieuwe berichten + Instellingen + Contacten + Nieuwe groep + gisteren + Geen resultaten + Nog geen gesprekken… + Tik op de opstelknop rechtsbovenin\nom een gesprek te beginnen\nof ga naar de contactenlijst. + Wachten op netwerk… + Bezig met verbinden… + Bezig met bijwerken… + Nieuw privégesprek + Wachten tot %s online komt… + Privégesprek geannuleerd + Encryptiesleutels uitwisselen… + %s neemt nu deel aan het privégesprek. + U neemt nu deel aan het privégesprek. + Geschiedenis wissen + Verwijderen en verlaten + Verborgen naam + Kies een gesprek + + + Kies een bestand + Vrij: %1$s van %2$s + Onbekende fout + Toegangsfout + Nog geen bestanden… + Bestanden mogen maximaal %1$s zijn + Geen opslagmedium gevonden + USB-overdracht actief + Interne opslag + Externe opslag + Systeemmap + SD-kaart + + + onzichtbaar + aan het typen… + Bijvoegen + is aan het typen… + zijn aan het typen… + en nog %d personen + Hebt u een vraag\nover Telegram? + Foto maken + Galerij + Locatie + Video + Document + Nog geen berichten hier… + Foto bekijken + Locatie bekijken + Video afspelen + Doorgestuurd bericht + Van + Niets recents + deelnemers + Bericht + Typ een bericht + Downloaden + Geselecteerd: + MIJN CONTACTGEGEVENS DELEN + TOEVOEGEN AAN CONTACTEN + %s heeft u uitgenodigd voor een privégesprek. + U hebt %s uitgenodigd voor een privégesprek. + Privégesprekken: + gebruiken end-to-endversleuteling + laten geen sporen achter op onze server + verlopen automatisch + staan doorsturen niet toe + %1$d nieuw bericht + %1$d nieuwe berichten + U bent verwijderd uit deze groep + U hebt deze groep verlaten + Deze groep verwijderen + SLEEP OM TE ANNULEREN + + + Privégesprek aangevraagd + Privégesprek gestart + %1$s heeft de verlooptijd ingesteld op %2$s + U hebt de verlooptijd ingesteld op %1$s + %1$s heeft de verlooptijd uitgeschakeld + U hebt de verlooptijd uitgeschakeld + 2 seconden + 5 seconden + 1 minuut + 1 uur + 1 dag + 1 week + U hebt een nieuw bericht + %1$s: %2$s + %1$s heeft u een bericht gestuurd + %1$s heeft u een foto gestuurd + %1$s heeft u een video gestuurd + %1$s heeft een contact met u gedeeld + %1$s heeft u een locatie gestuurd + %1$s heeft u een document gestuurd + %1$s heeft u een geluidsbestand gestuurd + %1$s @ %2$s: %3$s + %1$s heeft een bericht gestuurd naar de groep %2$s + %1$s heeft een foto gestuurd naar de groep %2$s + %1$s heeft een video gestuurd naar de groep %2$s + %1$s heeft een contact gedeeld met de groep %2$s + %1$s heeft een locatie gestuurd naar de groep %2$s + %1$s heeft een document gestuurd naar de groep %2$s + %1$s heeft een geluidsbestand gestuurd naar de groep %2$s + %1$s heeft u uitgenodigd voor de groep %2$s + %1$s heeft de naam van de groep %2$s gewijzigd + %1$s heeft de afbeelding van de groep %2$s gewijzigd + %1$s heeft %3$s uitgenodigd voor de groep %2$s + %1$s heeft %3$s verwijderd uit de groep %2$s + %1$s heeft u verwijderd uit de groep %2$s + %1$s heeft de groep %2$s verlaten + %1$s heeft nu Telegram! + %1$s,\nEr is op uw account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls u dit niet was, kunt u alle sessies beëindigen via de instellingen.\n\nHet Telegram-team + %1$s heeft zijn/haar profielfoto gewijzigd + + + Kies een contact + Nog geen contacten + Hoi, zullen we overstappen op Telegram? http://telegram.org/dl2 + vandaag om + gisteren om + om + online + offline + laatst gezien: + laatst gezien: + Vrienden uitnodigen + + + Bericht verzenden naar… + Groepsnaam... + DEELNEMER + Groepsnaam + DEELNEMERS + ALLE CONTACTEN + + + GROEPSNAAM INSTELLEN + Gedeelde media + Groepsinformatie + GEDEELDE MEDIA + INSTELLINGEN + Deelnemer toevoegen + Groep verwijderen en verlaten + Meldingen + Verwijderen uit groep + + + Delen + Toevoegen + Blokkeren + Bewerken + Verwijderen + THUIS + MOBIEL + WERK + OVERIG + ALGEMEEN + Contactinformatie + TELEFOON + Privégesprek starten + Er is een fout opgetreden. + Kan geen privégesprek starten met %1$s.\n\n%2$s gebruikt een oudere versie van Telegram en moet eerst een update installeren. + Privégesprek + Encryptiesleutel + Verlooptijd + Uit + 2s + 5s + 1m + 1u + 1d + 1w + Deze afbeelding is een weergave van de encryptiesleutel voor dit privégesprek met ]]>%1$s]]>.
]]>Als deze afbeelding er hetzelfde uitziet als op de telefoon van ]]>%2$s]]>, is uw gesprek 200%% beveiligd.
]]>Bezoek telegram.org voor meer informatie.
+ + + Alle meldingsinstellingen herstellen + Tekstgrootte berichten + Een vraag stellen + Animaties inschakelen + Deblokkeren + Houd een gebruiker ingedrukt om hem/haar te deblokkeren. + Nog geen geblokkeerde gebruikers + UW TELEFOONNUMMER + BERICHTMELDINGEN + Waarschuwing + Voorbeeld van berichten + GROEPSMELDINGEN + Geluid + IN-APP MELDINGEN + In-app geluiden + In-app trillen + Trillen + In-app voorbeelden + RESETTEN + Alle meldingen resetten + Alle aangepaste meldingsinstellingen ongedaan maken voor alle contacten en groepen + Meldingen en geluiden + Geblokkeerde gebruikers + Inkomende foto\'s opslaan + Uitloggen + UW VOOR- EN ACHTERNAAM + Geen geluid + Standaard + ONDERSTEUNING + Achtergrond gesprekken + BERICHTEN + Verzenden met Enter + Alle andere sessies beëindigen + FOTO\'S AUTOMATISCH DOWNLOADEN + Groepen + Privégesprekken + GEBEURTENISSEN + Contact lid geworden van Telegram + + + Nog geen media gedeeld + Downloaden annuleren + + + Mijn locatie + Kaart + Satelliet + Hybride + m hiervandaan + km hiervandaan + Locatie verzenden + Locatie delen + + + Alle media weergeven + Opslaan in galerij + van + Galerij + + + Volgende + Vorige + Gereed + Openen + Annuleren + Toevoegen + Bewerken + Verzenden + Bellen + Kopiëren + Verwijderen + Doorsturen + Opnieuw proberen + Van camera + Uit galerij + Foto verwijderen + Foto openen + Instellen + OK + + + un1 heeft un2 verwijderd + un1 heeft de groep verlaten + un1 heeft un2 toegevoegd + un1 heeft de groepsafbeelding verwijderd + un1 heeft de groepsafbeelding gewijzigd + un1 heeft de groepsnaam gewijzigd naar un2 + un1 heeft de groep gemaakt + U hebt un2 verwijderd + U hebt de groep verlaten + U hebt un2 toegevoegd + U hebt de groepsafbeelding verwijderd + U hebt de groepsafbeelding gewijzigd + U hebt de groepsnaam gewijzigd naar un2 + U hebt de groep gemaakt + un1 heeft u verwijderd + un1 heeft u toegevoegd + Dit bericht wordt niet ondersteund in uw versie van Telegram. + Foto + Video + Locatie + Contact + Document + Geluidsbestand + U + + + Ongeldig telefoonnummer + Code verlopen. Log opnieuw in. + Te veel pogingen. Probeer het later opnieuw. + Ongeldige code + Ongeldige voornaam + Ongeldige achternaam + Bezig met laden… + U hebt geen mediaspeler. Installeer een mediaspeler om door te gaan. + U hebt geen applicaties die het MIME-type \'%1$s\' ondersteunen. Installeer een geschikte applicatie om door te gaan. + Deze gebruiker heeft nog geen Telegram. Wilt u een uitnodiging sturen? + Weet u het zeker? + Contact toevoegen? + %1$s toevoegen aan de groep? + Berichten doorsturen naar %1$s? + Dit gesprek verwijderen? + + + Telegram + Snel + Gratis + Veilig + Krachtig + In de cloud + Privé + Welkom in het tijdperk van snel en veilig chatten + Telegram]]> bezorgt berichten sneller]]>dan elke andere app + Telegram]]> is altijd gratis. Geen advertenties.]]>Geen abonnementskosten + Telegram]]> beveiligt uw berichten]]>tegen hackers + Telegram]]> heeft geen beperkingen op de grootte]]>van uw media en gesprekken + Telegram]]> biedt toegang tot uw berichten]]>vanaf meerdere apparaten + Telegram]]> berichten zijn sterk versleuteld]]>en kunnen zichzelf vernietigen + Begin nu met chatten + + + CACHE_TAG +
\ No newline at end of file