Search in sources :

Example 6 with Recipients

use of org.thoughtcrime.securesms.recipients.Recipients in project Signal-Android by WhisperSystems.

the class PlaintextBackupImporter method importPlaintext.

private static void importPlaintext(Context context, MasterSecret masterSecret) throws IOException {
    Log.w("PlaintextBackupImporter", "importPlaintext()");
    SmsDatabase db = DatabaseFactory.getSmsDatabase(context);
    SQLiteDatabase transaction = db.beginTransaction();
    try {
        ThreadDatabase threads = DatabaseFactory.getThreadDatabase(context);
        XmlBackup backup = new XmlBackup(getPlaintextExportFile().getAbsolutePath());
        MasterCipher masterCipher = new MasterCipher(masterSecret);
        Set<Long> modifiedThreads = new HashSet<Long>();
        XmlBackup.XmlBackupItem item;
        while ((item = backup.getNext()) != null) {
            Recipients recipients = RecipientFactory.getRecipientsFromString(context, item.getAddress(), false);
            long threadId = threads.getThreadIdFor(recipients);
            SQLiteStatement statement = db.createInsertStatement(transaction);
            if (item.getAddress() == null || item.getAddress().equals("null"))
                continue;
            if (!isAppropriateTypeForImport(item.getType()))
                continue;
            addStringToStatement(statement, 1, item.getAddress());
            addNullToStatement(statement, 2);
            addLongToStatement(statement, 3, item.getDate());
            addLongToStatement(statement, 4, item.getDate());
            addLongToStatement(statement, 5, item.getProtocol());
            addLongToStatement(statement, 6, item.getRead());
            addLongToStatement(statement, 7, item.getStatus());
            addTranslatedTypeToStatement(statement, 8, item.getType());
            addNullToStatement(statement, 9);
            addStringToStatement(statement, 10, item.getSubject());
            addEncryptedStingToStatement(masterCipher, statement, 11, item.getBody());
            addStringToStatement(statement, 12, item.getServiceCenter());
            addLongToStatement(statement, 13, threadId);
            modifiedThreads.add(threadId);
            statement.execute();
        }
        for (long threadId : modifiedThreads) {
            threads.update(threadId, true);
        }
        Log.w("PlaintextBackupImporter", "Exited loop");
    } catch (XmlPullParserException e) {
        Log.w("PlaintextBackupImporter", e);
        throw new IOException("XML Parsing error!");
    } finally {
        db.endTransaction(transaction);
    }
}
Also used : Recipients(org.thoughtcrime.securesms.recipients.Recipients) MasterCipher(org.thoughtcrime.securesms.crypto.MasterCipher) IOException(java.io.IOException) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) SQLiteStatement(android.database.sqlite.SQLiteStatement) XmlPullParserException(org.xmlpull.v1.XmlPullParserException) HashSet(java.util.HashSet)

Example 7 with Recipients

use of org.thoughtcrime.securesms.recipients.Recipients 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 8 with Recipients

use of org.thoughtcrime.securesms.recipients.Recipients 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 9 with Recipients

use of org.thoughtcrime.securesms.recipients.Recipients in project Signal-Android by WhisperSystems.

the class SmsMigrator method migrateDatabase.

public static void migrateDatabase(Context context, MasterSecret masterSecret, SmsMigrationProgressListener listener) {
    //    if (context.getSharedPreferences("SecureSMS", Context.MODE_PRIVATE).getBoolean("migrated", false))
    //      return;
    ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context);
    Cursor cursor = null;
    try {
        Uri threadListUri = Uri.parse("content://mms-sms/conversations?simple=true");
        cursor = context.getContentResolver().query(threadListUri, null, null, null, "date ASC");
        while (cursor != null && cursor.moveToNext()) {
            long theirThreadId = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
            String theirRecipients = cursor.getString(cursor.getColumnIndexOrThrow("recipient_ids"));
            Recipients ourRecipients = getOurRecipients(context, theirRecipients);
            ProgressDescription progress = new ProgressDescription(cursor.getCount(), cursor.getPosition(), 100, 0);
            if (ourRecipients != null) {
                long ourThreadId = threadDatabase.getThreadIdFor(ourRecipients);
                migrateConversation(context, masterSecret, listener, progress, theirThreadId, ourThreadId);
            }
            progress.incrementPrimaryComplete();
            listener.progressUpdate(progress);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    context.getSharedPreferences("SecureSMS", Context.MODE_PRIVATE).edit().putBoolean("migrated", true).apply();
}
Also used : Recipients(org.thoughtcrime.securesms.recipients.Recipients) Cursor(android.database.Cursor) Uri(android.net.Uri)

Example 10 with Recipients

use of org.thoughtcrime.securesms.recipients.Recipients in project Signal-Android by WhisperSystems.

the class MmsDatabase method getThreadIdFor.

private long getThreadIdFor(@NonNull NotificationInd notification) {
    String fromString = notification.getFrom() != null && notification.getFrom().getTextString() != null ? Util.toIsoString(notification.getFrom().getTextString()) : "";
    Recipients recipients = RecipientFactory.getRecipientsFromString(context, fromString, false);
    if (recipients.isEmpty())
        recipients = RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), false);
    return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients);
}
Also used : Recipients(org.thoughtcrime.securesms.recipients.Recipients)

Aggregations

Recipients (org.thoughtcrime.securesms.recipients.Recipients)52 EncryptingSmsDatabase (org.thoughtcrime.securesms.database.EncryptingSmsDatabase)7 MmsDatabase (org.thoughtcrime.securesms.database.MmsDatabase)7 OutgoingMediaMessage (org.thoughtcrime.securesms.mms.OutgoingMediaMessage)6 LinkedList (java.util.LinkedList)5 Recipient (org.thoughtcrime.securesms.recipients.Recipient)5 RecipientFormattingException (org.thoughtcrime.securesms.recipients.RecipientFormattingException)5 OutgoingTextMessage (org.thoughtcrime.securesms.sms.OutgoingTextMessage)5 Intent (android.content.Intent)4 Bundle (android.os.Bundle)4 ThreadDatabase (org.thoughtcrime.securesms.database.ThreadDatabase)4 IncomingTextMessage (org.thoughtcrime.securesms.sms.IncomingTextMessage)4 MmsException (ws.com.google.android.mms.MmsException)4 Cursor (android.database.Cursor)3 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)3 NonNull (android.support.annotation.NonNull)3 Attachment (org.thoughtcrime.securesms.attachments.Attachment)3 DatabaseAttachment (org.thoughtcrime.securesms.attachments.DatabaseAttachment)3 InsertResult (org.thoughtcrime.securesms.database.MessagingDatabase.InsertResult)3 OutgoingGroupMediaMessage (org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage)3