mirror of
https://github.com/nextcloud/talk-android
synced 2025-03-08 23:19:55 +00:00
delete expired messages
Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
parent
2b529cd9e8
commit
b40fab9826
@ -2216,6 +2216,8 @@ class ChatController(args: Bundle) :
|
||||
// since this is called asynchrously and UI might have been destroyed in the meantime
|
||||
Log.i(TAG, "UI destroyed - view binding already gone")
|
||||
}
|
||||
|
||||
deleteExpiredMessages()
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {
|
||||
@ -2256,6 +2258,8 @@ class ChatController(args: Bundle) :
|
||||
// since this is called asynchrously and UI might have been destroyed in the meantime
|
||||
Log.i(TAG, "UI destroyed - view binding already gone", e)
|
||||
}
|
||||
|
||||
deleteExpiredMessages()
|
||||
}
|
||||
|
||||
override fun onError(e: Throwable) {
|
||||
@ -2270,6 +2274,24 @@ class ChatController(args: Bundle) :
|
||||
}
|
||||
}
|
||||
|
||||
private fun deleteExpiredMessages() {
|
||||
if (CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "message-expiration")) {
|
||||
val messagesToDelete: ArrayList<ChatMessage> = ArrayList()
|
||||
val systemTime = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS
|
||||
|
||||
for (itemWrapper in adapter?.items!!) {
|
||||
if (itemWrapper.item is ChatMessage) {
|
||||
val chatMessage = itemWrapper.item as ChatMessage
|
||||
if (chatMessage.expirationTimestamp != 0 && chatMessage.expirationTimestamp < systemTime) {
|
||||
messagesToDelete.add(chatMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
adapter!!.delete(messagesToDelete)
|
||||
adapter!!.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
private fun processMessages(response: Response<*>, isFromTheFuture: Boolean, timeout: Int) {
|
||||
val xChatLastGivenHeader: String? = response.headers().get("X-Chat-Last-Given")
|
||||
val xChatLastCommonRead = response.headers().get("X-Chat-Last-Common-Read")?.let {
|
||||
@ -3252,5 +3274,6 @@ class ChatController(args: Bundle) :
|
||||
private const val RETRIES: Long = 3
|
||||
private const val LOOKING_INTO_FUTURE_TIMEOUT = 30
|
||||
private const val CHUNK_SIZE: Int = 10
|
||||
private const val ONE_SECOND_IN_MILLIS = 1000
|
||||
}
|
||||
}
|
||||
|
@ -112,6 +112,9 @@ data class ChatMessage(
|
||||
@JsonField(name = ["reactionsSelf"])
|
||||
var reactionsSelf: ArrayList<String>? = null,
|
||||
|
||||
@JsonField(name = ["expirationTimestamp"])
|
||||
var expirationTimestamp: Int = 0,
|
||||
|
||||
var isDownloadingVoiceMessage: Boolean = false,
|
||||
|
||||
var resetVoiceMessage: Boolean = false,
|
||||
@ -141,11 +144,7 @@ data class ChatMessage(
|
||||
fun hasFileAttachment(): Boolean {
|
||||
if (messageParameters != null && messageParameters!!.size > 0) {
|
||||
for ((_, individualHashMap) in messageParameters!!) {
|
||||
if (MessageDigest.isEqual(
|
||||
individualHashMap["type"]!!.toByteArray(),
|
||||
"file".toByteArray()
|
||||
)
|
||||
) {
|
||||
if (isHashMapEntryEqualTo(individualHashMap, "type", "file")) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@ -156,11 +155,7 @@ data class ChatMessage(
|
||||
fun hasGeoLocation(): Boolean {
|
||||
if (messageParameters != null && messageParameters!!.size > 0) {
|
||||
for ((_, individualHashMap) in messageParameters!!) {
|
||||
if (MessageDigest.isEqual(
|
||||
individualHashMap["type"]!!.toByteArray(),
|
||||
"geo-location".toByteArray()
|
||||
)
|
||||
) {
|
||||
if (isHashMapEntryEqualTo(individualHashMap, "type", "geo-location")) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@ -171,11 +166,7 @@ data class ChatMessage(
|
||||
fun isPoll(): Boolean {
|
||||
if (messageParameters != null && messageParameters!!.size > 0) {
|
||||
for ((_, individualHashMap) in messageParameters!!) {
|
||||
if (MessageDigest.isEqual(
|
||||
individualHashMap["type"]!!.toByteArray(),
|
||||
"talk-poll".toByteArray()
|
||||
)
|
||||
) {
|
||||
if (isHashMapEntryEqualTo(individualHashMap, "type", "talk-poll")) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@ -183,14 +174,11 @@ data class ChatMessage(
|
||||
return false
|
||||
}
|
||||
|
||||
@Suppress("Detekt.NestedBlockDepth")
|
||||
override fun getImageUrl(): String? {
|
||||
if (messageParameters != null && messageParameters!!.size > 0) {
|
||||
for ((_, individualHashMap) in messageParameters!!) {
|
||||
if (MessageDigest.isEqual(
|
||||
individualHashMap["type"]!!.toByteArray(),
|
||||
"file".toByteArray()
|
||||
)
|
||||
) {
|
||||
if (isHashMapEntryEqualTo(individualHashMap, "type", "file")) {
|
||||
// FIX-ME: this selectedIndividualHashMap stuff needs to be analyzed and most likely be refactored!
|
||||
// it just feels wrong to fill this here inside getImageUrl()
|
||||
selectedIndividualHashMap = individualHashMap
|
||||
@ -420,6 +408,10 @@ data class ChatMessage(
|
||||
return EnumSystemMessageTypeConverter().convertToString(systemMessageType)
|
||||
}
|
||||
|
||||
private fun isHashMapEntryEqualTo(map: HashMap<String?, String?>, key: String, searchTerm: String): Boolean {
|
||||
return map != null && MessageDigest.isEqual(map[key]!!.toByteArray(), searchTerm.toByteArray())
|
||||
}
|
||||
|
||||
val isVoiceMessage: Boolean
|
||||
get() = "voice-message" == messageType
|
||||
val isCommandMessage: Boolean
|
||||
|
@ -34,6 +34,7 @@ class ChatUtils {
|
||||
return message
|
||||
}
|
||||
|
||||
@Suppress("Detekt.ComplexMethod")
|
||||
private fun parse(
|
||||
messageParameters: HashMap<String?, HashMap<String?, String?>>,
|
||||
message: String?
|
||||
@ -41,19 +42,22 @@ class ChatUtils {
|
||||
var resultMessage = message
|
||||
for (key in messageParameters.keys) {
|
||||
val individualHashMap = messageParameters[key]
|
||||
val type = individualHashMap?.get("type")
|
||||
if (type == "user" || type == "guest" || type == "call") {
|
||||
resultMessage = resultMessage?.replace("{$key}", "@" + individualHashMap["name"])
|
||||
} else if (type == "geo-location") {
|
||||
resultMessage = individualHashMap.get("name")
|
||||
} else if (individualHashMap?.containsKey("link") == true) {
|
||||
resultMessage = if (type == "file") {
|
||||
resultMessage?.replace("{$key}", individualHashMap["name"].toString())
|
||||
|
||||
if (individualHashMap != null) {
|
||||
val type = individualHashMap["type"]
|
||||
resultMessage = if (type == "user" || type == "guest" || type == "call") {
|
||||
resultMessage?.replace("{$key}", "@" + individualHashMap["name"])
|
||||
} else if (type == "geo-location") {
|
||||
individualHashMap["name"]
|
||||
} else if (individualHashMap?.containsKey("link") == true) {
|
||||
if (type == "file") {
|
||||
resultMessage?.replace("{$key}", individualHashMap["name"].toString())
|
||||
} else {
|
||||
individualHashMap["link"].toString()
|
||||
}
|
||||
} else {
|
||||
individualHashMap["link"].toString()
|
||||
individualHashMap["name"]?.let { resultMessage?.replace("{$key}", it) }
|
||||
}
|
||||
} else {
|
||||
resultMessage = individualHashMap?.get("name")?.let { resultMessage?.replace("{$key}", it) }
|
||||
}
|
||||
}
|
||||
return resultMessage
|
||||
|
@ -4,6 +4,8 @@
|
||||
* @author Mario Danic
|
||||
* @author Tim Krüger
|
||||
* @author Andy Scherzinger
|
||||
* @author Marcel Hibbe
|
||||
* Copyright (C) 2022 Marcel Hibbe <dev@mhibbe.de>
|
||||
* Copyright (C) 2022 Andy Scherzinger <info@andy-scherzinger.de>
|
||||
* Copyright (C) 2021 Tim Krüger <t@timkrueger.me>
|
||||
* Copyright (C) 2017 Mario Danic (mario@lovelyhq.com)
|
||||
@ -122,7 +124,11 @@ data class Conversation(
|
||||
var notificationCalls: Int? = null,
|
||||
|
||||
@JsonField(name = ["permissions"])
|
||||
var permissions: Int = 0
|
||||
var permissions: Int = 0,
|
||||
|
||||
@JsonField(name = ["messageExpiration"])
|
||||
var messageExpiration: Int = 0
|
||||
|
||||
) : Parcelable {
|
||||
// This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
|
||||
constructor() : this(null, null)
|
||||
|
Loading…
Reference in New Issue
Block a user