nlindberg
07/02/2022, 1:35 PMDominaezzz
07/02/2022, 3:34 PMnlindberg
07/02/2022, 3:47 PMDominaezzz
07/02/2022, 3:50 PMnlindberg
07/02/2022, 3:55 PMDominaezzz
07/02/2022, 4:02 PMnlindberg
07/04/2022, 8:30 AMclass MaskVisualTransformation(private val mask: String, private val hint: String) : VisualTransformation {
private val specialSymbolsIndices = mask.indices.filter { mask[it] != '#' }
override fun filter(text: AnnotatedString): TransformedText {
return TransformedText(buildAnnotatedString(
text.text, hint
), offsetTranslator())
}
private fun buildAnnotatedString(text: String, hint: String): AnnotatedString {
var out = ""
var maskIndex = 0
text.forEach { char ->
while (specialSymbolsIndices.contains(maskIndex)) {
out += mask[maskIndex]
maskIndex++
}
out += char
maskIndex++
}
val padString = hint.takeLast(hint.length - text.length)
var padOut = ""
padString.forEach { char ->
while (specialSymbolsIndices.contains(maskIndex)) {
padOut += mask[maskIndex]
maskIndex++
}
padOut += char
maskIndex++
}
val annotatedText = buildAnnotatedString {
//append your initial text
withStyle(
style = SpanStyle(
color = Color.Black,
)
) {
append(out)
}
withStyle(
style = SpanStyle(
color = Color.Blue,
)
) {
append(padOut)
}
}
return annotatedText
}
private fun offsetTranslator() = object : OffsetMapping {
override fun originalToTransformed(offset: Int): Int {
val offsetValue = offset.absoluteValue
if (offsetValue == 0) return 0
var numberOfHashtags = 0
val masked = mask.takeWhile {
if (it == '#') numberOfHashtags++
numberOfHashtags < offsetValue
}
return masked.length + 1
}
override fun transformedToOriginal(offset: Int): Int {
return mask.take(offset.absoluteValue).count { it == '#' }
}
}
}