react-native 0.83.0-nightly-20250922-5ef054921 → 0.83.0-nightly-20250924-53f89bacd

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 (76) hide show
  1. package/Libraries/Animated/components/AnimatedFlatList.js +5 -3
  2. package/Libraries/Animated/components/AnimatedSectionList.js +2 -2
  3. package/Libraries/Components/TextInput/TextInput.js +6 -0
  4. package/Libraries/Components/View/ViewNativeComponent.js +2 -2
  5. package/Libraries/Core/ReactNativeVersion.js +1 -1
  6. package/Libraries/Utilities/DevLoadingView.js +14 -6
  7. package/Libraries/Utilities/HMRClient.js +7 -4
  8. package/React/Base/RCTVersion.m +1 -1
  9. package/React/CoreModules/RCTAppearance.h +1 -1
  10. package/React/CoreModules/RCTDevLoadingView.mm +3 -10
  11. package/React/FBReactNativeSpec/FBReactNativeSpecJSI-generated.cpp +6 -0
  12. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +9 -0
  13. package/React/Views/RCTBorderDrawing.h +1 -1
  14. package/ReactAndroid/api/ReactAndroid.api +4 -1
  15. package/ReactAndroid/gradle.properties +1 -1
  16. package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt +5 -1
  17. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DefaultDevLoadingViewImplementation.kt +13 -3
  18. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +7 -14
  19. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevLoadingViewManager.kt +2 -0
  20. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorDevHelper.kt +4 -0
  21. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +20 -31
  22. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +3 -3
  23. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +7 -1
  24. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +11 -1
  25. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +3 -1
  26. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +3 -1
  27. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +12 -1
  28. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +3 -1
  29. package/ReactAndroid/src/main/java/com/facebook/react/modules/devloading/DevLoadingModule.kt +3 -1
  30. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  31. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutAnimationController.kt +22 -174
  32. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java +38 -3
  33. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java +13 -2
  34. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +15 -1
  35. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +4 -1
  36. package/ReactAndroid/src/main/jni/react/jni/JReactMarker.h +6 -8
  37. package/ReactCommon/cxxreact/JSExecutor.h +1 -1
  38. package/ReactCommon/cxxreact/JSIndexedRAMBundle.h +4 -4
  39. package/ReactCommon/cxxreact/ReactMarker.h +6 -8
  40. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  41. package/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +1 -1
  42. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +5 -1
  43. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +6 -1
  44. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +68 -50
  45. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +4 -2
  46. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +5 -1
  47. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +10 -1
  48. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +2 -1
  49. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +6 -1
  50. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +3 -1
  51. package/ReactCommon/react/renderer/components/text/RawTextShadowNode.cpp +1 -0
  52. package/ReactCommon/react/renderer/components/view/conversions.h +30 -3
  53. package/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.cpp +26 -13
  54. package/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h +2 -0
  55. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHermesInstance.h +8 -8
  56. package/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHermesInstance.mm +3 -15
  57. package/package.json +8 -8
  58. package/sdks/hermesc/osx-bin/hermes +0 -0
  59. package/sdks/hermesc/osx-bin/hermesc +0 -0
  60. package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
  61. package/src/private/featureflags/ReactNativeFeatureFlags.js +6 -1
  62. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +2 -1
  63. package/src/private/webapis/dom/nodes/ReactNativeElement.js +12 -2
  64. package/types_generated/Libraries/Components/View/ViewNativeComponent.d.ts +3 -3
  65. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/AbstractLayoutAnimation.kt +0 -137
  66. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/AnimatedPropertyType.kt +0 -42
  67. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/BaseLayoutAnimation.kt +0 -96
  68. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/InterpolatorType.kt +0 -43
  69. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutAnimationType.kt +0 -46
  70. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutCreateAnimation.kt +0 -33
  71. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutDeleteAnimation.kt +0 -37
  72. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutHandlingAnimation.kt +0 -42
  73. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/LayoutUpdateAnimation.kt +0 -66
  74. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/OpacityAnimation.kt +0 -77
  75. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/PositionAndSizeAnimation.kt +0 -98
  76. package/ReactAndroid/src/main/java/com/facebook/react/uimanager/layoutanimation/SimpleSpringInterpolator.kt +0 -62
@@ -14,8 +14,10 @@ import FlatList, {type FlatListProps} from '../../Lists/FlatList';
14
14
  import createAnimatedComponent from '../createAnimatedComponent';
15
15
  import * as React from 'react';
16
16
 
17
- // $FlowExpectedError[unclear-type]
18
- export default (createAnimatedComponent(FlatList): component<ItemT = any>(
17
+ export default createAnimatedComponent(FlatList) as $FlowFixMe as component<
18
+ // $FlowExpectedError[unclear-type]
19
+ ItemT = any,
20
+ >(
19
21
  ref?: React.RefSetter<FlatList<ItemT>>,
20
22
  ...props: AnimatedProps<FlatListProps<ItemT>>
21
- ));
23
+ );
@@ -15,7 +15,7 @@ import createAnimatedComponent from '../createAnimatedComponent';
15
15
  import * as React from 'react';
16
16
 
17
17
  // $FlowFixMe[incompatible-type]
18
- export default (createAnimatedComponent(SectionList): component<
18
+ export default createAnimatedComponent(SectionList) as $FlowFixMe as component<
19
19
  // $FlowExpectedError[unclear-type]
20
20
  ItemT = any,
21
21
  // $FlowExpectedError[unclear-type]
@@ -23,4 +23,4 @@ export default (createAnimatedComponent(SectionList): component<
23
23
  >(
24
24
  ref?: React.RefSetter<SectionList<ItemT, SectionT>>,
25
25
  ...props: AnimatedProps<SectionListProps<ItemT, SectionT>>
26
- ));
26
+ );
@@ -449,6 +449,12 @@ function InternalTextInput(props: TextInputProps): React.Node {
449
449
  before we can get to the long term breaking change.
450
450
  */
451
451
  if (instance != null) {
452
+ // Register the input immediately when the ref is set so that focus()
453
+ // can be called from ref callbacks
454
+ // Double registering during useLayoutEffect is fine, because the underlying
455
+ // state is a Set.
456
+ TextInputState.registerInput(instance);
457
+
452
458
  // $FlowFixMe[prop-missing] - See the explanation above.
453
459
  // $FlowFixMe[unsafe-object-assign]
454
460
  Object.assign(instance, {
@@ -21,8 +21,8 @@ const ViewNativeComponent: HostComponent<Props> =
21
21
  }));
22
22
 
23
23
  interface NativeCommands {
24
- +focus: () => void;
25
- +blur: () => void;
24
+ +focus: (viewRef: HostInstance) => void;
25
+ +blur: (viewRef: HostInstance) => void;
26
26
  +hotspotUpdate: (viewRef: HostInstance, x: number, y: number) => void;
27
27
  +setPressed: (viewRef: HostInstance, pressed: boolean) => void;
28
28
  }
@@ -29,7 +29,7 @@ export default class ReactNativeVersion {
29
29
  static major: number = 0;
30
30
  static minor: number = 83;
31
31
  static patch: number = 0;
32
- static prerelease: string | null = 'nightly-20250922-5ef054921';
32
+ static prerelease: string | null = 'nightly-20250924-53f89bacd';
33
33
 
34
34
  static getVersionString(): string {
35
35
  return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`;
@@ -14,29 +14,37 @@ import NativeDevLoadingView from './NativeDevLoadingView';
14
14
 
15
15
  const COLOR_SCHEME = {
16
16
  dark: {
17
+ load: {
18
+ backgroundColor: '#fafafa',
19
+ textColor: '#242526',
20
+ },
17
21
  refresh: {
18
22
  backgroundColor: '#2584e8',
19
23
  textColor: '#ffffff',
20
24
  },
21
- load: {
22
- backgroundColor: '#fafafa',
23
- textColor: '#242526',
25
+ error: {
26
+ backgroundColor: '#1065AF',
27
+ textColor: '#ffffff',
24
28
  },
25
29
  },
26
30
  default: {
31
+ load: {
32
+ backgroundColor: '#404040',
33
+ textColor: '#ffffff',
34
+ },
27
35
  refresh: {
28
36
  backgroundColor: '#2584e8',
29
37
  textColor: '#ffffff',
30
38
  },
31
- load: {
32
- backgroundColor: '#404040',
39
+ error: {
40
+ backgroundColor: '#1065AF',
33
41
  textColor: '#ffffff',
34
42
  },
35
43
  },
36
44
  };
37
45
 
38
46
  export default {
39
- showMessage(message: string, type: 'load' | 'refresh') {
47
+ showMessage(message: string, type: 'load' | 'refresh' | 'error') {
40
48
  if (NativeDevLoadingView) {
41
49
  const colorScheme =
42
50
  getColorScheme() === 'dark' ? COLOR_SCHEME.dark : COLOR_SCHEME.default;
@@ -232,8 +232,6 @@ Error: ${e.message}`;
232
232
  });
233
233
 
234
234
  client.on('error', data => {
235
- DevLoadingView.hide();
236
-
237
235
  if (data.type === 'GraphNotFoundError') {
238
236
  client.close();
239
237
  setHMRUnavailableReason(
@@ -253,8 +251,6 @@ Error: ${e.message}`;
253
251
  });
254
252
 
255
253
  client.on('close', closeEvent => {
256
- DevLoadingView.hide();
257
-
258
254
  // https://www.rfc-editor.org/rfc/rfc6455.html#section-7.4.1
259
255
  // https://www.rfc-editor.org/rfc/rfc6455.html#section-7.1.5
260
256
  const isNormalOrUnsetCloseReason =
@@ -296,10 +292,17 @@ function setHMRUnavailableReason(reason: string) {
296
292
  }
297
293
  hmrUnavailableReason = reason;
298
294
 
295
+ const DevLoadingView = require('./DevLoadingView').default;
296
+ DevLoadingView.hide();
297
+
299
298
  // We only want to show a warning if Fast Refresh is on *and* if we ever
300
299
  // previously managed to connect successfully. We don't want to show
301
300
  // the warning to native engineers who use cached bundles without Metro.
302
301
  if (hmrClient.isEnabled() && didConnect) {
302
+ DevLoadingView.showMessage(
303
+ 'Fast Refresh disconnected. Reload app to reconnect.',
304
+ 'error',
305
+ );
303
306
  console.warn(reason);
304
307
  // (Not using the `warning` module to prevent a Buck cycle.)
305
308
  }
@@ -24,7 +24,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(83),
26
26
  RCTVersionPatch: @(0),
27
- RCTVersionPrerelease: @"nightly-20250922-5ef054921",
27
+ RCTVersionPrerelease: @"nightly-20250924-53f89bacd",
28
28
  };
29
29
  });
30
30
  return __rnVersion;
@@ -12,7 +12,7 @@
12
12
  #import <React/RCTEventEmitter.h>
13
13
 
14
14
  RCT_EXTERN void RCTEnableAppearancePreference(BOOL enabled);
15
- RCT_EXTERN void RCTOverrideAppearancePreference(NSString *const);
15
+ RCT_EXTERN void RCTOverrideAppearancePreference(NSString *);
16
16
  RCT_EXTERN void RCTUseKeyWindowForSystemStyle(BOOL useMainScreen);
17
17
  RCT_EXTERN NSString *RCTCurrentOverrideAppearancePreference(void);
18
18
  RCT_EXTERN NSString *RCTColorSchemePreference(UITraitCollection *traitCollection);
@@ -85,14 +85,6 @@ RCT_EXPORT_MODULE()
85
85
  dispatch_time(DISPATCH_TIME_NOW, 0.2 * NSEC_PER_SEC), dispatch_get_main_queue(), self->_initialMessageBlock);
86
86
  }
87
87
 
88
- - (void)hideBannerAfter:(CGFloat)delay
89
- {
90
- // Cancel previous hide call after the delay.
91
- [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(hide) object:nil];
92
- // Set new hide call after a delay.
93
- [self performSelector:@selector(hide) withObject:nil afterDelay:delay];
94
- }
95
-
96
88
  - (void)showMessage:(NSString *)message color:(UIColor *)color backgroundColor:(UIColor *)backgroundColor
97
89
  {
98
90
  if (!RCTDevLoadingViewGetEnabled() || _hiding) {
@@ -128,6 +120,9 @@ RCT_EXPORT_MODULE()
128
120
  self->_container = [[UIView alloc] init];
129
121
  self->_container.backgroundColor = backgroundColor;
130
122
  self->_container.translatesAutoresizingMaskIntoConstraints = NO;
123
+ UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hide)];
124
+ [self->_container addGestureRecognizer:tapGesture];
125
+ self->_container.userInteractionEnabled = YES;
131
126
 
132
127
  self->_label = [[UILabel alloc] init];
133
128
  self->_label.translatesAutoresizingMaskIntoConstraints = NO;
@@ -158,8 +153,6 @@ RCT_EXPORT_MODULE()
158
153
  [self->_label.centerXAnchor constraintEqualToAnchor:self->_container.centerXAnchor],
159
154
  [self->_label.bottomAnchor constraintEqualToAnchor:self->_container.bottomAnchor constant:-5],
160
155
  ]];
161
-
162
- [self hideBannerAfter:15.0];
163
156
  });
164
157
  }
165
158
 
@@ -212,6 +212,11 @@ static jsi::Value __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableI
212
212
  rt
213
213
  );
214
214
  }
215
+ static jsi::Value __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImagePrefetchingJNIBatchingAndroid(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
216
+ return static_cast<NativeReactNativeFeatureFlagsCxxSpecJSI *>(&turboModule)->enableImagePrefetchingJNIBatchingAndroid(
217
+ rt
218
+ );
219
+ }
215
220
  static jsi::Value __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImagePrefetchingOnUiThreadAndroid(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
216
221
  return static_cast<NativeReactNativeFeatureFlagsCxxSpecJSI *>(&turboModule)->enableImagePrefetchingOnUiThreadAndroid(
217
222
  rt
@@ -486,6 +491,7 @@ NativeReactNativeFeatureFlagsCxxSpecJSI::NativeReactNativeFeatureFlagsCxxSpecJSI
486
491
  methodMap_["enableIOSTextBaselineOffsetPerLine"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableIOSTextBaselineOffsetPerLine};
487
492
  methodMap_["enableIOSViewClipToPaddingBox"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableIOSViewClipToPaddingBox};
488
493
  methodMap_["enableImagePrefetchingAndroid"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImagePrefetchingAndroid};
494
+ methodMap_["enableImagePrefetchingJNIBatchingAndroid"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImagePrefetchingJNIBatchingAndroid};
489
495
  methodMap_["enableImagePrefetchingOnUiThreadAndroid"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImagePrefetchingOnUiThreadAndroid};
490
496
  methodMap_["enableImmediateUpdateModeForContentOffsetChanges"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImmediateUpdateModeForContentOffsetChanges};
491
497
  methodMap_["enableImperativeFocus"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableImperativeFocus};
@@ -352,6 +352,7 @@ public:
352
352
  virtual bool enableIOSTextBaselineOffsetPerLine(jsi::Runtime &rt) = 0;
353
353
  virtual bool enableIOSViewClipToPaddingBox(jsi::Runtime &rt) = 0;
354
354
  virtual bool enableImagePrefetchingAndroid(jsi::Runtime &rt) = 0;
355
+ virtual bool enableImagePrefetchingJNIBatchingAndroid(jsi::Runtime &rt) = 0;
355
356
  virtual bool enableImagePrefetchingOnUiThreadAndroid(jsi::Runtime &rt) = 0;
356
357
  virtual bool enableImmediateUpdateModeForContentOffsetChanges(jsi::Runtime &rt) = 0;
357
358
  virtual bool enableImperativeFocus(jsi::Runtime &rt) = 0;
@@ -639,6 +640,14 @@ private:
639
640
  return bridging::callFromJs<bool>(
640
641
  rt, &T::enableImagePrefetchingAndroid, jsInvoker_, instance_);
641
642
  }
643
+ bool enableImagePrefetchingJNIBatchingAndroid(jsi::Runtime &rt) override {
644
+ static_assert(
645
+ bridging::getParameterCount(&T::enableImagePrefetchingJNIBatchingAndroid) == 1,
646
+ "Expected enableImagePrefetchingJNIBatchingAndroid(...) to have 1 parameters");
647
+
648
+ return bridging::callFromJs<bool>(
649
+ rt, &T::enableImagePrefetchingJNIBatchingAndroid, jsInvoker_, instance_);
650
+ }
642
651
  bool enableImagePrefetchingOnUiThreadAndroid(jsi::Runtime &rt) override {
643
652
  static_assert(
644
653
  bridging::getParameterCount(&T::enableImagePrefetchingOnUiThreadAndroid) == 1,
@@ -61,7 +61,7 @@ RCT_EXTERN CGPathRef RCTPathCreateWithRoundedRect(
61
61
  CGRect bounds,
62
62
  RCTCornerInsets cornerInsets,
63
63
  const CGAffineTransform *transform,
64
- const BOOL inverted);
64
+ BOOL inverted);
65
65
 
66
66
  /**
67
67
  * Draw a CSS-compliant border as an image. You can determine if it's scalable
@@ -1892,6 +1892,7 @@ public final class com/facebook/react/devsupport/DefaultDevLoadingViewImplementa
1892
1892
  public fun <init> (Lcom/facebook/react/devsupport/ReactInstanceDevHelper;)V
1893
1893
  public fun hide ()V
1894
1894
  public fun showMessage (Ljava/lang/String;)V
1895
+ public fun showMessage (Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V
1895
1896
  public fun updateProgress (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)V
1896
1897
  }
1897
1898
 
@@ -2119,6 +2120,7 @@ public abstract interface class com/facebook/react/devsupport/interfaces/DevBund
2119
2120
  public abstract interface class com/facebook/react/devsupport/interfaces/DevLoadingViewManager {
2120
2121
  public abstract fun hide ()V
2121
2122
  public abstract fun showMessage (Ljava/lang/String;)V
2123
+ public abstract fun showMessage (Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;)V
2122
2124
  public abstract fun updateProgress (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)V
2123
2125
  }
2124
2126
 
@@ -5564,7 +5566,7 @@ public final class com/facebook/react/views/scroll/ReactHorizontalScrollContaine
5564
5566
  public final class com/facebook/react/views/scroll/ReactHorizontalScrollContainerViewManager$Companion {
5565
5567
  }
5566
5568
 
5567
- public class com/facebook/react/views/scroll/ReactHorizontalScrollView : android/widget/HorizontalScrollView, android/view/View$OnLayoutChangeListener, android/view/ViewGroup$OnHierarchyChangeListener, com/facebook/react/uimanager/ReactClippingViewGroup, com/facebook/react/uimanager/ReactOverflowViewWithInset, com/facebook/react/views/scroll/ReactAccessibleScrollView, com/facebook/react/views/scroll/ReactScrollViewHelper$HasFlingAnimator, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollEventThrottle, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollState, com/facebook/react/views/scroll/ReactScrollViewHelper$HasSmoothScroll, com/facebook/react/views/scroll/ReactScrollViewHelper$HasStateWrapper {
5569
+ public class com/facebook/react/views/scroll/ReactHorizontalScrollView : android/widget/HorizontalScrollView, android/view/View$OnLayoutChangeListener, android/view/ViewGroup$OnHierarchyChangeListener, com/facebook/react/uimanager/ReactClippingViewGroup, com/facebook/react/uimanager/ReactOverflowViewWithInset, com/facebook/react/views/scroll/ReactAccessibleScrollView, com/facebook/react/views/scroll/ReactScrollViewHelper$HasFlingAnimator, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollEventThrottle, com/facebook/react/views/scroll/ReactScrollViewHelper$HasScrollState, com/facebook/react/views/scroll/ReactScrollViewHelper$HasSmoothScroll, com/facebook/react/views/scroll/ReactScrollViewHelper$HasStateWrapper, com/facebook/react/views/scroll/VirtualViewContainer {
5568
5570
  public fun <init> (Landroid/content/Context;)V
5569
5571
  public fun <init> (Landroid/content/Context;Lcom/facebook/react/views/scroll/FpsListener;)V
5570
5572
  public fun abortAnimation ()V
@@ -5594,6 +5596,7 @@ public class com/facebook/react/views/scroll/ReactHorizontalScrollView : android
5594
5596
  public fun getScrollEnabled ()Z
5595
5597
  public fun getScrollEventThrottle ()I
5596
5598
  public fun getStateWrapper ()Lcom/facebook/react/uimanager/StateWrapper;
5599
+ public fun getVirtualViewContainerState ()Lcom/facebook/react/views/scroll/VirtualViewContainerState;
5597
5600
  protected fun handleInterceptedTouchEvent (Landroid/view/MotionEvent;)V
5598
5601
  public fun isPartiallyScrolledInView (Landroid/view/View;)Z
5599
5602
  protected fun onAttachedToWindow ()V
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.83.0-nightly-20250922-5ef054921
1
+ VERSION_NAME=0.83.0-nightly-20250924-53f89bacd
2
2
  react.internal.publishingGroup=com.facebook.react
3
3
  react.internal.hermesPublishingGroup=com.facebook.hermes
4
4
 
@@ -120,7 +120,11 @@ public object DefaultNewArchitectureEntryPoint {
120
120
  privateBridgelessEnabled = featureFlags.enableBridgelessArchitecture()
121
121
 
122
122
  val (isValid, errorMessage) =
123
- isConfigurationValid(turboModulesEnabled, fabricEnabled, bridgelessEnabled)
123
+ isConfigurationValid(
124
+ privateTurboModulesEnabled,
125
+ privateFabricEnabled,
126
+ privateBridgelessEnabled,
127
+ )
124
128
  if (!isValid) {
125
129
  error(errorMessage)
126
130
  }
@@ -33,10 +33,14 @@ public class DefaultDevLoadingViewImplementation(
33
33
  private var devLoadingPopup: PopupWindow? = null
34
34
 
35
35
  override fun showMessage(message: String) {
36
+ showMessage(message, color = null, backgroundColor = null)
37
+ }
38
+
39
+ override fun showMessage(message: String, color: Double?, backgroundColor: Double?) {
36
40
  if (!isEnabled) {
37
41
  return
38
42
  }
39
- UiThreadUtil.runOnUiThread { showInternal(message) }
43
+ UiThreadUtil.runOnUiThread { showInternal(message, color, backgroundColor) }
40
44
  }
41
45
 
42
46
  override fun updateProgress(status: String?, done: Int?, total: Int?) {
@@ -59,7 +63,7 @@ public class DefaultDevLoadingViewImplementation(
59
63
  }
60
64
  }
61
65
 
62
- private fun showInternal(message: String) {
66
+ private fun showInternal(message: String, color: Double?, backgroundColor: Double?) {
63
67
  if (devLoadingPopup?.isShowing == true) {
64
68
  // already showing
65
69
  return
@@ -84,13 +88,19 @@ public class DefaultDevLoadingViewImplementation(
84
88
  currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
85
89
  val view = inflater.inflate(R.layout.dev_loading_view, null) as TextView
86
90
  view.text = message
91
+ if (color != null) {
92
+ view.setTextColor(color.toInt())
93
+ }
94
+ if (backgroundColor != null) {
95
+ view.setBackgroundColor(backgroundColor.toInt())
96
+ }
97
+ view.setOnClickListener { hideInternal() }
87
98
  val popup =
88
99
  PopupWindow(
89
100
  view,
90
101
  ViewGroup.LayoutParams.MATCH_PARENT,
91
102
  ViewGroup.LayoutParams.WRAP_CONTENT,
92
103
  )
93
- popup.isTouchable = false
94
104
  popup.showAtLocation(currentActivity.window.decorView, Gravity.NO_GRAVITY, 0, topOffset)
95
105
  devLoadingView = view
96
106
  devLoadingPopup = popup
@@ -78,7 +78,6 @@ import java.io.File
78
78
  import java.net.MalformedURLException
79
79
  import java.net.URL
80
80
  import java.util.Locale
81
- import javax.inject.Provider
82
81
 
83
82
  public abstract class DevSupportManagerBase(
84
83
  protected val applicationContext: Context,
@@ -185,6 +184,7 @@ public abstract class DevSupportManagerBase(
185
184
  }
186
185
 
187
186
  private var perfMonitorOverlayManager: PerfMonitorOverlayManager? = null
187
+ private var perfMonitorInitialized = false
188
188
  private var tracingStateProvider: TracingStateProvider? = null
189
189
 
190
190
  init {
@@ -222,13 +222,6 @@ public abstract class DevSupportManagerBase(
222
222
  perfMonitorOverlayManager =
223
223
  PerfMonitorOverlayManager(
224
224
  reactInstanceDevHelper,
225
- Provider {
226
- val context = reactInstanceDevHelper.currentActivity
227
- if (context == null || context.isFinishing) {
228
- return@Provider null
229
- }
230
- context
231
- },
232
225
  { openDebugger(DebuggerFrontendPanelName.PERFORMANCE.toString()) },
233
226
  )
234
227
  }
@@ -552,14 +545,16 @@ public abstract class DevSupportManagerBase(
552
545
  }
553
546
 
554
547
  override fun onNewReactContextCreated(reactContext: ReactContext) {
555
- resetCurrentContext(reactContext)
556
-
557
- if (reactInstanceDevHelper is PerfMonitorDevHelper) {
548
+ if (!perfMonitorInitialized && reactInstanceDevHelper is PerfMonitorDevHelper) {
558
549
  perfMonitorOverlayManager?.let { manager ->
559
550
  reactInstanceDevHelper.inspectorTarget?.addPerfMonitorListener(manager)
560
551
  }
561
552
  perfMonitorOverlayManager?.enable()
553
+ perfMonitorOverlayManager?.startBackgroundTrace()
554
+ perfMonitorInitialized = true
562
555
  }
556
+
557
+ resetCurrentContext(reactContext)
563
558
  }
564
559
 
565
560
  override fun onReactInstanceDestroyed(reactContext: ReactContext) {
@@ -877,8 +872,6 @@ public abstract class DevSupportManagerBase(
877
872
  devLoadingViewManager?.showMessage("Reloading...")
878
873
  }
879
874
 
880
- perfMonitorOverlayManager?.reset()
881
-
882
875
  devServerHelper.openPackagerConnection(
883
876
  javaClass.simpleName,
884
877
  object : PackagerCommandListener {
@@ -928,7 +921,7 @@ public abstract class DevSupportManagerBase(
928
921
  hideRedboxDialog()
929
922
  hideDevOptionsDialog()
930
923
  devLoadingViewManager?.hide()
931
- perfMonitorOverlayManager?.reset()
924
+ perfMonitorOverlayManager?.disable()
932
925
 
933
926
  devServerHelper.closePackagerConnection()
934
927
  }
@@ -11,6 +11,8 @@ package com.facebook.react.devsupport.interfaces
11
11
  public interface DevLoadingViewManager {
12
12
  public fun showMessage(message: String)
13
13
 
14
+ public fun showMessage(message: String, color: Double?, backgroundColor: Double?)
15
+
14
16
  public fun updateProgress(status: String?, done: Int?, total: Int?)
15
17
 
16
18
  public fun hide()
@@ -7,11 +7,15 @@
7
7
 
8
8
  package com.facebook.react.devsupport.perfmonitor
9
9
 
10
+ import android.app.Activity
11
+
10
12
  /**
11
13
  * Interface implemented by [com.facebook.react.runtime.ReactHostImplDevHelper] exposing additional
12
14
  * hooks used to implement the V2 Perf Monitor overlay (experimental).
13
15
  */
14
16
  internal interface PerfMonitorDevHelper {
17
+ public val currentActivity: Activity?
18
+
15
19
  /**
16
20
  * The inspector target object. Matches the lifetime of the ReactHost. May be null if modern JS
17
21
  * debugging is disabled.
@@ -7,44 +7,26 @@
7
7
 
8
8
  package com.facebook.react.devsupport.perfmonitor
9
9
 
10
- import android.content.Context
11
10
  import com.facebook.react.bridge.UiThreadUtil
12
11
  import com.facebook.react.devsupport.interfaces.TracingState
13
- import javax.inject.Provider
14
12
 
15
13
  internal class PerfMonitorOverlayManager(
16
14
  private val devHelper: PerfMonitorDevHelper,
17
- private val contextProvider: Provider<Context?>,
18
15
  private val onRequestOpenDevTools: () -> Unit,
19
16
  ) : PerfMonitorUpdateListener {
20
17
  private var enabled: Boolean = false
21
- private var initialized: Boolean = false
22
18
  private var view: PerfMonitorOverlayView? = null
23
19
  private var tracingState: TracingState = TracingState.ENABLEDINCDPMODE
24
20
 
25
- private fun init() {
26
- if (initialized || !enabled) {
27
- return
28
- }
29
-
21
+ /** Enable the Perf Monitor overlay. */
22
+ fun enable() {
23
+ enabled = true
30
24
  UiThreadUtil.runOnUiThread {
31
- val context = contextProvider.get() ?: return@runOnUiThread
25
+ val context = devHelper.currentActivity ?: return@runOnUiThread
32
26
  view = PerfMonitorOverlayView(context, ::handleRecordingButtonPress)
33
-
34
- // Start background tracing
35
- devHelper.inspectorTarget?.resumeBackgroundTrace()
36
-
37
- view?.show()
38
- initialized = true
39
27
  }
40
28
  }
41
29
 
42
- /** Enable the Perf Monitor overlay. Will be shown when updates are received. */
43
- fun enable() {
44
- enabled = true
45
- init()
46
- }
47
-
48
30
  /** Disable the Perf Monitor overlay. Will remain hidden when updates are received. */
49
31
  fun disable() {
50
32
  UiThreadUtil.runOnUiThread { view?.hide() }
@@ -52,24 +34,31 @@ internal class PerfMonitorOverlayManager(
52
34
  enabled = false
53
35
  }
54
36
 
55
- /** Reset the Perf Monitor overlay, e.g. after a reload. */
56
- fun reset() {
57
- // Update with current recording state
58
- onRecordingStateChanged(
59
- devHelper.inspectorTarget?.getTracingState() ?: TracingState.ENABLEDINCDPMODE
60
- )
37
+ /** Start background trace recording. */
38
+ fun startBackgroundTrace() {
39
+ if (!enabled) {
40
+ return
41
+ }
42
+
43
+ devHelper.inspectorTarget?.let { target ->
44
+ target.resumeBackgroundTrace()
45
+ onRecordingStateChanged(target.getTracingState())
46
+ }
61
47
  }
62
48
 
63
49
  override fun onRecordingStateChanged(state: TracingState) {
64
50
  tracingState = state
65
- view?.updateRecordingState(state)
51
+ UiThreadUtil.runOnUiThread {
52
+ view?.updateRecordingState(state)
53
+ view?.show()
54
+ }
66
55
  }
67
56
 
68
57
  private fun handleRecordingButtonPress() {
69
58
  when (tracingState) {
70
59
  TracingState.ENABLEDINBACKGROUNDMODE -> {
71
- devHelper.inspectorTarget?.let {
72
- if (!it.pauseAndAnalyzeBackgroundTrace()) {
60
+ devHelper.inspectorTarget?.let { target ->
61
+ if (!target.pauseAndAnalyzeBackgroundTrace()) {
73
62
  onRequestOpenDevTools()
74
63
  }
75
64
  }
@@ -55,11 +55,11 @@ internal class PerfMonitorOverlayView(
55
55
 
56
56
  if (state == TracingState.ENABLEDINBACKGROUNDMODE) {
57
57
  (statusIndicator.background as GradientDrawable).setColor(Color.RED)
58
- statusLabel.text = "Background Profiling Active"
58
+ statusLabel.text = "Profiling Active"
59
59
  tooltipLabel.text = "Press ☰ to open"
60
60
  } else {
61
61
  (statusIndicator.background as GradientDrawable).setColor(Color.GRAY)
62
- statusLabel.text = "Background Profiling Stopped"
62
+ statusLabel.text = "Profiling Stopped"
63
63
  tooltipLabel.text = "Press ☰ to restart"
64
64
  }
65
65
  dialog.show()
@@ -164,7 +164,7 @@ internal class PerfMonitorOverlayView(
164
164
  shape = GradientDrawable.RECTANGLE
165
165
  setColor(Color.BLACK)
166
166
  cornerRadius = dpToPx(14.5f)
167
- alpha = (0.8 * 255).toInt()
167
+ alpha = (0.4 * 255).toInt()
168
168
  setStroke(dpToPx(1f).toInt(), COLOR_OVERLAY_BORDER)
169
169
  }
170
170
  showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<ce122427070db337420728a1028bc2b6>>
7
+ * @generated SignedSource<<6b632ac7553ae149fa42a67efde5acfa>>
8
8
  */
9
9
 
10
10
  /**
@@ -180,6 +180,12 @@ public object ReactNativeFeatureFlags {
180
180
  @JvmStatic
181
181
  public fun enableImagePrefetchingAndroid(): Boolean = accessor.enableImagePrefetchingAndroid()
182
182
 
183
+ /**
184
+ * When enabled, Android will build and initiate image prefetch requests on ImageShadowNode::layout and batch them together in a single JNI call
185
+ */
186
+ @JvmStatic
187
+ public fun enableImagePrefetchingJNIBatchingAndroid(): Boolean = accessor.enableImagePrefetchingJNIBatchingAndroid()
188
+
183
189
  /**
184
190
  * When enabled, Android will initiate image prefetch requested on ImageShadowNode::layout on the UI thread
185
191
  */
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<e7581ab264bca8b059723bd7bd788790>>
7
+ * @generated SignedSource<<c228bdbf6120b4715f49e03c04918a7c>>
8
8
  */
9
9
 
10
10
  /**
@@ -45,6 +45,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
45
45
  private var enableIOSTextBaselineOffsetPerLineCache: Boolean? = null
46
46
  private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
47
47
  private var enableImagePrefetchingAndroidCache: Boolean? = null
48
+ private var enableImagePrefetchingJNIBatchingAndroidCache: Boolean? = null
48
49
  private var enableImagePrefetchingOnUiThreadAndroidCache: Boolean? = null
49
50
  private var enableImmediateUpdateModeForContentOffsetChangesCache: Boolean? = null
50
51
  private var enableImperativeFocusCache: Boolean? = null
@@ -320,6 +321,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
320
321
  return cached
321
322
  }
322
323
 
324
+ override fun enableImagePrefetchingJNIBatchingAndroid(): Boolean {
325
+ var cached = enableImagePrefetchingJNIBatchingAndroidCache
326
+ if (cached == null) {
327
+ cached = ReactNativeFeatureFlagsCxxInterop.enableImagePrefetchingJNIBatchingAndroid()
328
+ enableImagePrefetchingJNIBatchingAndroidCache = cached
329
+ }
330
+ return cached
331
+ }
332
+
323
333
  override fun enableImagePrefetchingOnUiThreadAndroid(): Boolean {
324
334
  var cached = enableImagePrefetchingOnUiThreadAndroidCache
325
335
  if (cached == null) {
@@ -4,7 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
- * @generated SignedSource<<d73f5df2130479a4cd1000dc76b15d1b>>
7
+ * @generated SignedSource<<26dce1945df5641ab84cbca9eaf2b10f>>
8
8
  */
9
9
 
10
10
  /**
@@ -78,6 +78,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
78
78
 
79
79
  @DoNotStrip @JvmStatic public external fun enableImagePrefetchingAndroid(): Boolean
80
80
 
81
+ @DoNotStrip @JvmStatic public external fun enableImagePrefetchingJNIBatchingAndroid(): Boolean
82
+
81
83
  @DoNotStrip @JvmStatic public external fun enableImagePrefetchingOnUiThreadAndroid(): Boolean
82
84
 
83
85
  @DoNotStrip @JvmStatic public external fun enableImmediateUpdateModeForContentOffsetChanges(): Boolean