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 000000000..d9ad068b2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/header_timer.png differ diff --git a/TMessagesProj/src/main/res/drawable-hdpi/header_timer2.png b/TMessagesProj/src/main/res/drawable-hdpi/header_timer2.png new file mode 100755 index 000000000..ed8261f29 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-hdpi/header_timer2.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/header_timer.png b/TMessagesProj/src/main/res/drawable-ldpi/header_timer.png new file mode 100755 index 000000000..4d386984c Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-ldpi/header_timer.png differ diff --git a/TMessagesProj/src/main/res/drawable-ldpi/header_timer2.png b/TMessagesProj/src/main/res/drawable-ldpi/header_timer2.png new file mode 100755 index 000000000..12b1fa8b7 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-ldpi/header_timer2.png differ diff --git a/TMessagesProj/src/main/res/drawable-mdpi/header_timer.png b/TMessagesProj/src/main/res/drawable-mdpi/header_timer.png new file mode 100755 index 000000000..c20e092c2 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/header_timer.png differ 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 000000000..d1db00048 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-mdpi/header_timer2.png differ 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 000000000..41d06be9f Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/header_timer.png differ 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 000000000..02ce1d00b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xhdpi/header_timer2.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/header_timer.png b/TMessagesProj/src/main/res/drawable-xxhdpi/header_timer.png new file mode 100755 index 000000000..859aa5c7b Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/header_timer.png differ diff --git a/TMessagesProj/src/main/res/drawable-xxhdpi/header_timer2.png b/TMessagesProj/src/main/res/drawable-xxhdpi/header_timer2.png new file mode 100755 index 000000000..9376a7b93 Binary files /dev/null and b/TMessagesProj/src/main/res/drawable-xxhdpi/header_timer2.png differ diff --git a/TMessagesProj/src/main/res/layout/chat_header_enc_layout.xml b/TMessagesProj/src/main/res/layout/chat_header_enc_layout.xml new file mode 100644 index 000000000..66a9281eb --- /dev/null +++ b/TMessagesProj/src/main/res/layout/chat_header_enc_layout.xml @@ -0,0 +1,14 @@ + + + + + + + \ 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