Search in sources :

Example 1 with TrimThreadJob

use of org.thoughtcrime.securesms.jobs.TrimThreadJob in project Signal-Android by WhisperSystems.

the class SmsDatabase method insertMessageInbox.

protected Optional<InsertResult> insertMessageInbox(IncomingTextMessage message, long type) {
    if (message.isJoined()) {
        type = (type & (Types.TOTAL_MASK - Types.BASE_TYPE_MASK)) | Types.JOINED_TYPE;
    } else if (message.isPreKeyBundle()) {
        type |= Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT;
    } else if (message.isSecureMessage()) {
        type |= Types.SECURE_MESSAGE_BIT;
    } else if (message.isGroup()) {
        type |= Types.SECURE_MESSAGE_BIT;
        if (((IncomingGroupMessage) message).isUpdate())
            type |= Types.GROUP_UPDATE_BIT;
        else if (((IncomingGroupMessage) message).isQuit())
            type |= Types.GROUP_QUIT_BIT;
    } else if (message.isEndSession()) {
        type |= Types.SECURE_MESSAGE_BIT;
        type |= Types.END_SESSION_BIT;
    }
    if (message.isPush())
        type |= Types.PUSH_MESSAGE_BIT;
    if (message.isIdentityUpdate())
        type |= Types.KEY_EXCHANGE_IDENTITY_UPDATE_BIT;
    if (message.isContentPreKeyBundle())
        type |= Types.KEY_EXCHANGE_CONTENT_FORMAT;
    Recipients recipients;
    if (message.getSender() != null) {
        recipients = RecipientFactory.getRecipientsFromString(context, message.getSender(), true);
    } else {
        Log.w(TAG, "Sender is null, returning unknown recipient");
        recipients = RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), false);
    }
    Recipients groupRecipients;
    if (message.getGroupId() == null) {
        groupRecipients = null;
    } else {
        groupRecipients = RecipientFactory.getRecipientsFromString(context, message.getGroupId(), true);
    }
    boolean unread = (org.thoughtcrime.securesms.util.Util.isDefaultSmsProvider(context) || message.isSecureMessage() || message.isGroup() || message.isPreKeyBundle()) && !message.isIdentityUpdate();
    long threadId;
    if (groupRecipients == null)
        threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
    else
        threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipients);
    ContentValues values = new ContentValues(6);
    values.put(ADDRESS, message.getSender());
    values.put(ADDRESS_DEVICE_ID, message.getSenderDeviceId());
    values.put(DATE_RECEIVED, System.currentTimeMillis());
    values.put(DATE_SENT, message.getSentTimestampMillis());
    values.put(PROTOCOL, message.getProtocol());
    values.put(READ, unread ? 0 : 1);
    values.put(SUBSCRIPTION_ID, message.getSubscriptionId());
    values.put(EXPIRES_IN, message.getExpiresIn());
    if (!TextUtils.isEmpty(message.getPseudoSubject()))
        values.put(SUBJECT, message.getPseudoSubject());
    values.put(REPLY_PATH_PRESENT, message.isReplyPathPresent());
    values.put(SERVICE_CENTER, message.getServiceCenterAddress());
    values.put(BODY, message.getMessageBody());
    values.put(TYPE, type);
    values.put(THREAD_ID, threadId);
    if (message.isPush() && isDuplicate(message, threadId)) {
        Log.w(TAG, "Duplicate message (" + message.getSentTimestampMillis() + "), ignoring...");
        return Optional.absent();
    } else {
        SQLiteDatabase db = databaseHelper.getWritableDatabase();
        long messageId = db.insert(TABLE_NAME, null, values);
        if (unread) {
            DatabaseFactory.getThreadDatabase(context).setUnread(threadId);
        }
        if (!message.isIdentityUpdate()) {
            DatabaseFactory.getThreadDatabase(context).update(threadId, true);
        }
        if (message.getSubscriptionId() != -1) {
            DatabaseFactory.getRecipientPreferenceDatabase(context).setDefaultSubscriptionId(recipients, message.getSubscriptionId());
        }
        notifyConversationListeners(threadId);
        jobManager.add(new TrimThreadJob(context, threadId));
        return Optional.of(new InsertResult(messageId, threadId));
    }
}
Also used : IncomingGroupMessage(org.thoughtcrime.securesms.sms.IncomingGroupMessage) ContentValues(android.content.ContentValues) TrimThreadJob(org.thoughtcrime.securesms.jobs.TrimThreadJob) Recipients(org.thoughtcrime.securesms.recipients.Recipients) SQLiteDatabase(android.database.sqlite.SQLiteDatabase)

Example 2 with TrimThreadJob

use of org.thoughtcrime.securesms.jobs.TrimThreadJob in project Signal-Android by WhisperSystems.

the class SmsDatabase method insertCallLog.

@NonNull
private Pair<Long, Long> insertCallLog(@NonNull String number, long type, boolean unread) {
    Recipients recipients = RecipientFactory.getRecipientsFromString(context, number, true);
    long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
    ContentValues values = new ContentValues(6);
    values.put(ADDRESS, number);
    values.put(ADDRESS_DEVICE_ID, 1);
    values.put(DATE_RECEIVED, System.currentTimeMillis());
    values.put(DATE_SENT, System.currentTimeMillis());
    values.put(READ, unread ? 0 : 1);
    values.put(TYPE, type);
    values.put(THREAD_ID, threadId);
    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    long messageId = db.insert(TABLE_NAME, null, values);
    DatabaseFactory.getThreadDatabase(context).update(threadId, true);
    notifyConversationListeners(threadId);
    jobManager.add(new TrimThreadJob(context, threadId));
    if (unread) {
        DatabaseFactory.getThreadDatabase(context).setUnread(threadId);
    }
    return new Pair<>(messageId, threadId);
}
Also used : ContentValues(android.content.ContentValues) TrimThreadJob(org.thoughtcrime.securesms.jobs.TrimThreadJob) Recipients(org.thoughtcrime.securesms.recipients.Recipients) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) Pair(android.util.Pair) NonNull(android.support.annotation.NonNull)

Example 3 with TrimThreadJob

use of org.thoughtcrime.securesms.jobs.TrimThreadJob in project Signal-Android by WhisperSystems.

the class SmsDatabase method copyMessageInbox.

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());
    contentValues.put(EXPIRES_IN, record.getExpiresIn());
    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    long newMessageId = db.insert(TABLE_NAME, null, contentValues);
    DatabaseFactory.getThreadDatabase(context).update(record.getThreadId(), true);
    notifyConversationListeners(record.getThreadId());
    jobManager.add(new TrimThreadJob(context, record.getThreadId()));
    reader.close();
    return new Pair<>(newMessageId, record.getThreadId());
}
Also used : ContentValues(android.content.ContentValues) TrimThreadJob(org.thoughtcrime.securesms.jobs.TrimThreadJob) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) SmsMessageRecord(org.thoughtcrime.securesms.database.model.SmsMessageRecord) Pair(android.util.Pair)

Example 4 with TrimThreadJob

use of org.thoughtcrime.securesms.jobs.TrimThreadJob in project Signal-Android by WhisperSystems.

the class SmsDatabase method insertMessageOutbox.

protected long insertMessageOutbox(long threadId, OutgoingTextMessage message, long type, boolean forceSms, long date) {
    if (message.isKeyExchange())
        type |= Types.KEY_EXCHANGE_BIT;
    else if (message.isSecureMessage())
        type |= (Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT);
    else if (message.isEndSession())
        type |= Types.END_SESSION_BIT;
    if (forceSms)
        type |= Types.MESSAGE_FORCE_SMS_BIT;
    String address = message.getRecipients().getPrimaryRecipient().getNumber();
    ContentValues contentValues = new ContentValues(6);
    contentValues.put(ADDRESS, PhoneNumberUtils.formatNumber(address));
    contentValues.put(THREAD_ID, threadId);
    contentValues.put(BODY, message.getMessageBody());
    contentValues.put(DATE_RECEIVED, System.currentTimeMillis());
    contentValues.put(DATE_SENT, date);
    contentValues.put(READ, 1);
    contentValues.put(TYPE, type);
    contentValues.put(SUBSCRIPTION_ID, message.getSubscriptionId());
    contentValues.put(EXPIRES_IN, message.getExpiresIn());
    try {
        contentValues.put(RECEIPT_COUNT, earlyReceiptCache.remove(date, canonicalizeNumber(context, address)));
    } catch (InvalidNumberException e) {
        Log.w(TAG, e);
    }
    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    long messageId = db.insert(TABLE_NAME, ADDRESS, contentValues);
    DatabaseFactory.getThreadDatabase(context).update(threadId, true);
    DatabaseFactory.getThreadDatabase(context).setLastSeen(threadId);
    notifyConversationListeners(threadId);
    jobManager.add(new TrimThreadJob(context, threadId));
    return messageId;
}
Also used : ContentValues(android.content.ContentValues) TrimThreadJob(org.thoughtcrime.securesms.jobs.TrimThreadJob) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) InvalidNumberException(org.whispersystems.signalservice.api.util.InvalidNumberException)

