mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-27 12:05:22 +00:00
Short circuit self-send.
// FREEBIE
This commit is contained in:
parent
c3eb0ea9db
commit
9768de2d5e
@ -499,6 +499,20 @@ public class MmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
return new Reader(masterSecret, cursor);
|
return new Reader(masterSecret, cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long copyMessageInbox(MasterSecret masterSecret, long messageId) throws MmsException {
|
||||||
|
SendReq[] request = getOutgoingMessages(masterSecret, messageId);
|
||||||
|
|
||||||
|
ContentValues contentValues = getContentValuesFromHeader(request[0].getPduHeaders());
|
||||||
|
|
||||||
|
contentValues.put(MESSAGE_BOX, Types.BASE_INBOX_TYPE | Types.SECURE_MESSAGE_BIT | Types.ENCRYPTION_SYMMETRIC_BIT);
|
||||||
|
contentValues.put(THREAD_ID, getThreadIdForMessage(messageId));
|
||||||
|
contentValues.put(READ, 1);
|
||||||
|
contentValues.put(DATE_RECEIVED, contentValues.getAsLong(DATE_SENT));
|
||||||
|
|
||||||
|
return insertMediaMessage(masterSecret, request[0].getPduHeaders(),
|
||||||
|
request[0].getBody(), contentValues);
|
||||||
|
}
|
||||||
|
|
||||||
private Pair<Long, Long> insertMessageInbox(MasterSecret masterSecret, IncomingMediaMessage retrieved,
|
private Pair<Long, Long> insertMessageInbox(MasterSecret masterSecret, IncomingMediaMessage retrieved,
|
||||||
String contentLocation, long threadId, long mailbox)
|
String contentLocation, long threadId, long mailbox)
|
||||||
throws MmsException
|
throws MmsException
|
||||||
|
@ -311,6 +311,32 @@ public class SmsDatabase extends Database implements MmsSmsColumns {
|
|||||||
notifyConversationListListeners();
|
notifyConversationListListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Pair<Long, Long> copyMessageInbox(long messageId) {
|
||||||
|
Reader reader = readerFor(getMessage(messageId));
|
||||||
|
SmsMessageRecord record = reader.getNext();
|
||||||
|
|
||||||
|
ContentValues contentValues = new ContentValues();
|
||||||
|
contentValues.put(TYPE, (record.getType() & ~Types.BASE_TYPE_MASK) | Types.BASE_INBOX_TYPE);
|
||||||
|
contentValues.put(ADDRESS, record.getIndividualRecipient().getNumber());
|
||||||
|
contentValues.put(ADDRESS_DEVICE_ID, record.getRecipientDeviceId());
|
||||||
|
contentValues.put(DATE_RECEIVED, System.currentTimeMillis());
|
||||||
|
contentValues.put(DATE_SENT, record.getDateSent());
|
||||||
|
contentValues.put(PROTOCOL, 31337);
|
||||||
|
contentValues.put(READ, 0);
|
||||||
|
contentValues.put(BODY, record.getBody().getBody());
|
||||||
|
contentValues.put(THREAD_ID, record.getThreadId());
|
||||||
|
|
||||||
|
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||||
|
long newMessageId = db.insert(TABLE_NAME, null, contentValues);
|
||||||
|
|
||||||
|
DatabaseFactory.getThreadDatabase(context).update(record.getThreadId());
|
||||||
|
notifyConversationListeners(record.getThreadId());
|
||||||
|
Trimmer.trimThread(context, record.getThreadId());
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
return new Pair<>(newMessageId, record.getThreadId());
|
||||||
|
}
|
||||||
|
|
||||||
protected Pair<Long, Long> insertMessageInbox(IncomingTextMessage message, long type) {
|
protected Pair<Long, Long> insertMessageInbox(IncomingTextMessage message, long type) {
|
||||||
if (message.isKeyExchange()) {
|
if (message.isKeyExchange()) {
|
||||||
type |= Types.KEY_EXCHANGE_BIT;
|
type |= Types.KEY_EXCHANGE_BIT;
|
||||||
|
@ -72,9 +72,7 @@ public class GcmBroadcastReceiver extends BroadcastReceiver {
|
|||||||
message.getTimestampMillis(),
|
message.getTimestampMillis(),
|
||||||
message.getRelay()));
|
message.getRelay()));
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException | InvalidVersionException e) {
|
||||||
Log.w(TAG, e);
|
|
||||||
} catch (InvalidVersionException e) {
|
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,15 +19,27 @@ package org.thoughtcrime.securesms.sms;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.MmsSmsColumns;
|
||||||
|
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||||
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
|
import org.thoughtcrime.securesms.mms.OutgoingMediaMessage;
|
||||||
|
import org.thoughtcrime.securesms.recipients.Recipients;
|
||||||
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.Util;
|
||||||
import org.whispersystems.textsecure.crypto.MasterSecret;
|
import org.whispersystems.textsecure.crypto.MasterSecret;
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.service.SendReceiveService;
|
import org.thoughtcrime.securesms.service.SendReceiveService;
|
||||||
|
import org.whispersystems.textsecure.push.IncomingPushMessage;
|
||||||
|
import org.whispersystems.textsecure.push.PushMessageProtos;
|
||||||
|
import org.whispersystems.textsecure.util.InvalidNumberException;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import ws.com.google.android.mms.MmsException;
|
import ws.com.google.android.mms.MmsException;
|
||||||
|
import ws.com.google.android.mms.pdu.RetrieveConf;
|
||||||
|
|
||||||
public class MessageSender {
|
public class MessageSender {
|
||||||
|
|
||||||
@ -35,19 +47,31 @@ public class MessageSender {
|
|||||||
OutgoingTextMessage message, long threadId,
|
OutgoingTextMessage message, long threadId,
|
||||||
boolean forceSms)
|
boolean forceSms)
|
||||||
{
|
{
|
||||||
if (threadId == -1)
|
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||||
|
|
||||||
|
if (threadId == -1) {
|
||||||
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(message.getRecipients());
|
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(message.getRecipients());
|
||||||
|
}
|
||||||
|
|
||||||
List<Long> messageIds = DatabaseFactory.getEncryptingSmsDatabase(context)
|
List<Long> messageIds = database.insertMessageOutbox(masterSecret, threadId, message, forceSms);
|
||||||
.insertMessageOutbox(masterSecret, threadId, message, forceSms);
|
|
||||||
|
|
||||||
for (long messageId : messageIds) {
|
if (!forceSms && isSelfSend(context, message.getRecipients())) {
|
||||||
Log.w("SMSSender", "Got message id for new message: " + messageId);
|
for (long messageId : messageIds) {
|
||||||
|
database.markAsSent(messageId);
|
||||||
|
database.markAsPush(messageId);
|
||||||
|
|
||||||
Intent intent = new Intent(SendReceiveService.SEND_SMS_ACTION, null,
|
Pair<Long, Long> messageAndThreadId = database.copyMessageInbox(messageId);
|
||||||
context, SendReceiveService.class);
|
database.markAsPush(messageAndThreadId.first);
|
||||||
intent.putExtra("message_id", messageId);
|
}
|
||||||
context.startService(intent);
|
} else {
|
||||||
|
for (long messageId : messageIds) {
|
||||||
|
Log.w("SMSSender", "Got message id for new message: " + messageId);
|
||||||
|
|
||||||
|
Intent intent = new Intent(SendReceiveService.SEND_SMS_ACTION, null,
|
||||||
|
context, SendReceiveService.class);
|
||||||
|
intent.putExtra("message_id", messageId);
|
||||||
|
context.startService(intent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return threadId;
|
return threadId;
|
||||||
@ -58,18 +82,27 @@ public class MessageSender {
|
|||||||
long threadId, boolean forceSms)
|
long threadId, boolean forceSms)
|
||||||
throws MmsException
|
throws MmsException
|
||||||
{
|
{
|
||||||
if (threadId == -1)
|
MmsDatabase database = DatabaseFactory.getMmsDatabase(context);
|
||||||
|
|
||||||
|
if (threadId == -1) {
|
||||||
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(message.getRecipients(), message.getDistributionType());
|
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(message.getRecipients(), message.getDistributionType());
|
||||||
|
}
|
||||||
|
|
||||||
long messageId = DatabaseFactory.getMmsDatabase(context)
|
long messageId = database.insertMessageOutbox(masterSecret, message, threadId, forceSms);
|
||||||
.insertMessageOutbox(masterSecret, message, threadId, forceSms);
|
|
||||||
|
|
||||||
Intent intent = new Intent(SendReceiveService.SEND_MMS_ACTION, null,
|
if (!forceSms && isSelfSend(context, message.getRecipients())) {
|
||||||
context, SendReceiveService.class);
|
database.markAsSent(messageId, "self-send".getBytes(), 0);
|
||||||
intent.putExtra("message_id", messageId);
|
database.markAsPush(messageId);
|
||||||
intent.putExtra("thread_id", threadId);
|
long newMessageId = database.copyMessageInbox(masterSecret, messageId);
|
||||||
|
database.markAsPush(newMessageId);
|
||||||
|
} else {
|
||||||
|
Intent intent = new Intent(SendReceiveService.SEND_MMS_ACTION, null,
|
||||||
|
context, SendReceiveService.class);
|
||||||
|
intent.putExtra("message_id", messageId);
|
||||||
|
intent.putExtra("thread_id", threadId);
|
||||||
|
|
||||||
context.startService(intent);
|
context.startService(intent);
|
||||||
|
}
|
||||||
|
|
||||||
return threadId;
|
return threadId;
|
||||||
}
|
}
|
||||||
@ -91,4 +124,22 @@ public class MessageSender {
|
|||||||
context.startService(intent);
|
context.startService(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isSelfSend(Context context, Recipients recipients) {
|
||||||
|
try {
|
||||||
|
if (!TextSecurePreferences.isPushRegistered(context)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!recipients.isSingleRecipient()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String e164number = Util.canonicalizeNumber(context, recipients.getPrimaryRecipient().getNumber());
|
||||||
|
return TextSecurePreferences.getLocalNumber(context).equals(e164number);
|
||||||
|
} catch (InvalidNumberException e) {
|
||||||
|
Log.w("MessageSender", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user