|
|
|
@ -3,8 +3,16 @@ package org.thoughtcrime.securesms.ui.components
|
|
|
|
|
import android.content.res.Resources
|
|
|
|
|
import android.graphics.Typeface
|
|
|
|
|
import android.text.Spanned
|
|
|
|
|
import android.text.SpannedString
|
|
|
|
|
import android.text.style.*
|
|
|
|
|
import android.text.style.AbsoluteSizeSpan
|
|
|
|
|
import android.text.style.BulletSpan
|
|
|
|
|
import android.text.style.ForegroundColorSpan
|
|
|
|
|
import android.text.style.RelativeSizeSpan
|
|
|
|
|
import android.text.style.StrikethroughSpan
|
|
|
|
|
import android.text.style.StyleSpan
|
|
|
|
|
import android.text.style.SubscriptSpan
|
|
|
|
|
import android.text.style.SuperscriptSpan
|
|
|
|
|
import android.text.style.TypefaceSpan
|
|
|
|
|
import android.text.style.UnderlineSpan
|
|
|
|
|
import android.util.Log
|
|
|
|
|
import androidx.annotation.StringRes
|
|
|
|
|
import androidx.compose.runtime.Composable
|
|
|
|
@ -14,7 +22,6 @@ import androidx.compose.ui.graphics.Color
|
|
|
|
|
import androidx.compose.ui.platform.LocalConfiguration
|
|
|
|
|
import androidx.compose.ui.platform.LocalContext
|
|
|
|
|
import androidx.compose.ui.platform.LocalDensity
|
|
|
|
|
import androidx.compose.ui.res.stringResource
|
|
|
|
|
import androidx.compose.ui.text.AnnotatedString
|
|
|
|
|
import androidx.compose.ui.text.SpanStyle
|
|
|
|
|
import androidx.compose.ui.text.buildAnnotatedString
|
|
|
|
@ -26,13 +33,9 @@ import androidx.compose.ui.text.style.TextDecoration
|
|
|
|
|
import androidx.compose.ui.unit.Density
|
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
|
import androidx.compose.ui.unit.em
|
|
|
|
|
import androidx.core.text.HtmlCompat
|
|
|
|
|
import com.squareup.phrase.Phrase
|
|
|
|
|
import network.loki.messenger.R
|
|
|
|
|
import org.session.libsession.utilities.StringSubstitutionConstants.URL_KEY
|
|
|
|
|
|
|
|
|
|
// TODO Remove this file once we update to composeVersion=1.7.0-alpha06 fixes https://issuetracker.google.com/issues/139320238?pli=1
|
|
|
|
|
// which allows Stylized string in string resources
|
|
|
|
|
// Utilities for AnnotatedStrings,
|
|
|
|
|
// like converting the old view system's SpannableString to AnnotatedString
|
|
|
|
|
@Composable
|
|
|
|
|
@ReadOnlyComposable
|
|
|
|
|
private fun resources(): Resources {
|
|
|
|
@ -40,31 +43,6 @@ private fun resources(): Resources {
|
|
|
|
|
return LocalContext.current.resources
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun Spanned.toHtmlWithoutParagraphs(): String {
|
|
|
|
|
return HtmlCompat.toHtml(this, HtmlCompat.TO_HTML_PARAGRAPH_LINES_CONSECUTIVE)
|
|
|
|
|
.substringAfter("<p dir=\"ltr\">").substringBeforeLast("</p>")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun Resources.getText(@StringRes id: Int, vararg args: Any): CharSequence {
|
|
|
|
|
val escapedArgs = args.map {
|
|
|
|
|
if (it is Spanned) it.toHtmlWithoutParagraphs() else it
|
|
|
|
|
}.toTypedArray()
|
|
|
|
|
val resource = SpannedString(getText(id))
|
|
|
|
|
val htmlResource = resource.toHtmlWithoutParagraphs()
|
|
|
|
|
val formattedHtml = String.format(htmlResource, *escapedArgs)
|
|
|
|
|
return HtmlCompat.fromHtml(formattedHtml, HtmlCompat.FROM_HTML_MODE_LEGACY)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
fun annotatedStringResource(@StringRes id: Int, vararg formatArgs: Any): AnnotatedString {
|
|
|
|
|
val resources = resources()
|
|
|
|
|
val density = LocalDensity.current
|
|
|
|
|
return remember(id, formatArgs) {
|
|
|
|
|
val text = resources.getText(id, *formatArgs)
|
|
|
|
|
spannableStringToAnnotatedString(text, density)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
fun annotatedStringResource(@StringRes id: Int): AnnotatedString {
|
|
|
|
|
val resources = resources()
|