Skip to content

Commit

Permalink
Short circuit self-send.
Browse files Browse the repository at this point in the history
// FREEBIE
  • Loading branch information
moxie0 committed Oct 23, 2014
1 parent c3eb0ea commit 9768de2
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 20 deletions.
14 changes: 14 additions & 0 deletions src/org/thoughtcrime/securesms/database/MmsDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,20 @@ public Reader getNotificationsWithDownloadState(MasterSecret masterSecret, long
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,
String contentLocation, long threadId, long mailbox)
throws MmsException
Expand Down
26 changes: 26 additions & 0 deletions src/org/thoughtcrime/securesms/database/SmsDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,32 @@ protected void updateMessageBodyAndType(long messageId, String body, long maskOf
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) {
if (message.isKeyExchange()) {
type |= Types.KEY_EXCHANGE_BIT;
Expand Down
4 changes: 1 addition & 3 deletions src/org/thoughtcrime/securesms/gcm/GcmBroadcastReceiver.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,7 @@ private void handleReceivedMessage(Context context, String data) {
message.getTimestampMillis(),
message.getRelay()));
}
} catch (IOException e) {
Log.w(TAG, e);
} catch (InvalidVersionException e) {
} catch (IOException | InvalidVersionException e) {
Log.w(TAG, e);
}
}
Expand Down
85 changes: 68 additions & 17 deletions src/org/thoughtcrime/securesms/sms/MessageSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,35 +19,59 @@
import android.content.Context;
import android.content.Intent;
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.recipients.Recipients;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.textsecure.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.DatabaseFactory;
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 ws.com.google.android.mms.MmsException;
import ws.com.google.android.mms.pdu.RetrieveConf;

public class MessageSender {

public static long send(Context context, MasterSecret masterSecret,
OutgoingTextMessage message, long threadId,
boolean forceSms)
{
if (threadId == -1)
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);

if (threadId == -1) {
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(message.getRecipients());
}

List<Long> messageIds = DatabaseFactory.getEncryptingSmsDatabase(context)
.insertMessageOutbox(masterSecret, threadId, message, forceSms);
List<Long> messageIds = database.insertMessageOutbox(masterSecret, threadId, message, forceSms);

for (long messageId : messageIds) {
Log.w("SMSSender", "Got message id for new message: " + messageId);
if (!forceSms && isSelfSend(context, message.getRecipients())) {
for (long messageId : messageIds) {
database.markAsSent(messageId);
database.markAsPush(messageId);

Intent intent = new Intent(SendReceiveService.SEND_SMS_ACTION, null,
context, SendReceiveService.class);
intent.putExtra("message_id", messageId);
context.startService(intent);
Pair<Long, Long> messageAndThreadId = database.copyMessageInbox(messageId);
database.markAsPush(messageAndThreadId.first);
}
} 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;
Expand All @@ -58,18 +82,27 @@ public static long send(Context context, MasterSecret masterSecret,
long threadId, boolean forceSms)
throws MmsException
{
if (threadId == -1)
MmsDatabase database = DatabaseFactory.getMmsDatabase(context);

if (threadId == -1) {
threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(message.getRecipients(), message.getDistributionType());
}

long messageId = DatabaseFactory.getMmsDatabase(context)
.insertMessageOutbox(masterSecret, message, threadId, forceSms);
long messageId = database.insertMessageOutbox(masterSecret, message, threadId, forceSms);

Intent intent = new Intent(SendReceiveService.SEND_MMS_ACTION, null,
context, SendReceiveService.class);
intent.putExtra("message_id", messageId);
intent.putExtra("thread_id", threadId);
if (!forceSms && isSelfSend(context, message.getRecipients())) {
database.markAsSent(messageId, "self-send".getBytes(), 0);
database.markAsPush(messageId);
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;
}
Expand All @@ -91,4 +124,22 @@ public static void resend(Context context, long messageId, boolean isMms)
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;
}
}

}

0 comments on commit 9768de2

Please sign in to comment.