diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index 01a8a1d32..82aadea6f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -275,8 +275,8 @@ public class SmsDatabase extends MessageDatabase { } private @NonNull SqlUtil.Query buildMeaningfulMessagesQuery(long threadId) { - String query = THREAD_ID + " = ? AND (NOT " + TYPE + " & ? AND " + TYPE + " != ? AND " + TYPE + "!= ? AND NOT " + TYPE + " & ?)"; - return SqlUtil.buildQuery(query, threadId, IGNORABLE_TYPESMASK_WHEN_COUNTING, Types.PROFILE_CHANGE_TYPE, Types.CHANGE_NUMBER_TYPE, GROUP_V2_LEAVE_BITS); + String query = THREAD_ID + " = ? AND (NOT " + TYPE + " & ? AND " + TYPE + " != ? AND " + TYPE + " != ? AND " + TYPE + " & " + GROUP_V2_LEAVE_BITS + " != " + GROUP_V2_LEAVE_BITS + ")"; + return SqlUtil.buildQuery(query, threadId, IGNORABLE_TYPESMASK_WHEN_COUNTING, Types.PROFILE_CHANGE_TYPE, Types.CHANGE_NUMBER_TYPE); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index 543e0f2a8..5dcc26fbc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; +import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.GroupDoesNotExistException; @@ -42,7 +43,6 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.sms.IncomingGroupUpdateMessage; import org.thoughtcrime.securesms.sms.IncomingTextMessage; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupHistoryEntry; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; @@ -310,10 +310,12 @@ public final class GroupsV2StateProcessor { Collections.emptyList()); try { - MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); - long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(groupRecipient); - long id = mmsDatabase.insertMessageOutbox(leaveMessage, threadId, false, null); + MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); + long threadId = threadDatabase.getOrCreateThreadIdFor(groupRecipient); + long id = mmsDatabase.insertMessageOutbox(leaveMessage, threadId, false, null); mmsDatabase.markAsSent(id, true); + threadDatabase.update(threadId, false, false); } catch (MmsException e) { Log.w(TAG, "Failed to insert leave message.", e); } @@ -501,23 +503,28 @@ public final class GroupsV2StateProcessor { if (outgoing) { try { MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context); + ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); RecipientId recipientId = recipientDatabase.getOrInsertFromGroupId(groupId); Recipient recipient = Recipient.resolved(recipientId); OutgoingGroupUpdateMessage outgoingMessage = new OutgoingGroupUpdateMessage(recipient, decryptedGroupV2Context, null, timestamp, 0, false, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); - long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(recipient); + long threadId = threadDatabase.getOrCreateThreadIdFor(recipient); long messageId = mmsDatabase.insertMessageOutbox(outgoingMessage, threadId, false, null); mmsDatabase.markAsSent(messageId, true); + threadDatabase.update(threadId, false, false); } catch (MmsException e) { Log.w(TAG, e); } } else { - MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); - RecipientId sender = RecipientId.from(editor.get(), null); - IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, timestamp, "", Optional.of(groupId), 0, false, null); - IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context); + MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context); + RecipientId sender = RecipientId.from(editor.get(), null); + IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, timestamp, "", Optional.of(groupId), 0, false, null); + IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context); + Optional insertResult = smsDatabase.insertMessageInbox(groupMessage); - if (!smsDatabase.insertMessageInbox(groupMessage).isPresent()) { + if (insertResult.isPresent()) { + DatabaseFactory.getThreadDatabase(context).update(insertResult.get().getThreadId(), false, false); + } else { Log.w(TAG, "Could not insert update message"); } } diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt index b857b3bf4..f3a7b9514 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/SmsDatabaseTest.kt @@ -19,7 +19,7 @@ import org.hamcrest.CoreMatchers.`is` as isEqual @Config(manifest = Config.NONE, application = Application::class) class SmsDatabaseTest { - private lateinit var writeableDatabase: AndroidSQLiteDatabase + private lateinit var db: AndroidSQLiteDatabase private lateinit var smsDatabase: SmsDatabase @Before @@ -28,13 +28,13 @@ class SmsDatabaseTest { execSQL(SmsDatabase.CREATE_TABLE) } - writeableDatabase = sqlCipher.writableDatabase + db = sqlCipher.writableDatabase smsDatabase = SmsDatabase(ApplicationProvider.getApplicationContext(), sqlCipher) } @After fun tearDown() { - writeableDatabase.close() + db.close() } @Test @@ -44,7 +44,7 @@ class SmsDatabaseTest { @Test fun `getThreadIdForMessage when message present for id, return thread id`() { - TestSms.insertSmsMessage(db = writeableDatabase, threadId = 1) + TestSms.insertSmsMessage(db) assertThat(smsDatabase.getThreadIdForMessage(1), isEqual(1)) } @@ -55,7 +55,13 @@ class SmsDatabaseTest { @Test fun `hasMeaningfulMessage when normal message, return true`() { - TestSms.insertSmsMessage(db = writeableDatabase, threadId = 1) + TestSms.insertSmsMessage(db) + assertTrue(smsDatabase.hasMeaningfulMessage(1)) + } + + @Test + fun `hasMeaningfulMessage when GV2 create message only, return true`() { + TestSms.insertSmsMessage(db, type = MmsSmsColumns.Types.BASE_INBOX_TYPE or MmsSmsColumns.Types.SECURE_MESSAGE_BIT or MmsSmsColumns.Types.GROUP_V2_BIT or MmsSmsColumns.Types.GROUP_UPDATE_BIT) assertTrue(smsDatabase.hasMeaningfulMessage(1)) } @@ -63,16 +69,16 @@ class SmsDatabaseTest { fun `hasMeaningfulMessage when empty and then with ignored types, always return false`() { assertFalse(smsDatabase.hasMeaningfulMessage(1)) - TestSms.insertSmsMessage(db = writeableDatabase, threadId = 1, type = SmsDatabase.IGNORABLE_TYPESMASK_WHEN_COUNTING) + TestSms.insertSmsMessage(db, type = SmsDatabase.IGNORABLE_TYPESMASK_WHEN_COUNTING) assertFalse(smsDatabase.hasMeaningfulMessage(1)) - TestSms.insertSmsMessage(db = writeableDatabase, threadId = 1, type = MmsSmsColumns.Types.PROFILE_CHANGE_TYPE) + TestSms.insertSmsMessage(db, type = MmsSmsColumns.Types.PROFILE_CHANGE_TYPE) assertFalse(smsDatabase.hasMeaningfulMessage(1)) - TestSms.insertSmsMessage(db = writeableDatabase, threadId = 1, type = MmsSmsColumns.Types.CHANGE_NUMBER_TYPE) + TestSms.insertSmsMessage(db, type = MmsSmsColumns.Types.CHANGE_NUMBER_TYPE) assertFalse(smsDatabase.hasMeaningfulMessage(1)) - TestSms.insertSmsMessage(db = writeableDatabase, threadId = 1, type = MmsSmsColumns.Types.BASE_INBOX_TYPE or MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS) + TestSms.insertSmsMessage(db, type = MmsSmsColumns.Types.BASE_INBOX_TYPE or MmsSmsColumns.Types.GROUP_V2_LEAVE_BITS) assertFalse(smsDatabase.hasMeaningfulMessage(1)) } }