react-native-tvos 0.74.0-0rc3 → 0.74.2-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/Libraries/AppDelegate/RCTAppDelegate+Protected.h +16 -0
  2. package/Libraries/AppDelegate/RCTAppDelegate.mm +32 -1
  3. package/Libraries/AppDelegate/React-RCTAppDelegate.podspec +1 -0
  4. package/Libraries/Components/Pressable/Pressable.js +9 -5
  5. package/Libraries/Components/TextInput/TextInput.js +6 -3
  6. package/Libraries/Components/Touchable/TouchableBounce.js +1 -0
  7. package/Libraries/Components/Touchable/TouchableOpacity.js +1 -0
  8. package/Libraries/Core/ReactNativeVersion.js +2 -2
  9. package/Libraries/ReactNative/RendererImplementation.js +2 -0
  10. package/README.md +29 -9
  11. package/React/Base/RCTUtils.m +28 -8
  12. package/React/Base/RCTVersion.m +2 -2
  13. package/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingProxyRootView.mm +2 -4
  14. package/React/Fabric/Mounting/ComponentViews/Root/RCTRootComponentView.mm +22 -2
  15. package/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +5 -1
  16. package/React/Fabric/RCTScheduler.h +2 -0
  17. package/React/Fabric/RCTScheduler.mm +6 -0
  18. package/React/Fabric/RCTSurfacePresenter.mm +5 -0
  19. package/React/Modules/RCTUIManager.m +8 -9
  20. package/React/Views/RCTComponentData.m +14 -1
  21. package/React/Views/ScrollView/RCTScrollView.m +30 -14
  22. package/ReactAndroid/api/ReactAndroid.api +1 -2
  23. package/ReactAndroid/gradle.properties +1 -1
  24. package/ReactAndroid/src/main/java/com/facebook/react/ReactActivity.java +2 -2
  25. package/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java +24 -9
  26. package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt +15 -0
  27. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +19 -7
  28. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +31 -11
  29. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +7 -3
  30. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +7 -3
  31. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +34 -12
  32. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +7 -3
  33. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java +2 -2
  34. package/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessCatalystInstance.kt +11 -18
  35. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +27 -14
  36. package/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java +1 -3
  37. package/ReactAndroid/src/main/jni/react/fabric/Binding.cpp +38 -3
  38. package/ReactAndroid/src/main/jni/react/fabric/Binding.h +8 -0
  39. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +43 -15
  40. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +10 -4
  41. package/ReactCommon/ReactCommon.podspec +1 -0
  42. package/ReactCommon/cxxreact/ReactNativeVersion.h +2 -2
  43. package/ReactCommon/jsc/JSCRuntime.cpp +2 -0
  44. package/ReactCommon/jsinspector-modern/React-jsinspector.podspec +2 -1
  45. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +13 -5
  46. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +16 -6
  47. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +62 -26
  48. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +8 -4
  49. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +13 -5
  50. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +4 -2
  51. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +16 -6
  52. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +7 -3
  53. package/ReactCommon/react/renderer/components/textinput/platform/ios/react/renderer/components/iostextinput/TextInputEventEmitter.cpp +53 -1
  54. package/ReactCommon/react/renderer/mounting/MountingTransaction.cpp +13 -0
  55. package/ReactCommon/react/renderer/mounting/MountingTransaction.h +9 -0
  56. package/ReactCommon/react/renderer/scheduler/Scheduler.cpp +7 -2
  57. package/ReactCommon/react/renderer/scheduler/SchedulerDelegate.h +11 -0
  58. package/cli.js +11 -3
  59. package/package.json +12 -12
  60. package/scripts/cocoapods/privacy_manifest_utils.rb +173 -0
  61. package/scripts/cocoapods/utils.rb +1 -38
  62. package/scripts/ios-configure-glog.sh +9 -2
  63. package/scripts/react_native_pods.rb +14 -3
  64. package/sdks/.hermesversion +1 -1
  65. package/sdks/hermesc/osx-bin/hermes +0 -0
  66. package/sdks/hermesc/osx-bin/hermesc +0 -0
  67. package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
  68. package/src/private/featureflags/NativeReactNativeFeatureFlags.js +4 -2
  69. package/src/private/featureflags/ReactNativeFeatureFlags.js +16 -6
  70. package/template/package.json +5 -5
  71. package/third-party-podspecs/RCT-Folly.podspec +1 -0
  72. package/types/public/ReactNativeTVTypes.d.ts +6 -10
  73. package/Libraries/React-Native +0 -214
  74. package/ReactAndroid/src/main/java/com/facebook/react/ReactAndroidHWInputDeviceHelper.java +0 -98
