react-native-enriched 0.2.1 → 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 (263) hide show
  1. package/README.md +21 -16
  2. package/android/build.gradle +77 -72
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerDelegate.java +21 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedTextInputViewManagerInterface.java +7 -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/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
  8. package/android/generated/jni/react/renderer/components/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
  9. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
  10. package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
  11. package/android/gradle.properties +5 -5
  12. package/android/lint.gradle +70 -0
  13. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewPackage.kt → ReactNativeEnrichedPackage.kt} +4 -5
  14. package/android/src/main/java/com/swmansion/enriched/{utils → common}/AsyncDrawable.kt +50 -15
  15. package/android/src/main/java/com/swmansion/enriched/common/CheckboxDrawable.kt +81 -0
  16. package/android/src/main/java/com/swmansion/enriched/common/EnrichedConstants.kt +11 -0
  17. package/android/src/main/java/com/swmansion/enriched/common/EnrichedStyle.kt +57 -0
  18. package/android/src/main/java/com/swmansion/enriched/{spans/utils → common}/ForceRedrawSpan.kt +3 -2
  19. package/android/src/main/java/com/swmansion/enriched/common/MentionStyle.kt +7 -0
  20. package/android/src/main/java/com/swmansion/enriched/{utils → common}/ResourceManager.kt +1 -1
  21. package/android/src/main/java/com/swmansion/enriched/{utils → common/parser}/EnrichedParser.java +228 -160
  22. package/android/src/main/java/com/swmansion/enriched/common/parser/EnrichedSpanFactory.kt +79 -0
  23. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBlockQuoteSpan.kt +53 -0
  24. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedBoldSpan.kt +12 -0
  25. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedCheckboxListSpan.kt +91 -0
  26. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedCodeBlockSpan.kt +12 -14
  27. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH1Span.kt +20 -0
  28. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH2Span.kt +20 -0
  29. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH3Span.kt +20 -0
  30. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH4Span.kt +21 -0
  31. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH5Span.kt +20 -0
  32. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedH6Span.kt +20 -0
  33. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedImageSpan.kt +68 -51
  34. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedInlineCodeSpan.kt +24 -0
  35. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedItalicSpan.kt +12 -0
  36. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedLinkSpan.kt +26 -0
  37. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedMentionSpan.kt +35 -0
  38. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedOrderedListSpan.kt +21 -29
  39. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedStrikeThroughSpan.kt +11 -0
  40. package/android/src/main/java/com/swmansion/enriched/common/spans/EnrichedUnderlineSpan.kt +11 -0
  41. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/EnrichedUnorderedListSpan.kt +13 -17
  42. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedBlockSpan.kt +5 -0
  43. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedHeadingSpan.kt +3 -0
  44. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedInlineSpan.kt +3 -0
  45. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedParagraphSpan.kt +5 -0
  46. package/android/src/main/java/com/swmansion/enriched/common/spans/interfaces/EnrichedSpan.kt +3 -0
  47. package/android/src/main/java/com/swmansion/enriched/{spans → common/spans}/interfaces/EnrichedZeroWidthSpaceSpan.kt +2 -3
  48. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputConnectionWrapper.kt +140 -0
  49. package/android/src/main/java/com/swmansion/enriched/textinput/EnrichedTextInputSpannableFactory.kt +83 -0
  50. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputView.kt → textinput/EnrichedTextInputView.kt} +322 -157
  51. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewLayoutManager.kt → textinput/EnrichedTextInputViewLayoutManager.kt} +4 -2
  52. package/android/src/main/java/com/swmansion/enriched/{EnrichedTextInputViewManager.kt → textinput/EnrichedTextInputViewManager.kt} +182 -66
  53. package/android/src/main/java/com/swmansion/enriched/{MeasurementStore.kt → textinput/MeasurementStore.kt} +75 -25
  54. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/MentionHandler.kt +22 -12
  55. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeHtmlEvent.kt +27 -0
  56. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnChangeSelectionEvent.kt +11 -10
  57. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeStateEvent.kt +21 -0
  58. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnChangeTextEvent.kt +30 -0
  59. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputBlurEvent.kt +25 -0
  60. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputFocusEvent.kt +25 -0
  61. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnInputKeyPressEvent.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnLinkDetectedEvent.kt +32 -0
  63. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionDetectedEvent.kt +11 -10
  64. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnMentionEvent.kt +10 -9
  65. package/android/src/main/java/com/swmansion/enriched/textinput/events/OnPasteImagesEvent.kt +47 -0
  66. package/android/src/main/java/com/swmansion/enriched/{events → textinput/events}/OnRequestHtmlResultEvent.kt +2 -3
  67. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBlockQuoteSpan.kt +14 -0
  68. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputBoldSpan.kt +14 -0
  69. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCheckboxListSpan.kt +15 -0
  70. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputCodeBlockSpan.kt +14 -0
  71. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH1Span.kt +14 -0
  72. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH2Span.kt +14 -0
  73. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH3Span.kt +14 -0
  74. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH4Span.kt +14 -0
  75. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH5Span.kt +14 -0
  76. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputH6Span.kt +14 -0
  77. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputImageSpan.kt +36 -0
  78. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputInlineCodeSpan.kt +14 -0
  79. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputItalicSpan.kt +14 -0
  80. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputLinkSpan.kt +15 -0
  81. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputMentionSpan.kt +18 -0
  82. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputOrderedListSpan.kt +21 -0
  83. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputStrikeThroughSpan.kt +14 -0
  84. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnderlineSpan.kt +14 -0
  85. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedInputUnorderedListSpan.kt +14 -0
  86. package/android/src/main/java/com/swmansion/enriched/textinput/spans/EnrichedSpans.kt +241 -0
  87. package/android/src/main/java/com/swmansion/enriched/textinput/spans/interfaces/EnrichedInputSpan.kt +10 -0
  88. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/HtmlStyle.kt +129 -57
  89. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/InlineStyles.kt +30 -13
  90. package/android/src/main/java/com/swmansion/enriched/textinput/styles/ListStyles.kt +263 -0
  91. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParagraphStyles.kt +94 -34
  92. package/android/src/main/java/com/swmansion/enriched/{styles → textinput/styles}/ParametrizedStyles.kt +143 -67
  93. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedEditableFactory.kt +17 -0
  94. package/android/src/main/java/com/swmansion/enriched/{utils → textinput/utils}/EnrichedSelection.kt +84 -54
  95. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpanState.kt +304 -0
  96. package/android/src/main/java/com/swmansion/enriched/{utils/Utils.kt → textinput/utils/EnrichedSpannable.kt} +22 -31
  97. package/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannableStringBuilder.kt +16 -0
  98. package/android/src/main/java/com/swmansion/enriched/textinput/utils/RichContentReceiver.kt +127 -0
  99. package/android/src/main/java/com/swmansion/enriched/textinput/utils/Utils.kt +106 -0
  100. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedSpanWatcher.kt +56 -24
  101. package/android/src/main/java/com/swmansion/enriched/{watchers → textinput/watchers}/EnrichedTextWatcher.kt +37 -14
  102. package/android/src/main/new_arch/CMakeLists.txt +7 -1
  103. package/android/src/main/new_arch/ReactNativeEnrichedSpec.cpp +11 -0
  104. package/android/src/main/new_arch/ReactNativeEnrichedSpec.h +15 -0
  105. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.h +1 -1
  106. package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.h +2 -2
  107. package/android/src/main/new_arch/react/renderer/components/ReactNativeEnrichedSpec/conversions.h +46 -0
  108. package/ios/EnrichedTextInputView.h +2 -1
  109. package/ios/EnrichedTextInputView.mm +603 -60
  110. package/ios/config/InputConfig.h +28 -0
  111. package/ios/config/InputConfig.mm +237 -8
  112. package/ios/extensions/ImageExtension.h +35 -0
  113. package/ios/extensions/ImageExtension.mm +156 -0
  114. package/ios/{utils → extensions}/LayoutManagerExtension.mm +115 -95
  115. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.cpp +1 -1
  116. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ComponentDescriptors.h +1 -1
  117. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.cpp +276 -0
  118. package/ios/generated/ReactNativeEnrichedSpec/EventEmitters.h +239 -0
  119. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.cpp +10 -0
  120. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/Props.h +251 -0
  121. package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/RCTComponentViewHelpers.h +95 -0
  122. package/ios/inputParser/InputParser.mm +218 -18
  123. package/ios/inputTextView/InputTextView.mm +118 -0
  124. package/ios/{attachments → interfaces}/ImageAttachment.h +1 -0
  125. package/ios/interfaces/ImageAttachment.mm +46 -0
  126. package/ios/interfaces/LinkRegexConfig.h +19 -0
  127. package/ios/interfaces/LinkRegexConfig.mm +37 -0
  128. package/ios/{utils → interfaces}/MentionStyleProps.mm +2 -2
  129. package/ios/{utils → interfaces}/StyleHeaders.h +22 -1
  130. package/ios/{utils → interfaces}/StyleTypeEnum.h +4 -0
  131. package/ios/internals/EnrichedTextInputViewState.cpp +6 -6
  132. package/ios/styles/BlockQuoteStyle.mm +5 -5
  133. package/ios/styles/BoldStyle.mm +21 -6
  134. package/ios/styles/CheckboxListStyle.mm +321 -0
  135. package/ios/styles/CodeBlockStyle.mm +5 -5
  136. package/ios/styles/H1Style.mm +3 -0
  137. package/ios/styles/H2Style.mm +3 -0
  138. package/ios/styles/H3Style.mm +3 -0
  139. package/ios/styles/H4Style.mm +20 -0
  140. package/ios/styles/H5Style.mm +20 -0
  141. package/ios/styles/H6Style.mm +20 -0
  142. package/ios/styles/HeadingStyleBase.mm +161 -72
  143. package/ios/styles/ImageStyle.mm +5 -5
  144. package/ios/styles/InlineCodeStyle.mm +30 -19
  145. package/ios/styles/ItalicStyle.mm +5 -5
  146. package/ios/styles/LinkStyle.mm +98 -40
  147. package/ios/styles/MentionStyle.mm +4 -4
  148. package/ios/styles/OrderedListStyle.mm +5 -5
  149. package/ios/styles/StrikethroughStyle.mm +5 -5
  150. package/ios/styles/UnderlineStyle.mm +5 -5
  151. package/ios/styles/UnorderedListStyle.mm +5 -5
  152. package/ios/utils/CheckboxHitTestUtils.h +10 -0
  153. package/ios/utils/CheckboxHitTestUtils.mm +123 -0
  154. package/ios/utils/ParagraphAttributesUtils.h +4 -0
  155. package/ios/utils/ParagraphAttributesUtils.mm +142 -45
  156. package/ios/utils/ParagraphsUtils.mm +4 -4
  157. package/ios/utils/TextBlockTapGestureRecognizer.h +17 -0
  158. package/ios/utils/TextBlockTapGestureRecognizer.mm +56 -0
  159. package/ios/utils/ZeroWidthSpaceUtils.mm +14 -3
  160. package/lib/module/EnrichedTextInput.js +57 -11
  161. package/lib/module/EnrichedTextInput.js.map +1 -1
  162. package/lib/module/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
  163. package/lib/module/types.js +4 -0
  164. package/lib/module/types.js.map +1 -0
  165. package/lib/module/{normalizeHtmlStyle.js → utils/normalizeHtmlStyle.js} +18 -0
  166. package/lib/module/utils/normalizeHtmlStyle.js.map +1 -0
  167. package/lib/module/utils/nullthrows.js +9 -0
  168. package/lib/module/utils/nullthrows.js.map +1 -0
  169. package/lib/module/utils/regexParser.js +46 -0
  170. package/lib/module/utils/regexParser.js.map +1 -0
  171. package/lib/typescript/src/EnrichedTextInput.d.ts +20 -51
  172. package/lib/typescript/src/EnrichedTextInput.d.ts.map +1 -1
  173. package/lib/typescript/src/index.d.ts +2 -1
  174. package/lib/typescript/src/index.d.ts.map +1 -1
  175. package/lib/typescript/src/{EnrichedTextInputNativeComponent.d.ts → spec/EnrichedTextInputNativeComponent.d.ts} +154 -18
  176. package/lib/typescript/src/spec/EnrichedTextInputNativeComponent.d.ts.map +1 -0
  177. package/lib/typescript/src/types.d.ts +58 -0
  178. package/lib/typescript/src/types.d.ts.map +1 -0
  179. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts +4 -0
  180. package/lib/typescript/src/utils/normalizeHtmlStyle.d.ts.map +1 -0
  181. package/lib/typescript/src/utils/nullthrows.d.ts +2 -0
  182. package/lib/typescript/src/utils/nullthrows.d.ts.map +1 -0
  183. package/lib/typescript/src/utils/regexParser.d.ts +3 -0
  184. package/lib/typescript/src/utils/regexParser.d.ts.map +1 -0
  185. package/package.json +13 -9
  186. package/src/EnrichedTextInput.tsx +88 -63
  187. package/src/index.tsx +5 -1
  188. package/src/{EnrichedTextInputNativeComponent.ts → spec/EnrichedTextInputNativeComponent.ts} +175 -18
  189. package/src/types.ts +59 -0
  190. package/src/{normalizeHtmlStyle.ts → utils/normalizeHtmlStyle.ts} +20 -5
  191. package/src/utils/nullthrows.ts +7 -0
  192. package/src/utils/regexParser.ts +56 -0
  193. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
  194. package/android/generated/jni/react/renderer/components/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
  195. package/android/src/main/java/com/swmansion/enriched/events/OnChangeHtmlEvent.kt +0 -28
  196. package/android/src/main/java/com/swmansion/enriched/events/OnChangeStateEvent.kt +0 -24
  197. package/android/src/main/java/com/swmansion/enriched/events/OnChangeTextEvent.kt +0 -30
  198. package/android/src/main/java/com/swmansion/enriched/events/OnInputBlurEvent.kt +0 -27
  199. package/android/src/main/java/com/swmansion/enriched/events/OnInputFocusEvent.kt +0 -27
  200. package/android/src/main/java/com/swmansion/enriched/events/OnLinkDetectedEvent.kt +0 -30
  201. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBlockQuoteSpan.kt +0 -44
  202. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedBoldSpan.kt +0 -16
  203. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH1Span.kt +0 -23
  204. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH2Span.kt +0 -23
  205. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedH3Span.kt +0 -23
  206. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedInlineCodeSpan.kt +0 -27
  207. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedItalicSpan.kt +0 -15
  208. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedLinkSpan.kt +0 -30
  209. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedMentionSpan.kt +0 -42
  210. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedSpans.kt +0 -136
  211. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedStrikeThroughSpan.kt +0 -14
  212. package/android/src/main/java/com/swmansion/enriched/spans/EnrichedUnderlineSpan.kt +0 -14
  213. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedBlockSpan.kt +0 -4
  214. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedHeadingSpan.kt +0 -4
  215. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedInlineSpan.kt +0 -4
  216. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedParagraphSpan.kt +0 -4
  217. package/android/src/main/java/com/swmansion/enriched/spans/interfaces/EnrichedSpan.kt +0 -8
  218. package/android/src/main/java/com/swmansion/enriched/styles/ListStyles.kt +0 -172
  219. package/android/src/main/java/com/swmansion/enriched/utils/EnrichedSpanState.kt +0 -204
  220. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.cpp +0 -22
  221. package/android/src/main/new_arch/RNEnrichedTextInputViewSpec.h +0 -26
  222. package/android/src/main/new_arch/react/renderer/components/RNEnrichedTextInputViewSpec/conversions.h +0 -26
  223. package/ios/attachments/ImageAttachment.mm +0 -34
  224. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.cpp +0 -128
  225. package/ios/generated/RNEnrichedTextInputViewSpec/EventEmitters.h +0 -102
  226. package/lib/module/normalizeHtmlStyle.js.map +0 -1
  227. package/lib/typescript/src/EnrichedTextInputNativeComponent.d.ts.map +0 -1
  228. package/lib/typescript/src/normalizeHtmlStyle.d.ts +0 -4
  229. package/lib/typescript/src/normalizeHtmlStyle.d.ts.map +0 -1
  230. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  231. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  232. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  233. /package/android/generated/jni/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  234. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputComponentDescriptor.h +0 -0
  235. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputMeasurementManager.cpp +0 -0
  236. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputShadowNode.cpp +0 -0
  237. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.cpp +0 -0
  238. /package/android/src/main/new_arch/react/renderer/components/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/EnrichedTextInputState.h +0 -0
  239. /package/ios/{utils → extensions}/ColorExtension.h +0 -0
  240. /package/ios/{utils → extensions}/ColorExtension.mm +0 -0
  241. /package/ios/{utils → extensions}/FontExtension.h +0 -0
  242. /package/ios/{utils → extensions}/FontExtension.mm +0 -0
  243. /package/ios/{utils → extensions}/LayoutManagerExtension.h +0 -0
  244. /package/ios/{utils → extensions}/StringExtension.h +0 -0
  245. /package/ios/{utils → extensions}/StringExtension.mm +0 -0
  246. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.cpp +0 -0
  247. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/ShadowNodes.h +0 -0
  248. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.cpp +0 -0
  249. /package/ios/generated/{RNEnrichedTextInputViewSpec → ReactNativeEnrichedSpec}/States.h +0 -0
  250. /package/ios/{utils → interfaces}/BaseStyleProtocol.h +0 -0
  251. /package/ios/{utils → interfaces}/ImageData.h +0 -0
  252. /package/ios/{utils → interfaces}/ImageData.mm +0 -0
  253. /package/ios/{utils → interfaces}/LinkData.h +0 -0
  254. /package/ios/{utils → interfaces}/LinkData.mm +0 -0
  255. /package/ios/{attachments → interfaces}/MediaAttachment.h +0 -0
  256. /package/ios/{attachments → interfaces}/MediaAttachment.mm +0 -0
  257. /package/ios/{utils → interfaces}/MentionParams.h +0 -0
  258. /package/ios/{utils → interfaces}/MentionParams.mm +0 -0
  259. /package/ios/{utils → interfaces}/MentionStyleProps.h +0 -0
  260. /package/ios/{utils → interfaces}/StylePair.h +0 -0
  261. /package/ios/{utils → interfaces}/StylePair.mm +0 -0
  262. /package/ios/{utils → interfaces}/TextDecorationLineEnum.h +0 -0
  263. /package/ios/{utils → interfaces}/TextDecorationLineEnum.mm +0 -0
