Skip to content

Commit 07c01db

Browse files
fix(android): link turns into plain text (#502)
# Summary Fixes: #477 ## Test Plan Run reproduction steps from #477, the issue should be resolved. ## Screenshots / Videos https://github.com/user-attachments/assets/4a64749b-d732-45d2-93af-6bd3f2591aa3 ## Compatibility | OS | Implemented | | ------- | :---------: | | iOS | ❌ | | Android | ✅ | ## Checklist - [ ] E2E tests are passing - [ ] Required E2E tests have been added (if applicable) ---------
1 parent 078f223 commit 07c01db

9 files changed

Lines changed: 44 additions & 7 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
appId: swmansion.enriched.example
2+
---
3+
# Regression test: a link loaded from HTML must not be destroyed when the user types immediately after it.
4+
- launchApp
5+
6+
- tapOn:
7+
id: "toggle-screen-button"
8+
9+
- runFlow:
10+
file: "../subflows/set_editor_value.yaml"
11+
env:
12+
VALUE: "<a href=\"https://swmansion.com\">link</a>"
13+
14+
- tapOn:
15+
id: "editor-input"
16+
point: "5%, 50%"
17+
- tapOn:
18+
id: "editor-input"
19+
point: "95%, 50%"
20+
21+
- inputText: " extra"
22+
23+
- runFlow:
24+
file: "../subflows/capture_or_assert_screenshot.yaml"
25+
env:
26+
SCREENSHOT_NAME: "html_link_not_extended"

.maestro/flows/link_not_extended.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
appId: swmansion.enriched.example
2-
tags:
3-
- ios-only
42
---
53
# PR #421 - fix(iOS): prevent extending link styles
4+
# PR #502 - fix(android): link turns into plain text
65
- launchApp
76

87
- tapOn:
4.37 KB
Loading
5.5 KB
Loading
5.08 KB
Loading

android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
99
open class EnrichedLinkSpan(
1010
private val url: String,
1111
private val enrichedStyle: EnrichedStyle,
12+
private val isManual: Boolean,
1213
) : ClickableSpan(),
1314
EnrichedInlineSpan {
1415
override fun onClick(view: View) {
@@ -23,4 +24,6 @@ open class EnrichedLinkSpan(
2324
}
2425

2526
fun getUrl(): String = url
27+
28+
fun getIsManual(): Boolean = isManual
2629
}

android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class EnrichedTextInputSpannableFactory : EnrichedSpanFactory<HtmlStyle> {
3838
override fun createLinkSpan(
3939
url: String,
4040
style: HtmlStyle,
41-
) = EnrichedInputLinkSpan(url, style)
41+
) = EnrichedInputLinkSpan(url, style, true)
4242

4343
override fun createMentionSpan(
4444
text: String,

android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ import com.swmansion.enriched.textinput.styles.HtmlStyle
77
class EnrichedInputLinkSpan(
88
private val url: String,
99
htmlStyle: HtmlStyle,
10-
) : EnrichedLinkSpan(url, htmlStyle),
10+
private val isManual: Boolean = false,
11+
) : EnrichedLinkSpan(url, htmlStyle, isManual),
1112
EnrichedInputSpan {
1213
override val dependsOnHtmlStyle: Boolean = true
1314

14-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInputLinkSpan = EnrichedInputLinkSpan(url, htmlStyle)
15+
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInputLinkSpan = EnrichedInputLinkSpan(url, htmlStyle, isManual)
1516
}

android/src/main/java/com/swmansion/enriched/textinput/styles/ParametrizedStyles.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class ParametrizedStyles(
6161
}
6262

6363
val spanEnd = start + text.length
64-
val span = EnrichedInputLinkSpan(url, view.htmlStyle)
64+
val span = EnrichedInputLinkSpan(url, view.htmlStyle, true)
6565
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, spanEnd)
6666
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
6767

@@ -109,6 +109,7 @@ class ParametrizedStyles(
109109

110110
val spans = spannable.getSpans(safeStart, safeEnd, EnrichedInputLinkSpan::class.java)
111111
for (span in spans) {
112+
if (span.getIsManual()) continue
112113
spannable.removeSpan(span)
113114
}
114115

@@ -132,9 +133,16 @@ class ParametrizedStyles(
132133
val spanStart = start + wordStart + linkStart
133134
val spanEnd = start + wordStart + linkEnd
134135

135-
val span = EnrichedInputLinkSpan(matcher.group(), view.htmlStyle)
136136
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(spanStart, spanEnd)
137137

138+
// Do not overwrite a manual link span with an auto-detected one
139+
val overlappingManual =
140+
spannable
141+
.getSpans(safeStart, safeEnd, EnrichedInputLinkSpan::class.java)
142+
.any { it.getIsManual() }
143+
if (overlappingManual) continue
144+
145+
val span = EnrichedInputLinkSpan(matcher.group(), view.htmlStyle)
138146
spannable.setSpan(
139147
span,
140148
safeStart,

0 commit comments

Comments
 (0)