react-native-enriched 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/android/build.gradle +3 -3
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +3 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +1 -0
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
- package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
- package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
- package/android/gradle.properties +5 -5
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +3 -2
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +40 -8
- package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/EnrichedConstants.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
- package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
- package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +126 -99
- package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedBlockQuoteSpan.kt +9 -13
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +8 -12
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +43 -38
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedInlineCodeSpan.kt +7 -11
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt +7 -11
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt +6 -10
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +12 -21
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +9 -13
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedBlockSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedHeadingSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedParagraphSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputConnectionWrapper.kt → textinput/EnrichedTextInputConnectionWrapper.kt} +2 -2
- package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +87 -51
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +1 -1
- package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +24 -17
- package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +5 -4
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeHtmlEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeStateEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeTextEvent.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputBlurEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputFocusEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputKeyPressEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnLinkDetectedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
- package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
- package/android/src/main/java/com/swmansion/enriched/{spans → textinput/spans}/EnrichedSpans.kt +39 -30
- package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +58 -43
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +4 -4
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt +77 -26
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +30 -25
- package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +19 -19
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedEditableFactory.kt +2 -2
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +15 -14
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpanState.kt +15 -50
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannable.kt +3 -3
- package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannableStringBuilder.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
- package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +10 -10
- package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +3 -3
- package/android/src/main/new_arch/CMakeLists.txt +1 -1
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
- package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
- package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/conversions.h +1 -1
- package/ios/EnrichedTextInputView.h +1 -0
- package/ios/EnrichedTextInputView.mm +274 -55
- package/ios/config/InputConfig.h +10 -0
- package/ios/config/InputConfig.mm +119 -0
- package/ios/extensions/ImageExtension.h +35 -0
- package/ios/extensions/ImageExtension.mm +156 -0
- package/ios/extensions/LayoutManagerExtension.mm +115 -95
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
- package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
- package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
- package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +21 -0
- package/ios/inputParser/InputParser.mm +135 -8
- package/ios/inputTextView/InputTextView.mm +118 -0
- package/ios/interfaces/ImageAttachment.h +1 -0
- package/ios/interfaces/ImageAttachment.mm +43 -4
- package/ios/interfaces/StyleHeaders.h +13 -2
- package/ios/interfaces/StyleTypeEnum.h +1 -0
- package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
- package/ios/styles/CheckboxListStyle.mm +321 -0
- package/ios/styles/H1Style.mm +3 -0
- package/ios/styles/H2Style.mm +3 -0
- package/ios/styles/H3Style.mm +3 -0
- package/ios/styles/H4Style.mm +3 -0
- package/ios/styles/H5Style.mm +3 -0
- package/ios/styles/H6Style.mm +3 -0
- package/ios/styles/HeadingStyleBase.mm +150 -78
- package/ios/utils/CheckboxHitTestUtils.h +10 -0
- package/ios/utils/CheckboxHitTestUtils.mm +123 -0
- package/ios/utils/ParagraphAttributesUtils.mm +83 -53
- package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
- package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
- package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
- package/lib/module/EnrichedTextInput.js +36 -11
- package/lib/module/EnrichedTextInput.js.map +1 -1
- package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/normalizeHtmlStyle.js +6 -0
- package/lib/module/utils/normalizeHtmlStyle.js.map +1 -1
- package/lib/module/utils/nullthrows.js +9 -0
- package/lib/module/utils/nullthrows.js.map +1 -0
- package/lib/typescript/src/EnrichedTextInput.d.ts +9 -49
- package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +33 -8
- package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +2 -2
- package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -1
- package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
- package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
- package/lib/typescript/src/utils/regexParser.d.ts +1 -1
- package/lib/typescript/src/utils/regexParser.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/EnrichedTextInput.tsx +49 -62
- package/src/index.tsx +3 -1
- package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
- package/src/types.ts +59 -0
- package/src/utils/normalizeHtmlStyle.ts +8 -5
- package/src/utils/nullthrows.ts +7 -0
- package/src/utils/regexParser.ts +1 -1
- package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +0 -21
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -17
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +0 -24
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -16
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -15
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -3
- package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -9
- package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -21
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
- package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
- package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
- /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
- /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Canvas
|
|
4
|
+
import android.graphics.Paint
|
|
5
|
+
import android.text.Layout
|
|
6
|
+
import android.text.Spanned
|
|
7
|
+
import android.text.TextPaint
|
|
8
|
+
import android.text.style.LeadingMarginSpan
|
|
9
|
+
import android.text.style.LineHeightSpan
|
|
10
|
+
import android.text.style.MetricAffectingSpan
|
|
11
|
+
import androidx.core.graphics.withTranslation
|
|
12
|
+
import com.swmansion.enriched.common.CheckboxDrawable
|
|
13
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
14
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
|
|
15
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
16
|
+
|
|
17
|
+
open class EnrichedCheckboxListSpan(
|
|
18
|
+
open var isChecked: Boolean,
|
|
19
|
+
private val enrichedStyle: EnrichedStyle,
|
|
20
|
+
) : MetricAffectingSpan(),
|
|
21
|
+
LineHeightSpan,
|
|
22
|
+
LeadingMarginSpan,
|
|
23
|
+
EnrichedParagraphSpan {
|
|
24
|
+
private val checkboxDrawable =
|
|
25
|
+
CheckboxDrawable(enrichedStyle.ulCheckboxBoxSize, enrichedStyle.ulCheckboxBoxColor, isChecked).apply {
|
|
26
|
+
setBounds(0, 0, enrichedStyle.ulCheckboxBoxSize, enrichedStyle.ulCheckboxBoxSize)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun updateMeasureState(tp: TextPaint) {
|
|
30
|
+
// Do nothing, but inform layout that this span affects text metrics
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
34
|
+
// Do nothing, but inform layout that this span affects text metrics
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Include checkbox size in text measurements to avoid clipping
|
|
38
|
+
override fun chooseHeight(
|
|
39
|
+
text: CharSequence,
|
|
40
|
+
start: Int,
|
|
41
|
+
end: Int,
|
|
42
|
+
spanstartv: Int,
|
|
43
|
+
v: Int,
|
|
44
|
+
fm: Paint.FontMetricsInt,
|
|
45
|
+
) {
|
|
46
|
+
val checkboxSize = enrichedStyle.ulCheckboxBoxSize
|
|
47
|
+
val currentLineHeight = fm.descent - fm.ascent
|
|
48
|
+
|
|
49
|
+
if (checkboxSize > currentLineHeight) {
|
|
50
|
+
val extraSpace = checkboxSize - currentLineHeight
|
|
51
|
+
val halfExtra = extraSpace / 2
|
|
52
|
+
|
|
53
|
+
fm.ascent -= halfExtra
|
|
54
|
+
fm.descent += (extraSpace - halfExtra)
|
|
55
|
+
|
|
56
|
+
fm.top -= halfExtra
|
|
57
|
+
fm.bottom += (extraSpace - halfExtra)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
override fun getLeadingMargin(first: Boolean): Int =
|
|
62
|
+
enrichedStyle.ulCheckboxBoxSize + enrichedStyle.ulCheckboxMarginLeft + enrichedStyle.ulCheckboxGapWidth
|
|
63
|
+
|
|
64
|
+
override fun drawLeadingMargin(
|
|
65
|
+
canvas: Canvas,
|
|
66
|
+
paint: Paint,
|
|
67
|
+
x: Int,
|
|
68
|
+
dir: Int,
|
|
69
|
+
top: Int,
|
|
70
|
+
baseline: Int,
|
|
71
|
+
bottom: Int,
|
|
72
|
+
text: CharSequence,
|
|
73
|
+
start: Int,
|
|
74
|
+
end: Int,
|
|
75
|
+
first: Boolean,
|
|
76
|
+
layout: Layout?,
|
|
77
|
+
) {
|
|
78
|
+
val spannedText = text as Spanned
|
|
79
|
+
|
|
80
|
+
if (spannedText.getSpanStart(this) == start) {
|
|
81
|
+
checkboxDrawable.update(isChecked)
|
|
82
|
+
|
|
83
|
+
val lineCenter = (top + bottom) / 2f
|
|
84
|
+
val drawableTop = lineCenter - (enrichedStyle.ulCheckboxBoxSize / 2f)
|
|
85
|
+
|
|
86
|
+
canvas.withTranslation(x.toFloat() + enrichedStyle.ulCheckboxMarginLeft, drawableTop) {
|
|
87
|
+
checkboxDrawable.draw(this)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.graphics.Canvas
|
|
4
4
|
import android.graphics.Paint
|
|
@@ -9,19 +9,17 @@ import android.text.Spanned
|
|
|
9
9
|
import android.text.TextPaint
|
|
10
10
|
import android.text.style.LineBackgroundSpan
|
|
11
11
|
import android.text.style.MetricAffectingSpan
|
|
12
|
-
import com.swmansion.enriched.
|
|
13
|
-
import com.swmansion.enriched.
|
|
12
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
13
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
|
|
14
14
|
|
|
15
|
-
class EnrichedCodeBlockSpan(
|
|
16
|
-
private val
|
|
15
|
+
open class EnrichedCodeBlockSpan(
|
|
16
|
+
private val enrichedStyle: EnrichedStyle,
|
|
17
17
|
) : MetricAffectingSpan(),
|
|
18
18
|
LineBackgroundSpan,
|
|
19
19
|
EnrichedBlockSpan {
|
|
20
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
21
|
-
|
|
22
20
|
override fun updateDrawState(paint: TextPaint) {
|
|
23
21
|
paint.typeface = Typeface.MONOSPACE
|
|
24
|
-
paint.color =
|
|
22
|
+
paint.color = enrichedStyle.codeBlockColor
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
override fun updateMeasureState(paint: TextPaint) {
|
|
@@ -46,9 +44,9 @@ class EnrichedCodeBlockSpan(
|
|
|
46
44
|
}
|
|
47
45
|
|
|
48
46
|
val previousColor = p.color
|
|
49
|
-
p.color =
|
|
47
|
+
p.color = enrichedStyle.codeBlockBackgroundColor
|
|
50
48
|
|
|
51
|
-
val radius =
|
|
49
|
+
val radius = enrichedStyle.codeBlockRadius
|
|
52
50
|
|
|
53
51
|
val spanStart = text.getSpanStart(this)
|
|
54
52
|
val spanEnd = text.getSpanEnd(this)
|
|
@@ -80,6 +78,4 @@ class EnrichedCodeBlockSpan(
|
|
|
80
78
|
canvas.drawPath(path, p)
|
|
81
79
|
p.color = previousColor
|
|
82
80
|
}
|
|
83
|
-
|
|
84
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedCodeBlockSpan = EnrichedCodeBlockSpan(htmlStyle)
|
|
85
81
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH1Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h1FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h1Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH2Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h2FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h2Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH3Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h3FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h3Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
import com.swmansion.enriched.textinput.styles.HtmlStyle
|
|
9
|
+
|
|
10
|
+
open class EnrichedH4Span(
|
|
11
|
+
private val enrichedStyle: EnrichedStyle,
|
|
12
|
+
) : AbsoluteSizeSpan(enrichedStyle.h4FontSize),
|
|
13
|
+
EnrichedHeadingSpan {
|
|
14
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
15
|
+
super.updateDrawState(tp)
|
|
16
|
+
val bold = enrichedStyle.h4Bold
|
|
17
|
+
if (bold) {
|
|
18
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH5Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h5FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h5Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.TextPaint
|
|
5
|
+
import android.text.style.AbsoluteSizeSpan
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedHeadingSpan
|
|
8
|
+
|
|
9
|
+
open class EnrichedH6Span(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : AbsoluteSizeSpan(enrichedStyle.h6FontSize),
|
|
12
|
+
EnrichedHeadingSpan {
|
|
13
|
+
override fun updateDrawState(tp: TextPaint) {
|
|
14
|
+
super.updateDrawState(tp)
|
|
15
|
+
val bold = enrichedStyle.h6Bold
|
|
16
|
+
if (bold) {
|
|
17
|
+
tp.typeface = Typeface.create(tp.typeface, Typeface.BOLD)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt
RENAMED
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
|
-
import android.annotation.SuppressLint
|
|
4
3
|
import android.content.res.Resources
|
|
5
4
|
import android.graphics.BitmapFactory
|
|
6
5
|
import android.graphics.Canvas
|
|
6
|
+
import android.graphics.ImageDecoder
|
|
7
7
|
import android.graphics.Paint
|
|
8
|
-
import android.graphics.drawable.
|
|
8
|
+
import android.graphics.drawable.AnimatedImageDrawable
|
|
9
9
|
import android.graphics.drawable.Drawable
|
|
10
|
+
import android.os.Build
|
|
10
11
|
import android.text.Editable
|
|
11
12
|
import android.text.Spannable
|
|
12
13
|
import android.text.style.ImageSpan
|
|
13
14
|
import android.util.Log
|
|
14
|
-
import androidx.core.graphics.drawable.DrawableCompat
|
|
15
15
|
import androidx.core.graphics.drawable.toDrawable
|
|
16
16
|
import androidx.core.graphics.withSave
|
|
17
17
|
import com.swmansion.enriched.R
|
|
18
|
-
import com.swmansion.enriched.
|
|
19
|
-
import com.swmansion.enriched.
|
|
20
|
-
import com.swmansion.enriched.
|
|
21
|
-
import com.swmansion.enriched.
|
|
22
|
-
import
|
|
18
|
+
import com.swmansion.enriched.common.AsyncDrawable
|
|
19
|
+
import com.swmansion.enriched.common.ForceRedrawSpan
|
|
20
|
+
import com.swmansion.enriched.common.ResourceManager
|
|
21
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
22
|
+
import java.io.File
|
|
23
23
|
|
|
24
|
-
class EnrichedImageSpan :
|
|
24
|
+
open class EnrichedImageSpan :
|
|
25
25
|
ImageSpan,
|
|
26
26
|
EnrichedInlineSpan {
|
|
27
|
-
override val dependsOnHtmlStyle: Boolean = false
|
|
28
|
-
|
|
29
27
|
private var width: Int = 0
|
|
30
28
|
private var height: Int = 0
|
|
31
29
|
|
|
@@ -130,24 +128,12 @@ class EnrichedImageSpan :
|
|
|
130
128
|
|
|
131
129
|
fun getHeight(): Int = height
|
|
132
130
|
|
|
133
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedImageSpan = this
|
|
134
|
-
|
|
135
131
|
companion object {
|
|
136
|
-
fun
|
|
132
|
+
fun prepareDrawableForImage(
|
|
137
133
|
src: String,
|
|
138
134
|
width: Int,
|
|
139
135
|
height: Int,
|
|
140
|
-
):
|
|
141
|
-
var imgDrawable = prepareDrawableForImage(src)
|
|
142
|
-
|
|
143
|
-
if (imgDrawable == null) {
|
|
144
|
-
imgDrawable = ResourceManager.getDrawableResource(R.drawable.broken_image)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return EnrichedImageSpan(imgDrawable, src, width, height)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
private fun prepareDrawableForImage(src: String): Drawable? {
|
|
136
|
+
): Drawable? {
|
|
151
137
|
var cleanPath = src
|
|
152
138
|
|
|
153
139
|
if (cleanPath.startsWith("http://") || cleanPath.startsWith("https://")) {
|
|
@@ -158,22 +144,41 @@ class EnrichedImageSpan :
|
|
|
158
144
|
cleanPath = cleanPath.substring(7)
|
|
159
145
|
}
|
|
160
146
|
|
|
161
|
-
|
|
147
|
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
|
|
148
|
+
return try {
|
|
149
|
+
val bitmap = BitmapFactory.decodeFile(cleanPath) ?: return null
|
|
150
|
+
val drawable = bitmap.toDrawable(Resources.getSystem())
|
|
151
|
+
drawable.setBounds(0, 0, bitmap.width, bitmap.height)
|
|
152
|
+
return drawable
|
|
153
|
+
} catch (e: Exception) {
|
|
154
|
+
Log.e("EnrichedImageSpan", "Failed to load legacy image: $cleanPath", e)
|
|
155
|
+
null
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return try {
|
|
160
|
+
val file = File(cleanPath)
|
|
161
|
+
val source = ImageDecoder.createSource(file)
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
val
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
163
|
+
val density = Resources.getSystem().displayMetrics.density
|
|
164
|
+
val targetWidthPx = (width * density).toInt()
|
|
165
|
+
val targetHeightPx = (height * density).toInt()
|
|
166
|
+
|
|
167
|
+
val drawable =
|
|
168
|
+
ImageDecoder.decodeDrawable(source) { decoder, info, source ->
|
|
169
|
+
decoder.setTargetSize(targetWidthPx, targetHeightPx)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (drawable is AnimatedImageDrawable) {
|
|
173
|
+
drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
|
|
174
|
+
drawable.repeatCount = AnimatedImageDrawable.REPEAT_INFINITE
|
|
175
|
+
drawable.start()
|
|
170
176
|
}
|
|
177
|
+
drawable
|
|
171
178
|
} catch (e: Exception) {
|
|
172
|
-
|
|
173
|
-
|
|
179
|
+
Log.e("EnrichedImageSpan", "Failed to load image: $cleanPath", e)
|
|
180
|
+
null
|
|
174
181
|
}
|
|
175
|
-
|
|
176
|
-
return drawable
|
|
177
182
|
}
|
|
178
183
|
}
|
|
179
184
|
}
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.graphics.Typeface
|
|
4
4
|
import android.text.TextPaint
|
|
5
5
|
import android.text.style.MetricAffectingSpan
|
|
6
|
-
import com.swmansion.enriched.
|
|
7
|
-
import com.swmansion.enriched.
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
8
8
|
|
|
9
|
-
class EnrichedInlineCodeSpan(
|
|
10
|
-
private val
|
|
9
|
+
open class EnrichedInlineCodeSpan(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
11
|
) : MetricAffectingSpan(),
|
|
12
12
|
EnrichedInlineSpan {
|
|
13
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
14
|
-
|
|
15
13
|
override fun updateDrawState(textPaint: TextPaint) {
|
|
16
14
|
val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
|
|
17
15
|
textPaint.typeface = typeface
|
|
18
|
-
textPaint.color =
|
|
19
|
-
textPaint.bgColor =
|
|
16
|
+
textPaint.color = enrichedStyle.inlineCodeColor
|
|
17
|
+
textPaint.bgColor = enrichedStyle.inlineCodeBackgroundColor
|
|
20
18
|
}
|
|
21
19
|
|
|
22
20
|
override fun updateMeasureState(textPaint: TextPaint) {
|
|
23
21
|
val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
|
|
24
22
|
textPaint.typeface = typeface
|
|
25
23
|
}
|
|
26
|
-
|
|
27
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedInlineCodeSpan = EnrichedInlineCodeSpan(htmlStyle)
|
|
28
24
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.graphics.Typeface
|
|
4
|
+
import android.text.style.StyleSpan
|
|
5
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
6
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
7
|
+
|
|
8
|
+
@Suppress("UNUSED_PARAMETER")
|
|
9
|
+
open class EnrichedItalicSpan(
|
|
10
|
+
private val enrichedStyle: EnrichedStyle,
|
|
11
|
+
) : StyleSpan(Typeface.ITALIC),
|
|
12
|
+
EnrichedInlineSpan
|
package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt
RENAMED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.text.TextPaint
|
|
4
4
|
import android.text.style.ClickableSpan
|
|
5
5
|
import android.view.View
|
|
6
|
-
import com.swmansion.enriched.
|
|
7
|
-
import com.swmansion.enriched.
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
8
8
|
|
|
9
|
-
class EnrichedLinkSpan(
|
|
9
|
+
open class EnrichedLinkSpan(
|
|
10
10
|
private val url: String,
|
|
11
|
-
private val
|
|
11
|
+
private val enrichedStyle: EnrichedStyle,
|
|
12
12
|
) : ClickableSpan(),
|
|
13
13
|
EnrichedInlineSpan {
|
|
14
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
15
|
-
|
|
16
14
|
override fun onClick(view: View) {
|
|
17
15
|
// Do nothing, links inside the input are not clickable.
|
|
18
16
|
// We are using `ClickableSpan` to allow the text to be styled as a link.
|
|
@@ -20,11 +18,9 @@ class EnrichedLinkSpan(
|
|
|
20
18
|
|
|
21
19
|
override fun updateDrawState(textPaint: TextPaint) {
|
|
22
20
|
super.updateDrawState(textPaint)
|
|
23
|
-
textPaint.color =
|
|
24
|
-
textPaint.isUnderlineText =
|
|
21
|
+
textPaint.color = enrichedStyle.aColor
|
|
22
|
+
textPaint.isUnderlineText = enrichedStyle.aUnderline
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
fun getUrl(): String = url
|
|
28
|
-
|
|
29
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedLinkSpan = EnrichedLinkSpan(url, htmlStyle)
|
|
30
26
|
}
|
package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt
RENAMED
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.text.TextPaint
|
|
4
4
|
import android.text.style.ClickableSpan
|
|
5
5
|
import android.view.View
|
|
6
|
-
import com.swmansion.enriched.
|
|
7
|
-
import com.swmansion.enriched.
|
|
6
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
7
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
8
8
|
|
|
9
|
-
class EnrichedMentionSpan(
|
|
9
|
+
open class EnrichedMentionSpan(
|
|
10
10
|
private val text: String,
|
|
11
11
|
private val indicator: String,
|
|
12
12
|
private val attributes: Map<String, String>,
|
|
13
|
-
private val
|
|
13
|
+
private val enrichedStyle: EnrichedStyle,
|
|
14
14
|
) : ClickableSpan(),
|
|
15
15
|
EnrichedInlineSpan {
|
|
16
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
17
|
-
|
|
18
16
|
override fun onClick(view: View) {
|
|
19
17
|
// Do nothing. Mentions inside the input are not clickable.
|
|
20
18
|
// We are using `ClickableSpan` to allow the text to be styled as a clickable element.
|
|
@@ -23,7 +21,7 @@ class EnrichedMentionSpan(
|
|
|
23
21
|
override fun updateDrawState(textPaint: TextPaint) {
|
|
24
22
|
super.updateDrawState(textPaint)
|
|
25
23
|
|
|
26
|
-
val mentionsStyle =
|
|
24
|
+
val mentionsStyle = enrichedStyle.mentionsStyle[indicator] ?: return
|
|
27
25
|
textPaint.color = mentionsStyle.color
|
|
28
26
|
textPaint.bgColor = mentionsStyle.backgroundColor
|
|
29
27
|
textPaint.isUnderlineText = mentionsStyle.underline
|
|
@@ -34,6 +32,4 @@ class EnrichedMentionSpan(
|
|
|
34
32
|
fun getText(): String = text
|
|
35
33
|
|
|
36
34
|
fun getIndicator(): String = indicator
|
|
37
|
-
|
|
38
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedMentionSpan = EnrichedMentionSpan(text, indicator, attributes, htmlStyle)
|
|
39
35
|
}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
|
-
package com.swmansion.enriched.spans
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
2
|
|
|
3
3
|
import android.graphics.Canvas
|
|
4
4
|
import android.graphics.Paint
|
|
5
5
|
import android.graphics.Typeface
|
|
6
|
+
import android.os.Build
|
|
6
7
|
import android.text.Layout
|
|
7
8
|
import android.text.TextPaint
|
|
8
9
|
import android.text.style.LeadingMarginSpan
|
|
9
10
|
import android.text.style.MetricAffectingSpan
|
|
10
|
-
import com.swmansion.enriched.
|
|
11
|
-
import com.swmansion.enriched.
|
|
11
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
12
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
|
|
12
13
|
|
|
13
|
-
class EnrichedOrderedListSpan(
|
|
14
|
-
|
|
15
|
-
private val
|
|
14
|
+
open class EnrichedOrderedListSpan(
|
|
15
|
+
var index: Int,
|
|
16
|
+
private val enrichedStyle: EnrichedStyle,
|
|
16
17
|
) : MetricAffectingSpan(),
|
|
17
18
|
LeadingMarginSpan,
|
|
18
19
|
EnrichedParagraphSpan {
|
|
19
|
-
override val dependsOnHtmlStyle: Boolean = true
|
|
20
|
-
|
|
21
20
|
override fun updateMeasureState(p0: TextPaint) {
|
|
22
21
|
// Do nothing, but inform layout that this span affects text metrics
|
|
23
22
|
}
|
|
@@ -26,7 +25,7 @@ class EnrichedOrderedListSpan(
|
|
|
26
25
|
// Do nothing, but inform layout that this span affects text metrics
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
override fun getLeadingMargin(first: Boolean): Int =
|
|
28
|
+
override fun getLeadingMargin(first: Boolean): Int = enrichedStyle.olMarginLeft + enrichedStyle.olGapWidth
|
|
30
29
|
|
|
31
30
|
override fun drawLeadingMargin(
|
|
32
31
|
canvas: Canvas,
|
|
@@ -47,13 +46,13 @@ class EnrichedOrderedListSpan(
|
|
|
47
46
|
val width = paint.measureText(text)
|
|
48
47
|
|
|
49
48
|
val yPosition = baseline.toFloat()
|
|
50
|
-
val xPosition = (
|
|
49
|
+
val xPosition = (enrichedStyle.olMarginLeft + x - width / 2) * dir
|
|
51
50
|
|
|
52
51
|
val originalColor = paint.color
|
|
53
52
|
val originalTypeface = paint.typeface
|
|
54
53
|
|
|
55
|
-
paint.color =
|
|
56
|
-
paint.typeface = getTypeface(
|
|
54
|
+
paint.color = enrichedStyle.olMarkerColor ?: originalColor
|
|
55
|
+
paint.typeface = getTypeface(enrichedStyle.olMarkerFontWeight, originalTypeface)
|
|
57
56
|
canvas.drawText(text, xPosition, yPosition, paint)
|
|
58
57
|
|
|
59
58
|
paint.color = originalColor
|
|
@@ -67,7 +66,7 @@ class EnrichedOrderedListSpan(
|
|
|
67
66
|
): Typeface =
|
|
68
67
|
if (fontWeight == null) {
|
|
69
68
|
originalTypeface
|
|
70
|
-
} else if (
|
|
69
|
+
} else if (Build.VERSION.SDK_INT >= 28) {
|
|
71
70
|
Typeface.create(originalTypeface, fontWeight, false)
|
|
72
71
|
} else {
|
|
73
72
|
// Fallback for API < 28: only bold/normal supported
|
|
@@ -77,12 +76,4 @@ class EnrichedOrderedListSpan(
|
|
|
77
76
|
Typeface.create(originalTypeface, Typeface.NORMAL)
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
|
-
|
|
81
|
-
fun getIndex(): Int = index
|
|
82
|
-
|
|
83
|
-
fun setIndex(i: Int) {
|
|
84
|
-
index = i
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedOrderedListSpan = EnrichedOrderedListSpan(index, htmlStyle)
|
|
88
79
|
}
|
package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.text.style.StrikethroughSpan
|
|
4
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
5
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
6
|
+
|
|
7
|
+
@Suppress("UNUSED_PARAMETER")
|
|
8
|
+
open class EnrichedStrikeThroughSpan(
|
|
9
|
+
private val enrichedStyle: EnrichedStyle,
|
|
10
|
+
) : StrikethroughSpan(),
|
|
11
|
+
EnrichedInlineSpan
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
package com.swmansion.enriched.common.spans
|
|
2
|
+
|
|
3
|
+
import android.text.style.UnderlineSpan
|
|
4
|
+
import com.swmansion.enriched.common.EnrichedStyle
|
|
5
|
+
import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
|
|
6
|
+
|
|
7
|
+
@Suppress("UNUSED_PARAMETER")
|
|
8
|
+
open class EnrichedUnderlineSpan(
|
|
9
|
+
private val enrichedStyle: EnrichedStyle,
|
|
10
|
+
) : UnderlineSpan(),
|
|
11
|
+
EnrichedInlineSpan
|