@@ -0,0 +1,79 @@
1
+ package com.swmansion.enriched.common.parser
2
+
3
+ import com.swmansion.enriched.common.spans.EnrichedBlockQuoteSpan
4
+ import com.swmansion.enriched.common.spans.EnrichedBoldSpan
5
+ import com.swmansion.enriched.common.spans.EnrichedCheckboxListSpan
6
+ import com.swmansion.enriched.common.spans.EnrichedCodeBlockSpan
7
+ import com.swmansion.enriched.common.spans.EnrichedH1Span
8
+ import com.swmansion.enriched.common.spans.EnrichedH2Span
9
+ import com.swmansion.enriched.common.spans.EnrichedH3Span
10
+ import com.swmansion.enriched.common.spans.EnrichedH4Span
11
+ import com.swmansion.enriched.common.spans.EnrichedH5Span
12
+ import com.swmansion.enriched.common.spans.EnrichedH6Span
13
+ import com.swmansion.enriched.common.spans.EnrichedImageSpan
14
+ import com.swmansion.enriched.common.spans.EnrichedInlineCodeSpan
15
+ import com.swmansion.enriched.common.spans.EnrichedItalicSpan
16
+ import com.swmansion.enriched.common.spans.EnrichedLinkSpan
17
+ import com.swmansion.enriched.common.spans.EnrichedMentionSpan
18
+ import com.swmansion.enriched.common.spans.EnrichedOrderedListSpan
19
+ import com.swmansion.enriched.common.spans.EnrichedStrikeThroughSpan
20
+ import com.swmansion.enriched.common.spans.EnrichedUnderlineSpan
21
+ import com.swmansion.enriched.common.spans.EnrichedUnorderedListSpan
22
+
23
+ interface EnrichedSpanFactory<T> {
24
+ fun createBoldSpan(style: T): EnrichedBoldSpan
25
+
26
+ fun createItalicSpan(style: T): EnrichedItalicSpan
27
+
28
+ fun createUnderlineSpan(style: T): EnrichedUnderlineSpan
29
+
30
+ fun createStrikeThroughSpan(style: T): EnrichedStrikeThroughSpan
31
+
32
+ fun createInlineCodeSpan(style: T): EnrichedInlineCodeSpan
33
+
34
+ fun createLinkSpan(
35
+ url: String,
36
+ style: T,
37
+ ): EnrichedLinkSpan
38
+
39
+ fun createMentionSpan(
40
+ text: String,
41
+ indicator: String,
42
+ attributes: Map<String, String>,
43
+ style: T,
44
+ ): EnrichedMentionSpan
45
+
46
+ fun createImageSpan(
47
+ source: String,
48
+ width: Int,
49
+ height: Int,
50
+ ): EnrichedImageSpan
51
+
52
+ fun createH1Span(style: T): EnrichedH1Span
53
+
54
+ fun createH2Span(style: T): EnrichedH2Span
55
+
56
+ fun createH3Span(style: T): EnrichedH3Span
57
+
58
+ fun createH4Span(style: T): EnrichedH4Span
59
+
60
+ fun createH5Span(style: T): EnrichedH5Span
61
+
62
+ fun createH6Span(style: T): EnrichedH6Span
63
+
64
+ fun createOrderedListSpan(
65
+ index: Int,
66
+ style: T,
67
+ ): EnrichedOrderedListSpan
68
+
69
+ fun createUnorderedListSpan(style: T): EnrichedUnorderedListSpan
70
+
71
+ fun createCheckboxListSpan(
72
+ isChecked: Boolean,
73
+ style: T,
74
+ ): EnrichedCheckboxListSpan
75
+
76
+ fun createBlockQuoteSpan(style: T): EnrichedBlockQuoteSpan
77
+
78
+ fun createCodeBlockSpan(style: T): EnrichedCodeBlockSpan
79
+ }
@@ -0,0 +1,53 @@
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.TextPaint
7
+ import android.text.style.LeadingMarginSpan
8
+ import android.text.style.MetricAffectingSpan
9
+ import com.swmansion.enriched.common.EnrichedStyle
10
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
11
+
12
+ // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/main/core/java/android/text/style/QuoteSpan.java
13
+ open class EnrichedBlockQuoteSpan(
14
+ private val enrichedStyle: EnrichedStyle,
15
+ ) : MetricAffectingSpan(),
16
+ LeadingMarginSpan,
17
+ EnrichedBlockSpan {
18
+ override fun updateMeasureState(p0: TextPaint) {
19
+ // Do nothing, but inform layout that this span affects text metrics
20
+ }
21
+
22
+ override fun getLeadingMargin(p0: Boolean): Int = enrichedStyle.blockquoteStripeWidth + enrichedStyle.blockquoteGapWidth
23
+
24
+ override fun drawLeadingMargin(
25
+ c: Canvas,
26
+ p: Paint,
27
+ x: Int,
28
+ dir: Int,
29
+ top: Int,
30
+ baseline: Int,
31
+ bottom: Int,
32
+ text: CharSequence?,
33
+ start: Int,
34
+ end: Int,
35
+ first: Boolean,
36
+ layout: Layout?,
37
+ ) {
38
+ val style = p.style
39
+ val color = p.color
40
+ p.style = Paint.Style.FILL
41
+ p.color = enrichedStyle.blockquoteBorderColor
42
+ c.drawRect(x.toFloat(), top.toFloat(), x + dir * enrichedStyle.blockquoteStripeWidth.toFloat(), bottom.toFloat(), p)
43
+ p.style = style
44
+ p.color = color
45
+ }
46
+
47
+ override fun updateDrawState(textPaint: TextPaint?) {
48
+ val color = enrichedStyle.blockquoteColor
49
+ if (color != null) {
50
+ textPaint?.color = color
51
+ }
52
+ }
53
+ }
@@ -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 EnrichedBoldSpan(
10
+ enrichedStyle: EnrichedStyle,
11
+ ) : StyleSpan(Typeface.BOLD),
12
+ EnrichedInlineSpan
@@ -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,15 +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
14
-
15
- class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingSpan(), LineBackgroundSpan, EnrichedBlockSpan {
16
- override val dependsOnHtmlStyle: Boolean = true
12
+ import com.swmansion.enriched.common.EnrichedStyle
13
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedBlockSpan
17
14
 
15
+ open class EnrichedCodeBlockSpan(
16
+ private val enrichedStyle: EnrichedStyle,
17
+ ) : MetricAffectingSpan(),
18
+ LineBackgroundSpan,
19
+ EnrichedBlockSpan {
18
20
  override fun updateDrawState(paint: TextPaint) {
19
21
  paint.typeface = Typeface.MONOSPACE
20
- paint.color = htmlStyle.codeBlockColor
22
+ paint.color = enrichedStyle.codeBlockColor
21
23
  }
22
24
 
23
25
  override fun updateMeasureState(paint: TextPaint) {
@@ -35,16 +37,16 @@ class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingS
35
37
  text: CharSequence,
36
38
  start: Int,
37
39
  end: Int,
38
- lineNum: Int
40
+ lineNum: Int,
39
41
  ) {
40
42
  if (text !is Spanned) {
41
43
  return
42
44
  }
43
45
 
44
46
  val previousColor = p.color
45
- p.color = htmlStyle.codeBlockBackgroundColor
47
+ p.color = enrichedStyle.codeBlockBackgroundColor
46
48
 
47
- val radius = htmlStyle.codeBlockRadius
49
+ val radius = enrichedStyle.codeBlockRadius
48
50
 
49
51
  val spanStart = text.getSpanStart(this)
50
52
  val spanEnd = text.getSpanEnd(this)
@@ -76,8 +78,4 @@ class EnrichedCodeBlockSpan(private val htmlStyle: HtmlStyle) : MetricAffectingS
76
78
  canvas.drawPath(path, p)
77
79
  p.color = previousColor
78
80
  }
79
-
80
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedCodeBlockSpan {
81
- return EnrichedCodeBlockSpan(htmlStyle)
82
- }
83
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,29 +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
- import androidx.core.graphics.withSave
16
- import com.swmansion.enriched.spans.interfaces.EnrichedInlineSpan
17
- import com.swmansion.enriched.utils.AsyncDrawable
18
15
  import androidx.core.graphics.drawable.toDrawable
16
+ import androidx.core.graphics.withSave
19
17
  import com.swmansion.enriched.R
20
- import com.swmansion.enriched.spans.utils.ForceRedrawSpan
21
- import com.swmansion.enriched.styles.HtmlStyle
22
- import com.swmansion.enriched.utils.ResourceManager
23
-
24
- class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
25
- override val dependsOnHtmlStyle: Boolean = false
26
-
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
+
24
+ open class EnrichedImageSpan :
25
+ ImageSpan,
26
+ EnrichedInlineSpan {
27
27
  private var width: Int = 0
28
28
  private var height: Int = 0
29
29
 
@@ -33,11 +33,18 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
33
33
  }
34
34
 
35
35
  override fun draw(
36
- canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float,
37
- top: Int, y: Int, bottom: Int, paint: Paint
36
+ canvas: Canvas,
37
+ text: CharSequence?,
38
+ start: Int,
39
+ end: Int,
40
+ x: Float,
41
+ top: Int,
42
+ y: Int,
43
+ bottom: Int,
44
+ paint: Paint,
38
45
  ) {
39
46
  val drawable = drawable
40
- canvas.withSave() {
47
+ canvas.withSave {
41
48
  val transY = bottom - drawable.bounds.bottom - paint.fontMetricsInt.descent
42
49
  translate(x, transY.toFloat())
43
50
  drawable.draw(this)
@@ -48,7 +55,7 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
48
55
  val drawable = super.getDrawable()
49
56
  val scale = Resources.getSystem().displayMetrics.density
50
57
 
51
- drawable.setBounds(0, 0, (width * scale).toInt() , (height * scale).toInt())
58
+ drawable.setBounds(0, 0, (width * scale).toInt(), (height * scale).toInt())
52
59
  return drawable
53
60
  }
54
61
 
@@ -57,7 +64,7 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
57
64
  text: CharSequence?,
58
65
  start: Int,
59
66
  end: Int,
60
- fm: Paint.FontMetricsInt?
67
+ fm: Paint.FontMetricsInt?,
61
68
  ): Int {
62
69
  val d = drawable
63
70
  val rect = d.bounds
@@ -79,7 +86,10 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
79
86
  return rect.right
80
87
  }
81
88
 
82
- private fun registerDrawableLoadCallback (d: AsyncDrawable, text: Editable?) {
89
+ private fun registerDrawableLoadCallback(
90
+ d: AsyncDrawable,
91
+ text: Editable?,
92
+ ) {
83
93
  d.onLoaded = onLoaded@{
84
94
  val spannable = text as? Spannable
85
95
 
@@ -114,28 +124,16 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
114
124
  }
115
125
  }
116
126
 
117
- fun getWidth(): Int {
118
- return width
119
- }
120
-
121
- fun getHeight(): Int {
122
- return height
123
- }
127
+ fun getWidth(): Int = width
124
128
 
125
- override fun rebuildWithStyle(htmlStyle: HtmlStyle): EnrichedImageSpan = this
129
+ fun getHeight(): Int = height
126
130
 
127
131
  companion object {
128
- fun createEnrichedImageSpan(src: String, width: Int, height: Int): EnrichedImageSpan {
129
- var imgDrawable = prepareDrawableForImage(src)
130
-
131
- if (imgDrawable == null) {
132
- imgDrawable = ResourceManager.getDrawableResource(R.drawable.broken_image)
133
- }
134
-
135
- return EnrichedImageSpan(imgDrawable, src, width, height)
136
- }
137
-
138
- private fun prepareDrawableForImage(src: String): Drawable? {
132
+ fun prepareDrawableForImage(
133
+ src: String,
134
+ width: Int,
135
+ height: Int,
136
+ ): Drawable? {
139
137
  var cleanPath = src
140
138
 
141
139
  if (cleanPath.startsWith("http://") || cleanPath.startsWith("https://")) {
@@ -146,22 +144,41 @@ class EnrichedImageSpan : ImageSpan, EnrichedInlineSpan {
146
144
  cleanPath = cleanPath.substring(7)
147
145
  }
148
146
 
149
- 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
+
163
+ val density = Resources.getSystem().displayMetrics.density
164
+ val targetWidthPx = (width * density).toInt()
165
+ val targetHeightPx = (height * density).toInt()
150
166
 
151
- try {
152
- val bitmap = BitmapFactory.decodeFile(cleanPath)
153
- if (bitmap != null) {
154
- drawable = bitmap.toDrawable(Resources.getSystem())
155
- // set bounds so it knows how big it is naturally,
156
- // though EnrichedImageSpan will override this with the HTML width/height later.
157
- drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight())
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()
158
176
  }
177
+ drawable
159
178
  } catch (e: Exception) {
160
- // Failed to load file
161
- Log.e("EnrichedImageSpan", "Failed to load image from path: $cleanPath", e)
179
+ Log.e("EnrichedImageSpan", "Failed to load image: $cleanPath", e)
180
+ null
162
181
  }
163
-
164
- return drawable
165
182
  }
166
183
  }
167
184
  }
@@ -0,0 +1,24 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.graphics.Typeface
4
+ import android.text.TextPaint
5
+ import android.text.style.MetricAffectingSpan
6
+ import com.swmansion.enriched.common.EnrichedStyle
7
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
8
+
9
+ open class EnrichedInlineCodeSpan(
10
+ private val enrichedStyle: EnrichedStyle,
11
+ ) : MetricAffectingSpan(),
12
+ EnrichedInlineSpan {
13
+ override fun updateDrawState(textPaint: TextPaint) {
14
+ val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
15
+ textPaint.typeface = typeface
16
+ textPaint.color = enrichedStyle.inlineCodeColor
17
+ textPaint.bgColor = enrichedStyle.inlineCodeBackgroundColor
18
+ }
19
+
20
+ override fun updateMeasureState(textPaint: TextPaint) {
21
+ val typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL)
22
+ textPaint.typeface = typeface
23
+ }
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
@@ -0,0 +1,26 @@
1
+ package com.swmansion.enriched.common.spans
2
+
3
+ import android.text.TextPaint
4
+ import android.text.style.ClickableSpan
5
+ import android.view.View
6
+ import com.swmansion.enriched.common.EnrichedStyle
7
+ import com.swmansion.enriched.common.spans.interfaces.EnrichedInlineSpan
8
+
9
+ open class EnrichedLinkSpan(
10
+ private val url: String,
11
+ private val enrichedStyle: EnrichedStyle,
12
+ ) : ClickableSpan(),
13
+ EnrichedInlineSpan {
14
+ override fun onClick(view: View) {
15
+ // Do nothing, links inside the input are not clickable.
16
+ // We are using `ClickableSpan` to allow the text to be styled as a link.
17
+ }
18
+
19
+ override fun updateDrawState(textPaint: TextPaint) {
20
+ super.updateDrawState(textPaint)
21
+ textPaint.color = enrichedStyle.aColor
22
+ textPaint.isUnderlineText = enrichedStyle.aUnderline
23
+ }
24
+
25
+ fun getUrl(): String = url
26
+ }