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
@@ -135,6 +135,123 @@ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleH3Str
135
135
  }
136
136
  #endif
137
137
 
138
+ struct EnrichedTextInputViewHtmlStyleH4Struct {
139
+ Float fontSize{0.0};
140
+ bool bold{false};
141
+
142
+ #ifdef RN_SERIALIZABLE_STATE
143
+ bool operator==(const EnrichedTextInputViewHtmlStyleH4Struct&) const = default;
144
+
145
+ folly::dynamic toDynamic() const {
146
+ folly::dynamic result = folly::dynamic::object();
147
+ result["fontSize"] = fontSize;
148
+ result["bold"] = bold;
149
+ return result;
150
+ }
151
+ #endif
152
+ };
153
+
154
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnrichedTextInputViewHtmlStyleH4Struct &result) {
155
+ auto map = (std::unordered_map<std::string, RawValue>)value;
156
+
157
+ auto tmp_fontSize = map.find("fontSize");
158
+ if (tmp_fontSize != map.end()) {
159
+ fromRawValue(context, tmp_fontSize->second, result.fontSize);
160
+ }
161
+ auto tmp_bold = map.find("bold");
162
+ if (tmp_bold != map.end()) {
163
+ fromRawValue(context, tmp_bold->second, result.bold);
164
+ }
165
+ }
166
+
167
+ static inline std::string toString(const EnrichedTextInputViewHtmlStyleH4Struct &value) {
168
+ return "[Object EnrichedTextInputViewHtmlStyleH4Struct]";
169
+ }
170
+
171
+ #ifdef RN_SERIALIZABLE_STATE
172
+ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleH4Struct &value) {
173
+ return value.toDynamic();
174
+ }
175
+ #endif
176
+
177
+ struct EnrichedTextInputViewHtmlStyleH5Struct {
178
+ Float fontSize{0.0};
179
+ bool bold{false};
180
+
181
+ #ifdef RN_SERIALIZABLE_STATE
182
+ bool operator==(const EnrichedTextInputViewHtmlStyleH5Struct&) const = default;
183
+
184
+ folly::dynamic toDynamic() const {
185
+ folly::dynamic result = folly::dynamic::object();
186
+ result["fontSize"] = fontSize;
187
+ result["bold"] = bold;
188
+ return result;
189
+ }
190
+ #endif
191
+ };
192
+
193
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnrichedTextInputViewHtmlStyleH5Struct &result) {
194
+ auto map = (std::unordered_map<std::string, RawValue>)value;
195
+
196
+ auto tmp_fontSize = map.find("fontSize");
197
+ if (tmp_fontSize != map.end()) {
198
+ fromRawValue(context, tmp_fontSize->second, result.fontSize);
199
+ }
200
+ auto tmp_bold = map.find("bold");
201
+ if (tmp_bold != map.end()) {
202
+ fromRawValue(context, tmp_bold->second, result.bold);
203
+ }
204
+ }
205
+
206
+ static inline std::string toString(const EnrichedTextInputViewHtmlStyleH5Struct &value) {
207
+ return "[Object EnrichedTextInputViewHtmlStyleH5Struct]";
208
+ }
209
+
210
+ #ifdef RN_SERIALIZABLE_STATE
211
+ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleH5Struct &value) {
212
+ return value.toDynamic();
213
+ }
214
+ #endif
215
+
216
+ struct EnrichedTextInputViewHtmlStyleH6Struct {
217
+ Float fontSize{0.0};
218
+ bool bold{false};
219
+
220
+ #ifdef RN_SERIALIZABLE_STATE
221
+ bool operator==(const EnrichedTextInputViewHtmlStyleH6Struct&) const = default;
222
+
223
+ folly::dynamic toDynamic() const {
224
+ folly::dynamic result = folly::dynamic::object();
225
+ result["fontSize"] = fontSize;
226
+ result["bold"] = bold;
227
+ return result;
228
+ }
229
+ #endif
230
+ };
231
+
232
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnrichedTextInputViewHtmlStyleH6Struct &result) {
233
+ auto map = (std::unordered_map<std::string, RawValue>)value;
234
+
235
+ auto tmp_fontSize = map.find("fontSize");
236
+ if (tmp_fontSize != map.end()) {
237
+ fromRawValue(context, tmp_fontSize->second, result.fontSize);
238
+ }
239
+ auto tmp_bold = map.find("bold");
240
+ if (tmp_bold != map.end()) {
241
+ fromRawValue(context, tmp_bold->second, result.bold);
242
+ }
243
+ }
244
+
245
+ static inline std::string toString(const EnrichedTextInputViewHtmlStyleH6Struct &value) {
246
+ return "[Object EnrichedTextInputViewHtmlStyleH6Struct]";
247
+ }
248
+
249
+ #ifdef RN_SERIALIZABLE_STATE
250
+ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleH6Struct &value) {
251
+ return value.toDynamic();
252
+ }
253
+ #endif
254
+
138
255
  struct EnrichedTextInputViewHtmlStyleBlockquoteStruct {
139
256
  SharedColor borderColor{};
140
257
  Float borderWidth{0.0};
@@ -411,10 +528,64 @@ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleUlStr
411
528
  }
412
529
  #endif
413
530
 
531
+ struct EnrichedTextInputViewHtmlStyleUlCheckboxStruct {
532
+ Float gapWidth{0.0};
533
+ Float boxSize{0.0};
534
+ Float marginLeft{0.0};
535
+ SharedColor boxColor{};
536
+
537
+ #ifdef RN_SERIALIZABLE_STATE
538
+ bool operator==(const EnrichedTextInputViewHtmlStyleUlCheckboxStruct&) const = default;
539
+
540
+ folly::dynamic toDynamic() const {
541
+ folly::dynamic result = folly::dynamic::object();
542
+ result["gapWidth"] = gapWidth;
543
+ result["boxSize"] = boxSize;
544
+ result["marginLeft"] = marginLeft;
545
+ result["boxColor"] = ::facebook::react::toDynamic(boxColor);
546
+ return result;
547
+ }
548
+ #endif
549
+ };
550
+
551
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnrichedTextInputViewHtmlStyleUlCheckboxStruct &result) {
552
+ auto map = (std::unordered_map<std::string, RawValue>)value;
553
+
554
+ auto tmp_gapWidth = map.find("gapWidth");
555
+ if (tmp_gapWidth != map.end()) {
556
+ fromRawValue(context, tmp_gapWidth->second, result.gapWidth);
557
+ }
558
+ auto tmp_boxSize = map.find("boxSize");
559
+ if (tmp_boxSize != map.end()) {
560
+ fromRawValue(context, tmp_boxSize->second, result.boxSize);
561
+ }
562
+ auto tmp_marginLeft = map.find("marginLeft");
563
+ if (tmp_marginLeft != map.end()) {
564
+ fromRawValue(context, tmp_marginLeft->second, result.marginLeft);
565
+ }
566
+ auto tmp_boxColor = map.find("boxColor");
567
+ if (tmp_boxColor != map.end()) {
568
+ fromRawValue(context, tmp_boxColor->second, result.boxColor);
569
+ }
570
+ }
571
+
572
+ static inline std::string toString(const EnrichedTextInputViewHtmlStyleUlCheckboxStruct &value) {
573
+ return "[Object EnrichedTextInputViewHtmlStyleUlCheckboxStruct]";
574
+ }
575
+
576
+ #ifdef RN_SERIALIZABLE_STATE
577
+ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleUlCheckboxStruct &value) {
578
+ return value.toDynamic();
579
+ }
580
+ #endif
581
+
414
582
  struct EnrichedTextInputViewHtmlStyleStruct {
415
583
  EnrichedTextInputViewHtmlStyleH1Struct h1{};
416
584
  EnrichedTextInputViewHtmlStyleH2Struct h2{};
417
585
  EnrichedTextInputViewHtmlStyleH3Struct h3{};
586
+ EnrichedTextInputViewHtmlStyleH4Struct h4{};
587
+ EnrichedTextInputViewHtmlStyleH5Struct h5{};
588
+ EnrichedTextInputViewHtmlStyleH6Struct h6{};
418
589
  EnrichedTextInputViewHtmlStyleBlockquoteStruct blockquote{};
419
590
  EnrichedTextInputViewHtmlStyleCodeblockStruct codeblock{};
420
591
  EnrichedTextInputViewHtmlStyleCodeStruct code{};
@@ -422,6 +593,7 @@ struct EnrichedTextInputViewHtmlStyleStruct {
422
593
  folly::dynamic mention{};
423
594
  EnrichedTextInputViewHtmlStyleOlStruct ol{};
424
595
  EnrichedTextInputViewHtmlStyleUlStruct ul{};
596
+ EnrichedTextInputViewHtmlStyleUlCheckboxStruct ulCheckbox{};
425
597
 
426
598
  #ifdef RN_SERIALIZABLE_STATE
427
599
  bool operator==(const EnrichedTextInputViewHtmlStyleStruct&) const = default;
@@ -431,6 +603,9 @@ struct EnrichedTextInputViewHtmlStyleStruct {
431
603
  result["h1"] = ::facebook::react::toDynamic(h1);
432
604
  result["h2"] = ::facebook::react::toDynamic(h2);
433
605
  result["h3"] = ::facebook::react::toDynamic(h3);
606
+ result["h4"] = ::facebook::react::toDynamic(h4);
607
+ result["h5"] = ::facebook::react::toDynamic(h5);
608
+ result["h6"] = ::facebook::react::toDynamic(h6);
434
609
  result["blockquote"] = ::facebook::react::toDynamic(blockquote);
435
610
  result["codeblock"] = ::facebook::react::toDynamic(codeblock);
436
611
  result["code"] = ::facebook::react::toDynamic(code);
@@ -438,6 +613,7 @@ struct EnrichedTextInputViewHtmlStyleStruct {
438
613
  result["mention"] = mention;
439
614
  result["ol"] = ::facebook::react::toDynamic(ol);
440
615
  result["ul"] = ::facebook::react::toDynamic(ul);
616
+ result["ulCheckbox"] = ::facebook::react::toDynamic(ulCheckbox);
441
617
  return result;
442
618
  }
443
619
  #endif
@@ -458,6 +634,18 @@ static inline void fromRawValue(const PropsParserContext& context, const RawValu
458
634
  if (tmp_h3 != map.end()) {
459
635
  fromRawValue(context, tmp_h3->second, result.h3);
460
636
  }
637
+ auto tmp_h4 = map.find("h4");
638
+ if (tmp_h4 != map.end()) {
639
+ fromRawValue(context, tmp_h4->second, result.h4);
640
+ }
641
+ auto tmp_h5 = map.find("h5");
642
+ if (tmp_h5 != map.end()) {
643
+ fromRawValue(context, tmp_h5->second, result.h5);
644
+ }
645
+ auto tmp_h6 = map.find("h6");
646
+ if (tmp_h6 != map.end()) {
647
+ fromRawValue(context, tmp_h6->second, result.h6);
648
+ }
461
649
  auto tmp_blockquote = map.find("blockquote");
462
650
  if (tmp_blockquote != map.end()) {
463
651
  fromRawValue(context, tmp_blockquote->second, result.blockquote);
@@ -486,6 +674,10 @@ static inline void fromRawValue(const PropsParserContext& context, const RawValu
486
674
  if (tmp_ul != map.end()) {
487
675
  fromRawValue(context, tmp_ul->second, result.ul);
488
676
  }
677
+ auto tmp_ulCheckbox = map.find("ulCheckbox");
678
+ if (tmp_ulCheckbox != map.end()) {
679
+ fromRawValue(context, tmp_ulCheckbox->second, result.ulCheckbox);
680
+ }
489
681
  }
490
682
 
491
683
  static inline std::string toString(const EnrichedTextInputViewHtmlStyleStruct &value) {
@@ -497,6 +689,63 @@ static inline folly::dynamic toDynamic(const EnrichedTextInputViewHtmlStyleStruc
497
689
  return value.toDynamic();
498
690
  }
499
691
  #endif
692
+
693
+ struct EnrichedTextInputViewLinkRegexStruct {
694
+ std::string pattern{};
695
+ bool caseInsensitive{false};
696
+ bool dotAll{false};
697
+ bool isDisabled{false};
698
+ bool isDefault{false};
699
+
700
+ #ifdef RN_SERIALIZABLE_STATE
701
+ bool operator==(const EnrichedTextInputViewLinkRegexStruct&) const = default;
702
+
703
+ folly::dynamic toDynamic() const {
704
+ folly::dynamic result = folly::dynamic::object();
705
+ result["pattern"] = pattern;
706
+ result["caseInsensitive"] = caseInsensitive;
707
+ result["dotAll"] = dotAll;
708
+ result["isDisabled"] = isDisabled;
709
+ result["isDefault"] = isDefault;
710
+ return result;
711
+ }
712
+ #endif
713
+ };
714
+
715
+ static inline void fromRawValue(const PropsParserContext& context, const RawValue &value, EnrichedTextInputViewLinkRegexStruct &result) {
716
+ auto map = (std::unordered_map<std::string, RawValue>)value;
717
+
718
+ auto tmp_pattern = map.find("pattern");
719
+ if (tmp_pattern != map.end()) {
720
+ fromRawValue(context, tmp_pattern->second, result.pattern);
721
+ }
722
+ auto tmp_caseInsensitive = map.find("caseInsensitive");
723
+ if (tmp_caseInsensitive != map.end()) {
724
+ fromRawValue(context, tmp_caseInsensitive->second, result.caseInsensitive);
725
+ }
726
+ auto tmp_dotAll = map.find("dotAll");
727
+ if (tmp_dotAll != map.end()) {
728
+ fromRawValue(context, tmp_dotAll->second, result.dotAll);
729
+ }
730
+ auto tmp_isDisabled = map.find("isDisabled");
731
+ if (tmp_isDisabled != map.end()) {
732
+ fromRawValue(context, tmp_isDisabled->second, result.isDisabled);
733
+ }
734
+ auto tmp_isDefault = map.find("isDefault");
735
+ if (tmp_isDefault != map.end()) {
736
+ fromRawValue(context, tmp_isDefault->second, result.isDefault);
737
+ }
738
+ }
739
+
740
+ static inline std::string toString(const EnrichedTextInputViewLinkRegexStruct &value) {
741
+ return "[Object EnrichedTextInputViewLinkRegexStruct]";
742
+ }
743
+
744
+ #ifdef RN_SERIALIZABLE_STATE
745
+ static inline folly::dynamic toDynamic(const EnrichedTextInputViewLinkRegexStruct &value) {
746
+ return value.toDynamic();
747
+ }
748
+ #endif
500
749
  class EnrichedTextInputViewProps final : public ViewProps {
501
750
  public:
502
751
  EnrichedTextInputViewProps() = default;
@@ -515,12 +764,14 @@ class EnrichedTextInputViewProps final : public ViewProps {
515
764
  std::string autoCapitalize{};
516
765
  EnrichedTextInputViewHtmlStyleStruct htmlStyle{};
517
766
  bool scrollEnabled{false};
767
+ EnrichedTextInputViewLinkRegexStruct linkRegex{};
518
768
  SharedColor color{};
519
769
  Float fontSize{0.0};
520
770
  std::string fontFamily{};
521
771
  std::string fontWeight{};
522
772
  std::string fontStyle{};
523
773
  bool isOnChangeHtmlSet{false};
774
+ bool isOnChangeTextSet{false};
524
775
  bool androidExperimentalSynchronousEvents{false};
525
776
 
526
777
  #ifdef RN_SERIALIZABLE_STATE
@@ -1,5 +1,5 @@
1
- EnrichedTextInput_kotlinVersion=2.0.21
2
- EnrichedTextInput_minSdkVersion=24
3
- EnrichedTextInput_targetSdkVersion=34
4
- EnrichedTextInput_compileSdkVersion=35
5
- EnrichedTextInput__ndkVersion=27.1.12297006
1
+ ReactNativeEnriched_kotlinVersion=2.0.21
2
+ ReactNativeEnriched_minSdkVersion=24
3
+ ReactNativeEnriched_targetSdkVersion=34
4
+ ReactNativeEnriched_compileSdkVersion=35
5
+ ReactNativeEnriched_ndkVersion=27.1.12297006
@@ -0,0 +1,70 @@
1
+ apply plugin: "org.jlleitschuh.gradle.ktlint"
2
+ apply plugin: 'com.diffplug.spotless'
3
+
4
+ ktlint {
5
+ version = "1.8.0"
6
+ verbose = true
7
+ outputToConsole = true
8
+ coloredOutput = true
9
+ android = true
10
+ enableExperimentalRules = true
11
+
12
+ reporters {
13
+ reporter "plain"
14
+ reporter "checkstyle"
15
+ reporter "html"
16
+ }
17
+
18
+ filter {
19
+ exclude("**/generated/**")
20
+ exclude("**/build/**")
21
+ exclude("**/node_modules/**")
22
+
23
+ include("src/**/*.kt")
24
+ include("src/**/*.kts")
25
+ }
26
+ }
27
+
28
+ spotless {
29
+ kotlin {
30
+ target 'src/**/*.kt', 'src/**/*.kts'
31
+ ktlint("1.8.0")
32
+ trimTrailingWhitespace()
33
+ endWithNewline()
34
+ lineEndings 'UNIX'
35
+ targetExclude '**/generated/**', '**/build/**', '**/node_modules/**'
36
+ }
37
+
38
+ java {
39
+ target 'src/**/*.java'
40
+ googleJavaFormat("1.23.0")
41
+ removeUnusedImports()
42
+ trimTrailingWhitespace()
43
+ endWithNewline()
44
+ leadingTabsToSpaces(2)
45
+ lineEndings 'UNIX'
46
+ targetExclude '**/generated/**', '**/build/**', '**/node_modules/**'
47
+ }
48
+
49
+ groovyGradle {
50
+ target '*.gradle', 'gradle/*.gradle'
51
+ greclipse()
52
+ trimTrailingWhitespace()
53
+ endWithNewline()
54
+ }
55
+ }
56
+
57
+ tasks.register('lintFormat') {
58
+ group = "formatting"
59
+ description = "Auto-fix all code formatting issues"
60
+ dependsOn 'ktlintFormat', 'spotlessApply'
61
+ }
62
+
63
+ tasks.register('lintVerify') {
64
+ group = "verification"
65
+ description = "Verify code is properly formatted"
66
+ dependsOn 'ktlintCheck', 'spotlessCheck'
67
+ doLast {
68
+ println "✓ All code formatting checks passed!"
69
+ }
70
+ }
@@ -4,10 +4,11 @@ import com.facebook.react.ReactPackage
4
4
  import com.facebook.react.bridge.NativeModule
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.uimanager.ViewManager
7
- import com.swmansion.enriched.utils.ResourceManager
7
+ import com.swmansion.enriched.common.ResourceManager
8
+ import com.swmansion.enriched.textinput.EnrichedTextInputViewManager
8
9
  import java.util.ArrayList
9
10
 
10
- class EnrichedTextInputViewPackage : ReactPackage {
11
+ class ReactNativeEnrichedPackage : ReactPackage {
11
12
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
12
13
  ResourceManager.init(reactContext.applicationContext)
13
14
  val viewManagers: MutableList<ViewManager<*, *>> = ArrayList()
@@ -15,7 +16,5 @@ class EnrichedTextInputViewPackage : ReactPackage {
15
16
  return viewManagers
16
17
  }
17
18
 
18
- override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
19
- return emptyList()
20
- }
19
+ override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> = emptyList()
21
20
  }
@@ -1,24 +1,25 @@
1
- package com.swmansion.enriched.utils
1
+ package com.swmansion.enriched.common
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
7
6
  import android.graphics.Color
8
7
  import android.graphics.ColorFilter
8
+ import android.graphics.ImageDecoder
9
9
  import android.graphics.PixelFormat
10
+ import android.graphics.drawable.AnimatedImageDrawable
10
11
  import android.graphics.drawable.Drawable
12
+ import android.os.Build
11
13
  import android.os.Handler
12
14
  import android.os.Looper
13
15
  import android.util.Log
14
- import androidx.core.content.res.ResourcesCompat
15
- import androidx.core.graphics.drawable.DrawableCompat
16
- import java.net.URL
17
- import java.util.concurrent.Executors
18
16
  import androidx.core.graphics.drawable.toDrawable
19
17
  import com.swmansion.enriched.R
18
+ import java.net.URL
19
+ import java.nio.ByteBuffer
20
+ import java.util.concurrent.Executors
20
21
 
21
- class AsyncDrawable (
22
+ class AsyncDrawable(
22
23
  private val url: String,
23
24
  ) : Drawable() {
24
25
  private var internalDrawable: Drawable = Color.TRANSPARENT.toDrawable()
@@ -37,13 +38,12 @@ class AsyncDrawable (
37
38
  try {
38
39
  isLoaded = false
39
40
  val inputStream = URL(url).openStream()
40
- val bitmap = BitmapFactory.decodeStream(inputStream)
41
+ val bytes = inputStream.readBytes()
42
+ val d = prepareDrawable(bytes)
41
43
 
42
44
  // Switch to Main Thread to update UI
43
45
  mainHandler.post {
44
- if (bitmap != null) {
45
- val d = bitmap.toDrawable(Resources.getSystem())
46
-
46
+ if (d != null) {
47
47
  d.bounds = bounds
48
48
  internalDrawable = d
49
49
  } else {
@@ -61,6 +61,38 @@ class AsyncDrawable (
61
61
  }
62
62
  }
63
63
 
64
+ private fun prepareDrawable(bytes: ByteArray): Drawable? {
65
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
66
+ try {
67
+ val buffer = ByteBuffer.wrap(bytes)
68
+ val source = ImageDecoder.createSource(buffer)
69
+
70
+ val drawable =
71
+ ImageDecoder.decodeDrawable(source) { decoder, _, _ ->
72
+ decoder.setTargetSize(bounds.width(), bounds.height())
73
+ }
74
+
75
+ if (drawable is AnimatedImageDrawable) {
76
+ drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
77
+ drawable.repeatCount = AnimatedImageDrawable.REPEAT_INFINITE
78
+ drawable.start()
79
+ }
80
+
81
+ return drawable
82
+ } catch (e: Exception) {
83
+ Log.w("AsyncDrawable", "ImageDecoder failed, falling back to Bitmap", e)
84
+ }
85
+ }
86
+
87
+ // Fallback to bitmap if ImageDecoder fails
88
+ return try {
89
+ val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
90
+ bitmap?.toDrawable(Resources.getSystem())
91
+ } catch (_: Exception) {
92
+ null
93
+ }
94
+ }
95
+
64
96
  private fun loadPlaceholderImage() {
65
97
  internalDrawable = ResourceManager.getDrawableResource(R.drawable.broken_image)
66
98
  }
@@ -78,11 +110,14 @@ class AsyncDrawable (
78
110
  }
79
111
 
80
112
  @Deprecated("Deprecated in Java")
81
- override fun getOpacity(): Int {
82
- return PixelFormat.TRANSLUCENT
83
- }
113
+ override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
84
114
 
85
- override fun setBounds(left: Int, top: Int, right: Int, bottom: Int) {
115
+ override fun setBounds(
116
+ left: Int,
117
+ top: Int,
118
+ right: Int,
119
+ bottom: Int,
120
+ ) {
86
121
  super.setBounds(left, top, right, bottom)
87
122
  internalDrawable.setBounds(left, top, right, bottom)
88
123
  }
@@ -0,0 +1,81 @@
1
+ package com.swmansion.enriched.common
2
+
3
+ import android.graphics.Canvas
4
+ import android.graphics.ColorFilter
5
+ import android.graphics.Paint
6
+ import android.graphics.Path
7
+ import android.graphics.PixelFormat
8
+ import android.graphics.PorterDuff
9
+ import android.graphics.PorterDuffXfermode
10
+ import android.graphics.drawable.Drawable
11
+
12
+ class CheckboxDrawable(
13
+ private val size: Int,
14
+ private var color: Int,
15
+ private var isChecked: Boolean,
16
+ ) : Drawable() {
17
+ private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
18
+ private val path = Path()
19
+
20
+ fun update(checked: Boolean) {
21
+ this.isChecked = checked
22
+ invalidateSelf()
23
+ }
24
+
25
+ override fun draw(canvas: Canvas) {
26
+ val saveCount = canvas.saveLayer(0f, 0f, size.toFloat(), size.toFloat(), null)
27
+
28
+ paint.color = color
29
+ paint.style = Paint.Style.FILL
30
+
31
+ // Full square background with transparent checkmark
32
+ if (isChecked) {
33
+ val cornerRadius = size * 0.15f
34
+ canvas.drawRoundRect(0f, 0f, size.toFloat(), size.toFloat(), cornerRadius, cornerRadius, paint)
35
+
36
+ paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.XOR)
37
+ paint.strokeWidth = size * 0.15f
38
+ paint.style = Paint.Style.STROKE
39
+ paint.strokeCap = Paint.Cap.ROUND
40
+ paint.strokeJoin = Paint.Join.ROUND
41
+
42
+ path.reset()
43
+ path.moveTo(size * 0.25f, size * 0.5f)
44
+ path.lineTo(size * 0.45f, size * 0.7f)
45
+ path.lineTo(size * 0.75f, size * 0.3f)
46
+ canvas.drawPath(path, paint)
47
+
48
+ paint.xfermode = null
49
+ canvas.restoreToCount(saveCount)
50
+ return
51
+ }
52
+
53
+ // Border only square for unchecked state
54
+ paint.style = Paint.Style.STROKE
55
+ paint.strokeWidth = size * 0.1f
56
+ val margin = paint.strokeWidth / 2f
57
+ val cornerRadius = size * 0.15f
58
+ canvas.drawRoundRect(
59
+ margin,
60
+ margin,
61
+ size - margin,
62
+ size - margin,
63
+ cornerRadius,
64
+ cornerRadius,
65
+ paint,
66
+ )
67
+
68
+ canvas.restoreToCount(saveCount)
69
+ }
70
+
71
+ override fun setAlpha(alpha: Int) {
72
+ paint.alpha = alpha
73
+ }
74
+
75
+ override fun setColorFilter(colorFilter: ColorFilter?) {
76
+ paint.colorFilter = colorFilter
77
+ }
78
+
79
+ @Deprecated("Deprecated in Java")
80
+ override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
81
+ }
@@ -0,0 +1,11 @@
1
+ package com.swmansion.enriched.common
2
+
3
+ object EnrichedConstants {
4
+ // Zero Width Space
5
+ const val ZWS = '\u200B'
6
+ const val ZWS_STRING = "\u200B"
7
+
8
+ // Object Replacement Character
9
+ const val ORC = '\uFFFC'
10
+ const val ORC_STRING = "\uFFFC"
11
+ }
@@ -0,0 +1,57 @@
1
+ package com.swmansion.enriched.common
2
+
3
+ interface EnrichedStyle {
4
+ // Headers
5
+ val h1FontSize: Int
6
+ val h1Bold: Boolean
7
+ val h2FontSize: Int
8
+ val h2Bold: Boolean
9
+ val h3FontSize: Int
10
+ val h3Bold: Boolean
11
+ val h4FontSize: Int
12
+ val h4Bold: Boolean
13
+ val h5FontSize: Int
14
+ val h5Bold: Boolean
15
+ val h6FontSize: Int
16
+ val h6Bold: Boolean
17
+
18
+ // Blockquote
19
+ val blockquoteColor: Int?
20
+ val blockquoteBorderColor: Int
21
+ val blockquoteStripeWidth: Int
22
+ val blockquoteGapWidth: Int
23
+
24
+ // Ordered Lists
25
+ val olGapWidth: Int
26
+ val olMarginLeft: Int
27
+ val olMarkerFontWeight: Int?
28
+ val olMarkerColor: Int?
29
+
30
+ // Unordered Lists
31
+ val ulGapWidth: Int
32
+ val ulMarginLeft: Int
33
+ val ulBulletSize: Int
34
+ val ulBulletColor: Int
35
+
36
+ // Checkbox list
37
+ val ulCheckboxBoxSize: Int
38
+ val ulCheckboxGapWidth: Int
39
+ val ulCheckboxMarginLeft: Int
40
+ val ulCheckboxBoxColor: Int
41
+
42
+ // Links
43
+ val aColor: Int
44
+ val aUnderline: Boolean
45
+
46
+ // Code Blocks
47
+ val codeBlockColor: Int
48
+ val codeBlockBackgroundColor: Int
49
+ val codeBlockRadius: Float
50
+
51
+ // Inline Code
52
+ val inlineCodeColor: Int
53
+ val inlineCodeBackgroundColor: Int
54
+
55
+ // Mentions
56
+ val mentionsStyle: Map<String, MentionStyle>
57
+ }
@@ -1,12 +1,13 @@
1
- package com.swmansion.enriched.spans.utils
1
+ package com.swmansion.enriched.common
2
2
 
3
3
  import android.text.TextPaint
4
4
  import android.text.style.MetricAffectingSpan
5
5
 
6
- class ForceRedrawSpan: MetricAffectingSpan() {
6
+ class ForceRedrawSpan : MetricAffectingSpan() {
7
7
  override fun updateMeasureState(tp: TextPaint) {
8
8
  // Do nothing, we don't actually want to change how it looks
9
9
  }
10
+
10
11
  override fun updateDrawState(tp: TextPaint?) {
11
12
  // Do nothing
12
13
  }