@apollohg/react-native-rich-text-editor 2.0.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 (494) hide show
  1. package/LICENSE +160 -0
  2. package/README.md +259 -0
  3. package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
  4. package/ReactNativeProseEditor.podspec +59 -0
  5. package/THIRD_PARTY_NOTICES.md +31155 -0
  6. package/android/build.gradle +188 -0
  7. package/android/consumer-rules.pro +18 -0
  8. package/android/expo/build.gradle +17 -0
  9. package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
  10. package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
  11. package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
  12. package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
  13. package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
  14. package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
  15. package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
  16. package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
  17. package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
  18. package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
  19. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
  20. package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
  21. package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
  22. package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
  23. package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
  24. package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
  25. package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
  26. package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
  27. package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
  28. package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
  29. package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
  30. package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
  31. package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
  32. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
  33. package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
  34. package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
  35. package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
  36. package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
  37. package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
  38. package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
  39. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
  40. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
  41. package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
  42. package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
  43. package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
  44. package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
  45. package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
  46. package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
  47. package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
  48. package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
  49. package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
  50. package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
  51. package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
  52. package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
  53. package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
  54. package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
  55. package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
  56. package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
  57. package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
  58. package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
  59. package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
  60. package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
  61. package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
  62. package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
  63. package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
  64. package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
  65. package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
  66. package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
  67. package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
  68. package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
  69. package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
  70. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
  71. package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
  72. package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
  73. package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
  74. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
  75. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
  76. package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
  77. package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
  78. package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
  79. package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
  80. package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
  81. package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
  82. package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
  83. package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
  84. package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
  85. package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
  86. package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
  87. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
  88. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
  89. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
  90. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
  91. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
  92. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
  93. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
  94. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
  95. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
  96. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
  97. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
  98. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
  99. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
  100. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
  101. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
  102. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
  103. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
  104. package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
  105. package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
  106. package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
  107. package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
  108. package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
  109. package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
  110. package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
  111. package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
  112. package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
  113. package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
  114. package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
  115. package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
  116. package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
  117. package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
  118. package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
  119. package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
  120. package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
  121. package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
  122. package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
  123. package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
  124. package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
  125. package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
  126. package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
  127. package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
  128. package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
  129. package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
  130. package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
  131. package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
  132. package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
  133. package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
  134. package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
  135. package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
  136. package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
  137. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
  138. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
  139. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
  140. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
  141. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
  142. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
  143. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
  144. package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
  145. package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
  146. package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
  147. package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
  148. package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
  149. package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
  150. package/android/src/main/jni/CMakeLists.txt +85 -0
  151. package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
  152. package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
  153. package/android/src/main/jni/reactnativeproseeditor.h +6 -0
  154. package/android/src/main/res/values/attrs.xml +6 -0
  155. package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
  156. package/app.plugin.js +62 -0
  157. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
  158. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
  159. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
  160. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
  161. package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
  162. package/dist/AtomHost.d.ts +17 -0
  163. package/dist/AtomHost.js +135 -0
  164. package/dist/DefaultAtomChip.d.ts +2 -0
  165. package/dist/DefaultAtomChip.js +22 -0
  166. package/dist/EditorAddon.d.ts +32 -0
  167. package/dist/EditorAddon.js +29 -0
  168. package/dist/EditorAddonNormalization.d.ts +6 -0
  169. package/dist/EditorAddonNormalization.js +48 -0
  170. package/dist/EditorMentionThemeNormalization.d.ts +8 -0
  171. package/dist/EditorMentionThemeNormalization.js +22 -0
  172. package/dist/EditorMentionThemeValidation.d.ts +12 -0
  173. package/dist/EditorMentionThemeValidation.js +95 -0
  174. package/dist/EditorStyleSheet.d.ts +4 -0
  175. package/dist/EditorStyleSheet.js +10 -0
  176. package/dist/EditorStyleSheetNormalization.d.ts +3 -0
  177. package/dist/EditorStyleSheetNormalization.js +226 -0
  178. package/dist/EditorStyleSheetTypes.d.ts +151 -0
  179. package/dist/EditorStyleSheetTypes.js +2 -0
  180. package/dist/EditorTheme.d.ts +117 -0
  181. package/dist/EditorTheme.js +41 -0
  182. package/dist/EditorToolbar.d.ts +4 -0
  183. package/dist/EditorToolbar.js +17 -0
  184. package/dist/EditorToolbarComponent.d.ts +13 -0
  185. package/dist/EditorToolbarComponent.js +24 -0
  186. package/dist/EditorToolbarItems.d.ts +9 -0
  187. package/dist/EditorToolbarItems.js +58 -0
  188. package/dist/EditorToolbarRegistry.d.ts +59 -0
  189. package/dist/EditorToolbarRegistry.js +175 -0
  190. package/dist/EditorToolbarTypes.d.ts +273 -0
  191. package/dist/EditorToolbarTypes.js +2 -0
  192. package/dist/EditorToolbarVisuals.d.ts +154 -0
  193. package/dist/EditorToolbarVisuals.js +228 -0
  194. package/dist/EditorUpdateRevision.d.ts +8 -0
  195. package/dist/EditorUpdateRevision.js +22 -0
  196. package/dist/ExternalTextComposition.d.ts +45 -0
  197. package/dist/ExternalTextComposition.js +537 -0
  198. package/dist/ImageLoadingPolicy.d.ts +54 -0
  199. package/dist/ImageLoadingPolicy.js +60 -0
  200. package/dist/NativeEditorBoundaryError.d.ts +111 -0
  201. package/dist/NativeEditorBoundaryError.js +268 -0
  202. package/dist/NativeEditorBridge.d.ts +9 -0
  203. package/dist/NativeEditorBridge.js +37 -0
  204. package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
  205. package/dist/NativeEditorCollaborationTransport.js +275 -0
  206. package/dist/NativeEditorCreateConfig.d.ts +16 -0
  207. package/dist/NativeEditorCreateConfig.js +249 -0
  208. package/dist/NativeEditorCreateJson.d.ts +76 -0
  209. package/dist/NativeEditorCreateJson.js +474 -0
  210. package/dist/NativeEditorCreateValidation.d.ts +32 -0
  211. package/dist/NativeEditorCreateValidation.js +150 -0
  212. package/dist/NativeEditorDocumentBridge.d.ts +72 -0
  213. package/dist/NativeEditorDocumentBridge.js +305 -0
  214. package/dist/NativeEditorDocumentHandle.d.ts +70 -0
  215. package/dist/NativeEditorDocumentHandle.js +89 -0
  216. package/dist/NativeEditorLocalAwareness.d.ts +34 -0
  217. package/dist/NativeEditorLocalAwareness.js +153 -0
  218. package/dist/NativeEditorNativeModule.d.ts +48 -0
  219. package/dist/NativeEditorNativeModule.js +34 -0
  220. package/dist/NativeEditorRenderNormalization.d.ts +22 -0
  221. package/dist/NativeEditorRenderNormalization.js +274 -0
  222. package/dist/NativeEditorResultNormalization.d.ts +108 -0
  223. package/dist/NativeEditorResultNormalization.js +400 -0
  224. package/dist/NativeEditorTypes.d.ts +318 -0
  225. package/dist/NativeEditorTypes.js +15 -0
  226. package/dist/NativeEditorV2Decimal.d.ts +5 -0
  227. package/dist/NativeEditorV2Decimal.js +18 -0
  228. package/dist/NativeProseViewer.d.ts +122 -0
  229. package/dist/NativeProseViewer.js +130 -0
  230. package/dist/NativeRichTextEditor.d.ts +3 -0
  231. package/dist/NativeRichTextEditor.js +6 -0
  232. package/dist/ResourceLimits.d.ts +100 -0
  233. package/dist/ResourceLimits.js +80 -0
  234. package/dist/RichTextEditor.d.ts +4 -0
  235. package/dist/RichTextEditor.js +25 -0
  236. package/dist/RichTextEditorNativeTypes.d.ts +122 -0
  237. package/dist/RichTextEditorNativeTypes.js +2 -0
  238. package/dist/RichTextEditorNativeView.d.ts +12 -0
  239. package/dist/RichTextEditorNativeView.js +15 -0
  240. package/dist/RichTextEditorSerialization.d.ts +53 -0
  241. package/dist/RichTextEditorSerialization.js +283 -0
  242. package/dist/RichTextEditorTypes.d.ts +281 -0
  243. package/dist/RichTextEditorTypes.js +2 -0
  244. package/dist/ViewerConfiguration.d.ts +22 -0
  245. package/dist/ViewerConfiguration.js +6 -0
  246. package/dist/YjsCollaboration.d.ts +146 -0
  247. package/dist/YjsCollaboration.js +496 -0
  248. package/dist/addons.d.ts +193 -0
  249. package/dist/addons.js +122 -0
  250. package/dist/atomConstants.d.ts +3 -0
  251. package/dist/atomConstants.js +6 -0
  252. package/dist/atomInstances.d.ts +35 -0
  253. package/dist/atomInstances.js +79 -0
  254. package/dist/atomPolicy.d.ts +4 -0
  255. package/dist/atomPolicy.js +47 -0
  256. package/dist/atomUpdates.d.ts +2 -0
  257. package/dist/atomUpdates.js +38 -0
  258. package/dist/atoms.d.ts +92 -0
  259. package/dist/atoms.js +222 -0
  260. package/dist/attributeValidation.d.ts +4 -0
  261. package/dist/attributeValidation.js +97 -0
  262. package/dist/contentExpression.d.ts +6 -0
  263. package/dist/contentExpression.js +335 -0
  264. package/dist/index.d.ts +21 -0
  265. package/dist/index.js +78 -0
  266. package/dist/listMarkers.d.ts +15 -0
  267. package/dist/listMarkers.js +21 -0
  268. package/dist/schemaDefinition.d.ts +143 -0
  269. package/dist/schemaDefinition.js +206 -0
  270. package/dist/schemaDocument.d.ts +17 -0
  271. package/dist/schemaDocument.js +69 -0
  272. package/dist/schemaDocumentConstruction.d.ts +5 -0
  273. package/dist/schemaDocumentConstruction.js +125 -0
  274. package/dist/schemaNormalization.d.ts +29 -0
  275. package/dist/schemaNormalization.js +313 -0
  276. package/dist/schemaPresets.d.ts +68 -0
  277. package/dist/schemaPresets.js +198 -0
  278. package/dist/schemaResolution.d.ts +9 -0
  279. package/dist/schemaResolution.js +211 -0
  280. package/dist/schemas.d.ts +5 -0
  281. package/dist/schemas.js +28 -0
  282. package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
  283. package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
  284. package/dist/useEditorToolbarInteractions.d.ts +12 -0
  285. package/dist/useEditorToolbarInteractions.js +218 -0
  286. package/dist/useEditorToolbarItems.d.ts +8 -0
  287. package/dist/useEditorToolbarItems.js +280 -0
  288. package/dist/useEditorToolbarPresentation.d.ts +4 -0
  289. package/dist/useEditorToolbarPresentation.js +203 -0
  290. package/dist/useEditorToolbarState.d.ts +63 -0
  291. package/dist/useEditorToolbarState.js +108 -0
  292. package/dist/useFocusPreservingFrames.d.ts +17 -0
  293. package/dist/useFocusPreservingFrames.js +108 -0
  294. package/dist/useNativeEditor.d.ts +66 -0
  295. package/dist/useNativeEditor.js +370 -0
  296. package/dist/useRichTextEditorCommands.d.ts +21 -0
  297. package/dist/useRichTextEditorCommands.js +299 -0
  298. package/dist/useRichTextEditorEvents.d.ts +18 -0
  299. package/dist/useRichTextEditorEvents.js +216 -0
  300. package/dist/useRichTextEditorMentions.d.ts +11 -0
  301. package/dist/useRichTextEditorMentions.js +316 -0
  302. package/dist/useRichTextEditorPresentation.d.ts +5 -0
  303. package/dist/useRichTextEditorPresentation.js +178 -0
  304. package/dist/useRichTextEditorState.d.ts +180 -0
  305. package/dist/useRichTextEditorState.js +405 -0
  306. package/dist/useRichTextEditorUpdates.d.ts +10 -0
  307. package/dist/useRichTextEditorUpdates.js +308 -0
  308. package/dist/useViewerAtoms.d.ts +38 -0
  309. package/dist/useViewerAtoms.js +288 -0
  310. package/expo-module.config.json +13 -0
  311. package/ios/EditorAddons.swift +354 -0
  312. package/ios/EditorCodeHighlighting.swift +184 -0
  313. package/ios/EditorCore.xcframework/Info.plist +44 -0
  314. package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
  315. package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
  316. package/ios/EditorInteractionOverlays.swift +697 -0
  317. package/ios/EditorLayoutManager.swift +971 -0
  318. package/ios/EditorNodeTypes.swift +37 -0
  319. package/ios/EditorStyleSheet.swift +461 -0
  320. package/ios/EditorTextView+AttributedPatch.swift +305 -0
  321. package/ios/EditorTextView+Binding.swift +61 -0
  322. package/ios/EditorTextView+Caret.swift +333 -0
  323. package/ios/EditorTextView+Commands.swift +203 -0
  324. package/ios/EditorTextView+Delegate.swift +65 -0
  325. package/ios/EditorTextView+Diagnostics.swift +225 -0
  326. package/ios/EditorTextView+DragDrop.swift +290 -0
  327. package/ios/EditorTextView+ExternalComposition.swift +364 -0
  328. package/ios/EditorTextView+Images.swift +354 -0
  329. package/ios/EditorTextView+InputTraits.swift +200 -0
  330. package/ios/EditorTextView+KeyboardInput.swift +318 -0
  331. package/ios/EditorTextView+Layout.swift +245 -0
  332. package/ios/EditorTextView+MarkedText.swift +267 -0
  333. package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
  334. package/ios/EditorTextView+NativeMutation.swift +471 -0
  335. package/ios/EditorTextView+Reconciliation.swift +97 -0
  336. package/ios/EditorTextView+RenderPatch.swift +573 -0
  337. package/ios/EditorTextView+Rendering.swift +539 -0
  338. package/ios/EditorTextView+Selection.swift +542 -0
  339. package/ios/EditorTextView.swift +953 -0
  340. package/ios/EditorTheme.swift +626 -0
  341. package/ios/EditorV2Adapter+Commands.swift +204 -0
  342. package/ios/EditorV2Adapter+Envelope.swift +238 -0
  343. package/ios/EditorV2Adapter+Mutation.swift +392 -0
  344. package/ios/EditorV2Adapter+Registry.swift +185 -0
  345. package/ios/EditorV2Adapter+RenderState.swift +360 -0
  346. package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
  347. package/ios/EditorV2Adapter+Selection.swift +329 -0
  348. package/ios/EditorV2Adapter+TextCommands.swift +430 -0
  349. package/ios/EditorV2Adapter.swift +376 -0
  350. package/ios/EditorV2Shadow.swift +353 -0
  351. package/ios/Generated_editor_core.swift +2378 -0
  352. package/ios/NativeCodeHighlighting.swift +159 -0
  353. package/ios/NativeCollaborationSocket.swift +144 -0
  354. package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
  355. package/ios/NativeCollaborationTransport+Socket.swift +379 -0
  356. package/ios/NativeCollaborationTransport+Validation.swift +103 -0
  357. package/ios/NativeCollaborationTransport.swift +322 -0
  358. package/ios/NativeCollaborationTransportRegistry.swift +521 -0
  359. package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
  360. package/ios/NativeEditorExpoView+Binding.swift +268 -0
  361. package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
  362. package/ios/NativeEditorExpoView+Events.swift +131 -0
  363. package/ios/NativeEditorExpoView+Focus.swift +169 -0
  364. package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
  365. package/ios/NativeEditorExpoView+Mentions.swift +288 -0
  366. package/ios/NativeEditorExpoView+Properties.swift +300 -0
  367. package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
  368. package/ios/NativeEditorExpoView+Updates.swift +312 -0
  369. package/ios/NativeEditorExpoView.swift +349 -0
  370. package/ios/NativeEditorModule.swift +856 -0
  371. package/ios/NativeEditorViewRegistry.swift +226 -0
  372. package/ios/NativeToolbar+ButtonStyle.swift +214 -0
  373. package/ios/NativeToolbar+Buttons.swift +228 -0
  374. package/ios/NativeToolbar+Diagnostics.swift +114 -0
  375. package/ios/NativeToolbar+Menu.swift +101 -0
  376. package/ios/NativeToolbar+Models.swift +519 -0
  377. package/ios/NativeToolbar+Placeholder.swift +39 -0
  378. package/ios/NativeToolbar.swift +612 -0
  379. package/ios/OrderedListMarkerFormatter.swift +103 -0
  380. package/ios/PositionBridge.swift +596 -0
  381. package/ios/ProseViewerView.swift +462 -0
  382. package/ios/RenderBridge+Atoms.swift +288 -0
  383. package/ios/RenderBridge+Attachments.swift +246 -0
  384. package/ios/RenderBridge+BlockBoundaries.swift +313 -0
  385. package/ios/RenderBridge+Style.swift +343 -0
  386. package/ios/RenderBridge.swift +704 -0
  387. package/ios/RichTextEditorView.swift +930 -0
  388. package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
  389. package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
  390. package/ios/SharedNativeImagePipeline.swift +533 -0
  391. package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
  392. package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
  393. package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
  394. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
  395. package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
  396. package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
  397. package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
  398. package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
  399. package/ios/Viewer/NativeSVGPreflight.h +11 -0
  400. package/ios/Viewer/NativeSVGPreflight.mm +219 -0
  401. package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
  402. package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
  403. package/ios/Viewer/PreparedProseLayout.swift +326 -0
  404. package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
  405. package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
  406. package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
  407. package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
  408. package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
  409. package/ios/Viewer/ViewerDocument.swift +575 -0
  410. package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
  411. package/ios/Viewer/ViewerImagePipeline.swift +478 -0
  412. package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
  413. package/ios/editor_coreFFI/module.modulemap +7 -0
  414. package/package.json +151 -0
  415. package/react-native.config.js +17 -0
  416. package/rust/android/arm64-v8a/libeditor_core.so +0 -0
  417. package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
  418. package/rust/android/x86/libeditor_core.so +0 -0
  419. package/rust/android/x86_64/libeditor_core.so +0 -0
  420. package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
  421. package/src/AtomHost.tsx +180 -0
  422. package/src/DefaultAtomChip.tsx +27 -0
  423. package/src/EditorAddon.ts +65 -0
  424. package/src/EditorAddonNormalization.ts +49 -0
  425. package/src/EditorMentionThemeNormalization.ts +25 -0
  426. package/src/EditorMentionThemeValidation.ts +133 -0
  427. package/src/EditorStyleSheet.ts +9 -0
  428. package/src/EditorStyleSheetNormalization.ts +219 -0
  429. package/src/EditorStyleSheetTypes.ts +189 -0
  430. package/src/EditorTheme.ts +196 -0
  431. package/src/EditorToolbar.tsx +31 -0
  432. package/src/EditorToolbarComponent.tsx +23 -0
  433. package/src/EditorToolbarItems.tsx +64 -0
  434. package/src/EditorToolbarRegistry.tsx +254 -0
  435. package/src/EditorToolbarTypes.tsx +322 -0
  436. package/src/EditorToolbarVisuals.tsx +270 -0
  437. package/src/EditorUpdateRevision.ts +26 -0
  438. package/src/ExternalTextComposition.ts +658 -0
  439. package/src/ImageLoadingPolicy.ts +125 -0
  440. package/src/NativeEditorBoundaryError.ts +345 -0
  441. package/src/NativeEditorBridge.ts +93 -0
  442. package/src/NativeEditorCollaborationTransport.ts +493 -0
  443. package/src/NativeEditorCreateConfig.ts +326 -0
  444. package/src/NativeEditorCreateJson.ts +579 -0
  445. package/src/NativeEditorCreateValidation.ts +178 -0
  446. package/src/NativeEditorDocumentBridge.ts +485 -0
  447. package/src/NativeEditorDocumentHandle.ts +168 -0
  448. package/src/NativeEditorLocalAwareness.ts +168 -0
  449. package/src/NativeEditorNativeModule.ts +97 -0
  450. package/src/NativeEditorRenderNormalization.ts +320 -0
  451. package/src/NativeEditorResultNormalization.ts +469 -0
  452. package/src/NativeEditorTypes.ts +366 -0
  453. package/src/NativeEditorV2Decimal.ts +13 -0
  454. package/src/NativeProseViewer.tsx +356 -0
  455. package/src/NativeRichTextEditor.tsx +33 -0
  456. package/src/ResourceLimits.ts +187 -0
  457. package/src/RichTextEditor.tsx +27 -0
  458. package/src/RichTextEditorNativeTypes.tsx +144 -0
  459. package/src/RichTextEditorNativeView.tsx +21 -0
  460. package/src/RichTextEditorSerialization.tsx +381 -0
  461. package/src/RichTextEditorTypes.tsx +327 -0
  462. package/src/ViewerConfiguration.ts +23 -0
  463. package/src/YjsCollaboration.ts +692 -0
  464. package/src/addons.ts +311 -0
  465. package/src/atomConstants.ts +3 -0
  466. package/src/atomInstances.ts +123 -0
  467. package/src/atomPolicy.ts +47 -0
  468. package/src/atomUpdates.ts +52 -0
  469. package/src/atoms.ts +379 -0
  470. package/src/attributeValidation.ts +116 -0
  471. package/src/contentExpression.ts +338 -0
  472. package/src/index.ts +295 -0
  473. package/src/listMarkers.ts +18 -0
  474. package/src/schemaDefinition.ts +395 -0
  475. package/src/schemaDocument.ts +92 -0
  476. package/src/schemaDocumentConstruction.ts +148 -0
  477. package/src/schemaNormalization.ts +367 -0
  478. package/src/schemaPresets.ts +250 -0
  479. package/src/schemaResolution.ts +242 -0
  480. package/src/schemas.ts +43 -0
  481. package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
  482. package/src/useEditorToolbarInteractions.tsx +329 -0
  483. package/src/useEditorToolbarItems.tsx +390 -0
  484. package/src/useEditorToolbarPresentation.tsx +483 -0
  485. package/src/useEditorToolbarState.tsx +172 -0
  486. package/src/useFocusPreservingFrames.ts +171 -0
  487. package/src/useNativeEditor.ts +534 -0
  488. package/src/useRichTextEditorCommands.tsx +478 -0
  489. package/src/useRichTextEditorEvents.tsx +342 -0
  490. package/src/useRichTextEditorMentions.tsx +441 -0
  491. package/src/useRichTextEditorPresentation.tsx +563 -0
  492. package/src/useRichTextEditorState.tsx +620 -0
  493. package/src/useRichTextEditorUpdates.tsx +403 -0
  494. package/src/useViewerAtoms.tsx +427 -0
