Update to 1.3.30

This commit is contained in:
DrKLO 2014-03-10 13:27:49 +04:00
parent 8ecb9e97c9
commit 01103c6e94
30 changed files with 901 additions and 146 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.telegram.messenger"
android:versionCode="185"
android:versionName="1.3.26">
android:versionCode="194"
android:versionName="1.3.30">
<supports-screens android:anyDensity="true"
android:smallScreens="true"
@ -25,7 +25,7 @@
<uses-feature android:name="android.hardware.screen.PORTRAIT" android:required="false" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--<uses-permission android:name="android.permission.RECORD_AUDIO" />-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
@ -50,7 +50,6 @@
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.google.android.gallery3d.permission.GALLERY_PROVIDER" />
<permission android:name="org.telegram.messenger.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<permission android:name="org.telegram.messenger.permission.C2D_MESSAGE" android:protectionLevel="signature" />
@ -65,9 +64,9 @@
android:largeHeap="true">
<!--release-->
<!--<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />-->
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyA-t0jLPjUt2FxrA8VPK2EiYHcYcboIR6k" />
<!--debug-->
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCTNmNqbWovP9ETcAob98YlrfOQEAC0CJ4" />
<!--<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCTNmNqbWovP9ETcAob98YlrfOQEAC0CJ4" />-->
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
<activity

View file

@ -501,16 +501,16 @@ public class ContactsController {
Utilities.RunOnUIThread(new Runnable() {
@Override
public void run() {
// if (ConnectionsManager.DEBUG_VERSION) {
// FileLog.e("tmessages", "need delete contacts");
// for (HashMap.Entry<Integer, Contact> 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<Integer, Contact> 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<TLRPC.User> toDelete = new ArrayList<TLRPC.User>();
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<TLRPC.TL_inputPhoneContact> finalToImport = new ArrayList<TLRPC.TL_inputPhoneContact>();
@ -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<TLRPC.TL_contact> cArr = new ArrayList<TLRPC.TL_contact>();
for (TLRPC.TL_importedContact c : res.imported) {
@ -740,6 +745,8 @@ public class ContactsController {
}
}
final HashMap<Integer, TLRPC.User> usersDict = new HashMap<Integer, TLRPC.User>();
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<TLRPC.TL_contact>() {
@ -796,8 +814,8 @@ public class ContactsController {
Collections.sort(contactsArr, new Comparator<TLRPC.TL_contact>() {
@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<String, TLRPC.TL_contact> 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<TLRPC.TL_inputPhoneContact> contactsParams = new ArrayList<TLRPC.TL_inputPhoneContact>();
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

View file

@ -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) {

View file

@ -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() {

View file

@ -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;
}

View file

@ -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<TLRPC.User>(), new ArrayList<CharSequence>());
return;
}
long time = System.currentTimeMillis();
ArrayList<TLRPC.User> resultArray = new ArrayList<TLRPC.User>();
ArrayList<CharSequence> resultArrayNames = new ArrayList<CharSequence>();
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<TLRPC.TL_contact> contactsCopy = new ArrayList<TLRPC.TL_contact>();
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<TLRPC.User>(), new ArrayList<CharSequence>());
return;
}
resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q));
resultArray.add(user);
}
}
long time = System.currentTimeMillis();
ArrayList<TLRPC.User> resultArray = new ArrayList<TLRPC.User>();
ArrayList<CharSequence> resultArrayNames = new ArrayList<CharSequence>();
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);
}
});
}
});
}

View file

@ -13,6 +13,7 @@ import android.graphics.drawable.Drawable;
import android.view.View;
public class BaseCell extends View {
public BaseCell(Context context) {
super(context);
}

View file

@ -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();
}
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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<TLRPC.User>(), new ArrayList<CharSequence>());
return;
}
long time = System.currentTimeMillis();
ArrayList<TLRPC.User> resultArray = new ArrayList<TLRPC.User>();
ArrayList<CharSequence> resultArrayNames = new ArrayList<CharSequence>();
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<TLRPC.TL_contact> contactsCopy = new ArrayList<TLRPC.TL_contact>();
contactsCopy.addAll(ContactsController.Instance.contacts);
Utilities.globalQueue.postRunnable(new Runnable() {
@Override
public void run() {
if (query.length() == 0) {
updateSearchResults(new ArrayList<TLRPC.User>(), new ArrayList<CharSequence>());
return;
}
resultArrayNames.add(Utilities.generateSearchName(user.first_name, user.last_name, q));
resultArray.add(user);
}
}
long time = System.currentTimeMillis();
ArrayList<TLRPC.User> resultArray = new ArrayList<TLRPC.User>();
ArrayList<CharSequence> resultArrayNames = new ArrayList<CharSequence>();
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);
}
});
}
});
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -264,6 +264,7 @@ public class LoginActivityPhoneView extends SlideView implements AdapterView.OnI
ignoreOnTextChange = true;
codeField.setText(countriesMap.get(name));
countryButton.setText(name);
countryState = 0;
}
}

View file

@ -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();

View file

@ -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);
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true">
<org.telegram.ui.Views.TimerButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="48dp"
android:id="@+id/chat_timer"/>
</RelativeLayout>

View file

@ -0,0 +1,50 @@
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:sabd="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/chat_enc_timer"
sabd:showAsAction="always"
sabd:actionLayout="@layout/chat_header_enc_layout"/>
<item
android:id="@+id/chat_menu_attach"
android:icon="@drawable/ic_ab_attach"
android:title="@string/Attach"
sabd:showAsAction="always">
<menu>
<item
android:icon="@drawable/ic_attach_photo"
android:title="@string/ChatTakePhoto"
android:id="@+id/attach_photo"/>
<item
android:icon="@drawable/ic_attach_gallery"
android:title="@string/ChatGallery"
android:id="@+id/attach_gallery"/>
<item
android:icon="@drawable/ic_attach_video"
android:title="@string/ChatVideo"
android:id="@+id/attach_video"/>
<item
android:icon="@drawable/ic_ab_doc"
android:title="@string/ChatDocument"
android:id="@+id/attach_document"/>
<item
android:icon="@drawable/ic_attach_location"
android:title="@string/ChatLocation"
android:id="@+id/attach_location"/>
</menu>
</item>
<item
android:id="@+id/chat_menu_avatar"
sabd:showAsAction="always"
sabd:actionLayout="@layout/chat_header_layout"/>
</menu>

View file

@ -240,7 +240,7 @@
<string name="Support">SUPPORT</string>
<string name="ChatBackground">Chat-Hintergrundbild</string>
<string name="MessagesSettings">NACHRICHTEN</string>
<string name="SendByEnter">Mit <![CDATA[<b>Enter</b>]]> senden</string>
<string name="SendByEnter">Mit Enter senden</string>
<string name="TerminateAllSessions">Alle anderen Sitzungen beenden</string>
<string name="AutomaticPhotoDownload">AUTOMATISCHER BILDERDOWNLOAD</string>
<string name="AutomaticPhotoDownloadGroups">Gruppen</string>

View file

