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 new file mode 100644 index 000000000..9651cf408 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/chat/data/database/ChatDao.kt @@ -0,0 +1,20 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2024 Julius Linus + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.chat.data.database + +import androidx.room.Dao +import androidx.room.Query +import com.nextcloud.talk.chat.data.model.ChatMessageEntity + +@Dao +abstract class ChatDao { + @Query( + "SELECT * FROM Messages WHERE token = :roomToken" + ) + abstract fun pullChatMessages(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 new file mode 100644 index 000000000..d2c1e1d92 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageEntity.kt @@ -0,0 +1,85 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2024 Julius Linus + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.chat.data.model + +import android.os.Parcelable +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.TypeConverters +import com.nextcloud.talk.data.source.local.converters.HashMapHashMapConverter +import com.nextcloud.talk.models.json.chat.ChatMessage +import com.nextcloud.talk.models.json.converters.EnumSystemMessageTypeConverter +import kotlinx.parcelize.Parcelize + +@Parcelize +@Entity(tableName = "Messages", primaryKeys = ["id"]) +@TypeConverters(EnumSystemMessageTypeConverter::class, HashMapHashMapConverter::class) +data class ChatMessageEntity( + @ColumnInfo(name = "id") + var jsonMessageId: Int = 0, + + @ColumnInfo(name = "token") + var token: String? = null, + + // guests or users + @ColumnInfo(name = "actorType") + var actorType: String? = null, + + @ColumnInfo(name = "actorId") + var actorId: String? = null, + + // send when crafting a message + @ColumnInfo(name = "actorDisplayName") + var actorDisplayName: String? = null, + + @ColumnInfo(name = "timestamp") + var timestamp: Long = 0, + + // send when crafting a message, max 1000 lines + @ColumnInfo(name = "message") + var message: String? = null, + + @ColumnInfo(name = "messageParameters") + var messageParameters: HashMap>? = null, + + @ColumnInfo(name = "systemMessage") + var systemMessageType: ChatMessage.SystemMessageType? = null, + + @ColumnInfo(name = "isReplyable") + var replyable: Boolean = false, + + @ColumnInfo(name = "parent") + var parentMessage: ChatMessage? = null, + + @ColumnInfo(name = "messageType") + var messageType: String? = null, + + @ColumnInfo(name = "reactions") + var reactions: LinkedHashMap? = null, + + @ColumnInfo(name = "reactionsSelf") + var reactionsSelf: ArrayList? = null, + + @ColumnInfo(name = "expirationTimestamp") + var expirationTimestamp: Int = 0, + + @ColumnInfo(name = "markdown") + var renderMarkdown: Boolean? = null, + + @ColumnInfo(name = "lastEditActorDisplayName") + var lastEditActorDisplayName: String? = null, + + @ColumnInfo(name = "lastEditActorId") + var lastEditActorId: String? = null, + + @ColumnInfo(name = "lastEditActorType") + var lastEditActorType: String? = null, + + @ColumnInfo(name = "lastEditTimestamp") + var lastEditTimestamp: Long = 0 +) : Parcelable 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 new file mode 100644 index 000000000..a71175211 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/chat/data/model/ChatMessageJson.kt @@ -0,0 +1,83 @@ +/* + * Nextcloud Talk - Android Client + * + * SPDX-FileCopyrightText: 2024 Julius Linus + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package com.nextcloud.talk.chat.data.model + +import android.os.Parcelable +import com.bluelinelabs.logansquare.annotation.JsonField +import com.bluelinelabs.logansquare.annotation.JsonObject +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( + @JsonField(name = ["id"]) + var jsonMessageId: Int = 0, + + @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: ChatMessage.SystemMessageType? = null, + + @JsonField(name = ["isReplyable"]) + var replyable: Boolean = false, + + @JsonField(name = ["parent"]) + var parentMessage: ChatMessage? = null, + + @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 +) : Parcelable 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 new file mode 100644 index 000000000..e59ad10b9 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageEntityMapper.kt @@ -0,0 +1,13 @@ +/* + * 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 new file mode 100644 index 000000000..52098a714 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/chat/data/utils/ChatMessageJsonMapper.kt @@ -0,0 +1,13 @@ +/* + * 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 ed16ad788..6c98940fc 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 @@ -28,6 +28,8 @@ 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( diff --git a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt index cb4091d17..6d823a697 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt @@ -8,6 +8,7 @@ */ package com.nextcloud.talk.models.json.converters +import androidx.room.TypeConverter import com.bluelinelabs.logansquare.typeconverters.StringBasedTypeConverter import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.AUDIO_RECORDING_STARTED @@ -75,6 +76,7 @@ import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.USER_RE * */ class EnumSystemMessageTypeConverter : StringBasedTypeConverter() { + @TypeConverter override fun getFromString(string: String): ChatMessage.SystemMessageType { return when (string) { "conversation_created" -> CONVERSATION_CREATED @@ -141,6 +143,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter ""