save "silent" in chat messages (incl DB)

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2025-01-06 15:12:45 +01:00
parent 3fdaa4bdcd
commit f665b1c116
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
9 changed files with 51 additions and 24 deletions

View File

@ -2,7 +2,7 @@
"formatVersion": 1, "formatVersion": 1,
"database": { "database": {
"version": 13, "version": 13,
"identityHash": "ec1e16b220080592a488165e493b4f89", "identityHash": "a521f027909f69f4c7d1855f84a2e67f",
"entities": [ "entities": [
{ {
"tableName": "User", "tableName": "User",
@ -450,7 +450,7 @@
}, },
{ {
"tableName": "ChatMessages", "tableName": "ChatMessages",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `id` INTEGER NOT NULL, `internalConversationId` TEXT NOT NULL, `actorDisplayName` TEXT NOT NULL, `message` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `deleted` INTEGER NOT NULL, `expirationTimestamp` INTEGER NOT NULL, `isReplyable` INTEGER NOT NULL, `lastEditActorDisplayName` TEXT, `lastEditActorId` TEXT, `lastEditActorType` TEXT, `lastEditTimestamp` INTEGER, `markdown` INTEGER, `messageParameters` TEXT, `messageType` TEXT NOT NULL, `parent` INTEGER, `reactions` TEXT, `reactionsSelf` TEXT, `referenceId` TEXT, `systemMessage` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, `isTemporary` INTEGER NOT NULL, `sendingFailed` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`internalConversationId`) REFERENCES `Conversations`(`internalId`) ON UPDATE CASCADE ON DELETE CASCADE )", "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`internalId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `token` TEXT NOT NULL, `id` INTEGER NOT NULL, `internalConversationId` TEXT NOT NULL, `actorDisplayName` TEXT NOT NULL, `message` TEXT NOT NULL, `actorId` TEXT NOT NULL, `actorType` TEXT NOT NULL, `deleted` INTEGER NOT NULL, `expirationTimestamp` INTEGER NOT NULL, `isReplyable` INTEGER NOT NULL, `isTemporary` INTEGER NOT NULL, `lastEditActorDisplayName` TEXT, `lastEditActorId` TEXT, `lastEditActorType` TEXT, `lastEditTimestamp` INTEGER, `markdown` INTEGER, `messageParameters` TEXT, `messageType` TEXT NOT NULL, `parent` INTEGER, `reactions` TEXT, `reactionsSelf` TEXT, `referenceId` TEXT, `sendingFailed` INTEGER NOT NULL, `silent` INTEGER NOT NULL, `systemMessage` TEXT NOT NULL, `timestamp` INTEGER NOT NULL, PRIMARY KEY(`internalId`), FOREIGN KEY(`internalConversationId`) REFERENCES `Conversations`(`internalId`) ON UPDATE CASCADE ON DELETE CASCADE )",
"fields": [ "fields": [
{ {
"fieldPath": "internalId", "fieldPath": "internalId",
@ -524,6 +524,12 @@
"affinity": "INTEGER", "affinity": "INTEGER",
"notNull": true "notNull": true
}, },
{
"fieldPath": "isTemporary",
"columnName": "isTemporary",
"affinity": "INTEGER",
"notNull": true
},
{ {
"fieldPath": "lastEditActorDisplayName", "fieldPath": "lastEditActorDisplayName",
"columnName": "lastEditActorDisplayName", "columnName": "lastEditActorDisplayName",
@ -590,6 +596,18 @@
"affinity": "TEXT", "affinity": "TEXT",
"notNull": false "notNull": false
}, },
{
"fieldPath": "sendingFailed",
"columnName": "sendingFailed",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "silent",
"columnName": "silent",
"affinity": "INTEGER",
"notNull": true
},
{ {
"fieldPath": "systemMessageType", "fieldPath": "systemMessageType",
"columnName": "systemMessage", "columnName": "systemMessage",
@ -601,18 +619,6 @@
"columnName": "timestamp", "columnName": "timestamp",
"affinity": "INTEGER", "affinity": "INTEGER",
"notNull": true "notNull": true
},
{
"fieldPath": "isTemporary",
"columnName": "isTemporary",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "sendingFailed",
"columnName": "sendingFailed",
"affinity": "INTEGER",
"notNull": true
} }
], ],
"primaryKey": { "primaryKey": {
@ -737,7 +743,7 @@
"views": [], "views": [],
"setupQueries": [ "setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ec1e16b220080592a488165e493b4f89')" "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a521f027909f69f4c7d1855f84a2e67f')"
] ]
} }
} }

View File

@ -105,6 +105,7 @@ interface ChatMessageRepository : LifecycleAwareManager {
message: CharSequence, message: CharSequence,
displayName: String, displayName: String,
replyTo: Int, replyTo: Int,
sendWithoutNotification: Boolean,
referenceId: String referenceId: String
): Flow<Result<ChatMessage?>> ): Flow<Result<ChatMessage?>>

View File

@ -119,7 +119,9 @@ data class ChatMessage(
var referenceId: String? = null, var referenceId: String? = null,
var sendingFailed: Boolean = true var sendingFailed: Boolean = true,
var silent: Boolean = false
) : MessageContentType, ) : MessageContentType,
MessageContentType.Image { MessageContentType.Image {

View File

@ -929,7 +929,7 @@ class OfflineFirstChatRepository @Inject constructor(
it.message, it.message,
it.actorDisplayName, it.actorDisplayName,
it.parentMessageId?.toIntOrZero() ?: 0, it.parentMessageId?.toIntOrZero() ?: 0,
false, it.silent,
it.referenceId.orEmpty() it.referenceId.orEmpty()
).collect { result -> ).collect { result ->
if (result.isSuccess) { if (result.isSuccess) {
@ -951,6 +951,7 @@ class OfflineFirstChatRepository @Inject constructor(
message: CharSequence, message: CharSequence,
displayName: String, displayName: String,
replyTo: Int, replyTo: Int,
sendWithoutNotification: Boolean,
referenceId: String referenceId: String
): Flow<Result<ChatMessage?>> = ): Flow<Result<ChatMessage?>> =
flow { flow {
@ -959,6 +960,7 @@ class OfflineFirstChatRepository @Inject constructor(
internalConversationId, internalConversationId,
message.toString(), message.toString(),
replyTo, replyTo,
sendWithoutNotification,
referenceId referenceId
) )
@ -980,6 +982,7 @@ class OfflineFirstChatRepository @Inject constructor(
internalConversationId: String, internalConversationId: String,
message: String, message: String,
replyTo: Int, replyTo: Int,
sendWithoutNotification: Boolean,
referenceId: String referenceId: String
): ChatMessageEntity { ): ChatMessageEntity {
val currentTimeMillies = System.currentTimeMillis() val currentTimeMillies = System.currentTimeMillis()
@ -1007,12 +1010,13 @@ class OfflineFirstChatRepository @Inject constructor(
parentMessageId = parentMessageId, parentMessageId = parentMessageId,
systemMessageType = ChatMessage.SystemMessageType.DUMMY, systemMessageType = ChatMessage.SystemMessageType.DUMMY,
replyable = false, replyable = false,
timestamp = System.currentTimeMillis() / MILLIES, timestamp = currentTimeMillies / MILLIES,
expirationTimestamp = 0, expirationTimestamp = 0,
actorDisplayName = currentUser.displayName!!, actorDisplayName = currentUser.displayName!!,
referenceId = referenceId, referenceId = referenceId,
isTemporary = true, isTemporary = true,
sendingFailed = false sendingFailed = false,
silent = sendWithoutNotification
) )
return entity return entity
} }

View File

@ -134,6 +134,7 @@ class MessageInputViewModel @Inject constructor(
message, message,
displayName, displayName,
replyTo, replyTo,
sendWithoutNotification,
referenceId referenceId
).collect { result -> ).collect { result ->
if (result.isSuccess) { if (result.isSuccess) {

View File

@ -39,7 +39,8 @@ fun ChatMessageJson.asEntity(accountId: Long) =
lastEditActorType = lastEditActorType, lastEditActorType = lastEditActorType,
lastEditTimestamp = lastEditTimestamp, lastEditTimestamp = lastEditTimestamp,
deleted = deleted, deleted = deleted,
referenceId = referenceId referenceId = referenceId,
silent = silent
) )
fun ChatMessageEntity.asModel() = fun ChatMessageEntity.asModel() =
@ -68,7 +69,8 @@ fun ChatMessageEntity.asModel() =
referenceId = referenceId, referenceId = referenceId,
isTemporary = isTemporary, isTemporary = isTemporary,
sendingFailed = sendingFailed, sendingFailed = sendingFailed,
readStatus = ReadStatus.NONE readStatus = ReadStatus.NONE,
silent = silent
) )
fun ChatMessageJson.asModel() = fun ChatMessageJson.asModel() =
@ -94,5 +96,6 @@ fun ChatMessageJson.asModel() =
lastEditActorType = lastEditActorType, lastEditActorType = lastEditActorType,
lastEditTimestamp = lastEditTimestamp, lastEditTimestamp = lastEditTimestamp,
isDeleted = deleted, isDeleted = deleted,
referenceId = referenceId referenceId = referenceId,
silent = silent
) )

View File

@ -65,7 +65,7 @@ data class ChatMessageEntity(
@ColumnInfo(name = "reactionsSelf") var reactionsSelf: ArrayList<String>? = null, @ColumnInfo(name = "reactionsSelf") var reactionsSelf: ArrayList<String>? = null,
@ColumnInfo(name = "referenceId") var referenceId: String? = null, @ColumnInfo(name = "referenceId") var referenceId: String? = null,
@ColumnInfo(name = "sendingFailed") var sendingFailed: Boolean = false, @ColumnInfo(name = "sendingFailed") var sendingFailed: Boolean = false,
@ColumnInfo(name = "silent") var silent: Boolean = false,
@ColumnInfo(name = "systemMessage") var systemMessageType: ChatMessage.SystemMessageType, @ColumnInfo(name = "systemMessage") var systemMessageType: ChatMessage.SystemMessageType,
@ColumnInfo(name = "timestamp") var timestamp: Long = 0 @ColumnInfo(name = "timestamp") var timestamp: Long = 0
// missing/not needed: silent
) )

View File

@ -292,5 +292,14 @@ object Migrations {
} catch (e: SQLException) { } catch (e: SQLException) {
Log.i("Migrations", "Something went wrong when adding column sendingFailed to table ChatMessages") Log.i("Migrations", "Something went wrong when adding column sendingFailed to table ChatMessages")
} }
try {
db.execSQL(
"ALTER TABLE ChatMessages " +
"ADD COLUMN silent INTEGER NOT NULL DEFAULT 0;"
)
} catch (e: SQLException) {
Log.i("Migrations", "Something went wrong when adding column silent to table ChatMessages")
}
} }
} }

View File

@ -43,5 +43,6 @@ data class ChatMessageJson(
@JsonField(name = ["lastEditActorType"]) var lastEditActorType: String? = null, @JsonField(name = ["lastEditActorType"]) var lastEditActorType: String? = null,
@JsonField(name = ["lastEditTimestamp"]) var lastEditTimestamp: Long? = 0, @JsonField(name = ["lastEditTimestamp"]) var lastEditTimestamp: Long? = 0,
@JsonField(name = ["deleted"]) var deleted: Boolean = false, @JsonField(name = ["deleted"]) var deleted: Boolean = false,
@JsonField(name = ["referenceId"]) var referenceId: String? = null @JsonField(name = ["referenceId"]) var referenceId: String? = null,
@JsonField(name = ["silent"]) var silent: Boolean = false,
) : Parcelable ) : Parcelable