Improved code responsible of making links clickable in chat messages
This commit is contained in:
parent
53683f6fa6
commit
947c6faa53
2 changed files with 8 additions and 50 deletions
|
@ -20,7 +20,9 @@
|
||||||
package org.linphone.activities.main.chat.viewmodels
|
package org.linphone.activities.main.chat.viewmodels
|
||||||
|
|
||||||
import android.os.CountDownTimer
|
import android.os.CountDownTimer
|
||||||
import android.text.Spanned
|
import android.text.Spannable
|
||||||
|
import android.text.util.Linkify
|
||||||
|
import androidx.core.text.util.LinkifyCompat
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -62,10 +64,7 @@ class ChatMessageViewModel(
|
||||||
|
|
||||||
val ephemeralLifetime = MutableLiveData<String>()
|
val ephemeralLifetime = MutableLiveData<String>()
|
||||||
|
|
||||||
val text: Spanned? by lazy {
|
val text = MutableLiveData<Spannable>()
|
||||||
val textContent = chatMessage.textContent
|
|
||||||
if (textContent != null) AppUtils.getTextWithHttpLinks(textContent) else null
|
|
||||||
}
|
|
||||||
|
|
||||||
private var countDownTimer: CountDownTimer? = null
|
private var countDownTimer: CountDownTimer? = null
|
||||||
|
|
||||||
|
@ -171,6 +170,10 @@ class ChatMessageViewModel(
|
||||||
for (content in chatMessage.contents) {
|
for (content in chatMessage.contents) {
|
||||||
if (content.isFileTransfer || content.isFile) {
|
if (content.isFileTransfer || content.isFile) {
|
||||||
list.add(ChatMessageContentViewModel(content, chatMessage, contentListener))
|
list.add(ChatMessageContentViewModel(content, chatMessage, contentListener))
|
||||||
|
} else if (content.isText) {
|
||||||
|
val spannable = Spannable.Factory.getInstance().newSpannable(content.utf8Text)
|
||||||
|
LinkifyCompat.addLinks(spannable, Linkify.WEB_URLS)
|
||||||
|
text.value = spannable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
contents.value = list
|
contents.value = list
|
||||||
|
|
|
@ -21,12 +21,9 @@ package org.linphone.utils
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.text.Spanned
|
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import androidx.core.text.HtmlCompat
|
|
||||||
import androidx.emoji.text.EmojiCompat
|
import androidx.emoji.text.EmojiCompat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.regex.Pattern
|
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.R
|
import org.linphone.R
|
||||||
import org.linphone.core.tools.Log
|
import org.linphone.core.tools.Log
|
||||||
|
@ -52,48 +49,6 @@ class AppUtils {
|
||||||
return coreContext.context.resources.getDimension(id)
|
return coreContext.context.resources.getDimension(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getTextWithHttpLinks(input: String): Spanned {
|
|
||||||
var text = input
|
|
||||||
if (text.contains("<")) {
|
|
||||||
text = text.replace("<", "<")
|
|
||||||
}
|
|
||||||
if (text.contains(">")) {
|
|
||||||
text = text.replace(">", ">")
|
|
||||||
}
|
|
||||||
if (text.contains("\n")) {
|
|
||||||
text = text.replace("\n", "<br>")
|
|
||||||
}
|
|
||||||
if (text.contains("http://")) {
|
|
||||||
val indexHttp = text.indexOf("http://")
|
|
||||||
val indexFinHttp =
|
|
||||||
if (text.indexOf(" ", indexHttp) == -1) text.length else text.indexOf(
|
|
||||||
" ",
|
|
||||||
indexHttp
|
|
||||||
)
|
|
||||||
val link = text.substring(indexHttp, indexFinHttp)
|
|
||||||
val linkWithoutScheme = link.replace("http://", "")
|
|
||||||
text = text.replaceFirst(
|
|
||||||
Pattern.quote(link).toRegex(),
|
|
||||||
"<a href=\"$link\">$linkWithoutScheme</a>"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
if (text.contains("https://")) {
|
|
||||||
val indexHttp = text.indexOf("https://")
|
|
||||||
val indexFinHttp =
|
|
||||||
if (text.indexOf(" ", indexHttp) == -1) text.length else text.indexOf(
|
|
||||||
" ",
|
|
||||||
indexHttp
|
|
||||||
)
|
|
||||||
val link = text.substring(indexHttp, indexFinHttp)
|
|
||||||
val linkWithoutScheme = link.replace("https://", "")
|
|
||||||
text = text.replaceFirst(
|
|
||||||
Pattern.quote(link).toRegex(),
|
|
||||||
"<a href=\"$link\">$linkWithoutScheme</a>"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getInitials(displayName: String, limit: Int = 2): String {
|
fun getInitials(displayName: String, limit: Int = 2): String {
|
||||||
if (displayName.isEmpty()) return ""
|
if (displayName.isEmpty()) return ""
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue