@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.
- package/LICENSE +160 -0
- package/README.md +259 -0
- package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
- package/ReactNativeProseEditor.podspec +59 -0
- package/THIRD_PARTY_NOTICES.md +31155 -0
- package/android/build.gradle +188 -0
- package/android/consumer-rules.pro +18 -0
- package/android/expo/build.gradle +17 -0
- package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
- package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
- package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
- package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
- package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
- package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
- package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
- package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
- package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
- package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
- package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
- package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
- package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
- package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
- package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
- package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
- package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
- package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
- package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
- package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
- package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
- package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
- package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
- package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
- package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
- package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
- package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
- package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
- package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
- package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
- package/android/src/main/jni/reactnativeproseeditor.h +6 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
- package/app.plugin.js +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
- package/dist/AtomHost.d.ts +17 -0
- package/dist/AtomHost.js +135 -0
- package/dist/DefaultAtomChip.d.ts +2 -0
- package/dist/DefaultAtomChip.js +22 -0
- package/dist/EditorAddon.d.ts +32 -0
- package/dist/EditorAddon.js +29 -0
- package/dist/EditorAddonNormalization.d.ts +6 -0
- package/dist/EditorAddonNormalization.js +48 -0
- package/dist/EditorMentionThemeNormalization.d.ts +8 -0
- package/dist/EditorMentionThemeNormalization.js +22 -0
- package/dist/EditorMentionThemeValidation.d.ts +12 -0
- package/dist/EditorMentionThemeValidation.js +95 -0
- package/dist/EditorStyleSheet.d.ts +4 -0
- package/dist/EditorStyleSheet.js +10 -0
- package/dist/EditorStyleSheetNormalization.d.ts +3 -0
- package/dist/EditorStyleSheetNormalization.js +226 -0
- package/dist/EditorStyleSheetTypes.d.ts +151 -0
- package/dist/EditorStyleSheetTypes.js +2 -0
- package/dist/EditorTheme.d.ts +117 -0
- package/dist/EditorTheme.js +41 -0
- package/dist/EditorToolbar.d.ts +4 -0
- package/dist/EditorToolbar.js +17 -0
- package/dist/EditorToolbarComponent.d.ts +13 -0
- package/dist/EditorToolbarComponent.js +24 -0
- package/dist/EditorToolbarItems.d.ts +9 -0
- package/dist/EditorToolbarItems.js +58 -0
- package/dist/EditorToolbarRegistry.d.ts +59 -0
- package/dist/EditorToolbarRegistry.js +175 -0
- package/dist/EditorToolbarTypes.d.ts +273 -0
- package/dist/EditorToolbarTypes.js +2 -0
- package/dist/EditorToolbarVisuals.d.ts +154 -0
- package/dist/EditorToolbarVisuals.js +228 -0
- package/dist/EditorUpdateRevision.d.ts +8 -0
- package/dist/EditorUpdateRevision.js +22 -0
- package/dist/ExternalTextComposition.d.ts +45 -0
- package/dist/ExternalTextComposition.js +537 -0
- package/dist/ImageLoadingPolicy.d.ts +54 -0
- package/dist/ImageLoadingPolicy.js +60 -0
- package/dist/NativeEditorBoundaryError.d.ts +111 -0
- package/dist/NativeEditorBoundaryError.js +268 -0
- package/dist/NativeEditorBridge.d.ts +9 -0
- package/dist/NativeEditorBridge.js +37 -0
- package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
- package/dist/NativeEditorCollaborationTransport.js +275 -0
- package/dist/NativeEditorCreateConfig.d.ts +16 -0
- package/dist/NativeEditorCreateConfig.js +249 -0
- package/dist/NativeEditorCreateJson.d.ts +76 -0
- package/dist/NativeEditorCreateJson.js +474 -0
- package/dist/NativeEditorCreateValidation.d.ts +32 -0
- package/dist/NativeEditorCreateValidation.js +150 -0
- package/dist/NativeEditorDocumentBridge.d.ts +72 -0
- package/dist/NativeEditorDocumentBridge.js +305 -0
- package/dist/NativeEditorDocumentHandle.d.ts +70 -0
- package/dist/NativeEditorDocumentHandle.js +89 -0
- package/dist/NativeEditorLocalAwareness.d.ts +34 -0
- package/dist/NativeEditorLocalAwareness.js +153 -0
- package/dist/NativeEditorNativeModule.d.ts +48 -0
- package/dist/NativeEditorNativeModule.js +34 -0
- package/dist/NativeEditorRenderNormalization.d.ts +22 -0
- package/dist/NativeEditorRenderNormalization.js +274 -0
- package/dist/NativeEditorResultNormalization.d.ts +108 -0
- package/dist/NativeEditorResultNormalization.js +400 -0
- package/dist/NativeEditorTypes.d.ts +318 -0
- package/dist/NativeEditorTypes.js +15 -0
- package/dist/NativeEditorV2Decimal.d.ts +5 -0
- package/dist/NativeEditorV2Decimal.js +18 -0
- package/dist/NativeProseViewer.d.ts +122 -0
- package/dist/NativeProseViewer.js +130 -0
- package/dist/NativeRichTextEditor.d.ts +3 -0
- package/dist/NativeRichTextEditor.js +6 -0
- package/dist/ResourceLimits.d.ts +100 -0
- package/dist/ResourceLimits.js +80 -0
- package/dist/RichTextEditor.d.ts +4 -0
- package/dist/RichTextEditor.js +25 -0
- package/dist/RichTextEditorNativeTypes.d.ts +122 -0
- package/dist/RichTextEditorNativeTypes.js +2 -0
- package/dist/RichTextEditorNativeView.d.ts +12 -0
- package/dist/RichTextEditorNativeView.js +15 -0
- package/dist/RichTextEditorSerialization.d.ts +53 -0
- package/dist/RichTextEditorSerialization.js +283 -0
- package/dist/RichTextEditorTypes.d.ts +281 -0
- package/dist/RichTextEditorTypes.js +2 -0
- package/dist/ViewerConfiguration.d.ts +22 -0
- package/dist/ViewerConfiguration.js +6 -0
- package/dist/YjsCollaboration.d.ts +146 -0
- package/dist/YjsCollaboration.js +496 -0
- package/dist/addons.d.ts +193 -0
- package/dist/addons.js +122 -0
- package/dist/atomConstants.d.ts +3 -0
- package/dist/atomConstants.js +6 -0
- package/dist/atomInstances.d.ts +35 -0
- package/dist/atomInstances.js +79 -0
- package/dist/atomPolicy.d.ts +4 -0
- package/dist/atomPolicy.js +47 -0
- package/dist/atomUpdates.d.ts +2 -0
- package/dist/atomUpdates.js +38 -0
- package/dist/atoms.d.ts +92 -0
- package/dist/atoms.js +222 -0
- package/dist/attributeValidation.d.ts +4 -0
- package/dist/attributeValidation.js +97 -0
- package/dist/contentExpression.d.ts +6 -0
- package/dist/contentExpression.js +335 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +78 -0
- package/dist/listMarkers.d.ts +15 -0
- package/dist/listMarkers.js +21 -0
- package/dist/schemaDefinition.d.ts +143 -0
- package/dist/schemaDefinition.js +206 -0
- package/dist/schemaDocument.d.ts +17 -0
- package/dist/schemaDocument.js +69 -0
- package/dist/schemaDocumentConstruction.d.ts +5 -0
- package/dist/schemaDocumentConstruction.js +125 -0
- package/dist/schemaNormalization.d.ts +29 -0
- package/dist/schemaNormalization.js +313 -0
- package/dist/schemaPresets.d.ts +68 -0
- package/dist/schemaPresets.js +198 -0
- package/dist/schemaResolution.d.ts +9 -0
- package/dist/schemaResolution.js +211 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +28 -0
- package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
- package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
- package/dist/useEditorToolbarInteractions.d.ts +12 -0
- package/dist/useEditorToolbarInteractions.js +218 -0
- package/dist/useEditorToolbarItems.d.ts +8 -0
- package/dist/useEditorToolbarItems.js +280 -0
- package/dist/useEditorToolbarPresentation.d.ts +4 -0
- package/dist/useEditorToolbarPresentation.js +203 -0
- package/dist/useEditorToolbarState.d.ts +63 -0
- package/dist/useEditorToolbarState.js +108 -0
- package/dist/useFocusPreservingFrames.d.ts +17 -0
- package/dist/useFocusPreservingFrames.js +108 -0
- package/dist/useNativeEditor.d.ts +66 -0
- package/dist/useNativeEditor.js +370 -0
- package/dist/useRichTextEditorCommands.d.ts +21 -0
- package/dist/useRichTextEditorCommands.js +299 -0
- package/dist/useRichTextEditorEvents.d.ts +18 -0
- package/dist/useRichTextEditorEvents.js +216 -0
- package/dist/useRichTextEditorMentions.d.ts +11 -0
- package/dist/useRichTextEditorMentions.js +316 -0
- package/dist/useRichTextEditorPresentation.d.ts +5 -0
- package/dist/useRichTextEditorPresentation.js +178 -0
- package/dist/useRichTextEditorState.d.ts +180 -0
- package/dist/useRichTextEditorState.js +405 -0
- package/dist/useRichTextEditorUpdates.d.ts +10 -0
- package/dist/useRichTextEditorUpdates.js +308 -0
- package/dist/useViewerAtoms.d.ts +38 -0
- package/dist/useViewerAtoms.js +288 -0
- package/expo-module.config.json +13 -0
- package/ios/EditorAddons.swift +354 -0
- package/ios/EditorCodeHighlighting.swift +184 -0
- package/ios/EditorCore.xcframework/Info.plist +44 -0
- package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
- package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
- package/ios/EditorInteractionOverlays.swift +697 -0
- package/ios/EditorLayoutManager.swift +971 -0
- package/ios/EditorNodeTypes.swift +37 -0
- package/ios/EditorStyleSheet.swift +461 -0
- package/ios/EditorTextView+AttributedPatch.swift +305 -0
- package/ios/EditorTextView+Binding.swift +61 -0
- package/ios/EditorTextView+Caret.swift +333 -0
- package/ios/EditorTextView+Commands.swift +203 -0
- package/ios/EditorTextView+Delegate.swift +65 -0
- package/ios/EditorTextView+Diagnostics.swift +225 -0
- package/ios/EditorTextView+DragDrop.swift +290 -0
- package/ios/EditorTextView+ExternalComposition.swift +364 -0
- package/ios/EditorTextView+Images.swift +354 -0
- package/ios/EditorTextView+InputTraits.swift +200 -0
- package/ios/EditorTextView+KeyboardInput.swift +318 -0
- package/ios/EditorTextView+Layout.swift +245 -0
- package/ios/EditorTextView+MarkedText.swift +267 -0
- package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
- package/ios/EditorTextView+NativeMutation.swift +471 -0
- package/ios/EditorTextView+Reconciliation.swift +97 -0
- package/ios/EditorTextView+RenderPatch.swift +573 -0
- package/ios/EditorTextView+Rendering.swift +539 -0
- package/ios/EditorTextView+Selection.swift +542 -0
- package/ios/EditorTextView.swift +953 -0
- package/ios/EditorTheme.swift +626 -0
- package/ios/EditorV2Adapter+Commands.swift +204 -0
- package/ios/EditorV2Adapter+Envelope.swift +238 -0
- package/ios/EditorV2Adapter+Mutation.swift +392 -0
- package/ios/EditorV2Adapter+Registry.swift +185 -0
- package/ios/EditorV2Adapter+RenderState.swift +360 -0
- package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
- package/ios/EditorV2Adapter+Selection.swift +329 -0
- package/ios/EditorV2Adapter+TextCommands.swift +430 -0
- package/ios/EditorV2Adapter.swift +376 -0
- package/ios/EditorV2Shadow.swift +353 -0
- package/ios/Generated_editor_core.swift +2378 -0
- package/ios/NativeCodeHighlighting.swift +159 -0
- package/ios/NativeCollaborationSocket.swift +144 -0
- package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
- package/ios/NativeCollaborationTransport+Socket.swift +379 -0
- package/ios/NativeCollaborationTransport+Validation.swift +103 -0
- package/ios/NativeCollaborationTransport.swift +322 -0
- package/ios/NativeCollaborationTransportRegistry.swift +521 -0
- package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
- package/ios/NativeEditorExpoView+Binding.swift +268 -0
- package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
- package/ios/NativeEditorExpoView+Events.swift +131 -0
- package/ios/NativeEditorExpoView+Focus.swift +169 -0
- package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
- package/ios/NativeEditorExpoView+Mentions.swift +288 -0
- package/ios/NativeEditorExpoView+Properties.swift +300 -0
- package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
- package/ios/NativeEditorExpoView+Updates.swift +312 -0
- package/ios/NativeEditorExpoView.swift +349 -0
- package/ios/NativeEditorModule.swift +856 -0
- package/ios/NativeEditorViewRegistry.swift +226 -0
- package/ios/NativeToolbar+ButtonStyle.swift +214 -0
- package/ios/NativeToolbar+Buttons.swift +228 -0
- package/ios/NativeToolbar+Diagnostics.swift +114 -0
- package/ios/NativeToolbar+Menu.swift +101 -0
- package/ios/NativeToolbar+Models.swift +519 -0
- package/ios/NativeToolbar+Placeholder.swift +39 -0
- package/ios/NativeToolbar.swift +612 -0
- package/ios/OrderedListMarkerFormatter.swift +103 -0
- package/ios/PositionBridge.swift +596 -0
- package/ios/ProseViewerView.swift +462 -0
- package/ios/RenderBridge+Atoms.swift +288 -0
- package/ios/RenderBridge+Attachments.swift +246 -0
- package/ios/RenderBridge+BlockBoundaries.swift +313 -0
- package/ios/RenderBridge+Style.swift +343 -0
- package/ios/RenderBridge.swift +704 -0
- package/ios/RichTextEditorView.swift +930 -0
- package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
- package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
- package/ios/SharedNativeImagePipeline.swift +533 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
- package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
- package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
- package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
- package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
- package/ios/Viewer/NativeSVGPreflight.h +11 -0
- package/ios/Viewer/NativeSVGPreflight.mm +219 -0
- package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
- package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
- package/ios/Viewer/PreparedProseLayout.swift +326 -0
- package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
- package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
- package/ios/Viewer/ViewerDocument.swift +575 -0
- package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
- package/ios/Viewer/ViewerImagePipeline.swift +478 -0
- package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
- package/ios/editor_coreFFI/module.modulemap +7 -0
- package/package.json +151 -0
- package/react-native.config.js +17 -0
- package/rust/android/arm64-v8a/libeditor_core.so +0 -0
- package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
- package/rust/android/x86/libeditor_core.so +0 -0
- package/rust/android/x86_64/libeditor_core.so +0 -0
- package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
- package/src/AtomHost.tsx +180 -0
- package/src/DefaultAtomChip.tsx +27 -0
- package/src/EditorAddon.ts +65 -0
- package/src/EditorAddonNormalization.ts +49 -0
- package/src/EditorMentionThemeNormalization.ts +25 -0
- package/src/EditorMentionThemeValidation.ts +133 -0
- package/src/EditorStyleSheet.ts +9 -0
- package/src/EditorStyleSheetNormalization.ts +219 -0
- package/src/EditorStyleSheetTypes.ts +189 -0
- package/src/EditorTheme.ts +196 -0
- package/src/EditorToolbar.tsx +31 -0
- package/src/EditorToolbarComponent.tsx +23 -0
- package/src/EditorToolbarItems.tsx +64 -0
- package/src/EditorToolbarRegistry.tsx +254 -0
- package/src/EditorToolbarTypes.tsx +322 -0
- package/src/EditorToolbarVisuals.tsx +270 -0
- package/src/EditorUpdateRevision.ts +26 -0
- package/src/ExternalTextComposition.ts +658 -0
- package/src/ImageLoadingPolicy.ts +125 -0
- package/src/NativeEditorBoundaryError.ts +345 -0
- package/src/NativeEditorBridge.ts +93 -0
- package/src/NativeEditorCollaborationTransport.ts +493 -0
- package/src/NativeEditorCreateConfig.ts +326 -0
- package/src/NativeEditorCreateJson.ts +579 -0
- package/src/NativeEditorCreateValidation.ts +178 -0
- package/src/NativeEditorDocumentBridge.ts +485 -0
- package/src/NativeEditorDocumentHandle.ts +168 -0
- package/src/NativeEditorLocalAwareness.ts +168 -0
- package/src/NativeEditorNativeModule.ts +97 -0
- package/src/NativeEditorRenderNormalization.ts +320 -0
- package/src/NativeEditorResultNormalization.ts +469 -0
- package/src/NativeEditorTypes.ts +366 -0
- package/src/NativeEditorV2Decimal.ts +13 -0
- package/src/NativeProseViewer.tsx +356 -0
- package/src/NativeRichTextEditor.tsx +33 -0
- package/src/ResourceLimits.ts +187 -0
- package/src/RichTextEditor.tsx +27 -0
- package/src/RichTextEditorNativeTypes.tsx +144 -0
- package/src/RichTextEditorNativeView.tsx +21 -0
- package/src/RichTextEditorSerialization.tsx +381 -0
- package/src/RichTextEditorTypes.tsx +327 -0
- package/src/ViewerConfiguration.ts +23 -0
- package/src/YjsCollaboration.ts +692 -0
- package/src/addons.ts +311 -0
- package/src/atomConstants.ts +3 -0
- package/src/atomInstances.ts +123 -0
- package/src/atomPolicy.ts +47 -0
- package/src/atomUpdates.ts +52 -0
- package/src/atoms.ts +379 -0
- package/src/attributeValidation.ts +116 -0
- package/src/contentExpression.ts +338 -0
- package/src/index.ts +295 -0
- package/src/listMarkers.ts +18 -0
- package/src/schemaDefinition.ts +395 -0
- package/src/schemaDocument.ts +92 -0
- package/src/schemaDocumentConstruction.ts +148 -0
- package/src/schemaNormalization.ts +367 -0
- package/src/schemaPresets.ts +250 -0
- package/src/schemaResolution.ts +242 -0
- package/src/schemas.ts +43 -0
- package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
- package/src/useEditorToolbarInteractions.tsx +329 -0
- package/src/useEditorToolbarItems.tsx +390 -0
- package/src/useEditorToolbarPresentation.tsx +483 -0
- package/src/useEditorToolbarState.tsx +172 -0
- package/src/useFocusPreservingFrames.ts +171 -0
- package/src/useNativeEditor.ts +534 -0
- package/src/useRichTextEditorCommands.tsx +478 -0
- package/src/useRichTextEditorEvents.tsx +342 -0
- package/src/useRichTextEditorMentions.tsx +441 -0
- package/src/useRichTextEditorPresentation.tsx +563 -0
- package/src/useRichTextEditorState.tsx +620 -0
- package/src/useRichTextEditorUpdates.tsx +403 -0
- 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
|
+
}
|