@ -0,0 +1,354 @@
<?xml version="1.0" encoding="utf-8"?>
<!--https://www.transifex.com/projects/p/telegram/language/nl/members/-->
<resources>
<string name="AppName">Telegram</string>
<!--signin view-->
<string name="YourPhone">Uw telefoon</string>
<string name="StartText">Bevestig uw landcode\nen voer uw telefoonnummer in.</string>
<string name="ChooseCountry">Kies een land</string>
<string name="WrongCountry">Onjuist landcode</string>
<!--code enter view-->
<string name="YourCode">Uw code</string>
<string name="SentSmsCode">We hebben een sms met een activatiecode verzonden naar uw telefoon</string>
<string name="CallText">We bellen u over</string>
<string name="Calling">We bellen u…</string>
<string name="Code">Code</string>
<string name="WrongNumber">Verkeerde nummer?</string>
<!--signup view-->
<string name="YourName">Uw naam</string>
<string name="RegisterText">Voer uw voor- en achternaam in</string>
<!--<string name="RegisterText">Set up your name and picture</string>-->
<string name="FirstName">Voornaam (verplicht)</string>
<string name="LastName">Achternaam (optioneel)</string>
<string name="CancelRegistration">Registratie annuleren</string>
<!--chats view-->
<string name="Chats">Gesprekken</string>
<string name="Search">Zoeken</string>
<string name="NewMessages">Nieuwe berichten</string>
<string name="Settings">Instellingen</string>
<string name="Contacts">Contacten</string>
<string name="NewGroup">Nieuwe groep</string>
<string name="Yesterday">gisteren</string>
<string name="NoResult">Geen resultaten</string>
<string name="NoChats">Nog geen gesprekken…</string>
<string name="NoChatsHelp">Tik op de opstelknop rechtsbovenin\nom een gesprek te beginnen\nof ga naar de contactenlijst.</string>
<string name="WaitingForNetwork">Wachten op netwerk…</string>
<string name="Connecting">Bezig met verbinden…</string>
<string name="Updating">Bezig met bijwerken…</string>
<string name="NewSecretChat">Nieuw privégesprek</string>
<string name="AwaitingEncryption">Wachten tot %s online komt…</string>
<string name="EncryptionRejected">Privégesprek geannuleerd</string>
<string name="EncryptionProcessing">Encryptiesleutels uitwisselen…</string>
<string name="EncryptedChatStartedOutgoing">%s neemt nu deel aan het privégesprek.</string>
<string name="EncryptedChatStartedIncoming">U neemt nu deel aan het privégesprek.</string>
<string name="ClearHistory">Geschiedenis wissen</string>
<string name="DeleteChat">Verwijderen en verlaten</string>
<string name="HiddenName">Verborgen naam</string>
<string name="SelectChat">Kies een gesprek</string>
<!--documents view-->
<string name="SelectFile">Kies een bestand</string>
<string name="FreeOfTotal">Vrij: %1$s van %2$s</string>
<string name="UnknownError">Onbekende fout</string>
<string name="AccessError">Toegangsfout</string>
<string name="NoFiles">Nog geen bestanden…</string>
<string name="FileUploadLimit">Bestanden mogen maximaal %1$s zijn</string>
<string name="NotMounted">Geen opslagmedium gevonden</string>
<string name="UsbActive">USB-overdracht actief</string>
<string name="InternalStorage">Interne opslag</string>
<string name="ExternalStorage">Externe opslag</string>
<string name="SystemRoot">Systeemmap</string>
<string name="SdCard">SD-kaart</string>
<!--chat view-->
<string name="Invisible">onzichtbaar</string>
<string name="Typing">aan het typen…</string>
<string name="Attach">Bijvoegen</string>
<string name="IsTyping">is aan het typen…</string>
<string name="AreTyping">zijn aan het typen…</string>
<string name="AndMoreTyping">en nog %d personen</string>
<string name="GotAQuestion">Hebt u een vraag\nover Telegram?</string>
<string name="ChatTakePhoto">Foto maken</string>
<string name="ChatGallery">Galerij</string>
<string name="ChatLocation">Locatie</string>
<string name="ChatVideo">Video</string>
<string name="ChatDocument">Document</string>
<string name="NoMessages">Nog geen berichten hier…</string>
<string name="ViewPhoto">Foto bekijken</string>
<string name="ViewLocation">Locatie bekijken</string>
<string name="ViewVideo">Video afspelen</string>
<string name="ForwardedMessage">Doorgestuurd bericht</string>
<string name="From">Van</string>
<string name="NoRecent">Niets recents</string>
<string name="Members">deelnemers</string>
<string name="Message">Bericht</string>
<string name="TypeMessage">Typ een bericht</string>
<string name="DOWNLOAD">Downloaden</string>
<string name="Selected">Geselecteerd:</string>
<string name="ShareMyContactInfo">MIJN CONTACTGEGEVENS DELEN</string>
<string name="AddToContacts">TOEVOEGEN AAN CONTACTEN</string>
<string name="EncryptedPlaceholderTitleIncoming">%s heeft u uitgenodigd voor een privégesprek.</string>
<string name="EncryptedPlaceholderTitleOutgoing">U hebt %s uitgenodigd voor een privégesprek.</string>
<string name="EncryptedDescriptionTitle">Privégesprekken:</string>
<string name="EncryptedDescription1">gebruiken end-to-endversleuteling</string>
<string name="EncryptedDescription2">laten geen sporen achter op onze server</string>
<string name="EncryptedDescription3">verlopen automatisch</string>
<string name="EncryptedDescription4">staan doorsturen niet toe</string>
<string name="OneNewMessage">%1$d nieuw bericht</string>
<string name="FewNewMessages">%1$d nieuwe berichten</string>
<string name="YouWereKicked">U bent verwijderd uit deze groep</string>
<string name="YouLeft">U hebt deze groep verlaten</string>
<string name="DeleteThisGroup">Deze groep verwijderen</string>
<string name="SlideToCancel">SLEEP OM TE ANNULEREN</string>
<!--notification-->
<string name="EncryptedChatRequested">Privégesprek aangevraagd</string>
<string name="EncryptedChatAccepted">Privégesprek gestart</string>
<string name="MessageLifetimeChanged">%1$s heeft de verlooptijd ingesteld op %2$s</string>
<string name="MessageLifetimeChangedOutgoing">U hebt de verlooptijd ingesteld op %1$s</string>
<string name="MessageLifetimeRemoved">%1$s heeft de verlooptijd uitgeschakeld</string>
<string name="MessageLifetimeYouRemoved">U hebt de verlooptijd uitgeschakeld</string>
<string name="MessageLifetime2s">2 seconden</string>
<string name="MessageLifetime5s">5 seconden</string>
<string name="MessageLifetime1m">1 minuut</string>
<string name="MessageLifetime1h">1 uur</string>
<string name="MessageLifetime1d">1 dag</string>
<string name="MessageLifetime1w">1 week</string>
<string name="YouHaveNewMessage">U hebt een nieuw bericht</string>
<string name="NotificationMessageText">%1$s: %2$s</string>
<string name="NotificationMessageNoText">%1$s heeft u een bericht gestuurd</string>
<string name="NotificationMessagePhoto">%1$s heeft u een foto gestuurd</string>
<string name="NotificationMessageVideo">%1$s heeft u een video gestuurd</string>
<string name="NotificationMessageContact">%1$s heeft een contact met u gedeeld</string>
<string name="NotificationMessageMap">%1$s heeft u een locatie gestuurd</string>
<string name="NotificationMessageDocument">%1$s heeft u een document gestuurd</string>
<string name="NotificationMessageAudio">%1$s heeft u een geluidsbestand gestuurd</string>
<string name="NotificationMessageGroupText">%1$s @ %2$s: %3$s</string>
<string name="NotificationMessageGroupNoText">%1$s heeft een bericht gestuurd naar de groep %2$s</string>
<string name="NotificationMessageGroupPhoto">%1$s heeft een foto gestuurd naar de groep %2$s</string>
<string name="NotificationMessageGroupVideo">%1$s heeft een video gestuurd naar de groep %2$s</string>
<string name="NotificationMessageGroupContact">%1$s heeft een contact gedeeld met de groep %2$s</string>
<string name="NotificationMessageGroupMap">%1$s heeft een locatie gestuurd naar de groep %2$s</string>
<string name="NotificationMessageGroupDocument">%1$s heeft een document gestuurd naar de groep %2$s</string>
<string name="NotificationMessageGroupAudio">%1$s heeft een geluidsbestand gestuurd naar de groep %2$s</string>
<string name="NotificationInvitedToGroup">%1$s heeft u uitgenodigd voor de groep %2$s</string>
<string name="NotificationEditedGroupName">%1$s heeft de naam van de groep %2$s gewijzigd</string>
<string name="NotificationEditedGroupPhoto">%1$s heeft de afbeelding van de groep %2$s gewijzigd</string>
<string name="NotificationGroupAddMember">%1$s heeft %3$s uitgenodigd voor de groep %2$s</string>
<string name="NotificationGroupKickMember">%1$s heeft %3$s verwijderd uit de groep %2$s</string>
<string name="NotificationGroupKickYou">%1$s heeft u verwijderd uit de groep %2$s</string>
<string name="NotificationGroupLeftMember">%1$s heeft de groep %2$s verlaten</string>
<string name="NotificationContactJoined">%1$s heeft nu Telegram!</string>
<string name="NotificationUnrecognizedDevice">%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</string>
<string name="NotificationContactNewPhoto">%1$s heeft zijn/haar profielfoto gewijzigd</string>
<!--contacts view-->
<string name="SelectContact">Kies een contact</string>
<string name="NoContacts">Nog geen contacten</string>
<string name="InviteText">Hoi, zullen we overstappen op Telegram? http://telegram.org/dl2</string>
<string name="TodayAt">vandaag om</string>
<string name="YesterdayAt">gisteren om</string>
<string name="OtherAt">om</string>
<string name="Online">online</string>
<string name="Offline">offline</string>
<string name="LastSeen">laatst gezien:</string>
<string name="LastSeenDate">laatst gezien:</string>
<string name="InviteFriends">Vrienden uitnodigen</string>
<!--group create view-->
<string name="SendMessageTo">Bericht verzenden naar…</string>
<string name="EnterGroupNamePlaceholder">Groepsnaam...</string>
<string name="MEMBER">DEELNEMER</string>
<string name="GroupName">Groepsnaam</string>
<string name="MEMBERS">DEELNEMERS</string>
<string name="AllContacts">ALLE CONTACTEN</string>
<!--group info view-->
<string name="EnterGroupNameTitle">GROEPSNAAM INSTELLEN</string>
<string name="SharedMedia">Gedeelde media</string>
<string name="GroupInfo">Groepsinformatie</string>
<string name="SHAREDMEDIA">GEDEELDE MEDIA</string>
<string name="SETTINGS">INSTELLINGEN</string>
<string name="AddMember">Deelnemer toevoegen</string>
<string name="DeleteAndExit">Groep verwijderen en verlaten</string>
<string name="Notifications">Meldingen</string>
<string name="KickFromGroup">Verwijderen uit groep</string>
<!--contact info view-->
<string name="ShareContact">Delen</string>
<string name="AddContact">Toevoegen</string>
<string name="BlockContact">Blokkeren</string>
<string name="EditContact">Bewerken</string>
<string name="DeleteContact">Verwijderen</string>
<string name="PhoneHome">THUIS</string>
<string name="PhoneMobile">MOBIEL</string>
<string name="PhoneWork">WERK</string>
<string name="PhoneOther">OVERIG</string>
<string name="PhoneMain">ALGEMEEN</string>
<string name="ContactInfo">Contactinformatie</string>
<string name="PHONE">TELEFOON</string>
<string name="StartEncryptedChat">Privégesprek starten</string>
<string name="CreateEncryptedChatError">Er is een fout opgetreden.</string>
<string name="CreateEncryptedChatOutdatedError">Kan geen privégesprek starten met %1$s.\n\n%2$s gebruikt een oudere versie van Telegram en moet eerst een update installeren.</string>
<string name="SecretTitle">Privégesprek</string>
<string name="EncryptionKey">Encryptiesleutel</string>
<string name="MessageLifetime">Verlooptijd</string>
<string name="ShortMessageLifetimeForever">Uit</string>
<string name="ShortMessageLifetime2s">2s</string>
<string name="ShortMessageLifetime5s">5s</string>
<string name="ShortMessageLifetime1m">1m</string>
<string name="ShortMessageLifetime1h">1u</string>
<string name="ShortMessageLifetime1d">1d</string>
<string name="ShortMessageLifetime1w">1w</string>
<string name="EncryptionKeyDescription">Deze afbeelding is een weergave van de encryptiesleutel voor dit privégesprek met <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>.<![CDATA[<br><br>]]>Als deze afbeelding er hetzelfde uitziet als op de telefoon van <![CDATA[<b>]]>%2$s<![CDATA[</b>]]>, is uw gesprek 200%% beveiligd.<![CDATA[<br><br>]]>Bezoek telegram.org voor meer informatie.</string>
<!--settings view-->
<string name="ResetNotificationsText">Alle meldingsinstellingen herstellen</string>
<string name="TextSize">Tekstgrootte berichten</string>
<string name="AskAQuestion">Een vraag stellen</string>
<string name="EnableAnimations">Animaties inschakelen</string>
<string name="Unblock">Deblokkeren</string>
<string name="UnblockText">Houd een gebruiker ingedrukt om hem/haar te deblokkeren.</string>
<string name="NoBlocked">Nog geen geblokkeerde gebruikers</string>
<string name="YourPhoneNumber">UW TELEFOONNUMMER</string>
<string name="MessageNotifications">BERICHTMELDINGEN</string>
<string name="Alert">Waarschuwing</string>
<string name="MessagePreview">Voorbeeld van berichten</string>
<string name="GroupNotifications">GROEPSMELDINGEN</string>
<string name="Sound">Geluid</string>
<string name="InAppNotifications">IN-APP MELDINGEN</string>
<string name="InAppSounds">In-app geluiden</string>
<string name="InAppVibrate">In-app trillen</string>
<string name="Vibrate">Trillen</string>
<string name="InAppPreview">In-app voorbeelden</string>
<string name="Reset">RESETTEN</string>
<string name="ResetAllNotifications">Alle meldingen resetten</string>
<string name="UndoAllCustom">Alle aangepaste meldingsinstellingen ongedaan maken voor alle contacten en groepen</string>
<string name="NotificationsAndSounds">Meldingen en geluiden</string>
<string name="BlockedUsers">Geblokkeerde gebruikers</string>
<string name="SaveIncomingPhotos">Inkomende foto\'s opslaan</string>
<string name="LogOut">Uitloggen</string>
<string name="YourFirstNameAndLastName">UW VOOR- EN ACHTERNAAM</string>
<string name="NoSound">Geen geluid</string>
<string name="Default">Standaard</string>
<string name="Support">ONDERSTEUNING</string>
<string name="ChatBackground">Achtergrond gesprekken</string>
<string name="MessagesSettings">BERICHTEN</string>
<string name="SendByEnter">Verzenden met Enter</string>
<string name="TerminateAllSessions">Alle andere sessies beëindigen</string>
<string name="AutomaticPhotoDownload">FOTO\'S AUTOMATISCH DOWNLOADEN</string>
<string name="AutomaticPhotoDownloadGroups">Groepen</string>
<string name="AutomaticPhotoDownloadPrivateChats">Privégesprekken</string>
<string name="Events">GEBEURTENISSEN</string>
<string name="ContactJoined">Contact lid geworden van Telegram</string>
<!--media view-->
<string name="NoMedia">Nog geen media gedeeld</string>
<string name="CancelDownload">Downloaden annuleren</string>
<!--map view-->
<string name="MyLocation">Mijn locatie</string>
<string name="Map">Kaart</string>
<string name="Satellite">Satelliet</string>
<string name="Hybrid">Hybride</string>
<string name="MetersAway">m hiervandaan</string>
<string name="KMetersAway">km hiervandaan</string>
<string name="SendLocation">Locatie verzenden</string>
<string name="ShareLocation">Locatie delen</string>
<!--photo gallery view-->
<string name="ShowAllMedia">Alle media weergeven</string>
<string name="SaveToGallery">Opslaan in galerij</string>
<string name="Of">van</string>
<string name="Gallery">Galerij</string>
<!--button titles-->
<string name="Next">Volgende</string>
<string name="Back">Vorige</string>
<string name="Done">Gereed</string>
<string name="Open">Openen</string>
<string name="Cancel">Annuleren</string>
<string name="Add">Toevoegen</string>
<string name="Edit">Bewerken</string>
<string name="Send">Verzenden</string>
<string name="Call">Bellen</string>
<string name="Copy">Kopiëren</string>
<string name="Delete">Verwijderen</string>
<string name="Forward">Doorsturen</string>
<string name="Retry">Opnieuw proberen</string>
<string name="FromCamera">Van camera</string>
<string name="FromGalley">Uit galerij</string>
<string name="DeletePhoto">Foto verwijderen</string>
<string name="OpenPhoto">Foto openen</string>
<string name="Set">Instellen</string>
<string name="OK">OK</string>
<!--messages-->
<string name="ActionKickUser">un1 heeft un2 verwijderd</string>
<string name="ActionLeftUser">un1 heeft de groep verlaten</string>
<string name="ActionAddUser">un1 heeft un2 toegevoegd</string>
<string name="ActionRemovedPhoto">un1 heeft de groepsafbeelding verwijderd</string>
<string name="ActionChangedPhoto">un1 heeft de groepsafbeelding gewijzigd</string>
<string name="ActionChangedTitle">un1 heeft de groepsnaam gewijzigd naar un2</string>
<string name="ActionCreateGroup">un1 heeft de groep gemaakt</string>
<string name="ActionYouKickUser">U hebt un2 verwijderd</string>
<string name="ActionYouLeftUser">U hebt de groep verlaten</string>
<string name="ActionYouAddUser">U hebt un2 toegevoegd</string>
<string name="ActionYouRemovedPhoto">U hebt de groepsafbeelding verwijderd</string>
<string name="ActionYouChangedPhoto">U hebt de groepsafbeelding gewijzigd</string>
<string name="ActionYouChangedTitle">U hebt de groepsnaam gewijzigd naar un2</string>
<string name="ActionYouCreateGroup">U hebt de groep gemaakt</string>
<string name="ActionKickUserYou">un1 heeft u verwijderd</string>
<string name="ActionAddUserYou">un1 heeft u toegevoegd</string>
<string name="UnsuppotedMedia">Dit bericht wordt niet ondersteund in uw versie van Telegram.</string>
<string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Video</string>
<string name="AttachLocation">Locatie</string>
<string name="AttachContact">Contact</string>
<string name="AttachDocument">Document</string>
<string name="AttachAudio">Geluidsbestand</string>
<string name="FromYou">U</string>
<!--Alert messages-->
<string name="InvalidPhoneNumber">Ongeldig telefoonnummer</string>
<string name="CodeExpired">Code verlopen. Log opnieuw in.</string>
<string name="FloodWait">Te veel pogingen. Probeer het later opnieuw.</string>
<string name="InvalidCode">Ongeldige code</string>
<string name="InvalidFirstName">Ongeldige voornaam</string>
<string name="InvalidLastName">Ongeldige achternaam</string>
<string name="Loading">Bezig met laden…</string>
<string name="NoPlayerInstalled">U hebt geen mediaspeler. Installeer een mediaspeler om door te gaan.</string>
<string name="NoHandleAppInstalled">U hebt geen applicaties die het MIME-type \'%1$s\' ondersteunen. Installeer een geschikte applicatie om door te gaan.</string>
<string name="InviteUser">Deze gebruiker heeft nog geen Telegram. Wilt u een uitnodiging sturen?</string>
<string name="AreYouSure">Weet u het zeker?</string>
<string name="AddContactQ">Contact toevoegen?</string>
<string name="AddToTheGroup">%1$s toevoegen aan de groep?</string>
<string name="ForwardMessagesTo">Berichten doorsturen naar %1$s?</string>
<string name="DeleteChatQuestion">Dit gesprek verwijderen?</string>
<!--Intro view-->
<string name="Page1Title">Telegram</string>
<string name="Page2Title">Snel</string>
<string name="Page3Title">Gratis</string>
<string name="Page4Title">Veilig</string>
<string name="Page5Title">Krachtig</string>
<string name="Page6Title">In de cloud</string>
<string name="Page7Title">Privé</string>
<string name="Page1Message">Welkom in het tijdperk van snel en veilig chatten</string>
<string name="Page2Message"><![CDATA[<b>Telegram</b>]]> bezorgt berichten sneller<![CDATA[<br/>]]>dan elke andere app</string>
<string name="Page3Message"><![CDATA[<b>Telegram</b>]]> is altijd gratis. Geen advertenties.<![CDATA[<br/>]]>Geen abonnementskosten</string>
<string name="Page4Message"><![CDATA[<b>Telegram</b>]]> beveiligt uw berichten<![CDATA[<br/>]]>tegen hackers</string>
<string name="Page5Message"><![CDATA[<b>Telegram</b>]]> heeft geen beperkingen op de grootte<![CDATA[<br/>]]>van uw media en gesprekken</string>
<string name="Page6Message"><![CDATA[<b>Telegram</b>]]> biedt toegang tot uw berichten<![CDATA[<br/>]]>vanaf meerdere apparaten</string>
<string name="Page7Message"><![CDATA[<b>Telegram</b>]]> berichten zijn sterk versleuteld<![CDATA[<br/>]]>en kunnen zichzelf vernietigen</string>
<string name="StartMessaging">Begin nu met chatten</string>
<!--Don't change this! Not for localization!-->
<string name="CacheTag">CACHE_TAG</string>
</resources>