react-native-enriched 0.3.0 → 0.4.0

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.
Files changed (202) hide show
  1. package/README.md +6 -4
  2. package/android/build.gradle +3 -3
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +3 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +1 -0
  5. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  6. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  7. package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
  8. package/{ios/generated/RNEnrichedTextInputViewSpec → android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
  9. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
  10. package/android/gradle.properties +5 -5
  11. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +3 -2
  12. package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +40 -8
  13. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  14. package/android/src/main/java/com/swmansion/enriched/{utils → common}/EnrichedConstants.kt +1 -1
  15. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  16. package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +1 -1
  17. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  18. package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
  19. package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +126 -99
  20. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  21. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedBlockQuoteSpan.kt +9 -13
  22. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
  24. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +8 -12
  25. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  26. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  27. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  31. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +43 -38
  32. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedInlineCodeSpan.kt +7 -11
  33. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  34. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedLinkSpan.kt +7 -11
  35. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedMentionSpan.kt +6 -10
  36. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +12 -21
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  38. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  39. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +9 -13
  40. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedBlockSpan.kt +1 -1
  41. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedHeadingSpan.kt +1 -1
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  43. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedParagraphSpan.kt +1 -1
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  45. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +1 -1
  46. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputConnectionWrapper.kt → textinput/EnrichedTextInputConnectionWrapper.kt} +2 -2
  47. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  48. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +87 -51
  49. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +1 -1
  50. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +24 -17
  51. package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +5 -4
  52. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +2 -2
  53. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeHtmlEvent.kt +1 -1
  54. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +1 -1
  55. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeStateEvent.kt +1 -1
  56. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeTextEvent.kt +2 -2
  57. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputBlurEvent.kt +1 -1
  58. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputFocusEvent.kt +1 -1
  59. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnInputKeyPressEvent.kt +1 -1
  60. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnLinkDetectedEvent.kt +1 -1
  61. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +1 -1
  62. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +1 -1
  63. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  64. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +1 -1
  65. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  66. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  67. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/{spans → textinput/spans}/EnrichedSpans.kt +39 -30
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  86. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +58 -43
  87. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +4 -4
  88. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ListStyles.kt +77 -26
  89. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +11 -11
  90. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +19 -19
  91. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedEditableFactory.kt +2 -2
  92. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +15 -14
  93. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpanState.kt +15 -50
  94. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannable.kt +3 -3
  95. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSpannableStringBuilder.kt +2 -1
  96. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  97. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  98. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +10 -10
  99. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +3 -3
  100. package/android/src/main/new_arch/CMakeLists.txt +1 -1
  101. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  102. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  103. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
  104. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
  105. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/conversions.h +1 -1
  106. package/ios/EnrichedTextInputView.h +1 -0
  107. package/ios/EnrichedTextInputView.mm +266 -55
  108. package/ios/config/InputConfig.h +10 -0
  109. package/ios/config/InputConfig.mm +119 -0
  110. package/ios/extensions/ImageExtension.h +35 -0
  111. package/ios/extensions/ImageExtension.mm +156 -0
  112. package/ios/extensions/LayoutManagerExtension.mm +115 -95
  113. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  114. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  115. package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.cpp +31 -29
  116. package/{android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec → ios/generated/ReactNativeEnrichedSpec}/EventEmitters.h +22 -25
  117. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +57 -0
  118. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +21 -0
  119. package/ios/inputParser/InputParser.mm +135 -8
  120. package/ios/inputTextView/InputTextView.mm +118 -0
  121. package/ios/interfaces/ImageAttachment.h +1 -0
  122. package/ios/interfaces/ImageAttachment.mm +14 -4
  123. package/ios/interfaces/StyleHeaders.h +13 -2
  124. package/ios/interfaces/StyleTypeEnum.h +1 -0
  125. package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
  126. package/ios/styles/CheckboxListStyle.mm +321 -0
  127. package/ios/styles/H1Style.mm +3 -0
  128. package/ios/styles/H2Style.mm +3 -0
  129. package/ios/styles/H3Style.mm +3 -0
  130. package/ios/styles/H4Style.mm +3 -0
  131. package/ios/styles/H5Style.mm +3 -0
  132. package/ios/styles/H6Style.mm +3 -0
  133. package/ios/styles/HeadingStyleBase.mm +150 -78
  134. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  135. package/ios/utils/CheckboxHitTestUtils.mm +123 -0
  136. package/ios/utils/ParagraphAttributesUtils.mm +83 -53
  137. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  138. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  139. package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
  140. package/lib/module/EnrichedTextInput.js +36 -11
  141. package/lib/module/EnrichedTextInput.js.map +1 -1
  142. package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
  143. package/lib/module/types.js +4 -0
  144. package/lib/module/types.js.map +1 -0
  145. package/lib/module/utils/normalizeHtmlStyle.js +6 -0
  146. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -1
  147. package/lib/module/utils/nullthrows.js +9 -0
  148. package/lib/module/utils/nullthrows.js.map +1 -0
  149. package/lib/typescript/src/EnrichedTextInput.d.ts +9 -49
  150. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  151. package/lib/typescript/src/index.d.ts +2 -1
  152. package/lib/typescript/src/index.d.ts.map +1 -1
  153. package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +33 -8
  154. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  155. package/lib/typescript/src/types.d.ts +58 -0
  156. package/lib/typescript/src/types.d.ts.map +1 -0
  157. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +2 -2
  158. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -1
  159. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  160. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  161. package/lib/typescript/src/utils/regexParser.d.ts +1 -1
  162. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -1
  163. package/package.json +4 -4
  164. package/src/EnrichedTextInput.tsx +49 -62
  165. package/src/index.tsx +3 -1
  166. package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +40 -9
  167. package/src/types.ts +59 -0
  168. package/src/utils/normalizeHtmlStyle.ts +8 -5
  169. package/src/utils/nullthrows.ts +7 -0
  170. package/src/utils/regexParser.ts +1 -1
  171. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateDeprecatedEvent.kt +0 -21
  172. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -17
  173. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -24
  174. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -24
  175. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -24
  176. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH4Span.kt +0 -24
  177. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH5Span.kt +0 -24
  178. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH6Span.kt +0 -24
  179. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -16
  180. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -15
  181. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -15
  182. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -3
  183. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -9
  184. package/android/src/main/java/com/swmansion/enriched/utils/Utils.kt +0 -21
  185. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
  186. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
  187. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
  188. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
  189. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  190. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  191. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  192. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  193. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
  194. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
  195. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
  196. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
  197. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
  198. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +0 -0
  199. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  200. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  201. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  202. /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
