Update to 3.1.3
|
@ -5,7 +5,7 @@ repositories {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.android.support:support-v4:22.2.+'
|
||||
compile 'com.android.support:support-v4:23.0.+'
|
||||
compile 'com.google.android.gms:play-services:3.2.+'
|
||||
compile 'net.hockeyapp.android:HockeySDK:3.5.+'
|
||||
compile 'com.googlecode.mp4parser:isoparser:1.0.+'
|
||||
|
@ -13,7 +13,7 @@ dependencies {
|
|||
|
||||
android {
|
||||
compileSdkVersion 22
|
||||
buildToolsVersion '22.0.1'
|
||||
buildToolsVersion '23.0.0'
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
|
@ -73,7 +73,7 @@ android {
|
|||
defaultConfig {
|
||||
minSdkVersion 8
|
||||
targetSdkVersion 22
|
||||
versionCode 586
|
||||
versionName "3.1.2"
|
||||
versionCode 592
|
||||
versionName "3.1.3"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ public class PyroClient {
|
|||
this.key.attach(this);
|
||||
|
||||
this.outbound = new ByteStream();
|
||||
this.listeners = new CopyOnWriteArrayList<PyroClientListener>();
|
||||
this.listeners = new CopyOnWriteArrayList<>();
|
||||
this.lastEventTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
package org.telegram.android;
|
||||
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Typeface;
|
||||
import android.text.Layout;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableStringBuilder;
|
||||
|
@ -16,6 +17,7 @@ import android.text.Spanned;
|
|||
import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.URLSpan;
|
||||
import android.text.util.Linkify;
|
||||
|
||||
import org.telegram.messenger.ConnectionsManager;
|
||||
|
@ -24,8 +26,10 @@ import org.telegram.messenger.FileLog;
|
|||
import org.telegram.messenger.TLRPC;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.messenger.UserConfig;
|
||||
import org.telegram.ui.Components.TypefaceSpan;
|
||||
import org.telegram.ui.Components.URLSpanNoUnderline;
|
||||
import org.telegram.ui.Components.URLSpanNoUnderlineBold;
|
||||
import org.telegram.ui.Components.URLSpanReplacement;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.ArrayList;
|
||||
|
@ -397,7 +401,7 @@ public class MessageObject {
|
|||
int dateYear = rightNow.get(Calendar.YEAR);
|
||||
int dateMonth = rightNow.get(Calendar.MONTH);
|
||||
dateKey = String.format("%d_%02d_%02d", dateYear, dateMonth, dateDay);
|
||||
if (contentType == 1 || contentType == 2) {
|
||||
if (contentType == 1 || contentType == 2 || contentType == 0) {
|
||||
monthKey = String.format("%d_%02d", dateYear, dateMonth);
|
||||
}
|
||||
|
||||
|
@ -666,7 +670,54 @@ public class MessageObject {
|
|||
generateLinkDescription();
|
||||
textLayoutBlocks = new ArrayList<>();
|
||||
|
||||
addLinks(messageText);
|
||||
boolean useManualParse = messageOwner.entities.isEmpty() && (
|
||||
messageOwner instanceof TLRPC.TL_message_old ||
|
||||
messageOwner instanceof TLRPC.TL_message_old2 ||
|
||||
messageOwner instanceof TLRPC.TL_message_old3 ||
|
||||
messageOwner instanceof TLRPC.TL_message_old4 ||
|
||||
messageOwner instanceof TLRPC.TL_messageForwarded_old ||
|
||||
messageOwner instanceof TLRPC.TL_messageForwarded_old2 ||
|
||||
messageOwner instanceof TLRPC.TL_message_secret ||
|
||||
isOut() && messageOwner.send_state != MESSAGE_SEND_STATE_SENT || messageOwner.id < 0);
|
||||
|
||||
if (useManualParse) {
|
||||
addLinks(messageText);
|
||||
}
|
||||
|
||||
if (messageText instanceof Spannable) {
|
||||
Spannable spannable = (Spannable) messageText;
|
||||
int count = messageOwner.entities.size();
|
||||
for (int a = 0; a < count; a++) {
|
||||
TLRPC.MessageEntity entity = messageOwner.entities.get(a);
|
||||
if (entity.length <= 0 || entity.offset < 0 || entity.offset >= messageOwner.message.length()) {
|
||||
continue;
|
||||
} else if (entity.offset + entity.length > messageOwner.message.length()) {
|
||||
entity.length = messageOwner.message.length() - entity.offset;
|
||||
}
|
||||
if (entity instanceof TLRPC.TL_messageEntityBold) {
|
||||
spannable.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/rmedium.ttf")), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
} else if (entity instanceof TLRPC.TL_messageEntityItalic) {
|
||||
spannable.setSpan(new TypefaceSpan(AndroidUtilities.getTypeface("fonts/ritalic.ttf")), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
} else if (entity instanceof TLRPC.TL_messageEntityCode) {
|
||||
spannable.setSpan(new TypefaceSpan(Typeface.MONOSPACE), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
} else if (!useManualParse) {
|
||||
String url = messageOwner.message.substring(entity.offset, entity.offset + entity.length);
|
||||
if (entity instanceof TLRPC.TL_messageEntityBotCommand || entity instanceof TLRPC.TL_messageEntityHashtag || entity instanceof TLRPC.TL_messageEntityMention) {
|
||||
spannable.setSpan(new URLSpanNoUnderline(url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
} else if (entity instanceof TLRPC.TL_messageEntityEmail) {
|
||||
spannable.setSpan(new URLSpanReplacement("mailto:" + url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
} else if (entity instanceof TLRPC.TL_messageEntityUrl) {
|
||||
if (!url.toLowerCase().startsWith("http")) {
|
||||
spannable.setSpan(new URLSpan("http://" + url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
} else {
|
||||
spannable.setSpan(new URLSpan(url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
} else if (entity instanceof TLRPC.TL_messageEntityTextUrl) {
|
||||
spannable.setSpan(new URLSpanReplacement(entity.url), entity.offset, entity.offset + entity.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int maxWidth;
|
||||
if (AndroidUtilities.isTablet()) {
|
||||
|
|
|
@ -268,13 +268,10 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
TLRPC.InputUser inputUser;
|
||||
if (user.id == UserConfig.getClientUserId()) {
|
||||
inputUser = new TLRPC.TL_inputUserSelf();
|
||||
} else if (user.access_hash != 0) {
|
||||
inputUser = new TLRPC.TL_inputUserForeign();
|
||||
} else {
|
||||
inputUser = new TLRPC.TL_inputUser();
|
||||
inputUser.user_id = user.id;
|
||||
inputUser.access_hash = user.access_hash;
|
||||
} else {
|
||||
inputUser = new TLRPC.TL_inputUserContact();
|
||||
inputUser.user_id = user.id;
|
||||
}
|
||||
return inputUser;
|
||||
}
|
||||
|
@ -512,7 +509,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
return;
|
||||
}
|
||||
boolean updateStatus = false;
|
||||
for (TLRPC.User user : users) {
|
||||
int count = users.size();
|
||||
for (int a = 0; a < count; a++) {
|
||||
TLRPC.User user = users.get(a);
|
||||
if (putUser(user, fromCache)) {
|
||||
updateStatus = true;
|
||||
}
|
||||
|
@ -531,9 +530,13 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (chat == null) {
|
||||
return;
|
||||
}
|
||||
if (fromCache) {
|
||||
chats.putIfAbsent(chat.id, chat);
|
||||
} else {
|
||||
TLRPC.Chat oldChat = chats.get(chat.id);
|
||||
if (!fromCache) {
|
||||
if (oldChat != null && chat.version != oldChat.version) {
|
||||
loadedFullChats.remove((Integer) chat.id);
|
||||
}
|
||||
chats.put(chat.id, chat);
|
||||
} else if (oldChat == null) {
|
||||
chats.put(chat.id, chat);
|
||||
}
|
||||
}
|
||||
|
@ -542,7 +545,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (chats == null || chats.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (TLRPC.Chat chat : chats) {
|
||||
int count = chats.size();
|
||||
for (int a = 0; a < count; a++) {
|
||||
TLRPC.Chat chat = chats.get(a);
|
||||
putChat(chat, fromCache);
|
||||
}
|
||||
}
|
||||
|
@ -562,7 +567,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (encryptedChats == null || encryptedChats.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
for (TLRPC.EncryptedChat encryptedChat : encryptedChats) {
|
||||
int count = encryptedChats.size();
|
||||
for (int a = 0; a < count; a++) {
|
||||
TLRPC.EncryptedChat encryptedChat = encryptedChats.get(a);
|
||||
putEncryptedChat(encryptedChat, fromCache);
|
||||
}
|
||||
}
|
||||
|
@ -1143,12 +1150,8 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
req.peer.user_id = lower_part;
|
||||
}
|
||||
ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
||||
|
@ -1447,14 +1450,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.user_id = user.id;
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
req.peer.user_id = user.id;
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.user_id = user.id;
|
||||
req.peer.access_hash = user.access_hash;
|
||||
}
|
||||
if (action == 0) {
|
||||
req.action = new TLRPC.TL_sendMessageTypingAction();
|
||||
|
@ -1534,14 +1532,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.user_id = user.id;
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
req.peer.user_id = user.id;
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.user_id = user.id;
|
||||
req.peer.access_hash = user.access_hash;
|
||||
}
|
||||
if (load_type == 3) {
|
||||
req.offset = -count / 2;
|
||||
|
@ -2016,14 +2009,9 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.user_id = user.id;
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
req.peer.user_id = user.id;
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.user_id = user.id;
|
||||
req.peer.access_hash = user.access_hash;
|
||||
}
|
||||
req.max_id = max_positive_id;
|
||||
req.offset = offset;
|
||||
|
@ -3006,6 +2994,7 @@ public class MessagesController implements NotificationCenter.NotificationCenter
|
|||
message.to_id.chat_id = updates.chat_id;
|
||||
message.dialog_id = -updates.chat_id;
|
||||
}
|
||||
message.entities = updates.entities;
|
||||
message.message = updates.message;
|
||||
message.date = updates.date;
|
||||
message.flags = updates.flags;
|
||||
|
|
|
@ -1370,12 +1370,8 @@ public class NotificationsController {
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerForeign();
|
||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerContact();
|
||||
}
|
||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer = new TLRPC.TL_inputPeerUser();
|
||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer.access_hash = user.access_hash;
|
||||
((TLRPC.TL_inputNotifyPeer)req.peer).peer.user_id = (int)dialog_id;
|
||||
}
|
||||
|
||||
|
|
|
@ -559,7 +559,6 @@ public class SecretChatHelper {
|
|||
newMsg.media.video.h = video.h;
|
||||
newMsg.media.video.date = video.date;
|
||||
newMsg.media.caption = video.caption != null ? video.caption : "";
|
||||
newMsg.media.video.user_id = video.user_id;
|
||||
newMsg.media.video.size = file.size;
|
||||
newMsg.media.video.id = file.id;
|
||||
newMsg.media.video.access_hash = file.access_hash;
|
||||
|
@ -897,9 +896,7 @@ public class SecretChatHelper {
|
|||
newMessage.media = new TLRPC.TL_messageMediaPhoto();
|
||||
newMessage.media.caption = "";
|
||||
newMessage.media.photo = new TLRPC.TL_photo();
|
||||
newMessage.media.photo.user_id = newMessage.from_id;
|
||||
newMessage.media.photo.date = newMessage.date;
|
||||
newMessage.media.photo.geo = new TLRPC.TL_geoPointEmpty();
|
||||
byte[] thumb = ((TLRPC.TL_decryptedMessageMediaPhoto) decryptedMessage.media).thumb;
|
||||
if (thumb != null && thumb.length != 0 && thumb.length <= 6000 && decryptedMessage.media.thumb_w <= 100 && decryptedMessage.media.thumb_h <= 100) {
|
||||
TLRPC.TL_photoCachedSize small = new TLRPC.TL_photoCachedSize();
|
||||
|
@ -948,7 +945,6 @@ public class SecretChatHelper {
|
|||
newMessage.media.video.w = decryptedMessage.media.w;
|
||||
newMessage.media.video.h = decryptedMessage.media.h;
|
||||
newMessage.media.video.date = date;
|
||||
newMessage.media.video.user_id = from_id;
|
||||
newMessage.media.video.size = file.size;
|
||||
newMessage.media.video.id = file.id;
|
||||
newMessage.media.video.access_hash = file.access_hash;
|
||||
|
|
|
@ -540,14 +540,9 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||
if (sendToUser == null) {
|
||||
return;
|
||||
}
|
||||
if (sendToUser.access_hash != 0) {
|
||||
sendToPeer = new TLRPC.TL_inputPeerForeign();
|
||||
sendToPeer.user_id = sendToUser.id;
|
||||
sendToPeer.access_hash = sendToUser.access_hash;
|
||||
} else {
|
||||
sendToPeer = new TLRPC.TL_inputPeerContact();
|
||||
sendToPeer.user_id = sendToUser.id;
|
||||
}
|
||||
sendToPeer = new TLRPC.TL_inputPeerUser();
|
||||
sendToPeer.user_id = sendToUser.id;
|
||||
sendToPeer.access_hash = sendToUser.access_hash;
|
||||
}
|
||||
|
||||
ArrayList<MessageObject> objArr = new ArrayList<>();
|
||||
|
@ -575,6 +570,10 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||
newMsg.message = msgObj.messageOwner.message;
|
||||
newMsg.fwd_msg_id = msgObj.getId();
|
||||
newMsg.attachPath = msgObj.messageOwner.attachPath;
|
||||
newMsg.entities = msgObj.messageOwner.entities;
|
||||
if (!newMsg.entities.isEmpty()) {
|
||||
newMsg.flags |= TLRPC.MESSAGE_FLAG_HAS_ENTITIES;
|
||||
}
|
||||
if (newMsg.attachPath == null) {
|
||||
newMsg.attachPath = "";
|
||||
}
|
||||
|
@ -965,14 +964,9 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||
if ((sendToUser.flags & TLRPC.USER_FLAG_BOT) != 0) {
|
||||
newMsg.flags &= ~TLRPC.MESSAGE_FLAG_UNREAD;
|
||||
}
|
||||
if (sendToUser.access_hash != 0) {
|
||||
sendToPeer = new TLRPC.TL_inputPeerForeign();
|
||||
sendToPeer.user_id = sendToUser.id;
|
||||
sendToPeer.access_hash = sendToUser.access_hash;
|
||||
} else {
|
||||
sendToPeer = new TLRPC.TL_inputPeerContact();
|
||||
sendToPeer.user_id = sendToUser.id;
|
||||
}
|
||||
sendToPeer = new TLRPC.TL_inputPeerUser();
|
||||
sendToPeer.user_id = sendToUser.id;
|
||||
sendToPeer.access_hash = sendToUser.access_hash;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -1563,6 +1557,10 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||
newMsgObj.local_id = newMsgObj.id = res.id;
|
||||
newMsgObj.date = res.date;
|
||||
newMsgObj.media = res.media;
|
||||
newMsgObj.entities = res.entities;
|
||||
if (!newMsgObj.entities.isEmpty()) {
|
||||
newMsgObj.flags |= TLRPC.MESSAGE_FLAG_HAS_ENTITIES;
|
||||
}
|
||||
if (res instanceof TLRPC.TL_messages_sentMessage) {
|
||||
MessagesController.getInstance().processNewDifferenceParams(-1, res.pts, res.date, res.pts_count);
|
||||
} else if (res instanceof TLRPC.TL_messages_sentMessageLink) {
|
||||
|
@ -1849,10 +1847,8 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||
} else {
|
||||
UserConfig.saveConfig(false);
|
||||
TLRPC.TL_photo photo = new TLRPC.TL_photo();
|
||||
photo.user_id = UserConfig.getClientUserId();
|
||||
photo.date = ConnectionsManager.getInstance().getCurrentTime();
|
||||
photo.sizes = sizes;
|
||||
photo.geo = new TLRPC.TL_geoPointEmpty();
|
||||
return photo;
|
||||
}
|
||||
}
|
||||
|
@ -2218,9 +2214,7 @@ public class SendMessagesHelper implements NotificationCenter.NotificationCenter
|
|||
}
|
||||
if (photo == null) {
|
||||
photo = new TLRPC.TL_photo();
|
||||
photo.user_id = UserConfig.getClientUserId();
|
||||
photo.date = ConnectionsManager.getInstance().getCurrentTime();
|
||||
photo.geo = new TLRPC.TL_geoPointEmpty();
|
||||
TLRPC.TL_photoSize photoSize = new TLRPC.TL_photoSize();
|
||||
photoSize.w = searchImage.width;
|
||||
photoSize.h = searchImage.height;
|
||||
|
|
|
@ -83,12 +83,8 @@ public class MessagesSearchQuery {
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
req.peer.user_id = lower_part;
|
||||
}
|
||||
req.q = query;
|
||||
|
|
|
@ -61,12 +61,8 @@ public class SharedMediaQuery {
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
req.peer.user_id = lower_part;
|
||||
}
|
||||
long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
||||
|
@ -109,12 +105,8 @@ public class SharedMediaQuery {
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
req.peer.user_id = lower_part;
|
||||
}
|
||||
long reqId = ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
|
||||
|
@ -158,8 +150,13 @@ public class SharedMediaQuery {
|
|||
}
|
||||
} else if (message.media instanceof TLRPC.TL_messageMediaAudio) {
|
||||
return MEDIA_AUDIO;
|
||||
} else if (message.media instanceof TLRPC.TL_messageMediaWebPage) {
|
||||
return MEDIA_URL;
|
||||
} else if (!message.entities.isEmpty()) {
|
||||
for (int a = 0; a < message.entities.size(); a++) {
|
||||
TLRPC.MessageEntity entity = message.entities.get(a);
|
||||
if (entity instanceof TLRPC.TL_messageEntityUrl || entity instanceof TLRPC.TL_messageEntityTextUrl || entity instanceof TLRPC.TL_messageEntityEmail) {
|
||||
return MEDIA_URL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -170,9 +167,15 @@ public class SharedMediaQuery {
|
|||
} else if (message.media instanceof TLRPC.TL_messageMediaPhoto ||
|
||||
message.media instanceof TLRPC.TL_messageMediaVideo ||
|
||||
message.media instanceof TLRPC.TL_messageMediaDocument ||
|
||||
message.media instanceof TLRPC.TL_messageMediaAudio/* ||
|
||||
message.media instanceof TLRPC.TL_messageMediaWebPage && !(message.media.webpage instanceof TLRPC.TL_webPageEmpty)*/) {
|
||||
message.media instanceof TLRPC.TL_messageMediaAudio) {
|
||||
return true;
|
||||
} else if (!message.entities.isEmpty()) {
|
||||
for (int a = 0; a < message.entities.size(); a++) {
|
||||
TLRPC.MessageEntity entity = message.entities.get(a);
|
||||
if (entity instanceof TLRPC.TL_messageEntityUrl || entity instanceof TLRPC.TL_messageEntityTextUrl || entity instanceof TLRPC.TL_messageEntityEmail) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -271,66 +271,70 @@ public class StickersQuery {
|
|||
}
|
||||
}
|
||||
if (res != null) {
|
||||
final ArrayList<TLRPC.TL_messages_stickerSet> stickerSetsNew = new ArrayList<>();
|
||||
final HashMap<Long, TLRPC.TL_messages_stickerSet> stickerSetsByIdNew = new HashMap<>();
|
||||
final HashMap<Long, String> stickersByEmojiNew = new HashMap<>();
|
||||
final HashMap<Long, TLRPC.Document> stickersByIdNew = new HashMap<>();
|
||||
final HashMap<String, ArrayList<TLRPC.Document>> allStickersNew = new HashMap<>();
|
||||
try {
|
||||
final ArrayList<TLRPC.TL_messages_stickerSet> stickerSetsNew = new ArrayList<>();
|
||||
final HashMap<Long, TLRPC.TL_messages_stickerSet> stickerSetsByIdNew = new HashMap<>();
|
||||
final HashMap<Long, String> stickersByEmojiNew = new HashMap<>();
|
||||
final HashMap<Long, TLRPC.Document> stickersByIdNew = new HashMap<>();
|
||||
final HashMap<String, ArrayList<TLRPC.Document>> allStickersNew = new HashMap<>();
|
||||
|
||||
for (int a = 0; a < res.size(); a++) {
|
||||
TLRPC.TL_messages_stickerSet stickerSet = res.get(a);
|
||||
if (stickerSet == null) {
|
||||
continue;
|
||||
}
|
||||
stickerSetsNew.add(stickerSet);
|
||||
stickerSetsByIdNew.put(stickerSet.set.id, stickerSet);
|
||||
|
||||
for (int b = 0; b < stickerSet.documents.size(); b++) {
|
||||
TLRPC.Document document = stickerSet.documents.get(b);
|
||||
if (document == null || document instanceof TLRPC.TL_documentEmpty) {
|
||||
for (int a = 0; a < res.size(); a++) {
|
||||
TLRPC.TL_messages_stickerSet stickerSet = res.get(a);
|
||||
if (stickerSet == null) {
|
||||
continue;
|
||||
}
|
||||
stickersByIdNew.put(document.id, document);
|
||||
}
|
||||
if ((stickerSet.set.flags & 2) == 0) {
|
||||
for (int b = 0; b < stickerSet.packs.size(); b++) {
|
||||
TLRPC.TL_stickerPack stickerPack = stickerSet.packs.get(b);
|
||||
if (stickerPack == null || stickerPack.emoticon == null) {
|
||||
stickerSetsNew.add(stickerSet);
|
||||
stickerSetsByIdNew.put(stickerSet.set.id, stickerSet);
|
||||
|
||||
for (int b = 0; b < stickerSet.documents.size(); b++) {
|
||||
TLRPC.Document document = stickerSet.documents.get(b);
|
||||
if (document == null || document instanceof TLRPC.TL_documentEmpty) {
|
||||
continue;
|
||||
}
|
||||
stickerPack.emoticon = stickerPack.emoticon.replace("\uFE0F", "");
|
||||
ArrayList<TLRPC.Document> arrayList = allStickersNew.get(stickerPack.emoticon);
|
||||
if (arrayList == null) {
|
||||
arrayList = new ArrayList<>();
|
||||
allStickersNew.put(stickerPack.emoticon, arrayList);
|
||||
}
|
||||
for (int c = 0; c < stickerPack.documents.size(); c++) {
|
||||
Long id = stickerPack.documents.get(c);
|
||||
if (!stickersByEmojiNew.containsKey(id)) {
|
||||
stickersByEmojiNew.put(id, stickerPack.emoticon);
|
||||
stickersByIdNew.put(document.id, document);
|
||||
}
|
||||
if ((stickerSet.set.flags & 2) == 0) {
|
||||
for (int b = 0; b < stickerSet.packs.size(); b++) {
|
||||
TLRPC.TL_stickerPack stickerPack = stickerSet.packs.get(b);
|
||||
if (stickerPack == null || stickerPack.emoticon == null) {
|
||||
continue;
|
||||
}
|
||||
stickerPack.emoticon = stickerPack.emoticon.replace("\uFE0F", "");
|
||||
ArrayList<TLRPC.Document> arrayList = allStickersNew.get(stickerPack.emoticon);
|
||||
if (arrayList == null) {
|
||||
arrayList = new ArrayList<>();
|
||||
allStickersNew.put(stickerPack.emoticon, arrayList);
|
||||
}
|
||||
for (int c = 0; c < stickerPack.documents.size(); c++) {
|
||||
Long id = stickerPack.documents.get(c);
|
||||
if (!stickersByEmojiNew.containsKey(id)) {
|
||||
stickersByEmojiNew.put(id, stickerPack.emoticon);
|
||||
}
|
||||
arrayList.add(stickersByIdNew.get(id));
|
||||
}
|
||||
arrayList.add(stickersByIdNew.get(id));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!cache) {
|
||||
putStickersToCache(stickerSetsNew, date, hash);
|
||||
}
|
||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
stickersById = stickersByIdNew;
|
||||
stickerSetsById = stickerSetsByIdNew;
|
||||
stickerSets = stickerSetsNew;
|
||||
allStickers = allStickersNew;
|
||||
stickersByEmoji = stickersByEmojiNew;
|
||||
loadHash = hash;
|
||||
loadDate = date;
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.stickersDidLoaded);
|
||||
if (!cache) {
|
||||
putStickersToCache(stickerSetsNew, date, hash);
|
||||
}
|
||||
});
|
||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
stickersById = stickersByIdNew;
|
||||
stickerSetsById = stickerSetsByIdNew;
|
||||
stickerSets = stickerSetsNew;
|
||||
allStickers = allStickersNew;
|
||||
stickersByEmoji = stickersByEmojiNew;
|
||||
loadHash = hash;
|
||||
loadDate = date;
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.stickersDidLoaded);
|
||||
}
|
||||
});
|
||||
} catch (Throwable e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 1.3.x.
|
||||
* This is the source code of Telegram for Android v. 2.x.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.
|
||||
* Copyright Nikolai Kudashov, 2013-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.messenger;
|
||||
|
||||
public class BuildVars {
|
||||
public static boolean DEBUG_VERSION = false;
|
||||
public static int BUILD_VERSION = 586;
|
||||
public static int BUILD_VERSION = 592;
|
||||
public static int APP_ID = 0; //obtain your own APP_ID at https://core.telegram.org/api/obtaining_api_id
|
||||
public static String APP_HASH = ""; //obtain your own APP_HASH at https://core.telegram.org/api/obtaining_api_id
|
||||
public static String HOCKEY_APP_HASH = "your-hockeyapp-api-key-here";
|
||||
|
|
|
@ -78,11 +78,13 @@ public class TLClassStore {
|
|||
classStore.put(TLRPC.TL_video_old2.constructor, TLRPC.TL_video_old2.class);
|
||||
classStore.put(TLRPC.TL_video_old.constructor, TLRPC.TL_video_old.class);
|
||||
classStore.put(TLRPC.TL_videoEncrypted.constructor, TLRPC.TL_videoEncrypted.class);
|
||||
classStore.put(TLRPC.TL_video_old3.constructor, TLRPC.TL_video_old3.class);
|
||||
|
||||
classStore.put(TLRPC.TL_audio.constructor, TLRPC.TL_audio.class);
|
||||
classStore.put(TLRPC.TL_audioEncrypted.constructor, TLRPC.TL_audioEncrypted.class);
|
||||
classStore.put(TLRPC.TL_audioEmpty.constructor, TLRPC.TL_audioEmpty.class);
|
||||
classStore.put(TLRPC.TL_audio_old.constructor, TLRPC.TL_audio_old.class);
|
||||
classStore.put(TLRPC.TL_audio_old2.constructor, TLRPC.TL_audio_old2.class);
|
||||
|
||||
classStore.put(TLRPC.TL_document.constructor, TLRPC.TL_document.class);
|
||||
classStore.put(TLRPC.TL_documentEmpty.constructor, TLRPC.TL_documentEmpty.class);
|
||||
|
@ -96,6 +98,7 @@ public class TLClassStore {
|
|||
classStore.put(TLRPC.TL_photoSizeEmpty.constructor, TLRPC.TL_photoSizeEmpty.class);
|
||||
classStore.put(TLRPC.TL_photoCachedSize.constructor, TLRPC.TL_photoCachedSize.class);
|
||||
classStore.put(TLRPC.TL_photo_old.constructor, TLRPC.TL_photo_old.class);
|
||||
classStore.put(TLRPC.TL_photo_old2.constructor, TLRPC.TL_photo_old2.class);
|
||||
}
|
||||
|
||||
static TLClassStore store = null;
|
||||
|
|
|
@ -38,8 +38,10 @@ public class TLRPC {
|
|||
public static final int MESSAGE_FLAG_REPLY = 0x00000008;
|
||||
public static final int MESSAGE_FLAG_MENTION = 0x00000010;
|
||||
public static final int MESSAGE_FLAG_CONTENT_UNREAD = 0x00000020;
|
||||
public static final int MESSAGE_FLAG_HAS_MARKUP = 0x00000040;
|
||||
public static final int MESSAGE_FLAG_HAS_ENTITIES = 0x00000080;
|
||||
|
||||
public static final int LAYER = 32;
|
||||
public static final int LAYER = 34;
|
||||
|
||||
public static class TL_inputEncryptedChat extends TLObject {
|
||||
public static int constructor = 0xf141b5e1;
|
||||
|
@ -5407,6 +5409,7 @@ public class TLRPC {
|
|||
public int id;
|
||||
public int date;
|
||||
public MessageMedia media;
|
||||
public ArrayList<MessageEntity> entities = new ArrayList<>();
|
||||
public int pts;
|
||||
public int pts_count;
|
||||
public ArrayList<TL_contacts_link> links = new ArrayList<>();
|
||||
|
@ -5415,7 +5418,7 @@ public class TLRPC {
|
|||
public static messages_SentMessage TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
messages_SentMessage result = null;
|
||||
switch(constructor) {
|
||||
case 0x4c3d47f3:
|
||||
case 0x8a99d8e0:
|
||||
result = new TL_messages_sentMessage();
|
||||
break;
|
||||
case 0x35a1a663:
|
||||
|
@ -5433,13 +5436,28 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_messages_sentMessage extends messages_SentMessage {
|
||||
public static int constructor = 0x4c3d47f3;
|
||||
public static int constructor = 0x8a99d8e0;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
id = stream.readInt32(exception);
|
||||
date = stream.readInt32(exception);
|
||||
media = MessageMedia.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
int magic = stream.readInt32(exception);
|
||||
if (magic != 0x1cb5c415) {
|
||||
if (exception) {
|
||||
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||
}
|
||||
return;
|
||||
}
|
||||
int count = stream.readInt32(exception);
|
||||
for (int a = 0; a < count; a++) {
|
||||
MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if (object == null) {
|
||||
return;
|
||||
}
|
||||
entities.add(object);
|
||||
}
|
||||
pts = stream.readInt32(exception);
|
||||
pts_count = stream.readInt32(exception);
|
||||
}
|
||||
|
@ -5449,6 +5467,12 @@ public class TLRPC {
|
|||
stream.writeInt32(id);
|
||||
stream.writeInt32(date);
|
||||
media.serializeToStream(stream);
|
||||
stream.writeInt32(0x1cb5c415);
|
||||
int count = entities.size();
|
||||
stream.writeInt32(count);
|
||||
for (int a = 0; a < count; a++) {
|
||||
entities.get(a).serializeToStream(stream);
|
||||
}
|
||||
stream.writeInt32(pts);
|
||||
stream.writeInt32(pts_count);
|
||||
}
|
||||
|
@ -5601,14 +5625,14 @@ public class TLRPC {
|
|||
|
||||
public static class InputPeer extends TLObject {
|
||||
public int user_id;
|
||||
public int chat_id;
|
||||
public long access_hash;
|
||||
public int chat_id;
|
||||
|
||||
public static InputPeer TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
InputPeer result = null;
|
||||
switch(constructor) {
|
||||
case 0x1023dbe8:
|
||||
result = new TL_inputPeerContact();
|
||||
case 0x7b8e7de6:
|
||||
result = new TL_inputPeerUser();
|
||||
break;
|
||||
case 0x179be863:
|
||||
result = new TL_inputPeerChat();
|
||||
|
@ -5619,9 +5643,6 @@ public class TLRPC {
|
|||
case 0x7da07ec9:
|
||||
result = new TL_inputPeerSelf();
|
||||
break;
|
||||
case 0x9b447325:
|
||||
result = new TL_inputPeerForeign();
|
||||
break;
|
||||
}
|
||||
if (result == null && exception) {
|
||||
throw new RuntimeException(String.format("can't parse magic %x in InputPeer", constructor));
|
||||
|
@ -5633,17 +5654,19 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_inputPeerContact extends InputPeer {
|
||||
public static int constructor = 0x1023dbe8;
|
||||
public static class TL_inputPeerUser extends InputPeer {
|
||||
public static int constructor = 0x7b8e7de6;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
user_id = stream.readInt32(exception);
|
||||
access_hash = stream.readInt64(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(user_id);
|
||||
stream.writeInt64(access_hash);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5679,22 +5702,6 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_inputPeerForeign extends InputPeer {
|
||||
public static int constructor = 0x9b447325;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
user_id = stream.readInt32(exception);
|
||||
access_hash = stream.readInt64(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(user_id);
|
||||
stream.writeInt64(access_hash);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_msg_copy extends TLObject {
|
||||
public static int constructor = 0xe06046b2;
|
||||
|
||||
|
@ -6542,17 +6549,14 @@ public class TLRPC {
|
|||
public static InputUser TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
InputUser result = null;
|
||||
switch(constructor) {
|
||||
case 0xf7c1b13f:
|
||||
result = new TL_inputUserSelf();
|
||||
break;
|
||||
case 0x655e74ff:
|
||||
result = new TL_inputUserForeign();
|
||||
break;
|
||||
case 0xb98886cf:
|
||||
result = new TL_inputUserEmpty();
|
||||
break;
|
||||
case 0x86e94f65:
|
||||
result = new TL_inputUserContact();
|
||||
case 0xf7c1b13f:
|
||||
result = new TL_inputUserSelf();
|
||||
break;
|
||||
case 0xd8292816:
|
||||
result = new TL_inputUser();
|
||||
break;
|
||||
}
|
||||
if (result == null && exception) {
|
||||
|
@ -6565,6 +6569,15 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_inputUserEmpty extends InputUser {
|
||||
public static int constructor = 0xb98886cf;
|
||||
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_inputUserSelf extends InputUser {
|
||||
public static int constructor = 0xf7c1b13f;
|
||||
|
||||
|
@ -6574,8 +6587,8 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_inputUserForeign extends InputUser {
|
||||
public static int constructor = 0x655e74ff;
|
||||
public static class TL_inputUser extends InputUser {
|
||||
public static int constructor = 0xd8292816;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
|
@ -6590,29 +6603,6 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_inputUserEmpty extends InputUser {
|
||||
public static int constructor = 0xb98886cf;
|
||||
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_inputUserContact extends InputUser {
|
||||
public static int constructor = 0x86e94f65;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
user_id = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(user_id);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_chatParticipant extends TLObject {
|
||||
public static int constructor = 0xc8d7493e;
|
||||
|
||||
|
@ -7080,9 +7070,12 @@ public class TLRPC {
|
|||
case 0x2331b22d:
|
||||
result = new TL_photoEmpty();
|
||||
break;
|
||||
case 0xc3838076:
|
||||
case 0xcded42fe:
|
||||
result = new TL_photo();
|
||||
break;
|
||||
case 0xc3838076:
|
||||
result = new TL_photo_old2();
|
||||
break;
|
||||
case 0x22b56751:
|
||||
result = new TL_photo_old();
|
||||
break;
|
||||
|
@ -7112,6 +7105,45 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_photo extends Photo {
|
||||
public static int constructor = 0xcded42fe;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
id = stream.readInt64(exception);
|
||||
access_hash = stream.readInt64(exception);
|
||||
date = stream.readInt32(exception);
|
||||
int magic = stream.readInt32(exception);
|
||||
if (magic != 0x1cb5c415) {
|
||||
if (exception) {
|
||||
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||
}
|
||||
return;
|
||||
}
|
||||
int count = stream.readInt32(exception);
|
||||
for (int a = 0; a < count; a++) {
|
||||
PhotoSize object = PhotoSize.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if (object == null) {
|
||||
return;
|
||||
}
|
||||
sizes.add(object);
|
||||
}
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt64(id);
|
||||
stream.writeInt64(access_hash);
|
||||
stream.writeInt32(date);
|
||||
stream.writeInt32(0x1cb5c415);
|
||||
int count = sizes.size();
|
||||
stream.writeInt32(count);
|
||||
for (int a = 0; a < count; a++) {
|
||||
sizes.get(a).serializeToStream(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_photo_old2 extends TL_photo {
|
||||
public static int constructor = 0xc3838076;
|
||||
|
||||
|
||||
|
@ -9383,9 +9415,12 @@ public class TLRPC {
|
|||
public static Video TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
Video result = null;
|
||||
switch(constructor) {
|
||||
case 0xee9f4a4d:
|
||||
case 0xf72887d3:
|
||||
result = new TL_video();
|
||||
break;
|
||||
case 0xee9f4a4d:
|
||||
result = new TL_video_old3();
|
||||
break;
|
||||
case 0x55555553:
|
||||
result = new TL_videoEncrypted();
|
||||
break;
|
||||
|
@ -9410,6 +9445,38 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_video extends Video {
|
||||
public static int constructor = 0xf72887d3;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
id = stream.readInt64(exception);
|
||||
access_hash = stream.readInt64(exception);
|
||||
date = stream.readInt32(exception);
|
||||
duration = stream.readInt32(exception);
|
||||
mime_type = stream.readString(exception);
|
||||
size = stream.readInt32(exception);
|
||||
thumb = PhotoSize.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
dc_id = stream.readInt32(exception);
|
||||
w = stream.readInt32(exception);
|
||||
h = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt64(id);
|
||||
stream.writeInt64(access_hash);
|
||||
stream.writeInt32(date);
|
||||
stream.writeInt32(duration);
|
||||
stream.writeString(mime_type);
|
||||
stream.writeInt32(size);
|
||||
thumb.serializeToStream(stream);
|
||||
stream.writeInt32(dc_id);
|
||||
stream.writeInt32(w);
|
||||
stream.writeInt32(h);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_video_old3 extends TL_video {
|
||||
public static int constructor = 0xee9f4a4d;
|
||||
|
||||
|
||||
|
@ -9818,6 +9885,52 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class help_AppChangelog extends TLObject {
|
||||
public String text;
|
||||
|
||||
public static help_AppChangelog TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
help_AppChangelog result = null;
|
||||
switch(constructor) {
|
||||
case 0xaf7e0394:
|
||||
result = new TL_help_appChangelogEmpty();
|
||||
break;
|
||||
case 0x4668e6bd:
|
||||
result = new TL_help_appChangelog();
|
||||
break;
|
||||
}
|
||||
if (result == null && exception) {
|
||||
throw new RuntimeException(String.format("can't parse magic %x in help_AppChangelog", constructor));
|
||||
}
|
||||
if (result != null) {
|
||||
result.readParams(stream, exception);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_help_appChangelogEmpty extends help_AppChangelog {
|
||||
public static int constructor = 0xaf7e0394;
|
||||
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_help_appChangelog extends help_AppChangelog {
|
||||
public static int constructor = 0x4668e6bd;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
text = stream.readString(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeString(text);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_keyboardButton extends TLObject {
|
||||
public static int constructor = 0xa2fa4880;
|
||||
|
||||
|
@ -10349,6 +10462,7 @@ public class TLRPC {
|
|||
public int fwd_from_id;
|
||||
public int fwd_date;
|
||||
public int reply_to_msg_id;
|
||||
public ArrayList<MessageEntity> entities = new ArrayList<>();
|
||||
public ArrayList<Update> updates = new ArrayList<>();
|
||||
public ArrayList<User> users = new ArrayList<>();
|
||||
public ArrayList<Chat> chats = new ArrayList<>();
|
||||
|
@ -10360,13 +10474,13 @@ public class TLRPC {
|
|||
public static Updates TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
Updates result = null;
|
||||
switch(constructor) {
|
||||
case 0x52238b3c:
|
||||
case 0xf9409b3d:
|
||||
result = new TL_updateShortChatMessage();
|
||||
break;
|
||||
case 0x74ae4240:
|
||||
result = new TL_updates();
|
||||
break;
|
||||
case 0xed5c2127:
|
||||
case 0x3f32d858:
|
||||
result = new TL_updateShortMessage();
|
||||
break;
|
||||
case 0x78d4dec1:
|
||||
|
@ -10390,7 +10504,7 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_updateShortChatMessage extends Updates {
|
||||
public static int constructor = 0x52238b3c;
|
||||
public static int constructor = 0xf9409b3d;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
|
@ -10411,6 +10525,23 @@ public class TLRPC {
|
|||
if ((flags & 8) != 0) {
|
||||
reply_to_msg_id = stream.readInt32(exception);
|
||||
}
|
||||
if ((flags & 128) != 0) {
|
||||
int magic = stream.readInt32(exception);
|
||||
if (magic != 0x1cb5c415) {
|
||||
if (exception) {
|
||||
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||
}
|
||||
return;
|
||||
}
|
||||
int count = stream.readInt32(exception);
|
||||
for (int a = 0; a < count; a++) {
|
||||
MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if (object == null) {
|
||||
return;
|
||||
}
|
||||
entities.add(object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
|
@ -10432,6 +10563,14 @@ public class TLRPC {
|
|||
if ((flags & 8) != 0) {
|
||||
stream.writeInt32(reply_to_msg_id);
|
||||
}
|
||||
if ((flags & 128) != 0) {
|
||||
stream.writeInt32(0x1cb5c415);
|
||||
int count = entities.size();
|
||||
stream.writeInt32(count);
|
||||
for (int a = 0; a < count; a++) {
|
||||
entities.get(a).serializeToStream(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10515,7 +10654,7 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_updateShortMessage extends Updates {
|
||||
public static int constructor = 0xed5c2127;
|
||||
public static int constructor = 0x3f32d858;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
|
@ -10535,6 +10674,23 @@ public class TLRPC {
|
|||
if ((flags & 8) != 0) {
|
||||
reply_to_msg_id = stream.readInt32(exception);
|
||||
}
|
||||
if ((flags & 128) != 0) {
|
||||
int magic = stream.readInt32(exception);
|
||||
if (magic != 0x1cb5c415) {
|
||||
if (exception) {
|
||||
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||
}
|
||||
return;
|
||||
}
|
||||
int count = stream.readInt32(exception);
|
||||
for (int a = 0; a < count; a++) {
|
||||
MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if (object == null) {
|
||||
return;
|
||||
}
|
||||
entities.add(object);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
|
@ -10555,6 +10711,14 @@ public class TLRPC {
|
|||
if ((flags & 8) != 0) {
|
||||
stream.writeInt32(reply_to_msg_id);
|
||||
}
|
||||
if ((flags & 128) != 0) {
|
||||
stream.writeInt32(0x1cb5c415);
|
||||
int count = entities.size();
|
||||
stream.writeInt32(count);
|
||||
for (int a = 0; a < count; a++) {
|
||||
entities.get(a).serializeToStream(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11217,17 +11381,20 @@ public class TLRPC {
|
|||
public static Audio TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
Audio result = null;
|
||||
switch(constructor) {
|
||||
case 0x586988d8:
|
||||
result = new TL_audioEmpty();
|
||||
break;
|
||||
case 0x427425e7:
|
||||
result = new TL_audio_old();
|
||||
break;
|
||||
case 0xc7ac6496:
|
||||
case 0xf9e35055:
|
||||
result = new TL_audio();
|
||||
break;
|
||||
case 0x555555F6:
|
||||
result = new TL_audioEncrypted();
|
||||
break;
|
||||
case 0x586988d8:
|
||||
result = new TL_audioEmpty();
|
||||
case 0xc7ac6496:
|
||||
result = new TL_audio_old2();
|
||||
break;
|
||||
}
|
||||
if (result == null && exception) {
|
||||
|
@ -11266,7 +11433,7 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_audio extends Audio {
|
||||
public static class TL_audio_old2 extends TL_audio {
|
||||
public static int constructor = 0xc7ac6496;
|
||||
|
||||
|
||||
|
@ -11294,6 +11461,32 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_audio extends Audio {
|
||||
public static int constructor = 0xf9e35055;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
id = stream.readInt64(exception);
|
||||
access_hash = stream.readInt64(exception);
|
||||
date = stream.readInt32(exception);
|
||||
duration = stream.readInt32(exception);
|
||||
mime_type = stream.readString(exception);
|
||||
size = stream.readInt32(exception);
|
||||
dc_id = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt64(id);
|
||||
stream.writeInt64(access_hash);
|
||||
stream.writeInt32(date);
|
||||
stream.writeInt32(duration);
|
||||
stream.writeString(mime_type);
|
||||
stream.writeInt32(size);
|
||||
stream.writeInt32(dc_id);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_audioEncrypted extends TL_audio {
|
||||
public static int constructor = 0x555555F6;
|
||||
|
||||
|
@ -12950,6 +13143,239 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class MessageEntity extends TLObject {
|
||||
public int offset;
|
||||
public int length;
|
||||
public String language;
|
||||
public String url;
|
||||
|
||||
public static MessageEntity TLdeserialize(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
MessageEntity result = null;
|
||||
switch(constructor) {
|
||||
case 0x6ed02538:
|
||||
result = new TL_messageEntityUrl();
|
||||
break;
|
||||
case 0xbd610bc9:
|
||||
result = new TL_messageEntityBold();
|
||||
break;
|
||||
case 0x826f8b60:
|
||||
result = new TL_messageEntityItalic();
|
||||
break;
|
||||
case 0x64e475c2:
|
||||
result = new TL_messageEntityEmail();
|
||||
break;
|
||||
case 0x73924be0:
|
||||
result = new TL_messageEntityPre();
|
||||
break;
|
||||
case 0x76a6d327:
|
||||
result = new TL_messageEntityTextUrl();
|
||||
break;
|
||||
case 0xbb92ba95:
|
||||
result = new TL_messageEntityUnknown();
|
||||
break;
|
||||
case 0x6f635b0d:
|
||||
result = new TL_messageEntityHashtag();
|
||||
break;
|
||||
case 0x6cef8ac7:
|
||||
result = new TL_messageEntityBotCommand();
|
||||
break;
|
||||
case 0x28a20571:
|
||||
result = new TL_messageEntityCode();
|
||||
break;
|
||||
case 0xfa04579d:
|
||||
result = new TL_messageEntityMention();
|
||||
break;
|
||||
}
|
||||
if (result == null && exception) {
|
||||
throw new RuntimeException(String.format("can't parse magic %x in MessageEntity", constructor));
|
||||
}
|
||||
if (result != null) {
|
||||
result.readParams(stream, exception);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityUrl extends MessageEntity {
|
||||
public static int constructor = 0x6ed02538;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityBold extends MessageEntity {
|
||||
public static int constructor = 0xbd610bc9;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityItalic extends MessageEntity {
|
||||
public static int constructor = 0x826f8b60;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityEmail extends MessageEntity {
|
||||
public static int constructor = 0x64e475c2;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityPre extends MessageEntity {
|
||||
public static int constructor = 0x73924be0;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
language = stream.readString(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
stream.writeString(language);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityTextUrl extends MessageEntity {
|
||||
public static int constructor = 0x76a6d327;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
url = stream.readString(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
stream.writeString(url);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityUnknown extends MessageEntity {
|
||||
public static int constructor = 0xbb92ba95;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityHashtag extends MessageEntity {
|
||||
public static int constructor = 0x6f635b0d;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityBotCommand extends MessageEntity {
|
||||
public static int constructor = 0x6cef8ac7;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityCode extends MessageEntity {
|
||||
public static int constructor = 0x28a20571;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_messageEntityMention extends MessageEntity {
|
||||
public static int constructor = 0xfa04579d;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
offset = stream.readInt32(exception);
|
||||
length = stream.readInt32(exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(length);
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_destroy_sessions_res extends TLObject {
|
||||
public static int constructor = 0xfb95abcd;
|
||||
|
||||
|
@ -13826,7 +14252,7 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_messages_sendMessage extends TLObject {
|
||||
public static int constructor = 0xfc55e6b5;
|
||||
public static int constructor = 0xdf12390;
|
||||
|
||||
public int flags;
|
||||
public InputPeer peer;
|
||||
|
@ -13834,6 +14260,7 @@ public class TLRPC {
|
|||
public String message;
|
||||
public long random_id;
|
||||
public ReplyMarkup reply_markup;
|
||||
public ArrayList<MessageEntity> entities = new ArrayList<>();
|
||||
|
||||
public TLObject deserializeResponse(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
return messages_SentMessage.TLdeserialize(stream, constructor, exception);
|
||||
|
@ -13851,6 +14278,14 @@ public class TLRPC {
|
|||
if ((flags & 4) != 0) {
|
||||
reply_markup.serializeToStream(stream);
|
||||
}
|
||||
if ((flags & 8) != 0) {
|
||||
stream.writeInt32(0x1cb5c415);
|
||||
int count = entities.size();
|
||||
stream.writeInt32(count);
|
||||
for (int a = 0; a < count; a++) {
|
||||
entities.get(a).serializeToStream(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -14236,11 +14671,11 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_photos_getUserPhotos extends TLObject {
|
||||
public static int constructor = 0xb7ee553c;
|
||||
public static int constructor = 0x91cd32a8;
|
||||
|
||||
public InputUser user_id;
|
||||
public int offset;
|
||||
public int max_id;
|
||||
public long max_id;
|
||||
public int limit;
|
||||
|
||||
public TLObject deserializeResponse(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
|
@ -14251,7 +14686,7 @@ public class TLRPC {
|
|||
stream.writeInt32(constructor);
|
||||
user_id.serializeToStream(stream);
|
||||
stream.writeInt32(offset);
|
||||
stream.writeInt32(max_id);
|
||||
stream.writeInt64(max_id);
|
||||
stream.writeInt32(limit);
|
||||
}
|
||||
}
|
||||
|
@ -15175,6 +15610,27 @@ public class TLRPC {
|
|||
}
|
||||
}
|
||||
|
||||
public static class TL_help_getAppChangelog extends TLObject {
|
||||
public static int constructor = 0x5bab7fb2;
|
||||
|
||||
public String device_model;
|
||||
public String system_version;
|
||||
public String app_version;
|
||||
public String lang_code;
|
||||
|
||||
public TLObject deserializeResponse(AbsSerializedData stream, int constructor, boolean exception) {
|
||||
return help_AppChangelog.TLdeserialize(stream, constructor, exception);
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeString(device_model);
|
||||
stream.writeString(system_version);
|
||||
stream.writeString(app_version);
|
||||
stream.writeString(lang_code);
|
||||
}
|
||||
}
|
||||
|
||||
//manually created
|
||||
|
||||
//EncryptedChat start
|
||||
|
@ -15252,6 +15708,7 @@ public class TLRPC {
|
|||
public String message;
|
||||
public MessageMedia media;
|
||||
public int flags;
|
||||
public ArrayList<MessageEntity> entities = new ArrayList<>();
|
||||
public ReplyMarkup reply_markup;
|
||||
public int send_state = 0; //custom
|
||||
public int fwd_msg_id = 0; //custom
|
||||
|
@ -15276,11 +15733,14 @@ public class TLRPC {
|
|||
result = new TL_message_old3();
|
||||
break;
|
||||
case 0xc3060325:
|
||||
result = new TL_message();
|
||||
result = new TL_message_old4();
|
||||
break;
|
||||
case 0x83e5de54:
|
||||
result = new TL_messageEmpty();
|
||||
break;
|
||||
case 0xf07814c8:
|
||||
result = new TL_message();
|
||||
break;
|
||||
case 0xa367e716:
|
||||
result = new TL_messageForwarded_old2(); //custom
|
||||
break;
|
||||
|
@ -15352,6 +15812,91 @@ public class TLRPC {
|
|||
}
|
||||
|
||||
public static class TL_message extends Message {
|
||||
public static int constructor = 0xf07814c8;
|
||||
|
||||
|
||||
public void readParams(AbsSerializedData stream, boolean exception) {
|
||||
flags = stream.readInt32(exception);
|
||||
id = stream.readInt32(exception);
|
||||
from_id = stream.readInt32(exception);
|
||||
to_id = Peer.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if ((flags & 4) != 0) {
|
||||
fwd_from_id = stream.readInt32(exception);
|
||||
}
|
||||
if ((flags & 4) != 0) {
|
||||
fwd_date = stream.readInt32(exception);
|
||||
}
|
||||
if ((flags & 8) != 0) {
|
||||
reply_to_msg_id = stream.readInt32(exception);
|
||||
}
|
||||
date = stream.readInt32(exception);
|
||||
message = stream.readString(exception);
|
||||
media = MessageMedia.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if ((flags & 64) != 0) {
|
||||
reply_markup = ReplyMarkup.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
}
|
||||
if ((flags & 128) != 0) {
|
||||
int magic = stream.readInt32(exception);
|
||||
if (magic != 0x1cb5c415) {
|
||||
if (exception) {
|
||||
throw new RuntimeException(String.format("wrong Vector magic, got %x", magic));
|
||||
}
|
||||
return;
|
||||
}
|
||||
int count = stream.readInt32(exception);
|
||||
for (int a = 0; a < count; a++) {
|
||||
MessageEntity object = MessageEntity.TLdeserialize(stream, stream.readInt32(exception), exception);
|
||||
if (object == null) {
|
||||
return;
|
||||
}
|
||||
entities.add(object);
|
||||
}
|
||||
}
|
||||
if (id < 0 || (media != null && !(media instanceof TL_messageMediaEmpty) && !(media instanceof TL_messageMediaWebPage) && message != null && message.length() != 0 && message.startsWith("-1"))) {
|
||||
attachPath = stream.readString(exception);
|
||||
}
|
||||
if ((flags & MESSAGE_FLAG_FWD) != 0 && id < 0) {
|
||||
fwd_msg_id = stream.readInt32(exception);
|
||||
}
|
||||
}
|
||||
|
||||
public void serializeToStream(AbsSerializedData stream) {
|
||||
stream.writeInt32(constructor);
|
||||
stream.writeInt32(flags);
|
||||
stream.writeInt32(id);
|
||||
stream.writeInt32(from_id);
|
||||
to_id.serializeToStream(stream);
|
||||
if ((flags & 4) != 0) {
|
||||
stream.writeInt32(fwd_from_id);
|
||||
}
|
||||
if ((flags & 4) != 0) {
|
||||
stream.writeInt32(fwd_date);
|
||||
}
|
||||
if ((flags & 8) != 0) {
|
||||
stream.writeInt32(reply_to_msg_id);
|
||||
}
|
||||
stream.writeInt32(date);
|
||||
stream.writeString(message);
|
||||
media.serializeToStream(stream);
|
||||
if ((flags & 64) != 0) {
|
||||
reply_markup.serializeToStream(stream);
|
||||
}
|
||||
if ((flags & 128) != 0) {
|
||||
stream.writeInt32(0x1cb5c415);
|
||||
int count = entities.size();
|
||||
stream.writeInt32(count);
|
||||
for (int a = 0; a < count; a++) {
|
||||
entities.get(a).serializeToStream(stream);
|
||||
}
|
||||
}
|
||||
stream.writeString(attachPath);
|
||||
if ((flags & MESSAGE_FLAG_FWD) != 0 && id < 0) {
|
||||
stream.writeInt32(fwd_msg_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class TL_message_old4 extends TL_message {
|
||||
public static int constructor = 0xc3060325;
|
||||
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ public class ChatBaseCell extends BaseCell implements MediaController.FileDownlo
|
|||
void didPressedCancelSendButton(ChatBaseCell cell);
|
||||
void didLongPressed(ChatBaseCell cell);
|
||||
void didPressReplyMessage(ChatBaseCell cell, int id);
|
||||
void didPressUrl(MessageObject messageObject, String url);
|
||||
void didPressUrl(MessageObject messageObject, ClickableSpan url);
|
||||
void needOpenWebView(String url, String title, String originalUrl, int w, int h);
|
||||
void didClickedImage(ChatBaseCell cell);
|
||||
boolean canPerformActions();
|
||||
|
|
|
@ -38,7 +38,6 @@ import org.telegram.android.MessageObject;
|
|||
import org.telegram.ui.Components.RadialProgress;
|
||||
import org.telegram.ui.Components.ResourceLoader;
|
||||
import org.telegram.ui.Components.StaticLayoutEx;
|
||||
import org.telegram.ui.Components.URLSpanNoUnderline;
|
||||
import org.telegram.ui.PhotoViewer;
|
||||
import org.telegram.ui.Components.GifDrawable;
|
||||
import org.telegram.android.ImageReceiver;
|
||||
|
@ -205,16 +204,7 @@ public class ChatMediaCell extends ChatBaseCell {
|
|||
}
|
||||
} else if (linkPreviewPressed) {
|
||||
try {
|
||||
if (pressedLink instanceof URLSpanNoUnderline) {
|
||||
String url = ((URLSpanNoUnderline) pressedLink).getURL();
|
||||
if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) {
|
||||
if (delegate != null) {
|
||||
delegate.didPressUrl(currentMessageObject, url);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pressedLink.onClick(this);
|
||||
}
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
|
|
|
@ -38,7 +38,6 @@ import org.telegram.messenger.TLRPC;
|
|||
import org.telegram.ui.Components.RadialProgress;
|
||||
import org.telegram.ui.Components.ResourceLoader;
|
||||
import org.telegram.ui.Components.StaticLayoutEx;
|
||||
import org.telegram.ui.Components.URLSpanNoUnderline;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Locale;
|
||||
|
@ -131,16 +130,7 @@ public class ChatMessageCell extends ChatBaseCell {
|
|||
} else {
|
||||
if (link[0] == pressedLink) {
|
||||
try {
|
||||
if (pressedLink instanceof URLSpanNoUnderline) {
|
||||
String url = ((URLSpanNoUnderline) pressedLink).getURL();
|
||||
if (url.startsWith("@") || url.startsWith("#") || url.startsWith("/")) {
|
||||
if (delegate != null) {
|
||||
delegate.didPressUrl(currentMessageObject, url);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pressedLink.onClick(this);
|
||||
}
|
||||
delegate.didPressUrl(currentMessageObject, pressedLink);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
|
@ -215,7 +205,10 @@ public class ChatMessageCell extends ChatBaseCell {
|
|||
pressedLink.onClick(this);
|
||||
} else {
|
||||
if (drawImageButton && delegate != null) {
|
||||
delegate.didClickedImage(this);
|
||||
if (buttonState == -1) {
|
||||
playSoundEffect(SoundEffectConstants.CLICK);
|
||||
delegate.didClickedImage(this);
|
||||
}
|
||||
} else {
|
||||
TLRPC.WebPage webPage = currentMessageObject.messageOwner.media.webpage;
|
||||
if (Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) {
|
||||
|
@ -839,7 +832,7 @@ public class ChatMessageCell extends ChatBaseCell {
|
|||
if (drawImageButton) {
|
||||
int size = AndroidUtilities.dp(48);
|
||||
buttonX = (int) (linkImageView.getImageX() + (linkImageView.getImageWidth() - size) / 2.0f);
|
||||
buttonY = (int) (linkImageView.getImageY() + (linkImageView.getImageHeight() - size) / 2.0f) + namesOffset;
|
||||
buttonY = (int) (linkImageView.getImageY() + (linkImageView.getImageHeight() - size) / 2.0f);
|
||||
radialProgress.setProgressRect(buttonX, buttonY, buttonX + AndroidUtilities.dp(48), buttonY + AndroidUtilities.dp(48));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,45 +10,73 @@ package org.telegram.ui.Cells;
|
|||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.provider.Browser;
|
||||
import android.text.Layout;
|
||||
import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.Gravity;
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import org.telegram.android.AndroidUtilities;
|
||||
import org.telegram.android.ImageReceiver;
|
||||
import org.telegram.android.LocaleController;
|
||||
import org.telegram.android.MediaController;
|
||||
import org.telegram.android.MessageObject;
|
||||
import org.telegram.messenger.FileLoader;
|
||||
import org.telegram.messenger.FileLog;
|
||||
import org.telegram.messenger.R;
|
||||
import org.telegram.messenger.TLRPC;
|
||||
import org.telegram.ui.Components.CheckBox;
|
||||
import org.telegram.ui.Components.LayoutHelper;
|
||||
import org.telegram.ui.Components.LetterDrawable;
|
||||
import org.telegram.ui.Components.LinkPath;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
|
||||
public class SharedLinkCell extends View {
|
||||
public class SharedLinkCell extends FrameLayout {
|
||||
|
||||
public interface SharedLinkCellDelegate {
|
||||
void needOpenWebView(TLRPC.WebPage webPage);
|
||||
boolean canPerformActions();
|
||||
}
|
||||
|
||||
private boolean linkPreviewPressed;
|
||||
private LinkPath urlPath = new LinkPath();
|
||||
private static Paint urlPaint;
|
||||
private int pressedLink;
|
||||
|
||||
private ImageReceiver linkImageView;
|
||||
private boolean drawLinkImageView;
|
||||
private LetterDrawable letterDrawable;
|
||||
private CheckBox checkBox;
|
||||
|
||||
private SharedLinkCellDelegate delegate;
|
||||
|
||||
private boolean needDivider;
|
||||
|
||||
private int linkX;
|
||||
ArrayList<String> links = new ArrayList<>();
|
||||
private int linkY;
|
||||
private StaticLayout linkLayout;
|
||||
private ArrayList<StaticLayout> linkLayout = new ArrayList<>();
|
||||
|
||||
private int titleX;
|
||||
private int titleY;
|
||||
private int titleY = AndroidUtilities.dp(7);
|
||||
private StaticLayout titleLayout;
|
||||
|
||||
private int descriptionX;
|
||||
private int descriptionY;
|
||||
private int descriptionY = AndroidUtilities.dp(27);
|
||||
private StaticLayout descriptionLayout;
|
||||
|
||||
private int description2Y = AndroidUtilities.dp(27);
|
||||
private StaticLayout descriptionLayout2;
|
||||
|
||||
private MessageObject message;
|
||||
|
||||
private static TextPaint titleTextPaint;
|
||||
|
@ -70,8 +98,18 @@ public class SharedLinkCell extends View {
|
|||
paint = new Paint();
|
||||
paint.setColor(0xffd9d9d9);
|
||||
paint.setStrokeWidth(1);
|
||||
|
||||
urlPaint = new Paint();
|
||||
urlPaint.setColor(0x33316f9f);
|
||||
}
|
||||
|
||||
setWillNotDraw(false);
|
||||
linkImageView = new ImageReceiver(this);
|
||||
letterDrawable = new LetterDrawable();
|
||||
|
||||
checkBox = new CheckBox(context, R.drawable.round_check2);
|
||||
checkBox.setVisibility(INVISIBLE);
|
||||
addView(checkBox, LayoutHelper.createFrame(22, 22, (LocaleController.isRTL ? Gravity.RIGHT : Gravity.LEFT) | Gravity.TOP, LocaleController.isRTL ? 0 : 44, 44, LocaleController.isRTL ? 44 : 0, 0));
|
||||
}
|
||||
|
||||
@SuppressLint("DrawAllocation")
|
||||
|
@ -80,16 +118,17 @@ public class SharedLinkCell extends View {
|
|||
drawLinkImageView = false;
|
||||
descriptionLayout = null;
|
||||
titleLayout = null;
|
||||
linkLayout = null;
|
||||
descriptionX = 0;
|
||||
titleX = 0;
|
||||
linkX = 0;
|
||||
descriptionLayout2 = null;
|
||||
description2Y = descriptionY;
|
||||
linkLayout.clear();
|
||||
links.clear();
|
||||
|
||||
int maxWidth = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(32);
|
||||
int maxWidth = MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(AndroidUtilities.leftBaseline) - AndroidUtilities.dp(8);
|
||||
|
||||
String title = "";
|
||||
String description = "";
|
||||
String link = "";
|
||||
String title = null;
|
||||
String description = null;
|
||||
String description2 = null;
|
||||
String webPageLink = null;
|
||||
boolean hasPhoto = false;
|
||||
|
||||
if (message.messageOwner.media instanceof TLRPC.TL_messageMediaWebPage && message.messageOwner.media.webpage instanceof TLRPC.TL_webPage) {
|
||||
|
@ -103,57 +142,135 @@ public class SharedLinkCell extends View {
|
|||
title = webPage.site_name;
|
||||
}
|
||||
description = webPage.description;
|
||||
link = webPage.url;
|
||||
webPageLink = webPage.url;
|
||||
}
|
||||
if (!message.messageOwner.entities.isEmpty()) {
|
||||
for (int a = 0; a < message.messageOwner.entities.size(); a++) {
|
||||
TLRPC.MessageEntity entity = message.messageOwner.entities.get(a);
|
||||
if (entity.length <= 0 || entity.offset < 0 || entity.offset >= message.messageOwner.message.length()) {
|
||||
continue;
|
||||
} else if (entity.offset + entity.length > message.messageOwner.message.length()) {
|
||||
entity.length = message.messageOwner.message.length() - entity.offset;
|
||||
}
|
||||
if (a == 0 && webPageLink != null && !(entity.offset == 0 && entity.length == message.messageOwner.message.length())) {
|
||||
if (message.messageOwner.entities.size() == 1) {
|
||||
if (description == null) {
|
||||
description2 = message.messageOwner.message;
|
||||
}
|
||||
} else {
|
||||
description2 = message.messageOwner.message;
|
||||
}
|
||||
}
|
||||
try {
|
||||
String link = null;
|
||||
if (entity instanceof TLRPC.TL_messageEntityTextUrl || entity instanceof TLRPC.TL_messageEntityUrl) {
|
||||
if (entity instanceof TLRPC.TL_messageEntityUrl) {
|
||||
link = message.messageOwner.message.substring(entity.offset, entity.offset + entity.length);
|
||||
} else {
|
||||
link = entity.url;
|
||||
}
|
||||
if (title == null || title.length() == 0) {
|
||||
title = link;
|
||||
Uri uri = Uri.parse(title);
|
||||
title = uri.getHost();
|
||||
if (title == null) {
|
||||
title = link;
|
||||
}
|
||||
int index;
|
||||
if (title != null && (index = title.lastIndexOf('.')) >= 0) {
|
||||
title = title.substring(0, index);
|
||||
if ((index = title.lastIndexOf('.')) >= 0) {
|
||||
title = title.substring(index + 1);
|
||||
}
|
||||
title = title.substring(0, 1).toUpperCase() + title.substring(1);
|
||||
}
|
||||
if (entity.offset != 0 || entity.length != message.messageOwner.message.length()) {
|
||||
description = message.messageOwner.message;
|
||||
}
|
||||
}
|
||||
} else if (entity instanceof TLRPC.TL_messageEntityEmail) {
|
||||
if (title == null || title.length() == 0) {
|
||||
link = "mailto:" + message.messageOwner.message.substring(entity.offset, entity.offset + entity.length);
|
||||
title = message.messageOwner.message.substring(entity.offset, entity.offset + entity.length);
|
||||
if (entity.offset != 0 || entity.length != message.messageOwner.message.length()) {
|
||||
description = message.messageOwner.message;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (link != null) {
|
||||
if (link.toLowerCase().indexOf("http") != 0 && link.toLowerCase().indexOf("mailto") != 0) {
|
||||
links.add("http://" + link);
|
||||
} else {
|
||||
links.add(link);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (webPageLink != null && links.isEmpty()) {
|
||||
links.add(webPageLink);
|
||||
}
|
||||
|
||||
if (title != null) {
|
||||
try {
|
||||
int width = (int) Math.ceil(titleTextPaint.measureText(title));
|
||||
CharSequence titleFinal = TextUtils.ellipsize(title.replace("\n", " "), titleTextPaint, Math.min(width, maxWidth - (hasPhoto ? AndroidUtilities.dp(56) : 0)), TextUtils.TruncateAt.END);
|
||||
CharSequence titleFinal = TextUtils.ellipsize(title.replace("\n", " "), titleTextPaint, Math.min(width, maxWidth), TextUtils.TruncateAt.END);
|
||||
titleLayout = new StaticLayout(titleFinal, titleTextPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
titleX = (int) Math.ceil(-titleLayout.getLineLeft(0)) + AndroidUtilities.dp(16);
|
||||
titleY = AndroidUtilities.dp(8);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
letterDrawable.setTitle(title);
|
||||
}
|
||||
|
||||
if (description != null) {
|
||||
try {
|
||||
descriptionLayout = ChatMessageCell.generateStaticLayout(description, descriptionTextPaint, maxWidth, maxWidth - (hasPhoto ? AndroidUtilities.dp(56) : 0), 2, 6);
|
||||
descriptionLayout = ChatMessageCell.generateStaticLayout(description, descriptionTextPaint, maxWidth, maxWidth, 0, 3);
|
||||
int height = descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1);
|
||||
for (int a = 0; a < descriptionLayout.getLineCount(); a++) {
|
||||
int lineLeft = (int) Math.ceil(descriptionLayout.getLineLeft(a));
|
||||
if (descriptionX == 0) {
|
||||
descriptionX = -lineLeft;
|
||||
} else {
|
||||
descriptionX = Math.max(descriptionX, -lineLeft);
|
||||
}
|
||||
if (descriptionLayout.getLineCount() > 0) {
|
||||
description2Y = descriptionY + descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1) + AndroidUtilities.dp(1);
|
||||
}
|
||||
descriptionX += AndroidUtilities.dp(16);
|
||||
descriptionY = AndroidUtilities.dp(28);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
|
||||
if (link != null) {
|
||||
if (description2 != null) {
|
||||
try {
|
||||
int width = (int) Math.ceil(descriptionTextPaint.measureText(link));
|
||||
CharSequence linkFinal = TextUtils.ellipsize(link.replace("\n", " "), descriptionTextPaint, Math.min(width, maxWidth), TextUtils.TruncateAt.END);
|
||||
linkLayout = new StaticLayout(linkFinal, descriptionTextPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
linkX = (int) Math.ceil(-linkLayout.getLineLeft(0)) + AndroidUtilities.dp(16);
|
||||
linkY = descriptionY;
|
||||
if (descriptionLayout != null && descriptionLayout.getLineCount() != 0) {
|
||||
linkY += descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1) + AndroidUtilities.dp(1);
|
||||
descriptionLayout2 = ChatMessageCell.generateStaticLayout(description2, descriptionTextPaint, maxWidth, maxWidth, 0, 3);
|
||||
int height = descriptionLayout2.getLineBottom(descriptionLayout2.getLineCount() - 1);
|
||||
if (descriptionLayout != null) {
|
||||
description2Y += AndroidUtilities.dp(10);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
|
||||
if (!links.isEmpty()) {
|
||||
for (int a = 0; a < links.size(); a++) {
|
||||
try {
|
||||
String link = links.get(a);
|
||||
int width = (int) Math.ceil(descriptionTextPaint.measureText(link));
|
||||
CharSequence linkFinal = TextUtils.ellipsize(link.replace("\n", " "), descriptionTextPaint, Math.min(width, maxWidth), TextUtils.TruncateAt.MIDDLE);
|
||||
StaticLayout layout = new StaticLayout(linkFinal, descriptionTextPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
linkY = description2Y;
|
||||
if (descriptionLayout2 != null && descriptionLayout2.getLineCount() != 0) {
|
||||
linkY += descriptionLayout2.getLineBottom(descriptionLayout2.getLineCount() - 1) + AndroidUtilities.dp(1);
|
||||
}
|
||||
linkLayout.add(layout);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int maxPhotoWidth = AndroidUtilities.dp(52);
|
||||
int x = LocaleController.isRTL ? MeasureSpec.getSize(widthMeasureSpec) - AndroidUtilities.dp(10) - maxPhotoWidth : AndroidUtilities.dp(10);
|
||||
letterDrawable.setBounds(x, AndroidUtilities.dp(10), x + maxPhotoWidth, AndroidUtilities.dp(62));
|
||||
|
||||
if (hasPhoto) {
|
||||
int maxPhotoWidth = AndroidUtilities.dp(48);
|
||||
TLRPC.PhotoSize currentPhotoObject = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, maxPhotoWidth, true);
|
||||
TLRPC.PhotoSize currentPhotoObjectThumb = FileLoader.getClosestPhotoSizeWithSize(message.photoThumbs, 80);
|
||||
if (currentPhotoObjectThumb == currentPhotoObject) {
|
||||
|
@ -163,7 +280,7 @@ public class SharedLinkCell extends View {
|
|||
if (currentPhotoObjectThumb != null) {
|
||||
currentPhotoObjectThumb.size = -1;
|
||||
}
|
||||
linkImageView.setImageCoords(maxWidth - AndroidUtilities.dp(32), AndroidUtilities.dp(8), maxPhotoWidth, maxPhotoWidth);
|
||||
linkImageView.setImageCoords(x, AndroidUtilities.dp(10), maxPhotoWidth, maxPhotoWidth);
|
||||
String fileName = FileLoader.getAttachFileName(currentPhotoObject);
|
||||
boolean photoExist = true;
|
||||
File cacheFile = FileLoader.getPathToAttach(currentPhotoObject, true);
|
||||
|
@ -190,32 +307,143 @@ public class SharedLinkCell extends View {
|
|||
if (descriptionLayout != null && descriptionLayout.getLineCount() != 0) {
|
||||
height += descriptionLayout.getLineBottom(descriptionLayout.getLineCount() - 1);
|
||||
}
|
||||
if (linkLayout != null && linkLayout.getLineCount() != 0) {
|
||||
height += linkLayout.getLineBottom(linkLayout.getLineCount() - 1);
|
||||
if (descriptionLayout2 != null && descriptionLayout2.getLineCount() != 0) {
|
||||
height += descriptionLayout2.getLineBottom(descriptionLayout2.getLineCount() - 1);
|
||||
if (descriptionLayout != null) {
|
||||
height += AndroidUtilities.dp(10);
|
||||
}
|
||||
}
|
||||
for (int a = 0; a < linkLayout.size(); a++) {
|
||||
StaticLayout layout = linkLayout.get(a);
|
||||
if (layout.getLineCount() > 0) {
|
||||
height += layout.getLineBottom(layout.getLineCount() - 1);
|
||||
}
|
||||
}
|
||||
if (hasPhoto) {
|
||||
height = Math.max(AndroidUtilities.dp(48), height);
|
||||
}
|
||||
|
||||
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.makeMeasureSpec(height + AndroidUtilities.dp(16) + (needDivider ? 1 : 0), MeasureSpec.EXACTLY));
|
||||
checkBox.measure(MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(22), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(22), MeasureSpec.EXACTLY));
|
||||
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), Math.max(AndroidUtilities.dp(72), height + AndroidUtilities.dp(16)) + (needDivider ? 1 : 0));
|
||||
}
|
||||
|
||||
public void setLink(MessageObject messageObject, boolean divider) {
|
||||
needDivider = divider;
|
||||
resetPressedLink();
|
||||
message = messageObject;
|
||||
|
||||
requestLayout();
|
||||
}
|
||||
|
||||
public void setDelegate(SharedLinkCellDelegate sharedLinkCellDelegate) {
|
||||
delegate = sharedLinkCellDelegate;
|
||||
}
|
||||
|
||||
public MessageObject getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
if (drawLinkImageView) {
|
||||
linkImageView.onDetachedFromWindow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
if (drawLinkImageView) {
|
||||
linkImageView.onAttachedToWindow();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
boolean result = false;
|
||||
if (message != null && !linkLayout.isEmpty() && delegate.canPerformActions()) {
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN || linkPreviewPressed && event.getAction() == MotionEvent.ACTION_UP) {
|
||||
int x = (int) event.getX();
|
||||
int y = (int) event.getY();
|
||||
int offset = 0;
|
||||
boolean ok = false;
|
||||
for (int a = 0; a < linkLayout.size(); a++) {
|
||||
StaticLayout layout = linkLayout.get(a);
|
||||
if (layout.getLineCount() > 0) {
|
||||
int height = layout.getLineBottom(layout.getLineCount() - 1);
|
||||
int linkPosX = AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline);
|
||||
if (x >= linkPosX + layout.getLineLeft(0) && x <= linkPosX + layout.getLineWidth(0) && y >= linkY + offset && y <= linkY + offset + height) {
|
||||
ok = true;
|
||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||
resetPressedLink();
|
||||
pressedLink = a;
|
||||
linkPreviewPressed = true;
|
||||
try {
|
||||
urlPath.setCurrentLayout(layout, 0);
|
||||
layout.getSelectionPath(0, layout.getText().length(), urlPath);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
result = true;
|
||||
} else if (linkPreviewPressed) {
|
||||
try {
|
||||
TLRPC.WebPage webPage = pressedLink == 0 && message.messageOwner.media != null ? message.messageOwner.media.webpage : null;
|
||||
if (webPage != null && Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) {
|
||||
delegate.needOpenWebView(webPage);
|
||||
} else {
|
||||
Uri uri = Uri.parse(links.get(pressedLink));
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
|
||||
getContext().startActivity(intent);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
resetPressedLink();
|
||||
result = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
offset += height;
|
||||
}
|
||||
}
|
||||
if (!ok) {
|
||||
resetPressedLink();
|
||||
}
|
||||
} else if (event.getAction() == MotionEvent.ACTION_CANCEL) {
|
||||
resetPressedLink();
|
||||
}
|
||||
} else {
|
||||
resetPressedLink();
|
||||
}
|
||||
return result || super.onTouchEvent(event);
|
||||
}
|
||||
|
||||
public String getLink(int num) {
|
||||
if (num < 0 || num >= links.size()) {
|
||||
return null;
|
||||
}
|
||||
return links.get(num);
|
||||
}
|
||||
|
||||
protected void resetPressedLink() {
|
||||
pressedLink = -1;
|
||||
linkPreviewPressed = false;
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public void setChecked(boolean checked, boolean animated) {
|
||||
if (checkBox.getVisibility() != VISIBLE) {
|
||||
checkBox.setVisibility(VISIBLE);
|
||||
}
|
||||
checkBox.setChecked(checked, animated);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
if (titleLayout != null) {
|
||||
canvas.save();
|
||||
canvas.translate(titleX, titleY);
|
||||
canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), titleY);
|
||||
titleLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
|
@ -223,25 +451,48 @@ public class SharedLinkCell extends View {
|
|||
if (descriptionLayout != null) {
|
||||
descriptionTextPaint.setColor(0xff212121);
|
||||
canvas.save();
|
||||
canvas.translate(descriptionX, descriptionY);
|
||||
canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), descriptionY);
|
||||
descriptionLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
if (linkLayout != null) {
|
||||
descriptionTextPaint.setColor(0xff316f9f);
|
||||
if (descriptionLayout2 != null) {
|
||||
descriptionTextPaint.setColor(0xff212121);
|
||||
canvas.save();
|
||||
canvas.translate(linkX, linkY);
|
||||
linkLayout.draw(canvas);
|
||||
canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), description2Y);
|
||||
descriptionLayout2.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
if (!linkLayout.isEmpty()) {
|
||||
descriptionTextPaint.setColor(0xff316f9f);
|
||||
int offset = 0;
|
||||
for (int a = 0; a < linkLayout.size(); a++) {
|
||||
StaticLayout layout = linkLayout.get(a);
|
||||
if (layout.getLineCount() > 0) {
|
||||
canvas.save();
|
||||
canvas.translate(AndroidUtilities.dp(LocaleController.isRTL ? 8 : AndroidUtilities.leftBaseline), linkY + offset);
|
||||
if (pressedLink == a) {
|
||||
canvas.drawPath(urlPath, urlPaint);
|
||||
}
|
||||
layout.draw(canvas);
|
||||
canvas.restore();
|
||||
offset += layout.getLineBottom(layout.getLineCount() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
letterDrawable.draw(canvas);
|
||||
if (drawLinkImageView) {
|
||||
linkImageView.draw(canvas);
|
||||
}
|
||||
|
||||
if (needDivider) {
|
||||
canvas.drawLine(0, getHeight() - 1, getWidth(), getHeight() - 1, paint);
|
||||
if (LocaleController.isRTL) {
|
||||
canvas.drawLine(0, getMeasuredHeight() - 1, getMeasuredWidth() - AndroidUtilities.dp(AndroidUtilities.leftBaseline), getMeasuredHeight() - 1, paint);
|
||||
} else {
|
||||
canvas.drawLine(AndroidUtilities.dp(AndroidUtilities.leftBaseline), getMeasuredHeight() - 1, getMeasuredWidth(), getMeasuredHeight() - 1, paint);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ import android.os.Bundle;
|
|||
import android.provider.ContactsContract;
|
||||
import android.provider.MediaStore;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.ClickableSpan;
|
||||
import android.util.Base64;
|
||||
import android.util.SparseArray;
|
||||
import android.util.TypedValue;
|
||||
|
@ -114,6 +115,8 @@ import org.telegram.ui.Components.SendingFileExDrawable;
|
|||
import org.telegram.ui.Components.SizeNotifierFrameLayout;
|
||||
import org.telegram.ui.Components.TimerDrawable;
|
||||
import org.telegram.ui.Components.TypingDotsDrawable;
|
||||
import org.telegram.ui.Components.URLSpanNoUnderline;
|
||||
import org.telegram.ui.Components.URLSpanReplacement;
|
||||
import org.telegram.ui.Components.WebFrameLayout;
|
||||
|
||||
import java.io.File;
|
||||
|
@ -1883,16 +1886,27 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||
}
|
||||
AlertDialog.Builder builder = null;
|
||||
if (currentUser != null && userBlocked) {
|
||||
builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact));
|
||||
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
MessagesController.getInstance().unblockUser(currentUser.id);
|
||||
if ((currentUser.flags & TLRPC.USER_FLAG_BOT) != 0) {
|
||||
String botUserLast = botUser;
|
||||
botUser = null;
|
||||
MessagesController.getInstance().unblockUser(currentUser.id);
|
||||
if (botUserLast != null && botUserLast.length() != 0) {
|
||||
MessagesController.getInstance().sendBotStart(currentUser, botUserLast);
|
||||
} else {
|
||||
SendMessagesHelper.getInstance().sendMessage("/start", dialog_id, null, null, false);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact));
|
||||
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
MessagesController.getInstance().unblockUser(currentUser.id);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if (currentUser != null && botUser != null) {
|
||||
if (botUser.length() != 0) {
|
||||
if (botUser != null && botUser.length() != 0) {
|
||||
MessagesController.getInstance().sendBotStart(currentUser, botUser);
|
||||
} else {
|
||||
SendMessagesHelper.getInstance().sendMessage("/start", dialog_id, null, null, false);
|
||||
|
@ -2601,7 +2615,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||
bottomOverlay.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
if (hideKeyboard) {
|
||||
chatActivityEnterView.hidePopup();
|
||||
chatActivityEnterView.hidePopup(false);
|
||||
if (getParentActivity() != null) {
|
||||
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
|
||||
}
|
||||
|
@ -4363,10 +4377,14 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||
bottomOverlayChatText.setText(LocaleController.getString("DeleteThisGroup", R.string.DeleteThisGroup));
|
||||
} else {
|
||||
if (userBlocked) {
|
||||
bottomOverlayChatText.setText(LocaleController.getString("Unblock", R.string.Unblock));
|
||||
if ((currentUser.flags & TLRPC.USER_FLAG_BOT) != 0) {
|
||||
bottomOverlayChatText.setText(LocaleController.getString("BotUnblock", R.string.BotUnblock));
|
||||
} else {
|
||||
bottomOverlayChatText.setText(LocaleController.getString("Unblock", R.string.Unblock));
|
||||
}
|
||||
} else if (botUser != null) {
|
||||
bottomOverlayChatText.setText(LocaleController.getString("BotStart", R.string.BotStart));
|
||||
chatActivityEnterView.hidePopup();
|
||||
chatActivityEnterView.hidePopup(false);
|
||||
if (getParentActivity() != null) {
|
||||
AndroidUtilities.hideKeyboard(getParentActivity().getCurrentFocus());
|
||||
}
|
||||
|
@ -5039,7 +5057,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||
updateVisibleRows();
|
||||
return false;
|
||||
} else if (chatActivityEnterView.isPopupShowing()) {
|
||||
chatActivityEnterView.hidePopup();
|
||||
chatActivityEnterView.hidePopup(true);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -5345,15 +5363,36 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
|||
}
|
||||
|
||||
@Override
|
||||
public void didPressUrl(MessageObject messageObject, String url) {
|
||||
if (url.startsWith("@")) {
|
||||
MessagesController.openByUserName(url.substring(1), ChatActivity.this, 0);
|
||||
} else if (url.startsWith("#")) {
|
||||
DialogsActivity fragment = new DialogsActivity(null);
|
||||
fragment.setSearchString(url);
|
||||
presentFragment(fragment);
|
||||
} else if (url.startsWith("/")) {
|
||||
chatActivityEnterView.setCommand(messageObject, url);
|
||||
public void didPressUrl(MessageObject messageObject, final ClickableSpan url) {
|
||||
if (url instanceof URLSpanNoUnderline) {
|
||||
String str = ((URLSpanNoUnderline) url).getURL();
|
||||
if (str.startsWith("@")) {
|
||||
MessagesController.openByUserName(str.substring(1), ChatActivity.this, 0);
|
||||
} else if (str.startsWith("#")) {
|
||||
DialogsActivity fragment = new DialogsActivity(null);
|
||||
fragment.setSearchString(str);
|
||||
presentFragment(fragment);
|
||||
} else if (str.startsWith("/")) {
|
||||
chatActivityEnterView.setCommand(messageObject, str);
|
||||
}
|
||||
} else if (url instanceof URLSpanReplacement) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(LocaleController.formatString("OpenUrlAlert", R.string.OpenUrlAlert, ((URLSpanReplacement) url).getURL()));
|
||||
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
||||
builder.setPositiveButton(LocaleController.getString("Open", R.string.Open), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
try {
|
||||
url.onClick(fragmentView);
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||
showDialog(builder.create());
|
||||
} else {
|
||||
url.onClick(fragmentView);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -213,30 +213,46 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
|
|||
messageEditText.setHintTextColor(0xffb2b2b2);
|
||||
frameLayout.addView(messageEditText, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.BOTTOM, 52, 0, isChat ? 50 : 2, 0));
|
||||
messageEditText.setOnKeyListener(new View.OnKeyListener() {
|
||||
|
||||
boolean ctrlPressed = false;
|
||||
|
||||
@Override
|
||||
public boolean onKey(View view, int i, KeyEvent keyEvent) {
|
||||
if (i == KeyEvent.KEYCODE_BACK && !keyboardVisible && isPopupShowing()) {
|
||||
if (keyEvent.getAction() == 1) {
|
||||
if (currentPopupContentType == 1 && botButtonsMessageObject != null) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
preferences.edit().putInt("hidekeyboard_" + dialog_id, botButtonsMessageObject.getId()).commit();
|
||||
}
|
||||
showPopup(0, 0);
|
||||
}
|
||||
return true;
|
||||
} else if (i == KeyEvent.KEYCODE_ENTER && sendByEnter && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
} else if (i == KeyEvent.KEYCODE_ENTER && (ctrlPressed || sendByEnter) && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
sendMessage();
|
||||
return true;
|
||||
} else if (i == KeyEvent.KEYCODE_CTRL_LEFT || i == KeyEvent.KEYCODE_CTRL_RIGHT) {
|
||||
ctrlPressed = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
messageEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
|
||||
|
||||
boolean ctrlPressed = false;
|
||||
|
||||
@Override
|
||||
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
|
||||
if (i == EditorInfo.IME_ACTION_SEND) {
|
||||
sendMessage();
|
||||
return true;
|
||||
} else if (sendByEnter) {
|
||||
if (keyEvent != null && i == EditorInfo.IME_NULL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
} else if (keyEvent != null && i == EditorInfo.IME_NULL) {
|
||||
if ((ctrlPressed || sendByEnter) && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
|
||||
sendMessage();
|
||||
return true;
|
||||
} else if (i == KeyEvent.KEYCODE_CTRL_LEFT || i == KeyEvent.KEYCODE_CTRL_RIGHT) {
|
||||
ctrlPressed = keyEvent.getAction() == KeyEvent.ACTION_DOWN;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -319,7 +335,13 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
|
|||
if (botReplyMarkup != null) {
|
||||
if (!isPopupShowing() || currentPopupContentType != 1) {
|
||||
showPopup(1, 1);
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
preferences.edit().remove("hidekeyboard_" + dialog_id).commit();
|
||||
} else {
|
||||
if (currentPopupContentType == 1 && botButtonsMessageObject != null) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
preferences.edit().putInt("hidekeyboard_" + dialog_id, botButtonsMessageObject.getId()).commit();
|
||||
}
|
||||
openKeyboardInternal();
|
||||
}
|
||||
} else if (hasBotCommands) {
|
||||
|
@ -1184,13 +1206,14 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
|
|||
botKeyboardView.setPanelHeight(AndroidUtilities.displaySize.x > AndroidUtilities.displaySize.y ? keyboardHeightLand : keyboardHeight);
|
||||
botKeyboardView.setButtons(botReplyMarkup != null ? botReplyMarkup : null);
|
||||
if (botReplyMarkup != null) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
boolean keyboardHidden = preferences.getInt("hidekeyboard_" + dialog_id, 0) == messageObject.getId();
|
||||
if (botButtonsMessageObject != replyingMessageObject && (botReplyMarkup.flags & 2) != 0) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
if (preferences.getInt("answered_" + dialog_id, 0) == messageObject.getId()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (messageEditText.length() == 0 && !isPopupShowing()) {
|
||||
if (!keyboardHidden && messageEditText.length() == 0 && !isPopupShowing()) {
|
||||
showPopup(1, 1);
|
||||
}
|
||||
} else {
|
||||
|
@ -1321,8 +1344,12 @@ public class ChatActivityEnterView extends FrameLayoutFixed implements Notificat
|
|||
}
|
||||
}
|
||||
|
||||
public void hidePopup() {
|
||||
public void hidePopup(boolean byBackButton) {
|
||||
if (isPopupShowing()) {
|
||||
if (currentPopupContentType == 1 && byBackButton && botButtonsMessageObject != null) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
preferences.edit().putInt("hidekeyboard_" + dialog_id, botButtonsMessageObject.getId()).commit();
|
||||
}
|
||||
showPopup(0, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.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-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Components;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.text.Layout;
|
||||
import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
|
||||
import org.telegram.android.AndroidUtilities;
|
||||
import org.telegram.messenger.FileLog;
|
||||
|
||||
public class LetterDrawable extends Drawable {
|
||||
|
||||
private static Paint paint = new Paint();
|
||||
private static TextPaint namePaint;
|
||||
|
||||
private StaticLayout textLayout;
|
||||
private float textWidth;
|
||||
private float textHeight;
|
||||
private float textLeft;
|
||||
private StringBuilder stringBuilder = new StringBuilder(5);
|
||||
|
||||
public LetterDrawable() {
|
||||
super();
|
||||
|
||||
if (namePaint == null) {
|
||||
paint.setColor(0xffdfdfdf);
|
||||
namePaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
|
||||
namePaint.setColor(0xffffffff);
|
||||
namePaint.setTextSize(AndroidUtilities.dp(28));
|
||||
}
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
stringBuilder.setLength(0);
|
||||
if (title != null && title.length() > 0) {
|
||||
stringBuilder.append(title.substring(0, 1));
|
||||
}
|
||||
|
||||
if (stringBuilder.length() > 0) {
|
||||
String text = stringBuilder.toString().toUpperCase();
|
||||
try {
|
||||
textLayout = new StaticLayout(text, namePaint, AndroidUtilities.dp(100), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
|
||||
if (textLayout.getLineCount() > 0) {
|
||||
textLeft = textLayout.getLineLeft(0);
|
||||
textWidth = textLayout.getLineWidth(0);
|
||||
textHeight = textLayout.getLineBottom(0);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
FileLog.e("tmessages", e);
|
||||
}
|
||||
} else {
|
||||
textLayout = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Canvas canvas) {
|
||||
Rect bounds = getBounds();
|
||||
if (bounds == null) {
|
||||
return;
|
||||
}
|
||||
int size = bounds.width();
|
||||
canvas.save();
|
||||
canvas.drawRect(bounds.left, bounds.top, bounds.right, bounds.bottom, paint);
|
||||
if (textLayout != null) {
|
||||
canvas.translate(bounds.left + (size - textWidth) / 2 - textLeft, bounds.top + (size - textHeight) / 2);
|
||||
textLayout.draw(canvas);
|
||||
}
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAlpha(int alpha) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setColorFilter(ColorFilter cf) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOpacity() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIntrinsicWidth() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIntrinsicHeight() {
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* This is the source code of Telegram for Android v. 2.x.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-2015.
|
||||
*/
|
||||
|
||||
package org.telegram.ui.Components;
|
||||
|
||||
import android.text.style.URLSpan;
|
||||
|
||||
public class URLSpanReplacement extends URLSpan {
|
||||
|
||||
public URLSpanReplacement(String url) {
|
||||
super(url);
|
||||
}
|
||||
}
|
|
@ -289,6 +289,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
}
|
||||
MessagesController.getInstance().deleteMessages(ids, random_ids, currentEncryptedChat);
|
||||
actionBar.hideActionMode();
|
||||
actionBar.closeSearchField();
|
||||
selectedFiles.clear();
|
||||
}
|
||||
});
|
||||
|
@ -399,9 +400,9 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
dropDownContainer.setSubMenuOpenSide(1);
|
||||
dropDownContainer.addSubItem(shared_media_item, LocaleController.getString("SharedMediaTitle", R.string.SharedMediaTitle), 0);
|
||||
dropDownContainer.addSubItem(files_item, LocaleController.getString("DocumentsTitle", R.string.DocumentsTitle), 0);
|
||||
//if ((int) dialog_id != 0) {
|
||||
// dropDownContainer.addSubItem(links_item, LocaleController.getString("LinksTitle", R.string.LinksTitle), 0);
|
||||
//}
|
||||
if ((int) dialog_id != 0) {
|
||||
dropDownContainer.addSubItem(links_item, LocaleController.getString("LinksTitle", R.string.LinksTitle), 0);
|
||||
}
|
||||
actionBar.addView(dropDownContainer, LayoutHelper.createFrame(LayoutHelper.WRAP_CONTENT, LayoutHelper.MATCH_PARENT, Gravity.TOP | Gravity.LEFT, AndroidUtilities.isTablet() ? 64 : 56, 0, 40, 0));
|
||||
dropDownContainer.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
|
@ -510,6 +511,10 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
SharedDocumentCell cell = (SharedDocumentCell) view;
|
||||
MessageObject message = cell.getDocument();
|
||||
return MediaActivity.this.onItemLongClick(message, view, 0);
|
||||
} else if (selectedMode == 3 && view instanceof SharedLinkCell) {
|
||||
SharedLinkCell cell = (SharedLinkCell) view;
|
||||
MessageObject message = cell.getMessage();
|
||||
return MediaActivity.this.onItemLongClick(message, view, 0);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -673,6 +678,14 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
if (dropDownContainer != null) {
|
||||
dropDownContainer.closeSubMenu();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
@ -828,12 +841,12 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
} else if (selectedMode == 3) {
|
||||
listView.setAdapter(linksAdapter);
|
||||
dropDown.setText(LocaleController.getString("LinksTitle", R.string.LinksTitle));
|
||||
emptyImageView.setImageResource(R.drawable.tip2);
|
||||
emptyImageView.setImageResource(R.drawable.tip3);
|
||||
emptyTextView.setText(LocaleController.getString("NoSharedLinks", R.string.NoSharedLinks));
|
||||
searchItem.setVisibility(!sharedMediaData[3].messages.isEmpty() ? View.VISIBLE : View.GONE);
|
||||
if (!sharedMediaData[selectedMode].loading && !sharedMediaData[selectedMode].endReached && sharedMediaData[selectedMode].messages.isEmpty()) {
|
||||
sharedMediaData[selectedMode].loading = true;
|
||||
SharedMediaQuery.loadMedia(dialog_id, 0, 50, 0, SharedMediaQuery.MEDIA_URL, false, classGuid);
|
||||
SharedMediaQuery.loadMedia(dialog_id, 0, 50, 0, SharedMediaQuery.MEDIA_URL, true, classGuid);
|
||||
}
|
||||
listView.setVisibility(View.VISIBLE);
|
||||
if (sharedMediaData[selectedMode].loading && sharedMediaData[selectedMode].messages.isEmpty()) {
|
||||
|
@ -876,6 +889,8 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
((SharedDocumentCell) view).setChecked(true, true);
|
||||
} else if (view instanceof SharedPhotoVideoCell) {
|
||||
((SharedPhotoVideoCell) view).setChecked(a, true, true);
|
||||
} else if (view instanceof SharedLinkCell) {
|
||||
((SharedLinkCell) view).setChecked(true, true);
|
||||
}
|
||||
actionBar.showActionMode();
|
||||
return true;
|
||||
|
@ -901,6 +916,8 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
((SharedDocumentCell) view).setChecked(selectedFiles.containsKey(message.getId()), true);
|
||||
} else if (view instanceof SharedPhotoVideoCell) {
|
||||
((SharedPhotoVideoCell) view).setChecked(a, selectedFiles.containsKey(message.getId()), true);
|
||||
} else if (view instanceof SharedLinkCell) {
|
||||
((SharedLinkCell) view).setChecked(selectedFiles.containsKey(message.getId()), true);
|
||||
}
|
||||
} else {
|
||||
if (selectedMode == 0) {
|
||||
|
@ -978,13 +995,20 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
} else if (selectedMode == 3) {
|
||||
try {
|
||||
TLRPC.WebPage webPage = message.messageOwner.media.webpage;
|
||||
if (Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) {
|
||||
BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity());
|
||||
builder.setCustomView(new WebFrameLayout(getParentActivity(), builder.create(), webPage.title, webPage.url, webPage.embed_url, webPage.embed_width, webPage.embed_height));
|
||||
builder.setUseFullWidth(true);
|
||||
showDialog(builder.create());
|
||||
} else {
|
||||
Uri uri = Uri.parse(webPage.url);
|
||||
String link = null;
|
||||
if (webPage != null && !(webPage instanceof TLRPC.TL_webPageEmpty)) {
|
||||
if (Build.VERSION.SDK_INT >= 16 && webPage.embed_url != null && webPage.embed_url.length() != 0) {
|
||||
openWebView(webPage);
|
||||
return;
|
||||
} else {
|
||||
link = webPage.url;
|
||||
}
|
||||
}
|
||||
if (link == null) {
|
||||
link = ((SharedLinkCell) view).getLink(0);
|
||||
}
|
||||
if (link != null) {
|
||||
Uri uri = Uri.parse(link);
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
|
||||
intent.putExtra(Browser.EXTRA_APPLICATION_ID, getParentActivity().getPackageName());
|
||||
getParentActivity().startActivity(intent);
|
||||
|
@ -996,6 +1020,13 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
}
|
||||
}
|
||||
|
||||
private void openWebView(TLRPC.WebPage webPage) {
|
||||
BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity());
|
||||
builder.setCustomView(new WebFrameLayout(getParentActivity(), builder.create(), webPage.title, webPage.url, webPage.embed_url, webPage.embed_width, webPage.embed_height));
|
||||
builder.setUseFullWidth(true);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
|
||||
private void fixLayoutInternal() {
|
||||
if (listView == null) {
|
||||
return;
|
||||
|
@ -1090,15 +1121,26 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
} else {
|
||||
if (convertView == null) {
|
||||
convertView = new SharedLinkCell(mContext);
|
||||
((SharedLinkCell) convertView).setDelegate(new SharedLinkCell.SharedLinkCellDelegate() {
|
||||
@Override
|
||||
public void needOpenWebView(TLRPC.WebPage webPage) {
|
||||
MediaActivity.this.openWebView(webPage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPerformActions() {
|
||||
return !actionBar.isActionModeShowed();
|
||||
}
|
||||
});
|
||||
}
|
||||
SharedLinkCell sharedDocumentCell = (SharedLinkCell) convertView;
|
||||
SharedLinkCell sharedLinkCell = (SharedLinkCell) convertView;
|
||||
MessageObject messageObject = messageObjects.get(position - 1);
|
||||
sharedDocumentCell.setLink(messageObject, position != messageObjects.size() || section == sharedMediaData[3].sections.size() - 1 && sharedMediaData[3].loading);
|
||||
/*if (actionBar.isActionModeShowed()) {
|
||||
sharedDocumentCell.setChecked(selectedFiles.containsKey(messageObject.getId()), !scrolling);
|
||||
sharedLinkCell.setLink(messageObject, position != messageObjects.size() || section == sharedMediaData[3].sections.size() - 1 && sharedMediaData[3].loading);
|
||||
if (actionBar.isActionModeShowed()) {
|
||||
sharedLinkCell.setChecked(selectedFiles.containsKey(messageObject.getId()), !scrolling);
|
||||
} else {
|
||||
sharedDocumentCell.setChecked(false, !scrolling);
|
||||
}*/
|
||||
sharedLinkCell.setChecked(false, !scrolling);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (convertView == null) {
|
||||
|
@ -1392,12 +1434,8 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
if (user.access_hash != 0) {
|
||||
req.peer = new TLRPC.TL_inputPeerForeign();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
} else {
|
||||
req.peer = new TLRPC.TL_inputPeerContact();
|
||||
}
|
||||
req.peer = new TLRPC.TL_inputPeerUser();
|
||||
req.peer.access_hash = user.access_hash;
|
||||
req.peer.user_id = uid;
|
||||
}
|
||||
final int currentReqId = ++lastReqId;
|
||||
|
@ -1528,7 +1566,7 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
|
||||
@Override
|
||||
public boolean isEnabled(int i) {
|
||||
return i != searchResult.size();
|
||||
return i != searchResult.size() + globalSearch.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1588,15 +1626,26 @@ public class MediaActivity extends BaseFragment implements NotificationCenter.No
|
|||
} else if (currentType == 3) {
|
||||
if (view == null) {
|
||||
view = new SharedLinkCell(mContext);
|
||||
((SharedLinkCell) view).setDelegate(new SharedLinkCell.SharedLinkCellDelegate() {
|
||||
@Override
|
||||
public void needOpenWebView(TLRPC.WebPage webPage) {
|
||||
MediaActivity.this.openWebView(webPage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPerformActions() {
|
||||
return !actionBar.isActionModeShowed();
|
||||
}
|
||||
});
|
||||
}
|
||||
SharedLinkCell sharedLinkCell = (SharedLinkCell) view;
|
||||
MessageObject messageObject = getItem(i);
|
||||
sharedLinkCell.setLink(messageObject, i != getCount() - 1);
|
||||
/*if (actionBar.isActionModeShowed()) {
|
||||
sharedDocumentCell.setChecked(selectedFiles.containsKey(messageObject.getId()), !scrolling);
|
||||
if (actionBar.isActionModeShowed()) {
|
||||
sharedLinkCell.setChecked(selectedFiles.containsKey(messageObject.getId()), !scrolling);
|
||||
} else {
|
||||
sharedDocumentCell.setChecked(false, !scrolling);
|
||||
}*/
|
||||
sharedLinkCell.setChecked(false, !scrolling);
|
||||
}
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
|
|
@ -288,6 +288,14 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati
|
|||
return fragmentView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
if (dropDownContainer != null) {
|
||||
dropDownContainer.closeSubMenu();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
|
|
@ -1066,7 +1066,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC
|
|||
@Override
|
||||
public void onBackPressed() {
|
||||
if (chatActivityEnterView.isPopupShowing()) {
|
||||
chatActivityEnterView.hidePopup();
|
||||
chatActivityEnterView.hidePopup(true);
|
||||
return;
|
||||
}
|
||||
super.onBackPressed();
|
||||
|
@ -1089,7 +1089,7 @@ public class PopupNotificationActivity extends Activity implements NotificationC
|
|||
super.onPause();
|
||||
overridePendingTransition(0, 0);
|
||||
if (chatActivityEnterView != null) {
|
||||
chatActivityEnterView.hidePopup();
|
||||
chatActivityEnterView.hidePopup(false);
|
||||
chatActivityEnterView.setFieldFocused(false);
|
||||
}
|
||||
ConnectionsManager.getInstance().setAppPaused(true, false);
|
||||
|
|
|
@ -261,25 +261,39 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||
if (id == -1) {
|
||||
finishFragment();
|
||||
} else if (id == block_contact) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
if (!userBlocked) {
|
||||
builder.setMessage(LocaleController.getString("AreYouSureBlockContact", R.string.AreYouSureBlockContact));
|
||||
} else {
|
||||
builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact));
|
||||
TLRPC.User user = MessagesController.getInstance().getUser(user_id);
|
||||
if (user == null) {
|
||||
return;
|
||||
}
|
||||
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
||||
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if (!userBlocked) {
|
||||
MessagesController.getInstance().blockUser(user_id);
|
||||
} else {
|
||||
MessagesController.getInstance().unblockUser(user_id);
|
||||
}
|
||||
if ((user.flags & TLRPC.USER_FLAG_BOT) == 0) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
if (!userBlocked) {
|
||||
builder.setMessage(LocaleController.getString("AreYouSureBlockContact", R.string.AreYouSureBlockContact));
|
||||
} else {
|
||||
builder.setMessage(LocaleController.getString("AreYouSureUnblockContact", R.string.AreYouSureUnblockContact));
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||
showDialog(builder.create());
|
||||
builder.setTitle(LocaleController.getString("AppName", R.string.AppName));
|
||||
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if (!userBlocked) {
|
||||
MessagesController.getInstance().blockUser(user_id);
|
||||
} else {
|
||||
MessagesController.getInstance().unblockUser(user_id);
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||
showDialog(builder.create());
|
||||
} else {
|
||||
if (!userBlocked) {
|
||||
MessagesController.getInstance().blockUser(user_id);
|
||||
} else {
|
||||
MessagesController.getInstance().unblockUser(user_id);
|
||||
SendMessagesHelper.getInstance().sendMessage("/start", user_id, null, null, false);
|
||||
finishFragment();
|
||||
}
|
||||
}
|
||||
} else if (id == add_contact) {
|
||||
TLRPC.User user = MessagesController.getInstance().getUser(user_id);
|
||||
Bundle args = new Bundle();
|
||||
|
@ -1308,6 +1322,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||
menu.clearItems();
|
||||
|
||||
if (user_id != 0) {
|
||||
|
||||
if (ContactsController.getInstance().contactsDict.get(user_id) == null) {
|
||||
TLRPC.User user = MessagesController.getInstance().getUser(user_id);
|
||||
if (user == null) {
|
||||
|
@ -1325,7 +1340,11 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||
item.addSubItem(share_contact, LocaleController.getString("ShareContact", R.string.ShareContact), 0);
|
||||
item.addSubItem(block_contact, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock), 0);
|
||||
} else {
|
||||
item.addSubItem(block_contact, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock), 0);
|
||||
if ((user.flags & TLRPC.USER_FLAG_BOT) != 0) {
|
||||
item.addSubItem(block_contact, !userBlocked ? LocaleController.getString("BotStop", R.string.BotStop) : LocaleController.getString("BotRestart", R.string.BotRestart), 0);
|
||||
} else {
|
||||
item.addSubItem(block_contact, !userBlocked ? LocaleController.getString("BlockContact", R.string.BlockContact) : LocaleController.getString("Unblock", R.string.Unblock), 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_other);
|
||||
|
@ -1361,7 +1380,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||
args.putBoolean("scrollToTopOnResume", true);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.closeChats);
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
|
||||
int lower_part = (int)dialog_id;
|
||||
int lower_part = (int) dialog_id;
|
||||
if (lower_part != 0) {
|
||||
if (lower_part > 0) {
|
||||
args.putInt("user_id", lower_part);
|
||||
|
@ -1369,7 +1388,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
|||
args.putInt("chat_id", -lower_part);
|
||||
}
|
||||
} else {
|
||||
args.putInt("enc_id", (int)(dialog_id >> 32));
|
||||
args.putInt("enc_id", (int) (dialog_id >> 32));
|
||||
}
|
||||
presentFragment(new ChatActivity(args), true);
|
||||
removeSelfFromStack();
|
||||
|
|
|
@ -87,6 +87,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur
|
|||
private int resultWidth = 0;
|
||||
private int resultHeight = 0;
|
||||
private int bitrate = 0;
|
||||
private int originalBitrate = 0;
|
||||
private float videoDuration = 0;
|
||||
private long startTime = 0;
|
||||
private long endTime = 0;
|
||||
|
@ -247,7 +248,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur
|
|||
}
|
||||
if (delegate != null) {
|
||||
if (compressVideo.getVisibility() == View.GONE || compressVideo.getVisibility() == View.VISIBLE && !compressVideo.isChecked()) {
|
||||
delegate.didFinishEditVideo(videoPath, startTime, endTime, originalWidth, originalHeight, rotationValue, originalWidth, originalHeight, bitrate, estimatedSize, esimatedDuration);
|
||||
delegate.didFinishEditVideo(videoPath, startTime, endTime, originalWidth, originalHeight, rotationValue, originalWidth, originalHeight, originalBitrate, estimatedSize, esimatedDuration);
|
||||
} else {
|
||||
delegate.didFinishEditVideo(videoPath, startTime, endTime, resultWidth, resultHeight, rotationValue, originalWidth, originalHeight, bitrate, estimatedSize, esimatedDuration);
|
||||
}
|
||||
|
@ -742,7 +743,7 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur
|
|||
TrackHeaderBox headerBox = trackBox.getTrackHeaderBox();
|
||||
if (headerBox.getWidth() != 0 && headerBox.getHeight() != 0) {
|
||||
trackHeaderBox = headerBox;
|
||||
bitrate = (int)(trackBitrate / 100000 * 100000);
|
||||
originalBitrate = bitrate = (int)(trackBitrate / 100000 * 100000);
|
||||
if (bitrate > 900000) {
|
||||
bitrate = 900000;
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 45 KiB |
After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 50 KiB |
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">فتح في المتصفح</string>
|
||||
<string name="CopyUrl">انسخ الرابط</string>
|
||||
<string name="SendItems">أرسل %1$s</string>
|
||||
<string name="OpenUrlAlert">هل ترغب في فتح الرابط باستخدام %1$s ؟</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s قام بتعيين عداد التدمير الذاتي إلى to %2$s</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">لقد قمت بتعيين التدمير الذاتي إلى %1$s</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">لا يستطيع الوصول للرسائل</string>
|
||||
<string name="BotInfoTitle">ماذا يستطيع هذا البوت عمله؟</string>
|
||||
<string name="BotStart">إبدأ</string>
|
||||
<string name="BotUnblock">إعادة تشغيل</string>
|
||||
<string name="BotStop">إيقاف البوت</string>
|
||||
<string name="BotRestart">إعادة تعيين البوت</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">التالي</string>
|
||||
<string name="Back">رجوع</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s الساعة %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">تم تحديث تيليجرام نسخة الاندرويد. الجديد في نسخة ٣.١.٢: \n\n- كلمات البحث الحديثة. \n- اضغط باستمرار لاستعراض الملصق قبل إرساله.</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">تم تحديث تيليجرام نسخة الآندرويد. الجديد في نسخة 3.1.3:\n\n- قسم جديد للروابط المشاركة في معلومات المحادثة \n- استعراض لروابط الصور داخل التطبيق.</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Im Browser öffnen</string>
|
||||
<string name="CopyUrl">URL kopieren</string>
|
||||
<string name="SendItems">%1$s senden</string>
|
||||
<string name="OpenUrlAlert">URL %1$s öffnen?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s hat den Selbstzerstörungs-Timer auf %2$s gesetzt</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">Du hast den Selbstzerstörungs-Timer auf %1$s gesetzt</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">kein Zugriff auf Nachrichten</string>
|
||||
<string name="BotInfoTitle">Was kann dieser Bot?</string>
|
||||
<string name="BotStart">STARTEN</string>
|
||||
<string name="BotUnblock">NEUSTART</string>
|
||||
<string name="BotStop">Bot Anhalten</string>
|
||||
<string name="BotRestart">Bot Neu Starten</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Weiter</string>
|
||||
<string name="Back">Zurück</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s um %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Telegram für Android wurde aktualisiert. Neu in Version 3.1.2:\n\n- Die letzte Suche wird gespeichert\n- Stickervorschau: Sticker vor dem Senden antippen und halten</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram für Android wurde aktualisiert. Neu in Version 3.1.3:\n\n- Neuer \"Geteilte Links\" Bereich in der Chat Info\n- In-App Vorschau für Links von Bildern.</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Abrir en el navegador</string>
|
||||
<string name="CopyUrl">Copiar URL</string>
|
||||
<string name="SendItems">Enviar %1$s</string>
|
||||
<string name="OpenUrlAlert">¿Abrir %1$s?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s activó la autodestrucción en %2$s</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">Activaste la autodestrucción en %1$s</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">no tiene acceso a los mensajes</string>
|
||||
<string name="BotInfoTitle">¿Qué puede hacer este bot?</string>
|
||||
<string name="BotStart">INICIAR</string>
|
||||
<string name="BotUnblock">REINICIAR</string>
|
||||
<string name="BotStop">Detener bot</string>
|
||||
<string name="BotRestart">Reiniciar bot</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Siguiente</string>
|
||||
<string name="Back">Atrás</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s a las %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Telegram para Android fue actualizada. Novedades en la versión 3.1.2:\n\n- Búsquedas recientes\n- Mantén pulsado sobre un sticker para obtener una vista previa antes de enviarlo</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram para Android ha sido actualizada. Novedades en la versión 3.1.3:\n\n- Nueva sección de \'Enlaces\' en la información del chat\n- Vista previa en la app para enlaces a fotos</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Apri nel Browser</string>
|
||||
<string name="CopyUrl">Copia URL</string>
|
||||
<string name="SendItems">Invia %1$s</string>
|
||||
<string name="OpenUrlAlert">Aprire url %1$s?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s ha impostato il timer di autodistruzione a %2$s</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">Hai impostato il timer di autodistruzione a %1$s</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">non ha accesso ai messaggi</string>
|
||||
<string name="BotInfoTitle">Cosa può fare questo bot?</string>
|
||||
<string name="BotStart">AVVIA</string>
|
||||
<string name="BotUnblock">RIAVVIA</string>
|
||||
<string name="BotStop">Arresta bot</string>
|
||||
<string name="BotRestart">Riavvia bot</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Avanti</string>
|
||||
<string name="Back">Indietro</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s alle %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Telegram per Android si è aggiornato. Nuovo nella versione 3.1.2:\n\n- Risultati recenti nella ricerca\n- Tieni premuto su uno sticker per visualizzare l\'anteprima prima di inviarlo</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram per Android si è aggiornato. Nuovo nella versione 3.1.3:\n\n- Nuova sezione \"Link condivisi\" nelle info della chat\n- Anteprima in-app delle foto dei link</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">브라우져에서 열기</string>
|
||||
<string name="CopyUrl">URL 복사</string>
|
||||
<string name="SendItems">%1$s 전송</string>
|
||||
<string name="OpenUrlAlert">%1$s 링크를 여시겠습니까?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s님이 자동삭제를 %2$s 후로 설정했습니다</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">자동삭제를 %1$s 후로 설정했습니다</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">메시지 접근 권한이 없습니다</string>
|
||||
<string name="BotInfoTitle">이 봇은 무엇을 할 수 있나요?</string>
|
||||
<string name="BotStart">시작</string>
|
||||
<string name="BotUnblock">재시작</string>
|
||||
<string name="BotStop">봇 정지</string>
|
||||
<string name="BotRestart">봇 재시작</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">다음</string>
|
||||
<string name="Back">뒤로</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">a h:mm</string>
|
||||
<string name="formatDateAtTime">%1$s %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">텔레그램 안드로이드 버전이 업데이트 되었습니다. 새로운 버전은 3.1.2 입니다:\n\n- 최신 검색 결과\n- 스티커를 꾹 누를 경우 미리보기 기능</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">텔레그램 안드로이드 버전이 업데이트 되었습니다. 새로운 버전은 3.1.3 입니다:\n\n- 채팅방 정보내 \'공유된 링크\' 추가 \n- 사진 링크 프리뷰 기능</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Openen in browser</string>
|
||||
<string name="CopyUrl">Link kopiëren</string>
|
||||
<string name="SendItems">%1$s versturen</string>
|
||||
<string name="OpenUrlAlert">URL %1$s openen?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s heeft de zelfvernietigingstimer ingesteld op %2$s</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">Je hebt de zelfvernietigingstimer ingesteld op %1$s</string>
|
||||
|
@ -170,7 +171,7 @@
|
|||
<string name="NotificationGroupKickYou">%1$s heeft je 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 je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je die sessie beëindigen via Instellingen - Privacy en veiligheid - Sessies.\n\nAls je dat denkt dat iemand anders zonder jouw toestemming is ingelogd kun je twee-staps-verificatie activeren via instellingen - privacy en veiligheid .\n\nBedankt,\nHet Telegram-team</string>
|
||||
<string name="NotificationUnrecognizedDevice">%1$s,\nEr is op je account ingelogd vanaf een nieuw apparaat op %2$s\n\nApparaat: %3$s\nLocatie: %4$s\n\nAls jij dit niet was, kun je die sessie beëindigen via Instellingen - Privacy en veiligheid - Sessies.\n\nAls je dat denkt dat iemand anders zonder jouw toestemming is ingelogd kun je twee-staps-verificatie activeren via instellingen - privacy en veiligheid.\n\nBedankt,\nHet Telegram-team</string>
|
||||
<string name="NotificationContactNewPhoto">%1$s heeft zijn/haar profielfoto gewijzigd</string>
|
||||
<string name="NotificationInvitedToGroupByLink">%1$s neemt deel aan de groep %2$s via uitnodigingslink</string>
|
||||
<string name="Reply">Antwoord</string>
|
||||
|
@ -366,7 +367,7 @@
|
|||
<string name="SessionsTitle">Actieve sessies</string>
|
||||
<string name="CurrentSession">Huidige sessie</string>
|
||||
<string name="NoOtherSessions">Geen andere actieve sessies</string>
|
||||
<string name="NoOtherSessionsInfo">Je kunt in Telegram inloggen vanaf andere apparaten (mobiel,tablet,desktop) met hetzelfde telefoonnummer. Al je data zal direct worden gesynchroniseerd.</string>
|
||||
<string name="NoOtherSessionsInfo">Je kunt in Telegram inloggen vanaf andere apparaten (mobiel, tablet, desktop) met hetzelfde telefoonnummer. Al je data zal direct worden gesynchroniseerd.</string>
|
||||
<string name="OtherSessions">Actieve sessies</string>
|
||||
<string name="SessionsInfo">Beheer je sessies van andere apparaten.</string>
|
||||
<string name="TerminateSessionInfo">Tik op een sessie om deze te beëindigen.</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">geen toegang tot berichten</string>
|
||||
<string name="BotInfoTitle">Wat kan deze bot?</string>
|
||||
<string name="BotStart">BEGIN</string>
|
||||
<string name="BotUnblock">HERSTART</string>
|
||||
<string name="BotStop">Bot stoppen</string>
|
||||
<string name="BotRestart">Bot herstarten</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Volgende</string>
|
||||
<string name="Back">Vorige</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s om %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Telegram voor Android is bijgewerkt. Nieuw in versie 3.1.2:\n\n- Recente zoekresultaten\n- Stickers aantikken en vasthouden om een voorbeeld weer te geven voor het versturen.</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram voor Android is bijgewerkt. Nieuw in versie 3.1.3:\n\n- Nieuw \'Gedeelde links\'-gedeelte in chatinformatie\n- In-app voorvertoning voor links naar foto\'s</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -46,8 +46,8 @@
|
|||
<string name="EncryptedChatStartedIncoming">Você entrou no chat secreto</string>
|
||||
<string name="ClearHistory">Limpar histórico</string>
|
||||
<string name="DeleteChat">Apagar e sair</string>
|
||||
<string name="DeleteChatUser">Excluir conversa</string>
|
||||
<string name="HiddenName">Excluir Conta</string>
|
||||
<string name="DeleteChatUser">Apagar conversa</string>
|
||||
<string name="HiddenName">Conta Excluída</string>
|
||||
<string name="SelectChat">Selecione um Chat</string>
|
||||
<string name="PhotoTip">Toque e segure para ver</string>
|
||||
<string name="CompatibilityChat">%1$s está usando uma versão mais antiga do Telegram, por isso fotos secretas serão mostradas em modo de compatibilidade.\n\nAssim que %2$s atualizar o Telegram, fotos com timers de 1 minuto ou menos passarão a funcionar no modo ‘Toque e segure para ver’, e você será notificado caso a outra pessoa salve a tela.</string>
|
||||
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Abrir no Navegador</string>
|
||||
<string name="CopyUrl">Copiar URL</string>
|
||||
<string name="SendItems">Enviar %1$s</string>
|
||||
<string name="OpenUrlAlert">Abrir URL em %1$s?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s estabeleceu o tempo de autodestruição para %2$s </string>
|
||||
<string name="MessageLifetimeChangedOutgoing">Você estabeleceu o tempo de autodestruição para %1$s</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">não tem acesso as mensagens</string>
|
||||
<string name="BotInfoTitle">O que esse bot pode fazer?</string>
|
||||
<string name="BotStart">COMEÇAR</string>
|
||||
<string name="BotUnblock">REINICIAR</string>
|
||||
<string name="BotStop">Parar bot</string>
|
||||
<string name="BotRestart">Reiniciar bot</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Próximo</string>
|
||||
<string name="Back">Voltar</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s às %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Seu Telegram para Android acaba de ser atualizado. Novo na versão 3.1.2\n\n- Resultados das buscas recentes\n- Pressione e mantenha em um sticker para pré-visualizar antes do envio</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram para Android foi atualizado. Novidade na versão 3.1.3\n\n- Nova sessão \"Links Compartilhados\" na informação do chat\n- Pré-visualizaçãp de fotos em links no aplicativo.</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -46,8 +46,8 @@
|
|||
<string name="EncryptedChatStartedIncoming">Você entrou no chat secreto</string>
|
||||
<string name="ClearHistory">Limpar histórico</string>
|
||||
<string name="DeleteChat">Apagar e sair</string>
|
||||
<string name="DeleteChatUser">Excluir conversa</string>
|
||||
<string name="HiddenName">Excluir Conta</string>
|
||||
<string name="DeleteChatUser">Apagar conversa</string>
|
||||
<string name="HiddenName">Conta Excluída</string>
|
||||
<string name="SelectChat">Selecione um Chat</string>
|
||||
<string name="PhotoTip">Toque e segure para ver</string>
|
||||
<string name="CompatibilityChat">%1$s está usando uma versão mais antiga do Telegram, por isso fotos secretas serão mostradas em modo de compatibilidade.\n\nAssim que %2$s atualizar o Telegram, fotos com timers de 1 minuto ou menos passarão a funcionar no modo ‘Toque e segure para ver’, e você será notificado caso a outra pessoa salve a tela.</string>
|
||||
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Abrir no Navegador</string>
|
||||
<string name="CopyUrl">Copiar URL</string>
|
||||
<string name="SendItems">Enviar %1$s</string>
|
||||
<string name="OpenUrlAlert">Abrir URL em %1$s?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s estabeleceu o tempo de autodestruição para %2$s </string>
|
||||
<string name="MessageLifetimeChangedOutgoing">Você estabeleceu o tempo de autodestruição para %1$s</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">não tem acesso as mensagens</string>
|
||||
<string name="BotInfoTitle">O que esse bot pode fazer?</string>
|
||||
<string name="BotStart">COMEÇAR</string>
|
||||
<string name="BotUnblock">REINICIAR</string>
|
||||
<string name="BotStop">Parar bot</string>
|
||||
<string name="BotRestart">Reiniciar bot</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Próximo</string>
|
||||
<string name="Back">Voltar</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s às %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Seu Telegram para Android acaba de ser atualizado. Novo na versão 3.1.2\n\n- Resultados das buscas recentes\n- Pressione e mantenha em um sticker para pré-visualizar antes do envio</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram para Android foi atualizado. Novidade na versão 3.1.3\n\n- Nova sessão \"Links Compartilhados\" na informação do chat\n- Pré-visualizaçãp de fotos em links no aplicativo.</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|
|
@ -137,6 +137,7 @@
|
|||
<string name="OpenInBrowser">Open in Browser</string>
|
||||
<string name="CopyUrl">Copy URL</string>
|
||||
<string name="SendItems">Send %1$s</string>
|
||||
<string name="OpenUrlAlert">Open url %1$s?</string>
|
||||
<!--notification-->
|
||||
<string name="MessageLifetimeChanged">%1$s set the self-destruct timer to %2$s</string>
|
||||
<string name="MessageLifetimeChangedOutgoing">You set the self-destruct timer to %1$s</string>
|
||||
|
@ -549,6 +550,9 @@
|
|||
<string name="BotStatusCantRead">has no access to messages</string>
|
||||
<string name="BotInfoTitle">What can this bot do?</string>
|
||||
<string name="BotStart">START</string>
|
||||
<string name="BotUnblock">RESTART</string>
|
||||
<string name="BotStop">Stop bot</string>
|
||||
<string name="BotRestart">Restart bot</string>
|
||||
<!--button titles-->
|
||||
<string name="Next">Next</string>
|
||||
<string name="Back">Back</string>
|
||||
|
@ -837,6 +841,6 @@
|
|||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s at %2$s</string>
|
||||
<!--update text-->
|
||||
<string name="updateText">Telegram for Android has been updated. New in version 3.1.2:\n\n- Recent search results\n- Tap and hold sticker to preview before sending</string>
|
||||
<string name="updateBuild">583</string>
|
||||
<string name="updateText">Telegram for Android has been updated. New in version 3.1.3:\n\n- New \'Shared Links\' section in chat info\n- In-app preview for links to photos</string>
|
||||
<string name="updateBuild">590</string>
|
||||
</resources>
|