Переглянути джерело

delete expired messages

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
Marcel Hibbe 2 роки тому
батько
коміт
b40fab9826

+ 23 - 0
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -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
     }
 }

+ 12 - 20
app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt

@@ -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

+ 15 - 11
app/src/main/java/com/nextcloud/talk/models/json/chat/ChatUtils.kt

@@ -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

+ 7 - 1
app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.kt

@@ -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)