@@ -92,7 +92,7 @@ public abstract class com/facebook/react/ReactActivity : androidx/appcompat/app/
92
92
  protected fun <init> ()V
93
93
  protected fun createReactActivityDelegate ()Lcom/facebook/react/ReactActivityDelegate;
94
94
  protected fun getMainComponentName ()Ljava/lang/String;
95
- public fun getReactDelegate ()V
95
+ public fun getReactDelegate ()Lcom/facebook/react/ReactDelegate;
96
96
  protected final fun getReactInstanceManager ()Lcom/facebook/react/ReactInstanceManager;
97
97
  protected final fun getReactNativeHost ()Lcom/facebook/react/ReactNativeHost;
98
98
  public fun invokeDefaultOnBackPressed ()V
@@ -7697,4 +7697,3 @@ public class com/facebook/react/views/view/ViewGroupClickEvent : com/facebook/re
7697
7697
  protected fun getEventData ()Lcom/facebook/react/bridge/WritableMap;
7698
7698
  public fun getEventName ()Ljava/lang/String;
7699
7699
  }
7700
-
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.74.0-0rc3
1
+ VERSION_NAME=0.74.2-0
2
2
  # react.internal.publishingGroup=com.facebook.react
3
3
  # For TV use this group
4
4
  react.internal.publishingGroup=io.github.react-native-tvos
@@ -65,8 +65,8 @@ public abstract class ReactActivity extends AppCompatActivity
65
65
  mDelegate.onDestroy();
66
66
  }
67
67
 
