public void deleteAllThreads() { DatabaseFactory.getAttachmentDatabase(context).deleteAllAttachments(); DatabaseFactory.getMmsAddressDatabase(context).deleteAllAddresses(); SQLiteDatabase database = databaseHelper.getWritableDatabase(); database.delete(TABLE_NAME, null, null); }
public void incrementDeliveryReceiptCount(String address, long timestamp) { MmsAddressDatabase addressDatabase = DatabaseFactory.getMmsAddressDatabase(context); SQLiteDatabase database = databaseHelper.getWritableDatabase(); Cursor cursor = null; try { cursor = database.query( TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX}, DATE_SENT + " = ?", new String[] {String.valueOf(timestamp)}, null, null, null, null); while (cursor.moveToNext()) { if (Types.isOutgoingMessageType( cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)))) { List<String> addresses = addressDatabase.getAddressesListForId( cursor.getLong(cursor.getColumnIndexOrThrow(ID))); for (String storedAddress : addresses) { try { String ourAddress = canonicalizeNumber(context, address); String theirAddress = canonicalizeNumberOrGroup(context, storedAddress); if (ourAddress.equals(theirAddress) || GroupUtil.isEncodedGroup(theirAddress)) { long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); database.execSQL( "UPDATE " + TABLE_NAME + " SET " + RECEIPT_COUNT + " = " + RECEIPT_COUNT + " + 1 WHERE " + ID + " = ?", new String[] {String.valueOf(id)}); notifyConversationListeners(threadId); } } catch (InvalidNumberException e) { Log.w("MmsDatabase", e); } } } } } finally { if (cursor != null) cursor.close(); } }
public OutgoingMediaMessage getOutgoingMessage(MasterSecret masterSecret, long messageId) throws MmsException, NoSuchMessageException { MmsAddressDatabase addr = DatabaseFactory.getMmsAddressDatabase(context); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); Cursor cursor = null; try { cursor = rawQuery(RAW_ID_WHERE, new String[] {String.valueOf(messageId)}); if (cursor != null && cursor.moveToNext()) { long outboxType = cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)); String messageText = cursor.getString(cursor.getColumnIndexOrThrow(BODY)); long timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(NORMALIZED_DATE_SENT)); List<Attachment> attachments = new LinkedList<Attachment>(attachmentDatabase.getAttachmentsForMessage(messageId)); MmsAddresses addresses = addr.getAddressesForId(messageId); List<String> destinations = new LinkedList<>(); String body = getDecryptedBody(masterSecret, messageText, outboxType); destinations.addAll(addresses.getBcc()); destinations.addAll(addresses.getCc()); destinations.addAll(addresses.getTo()); Recipients recipients = RecipientFactory.getRecipientsFromStrings(context, destinations, false); if (body != null && (Types.isGroupQuit(outboxType) || Types.isGroupUpdate(outboxType))) { return new OutgoingGroupMediaMessage(recipients, body, attachments, timestamp); } OutgoingMediaMessage message = new OutgoingMediaMessage( recipients, body, attachments, timestamp, !addresses.getBcc().isEmpty() ? ThreadDatabase.DistributionTypes.BROADCAST : ThreadDatabase.DistributionTypes.DEFAULT); if (Types.isSecureType(outboxType)) { return new OutgoingSecureMediaMessage(message); } return message; } throw new NoSuchMessageException("No record found for id: " + messageId); } catch (IOException e) { throw new MmsException(e); } finally { if (cursor != null) cursor.close(); } }
public boolean delete(long messageId) { long threadId = getThreadIdForMessage(messageId); MmsAddressDatabase addrDatabase = DatabaseFactory.getMmsAddressDatabase(context); AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context); attachmentDatabase.deleteAttachmentsForMessage(messageId); addrDatabase.deleteAddressesForId(messageId); SQLiteDatabase database = databaseHelper.getWritableDatabase(); database.delete(TABLE_NAME, ID_WHERE, new String[] {messageId + ""}); boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId); notifyConversationListeners(threadId); return threadDeleted; }
public Pair<Long, Long> insertMessageInbox(@NonNull NotificationInd notification) { SQLiteDatabase db = databaseHelper.getWritableDatabase(); MmsAddressDatabase addressDatabase = DatabaseFactory.getMmsAddressDatabase(context); long threadId = getThreadIdFor(notification); PduHeaders headers = notification.getPduHeaders(); ContentValues contentValues = new ContentValues(); ContentValuesBuilder contentBuilder = new ContentValuesBuilder(contentValues); Log.w(TAG, "Message received type: " + headers.getOctet(PduHeaders.MESSAGE_TYPE)); contentBuilder.add(CONTENT_LOCATION, headers.getTextString(PduHeaders.CONTENT_LOCATION)); contentBuilder.add(DATE_SENT, headers.getLongInteger(PduHeaders.DATE) * 1000L); contentBuilder.add(EXPIRY, headers.getLongInteger(PduHeaders.EXPIRY)); contentBuilder.add(MESSAGE_SIZE, headers.getLongInteger(PduHeaders.MESSAGE_SIZE)); contentBuilder.add(TRANSACTION_ID, headers.getTextString(PduHeaders.TRANSACTION_ID)); contentBuilder.add(MESSAGE_TYPE, headers.getOctet(PduHeaders.MESSAGE_TYPE)); if (headers.getEncodedStringValue(PduHeaders.FROM) != null) { contentBuilder.add(ADDRESS, headers.getEncodedStringValue(PduHeaders.FROM).getTextString()); } else { contentBuilder.add(ADDRESS, null); } contentValues.put(MESSAGE_BOX, Types.BASE_INBOX_TYPE); contentValues.put(THREAD_ID, threadId); contentValues.put(STATUS, Status.DOWNLOAD_INITIALIZED); contentValues.put(DATE_RECEIVED, generatePduCompatTimestamp()); contentValues.put(READ, Util.isDefaultSmsProvider(context) ? 0 : 1); if (!contentValues.containsKey(DATE_SENT)) contentValues.put(DATE_SENT, contentValues.getAsLong(DATE_RECEIVED)); long messageId = db.insert(TABLE_NAME, null, contentValues); addressDatabase.insertAddressesForId( messageId, MmsAddresses.forFrom(Util.toIsoString(notification.getFrom().getTextString()))); return new Pair<>(messageId, threadId); }
private long insertMediaMessage( @NonNull MasterSecretUnion masterSecret, @NonNull MmsAddresses addresses, @Nullable String body, @NonNull List<Attachment> attachments, @NonNull ContentValues contentValues) throws MmsException { SQLiteDatabase db = databaseHelper.getWritableDatabase(); AttachmentDatabase partsDatabase = DatabaseFactory.getAttachmentDatabase(context); MmsAddressDatabase addressDatabase = DatabaseFactory.getMmsAddressDatabase(context); if (Types.isSymmetricEncryption(contentValues.getAsLong(MESSAGE_BOX)) || Types.isAsymmetricEncryption(contentValues.getAsLong(MESSAGE_BOX))) { if (!TextUtils.isEmpty(body)) { contentValues.put(BODY, getEncryptedBody(masterSecret, body)); } } contentValues.put(PART_COUNT, attachments.size()); db.beginTransaction(); try { long messageId = db.insert(TABLE_NAME, null, contentValues); addressDatabase.insertAddressesForId(messageId, addresses); partsDatabase.insertAttachmentsForMessage(masterSecret, messageId, attachments); db.setTransactionSuccessful(); return messageId; } finally { db.endTransaction(); notifyConversationListeners(contentValues.getAsLong(THREAD_ID)); DatabaseFactory.getThreadDatabase(context).update(contentValues.getAsLong(THREAD_ID)); } }