private DisplayRecord.Body getPlaintextBody(Cursor cursor) { try { long type = cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE)); String body = cursor.getString(cursor.getColumnIndexOrThrow(SNIPPET)); if (!TextUtils.isEmpty(body) && masterCipher != null && MmsSmsColumns.Types.isSymmetricEncryption(type)) { return new DisplayRecord.Body(masterCipher.decryptBody(body), true); } else if (!TextUtils.isEmpty(body) && masterCipher == null && MmsSmsColumns.Types.isSymmetricEncryption(type)) { return new DisplayRecord.Body(body, false); } else { return new DisplayRecord.Body(body, true); } } catch (InvalidMessageException e) { Log.w("ThreadDatabase", e); return new DisplayRecord.Body( context.getString(R.string.ThreadDatabase_error_decrypting_message), true); } }
private static void exportPlaintext(Context context, MasterSecret masterSecret) throws IOException { int count = DatabaseFactory.getSmsDatabase(context).getMessageCount(); XmlBackup.Writer writer = new XmlBackup.Writer(getPlaintextExportDirectoryPath(), count); SmsMessageRecord record; EncryptingSmsDatabase.Reader reader = null; int skip = 0; int ROW_LIMIT = 500; do { if (reader != null) reader.close(); reader = DatabaseFactory.getEncryptingSmsDatabase(context) .getMessages(masterSecret, skip, ROW_LIMIT); while ((record = reader.getNext()) != null) { XmlBackup.XmlBackupItem item = new XmlBackup.XmlBackupItem( 0, record.getIndividualRecipient().getNumber(), record.getDateReceived(), MmsSmsColumns.Types.translateToSystemBaseType(record.getType()), null, record.getDisplayBody().toString(), null, 1, record.getDeliveryStatus()); writer.writeItem(item); } skip += ROW_LIMIT; } while (reader.getCount() > 0); writer.close(); }