68
- public void getReactDelegate() {
69
- mDelegate.getReactDelegate();
68
+ public @Nullable ReactDelegate getReactDelegate() {
69
+ return mDelegate.getReactDelegate();
70
70
  }
71
71
 
72
72
  @Override
@@ -15,6 +15,7 @@ import android.view.KeyEvent;
15
15
  import androidx.annotation.NonNull;
16
16
  import androidx.annotation.Nullable;
17
17
  import com.facebook.infer.annotation.Assertions;
18
+ import com.facebook.react.bridge.UiThreadUtil;
18
19
  import com.facebook.react.config.ReactFeatureFlags;
19
20
  import com.facebook.react.devsupport.DisabledDevSupportManager;
20
21
  import com.facebook.react.devsupport.DoubleTapReloadRecognizer;
@@ -99,7 +100,7 @@ public class ReactDelegate {
99
100
  && mReactHost.getDevSupportManager() != null) {
100
101
  return mReactHost.getDevSupportManager();
101
102
  } else if (getReactNativeHost().hasInstance()
102
- && getReactNativeHost().getUseDeveloperSupport()) {
103
+ && getReactNativeHost().getReactInstanceManager() != null) {
103
104
  return getReactNativeHost().getReactInstanceManager().getDevSupportManager();
104
105
  } else {
105
106
  return null;
@@ -241,17 +242,31 @@ public class ReactDelegate {
241
242
 
242
243
  public void reload() {
243
244
  DevSupportManager devSupportManager = getDevSupportManager();
244
- if (devSupportManager != null) {
245
- // With Bridgeless enabled, reload in RELEASE mode
246
- if (devSupportManager instanceof DisabledDevSupportManager
247
- && ReactFeatureFlags.enableBridgelessArchitecture
248
- && mReactHost != null) {
249
- // Do not reload the bundle from JS as there is no bundler running in release mode.
250
- mReactHost.reload("ReactDelegate.reload()");
245
+ if (devSupportManager == null) {
246
+ return;
247
+ }
248
+
249
+ // Reload in RELEASE mode
250
+ if (devSupportManager instanceof DisabledDevSupportManager) {
251
+ // Do not reload the bundle from JS as there is no bundler running in release mode.
252
+ if (ReactFeatureFlags.enableBridgelessArchitecture) {
253
+ if (mReactHost != null) {
254
+ mReactHost.reload("ReactDelegate.reload()");
255
+ }
251
256
  } else {
252
- devSupportManager.handleReloadJS();
257
+ UiThreadUtil.runOnUiThread(
258
+ () -> {
259
+ if (mReactNativeHost.hasInstance()
260
+ && mReactNativeHost.getReactInstanceManager() != null) {
261
+ mReactNativeHost.getReactInstanceManager().recreateReactContextInBackground();
262
+ }
263
+ });
253
264
  }
265
+ return;
254
266
  }
267
+
268
+ // Reload in DEBUG mode
269
+ devSupportManager.handleReloadJS();
255
270
  }
256
271
 
257
272
  public void loadApp() {
@@ -11,6 +11,8 @@ package com.facebook.react.defaults
11
11
 
12
12
  import com.facebook.react.common.annotations.VisibleForTesting
13
13
  import com.facebook.react.config.ReactFeatureFlags
14
+ import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
15
+ import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsDefaults
14
16
 
15
17
  /**
16
18
  * A utility class that serves as an entry point for users setup the New Architecture.
@@ -45,6 +47,19 @@ public object DefaultNewArchitectureEntryPoint {
45
47
  ReactFeatureFlags.unstable_useTurboModuleInterop = bridgelessEnabled
46
48
  ReactFeatureFlags.enableFabricPendingEventQueue = fabricEnabled
47
49
 
50
+ if (bridgelessEnabled) {
51
+ ReactNativeFeatureFlags.override(
52
+ object : ReactNativeFeatureFlagsDefaults() {
53
+ override fun useModernRuntimeScheduler(): Boolean = true
54
+
55
+ override fun enableMicrotasks(): Boolean = true
56
+
57
+ override fun batchRenderingUpdatesInEventLoop(): Boolean = true
58
+
59
+ override fun androidEnablePendingFabricTransactions(): Boolean = true
60
+ })
61
+ }
62
+
48
63
  privateFabricEnabled = fabricEnabled
49
64
  privateTurboModulesEnabled = turboModulesEnabled
50
65
  privateConcurrentReactEnabled = fabricEnabled
@@ -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<<c526fb1c44f00f5b032684396246e4d4>>
7
+ * @generated SignedSource<<b86e9fd5499308ce65b389342eb436a2>>
8
8
  */
9
9
 
10
10
  /**
@@ -34,6 +34,24 @@ public object ReactNativeFeatureFlags {
34
34
  @JvmStatic
35
35
  public fun commonTestFlag(): Boolean = accessor.commonTestFlag()
36
36
 
37
+ /**
38
+ * To be used with batchRenderingUpdatesInEventLoop. When enbled, the Android mounting layer will concatenate pending transactions to ensure they're applied atomatically
39
+ */
40
+ @JvmStatic
41
+ public fun androidEnablePendingFabricTransactions(): Boolean = accessor.androidEnablePendingFabricTransactions()
42
+
43
+ /**
44
+ * When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop.
45
+ */
46
+ @JvmStatic
47
+ public fun batchRenderingUpdatesInEventLoop(): Boolean = accessor.batchRenderingUpdatesInEventLoop()
48
+
49
+ /**
50
+ * When enabled, ReactInstanceManager will clean up Fabric surfaces on destroy().
51
+ */
52
+ @JvmStatic
53
+ public fun destroyFabricSurfacesInReactInstanceManager(): Boolean = accessor.destroyFabricSurfacesInReactInstanceManager()
54
+
37
55
  /**
38
56
  * Enables the use of a background executor to compute layout and commit updates on Fabric (this system is deprecated and should not be used).
39
57
  */
@@ -52,12 +70,6 @@ public object ReactNativeFeatureFlags {
52
70
  @JvmStatic
53
71
  public fun enableMicrotasks(): Boolean = accessor.enableMicrotasks()
54
72
 
55
- /**
56
- * When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop.
57
- */
58
- @JvmStatic
59
- public fun batchRenderingUpdatesInEventLoop(): Boolean = accessor.batchRenderingUpdatesInEventLoop()
60
-
61
73
  /**
62
74
  * Uses new, deduplicated logic for constructing Android Spannables from text fragments
63
75
  */
@@ -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<<11824621ee7ca5dbdf2f09bdf1a1f983>>
7
+ * @generated SignedSource<<c0a85b92bca9bb03f28af67224239c09>>
8
8
  */
9
9
 
10
10
  /**
@@ -21,10 +21,12 @@ package com.facebook.react.internal.featureflags
21
21
 
22
22
  public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccessor {
23
23
  private var commonTestFlagCache: Boolean? = null
24
+ private var androidEnablePendingFabricTransactionsCache: Boolean? = null
25
+ private var batchRenderingUpdatesInEventLoopCache: Boolean? = null
26
+ private var destroyFabricSurfacesInReactInstanceManagerCache: Boolean? = null
24
27
  private var enableBackgroundExecutorCache: Boolean? = null
25
28
  private var useModernRuntimeSchedulerCache: Boolean? = null
26
29
  private var enableMicrotasksCache: Boolean? = null
27
- private var batchRenderingUpdatesInEventLoopCache: Boolean? = null
28
30
  private var enableSpannableBuildingUnificationCache: Boolean? = null
29
31
  private var enableCustomDrawOrderFabricCache: Boolean? = null
30
32
  private var enableFixForClippedSubviewsCrashCache: Boolean? = null
@@ -40,6 +42,33 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
40
42
  return cached
41
43
  }
42
44
 
45
+ override fun androidEnablePendingFabricTransactions(): Boolean {
46
+ var cached = androidEnablePendingFabricTransactionsCache
47
+ if (cached == null) {
48
+ cached = ReactNativeFeatureFlagsCxxInterop.androidEnablePendingFabricTransactions()
49
+ androidEnablePendingFabricTransactionsCache = cached
50
+ }
51
+ return cached
52
+ }
53
+
54
+ override fun batchRenderingUpdatesInEventLoop(): Boolean {
55
+ var cached = batchRenderingUpdatesInEventLoopCache
56
+ if (cached == null) {
57
+ cached = ReactNativeFeatureFlagsCxxInterop.batchRenderingUpdatesInEventLoop()
58
+ batchRenderingUpdatesInEventLoopCache = cached
59
+ }
60
+ return cached
61
+ }
62
+
63
+ override fun destroyFabricSurfacesInReactInstanceManager(): Boolean {
64
+ var cached = destroyFabricSurfacesInReactInstanceManagerCache
65
+ if (cached == null) {
66
+ cached = ReactNativeFeatureFlagsCxxInterop.destroyFabricSurfacesInReactInstanceManager()
67
+ destroyFabricSurfacesInReactInstanceManagerCache = cached
68
+ }
69
+ return cached
70
+ }
71
+
43
72
  override fun enableBackgroundExecutor(): Boolean {
44
73
  var cached = enableBackgroundExecutorCache
45
74
  if (cached == null) {
@@ -67,15 +96,6 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
67
96
  return cached
68
97
  }
69
98
 
70
- override fun batchRenderingUpdatesInEventLoop(): Boolean {
71
- var cached = batchRenderingUpdatesInEventLoopCache
72
- if (cached == null) {
73
- cached = ReactNativeFeatureFlagsCxxInterop.batchRenderingUpdatesInEventLoop()
74
- batchRenderingUpdatesInEventLoopCache = cached
75
- }
76
- return cached
77
- }
78
-
79
99
  override fun enableSpannableBuildingUnification(): Boolean {
80
100
  var cached = enableSpannableBuildingUnificationCache
81
101
  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<<dfbe9bcab657e4c66dd104788639448d>>
7
+ * @generated SignedSource<<5fece1bcbbd750b82b8e4b125c57101e>>
8
8
  */
9
9
 
10
10
  /**
@@ -30,14 +30,18 @@ public object ReactNativeFeatureFlagsCxxInterop {
30
30
 
31
31
  @DoNotStrip @JvmStatic public external fun commonTestFlag(): Boolean
32
32
 
33
+ @DoNotStrip @JvmStatic public external fun androidEnablePendingFabricTransactions(): Boolean
34
+
35
+ @DoNotStrip @JvmStatic public external fun batchRenderingUpdatesInEventLoop(): Boolean
36
+
37
+ @DoNotStrip @JvmStatic public external fun destroyFabricSurfacesInReactInstanceManager(): Boolean
38
+
33
39
  @DoNotStrip @JvmStatic public external fun enableBackgroundExecutor(): Boolean
34
40
 
35
41
  @DoNotStrip @JvmStatic public external fun useModernRuntimeScheduler(): Boolean
36
42
 
37
43
  @DoNotStrip @JvmStatic public external fun enableMicrotasks(): Boolean
38
44
 
39
- @DoNotStrip @JvmStatic public external fun batchRenderingUpdatesInEventLoop(): Boolean
40
-
41
45
  @DoNotStrip @JvmStatic public external fun enableSpannableBuildingUnification(): Boolean
42
46
 
43
47
  @DoNotStrip @JvmStatic public external fun enableCustomDrawOrderFabric(): Boolean
@@ -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<<cc8e437bf2f486949f256a19d3d73a1e>>
7
+ * @generated SignedSource<<4462edcf10a85654be7c71a7438a2288>>
8
8
  */
9
9
 
10
10
  /**
@@ -25,14 +25,18 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
25
25
 
26
26
  override fun commonTestFlag(): Boolean = false
27
27
 
28
+ override fun androidEnablePendingFabricTransactions(): Boolean = false
29
+
30
+ override fun batchRenderingUpdatesInEventLoop(): Boolean = false
31
+
32
+ override fun destroyFabricSurfacesInReactInstanceManager(): Boolean = false
33
+
28
34
  override fun enableBackgroundExecutor(): Boolean = false
29
35
 
30
36
  override fun useModernRuntimeScheduler(): Boolean = false
31
37
 
32
38
  override fun enableMicrotasks(): Boolean = false
33
39
 
34
- override fun batchRenderingUpdatesInEventLoop(): Boolean = false
35
-
36
40
  override fun enableSpannableBuildingUnification(): Boolean = false
37
41
 
38
42
  override fun enableCustomDrawOrderFabric(): Boolean = false
@@ -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<<63356ad414e641eae11ca07b1a876fd3>>
7
+ * @generated SignedSource<<e02f6a9473a98f27ee44ff303db9e0b7>>
8
8
  */
9
9
 
10
10
  /**
@@ -25,10 +25,12 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
25
25
  private val accessedFeatureFlags = mutableSetOf<String>()
26
26
 
27
27
  private var commonTestFlagCache: Boolean? = null
28
+ private var androidEnablePendingFabricTransactionsCache: Boolean? = null
29
+ private var batchRenderingUpdatesInEventLoopCache: Boolean? = null
30
+ private var destroyFabricSurfacesInReactInstanceManagerCache: Boolean? = null
28
31
  private var enableBackgroundExecutorCache: Boolean? = null
29
32
  private var useModernRuntimeSchedulerCache: Boolean? = null
30
33
  private var enableMicrotasksCache: Boolean? = null
31
- private var batchRenderingUpdatesInEventLoopCache: Boolean? = null
32
34
  private var enableSpannableBuildingUnificationCache: Boolean? = null
33
35
  private var enableCustomDrawOrderFabricCache: Boolean? = null
34
36
  private var enableFixForClippedSubviewsCrashCache: Boolean? = null
@@ -45,6 +47,36 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
45
47
  return cached
46
48
  }
47
49
 
50
+ override fun androidEnablePendingFabricTransactions(): Boolean {
51
+ var cached = androidEnablePendingFabricTransactionsCache
52
+ if (cached == null) {
53
+ cached = currentProvider.androidEnablePendingFabricTransactions()
54
+ accessedFeatureFlags.add("androidEnablePendingFabricTransactions")
55
+ androidEnablePendingFabricTransactionsCache = cached
56
+ }
57
+ return cached
58
+ }
59
+
60
+ override fun batchRenderingUpdatesInEventLoop(): Boolean {
61
+ var cached = batchRenderingUpdatesInEventLoopCache
62
+ if (cached == null) {
63
+ cached = currentProvider.batchRenderingUpdatesInEventLoop()
64
+ accessedFeatureFlags.add("batchRenderingUpdatesInEventLoop")
65
+ batchRenderingUpdatesInEventLoopCache = cached
66
+ }
67
+ return cached
68
+ }
69
+
70
+ override fun destroyFabricSurfacesInReactInstanceManager(): Boolean {
71
+ var cached = destroyFabricSurfacesInReactInstanceManagerCache
72
+ if (cached == null) {
73
+ cached = currentProvider.destroyFabricSurfacesInReactInstanceManager()
74
+ accessedFeatureFlags.add("destroyFabricSurfacesInReactInstanceManager")
75
+ destroyFabricSurfacesInReactInstanceManagerCache = cached
76
+ }
77
+ return cached
78
+ }
79
+
48
80
  override fun enableBackgroundExecutor(): Boolean {
49
81
  var cached = enableBackgroundExecutorCache
50
82
  if (cached == null) {
@@ -75,16 +107,6 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
75
107
  return cached
76
108
  }
77
109
 
78
- override fun batchRenderingUpdatesInEventLoop(): Boolean {
79
- var cached = batchRenderingUpdatesInEventLoopCache
80
- if (cached == null) {
81
- cached = currentProvider.batchRenderingUpdatesInEventLoop()
82
- accessedFeatureFlags.add("batchRenderingUpdatesInEventLoop")
83
- batchRenderingUpdatesInEventLoopCache = cached
84
- }
85
- return cached
86
- }
87
-
88
110
  override fun enableSpannableBuildingUnification(): Boolean {
89
111
  var cached = enableSpannableBuildingUnificationCache
90
112
  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<<c5388e841a06044520f6c89fcca27286>>
7
+ * @generated SignedSource<<9190129a45a19b25dd23126f05b03356>>
8
8
  */
9
9
 
10
10
  /**
@@ -25,14 +25,18 @@ import com.facebook.proguard.annotations.DoNotStrip
25
25
  public interface ReactNativeFeatureFlagsProvider {
26
26
  @DoNotStrip public fun commonTestFlag(): Boolean
27
27
 
28
+ @DoNotStrip public fun androidEnablePendingFabricTransactions(): Boolean
29
+
30
+ @DoNotStrip public fun batchRenderingUpdatesInEventLoop(): Boolean
31
+
32
+ @DoNotStrip public fun destroyFabricSurfacesInReactInstanceManager(): Boolean
33
+
28
34
  @DoNotStrip public fun enableBackgroundExecutor(): Boolean
29
35
 
30
36
  @DoNotStrip public fun useModernRuntimeScheduler(): Boolean
31
37
 
32
38
  @DoNotStrip public fun enableMicrotasks(): Boolean
33
39
 
34
- @DoNotStrip public fun batchRenderingUpdatesInEventLoop(): Boolean
35
-
36
40
  @DoNotStrip public fun enableSpannableBuildingUnification(): Boolean
37
41
 
38
42
  @DoNotStrip public fun enableCustomDrawOrderFabric(): Boolean
@@ -17,6 +17,6 @@ public class ReactNativeVersion {
17
17
  public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
18
18
  "major", 0,
19
19
  "minor", 74,
20
- "patch", 0,
21
- "prerelease", "0rc3");
20
+ "patch", 2,
21
+ "prerelease", "0");
22
22
  }
@@ -92,25 +92,20 @@ public class BridgelessCatalystInstance(private val reactHost: ReactHostImpl) :
92
92
  throw UnsupportedOperationException("Unimplemented method 'initialize'")
93
93
  }
94
94
 
95
- override fun getReactQueueConfiguration(): ReactQueueConfiguration {
96
- throw UnsupportedOperationException("Unimplemented method 'getReactQueueConfiguration'")
97
- }
95
+ override fun getReactQueueConfiguration(): ReactQueueConfiguration =
96
+ reactHost.reactQueueConfiguration!!
98
97
 
99
- override fun <T : JavaScriptModule> getJSModule(jsInterface: Class<T>): T {
100
- throw UnsupportedOperationException("Unimplemented method 'getJSModule'")
101
- }
98
+ override fun <T : JavaScriptModule> getJSModule(jsInterface: Class<T>): T =
99
+ reactHost.currentReactContext?.getJSModule(jsInterface)!!
102
100
 
103
- override fun <T : NativeModule> hasNativeModule(nativeModuleInterface: Class<T>): Boolean {
104
- throw UnsupportedOperationException("Unimplemented method 'hasNativeModule'")
105
- }
101
+ override fun <T : NativeModule> hasNativeModule(nativeModuleInterface: Class<T>): Boolean =
102
+ reactHost.hasNativeModule(nativeModuleInterface)
106
103
 
107
- override fun <T : NativeModule> getNativeModule(nativeModuleInterface: Class<T>): T? {
108
- throw UnsupportedOperationException("Unimplemented method 'getNativeModule'")
109
- }
104
+ override fun <T : NativeModule> getNativeModule(nativeModuleInterface: Class<T>): T? =
105
+ reactHost.getNativeModule(nativeModuleInterface)
110
106
 
111
- override fun getNativeModule(moduleName: String): NativeModule? {
112
- throw UnsupportedOperationException("Unimplemented method 'getNativeModule'")
113
- }
107
+ override fun getNativeModule(moduleName: String): NativeModule? =
108
+ reactHost.getNativeModule(moduleName)
114
109
 
115
110
  @Deprecated(
116
111
  message =
@@ -119,9 +114,7 @@ public class BridgelessCatalystInstance(private val reactHost: ReactHostImpl) :
119
114
  throw UnsupportedOperationException("Unimplemented method 'getJSIModule'")
120
115
  }
121
116
 
122
- override fun getNativeModules(): Collection<NativeModule> {
123
- throw UnsupportedOperationException("Unimplemented method 'getNativeModules'")
124
- }
117
+ override fun getNativeModules(): Collection<NativeModule> = reactHost.getNativeModules()
125
118
 
126
119
  override fun extendNativeModules(modules: NativeModuleRegistry) {
127
120
  throw UnsupportedOperationException("Unimplemented method 'extendNativeModules'")
@@ -592,6 +592,16 @@ public class ReactHostImpl implements ReactHost {
592
592
  return null;
593
593
  }
594
594
 
595
+ /* package */
596
+ @Nullable
597
+ NativeModule getNativeModule(String nativeModuleName) {
598
+ final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();
599
+ if (reactInstance != null) {
600
+ return reactInstance.getNativeModule(nativeModuleName);
601
+ }
602
+ return null;
603
+ }
604
+
595
605
  /* package */
596
606
  @Nullable
597
607
  RuntimeExecutor getRuntimeExecutor() {
@@ -643,11 +653,12 @@ public class ReactHostImpl implements ReactHost {
643
653
  ReactContext currentContext = getCurrentReactContext();
644
654
  if (currentContext != null) {
645
655
  currentContext.onActivityResult(activity, requestCode, resultCode, data);
656
+ } else {
657
+ ReactSoftExceptionLogger.logSoftException(
658
+ TAG,
659
+ new ReactNoCrashSoftException(
660
+ "Tried to access onActivityResult while context is not ready"));
646
661
  }
647
- ReactSoftExceptionLogger.logSoftException(
648
- TAG,
649
- new ReactNoCrashSoftException(
650
- "Tried to access onActivityResult while context is not ready"));
651
662
  }
652
663
 
653
664
  /* To be called when focus has changed for the hosting window. */
@@ -660,11 +671,12 @@ public class ReactHostImpl implements ReactHost {
660
671
  ReactContext currentContext = getCurrentReactContext();
661
672
  if (currentContext != null) {
662
673
  currentContext.onWindowFocusChange(hasFocus);
674
+ } else {
675
+ ReactSoftExceptionLogger.logSoftException(
676
+ TAG,
677
+ new ReactNoCrashSoftException(
678
+ "Tried to access onWindowFocusChange while context is not ready"));
663
679
  }
664
- ReactSoftExceptionLogger.logSoftException(
665
- TAG,
666
- new ReactNoCrashSoftException(
667
- "Tried to access onWindowFocusChange while context is not ready"));
668
680
  }
669
681
 
670
682
  /* This method will give JS the opportunity to receive intents via Linking.
@@ -691,10 +703,11 @@ public class ReactHostImpl implements ReactHost {
691
703
  }
692
704
  }
693
705
  currentContext.onNewIntent(getCurrentActivity(), intent);
706
+ } else {
707
+ ReactSoftExceptionLogger.logSoftException(
708
+ TAG,
709
+ new ReactNoCrashSoftException("Tried to access onNewIntent while context is not ready"));
694
710
  }
695
- ReactSoftExceptionLogger.logSoftException(
696
- TAG,
697
- new ReactNoCrashSoftException("Tried to access onNewIntent while context is not ready"));
698
711
  }
699
712
 
700
713
  @ThreadConfined(UI)
@@ -1513,9 +1526,9 @@ public class ReactHostImpl implements ReactHost {
1513
1526
 
1514
1527
  // Step 3: Stop all React Native surfaces
1515
1528
  stopAttachedSurfaces(method, reactInstance);
1516
-
1517
- // TODO(T161461674): Should we clear mAttachedSurfaces?
1518
- // Not clearing mAttachedSurfaces could lead to a memory leak.
1529
+ synchronized (mAttachedSurfaces) {
1530
+ mAttachedSurfaces.clear();
1531
+ }
1519
1532
 
1520
1533
  return task;
1521
1534
  },
@@ -90,8 +90,6 @@ public class ReactModalHostView extends ViewGroup implements LifecycleEventListe
90
90
  private boolean mPropertyRequiresNewDialog;
91
91
  private @Nullable DialogInterface.OnShowListener mOnShowListener;
92
92
  private @Nullable OnRequestCloseListener mOnRequestCloseListener;
93
- private final ReactAndroidHWInputDeviceHelper mAndroidHWInputDeviceHelper =
94
- new ReactAndroidHWInputDeviceHelper();
95
93
 
96
94
  public ReactModalHostView(ThemedReactContext context) {
97
95
  super(context);
@@ -305,7 +303,7 @@ public class ReactModalHostView extends ViewGroup implements LifecycleEventListe
305
303
  public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
306
304
  // Modal needs to send the key event to its own TV event handler
307
305
  // https://github.com/react-native-tvos/react-native-tvos/issues/609
308
- mAndroidHWInputDeviceHelper.handleKeyEvent(event, mHostView.mReactContext);
306
+ mHostView.mAndroidHWInputDeviceHelper.handleKeyEvent(event, mHostView.mReactContext);
309
307
  if (event.getAction() == KeyEvent.ACTION_UP) {
310
308
  // We need to stop the BACK button and ESCAPE key from closing the dialog by default
311
309
  // so we capture that event and instead inform JS so that it can make the decision as
@@ -474,8 +474,7 @@ std::shared_ptr<FabricMountingManager> Binding::getMountingManager(
474
474
 
475
475
  void Binding::schedulerDidFinishTransaction(
476
476
  const MountingCoordinator::Shared& mountingCoordinator) {
477
- auto mountingManager = getMountingManager("schedulerDidFinishTransaction");
478
- if (!mountingManager) {
477
+ if (!ReactNativeFeatureFlags::androidEnablePendingFabricTransactions()) {
479
478
  return;
480
479
  }
481
480
 
@@ -483,7 +482,43 @@ void Binding::schedulerDidFinishTransaction(
483
482
  if (!mountingTransaction.has_value()) {
484
483
  return;
485
484
  }
486
- mountingManager->executeMount(*mountingTransaction);
485
+
486
+ std::unique_lock<std::mutex> lock(pendingTransactionsMutex_);
487
+ auto pendingTransaction = std::find_if(
488
+ pendingTransactions_.begin(),
489
+ pendingTransactions_.end(),
490
+ [&](const auto& transaction) {
491
+ return transaction.getSurfaceId() ==
492
+ mountingTransaction->getSurfaceId();
493
+ });
494
+
495
+ if (pendingTransaction != pendingTransactions_.end()) {
496
+ pendingTransaction->mergeWith(std::move(*mountingTransaction));
497
+ } else {
498
+ pendingTransactions_.push_back(std::move(*mountingTransaction));
499
+ }
500
+ }
501
+
502
+ void Binding::schedulerShouldRenderTransactions(
503
+ const MountingCoordinator::Shared& mountingCoordinator) {
504
+ auto mountingManager =
505
+ getMountingManager("schedulerShouldRenderTransactions");
506
+ if (!mountingManager) {
507
+ return;
508
+ }
509
+
510
+ if (ReactNativeFeatureFlags::androidEnablePendingFabricTransactions()) {
511
+ std::unique_lock<std::mutex> lock(pendingTransactionsMutex_);
512
+ for (auto& transaction : pendingTransactions_) {
513
+ mountingManager->executeMount(transaction);
514
+ }
515
+ pendingTransactions_.clear();
516
+ } else {
517
+ auto mountingTransaction = mountingCoordinator->pullTransaction();
518
+ if (mountingTransaction.has_value()) {
519
+ mountingManager->executeMount(*mountingTransaction);
520
+ }
521
+ }
487
522
  }
488
523
 
489
524
  void Binding::schedulerDidRequestPreliminaryViewAllocation(
@@ -8,6 +8,7 @@
8
8
  #pragma once
9
9
 
10
10
  #include <memory>
11
+ #include <mutex>
11
12
  #include <shared_mutex>
12
13
  #include <unordered_map>
13
14
 
@@ -101,6 +102,9 @@ class Binding : public jni::HybridClass<Binding, JBinding>,
101
102
  void schedulerDidFinishTransaction(
102
103
  const MountingCoordinator::Shared& mountingCoordinator) override;
103
104
 
105
+ void schedulerShouldRenderTransactions(
106
+ const MountingCoordinator::Shared& mountingCoordinator) override;
107
+
104
108
  void schedulerDidRequestPreliminaryViewAllocation(
105
109
  const SurfaceId surfaceId,
106
110
  const ShadowNode& shadowNode) override;
@@ -146,6 +150,10 @@ class Binding : public jni::HybridClass<Binding, JBinding>,
146
150
  std::shared_mutex
147
151
  surfaceHandlerRegistryMutex_; // Protects `surfaceHandlerRegistry_`.
148
152
 
153
+ // Track pending transactions, one per surfaceId
154
+ std::mutex pendingTransactionsMutex_;
155
+ std::vector<MountingTransaction> pendingTransactions_;
156
+
149
157
  float pointScaleFactor_ = 1;
150
158
 
151
159
  std::shared_ptr<const ReactNativeConfig> reactNativeConfig_{nullptr};