NekoX/TMessagesProj/src/main/java/org/telegram/android/SendMessagesHelper.java

2016 lines
109 KiB
Java
Raw Normal View History

/*
* This is the source code of Telegram for Android v. 1.7.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2014.
*/
package org.telegram.android;
import android.graphics.Bitmap;
2015-01-02 23:15:07 +01:00
import android.graphics.BitmapFactory;
2014-10-16 22:02:44 +02:00
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.media.ThumbnailUtils;
import android.net.Uri;
2014-10-16 22:02:44 +02:00
import android.os.Build;
import android.provider.MediaStore;
import android.webkit.MimeTypeMap;
2014-11-21 11:59:05 +01:00
import android.widget.Toast;
import org.telegram.messenger.ConnectionsManager;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
2014-11-21 11:59:05 +01:00
import org.telegram.messenger.R;
import org.telegram.messenger.RPCRequest;
import org.telegram.messenger.TLObject;
import org.telegram.messenger.TLRPC;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
import org.telegram.messenger.ApplicationLoader;
import java.io.File;
2015-01-02 23:15:07 +01:00
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.HashMap;
public class SendMessagesHelper implements NotificationCenter.NotificationCenterDelegate {
private TLRPC.ChatParticipants currentChatInfo = null;
2015-01-02 23:15:07 +01:00
private HashMap<String, ArrayList<DelayedMessage>> delayedMessages = new HashMap<>();
private HashMap<Integer, MessageObject> unsentMessages = new HashMap<>();
private HashMap<Integer, TLRPC.Message> sendingMessages = new HashMap<>();
private class DelayedMessage {
public TLObject sendRequest;
public TLRPC.TL_decryptedMessage sendEncryptedRequest;
public int type;
public String originalPath;
public TLRPC.FileLocation location;
public TLRPC.TL_video videoLocation;
public TLRPC.TL_audio audioLocation;
public TLRPC.TL_document documentLocation;
2015-01-02 23:15:07 +01:00
public String httpLocation;
public MessageObject obj;
public TLRPC.EncryptedChat encryptedChat;
}
private static volatile SendMessagesHelper Instance = null;
public static SendMessagesHelper getInstance() {
SendMessagesHelper localInstance = Instance;
if (localInstance == null) {
synchronized (SendMessagesHelper.class) {
localInstance = Instance;
if (localInstance == null) {
Instance = localInstance = new SendMessagesHelper();
}
}
}
return localInstance;
}
public SendMessagesHelper() {
NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileDidUpload);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileDidFailUpload);
2014-09-28 15:37:26 +02:00
NotificationCenter.getInstance().addObserver(this, NotificationCenter.FilePreparingStarted);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.FileNewChunkAvailable);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.FilePreparingFailed);
2015-01-02 23:15:07 +01:00
NotificationCenter.getInstance().addObserver(this, NotificationCenter.httpFileDidFailedLoad);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.httpFileDidLoaded);
}
public void cleanUp() {
delayedMessages.clear();
2014-10-14 10:13:16 +02:00
unsentMessages.clear();
2014-12-04 21:27:06 +01:00
sendingMessages.clear();
currentChatInfo = null;
}
public void setCurrentChatInfo(TLRPC.ChatParticipants info) {
currentChatInfo = info;
}
@Override
public void didReceivedNotification(int id, Object... args) {
if (id == NotificationCenter.FileDidUpload) {
final String location = (String)args[0];
final TLRPC.InputFile file = (TLRPC.InputFile)args[1];
final TLRPC.InputEncryptedFile encryptedFile = (TLRPC.InputEncryptedFile)args[2];
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
ArrayList<DelayedMessage> arr = delayedMessages.get(location);
if (arr != null) {
for (int a = 0; a < arr.size(); a++) {
DelayedMessage message = arr.get(a);
TLRPC.InputMedia media = null;
if (message.sendRequest instanceof TLRPC.TL_messages_sendMedia) {
media = ((TLRPC.TL_messages_sendMedia)message.sendRequest).media;
} else if (message.sendRequest instanceof TLRPC.TL_messages_sendBroadcast) {
media = ((TLRPC.TL_messages_sendBroadcast)message.sendRequest).media;
}
if (file != null && media != null) {
if (message.type == 0) {
media.file = file;
2014-10-22 22:01:07 +02:00
performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath);
} else if (message.type == 1) {
2014-09-28 15:37:26 +02:00
if (media.file == null) {
media.file = file;
2014-10-01 00:36:18 +02:00
if (media.thumb == null && message.location != null) {
performSendDelayedMessage(message);
} else {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath);
2014-10-01 00:36:18 +02:00
}
} else {
2014-09-28 15:37:26 +02:00
media.thumb = file;
2014-10-22 22:01:07 +02:00
performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath);
}
} else if (message.type == 2) {
2014-09-28 15:37:26 +02:00
if (media.file == null) {
media.file = file;
2014-09-28 15:37:26 +02:00
if (media.thumb == null && message.location != null) {
performSendDelayedMessage(message);
} else {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath);
2014-09-28 15:37:26 +02:00
}
} else {
media.thumb = file;
2014-10-22 22:01:07 +02:00
performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath);
}
} else if (message.type == 3) {
media.file = file;
2014-10-22 22:01:07 +02:00
performSendMessageRequest(message.sendRequest, message.obj.messageOwner, message.originalPath);
}
arr.remove(a);
a--;
} else if (encryptedFile != null && message.sendEncryptedRequest != null) {
message.sendEncryptedRequest.media.key = encryptedFile.key;
message.sendEncryptedRequest.media.iv = encryptedFile.iv;
SecretChatHelper.getInstance().performSendEncryptedRequest(message.sendEncryptedRequest, message.obj.messageOwner, message.encryptedChat, encryptedFile, message.originalPath);
arr.remove(a);
a--;
}
}
if (arr.isEmpty()) {
delayedMessages.remove(location);
}
}
}
});
} else if (id == NotificationCenter.FileDidFailUpload) {
final String location = (String) args[0];
final boolean enc = (Boolean) args[1];
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
ArrayList<DelayedMessage> arr = delayedMessages.get(location);
if (arr != null) {
for (int a = 0; a < arr.size(); a++) {
DelayedMessage obj = arr.get(a);
if (enc && obj.sendEncryptedRequest != null || !enc && obj.sendRequest != null) {
MessagesStorage.getInstance().markMessageAsSendError(obj.obj.messageOwner.id);
obj.obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
arr.remove(a);
a--;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, obj.obj.messageOwner.id);
processSentMessage(obj.obj.messageOwner.id);
}
}
if (arr.isEmpty()) {
delayedMessages.remove(location);
}
}
}
});
2014-09-28 15:37:26 +02:00
} else if (id == NotificationCenter.FilePreparingStarted) {
MessageObject messageObject = (MessageObject)args[0];
String finalPath = (String)args[1];
ArrayList<DelayedMessage> arr = delayedMessages.get(messageObject.messageOwner.attachPath);
if (arr != null) {
for (int a = 0; a < arr.size(); a++) {
DelayedMessage message = arr.get(a);
if (message.obj == messageObject) {
message.videoLocation.videoEditedInfo = null;
performSendDelayedMessage(message);
arr.remove(a);
a--;
break;
}
}
if (arr.isEmpty()) {
delayedMessages.remove(messageObject.messageOwner.attachPath);
}
}
} else if (id == NotificationCenter.FileNewChunkAvailable) {
MessageObject messageObject = (MessageObject)args[0];
String finalPath = (String)args[1];
long finalSize = (Long)args[2];
boolean isEncrypted = ((int)messageObject.getDialogId()) == 0;
FileLoader.getInstance().checkUploadNewDataAvailable(finalPath, isEncrypted, finalSize);
if (finalSize != 0) {
ArrayList<DelayedMessage> arr = delayedMessages.get(messageObject.messageOwner.attachPath);
if (arr != null) {
for (DelayedMessage message : arr) {
if (message.obj == messageObject) {
message.obj.messageOwner.videoEditedInfo = null;
message.obj.messageOwner.message = "-1";
message.obj.messageOwner.media.video.size = (int)finalSize;
2014-09-28 15:37:26 +02:00
2015-01-02 23:15:07 +01:00
ArrayList<TLRPC.Message> messages = new ArrayList<>();
2014-09-28 15:37:26 +02:00
messages.add(message.obj.messageOwner);
MessagesStorage.getInstance().putMessages(messages, false, true, false, 0);
break;
}
}
if (arr.isEmpty()) {
delayedMessages.remove(messageObject.messageOwner.attachPath);
}
}
}
} else if (id == NotificationCenter.FilePreparingFailed) {
MessageObject messageObject = (MessageObject)args[0];
String finalPath = (String)args[1];
stopVideoService(messageObject.messageOwner.attachPath);
2014-09-28 15:37:26 +02:00
ArrayList<DelayedMessage> arr = delayedMessages.get(finalPath);
if (arr != null) {
for (int a = 0; a < arr.size(); a++) {
DelayedMessage message = arr.get(a);
if (message.obj == messageObject) {
MessagesStorage.getInstance().markMessageAsSendError(message.obj.messageOwner.id);
message.obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
arr.remove(a);
a--;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, message.obj.messageOwner.id);
processSentMessage(message.obj.messageOwner.id);
}
}
if (arr.isEmpty()) {
delayedMessages.remove(finalPath);
}
}
2015-01-02 23:15:07 +01:00
} else if (id == NotificationCenter.httpFileDidLoaded) {
String path = (String)args[0];
String file = (String)args[1];
ArrayList<DelayedMessage> arr = delayedMessages.get(path);
if (arr != null) {
for (final DelayedMessage message : arr) {
if (message.type == 0) {
String md5 = Utilities.MD5(message.httpLocation) + ".jpg";
final File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
Utilities.globalQueue.postRunnable(new Runnable() {
@Override
public void run() {
final TLRPC.TL_photo photo = SendMessagesHelper.getInstance().generatePhotoSizes(cacheFile.toString(), null);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
if (photo != null) {
message.httpLocation = null;
message.obj.messageOwner.media.photo = photo;
message.obj.messageOwner.attachPath = cacheFile.toString();
message.location = photo.sizes.get(photo.sizes.size() - 1).location;
ArrayList<TLRPC.Message> messages = new ArrayList<>();
messages.add(message.obj.messageOwner);
MessagesStorage.getInstance().putMessages(messages, false, true, false, 0);
performSendDelayedMessage(message);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateMessageMedia, message.obj);
} else {
FileLog.e("tmessages", "can't load image " + message.httpLocation + " to file " + cacheFile.toString());
MessagesStorage.getInstance().markMessageAsSendError(message.obj.messageOwner.id);
message.obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, message.obj.messageOwner.id);
processSentMessage(message.obj.messageOwner.id);
}
}
});
}
});
} else if (message.type == 2) {
String md5 = Utilities.MD5(message.httpLocation) + ".gif";
final File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
Utilities.globalQueue.postRunnable(new Runnable() {
@Override
public void run() {
if (message.documentLocation.thumb.location instanceof TLRPC.TL_fileLocationUnavailable) {
try {
Bitmap bitmap = ImageLoader.loadBitmap(cacheFile.getAbsolutePath(), null, 90, 90);
if (bitmap != null) {
message.documentLocation.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, message.sendEncryptedRequest != null);
}
} catch (Exception e) {
message.documentLocation.thumb = null;
FileLog.e("tmessages", e);
}
if (message.documentLocation.thumb == null) {
message.documentLocation.thumb = new TLRPC.TL_photoSizeEmpty();
message.documentLocation.thumb.type = "s";
}
}
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
message.httpLocation = null;
message.obj.messageOwner.attachPath = cacheFile.toString();
message.location = message.documentLocation.thumb.location;
ArrayList<TLRPC.Message> messages = new ArrayList<>();
messages.add(message.obj.messageOwner);
MessagesStorage.getInstance().putMessages(messages, false, true, false, 0);
performSendDelayedMessage(message);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateMessageMedia, message.obj);
}
});
}
});
}
}
delayedMessages.remove(path);
}
} else if (id == NotificationCenter.httpFileDidFailedLoad) {
String path = (String)args[0];
ArrayList<DelayedMessage> arr = delayedMessages.get(path);
if (arr != null) {
for (DelayedMessage message : arr) {
MessagesStorage.getInstance().markMessageAsSendError(message.obj.messageOwner.id);
message.obj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, message.obj.messageOwner.id);
processSentMessage(message.obj.messageOwner.id);
}
delayedMessages.remove(path);
}
}
}
public void cancelSendingMessage(MessageObject object) {
String keyToRemvoe = null;
boolean enc = false;
for (HashMap.Entry<String, ArrayList<DelayedMessage>> entry : delayedMessages.entrySet()) {
ArrayList<DelayedMessage> messages = entry.getValue();
for (int a = 0; a < messages.size(); a++) {
DelayedMessage message = messages.get(a);
if (message.obj.messageOwner.id == object.messageOwner.id) {
messages.remove(a);
2014-09-28 15:37:26 +02:00
MediaController.getInstance().cancelVideoConvert(message.obj);
if (messages.size() == 0) {
keyToRemvoe = entry.getKey();
if (message.sendEncryptedRequest != null) {
enc = true;
}
}
break;
}
}
}
if (keyToRemvoe != null) {
2015-01-02 23:15:07 +01:00
if (keyToRemvoe.startsWith("http")) {
ImageLoader.getInstance().cancelLoadHttpFile(keyToRemvoe);
} else {
FileLoader.getInstance().cancelUploadFile(keyToRemvoe, enc);
}
2014-10-01 00:36:18 +02:00
stopVideoService(keyToRemvoe);
}
2015-01-02 23:15:07 +01:00
ArrayList<Integer> messages = new ArrayList<>();
messages.add(object.messageOwner.id);
MessagesController.getInstance().deleteMessages(messages, null, null);
}
public boolean retrySendMessage(MessageObject messageObject, boolean unsent) {
if (messageObject.messageOwner.id >= 0) {
return false;
}
2014-10-22 22:01:07 +02:00
if (messageObject.messageOwner.action instanceof TLRPC.TL_messageEncryptedAction) {
int enc_id = (int) (messageObject.getDialogId() >> 32);
TLRPC.EncryptedChat encryptedChat = MessagesController.getInstance().getEncryptedChat(enc_id);
if (encryptedChat == null) {
MessagesStorage.getInstance().markMessageAsSendError(messageObject.messageOwner.id);
messageObject.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, messageObject.messageOwner.id);
processSentMessage(messageObject.messageOwner.id);
return false;
}
2015-01-02 23:15:07 +01:00
if (messageObject.messageOwner.random_id == 0) {
messageObject.messageOwner.random_id = getNextRandomId();
}
2014-10-22 22:01:07 +02:00
if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionSetMessageTTL) {
SecretChatHelper.getInstance().sendTTLMessage(encryptedChat, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionDeleteMessages) {
SecretChatHelper.getInstance().sendMessagesDeleteMessage(encryptedChat, null, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionFlushHistory) {
SecretChatHelper.getInstance().sendClearHistoryMessage(encryptedChat, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionNotifyLayer) {
SecretChatHelper.getInstance().sendNotifyLayerMessage(encryptedChat, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionReadMessages) {
SecretChatHelper.getInstance().sendMessagesReadMessage(encryptedChat, null, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionScreenshotMessages) {
SecretChatHelper.getInstance().sendScreenshotMessage(encryptedChat, null, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionTyping) {
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionResend) {
2014-12-04 21:27:06 +01:00
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionCommitKey) {
SecretChatHelper.getInstance().sendCommitKeyMessage(encryptedChat, messageObject.messageOwner);
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionAbortKey) {
SecretChatHelper.getInstance().sendAbortKeyMessage(encryptedChat, messageObject.messageOwner, 0);
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionRequestKey) {
SecretChatHelper.getInstance().sendRequestKeyMessage(encryptedChat, messageObject.messageOwner);
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionAcceptKey) {
SecretChatHelper.getInstance().sendAcceptKeyMessage(encryptedChat, messageObject.messageOwner);
} else if (messageObject.messageOwner.action.encryptedAction instanceof TLRPC.TL_decryptedMessageActionNoop) {
SecretChatHelper.getInstance().sendNoopMessage(encryptedChat, messageObject.messageOwner);
2014-10-22 22:01:07 +02:00
}
return true;
}
if (unsent) {
unsentMessages.put(messageObject.messageOwner.id, messageObject);
}
sendMessage(messageObject);
return true;
}
protected void processSentMessage(int id) {
int prevSize = unsentMessages.size();
unsentMessages.remove(id);
if (prevSize != 0 && unsentMessages.size() == 0) {
checkUnsentMessages();
}
}
public void processForwardFromMyName(MessageObject messageObject, long did) {
if (messageObject == null) {
return;
}
if (messageObject.messageOwner.media != null && !(messageObject.messageOwner.media instanceof TLRPC.TL_messageMediaEmpty)) {
if (messageObject.messageOwner.media.photo instanceof TLRPC.TL_photo) {
2015-01-02 23:15:07 +01:00
sendMessage((TLRPC.TL_photo) messageObject.messageOwner.media.photo, null, null, did);
} else if (messageObject.messageOwner.media.audio instanceof TLRPC.TL_audio) {
2014-09-28 15:37:26 +02:00
sendMessage((TLRPC.TL_audio) messageObject.messageOwner.media.audio, messageObject.messageOwner.attachPath, did);
} else if (messageObject.messageOwner.media.video instanceof TLRPC.TL_video) {
2014-09-28 15:37:26 +02:00
TLRPC.TL_video video = (TLRPC.TL_video) messageObject.messageOwner.media.video;
video.videoEditedInfo = messageObject.messageOwner.videoEditedInfo;
sendMessage(video, null, messageObject.messageOwner.attachPath, did);
} else if (messageObject.messageOwner.media.document instanceof TLRPC.TL_document) {
2014-09-28 15:37:26 +02:00
sendMessage((TLRPC.TL_document) messageObject.messageOwner.media.document, null, messageObject.messageOwner.attachPath, did);
} else if (messageObject.messageOwner.media.geo instanceof TLRPC.TL_geoPoint) {
sendMessage(messageObject.messageOwner.media.geo.lat, messageObject.messageOwner.media.geo._long, did);
} else if (messageObject.messageOwner.media.phone_number != null) {
TLRPC.User user = new TLRPC.TL_userContact();
user.phone = messageObject.messageOwner.media.phone_number;
user.first_name = messageObject.messageOwner.media.first_name;
user.last_name = messageObject.messageOwner.media.last_name;
user.id = messageObject.messageOwner.media.user_id;
sendMessage(user, did);
} else {
sendMessage(messageObject, did);
}
} else if (messageObject.messageOwner.message != null) {
sendMessage(messageObject.messageOwner.message, did);
} else {
sendMessage(messageObject, did);
}
}
public void sendMessage(TLRPC.User user, long peer) {
2014-10-11 13:30:32 +02:00
sendMessage(null, null, null, null, null, null, user, null, null, null, peer, false, null);
}
public void sendMessage(MessageObject message) {
2014-10-11 13:30:32 +02:00
sendMessage(null, null, null, null, null, message, null, null, null, null, message.getDialogId(), true, message.messageOwner.attachPath);
}
public void sendMessage(MessageObject message, long peer) {
2014-10-11 13:30:32 +02:00
sendMessage(null, null, null, null, null, message, null, null, null, null, peer, false, message.messageOwner.attachPath);
}
2014-09-28 15:37:26 +02:00
public void sendMessage(TLRPC.TL_document document, String originalPath, String path, long peer) {
2014-10-11 13:30:32 +02:00
sendMessage(null, null, null, null, null, null, null, document, null, originalPath, peer, false, path);
}
public void sendMessage(String message, long peer) {
2014-10-11 13:30:32 +02:00
sendMessage(message, null, null, null, null, null, null, null, null, null, peer, false, null);
}
public void sendMessage(double lat, double lon, long peer) {
2014-09-28 15:37:26 +02:00
sendMessage(null, lat, lon, null, null, null, null, null, null, null, peer, false, null);
}
2015-01-02 23:15:07 +01:00
public void sendMessage(TLRPC.TL_photo photo, String originalPath, String path, long peer) {
sendMessage(null, null, null, photo, null, null, null, null, null, originalPath, peer, false, path);
}
2014-09-28 15:37:26 +02:00
public void sendMessage(TLRPC.TL_video video, String originalPath, String path, long peer) {
2014-10-11 13:30:32 +02:00
sendMessage(null, null, null, null, video, null, null, null, null, originalPath, peer, false, path);
}
2014-09-28 15:37:26 +02:00
public void sendMessage(TLRPC.TL_audio audio, String path, long peer) {
2014-10-11 13:30:32 +02:00
sendMessage(null, null, null, null, null, null, null, null, audio, null, peer, false, path);
}
2014-10-20 13:30:05 +02:00
private void sendMessage(String message, Double lat, Double lon, TLRPC.TL_photo photo, TLRPC.TL_video video, MessageObject msgObj, TLRPC.User user, TLRPC.TL_document document, TLRPC.TL_audio audio, String originalPath, long peer, boolean retry, String path) {
if (peer == 0) {
return;
}
TLRPC.Message newMsg = null;
int type = -1;
int lower_id = (int) peer;
int high_id = (int) (peer >> 32);
2014-10-14 10:13:16 +02:00
TLRPC.EncryptedChat encryptedChat = null;
TLRPC.InputPeer sendToPeer = null;
ArrayList<TLRPC.InputUser> sendToPeers = null;
if (lower_id == 0) {
encryptedChat = MessagesController.getInstance().getEncryptedChat(high_id);
}
if (retry) {
newMsg = msgObj.messageOwner;
if (msgObj.type == 0) {
if (msgObj.messageOwner instanceof TLRPC.TL_messageForwarded) {
type = 4;
} else {
message = newMsg.message;
type = 0;
}
} else if (msgObj.type == 4) {
lat = newMsg.media.geo.lat;
lon = newMsg.media.geo._long;
type = 1;
} else if (msgObj.type == 1) {
if (msgObj.messageOwner instanceof TLRPC.TL_messageForwarded) {
type = 4;
} else {
photo = (TLRPC.TL_photo) newMsg.media.photo;
type = 2;
}
} else if (msgObj.type == 3) {
if (msgObj.messageOwner instanceof TLRPC.TL_messageForwarded) {
type = 4;
} else {
type = 3;
video = (TLRPC.TL_video) newMsg.media.video;
2014-09-28 15:37:26 +02:00
video.videoEditedInfo = newMsg.videoEditedInfo;
}
2015-01-02 23:15:07 +01:00
} else if (msgObj.type == 12) {
user = new TLRPC.TL_userRequest();
user.phone = newMsg.media.phone_number;
user.first_name = newMsg.media.first_name;
user.last_name = newMsg.media.last_name;
user.id = newMsg.media.user_id;
type = 6;
2015-01-02 23:15:07 +01:00
} else if (msgObj.type == 8 || msgObj.type == 9 || msgObj.type == 13) {
document = (TLRPC.TL_document) newMsg.media.document;
type = 7;
} else if (msgObj.type == 2) {
audio = (TLRPC.TL_audio) newMsg.media.audio;
type = 8;
}
} else {
if (message != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaEmpty();
type = 0;
newMsg.message = message;
2014-10-11 13:30:32 +02:00
} else if (lat != null && lon != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaGeo();
newMsg.media.geo = new TLRPC.TL_geoPoint();
newMsg.media.geo.lat = lat;
newMsg.media.geo._long = lon;
newMsg.message = "";
type = 1;
} else if (photo != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaPhoto();
newMsg.media.photo = photo;
type = 2;
newMsg.message = "-1";
2015-01-02 23:15:07 +01:00
if (path != null && path.length() > 0 && path.startsWith("http")) {
newMsg.attachPath = path;
} else {
TLRPC.FileLocation location1 = photo.sizes.get(photo.sizes.size() - 1).location;
newMsg.attachPath = FileLoader.getPathToAttach(location1, true).toString();
}
} else if (video != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaVideo();
newMsg.media.video = video;
2014-09-28 15:37:26 +02:00
newMsg.videoEditedInfo = video.videoEditedInfo;
type = 3;
2014-09-28 15:37:26 +02:00
if (video.videoEditedInfo == null) {
newMsg.message = "-1";
} else {
newMsg.message = video.videoEditedInfo.getString();
}
newMsg.attachPath = path;
} else if (msgObj != null) {
newMsg = new TLRPC.TL_messageForwarded();
if (msgObj.messageOwner instanceof TLRPC.TL_messageForwarded) {
newMsg.fwd_from_id = msgObj.messageOwner.fwd_from_id;
newMsg.fwd_date = msgObj.messageOwner.fwd_date;
newMsg.media = msgObj.messageOwner.media;
newMsg.message = msgObj.messageOwner.message;
newMsg.fwd_msg_id = msgObj.messageOwner.id;
newMsg.attachPath = msgObj.messageOwner.attachPath;
type = 4;
} else {
newMsg.fwd_from_id = msgObj.messageOwner.from_id;
newMsg.fwd_date = msgObj.messageOwner.date;
newMsg.media = msgObj.messageOwner.media;
newMsg.message = msgObj.messageOwner.message;
newMsg.fwd_msg_id = msgObj.messageOwner.id;
newMsg.attachPath = msgObj.messageOwner.attachPath;
type = 4;
}
} else if (user != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaContact();
newMsg.media.phone_number = user.phone;
newMsg.media.first_name = user.first_name;
newMsg.media.last_name = user.last_name;
newMsg.media.user_id = user.id;
newMsg.message = "";
type = 6;
} else if (document != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaDocument();
newMsg.media.document = document;
type = 7;
newMsg.message = "-1";
2014-09-28 15:37:26 +02:00
newMsg.attachPath = path;
} else if (audio != null) {
2014-10-14 10:13:16 +02:00
if (encryptedChat != null && AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
newMsg = new TLRPC.TL_message_secret();
2014-10-14 10:13:16 +02:00
} else {
newMsg = new TLRPC.TL_message();
}
newMsg.media = new TLRPC.TL_messageMediaAudio();
newMsg.media.audio = audio;
type = 8;
newMsg.message = "-1";
2014-09-28 15:37:26 +02:00
newMsg.attachPath = path;
}
2015-01-02 23:15:07 +01:00
if (newMsg.attachPath == null) {
newMsg.attachPath = "";
}
newMsg.local_id = newMsg.id = UserConfig.getNewMessageId();
newMsg.from_id = UserConfig.getClientUserId();
2014-10-07 22:14:27 +02:00
newMsg.flags |= TLRPC.MESSAGE_FLAG_OUT;
UserConfig.saveConfig(false);
}
if (newMsg.random_id == 0) {
newMsg.random_id = getNextRandomId();
}
newMsg.date = ConnectionsManager.getInstance().getCurrentTime();
2014-10-07 22:14:27 +02:00
newMsg.flags |= TLRPC.MESSAGE_FLAG_UNREAD;
newMsg.dialog_id = peer;
if (lower_id != 0) {
if (high_id == 1) {
if (currentChatInfo == null) {
processSentMessage(newMsg.id);
2014-10-20 13:30:05 +02:00
return;
}
2015-01-02 23:15:07 +01:00
sendToPeers = new ArrayList<>();
for (TLRPC.TL_chatParticipant participant : currentChatInfo.participants) {
TLRPC.User sendToUser = MessagesController.getInstance().getUser(participant.user_id);
TLRPC.InputUser peerUser = MessagesController.getInputUser(sendToUser);
if (peerUser != null) {
sendToPeers.add(peerUser);
}
}
newMsg.to_id = new TLRPC.TL_peerChat();
newMsg.to_id.chat_id = lower_id;
} else {
if (lower_id < 0) {
newMsg.to_id = new TLRPC.TL_peerChat();
newMsg.to_id.chat_id = -lower_id;
sendToPeer = new TLRPC.TL_inputPeerChat();
sendToPeer.chat_id = -lower_id;
} else {
newMsg.to_id = new TLRPC.TL_peerUser();
newMsg.to_id.user_id = lower_id;
TLRPC.User sendToUser = MessagesController.getInstance().getUser(lower_id);
if (sendToUser == null) {
processSentMessage(newMsg.id);
2014-10-20 13:30:05 +02:00
return;
}
if (sendToUser instanceof TLRPC.TL_userForeign || sendToUser instanceof TLRPC.TL_userRequest) {
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;
}
}
}
} else {
newMsg.to_id = new TLRPC.TL_peerUser();
if (encryptedChat.participant_id == UserConfig.getClientUserId()) {
newMsg.to_id.user_id = encryptedChat.admin_id;
} else {
newMsg.to_id.user_id = encryptedChat.participant_id;
}
newMsg.ttl = encryptedChat.ttl;
2014-10-23 17:30:35 +02:00
if (newMsg.ttl != 0) {
if (newMsg.media instanceof TLRPC.TL_messageMediaAudio) {
newMsg.ttl = Math.max(encryptedChat.ttl, newMsg.media.audio.duration + 1);
} else if (newMsg.media instanceof TLRPC.TL_messageMediaVideo) {
newMsg.ttl = Math.max(encryptedChat.ttl, newMsg.media.video.duration + 1);
}
2014-10-21 22:35:16 +02:00
}
}
MessageObject newMsgObj = new MessageObject(newMsg, null, 2);
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SENDING;
2015-01-02 23:15:07 +01:00
ArrayList<MessageObject> objArr = new ArrayList<>();
objArr.add(newMsgObj);
2015-01-02 23:15:07 +01:00
ArrayList<TLRPC.Message> arr = new ArrayList<>();
arr.add(newMsg);
MessagesStorage.getInstance().putMessages(arr, false, true, false, 0);
MessagesController.getInstance().updateInterfaceWithMessages(peer, objArr);
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
try {
if (type == 0) {
if (encryptedChat == null) {
if (sendToPeers != null) {
TLRPC.TL_messages_sendBroadcast reqSend = new TLRPC.TL_messages_sendBroadcast();
reqSend.message = message;
reqSend.contacts = sendToPeers;
reqSend.media = new TLRPC.TL_inputMediaEmpty();
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
} else {
TLRPC.TL_messages_sendMessage reqSend = new TLRPC.TL_messages_sendMessage();
reqSend.message = message;
reqSend.peer = sendToPeer;
reqSend.random_id = newMsg.random_id;
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
}
} else {
2014-10-16 22:02:44 +02:00
TLRPC.TL_decryptedMessage reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessage();
2014-10-21 22:35:16 +02:00
reqSend.ttl = newMsg.ttl;
2014-10-16 22:02:44 +02:00
} else {
reqSend = new TLRPC.TL_decryptedMessage_old();
reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))];
Utilities.random.nextBytes(reqSend.random_bytes);
}
reqSend.random_id = newMsg.random_id;
reqSend.message = message;
reqSend.media = new TLRPC.TL_decryptedMessageMediaEmpty();
SecretChatHelper.getInstance().performSendEncryptedRequest(reqSend, newMsgObj.messageOwner, encryptedChat, null, null);
}
} else if (type >= 1 && type <= 3 || type >= 5 && type <= 8) {
if (encryptedChat == null) {
TLRPC.InputMedia inputMedia = null;
DelayedMessage delayedMessage = null;
if (type == 1) {
inputMedia = new TLRPC.TL_inputMediaGeoPoint();
inputMedia.geo_point = new TLRPC.TL_inputGeoPoint();
inputMedia.geo_point.lat = lat;
inputMedia.geo_point._long = lon;
} else if (type == 2) {
if (photo.access_hash == 0) {
inputMedia = new TLRPC.TL_inputMediaUploadedPhoto();
delayedMessage = new DelayedMessage();
delayedMessage.originalPath = originalPath;
delayedMessage.type = 0;
delayedMessage.obj = newMsgObj;
2015-01-02 23:15:07 +01:00
if (path != null && path.length() > 0 && path.startsWith("http")) {
delayedMessage.httpLocation = path;
} else {
delayedMessage.location = photo.sizes.get(photo.sizes.size() - 1).location;
}
} else {
TLRPC.TL_inputMediaPhoto media = new TLRPC.TL_inputMediaPhoto();
media.id = new TLRPC.TL_inputPhoto();
media.id.id = photo.id;
media.id.access_hash = photo.access_hash;
inputMedia = media;
}
} else if (type == 3) {
if (video.access_hash == 0) {
2014-10-01 00:36:18 +02:00
if (video.thumb.location != null) {
inputMedia = new TLRPC.TL_inputMediaUploadedThumbVideo();
} else {
inputMedia = new TLRPC.TL_inputMediaUploadedVideo();
}
inputMedia.duration = video.duration;
inputMedia.w = video.w;
inputMedia.h = video.h;
inputMedia.mime_type = video.mime_type;
delayedMessage = new DelayedMessage();
delayedMessage.originalPath = originalPath;
delayedMessage.type = 1;
delayedMessage.obj = newMsgObj;
delayedMessage.location = video.thumb.location;
delayedMessage.videoLocation = video;
} else {
TLRPC.TL_inputMediaVideo media = new TLRPC.TL_inputMediaVideo();
media.id = new TLRPC.TL_inputVideo();
media.id.id = video.id;
media.id.access_hash = video.access_hash;
inputMedia = media;
}
} else if (type == 6) {
inputMedia = new TLRPC.TL_inputMediaContact();
inputMedia.phone_number = user.phone;
inputMedia.first_name = user.first_name;
inputMedia.last_name = user.last_name;
} else if (type == 7) {
if (document.access_hash == 0) {
if (document.thumb.location != null && document.thumb.location instanceof TLRPC.TL_fileLocation) {
inputMedia = new TLRPC.TL_inputMediaUploadedThumbDocument();
} else {
inputMedia = new TLRPC.TL_inputMediaUploadedDocument();
}
inputMedia.mime_type = document.mime_type;
2015-01-02 23:15:07 +01:00
inputMedia.attributes = document.attributes;
delayedMessage = new DelayedMessage();
delayedMessage.originalPath = originalPath;
delayedMessage.type = 2;
delayedMessage.obj = newMsgObj;
2015-01-02 23:15:07 +01:00
if (path != null && path.length() > 0 && path.startsWith("http")) {
delayedMessage.httpLocation = path;
}
delayedMessage.documentLocation = document;
delayedMessage.location = document.thumb.location;
} else {
TLRPC.TL_inputMediaDocument media = new TLRPC.TL_inputMediaDocument();
media.id = new TLRPC.TL_inputDocument();
media.id.id = document.id;
media.id.access_hash = document.access_hash;
inputMedia = media;
}
} else if (type == 8) {
if (audio.access_hash == 0) {
inputMedia = new TLRPC.TL_inputMediaUploadedAudio();
inputMedia.duration = audio.duration;
inputMedia.mime_type = audio.mime_type;
delayedMessage = new DelayedMessage();
delayedMessage.type = 3;
delayedMessage.obj = newMsgObj;
delayedMessage.audioLocation = audio;
} else {
TLRPC.TL_inputMediaAudio media = new TLRPC.TL_inputMediaAudio();
media.id = new TLRPC.TL_inputAudio();
media.id.id = audio.id;
media.id.access_hash = audio.access_hash;
inputMedia = media;
}
}
TLObject reqSend = null;
if (sendToPeers != null) {
TLRPC.TL_messages_sendBroadcast request = new TLRPC.TL_messages_sendBroadcast();
request.contacts = sendToPeers;
request.media = inputMedia;
request.message = "";
if (delayedMessage != null) {
delayedMessage.sendRequest = request;
}
reqSend = request;
} else {
TLRPC.TL_messages_sendMedia request = new TLRPC.TL_messages_sendMedia();
request.peer = sendToPeer;
request.random_id = newMsg.random_id;
request.media = inputMedia;
if (delayedMessage != null) {
delayedMessage.sendRequest = request;
}
reqSend = request;
}
if (type == 1) {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
} else if (type == 2) {
if (photo.access_hash == 0) {
performSendDelayedMessage(delayedMessage);
} else {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
}
} else if (type == 3) {
if (video.access_hash == 0) {
performSendDelayedMessage(delayedMessage);
} else {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
}
} else if (type == 6) {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
} else if (type == 7) {
if (document.access_hash == 0) {
performSendDelayedMessage(delayedMessage);
} else {
2015-01-02 23:15:07 +01:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, originalPath);
}
} else if (type == 8) {
if (audio.access_hash == 0) {
performSendDelayedMessage(delayedMessage);
} else {
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
}
}
} else {
2014-10-16 22:02:44 +02:00
TLRPC.TL_decryptedMessage reqSend;
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend = new TLRPC.TL_decryptedMessage();
2014-10-21 22:35:16 +02:00
reqSend.ttl = newMsg.ttl;
2014-10-16 22:02:44 +02:00
} else {
reqSend = new TLRPC.TL_decryptedMessage_old();
reqSend.random_bytes = new byte[Math.max(1, (int) Math.ceil(Utilities.random.nextDouble() * 16))];
Utilities.random.nextBytes(reqSend.random_bytes);
}
reqSend.random_id = newMsg.random_id;
reqSend.message = "";
if (type == 1) {
reqSend.media = new TLRPC.TL_decryptedMessageMediaGeoPoint();
reqSend.media.lat = lat;
reqSend.media._long = lon;
SecretChatHelper.getInstance().performSendEncryptedRequest(reqSend, newMsgObj.messageOwner, encryptedChat, null, null);
} else if (type == 2) {
TLRPC.PhotoSize small = photo.sizes.get(0);
TLRPC.PhotoSize big = photo.sizes.get(photo.sizes.size() - 1);
reqSend.media = new TLRPC.TL_decryptedMessageMediaPhoto();
reqSend.media.thumb = small.bytes;
reqSend.media.thumb_h = small.h;
reqSend.media.thumb_w = small.w;
reqSend.media.w = big.w;
reqSend.media.h = big.h;
reqSend.media.size = big.size;
if (big.location.key == null) {
DelayedMessage delayedMessage = new DelayedMessage();
delayedMessage.originalPath = originalPath;
delayedMessage.sendEncryptedRequest = reqSend;
delayedMessage.type = 0;
delayedMessage.obj = newMsgObj;
delayedMessage.encryptedChat = encryptedChat;
2015-01-02 23:15:07 +01:00
if (path != null && path.length() > 0 && path.startsWith("http")) {
delayedMessage.httpLocation = path;
} else {
delayedMessage.location = photo.sizes.get(photo.sizes.size() - 1).location;
}
performSendDelayedMessage(delayedMessage);
} else {
TLRPC.TL_inputEncryptedFile encryptedFile = new TLRPC.TL_inputEncryptedFile();
encryptedFile.id = big.location.volume_id;
encryptedFile.access_hash = big.location.secret;
reqSend.media.key = big.location.key;
reqSend.media.iv = big.location.iv;
SecretChatHelper.getInstance().performSendEncryptedRequest(reqSend, newMsgObj.messageOwner, encryptedChat, encryptedFile, null);
}
} else if (type == 3) {
2014-10-14 10:13:16 +02:00
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend.media = new TLRPC.TL_decryptedMessageMediaVideo();
} else {
reqSend.media = new TLRPC.TL_decryptedMessageMediaVideo_old();
}
reqSend.media.duration = video.duration;
reqSend.media.size = video.size;
reqSend.media.w = video.w;
reqSend.media.h = video.h;
reqSend.media.thumb = video.thumb.bytes;
reqSend.media.thumb_h = video.thumb.h;
reqSend.media.thumb_w = video.thumb.w;
reqSend.media.mime_type = "video/mp4";
if (video.access_hash == 0) {
DelayedMessage delayedMessage = new DelayedMessage();
delayedMessage.originalPath = originalPath;
delayedMessage.sendEncryptedRequest = reqSend;
delayedMessage.type = 1;
delayedMessage.obj = newMsgObj;
delayedMessage.encryptedChat = encryptedChat;
delayedMessage.videoLocation = video;
performSendDelayedMessage(delayedMessage);
} else {
TLRPC.TL_inputEncryptedFile encryptedFile = new TLRPC.TL_inputEncryptedFile();
encryptedFile.id = video.id;
encryptedFile.access_hash = video.access_hash;
reqSend.media.key = video.key;
reqSend.media.iv = video.iv;
SecretChatHelper.getInstance().performSendEncryptedRequest(reqSend, newMsgObj.messageOwner, encryptedChat, encryptedFile, null);
}
} else if (type == 6) {
reqSend.media = new TLRPC.TL_decryptedMessageMediaContact();
reqSend.media.phone_number = user.phone;
reqSend.media.first_name = user.first_name;
reqSend.media.last_name = user.last_name;
reqSend.media.user_id = user.id;
SecretChatHelper.getInstance().performSendEncryptedRequest(reqSend, newMsgObj.messageOwner, encryptedChat, null, null);
} else if (type == 7) {
reqSend.media = new TLRPC.TL_decryptedMessageMediaDocument();
reqSend.media.size = document.size;
if (!(document.thumb instanceof TLRPC.TL_photoSizeEmpty)) {
reqSend.media.thumb = document.thumb.bytes;
reqSend.media.thumb_h = document.thumb.h;
reqSend.media.thumb_w = document.thumb.w;
} else {
reqSend.media.thumb = new byte[0];
reqSend.media.thumb_h = 0;
reqSend.media.thumb_w = 0;
}
2015-01-02 23:15:07 +01:00
reqSend.media.file_name = FileLoader.getDocumentFileName(document);
reqSend.media.mime_type = document.mime_type;
if (document.access_hash == 0) {
DelayedMessage delayedMessage = new DelayedMessage();
delayedMessage.originalPath = originalPath;
delayedMessage.sendEncryptedRequest = reqSend;
delayedMessage.type = 2;
delayedMessage.obj = newMsgObj;
delayedMessage.encryptedChat = encryptedChat;
2015-01-02 23:15:07 +01:00
if (path != null && path.length() > 0 && path.startsWith("http")) {
delayedMessage.httpLocation = path;
}
delayedMessage.documentLocation = document;
performSendDelayedMessage(delayedMessage);
} else {
TLRPC.TL_inputEncryptedFile encryptedFile = new TLRPC.TL_inputEncryptedFile();
encryptedFile.id = document.id;
encryptedFile.access_hash = document.access_hash;
reqSend.media.key = document.key;
reqSend.media.iv = document.iv;
SecretChatHelper.getInstance().performSendEncryptedRequest(reqSend, newMsgObj.messageOwner, encryptedChat, encryptedFile, null);
}
} else if (type == 8) {
2014-10-14 10:13:16 +02:00
if (AndroidUtilities.getPeerLayerVersion(encryptedChat.layer) >= 17) {
reqSend.media = new TLRPC.TL_decryptedMessageMediaAudio();
} else {
reqSend.media = new TLRPC.TL_decryptedMessageMediaAudio_old();
}
reqSend.media.duration = audio.duration;
reqSend.media.size = audio.size;
reqSend.media.mime_type = "audio/ogg";
DelayedMessage delayedMessage = new DelayedMessage();
delayedMessage.sendEncryptedRequest = reqSend;
delayedMessage.type = 3;
delayedMessage.obj = newMsgObj;
delayedMessage.encryptedChat = encryptedChat;
delayedMessage.audioLocation = audio;
performSendDelayedMessage(delayedMessage);
}
}
} else if (type == 4) {
TLRPC.TL_messages_forwardMessage reqSend = new TLRPC.TL_messages_forwardMessage();
reqSend.peer = sendToPeer;
reqSend.random_id = newMsg.random_id;
if (msgObj.messageOwner.id >= 0) {
reqSend.id = msgObj.messageOwner.id;
} else {
reqSend.id = msgObj.messageOwner.fwd_msg_id;
}
2014-10-22 22:01:07 +02:00
performSendMessageRequest(reqSend, newMsgObj.messageOwner, null);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
MessagesStorage.getInstance().markMessageAsSendError(newMsgObj.messageOwner.id);
newMsgObj.messageOwner.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, newMsgObj.messageOwner.id);
processSentMessage(newMsgObj.messageOwner.id);
}
}
private void performSendDelayedMessage(final DelayedMessage message) {
if (message.type == 0) {
2015-01-02 23:15:07 +01:00
if (message.httpLocation != null) {
putToDelayedMessages(message.httpLocation, message);
ImageLoader.getInstance().loadHttpFile(message.httpLocation, "jpg");
} else {
2015-01-02 23:15:07 +01:00
String location = FileLoader.getPathToAttach(message.location, true).toString();
putToDelayedMessages(location, message);
if (message.sendRequest != null) {
FileLoader.getInstance().uploadFile(location, false, true);
} else {
FileLoader.getInstance().uploadFile(location, true, true);
}
}
} else if (message.type == 1) {
2014-09-28 15:37:26 +02:00
if (message.videoLocation.videoEditedInfo != null) {
String location = message.obj.messageOwner.attachPath;
if (location == null) {
location = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.videoLocation.id + ".mp4";
}
2014-09-28 15:37:26 +02:00
putToDelayedMessages(location, message);
MediaController.getInstance().scheduleVideoConvert(message.obj);
} else {
if (message.sendRequest != null) {
TLRPC.InputMedia media = null;
if (message.sendRequest instanceof TLRPC.TL_messages_sendMedia) {
media = ((TLRPC.TL_messages_sendMedia) message.sendRequest).media;
} else if (message.sendRequest instanceof TLRPC.TL_messages_sendBroadcast) {
media = ((TLRPC.TL_messages_sendBroadcast) message.sendRequest).media;
}
if (media.file == null) {
String location = message.obj.messageOwner.attachPath;
if (location == null) {
location = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.videoLocation.id + ".mp4";
}
putToDelayedMessages(location, message);
if (message.obj.messageOwner.videoEditedInfo != null) {
FileLoader.getInstance().uploadFile(location, false, false, message.videoLocation.size);
} else {
FileLoader.getInstance().uploadFile(location, false, false);
}
} else {
String location = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.location.volume_id + "_" + message.location.local_id + ".jpg";
putToDelayedMessages(location, message);
FileLoader.getInstance().uploadFile(location, false, true);
}
} else {
2014-09-28 15:37:26 +02:00
String location = message.obj.messageOwner.attachPath;
if (location == null) {
location = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.videoLocation.id + ".mp4";
}
putToDelayedMessages(location, message);
2014-10-01 00:36:18 +02:00
if (message.obj.messageOwner.videoEditedInfo != null) {
2014-09-28 15:37:26 +02:00
FileLoader.getInstance().uploadFile(location, true, false, message.videoLocation.size);
} else {
2014-09-28 15:37:26 +02:00
FileLoader.getInstance().uploadFile(location, true, false);
}
}
}
} else if (message.type == 2) {
2015-01-02 23:15:07 +01:00
if (message.httpLocation != null) {
putToDelayedMessages(message.httpLocation, message);
ImageLoader.getInstance().loadHttpFile(message.httpLocation, "gif");
} else {
if (message.sendRequest != null) {
TLRPC.InputMedia media = null;
if (message.sendRequest instanceof TLRPC.TL_messages_sendMedia) {
media = ((TLRPC.TL_messages_sendMedia) message.sendRequest).media;
} else if (message.sendRequest instanceof TLRPC.TL_messages_sendBroadcast) {
media = ((TLRPC.TL_messages_sendBroadcast) message.sendRequest).media;
}
if (media.file == null) {
String location = message.obj.messageOwner.attachPath;
putToDelayedMessages(location, message);
if (message.sendRequest != null) {
FileLoader.getInstance().uploadFile(location, false, false);
} else {
FileLoader.getInstance().uploadFile(location, true, false);
}
} else if (media.thumb == null && message.location != null) {
String location = FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE) + "/" + message.location.volume_id + "_" + message.location.local_id + ".jpg";
putToDelayedMessages(location, message);
FileLoader.getInstance().uploadFile(location, false, true);
2014-09-28 15:37:26 +02:00
}
2015-01-02 23:15:07 +01:00
} else {
String location = message.obj.messageOwner.attachPath;
2014-09-28 15:37:26 +02:00
putToDelayedMessages(location, message);
2015-01-02 23:15:07 +01:00
FileLoader.getInstance().uploadFile(location, true, false);
2014-09-28 15:37:26 +02:00
}
}
} else if (message.type == 3) {
2014-09-28 15:37:26 +02:00
String location = message.obj.messageOwner.attachPath;
putToDelayedMessages(location, message);
if (message.sendRequest != null) {
FileLoader.getInstance().uploadFile(location, false, true);
} else {
FileLoader.getInstance().uploadFile(location, true, true);
}
}
}
protected void stopVideoService(final String path) {
2014-10-31 20:02:29 +01:00
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.stopEncodingService, path);
}
});
}
});
}
2014-12-04 21:27:06 +01:00
protected void putToSendingMessages(TLRPC.Message message) {
sendingMessages.put(message.id, message);
}
protected void removeFromSendingMessages(int mid) {
sendingMessages.remove(mid);
}
public boolean isSendingMessage(int mid) {
return sendingMessages.containsKey(mid);
}
2014-10-22 22:01:07 +02:00
private void performSendMessageRequest(final TLObject req, final TLRPC.Message newMsgObj, final String originalPath) {
2014-12-04 21:27:06 +01:00
putToSendingMessages(newMsgObj);
ConnectionsManager.getInstance().performRpc(req, new RPCRequest.RPCRequestDelegate() {
@Override
public void run(TLObject response, TLRPC.TL_error error) {
if (error == null) {
2014-10-22 22:01:07 +02:00
final int oldId = newMsgObj.id;
final boolean isBroadcast = req instanceof TLRPC.TL_messages_sendBroadcast;
2015-01-02 23:15:07 +01:00
final ArrayList<TLRPC.Message> sentMessages = new ArrayList<>();
2014-10-22 22:01:07 +02:00
final String attachPath = newMsgObj.attachPath;
if (response instanceof TLRPC.messages_SentMessage) {
TLRPC.messages_SentMessage res = (TLRPC.messages_SentMessage) response;
2014-10-22 22:01:07 +02:00
newMsgObj.id = res.id;
newMsgObj.date = res.date;
MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.date);
} else if (response instanceof TLRPC.messages_StatedMessage) {
TLRPC.messages_StatedMessage res = (TLRPC.messages_StatedMessage) response;
sentMessages.add(res.message);
2014-10-22 22:01:07 +02:00
newMsgObj.id = res.message.id;
processSentMessage(newMsgObj, res.message, originalPath);
MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, res.message.date);
} else if (response instanceof TLRPC.messages_StatedMessages) {
TLRPC.messages_StatedMessages res = (TLRPC.messages_StatedMessages) response;
if (!res.messages.isEmpty()) {
sentMessages.addAll(res.messages);
TLRPC.Message message = res.messages.get(0);
if (!isBroadcast) {
2014-10-22 22:01:07 +02:00
newMsgObj.id = message.id;
}
processSentMessage(newMsgObj, message, originalPath);
}
MessagesController.getInstance().processNewDifferenceParams(res.seq, res.pts, -1);
}
2014-10-31 20:02:29 +01:00
MessagesStorage.getInstance().getStorageQueue().postRunnable(new Runnable() {
@Override
public void run() {
2014-10-22 22:01:07 +02:00
MessagesStorage.getInstance().updateMessageStateAndId(newMsgObj.random_id, oldId, (isBroadcast ? oldId : newMsgObj.id), 0, false);
MessagesStorage.getInstance().putMessages(sentMessages, true, false, isBroadcast, 0);
if (isBroadcast) {
2015-01-02 23:15:07 +01:00
ArrayList<TLRPC.Message> currentMessage = new ArrayList<>();
2014-10-22 22:01:07 +02:00
currentMessage.add(newMsgObj);
newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
MessagesStorage.getInstance().putMessages(currentMessage, true, false, false, 0);
}
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
2014-10-22 22:01:07 +02:00
newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
if (isBroadcast) {
for (TLRPC.Message message : sentMessages) {
2015-01-02 23:15:07 +01:00
ArrayList<MessageObject> arr = new ArrayList<>();
MessageObject messageObject = new MessageObject(message, null, 0);
arr.add(messageObject);
MessagesController.getInstance().updateInterfaceWithMessages(messageObject.getDialogId(), arr, isBroadcast);
}
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
}
2014-10-22 22:01:07 +02:00
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByServer, oldId, (isBroadcast ? oldId : newMsgObj.id), newMsgObj);
processSentMessage(oldId);
2014-12-04 21:27:06 +01:00
removeFromSendingMessages(oldId);
}
});
2014-10-22 22:01:07 +02:00
if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) {
stopVideoService(attachPath);
}
}
});
} else {
2014-10-22 22:01:07 +02:00
MessagesStorage.getInstance().markMessageAsSendError(newMsgObj.id);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
2014-10-22 22:01:07 +02:00
newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SEND_ERROR;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageSendError, newMsgObj.id);
processSentMessage(newMsgObj.id);
if (newMsgObj.media instanceof TLRPC.TL_messageMediaVideo) {
stopVideoService(newMsgObj.attachPath);
}
2014-12-04 21:27:06 +01:00
removeFromSendingMessages(newMsgObj.id);
}
});
}
}
}, (req instanceof TLRPC.TL_messages_forwardMessages ? null : new RPCRequest.RPCQuickAckDelegate() {
@Override
public void quickAck() {
2014-10-22 22:01:07 +02:00
final int msg_id = newMsgObj.id;
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
2014-10-22 22:01:07 +02:00
newMsgObj.send_state = MessageObject.MESSAGE_SEND_STATE_SENT;
NotificationCenter.getInstance().postNotificationName(NotificationCenter.messageReceivedByAck, msg_id);
}
});
}
}), true, RPCRequest.RPCRequestClassGeneric | RPCRequest.RPCRequestClassCanCompress, ConnectionsManager.DEFAULT_DATACENTER_ID);
}
private void processSentMessage(TLRPC.Message newMsg, TLRPC.Message sentMessage, String originalPath) {
if (sentMessage == null) {
return;
}
if (sentMessage.media instanceof TLRPC.TL_messageMediaPhoto && sentMessage.media.photo != null && newMsg.media instanceof TLRPC.TL_messageMediaPhoto && newMsg.media.photo != null) {
MessagesStorage.getInstance().putSentFile(originalPath, sentMessage.media.photo, 0);
for (TLRPC.PhotoSize size : sentMessage.media.photo.sizes) {
if (size instanceof TLRPC.TL_photoSizeEmpty) {
continue;
2014-10-28 18:07:44 +01:00
}
for (TLRPC.PhotoSize size2 : newMsg.media.photo.sizes) {
2015-01-02 23:15:07 +01:00
if (size2.location.volume_id == Integer.MIN_VALUE && size.type.equals(size2.type) || size.w == size2.w && size.h == size2.h) {
String fileName = size2.location.volume_id + "_" + size2.location.local_id;
String fileName2 = size.location.volume_id + "_" + size.location.local_id;
if (fileName.equals(fileName2)) {
break;
}
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName + ".jpg");
File cacheFile2 = null;
if (sentMessage.media.photo.sizes.size() == 1 || size.w > 80 || size.h > 80) {
cacheFile2 = FileLoader.getPathToAttach(size);
} else {
cacheFile2 = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName2 + ".jpg");
}
cacheFile.renameTo(cacheFile2);
ImageLoader.getInstance().replaceImageInCache(fileName, fileName2);
size2.location = size.location;
break;
}
}
}
sentMessage.message = newMsg.message;
sentMessage.attachPath = newMsg.attachPath;
newMsg.media.photo.id = sentMessage.media.photo.id;
newMsg.media.photo.access_hash = sentMessage.media.photo.access_hash;
} else if (sentMessage.media instanceof TLRPC.TL_messageMediaVideo && sentMessage.media.video != null && newMsg.media instanceof TLRPC.TL_messageMediaVideo && newMsg.media.video != null) {
MessagesStorage.getInstance().putSentFile(originalPath, sentMessage.media.video, 2);
TLRPC.PhotoSize size2 = newMsg.media.video.thumb;
TLRPC.PhotoSize size = sentMessage.media.video.thumb;
2015-01-02 23:15:07 +01:00
if (size2.location.volume_id == Integer.MIN_VALUE && size2.location != null && size.location != null && !(size instanceof TLRPC.TL_photoSizeEmpty) && !(size2 instanceof TLRPC.TL_photoSizeEmpty)) {
String fileName = size2.location.volume_id + "_" + size2.location.local_id;
String fileName2 = size.location.volume_id + "_" + size.location.local_id;
if (!fileName.equals(fileName2)) {
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName + ".jpg");
File cacheFile2 = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName2 + ".jpg");
cacheFile.renameTo(cacheFile2);
ImageLoader.getInstance().replaceImageInCache(fileName, fileName2);
size2.location = size.location;
}
}
sentMessage.message = newMsg.message;
newMsg.media.video.dc_id = sentMessage.media.video.dc_id;
newMsg.media.video.id = sentMessage.media.video.id;
newMsg.media.video.access_hash = sentMessage.media.video.access_hash;
if (newMsg.attachPath != null && newMsg.attachPath.startsWith(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE).getAbsolutePath())) {
File cacheFile = new File(newMsg.attachPath);
File cacheFile2 = FileLoader.getPathToAttach(newMsg.media.video);
if (!cacheFile.renameTo(cacheFile2)) {
sentMessage.attachPath = newMsg.attachPath;
}
} else {
sentMessage.attachPath = newMsg.attachPath;
}
} else if (sentMessage.media instanceof TLRPC.TL_messageMediaDocument && sentMessage.media.document != null && newMsg.media instanceof TLRPC.TL_messageMediaDocument && newMsg.media.document != null) {
MessagesStorage.getInstance().putSentFile(originalPath, sentMessage.media.document, 1);
TLRPC.PhotoSize size2 = newMsg.media.document.thumb;
TLRPC.PhotoSize size = sentMessage.media.document.thumb;
2015-01-02 23:15:07 +01:00
if (size2.location.volume_id == Integer.MIN_VALUE && size2.location != null && size.location != null && !(size instanceof TLRPC.TL_photoSizeEmpty) && !(size2 instanceof TLRPC.TL_photoSizeEmpty)) {
String fileName = size2.location.volume_id + "_" + size2.location.local_id;
String fileName2 = size.location.volume_id + "_" + size.location.local_id;
if (!fileName.equals(fileName2)) {
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName + ".jpg");
File cacheFile2 = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName2 + ".jpg");
cacheFile.renameTo(cacheFile2);
ImageLoader.getInstance().replaceImageInCache(fileName, fileName2);
size2.location = size.location;
}
}
newMsg.media.document.dc_id = sentMessage.media.document.dc_id;
newMsg.media.document.id = sentMessage.media.document.id;
newMsg.media.document.access_hash = sentMessage.media.document.access_hash;
2015-01-02 23:15:07 +01:00
newMsg.media.document.attributes = sentMessage.media.document.attributes;
if (newMsg.attachPath != null && newMsg.attachPath.startsWith(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE).getAbsolutePath())) {
File cacheFile = new File(newMsg.attachPath);
File cacheFile2 = FileLoader.getPathToAttach(sentMessage.media.document);
if (!cacheFile.renameTo(cacheFile2)) {
sentMessage.attachPath = newMsg.attachPath;
sentMessage.message = newMsg.message;
} else {
newMsg.attachPath = "";
2015-01-02 23:15:07 +01:00
if (originalPath != null && originalPath.startsWith("http")) {
MessagesStorage.getInstance().addRecentLocalFile(originalPath, cacheFile2.toString());
}
}
} else {
sentMessage.attachPath = newMsg.attachPath;
sentMessage.message = newMsg.message;
}
} else if (sentMessage.media instanceof TLRPC.TL_messageMediaAudio && sentMessage.media.audio != null && newMsg.media instanceof TLRPC.TL_messageMediaAudio && newMsg.media.audio != null) {
sentMessage.message = newMsg.message;
String fileName = newMsg.media.audio.dc_id + "_" + newMsg.media.audio.id + ".ogg";
newMsg.media.audio.dc_id = sentMessage.media.audio.dc_id;
newMsg.media.audio.id = sentMessage.media.audio.id;
newMsg.media.audio.access_hash = sentMessage.media.audio.access_hash;
String fileName2 = sentMessage.media.audio.dc_id + "_" + sentMessage.media.audio.id + ".ogg";
if (!fileName.equals(fileName2)) {
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName);
File cacheFile2 = FileLoader.getPathToAttach(sentMessage.media.audio);
if (!cacheFile.renameTo(cacheFile2)) {
sentMessage.attachPath = newMsg.attachPath;
}
}
}
}
private void putToDelayedMessages(String location, DelayedMessage message) {
ArrayList<DelayedMessage> arrayList = delayedMessages.get(location);
if (arrayList == null) {
2015-01-02 23:15:07 +01:00
arrayList = new ArrayList<>();
delayedMessages.put(location, arrayList);
}
arrayList.add(message);
}
protected long getNextRandomId() {
long val = 0;
while (val == 0) {
val = Utilities.random.nextLong();
}
return val;
}
public void checkUnsentMessages() {
2014-10-22 22:01:07 +02:00
MessagesStorage.getInstance().getUnsentMessages(1000);
}
protected void processUnsentMessages(final ArrayList<TLRPC.Message> messages, final ArrayList<TLRPC.User> users, final ArrayList<TLRPC.Chat> chats, final ArrayList<TLRPC.EncryptedChat> encryptedChats) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
MessagesController.getInstance().putUsers(users, true);
MessagesController.getInstance().putChats(chats, true);
MessagesController.getInstance().putEncryptedChats(encryptedChats, true);
for (TLRPC.Message message : messages) {
MessageObject messageObject = new MessageObject(message, null, 0);
retrySendMessage(messageObject, true);
}
}
});
}
2014-09-28 15:37:26 +02:00
public TLRPC.TL_photo generatePhotoSizes(String path, Uri imageUri) {
Bitmap bitmap = ImageLoader.loadBitmap(path, imageUri, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize());
2014-10-01 21:55:24 +02:00
if (bitmap == null && AndroidUtilities.getPhotoSize() != 800) {
bitmap = ImageLoader.loadBitmap(path, imageUri, 800, 800);
}
2015-01-02 23:15:07 +01:00
ArrayList<TLRPC.PhotoSize> sizes = new ArrayList<>();
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, true);
if (size != null) {
sizes.add(size);
2014-09-28 15:37:26 +02:00
}
2015-01-02 23:15:07 +01:00
size = ImageLoader.scaleAndSaveImage(bitmap, AndroidUtilities.getPhotoSize(), AndroidUtilities.getPhotoSize(), 80, false, 101, 101);
if (size != null) {
sizes.add(size);
2014-09-28 15:37:26 +02:00
}
if (bitmap != null) {
bitmap.recycle();
2014-09-28 15:37:26 +02:00
}
if (sizes.isEmpty()) {
return null;
} 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.caption = "";
photo.geo = new TLRPC.TL_geoPointEmpty();
return photo;
2014-09-28 15:37:26 +02:00
}
}
2014-10-16 22:02:44 +02:00
2014-11-21 11:59:05 +01:00
private static boolean prepareSendingDocumentInternal(String path, String originalPath, Uri uri, String mime, final long dialog_id) {
2014-11-21 01:14:44 +01:00
if ((path == null || path.length() == 0) && uri == null) {
2014-11-21 11:59:05 +01:00
return false;
2014-10-16 22:02:44 +02:00
}
2014-11-21 01:14:44 +01:00
MimeTypeMap myMime = MimeTypeMap.getSingleton();
if (uri != null) {
String extension = null;
if (mime != null) {
extension = myMime.getExtensionFromMimeType(mime);
}
if (extension == null) {
extension = "txt";
}
path = MediaController.copyDocumentToCache(uri, extension);
2014-11-21 11:59:05 +01:00
if (path == null) {
return false;
}
2014-11-21 01:14:44 +01:00
}
2014-10-16 22:02:44 +02:00
final File f = new File(path);
if (!f.exists() || f.length() == 0) {
2014-11-21 11:59:05 +01:00
return false;
2014-10-16 22:02:44 +02:00
}
boolean isEncrypted = (int)dialog_id == 0;
String name = f.getName();
if (name == null) {
name = "noname";
}
String ext = "";
int idx = path.lastIndexOf(".");
if (idx != -1) {
ext = path.substring(idx + 1);
}
if (originalPath != null) {
originalPath += "" + f.length();
}
TLRPC.TL_document document = (TLRPC.TL_document)MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 1 : 4);
if (document == null && !path.equals(originalPath)) {
document = (TLRPC.TL_document)MessagesStorage.getInstance().getSentFile(path + f.length(), !isEncrypted ? 1 : 4);
}
if (document == null) {
document = new TLRPC.TL_document();
document.id = 0;
document.date = ConnectionsManager.getInstance().getCurrentTime();
2015-01-02 23:15:07 +01:00
TLRPC.TL_documentAttributeFilename fileName = new TLRPC.TL_documentAttributeFilename();
fileName.file_name = name;
document.attributes.add(fileName);
2014-10-16 22:02:44 +02:00
document.size = (int)f.length();
document.dc_id = 0;
if (ext.length() != 0) {
String mimeType = myMime.getMimeTypeFromExtension(ext.toLowerCase());
if (mimeType != null) {
document.mime_type = mimeType;
} else {
document.mime_type = "application/octet-stream";
}
} else {
document.mime_type = "application/octet-stream";
}
if (document.mime_type.equals("image/gif")) {
try {
Bitmap bitmap = ImageLoader.loadBitmap(f.getAbsolutePath(), null, 90, 90);
if (bitmap != null) {
document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
2015-01-02 23:15:07 +01:00
if (document.mime_type.equals("image/webp") && !isEncrypted) {
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
try {
bmOptions.inJustDecodeBounds = true;
RandomAccessFile file = new RandomAccessFile(path, "r");
ByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, path.length());
Utilities.loadWebpImage(buffer, buffer.limit(), bmOptions);
file.close();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
if (bmOptions.outWidth != 0 && bmOptions.outHeight != 0 && bmOptions.outWidth <= 800 && bmOptions.outHeight <= 800) {
TLRPC.TL_documentAttributeSticker attributeSticker = new TLRPC.TL_documentAttributeSticker();
document.attributes.add(attributeSticker);
TLRPC.TL_documentAttributeImageSize attributeImageSize = new TLRPC.TL_documentAttributeImageSize();
attributeImageSize.w = bmOptions.outWidth;
attributeImageSize.h = bmOptions.outHeight;
document.attributes.add(attributeImageSize);
}
}
2014-10-16 22:02:44 +02:00
if (document.thumb == null) {
document.thumb = new TLRPC.TL_photoSizeEmpty();
document.thumb.type = "s";
}
}
final TLRPC.TL_document documentFinal = document;
final String originalPathFinal = originalPath;
2014-11-21 01:14:44 +01:00
final String pathFinal = path;
AndroidUtilities.runOnUIThread(new Runnable() {
2014-10-16 22:02:44 +02:00
@Override
public void run() {
2014-11-21 01:14:44 +01:00
SendMessagesHelper.getInstance().sendMessage(documentFinal, originalPathFinal, pathFinal, dialog_id);
2014-10-16 22:02:44 +02:00
}
});
2014-11-21 11:59:05 +01:00
return true;
2014-10-16 22:02:44 +02:00
}
2014-11-21 01:14:44 +01:00
public static void prepareSendingDocument(String path, String originalPath, Uri uri, String mine, long dialog_id) {
if ((path == null || originalPath == null) && uri == null) {
2014-10-16 22:02:44 +02:00
return;
}
2015-01-02 23:15:07 +01:00
ArrayList<String> paths = new ArrayList<>();
ArrayList<String> originalPaths = new ArrayList<>();
2014-11-21 01:14:44 +01:00
ArrayList<Uri> uris = null;
if (uri != null) {
2015-01-02 23:15:07 +01:00
uris = new ArrayList<>();
2014-11-21 01:14:44 +01:00
}
2014-10-16 22:02:44 +02:00
paths.add(path);
originalPaths.add(originalPath);
2014-11-21 01:14:44 +01:00
prepareSendingDocuments(paths, originalPaths, uris, mine, dialog_id);
2014-10-16 22:02:44 +02:00
}
2014-11-21 01:14:44 +01:00
public static void prepareSendingDocuments(final ArrayList<String> paths, final ArrayList<String> originalPaths, final ArrayList<Uri> uris, final String mime, final long dialog_id) {
if (paths == null && originalPaths == null && uris == null || paths != null && originalPaths != null && paths.size() != originalPaths.size()) {
2014-10-16 22:02:44 +02:00
return;
}
new Thread(new Runnable() {
@Override
public void run() {
2014-11-21 11:59:05 +01:00
boolean error = false;
2014-11-21 01:14:44 +01:00
if (paths != null) {
for (int a = 0; a < paths.size(); a++) {
2014-11-21 11:59:05 +01:00
if (!prepareSendingDocumentInternal(paths.get(a), originalPaths.get(a), null, mime, dialog_id)) {
error = true;
}
2014-11-21 01:14:44 +01:00
}
}
if (uris != null) {
for (int a = 0; a < uris.size(); a++) {
2014-11-21 11:59:05 +01:00
if (!prepareSendingDocumentInternal(null, null, uris.get(a), mime, dialog_id)) {
error = true;
}
2014-11-21 01:14:44 +01:00
}
2014-10-16 22:02:44 +02:00
}
2014-11-21 11:59:05 +01:00
if (error) {
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
try {
Toast toast = Toast.makeText(ApplicationLoader.applicationContext, LocaleController.getString("UnsupportedAttachment", R.string.UnsupportedAttachment), Toast.LENGTH_SHORT);
toast.show();
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
});
}
2014-10-16 22:02:44 +02:00
}
}).start();
}
public static void prepareSendingPhoto(String imageFilePath, Uri imageUri, long dialog_id) {
ArrayList<String> paths = null;
ArrayList<Uri> uris = null;
if (imageFilePath != null && imageFilePath.length() != 0) {
2015-01-02 23:15:07 +01:00
paths = new ArrayList<>();
2014-10-16 22:02:44 +02:00
paths.add(imageFilePath);
}
if (imageUri != null) {
2015-01-02 23:15:07 +01:00
uris = new ArrayList<>();
2014-10-16 22:02:44 +02:00
uris.add(imageUri);
}
prepareSendingPhotos(paths, uris, dialog_id);
}
2015-01-02 23:15:07 +01:00
public static void prepareSendingPhotosSearch(final ArrayList<MediaController.SearchImage> photos, final long dialog_id) {
if (photos == null || photos.isEmpty()) {
return;
}
new Thread(new Runnable() {
@Override
public void run() {
boolean isEncrypted = (int)dialog_id == 0;
for (final MediaController.SearchImage searchImage : photos) {
if (searchImage.type == 1) {
TLRPC.TL_document document = (TLRPC.TL_document)MessagesStorage.getInstance().getSentFile(searchImage.imageUrl, !isEncrypted ? 1 : 4);
String md5 = Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
if (document == null) {
File thumbFile = null;
document = new TLRPC.TL_document();
document.id = 0;
document.date = ConnectionsManager.getInstance().getCurrentTime();
TLRPC.TL_documentAttributeFilename fileName = new TLRPC.TL_documentAttributeFilename();
fileName.file_name = md5;
document.attributes.add(fileName);
document.size = searchImage.size;
document.dc_id = 0;
document.mime_type = "image/gif";
if (cacheFile.exists()) {
thumbFile = cacheFile;
} else {
cacheFile = null;
String thumb = Utilities.MD5(searchImage.thumbUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
thumbFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), thumb);
if (!thumbFile.exists()) {
thumbFile = null;
}
}
if (thumbFile != null) {
try {
Bitmap bitmap = ImageLoader.loadBitmap(thumbFile.getAbsolutePath(), null, 90, 90);
if (bitmap != null) {
document.thumb = ImageLoader.scaleAndSaveImage(bitmap, 90, 90, 55, isEncrypted);
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
} else {
document.thumb = new TLRPC.TL_photoSize();
document.thumb.w = searchImage.width;
document.thumb.h = searchImage.height;
document.thumb.size = 0;
document.thumb.location = new TLRPC.TL_fileLocationUnavailable();
document.thumb.type = "x";
}
}
final TLRPC.TL_document documentFinal = document;
final String originalPathFinal = searchImage.imageUrl;
final String pathFinal = cacheFile == null ? searchImage.imageUrl : cacheFile.toString();
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
SendMessagesHelper.getInstance().sendMessage(documentFinal, originalPathFinal, pathFinal, dialog_id);
}
});
} else {
boolean needDownloadHttp = true;
TLRPC.TL_photo photo = (TLRPC.TL_photo) MessagesStorage.getInstance().getSentFile(searchImage.imageUrl, !isEncrypted ? 0 : 3);
if (photo == null) {
String md5 = Utilities.MD5(searchImage.imageUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.imageUrl);
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
if (cacheFile.exists()) {
photo = SendMessagesHelper.getInstance().generatePhotoSizes(cacheFile.toString(), null);
needDownloadHttp = false;
} else {
md5 = Utilities.MD5(searchImage.thumbUrl) + "." + ImageLoader.getHttpUrlExtension(searchImage.thumbUrl);
cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), md5);
if (cacheFile.exists()) {
photo = SendMessagesHelper.getInstance().generatePhotoSizes(cacheFile.toString(), null);
} else {
photo = new TLRPC.TL_photo();
photo.user_id = UserConfig.getClientUserId();
photo.date = ConnectionsManager.getInstance().getCurrentTime();
photo.caption = "";
photo.geo = new TLRPC.TL_geoPointEmpty();
TLRPC.TL_photoSize photoSize = new TLRPC.TL_photoSize();
photoSize.w = searchImage.width;
photoSize.h = searchImage.height;
photoSize.size = 0;
photoSize.location = new TLRPC.TL_fileLocationUnavailable();
photoSize.type = "x";
photo.sizes.add(photoSize);
}
}
}
if (photo != null) {
final String originalPathFinal = searchImage.imageUrl;
final TLRPC.TL_photo photoFinal = photo;
final boolean needDownloadHttpFinal = needDownloadHttp;
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
SendMessagesHelper.getInstance().sendMessage(photoFinal, originalPathFinal, needDownloadHttpFinal ? searchImage.imageUrl : null, dialog_id);
}
});
}
}
}
}
}).start();
}
2014-10-16 22:02:44 +02:00
public static void prepareSendingPhotos(ArrayList<String> paths, ArrayList<Uri> uris, final long dialog_id) {
if (paths == null && uris == null || paths != null && paths.isEmpty() || uris != null && uris.isEmpty()) {
return;
}
2015-01-02 23:15:07 +01:00
final ArrayList<String> pathsCopy = new ArrayList<>();
final ArrayList<Uri> urisCopy = new ArrayList<>();
2014-10-16 22:02:44 +02:00
if (paths != null) {
pathsCopy.addAll(paths);
}
if (uris != null) {
urisCopy.addAll(uris);
}
new Thread(new Runnable() {
@Override
public void run() {
boolean isEncrypted = (int)dialog_id == 0;
ArrayList<String> sendAsDocuments = null;
ArrayList<String> sendAsDocumentsOriginal = null;
int count = !pathsCopy.isEmpty() ? pathsCopy.size() : urisCopy.size();
String path = null;
Uri uri = null;
for (int a = 0; a < count; a++) {
if (!pathsCopy.isEmpty()) {
path = pathsCopy.get(a);
} else if (!urisCopy.isEmpty()) {
uri = urisCopy.get(a);
}
String originalPath = path;
String tempPath = path;
if (tempPath == null && uri != null) {
tempPath = Utilities.getPath(uri);
originalPath = uri.toString();
}
2015-01-02 23:15:07 +01:00
boolean isDocument = false;
if (tempPath != null && (tempPath.endsWith(".gif") || tempPath.endsWith(".webp"))) {
isDocument = true;
2014-10-16 22:02:44 +02:00
} else if (tempPath == null && uri != null) {
2015-01-02 23:15:07 +01:00
if (MediaController.isGif(uri)) {
isDocument = true;
2014-10-16 22:02:44 +02:00
originalPath = uri.toString();
tempPath = MediaController.copyDocumentToCache(uri, "gif");
2015-01-02 23:15:07 +01:00
} else if (MediaController.isWebp(uri)) {
isDocument = true;
originalPath = uri.toString();
tempPath = MediaController.copyDocumentToCache(uri, "webp");
2014-10-16 22:02:44 +02:00
}
}
2015-01-02 23:15:07 +01:00
if (isDocument) {
2014-10-16 22:02:44 +02:00
if (sendAsDocuments == null) {
2015-01-02 23:15:07 +01:00
sendAsDocuments = new ArrayList<>();
sendAsDocumentsOriginal = new ArrayList<>();
2014-10-16 22:02:44 +02:00
}
sendAsDocuments.add(tempPath);
sendAsDocumentsOriginal.add(originalPath);
} else {
if (tempPath != null) {
File temp = new File(tempPath);
originalPath += temp.length() + "_" + temp.lastModified();
} else {
originalPath = null;
}
TLRPC.TL_photo photo = (TLRPC.TL_photo)MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 0 : 3);
if (photo == null && uri != null) {
photo = (TLRPC.TL_photo)MessagesStorage.getInstance().getSentFile(Utilities.getPath(uri), !isEncrypted ? 0 : 3);
}
if (photo == null) {
photo = SendMessagesHelper.getInstance().generatePhotoSizes(path, uri);
}
if (photo != null) {
final String originalPathFinal = originalPath;
final TLRPC.TL_photo photoFinal = photo;
AndroidUtilities.runOnUIThread(new Runnable() {
2014-10-16 22:02:44 +02:00
@Override
public void run() {
2015-01-02 23:15:07 +01:00
SendMessagesHelper.getInstance().sendMessage(photoFinal, originalPathFinal, null, dialog_id);
2014-10-16 22:02:44 +02:00
}
});
}
}
}
if (sendAsDocuments != null && !sendAsDocuments.isEmpty()) {
for (int a = 0; a < sendAsDocuments.size(); a++) {
2014-11-21 01:14:44 +01:00
prepareSendingDocumentInternal(sendAsDocuments.get(a), sendAsDocumentsOriginal.get(a), null, "gif", dialog_id);
2014-10-16 22:02:44 +02:00
}
}
}
}).start();
}
public static void prepareSendingVideo(final String videoPath, final long estimatedSize, final long duration, final int width, final int height, final TLRPC.VideoEditedInfo videoEditedInfo, final long dialog_id) {
if (videoPath == null || videoPath.length() == 0) {
return;
}
new Thread(new Runnable() {
@Override
public void run() {
boolean isEncrypted = (int)dialog_id == 0;
String path = videoPath;
String originalPath = videoPath;
File temp = new File(originalPath);
originalPath += temp.length() + "_" + temp.lastModified();
if (videoEditedInfo != null) {
originalPath += duration + "_" + videoEditedInfo.startTime + "_" + videoEditedInfo.endTime;
}
TLRPC.TL_video video = (TLRPC.TL_video)MessagesStorage.getInstance().getSentFile(originalPath, !isEncrypted ? 2 : 5);
if (video == null) {
Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Video.Thumbnails.MINI_KIND);
TLRPC.PhotoSize size = ImageLoader.scaleAndSaveImage(thumb, 90, 90, 55, isEncrypted);
video = new TLRPC.TL_video();
video.thumb = size;
if (video.thumb == null) {
video.thumb = new TLRPC.TL_photoSizeEmpty();
video.thumb.type = "s";
} else {
video.thumb.type = "s";
}
video.caption = "";
video.mime_type = "video/mp4";
video.id = 0;
UserConfig.saveConfig(false);
if (videoEditedInfo != null) {
video.duration = (int)(duration / 1000);
if (videoEditedInfo.rotationValue == 90 || videoEditedInfo.rotationValue == 270) {
video.w = height;
video.h = width;
} else {
video.w = width;
video.h = height;
}
video.size = (int)estimatedSize;
video.videoEditedInfo = videoEditedInfo;
String fileName = Integer.MIN_VALUE + "_" + UserConfig.lastLocalId + ".mp4";
UserConfig.lastLocalId--;
File cacheFile = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), fileName);
UserConfig.saveConfig(false);
path = cacheFile.getAbsolutePath();
} else {
if (temp != null && temp.exists()) {
video.size = (int) temp.length();
}
boolean infoObtained = false;
if (Build.VERSION.SDK_INT >= 14) {
MediaMetadataRetriever mediaMetadataRetriever = null;
try {
mediaMetadataRetriever = new MediaMetadataRetriever();
mediaMetadataRetriever.setDataSource(videoPath);
String width = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
if (width != null) {
video.w = Integer.parseInt(width);
}
String height = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
if (height != null) {
video.h = Integer.parseInt(height);
}
String duration = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
if (duration != null) {
video.duration = (int) Math.ceil(Long.parseLong(duration) / 1000.0f);
}
infoObtained = true;
} catch (Exception e) {
FileLog.e("tmessages", e);
} finally {
try {
if (mediaMetadataRetriever != null) {
mediaMetadataRetriever.release();
mediaMetadataRetriever = null;
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
}
if (!infoObtained) {
try {
MediaPlayer mp = MediaPlayer.create(ApplicationLoader.applicationContext, Uri.fromFile(new File(videoPath)));
if (mp != null) {
video.duration = (int) Math.ceil(mp.getDuration() / 1000.0f);
video.w = mp.getVideoWidth();
video.h = mp.getVideoHeight();
mp.release();
}
} catch (Exception e) {
FileLog.e("tmessages", e);
}
}
}
}
final TLRPC.TL_video videoFinal = video;
final String originalPathFinal = originalPath;
final String finalPath = path;
AndroidUtilities.runOnUIThread(new Runnable() {
2014-10-16 22:02:44 +02:00
@Override
public void run() {
SendMessagesHelper.getInstance().sendMessage(videoFinal, originalPathFinal, finalPath, dialog_id);
}
});
}
}).start();
}
}