+ }
@@ -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.spans.interfaces.EnrichedBlockSpan
13
- import com.swmansion.enriched.styles.HtmlStyle
12
+ import com.swmansion.enriched.common.EnrichedStyle
13
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
14
14
 
15
- class EnrichedCodeBlockSpan(
16
- private val htmlStyle: HtmlStyle,
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 = htmlStyle.codeBlockColor
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 = htmlStyle.codeBlockBackgroundColor
47
+ p.color = enrichedStyle.codeBlockBackgroundColor
50
48
 
51
- val radius = htmlStyle.codeBlockRadius
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
+ }
@@ -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.BitmapDrawable
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.spans.interfaces.EnrichedInlineSpan
19
- import com.swmansion.enriched.spans.utils.ForceRedrawSpan
20
- import com.swmansion.enriched.styles.HtmlStyle
21
- import com.swmansion.enriched.utils.AsyncDrawable
22
- import com.swmansion.enriched.utils.ResourceManager
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 createEnrichedImageSpan(
132
+ fun prepareDrawableForImage(
137
133
  src: String,
138
134
  width: Int,
139
135
  height: Int,
140
- ): EnrichedImageSpan {
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
- var drawable: BitmapDrawable? = null
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
- try {
164
- val bitmap = BitmapFactory.decodeFile(cleanPath)
165
- if (bitmap != null) {
166
- drawable = bitmap.toDrawable(Resources.getSystem())
167
- // set bounds so it knows how big it is naturally,
168
- // though EnrichedImageSpan will override this with the HTML width/height later.
169
- drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight())
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
- // Failed to load file
173
- Log.e("EnrichedImageSpan", "Failed to load image from path: $cleanPath", e)
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.spans.interfaces.EnrichedInlineSpan
7
- import com.swmansion.enriched.styles.HtmlStyle
6
+ import com.swmansion.enriched.common.EnrichedStyle
7
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
8
8
 
9
- class EnrichedInlineCodeSpan(
10
- private val htmlStyle: HtmlStyle,
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 = htmlStyle.inlineCodeColor
19
- textPaint.bgColor = htmlStyle.inlineCodeBackgroundColor
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
@@ -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.spans.interfaces.EnrichedInlineSpan
7
- import com.swmansion.enriched.styles.HtmlStyle
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 htmlStyle: HtmlStyle,
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 = htmlStyle.aColor
24
- textPaint.isUnderlineText = htmlStyle.aUnderline
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
  }
@@ -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.spans.interfaces.EnrichedInlineSpan
7
- import com.swmansion.enriched.styles.HtmlStyle
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 htmlStyle: HtmlStyle,
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 = htmlStyle.mentionsStyle[indicator] ?: return
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.spans.interfaces.EnrichedParagraphSpan
11
- import com.swmansion.enriched.styles.HtmlStyle
11
+ import com.swmansion.enriched.common.EnrichedStyle
12
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedParagraphSpan
12
13
 
13
- class EnrichedOrderedListSpan(
14
- private var index: Int,
15
- private val htmlStyle: HtmlStyle,
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 = htmlStyle.olMarginLeft + htmlStyle.olGapWidth
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 = (htmlStyle.olMarginLeft + x - width / 2) * dir
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 = htmlStyle.olMarkerColor ?: originalColor
56
- paint.typeface = getTypeface(htmlStyle.olMarkerFontWeight, originalTypeface)
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 (android.os.Build.VERSION.SDK_INT >= 28) {
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
  }
@@ -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