kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix groups not showing after pin restore.
rodzic
62d8c115ba
commit
6f6da699a3
|
@ -275,8 +275,8 @@ public class SmsDatabase extends MessageDatabase {
|
||||||
}
|
}
|
||||||
|
|
||||||
private @NonNull SqlUtil.Query buildMeaningfulMessagesQuery(long threadId) {
|
private @NonNull SqlUtil.Query buildMeaningfulMessagesQuery(long threadId) {
|
||||||
String query = THREAD_ID + " = ? AND (NOT " + TYPE + " & ? AND " + TYPE + " != ? AND " + TYPE + "!= ? AND NOT " + TYPE + " & ?)";
|
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, GROUP_V2_LEAVE_BITS);
|
return SqlUtil.buildQuery(query, threadId, IGNORABLE_TYPESMASK_WHEN_COUNTING, Types.PROFILE_CHANGE_TYPE, Types.CHANGE_NUMBER_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.GroupDatabase;
|
import org.thoughtcrime.securesms.database.GroupDatabase;
|
||||||
import org.thoughtcrime.securesms.database.MessageDatabase;
|
import org.thoughtcrime.securesms.database.MessageDatabase;
|
||||||
import org.thoughtcrime.securesms.database.RecipientDatabase;
|
import org.thoughtcrime.securesms.database.RecipientDatabase;
|
||||||
|
import org.thoughtcrime.securesms.database.ThreadDatabase;
|
||||||
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context;
|
import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context;
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||||
import org.thoughtcrime.securesms.groups.GroupDoesNotExistException;
|
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.recipients.RecipientId;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingGroupUpdateMessage;
|
import org.thoughtcrime.securesms.sms.IncomingGroupUpdateMessage;
|
||||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||||
import org.thoughtcrime.securesms.util.FeatureFlags;
|
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
import org.whispersystems.libsignal.util.guava.Optional;
|
||||||
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupHistoryEntry;
|
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupHistoryEntry;
|
||||||
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil;
|
import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil;
|
||||||
|
@ -310,10 +310,12 @@ public final class GroupsV2StateProcessor {
|
||||||
Collections.emptyList());
|
Collections.emptyList());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
|
MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
|
||||||
long threadId = DatabaseFactory.getThreadDatabase(context).getOrCreateThreadIdFor(groupRecipient);
|
ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context);
|
||||||
long id = mmsDatabase.insertMessageOutbox(leaveMessage, threadId, false, null);
|
long threadId = threadDatabase.getOrCreateThreadIdFor(groupRecipient);
|
||||||
|
long id = mmsDatabase.insertMessageOutbox(leaveMessage, threadId, false, null);
|
||||||
mmsDatabase.markAsSent(id, true);
|
mmsDatabase.markAsSent(id, true);
|
||||||
|
threadDatabase.update(threadId, false, false);
|
||||||
} catch (MmsException e) {
|
} catch (MmsException e) {
|
||||||
Log.w(TAG, "Failed to insert leave message.", e);
|
Log.w(TAG, "Failed to insert leave message.", e);
|
||||||
}
|
}
|
||||||
|
@ -501,23 +503,28 @@ public final class GroupsV2StateProcessor {
|
||||||
if (outgoing) {
|
if (outgoing) {
|
||||||
try {
|
try {
|
||||||
MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
|
MessageDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
|
||||||
|
ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context);
|
||||||
RecipientId recipientId = recipientDatabase.getOrInsertFromGroupId(groupId);
|
RecipientId recipientId = recipientDatabase.getOrInsertFromGroupId(groupId);
|
||||||
Recipient recipient = Recipient.resolved(recipientId);
|
Recipient recipient = Recipient.resolved(recipientId);
|
||||||
OutgoingGroupUpdateMessage outgoingMessage = new OutgoingGroupUpdateMessage(recipient, decryptedGroupV2Context, null, timestamp, 0, false, null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
|
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);
|
long messageId = mmsDatabase.insertMessageOutbox(outgoingMessage, threadId, false, null);
|
||||||
|
|
||||||
mmsDatabase.markAsSent(messageId, true);
|
mmsDatabase.markAsSent(messageId, true);
|
||||||
|
threadDatabase.update(threadId, false, false);
|
||||||
} catch (MmsException e) {
|
} catch (MmsException e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||||
RecipientId sender = RecipientId.from(editor.get(), null);
|
RecipientId sender = RecipientId.from(editor.get(), null);
|
||||||
IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, timestamp, "", Optional.of(groupId), 0, false, null);
|
IncomingTextMessage incoming = new IncomingTextMessage(sender, -1, timestamp, timestamp, timestamp, "", Optional.of(groupId), 0, false, null);
|
||||||
IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context);
|
IncomingGroupUpdateMessage groupMessage = new IncomingGroupUpdateMessage(incoming, decryptedGroupV2Context);
|
||||||
|
Optional<MessageDatabase.InsertResult> 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");
|
Log.w(TAG, "Could not insert update message");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ import org.hamcrest.CoreMatchers.`is` as isEqual
|
||||||
@Config(manifest = Config.NONE, application = Application::class)
|
@Config(manifest = Config.NONE, application = Application::class)
|
||||||
class SmsDatabaseTest {
|
class SmsDatabaseTest {
|
||||||
|
|
||||||
private lateinit var writeableDatabase: AndroidSQLiteDatabase
|
private lateinit var db: AndroidSQLiteDatabase
|
||||||
private lateinit var smsDatabase: SmsDatabase
|
private lateinit var smsDatabase: SmsDatabase
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
|
@ -28,13 +28,13 @@ class SmsDatabaseTest {
|
||||||
execSQL(SmsDatabase.CREATE_TABLE)
|
execSQL(SmsDatabase.CREATE_TABLE)
|
||||||
}
|
}
|
||||||
|
|
||||||
writeableDatabase = sqlCipher.writableDatabase
|
db = sqlCipher.writableDatabase
|
||||||
smsDatabase = SmsDatabase(ApplicationProvider.getApplicationContext(), sqlCipher)
|
smsDatabase = SmsDatabase(ApplicationProvider.getApplicationContext(), sqlCipher)
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
fun tearDown() {
|
fun tearDown() {
|
||||||
writeableDatabase.close()
|
db.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -44,7 +44,7 @@ class SmsDatabaseTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `getThreadIdForMessage when message present for id, return thread id`() {
|
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))
|
assertThat(smsDatabase.getThreadIdForMessage(1), isEqual(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,13 @@ class SmsDatabaseTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `hasMeaningfulMessage when normal message, return true`() {
|
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))
|
assertTrue(smsDatabase.hasMeaningfulMessage(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,16 +69,16 @@ class SmsDatabaseTest {
|
||||||
fun `hasMeaningfulMessage when empty and then with ignored types, always return false`() {
|
fun `hasMeaningfulMessage when empty and then with ignored types, always return false`() {
|
||||||
assertFalse(smsDatabase.hasMeaningfulMessage(1))
|
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))
|
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))
|
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))
|
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))
|
assertFalse(smsDatabase.hasMeaningfulMessage(1))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue