react-native 0.0.0-201c10733 → 0.0.0-268efb102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1486) hide show
  1. package/Libraries/ActionSheetIOS/ActionSheetIOS.js +14 -3
  2. package/Libraries/ActionSheetIOS/NativeActionSheetManager.js +2 -2
  3. package/Libraries/ActionSheetIOS/React-RCTActionSheet.podspec +1 -1
  4. package/Libraries/Alert/Alert.js +3 -5
  5. package/Libraries/Alert/NativeAlertManager.js +0 -2
  6. package/Libraries/Alert/RCTAlertManager.android.js +0 -2
  7. package/Libraries/Alert/RCTAlertManager.ios.js +0 -2
  8. package/Libraries/Animated/Animated.js +0 -2
  9. package/Libraries/Animated/AnimatedEvent.js +26 -7
  10. package/Libraries/Animated/AnimatedImplementation.js +0 -2
  11. package/Libraries/Animated/AnimatedMock.js +1 -8
  12. package/Libraries/Animated/AnimatedWeb.js +6 -3
  13. package/Libraries/Animated/NativeAnimatedHelper.js +10 -7
  14. package/Libraries/Animated/NativeAnimatedModule.js +0 -2
  15. package/Libraries/Animated/NativeAnimatedTurboModule.js +0 -2
  16. package/Libraries/Animated/animations/Animation.js +1 -0
  17. package/Libraries/Animated/animations/DecayAnimation.js +2 -0
  18. package/Libraries/Animated/animations/SpringAnimation.js +1 -0
  19. package/Libraries/Animated/animations/TimingAnimation.js +3 -0
  20. package/Libraries/Animated/components/AnimatedFlatList.js +0 -2
  21. package/Libraries/Animated/components/AnimatedImage.js +0 -2
  22. package/Libraries/Animated/components/AnimatedScrollView.js +0 -2
  23. package/Libraries/Animated/components/AnimatedSectionList.js +1 -3
  24. package/Libraries/Animated/components/AnimatedText.js +0 -2
  25. package/Libraries/Animated/components/AnimatedView.js +0 -2
  26. package/Libraries/Animated/createAnimatedComponent.js +25 -19
  27. package/Libraries/Animated/createAnimatedComponentInjection.js +48 -0
  28. package/Libraries/Animated/createAnimatedComponent_EXPERIMENTAL.js +48 -0
  29. package/Libraries/Animated/nodes/AnimatedInterpolation.js +21 -22
  30. package/Libraries/Animated/nodes/AnimatedProps.js +0 -1
  31. package/Libraries/Animated/nodes/AnimatedValue.js +24 -5
  32. package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -0
  33. package/Libraries/Animated/useAnimatedProps.js +211 -0
  34. package/Libraries/AppState/AppState.js +90 -164
  35. package/Libraries/AppState/NativeAppState.js +0 -2
  36. package/Libraries/BatchedBridge/MessageQueue.js +19 -14
  37. package/Libraries/BatchedBridge/NativeModules.js +5 -1
  38. package/Libraries/Blob/BlobManager.js +0 -2
  39. package/Libraries/Blob/FileReader.js +1 -3
  40. package/Libraries/Blob/NativeBlobModule.js +0 -2
  41. package/Libraries/Blob/NativeFileReaderModule.js +0 -2
  42. package/Libraries/Blob/RCTBlobManager.h +2 -1
  43. package/Libraries/Blob/RCTBlobManager.mm +1 -3
  44. package/Libraries/Blob/RCTBlobPlugins.mm +4 -3
  45. package/Libraries/Blob/React-RCTBlob.podspec +3 -3
  46. package/Libraries/Blob/URL.js +18 -20
  47. package/Libraries/BugReporting/BugReporting.js +2 -2
  48. package/Libraries/BugReporting/getReactData.js +2 -2
  49. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +350 -0
  50. package/Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js +4 -2
  51. package/Libraries/Components/AccessibilityInfo/NativeAccessibilityManager.js +0 -2
  52. package/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.android.js +35 -0
  53. package/Libraries/Components/AccessibilityInfo/legacySendAccessibilityEvent.ios.js +26 -0
  54. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +6 -8
  55. package/Libraries/Components/ActivityIndicator/ActivityIndicatorViewNativeComponent.js +0 -2
  56. package/Libraries/Components/Button.js +45 -15
  57. package/Libraries/Components/Clipboard/Clipboard.js +0 -2
  58. package/Libraries/Components/Clipboard/NativeClipboard.js +0 -2
  59. package/Libraries/Components/DatePicker/DatePickerIOS.android.js +4 -5
  60. package/Libraries/Components/DatePicker/DatePickerIOS.ios.js +50 -14
  61. package/Libraries/Components/DatePicker/RCTDatePickerNativeComponent.js +1 -2
  62. package/Libraries/Components/DatePickerAndroid/NativeDatePickerAndroid.js +0 -2
  63. package/Libraries/Components/DrawerAndroid/AndroidDrawerLayoutNativeComponent.js +0 -2
  64. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +4 -9
  65. package/Libraries/Components/Keyboard/Keyboard.js +16 -17
  66. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +17 -22
  67. package/Libraries/Components/Keyboard/NativeKeyboardObserver.js +0 -2
  68. package/Libraries/Components/MaskedView/MaskedViewIOS.ios.js +3 -3
  69. package/Libraries/Components/Pressable/Pressable.js +20 -7
  70. package/Libraries/Components/Pressable/useAndroidRippleForView.js +18 -17
  71. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js +0 -2
  72. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroidNativeComponent.js +0 -2
  73. package/Libraries/Components/ProgressViewIOS/ProgressViewIOS.android.js +4 -5
  74. package/Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js +2 -5
  75. package/Libraries/Components/ProgressViewIOS/RCTProgressViewNativeComponent.js +0 -2
  76. package/Libraries/Components/RefreshControl/AndroidSwipeRefreshLayoutNativeComponent.js +0 -2
  77. package/Libraries/Components/RefreshControl/PullToRefreshViewNativeComponent.js +9 -3
  78. package/Libraries/Components/RefreshControl/RefreshControl.js +5 -7
  79. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +2 -3
  80. package/Libraries/Components/SafeAreaView/RCTSafeAreaViewNativeComponent.js +0 -2
  81. package/Libraries/Components/SafeAreaView/SafeAreaView.js +1 -1
  82. package/Libraries/Components/ScrollView/AndroidHorizontalScrollContentViewNativeComponent.js +11 -15
  83. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +2 -4
  84. package/Libraries/Components/ScrollView/ScrollContentViewNativeComponent.js +2 -4
  85. package/Libraries/Components/ScrollView/ScrollView.js +754 -170
  86. package/Libraries/Components/ScrollView/ScrollViewContext.js +0 -2
  87. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +3 -4
  88. package/Libraries/Components/ScrollView/ScrollViewNativeComponentType.js +2 -0
  89. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +31 -10
  90. package/Libraries/Components/ScrollView/ScrollViewViewConfig.js +2 -0
  91. package/Libraries/Components/ScrollView/processDecelerationRate.js +0 -2
  92. package/Libraries/Components/SegmentedControlIOS/RCTSegmentedControlNativeComponent.js +0 -2
  93. package/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.android.js +4 -5
  94. package/Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js +17 -11
  95. package/Libraries/Components/Slider/Slider.js +19 -8
  96. package/Libraries/Components/Slider/SliderNativeComponent.js +0 -2
  97. package/Libraries/Components/Sound/NativeSoundManager.js +0 -2
  98. package/Libraries/Components/Sound/SoundManager.js +0 -1
  99. package/Libraries/Components/StatusBar/NativeStatusBarManagerAndroid.js +0 -2
  100. package/Libraries/Components/StatusBar/NativeStatusBarManagerIOS.js +0 -2
  101. package/Libraries/Components/StatusBar/StatusBar.js +10 -21
  102. package/Libraries/Components/Switch/AndroidSwitchNativeComponent.js +0 -2
  103. package/Libraries/Components/Switch/Switch.js +98 -118
  104. package/Libraries/Components/Switch/SwitchNativeComponent.js +0 -2
  105. package/Libraries/Components/TextInput/AndroidTextInputNativeComponent.js +9 -8
  106. package/Libraries/Components/TextInput/AndroidTextInputViewConfig.js +2 -3
  107. package/Libraries/Components/TextInput/InputAccessoryView.js +6 -8
  108. package/Libraries/Components/TextInput/RCTInputAccessoryViewNativeComponent.js +0 -2
  109. package/Libraries/Components/TextInput/RCTMultilineTextInputNativeComponent.js +6 -5
  110. package/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +6 -16
  111. package/Libraries/Components/TextInput/{RCTSinglelineTextInputViewConfig.js → RCTTextInputViewConfig.js} +3 -5
  112. package/Libraries/Components/TextInput/TextInput.js +128 -69
  113. package/Libraries/Components/TextInput/TextInputNativeCommands.js +0 -2
  114. package/Libraries/Components/TextInput/TextInputState.js +1 -3
  115. package/Libraries/Components/ToastAndroid/NativeToastAndroid.js +0 -2
  116. package/Libraries/Components/ToastAndroid/ToastAndroid.android.js +0 -1
  117. package/Libraries/Components/Touchable/BoundingDimensions.js +1 -2
  118. package/Libraries/Components/Touchable/PooledClass.js +1 -2
  119. package/Libraries/Components/Touchable/Position.js +1 -2
  120. package/Libraries/Components/Touchable/Touchable.js +26 -55
  121. package/Libraries/Components/Touchable/TouchableBounce.js +0 -2
  122. package/Libraries/Components/Touchable/TouchableHighlight.js +22 -6
  123. package/Libraries/Components/Touchable/TouchableNativeFeedback.js +16 -5
  124. package/Libraries/Components/Touchable/TouchableOpacity.js +19 -8
  125. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +13 -4
  126. package/Libraries/Components/UnimplementedViews/UnimplementedNativeViewNativeComponent.js +0 -2
  127. package/Libraries/Components/UnimplementedViews/UnimplementedView.js +2 -3
  128. package/Libraries/Components/View/ReactNativeStyleAttributes.js +133 -68
  129. package/Libraries/Components/View/ReactNativeViewAttributes.js +1 -2
  130. package/Libraries/Components/View/ReactNativeViewViewConfig.js +1 -3
  131. package/Libraries/Components/View/View.js +2 -4
  132. package/Libraries/Components/View/ViewAccessibility.js +3 -0
  133. package/Libraries/Components/View/ViewNativeComponent.js +0 -2
  134. package/Libraries/Core/Devtools/getDevServer.js +0 -2
  135. package/Libraries/Core/Devtools/parseErrorStack.js +0 -9
  136. package/Libraries/Core/Devtools/parseHermesStack.js +1 -1
  137. package/Libraries/Core/ExceptionsManager.js +51 -41
  138. package/Libraries/Core/ExtendedError.js +19 -0
  139. package/Libraries/Core/InitializeCore.js +1 -0
  140. package/Libraries/Core/NativeExceptionsManager.js +0 -2
  141. package/Libraries/Core/ReactFiberErrorDialog.js +44 -34
  142. package/Libraries/Core/ReactNativeVersion.js +1 -1
  143. package/Libraries/Core/ReactNativeVersionCheck.js +0 -2
  144. package/Libraries/Core/SegmentFetcher/NativeSegmentFetcher.js +0 -2
  145. package/Libraries/Core/Timers/JSTimers.js +41 -31
  146. package/Libraries/Core/Timers/NativeTiming.js +0 -2
  147. package/Libraries/Core/Timers/immediateShim.js +67 -0
  148. package/Libraries/Core/Timers/queueMicrotask.js +41 -0
  149. package/Libraries/Core/polyfillPromise.js +1 -1
  150. package/Libraries/Core/setUpBatchedBridge.js +1 -1
  151. package/Libraries/Core/setUpDeveloperTools.js +53 -58
  152. package/Libraries/Core/setUpGlobals.js +2 -0
  153. package/Libraries/Core/setUpReactDevTools.js +18 -1
  154. package/Libraries/Core/setUpRegeneratorRuntime.js +25 -8
  155. package/Libraries/Core/setUpTimers.js +65 -6
  156. package/Libraries/Core/setUpXHR.js +4 -4
  157. package/Libraries/DeprecatedPropTypes/DeprecatedImagePropType.android.js +131 -0
  158. package/Libraries/DeprecatedPropTypes/{DeprecatedImagePropType.js → DeprecatedImagePropType.ios.js} +0 -0
  159. package/Libraries/DeprecatedPropTypes/DeprecatedTextInputPropTypes.js +5 -5
  160. package/Libraries/DeprecatedPropTypes/DeprecatedViewAccessibility.js +2 -0
  161. package/Libraries/EventEmitter/NativeEventEmitter.js +100 -51
  162. package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +9 -77
  163. package/Libraries/EventEmitter/RCTEventEmitter.js +5 -1
  164. package/Libraries/EventEmitter/RCTNativeAppEventEmitter.js +0 -2
  165. package/Libraries/EventEmitter/__mocks__/NativeEventEmitter.js +31 -10
  166. package/Libraries/FBLazyVector/BUCK +5 -1
  167. package/Libraries/FBLazyVector/FBLazyVector.podspec +1 -1
  168. package/Libraries/HeapCapture/HeapCapture.js +0 -2
  169. package/Libraries/HeapCapture/NativeJSCHeapCapture.js +0 -2
  170. package/Libraries/Image/AssetUtils.js +0 -2
  171. package/Libraries/Image/Image.android.js +22 -133
  172. package/Libraries/Image/Image.ios.js +39 -33
  173. package/Libraries/Image/ImageAnalyticsTagContext.js +0 -2
  174. package/Libraries/Image/ImageBackground.js +10 -8
  175. package/Libraries/Image/ImageInjection.js +28 -0
  176. package/Libraries/Image/ImagePickerIOS.js +0 -2
  177. package/Libraries/Image/ImageProps.js +28 -0
  178. package/Libraries/Image/ImageSource.js +57 -14
  179. package/Libraries/Image/ImageViewNativeComponent.js +0 -2
  180. package/Libraries/Image/NativeImageEditor.js +0 -2
  181. package/Libraries/Image/NativeImageLoaderAndroid.js +0 -2
  182. package/Libraries/Image/NativeImageLoaderIOS.js +2 -3
  183. package/Libraries/Image/NativeImagePickerIOS.js +0 -2
  184. package/Libraries/Image/NativeImageStoreAndroid.js +0 -2
  185. package/Libraries/Image/NativeImageStoreIOS.js +0 -2
  186. package/Libraries/Image/RCTGIFImageDecoder.mm +6 -0
  187. package/Libraries/Image/RCTImageLoader.h +2 -2
  188. package/Libraries/Image/RCTImageLoader.mm +6 -18
  189. package/Libraries/Image/RCTImageLoaderWithAttributionProtocol.h +0 -5
  190. package/Libraries/Image/RCTImagePlugins.mm +4 -3
  191. package/Libraries/Image/RCTImageStoreManager.mm +5 -5
  192. package/Libraries/Image/RCTLocalAssetImageLoader.mm +5 -0
  193. package/Libraries/Image/React-RCTImage.podspec +3 -3
  194. package/Libraries/Image/TextInlineImageNativeComponent.js +84 -2
  195. package/Libraries/Image/nativeImageSource.js +0 -2
  196. package/Libraries/Inspector/ElementProperties.js +1 -1
  197. package/Libraries/Inspector/Inspector.js +13 -4
  198. package/Libraries/Inspector/InspectorPanel.js +1 -1
  199. package/Libraries/Interaction/FrameRateLogger.js +0 -2
  200. package/Libraries/Interaction/InteractionManager.js +3 -5
  201. package/Libraries/Interaction/PanResponder.js +1 -1
  202. package/Libraries/LayoutAnimation/LayoutAnimation.js +53 -17
  203. package/Libraries/Linking/Linking.js +5 -7
  204. package/Libraries/Linking/NativeIntentAndroid.js +0 -2
  205. package/Libraries/Linking/NativeLinkingManager.js +0 -2
  206. package/Libraries/LinkingIOS/RCTLinkingPlugins.mm +4 -3
  207. package/Libraries/LinkingIOS/React-RCTLinking.podspec +3 -3
  208. package/Libraries/Lists/CellRenderMask.js +145 -0
  209. package/Libraries/Lists/FillRateHelper.js +1 -1
  210. package/Libraries/Lists/FlatList.js +77 -53
  211. package/Libraries/Lists/SectionList.js +20 -23
  212. package/Libraries/Lists/SectionListModern.js +249 -0
  213. package/Libraries/Lists/ViewabilityHelper.js +9 -9
  214. package/Libraries/Lists/VirtualizeUtils.js +18 -20
  215. package/Libraries/Lists/VirtualizedList.js +176 -132
  216. package/Libraries/Lists/VirtualizedListContext.js +0 -2
  217. package/Libraries/Lists/VirtualizedSectionList.js +247 -209
  218. package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +6 -6
  219. package/Libraries/LogBox/Data/LogBoxData.js +21 -19
  220. package/Libraries/LogBox/Data/LogBoxLog.js +0 -2
  221. package/Libraries/LogBox/Data/LogBoxSymbolication.js +0 -2
  222. package/Libraries/LogBox/Data/parseLogBoxLog.js +0 -2
  223. package/Libraries/LogBox/LogBox.js +114 -49
  224. package/Libraries/LogBox/LogBoxInspectorContainer.js +0 -2
  225. package/Libraries/LogBox/LogBoxNotificationContainer.js +0 -2
  226. package/Libraries/LogBox/UI/LogBoxButton.js +0 -2
  227. package/Libraries/LogBox/UI/LogBoxImages/alert-triangle.png +0 -0
  228. package/Libraries/LogBox/UI/LogBoxImages/chevron-left.png +0 -0
  229. package/Libraries/LogBox/UI/LogBoxImages/chevron-right.png +0 -0
  230. package/Libraries/LogBox/UI/LogBoxImages/close.png +0 -0
  231. package/Libraries/LogBox/UI/LogBoxImages/loader.png +0 -0
  232. package/Libraries/LogBox/UI/LogBoxInspector.js +0 -2
  233. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +0 -2
  234. package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +0 -2
  235. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +0 -2
  236. package/Libraries/LogBox/UI/LogBoxInspectorMessageHeader.js +0 -2
  237. package/Libraries/LogBox/UI/LogBoxInspectorReactFrames.js +0 -2
  238. package/Libraries/LogBox/UI/LogBoxInspectorSection.js +0 -2
  239. package/Libraries/LogBox/UI/LogBoxInspectorSourceMapStatus.js +4 -5
  240. package/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js +0 -2
  241. package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +4 -3
  242. package/Libraries/LogBox/UI/LogBoxMessage.js +0 -2
  243. package/Libraries/LogBox/UI/LogBoxNotification.js +3 -4
  244. package/Libraries/LogBox/UI/LogBoxStyle.js +0 -2
  245. package/Libraries/Modal/Modal.js +42 -21
  246. package/Libraries/{Text/TextInjection.js → Modal/ModalInjection.js} +3 -5
  247. package/Libraries/Modal/NativeModalManager.js +0 -2
  248. package/Libraries/Modal/RCTModalHostViewNativeComponent.js +8 -4
  249. package/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m +0 -3
  250. package/Libraries/NativeAnimation/RCTAnimationPlugins.mm +4 -3
  251. package/Libraries/NativeAnimation/RCTNativeAnimatedModule.mm +6 -3
  252. package/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.h +1 -1
  253. package/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m +1 -1
  254. package/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm +32 -28
  255. package/Libraries/NativeAnimation/React-RCTAnimation.podspec +3 -3
  256. package/Libraries/NativeComponent/NativeComponentRegistry.js +34 -2
  257. package/Libraries/NativeModules/specs/NativeAnimationsDebugModule.js +0 -2
  258. package/Libraries/NativeModules/specs/NativeDevMenu.js +0 -2
  259. package/Libraries/NativeModules/specs/NativeDevSettings.js +0 -2
  260. package/Libraries/NativeModules/specs/NativeDeviceEventManager.js +0 -2
  261. package/Libraries/NativeModules/specs/NativeDialogManagerAndroid.js +0 -2
  262. package/Libraries/NativeModules/specs/NativeLogBox.js +0 -2
  263. package/Libraries/NativeModules/specs/NativeRedBox.js +0 -2
  264. package/Libraries/NativeModules/specs/NativeSourceCode.js +0 -2
  265. package/Libraries/Network/NativeNetworkingAndroid.js +0 -2
  266. package/Libraries/Network/NativeNetworkingIOS.js +0 -2
  267. package/Libraries/Network/RCTDataRequestHandler.mm +6 -0
  268. package/Libraries/Network/RCTFileRequestHandler.mm +6 -0
  269. package/Libraries/Network/RCTHTTPRequestHandler.h +5 -0
  270. package/Libraries/Network/RCTHTTPRequestHandler.mm +25 -7
  271. package/Libraries/Network/RCTNetworkPlugins.mm +4 -3
  272. package/Libraries/Network/RCTNetworking.android.js +6 -3
  273. package/Libraries/Network/RCTNetworking.h +1 -1
  274. package/Libraries/Network/RCTNetworking.ios.js +63 -21
  275. package/Libraries/Network/RCTNetworking.mm +3 -3
  276. package/Libraries/Network/React-RCTNetwork.podspec +2 -2
  277. package/Libraries/Network/XMLHttpRequest.js +5 -3
  278. package/Libraries/Network/convertRequestBody.js +2 -1
  279. package/Libraries/NewAppScreen/components/Colors.js +0 -2
  280. package/Libraries/NewAppScreen/components/Header.js +1 -1
  281. package/Libraries/NewAppScreen/components/HermesBadge.js +4 -1
  282. package/Libraries/NewAppScreen/components/LearnMoreLinks.js +0 -1
  283. package/Libraries/NewAppScreen/components/logo.png +0 -0
  284. package/Libraries/NewAppScreen/index.js +0 -2
  285. package/Libraries/Performance/NativeJSCSamplingProfiler.js +0 -2
  286. package/Libraries/Performance/QuickPerformanceLogger.js +4 -4
  287. package/Libraries/PermissionsAndroid/NativePermissionsAndroid.js +4 -3
  288. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +10 -5
  289. package/Libraries/Pressability/HoverState.js +0 -2
  290. package/Libraries/Pressability/Pressability.js +18 -13
  291. package/Libraries/Pressability/PressabilityDebug.js +9 -4
  292. package/Libraries/Pressability/PressabilityPerformanceEventEmitter.js +48 -0
  293. package/Libraries/Pressability/PressabilityTypes.js +18 -0
  294. package/Libraries/Pressability/usePressability.js +0 -2
  295. package/Libraries/PushNotificationIOS/NativePushNotificationManagerIOS.js +3 -0
  296. package/Libraries/PushNotificationIOS/PushNotificationIOS.js +18 -3
  297. package/Libraries/PushNotificationIOS/RCTPushNotificationManager.mm +13 -1
  298. package/Libraries/PushNotificationIOS/RCTPushNotificationPlugins.mm +4 -3
  299. package/Libraries/PushNotificationIOS/React-RCTPushNotification.podspec +3 -3
  300. package/Libraries/RCTRequired/BUCK +4 -1
  301. package/Libraries/RCTRequired/RCTRequired.podspec +2 -2
  302. package/Libraries/ReactNative/AppContainer.js +3 -25
  303. package/Libraries/ReactNative/AppRegistry.js +48 -7
  304. package/Libraries/ReactNative/DisplayMode.js +32 -0
  305. package/Libraries/ReactNative/DummyUIManager.js +7 -2
  306. package/Libraries/ReactNative/FabricUIManager.js +6 -5
  307. package/Libraries/ReactNative/HeadlessJsTaskError.js +0 -2
  308. package/Libraries/ReactNative/I18nManager.js +23 -9
  309. package/Libraries/ReactNative/NativeHeadlessJsTaskSupport.js +0 -2
  310. package/Libraries/ReactNative/NativeI18nManager.js +1 -2
  311. package/Libraries/ReactNative/NativeUIManager.js +2 -3
  312. package/Libraries/ReactNative/PaperUIManager.js +13 -7
  313. package/Libraries/ReactNative/RootTag.js +2 -4
  314. package/Libraries/ReactNative/UIManager.js +2 -3
  315. package/Libraries/ReactNative/UIManagerInjection.js +0 -2
  316. package/Libraries/ReactNative/getCachedComponentWithDebugName.js +32 -0
  317. package/Libraries/ReactNative/renderApplication.js +24 -6
  318. package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +6 -3
  319. package/Libraries/Reliability/UserFlow.js +7 -0
  320. package/Libraries/Renderer/REVISION +1 -1
  321. package/Libraries/Renderer/implementations/ReactFabric-dev.fb.js +9484 -7643
  322. package/Libraries/Renderer/implementations/ReactFabric-dev.js +7877 -6935
  323. package/Libraries/Renderer/implementations/ReactFabric-prod.fb.js +3038 -2506
  324. package/Libraries/Renderer/implementations/ReactFabric-prod.js +2112 -1937
  325. package/Libraries/Renderer/implementations/ReactFabric-profiling.fb.js +3375 -2693
  326. package/Libraries/Renderer/implementations/ReactFabric-profiling.js +2568 -2244
  327. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.fb.js +9638 -7942
  328. package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +5736 -4864
  329. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.fb.js +2865 -2464
  330. package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +2275 -2120
  331. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.fb.js +3190 -2643
  332. package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +2565 -2259
  333. package/Libraries/Renderer/shims/ReactFabric.js +5 -3
  334. package/Libraries/Renderer/shims/ReactFeatureFlags.js +3 -0
  335. package/Libraries/Renderer/shims/ReactNative.js +3 -0
  336. package/Libraries/Renderer/shims/ReactNativeTypes.js +21 -15
  337. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +5 -0
  338. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +3 -0
  339. package/Libraries/Settings/NativeSettingsManager.js +0 -2
  340. package/Libraries/Settings/RCTSettingsPlugins.mm +4 -3
  341. package/Libraries/Settings/React-RCTSettings.podspec +2 -2
  342. package/Libraries/Settings/Settings.ios.js +4 -2
  343. package/Libraries/Share/NativeShareModule.js +0 -2
  344. package/Libraries/Share/Share.js +0 -2
  345. package/Libraries/Storage/AsyncStorage.js +1 -2
  346. package/Libraries/Storage/NativeAsyncLocalStorage.js +0 -2
  347. package/Libraries/Storage/NativeAsyncSQLiteDBStorage.js +0 -2
  348. package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +0 -2
  349. package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +16 -3
  350. package/Libraries/StyleSheet/PlatformColorValueTypesIOS.ios.js +8 -3
  351. package/Libraries/StyleSheet/PlatformColorValueTypesIOS.js +2 -2
  352. package/Libraries/StyleSheet/Rect.js +0 -2
  353. package/Libraries/StyleSheet/StyleSheet.js +3 -5
  354. package/Libraries/StyleSheet/normalizeColor.js +2 -4
  355. package/Libraries/StyleSheet/processColorArray.js +16 -6
  356. package/Libraries/StyleSheet/processTransform.js +6 -6
  357. package/Libraries/StyleSheet/splitLayoutProps.js +0 -4
  358. package/Libraries/SurfaceHostingComponent/RCTSurfaceHostingComponent.mm +1 -1
  359. package/Libraries/Text/React-RCTText.podspec +2 -2
  360. package/Libraries/Text/Text.js +187 -235
  361. package/Libraries/Text/TextInput/Multiline/RCTUITextView.h +0 -2
  362. package/Libraries/Text/TextInput/Multiline/RCTUITextView.m +12 -2
  363. package/Libraries/Text/TextInput/RCTBaseTextInputView.m +10 -12
  364. package/Libraries/Text/TextInput/RCTInputAccessoryViewContent.m +4 -11
  365. package/Libraries/Text/TextNativeComponent.js +0 -2
  366. package/Libraries/Text/TextProps.js +7 -7
  367. package/Libraries/TurboModule/RCTExport.js +1 -1
  368. package/Libraries/TurboModule/TurboModuleRegistry.js +1 -5
  369. package/Libraries/TurboModule/samples/NativeSampleTurboModule.js +0 -2
  370. package/Libraries/TypeSafety/RCTTypeSafety.podspec +3 -3
  371. package/Libraries/Types/CoreEventTypes.js +0 -2
  372. package/Libraries/{Components/Picker/PickerAndroid.ios.js → Types/RootTagTypes.js} +2 -3
  373. package/Libraries/UTFSequence.js +1 -1
  374. package/Libraries/Utilities/Appearance.js +13 -7
  375. package/Libraries/Utilities/BackHandler.android.js +0 -2
  376. package/Libraries/Utilities/DebugEnvironment.js +0 -2
  377. package/Libraries/Utilities/DevSettings.js +48 -58
  378. package/Libraries/Utilities/DeviceInfo.js +0 -2
  379. package/Libraries/Utilities/Dimensions.js +19 -20
  380. package/Libraries/Utilities/FeatureDetection.js +31 -0
  381. package/Libraries/Utilities/GlobalPerformanceLogger.js +0 -2
  382. package/Libraries/Utilities/HMRClient.js +15 -10
  383. package/Libraries/Utilities/JSDevSupportModule.js +0 -2
  384. package/Libraries/Utilities/LoadingView.android.js +0 -2
  385. package/Libraries/Utilities/LoadingView.ios.js +0 -2
  386. package/Libraries/Utilities/MatrixMath.js +1 -1
  387. package/Libraries/Utilities/NativeAppearance.js +0 -2
  388. package/Libraries/Utilities/NativeDevLoadingView.js +0 -2
  389. package/Libraries/Utilities/NativeDevSplitBundleLoader.js +0 -2
  390. package/Libraries/Utilities/NativeDeviceInfo.js +1 -3
  391. package/Libraries/Utilities/NativeJSDevSupport.js +0 -2
  392. package/Libraries/Utilities/NativePlatformConstantsAndroid.js +0 -2
  393. package/Libraries/Utilities/NativePlatformConstantsIOS.js +0 -2
  394. package/Libraries/Utilities/PerformanceLoggerContext.js +8 -4
  395. package/Libraries/Utilities/Platform.android.js +0 -2
  396. package/Libraries/Utilities/Platform.ios.js +0 -2
  397. package/Libraries/Utilities/ReactNativeTestTools.js +12 -19
  398. package/Libraries/Utilities/codegenNativeCommands.js +1 -3
  399. package/Libraries/Utilities/codegenNativeComponent.js +0 -2
  400. package/Libraries/Utilities/createPerformanceLogger.js +0 -2
  401. package/Libraries/Utilities/deepFreezeAndThrowOnMutationInDev.js +1 -0
  402. package/Libraries/Utilities/defineLazyObjectProperty.js +1 -1
  403. package/Libraries/Utilities/deprecatedPropType.js +2 -4
  404. package/Libraries/Utilities/stringifySafe.js +1 -3
  405. package/Libraries/Utilities/useColorScheme.js +4 -4
  406. package/Libraries/Utilities/useMergeRefs.js +44 -0
  407. package/Libraries/Utilities/useRefEffect.js +45 -0
  408. package/Libraries/Utilities/useWindowDimensions.js +9 -6
  409. package/Libraries/Utilities/verifyComponentAttributeEquivalence.js +0 -2
  410. package/Libraries/Vibration/NativeVibration.js +0 -2
  411. package/Libraries/Vibration/RCTVibrationPlugins.mm +4 -3
  412. package/Libraries/Vibration/React-RCTVibration.podspec +2 -2
  413. package/Libraries/Vibration/Vibration.js +0 -2
  414. package/Libraries/WebSocket/NativeWebSocketModule.js +0 -2
  415. package/Libraries/WebSocket/WebSocket.js +12 -12
  416. package/Libraries/WebSocket/WebSocketInterceptor.js +6 -3
  417. package/Libraries/YellowBox/YellowBoxDeprecated.js +1 -0
  418. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +0 -2
  419. package/Libraries/promiseRejectionTrackingOptions.js +2 -2
  420. package/Libraries/vendor/emitter/EventEmitter.js +36 -2
  421. package/Libraries/vendor/emitter/EventSubscription.js +19 -0
  422. package/Libraries/vendor/emitter/_EmitterSubscription.js +7 -7
  423. package/Libraries/vendor/emitter/_EventEmitter.js +28 -42
  424. package/Libraries/vendor/emitter/_EventSubscription.js +4 -2
  425. package/Libraries/vendor/emitter/_EventSubscriptionVendor.js +1 -1
  426. package/Libraries/vendor/emitter/__flowtests__/EventEmitter-flowtest.js +0 -2
  427. package/README.md +5 -5
  428. package/React/Base/RCTAssert.h +29 -11
  429. package/React/Base/RCTAssert.m +52 -0
  430. package/React/Base/RCTBridge+Private.h +8 -0
  431. package/React/Base/RCTBridge.h +20 -0
  432. package/React/Base/RCTBridge.m +39 -7
  433. package/React/Base/RCTBridgeModule.h +62 -12
  434. package/React/Base/RCTBundleManager.m +78 -0
  435. package/React/Base/RCTBundleURLProvider.h +35 -9
  436. package/React/Base/RCTBundleURLProvider.mm +90 -25
  437. package/React/Base/RCTCallableJSModules.m +47 -0
  438. package/React/Base/RCTConstants.h +3 -16
  439. package/React/Base/RCTConstants.m +6 -36
  440. package/React/Base/RCTConvert.h +1 -1
  441. package/React/Base/RCTConvert.m +31 -7
  442. package/React/Base/RCTCxxConvert.h +1 -1
  443. package/React/Base/RCTDefines.h +22 -3
  444. package/React/Base/RCTEventDispatcherProtocol.h +3 -2
  445. package/React/{Views/RCTPickerManager.h → Base/RCTInitializing.h} +4 -2
  446. package/React/Base/RCTJSThread.h +29 -0
  447. package/React/Base/RCTJSThread.m +19 -0
  448. package/React/Base/RCTModuleData.h +11 -3
  449. package/React/Base/RCTModuleData.mm +66 -1
  450. package/React/Base/RCTMultipartStreamReader.m +0 -2
  451. package/React/Base/RCTRootView.h +25 -1
  452. package/React/Base/RCTRootView.m +27 -4
  453. package/React/Base/RCTTouchHandler.m +3 -0
  454. package/React/Base/RCTUtils.h +3 -0
  455. package/React/Base/RCTUtils.m +14 -7
  456. package/React/Base/RCTVersion.m +1 -1
  457. package/React/Base/Surface/RCTSurfaceStage.h +6 -11
  458. package/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.h +12 -0
  459. package/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm +46 -2
  460. package/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm +3 -0
  461. package/React/CoreModules/BUCK +4 -3
  462. package/React/CoreModules/CoreModulesPlugins.mm +4 -3
  463. package/React/CoreModules/RCTAccessibilityManager.mm +1 -1
  464. package/React/CoreModules/RCTActionSheetManager.mm +14 -5
  465. package/React/CoreModules/RCTAsyncLocalStorage.mm +4 -0
  466. package/React/CoreModules/RCTDevLoadingView.mm +25 -33
  467. package/React/CoreModules/RCTDevMenu.h +0 -5
  468. package/React/CoreModules/RCTDevMenu.mm +29 -60
  469. package/React/CoreModules/RCTDevSettings.h +12 -2
  470. package/React/CoreModules/RCTDevSettings.mm +96 -53
  471. package/React/CoreModules/RCTDevSplitBundleLoader.mm +3 -8
  472. package/React/CoreModules/RCTDeviceInfo.mm +4 -5
  473. package/React/CoreModules/RCTEventDispatcher.h +2 -1
  474. package/React/CoreModules/RCTEventDispatcher.mm +23 -25
  475. package/React/CoreModules/RCTKeyboardObserver.mm +1 -1
  476. package/React/CoreModules/RCTLogBox.mm +14 -10
  477. package/React/CoreModules/RCTPerfMonitor.mm +15 -4
  478. package/React/CoreModules/RCTRedBox.mm +3 -12
  479. package/React/CoreModules/RCTSourceCode.mm +2 -1
  480. package/React/CoreModules/RCTTiming.h +2 -1
  481. package/React/CoreModules/RCTTiming.mm +1 -3
  482. package/React/CoreModules/RCTWebSocketExecutor.mm +6 -0
  483. package/React/CoreModules/React-CoreModules.podspec +3 -3
  484. package/React/CxxBridge/RCTCxxBridge.mm +93 -33
  485. package/React/CxxModule/RCTNativeModule.mm +3 -1
  486. package/React/DevSupport/RCTPackagerConnection.h +3 -0
  487. package/React/DevSupport/RCTPackagerConnection.mm +19 -8
  488. package/{Libraries → React}/FBReactNativeSpec/FBReactNativeSpec.podspec +15 -8
  489. package/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.h +2 -1
  490. package/React/Fabric/Mounting/ComponentViews/Image/RCTImageComponentView.mm +5 -10
  491. package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropComponentView.mm +4 -2
  492. package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm +1 -3
  493. package/React/Fabric/Mounting/ComponentViews/Modal/RCTFabricModalHostViewController.mm +7 -0
  494. package/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.h +3 -1
  495. package/React/Fabric/Mounting/ComponentViews/Modal/RCTModalHostViewComponentView.mm +62 -20
  496. package/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.h +0 -1
  497. package/React/Fabric/Mounting/ComponentViews/RCTFabricComponentsPlugins.mm +0 -1
  498. package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTEnhancedScrollView.mm +5 -0
  499. package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +135 -87
  500. package/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h +23 -0
  501. package/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm +22 -0
  502. package/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm +14 -9
  503. package/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentView.mm +104 -16
  504. package/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputComponentView.mm +53 -17
  505. package/React/Fabric/Mounting/ComponentViews/TextInput/RCTTextInputUtils.mm +48 -2
  506. package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.h +6 -0
  507. package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +122 -8
  508. package/React/Fabric/Mounting/RCTComponentViewFactory.h +10 -2
  509. package/React/Fabric/Mounting/RCTComponentViewFactory.mm +83 -46
  510. package/React/Fabric/Mounting/RCTComponentViewProtocol.h +3 -0
  511. package/React/Fabric/Mounting/RCTComponentViewRegistry.mm +1 -12
  512. package/React/Fabric/Mounting/RCTMountingManager.h +22 -1
  513. package/React/Fabric/Mounting/RCTMountingManager.mm +57 -3
  514. package/React/Fabric/Mounting/UIView+ComponentViewProtocol.h +4 -0
  515. package/React/Fabric/Mounting/UIView+ComponentViewProtocol.mm +30 -4
  516. package/React/Fabric/RCTConversions.h +3 -0
  517. package/React/Fabric/RCTScheduler.h +8 -16
  518. package/React/Fabric/RCTScheduler.mm +36 -54
  519. package/React/Fabric/RCTSurfacePresenter.h +8 -16
  520. package/React/Fabric/RCTSurfacePresenter.mm +49 -170
  521. package/React/Fabric/RCTSurfacePresenterBridgeAdapter.h +4 -2
  522. package/React/Fabric/RCTSurfacePresenterBridgeAdapter.mm +1 -1
  523. package/React/Fabric/RCTSurfaceRegistry.h +1 -1
  524. package/React/Fabric/Surface/RCTFabricSurface.h +2 -6
  525. package/React/Fabric/Surface/RCTFabricSurface.mm +132 -129
  526. package/React/Modules/RCTEventEmitter.h +1 -2
  527. package/React/Modules/RCTEventEmitter.m +8 -11
  528. package/React/Modules/RCTI18nUtil.h +14 -6
  529. package/React/Modules/RCTI18nUtil.m +1 -47
  530. package/React/Modules/RCTUIManager.m +8 -2
  531. package/React/Profiler/RCTProfileTrampoline-arm.S +1 -1
  532. package/React/Profiler/RCTProfileTrampoline-arm64.S +2 -2
  533. package/React/React-RCTFabric.podspec +5 -5
  534. package/React/Tests/Text/RCTParagraphComponentViewTests.mm +63 -0
  535. package/React/Views/RCTComponentData.h +10 -1
  536. package/React/Views/RCTComponentData.m +23 -8
  537. package/React/Views/RCTDatePickerManager.m +33 -0
  538. package/React/Views/RCTFont.mm +54 -38
  539. package/React/Views/RCTModalHostView.h +5 -1
  540. package/React/Views/RCTModalHostView.m +52 -20
  541. package/React/Views/RCTModalHostViewManager.m +5 -0
  542. package/React/Views/RCTView.h +7 -7
  543. package/React/Views/RCTView.m +32 -49
  544. package/React/Views/RCTViewManager.m +22 -4
  545. package/React/Views/RCTWeakViewHolder.h +19 -0
  546. package/React/Views/RefreshControl/RCTRefreshControl.m +26 -0
  547. package/React/Views/RefreshControl/RCTRefreshControlManager.m +1 -0
  548. package/React/Views/SafeAreaView/RCTSafeAreaView.m +1 -5
  549. package/React/Views/ScrollView/RCTScrollView.h +1 -0
  550. package/React/Views/ScrollView/RCTScrollView.m +123 -36
  551. package/React/Views/ScrollView/RCTScrollViewManager.m +4 -7
  552. package/React/Views/UIView+React.m +2 -11
  553. package/React/third-party.xcconfig +1 -1
  554. package/React-Core.podspec +5 -4
  555. package/React.podspec +2 -2
  556. package/ReactAndroid/Android-prebuilt.mk +19 -3
  557. package/ReactAndroid/README.md +2 -2
  558. package/ReactAndroid/build.gradle +137 -25
  559. package/ReactAndroid/gradle.properties +7 -5
  560. package/ReactAndroid/src/androidTest/buck-runner/BUCK +1 -0
  561. package/ReactAndroid/src/androidTest/java/com/facebook/react/testing/BUCK +1 -1
  562. package/ReactAndroid/src/androidTest/java/com/facebook/react/testing/ReactAppInstrumentationTestCase.java +1 -1
  563. package/ReactAndroid/src/androidTest/java/com/facebook/react/testing/idledetection/BUCK +1 -1
  564. package/ReactAndroid/src/androidTest/java/com/facebook/react/testing/idledetection/ReactIdleDetectionUtil.java +1 -1
  565. package/ReactAndroid/src/androidTest/java/com/facebook/react/testing/rule/BUCK +5 -5
  566. package/ReactAndroid/src/androidTest/java/com/facebook/react/tests/BUCK +0 -2
  567. package/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/BUCK +5 -5
  568. package/ReactAndroid/src/androidTest/js/BUCK +26 -0
  569. package/ReactAndroid/src/androidTest/js/TestBundle.js +0 -12
  570. package/ReactAndroid/src/androidTest/js/UIManagerTestModule.js +7 -6
  571. package/ReactAndroid/src/main/java/com/facebook/hermes/instrumentation/Android.mk +2 -2
  572. package/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/Android.mk +4 -4
  573. package/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java +1 -1
  574. package/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/RuntimeConfig.java +0 -6
  575. package/ReactAndroid/src/main/java/com/facebook/proguard/annotations/BUCK +2 -2
  576. package/ReactAndroid/src/main/java/com/facebook/proguard/annotations/proguard_annotations.pro +1 -0
  577. package/ReactAndroid/src/main/java/com/facebook/react/BUCK +2 -1
  578. package/ReactAndroid/src/main/java/com/facebook/react/CoreModulesPackage.java +3 -2
  579. package/ReactAndroid/src/main/java/com/facebook/react/ReactActivity.java +1 -0
  580. package/ReactAndroid/src/main/java/com/facebook/react/ReactAndroidHWInputDeviceHelper.java +5 -0
  581. package/ReactAndroid/src/main/java/com/facebook/react/ReactFragment.java +6 -2
  582. package/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +184 -92
  583. package/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerBuilder.java +37 -1
  584. package/ReactAndroid/src/main/java/com/facebook/react/ReactNativeHost.java +21 -1
  585. package/ReactAndroid/src/main/java/com/facebook/react/{turbomodule/core/ReactPackageTurboModuleManagerDelegate.java → ReactPackageTurboModuleManagerDelegate.java} +2 -3
  586. package/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +40 -28
  587. package/ReactAndroid/src/main/java/com/facebook/react/animated/BUCK +1 -1
  588. package/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java +10 -2
  589. package/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java +5 -5
  590. package/ReactAndroid/src/main/java/com/facebook/react/bridge/BackgroundExecutor.java +3 -2
  591. package/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseJavaModule.java +7 -5
  592. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +4 -0
  593. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +11 -3
  594. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CxxModuleWrapperBase.java +4 -1
  595. package/ReactAndroid/src/main/java/com/facebook/react/bridge/JSIModuleRegistry.java +4 -0
  596. package/ReactAndroid/src/main/java/com/facebook/react/bridge/JavaModuleWrapper.java +37 -0
  597. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ModuleHolder.java +1 -1
  598. package/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModule.java +8 -1
  599. package/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java +26 -0
  600. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +46 -8
  601. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContextBaseJavaModule.java +2 -3
  602. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactCxxErrorHandler.java +39 -0
  603. package/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java +7 -3
  604. package/ReactAndroid/src/main/java/com/facebook/react/bridge/{ReactSoftException.java → ReactSoftExceptionLogger.java} +8 -3
  605. package/ReactAndroid/src/main/java/com/facebook/react/bridge/RuntimeScheduler.java +21 -0
  606. package/ReactAndroid/src/main/java/com/facebook/react/bridge/SoftAssertions.java +8 -7
  607. package/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java +10 -0
  608. package/ReactAndroid/src/main/java/com/facebook/react/common/BUCK +3 -2
  609. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/BUCK +29 -0
  610. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.java +347 -0
  611. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBufferSoLoader.java +33 -0
  612. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/jni/Android.mk +39 -0
  613. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/jni/BUCK +34 -0
  614. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/jni/react/common/mapbuffer/OnLoad.cpp +15 -0
  615. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/jni/react/common/mapbuffer/ReadableMapBuffer.cpp +76 -0
  616. package/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/jni/react/common/mapbuffer/ReadableMapBuffer.h +51 -0
  617. package/ReactAndroid/src/main/java/com/facebook/react/config/BUCK +2 -1
  618. package/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +61 -29
  619. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/BUCK +1 -1
  620. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/BridgeDevSupportManager.java +275 -0
  621. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevSupportManagerFactory.java +97 -0
  622. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevLoadingViewController.java +2 -2
  623. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevServerHelper.java +9 -58
  624. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.java +189 -352
  625. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerFactory.java +4 -73
  626. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java +13 -1
  627. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/LogBoxModule.java +1 -1
  628. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/PackagerStatusCheck.java +100 -0
  629. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/{ReactInstanceManagerDevHelper.java → ReactInstanceDevHelper.java} +3 -2
  630. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/RedBoxHandler.java +2 -16
  631. package/ReactAndroid/src/main/java/com/facebook/react/{modules/datepicker/DatePickerMode.java → devsupport/interfaces/BundleLoadCallback.java} +3 -6
  632. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java +6 -1
  633. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/ErrorType.java +23 -0
  634. package/ReactAndroid/src/main/java/com/facebook/react/fabric/BUCK +1 -1
  635. package/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java +15 -1
  636. package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricComponents.java +4 -3
  637. package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java +9 -64
  638. package/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +317 -393
  639. package/ReactAndroid/src/main/java/com/facebook/react/fabric/StateWrapperImpl.java +40 -1
  640. package/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java +50 -0
  641. package/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java +131 -0
  642. package/ReactAndroid/src/main/java/com/facebook/react/fabric/events/EventEmitterWrapper.java +36 -1
  643. package/ReactAndroid/src/main/java/com/facebook/react/fabric/events/FabricEventEmitter.java +14 -2
  644. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Android.mk +5 -3
  645. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/AsyncEventBeatV2.cpp +69 -0
  646. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/AsyncEventBeatV2.h +40 -0
  647. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK +4 -4
  648. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +308 -103
  649. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h +33 -8
  650. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/CoreComponentsRegistry.cpp +3 -6
  651. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/EventEmitterWrapper.cpp +22 -2
  652. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/EventEmitterWrapper.h +4 -0
  653. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/OnLoad.cpp +2 -0
  654. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/StateWrapperImpl.cpp +16 -2
  655. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/StateWrapperImpl.h +3 -1
  656. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp +122 -0
  657. package/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.h +68 -0
  658. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountItemDispatcher.java +414 -0
  659. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java +134 -71
  660. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/SurfaceMountingManager.java +247 -40
  661. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/IntBufferBatchMountItem.java +4 -6
  662. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/PreAllocateViewMountItem.java +13 -6
  663. package/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/SendAccessibilityEvent.java +2 -2
  664. package/ReactAndroid/src/main/java/com/facebook/react/jscexecutor/Android.mk +2 -2
  665. package/ReactAndroid/src/main/java/com/facebook/react/jstasks/HeadlessJsTaskContext.java +3 -3
  666. package/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java +21 -4
  667. package/ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/BUCK +1 -1
  668. package/ReactAndroid/src/main/java/com/facebook/react/modules/appearance/BUCK +1 -1
  669. package/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/AppStateModule.java +11 -1
  670. package/ReactAndroid/src/main/java/com/facebook/react/modules/appstate/BUCK +1 -1
  671. package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BUCK +1 -1
  672. package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/BlobProvider.java +35 -7
  673. package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/Android.mk +2 -2
  674. package/ReactAndroid/src/main/java/com/facebook/react/modules/blob/jni/BUCK +1 -1
  675. package/ReactAndroid/src/main/java/com/facebook/react/modules/bundleloader/BUCK +1 -1
  676. package/ReactAndroid/src/main/java/com/facebook/react/modules/camera/BUCK +1 -1
  677. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/BUCK +1 -1
  678. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/{JavaScriptTimerManager.java → JavaScriptTimerExecutor.java} +1 -1
  679. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/JavaTimerManager.java +7 -7
  680. package/ReactAndroid/src/main/java/com/facebook/react/modules/core/TimingModule.java +7 -4
  681. package/ReactAndroid/src/main/java/com/facebook/react/modules/debug/AnimationsDebugModule.java +1 -1
  682. package/ReactAndroid/src/main/java/com/facebook/react/modules/debug/BUCK +1 -1
  683. package/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/BUCK +1 -1
  684. package/ReactAndroid/src/main/java/com/facebook/react/modules/deviceinfo/DeviceInfoModule.java +19 -8
  685. package/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/BUCK +1 -1
  686. package/ReactAndroid/src/main/java/com/facebook/react/modules/dialog/DialogModule.java +12 -4
  687. package/ReactAndroid/src/main/java/com/facebook/react/modules/fresco/FrescoModule.java +10 -0
  688. package/ReactAndroid/src/main/java/com/facebook/react/modules/i18nmanager/BUCK +2 -1
  689. package/ReactAndroid/src/main/java/com/facebook/react/modules/i18nmanager/I18nManagerModule.java +19 -13
  690. package/ReactAndroid/src/main/java/com/facebook/react/modules/image/BUCK +1 -1
  691. package/ReactAndroid/src/main/java/com/facebook/react/modules/intent/BUCK +1 -1
  692. package/ReactAndroid/src/main/java/com/facebook/react/modules/intent/IntentModule.java +23 -19
  693. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/BUCK +1 -1
  694. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/ForwardingCookieHandler.java +1 -4
  695. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/NetworkingModule.java +1 -1
  696. package/ReactAndroid/src/main/java/com/facebook/react/modules/network/OkHttpClientProvider.java +1 -18
  697. package/ReactAndroid/src/main/java/com/facebook/react/modules/permissions/BUCK +1 -1
  698. package/ReactAndroid/src/main/java/com/facebook/react/modules/share/BUCK +1 -1
  699. package/ReactAndroid/src/main/java/com/facebook/react/modules/sound/BUCK +1 -1
  700. package/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/BUCK +1 -1
  701. package/ReactAndroid/src/main/java/com/facebook/react/modules/storage/AsyncStorageModule.java +1 -1
  702. package/ReactAndroid/src/main/java/com/facebook/react/modules/storage/BUCK +1 -1
  703. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/BUCK +2 -2
  704. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java +1 -1
  705. package/ReactAndroid/src/main/java/com/facebook/react/modules/toast/BUCK +1 -1
  706. package/ReactAndroid/src/main/java/com/facebook/react/modules/vibration/BUCK +1 -1
  707. package/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/BUCK +1 -1
  708. package/ReactAndroid/src/main/java/com/facebook/react/packagerconnection/ReconnectingWebSocket.java +11 -9
  709. package/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/Android.mk +1 -1
  710. package/ReactAndroid/src/main/java/com/facebook/react/reactperflogger/jni/BUCK +1 -1
  711. package/ReactAndroid/src/main/java/com/facebook/react/shell/BUCK +0 -2
  712. package/ReactAndroid/src/main/java/com/facebook/react/shell/MainReactPackage.java +0 -9
  713. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/BUCK +0 -1
  714. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java +9 -6
  715. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java +3 -0
  716. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/interfaces/TurboModule.java +4 -4
  717. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/Android.mk +2 -2
  718. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/BUCK +2 -2
  719. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.cpp +40 -7
  720. package/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/TurboModuleManager.h +10 -2
  721. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BUCK +3 -0
  722. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +15 -1
  723. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ComponentNameResolver.java +17 -0
  724. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ComponentNameResolverManager.java +41 -0
  725. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/DisplayMetricsHolder.java +7 -28
  726. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/FabricViewStateManager.java +2 -11
  727. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/JSTouchDispatcher.java +14 -5
  728. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java +4 -13
  729. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyOptimizer.java +10 -13
  730. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java +17 -6
  731. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/PixelUtil.java +1 -6
  732. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactAccessibilityDelegate.java +16 -10
  733. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingProhibitedView.java +26 -0
  734. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactClippingViewGroupHelper.java +5 -1
  735. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactOverflowView.java +25 -0
  736. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootViewUtil.java +18 -0
  737. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/StateWrapper.java +21 -1
  738. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.java +162 -66
  739. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +4 -8
  740. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementationProvider.java +1 -1
  741. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java +29 -20
  742. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +15 -17
  743. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java +1 -2
  744. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +13 -6
  745. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java +7 -4
  746. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java +2 -2
  747. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerResolver.java +26 -0
  748. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagersPropertyCache.java +16 -1
  749. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/ContentSizeChangeEvent.java +8 -3
  750. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java +100 -8
  751. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/LockFreeEventDispatcherImpl.java +236 -0
  752. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/RCTModernEventEmitter.java +8 -0
  753. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/ReactEventEmitter.java +21 -7
  754. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchEvent.java +58 -4
  755. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/interfaces/ViewProps.java +10 -2
  756. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/jni/Android.mk +37 -0
  757. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/jni/BUCK +41 -0
  758. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/jni/ComponentNameResolverManager.cpp +77 -0
  759. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/jni/ComponentNameResolverManager.h +54 -0
  760. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/jni/OnLoad.cpp +16 -0
  761. package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/BUCK +1 -1
  762. package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/ReactDrawerLayoutManager.java +12 -4
  763. package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/events/DrawerClosedEvent.java +9 -10
  764. package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/events/DrawerOpenedEvent.java +9 -10
  765. package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/events/DrawerSlideEvent.java +7 -13
  766. package/ReactAndroid/src/main/java/com/facebook/react/views/drawer/events/DrawerStateChangedEvent.java +7 -13
  767. package/ReactAndroid/src/main/java/com/facebook/react/views/image/ImageLoadEvent.java +2 -16
  768. package/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java +10 -5
  769. package/ReactAndroid/src/main/java/com/facebook/react/views/modal/BUCK +2 -1
  770. package/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.java +12 -3
  771. package/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java +23 -12
  772. package/ReactAndroid/src/main/java/com/facebook/react/views/modal/RequestCloseEvent.java +12 -4
  773. package/ReactAndroid/src/main/java/com/facebook/react/views/modal/ShowEvent.java +12 -4
  774. package/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/BUCK +1 -1
  775. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/BUCK +1 -0
  776. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollContainerView.java +29 -6
  777. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +184 -24
  778. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java +9 -4
  779. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +109 -12
  780. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.java +18 -3
  781. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java +9 -4
  782. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ScrollEvent.java +37 -20
  783. package/ReactAndroid/src/main/java/com/facebook/react/views/slider/BUCK +1 -1
  784. package/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderEvent.java +0 -5
  785. package/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java +5 -7
  786. package/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSlidingCompleteEvent.java +13 -16
  787. package/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/BUCK +1 -1
  788. package/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/RefreshEvent.java +12 -4
  789. package/ReactAndroid/src/main/java/com/facebook/react/views/swiperefresh/SwipeRefreshLayoutManager.java +2 -1
  790. package/ReactAndroid/src/main/java/com/facebook/react/views/switchview/BUCK +1 -1
  791. package/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitch.java +13 -0
  792. package/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchEvent.java +9 -13
  793. package/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java +6 -10
  794. package/ReactAndroid/src/main/java/com/facebook/react/views/text/BUCK +1 -0
  795. package/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java +6 -8
  796. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactClickableSpan.java +2 -1
  797. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactFontManager.java +59 -44
  798. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextAnchorViewManager.java +0 -4
  799. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java +32 -4
  800. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +19 -0
  801. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java +48 -1
  802. package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTypefaceUtils.java +41 -59
  803. package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextAttributeProps.java +230 -139
  804. package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +45 -20
  805. package/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java +616 -0
  806. package/ReactAndroid/src/main/java/com/facebook/react/views/text/TypefaceStyle.java +72 -0
  807. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/BUCK +1 -0
  808. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactContentSizeChangedEvent.java +3 -13
  809. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +19 -8
  810. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditTextInputConnectionWrapper.java +3 -0
  811. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextChangedEvent.java +3 -13
  812. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputBlurEvent.java +3 -13
  813. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputEndEditingEvent.java +3 -13
  814. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputEvent.java +3 -13
  815. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputFocusEvent.java +8 -18
  816. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputKeyPressEvent.java +9 -20
  817. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +126 -63
  818. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputSelectionEvent.java +3 -13
  819. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputSubmitEditingEvent.java +8 -18
  820. package/ReactAndroid/src/main/java/com/facebook/react/views/view/CanvasUtil.java +92 -0
  821. package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundDrawable.java +39 -8
  822. package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java +49 -2
  823. package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.java +3 -1
  824. package/ReactAndroid/src/main/java/com/facebook/react/views/view/ViewGroupClickEvent.java +11 -4
  825. package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNode.java +13 -7
  826. package/ReactAndroid/src/main/java/com/facebook/yoga/YogaNodeJNIBase.java +24 -2
  827. package/ReactAndroid/src/main/java/com/facebook/yoga/YogaProps.java +151 -0
  828. package/ReactAndroid/src/main/jni/first-party/fb/BUCK +4 -0
  829. package/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJNIVanilla.cpp +2 -7
  830. package/ReactAndroid/src/main/jni/first-party/yogajni/jni/YGJTypesVanilla.h +8 -4
  831. package/ReactAndroid/src/main/jni/react/jni/Android.mk +6 -3
  832. package/ReactAndroid/src/main/jni/react/jni/BUCK +5 -2
  833. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +61 -0
  834. package/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +8 -0
  835. package/ReactAndroid/src/main/jni/react/jni/JReactCxxErrorHandler.cpp +18 -0
  836. package/{ReactCommon/react/renderer/components/picker/iospicker/primitives.h → ReactAndroid/src/main/jni/react/jni/JReactCxxErrorHandler.h} +6 -10
  837. package/ReactAndroid/src/main/jni/react/jni/JReactSoftExceptionLogger.cpp +21 -0
  838. package/ReactAndroid/src/main/jni/react/jni/JReactSoftExceptionLogger.h +28 -0
  839. package/{ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerComponentDescriptor.h → ReactAndroid/src/main/jni/react/jni/JRuntimeScheduler.cpp} +8 -7
  840. package/ReactAndroid/src/main/jni/react/jni/JRuntimeScheduler.h +30 -0
  841. package/ReactAndroid/src/main/jni/react/jni/JSLoader.cpp +1 -1
  842. package/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.cpp +0 -94
  843. package/ReactAndroid/src/main/jni/react/jni/JavaModuleWrapper.h +0 -30
  844. package/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h +1 -0
  845. package/ReactAndroid/src/main/jni/third-party/boost/Android.mk +7 -2
  846. package/ReactAndroid/src/main/jni/third-party/boost/asm/arm/jump_arm_aapcs_elf_gas.S +86 -0
  847. package/ReactAndroid/src/main/jni/third-party/boost/asm/arm/make_arm_aapcs_elf_gas.S +79 -0
  848. package/ReactAndroid/src/main/jni/third-party/boost/asm/arm/ontop_arm_aapcs_elf_gas.S +91 -0
  849. package/ReactAndroid/src/main/jni/third-party/boost/asm/arm64/jump_arm64_aapcs_elf_gas.S +114 -0
  850. package/ReactAndroid/src/main/jni/third-party/boost/asm/arm64/make_arm64_aapcs_elf_gas.S +85 -0
  851. package/ReactAndroid/src/main/jni/third-party/boost/asm/arm64/ontop_arm64_aapcs_elf_gas.S +113 -0
  852. package/ReactAndroid/src/main/jni/third-party/boost/asm/x86/jump_i386_sysv_elf_gas.S +78 -0
  853. package/ReactAndroid/src/main/jni/third-party/boost/asm/x86/make_i386_sysv_elf_gas.S +106 -0
  854. package/ReactAndroid/src/main/jni/third-party/boost/asm/x86/ontop_i386_sysv_elf_gas.S +85 -0
  855. package/ReactAndroid/src/main/jni/third-party/boost/asm/x86_64/jump_x86_64_sysv_elf_gas.S +76 -0
  856. package/ReactAndroid/src/main/jni/third-party/boost/asm/x86_64/make_x86_64_sysv_elf_gas.S +81 -0
  857. package/ReactAndroid/src/main/jni/third-party/boost/asm/x86_64/ontop_x86_64_sysv_elf_gas.S +79 -0
  858. package/ReactAndroid/src/main/jni/third-party/fmt/Android.mk +15 -0
  859. package/ReactAndroid/src/main/jni/third-party/folly/Android.mk +36 -16
  860. package/ReactAndroid/src/main/jni/third-party/libevent/Android.mk +36 -0
  861. package/ReactAndroid/src/main/jni/third-party/libevent/evconfig-private.h +49 -0
  862. package/{third-party-podspecs/libevent.podspec → ReactAndroid/src/main/jni/third-party/libevent/event-config.h} +141 -366
  863. package/ReactAndroid/src/main/libraries/fbjni/BUCK +2 -2
  864. package/ReactAndroid/src/main/libraries/fresco/fresco-react-native/BUCK +26 -26
  865. package/ReactAndroid/src/main/libraries/soloader/java/com/facebook/soloader/BUCK +5 -5
  866. package/ReactAndroid/src/main/res/devsupport/values/strings.xml +2 -1
  867. package/ReactAndroid/src/main/res/views/uimanager/values/strings_unlocalized.xml +4 -8
  868. package/ReactAndroid/src/main/third-party/android/androidx/BUCK +63 -2
  869. package/ReactAndroid/src/main/third-party/java/infer-annotations/BUCK +2 -2
  870. package/ReactAndroid/src/main/third-party/java/okhttp/BUCK +29 -9
  871. package/ReactAndroid/src/main/third-party/java/okio/BUCK +15 -5
  872. package/ReactAndroid/src/main/third-party/java/robolectric/{4.4/BUCK → BUCK} +0 -0
  873. package/ReactAndroid/src/main/third-party/java/testing-support-lib/BUCK +0 -31
  874. package/ReactAndroid/src/main/third-party/kotlin/BUCK +91 -0
  875. package/ReactAndroid/src/test/java/com/facebook/react/RootViewTest.java +8 -3
  876. package/ReactAndroid/src/test/java/com/facebook/react/animated/NativeAnimatedNodeTraversalTest.java +1 -1
  877. package/ReactAndroid/src/test/java/com/facebook/react/bridge/BUCK +1 -1
  878. package/ReactAndroid/src/test/java/com/facebook/react/bridge/ReactTestHelper.java +1 -0
  879. package/ReactAndroid/src/test/java/com/facebook/react/devsupport/JSDebuggerWebSocketClientTest.java +3 -1
  880. package/ReactAndroid/src/test/java/com/facebook/react/modules/BUCK +1 -0
  881. package/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.java +168 -0
  882. package/ReactAndroid/src/test/java/com/facebook/react/modules/dialog/DialogModuleTest.java +1 -1
  883. package/ReactAndroid/src/test/java/com/facebook/react/modules/network/NetworkingModuleTest.java +10 -10
  884. package/ReactAndroid/src/test/java/com/facebook/react/modules/timing/TimingModuleTest.java +1 -1
  885. package/ReactAndroid/src/test/java/com/facebook/react/uimanager/BaseViewManagerTest.java +32 -0
  886. package/ReactAndroid/src/test/java/com/facebook/react/views/image/ReactImagePropertyTest.java +8 -0
  887. package/ReactAndroid/src/test/java/com/facebook/react/views/textinput/ReactTextInputPropertyTest.java +4 -0
  888. package/ReactCommon/React-Fabric.podspec +58 -14
  889. package/ReactCommon/ReactCommon.podspec +8 -3
  890. package/ReactCommon/better/Android.mk +1 -1
  891. package/ReactCommon/better/BUCK +2 -2
  892. package/ReactCommon/callinvoker/Android.mk +1 -1
  893. package/ReactCommon/callinvoker/BUCK +3 -3
  894. package/ReactCommon/callinvoker/React-callinvoker.podspec +3 -3
  895. package/ReactCommon/cxxreact/Android.mk +2 -1
  896. package/ReactCommon/cxxreact/BUCK +2 -4
  897. package/ReactCommon/cxxreact/CxxNativeModule.cpp +28 -0
  898. package/ReactCommon/cxxreact/CxxNativeModule.h +9 -0
  899. package/ReactCommon/cxxreact/Instance.cpp +21 -1
  900. package/ReactCommon/cxxreact/MethodCall.cpp +2 -2
  901. package/ReactCommon/cxxreact/ModuleRegistry.cpp +5 -0
  902. package/ReactCommon/cxxreact/NativeToJsBridge.cpp +0 -21
  903. package/ReactCommon/cxxreact/NativeToJsBridge.h +0 -6
  904. package/ReactCommon/cxxreact/React-cxxreact.podspec +5 -4
  905. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  906. package/ReactCommon/hermes/React-hermes.podspec +5 -5
  907. package/ReactCommon/hermes/executor/Android.mk +4 -4
  908. package/ReactCommon/hermes/inspector/Android.mk +1 -2
  909. package/ReactCommon/hermes/inspector/BUCK +8 -5
  910. package/ReactCommon/hermes/inspector/chrome/Connection.cpp +115 -0
  911. package/ReactCommon/hermes/inspector/chrome/MessageTypes.cpp +215 -1
  912. package/ReactCommon/hermes/inspector/chrome/MessageTypes.h +115 -1
  913. package/ReactCommon/hermes/inspector/chrome/tests/ConnectionTests.cpp +144 -0
  914. package/ReactCommon/hermes/inspector/tools/message_types.txt +4 -0
  915. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/CommandTest.js +1 -3
  916. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/EventTest.js +1 -3
  917. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/GraphTest.js +1 -3
  918. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/HeaderWriterTest.js +1 -3
  919. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/ImplementationWriterTest.js +1 -3
  920. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/PropertyTest.js +1 -3
  921. package/ReactCommon/hermes/inspector/tools/msggen/__tests__/TypeTest.js +1 -3
  922. package/ReactCommon/hermes/inspector/tools/msggen/package.json +8 -5
  923. package/ReactCommon/hermes/inspector/tools/msggen/src/Command.js +0 -2
  924. package/ReactCommon/hermes/inspector/tools/msggen/src/Converters.js +0 -2
  925. package/ReactCommon/hermes/inspector/tools/msggen/src/Event.js +0 -2
  926. package/ReactCommon/hermes/inspector/tools/msggen/src/Graph.js +0 -2
  927. package/ReactCommon/hermes/inspector/tools/msggen/src/HeaderWriter.js +0 -2
  928. package/ReactCommon/hermes/inspector/tools/msggen/src/ImplementationWriter.js +0 -2
  929. package/ReactCommon/hermes/inspector/tools/msggen/src/Property.js +1 -2
  930. package/ReactCommon/hermes/inspector/tools/msggen/src/TestHelpers.js +1 -3
  931. package/ReactCommon/hermes/inspector/tools/msggen/src/Type.js +0 -2
  932. package/ReactCommon/hermes/inspector/tools/msggen/src/index.js +1 -3
  933. package/ReactCommon/hermes/inspector/tools/msggen/yarn.lock +2246 -1419
  934. package/ReactCommon/jsi/Android.mk +1 -1
  935. package/ReactCommon/jsi/BUCK +1 -3
  936. package/ReactCommon/jsi/JSCRuntime.cpp +7 -0
  937. package/ReactCommon/jsi/React-jsi.podspec +4 -4
  938. package/ReactCommon/jsi/jsi/CMakeLists.txt +1 -1
  939. package/ReactCommon/jsi/jsi/decorator.h +15 -0
  940. package/ReactCommon/jsi/jsi/instrumentation.h +13 -0
  941. package/ReactCommon/jsi/jsi/jsi.cpp +3 -0
  942. package/ReactCommon/jsi/jsi/jsi.h +31 -2
  943. package/ReactCommon/jsi/jsi/jsilib-posix.cpp +1 -11
  944. package/ReactCommon/jsiexecutor/Android.mk +2 -2
  945. package/ReactCommon/jsiexecutor/React-jsiexecutor.podspec +3 -3
  946. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +36 -3
  947. package/ReactCommon/jsiexecutor/jsireact/JSINativeModules.cpp +2 -0
  948. package/ReactCommon/jsinspector/BUCK +2 -0
  949. package/ReactCommon/jsinspector/React-jsinspector.podspec +1 -1
  950. package/ReactCommon/logger/Android.mk +23 -0
  951. package/ReactCommon/logger/BUCK +43 -0
  952. package/ReactCommon/logger/React-logger.podspec +40 -0
  953. package/ReactCommon/logger/react_native_log.cpp +52 -0
  954. package/ReactCommon/logger/react_native_log.h +33 -0
  955. package/ReactCommon/react/config/Android.mk +1 -1
  956. package/ReactCommon/react/config/BUCK +1 -1
  957. package/ReactCommon/react/debug/Android.mk +31 -0
  958. package/ReactCommon/react/debug/BUCK +69 -0
  959. package/ReactCommon/react/debug/flags.h +19 -0
  960. package/ReactCommon/react/debug/react_native_assert.cpp +45 -0
  961. package/ReactCommon/react/debug/react_native_assert.h +64 -0
  962. package/ReactCommon/react/nativemodule/core/Android.mk +3 -3
  963. package/ReactCommon/react/nativemodule/core/BUCK +3 -3
  964. package/ReactCommon/react/nativemodule/core/ReactCommon/LongLivedObject.cpp +1 -0
  965. package/ReactCommon/react/nativemodule/core/ReactCommon/LongLivedObject.h +3 -2
  966. package/ReactCommon/react/nativemodule/core/ReactCommon/TurboModule.cpp +1 -1
  967. package/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.cpp +46 -1
  968. package/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleBinding.h +10 -0
  969. package/ReactCommon/react/nativemodule/core/ReactCommon/TurboModuleUtils.h +55 -1
  970. package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +76 -42
  971. package/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.h +11 -1
  972. package/ReactCommon/react/nativemodule/core/platform/ios/RCTBlockGuard.h +24 -0
  973. package/ReactCommon/react/nativemodule/core/platform/ios/RCTBlockGuard.mm +28 -0
  974. package/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModule.h +7 -16
  975. package/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModule.mm +79 -32
  976. package/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h +0 -7
  977. package/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm +123 -127
  978. package/ReactCommon/react/nativemodule/samples/BUCK +4 -5
  979. package/ReactCommon/react/nativemodule/samples/platform/android/Android.mk +2 -2
  980. package/ReactCommon/react/nativemodule/samples/platform/ios/RCTSampleTurboCxxModule.mm +12 -0
  981. package/ReactCommon/react/nativemodule/samples/platform/ios/RCTSampleTurboModule.mm +0 -2
  982. package/ReactCommon/react/renderer/animations/Android.mk +3 -2
  983. package/ReactCommon/react/renderer/animations/BUCK +6 -3
  984. package/ReactCommon/react/renderer/animations/LayoutAnimationCallbackWrapper.h +34 -0
  985. package/ReactCommon/react/renderer/animations/LayoutAnimationDriver.cpp +11 -66
  986. package/ReactCommon/react/renderer/animations/LayoutAnimationDriver.h +8 -13
  987. package/ReactCommon/react/renderer/animations/LayoutAnimationKeyFrameManager.cpp +1117 -1147
  988. package/ReactCommon/react/renderer/animations/LayoutAnimationKeyFrameManager.h +98 -243
  989. package/ReactCommon/react/renderer/animations/conversions.h +212 -0
  990. package/ReactCommon/react/renderer/animations/primitives.h +104 -0
  991. package/ReactCommon/react/renderer/animations/tests/LayoutAnimationTest.cpp +544 -0
  992. package/ReactCommon/react/renderer/animations/utils.cpp +71 -0
  993. package/ReactCommon/react/renderer/animations/utils.h +80 -0
  994. package/ReactCommon/react/renderer/attributedstring/Android.mk +4 -2
  995. package/ReactCommon/react/renderer/attributedstring/AttributedString.h +0 -1
  996. package/ReactCommon/react/renderer/attributedstring/AttributedStringBox.cpp +28 -6
  997. package/ReactCommon/react/renderer/attributedstring/AttributedStringBox.h +2 -2
  998. package/ReactCommon/react/renderer/attributedstring/BUCK +9 -4
  999. package/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.cpp +7 -3
  1000. package/ReactCommon/react/renderer/attributedstring/ParagraphAttributes.h +12 -2
  1001. package/ReactCommon/react/renderer/attributedstring/TextAttributes.cpp +7 -2
  1002. package/ReactCommon/react/renderer/attributedstring/TextAttributes.h +3 -1
  1003. package/ReactCommon/react/renderer/attributedstring/conversions.h +718 -305
  1004. package/ReactCommon/react/renderer/attributedstring/primitives.h +34 -1
  1005. package/ReactCommon/react/renderer/attributedstring/tests/AttributedStringBoxTest.cpp +105 -0
  1006. package/ReactCommon/react/renderer/attributedstring/tests/AttributedStringTest.cpp +17 -20
  1007. package/ReactCommon/react/renderer/attributedstring/tests/ParagraphAttributesTest.cpp +7 -12
  1008. package/ReactCommon/react/renderer/attributedstring/tests/TextAttributesTest.cpp +13 -15
  1009. package/ReactCommon/react/renderer/componentregistry/Android.mk +3 -2
  1010. package/ReactCommon/react/renderer/componentregistry/BUCK +5 -4
  1011. package/ReactCommon/react/renderer/componentregistry/ComponentDescriptorProviderRegistry.cpp +2 -2
  1012. package/ReactCommon/react/renderer/componentregistry/ComponentDescriptorProviderRegistry.h +1 -0
  1013. package/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.cpp +17 -67
  1014. package/ReactCommon/react/renderer/componentregistry/ComponentDescriptorRegistry.h +4 -1
  1015. package/ReactCommon/react/renderer/componentregistry/componentNameByReactViewName.cpp +73 -0
  1016. package/ReactCommon/react/renderer/{components/picker/iospicker/PickerShadowNode.cpp → componentregistry/componentNameByReactViewName.h} +7 -2
  1017. package/ReactCommon/react/renderer/componentregistry/native/Android.mk +29 -0
  1018. package/ReactCommon/react/renderer/componentregistry/native/BUCK +58 -0
  1019. package/ReactCommon/react/renderer/componentregistry/native/NativeComponentRegistryBinding.cpp +68 -0
  1020. package/ReactCommon/react/renderer/componentregistry/native/NativeComponentRegistryBinding.h +61 -0
  1021. package/ReactCommon/react/renderer/components/image/Android.mk +5 -3
  1022. package/ReactCommon/react/renderer/components/image/BUCK +7 -3
  1023. package/ReactCommon/react/renderer/components/image/ImageComponentDescriptor.h +3 -2
  1024. package/ReactCommon/react/renderer/components/image/ImageProps.cpp +28 -9
  1025. package/ReactCommon/react/renderer/components/image/ImageProps.h +5 -1
  1026. package/ReactCommon/react/renderer/components/image/ImageState.h +9 -1
  1027. package/ReactCommon/react/renderer/components/image/conversions.h +29 -18
  1028. package/ReactCommon/react/renderer/components/inputaccessory/BUCK +4 -3
  1029. package/ReactCommon/react/renderer/components/inputaccessory/InputAccessoryComponentDescriptor.h +5 -3
  1030. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/BUCK +3 -3
  1031. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.h +1 -1
  1032. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropComponentDescriptor.mm +17 -4
  1033. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewProps.cpp +5 -10
  1034. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/LegacyViewManagerInteropViewProps.h +2 -0
  1035. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h +1 -1
  1036. package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm +69 -12
  1037. package/ReactCommon/react/renderer/components/modal/Android.mk +4 -3
  1038. package/ReactCommon/react/renderer/components/modal/BUCK +6 -2
  1039. package/ReactCommon/react/renderer/components/modal/ModalHostViewComponentDescriptor.h +5 -3
  1040. package/ReactCommon/react/renderer/components/modal/ModalHostViewState.h +6 -0
  1041. package/ReactCommon/react/renderer/components/progressbar/Android.mk +3 -3
  1042. package/ReactCommon/react/renderer/components/progressbar/BUCK +4 -3
  1043. package/ReactCommon/react/renderer/components/progressbar/android/react/renderer/components/progressbar/AndroidProgressBarComponentDescriptor.h +4 -2
  1044. package/ReactCommon/react/renderer/components/root/Android.mk +4 -3
  1045. package/ReactCommon/react/renderer/components/root/BUCK +4 -3
  1046. package/ReactCommon/react/renderer/components/root/RootProps.cpp +12 -2
  1047. package/ReactCommon/react/renderer/components/root/RootProps.h +6 -1
  1048. package/ReactCommon/react/renderer/components/root/RootShadowNode.cpp +7 -1
  1049. package/ReactCommon/react/renderer/components/root/RootShadowNode.h +2 -0
  1050. package/ReactCommon/react/renderer/components/root/tests/RootShadowNodeTest.cpp +35 -3
  1051. package/ReactCommon/react/renderer/components/safeareaview/BUCK +4 -3
  1052. package/ReactCommon/react/renderer/components/safeareaview/SafeAreaViewComponentDescriptor.h +5 -3
  1053. package/ReactCommon/react/renderer/components/scrollview/Android.mk +5 -3
  1054. package/ReactCommon/react/renderer/components/scrollview/BUCK +6 -3
  1055. package/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.cpp +59 -6
  1056. package/ReactCommon/react/renderer/components/scrollview/ScrollViewProps.h +10 -5
  1057. package/ReactCommon/react/renderer/components/scrollview/ScrollViewShadowNode.cpp +23 -2
  1058. package/ReactCommon/react/renderer/components/scrollview/ScrollViewShadowNode.h +1 -0
  1059. package/ReactCommon/react/renderer/components/scrollview/ScrollViewState.cpp +1 -1
  1060. package/ReactCommon/react/renderer/components/scrollview/ScrollViewState.h +12 -2
  1061. package/ReactCommon/react/renderer/components/scrollview/conversions.h +5 -0
  1062. package/ReactCommon/react/renderer/components/slider/Android.mk +4 -3
  1063. package/ReactCommon/react/renderer/components/slider/BUCK +5 -3
  1064. package/ReactCommon/react/renderer/components/slider/SliderComponentDescriptor.h +4 -2
  1065. package/ReactCommon/react/renderer/components/slider/SliderState.h +8 -0
  1066. package/ReactCommon/react/renderer/components/slider/platform/ios/SliderMeasurementsManager.cpp +3 -1
  1067. package/ReactCommon/react/renderer/components/switch/Android.mk +3 -3
  1068. package/ReactCommon/react/renderer/components/switch/BUCK +3 -3
  1069. package/ReactCommon/react/renderer/components/switch/androidswitch/react/renderer/components/androidswitch/AndroidSwitchComponentDescriptor.h +4 -2
  1070. package/ReactCommon/react/renderer/components/text/Android.mk +5 -3
  1071. package/ReactCommon/react/renderer/components/text/BUCK +10 -4
  1072. package/ReactCommon/react/renderer/components/text/BaseTextProps.cpp +32 -0
  1073. package/ReactCommon/react/renderer/components/text/BaseTextProps.h +5 -1
  1074. package/ReactCommon/react/renderer/components/text/BaseTextShadowNode.cpp +2 -3
  1075. package/ReactCommon/react/renderer/components/text/ParagraphComponentDescriptor.h +5 -24
  1076. package/ReactCommon/react/renderer/components/text/ParagraphProps.cpp +15 -6
  1077. package/ReactCommon/react/renderer/components/text/ParagraphProps.h +5 -1
  1078. package/ReactCommon/react/renderer/components/text/ParagraphShadowNode.cpp +9 -16
  1079. package/ReactCommon/react/renderer/components/text/ParagraphShadowNode.h +7 -6
  1080. package/ReactCommon/react/renderer/components/text/ParagraphState.cpp +4 -0
  1081. package/ReactCommon/react/renderer/components/text/ParagraphState.h +8 -3
  1082. package/ReactCommon/react/renderer/components/text/RawTextProps.cpp +3 -2
  1083. package/ReactCommon/react/renderer/components/text/RawTextProps.h +5 -1
  1084. package/ReactCommon/react/renderer/components/text/RawTextShadowNode.h +36 -2
  1085. package/ReactCommon/react/renderer/components/text/TextProps.cpp +6 -3
  1086. package/ReactCommon/react/renderer/components/text/TextProps.h +5 -1
  1087. package/ReactCommon/react/renderer/components/text/TextShadowNode.h +23 -0
  1088. package/ReactCommon/react/renderer/components/text/conversions.h +22 -0
  1089. package/ReactCommon/react/renderer/components/text/tests/ParagraphLocalDataTest.cpp +8 -5
  1090. package/ReactCommon/react/renderer/components/textinput/Android.mk +5 -3
  1091. package/ReactCommon/react/renderer/components/textinput/BUCK +8 -4
  1092. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputComponentDescriptor.h +8 -5
  1093. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputProps.cpp +58 -91
  1094. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputProps.h +10 -6
  1095. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.cpp +2 -8
  1096. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputShadowNode.h +5 -5
  1097. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputState.cpp +0 -3
  1098. package/ReactCommon/react/renderer/components/textinput/androidtextinput/react/renderer/components/androidtextinput/AndroidTextInputState.h +5 -8
  1099. package/ReactCommon/react/renderer/components/textinput/iostextinput/BUCK +5 -4
  1100. package/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputComponentDescriptor.h +4 -2
  1101. package/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputProps.cpp +46 -22
  1102. package/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputProps.h +6 -5
  1103. package/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputShadowNode.cpp +3 -2
  1104. package/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputShadowNode.h +6 -6
  1105. package/ReactCommon/react/renderer/components/textinput/iostextinput/TextInputState.h +2 -0
  1106. package/ReactCommon/react/renderer/components/textinput/iostextinput/conversions.h +19 -7
  1107. package/ReactCommon/react/renderer/components/textinput/iostextinput/primitives.h +6 -0
  1108. package/ReactCommon/react/renderer/components/textinput/iostextinput/propsConversions.h +63 -2
  1109. package/ReactCommon/react/renderer/components/unimplementedview/Android.mk +4 -3
  1110. package/ReactCommon/react/renderer/components/unimplementedview/BUCK +4 -3
  1111. package/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.cpp +8 -3
  1112. package/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewComponentDescriptor.h +5 -2
  1113. package/ReactCommon/react/renderer/components/unimplementedview/UnimplementedViewProps.h +1 -0
  1114. package/ReactCommon/react/renderer/components/view/AccessibilityPrimitives.h +28 -0
  1115. package/ReactCommon/react/renderer/components/view/AccessibilityProps.cpp +24 -1
  1116. package/ReactCommon/react/renderer/components/view/AccessibilityProps.h +4 -1
  1117. package/ReactCommon/react/renderer/components/view/Android.mk +6 -4
  1118. package/ReactCommon/react/renderer/components/view/BUCK +5 -3
  1119. package/ReactCommon/react/renderer/components/view/TouchEventEmitter.cpp +19 -5
  1120. package/ReactCommon/react/renderer/components/view/TouchEventEmitter.h +2 -1
  1121. package/ReactCommon/react/renderer/components/view/ViewComponentDescriptor.h +0 -22
  1122. package/ReactCommon/react/renderer/components/view/ViewEventEmitter.cpp +1 -1
  1123. package/ReactCommon/react/renderer/components/view/ViewProps.cpp +62 -14
  1124. package/ReactCommon/react/renderer/components/view/ViewProps.h +7 -1
  1125. package/ReactCommon/react/renderer/components/view/ViewPropsInterpolation.h +5 -8
  1126. package/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp +5 -19
  1127. package/ReactCommon/react/renderer/components/view/ViewShadowNode.h +1 -1
  1128. package/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.cpp +147 -78
  1129. package/ReactCommon/react/renderer/components/view/YogaLayoutableShadowNode.h +4 -9
  1130. package/ReactCommon/react/renderer/components/view/YogaStylableProps.cpp +3 -2
  1131. package/ReactCommon/react/renderer/components/view/YogaStylableProps.h +2 -0
  1132. package/ReactCommon/react/renderer/components/view/accessibilityPropsConversions.h +99 -24
  1133. package/ReactCommon/react/renderer/components/view/conversions.h +89 -45
  1134. package/ReactCommon/react/renderer/components/view/primitives.h +5 -4
  1135. package/ReactCommon/react/renderer/components/view/propsConversions.h +163 -28
  1136. package/ReactCommon/react/renderer/components/view/tests/ViewTest.cpp +11 -2
  1137. package/ReactCommon/react/renderer/core/Android.mk +4 -2
  1138. package/ReactCommon/react/renderer/core/BUCK +7 -4
  1139. package/ReactCommon/react/renderer/core/BatchedEventQueue.cpp +2 -34
  1140. package/ReactCommon/react/renderer/core/BatchedEventQueue.h +2 -9
  1141. package/ReactCommon/react/renderer/core/ComponentDescriptor.h +6 -3
  1142. package/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +28 -27
  1143. package/ReactCommon/react/renderer/core/ConcreteShadowNode.h +11 -5
  1144. package/ReactCommon/react/renderer/core/ConcreteState.h +7 -3
  1145. package/ReactCommon/react/renderer/core/DynamicPropsUtilities.cpp +35 -0
  1146. package/ReactCommon/react/renderer/{components/picker/iospicker/PickerState.h → core/DynamicPropsUtilities.h} +5 -4
  1147. package/ReactCommon/react/renderer/core/EventDispatcher.cpp +9 -15
  1148. package/ReactCommon/react/renderer/core/EventDispatcher.h +5 -10
  1149. package/ReactCommon/react/renderer/core/EventEmitter.cpp +22 -12
  1150. package/ReactCommon/react/renderer/core/EventEmitter.h +7 -2
  1151. package/ReactCommon/react/renderer/core/EventPipe.h +2 -0
  1152. package/ReactCommon/react/renderer/core/EventPriority.h +1 -1
  1153. package/ReactCommon/react/renderer/core/EventQueue.cpp +39 -36
  1154. package/ReactCommon/react/renderer/core/EventQueue.h +14 -8
  1155. package/ReactCommon/react/renderer/core/EventQueueProcessor.cpp +82 -0
  1156. package/ReactCommon/react/renderer/core/EventQueueProcessor.h +36 -0
  1157. package/ReactCommon/react/renderer/core/EventTarget.cpp +4 -2
  1158. package/ReactCommon/react/renderer/core/LayoutConstraints.h +6 -0
  1159. package/ReactCommon/react/renderer/core/LayoutMetrics.cpp +65 -0
  1160. package/ReactCommon/react/renderer/core/LayoutMetrics.h +35 -2
  1161. package/ReactCommon/react/renderer/core/LayoutPrimitives.h +14 -6
  1162. package/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp +1 -1
  1163. package/ReactCommon/react/renderer/core/LayoutableShadowNode.h +2 -7
  1164. package/ReactCommon/react/renderer/core/Props.cpp +10 -2
  1165. package/ReactCommon/react/renderer/core/Props.h +6 -1
  1166. package/ReactCommon/react/renderer/core/PropsParserContext.h +29 -0
  1167. package/ReactCommon/react/renderer/core/RawEvent.cpp +4 -2
  1168. package/ReactCommon/react/renderer/core/RawEvent.h +40 -3
  1169. package/ReactCommon/react/renderer/core/RawProps.cpp +5 -3
  1170. package/ReactCommon/react/renderer/core/RawProps.h +3 -1
  1171. package/ReactCommon/react/renderer/core/RawPropsKey.cpp +18 -7
  1172. package/ReactCommon/react/renderer/core/RawPropsKeyMap.cpp +8 -6
  1173. package/ReactCommon/react/renderer/core/RawPropsParser.cpp +10 -7
  1174. package/ReactCommon/react/renderer/core/RawPropsParser.h +11 -2
  1175. package/ReactCommon/react/renderer/core/RawValue.h +9 -7
  1176. package/ReactCommon/react/renderer/core/ReactEventPriority.h +43 -0
  1177. package/ReactCommon/react/renderer/core/ReactPrimitives.h +34 -2
  1178. package/ReactCommon/react/renderer/core/Sealable.cpp +4 -3
  1179. package/ReactCommon/react/renderer/core/Sealable.h +5 -1
  1180. package/ReactCommon/react/renderer/core/ShadowNode.cpp +42 -13
  1181. package/ReactCommon/react/renderer/core/ShadowNode.h +14 -4
  1182. package/ReactCommon/react/renderer/core/ShadowNodeFamily.cpp +2 -1
  1183. package/ReactCommon/react/renderer/core/ShadowNodeFamily.h +2 -1
  1184. package/ReactCommon/react/renderer/core/ShadowNodeTraits.h +17 -1
  1185. package/ReactCommon/react/renderer/core/State.h +3 -0
  1186. package/ReactCommon/react/renderer/core/StateData.h +3 -0
  1187. package/ReactCommon/react/renderer/core/propsConversions.h +19 -9
  1188. package/ReactCommon/react/renderer/core/tests/ComponentDescriptorTest.cpp +16 -4
  1189. package/ReactCommon/react/renderer/core/tests/ConcreteShadowNodeTest.cpp +1 -1
  1190. package/ReactCommon/react/renderer/core/tests/DynamicPropsUtilitiesTest.cpp +66 -0
  1191. package/ReactCommon/react/renderer/core/tests/EventQueueProcessorTest.cpp +134 -0
  1192. package/ReactCommon/react/renderer/core/tests/RawPropsTest.cpp +99 -30
  1193. package/ReactCommon/react/renderer/core/tests/TestComponent.h +11 -7
  1194. package/ReactCommon/react/renderer/core/tests/traitCastTest.cpp +31 -0
  1195. package/ReactCommon/react/renderer/debug/Android.mk +1 -1
  1196. package/ReactCommon/react/renderer/debug/BUCK +4 -6
  1197. package/ReactCommon/react/renderer/debug/DebugStringConvertible.h +11 -25
  1198. package/ReactCommon/react/renderer/debug/flags.h +50 -0
  1199. package/ReactCommon/react/renderer/element/BUCK +3 -3
  1200. package/ReactCommon/react/renderer/graphics/Android.mk +7 -3
  1201. package/ReactCommon/react/renderer/graphics/BUCK +16 -4
  1202. package/ReactCommon/react/renderer/graphics/React-graphics.podspec +4 -3
  1203. package/ReactCommon/react/renderer/graphics/Transform.cpp +5 -4
  1204. package/ReactCommon/react/renderer/graphics/Transform.h +1 -1
  1205. package/ReactCommon/react/renderer/graphics/conversions.h +102 -44
  1206. package/ReactCommon/react/renderer/graphics/platform/android/react/renderer/graphics/PlatformColorParser.h +67 -0
  1207. package/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/Color.cpp +14 -6
  1208. package/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/Color.h +2 -0
  1209. package/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/PlatformColorParser.h +29 -0
  1210. package/ReactCommon/react/renderer/graphics/platform/ios/Color.cpp +14 -6
  1211. package/ReactCommon/react/renderer/graphics/platform/ios/Color.h +44 -1
  1212. package/ReactCommon/react/renderer/graphics/platform/ios/PlatformColorParser.h +34 -0
  1213. package/ReactCommon/react/renderer/graphics/platform/ios/RCTPlatformColorUtils.h +12 -0
  1214. package/ReactCommon/react/renderer/graphics/platform/ios/RCTPlatformColorUtils.mm +206 -0
  1215. package/ReactCommon/react/renderer/imagemanager/Android.mk +3 -2
  1216. package/ReactCommon/react/renderer/imagemanager/BUCK +5 -4
  1217. package/ReactCommon/react/renderer/imagemanager/ImageResponseObserverCoordinator.cpp +5 -4
  1218. package/ReactCommon/react/renderer/imagemanager/platform/ios/RCTImagePrimitivesConversions.h +8 -6
  1219. package/ReactCommon/react/renderer/imagemanager/platform/ios/RCTSyncImageManager.mm +1 -1
  1220. package/ReactCommon/react/renderer/leakchecker/Android.mk +29 -0
  1221. package/ReactCommon/react/renderer/{components/picker/iospicker → leakchecker}/BUCK +8 -12
  1222. package/ReactCommon/react/renderer/leakchecker/LeakChecker.cpp +60 -0
  1223. package/ReactCommon/react/renderer/leakchecker/LeakChecker.h +39 -0
  1224. package/ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.cpp +37 -0
  1225. package/ReactCommon/react/renderer/leakchecker/WeakFamilyRegistry.h +39 -0
  1226. package/ReactCommon/react/renderer/mapbuffer/Android.mk +9 -6
  1227. package/ReactCommon/react/renderer/mapbuffer/BUCK +14 -5
  1228. package/ReactCommon/react/renderer/mapbuffer/MapBuffer.cpp +131 -4
  1229. package/ReactCommon/react/renderer/mapbuffer/MapBuffer.h +40 -4
  1230. package/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.cpp +226 -0
  1231. package/ReactCommon/react/renderer/mapbuffer/MapBufferBuilder.h +94 -0
  1232. package/ReactCommon/react/renderer/mapbuffer/primitives.h +91 -0
  1233. package/ReactCommon/react/renderer/mapbuffer/tests/MapBufferTest.cpp +141 -5
  1234. package/ReactCommon/react/renderer/mounting/Android.mk +5 -2
  1235. package/ReactCommon/react/renderer/mounting/BUCK +6 -3
  1236. package/ReactCommon/react/renderer/mounting/Differentiator.cpp +794 -620
  1237. package/ReactCommon/react/renderer/mounting/Differentiator.h +31 -4
  1238. package/ReactCommon/react/renderer/mounting/MountingCoordinator.cpp +4 -2
  1239. package/ReactCommon/react/renderer/mounting/MountingCoordinator.h +1 -4
  1240. package/ReactCommon/react/renderer/mounting/MountingOverrideDelegate.h +1 -1
  1241. package/ReactCommon/react/renderer/mounting/MountingTransaction.h +2 -2
  1242. package/ReactCommon/react/renderer/mounting/MountingTransactionMetadata.h +1 -1
  1243. package/ReactCommon/react/renderer/mounting/ShadowTree.cpp +19 -15
  1244. package/ReactCommon/react/renderer/mounting/ShadowTree.h +11 -4
  1245. package/ReactCommon/react/renderer/mounting/ShadowTreeRegistry.cpp +3 -1
  1246. package/ReactCommon/react/renderer/mounting/ShadowTreeRevision.h +1 -1
  1247. package/ReactCommon/react/renderer/mounting/ShadowView.cpp +15 -1
  1248. package/ReactCommon/react/renderer/mounting/ShadowView.h +45 -2
  1249. package/ReactCommon/react/renderer/mounting/ShadowViewMutation.cpp +28 -0
  1250. package/ReactCommon/react/renderer/mounting/ShadowViewMutation.h +17 -0
  1251. package/ReactCommon/react/renderer/mounting/StubView.cpp +21 -2
  1252. package/ReactCommon/react/renderer/mounting/StubView.h +3 -0
  1253. package/ReactCommon/react/renderer/mounting/StubViewTree.cpp +204 -77
  1254. package/ReactCommon/react/renderer/mounting/TelemetryController.cpp +1 -1
  1255. package/ReactCommon/react/renderer/mounting/TelemetryController.h +1 -1
  1256. package/ReactCommon/react/renderer/mounting/stubs.cpp +5 -4
  1257. package/ReactCommon/react/renderer/mounting/tests/MountingTest.cpp +13 -2
  1258. package/ReactCommon/react/renderer/mounting/tests/ShadowTreeLifeCycleTest.cpp +232 -9
  1259. package/ReactCommon/react/renderer/mounting/tests/StateReconciliationTest.cpp +18 -8
  1260. package/ReactCommon/react/renderer/runtimescheduler/Android.mk +28 -0
  1261. package/ReactCommon/react/renderer/runtimescheduler/BUCK +77 -0
  1262. package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.cpp +118 -0
  1263. package/ReactCommon/react/renderer/runtimescheduler/RuntimeScheduler.h +105 -0
  1264. package/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.cpp +171 -0
  1265. package/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerBinding.h +44 -0
  1266. package/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerCallInvoker.cpp +30 -0
  1267. package/ReactCommon/react/renderer/runtimescheduler/RuntimeSchedulerCallInvoker.h +34 -0
  1268. package/ReactCommon/react/renderer/{components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerComponentDescriptor.h → runtimescheduler/RuntimeSchedulerClock.h} +8 -5
  1269. package/ReactCommon/react/renderer/runtimescheduler/SchedulerPriority.h +65 -0
  1270. package/ReactCommon/react/renderer/runtimescheduler/Task.cpp +37 -0
  1271. package/ReactCommon/react/renderer/runtimescheduler/Task.h +48 -0
  1272. package/ReactCommon/react/renderer/runtimescheduler/primitives.h +41 -0
  1273. package/ReactCommon/react/renderer/runtimescheduler/tests/RuntimeSchedulerTest.cpp +472 -0
  1274. package/ReactCommon/react/renderer/runtimescheduler/tests/SchedulerPriorityTest.cpp +46 -0
  1275. package/ReactCommon/react/renderer/runtimescheduler/tests/StubClock.h +41 -0
  1276. package/ReactCommon/react/renderer/runtimescheduler/tests/StubQueue.h +38 -0
  1277. package/ReactCommon/react/renderer/scheduler/Android.mk +4 -2
  1278. package/ReactCommon/react/renderer/scheduler/AsynchronousEventBeat.cpp +16 -13
  1279. package/ReactCommon/react/renderer/scheduler/AsynchronousEventBeat.h +4 -4
  1280. package/ReactCommon/react/renderer/scheduler/BUCK +5 -3
  1281. package/ReactCommon/react/renderer/{components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerShadowNode.cpp → scheduler/InspectorData.h} +10 -2
  1282. package/ReactCommon/react/renderer/scheduler/Scheduler.cpp +81 -132
  1283. package/ReactCommon/react/renderer/scheduler/Scheduler.h +32 -35
  1284. package/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h +12 -10
  1285. package/ReactCommon/react/renderer/scheduler/SchedulerToolbox.h +2 -0
  1286. package/ReactCommon/react/renderer/scheduler/SurfaceHandler.cpp +317 -0
  1287. package/ReactCommon/react/renderer/scheduler/SurfaceHandler.h +209 -0
  1288. package/ReactCommon/react/renderer/scheduler/SurfaceManager.cpp +104 -0
  1289. package/ReactCommon/react/renderer/scheduler/SurfaceManager.h +67 -0
  1290. package/ReactCommon/react/renderer/scheduler/SynchronousEventBeat.cpp +14 -5
  1291. package/ReactCommon/react/renderer/scheduler/SynchronousEventBeat.h +4 -1
  1292. package/ReactCommon/react/renderer/telemetry/Android.mk +31 -0
  1293. package/ReactCommon/react/renderer/telemetry/BUCK +84 -0
  1294. package/ReactCommon/react/renderer/{mounting → telemetry}/SurfaceTelemetry.cpp +5 -0
  1295. package/ReactCommon/react/renderer/{mounting → telemetry}/SurfaceTelemetry.h +3 -1
  1296. package/ReactCommon/react/renderer/telemetry/TransactionTelemetry.cpp +163 -0
  1297. package/ReactCommon/react/renderer/{mounting → telemetry}/TransactionTelemetry.h +11 -0
  1298. package/ReactCommon/react/renderer/telemetry/tests/TransactionTelemetryTest.cpp +176 -0
  1299. package/ReactCommon/react/renderer/templateprocessor/Android.mk +1 -1
  1300. package/ReactCommon/react/renderer/templateprocessor/BUCK +3 -3
  1301. package/ReactCommon/react/renderer/templateprocessor/UITemplateProcessor.cpp +5 -5
  1302. package/ReactCommon/react/renderer/textlayoutmanager/Android.mk +5 -2
  1303. package/ReactCommon/react/renderer/textlayoutmanager/BUCK +5 -3
  1304. package/ReactCommon/react/renderer/textlayoutmanager/TextMeasureCache.cpp +12 -9
  1305. package/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp +132 -3
  1306. package/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.h +17 -1
  1307. package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.h +2 -0
  1308. package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/RCTAttributedTextUtils.mm +22 -0
  1309. package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/TextLayoutManager.mm +25 -3
  1310. package/ReactCommon/react/renderer/{components/picker → timeline}/BUCK +14 -28
  1311. package/ReactCommon/react/renderer/timeline/Timeline.cpp +120 -0
  1312. package/ReactCommon/react/renderer/timeline/Timeline.h +63 -0
  1313. package/ReactCommon/react/renderer/timeline/TimelineController.cpp +77 -0
  1314. package/ReactCommon/react/renderer/timeline/TimelineController.h +80 -0
  1315. package/ReactCommon/react/renderer/timeline/TimelineFrame.cpp +25 -0
  1316. package/ReactCommon/react/renderer/timeline/TimelineFrame.h +46 -0
  1317. package/ReactCommon/react/renderer/timeline/TimelineHandler.cpp +97 -0
  1318. package/ReactCommon/react/renderer/timeline/TimelineHandler.h +80 -0
  1319. package/ReactCommon/react/renderer/timeline/TimelineSnapshot.cpp +30 -0
  1320. package/ReactCommon/react/renderer/timeline/TimelineSnapshot.h +36 -0
  1321. package/ReactCommon/react/renderer/uimanager/Android.mk +4 -2
  1322. package/ReactCommon/react/renderer/uimanager/BUCK +5 -3
  1323. package/ReactCommon/react/renderer/uimanager/LayoutAnimationStatusDelegate.h +2 -4
  1324. package/ReactCommon/react/renderer/uimanager/UIManager.cpp +121 -36
  1325. package/ReactCommon/react/renderer/uimanager/UIManager.h +40 -21
  1326. package/ReactCommon/react/renderer/uimanager/UIManagerAnimationDelegate.h +3 -5
  1327. package/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp +201 -77
  1328. package/ReactCommon/react/renderer/uimanager/UIManagerBinding.h +29 -6
  1329. package/ReactCommon/react/renderer/uimanager/UIManagerCommitHook.h +2 -4
  1330. package/ReactCommon/react/renderer/uimanager/UIManagerDelegate.h +16 -15
  1331. package/ReactCommon/react/renderer/uimanager/primitives.h +57 -9
  1332. package/ReactCommon/react/test_utils/BUCK +57 -0
  1333. package/ReactCommon/react/{renderer/mounting/tests → test_utils}/Entropy.h +4 -0
  1334. package/ReactCommon/react/test_utils/MockClock.h +29 -0
  1335. package/ReactCommon/react/{renderer/components/picker/iospicker/PickerEventEmitter.h → test_utils/MockSurfaceHandler.h} +6 -9
  1336. package/ReactCommon/react/{renderer/mounting/tests → test_utils}/shadowTreeGeneration.h +61 -5
  1337. package/ReactCommon/react/utils/Android.mk +8 -3
  1338. package/ReactCommon/react/utils/BUCK +9 -2
  1339. package/ReactCommon/react/utils/CalledOnceMovableOnlyFunction.h +6 -4
  1340. package/ReactCommon/react/utils/ContextContainer.h +4 -24
  1341. package/ReactCommon/react/utils/LayoutManager.h +56 -0
  1342. package/ReactCommon/react/utils/ManagedObjectWrapper.h +3 -1
  1343. package/ReactCommon/react/utils/RunLoopObserver.cpp +5 -4
  1344. package/ReactCommon/reactperflogger/Android.mk +1 -1
  1345. package/ReactCommon/reactperflogger/BUCK +1 -1
  1346. package/ReactCommon/reactperflogger/React-perflogger.podspec +2 -2
  1347. package/ReactCommon/runtimeexecutor/Android.mk +1 -1
  1348. package/ReactCommon/runtimeexecutor/BUCK +2 -2
  1349. package/ReactCommon/runtimeexecutor/React-runtimeexecutor.podspec +2 -2
  1350. package/ReactCommon/runtimeexecutor/ReactCommon/RuntimeExecutor.h +14 -2
  1351. package/ReactCommon/yoga/Yoga.podspec +1 -1
  1352. package/ReactCommon/yoga/yoga/BitUtils.h +3 -2
  1353. package/ReactCommon/yoga/yoga/Utils.cpp +1 -1
  1354. package/ReactCommon/yoga/yoga/YGNode.cpp +111 -110
  1355. package/ReactCommon/yoga/yoga/YGNode.h +11 -0
  1356. package/ReactCommon/yoga/yoga/YGNodePrint.cpp +7 -4
  1357. package/ReactCommon/yoga/yoga/Yoga-internal.h +4 -5
  1358. package/ReactCommon/yoga/yoga/Yoga.cpp +114 -159
  1359. package/ReactCommon/yoga/yoga/Yoga.h +1 -1
  1360. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.aar +0 -0
  1361. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.aar.md5 +1 -0
  1362. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.aar.sha1 +1 -0
  1363. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.aar.sha256 +1 -0
  1364. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.aar.sha512 +1 -0
  1365. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.module +272 -0
  1366. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.module.md5 +1 -0
  1367. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.module.sha1 +1 -0
  1368. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.module.sha256 +1 -0
  1369. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.module.sha512 +1 -0
  1370. package/android/com/facebook/react/react-native/{0.0.0-201c10733/react-native-0.0.0-201c10733.pom → 0.0.0-268efb102/react-native-0.0.0-268efb102.pom} +24 -13
  1371. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.pom.md5 +1 -0
  1372. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.pom.sha1 +1 -0
  1373. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.pom.sha256 +1 -0
  1374. package/android/com/facebook/react/react-native/0.0.0-268efb102/react-native-0.0.0-268efb102.pom.sha512 +1 -0
  1375. package/android/com/facebook/react/react-native/maven-metadata.xml +4 -3
  1376. package/android/com/facebook/react/react-native/maven-metadata.xml.md5 +1 -1
  1377. package/android/com/facebook/react/react-native/maven-metadata.xml.sha1 +1 -1
  1378. package/android/com/facebook/react/react-native/maven-metadata.xml.sha256 +1 -0
  1379. package/android/com/facebook/react/react-native/maven-metadata.xml.sha512 +1 -0
  1380. package/flow/HermesInternalType.js +114 -0
  1381. package/flow/global.js +68 -0
  1382. package/flow-typed/npm/react-test-renderer_v16.x.x.js +79 -0
  1383. package/index.js +122 -60
  1384. package/jest/preprocessor.js +75 -7
  1385. package/jest/renderer.js +3 -9
  1386. package/jest/setup.js +21 -15
  1387. package/package.json +61 -21
  1388. package/react.gradle +47 -25
  1389. package/scripts/find-node.sh +39 -0
  1390. package/scripts/generate-specs-cli.js +20 -2
  1391. package/scripts/ios-configure-glog.sh +4 -0
  1392. package/scripts/react-native-xcode.sh +7 -23
  1393. package/scripts/react_native_pods.rb +215 -47
  1394. package/template/_flowconfig +3 -4
  1395. package/template/_gitignore +1 -0
  1396. package/template/android/app/build.gradle +12 -7
  1397. package/template/android/app/src/main/res/values/styles.xml +0 -1
  1398. package/template/android/build.gradle +7 -8
  1399. package/template/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  1400. package/template/android/gradle.properties +1 -1
  1401. package/template/ios/HelloWorld.xcodeproj/project.pbxproj +2 -0
  1402. package/template/ios/Podfile +1 -0
  1403. package/template/package.json +4 -5
  1404. package/third-party-podspecs/DoubleConversion.podspec +1 -1
  1405. package/third-party-podspecs/RCT-Folly.podspec +31 -11
  1406. package/third-party-podspecs/boost.podspec +23 -0
  1407. package/third-party-podspecs/glog.podspec +1 -1
  1408. package/Libraries/BUCK +0 -56
  1409. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.android.js +0 -169
  1410. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.ios.js +0 -280
  1411. package/Libraries/Components/DatePickerAndroid/DatePickerAndroid.android.js +0 -89
  1412. package/Libraries/Components/DatePickerAndroid/DatePickerAndroid.ios.js +0 -30
  1413. package/Libraries/Components/DatePickerAndroid/DatePickerAndroidTypes.js +0 -30
  1414. package/Libraries/Components/Picker/AndroidDialogPickerNativeComponent.js +0 -82
  1415. package/Libraries/Components/Picker/AndroidDialogPickerViewConfig.js +0 -30
  1416. package/Libraries/Components/Picker/AndroidDropdownPickerNativeComponent.js +0 -69
  1417. package/Libraries/Components/Picker/Picker.js +0 -165
  1418. package/Libraries/Components/Picker/PickerAndroid.android.js +0 -145
  1419. package/Libraries/Components/Picker/PickerIOS.android.js +0 -14
  1420. package/Libraries/Components/Picker/PickerIOS.ios.js +0 -164
  1421. package/Libraries/Components/Picker/RCTPickerNativeComponent.js +0 -72
  1422. package/Libraries/Components/Picker/RCTPickerViewConfig.js +0 -41
  1423. package/Libraries/Components/ScrollResponder.js +0 -797
  1424. package/Libraries/Components/StaticContainer.react.js +0 -51
  1425. package/Libraries/Components/StatusBar/StatusBarIOS.js +0 -35
  1426. package/Libraries/Components/Touchable/ensurePositiveDelayProps.js +0 -26
  1427. package/Libraries/Interaction/InteractionMixin.js +0 -55
  1428. package/Libraries/ReactNative/queryLayoutByID.js +0 -58
  1429. package/Libraries/StyleSheet/StyleSheetValidation.js +0 -100
  1430. package/Libraries/Utilities/registerGeneratedViewConfig.js +0 -36
  1431. package/Libraries/promiseRejectionIsError.js +0 -24
  1432. package/React/Base/RCTJSInvokerModule.h +0 -18
  1433. package/React/Fabric/Mounting/ComponentViews/Picker/RCTPickerComponentView.h +0 -19
  1434. package/React/Fabric/Mounting/ComponentViews/Picker/RCTPickerComponentView.mm +0 -206
  1435. package/React/Views/RCTPicker.h +0 -23
  1436. package/React/Views/RCTPicker.m +0 -122
  1437. package/React/Views/RCTPickerManager.m +0 -68
  1438. package/ReactAndroid/release.gradle +0 -87
  1439. package/ReactAndroid/src/androidTest/java/com/facebook/react/tests/DatePickerDialogTestCase.java +0 -172
  1440. package/ReactAndroid/src/androidTest/java/com/facebook/react/tests/ReactPickerTestCase.java +0 -196
  1441. package/ReactAndroid/src/androidTest/js/DatePickerDialogTestModule.js +0 -45
  1442. package/ReactAndroid/src/androidTest/js/PickerAndroidTestModule.js +0 -89
  1443. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java +0 -82
  1444. package/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/BUCK +0 -27
  1445. package/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogFragment.java +0 -137
  1446. package/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DatePickerDialogModule.java +0 -147
  1447. package/ReactAndroid/src/main/java/com/facebook/react/modules/datepicker/DismissableDatePickerDialog.java +0 -117
  1448. package/ReactAndroid/src/main/java/com/facebook/react/viewmanagers/AndroidDialogPickerManagerDelegate.java +0 -48
  1449. package/ReactAndroid/src/main/java/com/facebook/react/viewmanagers/AndroidDialogPickerManagerInterface.java +0 -23
  1450. package/ReactAndroid/src/main/java/com/facebook/react/viewmanagers/AndroidDropdownPickerManagerDelegate.java +0 -48
  1451. package/ReactAndroid/src/main/java/com/facebook/react/viewmanagers/AndroidDropdownPickerManagerInterface.java +0 -22
  1452. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/BUCK +0 -30
  1453. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactDialogPickerManager.java +0 -51
  1454. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactDropdownPickerManager.java +0 -50
  1455. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPicker.java +0 -196
  1456. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPickerAdapter.java +0 -95
  1457. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPickerItem.java +0 -43
  1458. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/ReactPickerManager.java +0 -97
  1459. package/ReactAndroid/src/main/java/com/facebook/react/views/picker/events/PickerItemSelectEvent.java +0 -40
  1460. package/ReactCommon/cxxreact/re_worker_requirements +0 -6
  1461. package/ReactCommon/react/renderer/components/picker/Android.mk +0 -37
  1462. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerEventEmitter.cpp +0 -23
  1463. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerEventEmitter.h +0 -27
  1464. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerProps.cpp +0 -28
  1465. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerProps.h +0 -77
  1466. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDialogPickerShadowNode.h +0 -29
  1467. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerEventEmitter.cpp +0 -23
  1468. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerEventEmitter.h +0 -27
  1469. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerProps.cpp +0 -28
  1470. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerProps.h +0 -77
  1471. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerShadowNode.cpp +0 -17
  1472. package/ReactCommon/react/renderer/components/picker/androidpicker/react/renderer/components/androidpicker/AndroidDropdownPickerShadowNode.h +0 -29
  1473. package/ReactCommon/react/renderer/components/picker/iospicker/PickerComponentDescriptor.h +0 -26
  1474. package/ReactCommon/react/renderer/components/picker/iospicker/PickerEventEmitter.cpp +0 -23
  1475. package/ReactCommon/react/renderer/components/picker/iospicker/PickerProps.cpp +0 -46
  1476. package/ReactCommon/react/renderer/components/picker/iospicker/PickerProps.h +0 -36
  1477. package/ReactCommon/react/renderer/components/picker/iospicker/PickerShadowNode.h +0 -33
  1478. package/ReactCommon/react/renderer/components/picker/iospicker/conversions.h +0 -47
  1479. package/ReactCommon/react/renderer/mounting/TransactionTelemetry.cpp +0 -142
  1480. package/ReactCommon/react/renderer/mounting/tests/TransactionTelemetryTest.cpp +0 -125
  1481. package/android/com/facebook/react/react-native/0.0.0-201c10733/react-native-0.0.0-201c10733.aar +0 -0
  1482. package/android/com/facebook/react/react-native/0.0.0-201c10733/react-native-0.0.0-201c10733.aar.md5 +0 -1
  1483. package/android/com/facebook/react/react-native/0.0.0-201c10733/react-native-0.0.0-201c10733.aar.sha1 +0 -1
  1484. package/android/com/facebook/react/react-native/0.0.0-201c10733/react-native-0.0.0-201c10733.pom.md5 +0 -1
  1485. package/android/com/facebook/react/react-native/0.0.0-201c10733/react-native-0.0.0-201c10733.pom.sha1 +0 -1
  1486. package/scripts/generate-specs.sh +0 -91
@@ -8,22 +8,24 @@
8
8
  #include "LayoutAnimationKeyFrameManager.h"
9
9
 
10
10
  #include <algorithm>
11
- #include <chrono>
12
11
 
12
+ #include <react/debug/flags.h>
13
+ #include <react/debug/react_native_assert.h>
14
+
15
+ #include <logger/react_native_log.h>
16
+ #include <react/renderer/animations/conversions.h>
17
+ #include <react/renderer/animations/utils.h>
13
18
  #include <react/renderer/componentregistry/ComponentDescriptorFactory.h>
14
- #include <react/renderer/components/root/RootShadowNode.h>
19
+ #include <react/renderer/components/image/ImageProps.h>
15
20
  #include <react/renderer/components/view/ViewProps.h>
16
21
  #include <react/renderer/core/ComponentDescriptor.h>
17
22
  #include <react/renderer/core/LayoutMetrics.h>
18
- #include <react/renderer/core/LayoutableShadowNode.h>
19
23
  #include <react/renderer/core/Props.h>
24
+ #include <react/renderer/core/PropsParserContext.h>
20
25
  #include <react/renderer/core/RawValue.h>
21
26
  #include <react/renderer/mounting/MountingCoordinator.h>
22
- #include <react/renderer/mounting/ShadowViewMutation.h>
23
-
24
- #include <react/renderer/mounting/Differentiator.h>
25
- #include <react/renderer/mounting/ShadowTreeRevision.h>
26
27
  #include <react/renderer/mounting/ShadowView.h>
28
+ #include <react/renderer/mounting/ShadowViewMutation.h>
27
29
 
28
30
  #include <glog/logging.h>
29
31
 
@@ -57,9 +59,21 @@ static std::string GetMutationInstructionString(
57
59
  void PrintMutationInstruction(
58
60
  std::string message,
59
61
  ShadowViewMutation const &mutation) {
60
- LOG(ERROR) << message
61
- << " Mutation: " << GetMutationInstructionString(mutation);
62
+ [&](std::ostream &stream) -> std::ostream & {
63
+ stream << message
64
+ << " Mutation: " << GetMutationInstructionString(mutation);
65
+ if (mutation.oldChildShadowView.tag != 0) {
66
+ stream << " old hash: ##"
67
+ << std::hash<ShadowView>{}(mutation.oldChildShadowView);
68
+ }
69
+ if (mutation.newChildShadowView.tag != 0) {
70
+ stream << " new hash: ##"
71
+ << std::hash<ShadowView>{}(mutation.newChildShadowView);
72
+ }
73
+ return stream;
74
+ }(LOG(ERROR));
62
75
  }
76
+
63
77
  void PrintMutationInstructionRelative(
64
78
  std::string message,
65
79
  ShadowViewMutation const &mutation,
@@ -71,199 +85,27 @@ void PrintMutationInstructionRelative(
71
85
  }
72
86
  #endif
73
87
 
74
- static better::optional<AnimationType> parseAnimationType(std::string param) {
75
- if (param == "spring") {
76
- return AnimationType::Spring;
77
- }
78
- if (param == "linear") {
79
- return AnimationType::Linear;
80
- }
81
- if (param == "easeInEaseOut") {
82
- return AnimationType::EaseInEaseOut;
83
- }
84
- if (param == "easeIn") {
85
- return AnimationType::EaseIn;
86
- }
87
- if (param == "easeOut") {
88
- return AnimationType::EaseOut;
89
- }
90
- if (param == "keyboard") {
91
- return AnimationType::Keyboard;
92
- }
93
-
94
- LOG(ERROR) << "Error parsing animation type: " << param;
95
- return {};
96
- }
97
-
98
- static better::optional<AnimationProperty> parseAnimationProperty(
99
- std::string param) {
100
- if (param == "opacity") {
101
- return AnimationProperty::Opacity;
102
- }
103
- if (param == "scaleX") {
104
- return AnimationProperty::ScaleX;
105
- }
106
- if (param == "scaleY") {
107
- return AnimationProperty::ScaleY;
108
- }
109
- if (param == "scaleXY") {
110
- return AnimationProperty::ScaleXY;
111
- }
112
-
113
- LOG(ERROR) << "Error parsing animation property: " << param;
114
- return {};
115
- }
116
-
117
- static better::optional<AnimationConfig> parseAnimationConfig(
118
- folly::dynamic const &config,
119
- double defaultDuration,
120
- bool parsePropertyType) {
121
- if (config.empty() || !config.isObject()) {
122
- return AnimationConfig{
123
- AnimationType::Linear,
124
- AnimationProperty::NotApplicable,
125
- defaultDuration,
126
- 0,
127
- 0,
128
- 0};
129
- }
130
-
131
- auto const typeIt = config.find("type");
132
- if (typeIt == config.items().end()) {
133
- LOG(ERROR) << "Error parsing animation config: could not find field `type`";
134
- return {};
135
- }
136
- auto const animationTypeParam = typeIt->second;
137
- if (animationTypeParam.empty() || !animationTypeParam.isString()) {
138
- LOG(ERROR)
139
- << "Error parsing animation config: could not unwrap field `type`";
140
- return {};
141
- }
142
- const auto animationType = parseAnimationType(animationTypeParam.asString());
143
- if (!animationType) {
144
- LOG(ERROR)
145
- << "Error parsing animation config: could not parse field `type`";
146
- return {};
147
- }
148
-
149
- AnimationProperty animationProperty = AnimationProperty::NotApplicable;
150
- if (parsePropertyType) {
151
- auto const propertyIt = config.find("property");
152
- if (propertyIt == config.items().end()) {
153
- LOG(ERROR)
154
- << "Error parsing animation config: could not find field `property`";
155
- return {};
156
- }
157
- auto const animationPropertyParam = propertyIt->second;
158
- if (animationPropertyParam.empty() || !animationPropertyParam.isString()) {
159
- LOG(ERROR)
160
- << "Error parsing animation config: could not unwrap field `property`";
161
- return {};
162
- }
163
- const auto animationPropertyParsed =
164
- parseAnimationProperty(animationPropertyParam.asString());
165
- if (!animationPropertyParsed) {
166
- LOG(ERROR)
167
- << "Error parsing animation config: could not parse field `property`";
168
- return {};
169
- }
170
- animationProperty = *animationPropertyParsed;
171
- }
172
-
173
- double duration = defaultDuration;
174
- double delay = 0;
175
- double springDamping = 0.5;
176
- double initialVelocity = 0;
177
-
178
- auto const durationIt = config.find("duration");
179
- if (durationIt != config.items().end()) {
180
- if (durationIt->second.isDouble()) {
181
- duration = durationIt->second.asDouble();
182
- } else {
183
- LOG(ERROR)
184
- << "Error parsing animation config: field `duration` must be a number";
185
- return {};
186
- }
187
- }
188
-
189
- auto const delayIt = config.find("delay");
190
- if (delayIt != config.items().end()) {
191
- if (delayIt->second.isDouble()) {
192
- delay = delayIt->second.asDouble();
193
- } else {
194
- LOG(ERROR)
195
- << "Error parsing animation config: field `delay` must be a number";
196
- return {};
197
- }
198
- }
199
-
200
- auto const springDampingIt = config.find("springDamping");
201
- if (springDampingIt != config.items().end() &&
202
- springDampingIt->second.isDouble()) {
203
- if (springDampingIt->second.isDouble()) {
204
- springDamping = springDampingIt->second.asDouble();
205
- } else {
206
- LOG(ERROR)
207
- << "Error parsing animation config: field `springDamping` must be a number";
208
- return {};
209
- }
210
- }
211
-
212
- auto const initialVelocityIt = config.find("initialVelocity");
213
- if (initialVelocityIt != config.items().end()) {
214
- if (initialVelocityIt->second.isDouble()) {
215
- initialVelocity = initialVelocityIt->second.asDouble();
216
- } else {
217
- LOG(ERROR)
218
- << "Error parsing animation config: field `initialVelocity` must be a number";
219
- return {};
220
- }
221
- }
222
-
223
- return better::optional<AnimationConfig>(AnimationConfig{
224
- *animationType,
225
- animationProperty,
226
- duration,
227
- delay,
228
- springDamping,
229
- initialVelocity});
88
+ static inline float
89
+ interpolateFloats(float coefficient, float oldValue, float newValue) {
90
+ return oldValue + (newValue - oldValue) * coefficient;
230
91
  }
231
92
 
232
- // Parse animation config from JS
233
- static better::optional<LayoutAnimationConfig> parseLayoutAnimationConfig(
234
- folly::dynamic const &config) {
235
- if (config.empty() || !config.isObject()) {
236
- return {};
237
- }
238
-
239
- const auto durationIt = config.find("duration");
240
- if (durationIt == config.items().end() || !durationIt->second.isDouble()) {
241
- return {};
242
- }
243
- const double duration = durationIt->second.asDouble();
244
-
245
- const auto createConfigIt = config.find("create");
246
- const auto createConfig = createConfigIt == config.items().end()
247
- ? better::optional<AnimationConfig>(AnimationConfig{})
248
- : parseAnimationConfig(createConfigIt->second, duration, true);
249
-
250
- const auto updateConfigIt = config.find("update");
251
- const auto updateConfig = updateConfigIt == config.items().end()
252
- ? better::optional<AnimationConfig>(AnimationConfig{})
253
- : parseAnimationConfig(updateConfigIt->second, duration, false);
93
+ #pragma mark -
254
94
 
255
- const auto deleteConfigIt = config.find("delete");
256
- const auto deleteConfig = deleteConfigIt == config.items().end()
257
- ? better::optional<AnimationConfig>(AnimationConfig{})
258
- : parseAnimationConfig(deleteConfigIt->second, duration, true);
95
+ LayoutAnimationKeyFrameManager::LayoutAnimationKeyFrameManager(
96
+ RuntimeExecutor runtimeExecutor,
97
+ ContextContainer::Shared &contextContainer,
98
+ LayoutAnimationStatusDelegate *delegate)
99
+ : runtimeExecutor_(runtimeExecutor),
100
+ contextContainer_(contextContainer),
101
+ layoutAnimationStatusDelegate_(delegate),
102
+ now_([]() {
103
+ return std::chrono::duration_cast<std::chrono::milliseconds>(
104
+ std::chrono::high_resolution_clock::now().time_since_epoch())
105
+ .count();
106
+ }) {}
259
107
 
260
- if (!createConfig || !updateConfig || !deleteConfig) {
261
- return {};
262
- }
263
-
264
- return better::optional<LayoutAnimationConfig>(LayoutAnimationConfig{
265
- duration, *createConfig, *updateConfig, *deleteConfig});
266
- }
108
+ #pragma mark UIManagerAnimationDelegate methods
267
109
 
268
110
  /**
269
111
  * Globally configure next LayoutAnimation.
@@ -293,14 +135,14 @@ void LayoutAnimationKeyFrameManager::uiManagerDidConfigureNextLayoutAnimation(
293
135
  if (layoutAnimationConfig) {
294
136
  std::lock_guard<std::mutex> lock(currentAnimationMutex_);
295
137
 
296
- currentAnimation_ = better::optional<LayoutAnimation>{LayoutAnimation{
138
+ uiManagerDidConfigureNextLayoutAnimation(LayoutAnimation{
297
139
  -1,
298
140
  0,
299
141
  false,
300
142
  *layoutAnimationConfig,
301
143
  successCallback,
302
144
  failureCallback,
303
- {}}};
145
+ {}});
304
146
  } else {
305
147
  LOG(ERROR) << "Parsing LayoutAnimationConfig failed: "
306
148
  << (folly::dynamic)config;
@@ -309,19 +151,9 @@ void LayoutAnimationKeyFrameManager::uiManagerDidConfigureNextLayoutAnimation(
309
151
  }
310
152
  }
311
153
 
312
- void LayoutAnimationKeyFrameManager::setLayoutAnimationStatusDelegate(
313
- LayoutAnimationStatusDelegate *delegate) const {
314
- std::lock_guard<std::mutex> lock(layoutAnimationStatusDelegateMutex_);
315
- layoutAnimationStatusDelegate_ = delegate;
316
- }
317
-
318
- bool LayoutAnimationKeyFrameManager::shouldOverridePullTransaction() const {
319
- return shouldAnimateFrame();
320
- }
321
-
322
- void LayoutAnimationKeyFrameManager::stopSurface(SurfaceId surfaceId) {
323
- std::lock_guard<std::mutex> lock(surfaceIdsToStopMutex_);
324
- surfaceIdsToStop_.push_back(surfaceId);
154
+ void LayoutAnimationKeyFrameManager::setComponentDescriptorRegistry(
155
+ const SharedComponentDescriptorRegistry &componentDescriptorRegistry) {
156
+ componentDescriptorRegistry_ = componentDescriptorRegistry;
325
157
  }
326
158
 
327
159
  bool LayoutAnimationKeyFrameManager::shouldAnimateFrame() const {
@@ -329,573 +161,179 @@ bool LayoutAnimationKeyFrameManager::shouldAnimateFrame() const {
329
161
  return currentAnimation_ || !inflightAnimations_.empty();
330
162
  }
331
163
 
332
- static inline const float
333
- interpolateFloats(float coefficient, float oldValue, float newValue) {
334
- return oldValue + (newValue - oldValue) * coefficient;
164
+ void LayoutAnimationKeyFrameManager::stopSurface(SurfaceId surfaceId) {
165
+ std::lock_guard<std::mutex> lock(surfaceIdsToStopMutex_);
166
+ surfaceIdsToStop_.insert(surfaceId);
335
167
  }
336
168
 
337
- std::pair<double, double>
338
- LayoutAnimationKeyFrameManager::calculateAnimationProgress(
339
- uint64_t now,
340
- const LayoutAnimation &animation,
341
- const AnimationConfig &mutationConfig) const {
342
- if (mutationConfig.animationType == AnimationType::None) {
343
- return {1, 1};
344
- }
345
-
346
- uint64_t startTime = animation.startTime;
347
- uint64_t delay = mutationConfig.delay;
348
- uint64_t endTime = startTime + delay + mutationConfig.duration;
169
+ #pragma mark - MountingOverrideDelegate methods
349
170
 
350
- static const float PI = 3.14159265358979323846;
171
+ bool LayoutAnimationKeyFrameManager::shouldOverridePullTransaction() const {
172
+ return shouldAnimateFrame();
173
+ }
351
174
 
352
- if (now >= endTime) {
353
- return {1, 1};
354
- }
355
- if (now < startTime + delay) {
356
- return {0, 0};
357
- }
175
+ better::optional<MountingTransaction>
176
+ LayoutAnimationKeyFrameManager::pullTransaction(
177
+ SurfaceId surfaceId,
178
+ MountingTransaction::Number transactionNumber,
179
+ TransactionTelemetry const &telemetry,
180
+ ShadowViewMutationList mutations) const {
181
+ simulateImagePropsMemoryAccess(mutations);
182
+ // Current time in milliseconds
183
+ uint64_t now = now_();
358
184
 
359
- double linearTimeProgression = 1 -
360
- (double)(endTime - delay - now) / (double)(endTime - animation.startTime);
361
-
362
- if (mutationConfig.animationType == AnimationType::Linear) {
363
- return {linearTimeProgression, linearTimeProgression};
364
- } else if (mutationConfig.animationType == AnimationType::EaseIn) {
365
- // This is an accelerator-style interpolator.
366
- // In the future, this parameter (2.0) could be adjusted. This has been the
367
- // default for Classic RN forever.
368
- return {linearTimeProgression, pow(linearTimeProgression, 2.0)};
369
- } else if (mutationConfig.animationType == AnimationType::EaseOut) {
370
- // This is an decelerator-style interpolator.
371
- // In the future, this parameter (2.0) could be adjusted. This has been the
372
- // default for Classic RN forever.
373
- return {linearTimeProgression, 1.0 - pow(1 - linearTimeProgression, 2.0)};
374
- } else if (mutationConfig.animationType == AnimationType::EaseInEaseOut) {
375
- // This is a combination of accelerate+decelerate.
376
- // The animation starts and ends slowly, and speeds up in the middle.
377
- return {
378
- linearTimeProgression,
379
- cos((linearTimeProgression + 1.0) * PI) / 2 + 0.5};
380
- } else if (mutationConfig.animationType == AnimationType::Spring) {
381
- // Using mSpringDamping in this equation is not really the exact
382
- // mathematical springDamping, but a good approximation We need to replace
383
- // this equation with the right Factor that accounts for damping and
384
- // friction
385
- double damping = mutationConfig.springDamping;
386
- return {
387
- linearTimeProgression,
388
- (1 +
389
- pow(2, -10 * linearTimeProgression) *
390
- sin((linearTimeProgression - damping / 4) * PI * 2 / damping))};
391
- } else {
392
- return {linearTimeProgression, linearTimeProgression};
393
- }
394
- }
185
+ bool inflightAnimationsExistInitially = !inflightAnimations_.empty();
186
+ deleteAnimationsForStoppedSurfaces();
395
187
 
396
- void LayoutAnimationKeyFrameManager::
397
- adjustImmediateMutationIndicesForDelayedMutations(
398
- SurfaceId surfaceId,
399
- ShadowViewMutation &mutation,
400
- bool skipLastAnimation,
401
- bool lastAnimationOnly) const {
402
- bool isRemoveMutation = mutation.type == ShadowViewMutation::Type::Remove;
403
- assert(isRemoveMutation || mutation.type == ShadowViewMutation::Type::Insert);
188
+ if (!mutations.empty()) {
189
+ #ifdef RN_SHADOW_TREE_INTROSPECTION
190
+ {
191
+ std::stringstream ss(getDebugDescription(mutations, {}));
192
+ std::string to;
193
+ while (std::getline(ss, to, '\n')) {
194
+ LOG(ERROR)
195
+ << "LayoutAnimationKeyFrameManager.cpp: got mutation list: Line: "
196
+ << to;
197
+ }
198
+ };
199
+ #endif
404
200
 
405
- // TODO: turn all of this into a lambda and share code?
406
- if (mutatedViewIsVirtual(mutation)) {
407
- PrintMutationInstruction(
408
- "[IndexAdjustment] Not calling adjustImmediateMutationIndicesForDelayedMutations, is virtual, for:",
409
- mutation);
410
- return;
411
- }
201
+ // DEBUG ONLY: list existing inflight animations
202
+ #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
203
+ LOG(ERROR) << "BEGINNING DISPLAYING ONGOING inflightAnimations_!";
204
+ int i = 0;
205
+ int j = 0;
206
+ for (auto const &inflightAnimation : inflightAnimations_) {
207
+ i++;
208
+ j = 0;
209
+ if (inflightAnimation.completed) {
210
+ continue;
211
+ }
212
+ for (auto &keyframe : inflightAnimation.keyFrames) {
213
+ j++;
214
+ if (keyframe.invalidated) {
215
+ continue;
216
+ }
217
+ for (const auto &finalMutationForKeyFrame :
218
+ keyframe.finalMutationsForKeyFrame) {
219
+ if (finalMutationForKeyFrame.mutatedViewIsVirtual()) {
220
+ std::string msg = "Animation " + std::to_string(i) + " keyframe " +
221
+ std::to_string(j) + ": Final Animation";
222
+ PrintMutationInstruction(msg, finalMutationForKeyFrame);
223
+ } else {
224
+ LOG(ERROR) << "Animation " << i << " keyframe " << j
225
+ << ": on tag: [" << keyframe.viewStart.tag << "]";
226
+ }
227
+ }
228
+ }
229
+ }
230
+ LOG(ERROR) << "BEGINNING DONE DISPLAYING ONGOING inflightAnimations_!";
231
+ #endif
412
232
 
413
- PrintMutationInstruction(
414
- "[IndexAdjustment] Calling adjustImmediateMutationIndicesForDelayedMutations for:",
415
- mutation);
233
+ PropsParserContext propsParserContext{surfaceId, *contextContainer_};
416
234
 
417
- // First, collect all final mutations that could impact this immediate
418
- // mutation.
419
- std::vector<ShadowViewMutation *> candidateMutations{};
235
+ // What to do if we detect a conflict? Get current value and make
236
+ // that the baseline of the next animation. Scale the remaining time
237
+ // in the animation
238
+ // Types of conflicts and how we handle them:
239
+ // Update -> update: remove the previous update, make it the baseline of the
240
+ // next update (with current progress) Update -> remove: same, with final
241
+ // mutation being a remove Insert -> update: treat as update->update Insert
242
+ // -> remove: same, as update->remove Remove -> update/insert: not possible
243
+ // We just collect pairs here of <Mutation, AnimationConfig> and delete them
244
+ // from active animations. If another animation is queued up from the
245
+ // current mutations then these deleted mutations will serve as the baseline
246
+ // for the next animation. If not, the current mutations are executed
247
+ // immediately without issues.
248
+ std::vector<AnimationKeyFrame> conflictingAnimations{};
249
+ getAndEraseConflictingAnimations(
250
+ surfaceId, mutations, conflictingAnimations);
420
251
 
421
- for (auto inflightAnimationIt =
422
- inflightAnimations_.rbegin() + (skipLastAnimation ? 1 : 0);
423
- inflightAnimationIt != inflightAnimations_.rend();
424
- inflightAnimationIt++) {
425
- auto &inflightAnimation = *inflightAnimationIt;
426
- if (inflightAnimation.surfaceId != surfaceId) {
427
- continue;
428
- }
429
- if (inflightAnimation.completed) {
430
- continue;
252
+ // Are we animating this list of mutations?
253
+ better::optional<LayoutAnimation> currentAnimation{};
254
+ {
255
+ std::lock_guard<std::mutex> lock(currentAnimationMutex_);
256
+ if (currentAnimation_) {
257
+ currentAnimation = std::move(currentAnimation_);
258
+ currentAnimation_.reset();
259
+ }
431
260
  }
432
261
 
433
- for (auto it = inflightAnimation.keyFrames.begin();
434
- it != inflightAnimation.keyFrames.end();
435
- it++) {
436
- auto &animatedKeyFrame = *it;
262
+ if (currentAnimation.hasValue()) {
263
+ LayoutAnimation animation = std::move(currentAnimation).value();
264
+ animation.surfaceId = surfaceId;
265
+ animation.startTime = now;
437
266
 
438
- if (animatedKeyFrame.invalidated) {
439
- continue;
267
+ // Pre-process list to:
268
+ // Catch remove+reinsert (reorders)
269
+ // Catch delete+create (reparenting) (this should be optimized away at
270
+ // the diffing level eventually?)
271
+ // TODO: to prevent this step we could tag Remove/Insert mutations as
272
+ // being moves on the Differ level, since we know that there? We could use
273
+ // TinyMap here, but it's not exposed by Differentiator (yet).
274
+ better::set<Tag> insertedTags;
275
+ better::set<Tag> deletedTags;
276
+ better::set<Tag> reparentedTags; // tags that are deleted and recreated
277
+ std::unordered_map<Tag, ShadowViewMutation> movedTags;
278
+ for (const auto &mutation : mutations) {
279
+ if (mutation.type == ShadowViewMutation::Type::Insert) {
280
+ insertedTags.insert(mutation.newChildShadowView.tag);
281
+ }
282
+ if (mutation.type == ShadowViewMutation::Type::Delete) {
283
+ deletedTags.insert(mutation.oldChildShadowView.tag);
284
+ }
285
+ if (mutation.type == ShadowViewMutation::Type::Create) {
286
+ if (deletedTags.find(mutation.newChildShadowView.tag) !=
287
+ deletedTags.end()) {
288
+ reparentedTags.insert(mutation.newChildShadowView.tag);
289
+ }
290
+ }
440
291
  }
441
292
 
442
- // Detect if they're in the same view hierarchy, but not equivalent
443
- // (We've already detected direct conflicts and handled them above)
444
- if (animatedKeyFrame.parentView.tag != mutation.parentShadowView.tag) {
445
- continue;
446
- }
293
+ // Process mutations list into operations that can be sent to platform
294
+ // immediately, and those that need to be animated Deletions, removals,
295
+ // updates are delayed and animated. Creations and insertions are sent to
296
+ // platform and then "animated in" with opacity updates. Upon completion,
297
+ // removals and deletions are sent to platform
298
+ ShadowViewMutation::List immediateMutations;
447
299
 
448
- if (!animatedKeyFrame.finalMutationForKeyFrame.has_value()) {
449
- continue;
450
- }
300
+ // Remove operations that are actually moves should be copied to
301
+ // "immediate mutations". The corresponding "insert" will also be executed
302
+ // immediately and animated as an update.
303
+ std::vector<AnimationKeyFrame> keyFramesToAnimate;
304
+ auto const layoutAnimationConfig = animation.layoutAnimationConfig;
305
+ for (auto const &mutation : mutations) {
306
+ ShadowView baselineShadowView =
307
+ (mutation.type == ShadowViewMutation::Type::Delete ||
308
+ mutation.type == ShadowViewMutation::Type::Remove ||
309
+ mutation.type == ShadowViewMutation::Type::Update
310
+ ? mutation.oldChildShadowView
311
+ : mutation.newChildShadowView);
312
+ react_native_assert(baselineShadowView.tag > 0);
313
+ bool haveComponentDescriptor =
314
+ hasComponentDescriptorForShadowView(baselineShadowView);
451
315
 
452
- auto &delayedMutation = *animatedKeyFrame.finalMutationForKeyFrame;
316
+ // Immediately execute any mutations on a root node
317
+ if (baselineShadowView.traits.check(
318
+ ShadowNodeTraits::Trait::RootNodeKind)) {
319
+ immediateMutations.push_back(mutation);
320
+ continue;
321
+ }
453
322
 
454
- if (delayedMutation.type != ShadowViewMutation::Type::Remove) {
455
- continue;
456
- }
457
- if (mutatedViewIsVirtual(delayedMutation)) {
458
- continue;
459
- }
460
- if (delayedMutation.oldChildShadowView.tag ==
461
- (isRemoveMutation ? mutation.oldChildShadowView.tag
462
- : mutation.newChildShadowView.tag)) {
463
- continue;
464
- }
323
+ better::optional<ShadowViewMutation> executeMutationImmediately{};
465
324
 
466
- PrintMutationInstructionRelative(
467
- "[IndexAdjustment] adjustImmediateMutationIndicesForDelayedMutations CANDIDATE for:",
468
- mutation,
469
- delayedMutation);
470
- candidateMutations.push_back(&delayedMutation);
471
- }
472
-
473
- if (lastAnimationOnly) {
474
- break;
475
- }
476
- }
477
-
478
- // While the mutation keeps being affected, keep checking. We use the vector
479
- // so we only perform one adjustment per delayed mutation. See comments at
480
- // bottom of adjustDelayedMutationIndicesForMutation for further explanation.
481
- bool changed = true;
482
- int adjustedDelta = 0;
483
- while (changed) {
484
- changed = false;
485
- candidateMutations.erase(
486
- std::remove_if(
487
- candidateMutations.begin(),
488
- candidateMutations.end(),
489
- [&changed, &mutation, &adjustedDelta, &isRemoveMutation](
490
- ShadowViewMutation *candidateMutation) {
491
- bool indexConflicts =
492
- (candidateMutation->index < mutation.index ||
493
- (isRemoveMutation &&
494
- candidateMutation->index == mutation.index));
495
- if (indexConflicts) {
496
- mutation.index++;
497
- adjustedDelta++;
498
- changed = true;
499
- PrintMutationInstructionRelative(
500
- "[IndexAdjustment] adjustImmediateMutationIndicesForDelayedMutations: Adjusting mutation UPWARD",
501
- mutation,
502
- *candidateMutation);
503
- return true;
504
- }
505
- return false;
506
- }),
507
- candidateMutations.end());
508
- }
509
- }
510
-
511
- void LayoutAnimationKeyFrameManager::adjustDelayedMutationIndicesForMutation(
512
- SurfaceId surfaceId,
513
- ShadowViewMutation const &mutation,
514
- bool skipLastAnimation) const {
515
- bool isRemoveMutation = mutation.type == ShadowViewMutation::Type::Remove;
516
- bool isInsertMutation = mutation.type == ShadowViewMutation::Type::Insert;
517
- assert(isRemoveMutation || isInsertMutation);
518
-
519
- if (mutatedViewIsVirtual(mutation)) {
520
- PrintMutationInstruction(
521
- "[IndexAdjustment] Not calling adjustDelayedMutationIndicesForMutation, is virtual, for:",
522
- mutation);
523
- return;
524
- }
525
-
526
- // First, collect all final mutations that could impact this immediate
527
- // mutation.
528
- std::vector<ShadowViewMutation *> candidateMutations{};
529
-
530
- for (auto inflightAnimationIt =
531
- inflightAnimations_.rbegin() + (skipLastAnimation ? 1 : 0);
532
- inflightAnimationIt != inflightAnimations_.rend();
533
- inflightAnimationIt++) {
534
- auto &inflightAnimation = *inflightAnimationIt;
535
-
536
- if (inflightAnimation.surfaceId != surfaceId) {
537
- continue;
538
- }
539
- if (inflightAnimation.completed) {
540
- continue;
541
- }
542
-
543
- for (auto it = inflightAnimation.keyFrames.begin();
544
- it != inflightAnimation.keyFrames.end();
545
- it++) {
546
- auto &animatedKeyFrame = *it;
547
-
548
- if (animatedKeyFrame.invalidated) {
549
- continue;
550
- }
551
-
552
- // Detect if they're in the same view hierarchy, but not equivalent
553
- // (We've already detected direct conflicts and handled them above)
554
- if (animatedKeyFrame.parentView.tag != mutation.parentShadowView.tag) {
555
- continue;
556
- }
557
-
558
- if (!animatedKeyFrame.finalMutationForKeyFrame.has_value()) {
559
- continue;
560
- }
561
- ShadowViewMutation &finalAnimationMutation =
562
- *animatedKeyFrame.finalMutationForKeyFrame;
563
-
564
- if (finalAnimationMutation.oldChildShadowView.tag ==
565
- (isRemoveMutation ? mutation.oldChildShadowView.tag
566
- : mutation.newChildShadowView.tag)) {
567
- continue;
568
- }
569
-
570
- if (finalAnimationMutation.type != ShadowViewMutation::Type::Remove) {
571
- continue;
572
- }
573
- if (mutatedViewIsVirtual(*animatedKeyFrame.finalMutationForKeyFrame)) {
574
- continue;
575
- }
576
-
577
- PrintMutationInstructionRelative(
578
- "[IndexAdjustment] adjustDelayedMutationIndicesForMutation: CANDIDATE:",
579
- mutation,
580
- *animatedKeyFrame.finalMutationForKeyFrame);
581
- candidateMutations.push_back(
582
- animatedKeyFrame.finalMutationForKeyFrame.get_pointer());
583
- }
584
- }
585
-
586
- // Because the finalAnimations are not sorted in any way, it is possible to
587
- // have some sequence like:
588
- // * DELAYED REMOVE 10 from {TAG}
589
- // * DELAYED REMOVE 9 from {TAG}
590
- // * ...
591
- // * DELAYED REMOVE 5 from {TAG}
592
- // with mutation: INSERT 6/REMOVE 6. This would cause the first few mutations
593
- // to *not* be adjusted, even though they would be impacted by mutation or
594
- // vice-versa after later adjustments are applied. Therefore, we just keep
595
- // recursing while there are any changes. This isn't great, but is good enough
596
- // for now until we change these data-structures.
597
- bool changed = true;
598
- while (changed) {
599
- changed = false;
600
- candidateMutations.erase(
601
- std::remove_if(
602
- candidateMutations.begin(),
603
- candidateMutations.end(),
604
- [&mutation, &isRemoveMutation, &isInsertMutation, &changed](
605
- ShadowViewMutation *candidateMutation) {
606
- if (isRemoveMutation &&
607
- mutation.index <= candidateMutation->index) {
608
- candidateMutation->index--;
609
- changed = true;
610
- PrintMutationInstructionRelative(
611
- "[IndexAdjustment] adjustDelayedMutationIndicesForMutation: Adjusting mutation DOWNWARD",
612
- mutation,
613
- *candidateMutation);
614
- return true;
615
- } else if (
616
- isInsertMutation &&
617
- mutation.index <= candidateMutation->index) {
618
- candidateMutation->index++;
619
- changed = true;
620
- PrintMutationInstructionRelative(
621
- "[IndexAdjustment] adjustDelayedMutationIndicesForMutation: Adjusting mutation UPWARD",
622
- mutation,
623
- *candidateMutation);
624
- return true;
625
- }
626
- return false;
627
- }),
628
- candidateMutations.end());
629
- }
630
- }
631
-
632
- std::vector<AnimationKeyFrame>
633
- LayoutAnimationKeyFrameManager::getAndEraseConflictingAnimations(
634
- SurfaceId surfaceId,
635
- ShadowViewMutationList const &mutations,
636
- bool deletesOnly) const {
637
- std::vector<AnimationKeyFrame> conflictingAnimations{};
638
-
639
- for (auto const &mutation : mutations) {
640
- if (deletesOnly && mutation.type != ShadowViewMutation::Type::Delete) {
641
- continue;
642
- }
643
-
644
- auto const &baselineShadowView =
645
- (mutation.type == ShadowViewMutation::Type::Insert ||
646
- mutation.type == ShadowViewMutation::Type::Create)
647
- ? mutation.newChildShadowView
648
- : mutation.oldChildShadowView;
649
-
650
- for (auto &inflightAnimation : inflightAnimations_) {
651
- if (inflightAnimation.surfaceId != surfaceId) {
652
- continue;
653
- }
654
- if (inflightAnimation.completed) {
655
- continue;
656
- }
657
-
658
- for (auto it = inflightAnimation.keyFrames.begin();
659
- it != inflightAnimation.keyFrames.end();) {
660
- auto &animatedKeyFrame = *it;
661
-
662
- if (animatedKeyFrame.invalidated) {
663
- continue;
664
- }
665
-
666
- bool conflicting = animatedKeyFrame.tag == baselineShadowView.tag ||
667
- ((mutation.type == ShadowViewMutation::Type::Delete ||
668
- mutation.type == ShadowViewMutation::Type::Create) &&
669
- animatedKeyFrame.parentView.tag == baselineShadowView.tag);
670
-
671
- // Conflicting animation detected: if we're mutating a tag under
672
- // animation, or deleting the parent of a tag under animation, or
673
- // reparenting.
674
- if (conflicting) {
675
- animatedKeyFrame.invalidated = true;
676
-
677
- // We construct a list of all conflicting animations, whether or not
678
- // they have a "final mutation" to execute. This is important with,
679
- // for example, "insert" mutations where the final update needs to set
680
- // opacity to "1", even if there's no final ShadowNode update.
681
- if (!(animatedKeyFrame.finalMutationForKeyFrame.has_value() &&
682
- mutatedViewIsVirtual(
683
- *animatedKeyFrame.finalMutationForKeyFrame))) {
684
- conflictingAnimations.push_back(animatedKeyFrame);
685
- }
686
-
687
- #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
688
- if (animatedKeyFrame.finalMutationForKeyFrame.has_value()) {
689
- PrintMutationInstructionRelative(
690
- "Found mutation that conflicts with existing in-flight animation:",
691
- mutation,
692
- *animatedKeyFrame.finalMutationForKeyFrame);
693
- } else {
694
- PrintMutationInstruction(
695
- "Found mutation that conflicts with existing in-flight animation (no final mutation):",
696
- mutation);
697
- }
698
- #endif
699
-
700
- // Delete from existing animation
701
- it = inflightAnimation.keyFrames.erase(it);
702
- } else {
703
- it++;
704
- }
705
- }
706
- }
707
- }
708
-
709
- return conflictingAnimations;
710
- }
711
-
712
- better::optional<MountingTransaction>
713
- LayoutAnimationKeyFrameManager::pullTransaction(
714
- SurfaceId surfaceId,
715
- MountingTransaction::Number transactionNumber,
716
- TransactionTelemetry const &telemetry,
717
- ShadowViewMutationList mutations) const {
718
- // Current time in milliseconds
719
- uint64_t now =
720
- std::chrono::duration_cast<std::chrono::milliseconds>(
721
- std::chrono::high_resolution_clock::now().time_since_epoch())
722
- .count();
723
-
724
- bool inflightAnimationsExistInitially = !inflightAnimations_.empty();
725
-
726
- // Execute stopSurface on any ongoing animations
727
- if (inflightAnimationsExistInitially) {
728
- std::vector<SurfaceId> surfaceIdsToStop{};
729
- {
730
- std::lock_guard<std::mutex> lock(surfaceIdsToStopMutex_);
731
- surfaceIdsToStop = surfaceIdsToStop_;
732
- surfaceIdsToStop_ = {};
733
- }
734
-
735
- for (auto it = inflightAnimations_.begin();
736
- it != inflightAnimations_.end();) {
737
- const auto &animation = *it;
738
-
739
- if (std::find(
740
- surfaceIdsToStop.begin(),
741
- surfaceIdsToStop.end(),
742
- animation.surfaceId) != surfaceIdsToStop.end()) {
743
- #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
744
- LOG(ERROR)
745
- << "LayoutAnimations: stopping animation due to stopSurface on "
746
- << surfaceId;
747
- #endif
748
- it = inflightAnimations_.erase(it);
749
- } else {
750
- it++;
751
- }
752
- }
753
- }
754
-
755
- if (!mutations.empty()) {
756
- #ifdef RN_SHADOW_TREE_INTROSPECTION
757
- {
758
- std::stringstream ss(getDebugDescription(mutations, {}));
759
- std::string to;
760
- while (std::getline(ss, to, '\n')) {
761
- LOG(ERROR)
762
- << "LayoutAnimationKeyFrameManager.cpp: got mutation list: Line: "
763
- << to;
764
- }
765
- };
766
- #endif
767
-
768
- // DEBUG ONLY: list existing inflight animations
769
- #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
770
- LOG(ERROR) << "BEGINNING DISPLAYING ONGOING inflightAnimations_!";
771
- int i = 0;
772
- int j = 0;
773
- for (auto const &inflightAnimation : inflightAnimations_) {
774
- i++;
775
- j = 0;
776
- if (inflightAnimation.completed) {
777
- continue;
778
- }
779
- for (auto &keyframe : inflightAnimation.keyFrames) {
780
- j++;
781
- if (keyframe.invalidated) {
782
- continue;
783
- }
784
- if (keyframe.finalMutationForKeyFrame &&
785
- !mutatedViewIsVirtual(*keyframe.finalMutationForKeyFrame)) {
786
- std::string msg = "Animation " + std::to_string(i) + " keyframe " +
787
- std::to_string(j) + ": Final Animation";
788
- PrintMutationInstruction(msg, *keyframe.finalMutationForKeyFrame);
789
- } else {
790
- LOG(ERROR) << "Animation " << i << " keyframe " << j << ": on tag: ["
791
- << keyframe.viewStart.tag << "]";
792
- }
793
- }
794
- }
795
- LOG(ERROR) << "BEGINNING DONE DISPLAYING ONGOING inflightAnimations_!";
796
- #endif
797
-
798
- // What to do if we detect a conflict? Get current value and make
799
- // that the baseline of the next animation. Scale the remaining time
800
- // in the animation
801
- // Types of conflicts and how we handle them:
802
- // Update -> update: remove the previous update, make it the baseline of the
803
- // next update (with current progress) Update -> remove: same, with final
804
- // mutation being a remove Insert -> update: treat as update->update Insert
805
- // -> remove: same, as update->remove Remove -> update/insert: not possible
806
- // We just collect pairs here of <Mutation, AnimationConfig> and delete them
807
- // from active animations. If another animation is queued up from the
808
- // current mutations then these deleted mutations will serve as the baseline
809
- // for the next animation. If not, the current mutations are executed
810
- // immediately without issues.
811
- auto conflictingAnimations =
812
- getAndEraseConflictingAnimations(surfaceId, mutations);
813
-
814
- // Are we animating this list of mutations?
815
- better::optional<LayoutAnimation> currentAnimation{};
816
- {
817
- std::lock_guard<std::mutex> lock(currentAnimationMutex_);
818
- if (currentAnimation_) {
819
- currentAnimation = std::move(currentAnimation_);
820
- currentAnimation_ = {};
821
- }
822
- }
823
-
824
- if (currentAnimation) {
825
- LayoutAnimation animation = std::move(currentAnimation.value());
826
- currentAnimation = {};
827
- animation.surfaceId = surfaceId;
828
- animation.startTime = now;
829
-
830
- // Pre-process list to:
831
- // Catch remove+reinsert (reorders)
832
- // Catch delete+create (reparenting) (this should be optimized away at
833
- // the diffing level eventually?)
834
- // TODO: to prevent this step we could tag Remove/Insert mutations as
835
- // being moves on the Differ level, since we know that there? We could use
836
- // TinyMap here, but it's not exposed by Differentiator (yet).
837
- std::vector<Tag> insertedTags;
838
- std::vector<Tag> deletedTags;
839
- std::vector<Tag> reparentedTags; // tags that are deleted and recreated
840
- std::unordered_map<Tag, ShadowViewMutation> movedTags;
841
- for (const auto &mutation : mutations) {
842
- if (mutation.type == ShadowViewMutation::Type::Insert) {
843
- insertedTags.push_back(mutation.newChildShadowView.tag);
844
- }
845
- if (mutation.type == ShadowViewMutation::Type::Delete) {
846
- deletedTags.push_back(mutation.oldChildShadowView.tag);
847
- }
848
- if (mutation.type == ShadowViewMutation::Type::Create) {
849
- if (std::find(
850
- deletedTags.begin(),
851
- deletedTags.end(),
852
- mutation.newChildShadowView.tag) != deletedTags.end()) {
853
- reparentedTags.push_back(mutation.newChildShadowView.tag);
854
- }
855
- }
856
- }
857
-
858
- // Process mutations list into operations that can be sent to platform
859
- // immediately, and those that need to be animated Deletions, removals,
860
- // updates are delayed and animated. Creations and insertions are sent to
861
- // platform and then "animated in" with opacity updates. Upon completion,
862
- // removals and deletions are sent to platform
863
- ShadowViewMutation::List immediateMutations;
864
-
865
- // Remove operations that are actually moves should be copied to
866
- // "immediate mutations". The corresponding "insert" will also be executed
867
- // immediately and animated as an update.
868
- std::vector<AnimationKeyFrame> keyFramesToAnimate;
869
- std::vector<AnimationKeyFrame> movesToAnimate;
870
- auto const layoutAnimationConfig = animation.layoutAnimationConfig;
871
- for (auto const &mutation : mutations) {
872
- ShadowView baselineShadowView =
873
- (mutation.type == ShadowViewMutation::Type::Delete ||
874
- mutation.type == ShadowViewMutation::Type::Remove ||
875
- mutation.type == ShadowViewMutation::Type::Update
876
- ? mutation.oldChildShadowView
877
- : mutation.newChildShadowView);
878
- bool haveComponentDescriptor =
879
- hasComponentDescriptorForShadowView(baselineShadowView);
880
-
881
- bool executeMutationImmediately = false;
882
-
883
- bool isRemoveReinserted =
884
- mutation.type == ShadowViewMutation::Type::Remove &&
885
- std::find(
886
- insertedTags.begin(),
887
- insertedTags.end(),
888
- mutation.oldChildShadowView.tag) != insertedTags.end();
325
+ bool isRemoveReinserted =
326
+ mutation.type == ShadowViewMutation::Type::Remove &&
327
+ insertedTags.find(mutation.oldChildShadowView.tag) !=
328
+ insertedTags.end();
889
329
 
890
330
  // Reparenting can result in a node being removed, inserted (moved) and
891
331
  // also deleted and created in the same frame, with the same props etc.
892
332
  // This should eventually be optimized out of the diffing algorithm, but
893
333
  // for now we detect reparenting and prevent the corresponding
894
334
  // Delete/Create instructions from being animated.
895
- bool isReparented = std::find(
896
- reparentedTags.begin(),
897
- reparentedTags.end(),
898
- baselineShadowView.tag) != reparentedTags.end();
335
+ bool isReparented =
336
+ reparentedTags.find(baselineShadowView.tag) != reparentedTags.end();
899
337
 
900
338
  if (isRemoveReinserted) {
901
339
  movedTags.insert({mutation.oldChildShadowView.tag, mutation});
@@ -928,23 +366,13 @@ LayoutAnimationKeyFrameManager::pullTransaction(
928
366
  bool haveConfiguration =
929
367
  mutationConfig.animationType != AnimationType::None;
930
368
 
931
- if (wasInsertedTagRemoved && haveConfiguration) {
932
- movesToAnimate.push_back(AnimationKeyFrame{
933
- {},
934
- AnimationConfigurationType::Update,
935
- mutation.newChildShadowView.tag,
936
- mutation.parentShadowView,
937
- movedIt->second.oldChildShadowView,
938
- mutation.newChildShadowView});
939
- }
940
-
941
369
  // Creates and inserts should also be executed immediately.
942
370
  // Mutations that would otherwise be animated, but have no
943
371
  // configuration, are also executed immediately.
944
372
  if (isRemoveReinserted || !haveConfiguration || isReparented ||
945
373
  mutation.type == ShadowViewMutation::Type::Create ||
946
374
  mutation.type == ShadowViewMutation::Type::Insert) {
947
- executeMutationImmediately = true;
375
+ executeMutationImmediately = mutation;
948
376
 
949
377
  // It is possible, especially in the case of "moves", that we have a
950
378
  // sequence of operations like:
@@ -963,11 +391,49 @@ LayoutAnimationKeyFrameManager::pullTransaction(
963
391
  // If there's already an animation queued up, followed by this
964
392
  // Insert, it *must* be an Update mutation animation. Other
965
393
  // sequences should not be possible.
966
- assert(keyframe.type == AnimationConfigurationType::Update);
967
-
968
- keyframe.viewPrev = mutation.newChildShadowView.tag != 0
969
- ? mutation.newChildShadowView
970
- : mutation.oldChildShadowView;
394
+ react_native_assert(
395
+ keyframe.type == AnimationConfigurationType::Update);
396
+
397
+ // The mutation is an "insert", so it must have a
398
+ // "newChildShadowView"
399
+ react_native_assert(mutation.newChildShadowView.tag > 0);
400
+
401
+ // Those asserts don't run in prod. If there's some edge-case
402
+ // that we haven't caught yet, we'd crash in debug; make sure we
403
+ // don't mutate the prevView in prod.
404
+ if (keyframe.type == AnimationConfigurationType::Update &&
405
+ mutation.newChildShadowView.tag > 0) {
406
+ keyframe.viewPrev = mutation.newChildShadowView;
407
+ }
408
+ }
409
+ }
410
+ } else if (mutation.type == ShadowViewMutation::Type::Remove) {
411
+ for (auto &keyframe : keyFramesToAnimate) {
412
+ if (keyframe.tag == baselineShadowView.tag) {
413
+ // If there's already an animation queued up, followed by this
414
+ // Insert, it *must* be an Update mutation animation. Other
415
+ // sequences should not be possible.
416
+ react_native_assert(
417
+ keyframe.type == AnimationConfigurationType::Update);
418
+
419
+ // The mutation is a "remove", so it must have a
420
+ // "oldChildShadowView"
421
+ react_native_assert(mutation.oldChildShadowView.tag > 0);
422
+
423
+ // Those asserts don't run in prod. If there's some edge-case
424
+ // that we haven't caught yet, we'd crash in debug; make sure we
425
+ // don't mutate the prevView in prod.
426
+ // Since normally the UPDATE would have been executed first and
427
+ // now it's deferred, we need to change the `oldChildShadowView`
428
+ // that is being referenced by the REMOVE mutation.
429
+ if (keyframe.type == AnimationConfigurationType::Update &&
430
+ mutation.oldChildShadowView.tag > 0) {
431
+ executeMutationImmediately =
432
+ ShadowViewMutation::RemoveMutation(
433
+ mutation.parentShadowView,
434
+ keyframe.viewPrev,
435
+ mutation.index);
436
+ }
971
437
  }
972
438
  }
973
439
  }
@@ -981,11 +447,17 @@ LayoutAnimationKeyFrameManager::pullTransaction(
981
447
  mutation.type == ShadowViewMutation::Type::Insert
982
448
  ? mutation.newChildShadowView
983
449
  : mutation.oldChildShadowView);
450
+ react_native_assert(viewStart.tag > 0);
984
451
  ShadowView viewFinal = ShadowView(
985
452
  mutation.type == ShadowViewMutation::Type::Update
986
453
  ? mutation.newChildShadowView
987
454
  : viewStart);
455
+ react_native_assert(viewFinal.tag > 0);
988
456
  ShadowView parent = mutation.parentShadowView;
457
+ react_native_assert(
458
+ parent.tag > 0 ||
459
+ mutation.type == ShadowViewMutation::Type::Update ||
460
+ mutation.type == ShadowViewMutation::Type::Delete);
989
461
  Tag tag = viewStart.tag;
990
462
 
991
463
  AnimationKeyFrame keyFrame{};
@@ -995,55 +467,19 @@ LayoutAnimationKeyFrameManager::pullTransaction(
995
467
  haveComponentDescriptor) {
996
468
  auto props =
997
469
  getComponentDescriptorForShadowView(baselineShadowView)
998
- .cloneProps(viewStart.props, {});
999
- const auto viewProps =
1000
- dynamic_cast<const ViewProps *>(props.get());
1001
- if (viewProps != nullptr) {
1002
- const_cast<ViewProps *>(viewProps)->opacity = 0;
1003
- }
1004
- viewStart.props = props;
1005
- }
1006
- bool isScaleX =
1007
- mutationConfig.animationProperty == AnimationProperty::ScaleX ||
1008
- mutationConfig.animationProperty == AnimationProperty::ScaleXY;
1009
- bool isScaleY =
1010
- mutationConfig.animationProperty == AnimationProperty::ScaleY ||
1011
- mutationConfig.animationProperty == AnimationProperty::ScaleXY;
1012
- if ((isScaleX || isScaleY) && haveComponentDescriptor) {
1013
- auto props =
1014
- getComponentDescriptorForShadowView(baselineShadowView)
1015
- .cloneProps(viewStart.props, {});
1016
- const auto viewProps =
1017
- dynamic_cast<const ViewProps *>(props.get());
1018
- if (viewProps != nullptr) {
1019
- const_cast<ViewProps *>(viewProps)->transform =
1020
- Transform::Scale(isScaleX ? 0 : 1, isScaleY ? 0 : 1, 1);
470
+ .cloneProps(propsParserContext, viewStart.props, {});
471
+
472
+ if (baselineShadowView.traits.check(
473
+ ShadowNodeTraits::Trait::ViewKind)) {
474
+ auto const &viewProps =
475
+ *std::static_pointer_cast<ViewProps const>(props);
476
+ const_cast<ViewProps &>(viewProps).opacity = 0;
1021
477
  }
1022
- viewStart.props = props;
1023
- }
1024
478
 
1025
- keyFrame = AnimationKeyFrame{
1026
- {},
1027
- AnimationConfigurationType::Create,
1028
- tag,
1029
- parent,
1030
- viewStart,
1031
- viewFinal,
1032
- baselineShadowView,
1033
- 0};
1034
- } else if (mutation.type == ShadowViewMutation::Type::Delete) {
1035
- if (mutationConfig.animationProperty ==
1036
- AnimationProperty::Opacity &&
1037
- haveComponentDescriptor) {
1038
- auto props =
1039
- getComponentDescriptorForShadowView(baselineShadowView)
1040
- .cloneProps(viewFinal.props, {});
1041
- const auto viewProps =
1042
- dynamic_cast<const ViewProps *>(props.get());
1043
- if (viewProps != nullptr) {
1044
- const_cast<ViewProps *>(viewProps)->opacity = 0;
479
+ react_native_assert(props != nullptr);
480
+ if (props != nullptr) {
481
+ viewStart.props = props;
1045
482
  }
1046
- viewFinal.props = props;
1047
483
  }
1048
484
  bool isScaleX =
1049
485
  mutationConfig.animationProperty == AnimationProperty::ScaleX ||
@@ -1054,43 +490,78 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1054
490
  if ((isScaleX || isScaleY) && haveComponentDescriptor) {
1055
491
  auto props =
1056
492
  getComponentDescriptorForShadowView(baselineShadowView)
1057
- .cloneProps(viewFinal.props, {});
1058
- const auto viewProps =
1059
- dynamic_cast<const ViewProps *>(props.get());
1060
- if (viewProps != nullptr) {
1061
- const_cast<ViewProps *>(viewProps)->transform =
493
+ .cloneProps(propsParserContext, viewStart.props, {});
494
+ if (baselineShadowView.traits.check(
495
+ ShadowNodeTraits::Trait::ViewKind)) {
496
+ auto const &viewProps =
497
+ *std::static_pointer_cast<ViewProps const>(props);
498
+ const_cast<ViewProps &>(viewProps).transform =
1062
499
  Transform::Scale(isScaleX ? 0 : 1, isScaleY ? 0 : 1, 1);
1063
500
  }
1064
- viewFinal.props = props;
501
+
502
+ react_native_assert(props != nullptr);
503
+ if (props != nullptr) {
504
+ viewStart.props = props;
505
+ }
1065
506
  }
1066
507
 
508
+ PrintMutationInstruction(
509
+ "Setting up animation KeyFrame for INSERT mutation (Create animation)",
510
+ mutation);
511
+
1067
512
  keyFrame = AnimationKeyFrame{
1068
- better::optional<ShadowViewMutation>(mutation),
1069
- AnimationConfigurationType::Delete,
1070
- tag,
1071
- parent,
1072
- viewStart,
1073
- viewFinal,
1074
- baselineShadowView,
1075
- 0};
513
+ /* .finalMutationsForKeyFrame = */ {},
514
+ /* .type = */ AnimationConfigurationType::Create,
515
+ /* .tag = */ tag,
516
+ /* .parentView = */ parent,
517
+ /* .viewStart = */ viewStart,
518
+ /* .viewEnd = */ viewFinal,
519
+ /* .viewPrev = */ baselineShadowView,
520
+ /* .initialProgress = */ 0};
521
+ } else if (mutation.type == ShadowViewMutation::Type::Delete) {
522
+ // This is just for assertion purposes.
523
+ // The NDEBUG check here is to satisfy the compiler in certain environments
524
+ // complaining about correspondingRemoveIt being unused.
525
+ #ifdef REACT_NATIVE_DEBUG
526
+ #ifndef NDEBUG
527
+ // This block is temporarily disabled to fix some internal builds.
528
+ // In some build configurations, we get a compiler error that
529
+ // `correspondingRemoveIt` is unused.
530
+ /* Tag deleteTag = mutation.oldChildShadowView.tag;
531
+ auto correspondingRemoveIt = std::find_if(
532
+ mutations.begin(),
533
+ mutations.end(),
534
+ [&deleteTag](auto &mutation) {
535
+ return mutation.type == ShadowViewMutation::Type::Remove &&
536
+ mutation.oldChildShadowView.tag == deleteTag;
537
+ });
538
+ react_native_assert(correspondingRemoveIt != mutations.end());
539
+ */
540
+ #endif
541
+ #endif
542
+ continue;
1076
543
  } else if (mutation.type == ShadowViewMutation::Type::Update) {
1077
544
  viewFinal = ShadowView(mutation.newChildShadowView);
1078
545
 
546
+ PrintMutationInstruction(
547
+ "Setting up animation KeyFrame for UPDATE mutation (Update animation)",
548
+ mutation);
549
+
1079
550
  keyFrame = AnimationKeyFrame{
1080
- better::optional<ShadowViewMutation>(mutation),
1081
- AnimationConfigurationType::Update,
1082
- tag,
1083
- parent,
1084
- viewStart,
1085
- viewFinal,
1086
- baselineShadowView,
1087
- 0};
551
+ /* .finalMutationsForKeyFrame = */ {mutation},
552
+ /* .type = */ AnimationConfigurationType::Update,
553
+ /* .tag = */ tag,
554
+ /* .parentView = */ parent,
555
+ /* .viewStart = */ viewStart,
556
+ /* .viewEnd = */ viewFinal,
557
+ /* .viewPrev = */ baselineShadowView,
558
+ /* .initialProgress = */ 0};
1088
559
  } else {
1089
560
  // This should just be "Remove" instructions that are not animated
1090
561
  // (either this is a "move", or there's a corresponding "Delete"
1091
- // that is animated). We configure it as a Noop animation so it is
1092
- // executed when all the other animations are completed.
1093
- assert(mutation.type == ShadowViewMutation::Type::Remove);
562
+ // that is animated).
563
+ react_native_assert(
564
+ mutation.type == ShadowViewMutation::Type::Remove);
1094
565
 
1095
566
  Tag removeTag = mutation.oldChildShadowView.tag;
1096
567
  auto correspondingInsertIt = std::find_if(
@@ -1101,16 +572,78 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1101
572
  mutation.newChildShadowView.tag == removeTag;
1102
573
  });
1103
574
  if (correspondingInsertIt == mutations.end()) {
1104
- PrintMutationInstruction("Queueing Delayed", mutation);
575
+ // This is a REMOVE not paired with an INSERT (move), so it must
576
+ // be paired with a DELETE.
577
+ auto correspondingDeleteIt = std::find_if(
578
+ mutations.begin(),
579
+ mutations.end(),
580
+ [&removeTag](auto &mutation) {
581
+ return mutation.type == ShadowViewMutation::Type::Delete &&
582
+ mutation.oldChildShadowView.tag == removeTag;
583
+ });
584
+ react_native_assert(correspondingDeleteIt != mutations.end());
585
+
586
+ auto deleteMutation = *correspondingDeleteIt;
587
+
588
+ if (mutationConfig.animationProperty ==
589
+ AnimationProperty::Opacity &&
590
+ haveComponentDescriptor) {
591
+ auto props =
592
+ getComponentDescriptorForShadowView(baselineShadowView)
593
+ .cloneProps(propsParserContext, viewFinal.props, {});
594
+
595
+ if (baselineShadowView.traits.check(
596
+ ShadowNodeTraits::Trait::ViewKind)) {
597
+ auto const &viewProps =
598
+ *std::static_pointer_cast<ViewProps const>(props);
599
+ const_cast<ViewProps &>(viewProps).opacity = 0;
600
+ }
601
+
602
+ react_native_assert(props != nullptr);
603
+ if (props != nullptr) {
604
+ viewFinal.props = props;
605
+ }
606
+ }
607
+ bool isScaleX = mutationConfig.animationProperty ==
608
+ AnimationProperty::ScaleX ||
609
+ mutationConfig.animationProperty ==
610
+ AnimationProperty::ScaleXY;
611
+ bool isScaleY = mutationConfig.animationProperty ==
612
+ AnimationProperty::ScaleY ||
613
+ mutationConfig.animationProperty ==
614
+ AnimationProperty::ScaleXY;
615
+ if ((isScaleX || isScaleY) && haveComponentDescriptor) {
616
+ auto props =
617
+ getComponentDescriptorForShadowView(baselineShadowView)
618
+ .cloneProps(propsParserContext, viewFinal.props, {});
619
+
620
+ if (baselineShadowView.traits.check(
621
+ ShadowNodeTraits::Trait::ViewKind)) {
622
+ auto const &viewProps =
623
+ *std::static_pointer_cast<ViewProps const>(props);
624
+ const_cast<ViewProps &>(viewProps).transform =
625
+ Transform::Scale(isScaleX ? 0 : 1, isScaleY ? 0 : 1, 1);
626
+ }
627
+
628
+ react_native_assert(props != nullptr);
629
+ if (props != nullptr) {
630
+ viewFinal.props = props;
631
+ }
632
+ }
633
+
634
+ PrintMutationInstruction(
635
+ "Setting up animation KeyFrame for REMOVE mutation (Delete animation)",
636
+ mutation);
637
+
1105
638
  keyFrame = AnimationKeyFrame{
1106
- better::optional<ShadowViewMutation>(mutation),
1107
- AnimationConfigurationType::Noop,
1108
- tag,
1109
- parent,
1110
- mutation.oldChildShadowView,
1111
- mutation.oldChildShadowView,
1112
- mutation.oldChildShadowView,
1113
- 0};
639
+ /* .finalMutationsForKeyFrame */ {mutation, deleteMutation},
640
+ /* .type */ AnimationConfigurationType::Delete,
641
+ /* .tag */ tag,
642
+ /* .parentView */ parent,
643
+ /* .viewStart */ viewStart,
644
+ /* .viewEnd */ viewFinal,
645
+ /* .viewPrev */ baselineShadowView,
646
+ /* .initialProgress */ 0};
1114
647
  } else {
1115
648
  PrintMutationInstruction(
1116
649
  "Executing Remove Immediately, due to reordering operation",
@@ -1127,12 +660,26 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1127
660
 
1128
661
  // We've found a conflict.
1129
662
  if (conflictingMutationBaselineShadowView.tag == tag) {
663
+ conflictingKeyFrame.generateFinalSyntheticMutations = false;
664
+
665
+ // Do NOT update viewStart for a CREATE animation.
666
+ if (keyFrame.type == AnimationConfigurationType::Create) {
667
+ break;
668
+ }
669
+
670
+ #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
671
+ LOG(ERROR)
672
+ << "Due to conflict, replacing 'viewStart' of animated keyframe: ["
673
+ << conflictingKeyFrame.viewPrev.tag << "] with ##"
674
+ << std::hash<ShadowView>{}(conflictingKeyFrame.viewPrev);
675
+ #endif
1130
676
  // Pick a Prop or layout property, depending on the current
1131
677
  // animation configuration. Figure out how much progress we've
1132
678
  // already made in the current animation, and start the animation
1133
679
  // from this point.
680
+ keyFrame.viewPrev = conflictingKeyFrame.viewPrev;
1134
681
  keyFrame.viewStart = conflictingKeyFrame.viewPrev;
1135
- assert(keyFrame.viewStart.tag != 0);
682
+ react_native_assert(keyFrame.viewStart.tag > 0);
1136
683
  keyFrame.initialProgress = 0;
1137
684
 
1138
685
  // We're guaranteed that a tag only has one animation associated
@@ -1143,16 +690,22 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1143
690
  }
1144
691
  }
1145
692
 
1146
- assert(keyFrame.viewStart.tag != 0);
1147
- assert(keyFrame.viewEnd.tag != 0);
1148
- assert(keyFrame.viewPrev.tag != 0);
693
+ #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
694
+ LOG(ERROR) << "Checking validity of keyframe: ["
695
+ << keyFrame.viewStart.tag << "] [" << keyFrame.viewEnd.tag
696
+ << "] [" << keyFrame.viewPrev.tag
697
+ << "] animation type: " << (int)keyFrame.type;
698
+ #endif
699
+ react_native_assert(keyFrame.viewStart.tag > 0);
700
+ react_native_assert(keyFrame.viewEnd.tag > 0);
701
+ react_native_assert(keyFrame.viewPrev.tag > 0);
1149
702
  keyFramesToAnimate.push_back(keyFrame);
1150
703
  }
1151
704
 
1152
- if (executeMutationImmediately) {
705
+ if (executeMutationImmediately.hasValue()) {
1153
706
  PrintMutationInstruction(
1154
- "Queue Up Animation For Immediate Execution", mutation);
1155
- immediateMutations.push_back(mutation);
707
+ "Queue Up For Immediate Execution", *executeMutationImmediately);
708
+ immediateMutations.push_back(*executeMutationImmediately);
1156
709
  }
1157
710
  }
1158
711
 
@@ -1172,11 +725,12 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1172
725
  {
1173
726
  int idx = 0;
1174
727
  for (const auto &keyframe : keyFramesToAnimate) {
1175
- if (keyframe.finalMutationForKeyFrame.has_value()) {
728
+ for (const auto &finalMutationForKeyFrame :
729
+ keyframe.finalMutationsForKeyFrame) {
1176
730
  PrintMutationInstruction(
1177
731
  std::string("FINAL list: ") + std::to_string(idx) + "/" +
1178
732
  std::to_string(keyFramesToAnimate.size()),
1179
- *keyframe.finalMutationForKeyFrame);
733
+ finalMutationForKeyFrame);
1180
734
  }
1181
735
  idx++;
1182
736
  }
@@ -1223,56 +777,26 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1223
777
  }
1224
778
  }
1225
779
 
1226
- if (keyFrame.finalMutationForKeyFrame.hasValue()) {
1227
- auto &finalMutation = *keyFrame.finalMutationForKeyFrame;
1228
- auto mutationInstruction = ShadowViewMutation{
1229
- finalMutation.type,
1230
- finalMutation.parentShadowView,
1231
- keyFrame.viewPrev,
1232
- finalMutation.newChildShadowView,
1233
- finalMutation.index};
1234
- PrintMutationInstruction(
1235
- "Queueing up final mutation instruction - update:",
1236
- mutationInstruction);
1237
- assert(mutationInstruction.oldChildShadowView.tag != 0);
1238
- assert(
1239
- mutationInstruction.newChildShadowView.tag != 0 ||
1240
- mutationInstruction.type == ShadowViewMutation::Delete ||
1241
- mutationInstruction.type == ShadowViewMutation::Remove);
1242
- finalConflictingMutations.push_back(mutationInstruction);
1243
- } else {
1244
- // If there's no final mutation associated, create a mutation that
1245
- // corresponds to the animation being 100% complete. This is important
1246
- // for, for example, INSERT mutations being animated from opacity 0
1247
- // to 1. If the animation is interrupted we must force the View to be
1248
- // at opacity 1.
1249
- // For Android - since it passes along only deltas, not an entire bag
1250
- // of props - generate an "animation" frame corresponding to a final
1251
- // update for this view. Only then, generate an update that will cause
1252
- // the ShadowTree to be consistent with the Mounting layer by passing
1253
- // viewEnd, unmodified, to the mounting layer. This helps with, for
1254
- // example, opacity animations.
1255
- auto mutatedShadowView = createInterpolatedShadowView(
1256
- 1, keyFrame.viewStart, keyFrame.viewEnd);
1257
- auto generatedPenultimateMutation =
1258
- ShadowViewMutation::UpdateMutation(
1259
- keyFrame.viewPrev, mutatedShadowView);
1260
- assert(generatedPenultimateMutation.oldChildShadowView.tag != 0);
1261
- assert(generatedPenultimateMutation.newChildShadowView.tag != 0);
1262
- PrintMutationInstruction(
1263
- "Queueing up penultimate mutation instruction - synthetic",
1264
- generatedPenultimateMutation);
1265
- finalConflictingMutations.push_back(generatedPenultimateMutation);
1266
-
1267
- auto generatedMutation = ShadowViewMutation::UpdateMutation(
1268
- mutatedShadowView, keyFrame.viewEnd);
1269
- assert(generatedMutation.oldChildShadowView.tag != 0);
1270
- assert(generatedMutation.newChildShadowView.tag != 0);
1271
- PrintMutationInstruction(
1272
- "Queueing up final mutation instruction - synthetic",
1273
- generatedMutation);
1274
- finalConflictingMutations.push_back(generatedMutation);
780
+ // If the "final" mutation is already accounted for, by previously
781
+ // setting the correct "viewPrev" of the next conflicting animation, we
782
+ // don't want to queue up any final UPDATE mutations here.
783
+ bool shouldGenerateSyntheticMutations =
784
+ keyFrame.generateFinalSyntheticMutations;
785
+ auto numFinalMutations = keyFrame.finalMutationsForKeyFrame.size();
786
+ bool onlyMutationIsUpdate =
787
+ (numFinalMutations == 1 &&
788
+ keyFrame.finalMutationsForKeyFrame[0].type ==
789
+ ShadowViewMutation::Update);
790
+ if (!shouldGenerateSyntheticMutations &&
791
+ (numFinalMutations == 0 || onlyMutationIsUpdate)) {
792
+ continue;
1275
793
  }
794
+
795
+ queueFinalMutationsForCompletedKeyFrame(
796
+ keyFrame,
797
+ finalConflictingMutations,
798
+ true,
799
+ "KeyFrameManager: Finished Conflicting Keyframe");
1276
800
  }
1277
801
 
1278
802
  // Make sure that all operations execute in the proper order, since
@@ -1294,8 +818,8 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1294
818
  // Knowledge Graph:
1295
819
  // [ImmediateMutations] -> assumes [FinalConflicting], [FrameDelayed],
1296
820
  // [Delayed] already executed [FrameDelayed] -> assumes
1297
- // [FinalConflicting], [Delayed] already executed [FinalConflicting] -> is
1298
- // adjusted based on [Delayed], no dependency on [FinalConflicting],
821
+ // [FinalConflicting], [Delayed] already executed [FinalConflicting] ->
822
+ // is adjusted based on [Delayed], no dependency on [FinalConflicting],
1299
823
  // [FrameDelayed] [Delayed] -> assumes [FinalConflicting],
1300
824
  // [ImmediateMutations] not executed yet
1301
825
 
@@ -1303,8 +827,8 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1303
827
  // Knowledge Graph:
1304
828
  // [ImmediateMutations] -> assumes [FinalConflicting], [FrameDelayed],
1305
829
  // [Delayed] already executed [FrameDelayed] -> assumes
1306
- // [FinalConflicting], [Delayed] already executed [FinalConflicting] -> is
1307
- // adjusted based on [Delayed], no dependency on [FinalConflicting],
830
+ // [FinalConflicting], [Delayed] already executed [FinalConflicting] ->
831
+ // is adjusted based on [Delayed], no dependency on [FinalConflicting],
1308
832
  // [FrameDelayed] [Delayed] -> adjusted for [FinalConflicting]; assumes
1309
833
  // [ImmediateMutations] not executed yet
1310
834
  #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
@@ -1322,22 +846,21 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1322
846
  // [ImmediateExecutions] -> assumes [FinalConflicting], [Delayed],
1323
847
  // [FrameDelayed] already executed [FrameDelayed] -> adjusted for
1324
848
  // [Delayed]; assumes [FinalConflicting] already executed
1325
- // [FinalConflicting] -> is adjusted based on [Delayed], no dependency on
1326
- // [FinalConflicting], [FrameDelayed] [Delayed] -> adjusted for
849
+ // [FinalConflicting] -> is adjusted based on [Delayed], no dependency
850
+ // on [FinalConflicting], [FrameDelayed] [Delayed] -> adjusted for
1327
851
  // [FinalConflicting]; assumes [ImmediateExecutions] not executed yet
1328
852
  #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1329
853
  LOG(ERROR) << "Adjust [FrameDelayed] based on [Delayed]";
1330
854
  #endif
1331
855
  for (auto &keyframe : inflightAnimations_.back().keyFrames) {
1332
- if (keyframe.finalMutationForKeyFrame.has_value()) {
1333
- auto &mutation = *keyframe.finalMutationForKeyFrame;
1334
- if (mutation.type == ShadowViewMutation::Type::Insert ||
1335
- mutation.type == ShadowViewMutation::Type::Remove) {
856
+ for (auto &finalMutation : keyframe.finalMutationsForKeyFrame) {
857
+ if (finalMutation.type == ShadowViewMutation::Type::Insert ||
858
+ finalMutation.type == ShadowViewMutation::Type::Remove) {
1336
859
  // When adjusting, skip adjusting against last animation - because
1337
860
  // all `mutation`s here come from the last animation, so we can't
1338
861
  // adjust a batch against itself.
1339
862
  adjustImmediateMutationIndicesForDelayedMutations(
1340
- surfaceId, mutation, true);
863
+ surfaceId, finalMutation, true);
1341
864
  }
1342
865
  }
1343
866
  }
@@ -1345,21 +868,21 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1345
868
  // Adjust [ImmediateExecutions] based on [Delayed]
1346
869
  // Knowledge Graph:
1347
870
  // [ImmediateExecutions] -> adjusted for [FrameDelayed], [Delayed];
1348
- // assumes [FinalConflicting] already executed [FrameDelayed] -> adjusted
1349
- // for [Delayed]; assumes [FinalConflicting] already executed
1350
- // [FinalConflicting] -> is adjusted based on [Delayed], no dependency on
1351
- // [FinalConflicting], [FrameDelayed] [Delayed] -> adjusted for
871
+ // assumes [FinalConflicting] already executed [FrameDelayed] ->
872
+ // adjusted for [Delayed]; assumes [FinalConflicting] already executed
873
+ // [FinalConflicting] -> is adjusted based on [Delayed], no dependency
874
+ // on [FinalConflicting], [FrameDelayed] [Delayed] -> adjusted for
1352
875
  // [FinalConflicting]; assumes [ImmediateExecutions] not executed yet
1353
876
  //
1354
877
  // THEN,
1355
- // Adjust [Delayed] based on [ImmediateExecutions] and [FinalConflicting]
1356
- // Knowledge Graph:
1357
- // [ImmediateExecutions] -> adjusted for [FrameDelayed], [Delayed];
1358
- // assumes [FinalConflicting] already executed [FrameDelayed] -> adjusted
1359
- // for [Delayed]; assumes [FinalConflicting] already executed
1360
- // [FinalConflicting] -> is adjusted based on [Delayed], no dependency on
1361
- // [FinalConflicting], [FrameDelayed] [Delayed] -> adjusted for
1362
- // [FinalConflicting], [ImmediateExecutions]
878
+ // Adjust [Delayed] based on [ImmediateExecutions] and
879
+ // [FinalConflicting] Knowledge Graph: [ImmediateExecutions] -> adjusted
880
+ // for [FrameDelayed], [Delayed]; assumes [FinalConflicting] already
881
+ // executed [FrameDelayed] -> adjusted for [Delayed]; assumes
882
+ // [FinalConflicting] already executed [FinalConflicting] -> is adjusted
883
+ // based on [Delayed], no dependency on [FinalConflicting],
884
+ // [FrameDelayed] [Delayed] -> adjusted for [FinalConflicting],
885
+ // [ImmediateExecutions]
1363
886
  //
1364
887
  // We do these in the same loop because each immediate execution is
1365
888
  // impacted by each delayed mutation, and also can impact each delayed
@@ -1371,9 +894,9 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1371
894
  for (auto &mutation : immediateMutations) {
1372
895
  // Note: when adjusting [ImmediateExecutions] based on [FrameDelayed],
1373
896
  // we need only adjust Inserts. Since inserts are executed
1374
- // highest-index-first, lower indices being delayed does not impact the
1375
- // higher-index removals; and conversely, higher indices being delayed
1376
- // cannot impact lower index removal, regardless of order.
897
+ // highest-index-first, lower indices being delayed does not impact
898
+ // the higher-index removals; and conversely, higher indices being
899
+ // delayed cannot impact lower index removal, regardless of order.
1377
900
  if (mutation.type == ShadowViewMutation::Type::Insert ||
1378
901
  mutation.type == ShadowViewMutation::Type::Remove) {
1379
902
  adjustImmediateMutationIndicesForDelayedMutations(
@@ -1387,76 +910,36 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1387
910
  }
1388
911
  }
1389
912
 
1390
- // If the knowledge graph progression above is correct, it is now safe to
1391
- // execute finalConflictingMutations and immediateMutations in that order,
1392
- // and to queue the delayed animations from this frame.
913
+ // If the knowledge graph progression above is correct, it is now safe
914
+ // to execute finalConflictingMutations and immediateMutations in that
915
+ // order, and to queue the delayed animations from this frame.
1393
916
  //
1394
917
  // Execute the conflicting, delayed operations immediately. Any UPDATE
1395
918
  // operations that smoothly transition into another animation will be
1396
919
  // overridden by generated UPDATE operations at the end of the list, and
1397
920
  // we want any REMOVE or DELETE operations to execute immediately.
1398
- // Additionally, this should allow us to avoid performing index adjustment
1399
- // between this list of conflicting animations and the batch we're about
1400
- // to execute.
921
+ // Additionally, this should allow us to avoid performing index
922
+ // adjustment between this list of conflicting animations and the batch
923
+ // we're about to execute.
1401
924
  finalConflictingMutations.insert(
1402
925
  finalConflictingMutations.end(),
1403
926
  immediateMutations.begin(),
1404
927
  immediateMutations.end());
1405
928
  mutations = finalConflictingMutations;
1406
- } /* if (currentAnimation) */ else {
929
+ } /* if (currentAnimation) */
930
+ else {
1407
931
  // If there's no "next" animation, make sure we queue up "final"
1408
932
  // operations from all ongoing, conflicting animations.
1409
933
  #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1410
- LOG(ERROR) << "No Animation: Queue up final conflicting animations";
1411
- #endif
1412
- ShadowViewMutationList finalMutationsForConflictingAnimations{};
1413
- for (auto const &keyFrame : conflictingAnimations) {
1414
- if (keyFrame.finalMutationForKeyFrame.hasValue()) {
1415
- auto &finalMutation = (*keyFrame.finalMutationForKeyFrame);
1416
- auto mutation = ShadowViewMutation{
1417
- finalMutation.type,
1418
- finalMutation.parentShadowView,
1419
- keyFrame.viewPrev,
1420
- finalMutation.newChildShadowView,
1421
- finalMutation.index};
1422
- PrintMutationInstruction(
1423
- "No Animation: Queueing up final conflicting mutation instruction",
1424
- mutation);
1425
- finalMutationsForConflictingAnimations.push_back(mutation);
1426
- } else {
1427
- // If there's no final mutation associated, create a mutation that
1428
- // corresponds to the animation being 100% complete. This is important
1429
- // for, for example, INSERT mutations being animated from opacity 0
1430
- // to 1. If the animation is interrupted we must force the View to be
1431
- // at opacity 1.
1432
- // For Android - since it passes along only deltas, not an entire bag
1433
- // of props - generate an "animation" frame corresponding to a final
1434
- // update for this view. Only then, generate an update that will cause
1435
- // the ShadowTree to be consistent with the Mounting layer by passing
1436
- // viewEnd, unmodified, to the mounting layer. This helps with, for
1437
- // example, opacity animations.
1438
- auto mutatedShadowView = createInterpolatedShadowView(
1439
- 1, keyFrame.viewStart, keyFrame.viewEnd);
1440
- auto generatedPenultimateMutation =
1441
- ShadowViewMutation::UpdateMutation(
1442
- keyFrame.viewPrev, mutatedShadowView);
1443
- assert(generatedPenultimateMutation.oldChildShadowView.tag != 0);
1444
- assert(generatedPenultimateMutation.newChildShadowView.tag != 0);
1445
- PrintMutationInstruction(
1446
- "No Animation: Queueing up penultimate mutation instruction - synthetic",
1447
- generatedPenultimateMutation);
1448
- finalMutationsForConflictingAnimations.push_back(
1449
- generatedPenultimateMutation);
1450
-
1451
- auto generatedMutation = ShadowViewMutation::UpdateMutation(
1452
- mutatedShadowView, keyFrame.viewEnd);
1453
- assert(generatedMutation.oldChildShadowView.tag != 0);
1454
- assert(generatedMutation.newChildShadowView.tag != 0);
1455
- PrintMutationInstruction(
1456
- "No Animation: Queueing up final mutation instruction - synthetic",
1457
- generatedMutation);
1458
- finalMutationsForConflictingAnimations.push_back(generatedMutation);
1459
- }
934
+ LOG(ERROR) << "No Animation: Queue up final conflicting animations";
935
+ #endif
936
+ ShadowViewMutationList finalMutationsForConflictingAnimations{};
937
+ for (auto const &keyFrame : conflictingAnimations) {
938
+ queueFinalMutationsForCompletedKeyFrame(
939
+ keyFrame,
940
+ finalMutationsForConflictingAnimations,
941
+ true,
942
+ "Conflict with non-animated mutation");
1460
943
  }
1461
944
 
1462
945
  // Make sure that all operations execute in the proper order.
@@ -1477,10 +960,10 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1477
960
  }
1478
961
  }
1479
962
 
1480
- // The ShadowTree layer doesn't realize that certain operations have been
1481
- // delayed, so we must adjust all Remove and Insert operations based on
1482
- // what else has been deferred, whether we are executing this immediately
1483
- // or later.
963
+ // The ShadowTree layer doesn't realize that certain operations have
964
+ // been delayed, so we must adjust all Remove and Insert operations
965
+ // based on what else has been deferred, whether we are executing this
966
+ // immediately or later.
1484
967
  #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1485
968
  LOG(ERROR)
1486
969
  << "No Animation: Adjust mutations based on remaining delayed mutations / adjust delayed, based on each";
@@ -1524,186 +1007,673 @@ LayoutAnimationKeyFrameManager::pullTransaction(
1524
1007
  }
1525
1008
  }
1526
1009
 
