diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 9c702c01b..5d5d14f23 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -1127,7 +1127,7 @@ open class Storage( val group = SignalServiceGroup(type, GroupUtil.getDecodedGroupIDAsData(groupID), SignalServiceGroup.GroupType.SIGNAL, name, members.toList(), null, admins.toList()) val m = IncomingTextMessage(fromSerialized(senderPublicKey), 1, sentTimestamp, "", Optional.of(group), 0, true, false) val updateData = UpdateMessageData.buildGroupUpdate(type, name, members)?.toJSON() - val infoMessage = IncomingGroupMessage(m, groupID, updateData, true) + val infoMessage = IncomingGroupMessage(m, updateData, true) val smsDB = DatabaseComponent.get(context).smsDatabase() smsDB.insertMessageInbox(infoMessage, true) } @@ -1145,11 +1145,6 @@ open class Storage( mmsDB.markAsSent(infoMessageID, true) } -// override fun insertGroupUpdatedControlMessage(groupSessionId: SessionId, -// controlMessage) { -// -// } - override fun isLegacyClosedGroup(publicKey: String): Boolean { return DatabaseComponent.get(context).lokiAPIDatabase().isClosedGroup(publicKey) } @@ -1370,6 +1365,17 @@ open class Storage( } + override fun insertGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) { + val sentTimestamp = message.sentTimestamp ?: return + val senderPublicKey = message.sender ?: return + val group = SignalServiceGroup(Hex.fromStringCondensed(closedGroup.hexString()), SignalServiceGroup.GroupType.SIGNAL) + val m = IncomingTextMessage(fromSerialized(senderPublicKey), 1, sentTimestamp, "", Optional.of(group), 0, true, false) + val updateData = UpdateMessageData.buildGroupUpdate(message)?.toJSON() ?: return + val infoMessage = IncomingGroupMessage(m, updateData, true) + val smsDB = DatabaseComponent.get(context).smsDatabase() + smsDB.insertMessageInbox(infoMessage, true) + } + override fun setServerCapabilities(server: String, capabilities: List) { return DatabaseComponent.get(context).lokiAPIDatabase().setServerCapabilities(server, capabilities) } diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index 512e9347e..fcc8d7d26 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -14,6 +14,7 @@ import org.session.libsession.messaging.jobs.MessageSendJob import org.session.libsession.messaging.messages.Destination import org.session.libsession.messaging.messages.Message import org.session.libsession.messaging.messages.control.ConfigurationMessage +import org.session.libsession.messaging.messages.control.GroupUpdated import org.session.libsession.messaging.messages.control.MessageRequestResponse import org.session.libsession.messaging.messages.visible.Attachment import org.session.libsession.messaging.messages.visible.Profile @@ -166,6 +167,7 @@ interface StorageProtocol { fun getLibSessionClosedGroup(groupSessionId: String): GroupInfo.ClosedGroupInfo? fun getClosedGroupDisplayInfo(groupSessionId: String): GroupDisplayInfo? fun inviteClosedGroupMembers(groupSessionId: String, invitees: List) + fun insertGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) // Groups fun getAllGroups(includeInactive: Boolean): List diff --git a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/IncomingGroupMessage.java b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/IncomingGroupMessage.java index 213f815de..8046c82d9 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/messages/signal/IncomingGroupMessage.java +++ b/libsession/src/main/java/org/session/libsession/messaging/messages/signal/IncomingGroupMessage.java @@ -2,12 +2,10 @@ package org.session.libsession.messaging.messages.signal; public class IncomingGroupMessage extends IncomingTextMessage { - private final String groupID; private final boolean updateMessage; - public IncomingGroupMessage(IncomingTextMessage base, String groupID, String body, boolean updateMessage) { + public IncomingGroupMessage(IncomingTextMessage base, String body, boolean updateMessage) { super(base, body); - this.groupID = groupID; this.updateMessage = updateMessage; } 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 45a97e32c..af5f29754 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 @@ -530,7 +530,7 @@ private fun ClosedGroupControlMessage.getPublicKey(): String = kind!!.let { when private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated, closedGroup: SessionId?) { val inner = message.inner if (closedGroup == null && - (!inner.hasInviteMessage()) || !inner.hasPromoteMessage()) { // TODO: add all the cases for this + !inner.hasInviteMessage() && !inner.hasPromoteMessage()) { throw NullPointerException("Message wasn't polled from a closed group!") } when { @@ -552,7 +552,7 @@ private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) verifyAdminSignature(closedGroup, adminSignature.toByteArray(), "INFO_CHANGE"+type+message.sentTimestamp!!) val newName = if (infoChanged.hasUpdatedName()) infoChanged.updatedName else null val newExpiration = if (infoChanged.hasUpdatedExpiration()) infoChanged.updatedExpiration else null -// storage.insertIncomingInfoMessage() + storage.insertGroupInfoChange(message, closedGroup) } private fun handlePromotionMessage(message: GroupUpdated) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageData.kt b/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageData.kt index 1ba226852..72415d7a4 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageData.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/utilities/UpdateMessageData.kt @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo import com.fasterxml.jackson.core.JsonParseException import org.session.libsession.messaging.messages.control.GroupUpdated import org.session.libsignal.messages.SignalServiceGroup +import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateMemberChangeMessage.Type import org.session.libsignal.utilities.JsonUtil import org.session.libsignal.utilities.Log import java.util.Collections @@ -22,10 +23,11 @@ class UpdateMessageData () { JsonSubTypes.Type(Kind.GroupMemberAdded::class, name = "GroupMemberAdded"), JsonSubTypes.Type(Kind.GroupMemberRemoved::class, name = "GroupMemberRemoved"), JsonSubTypes.Type(Kind.GroupMemberLeft::class, name = "GroupMemberLeft"), - JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation") + JsonSubTypes.Type(Kind.OpenGroupInvitation::class, name = "OpenGroupInvitation"), + JsonSubTypes.Type(Kind.GroupAvatarUpdated::class, name = "GroupAvatarUpdated") ) - sealed class Kind() { - class GroupCreation(): Kind() + sealed class Kind { + data object GroupCreation: Kind() class GroupNameChange(val name: String): Kind() { constructor(): this("") //default constructor required for json serialization } @@ -35,10 +37,12 @@ class UpdateMessageData () { class GroupMemberRemoved(val updatedMembers: Collection): Kind() { constructor(): this(Collections.emptyList()) } - class GroupMemberLeft(): Kind() + data object GroupMemberLeft: Kind() class GroupMemberUpdated(val sessionIds: List, val type: MemberUpdateType?): Kind() { constructor(): this(emptyList(), null) } + data object GroupAvatarUpdated: Kind() + class GroupExpiryUpdated @JvmOverloads constructor(val newExpiry: Int = 0): Kind() class OpenGroupInvitation(val groupUrl: String, val groupName: String): Kind() { constructor(): this("", "") } @@ -59,26 +63,40 @@ class UpdateMessageData () { fun buildGroupUpdate(type: SignalServiceGroup.Type, name: String, members: Collection): UpdateMessageData? { return when(type) { - SignalServiceGroup.Type.CREATION -> UpdateMessageData(Kind.GroupCreation()) + SignalServiceGroup.Type.CREATION -> UpdateMessageData(Kind.GroupCreation) SignalServiceGroup.Type.NAME_CHANGE -> UpdateMessageData(Kind.GroupNameChange(name)) SignalServiceGroup.Type.MEMBER_ADDED -> UpdateMessageData(Kind.GroupMemberAdded(members)) SignalServiceGroup.Type.MEMBER_REMOVED -> UpdateMessageData(Kind.GroupMemberRemoved(members)) - SignalServiceGroup.Type.QUIT -> UpdateMessageData(Kind.GroupMemberLeft()) + SignalServiceGroup.Type.QUIT -> UpdateMessageData(Kind.GroupMemberLeft) else -> null } } fun buildGroupUpdate(groupUpdated: GroupUpdated): UpdateMessageData? { val inner = groupUpdated.inner - TODO() -// return when { -// inner.hasMemberChangeMessage() -> { -// val memberChange = inner.memberChangeMessage -// val type = memberChange.type -// memberChange.memberSessionIdsList -// } -// else -> null -// } + return when { + inner.hasMemberChangeMessage() -> { + val memberChange = inner.memberChangeMessage + val type = when (memberChange.type) { + Type.ADDED -> MemberUpdateType.ADDED + Type.PROMOTED -> MemberUpdateType.PROMOTED + Type.REMOVED -> MemberUpdateType.REMOVED + } + val members = memberChange.memberSessionIdsList + UpdateMessageData(Kind.GroupMemberUpdated(members, type)) + } + inner.hasInfoChangeMessage() -> { + val infoChange = inner.infoChangeMessage + val type = infoChange.type + TODO() +// when (type) { +// GroupUpdateInfoChangeMessage.Type.NAME -> Kind.GroupNameChange(infoChange.updatedName) +// GroupUpdateInfoChangeMessage.Type.AVATAR -> Kind.GroupAvatarUpdated +// // GroupUpdateInfoChangeMessage.Type.DISAPPEARING_MESSAGES -> Kind.GroupExpirationUpdated(infoChange.updatedExpiration) +// } + } + else -> null + } } fun buildOpenGroupInvitation(url: String, name: String): UpdateMessageData {