@depup/react-native 0.86.0-depup.49 → 0.87.0-depup.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/Libraries/ActionSheetIOS/ActionSheetIOS.js +19 -24
- package/Libraries/Alert/Alert.js +38 -1
- package/Libraries/Animated/AnimatedExports.js +22 -0
- package/Libraries/Animated/AnimatedExports.js.flow +1 -1
- package/Libraries/Animated/AnimatedImplementation.js +120 -3
- package/Libraries/Animated/Easing.js +4 -3
- package/Libraries/Animated/NativeAnimatedAllowlist.js +37 -0
- package/Libraries/Animated/animations/Animation.js +14 -5
- package/Libraries/Animated/animations/DecayAnimation.js +1 -0
- package/Libraries/Animated/animations/SpringAnimation.js +1 -0
- package/Libraries/Animated/animations/TimingAnimation.js +9 -0
- package/Libraries/Animated/createAnimatedComponent.js +3 -3
- package/Libraries/Animated/nodes/AnimatedColor.js +8 -8
- package/Libraries/Animated/nodes/AnimatedInterpolation.js +106 -0
- package/Libraries/Animated/nodes/AnimatedProps.js +27 -3
- package/Libraries/Animated/nodes/AnimatedValue.js +8 -0
- package/Libraries/Animated/nodes/AnimatedValueXY.js +2 -2
- package/Libraries/AppDelegate/RCTAppDelegate.h +5 -9
- package/Libraries/AppDelegate/RCTAppDelegate.mm +0 -20
- package/Libraries/AppDelegate/RCTAppSetupUtils.h +0 -18
- package/Libraries/AppDelegate/RCTAppSetupUtils.mm +0 -78
- package/Libraries/AppDelegate/RCTDefaultReactNativeFactoryDelegate.mm +18 -21
- package/Libraries/AppDelegate/RCTReactNativeFactory.h +5 -41
- package/Libraries/AppDelegate/RCTReactNativeFactory.mm +0 -82
- package/Libraries/AppDelegate/RCTRootViewFactory.h +4 -1
- package/Libraries/AppDelegate/RCTRootViewFactory.mm +3 -101
- package/Libraries/AppDelegate/React-RCTAppDelegate.podspec +1 -0
- package/Libraries/AppState/AppState.d.ts +4 -1
- package/Libraries/AppState/AppState.js +32 -17
- package/Libraries/BatchedBridge/MessageQueue.js +42 -51
- package/Libraries/BatchedBridge/NativeModules.js +7 -0
- package/Libraries/Blob/Blob.js +7 -1
- package/Libraries/Blob/FileReader.js +6 -0
- package/Libraries/Blob/URLSearchParams.js.flow +1 -1
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +20 -9
- package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +30 -43
- package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +59 -49
- package/Libraries/Components/ActivityIndicator/ActivityIndicatorViewNativeComponent.js +2 -2
- package/Libraries/Components/Button.js +98 -183
- package/Libraries/Components/Clipboard/Clipboard.js +5 -0
- package/Libraries/Components/DrawerAndroid/AndroidDrawerLayoutNativeComponent.js +2 -2
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +8 -69
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts +10 -1
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.ios.js +2 -0
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroidTypes.js +26 -31
- package/Libraries/Components/Keyboard/Keyboard.js +23 -60
- package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +15 -7
- package/Libraries/Components/Pressable/Pressable.js +39 -17
- package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js +5 -6
- package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.js +4 -4
- package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidNativeComponent.js +2 -2
- package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidTypes.js +17 -0
- package/Libraries/Components/RefreshControl/AndroidSwipeRefreshLayoutNativeComponent.js +2 -2
- package/Libraries/Components/RefreshControl/PullToRefreshViewNativeComponent.js +2 -2
- package/Libraries/Components/RefreshControl/RefreshControl.js +40 -50
- package/Libraries/Components/SafeAreaView/RCTSafeAreaViewNativeComponent.js +2 -2
- package/Libraries/Components/SafeAreaView/SafeAreaView.js +8 -8
- package/Libraries/Components/ScrollView/AndroidHorizontalScrollContentViewNativeComponent.js +2 -2
- package/Libraries/Components/ScrollView/ScrollView.d.ts +55 -43
- package/Libraries/Components/ScrollView/ScrollView.js +205 -118
- package/Libraries/Components/ScrollView/ScrollViewCommands.js +4 -4
- package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +1 -1
- package/Libraries/Components/StatusBar/StatusBar.d.ts +7 -54
- package/Libraries/Components/StatusBar/StatusBar.js +84 -160
- package/Libraries/Components/Switch/AndroidSwitchNativeComponent.js +2 -2
- package/Libraries/Components/Switch/Switch.js +76 -75
- package/Libraries/Components/Switch/SwitchNativeComponent.js +2 -2
- package/Libraries/Components/TextInput/InputAccessoryView.js +13 -61
- package/Libraries/Components/TextInput/RCTInputAccessoryViewNativeComponent.js +2 -2
- package/Libraries/Components/TextInput/TextInput.d.ts +9 -2
- package/Libraries/Components/TextInput/TextInput.flow.js +19 -2
- package/Libraries/Components/TextInput/TextInput.js +116 -111
- package/Libraries/Components/TextInput/TextInputNativeCommands.js +3 -3
- package/Libraries/Components/ToastAndroid/ToastAndroid.android.js +25 -19
- package/Libraries/Components/Touchable/Touchable.js +94 -95
- package/Libraries/Components/Touchable/TouchableHighlight.js +45 -112
- package/Libraries/Components/Touchable/TouchableNativeFeedback.js +13 -25
- package/Libraries/Components/Touchable/TouchableOpacity.js +14 -84
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +4 -3
- package/Libraries/Components/UnimplementedViews/UnimplementedNativeViewNativeComponent.js +2 -2
- package/Libraries/Components/View/ReactNativeStyleAttributes.js +1 -0
- package/Libraries/Components/View/View.js +83 -86
- package/Libraries/Components/View/ViewAccessibility.d.ts +11 -1
- package/Libraries/Components/View/ViewAccessibility.js +16 -5
- package/Libraries/Components/View/ViewNativeComponent.js +4 -6
- package/Libraries/Components/View/ViewPropTypes.js +65 -13
- package/Libraries/Core/InitializeCore.js +9 -1
- package/Libraries/Core/ReactFiberErrorDialog.js +3 -3
- package/Libraries/Core/ReactNativeVersion.js +1 -1
- package/Libraries/Core/Timers/JSTimers.js +53 -52
- package/Libraries/Core/setUpGlobals.js +9 -4
- package/Libraries/Core/setUpNavigator.js +6 -1
- package/Libraries/Core/setUpReactDevTools.js +0 -118
- package/Libraries/Core/setUpXHR.js +6 -2
- package/Libraries/Debugging/DebuggingOverlay.js +2 -2
- package/Libraries/Debugging/DebuggingOverlayNativeComponent.js +2 -2
- package/Libraries/EventEmitter/NativeEventEmitter.js +29 -0
- package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +7 -7
- package/Libraries/EventEmitter/RCTNativeAppEventEmitter.js +3 -0
- package/Libraries/Image/AssetSourceResolver.js +18 -27
- package/Libraries/Image/Image.android.js +13 -2
- package/Libraries/Image/Image.ios.js +3 -1
- package/Libraries/Image/ImageBackground.js +30 -18
- package/Libraries/Image/ImageProps.js +116 -117
- package/Libraries/Image/ImageSource.d.ts +1 -1
- package/Libraries/Image/ImageSource.js +9 -9
- package/Libraries/Image/ImageSourceUtils.js +10 -7
- package/Libraries/Image/ImageTypes.flow.js +2 -0
- package/Libraries/Image/ImageViewNativeComponent.js +1 -1
- package/Libraries/Image/RCTImageLoader.mm +60 -63
- package/Libraries/Image/RCTImageStoreManager.h +0 -2
- package/Libraries/Image/RelativeImageStub.js +1 -1
- package/Libraries/Image/resolveAssetSource.js +1 -1
- package/Libraries/Interaction/PanResponder.js +102 -97
- package/Libraries/LayoutAnimation/LayoutAnimation.js +22 -6
- package/Libraries/Linking/Linking.js +24 -23
- package/Libraries/Lists/FlatList.d.ts +6 -17
- package/Libraries/Lists/FlatList.js +7 -8
- package/Libraries/Lists/SectionList.js +7 -0
- package/Libraries/Lists/VirtualizedList.js +3 -0
- package/Libraries/Lists/VirtualizedSectionList.js +4 -0
- package/Libraries/LogBox/LogBox.js +3 -3
- package/Libraries/LogBox/UI/AnsiHighlight.js +2 -1
- package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +2 -2
- package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +4 -1
- package/Libraries/LogBox/UI/LogBoxInspectorFooterButton.js +3 -1
- package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +8 -2
- package/Libraries/LogBox/UI/LogBoxInspectorMessageHeader.js +9 -2
- package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.js +17 -4
- package/Libraries/LogBox/UI/LogBoxInspectorSection.js +3 -1
- package/Libraries/LogBox/UI/LogBoxInspectorSourceMapStatus.js +3 -1
- package/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js +2 -0
- package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +4 -2
- package/Libraries/LogBox/UI/LogBoxMessage.js +18 -5
- package/Libraries/LogBox/UI/LogBoxNotificationCountBadge.js +4 -1
- package/Libraries/LogBox/UI/LogBoxNotificationMessage.js +1 -0
- package/Libraries/LogBox/UI/LogBoxStyle.js +0 -4
- package/Libraries/Modal/Modal.d.ts +5 -4
- package/Libraries/Modal/Modal.js +71 -37
- package/Libraries/Modal/RCTModalHostViewNativeComponent.js +2 -2
- package/Libraries/NativeComponent/BaseViewConfig.android.js +17 -0
- package/Libraries/NativeComponent/ViewConfig.js +3 -3
- package/Libraries/NativeComponent/ViewConfigIgnore.js +1 -1
- package/Libraries/Network/RCTHTTPRequestHandler.h +1 -1
- package/Libraries/Performance/Systrace.js +36 -0
- package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +4 -2
- package/Libraries/PermissionsAndroid/PermissionsAndroid.js +29 -17
- package/Libraries/Pressability/Pressability.js +1 -1
- package/Libraries/PushNotificationIOS/PushNotificationIOS.js +4 -0
- package/Libraries/ReactNative/AppContainer-dev.js +3 -1
- package/Libraries/ReactNative/AppRegistry.flow.js +1 -0
- package/Libraries/ReactNative/AppRegistry.js +15 -11
- package/Libraries/ReactNative/AppRegistryImpl.js +57 -11
- package/Libraries/ReactNative/DisplayMode.js +1 -1
- package/Libraries/ReactNative/FabricUIManager.js +29 -26
- package/Libraries/ReactNative/I18nManager.js +20 -0
- package/Libraries/ReactNative/UIManager.js +53 -0
- package/Libraries/ReactNative/renderApplication.js +1 -1
- package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +5 -126
- package/Libraries/ReactPrivate/ReactNativePrivateInterface.js.flow +5 -41
- package/Libraries/Renderer/shims/ReactNativeTypes.js +36 -36
- package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +4 -4
- package/Libraries/Settings/Settings.ios.js +22 -0
- package/Libraries/Share/Share.js +25 -28
- package/Libraries/StyleSheet/PlatformColorValueTypes.js.flow +6 -0
- package/Libraries/StyleSheet/StyleSheet.js +42 -2
- package/Libraries/StyleSheet/StyleSheet.js.flow +1 -1
- package/Libraries/StyleSheet/StyleSheetExports.js +7 -5
- package/Libraries/StyleSheet/StyleSheetExports.js.flow +1 -1
- package/Libraries/StyleSheet/StyleSheetTypes.d.ts +24 -3
- package/Libraries/StyleSheet/StyleSheetTypes.js +34 -6
- package/Libraries/StyleSheet/flattenStyle.js +28 -13
- package/Libraries/StyleSheet/private/_TransformStyle.js +16 -14
- package/Libraries/Text/Text.js +12 -9
- package/Libraries/Text/TextEffectNativeComponent.js +31 -0
- package/Libraries/Text/TextInput/Multiline/RCTUITextView.mm +0 -1
- package/Libraries/Text/TextInput/RCTBackedTextInputViewProtocol.h +0 -1
- package/Libraries/Text/TextInput/Singleline/RCTUITextField.mm +0 -1
- package/Libraries/Text/TextProps.js +59 -93
- package/Libraries/Text/requireNativeTextEffect.js +28 -0
- package/Libraries/TurboModule/RCTExport.js +1 -1
- package/Libraries/Types/CoreEventTypes.d.ts +8 -0
- package/Libraries/Types/CoreEventTypes.js +32 -29
- package/Libraries/Types/UIManagerJSInterface.js +2 -2
- package/Libraries/Utilities/Appearance.d.ts +32 -17
- package/Libraries/Utilities/Appearance.js +35 -18
- package/Libraries/Utilities/BackHandler.android.js +13 -28
- package/Libraries/Utilities/BackHandler.js.flow +18 -2
- package/Libraries/Utilities/DevSettings.js +8 -1
- package/Libraries/Utilities/Dimensions.js +18 -12
- package/Libraries/Utilities/PixelRatio.js +5 -2
- package/Libraries/Utilities/Platform.js.flow +4 -0
- package/Libraries/Utilities/PlatformTypes.js +77 -0
- package/Libraries/Utilities/differ/deepDiffer.js +5 -2
- package/Libraries/Utilities/useColorScheme.js +11 -1
- package/Libraries/Utilities/useWindowDimensions.js +6 -0
- package/Libraries/Vibration/Vibration.js +14 -11
- package/Libraries/vendor/emitter/EventEmitter.js +3 -3
- package/README.md +7 -9
- package/React/Base/RCTBridge+Private.h +0 -22
- package/React/Base/RCTBridge.h +10 -8
- package/React/Base/RCTBridge.mm +5 -447
- package/React/Base/RCTBridgeDelegate.h +1 -56
- package/React/Base/RCTBridgeModule.h +0 -9
- package/React/Base/RCTBridgeProxy.h +8 -0
- package/React/Base/RCTBridgeProxy.mm +3 -20
- package/React/Base/RCTBundleManager.h +0 -3
- package/React/Base/RCTBundleManager.m +0 -31
- package/React/Base/RCTBundleURLProvider.mm +4 -4
- package/React/Base/RCTCallableJSModules.m +0 -18
- package/React/Base/RCTConstants.h +1 -0
- package/React/Base/RCTConstants.m +1 -0
- package/React/Base/RCTConvert.mm +3 -0
- package/React/Base/RCTDisplayLink.h +3 -1
- package/React/Base/RCTJavaScriptExecutor.h +0 -69
- package/React/Base/RCTModuleData.mm +2 -483
- package/React/Base/RCTModuleRegistry.m +0 -25
- package/React/Base/RCTRootView.m +3 -374
- package/React/Base/RCTUtils.h +0 -3
- package/React/Base/RCTUtils.mm +17 -27
- package/React/Base/RCTVersion.m +1 -1
- package/React/Base/RCTViewRegistry.m +1 -29
- package/React/Base/Surface/RCTSurface.mm +1 -582
- package/React/Base/Surface/RCTSurfaceRootShadowView.m +0 -89
- package/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm +0 -1
- package/React/CoreModules/PlatformStubs/RCTStatusBarManager.mm +0 -2
- package/React/CoreModules/RCTAlertController.mm +1 -0
- package/React/CoreModules/RCTAlertManager.mm +0 -5
- package/React/CoreModules/RCTLogBox.mm +0 -11
- package/React/CoreModules/RCTLogBoxView.h +0 -3
- package/React/CoreModules/RCTLogBoxView.mm +0 -31
- package/React/CoreModules/RCTPerfMonitor.mm +0 -2
- package/React/CoreModules/RCTStatusBarManager.mm +0 -11
- package/React/CxxModule/RCTCxxUtils.h +0 -8
- package/React/CxxModule/RCTCxxUtils.mm +0 -17
- package/React/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec-generated.mm +179 -7
- package/React/FBReactNativeSpec/FBReactNativeSpec/FBReactNativeSpec.h +100 -2
- package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +373 -119
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/ComponentDescriptors.cpp +1 -1
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/ComponentDescriptors.h +1 -1
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/EventEmitters.cpp +71 -71
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/EventEmitters.h +96 -96
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/Props.cpp +357 -363
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/Props.h +211 -212
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/RCTComponentViewHelpers.h +107 -107
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/ShadowNodes.cpp +1 -1
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/ShadowNodes.h +11 -11
- package/React/FBReactNativeSpec/react/renderer/components/FBReactNativeSpec/States.h +2 -2
- package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.h +4 -0
- package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm +4 -0
- package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.h +4 -0
- package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm +5 -0
- package/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm +0 -1
- package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.mm +14 -0
- package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +12 -3
- package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTVirtualViewContainerState.mm +12 -26
- package/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm +39 -4
- package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +5 -5
- package/React/Fabric/Mounting/ComponentViews/VirtualView/RCTVirtualViewComponentView.mm +0 -18
- package/React/Fabric/Mounting/RCTComponentViewFactory.mm +9 -5
- package/React/Fabric/RCTSurfacePresenter.mm +86 -5
- package/React/Fabric/RCTSurfacePresenterBridgeAdapter.h +2 -0
- package/React/I18n/RCTLocalizedString.mm +38 -2
- package/React/Modules/RCTEventEmitter.m +30 -10
- package/React/Modules/RCTI18nUtil.m +3 -1
- package/React/Modules/RCTUIManager.mm +0 -1501
- package/React/React-RCTFBReactNativeSpec.podspec +1 -1
- package/React/Tests/Text/RCTAttributedTextUtilsTest.mm +27 -0
- package/React/Views/RCTModalHostViewController.h +0 -15
- package/React/Views/RCTModalHostViewManager.h +0 -24
- package/React/Views/RCTShadowView.h +0 -2
- package/React/Views/RCTShadowView.m +0 -723
- package/React/Views/ScrollView/RCTScrollView.h +0 -81
- package/React/Views/ScrollView/RCTScrollableProtocol.h +0 -4
- package/React-Core-prebuilt.podspec +45 -17
- package/React-Core.podspec +9 -2
- package/ReactAndroid/api/ReactAndroid.api +128 -142
- package/ReactAndroid/build.gradle.kts +26 -21
- package/ReactAndroid/external-artifacts/build.gradle.kts +49 -0
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/hermes-engine/build.gradle.kts +14 -14
- package/ReactAndroid/src/debug/AndroidManifest.xml +6 -0
- package/ReactAndroid/src/debugOptimized/AndroidManifest.xml +22 -0
- package/ReactAndroid/src/main/java/com/facebook/react/BaseReactPackage.kt +3 -7
- package/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java +4 -2
- package/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.kt +4 -6
- package/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +5 -7
- package/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.kt +212 -0
- package/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +0 -16
- package/ReactAndroid/src/main/java/com/facebook/react/animated/PropsAnimatedNode.kt +6 -1
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/Arguments.kt +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeReactContext.kt +287 -0
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/ColorPropConverter.kt +16 -0
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +15 -2
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/interop/InteropModuleRegistry.kt +1 -3
- package/ReactAndroid/src/main/java/com/facebook/react/common/build/ReactBuildConfig.kt +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/MapBuffer.kt +50 -2
- package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.kt +63 -22
- package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/WritableMapBuffer.kt +33 -0
- package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt +4 -12
- package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactActivityDelegate.kt +14 -10
- package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactNativeHost.kt +6 -6
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/BundleDownloader.kt +50 -47
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.kt +0 -4
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerFactory.kt +10 -10
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/LocalNetworkPermissionUtil.kt +49 -0
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/MultipartStreamReader.kt +101 -26
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +40 -38
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerBinding.kt +1 -10
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerProviderImpl.kt +0 -3
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/ViewTransitionSnapshotManager.kt +15 -11
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountItemDispatcher.kt +4 -4
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.kt +7 -13
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.kt +195 -194
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/SynchronousMountItem.kt +12 -8
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +30 -66
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +51 -111
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +11 -23
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +12 -24
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +57 -123
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt +7 -5
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Experimental_Android.kt +3 -5
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +11 -23
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeNewArchitectureFeatureFlags.kt +0 -24
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeNewArchitectureFeatureFlagsDefaults.kt +0 -4
- package/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/AppearanceModule.kt +1 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.kt +3 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.kt +50 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkEventUtil.kt +53 -3
- package/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.kt +2 -77
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessCatalystInstance.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.kt +9 -4
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.kt +4 -19
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactInstance.kt +1 -5
- package/ReactAndroid/src/main/java/com/facebook/react/touch/ReactInterceptingViewGroup.kt +4 -4
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +46 -9
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/DisplayMetricsHolder.kt +1 -49
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/HasChildPressedStateDelay.kt +29 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSPointerDispatcher.kt +796 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.kt +2 -4
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.kt +27 -27
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.kt +184 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.kt +486 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java +8 -8
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/SkewMatrixHelper.kt +200 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ThemedReactContext.kt +3 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.kt +6 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/TransformHelper.kt +2 -2
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIBlock.kt +7 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.kt +645 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.kt +2 -3
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.kt +142 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewGroupManager.kt +0 -10
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java +3 -3
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.kt +527 -0
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewProps.kt +3 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/style/BorderRadiusStyle.kt +6 -6
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/style/ColorStop.kt +6 -0
- package/ReactAndroid/src/main/java/com/facebook/react/util/AndroidVersion.kt +7 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayout.kt +8 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.kt +0 -3
- package/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.kt +2 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ReactProgressBarViewManager.kt +4 -4
- package/ReactAndroid/src/main/java/com/facebook/react/views/safeareaview/ReactSafeAreaView.kt +2 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.kt +1640 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.kt +6 -6
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.kt +1317 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollViewManager.kt +7 -7
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.kt +1309 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.kt +6 -6
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainer.kt +19 -33
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateClassic.kt +8 -6
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/VirtualViewContainerStateExperimental.kt +4 -4
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/generate-nested-scroll-view.js +13 -20
- package/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/ReactSwipeRefreshLayout.kt +7 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/MutableSpannableLayout.kt +107 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/PreparedLayoutTextView.kt +122 -10
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +91 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.kt +3 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTypefaceUtils.kt +41 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.kt +48 -2
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextDecorationStyle.kt +200 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextEffectRegistry.kt +45 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextEffectSpanFactory.kt +17 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.kt +361 -15
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/AnimatedEffectSpan.kt +37 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/{DrawCommandSpan.kt → CanvasEffectSpan.kt} +3 -4
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/CustomStyleSpan.kt +23 -3
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactStrikethroughSpan.kt +30 -3
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/ReactUnderlineSpan.kt +25 -3
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/SetSpanOperation.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StatefulSpan.kt +21 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/TextEffectSpan.kt +19 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/TouchableSpan.kt +29 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +81 -9
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.kt +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.kt +3 -17
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.kt +8 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/WindowUtil.kt +2 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/virtual/VirtualViewRenderState.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/virtual/view/ReactVirtualView.kt +7 -8
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaAlign.kt +45 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaBoxSizing.kt +27 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaConfig.kt +15 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaConfigJNIBase.kt +6 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaDimension.kt +27 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaDisplay.kt +31 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaEdge.kt +41 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaErrata.kt +37 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.kt +27 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaFlexDirection.kt +31 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaGridTrackType.kt +33 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaGutter.kt +29 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaJustify.kt +43 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaLogLevel.kt +39 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaMeasureMode.kt +29 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNative.kt +16 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.kt +12 -2
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.kt +762 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIFinalizer.kt +4 -4
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeType.kt +27 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaOverflow.kt +29 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaPositionType.kt +29 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaProps.kt +24 -2
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaUnit.kt +37 -0
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaWrap.kt +29 -0
- package/ReactAndroid/src/main/jni/CMakeLists.txt +1 -2
- package/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp +94 -0
- package/ReactAndroid/src/main/jni/react/devsupport/JCxxInspectorPackagerConnectionDelegateImpl.cpp +3 -0
- package/ReactAndroid/src/main/jni/react/fabric/AndroidAnimationChoreographer.h +10 -10
- package/ReactAndroid/src/main/jni/react/fabric/CoreComponentsRegistry.cpp +3 -0
- package/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.cpp +12 -15
- package/ReactAndroid/src/main/jni/react/fabric/FabricUIManagerBinding.h +1 -3
- package/ReactAndroid/src/main/jni/react/fabric/test/FabricMountingManagerTest.cpp +159 -0
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +69 -153
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +15 -33
- package/ReactAndroid/src/main/jni/react/jni/JReactMarker.cpp +10 -24
- package/ReactAndroid/src/main/jni/react/jni/JReactMarker.h +0 -2
- package/ReactAndroid/src/main/jni/react/mapbuffer/react/common/mapbuffer/JWritableMapBuffer.cpp +13 -0
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactInstance.cpp +4 -1
- package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.cpp +8 -0
- package/ReactAndroid/src/main/jni/react/turbomodule/ReactCommon/TurboModuleManager.h +4 -0
- package/ReactAndroid/src/main/res/views/uimanager/values/ids.xml +5 -0
- package/ReactAndroid/src/main/res/views/uimanager/values-zu/strings.xml +3 -0
- package/ReactApple/RCTAnimatedModuleProvider/React-RCTAnimatedModuleProvider.podspec +63 -0
- package/ReactCommon/React-Fabric.podspec +2 -0
- package/ReactCommon/ReactCommon.podspec +2 -12
- package/ReactCommon/cmake-utils/react-native-flags.cmake +1 -3
- package/ReactCommon/cxxreact/CMakeLists.txt +1 -0
- package/ReactCommon/cxxreact/ErrorUtils.h +2 -32
- package/ReactCommon/cxxreact/Instance.cpp +1 -26
- package/ReactCommon/cxxreact/Instance.h +0 -2
- package/ReactCommon/cxxreact/NativeToJsBridge.cpp +3 -2
- package/ReactCommon/cxxreact/RAMBundleRegistry.cpp +0 -12
- package/ReactCommon/cxxreact/RAMBundleRegistry.h +0 -5
- package/ReactCommon/cxxreact/React-cxxreact.podspec +2 -1
- package/ReactCommon/cxxreact/ReactMarker.cpp +4 -30
- package/ReactCommon/cxxreact/ReactMarker.h +38 -21
- package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
- package/ReactCommon/cxxreact/TraceSection.h +1 -1
- package/ReactCommon/cxxreact/tests/methodcall.cpp +4 -0
- package/ReactCommon/hermes/executor/HermesExecutorFactory.cpp +6 -79
- package/ReactCommon/jserrorhandler/ErrorUtils.cpp +42 -0
- package/{React/CxxLogUtils/RCTDefaultCxxLogFunction.h → ReactCommon/jserrorhandler/ErrorUtils.h} +2 -2
- package/ReactCommon/jserrorhandler/JsErrorHandler.cpp +1 -1
- package/ReactCommon/jserrorhandler/React-jserrorhandler.podspec +2 -3
- package/ReactCommon/jsi/jsi/hermes-interfaces.h +53 -0
- package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +2 -1
- package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +3 -14
- package/ReactCommon/jsiexecutor/jsireact/JSINativeModules.cpp +4 -13
- package/ReactCommon/jsinspector-modern/HostAgent.cpp +54 -0
- package/ReactCommon/jsinspector-modern/HostTarget.h +0 -7
- package/ReactCommon/jsinspector-modern/HostTargetTraceRecording.cpp +10 -7
- package/ReactCommon/jsinspector-modern/InspectorPackagerConnection.cpp +4 -1
- package/ReactCommon/jsinspector-modern/RuntimeAgent.cpp +7 -0
- package/ReactCommon/jsinspector-modern/RuntimeTarget.cpp +20 -0
- package/ReactCommon/jsinspector-modern/RuntimeTarget.h +16 -0
- package/ReactCommon/jsinspector-modern/SessionState.h +31 -0
- package/ReactCommon/jsinspector-modern/tests/HostTargetTest.cpp +53 -0
- package/ReactCommon/jsinspector-modern/tracing/HostTracingProfile.h +14 -1
- package/ReactCommon/jsinspector-modern/tracing/TraceRecordingState.h +11 -0
- package/ReactCommon/react/bridging/ArrayBuffer.h +180 -0
- package/ReactCommon/react/bridging/Bridging.h +1 -0
- package/ReactCommon/react/bridging/Convert.h +12 -0
- package/ReactCommon/react/bridging/React-bridging.podspec +44 -0
- package/ReactCommon/react/bridging/tests/BridgingTest.cpp +185 -11
- package/ReactCommon/react/bridging/tests/ClassTest.cpp +22 -0
- package/ReactCommon/react/cxxstableapi/CMakeLists.txt +18 -0
- package/ReactCommon/react/cxxstableapi/FrameworksGuard.h +35 -0
- package/ReactCommon/react/cxxstableapi/PrivateGuard.h +34 -0
- package/ReactCommon/react/cxxstableapi/React-cxxstableapi.podspec +34 -0
- package/ReactCommon/react/cxxstableapi/UmbrellaGuard.h +53 -0
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +21 -45
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +26 -56
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +134 -242
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +14 -26
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +20 -44
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +43 -97
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h +10 -6
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSExperimental.h +3 -7
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSStable.h +0 -8
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +7 -13
- package/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.h +1 -0
- package/ReactCommon/react/nativemodule/core/iostests/RCTTurboModuleTests.mm +49 -0
- package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaInteropTurboModule.cpp +4 -0
- package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaInteropTurboModule.h +4 -0
- package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/React-NativeModulesApple.podspec +1 -1
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.h +4 -0
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTInteropTurboModule.mm +4 -0
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +60 -3
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.h +0 -9
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleManager.mm +37 -139
- package/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModuleWithJSIBindings.h +0 -3
- package/ReactCommon/react/nativemodule/defaults/DefaultTurboModules.cpp +6 -0
- package/ReactCommon/react/nativemodule/dom/NativeDOM.cpp +10 -4
- package/ReactCommon/react/nativemodule/dom/React-domnativemodule.podspec +1 -0
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +25 -55
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +11 -23
- package/ReactCommon/react/nativemodule/idlecallbacks/React-idlecallbacksnativemodule.podspec +1 -0
- package/ReactCommon/react/nativemodule/intersectionobserver/React-intersectionobservernativemodule.podspec +1 -0
- package/ReactCommon/react/nativemodule/mutationobserver/NativeMutationObserver.cpp +4 -0
- package/ReactCommon/react/nativemodule/mutationobserver/React-mutationobservernativemodule.podspec +1 -0
- package/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTSampleTurboModule.h +1 -1
- package/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec +1 -0
- package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.cpp +95 -63
- package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManager.h +20 -1
- package/ReactCommon/react/renderer/animated/NativeAnimatedNodesManagerProvider.cpp +7 -10
- package/ReactCommon/react/renderer/animated/drivers/FrameAnimationDriver.cpp +20 -1
- package/ReactCommon/react/renderer/animated/drivers/FrameAnimationDriver.h +1 -0
- package/ReactCommon/react/renderer/animated/nodes/InterpolationAnimatedNode.cpp +67 -6
- package/ReactCommon/react/renderer/animated/nodes/InterpolationAnimatedNode.h +12 -0
- package/ReactCommon/react/renderer/animated/nodes/PropsAnimatedNode.cpp +25 -13
- package/ReactCommon/react/renderer/animated/nodes/PropsAnimatedNode.h +7 -0
- package/ReactCommon/react/renderer/animated/tests/AnimationDriverTests.cpp +48 -0
- package/ReactCommon/react/renderer/animated/tests/DecayAnimationDriverTest.cpp +245 -0
- package/ReactCommon/react/renderer/animated/tests/ManagedPropsMountingOverrideTests.cpp +204 -0
- package/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.cpp +10 -1
- package/ReactCommon/react/renderer/animationbackend/AnimatedPropsRegistry.h +1 -0
- package/ReactCommon/react/renderer/animationbackend/AnimationBackend.cpp +17 -0
- package/ReactCommon/react/renderer/animations/tests/LayoutAnimationTest.cpp +0 -2
- package/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +6 -2
- package/ReactCommon/react/renderer/attributedstring/TextAttributes.h +25 -1
- package/ReactCommon/react/renderer/attributedstring/conversions.h +29 -1
- package/ReactCommon/react/renderer/attributedstring/primitives.h +4 -2
- package/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp +73 -0
- package/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +6 -0
- package/ReactCommon/react/renderer/components/image/ImageProps.cpp +79 -126
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropShadowNode.cpp +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropShadowNode.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropState.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewProps.cpp +5 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewProps.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.cpp +5 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticComponentDescriptor.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.cpp +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerAutomaticShadowNode.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/UnstableLegacyViewManagerInteropComponentDescriptor.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/platform/ios/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/platform/ios/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm +5 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/platform/ios/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h +4 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/platform/ios/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm +5 -0
- package/ReactCommon/react/renderer/components/scrollview/BaseScrollViewProps.cpp +235 -352
- package/ReactCommon/react/renderer/components/scrollview/platform/android/react/renderer/components/scrollview/HostPlatformScrollViewProps.cpp +30 -46
- package/ReactCommon/react/renderer/components/text/BaseParagraphProps.cpp +17 -27
- package/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +8 -10
- package/ReactCommon/react/renderer/components/text/BaseTextShadowNode.cpp +19 -0
- package/ReactCommon/react/renderer/components/text/TextEffectComponentDescriptor.h +17 -0
- package/ReactCommon/react/renderer/components/text/TextEffectProps.cpp +59 -0
- package/ReactCommon/react/renderer/components/text/TextEffectProps.h +30 -0
- package/{Libraries/Text/VirtualText/RCTVirtualTextView.mm → ReactCommon/react/renderer/components/text/TextEffectShadowNode.cpp} +4 -6
- package/ReactCommon/react/renderer/components/text/TextEffectShadowNode.h +26 -0
- package/ReactCommon/react/renderer/components/text/platform/android/react/renderer/components/text/HostPlatformParagraphProps.cpp +18 -28
- package/ReactCommon/react/renderer/components/text/tests/BaseTextShadowNodeTest.cpp +15 -0
- package/ReactCommon/react/renderer/components/textinput/platform/android/react/renderer/components/androidtextinput/AndroidTextInputProps.cpp +42 -50
- package/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp +168 -754
- package/ReactCommon/react/renderer/components/view/AccessibilityProps.h +0 -9
- package/ReactCommon/react/renderer/components/view/BaseViewProps.cpp +248 -312
- package/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp +0 -6
- package/ReactCommon/react/renderer/components/view/ViewShadowNode.h +2 -12
- package/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +73 -27
- package/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.h +7 -9
- package/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp +3 -11
- package/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/HostPlatformViewProps.cpp +82 -162
- package/ReactCommon/react/renderer/components/view/primitives.h +5 -0
- package/ReactCommon/react/renderer/components/view/propsConversions.h +74 -42
- package/ReactCommon/react/renderer/components/view/tests/LayoutTest.cpp +5 -5
- package/ReactCommon/react/renderer/components/view/tests/ViewTest.cpp +353 -6
- package/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +41 -16
- package/ReactCommon/react/renderer/core/ConcreteShadowNode.h +19 -0
- package/ReactCommon/react/renderer/core/EventEmitter.cpp +20 -4
- package/ReactCommon/react/renderer/core/LayoutMetrics.h +3 -0
- package/ReactCommon/react/renderer/core/Props.cpp +8 -39
- package/ReactCommon/react/renderer/core/Props.h +63 -13
- package/ReactCommon/react/renderer/core/RawProps.cpp +20 -3
- package/ReactCommon/react/renderer/core/RawProps.h +44 -0
- package/ReactCommon/react/renderer/core/RawPropsKeyMap.cpp +11 -27
- package/ReactCommon/react/renderer/core/RawPropsKeyMap.h +3 -3
- package/ReactCommon/react/renderer/core/RawPropsParser.cpp +4 -6
- package/ReactCommon/react/renderer/core/RawPropsParser.h +3 -3
- package/ReactCommon/react/renderer/core/ShadowNode.cpp +27 -19
- package/ReactCommon/react/renderer/core/ShadowNodeFamily.h +2 -0
- package/ReactCommon/react/renderer/core/StateData.h +4 -4
- package/ReactCommon/react/renderer/core/propsConversions.h +3 -7
- package/ReactCommon/react/renderer/core/tests/ComponentDescriptorTest.cpp +8 -0
- package/ReactCommon/react/renderer/core/tests/FindNodeAtPointTest.cpp +7 -7
- package/ReactCommon/react/renderer/core/tests/LayoutableShadowNodeTest.cpp +19 -19
- package/ReactCommon/react/renderer/core/tests/PropsConceptsTest.cpp +135 -0
- package/ReactCommon/react/renderer/core/tests/RawPropsTest.cpp +43 -53
- package/ReactCommon/react/renderer/element/tests/ElementTest.cpp +3 -3
- package/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h +17 -0
- package/ReactCommon/react/renderer/imagemanager/platform/ios/react/renderer/imagemanager/RCTSyncImageManager.mm +1 -1
- package/ReactCommon/react/renderer/mapbuffer/MapBuffer.cpp +123 -33
- package/ReactCommon/react/renderer/mapbuffer/MapBuffer.h +26 -14
- package/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.cpp +96 -53
- package/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h +4 -0
- package/ReactCommon/react/renderer/mapbuffer/tests/MapBufferTest.cpp +96 -1
- package/ReactCommon/react/renderer/mounting/Differentiator.cpp +29 -318
- package/ReactCommon/react/renderer/mounting/ShadowTree.cpp +105 -33
- package/ReactCommon/react/renderer/mounting/ShadowTree.h +2 -0
- package/ReactCommon/react/renderer/mounting/tests/DifferentiatorUnflattenTest.cpp +11 -3
- package/ReactCommon/react/renderer/mounting/tests/OrderIndexTest.cpp +1 -1
- package/ReactCommon/react/renderer/mounting/tests/ShadowTreeLifeCycleTest.cpp +15 -250
- package/ReactCommon/react/renderer/mounting/tests/ShadowTreeReactBranchingTest.cpp +141 -0
- package/ReactCommon/react/renderer/mounting/tests/StackingContextTest.cpp +1 -1
- package/ReactCommon/react/renderer/runtimescheduler/CMakeLists.txt +1 -0
- package/ReactCommon/react/renderer/runtimescheduler/React-runtimescheduler.podspec +1 -0
- package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +22 -2
- package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h +13 -2
- package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.cpp +13 -0
- package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Legacy.h +9 -0
- package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.cpp +43 -5
- package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler_Modern.h +17 -1
- package/ReactCommon/react/renderer/runtimescheduler/Task.h +4 -0
- package/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp +113 -8
- package/ReactCommon/react/renderer/scheduler/Scheduler.cpp +14 -6
- package/ReactCommon/react/renderer/scheduler/Scheduler.h +3 -2
- package/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp +1 -85
- package/ReactCommon/react/renderer/scheduler/SurfaceHandler.h +0 -6
- package/ReactCommon/react/renderer/scheduler/tests/SchedulerDelegateInvalidationTest.cpp +671 -0
- package/ReactCommon/react/renderer/textlayoutmanager/TextMeasureCache.h +22 -5
- package/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp +4 -2
- package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h +11 -0
- package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +65 -26
- package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +193 -1
- package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextPrimitivesConversions.h +14 -2
- package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/TextLayoutManager.mm +2 -1
- package/ReactCommon/react/renderer/textlayoutmanager/tests/TextLayoutManagerTest.cpp +86 -5
- package/ReactCommon/react/renderer/uimanager/UIManager.cpp +89 -94
- package/ReactCommon/react/renderer/uimanager/UIManager.h +2 -2
- package/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h +1 -1
- package/ReactCommon/react/renderer/uimanager/tests/FabricUIManagerTest.cpp +144 -3
- package/ReactCommon/react/renderer/uimanager/tests/FindShadowNodeByTagTest.cpp +1 -52
- package/ReactCommon/react/renderer/uimanager/tests/PointerEventsProcessorTest.cpp +4 -4
- package/ReactCommon/react/renderer/viewtransition/ViewTransitionModule.cpp +88 -39
- package/ReactCommon/react/renderer/viewtransition/ViewTransitionModule.h +12 -2
- package/ReactCommon/react/runtime/PlatformTimerRegistry.h +10 -0
- package/ReactCommon/react/runtime/ReactInstance.cpp +79 -64
- package/ReactCommon/react/runtime/hermes/HermesInstance.cpp +0 -89
- package/ReactCommon/react/runtime/iostests/MainQueueCoordinatorTests.mm +99 -0
- package/ReactCommon/react/runtime/iostests/RCTInstanceTests.mm +244 -0
- package/ReactCommon/react/runtime/platform/ios/ReactCommon/ObjCTimerRegistry.h +1 -1
- package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTInstance.mm +47 -30
- package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTJscInstance.mm +3 -2
- package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTPerformanceLoggerUtils.mm +3 -2
- package/ReactCommon/react/runtime/tests/cxx/ReactInstanceTest.cpp +27 -3
- package/ReactCommon/react/runtime/tests/cxx/RuntimeExecutorShutdownTest.cpp +155 -0
- package/ReactCommon/react/utils/Telemetry.h +0 -13
- package/ReactCommon/react/utils/tests/Base64Tests.cpp +36 -0
- package/ReactCommon/reactperflogger/reactperflogger/ReactPerfettoLogger.cpp +0 -1
- package/ReactCommon/runtimeexecutor/platform/ios/ReactCommon/RuntimeExecutorSyncUIThreadUtils.mm +21 -38
- package/ReactCommon/yoga/Yoga.podspec +1 -1
- package/ReactCommon/yoga/yoga/YGEnums.cpp +2 -0
- package/ReactCommon/yoga/yoga/YGEnums.h +1 -0
- package/ReactCommon/yoga/yoga/YGNode.cpp +27 -0
- package/ReactCommon/yoga/yoga/YGNode.h +69 -0
- package/ReactCommon/yoga/yoga/YGNodeLayout.h +0 -2
- package/ReactCommon/yoga/yoga/algorithm/AbsoluteLayout.cpp +2 -1
- package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.cpp +294 -17
- package/ReactCommon/yoga/yoga/algorithm/CalculateLayout.h +1 -1
- package/ReactCommon/yoga/yoga/config/Config.h +1 -1
- package/ReactCommon/yoga/yoga/enums/Errata.h +1 -0
- package/ReactCommon/yoga/yoga/node/LayoutResults.h +8 -0
- package/ReactCommon/yoga/yoga/node/Node.cpp +32 -0
- package/ReactCommon/yoga/yoga/node/Node.h +33 -0
- package/changes.json +6 -14
- package/cli.js +3 -182
- package/flow/bom.js.flow +42 -42
- package/flow/cssom.js.flow +21 -21
- package/flow/dom.js.flow +128 -128
- package/flow/global.js +6 -0
- package/gradle/libs.versions.toml +7 -5
- package/index.js +53 -86
- package/index.js.flow +53 -23
- package/package.json +49 -68
- package/react-native.config.js +82 -1
- package/scripts/cocoapods/fabric.rb +1 -1
- package/scripts/cocoapods/jsengine.rb +1 -1
- package/scripts/cocoapods/new_architecture.rb +1 -1
- package/scripts/cocoapods/rncore.rb +36 -78
- package/scripts/cocoapods/rncore_facades.rb +232 -0
- package/scripts/cocoapods/rndependencies.rb +64 -3
- package/scripts/cocoapods/rndeps_facades.rb +193 -0
- package/scripts/cocoapods/spm.rb +78 -11
- package/scripts/cocoapods/utils.rb +5 -7
- package/scripts/codegen/generate-artifacts-executor/generateSchemaInfos.js +0 -1
- package/scripts/codegen/templates/Package.swift.spm-template +97 -0
- package/scripts/codegen/templates/ReactCodegen.podspec.template +1 -1
- package/scripts/hermes/hermes-utils.js +27 -58
- package/scripts/react-native-xcode.sh +20 -0
- package/scripts/react_native_pods.rb +71 -21
- package/scripts/react_native_pods_utils/script_phases.sh +4 -3
- package/scripts/replace-rncore-version.js +57 -86
- package/scripts/setup-apple-spm.js +1267 -0
- package/scripts/spm/__doc__/rfc-spm-xcframework.md +707 -0
- package/scripts/spm/__doc__/spm-autolinking-plugins.md +244 -0
- package/scripts/spm/__doc__/spm-header-paths-contract.md +97 -0
- package/scripts/spm/__doc__/spm-plugins-assessment.md +128 -0
- package/scripts/spm/__doc__/spm-scripts.md +486 -0
- package/scripts/spm/autolinking-plugins.js +331 -0
- package/scripts/spm/download-spm-artifacts.js +1409 -0
- package/scripts/spm/expand-spm-dependencies.js +216 -0
- package/scripts/spm/flavored-frameworks.js +1008 -0
- package/scripts/spm/generate-spm-autolinking-config.js +221 -0
- package/scripts/spm/generate-spm-autolinking.js +1888 -0
- package/scripts/spm/generate-spm-package.js +302 -0
- package/scripts/spm/generate-spm-xcodeproj.js +2266 -0
- package/scripts/spm/read-podspec.js +695 -0
- package/scripts/spm/scaffold-package-swift.js +1206 -0
- package/scripts/spm/spm-pbxproj.js +654 -0
- package/scripts/spm/spm-types.js +520 -0
- package/scripts/spm/spm-utils.js +645 -0
- package/scripts/spm/sync-spm-autolinking.js +160 -0
- package/sdks/.hermesv1version +1 -1
- package/sdks/hermes-engine/hermes-engine.podspec +9 -39
- package/sdks/hermes-engine/hermes-utils.rb +19 -73
- package/sdks/hermes-engine/utils/replace_hermes_version.js +18 -4
- package/sdks/hermes-engine/version.properties +1 -2
- package/settings.gradle.kts +0 -43
- package/src/asset-registry.js +29 -0
- package/src/private/animated/NativeAnimatedHelper.js +45 -21
- package/src/private/assets/AssetRegistry.js +52 -0
- package/src/private/{specs_DEPRECATED/components → components/activityindicator/specs}/ActivityIndicatorViewNativeComponent.js +5 -5
- package/src/private/{specs_DEPRECATED/components → components/debuggingoverlay/specs}/DebuggingOverlayNativeComponent.js +8 -8
- package/src/private/{specs_DEPRECATED/components → components/drawerlayoutandroid/specs}/AndroidDrawerLayoutNativeComponent.js +8 -8
- package/src/private/{specs_DEPRECATED/components → components/inputaccessoryview/specs}/RCTInputAccessoryViewNativeComponent.js +4 -4
- package/src/private/{specs_DEPRECATED/components → components/modal/specs}/RCTModalHostViewNativeComponent.js +4 -9
- package/src/private/{specs_DEPRECATED/components → components/progressbarandroid/specs}/ProgressBarAndroidNativeComponent.js +5 -5
- package/src/private/{specs_DEPRECATED/components → components/refreshcontrol/specs}/AndroidSwipeRefreshLayoutNativeComponent.js +7 -7
- package/src/private/{specs_DEPRECATED/components → components/refreshcontrol/specs}/PullToRefreshViewNativeComponent.js +7 -7
- package/src/private/components/safeareaview/SafeAreaView_INTERNAL_DO_NOT_USE.js +2 -2
- package/src/private/{specs_DEPRECATED/components → components/safeareaview/specs}/RCTSafeAreaViewNativeComponent.js +3 -3
- package/src/private/components/scrollview/HScrollViewNativeComponents.js +1 -1
- package/src/private/{specs_DEPRECATED/components → components/scrollview/specs}/AndroidHorizontalScrollContentViewNativeComponent.js +3 -3
- package/src/private/{specs_DEPRECATED/components → components/switch/specs}/AndroidSwitchNativeComponent.js +7 -7
- package/src/private/{specs_DEPRECATED/components → components/switch/specs}/SwitchNativeComponent.js +10 -7
- package/src/private/{specs_DEPRECATED/components → components/unimplementedview/specs}/UnimplementedNativeViewNativeComponent.js +4 -4
- package/src/private/components/virtualcollection/Virtual.js +5 -5
- package/src/private/components/virtualcollection/VirtualCollectionView.js +2 -6
- package/src/private/components/virtualcollection/column/VirtualColumn.js +1 -1
- package/src/private/components/virtualcollection/row/VirtualRow.js +1 -1
- package/src/private/devsupport/devmenu/elementinspector/Inspector.js +3 -1
- package/src/private/devsupport/devmenu/specs/NativeDevMenu.js +4 -4
- package/src/private/devsupport/rndevtools/specs/NativeReactDevToolsRuntimeSettingsModule.js +4 -2
- package/src/private/devsupport/rndevtools/specs/NativeReactDevToolsSettingsManager.js +2 -2
- package/src/private/featureflags/ReactNativeFeatureFlags.js +46 -70
- package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +88 -94
- package/src/private/renderer/errorhandling/ErrorHandlers.js +2 -2
- package/src/private/renderer/events/ReactNativeResponder.js +49 -4
- package/src/private/renderer/events/ResponderTouchHistoryStore.js +11 -2
- package/src/private/renderer/events/dispatchNativeEvent.js +71 -36
- package/src/private/setup/setUpDOM.js +19 -9
- package/src/private/setup/setUpIntersectionObserver.js +7 -0
- package/src/private/setup/setUpMutationObserver.js +3 -1
- package/src/private/specs_DEPRECATED/modules/NativeAccessibilityInfo.js +9 -9
- package/src/private/specs_DEPRECATED/modules/NativeAccessibilityManager.js +24 -24
- package/src/private/specs_DEPRECATED/modules/NativeActionSheetManager.js +28 -28
- package/src/private/specs_DEPRECATED/modules/NativeAlertManager.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativeAnimatedModule.js +45 -25
- package/src/private/specs_DEPRECATED/modules/NativeAnimatedTurboModule.js +44 -24
- package/src/private/specs_DEPRECATED/modules/NativeAppState.js +4 -4
- package/src/private/specs_DEPRECATED/modules/NativeAppearance.js +8 -6
- package/src/private/specs_DEPRECATED/modules/NativeBlobModule.js +7 -7
- package/src/private/specs_DEPRECATED/modules/NativeClipboard.js +3 -3
- package/src/private/specs_DEPRECATED/modules/NativeDevLoadingView.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeDevSettings.js +11 -11
- package/src/private/specs_DEPRECATED/modules/NativeDeviceEventManager.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativeDeviceInfo.js +4 -4
- package/src/private/specs_DEPRECATED/modules/NativeDialogManagerAndroid.js +7 -7
- package/src/private/specs_DEPRECATED/modules/NativeExceptionsManager.js +4 -4
- package/src/private/specs_DEPRECATED/modules/NativeFileReaderModule.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeFrameRateLogger.js +4 -4
- package/src/private/specs_DEPRECATED/modules/NativeHeadlessJsTaskSupport.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeI18nManager.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativeImageEditor.js +13 -13
- package/src/private/specs_DEPRECATED/modules/NativeImageLoaderAndroid.js +9 -6
- package/src/private/specs_DEPRECATED/modules/NativeImageLoaderIOS.js +6 -6
- package/src/private/specs_DEPRECATED/modules/NativeImageStoreAndroid.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeImageStoreIOS.js +8 -5
- package/src/private/specs_DEPRECATED/modules/NativeIntentAndroid.js +5 -5
- package/src/private/specs_DEPRECATED/modules/NativeJSCHeapCapture.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativeKeyboardObserver.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeLinkingManager.js +6 -6
- package/src/private/specs_DEPRECATED/modules/NativeLogBox.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeModalManager.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeNetworkingAndroid.js +5 -5
- package/src/private/specs_DEPRECATED/modules/NativeNetworkingIOS.js +6 -6
- package/src/private/specs_DEPRECATED/modules/NativePermissionsAndroid.js +6 -4
- package/src/private/specs_DEPRECATED/modules/NativePlatformConstantsAndroid.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativePlatformConstantsIOS.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativePushNotificationManagerIOS.js +35 -31
- package/src/private/specs_DEPRECATED/modules/NativeRedBox.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeSampleTurboModule.js +24 -24
- package/src/private/specs_DEPRECATED/modules/NativeSegmentFetcher.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeSettingsManager.js +3 -3
- package/src/private/specs_DEPRECATED/modules/NativeShareModule.js +2 -2
- package/src/private/specs_DEPRECATED/modules/NativeSoundManager.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativeSourceCode.js +1 -1
- package/src/private/specs_DEPRECATED/modules/NativeStatusBarManagerAndroid.js +5 -17
- package/src/private/specs_DEPRECATED/modules/NativeStatusBarManagerIOS.js +10 -15
- package/src/private/specs_DEPRECATED/modules/NativeTiming.js +3 -3
- package/src/private/specs_DEPRECATED/modules/NativeToastAndroid.js +4 -4
- package/src/private/specs_DEPRECATED/modules/NativeUIManager.js +35 -22
- package/src/private/specs_DEPRECATED/modules/NativeVibration.js +4 -4
- package/src/private/specs_DEPRECATED/modules/NativeWebSocketModule.js +7 -7
- package/src/private/types/HostInstance.js +38 -80
- package/src/private/viewtransition/specs/NativeViewTransition.js +6 -4
- package/src/private/webapis/dom/abort-api/AbortController.js +92 -0
- package/src/private/webapis/dom/abort-api/AbortSignal.js +243 -0
- package/src/private/webapis/dom/events/CustomEvent.js +1 -1
- package/src/private/webapis/dom/events/Event.js +12 -12
- package/src/private/webapis/dom/events/EventTarget.js +146 -37
- package/src/private/webapis/dom/events/internals/EventInternals.js +36 -0
- package/src/private/webapis/dom/events/internals/EventTargetInternals.js +38 -3
- package/src/private/webapis/dom/nodes/ReactNativeDocument.js +11 -0
- package/src/private/webapis/dom/nodes/ReactNativeElement.js +105 -4
- package/src/private/webapis/dom/nodes/ReadOnlyCharacterData.js +11 -0
- package/src/private/webapis/dom/nodes/ReadOnlyElement.js +9 -0
- package/src/private/webapis/dom/nodes/ReadOnlyNode.js +34 -7
- package/src/private/webapis/dom/nodes/ReadOnlyText.js +33 -0
- package/src/private/webapis/dom/nodes/specs/NativeDOM.js +46 -42
- package/src/private/webapis/dom/oldstylecollections/HTMLCollection.js +12 -0
- package/src/private/webapis/dom/oldstylecollections/HTMLCollection.js.flow +4 -2
- package/src/private/webapis/dom/oldstylecollections/NodeList.js +10 -0
- package/src/private/webapis/dom/oldstylecollections/NodeList.js.flow +4 -3
- package/src/private/webapis/errors/DOMException.js +50 -50
- package/src/private/webapis/geometry/DOMRectList.js +12 -0
- package/src/private/webapis/geometry/DOMRectList.js.flow +3 -1
- package/src/private/webapis/html/events/MessageEvent.js +3 -3
- package/src/private/webapis/idlecallbacks/specs/NativeIdleCallbacks.js +2 -2
- package/src/private/webapis/intersectionobserver/IntersectionObserverEntry.js +13 -0
- package/src/private/webapis/intersectionobserver/internals/IntersectionObserverManager.js +3 -7
- package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +5 -5
- package/src/private/webapis/microtasks/specs/NativeMicrotasks.js +1 -1
- package/src/private/webapis/mutationobserver/MutationObserver.js +7 -7
- package/src/private/webapis/mutationobserver/MutationRecord.js +12 -0
- package/src/private/webapis/mutationobserver/internals/MutationObserverManager.js +5 -7
- package/src/private/webapis/mutationobserver/specs/NativeMutationObserver.js +5 -5
- package/src/private/webapis/performance/EventTiming.js +3 -3
- package/src/private/webapis/performance/PerformanceEntry.js +3 -3
- package/src/private/webapis/performance/PerformanceObserver.js +4 -4
- package/src/private/webapis/performance/ResourceTiming.js +13 -13
- package/src/private/webapis/performance/UserTiming.js +3 -3
- package/src/private/webapis/performance/internals/Utilities.js +1 -1
- package/src/private/webapis/performance/specs/NativePerformance.js +26 -20
- package/src/private/webapis/utils/ArrayLikeUtils.js +1 -1
- package/src/private/webapis/websockets/events/CloseEvent.js +3 -3
- package/src/private/webapis/xhr/events/ProgressEvent.js +3 -3
- package/src/react-private-interface.js +145 -0
- package/src/react-private-interface.js.flow +48 -0
- package/src/setup-env.js +22 -0
- package/src/types/globals.d.ts +33 -1
- package/src/unstable-internals-do-not-use.d.ts +214 -0
- package/src/unstable-internals-do-not-use.js +76 -0
- package/third-party-podspecs/ReactNativeDependencies.podspec +2 -2
- package/types/index.d.ts +0 -1
- package/types/public/DeprecatedPropertiesAlias.d.ts +0 -4
- package/types/public/ReactNativeTypes.d.ts +4 -2
- package/types_generated/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts +26 -31
- package/types_generated/Libraries/Alert/Alert.d.ts +44 -7
- package/types_generated/Libraries/Animated/AnimatedEvent.d.ts +2 -2
- package/types_generated/Libraries/Animated/AnimatedExports.d.ts +2 -2
- package/types_generated/Libraries/Animated/AnimatedImplementation.d.ts +107 -3
- package/types_generated/Libraries/Animated/Easing.d.ts +5 -4
- package/types_generated/Libraries/Animated/animations/Animation.d.ts +7 -7
- package/types_generated/Libraries/Animated/animations/DecayAnimation.d.ts +5 -5
- package/types_generated/Libraries/Animated/animations/SpringAnimation.d.ts +49 -49
- package/types_generated/Libraries/Animated/animations/TimingAnimation.d.ts +13 -13
- package/types_generated/Libraries/Animated/components/AnimatedFlatList.d.ts +3 -3
- package/types_generated/Libraries/Animated/components/AnimatedSectionList.d.ts +3 -3
- package/types_generated/Libraries/Animated/createAnimatedComponent.d.ts +4 -4
- package/types_generated/Libraries/Animated/nodes/AnimatedColor.d.ts +2 -2
- package/types_generated/Libraries/Animated/nodes/AnimatedInterpolation.d.ts +9 -9
- package/types_generated/Libraries/Animated/nodes/AnimatedNode.d.ts +3 -3
- package/types_generated/Libraries/AppState/AppState.d.ts +41 -22
- package/types_generated/Libraries/BatchedBridge/NativeModules.d.ts +8 -1
- package/types_generated/Libraries/Blob/BlobTypes.d.ts +4 -4
- package/types_generated/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +37 -46
- package/types_generated/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts +92 -43
- package/types_generated/Libraries/Components/Button.d.ts +118 -197
- package/types_generated/Libraries/Components/Clipboard/Clipboard.d.ts +6 -1
- package/types_generated/Libraries/Components/DrawerAndroid/DrawerLayoutAndroidTypes.d.ts +44 -63
- package/types_generated/Libraries/Components/Keyboard/Keyboard.d.ts +30 -61
- package/types_generated/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts +30 -21
- package/types_generated/Libraries/Components/Pressable/Pressable.d.ts +41 -17
- package/types_generated/Libraries/Components/Pressable/useAndroidRippleForView.d.ts +6 -6
- package/types_generated/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts +5 -5
- package/types_generated/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidTypes.d.ts +18 -1
- package/types_generated/Libraries/Components/RefreshControl/RefreshControl.d.ts +35 -52
- package/types_generated/Libraries/Components/SafeAreaView/SafeAreaView.d.ts +9 -11
- package/types_generated/Libraries/Components/ScrollView/ScrollView.d.ts +212 -88
- package/types_generated/Libraries/Components/ScrollView/ScrollViewStickyHeader.d.ts +4 -4
- package/types_generated/Libraries/Components/StatusBar/StatusBar.d.ts +29 -62
- package/types_generated/Libraries/Components/Switch/Switch.d.ts +75 -70
- package/types_generated/Libraries/Components/TextInput/InputAccessoryView.d.ts +16 -65
- package/types_generated/Libraries/Components/TextInput/TextInput.d.ts +118 -3
- package/types_generated/Libraries/Components/TextInput/TextInput.flow.d.ts +23 -8
- package/types_generated/Libraries/Components/ToastAndroid/ToastAndroid.d.ts +18 -18
- package/types_generated/Libraries/Components/Touchable/TouchableHighlight.d.ts +24 -13
- package/types_generated/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts +27 -64
- package/types_generated/Libraries/Components/Touchable/TouchableOpacity.d.ts +18 -6
- package/types_generated/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts +28 -28
- package/types_generated/Libraries/Components/View/View.d.ts +13 -9
- package/types_generated/Libraries/Components/View/ViewAccessibility.d.ts +28 -17
- package/types_generated/Libraries/Components/View/ViewNativeComponent.d.ts +1 -2
- package/types_generated/Libraries/Components/View/ViewPropTypes.d.ts +75 -24
- package/types_generated/Libraries/Core/ExtendedError.d.ts +10 -10
- package/types_generated/Libraries/EventEmitter/NativeEventEmitter.d.ts +34 -1
- package/types_generated/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts +4 -1
- package/types_generated/Libraries/Image/AssetSourceResolver.d.ts +2 -13
- package/types_generated/Libraries/Image/ImageBackground.d.ts +33 -22
- package/types_generated/Libraries/Image/ImageProps.d.ts +201 -251
- package/types_generated/Libraries/Image/ImageTypes.flow.d.ts +6 -5
- package/types_generated/Libraries/Interaction/PanResponder.d.ts +103 -97
- package/types_generated/Libraries/LayoutAnimation/LayoutAnimation.d.ts +18 -7
- package/types_generated/Libraries/Linking/Linking.d.ts +28 -20
- package/types_generated/Libraries/Lists/FlatList.d.ts +17 -18
- package/types_generated/Libraries/Lists/SectionList.d.ts +10 -5
- package/types_generated/Libraries/Lists/VirtualizedList.d.ts +3 -1
- package/types_generated/Libraries/Lists/VirtualizedSectionList.d.ts +3 -1
- package/types_generated/Libraries/LogBox/Data/LogBoxData.d.ts +2 -2
- package/types_generated/Libraries/LogBox/Data/LogBoxLog.d.ts +2 -2
- package/types_generated/Libraries/LogBox/Data/parseLogBoxLog.d.ts +2 -2
- package/types_generated/Libraries/LogBox/LogBox.d.ts +4 -1
- package/types_generated/Libraries/Modal/Modal.d.ts +70 -35
- package/types_generated/Libraries/Network/FormData.d.ts +5 -5
- package/types_generated/Libraries/Performance/Systrace.d.ts +11 -1
- package/types_generated/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +31 -21
- package/types_generated/Libraries/Pressability/Pressability.d.ts +5 -5
- package/types_generated/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts +15 -11
- package/types_generated/Libraries/ReactNative/AppRegistry.flow.d.ts +5 -5
- package/types_generated/Libraries/ReactNative/AppRegistryImpl.d.ts +56 -9
- package/types_generated/Libraries/ReactNative/I18nManager.d.ts +20 -1
- package/types_generated/Libraries/ReactNative/IPerformanceLogger.flow.d.ts +5 -5
- package/types_generated/Libraries/ReactPrivate/ReactNativePrivateInterface.d.ts +6 -22
- package/types_generated/Libraries/Renderer/shims/ReactNativeTypes.d.ts +34 -34
- package/types_generated/Libraries/Share/Share.d.ts +36 -39
- package/types_generated/Libraries/StyleSheet/PlatformColorValueTypes.d.ts +7 -1
- package/types_generated/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts +3 -3
- package/types_generated/Libraries/StyleSheet/StyleSheetTypes.d.ts +202 -181
- package/types_generated/Libraries/StyleSheet/private/_TransformStyle.d.ts +3 -3
- package/types_generated/Libraries/Text/Text.d.ts +10 -6
- package/types_generated/Libraries/Text/TextProps.d.ts +57 -102
- package/types_generated/Libraries/TurboModule/RCTExport.d.ts +2 -2
- package/types_generated/Libraries/Types/CoreEventTypes.d.ts +14 -8
- package/types_generated/Libraries/Utilities/Appearance.d.ts +25 -13
- package/types_generated/Libraries/Utilities/BackHandler.d.ts +17 -1
- package/types_generated/Libraries/Utilities/DevSettings.d.ts +9 -2
- package/types_generated/Libraries/Utilities/Dimensions.d.ts +19 -13
- package/types_generated/Libraries/Utilities/PixelRatio.d.ts +6 -3
- package/types_generated/Libraries/Utilities/Platform.d.ts +5 -1
- package/types_generated/Libraries/Utilities/PlatformTypes.d.ts +65 -6
- package/types_generated/Libraries/Utilities/codegenNativeComponent.d.ts +5 -5
- package/types_generated/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev.d.ts +2 -2
- package/types_generated/Libraries/Utilities/differ/deepDiffer.d.ts +2 -2
- package/types_generated/Libraries/Utilities/useColorScheme.d.ts +12 -2
- package/types_generated/Libraries/Utilities/useWindowDimensions.d.ts +7 -1
- package/types_generated/Libraries/Vibration/Vibration.d.ts +14 -6
- package/types_generated/index.d.ts +31 -25
- package/types_generated/src/private/assets/AssetRegistry.d.ts +42 -0
- package/types_generated/src/private/components/virtualcollection/VirtualCollectionView.d.ts +5 -5
- package/types_generated/src/private/components/virtualcollection/column/VirtualColumn.d.ts +3 -3
- package/types_generated/src/private/components/virtualcollection/row/VirtualRow.d.ts +3 -3
- package/types_generated/src/private/components/virtualview/VirtualView.d.ts +7 -7
- package/types_generated/src/private/components/virtualview/VirtualViewExperimentalNativeComponent.d.ts +5 -5
- package/types_generated/src/private/components/virtualview/VirtualViewNativeComponent.d.ts +5 -5
- package/types_generated/src/private/renderer/events/dispatchNativeEvent.d.ts +26 -0
- package/types_generated/src/private/specs_DEPRECATED/modules/NativeAppearance.d.ts +6 -5
- package/types_generated/src/private/specs_DEPRECATED/modules/NativeDeviceInfo.d.ts +7 -7
- package/types_generated/src/private/specs_DEPRECATED/modules/NativeExceptionsManager.d.ts +5 -5
- package/types_generated/src/private/specs_DEPRECATED/modules/NativeUIManager.d.ts +8 -8
- package/types_generated/src/private/types/HostComponent.d.ts +3 -3
- package/types_generated/src/private/types/HostInstance.d.ts +39 -74
- package/types_generated/src/private/webapis/dom/events/CustomEvent.d.ts +2 -2
- package/types_generated/src/private/webapis/dom/events/Event.d.ts +4 -4
- package/types_generated/src/private/webapis/dom/events/EventTarget.d.ts +8 -8
- package/types_generated/src/private/webapis/dom/nodes/ReactNativeDocument.d.ts +3 -1
- package/types_generated/src/private/webapis/dom/nodes/ReactNativeElement.d.ts +57 -4
- package/types_generated/src/private/webapis/dom/nodes/ReadOnlyCharacterData.d.ts +3 -1
- package/types_generated/src/private/webapis/dom/nodes/ReadOnlyElement.d.ts +3 -1
- package/types_generated/src/private/webapis/dom/nodes/ReadOnlyNode.d.ts +4 -2
- package/types_generated/src/private/webapis/dom/nodes/ReadOnlyText.d.ts +3 -1
- package/types_generated/src/private/webapis/dom/nodes/specs/NativeDOM.d.ts +3 -3
- package/types_generated/src/private/webapis/dom/oldstylecollections/HTMLCollection.d.ts +3 -1
- package/types_generated/src/private/webapis/dom/oldstylecollections/NodeList.d.ts +3 -1
- package/types_generated/src/react-private-interface.d.ts +33 -0
- package/Libraries/AppDelegate/RCTArchConfiguratorProtocol.h +0 -38
- package/Libraries/Image/AssetRegistry.js +0 -14
- package/Libraries/Image/RCTImageShadowView.h +0 -17
- package/Libraries/Image/RCTImageShadowView.mm +0 -28
- package/Libraries/Image/RCTImageView.h +0 -32
- package/Libraries/Image/RCTImageView.mm +0 -508
- package/Libraries/Image/RCTImageViewManager.h +0 -17
- package/Libraries/Image/RCTImageViewManager.mm +0 -115
- package/Libraries/Interaction/InteractionManager.d.ts +0 -87
- package/Libraries/Interaction/InteractionManager.js +0 -189
- package/Libraries/Text/BaseText/RCTBaseTextShadowView.h +0 -35
- package/Libraries/Text/BaseText/RCTBaseTextShadowView.mm +0 -162
- package/Libraries/Text/BaseText/RCTBaseTextViewManager.h +0 -21
- package/Libraries/Text/BaseText/RCTBaseTextViewManager.mm +0 -64
- package/Libraries/Text/RCTTextAttributes.h +0 -107
- package/Libraries/Text/RCTTextAttributes.mm +0 -358
- package/Libraries/Text/RawText/RCTRawTextShadowView.h +0 -23
- package/Libraries/Text/RawText/RCTRawTextShadowView.mm +0 -38
- package/Libraries/Text/RawText/RCTRawTextViewManager.h +0 -21
- package/Libraries/Text/RawText/RCTRawTextViewManager.mm +0 -32
- package/Libraries/Text/Text/RCTTextShadowView.h +0 -33
- package/Libraries/Text/Text/RCTTextShadowView.mm +0 -469
- package/Libraries/Text/Text/RCTTextView.h +0 -34
- package/Libraries/Text/Text/RCTTextView.mm +0 -298
- package/Libraries/Text/Text/RCTTextViewManager.h +0 -19
- package/Libraries/Text/Text/RCTTextViewManager.mm +0 -97
- package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputView.h +0 -21
- package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputView.mm +0 -67
- package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.h +0 -21
- package/Libraries/Text/TextInput/Multiline/RCTMultilineTextInputViewManager.mm +0 -28
- package/Libraries/Text/TextInput/RCTBaseTextInputShadowView.h +0 -30
- package/Libraries/Text/TextInput/RCTBaseTextInputShadowView.mm +0 -367
- package/Libraries/Text/TextInput/RCTBaseTextInputView.h +0 -68
- package/Libraries/Text/TextInput/RCTBaseTextInputView.mm +0 -849
- package/Libraries/Text/TextInput/RCTBaseTextInputViewManager.h +0 -17
- package/Libraries/Text/TextInput/RCTBaseTextInputViewManager.mm +0 -181
- package/Libraries/Text/TextInput/RCTInputAccessoryShadowView.h +0 -17
- package/Libraries/Text/TextInput/RCTInputAccessoryShadowView.mm +0 -24
- package/Libraries/Text/TextInput/RCTInputAccessoryView.h +0 -22
- package/Libraries/Text/TextInput/RCTInputAccessoryView.mm +0 -82
- package/Libraries/Text/TextInput/RCTInputAccessoryViewContent.h +0 -17
- package/Libraries/Text/TextInput/RCTInputAccessoryViewContent.mm +0 -78
- package/Libraries/Text/TextInput/RCTInputAccessoryViewManager.h +0 -17
- package/Libraries/Text/TextInput/RCTInputAccessoryViewManager.mm +0 -33
- package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputView.h +0 -21
- package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputView.mm +0 -43
- package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.h +0 -21
- package/Libraries/Text/TextInput/Singleline/RCTSinglelineTextInputViewManager.mm +0 -35
- package/Libraries/Text/VirtualText/RCTVirtualTextShadowView.h +0 -17
- package/Libraries/Text/VirtualText/RCTVirtualTextShadowView.mm +0 -42
- package/Libraries/Text/VirtualText/RCTVirtualTextView.h +0 -28
- package/Libraries/Text/VirtualText/RCTVirtualTextViewManager.h +0 -17
- package/Libraries/Text/VirtualText/RCTVirtualTextViewManager.mm +0 -30
- package/Libraries/Utilities/SceneTracker.js +0 -42
- package/Libraries/Wrapper/Example/RCTWrapperExampleView.h +0 -21
- package/Libraries/Wrapper/Example/RCTWrapperExampleView.m +0 -57
- package/Libraries/Wrapper/Example/RCTWrapperExampleViewController.h +0 -21
- package/Libraries/Wrapper/Example/RCTWrapperExampleViewController.m +0 -27
- package/Libraries/Wrapper/Example/RCTWrapperReactRootViewController.h +0 -25
- package/Libraries/Wrapper/Example/RCTWrapperReactRootViewController.m +0 -50
- package/Libraries/Wrapper/Example/RCTWrapperReactRootViewManager.h +0 -23
- package/Libraries/Wrapper/Example/RCTWrapperReactRootViewManager.m +0 -35
- package/Libraries/Wrapper/RCTWrapper.h +0 -73
- package/Libraries/Wrapper/RCTWrapperShadowView.h +0 -27
- package/Libraries/Wrapper/RCTWrapperShadowView.m +0 -138
- package/Libraries/Wrapper/RCTWrapperView.h +0 -42
- package/Libraries/Wrapper/RCTWrapperView.m +0 -99
- package/Libraries/Wrapper/RCTWrapperViewControllerHostingView.h +0 -30
- package/Libraries/Wrapper/RCTWrapperViewControllerHostingView.m +0 -137
- package/Libraries/Wrapper/RCTWrapperViewManager.h +0 -25
- package/Libraries/Wrapper/RCTWrapperViewManager.m +0 -31
- package/React/Base/RCTRootContentView.h +0 -43
- package/React/Base/RCTRootContentView.m +0 -111
- package/React/Base/RCTRootViewInternal.h +0 -28
- package/React/CxxBridge/RCTCxxBridge.mm +0 -1572
- package/React/CxxBridge/RCTJSIExecutorRuntimeInstaller.h +0 -25
- package/React/CxxBridge/RCTJSIExecutorRuntimeInstaller.mm +0 -34
- package/React/CxxBridge/RCTObjcExecutor.h +0 -34
- package/React/CxxBridge/RCTObjcExecutor.mm +0 -150
- package/React/CxxLogUtils/RCTDefaultCxxLogFunction.mm +0 -34
- package/React/CxxModule/DispatchMessageQueueThread.h +0 -50
- package/React/CxxModule/RCTCxxMethod.h +0 -17
- package/React/CxxModule/RCTCxxMethod.mm +0 -147
- package/React/CxxModule/RCTNativeModule.h +0 -34
- package/React/CxxModule/RCTNativeModule.mm +0 -241
- package/React/Fabric/RCTSurfacePresenterBridgeAdapter.mm +0 -205
- package/React/Tests/Text/RCTTextAttributesTest.mm +0 -49
- package/React/Views/RCTActivityIndicatorView.h +0 -16
- package/React/Views/RCTActivityIndicatorView.m +0 -26
- package/React/Views/RCTActivityIndicatorViewManager.h +0 -23
- package/React/Views/RCTActivityIndicatorViewManager.m +0 -65
- package/React/Views/RCTDebuggingOverlayManager.h +0 -17
- package/React/Views/RCTDebuggingOverlayManager.m +0 -68
- package/React/Views/RCTModalHostView.h +0 -64
- package/React/Views/RCTModalHostView.m +0 -264
- package/React/Views/RCTModalHostViewController.m +0 -74
- package/React/Views/RCTModalHostViewManager.m +0 -131
- package/React/Views/RCTModalManager.h +0 -22
- package/React/Views/RCTModalManager.m +0 -46
- package/React/Views/RCTRootShadowView.h +0 -35
- package/React/Views/RCTRootShadowView.m +0 -53
- package/React/Views/RCTShadowView+Internal.h +0 -18
- package/React/Views/RCTShadowView+Internal.m +0 -23
- package/React/Views/RCTSwitch.h +0 -22
- package/React/Views/RCTSwitch.m +0 -24
- package/React/Views/RCTSwitchManager.h +0 -17
- package/React/Views/RCTSwitchManager.m +0 -70
- package/React/Views/RefreshControl/RCTRefreshControl.h +0 -24
- package/React/Views/RefreshControl/RCTRefreshControl.m +0 -230
- package/React/Views/RefreshControl/RCTRefreshControlManager.h +0 -17
- package/React/Views/RefreshControl/RCTRefreshControlManager.m +0 -47
- package/React/Views/SafeAreaView/RCTSafeAreaShadowView.h +0 -21
- package/React/Views/SafeAreaView/RCTSafeAreaShadowView.m +0 -57
- package/React/Views/SafeAreaView/RCTSafeAreaView.h +0 -27
- package/React/Views/SafeAreaView/RCTSafeAreaView.m +0 -79
- package/React/Views/SafeAreaView/RCTSafeAreaViewLocalData.h +0 -25
- package/React/Views/SafeAreaView/RCTSafeAreaViewLocalData.m +0 -25
- package/React/Views/SafeAreaView/RCTSafeAreaViewManager.h +0 -21
- package/React/Views/SafeAreaView/RCTSafeAreaViewManager.m +0 -32
- package/React/Views/ScrollView/RCTScrollContentShadowView.h +0 -19
- package/React/Views/ScrollView/RCTScrollContentShadowView.m +0 -35
- package/React/Views/ScrollView/RCTScrollContentView.h +0 -19
- package/React/Views/ScrollView/RCTScrollContentView.m +0 -36
- package/React/Views/ScrollView/RCTScrollContentViewManager.h +0 -17
- package/React/Views/ScrollView/RCTScrollContentViewManager.m +0 -31
- package/React/Views/ScrollView/RCTScrollView.m +0 -1168
- package/React/Views/ScrollView/RCTScrollViewManager.h +0 -25
- package/React/Views/ScrollView/RCTScrollViewManager.m +0 -202
- package/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java +0 -251
- package/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeReactContext.java +0 -315
- package/ReactAndroid/src/main/java/com/facebook/react/common/ClearableSynchronizedPool.kt +0 -51
- package/ReactAndroid/src/main/java/com/facebook/react/fabric/AnimationBackendChoreographer.kt +0 -89
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSPointerDispatcher.java +0 -736
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java +0 -221
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +0 -399
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactZIndexedViewGroup.kt +0 -35
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +0 -346
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +0 -666
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +0 -147
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewGroupDrawingOrderHelper.kt +0 -113
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.java +0 -614
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +0 -1838
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactNestedScrollView.java +0 -1646
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +0 -1638
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaAlign.java +0 -51
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaBoxSizing.java +0 -33
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaDimension.java +0 -33
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaDisplay.java +0 -37
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaEdge.java +0 -47
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaErrata.java +0 -41
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java +0 -33
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaFlexDirection.java +0 -37
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaGridTrackType.java +0 -39
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaGutter.java +0 -35
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaJustify.java +0 -49
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaLogLevel.java +0 -45
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaMeasureMode.java +0 -35
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java +0 -928
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeType.java +0 -33
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaOverflow.java +0 -35
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaPositionType.java +0 -35
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaUnit.java +0 -43
- package/ReactAndroid/src/main/java/com/facebook/yoga/YogaWrap.java +0 -35
- package/ReactAndroid/src/main/jni/react/fabric/JAnimationBackendChoreographer.cpp +0 -23
- package/ReactAndroid/src/main/jni/react/fabric/JAnimationBackendChoreographer.h +0 -37
- package/ReactCommon/cxxreact/JSIndexedRAMBundle.cpp +0 -135
- package/ReactCommon/cxxreact/JSIndexedRAMBundle.h +0 -72
- package/ReactCommon/hermes/inspector-modern/chrome/ConnectionDemux.cpp +0 -143
- package/ReactCommon/hermes/inspector-modern/chrome/ConnectionDemux.h +0 -55
- package/ReactCommon/hermes/inspector-modern/chrome/Registration.cpp +0 -78
- package/ReactCommon/hermes/inspector-modern/chrome/Registration.h +0 -39
- package/ReactCommon/hermes/inspector-modern/chrome/tests/ConnectionDemuxTests.cpp +0 -148
- package/ReactCommon/react/nativemodule/samples/platform/android/NativeSampleTurboModuleSpec.java +0 -168
- package/ReactCommon/react/nativemodule/samples/platform/android/ReactCommon/SampleTurboModuleSpec.cpp +0 -416
- package/ReactCommon/react/nativemodule/samples/platform/android/ReactCommon/SampleTurboModuleSpec.h +0 -31
- package/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTNativeSampleTurboModuleSpec.h +0 -134
- package/ReactCommon/react/nativemodule/samples/platform/ios/ReactCommon/RCTNativeSampleTurboModuleSpec.mm +0 -290
- package/ReactCommon/react/renderer/core/RawPropsKey.cpp +0 -62
- package/ReactCommon/react/renderer/core/RawPropsKey.h +0 -39
- package/ReactCommon/react/renderer/mounting/internal/DiffMap.h +0 -170
- package/ReactCommon/react/renderer/mounting/internal/LongestIncreasingSubsequence.h +0 -95
- package/ReactCommon/react/renderer/mounting/internal/TinyMap.h +0 -147
- package/ReactCommon/react/renderer/mounting/tests/LongestIncreasingSubsequenceTest.cpp +0 -154
- package/interface.js +0 -21
- package/jest-preset.js +0 -26
- package/rn-get-polyfills.js +0 -13
- package/sdks/.hermesversion +0 -1
- package/src/private/components/virtualcollection/debug/FlingItemOverlay.js +0 -13
- package/types/tsconfig.json +0 -15
- package/types_generated/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidNativeComponent.d.ts +0 -14
- package/types_generated/Libraries/Components/ScrollView/ScrollViewNativeComponent.d.ts +0 -21
- package/types_generated/Libraries/Components/ScrollView/ScrollViewNativeComponentType.d.ts +0 -134
- package/types_generated/Libraries/Components/Switch/AndroidSwitchNativeComponent.d.ts +0 -14
- package/types_generated/Libraries/Components/Switch/SwitchNativeComponent.d.ts +0 -14
- package/types_generated/Libraries/Components/Touchable/Touchable.d.ts +0 -262
- package/types_generated/Libraries/Interaction/InteractionManager.d.ts +0 -117
- package/types_generated/Libraries/NativeModules/specs/NativeDialogManagerAndroid.d.ts +0 -17
- package/types_generated/src/private/specs_DEPRECATED/components/AndroidSwitchNativeComponent.d.ts +0 -53
- package/types_generated/src/private/specs_DEPRECATED/components/ProgressBarAndroidNativeComponent.d.ts +0 -36
- package/types_generated/src/private/specs_DEPRECATED/components/SwitchNativeComponent.d.ts +0 -51
- package/types_generated/src/private/specs_DEPRECATED/modules/NativeDialogManagerAndroid.d.ts +0 -37
- package/types_generated/tsconfig.test.json +0 -16
- /package/ReactCommon/{cxxreact → react/utils}/MoveWrapper.h +0 -0
package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.kt
ADDED
|
@@ -0,0 +1,1640 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
package com.facebook.react.views.scroll
|
|
9
|
+
|
|
10
|
+
import android.animation.ObjectAnimator
|
|
11
|
+
import android.animation.ValueAnimator
|
|
12
|
+
import android.content.Context
|
|
13
|
+
import android.graphics.Canvas
|
|
14
|
+
import android.graphics.Color
|
|
15
|
+
import android.graphics.Point
|
|
16
|
+
import android.graphics.Rect
|
|
17
|
+
import android.graphics.drawable.Drawable
|
|
18
|
+
import android.os.Build
|
|
19
|
+
import android.view.FocusFinder
|
|
20
|
+
import android.view.KeyEvent
|
|
21
|
+
import android.view.MotionEvent
|
|
22
|
+
import android.view.View
|
|
23
|
+
import android.view.ViewGroup
|
|
24
|
+
import android.view.ViewParent
|
|
25
|
+
import android.view.accessibility.AccessibilityNodeInfo
|
|
26
|
+
import android.widget.HorizontalScrollView
|
|
27
|
+
import android.widget.OverScroller
|
|
28
|
+
import androidx.core.graphics.drawable.toDrawable
|
|
29
|
+
import androidx.core.view.ViewCompat
|
|
30
|
+
import androidx.core.view.ViewCompat.FocusDirection
|
|
31
|
+
import androidx.core.view.isEmpty
|
|
32
|
+
import androidx.core.view.isNotEmpty
|
|
33
|
+
import com.facebook.common.logging.FLog
|
|
34
|
+
import com.facebook.react.R
|
|
35
|
+
import com.facebook.react.common.ReactConstants
|
|
36
|
+
import com.facebook.react.common.build.ReactBuildConfig
|
|
37
|
+
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
|
|
38
|
+
import com.facebook.react.uimanager.BackgroundStyleApplicator
|
|
39
|
+
import com.facebook.react.uimanager.HasChildPressedStateDelay
|
|
40
|
+
import com.facebook.react.uimanager.LengthPercentage
|
|
41
|
+
import com.facebook.react.uimanager.LengthPercentageType
|
|
42
|
+
import com.facebook.react.uimanager.MeasureSpecAssertions
|
|
43
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
44
|
+
import com.facebook.react.uimanager.PointerEvents
|
|
45
|
+
import com.facebook.react.uimanager.ReactClippingViewGroup
|
|
46
|
+
import com.facebook.react.uimanager.ReactClippingViewGroupHelper
|
|
47
|
+
import com.facebook.react.uimanager.ReactOverflowViewWithInset
|
|
48
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
49
|
+
import com.facebook.react.uimanager.events.NativeGestureUtil
|
|
50
|
+
import com.facebook.react.uimanager.style.BorderRadiusProp
|
|
51
|
+
import com.facebook.react.uimanager.style.BorderStyle
|
|
52
|
+
import com.facebook.react.uimanager.style.LogicalEdge
|
|
53
|
+
import com.facebook.react.uimanager.style.Overflow
|
|
54
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.HasFlingAnimator
|
|
55
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.HasScrollEventThrottle
|
|
56
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.HasScrollState
|
|
57
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.HasSmoothScroll
|
|
58
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.HasStateWrapper
|
|
59
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.ReactScrollViewScrollState
|
|
60
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.SNAP_ALIGNMENT_CENTER
|
|
61
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.SNAP_ALIGNMENT_DISABLED
|
|
62
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.SNAP_ALIGNMENT_END
|
|
63
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.SNAP_ALIGNMENT_START
|
|
64
|
+
import com.facebook.react.views.scroll.ReactScrollViewHelper.findNextFocusableView
|
|
65
|
+
import com.facebook.systrace.Systrace
|
|
66
|
+
import kotlin.math.abs
|
|
67
|
+
import kotlin.math.ceil
|
|
68
|
+
import kotlin.math.floor
|
|
69
|
+
import kotlin.math.max
|
|
70
|
+
import kotlin.math.round
|
|
71
|
+
import kotlin.math.sign
|
|
72
|
+
|
|
73
|
+
/** Similar to [ReactScrollView] but only supports horizontal scrolling. */
|
|
74
|
+
public open class ReactHorizontalScrollView
|
|
75
|
+
@JvmOverloads
|
|
76
|
+
constructor(context: Context, private val fpsListener: FpsListener? = null) :
|
|
77
|
+
HorizontalScrollView(context),
|
|
78
|
+
ReactClippingViewGroup,
|
|
79
|
+
ViewGroup.OnHierarchyChangeListener,
|
|
80
|
+
View.OnLayoutChangeListener,
|
|
81
|
+
ReactAccessibleScrollView,
|
|
82
|
+
ReactOverflowViewWithInset,
|
|
83
|
+
HasScrollState,
|
|
84
|
+
HasStateWrapper,
|
|
85
|
+
HasFlingAnimator,
|
|
86
|
+
HasScrollEventThrottle,
|
|
87
|
+
HasSmoothScroll,
|
|
88
|
+
VirtualViewContainer,
|
|
89
|
+
HasChildPressedStateDelay {
|
|
90
|
+
|
|
91
|
+
private companion object {
|
|
92
|
+
private val DEBUG_MODE = false && ReactBuildConfig.DEBUG
|
|
93
|
+
private val TAG = ReactHorizontalScrollView::class.java.simpleName
|
|
94
|
+
|
|
95
|
+
private const val NO_SCROLL_POSITION = Int.MIN_VALUE
|
|
96
|
+
private const val UNSET_CONTENT_OFFSET = -1
|
|
97
|
+
|
|
98
|
+
private var scrollerField: java.lang.reflect.Field? = null
|
|
99
|
+
private var triedToGetScrollerField = false
|
|
100
|
+
|
|
101
|
+
private fun findDeepestScrollViewForMotionEvent(
|
|
102
|
+
view: View,
|
|
103
|
+
ev: MotionEvent,
|
|
104
|
+
): HorizontalScrollView? = findDeepestScrollViewForMotionEvent(view, ev, true)
|
|
105
|
+
|
|
106
|
+
private fun findDeepestScrollViewForMotionEvent(
|
|
107
|
+
view: View?,
|
|
108
|
+
ev: MotionEvent,
|
|
109
|
+
skipInitialView: Boolean,
|
|
110
|
+
): HorizontalScrollView? {
|
|
111
|
+
if (view == null) return null
|
|
112
|
+
|
|
113
|
+
val rectOnScreen = Rect()
|
|
114
|
+
view.getGlobalVisibleRect(rectOnScreen)
|
|
115
|
+
if (!rectOnScreen.contains(ev.rawX.toInt(), ev.rawY.toInt())) {
|
|
116
|
+
return null
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (
|
|
120
|
+
!skipInitialView &&
|
|
121
|
+
view is HorizontalScrollView &&
|
|
122
|
+
ViewCompat.isNestedScrollingEnabled(view) &&
|
|
123
|
+
(view is ReactHorizontalScrollView && view.scrollEnabled)
|
|
124
|
+
) {
|
|
125
|
+
return view
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (view is ViewGroup) {
|
|
129
|
+
for (i in 0 until view.childCount) {
|
|
130
|
+
val foundScrollView = findDeepestScrollViewForMotionEvent(view.getChildAt(i), ev, false)
|
|
131
|
+
if (foundScrollView != null) {
|
|
132
|
+
return foundScrollView
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return null
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private var scrollXAfterMeasure = NO_SCROLL_POSITION
|
|
142
|
+
|
|
143
|
+
private val onScrollDispatchHelper = OnScrollDispatchHelper()
|
|
144
|
+
private val scroller: OverScroller? = getOverScrollerFromParent()
|
|
145
|
+
private val velocityHelper = VelocityHelper()
|
|
146
|
+
private val tempRect = Rect()
|
|
147
|
+
private val defaultFlingAnimator: ValueAnimator = ObjectAnimator.ofInt(this, "scrollX", 0, 0)
|
|
148
|
+
|
|
149
|
+
// Backing fields for interface properties with custom logic
|
|
150
|
+
private var _overflowInset = Rect()
|
|
151
|
+
private var _virtualViewContainerState: VirtualViewContainerState? = null
|
|
152
|
+
private var _removeClippedSubviews = false
|
|
153
|
+
private var _reactScrollViewScrollState = ReactScrollViewScrollState()
|
|
154
|
+
|
|
155
|
+
// Private state
|
|
156
|
+
private var activelyScrolling = false
|
|
157
|
+
private var clippingRect: Rect? = null
|
|
158
|
+
private var _overflow: Overflow =
|
|
159
|
+
if (ReactNativeFeatureFlags.enablePropsUpdateReconciliationAndroid()) Overflow.VISIBLE
|
|
160
|
+
else Overflow.SCROLL
|
|
161
|
+
private var dragging = false
|
|
162
|
+
private var pagingEnabled = false
|
|
163
|
+
private var postTouchRunnable: Runnable? = null
|
|
164
|
+
private var sendMomentumEvents = false
|
|
165
|
+
private var scrollPerfTag: String? = null
|
|
166
|
+
private var endBackground: Drawable? = null
|
|
167
|
+
private var endFillColor = Color.TRANSPARENT
|
|
168
|
+
private var disableIntervalMomentum = false
|
|
169
|
+
private var snapInterval = 0
|
|
170
|
+
private var snapOffsets: List<Int>? = null
|
|
171
|
+
private var snapToStart = true
|
|
172
|
+
private var snapToEnd = true
|
|
173
|
+
private var snapToAlignment = SNAP_ALIGNMENT_DISABLED
|
|
174
|
+
private var pagedArrowScrolling = false
|
|
175
|
+
private var pendingContentOffsetX = UNSET_CONTENT_OFFSET
|
|
176
|
+
private var pendingContentOffsetY = UNSET_CONTENT_OFFSET
|
|
177
|
+
public open var pointerEvents: PointerEvents = PointerEvents.AUTO
|
|
178
|
+
private var contentView: View? = null
|
|
179
|
+
private var maintainVisibleContentPositionHelper:
|
|
180
|
+
MaintainVisibleScrollPositionHelper<ReactHorizontalScrollView>? =
|
|
181
|
+
null
|
|
182
|
+
public open var fadingEdgeLengthStart: Int = 0
|
|
183
|
+
set(value) {
|
|
184
|
+
field = value
|
|
185
|
+
invalidate()
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public open var fadingEdgeLengthEnd: Int = 0
|
|
189
|
+
set(value) {
|
|
190
|
+
field = value
|
|
191
|
+
invalidate()
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private var emittedOverScrollSinceScrollBegin = false
|
|
195
|
+
private var scrollsChildToFocus = true
|
|
196
|
+
|
|
197
|
+
// Interface property overrides
|
|
198
|
+
override var scrollEnabled: Boolean = true
|
|
199
|
+
override var stateWrapper: StateWrapper? = null
|
|
200
|
+
override var scrollEventThrottle: Int = 0
|
|
201
|
+
override var lastScrollDispatchTime: Long = 0L
|
|
202
|
+
override var hasChildPressedStateDelay: Boolean? = null
|
|
203
|
+
|
|
204
|
+
override val virtualViewContainerState: VirtualViewContainerState
|
|
205
|
+
get() =
|
|
206
|
+
_virtualViewContainerState
|
|
207
|
+
?: VirtualViewContainerState.create(this).also { _virtualViewContainerState = it }
|
|
208
|
+
|
|
209
|
+
override val overflowInset: Rect
|
|
210
|
+
get() = _overflowInset
|
|
211
|
+
|
|
212
|
+
override val overflow: String?
|
|
213
|
+
get() =
|
|
214
|
+
when (_overflow) {
|
|
215
|
+
Overflow.HIDDEN -> "hidden"
|
|
216
|
+
Overflow.SCROLL -> "scroll"
|
|
217
|
+
Overflow.VISIBLE -> "visible"
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
override var removeClippedSubviews: Boolean
|
|
221
|
+
get() = _removeClippedSubviews
|
|
222
|
+
set(value) {
|
|
223
|
+
if (ReactNativeFeatureFlags.disableSubviewClippingAndroid()) return
|
|
224
|
+
if (value && clippingRect == null) clippingRect = Rect()
|
|
225
|
+
_removeClippedSubviews = value
|
|
226
|
+
updateClippingRect()
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
override var reactScrollViewScrollState: ReactScrollViewScrollState
|
|
230
|
+
get() = _reactScrollViewScrollState
|
|
231
|
+
set(value) {
|
|
232
|
+
_reactScrollViewScrollState = value
|
|
233
|
+
if (
|
|
234
|
+
ReactNativeFeatureFlags.enableViewCulling() ||
|
|
235
|
+
ReactNativeFeatureFlags.useTraitHiddenOnAndroid()
|
|
236
|
+
) {
|
|
237
|
+
val scrollPosition = value.lastStateUpdateScroll
|
|
238
|
+
restoreScrollTo(scrollPosition.x, scrollPosition.y)
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
init {
|
|
243
|
+
ViewCompat.setAccessibilityDelegate(this, ReactScrollViewAccessibilityDelegate())
|
|
244
|
+
setOnHierarchyChangeListener(this)
|
|
245
|
+
setClipChildren(false)
|
|
246
|
+
initView()
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Set all default values here as opposed to in the constructor or field defaults. It is important
|
|
251
|
+
* that these properties are set during the constructor, but also on-demand whenever an existing
|
|
252
|
+
* ReactHorizontalScrollView is recycled.
|
|
253
|
+
*/
|
|
254
|
+
private fun initView() {
|
|
255
|
+
_overflowInset = Rect()
|
|
256
|
+
_virtualViewContainerState = null
|
|
257
|
+
activelyScrolling = false
|
|
258
|
+
clippingRect = null
|
|
259
|
+
_overflow =
|
|
260
|
+
if (ReactNativeFeatureFlags.enablePropsUpdateReconciliationAndroid()) Overflow.VISIBLE
|
|
261
|
+
else Overflow.SCROLL
|
|
262
|
+
dragging = false
|
|
263
|
+
pagingEnabled = false
|
|
264
|
+
postTouchRunnable = null
|
|
265
|
+
_removeClippedSubviews = false
|
|
266
|
+
scrollEnabled = true
|
|
267
|
+
sendMomentumEvents = false
|
|
268
|
+
scrollPerfTag = null
|
|
269
|
+
endBackground = null
|
|
270
|
+
endFillColor = Color.TRANSPARENT
|
|
271
|
+
disableIntervalMomentum = false
|
|
272
|
+
snapInterval = 0
|
|
273
|
+
snapOffsets = null
|
|
274
|
+
snapToStart = true
|
|
275
|
+
snapToEnd = true
|
|
276
|
+
snapToAlignment = SNAP_ALIGNMENT_DISABLED
|
|
277
|
+
pagedArrowScrolling = false
|
|
278
|
+
pendingContentOffsetX = UNSET_CONTENT_OFFSET
|
|
279
|
+
pendingContentOffsetY = UNSET_CONTENT_OFFSET
|
|
280
|
+
stateWrapper = null
|
|
281
|
+
_reactScrollViewScrollState = ReactScrollViewScrollState()
|
|
282
|
+
pointerEvents = PointerEvents.AUTO
|
|
283
|
+
lastScrollDispatchTime = 0
|
|
284
|
+
scrollEventThrottle = 0
|
|
285
|
+
contentView = null
|
|
286
|
+
maintainVisibleContentPositionHelper = null
|
|
287
|
+
fadingEdgeLengthStart = 0
|
|
288
|
+
fadingEdgeLengthEnd = 0
|
|
289
|
+
emittedOverScrollSinceScrollBegin = false
|
|
290
|
+
scrollsChildToFocus = true
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
internal fun recycleView() {
|
|
294
|
+
initView()
|
|
295
|
+
if (parent != null) {
|
|
296
|
+
(parent as ViewGroup).removeView(this)
|
|
297
|
+
}
|
|
298
|
+
updateView()
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
private fun updateView() {}
|
|
302
|
+
|
|
303
|
+
override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo) {
|
|
304
|
+
super.onInitializeAccessibilityNodeInfo(info)
|
|
305
|
+
val testId = getTag(R.id.react_test_id) as? String
|
|
306
|
+
if (testId != null) {
|
|
307
|
+
info.viewIdResourceName = testId
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
override fun canScrollHorizontally(direction: Int): Boolean {
|
|
312
|
+
return scrollEnabled && super.canScrollHorizontally(direction)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
private fun getOverScrollerFromParent(): OverScroller? {
|
|
316
|
+
if (!triedToGetScrollerField) {
|
|
317
|
+
triedToGetScrollerField = true
|
|
318
|
+
try {
|
|
319
|
+
scrollerField = HorizontalScrollView::class.java.getDeclaredField("mScroller")
|
|
320
|
+
scrollerField?.isAccessible = true
|
|
321
|
+
} catch (e: NoSuchFieldException) {
|
|
322
|
+
FLog.w(
|
|
323
|
+
TAG,
|
|
324
|
+
"Failed to get mScroller field for HorizontalScrollView! " +
|
|
325
|
+
"This app will exhibit the bounce-back scrolling bug :(",
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
val field = scrollerField ?: return null
|
|
331
|
+
return try {
|
|
332
|
+
val scrollerValue = field.get(this)
|
|
333
|
+
if (scrollerValue is OverScroller) {
|
|
334
|
+
scrollerValue
|
|
335
|
+
} else {
|
|
336
|
+
FLog.w(
|
|
337
|
+
TAG,
|
|
338
|
+
"Failed to cast mScroller field in HorizontalScrollView (probably due to OEM changes" +
|
|
339
|
+
" to AOSP)! This app will exhibit the bounce-back scrolling bug :(",
|
|
340
|
+
)
|
|
341
|
+
null
|
|
342
|
+
}
|
|
343
|
+
} catch (e: IllegalAccessException) {
|
|
344
|
+
throw RuntimeException("Failed to get mScroller from HorizontalScrollView!", e)
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
public open fun setScrollPerfTag(scrollPerfTag: String?) {
|
|
349
|
+
this.scrollPerfTag = scrollPerfTag
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
public open fun setDisableIntervalMomentum(disableIntervalMomentum: Boolean) {
|
|
353
|
+
this.disableIntervalMomentum = disableIntervalMomentum
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
public open fun setSendMomentumEvents(sendMomentumEvents: Boolean) {
|
|
357
|
+
this.sendMomentumEvents = sendMomentumEvents
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
public open fun setPagingEnabled(pagingEnabled: Boolean) {
|
|
361
|
+
this.pagingEnabled = pagingEnabled
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
public open fun setScrollsChildToFocus(scrollsChildToFocus: Boolean) {
|
|
365
|
+
this.scrollsChildToFocus = scrollsChildToFocus
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
public open fun setDecelerationRate(decelerationRate: Float) {
|
|
369
|
+
reactScrollViewScrollState.decelerationRate = decelerationRate
|
|
370
|
+
scroller?.setFriction(1.0f - decelerationRate)
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
public open fun abortAnimation() {
|
|
374
|
+
if (scroller != null && !scroller.isFinished) {
|
|
375
|
+
scroller.abortAnimation()
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
public open fun setSnapInterval(snapInterval: Int) {
|
|
380
|
+
this.snapInterval = snapInterval
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
public open fun setSnapOffsets(snapOffsets: List<Int>?) {
|
|
384
|
+
this.snapOffsets = snapOffsets
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
public open fun setSnapToStart(snapToStart: Boolean) {
|
|
388
|
+
this.snapToStart = snapToStart
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
public open fun setSnapToEnd(snapToEnd: Boolean) {
|
|
392
|
+
this.snapToEnd = snapToEnd
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
public open fun setSnapToAlignment(snapToAlignment: Int) {
|
|
396
|
+
this.snapToAlignment = snapToAlignment
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
public open fun flashScrollIndicators() {
|
|
400
|
+
awakenScrollBars()
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
override fun getLeftFadingEdgeStrength(): Float {
|
|
404
|
+
val max = max(fadingEdgeLengthStart.toFloat(), fadingEdgeLengthEnd.toFloat())
|
|
405
|
+
val value =
|
|
406
|
+
if (layoutDirection == LAYOUT_DIRECTION_RTL) fadingEdgeLengthEnd else fadingEdgeLengthStart
|
|
407
|
+
return value / max
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
override fun getRightFadingEdgeStrength(): Float {
|
|
411
|
+
val max = max(fadingEdgeLengthStart.toFloat(), fadingEdgeLengthEnd.toFloat())
|
|
412
|
+
val value =
|
|
413
|
+
if (layoutDirection == LAYOUT_DIRECTION_RTL) fadingEdgeLengthStart else fadingEdgeLengthEnd
|
|
414
|
+
return value / max
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
public open fun setOverflow(overflow: String?) {
|
|
418
|
+
_overflow =
|
|
419
|
+
if (overflow == null) {
|
|
420
|
+
Overflow.SCROLL
|
|
421
|
+
} else {
|
|
422
|
+
Overflow.fromString(overflow)
|
|
423
|
+
?: if (ReactNativeFeatureFlags.enablePropsUpdateReconciliationAndroid())
|
|
424
|
+
Overflow.VISIBLE
|
|
425
|
+
else Overflow.SCROLL
|
|
426
|
+
}
|
|
427
|
+
invalidate()
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
internal open fun setMaintainVisibleContentPosition(
|
|
431
|
+
config: MaintainVisibleScrollPositionHelper.Config?
|
|
432
|
+
) {
|
|
433
|
+
if (config != null && maintainVisibleContentPositionHelper == null) {
|
|
434
|
+
val helper = MaintainVisibleScrollPositionHelper(this, true)
|
|
435
|
+
maintainVisibleContentPositionHelper = helper
|
|
436
|
+
helper.start()
|
|
437
|
+
} else if (config == null) {
|
|
438
|
+
maintainVisibleContentPositionHelper?.stop()
|
|
439
|
+
maintainVisibleContentPositionHelper = null
|
|
440
|
+
}
|
|
441
|
+
maintainVisibleContentPositionHelper?.let { it.config = config }
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
override fun setOverflowInset(left: Int, top: Int, right: Int, bottom: Int) {
|
|
445
|
+
_overflowInset.set(left, top, right, bottom)
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
public override fun onDraw(canvas: Canvas) {
|
|
449
|
+
if (_overflow != Overflow.VISIBLE) {
|
|
450
|
+
BackgroundStyleApplicator.clipToPaddingBox(this, canvas)
|
|
451
|
+
}
|
|
452
|
+
super.onDraw(canvas)
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
456
|
+
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec)
|
|
457
|
+
|
|
458
|
+
val measuredWidth = MeasureSpec.getSize(widthMeasureSpec)
|
|
459
|
+
val measuredHeight = MeasureSpec.getSize(heightMeasureSpec)
|
|
460
|
+
|
|
461
|
+
if (DEBUG_MODE) {
|
|
462
|
+
FLog.i(
|
|
463
|
+
TAG,
|
|
464
|
+
"onMeasure[%d] measured width: %d measured height: %d",
|
|
465
|
+
id,
|
|
466
|
+
measuredWidth,
|
|
467
|
+
measuredHeight,
|
|
468
|
+
)
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
val measuredHeightChanged = getMeasuredHeight() != measuredHeight
|
|
472
|
+
|
|
473
|
+
setMeasuredDimension(measuredWidth, measuredHeight)
|
|
474
|
+
|
|
475
|
+
// See how `scrollXAfterMeasure` is used in `onLayout`, and why we only enable the
|
|
476
|
+
// hack if the height has changed.
|
|
477
|
+
if (measuredHeightChanged && scroller != null) {
|
|
478
|
+
scrollXAfterMeasure = scroller.currX
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
483
|
+
if (DEBUG_MODE) {
|
|
484
|
+
FLog.i(TAG, "onLayout[%d] l %d t %d r %d b %d", id, l, t, r, b)
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// Has the scrollX changed between the last onMeasure and this layout?
|
|
488
|
+
// If so, cancel the animation.
|
|
489
|
+
// Essentially, if the height changes (due to keyboard popping up, for instance) the
|
|
490
|
+
// underlying View.layout method will in some cases scroll to an incorrect X position -
|
|
491
|
+
// see also the hacks in `fling`. The order of layout is called in the order of: onMeasure,
|
|
492
|
+
// layout, onLayout.
|
|
493
|
+
// We cannot override `layout` but we can detect the sequence of events between onMeasure
|
|
494
|
+
// and onLayout.
|
|
495
|
+
if (
|
|
496
|
+
scrollXAfterMeasure != NO_SCROLL_POSITION &&
|
|
497
|
+
scroller != null &&
|
|
498
|
+
scrollXAfterMeasure != scroller.finalX &&
|
|
499
|
+
!scroller.isFinished
|
|
500
|
+
) {
|
|
501
|
+
if (DEBUG_MODE) {
|
|
502
|
+
FLog.i(
|
|
503
|
+
TAG,
|
|
504
|
+
"onLayout[%d] scroll hack enabled: reset to previous scrollX position of %d",
|
|
505
|
+
id,
|
|
506
|
+
scrollXAfterMeasure,
|
|
507
|
+
)
|
|
508
|
+
}
|
|
509
|
+
scroller.startScroll(scrollXAfterMeasure, scroller.finalY, 0, 0)
|
|
510
|
+
scroller.forceFinished(true)
|
|
511
|
+
scrollXAfterMeasure = NO_SCROLL_POSITION
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// Apply pending contentOffset in case it was set before the view was laid out.
|
|
515
|
+
if (isContentReady()) {
|
|
516
|
+
val scrollToX =
|
|
517
|
+
if (pendingContentOffsetX != UNSET_CONTENT_OFFSET) pendingContentOffsetX else scrollX
|
|
518
|
+
val scrollToY =
|
|
519
|
+
if (pendingContentOffsetY != UNSET_CONTENT_OFFSET) pendingContentOffsetY else scrollY
|
|
520
|
+
scrollTo(scrollToX, scrollToY)
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
ReactScrollViewHelper.emitLayoutEvent(this)
|
|
524
|
+
_virtualViewContainerState?.updateState()
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Since ReactHorizontalScrollView handles layout changes on JS side, it does not call
|
|
529
|
+
* super.onLayout due to which mIsLayoutDirty flag in HorizontalScrollView remains true and
|
|
530
|
+
* prevents scrolling to child when requestChildFocus is called. Overriding this method and
|
|
531
|
+
* scrolling to child without checking any layout dirty flag. This will fix focus navigation issue
|
|
532
|
+
* for KeyEvents which are not handled in HorizontalScrollView, for example: KEYCODE_TAB.
|
|
533
|
+
*/
|
|
534
|
+
override fun requestChildFocus(child: View, focused: View?) {
|
|
535
|
+
if (focused != null && !pagingEnabled && scrollsChildToFocus) {
|
|
536
|
+
scrollToChild(focused)
|
|
537
|
+
}
|
|
538
|
+
requestChildFocusWithoutScroll(child, focused)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* In rare cases where an app overrides the built-in ReactScrollView by overriding it, and also
|
|
543
|
+
* needs to customize scroll into view on focus behaviors, this protected method can be used to
|
|
544
|
+
* unblock such customization.
|
|
545
|
+
*/
|
|
546
|
+
protected open fun requestChildFocusWithoutScroll(child: View, focused: View?) {
|
|
547
|
+
super.requestChildFocus(child, focused)
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
override fun requestChildRectangleOnScreen(
|
|
551
|
+
child: View,
|
|
552
|
+
rectangle: Rect,
|
|
553
|
+
immediate: Boolean,
|
|
554
|
+
): Boolean {
|
|
555
|
+
if (!scrollsChildToFocus) return false
|
|
556
|
+
return super.requestChildRectangleOnScreen(child, rectangle, immediate)
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
override fun addFocusables(views: ArrayList<View>, direction: Int, focusableMode: Int) {
|
|
560
|
+
if (pagingEnabled && !pagedArrowScrolling) {
|
|
561
|
+
// Only add elements within the current page to list of focusables
|
|
562
|
+
val candidateViews = ArrayList<View>()
|
|
563
|
+
super.addFocusables(candidateViews, direction, focusableMode)
|
|
564
|
+
for (candidate in candidateViews) {
|
|
565
|
+
// We must also include the currently focused in the focusables list or focus search will
|
|
566
|
+
// always return the first element within the focusables list
|
|
567
|
+
if (
|
|
568
|
+
isScrolledInView(candidate) ||
|
|
569
|
+
isPartiallyScrolledInView(candidate) ||
|
|
570
|
+
candidate.isFocused
|
|
571
|
+
) {
|
|
572
|
+
views.add(candidate)
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
} else {
|
|
576
|
+
super.addFocusables(views, direction, focusableMode)
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/** Calculates the x delta required to scroll the given descendent into view */
|
|
581
|
+
private fun getScrollDelta(descendent: View): Int {
|
|
582
|
+
descendent.getDrawingRect(tempRect)
|
|
583
|
+
offsetDescendantRectToMyCoords(descendent, tempRect)
|
|
584
|
+
return computeScrollDeltaToGetChildRectOnScreen(tempRect)
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/** Returns whether the given descendent is scrolled fully in view */
|
|
588
|
+
private fun isScrolledInView(descendent: View): Boolean {
|
|
589
|
+
return getScrollDelta(descendent) == 0
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
override fun isPartiallyScrolledInView(view: View): Boolean {
|
|
593
|
+
val scrollDelta = getScrollDelta(view)
|
|
594
|
+
view.getDrawingRect(tempRect)
|
|
595
|
+
return scrollDelta != 0 && abs(scrollDelta) < tempRect.width()
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/** Returns whether the given descendent is "mostly" (>50%) scrolled in view */
|
|
599
|
+
private fun isMostlyScrolledInView(descendent: View): Boolean {
|
|
600
|
+
val scrollDelta = getScrollDelta(descendent)
|
|
601
|
+
descendent.getDrawingRect(tempRect)
|
|
602
|
+
return scrollDelta != 0 && abs(scrollDelta) < (tempRect.width() / 2)
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
private fun scrollToChild(child: View) {
|
|
606
|
+
val scrollDelta = getScrollDelta(child)
|
|
607
|
+
if (scrollDelta != 0) {
|
|
608
|
+
scrollBy(scrollDelta, 0)
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
override fun onScrollChanged(x: Int, y: Int, oldX: Int, oldY: Int) {
|
|
613
|
+
if (DEBUG_MODE) {
|
|
614
|
+
FLog.i(TAG, "onScrollChanged[%d] x %d y %d oldx %d oldy %d", id, x, y, oldX, oldY)
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
Systrace.beginSection(Systrace.TRACE_TAG_REACT, "ReactHorizontalScrollView.onScrollChanged")
|
|
618
|
+
try {
|
|
619
|
+
super.onScrollChanged(x, y, oldX, oldY)
|
|
620
|
+
activelyScrolling = true
|
|
621
|
+
if (onScrollDispatchHelper.onScrollChanged(x, y)) {
|
|
622
|
+
if (_removeClippedSubviews) {
|
|
623
|
+
updateClippingRect()
|
|
624
|
+
}
|
|
625
|
+
ReactScrollViewHelper.updateStateOnScrollChanged(
|
|
626
|
+
this,
|
|
627
|
+
onScrollDispatchHelper.xFlingVelocity,
|
|
628
|
+
onScrollDispatchHelper.yFlingVelocity,
|
|
629
|
+
)
|
|
630
|
+
_virtualViewContainerState?.updateState()
|
|
631
|
+
}
|
|
632
|
+
} finally {
|
|
633
|
+
Systrace.endSection(Systrace.TRACE_TAG_REACT)
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
override fun shouldDelayChildPressedState(): Boolean =
|
|
638
|
+
hasChildPressedStateDelay ?: super.shouldDelayChildPressedState()
|
|
639
|
+
|
|
640
|
+
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
|
|
641
|
+
if (!scrollEnabled) return false
|
|
642
|
+
|
|
643
|
+
if (
|
|
644
|
+
ev.action == MotionEvent.ACTION_DOWN &&
|
|
645
|
+
findDeepestScrollViewForMotionEvent(this, ev) != null
|
|
646
|
+
) {
|
|
647
|
+
return false
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// We intercept the touch event if the children are not supposed to receive it.
|
|
651
|
+
if (!PointerEvents.canChildrenBeTouchTarget(pointerEvents)) return true
|
|
652
|
+
|
|
653
|
+
try {
|
|
654
|
+
if (super.onInterceptTouchEvent(ev)) {
|
|
655
|
+
handleInterceptedTouchEvent(ev)
|
|
656
|
+
return true
|
|
657
|
+
}
|
|
658
|
+
} catch (e: IllegalArgumentException) {
|
|
659
|
+
// Log and ignore the error. This seems to be a bug in the android SDK and
|
|
660
|
+
// this is the commonly accepted workaround.
|
|
661
|
+
// https://tinyurl.com/mw6qkod (Stack Overflow)
|
|
662
|
+
FLog.w(ReactConstants.TAG, "Error intercepting touch event.", e)
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
return false
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
protected open fun handleInterceptedTouchEvent(ev: MotionEvent) {
|
|
669
|
+
if (!ReactNativeFeatureFlags.shouldTriggerResponderTransferOnScrollAndroid()) {
|
|
670
|
+
NativeGestureUtil.notifyNativeGestureStarted(this, ev)
|
|
671
|
+
}
|
|
672
|
+
ReactScrollViewHelper.emitScrollBeginDragEvent(this)
|
|
673
|
+
dragging = true
|
|
674
|
+
emittedOverScrollSinceScrollBegin = false
|
|
675
|
+
enableFpsListener()
|
|
676
|
+
getFlingAnimator().cancel()
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
override fun pageScroll(direction: Int): Boolean {
|
|
680
|
+
val handled = super.pageScroll(direction)
|
|
681
|
+
if (pagingEnabled && handled) {
|
|
682
|
+
handlePostTouchScrolling(0, 0)
|
|
683
|
+
}
|
|
684
|
+
return handled
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
private fun isDescendantOf(parent: View?, view: View?): Boolean {
|
|
688
|
+
if (view == null || parent == null) return false
|
|
689
|
+
var p: ViewParent? = view.parent
|
|
690
|
+
while (p != null && p.parent != null) {
|
|
691
|
+
if (p === parent) return true
|
|
692
|
+
p = p.parent
|
|
693
|
+
}
|
|
694
|
+
return false
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
override fun arrowScroll(direction: Int): Boolean {
|
|
698
|
+
var handled = false
|
|
699
|
+
|
|
700
|
+
if (pagingEnabled) {
|
|
701
|
+
pagedArrowScrolling = true
|
|
702
|
+
|
|
703
|
+
if (isNotEmpty()) {
|
|
704
|
+
val currentFocused = findFocus()
|
|
705
|
+
val nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction)
|
|
706
|
+
val rootChild = getContentView()
|
|
707
|
+
if (nextFocused != null && isDescendantOf(rootChild, nextFocused)) {
|
|
708
|
+
if (!isScrolledInView(nextFocused) && !isMostlyScrolledInView(nextFocused)) {
|
|
709
|
+
smoothScrollToNextPage(direction)
|
|
710
|
+
}
|
|
711
|
+
nextFocused.requestFocus()
|
|
712
|
+
handled = true
|
|
713
|
+
} else {
|
|
714
|
+
smoothScrollToNextPage(direction)
|
|
715
|
+
handled = true
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
pagedArrowScrolling = false
|
|
720
|
+
} else {
|
|
721
|
+
handled = super.arrowScroll(direction)
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
return handled
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
override fun onTouchEvent(ev: MotionEvent): Boolean {
|
|
728
|
+
if (!scrollEnabled) return false
|
|
729
|
+
|
|
730
|
+
// We do not accept the touch event if this view is not supposed to receive it.
|
|
731
|
+
if (!PointerEvents.canBeTouchTarget(pointerEvents)) return false
|
|
732
|
+
|
|
733
|
+
velocityHelper.calculateVelocity(ev)
|
|
734
|
+
val action = ev.actionMasked
|
|
735
|
+
if (action == MotionEvent.ACTION_UP && dragging) {
|
|
736
|
+
ReactScrollViewHelper.updateFabricScrollState(this)
|
|
737
|
+
|
|
738
|
+
val velocityX = velocityHelper.xVelocity
|
|
739
|
+
val velocityY = velocityHelper.yVelocity
|
|
740
|
+
ReactScrollViewHelper.emitScrollEndDragEvent(this, velocityX, velocityY)
|
|
741
|
+
if (!ReactNativeFeatureFlags.shouldTriggerResponderTransferOnScrollAndroid()) {
|
|
742
|
+
NativeGestureUtil.notifyNativeGestureEnded(this, ev)
|
|
743
|
+
}
|
|
744
|
+
dragging = false
|
|
745
|
+
// After the touch finishes, we may need to do some scrolling afterwards either as a result
|
|
746
|
+
// of a fling or because we need to page align the content
|
|
747
|
+
handlePostTouchScrolling(Math.round(velocityX), Math.round(velocityY))
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
if (action == MotionEvent.ACTION_DOWN) {
|
|
751
|
+
cancelPostTouchScrolling()
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
return try {
|
|
755
|
+
super.onTouchEvent(ev)
|
|
756
|
+
} catch (e: IllegalArgumentException) {
|
|
757
|
+
// Log and ignore the error. This seems to be a bug in the android SDK and
|
|
758
|
+
// this is the commonly accepted workaround.
|
|
759
|
+
// https://tinyurl.com/mw6qkod (Stack Overflow)
|
|
760
|
+
FLog.w(ReactConstants.TAG, "Error handling touch event.", e)
|
|
761
|
+
false
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
override fun dispatchGenericMotionEvent(ev: MotionEvent): Boolean {
|
|
766
|
+
// Ignore generic motion events (joystick, mouse wheel, trackpad) if scrolling is disabled
|
|
767
|
+
if (!scrollEnabled) return false
|
|
768
|
+
|
|
769
|
+
// We do not dispatch the motion event if its children are not supposed to receive it
|
|
770
|
+
if (!PointerEvents.canChildrenBeTouchTarget(pointerEvents)) return false
|
|
771
|
+
|
|
772
|
+
// Handle ACTION_SCROLL events (mouse wheel, trackpad, joystick)
|
|
773
|
+
if (ev.actionMasked == MotionEvent.ACTION_SCROLL) {
|
|
774
|
+
val hScroll = ev.getAxisValue(MotionEvent.AXIS_HSCROLL)
|
|
775
|
+
if (hScroll != 0f) {
|
|
776
|
+
// Perform the scroll
|
|
777
|
+
enableFpsListener()
|
|
778
|
+
val result = super.dispatchGenericMotionEvent(ev)
|
|
779
|
+
// Schedule snap alignment to run after scrolling stops
|
|
780
|
+
if (
|
|
781
|
+
result &&
|
|
782
|
+
(pagingEnabled ||
|
|
783
|
+
snapInterval != 0 ||
|
|
784
|
+
snapOffsets != null ||
|
|
785
|
+
snapToAlignment != SNAP_ALIGNMENT_DISABLED)
|
|
786
|
+
) {
|
|
787
|
+
// Cancel any pending post-touch runnable and reschedule
|
|
788
|
+
if (postTouchRunnable != null) {
|
|
789
|
+
removeCallbacks(postTouchRunnable)
|
|
790
|
+
postTouchRunnable = null
|
|
791
|
+
}
|
|
792
|
+
postTouchRunnable = Runnable {
|
|
793
|
+
postTouchRunnable = null
|
|
794
|
+
// +1/-1 velocity if scrolling right or left. This is to ensure that the
|
|
795
|
+
// next/previous page is picked rather than sliding backwards to the current page
|
|
796
|
+
var velocityX = hScroll.sign.toInt()
|
|
797
|
+
if (disableIntervalMomentum) {
|
|
798
|
+
velocityX = 0
|
|
799
|
+
}
|
|
800
|
+
flingAndSnap(velocityX)
|
|
801
|
+
handlePostTouchScrolling(velocityX, 0)
|
|
802
|
+
}
|
|
803
|
+
postOnAnimationDelayed(postTouchRunnable, ReactScrollViewHelper.MOMENTUM_DELAY)
|
|
804
|
+
} else {
|
|
805
|
+
handlePostTouchScrolling(0, 0)
|
|
806
|
+
}
|
|
807
|
+
return result
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
return super.dispatchGenericMotionEvent(ev)
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
override fun executeKeyEvent(event: KeyEvent): Boolean {
|
|
815
|
+
val eventKeyCode = event.keyCode
|
|
816
|
+
if (
|
|
817
|
+
!scrollEnabled &&
|
|
818
|
+
(eventKeyCode == KeyEvent.KEYCODE_DPAD_LEFT ||
|
|
819
|
+
eventKeyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
|
|
820
|
+
) {
|
|
821
|
+
return false
|
|
822
|
+
}
|
|
823
|
+
return super.executeKeyEvent(event)
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
override fun fling(velocityX: Int) {
|
|
827
|
+
if (DEBUG_MODE) {
|
|
828
|
+
FLog.i(TAG, "fling[%d] velocityX %d", id, velocityX)
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
// Workaround.
|
|
832
|
+
// On Android P if a ScrollView is inverted, we will get a wrong sign for
|
|
833
|
+
// velocityX (see https://issuetracker.google.com/issues/112385925).
|
|
834
|
+
// At the same time, onScrollDispatchHelper tracks the correct velocity direction.
|
|
835
|
+
//
|
|
836
|
+
// Hence, we can use the absolute value from whatever the OS gives
|
|
837
|
+
// us and use the sign of what onScrollDispatchHelper has tracked.
|
|
838
|
+
val correctedVelocityX =
|
|
839
|
+
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P) {
|
|
840
|
+
(abs(velocityX) * onScrollDispatchHelper.xFlingVelocity.sign).toInt()
|
|
841
|
+
} else {
|
|
842
|
+
velocityX
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
if (pagingEnabled) {
|
|
846
|
+
flingAndSnap(correctedVelocityX)
|
|
847
|
+
} else if (scroller != null) {
|
|
848
|
+
// FB SCROLLVIEW CHANGE
|
|
849
|
+
|
|
850
|
+
// We provide our own version of fling that uses a different call to the standard OverScroller
|
|
851
|
+
// which takes into account the possibility of adding new content while the ScrollView is
|
|
852
|
+
// animating. Because we give essentially no max X for the fling, the fling will continue as
|
|
853
|
+
// long as there is content. See onOverScrolled() to see the second part of this change which
|
|
854
|
+
// properly aborts the scroller animation when we get to the bottom of the ScrollView content.
|
|
855
|
+
|
|
856
|
+
val scrollWindowWidth = width - paddingStart - paddingEnd
|
|
857
|
+
|
|
858
|
+
scroller.fling(
|
|
859
|
+
scrollX, // startX
|
|
860
|
+
scrollY, // startY
|
|
861
|
+
correctedVelocityX, // velocityX
|
|
862
|
+
0, // velocityY
|
|
863
|
+
0, // minX
|
|
864
|
+
Int.MAX_VALUE, // maxX
|
|
865
|
+
0, // minY
|
|
866
|
+
0, // maxY
|
|
867
|
+
scrollWindowWidth / 2, // overX
|
|
868
|
+
0, // overY
|
|
869
|
+
)
|
|
870
|
+
|
|
871
|
+
postInvalidateOnAnimation()
|
|
872
|
+
|
|
873
|
+
// END FB SCROLLVIEW CHANGE
|
|
874
|
+
} else {
|
|
875
|
+
super.fling(correctedVelocityX)
|
|
876
|
+
}
|
|
877
|
+
handlePostTouchScrolling(correctedVelocityX, 0)
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
|
|
881
|
+
super.onSizeChanged(w, h, oldw, oldh)
|
|
882
|
+
if (_removeClippedSubviews) {
|
|
883
|
+
updateClippingRect()
|
|
884
|
+
}
|
|
885
|
+
_virtualViewContainerState?.updateState()
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
override fun onAttachedToWindow() {
|
|
889
|
+
super.onAttachedToWindow()
|
|
890
|
+
if (_removeClippedSubviews) {
|
|
891
|
+
updateClippingRect()
|
|
892
|
+
}
|
|
893
|
+
maintainVisibleContentPositionHelper?.start()
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
override fun onDetachedFromWindow() {
|
|
897
|
+
super.onDetachedFromWindow()
|
|
898
|
+
maintainVisibleContentPositionHelper?.stop()
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
override fun focusSearch(focused: View, @FocusDirection direction: Int): View? {
|
|
902
|
+
val nextFocus = super.focusSearch(focused, direction)
|
|
903
|
+
|
|
904
|
+
if (ReactNativeFeatureFlags.enableCustomFocusSearchOnClippedElementsAndroid()) {
|
|
905
|
+
// If we can find the next focus and it is a child of this view, return it, else it means we
|
|
906
|
+
// are leaving the scroll view and we should try to find a clipped element
|
|
907
|
+
if (nextFocus != null && findViewById<View>(nextFocus.id) != null) {
|
|
908
|
+
return nextFocus
|
|
909
|
+
}
|
|
910
|
+
val nextFocusableView = findNextFocusableView(this, focused, direction)
|
|
911
|
+
if (nextFocusableView != null) {
|
|
912
|
+
return nextFocusableView
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
return nextFocus
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
override fun updateClippingRect() {
|
|
920
|
+
updateClippingRect(null)
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
override fun updateClippingRect(excludedViews: Set<Int>?) {
|
|
924
|
+
if (!_removeClippedSubviews) return
|
|
925
|
+
|
|
926
|
+
Systrace.beginSection(Systrace.TRACE_TAG_REACT, "ReactHorizontalScrollView.updateClippingRect")
|
|
927
|
+
try {
|
|
928
|
+
val rect = checkNotNull(clippingRect)
|
|
929
|
+
ReactClippingViewGroupHelper.calculateClippingRect(this, rect)
|
|
930
|
+
val cv = getContentView()
|
|
931
|
+
if (cv is ReactClippingViewGroup) {
|
|
932
|
+
cv.updateClippingRect(excludedViews)
|
|
933
|
+
}
|
|
934
|
+
} finally {
|
|
935
|
+
Systrace.endSection(Systrace.TRACE_TAG_REACT)
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
override fun getClippingRect(outClippingRect: Rect) {
|
|
940
|
+
outClippingRect.set(checkNotNull(clippingRect))
|
|
941
|
+
}
|
|
942
|
+
|
|
943
|
+
override fun getChildVisibleRect(child: View, r: Rect, offset: android.graphics.Point?): Boolean {
|
|
944
|
+
return super.getChildVisibleRect(child, r, offset)
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
private fun getSnapInterval(): Int = if (snapInterval != 0) snapInterval else width
|
|
948
|
+
|
|
949
|
+
private fun getContentView(): View? = getChildAt(0)
|
|
950
|
+
|
|
951
|
+
public open fun setEndFillColor(color: Int) {
|
|
952
|
+
if (color != endFillColor) {
|
|
953
|
+
endFillColor = color
|
|
954
|
+
endBackground = endFillColor.toDrawable()
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
override fun onOverScrolled(scrollX: Int, scrollY: Int, clampedX: Boolean, clampedY: Boolean) {
|
|
959
|
+
if (DEBUG_MODE) {
|
|
960
|
+
FLog.i(
|
|
961
|
+
TAG,
|
|
962
|
+
"onOverScrolled[%d] scrollX %d scrollY %d clampedX %b clampedY %b",
|
|
963
|
+
id,
|
|
964
|
+
scrollX,
|
|
965
|
+
scrollY,
|
|
966
|
+
clampedX,
|
|
967
|
+
clampedY,
|
|
968
|
+
)
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
@Suppress("NAME_SHADOWING") var scrollX = scrollX
|
|
972
|
+
|
|
973
|
+
if (scroller != null) {
|
|
974
|
+
// FB SCROLLVIEW CHANGE
|
|
975
|
+
|
|
976
|
+
// This is part two of the reimplementation of fling to fix the bounce-back bug. See fling()
|
|
977
|
+
// for more information.
|
|
978
|
+
|
|
979
|
+
if (!scroller.isFinished && scroller.currX != scroller.finalX) {
|
|
980
|
+
val scrollRange = max(computeHorizontalScrollRange() - width, 0)
|
|
981
|
+
if (scrollX >= scrollRange) {
|
|
982
|
+
scroller.abortAnimation()
|
|
983
|
+
scrollX = scrollRange
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
// END FB SCROLLVIEW CHANGE
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
if (
|
|
991
|
+
ReactNativeFeatureFlags.shouldTriggerResponderTransferOnScrollAndroid() &&
|
|
992
|
+
clampedX &&
|
|
993
|
+
!emittedOverScrollSinceScrollBegin
|
|
994
|
+
) {
|
|
995
|
+
ReactScrollViewHelper.emitScrollEvent(this, 0f, 0f)
|
|
996
|
+
emittedOverScrollSinceScrollBegin = true
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY)
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
override fun onChildViewAdded(parent: View, child: View) {
|
|
1003
|
+
contentView = child
|
|
1004
|
+
child.addOnLayoutChangeListener(this)
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
override fun onChildViewRemoved(parent: View, child: View) {
|
|
1008
|
+
contentView?.removeOnLayoutChangeListener(this)
|
|
1009
|
+
contentView = null
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
private fun enableFpsListener() {
|
|
1013
|
+
if (isScrollPerfLoggingEnabled()) {
|
|
1014
|
+
val listener = fpsListener ?: return
|
|
1015
|
+
val perfTag = scrollPerfTag.takeUnless { it.isNullOrEmpty() } ?: return
|
|
1016
|
+
listener.enable(perfTag)
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
private fun disableFpsListener() {
|
|
1021
|
+
if (isScrollPerfLoggingEnabled()) {
|
|
1022
|
+
val listener = fpsListener ?: return
|
|
1023
|
+
val perfTag = scrollPerfTag.takeUnless { it.isNullOrEmpty() } ?: return
|
|
1024
|
+
listener.disable(perfTag)
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
private fun isScrollPerfLoggingEnabled(): Boolean {
|
|
1029
|
+
return fpsListener != null && !scrollPerfTag.isNullOrEmpty()
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
override fun draw(canvas: Canvas) {
|
|
1033
|
+
if (endFillColor != Color.TRANSPARENT) {
|
|
1034
|
+
val content = getContentView()
|
|
1035
|
+
val bg = endBackground
|
|
1036
|
+
if (bg != null && content != null && content.right < width) {
|
|
1037
|
+
bg.setBounds(content.right, 0, width, height)
|
|
1038
|
+
bg.draw(canvas)
|
|
1039
|
+
}
|
|
1040
|
+
}
|
|
1041
|
+
super.draw(canvas)
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
/**
|
|
1045
|
+
* This handles any sort of scrolling that may occur after a touch is finished. This may be
|
|
1046
|
+
* momentum scrolling (fling) or because you have pagingEnabled on the scroll view. Because we
|
|
1047
|
+
* don't get any events from Android about this lifecycle, we do all our detection by creating a
|
|
1048
|
+
* runnable that checks if we scrolled in the last frame and if so assumes we are still scrolling.
|
|
1049
|
+
*/
|
|
1050
|
+
private fun handlePostTouchScrolling(velocityX: Int, velocityY: Int) {
|
|
1051
|
+
if (DEBUG_MODE) {
|
|
1052
|
+
FLog.i(
|
|
1053
|
+
TAG,
|
|
1054
|
+
"handlePostTouchScrolling[%d] velocityX %d velocityY %d",
|
|
1055
|
+
id,
|
|
1056
|
+
velocityX,
|
|
1057
|
+
velocityY,
|
|
1058
|
+
)
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
// Check if we are already handling this which may occur if this is called by both the touch up
|
|
1062
|
+
// and a fling call
|
|
1063
|
+
if (postTouchRunnable != null) return
|
|
1064
|
+
|
|
1065
|
+
if (sendMomentumEvents) {
|
|
1066
|
+
ReactScrollViewHelper.emitScrollMomentumBeginEvent(this, velocityX, velocityY)
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
activelyScrolling = false
|
|
1070
|
+
postTouchRunnable =
|
|
1071
|
+
object : Runnable {
|
|
1072
|
+
private var snappingToPage = false
|
|
1073
|
+
private var stableFrames = 0
|
|
1074
|
+
|
|
1075
|
+
override fun run() {
|
|
1076
|
+
if (activelyScrolling) {
|
|
1077
|
+
// We are still scrolling.
|
|
1078
|
+
activelyScrolling = false
|
|
1079
|
+
stableFrames = 0
|
|
1080
|
+
this@ReactHorizontalScrollView.postOnAnimationDelayed(
|
|
1081
|
+
this,
|
|
1082
|
+
ReactScrollViewHelper.MOMENTUM_DELAY,
|
|
1083
|
+
)
|
|
1084
|
+
} else {
|
|
1085
|
+
// There has not been a scroll update since the last time this Runnable executed.
|
|
1086
|
+
ReactScrollViewHelper.updateFabricScrollState(this@ReactHorizontalScrollView)
|
|
1087
|
+
|
|
1088
|
+
// We keep checking for updates until the ScrollView has "stabilized" and hasn't
|
|
1089
|
+
// scrolled for N consecutive frames. This number is arbitrary: big enough to catch
|
|
1090
|
+
// a number of race conditions, but small enough to not cause perf regressions, etc.
|
|
1091
|
+
// In anecdotal testing, it seemed like a decent number.
|
|
1092
|
+
// Without this check, sometimes this Runnable stops executing too soon - it will
|
|
1093
|
+
// fire before the first scroll event of an animated scroll/fling, and stop
|
|
1094
|
+
// immediately.
|
|
1095
|
+
stableFrames++
|
|
1096
|
+
|
|
1097
|
+
if (stableFrames >= 3) {
|
|
1098
|
+
postTouchRunnable = null
|
|
1099
|
+
if (sendMomentumEvents) {
|
|
1100
|
+
ReactScrollViewHelper.emitScrollMomentumEndEvent(this@ReactHorizontalScrollView)
|
|
1101
|
+
}
|
|
1102
|
+
// Kotlin name is notifyUserDrivenScrollEnded; the _internal suffix is
|
|
1103
|
+
// only a @JvmName alias for Java callers.
|
|
1104
|
+
ReactScrollViewHelper.notifyUserDrivenScrollEnded(this@ReactHorizontalScrollView)
|
|
1105
|
+
disableFpsListener()
|
|
1106
|
+
} else {
|
|
1107
|
+
if (pagingEnabled && !snappingToPage) {
|
|
1108
|
+
// If we have pagingEnabled and we have not snapped to the page
|
|
1109
|
+
// we need to cause that scroll by asking for it
|
|
1110
|
+
snappingToPage = true
|
|
1111
|
+
flingAndSnap(0)
|
|
1112
|
+
}
|
|
1113
|
+
// The scrollview has not "stabilized" so we just post to check again a frame later
|
|
1114
|
+
this@ReactHorizontalScrollView.postOnAnimationDelayed(
|
|
1115
|
+
this,
|
|
1116
|
+
ReactScrollViewHelper.MOMENTUM_DELAY,
|
|
1117
|
+
)
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
postOnAnimationDelayed(postTouchRunnable, ReactScrollViewHelper.MOMENTUM_DELAY)
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
private fun cancelPostTouchScrolling() {
|
|
1126
|
+
if (postTouchRunnable != null) {
|
|
1127
|
+
removeCallbacks(postTouchRunnable)
|
|
1128
|
+
postTouchRunnable = null
|
|
1129
|
+
getFlingAnimator().cancel()
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
private fun predictFinalScrollPosition(velocityX: Int): Int {
|
|
1134
|
+
// predict where a fling would end up so we can scroll to the nearest snap offset
|
|
1135
|
+
val maximumOffset = max(0, computeHorizontalScrollRange() - width)
|
|
1136
|
+
// TODO(T106335409): Existing prediction still uses overscroller. Consider change this to use
|
|
1137
|
+
// fling animator instead.
|
|
1138
|
+
return if (getFlingAnimator() === defaultFlingAnimator) {
|
|
1139
|
+
ReactScrollViewHelper.predictFinalScrollPosition(this, velocityX, 0, maximumOffset, 0).x
|
|
1140
|
+
} else {
|
|
1141
|
+
ReactScrollViewHelper.getNextFlingStartValue(
|
|
1142
|
+
this,
|
|
1143
|
+
scrollX,
|
|
1144
|
+
reactScrollViewScrollState.finalAnimatedPositionScroll.x,
|
|
1145
|
+
velocityX,
|
|
1146
|
+
) + getFlingExtrapolatedDistance(velocityX)
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* This will smooth scroll us to the nearest snap offset point. It currently just looks at where
|
|
1152
|
+
* the content is and slides to the nearest point. It is intended to be run after we are done
|
|
1153
|
+
* scrolling, and handling any momentum scrolling.
|
|
1154
|
+
*/
|
|
1155
|
+
private fun smoothScrollAndSnap(velocity: Int) {
|
|
1156
|
+
if (DEBUG_MODE) {
|
|
1157
|
+
FLog.i(TAG, "smoothScrollAndSnap[%d] velocity %d", id, velocity)
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
val interval = getSnapInterval().toDouble()
|
|
1161
|
+
val currentOffset =
|
|
1162
|
+
ReactScrollViewHelper.getNextFlingStartValue(
|
|
1163
|
+
this,
|
|
1164
|
+
scrollX,
|
|
1165
|
+
reactScrollViewScrollState.finalAnimatedPositionScroll.x,
|
|
1166
|
+
velocity,
|
|
1167
|
+
)
|
|
1168
|
+
.toDouble()
|
|
1169
|
+
val targetOffset = predictFinalScrollPosition(velocity).toDouble()
|
|
1170
|
+
|
|
1171
|
+
var previousPage = floor(currentOffset / interval).toInt()
|
|
1172
|
+
var nextPage = ceil(currentOffset / interval).toInt()
|
|
1173
|
+
var currentPage = round(currentOffset / interval).toInt()
|
|
1174
|
+
val targetPage = round(targetOffset / interval).toInt()
|
|
1175
|
+
|
|
1176
|
+
if (velocity > 0 && nextPage == previousPage) {
|
|
1177
|
+
nextPage++
|
|
1178
|
+
} else if (velocity < 0 && previousPage == nextPage) {
|
|
1179
|
+
previousPage--
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
if (velocity > 0 && currentPage < nextPage && targetPage > previousPage) {
|
|
1183
|
+
currentPage = nextPage
|
|
1184
|
+
} else if (velocity < 0 && currentPage > previousPage && targetPage < nextPage) {
|
|
1185
|
+
currentPage = previousPage
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
val finalTargetOffset = currentPage * interval
|
|
1189
|
+
if (finalTargetOffset != currentOffset) {
|
|
1190
|
+
activelyScrolling = true
|
|
1191
|
+
reactSmoothScrollTo(finalTargetOffset.toInt(), scrollY)
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
private fun flingAndSnap(velocityX: Int) {
|
|
1196
|
+
if (DEBUG_MODE) {
|
|
1197
|
+
FLog.i(TAG, "smoothScrollAndSnap[%d] velocityX %d", id, velocityX)
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
if (isEmpty()) return
|
|
1201
|
+
|
|
1202
|
+
// pagingEnabled only allows snapping one interval at a time
|
|
1203
|
+
if (snapInterval == 0 && snapOffsets == null && snapToAlignment == SNAP_ALIGNMENT_DISABLED) {
|
|
1204
|
+
smoothScrollAndSnap(velocityX)
|
|
1205
|
+
return
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
@Suppress("NAME_SHADOWING") var velocityX = velocityX
|
|
1209
|
+
val hasCustomizedFlingAnimator = getFlingAnimator() !== defaultFlingAnimator
|
|
1210
|
+
val maximumOffset = max(0, computeHorizontalScrollRange() - width)
|
|
1211
|
+
var targetOffset = predictFinalScrollPosition(velocityX)
|
|
1212
|
+
if (disableIntervalMomentum) {
|
|
1213
|
+
targetOffset = scrollX
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
var smallerOffset = 0
|
|
1217
|
+
var largerOffset = maximumOffset
|
|
1218
|
+
var firstOffset = 0
|
|
1219
|
+
var lastOffset = maximumOffset
|
|
1220
|
+
val viewportWidth = width - paddingStart - paddingEnd
|
|
1221
|
+
|
|
1222
|
+
// offsets are from the right edge in RTL layouts
|
|
1223
|
+
if (layoutDirection == LAYOUT_DIRECTION_RTL) {
|
|
1224
|
+
targetOffset = maximumOffset - targetOffset
|
|
1225
|
+
velocityX = -velocityX
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
// get the nearest snap points to the target offset
|
|
1229
|
+
val offsets = snapOffsets
|
|
1230
|
+
if (!offsets.isNullOrEmpty()) {
|
|
1231
|
+
firstOffset = offsets[0]
|
|
1232
|
+
lastOffset = offsets[offsets.size - 1]
|
|
1233
|
+
|
|
1234
|
+
for (i in offsets.indices) {
|
|
1235
|
+
val offset = offsets[i]
|
|
1236
|
+
if (offset <= targetOffset) {
|
|
1237
|
+
if (targetOffset - offset < targetOffset - smallerOffset) {
|
|
1238
|
+
smallerOffset = offset
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
if (offset >= targetOffset) {
|
|
1242
|
+
if (offset - targetOffset < largerOffset - targetOffset) {
|
|
1243
|
+
largerOffset = offset
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
} else if (snapToAlignment != SNAP_ALIGNMENT_DISABLED) {
|
|
1248
|
+
if (snapInterval > 0) {
|
|
1249
|
+
val ratio = targetOffset.toDouble() / snapInterval
|
|
1250
|
+
smallerOffset =
|
|
1251
|
+
max(
|
|
1252
|
+
getItemStartOffset(
|
|
1253
|
+
snapToAlignment,
|
|
1254
|
+
(floor(ratio) * snapInterval).toInt(),
|
|
1255
|
+
snapInterval,
|
|
1256
|
+
viewportWidth,
|
|
1257
|
+
),
|
|
1258
|
+
0,
|
|
1259
|
+
)
|
|
1260
|
+
largerOffset =
|
|
1261
|
+
kotlin.math.min(
|
|
1262
|
+
getItemStartOffset(
|
|
1263
|
+
snapToAlignment,
|
|
1264
|
+
(ceil(ratio) * snapInterval).toInt(),
|
|
1265
|
+
snapInterval,
|
|
1266
|
+
viewportWidth,
|
|
1267
|
+
),
|
|
1268
|
+
maximumOffset,
|
|
1269
|
+
)
|
|
1270
|
+
} else {
|
|
1271
|
+
val cv = getContentView() as? ViewGroup ?: return
|
|
1272
|
+
var smallerChildOffset = largerOffset
|
|
1273
|
+
var largerChildOffset = smallerOffset
|
|
1274
|
+
for (i in 0 until cv.childCount) {
|
|
1275
|
+
val item = cv.getChildAt(i)
|
|
1276
|
+
val itemStartOffset =
|
|
1277
|
+
getItemStartOffset(snapToAlignment, item.left, item.width, viewportWidth)
|
|
1278
|
+
if (itemStartOffset <= targetOffset) {
|
|
1279
|
+
if (targetOffset - itemStartOffset < targetOffset - smallerOffset) {
|
|
1280
|
+
smallerOffset = itemStartOffset
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
if (itemStartOffset >= targetOffset) {
|
|
1284
|
+
if (itemStartOffset - targetOffset < largerOffset - targetOffset) {
|
|
1285
|
+
largerOffset = itemStartOffset
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
smallerChildOffset = kotlin.math.min(smallerChildOffset, itemStartOffset)
|
|
1289
|
+
largerChildOffset = max(largerChildOffset, itemStartOffset)
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1292
|
+
// For Recycler ViewGroup, the maximumOffset can be much larger than the total heights of
|
|
1293
|
+
// items in the layout. In this case snapping is not possible beyond the currently rendered
|
|
1294
|
+
// children.
|
|
1295
|
+
smallerOffset = max(smallerOffset, smallerChildOffset)
|
|
1296
|
+
largerOffset = kotlin.math.min(largerOffset, largerChildOffset)
|
|
1297
|
+
}
|
|
1298
|
+
} else {
|
|
1299
|
+
val interval = getSnapInterval().toDouble()
|
|
1300
|
+
val ratio = targetOffset.toDouble() / interval
|
|
1301
|
+
smallerOffset = (floor(ratio) * interval).toInt()
|
|
1302
|
+
largerOffset = kotlin.math.min((ceil(ratio) * interval).toInt(), maximumOffset)
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
// Calculate the nearest offset
|
|
1306
|
+
val nearestOffset =
|
|
1307
|
+
if (abs(targetOffset - smallerOffset) < abs(largerOffset - targetOffset)) smallerOffset
|
|
1308
|
+
else largerOffset
|
|
1309
|
+
|
|
1310
|
+
// if scrolling after the last snap offset and snapping to the
|
|
1311
|
+
// end of the list is disabled, then we allow free scrolling
|
|
1312
|
+
var currentOffset = scrollX
|
|
1313
|
+
if (layoutDirection == LAYOUT_DIRECTION_RTL) {
|
|
1314
|
+
currentOffset = maximumOffset - currentOffset
|
|
1315
|
+
}
|
|
1316
|
+
if (!snapToEnd && targetOffset >= lastOffset) {
|
|
1317
|
+
if (currentOffset >= lastOffset) {
|
|
1318
|
+
// free scrolling
|
|
1319
|
+
} else {
|
|
1320
|
+
// snap to end
|
|
1321
|
+
targetOffset = lastOffset
|
|
1322
|
+
}
|
|
1323
|
+
} else if (!snapToStart && targetOffset <= firstOffset) {
|
|
1324
|
+
if (currentOffset <= firstOffset) {
|
|
1325
|
+
// free scrolling
|
|
1326
|
+
} else {
|
|
1327
|
+
// snap to beginning
|
|
1328
|
+
targetOffset = firstOffset
|
|
1329
|
+
}
|
|
1330
|
+
} else if (velocityX > 0) {
|
|
1331
|
+
if (!hasCustomizedFlingAnimator) {
|
|
1332
|
+
// The default animator requires boost on initial velocity as when snapping velocity can
|
|
1333
|
+
// feel sluggish for slow swipes
|
|
1334
|
+
velocityX += ((largerOffset - targetOffset) * 10.0).toInt()
|
|
1335
|
+
}
|
|
1336
|
+
targetOffset = largerOffset
|
|
1337
|
+
} else if (velocityX < 0) {
|
|
1338
|
+
if (!hasCustomizedFlingAnimator) {
|
|
1339
|
+
// The default animator requires boost on initial velocity as when snapping velocity can
|
|
1340
|
+
// feel sluggish for slow swipes
|
|
1341
|
+
velocityX -= ((targetOffset - smallerOffset) * 10.0).toInt()
|
|
1342
|
+
}
|
|
1343
|
+
targetOffset = smallerOffset
|
|
1344
|
+
} else {
|
|
1345
|
+
targetOffset = nearestOffset
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
// Make sure the new offset isn't out of bounds
|
|
1349
|
+
targetOffset = kotlin.math.min(max(0, targetOffset), maximumOffset)
|
|
1350
|
+
|
|
1351
|
+
if (layoutDirection == LAYOUT_DIRECTION_RTL) {
|
|
1352
|
+
targetOffset = maximumOffset - targetOffset
|
|
1353
|
+
velocityX = -velocityX
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
if (hasCustomizedFlingAnimator || scroller == null) {
|
|
1357
|
+
reactSmoothScrollTo(targetOffset, scrollY)
|
|
1358
|
+
} else {
|
|
1359
|
+
// smoothScrollTo will always scroll over 250ms which is often *waaay*
|
|
1360
|
+
// too short and will cause the scrolling to feel almost instant
|
|
1361
|
+
// try to manually interact with OverScroller instead
|
|
1362
|
+
// if velocity is 0 however, fling() won't work, so we want to use smoothScrollTo
|
|
1363
|
+
activelyScrolling = true
|
|
1364
|
+
|
|
1365
|
+
scroller.fling(
|
|
1366
|
+
scrollX, // startX
|
|
1367
|
+
scrollY, // startY
|
|
1368
|
+
// velocity = 0 doesn't work with fling() so we pretend there's a reasonable
|
|
1369
|
+
// initial velocity going on when a touch is released without any movement
|
|
1370
|
+
if (velocityX != 0) velocityX else targetOffset - scrollX, // velocityX
|
|
1371
|
+
0, // velocityY
|
|
1372
|
+
// setting both minX and maxX to the same value will guarantee that we scroll to it
|
|
1373
|
+
// but using the standard fling-style easing rather than smoothScrollTo's 250ms animation
|
|
1374
|
+
targetOffset, // minX
|
|
1375
|
+
targetOffset, // maxX
|
|
1376
|
+
0, // minY
|
|
1377
|
+
0, // maxY
|
|
1378
|
+
// we only want to allow overscrolling if the final offset is at the very edge of the view
|
|
1379
|
+
if (targetOffset == 0 || targetOffset == maximumOffset) viewportWidth / 2 else 0, // overX
|
|
1380
|
+
0, // overY
|
|
1381
|
+
)
|
|
1382
|
+
|
|
1383
|
+
postInvalidateOnAnimation()
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
private fun getItemStartOffset(
|
|
1388
|
+
snapToAlignment: Int,
|
|
1389
|
+
itemStartPosition: Int,
|
|
1390
|
+
itemWidth: Int,
|
|
1391
|
+
viewPortWidth: Int,
|
|
1392
|
+
): Int =
|
|
1393
|
+
when (snapToAlignment) {
|
|
1394
|
+
SNAP_ALIGNMENT_CENTER -> itemStartPosition - (viewPortWidth - itemWidth) / 2
|
|
1395
|
+
SNAP_ALIGNMENT_START -> itemStartPosition
|
|
1396
|
+
SNAP_ALIGNMENT_END -> itemStartPosition - (viewPortWidth - itemWidth)
|
|
1397
|
+
else ->
|
|
1398
|
+
throw IllegalStateException("Invalid SnapToAlignment value: ${this.snapToAlignment}")
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
private fun smoothScrollToNextPage(direction: Int) {
|
|
1402
|
+
if (DEBUG_MODE) {
|
|
1403
|
+
FLog.i(TAG, "smoothScrollToNextPage[%d] direction %d", id, direction)
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
val w = width
|
|
1407
|
+
val currentX = scrollX
|
|
1408
|
+
|
|
1409
|
+
var page = currentX / w
|
|
1410
|
+
if (currentX % w != 0) {
|
|
1411
|
+
page++
|
|
1412
|
+
}
|
|
1413
|
+
|
|
1414
|
+
if (direction == View.FOCUS_LEFT) {
|
|
1415
|
+
page -= 1
|
|
1416
|
+
} else {
|
|
1417
|
+
page += 1
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
if (page < 0) {
|
|
1421
|
+
page = 0
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
reactSmoothScrollTo(page * w, scrollY)
|
|
1425
|
+
handlePostTouchScrolling(0, 0)
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
override fun setBackgroundColor(color: Int) {
|
|
1429
|
+
BackgroundStyleApplicator.setBackgroundColor(this, color)
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
public open fun setBorderWidth(position: Int, width: Float) {
|
|
1433
|
+
BackgroundStyleApplicator.setBorderWidth(
|
|
1434
|
+
this,
|
|
1435
|
+
LogicalEdge.entries[position],
|
|
1436
|
+
PixelUtil.toDIPFromPixel(width),
|
|
1437
|
+
)
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
public open fun setBorderColor(position: Int, color: Int?) {
|
|
1441
|
+
BackgroundStyleApplicator.setBorderColor(this, LogicalEdge.entries[position], color)
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
public open fun setBorderRadius(borderRadius: Float) {
|
|
1445
|
+
setBorderRadius(borderRadius, BorderRadiusProp.BORDER_RADIUS.ordinal)
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
public open fun setBorderRadius(borderRadius: Float, position: Int) {
|
|
1449
|
+
val radius =
|
|
1450
|
+
if (borderRadius.isNaN()) null
|
|
1451
|
+
else LengthPercentage(PixelUtil.toDIPFromPixel(borderRadius), LengthPercentageType.POINT)
|
|
1452
|
+
BackgroundStyleApplicator.setBorderRadius(this, BorderRadiusProp.entries[position], radius)
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1455
|
+
public open fun setBorderStyle(style: String?) {
|
|
1456
|
+
BackgroundStyleApplicator.setBorderStyle(
|
|
1457
|
+
this,
|
|
1458
|
+
if (style == null) null else BorderStyle.fromString(style),
|
|
1459
|
+
)
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
/**
|
|
1463
|
+
* Calls `smoothScrollTo` and updates state.
|
|
1464
|
+
*
|
|
1465
|
+
* `smoothScrollTo` changes `contentOffset` and we need to keep `contentOffset` in sync between
|
|
1466
|
+
* scroll view and state. Calling raw `smoothScrollTo` doesn't update state.
|
|
1467
|
+
*/
|
|
1468
|
+
override fun reactSmoothScrollTo(x: Int, y: Int) {
|
|
1469
|
+
ReactScrollViewHelper.smoothScrollTo(this, x, y)
|
|
1470
|
+
setPendingContentOffsets(x, y)
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
/**
|
|
1474
|
+
* Calls `super.scrollTo` and updates state.
|
|
1475
|
+
*
|
|
1476
|
+
* `super.scrollTo` changes `contentOffset` and we need to keep `contentOffset` in sync between
|
|
1477
|
+
* scroll view and state.
|
|
1478
|
+
*
|
|
1479
|
+
* Note that while we can override scrollTo, we *cannot* override `smoothScrollTo` because it is
|
|
1480
|
+
* final. See `reactSmoothScrollTo`.
|
|
1481
|
+
*/
|
|
1482
|
+
override fun scrollTo(x: Int, y: Int) {
|
|
1483
|
+
if (DEBUG_MODE) {
|
|
1484
|
+
FLog.i(TAG, "scrollTo[%d] x %d y %d", id, x, y)
|
|
1485
|
+
}
|
|
1486
|
+
|
|
1487
|
+
super.scrollTo(x, y)
|
|
1488
|
+
ReactScrollViewHelper.updateFabricScrollState(this)
|
|
1489
|
+
setPendingContentOffsets(x, y)
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
/** Scrolls to a new position preserving any momentum scrolling animation. */
|
|
1493
|
+
override fun scrollToPreservingMomentum(x: Int, y: Int) {
|
|
1494
|
+
scrollTo(x, y)
|
|
1495
|
+
recreateFlingAnimation(x, Int.MAX_VALUE)
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
protected open fun restoreScrollTo(x: Int, y: Int) {
|
|
1499
|
+
scrollTo(x, y)
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
private fun isContentReady(): Boolean {
|
|
1503
|
+
val child = getContentView()
|
|
1504
|
+
return child != null && child.width != 0 && child.height != 0
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
private fun setPendingContentOffsets(x: Int, y: Int) {
|
|
1508
|
+
if (DEBUG_MODE) {
|
|
1509
|
+
FLog.i(TAG, "setPendingContentOffsets[%d] x %d y %d", id, x, y)
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
if (isContentReady()) {
|
|
1513
|
+
pendingContentOffsetX = UNSET_CONTENT_OFFSET
|
|
1514
|
+
pendingContentOffsetY = UNSET_CONTENT_OFFSET
|
|
1515
|
+
} else {
|
|
1516
|
+
pendingContentOffsetX = x
|
|
1517
|
+
pendingContentOffsetY = y
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
override fun onLayoutChange(
|
|
1522
|
+
v: View,
|
|
1523
|
+
left: Int,
|
|
1524
|
+
top: Int,
|
|
1525
|
+
right: Int,
|
|
1526
|
+
bottom: Int,
|
|
1527
|
+
oldLeft: Int,
|
|
1528
|
+
oldTop: Int,
|
|
1529
|
+
oldRight: Int,
|
|
1530
|
+
oldBottom: Int,
|
|
1531
|
+
) {
|
|
1532
|
+
if (contentView == null) return
|
|
1533
|
+
|
|
1534
|
+
// Adjust the scroll position to follow new content. In RTL, this means we keep a constant
|
|
1535
|
+
// offset from the right edge instead of the left edge, so content added to the end of the flow
|
|
1536
|
+
// does not shift layout. If `maintainVisibleContentPosition` is enabled, we try to adjust
|
|
1537
|
+
// position so that the viewport keeps the same insets to previously visible views. TODO: MVCP
|
|
1538
|
+
// does not work in RTL.
|
|
1539
|
+
if (v.layoutDirection == LAYOUT_DIRECTION_RTL) {
|
|
1540
|
+
adjustPositionForContentChangeRTL(left, right, oldLeft, oldRight)
|
|
1541
|
+
}
|
|
1542
|
+
ReactScrollViewHelper.emitLayoutChangeEvent(this)
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
/**
|
|
1546
|
+
* If we are in the middle of a fling animation from the user removing their finger (OverScroller
|
|
1547
|
+
* is in `FLING_MODE`), recreate the existing fling animation since it was calculated against
|
|
1548
|
+
* outdated scroll offsets.
|
|
1549
|
+
*/
|
|
1550
|
+
private fun recreateFlingAnimation(scrollX: Int, maxX: Int) {
|
|
1551
|
+
// If we have any pending custom flings (e.g. from animated `scrollTo`, or flinging to a snap
|
|
1552
|
+
// point), cancel them.
|
|
1553
|
+
// TODO: Can we be more graceful (like OverScroller flings)?
|
|
1554
|
+
if (getFlingAnimator().isRunning) {
|
|
1555
|
+
getFlingAnimator().cancel()
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
if (scroller != null && !scroller.isFinished) {
|
|
1559
|
+
// Calculate the velocity and position of the fling animation at the time of this layout
|
|
1560
|
+
// event, which may be later than the last ScrollView tick. These values are not committed to
|
|
1561
|
+
// the underlying ScrollView, which will recalculate positions on its next tick.
|
|
1562
|
+
val scrollerXBeforeTick = scroller.currX
|
|
1563
|
+
val hasMoreTicks = scroller.computeScrollOffset()
|
|
1564
|
+
|
|
1565
|
+
// Stop the existing animation at the current state of the scroller. We will then recreate
|
|
1566
|
+
// it starting at the adjusted x offset.
|
|
1567
|
+
scroller.forceFinished(true)
|
|
1568
|
+
|
|
1569
|
+
if (hasMoreTicks) {
|
|
1570
|
+
// OverScroller.getCurrVelocity() returns an absolute value of the velocity a current fling
|
|
1571
|
+
// animation (only FLING_MODE animations). We derive direction along the X axis from the
|
|
1572
|
+
// start and end of the animation, assuming HorizontalScrollView never fires vertical fling
|
|
1573
|
+
// animations.
|
|
1574
|
+
// TODO: This does not fully handle overscroll.
|
|
1575
|
+
val direction = (scroller.finalX - scroller.startX).toFloat().sign
|
|
1576
|
+
val flingVelocityX = scroller.currVelocity * direction
|
|
1577
|
+
|
|
1578
|
+
scroller.fling(scrollX, scrollY, flingVelocityX.toInt(), 0, 0, maxX, 0, 0)
|
|
1579
|
+
} else {
|
|
1580
|
+
scrollTo(scrollX + (scroller.currX - scrollerXBeforeTick), scrollY)
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
|
|
1585
|
+
private fun adjustPositionForContentChangeRTL(
|
|
1586
|
+
left: Int,
|
|
1587
|
+
right: Int,
|
|
1588
|
+
oldLeft: Int,
|
|
1589
|
+
oldRight: Int,
|
|
1590
|
+
) {
|
|
1591
|
+
// If we have any pending custom flings (e.g. from animated `scrollTo`, or flinging to a snap
|
|
1592
|
+
// point), finish them, committing the final `scrollX`.
|
|
1593
|
+
// TODO: Can we be more graceful (like OverScroller flings)?
|
|
1594
|
+
if (getFlingAnimator().isRunning) {
|
|
1595
|
+
getFlingAnimator().end()
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
val distanceToRightEdge = oldRight - scrollX
|
|
1599
|
+
val newWidth = right - left
|
|
1600
|
+
val newScrollX = newWidth - distanceToRightEdge
|
|
1601
|
+
scrollTo(newScrollX, scrollY)
|
|
1602
|
+
|
|
1603
|
+
recreateFlingAnimation(newScrollX, newWidth - width)
|
|
1604
|
+
}
|
|
1605
|
+
|
|
1606
|
+
override fun startFlingAnimator(start: Int, end: Int) {
|
|
1607
|
+
// Always cancel existing animator before starting the new one. `smoothScrollTo` contains some
|
|
1608
|
+
// logic that, if called multiple times in a short amount of time, will treat all calls as part
|
|
1609
|
+
// of the same animation and will not lengthen the duration of the animation. This means that,
|
|
1610
|
+
// for example, if the user is scrolling rapidly, multiple pages could be considered part of one
|
|
1611
|
+
// animation, causing some page animations to be animated very rapidly - looking like they're
|
|
1612
|
+
// not animated at all.
|
|
1613
|
+
defaultFlingAnimator.cancel()
|
|
1614
|
+
|
|
1615
|
+
// Update the fling animator with new values
|
|
1616
|
+
val duration = ReactScrollViewHelper.getDefaultScrollAnimationDuration(context)
|
|
1617
|
+
defaultFlingAnimator.setDuration(duration.toLong()).setIntValues(start, end)
|
|
1618
|
+
|
|
1619
|
+
// Start the animator
|
|
1620
|
+
defaultFlingAnimator.start()
|
|
1621
|
+
|
|
1622
|
+
if (sendMomentumEvents) {
|
|
1623
|
+
val xVelocity = if (duration > 0) (end - start) / duration else 0
|
|
1624
|
+
ReactScrollViewHelper.emitScrollMomentumBeginEvent(this, xVelocity, 0)
|
|
1625
|
+
ReactScrollViewHelper.dispatchMomentumEndOnAnimationEnd(this)
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1629
|
+
override fun getFlingAnimator(): ValueAnimator = defaultFlingAnimator
|
|
1630
|
+
|
|
1631
|
+
override fun getFlingExtrapolatedDistance(velocity: Int): Int =
|
|
1632
|
+
ReactScrollViewHelper.predictFinalScrollPosition(
|
|
1633
|
+
this,
|
|
1634
|
+
velocity,
|
|
1635
|
+
0,
|
|
1636
|
+
max(0, computeHorizontalScrollRange() - width),
|
|
1637
|
+
0,
|
|
1638
|
+
)
|
|
1639
|
+
.x
|
|
1640
|
+
}
|