1527
- mutations.insert(
1528
- mutations.end(),
1529
- mutationsForAnimation.begin(),
1530
- mutationsForAnimation.end());
1010
+ mutations.insert(
1011
+ mutations.end(),
1012
+ mutationsForAnimation.begin(),
1013
+ mutationsForAnimation.end());
1014
+
1015
+ // DEBUG ONLY: list existing inflight animations
1016
+ #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1017
+ LOG(ERROR) << "FINISHING DISPLAYING ONGOING inflightAnimations_!";
1018
+ int i = 0;
1019
+ int j = 0;
1020
+ for (auto const &inflightAnimation : inflightAnimations_) {
1021
+ i++;
1022
+ j = 0;
1023
+ if (inflightAnimation.completed) {
1024
+ continue;
1025
+ }
1026
+ for (auto &keyframe : inflightAnimation.keyFrames) {
1027
+ j++;
1028
+ if (keyframe.invalidated) {
1029
+ continue;
1030
+ }
1031
+ for (auto const &finalMutation : keyframe.finalMutationsForKeyFrame) {
1032
+ if (!finalMutation.mutatedViewIsVirtual()) {
1033
+ std::string msg = "Animation " + std::to_string(i) + " keyframe " +
1034
+ std::to_string(j) + ": Final Animation";
1035
+ PrintMutationInstruction(msg, finalMutation);
1036
+ }
1037
+ }
1038
+ }
1039
+ }
1040
+ LOG(ERROR) << "FINISHING DONE DISPLAYING ONGOING inflightAnimations_!";
1041
+ #endif
1042
+
1043
+ // Signal to delegate if all animations are complete, or if we were not
1044
+ // animating anything and now some animation exists.
1045
+ if (inflightAnimationsExistInitially && inflightAnimations_.empty()) {
1046
+ std::lock_guard<std::mutex> lock(layoutAnimationStatusDelegateMutex_);
1047
+ if (layoutAnimationStatusDelegate_ != nullptr) {
1048
+ layoutAnimationStatusDelegate_->onAllAnimationsComplete();
1049
+ }
1050
+ } else if (
1051
+ !inflightAnimationsExistInitially && !inflightAnimations_.empty()) {
1052
+ std::lock_guard<std::mutex> lock(layoutAnimationStatusDelegateMutex_);
1053
+ if (layoutAnimationStatusDelegate_ != nullptr) {
1054
+ layoutAnimationStatusDelegate_->onAnimationStarted();
1055
+ }
1056
+ }
1057
+
1058
+ simulateImagePropsMemoryAccess(mutations);
1059
+
1060
+ return MountingTransaction{
1061
+ surfaceId, transactionNumber, std::move(mutations), telemetry};
1062
+ }
1063
+
1064
+ void LayoutAnimationKeyFrameManager::uiManagerDidConfigureNextLayoutAnimation(
1065
+ LayoutAnimation layoutAnimation) const {
1066
+ currentAnimation_ = better::optional<LayoutAnimation>{layoutAnimation};
1067
+ }
1068
+
1069
+ void LayoutAnimationKeyFrameManager::setLayoutAnimationStatusDelegate(
1070
+ LayoutAnimationStatusDelegate *delegate) const {
1071
+ std::lock_guard<std::mutex> lock(layoutAnimationStatusDelegateMutex_);
1072
+ layoutAnimationStatusDelegate_ = delegate;
1073
+ }
1074
+
1075
+ void LayoutAnimationKeyFrameManager::setClockNow(
1076
+ std::function<uint64_t()> now) {
1077
+ now_ = now;
1078
+ }
1079
+
1080
+ void LayoutAnimationKeyFrameManager::enableSkipInvalidatedKeyFrames() {
1081
+ skipInvalidatedKeyFrames_ = true;
1082
+ }
1083
+
1084
+ void LayoutAnimationKeyFrameManager::enableCrashOnMissingComponentDescriptor() {
1085
+ crashOnMissingComponentDescriptor_ = true;
1086
+ }
1087
+
1088
+ void LayoutAnimationKeyFrameManager::enableSimulateImagePropsMemoryAccess() {
1089
+ simulateImagePropsMemoryAccess_ = true;
1090
+ }
1091
+
1092
+ #pragma mark - Protected
1093
+
1094
+ bool LayoutAnimationKeyFrameManager::hasComponentDescriptorForShadowView(
1095
+ ShadowView const &shadowView) const {
1096
+ auto hasComponentDescriptor =
1097
+ componentDescriptorRegistry_->hasComponentDescriptorAt(
1098
+ shadowView.componentHandle);
1099
+
1100
+ if (crashOnMissingComponentDescriptor_ && !hasComponentDescriptor) {
1101
+ LOG(FATAL) << "Component descriptor with handle: "
1102
+ << shadowView.componentHandle
1103
+ << " doesn't exist. The component name: "
1104
+ << shadowView.componentName;
1105
+ }
1106
+
1107
+ return hasComponentDescriptor;
1108
+ }
1109
+
1110
+ ComponentDescriptor const &
1111
+ LayoutAnimationKeyFrameManager::getComponentDescriptorForShadowView(
1112
+ ShadowView const &shadowView) const {
1113
+ return componentDescriptorRegistry_->at(shadowView.componentHandle);
1114
+ }
1115
+
1116
+ ShadowView LayoutAnimationKeyFrameManager::createInterpolatedShadowView(
1117
+ double progress,
1118
+ ShadowView const &startingView,
1119
+ ShadowView const &finalView) const {
1120
+ react_native_assert(startingView.tag > 0);
1121
+ react_native_assert(finalView.tag > 0);
1122
+ if (!hasComponentDescriptorForShadowView(startingView)) {
1123
+ LOG(ERROR) << "No ComponentDescriptor for ShadowView being animated: ["
1124
+ << startingView.tag << "]";
1125
+ react_native_assert(false);
1126
+ return finalView;
1127
+ }
1128
+
1129
+ ComponentDescriptor const &componentDescriptor =
1130
+ getComponentDescriptorForShadowView(startingView);
1131
+
1132
+ // Base the mutated view on the finalView, so that the following stay
1133
+ // consistent:
1134
+ // - state
1135
+ // - eventEmitter
1136
+ // For now, we do not allow interpolation of state. And we probably never
1137
+ // will, so make sure we always keep the mounting layer consistent with the
1138
+ // "final" state.
1139
+ auto mutatedShadowView = ShadowView(finalView);
1140
+ react_native_assert(mutatedShadowView.tag > 0);
1141
+
1142
+ react_native_assert(startingView.props != nullptr);
1143
+ react_native_assert(finalView.props != nullptr);
1144
+ if (startingView.props == nullptr || finalView.props == nullptr) {
1145
+ return finalView;
1146
+ }
1147
+
1148
+ // Animate opacity or scale/transform
1149
+ PropsParserContext propsParserContext{
1150
+ finalView.surfaceId, *contextContainer_};
1151
+ mutatedShadowView.props = componentDescriptor.interpolateProps(
1152
+ propsParserContext, progress, startingView.props, finalView.props);
1153
+ react_native_assert(mutatedShadowView.props != nullptr);
1154
+ if (mutatedShadowView.props == nullptr) {
1155
+ return finalView;
1156
+ }
1157
+
1158
+ // Interpolate LayoutMetrics
1159
+ LayoutMetrics const &finalLayoutMetrics = finalView.layoutMetrics;
1160
+ LayoutMetrics const &baselineLayoutMetrics = startingView.layoutMetrics;
1161
+ LayoutMetrics interpolatedLayoutMetrics = finalLayoutMetrics;
1162
+ interpolatedLayoutMetrics.frame.origin.x = interpolateFloats(
1163
+ progress,
1164
+ baselineLayoutMetrics.frame.origin.x,
1165
+ finalLayoutMetrics.frame.origin.x);
1166
+ interpolatedLayoutMetrics.frame.origin.y = interpolateFloats(
1167
+ progress,
1168
+ baselineLayoutMetrics.frame.origin.y,
1169
+ finalLayoutMetrics.frame.origin.y);
1170
+ interpolatedLayoutMetrics.frame.size.width = interpolateFloats(
1171
+ progress,
1172
+ baselineLayoutMetrics.frame.size.width,
1173
+ finalLayoutMetrics.frame.size.width);
1174
+ interpolatedLayoutMetrics.frame.size.height = interpolateFloats(
1175
+ progress,
1176
+ baselineLayoutMetrics.frame.size.height,
1177
+ finalLayoutMetrics.frame.size.height);
1178
+ mutatedShadowView.layoutMetrics = interpolatedLayoutMetrics;
1179
+
1180
+ return mutatedShadowView;
1181
+ }
1182
+
1183
+ void LayoutAnimationKeyFrameManager::callCallback(
1184
+ LayoutAnimationCallbackWrapper const &callback) const {
1185
+ runtimeExecutor_(
1186
+ [callback](jsi::Runtime &runtime) { callback.call(runtime); });
1187
+ }
1188
+
1189
+ void LayoutAnimationKeyFrameManager::queueFinalMutationsForCompletedKeyFrame(
1190
+ AnimationKeyFrame const &keyframe,
1191
+ ShadowViewMutation::List &mutationsList,
1192
+ bool interrupted,
1193
+ const std::string &logPrefix) const {
1194
+ if (skipInvalidatedKeyFrames_ && keyframe.invalidated) {
1195
+ return;
1196
+ }
1197
+ if (keyframe.finalMutationsForKeyFrame.size() > 0) {
1198
+ // TODO: modularize this segment, it is repeated 2x in KeyFrameManager
1199
+ // as well.
1200
+ ShadowView prev = keyframe.viewPrev;
1201
+ for (auto const &finalMutation : keyframe.finalMutationsForKeyFrame) {
1202
+ PrintMutationInstruction(
1203
+ logPrefix + ": Queuing up Final Mutation:", finalMutation);
1204
+ // Copy so that if something else mutates the inflight animations,
1205
+ // it won't change this mutation after this point.
1206
+ switch (finalMutation.type) {
1207
+ // For CREATE/INSERT this will contain CREATE, INSERT in that order.
1208
+ // For REMOVE/DELETE, same.
1209
+ case ShadowViewMutation::Type::Create:
1210
+ mutationsList.push_back(ShadowViewMutation::CreateMutation(
1211
+ finalMutation.newChildShadowView));
1212
+ break;
1213
+ case ShadowViewMutation::Type::Delete:
1214
+ mutationsList.push_back(ShadowViewMutation::DeleteMutation(prev));
1215
+ break;
1216
+ case ShadowViewMutation::Type::Insert:
1217
+ mutationsList.push_back(ShadowViewMutation::InsertMutation(
1218
+ finalMutation.parentShadowView,
1219
+ finalMutation.newChildShadowView,
1220
+ finalMutation.index));
1221
+ break;
1222
+ case ShadowViewMutation::Type::Remove:
1223
+ mutationsList.push_back(ShadowViewMutation::RemoveMutation(
1224
+ finalMutation.parentShadowView, prev, finalMutation.index));
1225
+ break;
1226
+ case ShadowViewMutation::Type::Update:
1227
+ mutationsList.push_back(ShadowViewMutation::UpdateMutation(
1228
+ prev, finalMutation.newChildShadowView));
1229
+ break;
1230
+ }
1231
+ if (finalMutation.newChildShadowView.tag > 0) {
1232
+ prev = finalMutation.newChildShadowView;
1233
+ }
1234
+ }
1235
+ } else {
1236
+ // If there's no final mutation associated, create a mutation that
1237
+ // corresponds to the animation being 100% complete. This is
1238
+ // important for, for example, INSERT mutations being animated from
1239
+ // opacity 0 to 1. If the animation is interrupted we must force the
1240
+ // View to be at opacity 1. For Android - since it passes along only
1241
+ // deltas, not an entire bag of props - generate an "animation"
1242
+ // frame corresponding to a final update for this view. Only then,
1243
+ // generate an update that will cause the ShadowTree to be
1244
+ // consistent with the Mounting layer by passing viewEnd,
1245
+ // unmodified, to the mounting layer. This helps with, for example,
1246
+ // opacity animations.
1247
+ // This is necessary for INSERT (create) and UPDATE (update) mutations, but
1248
+ // not REMOVE/DELETE mutations ("delete" animations).
1249
+ if (interrupted) {
1250
+ auto mutatedShadowView =
1251
+ createInterpolatedShadowView(1, keyframe.viewStart, keyframe.viewEnd);
1252
+ auto generatedPenultimateMutation = ShadowViewMutation::UpdateMutation(
1253
+ keyframe.viewPrev, mutatedShadowView);
1254
+ react_native_assert(
1255
+ generatedPenultimateMutation.oldChildShadowView.tag > 0);
1256
+ react_native_assert(
1257
+ generatedPenultimateMutation.newChildShadowView.tag > 0);
1258
+ PrintMutationInstruction(
1259
+ "Queueing up penultimate mutation instruction - synthetic",
1260
+ generatedPenultimateMutation);
1261
+ mutationsList.push_back(generatedPenultimateMutation);
1262
+
1263
+ auto generatedMutation = ShadowViewMutation::UpdateMutation(
1264
+ mutatedShadowView, keyframe.viewEnd);
1265
+ react_native_assert(generatedMutation.oldChildShadowView.tag > 0);
1266
+ react_native_assert(generatedMutation.newChildShadowView.tag > 0);
1267
+ PrintMutationInstruction(
1268
+ "Queueing up final mutation instruction - synthetic",
1269
+ generatedMutation);
1270
+ mutationsList.push_back(generatedMutation);
1271
+ } else {
1272
+ auto mutation = ShadowViewMutation::UpdateMutation(
1273
+ keyframe.viewPrev, keyframe.viewEnd);
1274
+ PrintMutationInstruction(
1275
+ logPrefix +
1276
+ "Animation Complete: Queuing up Final Synthetic Mutation:",
1277
+ mutation);
1278
+ react_native_assert(mutation.oldChildShadowView.tag > 0);
1279
+ react_native_assert(mutation.newChildShadowView.tag > 0);
1280
+ mutationsList.push_back(std::move(mutation));
1281
+ }
1282
+ }
1283
+ }
1284
+
1285
+ #pragma mark - Private
1286
+
1287
+ void LayoutAnimationKeyFrameManager::
1288
+ adjustImmediateMutationIndicesForDelayedMutations(
1289
+ SurfaceId surfaceId,
1290
+ ShadowViewMutation &mutation,
1291
+ bool skipLastAnimation,
1292
+ bool lastAnimationOnly) const {
1293
+ bool isRemoveMutation = mutation.type == ShadowViewMutation::Type::Remove;
1294
+ react_native_assert(
1295
+ isRemoveMutation || mutation.type == ShadowViewMutation::Type::Insert);
1296
+
1297
+ // TODO: turn all of this into a lambda and share code?
1298
+ if (mutation.mutatedViewIsVirtual()) {
1299
+ PrintMutationInstruction(
1300
+ "[IndexAdjustment] Not calling adjustImmediateMutationIndicesForDelayedMutations, is virtual, for:",
1301
+ mutation);
1302
+ return;
1303
+ }
1304
+
1305
+ PrintMutationInstruction(
1306
+ "[IndexAdjustment] Calling adjustImmediateMutationIndicesForDelayedMutations for:",
1307
+ mutation);
1308
+
1309
+ // First, collect all final mutations that could impact this immediate
1310
+ // mutation.
1311
+ std::vector<ShadowViewMutation *> candidateMutations{};
1312
+
1313
+ for (auto inflightAnimationIt =
1314
+ inflightAnimations_.rbegin() + (skipLastAnimation ? 1 : 0);
1315
+ inflightAnimationIt != inflightAnimations_.rend();
1316
+ inflightAnimationIt++) {
1317
+ auto &inflightAnimation = *inflightAnimationIt;
1318
+ if (inflightAnimation.surfaceId != surfaceId) {
1319
+ continue;
1320
+ }
1321
+ if (inflightAnimation.completed) {
1322
+ continue;
1323
+ }
1324
+
1325
+ for (auto it = inflightAnimation.keyFrames.begin();
1326
+ it != inflightAnimation.keyFrames.end();
1327
+ it++) {
1328
+ auto &animatedKeyFrame = *it;
1329
+
1330
+ if (animatedKeyFrame.invalidated) {
1331
+ continue;
1332
+ }
1333
+
1334
+ // Detect if they're in the same view hierarchy, but not equivalent
1335
+ // We've already detected direct conflicts and removed them.
1336
+ if (animatedKeyFrame.parentView.tag != mutation.parentShadowView.tag) {
1337
+ continue;
1338
+ }
1339
+
1340
+ for (auto &delayedMutation : animatedKeyFrame.finalMutationsForKeyFrame) {
1341
+ if (delayedMutation.type != ShadowViewMutation::Type::Remove) {
1342
+ continue;
1343
+ }
1344
+ if (delayedMutation.mutatedViewIsVirtual()) {
1345
+ continue;
1346
+ }
1347
+ if (delayedMutation.oldChildShadowView.tag ==
1348
+ (isRemoveMutation ? mutation.oldChildShadowView.tag
1349
+ : mutation.newChildShadowView.tag)) {
1350
+ continue;
1351
+ }
1352
+
1353
+ PrintMutationInstructionRelative(
1354
+ "[IndexAdjustment] adjustImmediateMutationIndicesForDelayedMutations CANDIDATE for:",
1355
+ mutation,
1356
+ delayedMutation);
1357
+ candidateMutations.push_back(&delayedMutation);
1358
+ }
1359
+ }
1360
+
1361
+ if (lastAnimationOnly) {
1362
+ break;
1363
+ }
1364
+ }
1365
+
1366
+ // While the mutation keeps being affected, keep checking. We use the vector
1367
+ // so we only perform one adjustment per delayed mutation. See comments at
1368
+ // bottom of adjustDelayedMutationIndicesForMutation for further explanation.
1369
+ bool changed = true;
1370
+ int adjustedDelta = 0;
1371
+ while (changed) {
1372
+ changed = false;
1373
+ candidateMutations.erase(
1374
+ std::remove_if(
1375
+ candidateMutations.begin(),
1376
+ candidateMutations.end(),
1377
+ [&changed, &mutation, &adjustedDelta, &isRemoveMutation](
1378
+ ShadowViewMutation *candidateMutation) {
1379
+ bool indexConflicts =
1380
+ (candidateMutation->index < mutation.index ||
1381
+ (isRemoveMutation &&
1382
+ candidateMutation->index == mutation.index));
1383
+ if (indexConflicts) {
1384
+ mutation.index++;
1385
+ adjustedDelta++;
1386
+ changed = true;
1387
+ PrintMutationInstructionRelative(
1388
+ "[IndexAdjustment] adjustImmediateMutationIndicesForDelayedMutations: Adjusting mutation UPWARD",
1389
+ mutation,
1390
+ *candidateMutation);
1391
+ return true;
1392
+ }
1393
+ return false;
1394
+ }),
1395
+ candidateMutations.end());
1396
+ }
1397
+ }
1398
+
1399
+ void LayoutAnimationKeyFrameManager::adjustDelayedMutationIndicesForMutation(
1400
+ SurfaceId surfaceId,
1401
+ ShadowViewMutation const &mutation,
1402
+ bool skipLastAnimation) const {
1403
+ bool isRemoveMutation = mutation.type == ShadowViewMutation::Type::Remove;
1404
+ bool isInsertMutation = mutation.type == ShadowViewMutation::Type::Insert;
1405
+ auto tag = isRemoveMutation ? mutation.oldChildShadowView.tag
1406
+ : mutation.newChildShadowView.tag;
1407
+ react_native_assert(isRemoveMutation || isInsertMutation);
1408
+
1409
+ if (mutation.mutatedViewIsVirtual()) {
1410
+ PrintMutationInstruction(
1411
+ "[IndexAdjustment] Not calling adjustDelayedMutationIndicesForMutation, is virtual, for:",
1412
+ mutation);
1413
+ return;
1414
+ }
1415
+
1416
+ // First, collect all final mutations that could impact this immediate
1417
+ // mutation.
1418
+ std::vector<ShadowViewMutation *> candidateMutations{};
1531
1419
 
1532
- // DEBUG ONLY: list existing inflight animations
1533
- #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1534
- LOG(ERROR) << "FINISHING DISPLAYING ONGOING inflightAnimations_!";
1535
- int i = 0;
1536
- int j = 0;
1537
- for (auto const &inflightAnimation : inflightAnimations_) {
1538
- i++;
1539
- j = 0;
1420
+ for (auto inflightAnimationIt =
1421
+ inflightAnimations_.rbegin() + (skipLastAnimation ? 1 : 0);
1422
+ inflightAnimationIt != inflightAnimations_.rend();
1423
+ inflightAnimationIt++) {
1424
+ auto &inflightAnimation = *inflightAnimationIt;
1425
+
1426
+ if (inflightAnimation.surfaceId != surfaceId) {
1427
+ continue;
1428
+ }
1540
1429
  if (inflightAnimation.completed) {
1541
1430
  continue;
1542
1431
  }
1543
- for (auto &keyframe : inflightAnimation.keyFrames) {
1544
- j++;
1545
- if (keyframe.invalidated) {
1432
+
1433
+ for (auto it = inflightAnimation.keyFrames.begin();
1434
+ it != inflightAnimation.keyFrames.end();
1435
+ it++) {
1436
+ auto &animatedKeyFrame = *it;
1437
+
1438
+ if (animatedKeyFrame.invalidated) {
1546
1439
  continue;
1547
1440
  }
1548
- if (keyframe.finalMutationForKeyFrame &&
1549
- !mutatedViewIsVirtual(*keyframe.finalMutationForKeyFrame)) {
1550
- std::string msg = "Animation " + std::to_string(i) + " keyframe " +
1551
- std::to_string(j) + ": Final Animation";
1552
- PrintMutationInstruction(msg, *keyframe.finalMutationForKeyFrame);
1553
- } else {
1554
- LOG(ERROR) << "Animation " << i << " keyframe " << j << ": on tag: ["
1555
- << keyframe.viewStart.tag << "]";
1441
+
1442
+ // Detect if they're in the same view hierarchy, but not equivalent
1443
+ // (We've already detected direct conflicts and handled them above)
1444
+ if (animatedKeyFrame.parentView.tag != mutation.parentShadowView.tag) {
1445
+ continue;
1556
1446
  }
1557
- }
1558
- }
1559
- LOG(ERROR) << "FINISHING DONE DISPLAYING ONGOING inflightAnimations_!";
1560
- #endif
1561
1447
 
1562
- // Signal to delegate if all animations are complete, or if we were not
1563
- // animating anything and now some animation exists.
1564
- if (inflightAnimationsExistInitially && inflightAnimations_.empty()) {
1565
- std::lock_guard<std::mutex> lock(layoutAnimationStatusDelegateMutex_);
1566
- if (layoutAnimationStatusDelegate_ != nullptr) {
1567
- layoutAnimationStatusDelegate_->onAllAnimationsComplete();
1568
- }
1569
- } else if (
1570
- !inflightAnimationsExistInitially && !inflightAnimations_.empty()) {
1571
- std::lock_guard<std::mutex> lock(layoutAnimationStatusDelegateMutex_);
1572
- if (layoutAnimationStatusDelegate_ != nullptr) {
1573
- layoutAnimationStatusDelegate_->onAnimationStarted();
1448
+ for (auto &finalAnimationMutation :
1449
+ animatedKeyFrame.finalMutationsForKeyFrame) {
1450
+ if (finalAnimationMutation.oldChildShadowView.tag == tag) {
1451
+ continue;
1452
+ }
1453
+
1454
+ if (finalAnimationMutation.type != ShadowViewMutation::Type::Remove) {
1455
+ continue;
1456
+ }
1457
+ if (finalAnimationMutation.mutatedViewIsVirtual()) {
1458
+ continue;
1459
+ }
1460
+
1461
+ PrintMutationInstructionRelative(
1462
+ "[IndexAdjustment] adjustDelayedMutationIndicesForMutation: CANDIDATE:",
1463
+ mutation,
1464
+ finalAnimationMutation);
1465
+ candidateMutations.push_back(&finalAnimationMutation);
1466
+ }
1574
1467
  }
1575
1468
  }
1576
1469
 
1577
- return MountingTransaction{
1578
- surfaceId, transactionNumber, std::move(mutations), telemetry};
1470
+ // Because the finalAnimations are not sorted in any way, it is possible to
1471
+ // have some sequence like:
1472
+ // * DELAYED REMOVE 10 from {TAG}
1473
+ // * DELAYED REMOVE 9 from {TAG}
1474
+ // * ...
1475
+ // * DELAYED REMOVE 5 from {TAG}
1476
+ // with mutation: INSERT 6/REMOVE 6. This would cause the first few mutations
1477
+ // to *not* be adjusted, even though they would be impacted by mutation or
1478
+ // vice-versa after later adjustments are applied. Therefore, we just keep
1479
+ // recursing while there are any changes. This isn't great, but is good enough
1480
+ // for now until we change these data-structures.
1481
+ bool changed = true;
1482
+ while (changed) {
1483
+ changed = false;
1484
+ candidateMutations.erase(
1485
+ std::remove_if(
1486
+ candidateMutations.begin(),
1487
+ candidateMutations.end(),
1488
+ [&mutation, &isRemoveMutation, &isInsertMutation, &changed](
1489
+ ShadowViewMutation *candidateMutation) {
1490
+ if (isRemoveMutation &&
1491
+ mutation.index <= candidateMutation->index) {
1492
+ candidateMutation->index--;
1493
+ changed = true;
1494
+ PrintMutationInstructionRelative(
1495
+ "[IndexAdjustment] adjustDelayedMutationIndicesForMutation: Adjusting mutation DOWNWARD",
1496
+ mutation,
1497
+ *candidateMutation);
1498
+ return true;
1499
+ } else if (
1500
+ isInsertMutation &&
1501
+ mutation.index <= candidateMutation->index) {
1502
+ candidateMutation->index++;
1503
+ changed = true;
1504
+ PrintMutationInstructionRelative(
1505
+ "[IndexAdjustment] adjustDelayedMutationIndicesForMutation: Adjusting mutation UPWARD",
1506
+ mutation,
1507
+ *candidateMutation);
1508
+ return true;
1509
+ }
1510
+ return false;
1511
+ }),
1512
+ candidateMutations.end());
1513
+ }
1579
1514
  }
1580
1515
 
1581
- bool LayoutAnimationKeyFrameManager::mutatedViewIsVirtual(
1582
- ShadowViewMutation const &mutation) const {
1583
- bool viewIsVirtual = false;
1584
-
1585
- // TODO: extract this into an Android platform-specific class?
1586
- // Explanation: for "Insert" mutations, oldChildShadowView is always empty.
1587
- // for "Remove" mutations, newChildShadowView is always empty.
1588
- #ifdef ANDROID
1589
- viewIsVirtual =
1590
- mutation.newChildShadowView.layoutMetrics == EmptyLayoutMetrics &&
1591
- mutation.oldChildShadowView.layoutMetrics == EmptyLayoutMetrics;
1592
- #endif
1593
- return viewIsVirtual;
1594
- }
1516
+ void LayoutAnimationKeyFrameManager::getAndEraseConflictingAnimations(
1517
+ SurfaceId surfaceId,
1518
+ ShadowViewMutationList const &mutations,
1519
+ std::vector<AnimationKeyFrame> &conflictingAnimations) const {
1520
+ ShadowViewMutationList localConflictingMutations{};
1521
+ for (auto const &mutation : mutations) {
1522
+ bool mutationIsCreateOrDelete =
1523
+ mutation.type == ShadowViewMutation::Type::Create ||
1524
+ mutation.type == ShadowViewMutation::Type::Delete;
1525
+ auto const &baselineShadowView =
1526
+ (mutation.type == ShadowViewMutation::Type::Insert ||
1527
+ mutation.type == ShadowViewMutation::Type::Create)
1528
+ ? mutation.newChildShadowView
1529
+ : mutation.oldChildShadowView;
1530
+ auto baselineTag = baselineShadowView.tag;
1595
1531
 
1596
- bool LayoutAnimationKeyFrameManager::hasComponentDescriptorForShadowView(
1597
- ShadowView const &shadowView) const {
1598
- return componentDescriptorRegistry_->hasComponentDescriptorAt(
1599
- shadowView.componentHandle);
1600
- }
1532
+ for (auto &inflightAnimation : inflightAnimations_) {
1533
+ if (inflightAnimation.surfaceId != surfaceId) {
1534
+ continue;
1535
+ }
1536
+ if (inflightAnimation.completed) {
1537
+ continue;
1538
+ }
1601
1539
 
1602
- ComponentDescriptor const &
1603
- LayoutAnimationKeyFrameManager::getComponentDescriptorForShadowView(
1604
- ShadowView const &shadowView) const {
1605
- return componentDescriptorRegistry_->at(shadowView.componentHandle);
1606
- }
1540
+ for (auto it = inflightAnimation.keyFrames.begin();
1541
+ it != inflightAnimation.keyFrames.end();) {
1542
+ auto &animatedKeyFrame = *it;
1607
1543
 
1608
- void LayoutAnimationKeyFrameManager::setComponentDescriptorRegistry(
1609
- const SharedComponentDescriptorRegistry &componentDescriptorRegistry) {
1610
- componentDescriptorRegistry_ = componentDescriptorRegistry;
1611
- }
1544
+ if (animatedKeyFrame.invalidated) {
1545
+ continue;
1546
+ }
1612
1547
 
1613
- /**
1614
- * Given a `progress` between 0 and 1, a mutation and LayoutAnimation config,
1615
- * return a ShadowView with mutated props and/or LayoutMetrics.
1616
- *
1617
- * @param progress
1618
- * @param layoutAnimation
1619
- * @param animatedMutation
1620
- * @return
1621
- */
1622
- ShadowView LayoutAnimationKeyFrameManager::createInterpolatedShadowView(
1623
- double progress,
1624
- ShadowView startingView,
1625
- ShadowView finalView) const {
1626
- if (!hasComponentDescriptorForShadowView(startingView)) {
1627
- return finalView;
1628
- }
1629
- ComponentDescriptor const &componentDescriptor =
1630
- getComponentDescriptorForShadowView(startingView);
1548
+ // A conflict is when either: the animated node itself is mutated
1549
+ // directly; or, the parent of the node is created or deleted. In cases
1550
+ // of reparenting - say, the parent is deleted but the node was moved to
1551
+ // a different parent first - the reparenting (remove/insert) conflict
1552
+ // will be detected before we process the parent DELETE.
1553
+ // Parent deletion is important because deleting a parent recursively
1554
+ // deletes all children. If we previously deferred deletion of a child,
1555
+ // we need to force deletion/removal to happen immediately.
1556
+ bool conflicting = animatedKeyFrame.tag == baselineTag ||
1557
+ (mutationIsCreateOrDelete &&
1558
+ animatedKeyFrame.parentView.tag == baselineTag &&
1559
+ animatedKeyFrame.parentView.tag != 0);
1631
1560
 
1632
- // Base the mutated view on the finalView, so that the following stay
1633
- // consistent:
1634
- // - state
1635
- // - eventEmitter
1636
- // For now, we do not allow interpolation of state. And we probably never
1637
- // will, so make sure we always keep the mounting layer consistent with the
1638
- // "final" state.
1639
- auto mutatedShadowView = ShadowView(finalView);
1561
+ // Conflicting animation detected: if we're mutating a tag under
1562
+ // animation, or deleting the parent of a tag under animation, or
1563
+ // reparenting.
1564
+ if (conflicting) {
1565
+ animatedKeyFrame.invalidated = true;
1640
1566
 
1641
- if (startingView.props == nullptr || finalView.props == nullptr) {
1642
- return finalView;
1643
- }
1567
+ // We construct a list of all conflicting animations, whether or not
1568
+ // they have a "final mutation" to execute. This is important with,
1569
+ // for example, "insert" mutations where the final update needs to set
1570
+ // opacity to "1", even if there's no final ShadowNode update.
1571
+ // TODO: don't animate virtual views in the first place?
1572
+ bool isVirtual = false;
1573
+ for (const auto &finalMutationForKeyFrame :
1574
+ animatedKeyFrame.finalMutationsForKeyFrame) {
1575
+ isVirtual =
1576
+ isVirtual || finalMutationForKeyFrame.mutatedViewIsVirtual();
1644
1577
 
1645
- // Animate opacity or scale/transform
1646
- mutatedShadowView.props = componentDescriptor.interpolateProps(
1647
- progress, startingView.props, finalView.props);
1578
+ #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1579
+ PrintMutationInstructionRelative(
1580
+ "Found mutation that conflicts with existing in-flight animation:",
1581
+ mutation,
1582
+ finalMutationForKeyFrame);
1583
+ #endif
1584
+ }
1648
1585
 
1649
- // Interpolate LayoutMetrics
1650
- LayoutMetrics const &finalLayoutMetrics = finalView.layoutMetrics;
1651
- LayoutMetrics const &baselineLayoutMetrics = startingView.layoutMetrics;
1652
- LayoutMetrics interpolatedLayoutMetrics = finalLayoutMetrics;
1653
- interpolatedLayoutMetrics.frame.origin.x = interpolateFloats(
1654
- progress,
1655
- baselineLayoutMetrics.frame.origin.x,
1656
- finalLayoutMetrics.frame.origin.x);
1657
- interpolatedLayoutMetrics.frame.origin.y = interpolateFloats(
1658
- progress,
1659
- baselineLayoutMetrics.frame.origin.y,
1660
- finalLayoutMetrics.frame.origin.y);
1661
- interpolatedLayoutMetrics.frame.size.width = interpolateFloats(
1662
- progress,
1663
- baselineLayoutMetrics.frame.size.width,
1664
- finalLayoutMetrics.frame.size.width);
1665
- interpolatedLayoutMetrics.frame.size.height = interpolateFloats(
1666
- progress,
1667
- baselineLayoutMetrics.frame.size.height,
1668
- finalLayoutMetrics.frame.size.height);
1669
- mutatedShadowView.layoutMetrics = interpolatedLayoutMetrics;
1586
+ conflictingAnimations.push_back(animatedKeyFrame);
1587
+ for (const auto &finalMutationForKeyFrame :
1588
+ animatedKeyFrame.finalMutationsForKeyFrame) {
1589
+ if (!isVirtual ||
1590
+ finalMutationForKeyFrame.type ==
1591
+ ShadowViewMutation::Type::Delete) {
1592
+ localConflictingMutations.push_back(finalMutationForKeyFrame);
1593
+ }
1594
+ }
1670
1595
 
1671
- return mutatedShadowView;
1672
- }
1596
+ // Delete from existing animation
1597
+ it = inflightAnimation.keyFrames.erase(it);
1598
+ } else {
1599
+ it++;
1600
+ }
1601
+ }
1602
+ }
1603
+ }
1673
1604
 
1674
- void LayoutAnimationKeyFrameManager::callCallback(
1675
- const LayoutAnimationCallbackWrapper &callback) const {
1676
- if (callback.readyForCleanup()) {
1677
- return;
1605
+ // Recurse, in case conflicting mutations conflict with other existing
1606
+ // animations
1607
+ if (!localConflictingMutations.empty()) {
1608
+ getAndEraseConflictingAnimations(
1609
+ surfaceId, localConflictingMutations, conflictingAnimations);
1678
1610
  }
1611
+ }
1679
1612
 
1680
- // Callbacks can only be called once. Replace the callsite with an empty
1681
- // CallbackWrapper. We use a unique_ptr to avoid copying into the vector.
1682
- std::unique_ptr<LayoutAnimationCallbackWrapper> copiedCallback(
1683
- std::make_unique<LayoutAnimationCallbackWrapper>(callback));
1613
+ void LayoutAnimationKeyFrameManager::deleteAnimationsForStoppedSurfaces()
1614
+ const {
1615
+ bool inflightAnimationsExistInitially = !inflightAnimations_.empty();
1684
1616
 
1685
- // Call the callback that is being retained in the vector
1686
- copiedCallback->call(runtimeExecutor_);
1617
+ // Execute stopSurface on any ongoing animations
1618
+ if (inflightAnimationsExistInitially) {
1619
+ better::set<SurfaceId> surfaceIdsToStop{};
1620
+ {
1621
+ std::lock_guard<std::mutex> lock(surfaceIdsToStopMutex_);
1622
+ surfaceIdsToStop = surfaceIdsToStop_;
1623
+ surfaceIdsToStop_.clear();
1624
+ }
1687
1625
 
1688
- // Protect with a mutex: this can be called on failure callbacks in the JS
1689
- // thread and success callbacks on the UI thread
1690
- {
1691
- std::lock_guard<std::mutex> lock(callbackWrappersPendingMutex_);
1626
+ for (auto it = inflightAnimations_.begin();
1627
+ it != inflightAnimations_.end();) {
1628
+ const auto &animation = *it;
1692
1629
 
1693
- // Clean any stale data in the retention vector
1694
- callbackWrappersPending_.erase(
1695
- std::remove_if(
1696
- callbackWrappersPending_.begin(),
1697
- callbackWrappersPending_.end(),
1698
- [](const std::unique_ptr<LayoutAnimationCallbackWrapper> &wrapper) {
1699
- return wrapper->readyForCleanup();
1700
- }),
1701
- callbackWrappersPending_.end());
1630
+ #ifdef LAYOUT_ANIMATION_VERBOSE_LOGGING
1631
+ LOG(ERROR)
1632
+ << "LayoutAnimations: stopping animation due to stopSurface on "
1633
+ << surfaceId;
1634
+ #endif
1635
+ if (surfaceIdsToStop.find(animation.surfaceId) !=
1636
+ surfaceIdsToStop.end()) {
1637
+ it = inflightAnimations_.erase(it);
1638
+ } else {
1639
+ it++;
1640
+ }
1641
+ }
1642
+ }
1643
+ }
1702
1644
 
1703
- // Hold onto a reference to the callback, only while
1704
- // LayoutAnimationKeyFrameManager is alive and the callback hasn't completed
1705
- // yet.
1706
- callbackWrappersPending_.push_back(std::move(copiedCallback));
1645
+ void LayoutAnimationKeyFrameManager::simulateImagePropsMemoryAccess(
1646
+ ShadowViewMutationList const &mutations) const {
1647
+ if (!simulateImagePropsMemoryAccess_) {
1648
+ return;
1649
+ }
1650
+ for (auto const &mutation : mutations) {
1651
+ if (mutation.type != ShadowViewMutation::Type::Insert) {
1652
+ continue;
1653
+ }
1654
+ if (strcmp(mutation.newChildShadowView.componentName, "Image") == 0) {
1655
+ auto const &imageProps = *std::static_pointer_cast<ImageProps const>(
1656
+ mutation.newChildShadowView.props);
1657
+ int temp = 0;
1658
+ switch (imageProps.resizeMode) {
1659
+ case ImageResizeMode::Cover:
1660
+ temp = 1;
1661
+ break;
1662
+ case ImageResizeMode::Contain:
1663
+ temp = 2;
1664
+ break;
1665
+ case ImageResizeMode::Stretch:
1666
+ temp = 3;
1667
+ break;
1668
+ case ImageResizeMode::Center:
1669
+ temp = 4;
1670
+ break;
1671
+ case ImageResizeMode::Repeat:
1672
+ temp = 5;
1673
+ break;
1674
+ }
1675
+ (void)temp;
1676
+ }
1707
1677
  }
1708
1678
  }
1709
1679