Example 5 with TrimThreadJob

use of org.thoughtcrime.securesms.jobs.TrimThreadJob in project Signal-Android by WhisperSystems.

the class MmsDatabase method insertMessageInbox.

private Optional<InsertResult> insertMessageInbox(MasterSecretUnion masterSecret, IncomingMediaMessage retrieved, String contentLocation, long threadId, long mailbox) throws MmsException {
    if (threadId == -1 || retrieved.isGroupMessage()) {
        try {
            threadId = getThreadIdFor(retrieved);
        } catch (RecipientFormattingException e) {
            Log.w("MmsDatabase", e);
            if (threadId == -1)
                throw new MmsException(e);
        }
    }
    ContentValues contentValues = new ContentValues();
    contentValues.put(DATE_SENT, retrieved.getSentTimeMillis());
    contentValues.put(ADDRESS, retrieved.getAddresses().getFrom());
    contentValues.put(MESSAGE_BOX, mailbox);
    contentValues.put(MESSAGE_TYPE, PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF);
    contentValues.put(THREAD_ID, threadId);
    contentValues.put(CONTENT_LOCATION, contentLocation);
    contentValues.put(STATUS, Status.DOWNLOAD_INITIALIZED);
    contentValues.put(DATE_RECEIVED, generatePduCompatTimestamp());
    contentValues.put(PART_COUNT, retrieved.getAttachments().size());
    contentValues.put(SUBSCRIPTION_ID, retrieved.getSubscriptionId());
    contentValues.put(EXPIRES_IN, retrieved.getExpiresIn());
    contentValues.put(READ, retrieved.isExpirationUpdate() ? 1 : 0);
    if (!contentValues.containsKey(DATE_SENT)) {
        contentValues.put(DATE_SENT, contentValues.getAsLong(DATE_RECEIVED));
    }
    if (retrieved.isPushMessage() && isDuplicate(retrieved, threadId)) {
        Log.w(TAG, "Ignoring duplicate media message (" + retrieved.getSentTimeMillis() + ")");
        return Optional.absent();
    }
    long messageId = insertMediaMessage(masterSecret, retrieved.getAddresses(), retrieved.getBody(), retrieved.getAttachments(), contentValues);
    if (!Types.isExpirationTimerUpdate(mailbox)) {
        DatabaseFactory.getThreadDatabase(context).setUnread(threadId);
        DatabaseFactory.getThreadDatabase(context).update(threadId, true);
    }
    notifyConversationListeners(threadId);
    jobManager.add(new TrimThreadJob(context, threadId));
    return Optional.of(new InsertResult(messageId, threadId));
}
Also used : ContentValues(android.content.ContentValues) TrimThreadJob(org.thoughtcrime.securesms.jobs.TrimThreadJob) MmsException(ws.com.google.android.mms.MmsException) RecipientFormattingException(org.thoughtcrime.securesms.recipients.RecipientFormattingException)

Aggregations

TrimThreadJob (org.thoughtcrime.securesms.jobs.TrimThreadJob)7 ContentValues (android.content.ContentValues)6 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)4 Pair (android.util.Pair)2 Recipients (org.thoughtcrime.securesms.recipients.Recipients)2 InvalidNumberException (org.whispersystems.signalservice.api.util.InvalidNumberException)2 NonNull (android.support.annotation.NonNull)1 SmsMessageRecord (org.thoughtcrime.securesms.database.model.SmsMessageRecord)1 OutgoingGroupMediaMessage (org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage)1 RecipientFormattingException (org.thoughtcrime.securesms.recipients.RecipientFormattingException)1 IncomingGroupMessage (org.thoughtcrime.securesms.sms.IncomingGroupMessage)1 MmsException (ws.com.google.android.mms.MmsException)1