diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index f8162aae0..2e4dee6a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -1029,6 +1029,7 @@ public class ConversationFragment extends Fragment @Override public void onItemClick(MessageRecord messageRecord) { + if (messageRecord.isUpdate()) return; if (actionMode != null) { ((ConversationAdapter) list.getAdapter()).toggleSelection(messageRecord); list.getAdapter().notifyDataSetChanged(); @@ -1044,6 +1045,7 @@ public class ConversationFragment extends Fragment @Override public void onItemLongClick(MessageRecord messageRecord) { + if (messageRecord.isUpdate()) return; if (actionMode == null) { ((ConversationAdapter) list.getAdapter()).toggleSelection(messageRecord); list.getAdapter().notifyDataSetChanged(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index c3f25bf90..de34abb65 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -294,7 +294,6 @@ public class GroupDatabase extends Database implements LokiOpenGroupDatabaseProt ContentValues contents = new ContentValues(); contents.put(ZOMBIE_MEMBERS, Address.toSerializedList(members, ',')); - contents.put(ACTIVE, 1); databaseHelper.getWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", new String[] {groupId}); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index 9948aec40..54cf2f8d7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -317,9 +317,6 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis } if (isClosedGroup) { MessageSender.explicitLeave(groupPublicKey!!, false) - } else { - Toast.makeText(context, R.string.activity_home_leaving_group_failed_message, Toast.LENGTH_LONG).show() - return@launch } } // Delete the conversation diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index ea3209990..3c2c95f85 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -266,6 +266,9 @@ private fun handleNewClosedGroup(sender: String, sentTimestamp: Long, groupPubli val groupID = GroupUtil.doubleEncodeGroupID(groupPublicKey) if (storage.getGroup(groupID) != null) { // Update the group + // clearing zombie list if the group was not active before the update is received + if (!storage.isGroupActive(groupID)) + storage.setZombieMembers(groupID, listOf().map { Address.fromSerialized(it) }) storage.updateTitle(groupID, name) storage.updateMembers(groupID, members.map { Address.fromSerialized(it) }) } else { @@ -390,6 +393,12 @@ private fun MessageReceiver.handleClosedGroupMembersAdded(message: ClosedGroupCo val updateMembers = kind.members.map { it.toByteArray().toHexString() } val newMembers = members + updateMembers storage.updateMembers(groupID, newMembers.map { Address.fromSerialized(it) }) + + // update zombie members in case the added members are zombies + val zombies = storage.getZombieMembers(groupID) + if (zombies.intersect(updateMembers).isNotEmpty()) + storage.setZombieMembers(groupID, zombies.minus(updateMembers).map { Address.fromSerialized(it) }) + // Notify the user if (userPublicKey == senderPublicKey) { val threadID = storage.getOrCreateThreadIdFor(Address.fromSerialized(groupID)) @@ -448,6 +457,7 @@ private fun MessageReceiver.handleClosedGroupMembersRemoved(message: ClosedGroup val members = group.members.map { it.serialize() } val admins = group.admins.map { it.toString() } val removedMembers = kind.members.map { it.toByteArray().toHexString() } + val zombies: Set = storage.getZombieMembers(groupID) // Check that the admin wasn't removed if (removedMembers.contains(admins.first())) { Log.d("Loki", "Ignoring invalid closed group update.") @@ -473,12 +483,12 @@ private fun MessageReceiver.handleClosedGroupMembersRemoved(message: ClosedGroup disableLocalGroupAndUnsubscribe(groupPublicKey, groupID, userPublicKey) } else { storage.updateMembers(groupID, newMembers.map { Address.fromSerialized(it) }) + // Update zombie members + storage.setZombieMembers(groupID, zombies.minus(removedMembers).map { Address.fromSerialized(it) }) } - // Update zombie members - val zombies = storage.getZombieMembers(groupID) - storage.setZombieMembers(groupID, zombies.minus(removedMembers).map { Address.fromSerialized(it) }) - val type = if (senderLeft) SignalServiceGroup.Type.QUIT else SignalServiceGroup.Type.MEMBER_REMOVED + // Notify the user + val type = if (senderLeft) SignalServiceGroup.Type.QUIT else SignalServiceGroup.Type.MEMBER_REMOVED // We don't display zombie members in the notification as users have already been notified when those members left val notificationMembers = removedMembers.minus(zombies) if (notificationMembers.isNotEmpty()) {