@@ -0,0 +1,813 @@
1
+ package com.apollohg.editor
2
+
3
+ import android.content.Context
4
+ import android.graphics.Point
5
+ import android.graphics.RectF
6
+ import android.os.Handler
7
+ import android.os.Looper
8
+ import android.view.MotionEvent
9
+ import android.view.View
10
+ import android.view.Window
11
+ import androidx.core.view.ViewCompat
12
+ import expo.modules.kotlin.AppContext
13
+ import expo.modules.kotlin.viewevent.EventDispatcher
14
+ import expo.modules.kotlin.views.ExpoView
15
+ import org.json.JSONObject
16
+
17
+ /**
18
+ * Expo Modules wrapper view that hosts a [RichTextEditorView] and bridges
19
+ * editor events to React Native via [EventDispatcher].
20
+ *
21
+ * Registered as the native view component in [NativeEditorModule].
22
+ */
23
+ class NativeEditorExpoView(context: Context, appContext: AppContext) :
24
+ ExpoView(context, appContext),
25
+ EditorEditText.EditorListener {
26
+
27
+ override val shouldUseAndroidLayout = true
28
+
29
+ internal enum class ToolbarPlacement {
30
+ KEYBOARD,
31
+ INLINE;
32
+
33
+ companion object {
34
+ fun fromRaw(raw: String?): ToolbarPlacement = if (raw == "inline") INLINE else KEYBOARD
35
+ }
36
+ }
37
+
38
+ internal sealed class PendingNativeAction {
39
+ data class ToolbarItemPress(val item: NativeToolbarItem) : PendingNativeAction()
40
+ data class MentionSuggestionSelect(val suggestion: NativeMentionSuggestion) :
41
+ PendingNativeAction()
42
+ }
43
+
44
+ internal data class PendingNativeActionScope(
45
+ val editorId: Long,
46
+ val documentVersion: String?,
47
+ val allowedDocumentVersion: String?,
48
+ val hadFocus: Boolean,
49
+ val hadVisibleToolbar: Boolean,
50
+ val selectionAnchor: Int?,
51
+ val selectionHead: Int?,
52
+ val mentionAnchor: Int? = null,
53
+ val mentionHead: Int? = null,
54
+ val mentionQuery: String? = null
55
+ )
56
+
57
+ internal data class PendingEditorUpdateEvent(
58
+ /** Captured public source identity; never derive this after a rebind. */
59
+ val editorId: String,
60
+ /** Captured canonical document revision used by TS echo suppression. */
61
+ val documentRevision: String,
62
+ val viewUpdateJSON: String,
63
+ val atomicUpdateJSON: String
64
+ )
65
+
66
+ internal data class NativeCommitKey(val editorId: String, val documentRevision: String)
67
+
68
+ internal data class EditorErrorBinding(
69
+ val adapter: EditorV2Adapter,
70
+ val editorId: String,
71
+ val viewToken: Long,
72
+ val callbackToken: Long,
73
+ val generation: Long
74
+ )
75
+
76
+ internal data class PendingEditorErrorEvent(
77
+ /** Capture every identity at callback time; never derive it after a rebind. */
78
+ val adapter: EditorV2Adapter,
79
+ val editorId: String,
80
+ val viewToken: Long,
81
+ val callbackToken: Long,
82
+ val bindingGeneration: Long,
83
+ val error: EditorV2Error
84
+ )
85
+
86
+ internal data class PreflightUpdateEvent(val updateJSON: String, val documentRevision: String)
87
+
88
+ internal data class ActiveExternalTextComposition(val sessionId: String, val editorId: String)
89
+
90
+ internal enum class PendingPropertyRetryResult {
91
+ STALE,
92
+ EDITOR_CHANGED,
93
+ READY
94
+ }
95
+
96
+ internal class PendingPropertyRetry {
97
+ var editorId: Long? = null
98
+ internal set
99
+ var attempts = 0
100
+ internal set
101
+ private var scheduled = false
102
+ private var generation = 0
103
+
104
+ fun bind(editorId: Long) {
105
+ this.editorId = editorId
106
+ }
107
+
108
+ fun resetAttempts() {
109
+ attempts = 0
110
+ }
111
+
112
+ fun cancel() {
113
+ scheduled = false
114
+ editorId = null
115
+ attempts = 0
116
+ generation += 1
117
+ }
118
+
119
+ fun schedule(editorId: Long, maxAttempts: Int): Pair<Int, Int>? {
120
+ if (scheduled || attempts >= maxAttempts) return null
121
+ attempts += 1
122
+ this.editorId = editorId
123
+ scheduled = true
124
+ generation += 1
125
+ return generation to attempts
126
+ }
127
+
128
+ fun consume(scheduledGeneration: Int, currentEditorId: Long): PendingPropertyRetryResult {
129
+ if (scheduledGeneration != generation) return PendingPropertyRetryResult.STALE
130
+ if (editorId != currentEditorId) return PendingPropertyRetryResult.EDITOR_CHANGED
131
+ scheduled = false
132
+ return PendingPropertyRetryResult.READY
133
+ }
134
+ }
135
+
136
+ val richTextView: RichTextEditorView = RichTextEditorView(context)
137
+ internal val keyboardToolbarView = EditorKeyboardToolbarView(context)
138
+ internal val mainHandler = Handler(Looper.getMainLooper())
139
+ internal val keyboardToolbarImeAnimationController = KeyboardToolbarImeAnimationController(
140
+ toolbarView = keyboardToolbarView,
141
+ onTargetImeBottomChanged = { bottom ->
142
+ currentImeBottom = bottom
143
+ updateKeyboardToolbarLayout()
144
+ updateEditorViewportInset()
145
+ },
146
+ onImeAnimationSettled = {
147
+ updateAttachedKeyboardToolbarForInsets()
148
+ }
149
+ )
150
+
151
+ internal val onEditorUpdate by EventDispatcher<Map<String, Any>>()
152
+ internal val onEditorError by EventDispatcher<Map<String, Any>>()
153
+ private val onExternalTextCompositionEnd by EventDispatcher<Map<String, Any>>()
154
+ private val onSelectionChange by EventDispatcher<Map<String, Any>>()
155
+ private val onFocusChange by EventDispatcher<Map<String, Any>>()
156
+ internal val onContentHeightChange by EventDispatcher<Map<String, Any>>()
157
+ internal val onAtomLayout by EventDispatcher<Map<String, Any>>()
158
+ internal val onEditorReady by EventDispatcher<Map<String, Any>>()
159
+
160
+ @Suppress("unused")
161
+ internal val onToolbarAction by EventDispatcher<Map<String, Any>>()
162
+
163
+ @Suppress("unused")
164
+ internal val onAddonEvent by EventDispatcher<Map<String, Any>>()
165
+
166
+ /** Guard flag: when true, editor updates originated from JS and should not echo back. */
167
+ var isApplyingJSUpdate = false
168
+ internal var blockEditorUpdatePreflightForTesting = false
169
+ internal var blockThemePreflightForTesting = false
170
+ internal var onToolbarActionForTesting: ((Map<String, Any>) -> Unit)? = null
171
+ internal var onAddonEventForTesting: ((Map<String, Any>) -> Unit)? = null
172
+ internal var onSelectionChangeForTesting: ((Map<String, Any>) -> Unit)? = null
173
+ internal var onFocusChangeForTesting: ((Map<String, Any>) -> Unit)? = null
174
+ internal var onContentHeightChangeForTesting: ((Map<String, Any>) -> Unit)? = null
175
+ internal var onAtomLayoutForTesting: ((Map<String, Any>) -> Unit)? = null
176
+ internal var onEditorUpdateForTesting: ((Map<String, Any>) -> Unit)? = null
177
+ internal var onEditorErrorForTesting: ((Map<String, Any>) -> Unit)? = null
178
+ internal var onExternalTextCompositionEndForTesting: ((Map<String, Any>) -> Unit)? = null
179
+ internal var onEditorReadyForTesting: ((Map<String, Any>) -> Unit)? = null
180
+ internal var onOutsideTapTraceForTesting: ((String) -> Unit)? = null
181
+ internal var onRefreshToolbarStateFromEditorSelectionForTesting: (() -> String?)? = null
182
+ internal var onBeforePrepareForEditorCommandForTesting: (() -> Unit)? = null
183
+ internal var isAttachedToNativeWindow = false
184
+ internal var didApplyAutoFocus = false
185
+ internal var heightBehavior = EditorHeightBehavior.FIXED
186
+ internal var lastEmittedContentHeight = 0
187
+ internal var lastEmittedContentHeightEditorId: Long? = null
188
+ internal val autoGrowStyleSizePublisher = ExpoAutoGrowStyleSizePublisher(this)
189
+ internal var lastPublishedAutoGrowHeightDp: Double? = null
190
+ internal var outsideTapWindow: Window? = null
191
+ internal var pendingOutsideTapHandlerInstallRetry: Runnable? = null
192
+ internal var toolbarFramesInWindow: List<RectF> = emptyList()
193
+ internal var lastToolbarTouchUptimeMs: Long? = null
194
+ internal var editorFocusedForOutsideTapOverrideForTesting: Boolean? = null
195
+ internal var pendingOutsideTapBlur: Runnable? = null
196
+ internal var pendingKeyboardDismiss: Runnable? = null
197
+ internal var pendingToolbarRefocus: Runnable? = null
198
+ internal var pendingToolbarRefocusEditorId: Long? = null
199
+ internal var pendingToolbarRefocusGeneration = 0
200
+ internal var pendingKeyboardToolbarDetachGeneration = 0
201
+ internal var autoFocusRequested = false
202
+ internal var addons = NativeEditorAddons(null)
203
+ internal var mentionQueryState: MentionQueryState? = null
204
+ internal var lastMentionEventJson: String? = null
205
+ internal var lastMentionEventEditorId: Long? = null
206
+ internal var lastThemeJson: String? = null
207
+ internal var pendingThemeJson: String? = null
208
+ internal var hasPendingTheme = false
209
+ internal val pendingThemeRetry = PendingPropertyRetry()
210
+ internal var pendingAtomsJson: String? = null
211
+ internal var hasPendingAtoms = false
212
+ internal val pendingAtomsRetry = PendingPropertyRetry()
213
+ internal var lastAddonsJson: String? = null
214
+ internal var lastAtomsJson: String? = null
215
+ internal val reactChildren = mutableListOf<View>()
216
+ internal var lastRemoteSelectionsJson: String? = null
217
+ internal var lastToolbarItemsJson: String? = null
218
+ internal var lastToolbarFrameJson: String? = null
219
+ internal var lastDocumentVersion: String? = null
220
+ internal var renderedDocumentRevision: String? = null
221
+
222
+ @Volatile
223
+ internal var remoteCommitRebaseScheduled = false
224
+ internal var remoteCommitRebaseEditorId: Long? = null
225
+ internal var activeExternalTextComposition: ActiveExternalTextComposition? = null
226
+ internal var toolbarState = NativeToolbarState.empty
227
+ internal var showsToolbar = true
228
+ internal var toolbarPlacement = ToolbarPlacement.KEYBOARD
229
+ internal var currentImeBottom = 0
230
+ internal var pendingEditorUpdateResetJson: String? = null
231
+ internal var pendingEditorUpdateJson: String? = null
232
+
233
+ @set:JvmName("setPendingEditorUpdateEditorIdState")
234
+ internal var pendingEditorUpdateEditorId: Long? = null
235
+ internal var pendingEditorUpdateRevision = 0L
236
+ internal var appliedEditorUpdateRevision = 0L
237
+
238
+ /** Permanently rejected prop revisions are consumed per bound editor. */
239
+ internal var consumedEditorUpdateRevision = 0L
240
+ internal var consumedEditorUpdateEditorId: Long? = null
241
+ internal var pendingEditorResetUpdateJson: String? = null
242
+
243
+ @set:JvmName("setPendingEditorResetUpdateEditorIdState")
244
+ internal var pendingEditorResetUpdateEditorId: Long? = null
245
+ internal var pendingEditorResetUpdateRevision = 0L
246
+ internal var appliedEditorResetUpdateRevision = 0L
247
+
248
+ /** Permanently rejected reset revisions are consumed per bound editor. */
249
+ internal var consumedEditorResetUpdateRevision = 0L
250
+ internal var consumedEditorResetUpdateEditorId: Long? = null
251
+ internal var lastEditorUpdateJsonProp: String? = null
252
+ internal var lastEditorUpdateEditorIdProp: Long? = null
253
+ internal var lastEditorResetUpdateJsonProp: String? = null
254
+ internal var lastEditorResetUpdateEditorIdProp: Long? = null
255
+ internal var pendingEditorUpdateRetryScheduled = false
256
+ internal var pendingEditorUpdateRetryEditorId: Long? = null
257
+ internal var pendingEditorUpdateRetryKind: PendingEditorUpdateKind? = null
258
+ internal var pendingEditorUpdateRetryGeneration = 0
259
+ internal var pendingEditorUpdateRetryAttempts = 0
260
+ internal var pendingEditorUpdateForcedRecoveryAttempted = false
261
+ internal var pendingViewCommandUpdateJson: String? = null
262
+ internal var pendingViewCommandUpdateEditorId: Long? = null
263
+ internal var pendingViewCommandUpdateRetryScheduled = false
264
+ internal var pendingViewCommandUpdateRetryGeneration = 0
265
+ internal var pendingViewCommandUpdateRetryAttempts = 0
266
+ internal var pendingPreflightWakeScheduled = false
267
+ internal var pendingPreflightWakeGeneration = 0
268
+ internal var pendingBlurRetry: Runnable? = null
269
+ internal var pendingBlurRetryEditorId: Long? = null
270
+ internal var pendingBlurRetryGeneration = 0
271
+ internal var pendingBlurRetryAttempts = 0
272
+ internal var pendingDetachPreflightRetryScheduled = false
273
+ internal var pendingDetachPreflightRetryEditorId: Long? = null
274
+ internal var pendingDetachPreflightRetryGeneration = 0
275
+ internal var pendingDetachPreflightRetryAttempts = 0
276
+ internal var pendingNativeAction: PendingNativeAction? = null
277
+ internal var pendingNativeActionScope: PendingNativeActionScope? = null
278
+ internal var pendingNativeActionRetryScheduled = false
279
+ internal var pendingNativeActionRetryEditorId: Long? = null
280
+ internal var pendingNativeActionRetryGeneration = 0
281
+ internal var pendingNativeActionRetryAttempts = 0
282
+ internal var lastReadyEditorId: Long? = null
283
+ internal val pendingEditorUpdateEvents = java.util.ArrayDeque<PendingEditorUpdateEvent>()
284
+ internal val pendingEditorUpdateKeys = mutableSetOf<NativeCommitKey>()
285
+ internal var pendingEditorUpdateDispatchGeneration = 0
286
+ internal var pendingEditorUpdateDispatchScheduled = false
287
+ internal val pendingEditorErrorEvents = java.util.ArrayDeque<PendingEditorErrorEvent>()
288
+ internal var pendingEditorErrorDispatchGeneration = 0
289
+ internal var pendingEditorErrorDispatchScheduled = false
290
+ internal var editorErrorBinding: EditorErrorBinding? = null
291
+ internal var nextEditorErrorBindingGeneration = 0L
292
+
293
+ init {
294
+ addView(richTextView, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
295
+ richTextView.onAtomLayoutChange = ::emitAtomLayout
296
+ richTextView.editorEditText.editorListener = this
297
+ richTextView.onBeforeDetachedFromWindow = {
298
+ prepareForDetachFromWindow()
299
+ }
300
+ richTextView.onAutoGrowHeightMayChange = {
301
+ if (heightBehavior == EditorHeightBehavior.AUTO_GROW) {
302
+ requestLayout()
303
+ emitContentHeightIfNeeded(force = false)
304
+ }
305
+ }
306
+ keyboardToolbarView.onPressItem = { item ->
307
+ handleToolbarItemPress(item)
308
+ }
309
+ keyboardToolbarView.onSelectMentionSuggestion = { suggestion ->
310
+ insertMentionSuggestion(suggestion)
311
+ }
312
+ keyboardToolbarView.applyState(toolbarState)
313
+ ViewCompat.setOnApplyWindowInsetsListener(keyboardToolbarView) { _, insets ->
314
+ keyboardToolbarImeAnimationController.onApplyWindowInsets(insets)
315
+ insets
316
+ }
317
+ ViewCompat.setWindowInsetsAnimationCallback(
318
+ keyboardToolbarView,
319
+ keyboardToolbarImeAnimationController.animationCallback
320
+ )
321
+
322
+ richTextView.editorEditText.setOnFocusChangeListener { _, hasFocus ->
323
+ if (hasFocus) {
324
+ cancelPendingToolbarRefocus()
325
+ installOutsideTapBlurHandlerIfNeeded()
326
+ scheduleOutsideTapBlurHandlerInstallRetry()
327
+ refreshMentionQuery()
328
+ } else {
329
+ if (consumeToolbarFocusPreservationForBlur()) {
330
+ scheduleToolbarRefocus()
331
+ return@setOnFocusChangeListener
332
+ }
333
+ uninstallOutsideTapBlurHandler()
334
+ clearMentionQueryState()
335
+ clearPendingNativeActionRetry()
336
+ }
337
+ updateKeyboardToolbarVisibility()
338
+ val event = mapOf<String, Any>(
339
+ "isFocused" to hasFocus,
340
+ "editorId" to eventEditorId(richTextView.editorId)
341
+ )
342
+ onFocusChangeForTesting?.invoke(event) ?: onFocusChange(event)
343
+ }
344
+ }
345
+
346
+ fun setEditorHandle(handle: String?) = setEditorHandleImpl(handle)
347
+
348
+ /**
349
+ * Internal-only widget binding. This token is allocated by
350
+ * [EditorV2Registry] and is never a public session identifier.
351
+ */
352
+ fun setEditorId(id: Long) = setEditorIdImpl(id)
353
+
354
+ fun setThemeJson(themeJson: String?) = setThemeJsonImpl(themeJson)
355
+
356
+ fun setImageLoadingPolicyJson(policyJson: String?) = setImageLoadingPolicyJsonImpl(policyJson)
357
+
358
+ fun setHeightBehavior(rawHeightBehavior: String) = setHeightBehaviorImpl(rawHeightBehavior)
359
+
360
+ fun setAddonsJson(addonsJson: String?) = setAddonsJsonImpl(addonsJson)
361
+
362
+ fun setAtomsJson(atomsJson: String?) = setAtomsJsonImpl(atomsJson)
363
+
364
+ internal val atomChildCount: Int
365
+ get() = reactChildren.size
366
+
367
+ internal fun atomChildAt(index: Int): View? = atomChildAtImpl(index)
368
+
369
+ internal fun addAtomChild(child: View, index: Int) = addAtomChildImpl(child, index)
370
+
371
+ internal fun removeAtomChildAt(index: Int) = removeAtomChildAtImpl(index)
372
+
373
+ internal fun removeAtomChild(child: View) = removeAtomChildImpl(child)
374
+
375
+ fun setRemoteSelectionsJson(remoteSelectionsJson: String?) =
376
+ setRemoteSelectionsJsonImpl(remoteSelectionsJson)
377
+
378
+ fun setAutoFocus(autoFocus: Boolean) = setAutoFocusImpl(autoFocus)
379
+
380
+ fun setAutoCapitalize(autoCapitalize: String?) = setAutoCapitalizeImpl(autoCapitalize)
381
+
382
+ fun setAutoCorrect(autoCorrect: Boolean?) = setAutoCorrectImpl(autoCorrect)
383
+
384
+ fun setKeyboardType(keyboardType: String?) = setKeyboardTypeImpl(keyboardType)
385
+
386
+ fun setAndroidInputOptionsJson(optionsJson: String?) =
387
+ setAndroidInputOptionsJsonImpl(optionsJson)
388
+
389
+ fun setEditable(editable: Boolean) = setEditableImpl(editable)
390
+
391
+ fun beginExternalTextComposition(sessionId: String): String =
392
+ beginExternalTextCompositionImpl(sessionId)
393
+
394
+ fun updateExternalTextComposition(sessionId: String, text: String): String =
395
+ updateExternalTextCompositionImpl(sessionId, text)
396
+
397
+ fun commitExternalTextComposition(sessionId: String, finalText: String): String =
398
+ commitExternalTextCompositionImpl(sessionId, finalText)
399
+
400
+ fun cancelExternalTextComposition(sessionId: String, cause: String): String =
401
+ cancelExternalTextCompositionImpl(sessionId, cause)
402
+
403
+ fun setAccessibilityLabel(label: String?) = setAccessibilityLabelImpl(label)
404
+
405
+ fun setAccessibilityHint(hint: String?) = setAccessibilityHintImpl(hint)
406
+
407
+ fun setShowToolbar(showToolbar: Boolean) = setShowToolbarImpl(showToolbar)
408
+
409
+ fun setToolbarPlacement(rawToolbarPlacement: String?) =
410
+ setToolbarPlacementImpl(rawToolbarPlacement)
411
+
412
+ fun setAllowImageResizing(allowImageResizing: Boolean) =
413
+ setAllowImageResizingImpl(allowImageResizing)
414
+
415
+ fun setToolbarItemsJson(toolbarItemsJson: String?) = setToolbarItemsJsonImpl(toolbarItemsJson)
416
+
417
+ fun setToolbarFrameJson(toolbarFrameJson: String?) = setToolbarFrameJsonImpl(toolbarFrameJson)
418
+
419
+ fun setPendingEditorUpdateJson(editorUpdateJson: String?) =
420
+ setPendingEditorUpdateJsonImpl(editorUpdateJson)
421
+
422
+ fun setPendingEditorUpdateEditorHandle(editorUpdateEditorHandle: String?) =
423
+ setPendingEditorUpdateEditorHandleImpl(editorUpdateEditorHandle)
424
+
425
+ /** Internal widget/test hook; production props always use decimal handles. */
426
+ internal fun setPendingEditorUpdateEditorId(viewToken: Long?) =
427
+ setPendingEditorUpdateEditorIdImpl(viewToken)
428
+
429
+ fun setPendingEditorUpdateRevision(editorUpdateRevision: Long) =
430
+ setPendingEditorUpdateRevisionImpl(editorUpdateRevision)
431
+
432
+ fun setPendingEditorResetUpdateJson(editorResetUpdateJson: String?) =
433
+ setPendingEditorResetUpdateJsonImpl(editorResetUpdateJson)
434
+
435
+ fun setPendingEditorResetUpdateEditorHandle(editorResetUpdateEditorHandle: String?) =
436
+ setPendingEditorResetUpdateEditorHandleImpl(editorResetUpdateEditorHandle)
437
+
438
+ /** Internal widget/test hook; production props always use decimal handles. */
439
+ internal fun setPendingEditorResetUpdateEditorId(viewToken: Long?) =
440
+ setPendingEditorResetUpdateEditorIdImpl(viewToken)
441
+
442
+ fun setPendingEditorResetUpdateRevision(editorResetUpdateRevision: Long) =
443
+ setPendingEditorResetUpdateRevisionImpl(editorResetUpdateRevision)
444
+
445
+ fun applyPendingEditorResetUpdateIfNeeded() = applyPendingEditorResetUpdateIfNeededImpl()
446
+
447
+ fun applyPendingEditorUpdateIfNeeded() = applyPendingEditorUpdateIfNeededImpl()
448
+
449
+ fun focus() = focusImpl()
450
+
451
+ fun blur() = blurImpl()
452
+
453
+ fun getCaretRectJson(): String? = getCaretRectJsonImpl()
454
+
455
+ override fun onAttachedToWindow() {
456
+ super.onAttachedToWindow()
457
+ handleAttachedToWindow()
458
+ }
459
+
460
+ internal fun handleEditorDestroyed(editorId: Long) = handleEditorDestroyedImpl(editorId)
461
+
462
+ override fun onDetachedFromWindow() {
463
+ prepareForDetachFromWindow()
464
+ richTextView.editorEditText.retireInputConnectionForHostDetach()
465
+ super.onDetachedFromWindow()
466
+ handleDetachedFromWindow()
467
+ }
468
+
469
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
470
+ if (heightBehavior != EditorHeightBehavior.AUTO_GROW) {
471
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec)
472
+ return
473
+ }
474
+
475
+ val childWidthSpec = getChildMeasureSpec(
476
+ widthMeasureSpec,
477
+ paddingLeft + paddingRight,
478
+ richTextView.layoutParams.width
479
+ )
480
+ val childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
481
+ richTextView.measure(childWidthSpec, childHeightSpec)
482
+
483
+ val measuredWidth = resolveSize(
484
+ richTextView.measuredWidth + paddingLeft + paddingRight,
485
+ widthMeasureSpec
486
+ )
487
+ val desiredHeight = richTextView.measuredHeight + paddingTop + paddingBottom
488
+ val measuredHeight = when (MeasureSpec.getMode(heightMeasureSpec)) {
489
+ MeasureSpec.AT_MOST -> desiredHeight.coerceAtMost(
490
+ MeasureSpec.getSize(heightMeasureSpec)
491
+ )
492
+
493
+ else -> desiredHeight
494
+ }
495
+ setMeasuredDimension(measuredWidth, measuredHeight)
496
+ emitContentHeightIfNeeded(force = false)
497
+ }
498
+
499
+ /**
500
+ * Auto-grow measures content-sized because RN's exact specs can be stale,
501
+ * zero, or oversized. The frame it actually assigns is only trustworthy
502
+ * here, so a taller one is filled now — otherwise the extra space a
503
+ * minimum height creates belongs to no view and cannot take a tap.
504
+ */
505
+ override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
506
+ super.onLayout(changed, left, top, right, bottom)
507
+ if (heightBehavior != EditorHeightBehavior.AUTO_GROW) return
508
+ val available = (bottom - top) - paddingTop - paddingBottom
509
+ if (available <= richTextView.height) return
510
+ richTextView.layout(
511
+ richTextView.left,
512
+ paddingTop,
513
+ richTextView.right,
514
+ paddingTop + available
515
+ )
516
+ }
517
+
518
+ /** Applies an editor update from JS without echoing it back through events. */
519
+ fun applyEditorUpdate(updateJson: String): Boolean = applyEditorUpdateImpl(updateJson)
520
+
521
+ /** Applies a reset-style update from JS, discarding pending native composition. */
522
+ fun applyEditorResetUpdate(updateJson: String): Boolean = applyEditorResetUpdateImpl(updateJson)
523
+
524
+ @Synchronized
525
+ internal fun markRemoteCommitRebaseScheduled(editorId: Long): Boolean =
526
+ markRemoteCommitRebaseScheduledImpl(editorId)
527
+
528
+ internal fun applyRemoteCommitRefresh(expectedEditorId: Long) =
529
+ applyRemoteCommitRefreshImpl(expectedEditorId)
530
+
531
+ fun prepareForEditorCommandJSON(): String = prepareForEditorCommandJSONImpl()
532
+
533
+ override fun onSelectionChanged(anchor: Int, head: Int) {
534
+ val stateJson = refreshToolbarStateFromEditorSelection()
535
+ refreshMentionQuery()
536
+ clearPendingNativeActionRetryIfScopeChanged()
537
+ schedulePendingPreflightWake()
538
+ richTextView.refreshRemoteSelections()
539
+ val event = mutableMapOf<String, Any>(
540
+ "anchor" to anchor,
541
+ "head" to head,
542
+ "editorId" to eventEditorId(richTextView.editorId)
543
+ )
544
+ lastDocumentVersion?.let {
545
+ event["documentVersion"] = it
546
+ }
547
+ if (stateJson != null) {
548
+ event["stateJson"] = stateJson
549
+ }
550
+ onSelectionChangeForTesting?.invoke(event) ?: onSelectionChange(event)
551
+ }
552
+
553
+ override fun onEditorUpdate(updateJSON: String) {
554
+ val documentRevision = documentVersionFromUpdateJSON(updateJSON)
555
+ if (documentRevision == null) {
556
+ richTextView.editorEditText.recordImeTraceForTesting(
557
+ "nativeViewEditorUpdateSkipped",
558
+ "reason=invalidDocumentRevision jsonLength=${updateJSON.length}"
559
+ )
560
+ return
561
+ }
562
+ renderedDocumentRevision = documentRevision
563
+ val sourceEditorId = eventEditorId(richTextView.editorId)
564
+ val adapter = EditorV2Registry.adapterForViewToken(richTextView.editorId)
565
+ val cachedAtomicUpdateJSON =
566
+ adapter?.atomicRenderJson(matchingDocumentRevision = documentRevision)
567
+ if (adapter != null && cachedAtomicUpdateJSON == null) {
568
+ richTextView.editorEditText.recordImeTraceForTesting(
569
+ "nativeViewEditorUpdateSkipped",
570
+ "reason=missingAtomicSnapshot documentRevision=$documentRevision"
571
+ )
572
+ return
573
+ }
574
+ val atomicUpdateJSON = cachedAtomicUpdateJSON ?: updateJSON
575
+ if (isApplyingJSUpdate) {
576
+ dispatchEditorUpdate(
577
+ PendingEditorUpdateEvent(
578
+ editorId = sourceEditorId,
579
+ documentRevision = documentRevision,
580
+ viewUpdateJSON = updateJSON,
581
+ atomicUpdateJSON = atomicUpdateJSON
582
+ ),
583
+ emitToJS = false
584
+ )
585
+ return
586
+ }
587
+ val event = PendingEditorUpdateEvent(
588
+ editorId = sourceEditorId,
589
+ documentRevision = documentRevision,
590
+ viewUpdateJSON = updateJSON,
591
+ atomicUpdateJSON = atomicUpdateJSON
592
+ )
593
+ val key = NativeCommitKey(event.editorId, event.documentRevision)
594
+ if (!pendingEditorUpdateKeys.add(key)) return
595
+ pendingEditorUpdateEvents.addLast(event)
596
+ richTextView.editorEditText.recordImeTraceForTesting(
597
+ "nativeViewEditorUpdateQueued",
598
+ "queue=${pendingEditorUpdateEvents.size} jsonLength=${updateJSON.length}"
599
+ )
600
+ schedulePendingEditorUpdateDispatch()
601
+ }
602
+
603
+ override fun onExternalTextCompositionEnded(resultJson: String) {
604
+ val sessionId = runCatching {
605
+ JSONObject(resultJson).opt("sessionId") as? String
606
+ }.getOrNull()
607
+ val matchingComposition = activeExternalTextComposition?.takeIf {
608
+ it.sessionId == sessionId
609
+ }
610
+ if (matchingComposition != null) {
611
+ activeExternalTextComposition = null
612
+ }
613
+ val payload = mapOf<String, Any>(
614
+ "editorId" to (matchingComposition?.editorId ?: eventEditorId(richTextView.editorId)),
615
+ "resultJson" to resultJson
616
+ )
617
+ onExternalTextCompositionEndForTesting?.invoke(payload)
618
+ ?: onExternalTextCompositionEnd(payload)
619
+ wakePendingPreflightWork()
620
+ }
621
+
622
+ internal fun pendingEditorUpdateEventCountForTesting(): Int =
623
+ pendingEditorUpdateEventCountForTestingImpl()
624
+
625
+ internal fun pendingEditorErrorEventCountForTesting(): Int =
626
+ pendingEditorErrorEventCountForTestingImpl()
627
+
628
+ internal fun editorErrorCallbackTokenForTesting(): Long? =
629
+ editorErrorCallbackTokenForTestingImpl()
630
+
631
+ internal fun prepareOutsideTapDecisionForWindowEvent(
632
+ event: MotionEvent
633
+ ): NativeEditorOutsideTapDecision = prepareOutsideTapDecisionForWindowEventImpl(event)
634
+
635
+ internal fun handleOutsideTapDecisionFromWindowDispatcher(
636
+ decision: NativeEditorOutsideTapDecision
637
+ ) = handleOutsideTapDecisionFromWindowDispatcherImpl(decision)
638
+
639
+ internal fun scheduleOutsideTapBlurFromWindowDispatcher() =
640
+ scheduleOutsideTapBlurFromWindowDispatcherImpl()
641
+
642
+ internal fun cancelOutsideTapBlurFromWindowDispatcher() =
643
+ cancelOutsideTapBlurFromWindowDispatcherImpl()
644
+
645
+ internal fun markRecentToolbarTouchForTesting() = markRecentToolbarTouchForTestingImpl()
646
+
647
+ internal fun shouldPreserveFocusAfterToolbarTouchForTesting(): Boolean =
648
+ shouldPreserveFocusAfterToolbarTouchForTestingImpl()
649
+
650
+ internal fun setEditorFocusedForOutsideTapDecisionForTesting(isFocused: Boolean?) =
651
+ setEditorFocusedForOutsideTapDecisionForTestingImpl(isFocused)
652
+
653
+ internal fun setAttachedToNativeWindowForTesting(isAttached: Boolean) =
654
+ setAttachedToNativeWindowForTestingImpl(isAttached)
655
+
656
+ internal fun handleAttachedToWindowForTesting() = handleAttachedToWindowForTestingImpl()
657
+
658
+ internal fun traceOutsideTap(message: String) = traceOutsideTapImpl(message)
659
+
660
+ internal fun handleDetachedFromWindowForTesting() = handleDetachedFromWindowForTestingImpl()
661
+
662
+ internal fun performBlurForTesting(deferKeyboardDismiss: Boolean = false) =
663
+ performBlurForTestingImpl(deferKeyboardDismiss)
664
+
665
+ internal fun pendingBlurRetryAttemptsForTesting(): Int =
666
+ pendingBlurRetryAttemptsForTestingImpl()
667
+
668
+ internal fun pendingDetachPreflightRetryAttemptsForTesting(): Int =
669
+ pendingDetachPreflightRetryAttemptsForTestingImpl()
670
+
671
+ internal fun hasPendingOutsideTapBlurForTesting(): Boolean =
672
+ hasPendingOutsideTapBlurForTestingImpl()
673
+
674
+ internal fun isOutsideTapBlurHandlerInstalledForTesting(): Boolean =
675
+ isOutsideTapBlurHandlerInstalledForTestingImpl()
676
+
677
+ internal fun hasPendingKeyboardDismissForTesting(): Boolean =
678
+ hasPendingKeyboardDismissForTestingImpl()
679
+
680
+ internal fun hasPendingPreflightWakeForTesting(): Boolean =
681
+ hasPendingPreflightWakeForTestingImpl()
682
+
683
+ internal fun hasPendingToolbarRefocusForTesting(): Boolean =
684
+ hasPendingToolbarRefocusForTestingImpl()
685
+
686
+ internal fun isKeyboardToolbarAttachedForTesting(): Boolean =
687
+ isKeyboardToolbarAttachedForTestingImpl()
688
+
689
+ internal fun currentImeBottomForTesting(): Int = currentImeBottomForTestingImpl()
690
+
691
+ internal fun setCurrentImeBottomForTesting(bottom: Int) =
692
+ setCurrentImeBottomForTestingImpl(bottom)
693
+
694
+ internal fun updateAttachedKeyboardToolbarForInsetsForTesting() =
695
+ updateAttachedKeyboardToolbarForInsetsForTestingImpl()
696
+
697
+ internal fun scheduleToolbarRefocusForTesting() = scheduleToolbarRefocusForTestingImpl()
698
+
699
+ internal fun focusFromToolbarPreserveForTesting() = focusFromToolbarPreserveForTestingImpl()
700
+
701
+ internal fun applyAutoFocusForTesting() = applyAutoFocusForTestingImpl()
702
+
703
+ internal fun installOutsideTapBlurHandlerForTesting() =
704
+ installOutsideTapBlurHandlerForTestingImpl()
705
+
706
+ internal fun uninstallOutsideTapBlurHandlerForTesting() =
707
+ uninstallOutsideTapBlurHandlerForTestingImpl()
708
+
709
+ internal fun setOutsideTapCycleBreakDispatcherForTesting(
710
+ dispatcher: ((MotionEvent) -> Boolean)?
711
+ ): Boolean = setOutsideTapCycleBreakDispatcherForTestingImpl(dispatcher)
712
+
713
+ internal fun clearOutsideTapRouteViewReferenceAndReconcileForTesting():
714
+ NativeEditorOutsideTapRouteTestState =
715
+ clearOutsideTapRouteViewReferenceAndReconcileForTestingImpl()
716
+
717
+ internal fun dispatchOutsideTapWindowEventForTesting(event: MotionEvent): Boolean =
718
+ dispatchOutsideTapWindowEventForTestingImpl(event)
719
+
720
+ internal fun schedulePendingPreflightWakeForTesting() =
721
+ schedulePendingPreflightWakeForTestingImpl()
722
+
723
+ internal fun hasPendingNativeActionForTesting(): Boolean =
724
+ hasPendingNativeActionForTestingImpl()
725
+
726
+ internal fun pendingNativeActionRetryAttemptsForTesting(): Int =
727
+ pendingNativeActionRetryAttemptsForTestingImpl()
728
+
729
+ internal fun lastDocumentVersionForTesting(): String? = lastDocumentVersionForTestingImpl()
730
+
731
+ internal fun setLastDocumentVersionForTesting(documentVersion: String?) =
732
+ setLastDocumentVersionForTestingImpl(documentVersion)
733
+
734
+ internal fun refreshToolbarStateFromEditorSelectionForTesting(): String? =
735
+ refreshToolbarStateFromEditorSelectionForTestingImpl()
736
+
737
+ internal fun handleToolbarItemPressForTesting(item: NativeToolbarItem) =
738
+ handleToolbarItemPressForTestingImpl(item)
739
+
740
+ internal fun insertMentionSuggestionForTesting(suggestion: NativeMentionSuggestion) =
741
+ insertMentionSuggestionForTestingImpl(suggestion)
742
+
743
+ internal fun wakePendingPreflightWorkForTesting() = wakePendingPreflightWorkForTestingImpl()
744
+
745
+ internal fun emitEditorReadyForTesting(editorUpdateRevision: Long? = null): Boolean =
746
+ emitEditorReadyForTestingImpl(editorUpdateRevision)
747
+
748
+ internal fun pendingEditorUpdateJsonForTesting(): String? =
749
+ pendingEditorUpdateJsonForTestingImpl()
750
+
751
+ internal fun pendingEditorUpdateRevisionForTesting(): Long =
752
+ pendingEditorUpdateRevisionForTestingImpl()
753
+
754
+ internal fun pendingEditorResetUpdateJsonForTesting(): String? =
755
+ pendingEditorResetUpdateJsonForTestingImpl()
756
+
757
+ internal fun pendingEditorResetUpdateRevisionForTesting(): Long =
758
+ pendingEditorResetUpdateRevisionForTestingImpl()
759
+
760
+ internal fun setAppliedEditorUpdateRevisionForTesting(editorUpdateRevision: Long) =
761
+ setAppliedEditorUpdateRevisionForTestingImpl(editorUpdateRevision)
762
+
763
+ internal fun pendingEditorUpdateEditorIdForTesting(): Long? =
764
+ pendingEditorUpdateEditorIdForTestingImpl()
765
+
766
+ internal fun pendingEditorResetUpdateEditorIdForTesting(): Long? =
767
+ pendingEditorResetUpdateEditorIdForTestingImpl()
768
+
769
+ internal fun pendingViewCommandUpdateJsonForTesting(): String? =
770
+ pendingViewCommandUpdateJsonForTestingImpl()
771
+
772
+ internal fun pendingViewCommandUpdateRetryAttemptsForTesting(): Int =
773
+ pendingViewCommandUpdateRetryAttemptsForTestingImpl()
774
+
775
+ internal fun scheduleViewCommandUpdateRetryForTesting(updateJson: String) =
776
+ scheduleViewCommandUpdateRetryForTestingImpl(updateJson)
777
+
778
+ internal fun pendingThemeJsonForTesting(): String? = pendingThemeJsonForTestingImpl()
779
+
780
+ internal fun pendingAtomsJsonForTesting(): String? = pendingAtomsJsonForTestingImpl()
781
+
782
+ internal fun lastAtomsJsonForTesting(): String? = lastAtomsJsonForTestingImpl()
783
+
784
+ internal fun lastThemeJsonForTesting(): String? = lastThemeJsonForTestingImpl()
785
+
786
+ internal fun pendingThemeRetryAttemptsForTesting(): Int =
787
+ pendingThemeRetryAttemptsForTestingImpl()
788
+
789
+ internal fun applyPendingThemeForTesting() = applyPendingThemeForTestingImpl()
790
+
791
+ internal fun isPointInsideStandaloneToolbarForTesting(
792
+ rawX: Float,
793
+ rawY: Float,
794
+ windowOriginOnScreen: Point
795
+ ): Boolean = isPointInsideStandaloneToolbarForTestingImpl(rawX, rawY, windowOriginOnScreen)
796
+
797
+ internal companion object {
798
+ internal const val TOOLBAR_HIT_SLOP_DP = 8f
799
+ internal const val TOOLBAR_FOCUS_PRESERVE_MS = 750L
800
+ internal const val OUTSIDE_TAP_BLUR_DELAY_MS = 100L
801
+ internal const val OUTSIDE_TAP_HANDLER_INSTALL_RETRY_DELAY_MS = 64L
802
+ internal const val NATIVE_ACTION_RETRY_DELAY_MS = 16L
803
+ internal const val EDITOR_UPDATE_EVENT_DEBOUNCE_MS = 64L
804
+ internal const val PENDING_UPDATE_RECOVERY_RETRY_DELAY_MS = 250L
805
+ internal const val MAX_NATIVE_ACTION_RETRY_ATTEMPTS = 3
806
+ internal const val MAX_PENDING_UPDATE_RETRY_ATTEMPTS = 5
807
+ internal const val LOG_TAG = "NativeEditor"
808
+
809
+ internal fun nanosToMicros(nanos: Long): Long = nanos / 1_000L
810
+ }
811
+
812
+ internal fun addNativeAtomView(child: View, index: Int) = super.addView(child, index)
813
+ }