Skip to content

Commit 75482d5

Browse files
committed
Merge remote-tracking branch 'origin/main' into android-customize-styles
# Conflicts: # android/src/main/java/com/swmansion/reactnativerichtexteditor/ReactNativeRichTextEditorView.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/spans/EditorLinkSpan.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/spans/EditorMentionSpan.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/styles/InlineStyles.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/styles/ListStyles.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/styles/ParagraphStyles.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/styles/ParametrizedStyles.kt # android/src/main/java/com/swmansion/reactnativerichtexteditor/utils/EditorParser.java
2 parents 8915e1a + 4efc7b8 commit 75482d5

21 files changed

Lines changed: 126 additions & 171 deletions

android/src/main/java/com/swmansion/reactnativerichtexteditor/ReactNativeRichTextEditorView.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import android.graphics.Rect
88
import android.os.Build
99
import android.text.Spannable
1010
import android.text.StaticLayout
11-
import android.text.method.LinkMovementMethod
1211
import android.util.AttributeSet
1312
import android.util.Log
1413
import android.util.TypedValue
@@ -24,7 +23,6 @@ import com.facebook.react.uimanager.UIManagerHelper
2423
import com.facebook.react.views.text.ReactTypefaceUtils.applyStyles
2524
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontStyle
2625
import com.facebook.react.views.text.ReactTypefaceUtils.parseFontWeight
27-
import com.swmansion.reactnativerichtexteditor.events.LinkHandler
2826
import com.swmansion.reactnativerichtexteditor.events.MentionHandler
2927
import com.swmansion.reactnativerichtexteditor.events.OnInputBlurEvent
3028
import com.swmansion.reactnativerichtexteditor.events.OnInputFocusEvent
@@ -52,7 +50,6 @@ class ReactNativeRichTextEditorView : AppCompatEditText {
5250
val parametrizedStyles: ParametrizedStyles? = ParametrizedStyles(this)
5351
var isSettingValue: Boolean = false
5452

55-
var linkHandler: LinkHandler? = LinkHandler(this)
5653
val mentionHandler: MentionHandler? = MentionHandler(this)
5754
var richTextStyle: RichTextStyle = RichTextStyle(this.context as ReactContext, null)
5855

@@ -95,9 +92,6 @@ class ReactNativeRichTextEditorView : AppCompatEditText {
9592
gravity = android.view.Gravity.TOP or android.view.Gravity.START
9693
inputType = android.text.InputType.TYPE_CLASS_TEXT or android.text.InputType.TYPE_TEXT_FLAG_MULTI_LINE
9794

98-
// required to make ClickableSpans really clickable
99-
movementMethod = LinkMovementMethod.getInstance()
100-
10195
setPadding(0, 0, 0, 0)
10296
setBackgroundColor(Color.TRANSPARENT)
10397

@@ -172,7 +166,7 @@ class ReactNativeRichTextEditorView : AppCompatEditText {
172166
val isPTagRecognized = value.startsWith("<p>") && value.endsWith("</p>")
173167
val isHtml = isHtmlTagRecognized || isPTagRecognized
174168
if (isHtml) {
175-
val parsed = EditorParser.fromHtml(value, EditorParser.FROM_HTML_MODE_COMPACT, richTextStyle, null, null, linkHandler, mentionHandler)
169+
val parsed = EditorParser.fromHtml(value, EditorParser.FROM_HTML_MODE_COMPACT, richTextStyle, null, null)
176170
setText(parsed)
177171
} else {
178172
setText(value)

android/src/main/java/com/swmansion/reactnativerichtexteditor/ReactNativeRichTextEditorViewManager.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ import com.swmansion.reactnativerichtexteditor.events.OnChangeStateEvent
2424
import com.swmansion.reactnativerichtexteditor.events.OnChangeTextEvent
2525
import com.swmansion.reactnativerichtexteditor.events.OnInputFocusEvent
2626
import com.swmansion.reactnativerichtexteditor.events.OnLinkDetectedEvent
27+
import com.swmansion.reactnativerichtexteditor.events.OnMentionDetectedEvent
2728
import com.swmansion.reactnativerichtexteditor.events.OnMentionEvent
28-
import com.swmansion.reactnativerichtexteditor.events.OnPressLinkEvent
29-
import com.swmansion.reactnativerichtexteditor.events.OnPressMentionEvent
3029
import com.swmansion.reactnativerichtexteditor.spans.EditorSpans
3130
import com.swmansion.reactnativerichtexteditor.styles.RichTextStyle
3231
import com.swmansion.reactnativerichtexteditor.utils.jsonStringToStringMap
@@ -72,10 +71,9 @@ class ReactNativeRichTextEditorViewManager : SimpleViewManager<ReactNativeRichTe
7271
map.put(OnChangeTextEvent.EVENT_NAME, mapOf("registrationName" to OnChangeTextEvent.EVENT_NAME))
7372
map.put(OnChangeHtmlEvent.EVENT_NAME, mapOf("registrationName" to OnChangeHtmlEvent.EVENT_NAME))
7473
map.put(OnChangeStateEvent.EVENT_NAME, mapOf("registrationName" to OnChangeStateEvent.EVENT_NAME))
75-
map.put(OnPressLinkEvent.EVENT_NAME, mapOf("registrationName" to OnPressLinkEvent.EVENT_NAME))
7674
map.put(OnLinkDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnLinkDetectedEvent.EVENT_NAME))
75+
map.put(OnMentionDetectedEvent.EVENT_NAME, mapOf("registrationName" to OnMentionDetectedEvent.EVENT_NAME))
7776
map.put(OnMentionEvent.EVENT_NAME, mapOf("registrationName" to OnMentionEvent.EVENT_NAME))
78-
map.put(OnPressMentionEvent.EVENT_NAME, mapOf("registrationName" to OnPressMentionEvent.EVENT_NAME))
7977
map.put(OnChangeSelectionEvent.EVENT_NAME, mapOf("registrationName" to OnChangeSelectionEvent.EVENT_NAME))
8078

8179
return map

android/src/main/java/com/swmansion/reactnativerichtexteditor/events/LinkHandler.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

android/src/main/java/com/swmansion/reactnativerichtexteditor/events/MentionHandler.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,6 @@ class MentionHandler(private val editorView: ReactNativeRichTextEditorView) {
88
private var previousText: String? = null
99
private var previousIndicator: String? = null
1010

11-
fun onPress(text: String, attributes: Map<String, String>) {
12-
val context = editorView.context as ReactContext
13-
val surfaceId = UIManagerHelper.getSurfaceId(context)
14-
val dispatcher = UIManagerHelper.getEventDispatcherForReactTag(context, editorView.id)
15-
dispatcher?.dispatchEvent(OnPressMentionEvent(surfaceId, editorView.id, text, attributes))
16-
}
17-
1811
fun endMention() {
1912
val indicator = previousIndicator
2013
if (indicator == null) return

android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnPressMentionEvent.kt renamed to android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnMentionDetectedEvent.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ package com.swmansion.reactnativerichtexteditor.events
33
import com.facebook.react.bridge.Arguments
44
import com.facebook.react.bridge.WritableMap
55
import com.facebook.react.uimanager.events.Event
6-
import org.json.JSONObject
76

8-
class OnPressMentionEvent(surfaceId: Int, viewId: Int, private val text: String, private val attributes: Map<String, String>) :
9-
Event<OnPressMentionEvent>(surfaceId, viewId) {
7+
class OnMentionDetectedEvent(surfaceId: Int, viewId: Int, private val text: String, private val payload: String) :
8+
Event<OnMentionDetectedEvent>(surfaceId, viewId) {
109

1110
override fun getEventName(): String {
1211
return EVENT_NAME
@@ -15,11 +14,11 @@ class OnPressMentionEvent(surfaceId: Int, viewId: Int, private val text: String,
1514
override fun getEventData(): WritableMap {
1615
val eventData: WritableMap = Arguments.createMap()
1716
eventData.putString("text", text)
18-
eventData.putString("attributes", JSONObject(attributes).toString())
17+
eventData.putString("payload", payload)
1918
return eventData
2019
}
2120

2221
companion object {
23-
const val EVENT_NAME: String = "onPressMention"
22+
const val EVENT_NAME: String = "onMentionDetected"
2423
}
2524
}

android/src/main/java/com/swmansion/reactnativerichtexteditor/events/OnPressLinkEvent.kt

Lines changed: 0 additions & 23 deletions
This file was deleted.

android/src/main/java/com/swmansion/reactnativerichtexteditor/spans/EditorLinkSpan.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package com.swmansion.reactnativerichtexteditor.spans
33
import android.text.TextPaint
44
import android.text.style.ClickableSpan
55
import android.view.View
6-
import com.swmansion.reactnativerichtexteditor.events.LinkHandler
76
import com.swmansion.reactnativerichtexteditor.spans.interfaces.EditorInlineSpan
87
import com.swmansion.reactnativerichtexteditor.styles.RichTextStyle
98

10-
class EditorLinkSpan(private val url: String, private val linkHandler: LinkHandler, private val richTextStyle: RichTextStyle) : ClickableSpan(), EditorInlineSpan {
9+
class EditorLinkSpan(private val url: String, private val richTextStyle: RichTextStyle) : ClickableSpan(), EditorInlineSpan {
1110
override fun onClick(view: View) {
12-
linkHandler.onPress(url)
11+
// Do nothing, links inside the editor are not clickable.
12+
// We are using `ClickableSpan` to allow the text to be styled as a link.
1313
}
1414

1515
override fun updateDrawState(textPaint: TextPaint) {

android/src/main/java/com/swmansion/reactnativerichtexteditor/spans/EditorMentionSpan.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ package com.swmansion.reactnativerichtexteditor.spans
33
import android.text.TextPaint
44
import android.text.style.ClickableSpan
55
import android.view.View
6-
import com.swmansion.reactnativerichtexteditor.events.MentionHandler
76
import com.swmansion.reactnativerichtexteditor.spans.interfaces.EditorInlineSpan
87
import com.swmansion.reactnativerichtexteditor.styles.RichTextStyle
98

10-
class EditorMentionSpan(private val text: String, private val attributes: Map<String, String>, private val mentionHandler: MentionHandler, private val richTextStyle: RichTextStyle) :
9+
class EditorMentionSpan(private val text: String, private val attributes: Map<String, String>, private val richTextStyle: RichTextStyle) :
1110
ClickableSpan(), EditorInlineSpan {
1211
override fun onClick(view: View) {
13-
mentionHandler.onPress(text, attributes)
12+
// Do nothing. Mentions inside the editor are not clickable.
13+
// We are using `ClickableSpan` to allow the text to be styled as a clickable element.
1414
}
1515

1616
override fun updateDrawState(textPaint: TextPaint) {

android/src/main/java/com/swmansion/reactnativerichtexteditor/styles/InlineStyles.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.text.Editable
44
import android.text.Spannable
55
import com.swmansion.reactnativerichtexteditor.ReactNativeRichTextEditorView
66
import com.swmansion.reactnativerichtexteditor.spans.EditorSpans
7+
import com.swmansion.reactnativerichtexteditor.utils.getSafeSpanBoundaries
78

89
class InlineStyles(private val editorView: ReactNativeRichTextEditorView) {
910
private fun <T>setSpan(spannable: Spannable, type: Class<T>, start: Int, end: Int) {
@@ -32,7 +33,8 @@ class InlineStyles(private val editorView: ReactNativeRichTextEditorView) {
3233
}
3334

3435
val span = type.getDeclaredConstructor(RichTextStyle::class.java).newInstance(editorView.richTextStyle)
35-
spannable.setSpan(span, minimum.coerceAtMost(maximum), maximum.coerceAtLeast(minimum), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
36+
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(minimum, maximum)
37+
spannable.setSpan(span, safeStart, safeEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
3638
}
3739

3840
private fun <T>setAndMergeSpans(spannable: Spannable, type: Class<T>, start: Int, end: Int) {

android/src/main/java/com/swmansion/reactnativerichtexteditor/styles/ListStyles.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.swmansion.reactnativerichtexteditor.ReactNativeRichTextEditorView
88
import com.swmansion.reactnativerichtexteditor.spans.EditorOrderedListSpan
99
import com.swmansion.reactnativerichtexteditor.spans.EditorSpans
1010
import com.swmansion.reactnativerichtexteditor.spans.EditorUnorderedListSpan
11+
import com.swmansion.reactnativerichtexteditor.utils.getSafeSpanBoundaries
1112

1213
class ListStyles(private val editorView: ReactNativeRichTextEditorView) {
1314
private fun <T>getPreviousParagraphSpan(spannable: Spannable, s: Int, type: Class<T>): T? {
@@ -37,16 +38,18 @@ class ListStyles(private val editorView: ReactNativeRichTextEditorView) {
3738
}
3839

3940
private fun setSpan(spannable: Spannable, name: String, start: Int, end: Int) {
41+
val (safeStart, safeEnd) = spannable.getSafeSpanBoundaries(start, end)
42+
4043
if (name == EditorSpans.UNORDERED_LIST) {
4144
val span = EditorUnorderedListSpan(editorView.richTextStyle)
42-
spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
45+
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
4346
return
4447
}
4548

4649
if (name == EditorSpans.ORDERED_LIST) {
47-
val index = getOrderedListIndex(spannable, start)
50+
val index = getOrderedListIndex(spannable, safeStart)
4851
val span = EditorOrderedListSpan(index, editorView.richTextStyle)
49-
spannable.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
52+
spannable.setSpan(span, safeStart, safeEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
5053
}
5154
}
5255

0 commit comments

Comments
 (0)