mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-06 04:19:38 +01:00
WIP Abstracting away ChatMessage to ChatMessageJson and ChatMessageEntity, need to iron out some quirks
Signed-off-by: rapterjet2004 <juliuslinus1@gmail.com>
This commit is contained in:
parent
68681b50de
commit
881552357e
@ -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")
|
||||
|
@ -16,5 +16,5 @@ abstract class ChatDao {
|
||||
@Query(
|
||||
"SELECT * FROM Messages WHERE token = :roomToken"
|
||||
)
|
||||
abstract fun pullChatMessages(roomToken: String): List<ChatMessageEntity>
|
||||
abstract fun getAllMessagesWhere(roomToken: String): List<ChatMessageEntity>
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Nextcloud Talk - Android Client
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2024 Julius Linus <juliuslinus1@gmail.com>
|
||||
* 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
|
||||
}
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk - Android Client
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2024 Your Name <your@email.com>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.chat.data.utils
|
||||
|
||||
class ChatMessageEntityMapper {
|
||||
|
||||
// TODO
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
/*
|
||||
* Nextcloud Talk - Android Client
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2024 Your Name <your@email.com>
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package com.nextcloud.talk.chat.data.utils
|
||||
|
||||
class ChatMessageJsonMapper {
|
||||
|
||||
// TODO
|
||||
}
|
@ -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<String?, String?>? = 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<String?, HashMap<String?, String?>>? = 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> = ReadStatus.NONE,
|
||||
|
||||
@JsonField(name = ["messageType"])
|
||||
var messageType: String? = null,
|
||||
|
||||
@JsonField(name = ["reactions"])
|
||||
var reactions: LinkedHashMap<String, Int>? = null,
|
||||
|
||||
@JsonField(name = ["reactionsSelf"])
|
||||
var reactionsSelf: ArrayList<String>? = 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,
|
||||
|
@ -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<ChatMessage>? = null
|
||||
var data: List<ChatMessageJson>? = null
|
||||
) : Parcelable {
|
||||
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
|
||||
constructor() : this(null, null)
|
||||
|
@ -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)
|
||||
|
@ -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<String, ChatMessage>? = null
|
||||
var data: HashMap<String, ChatMessage>? = 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)
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user