diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 596387c13..14ec0a8dd 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -137,6 +137,7 @@ import com.nextcloud.talk.adapters.messages.VoiceMessageInterface import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.callbacks.MentionAutocompleteCallback +import com.nextcloud.talk.chat.data.utils.ChatMessageDataMapper import com.nextcloud.talk.chat.viewmodels.ChatViewModel import com.nextcloud.talk.conversationinfo.ConversationInfoActivity import com.nextcloud.talk.conversationlist.ConversationsListActivity @@ -610,10 +611,10 @@ class ChatActivity : override fun onSaveInstanceState(outState: Bundle) { if (currentlyPlayedVoiceMessage != null) { - outState.putString(CURRENT_AUDIO_MESSAGE_KEY, currentlyPlayedVoiceMessage!!.getId()) + outState.putString(CURRENT_AUDIO_MESSAGE_KEY, currentlyPlayedVoiceMessage!!.id) outState.putInt(CURRENT_AUDIO_POSITION_KEY, currentlyPlayedVoiceMessage!!.voiceMessagePlayedSeconds) outState.putBoolean(CURRENT_AUDIO_WAS_PLAYING_KEY, currentlyPlayedVoiceMessage!!.isPlayingVoiceMessage) - Log.d(RESUME_AUDIO_TAG, "Stored current audio message ID: " + currentlyPlayedVoiceMessage!!.getId()) + Log.d(RESUME_AUDIO_TAG, "Stored current audio message ID: " + currentlyPlayedVoiceMessage!!.id) Log.d( RESUME_AUDIO_TAG, "Audio Position: " + currentlyPlayedVoiceMessage!!.voiceMessagePlayedSeconds @@ -898,7 +899,11 @@ class ChatActivity : HTTP_CODE_OK -> { Log.d(TAG, "lookIntoFuture: ${state.lookIntoFuture}") val chatOverall = state.response.body() as ChatOverall? - var chatMessageList = chatOverall?.ocs!!.data!! + var chatMessageList = chatOverall?.ocs!!.data!!.map { + ChatMessageDataMapper.mapToMessage( + it + ) + } processHeaderChatLastGiven(state.response, state.lookIntoFuture) @@ -3946,7 +3951,7 @@ class ChatActivity : } else { Log.d( RESUME_AUDIO_TAG, - "voiceMessagePosition is -1, adapter # of items: " + adapter!!.getItemCount() + "voiceMessagePosition is -1, adapter # of items: " + adapter!!.itemCount ) } } else { @@ -4608,7 +4613,8 @@ class ChatActivity : private fun showMicrophoneButton(show: Boolean) { if (show && CapabilitiesUtil.hasSpreedFeatureCapability( - spreedCapabilities, SpreedFeatures.VOICE_MESSAGE_SHARING + spreedCapabilities, + SpreedFeatures.VOICE_MESSAGE_SHARING ) ) { Log.d(TAG, "Microphone shown") diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/database/ChatDao.kt b/app/src/main/java/com/nextcloud/talk/chat/data/database/ChatDao.kt index 9651cf408..9d12959e7 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/database/ChatDao.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/database/ChatDao.kt @@ -16,5 +16,5 @@ abstract class ChatDao { @Query( "SELECT * FROM Messages WHERE token = :roomToken" ) - abstract fun pullChatMessages(roomToken: String): List + abstract fun getAllMessagesWhere(roomToken: String): List } diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageEntity.kt b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageEntity.kt index d2c1e1d92..f846a3ad1 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageEntity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageEntity.kt @@ -54,7 +54,7 @@ data class ChatMessageEntity( var replyable: Boolean = false, @ColumnInfo(name = "parent") - var parentMessage: ChatMessage? = null, + var parentMessage: ChatMessage? = null, // FIXME figure this out, might replace w/ parent id @ColumnInfo(name = "messageType") var messageType: String? = null, diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageJson.kt b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageJson.kt index a71175211..828e9f630 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageJson.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageJson.kt @@ -14,7 +14,6 @@ import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter import kotlinx.parcelize.Parcelize -// TODO map it to ChatMessage @Parcelize @JsonObject data class ChatMessageJson( @@ -52,7 +51,7 @@ data class ChatMessageJson( var replyable: Boolean = false, @JsonField(name = ["parent"]) - var parentMessage: ChatMessage? = null, + var parentMessage: ChatMessageJson? = null, @JsonField(name = ["messageType"]) var messageType: String? = null, diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageDataMapper.kt b/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageDataMapper.kt new file mode 100644 index 000000000..a49e2702d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageDataMapper.kt @@ -0,0 +1,92 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2024 Julius Linus + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.chat.data.utils + +import com.nextcloud.talk.chat.data.model.ChatMessageEntity +import com.nextcloud.talk.chat.data.model.ChatMessageJson +import com.nextcloud.talk.models.json.chat.ChatMessage + +object ChatMessageDataMapper { + + fun mapToMessage(msg: ChatMessageJson?): ChatMessage { + return msg?.let { + ChatMessage().apply { + jsonMessageId = msg.jsonMessageId + token = msg.token + actorType = msg.actorType + actorId = msg.actorId + actorDisplayName = msg.actorDisplayName + timestamp = msg.timestamp + message = msg.message + messageParameters = msg.messageParameters + systemMessageType = msg.systemMessageType + replyable = msg.replyable + parentMessage = mapToMessage(msg.parentMessage) + messageType = msg.messageType + reactions = msg.reactions + reactionsSelf = msg.reactionsSelf + expirationTimestamp = msg.expirationTimestamp + renderMarkdown = msg.renderMarkdown + lastEditActorDisplayName = msg.lastEditActorDisplayName + lastEditActorId = msg.lastEditActorId + lastEditActorType = msg.lastEditActorType + lastEditTimestamp = msg.lastEditTimestamp + } + } ?: ChatMessage() + } + + fun mapToMessage(msg: ChatMessageEntity): ChatMessage { + return ChatMessage().apply { + jsonMessageId = msg.jsonMessageId + token = msg.token + actorType = msg.actorType + actorId = msg.actorId + actorDisplayName = msg.actorDisplayName + timestamp = msg.timestamp + message = msg.message + messageParameters = msg.messageParameters + systemMessageType = msg.systemMessageType + replyable = msg.replyable + parentMessage = msg.parentMessage + messageType = msg.messageType + reactions = msg.reactions + reactionsSelf = msg.reactionsSelf + expirationTimestamp = msg.expirationTimestamp + renderMarkdown = msg.renderMarkdown + lastEditActorDisplayName = msg.lastEditActorDisplayName + lastEditActorId = msg.lastEditActorId + lastEditActorType = msg.lastEditActorType + lastEditTimestamp = msg.lastEditTimestamp + } + } + + fun mapToEntity(msg: ChatMessage): ChatMessageEntity { + return ChatMessageEntity().apply { + jsonMessageId = msg.jsonMessageId + token = msg.token + actorType = msg.actorType + actorId = msg.actorId + actorDisplayName = msg.actorDisplayName + timestamp = msg.timestamp + message = msg.message + messageParameters = msg.messageParameters + systemMessageType = msg.systemMessageType + replyable = msg.replyable + parentMessage = msg.parentMessage + messageType = msg.messageType + reactions = msg.reactions + reactionsSelf = msg.reactionsSelf + expirationTimestamp = msg.expirationTimestamp + renderMarkdown = msg.renderMarkdown + lastEditActorDisplayName = msg.lastEditActorDisplayName + lastEditActorId = msg.lastEditActorId + lastEditActorType = msg.lastEditActorType + lastEditTimestamp = msg.lastEditTimestamp + } + } +} diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageEntityMapper.kt b/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageEntityMapper.kt deleted file mode 100644 index e59ad10b9..000000000 --- a/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageEntityMapper.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Nextcloud Talk - Android Client - * - * SPDX-FileCopyrightText: 2024 Your Name - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -package com.nextcloud.talk.chat.data.utils - -class ChatMessageEntityMapper { - - // TODO -} diff --git a/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageJsonMapper.kt b/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageJsonMapper.kt deleted file mode 100644 index 52098a714..000000000 --- a/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageJsonMapper.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Nextcloud Talk - Android Client - * - * SPDX-FileCopyrightText: 2024 Your Name - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -package com.nextcloud.talk.chat.data.utils - -class ChatMessageJsonMapper { - - // TODO -} diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt index 6c98940fc..7d37cfc1b 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt @@ -9,12 +9,8 @@ */ package com.nextcloud.talk.models.json.chat -import android.os.Parcelable import android.text.TextUtils import android.util.Log -import com.bluelinelabs.logansquare.annotation.JsonField -import com.bluelinelabs.logansquare.annotation.JsonIgnore -import com.bluelinelabs.logansquare.annotation.JsonObject import com.nextcloud.talk.R import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.data.user.model.User @@ -24,99 +20,67 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.CapabilitiesUtil import com.stfalcon.chatkit.commons.models.IUser import com.stfalcon.chatkit.commons.models.MessageContentType -import kotlinx.parcelize.Parcelize import java.security.MessageDigest import java.util.Date -// TODO remove all Json tags, map ChatMessageJson to this - -@Parcelize -@JsonObject data class ChatMessage( - @JsonIgnore var isGrouped: Boolean = false, - @JsonIgnore var isOneToOneConversation: Boolean = false, - @JsonIgnore var isFormerOneToOneConversation: Boolean = false, - @JsonIgnore var activeUser: User? = null, - @JsonIgnore var selectedIndividualHashMap: Map? = null, - @JsonIgnore var isDeleted: Boolean = false, - @JsonField(name = ["id"]) var jsonMessageId: Int = 0, - @JsonIgnore var previousMessageId: Int = -1, - @JsonField(name = ["token"]) var token: String? = null, // guests or users - @JsonField(name = ["actorType"]) var actorType: String? = null, - @JsonField(name = ["actorId"]) var actorId: String? = null, // send when crafting a message - @JsonField(name = ["actorDisplayName"]) var actorDisplayName: String? = null, - @JsonField(name = ["timestamp"]) var timestamp: Long = 0, // send when crafting a message, max 1000 lines - @JsonField(name = ["message"]) var message: String? = null, - @JsonField(name = ["messageParameters"]) var messageParameters: HashMap>? = null, - @JsonField(name = ["systemMessage"], typeConverter = EnumSystemMessageTypeConverter::class) var systemMessageType: SystemMessageType? = null, - @JsonField(name = ["isReplyable"]) var replyable: Boolean = false, - @JsonField(name = ["parent"]) var parentMessage: ChatMessage? = null, var readStatus: Enum = ReadStatus.NONE, - @JsonField(name = ["messageType"]) var messageType: String? = null, - @JsonField(name = ["reactions"]) var reactions: LinkedHashMap? = null, - @JsonField(name = ["reactionsSelf"]) var reactionsSelf: ArrayList? = null, - @JsonField(name = ["expirationTimestamp"]) var expirationTimestamp: Int = 0, - @JsonField(name = ["markdown"]) var renderMarkdown: Boolean? = null, - @JsonField(name = ["lastEditActorDisplayName"]) var lastEditActorDisplayName: String? = null, - @JsonField(name = ["lastEditActorId"]) var lastEditActorId: String? = null, - @JsonField(name = ["lastEditActorType"]) var lastEditActorType: String? = null, - @JsonField(name = ["lastEditTimestamp"]) var lastEditTimestamp: Long = 0, var isDownloadingVoiceMessage: Boolean = false, @@ -147,12 +111,11 @@ data class ChatMessage( var openWhenDownloaded: Boolean = true -) : Parcelable, MessageContentType, MessageContentType.Image { +) : MessageContentType, MessageContentType.Image { var extractedUrlToPreview: String? = null // messageTypesToIgnore is weird. must be deleted by refactoring!!! - @JsonIgnore var messageTypesToIgnore = listOf( MessageType.REGULAR_TEXT_MESSAGE, MessageType.SYSTEM_MESSAGE, diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCS.kt index e1db9062c..4485d23ca 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCS.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCS.kt @@ -10,6 +10,7 @@ package com.nextcloud.talk.models.json.chat import android.os.Parcelable import com.bluelinelabs.logansquare.annotation.JsonField import com.bluelinelabs.logansquare.annotation.JsonObject +import com.nextcloud.talk.chat.data.model.ChatMessageJson import com.nextcloud.talk.models.json.generic.GenericMeta import kotlinx.parcelize.Parcelize @@ -19,7 +20,7 @@ data class ChatOCS( @JsonField(name = ["meta"]) var meta: GenericMeta?, @JsonField(name = ["data"]) - var data: List? = null + var data: List? = null ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' constructor() : this(null, null) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCSSingleMessage.kt b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCSSingleMessage.kt index 8a73e0845..0b775e4d5 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCSSingleMessage.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatOCSSingleMessage.kt @@ -10,6 +10,7 @@ package com.nextcloud.talk.models.json.chat import android.os.Parcelable import com.bluelinelabs.logansquare.annotation.JsonField import com.bluelinelabs.logansquare.annotation.JsonObject +import com.nextcloud.talk.chat.data.model.ChatMessageJson import com.nextcloud.talk.models.json.generic.GenericMeta import kotlinx.parcelize.Parcelize @@ -19,7 +20,7 @@ data class ChatOCSSingleMessage( @JsonField(name = ["meta"]) var meta: GenericMeta?, @JsonField(name = ["data"]) - var data: ChatMessage? = null + var data: ChatMessageJson? = null ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' constructor() : this(null, null) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatShareOCS.kt b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatShareOCS.kt index e95750702..762c28a5c 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatShareOCS.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatShareOCS.kt @@ -10,14 +10,13 @@ package com.nextcloud.talk.models.json.chat import android.os.Parcelable import com.bluelinelabs.logansquare.annotation.JsonField import com.bluelinelabs.logansquare.annotation.JsonObject -import java.util.HashMap import kotlinx.parcelize.Parcelize @Parcelize @JsonObject data class ChatShareOCS( @JsonField(name = ["data"]) - var data: HashMap? = null + var data: HashMap? = null // FIXME figure out where to map this from json to message ) : Parcelable { // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject' constructor() : this(null) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt index 263e0aa09..2e05560c6 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt @@ -68,7 +68,7 @@ data class Conversation( var unreadMention: Boolean = false, @JsonField(name = ["lastMessage"]) - var lastMessage: ChatMessage? = null, + var lastMessage: ChatMessage? = null, // FIXME here figure out where to map this from JSON to chatmessage @JsonField(name = ["objectType"], typeConverter = ConversationObjectTypeConverter::class) var objectType: ObjectType? = null,