react-native 0.83.0-nightly-20250911-dab8a4562 → 0.83.0-nightly-20250912-a7dc5051d

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 (59) hide show
  1. package/Libraries/Core/ReactNativeVersion.js +1 -1
  2. package/React/Base/RCTBridgeModule.h +12 -0
  3. package/React/Base/RCTVersion.m +1 -1
  4. package/React/FBReactNativeSpec/FBReactNativeSpecJSI-generated.cpp +6 -0
  5. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +9 -0
  6. package/ReactAndroid/gradle.properties +1 -2
  7. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +0 -1
  8. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +2 -24
  9. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +46 -169
  10. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorUpdateListener.kt +0 -9
  11. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +7 -1
  12. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +11 -1
  13. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +3 -1
  14. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +3 -1
  15. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +12 -1
  16. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt +3 -1
  17. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +3 -1
  18. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  19. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +0 -12
  20. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +18 -2
  21. package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/CustomStyleSpan.kt +4 -0
  22. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +16 -7
  23. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +15 -1
  24. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +4 -1
  25. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +0 -11
  26. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +0 -2
  27. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  28. package/ReactCommon/jsinspector-modern/HostTarget.cpp +0 -14
  29. package/ReactCommon/jsinspector-modern/HostTarget.h +0 -16
  30. package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +0 -7
  31. package/ReactCommon/jsinspector-modern/InspectorFlags.h +0 -6
  32. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +5 -1
  33. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +6 -1
  34. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +80 -62
  35. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +4 -2
  36. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +5 -1
  37. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +10 -1
  38. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h +5 -1
  39. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +2 -1
  40. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +6 -1
  41. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +3 -1
  42. package/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp +0 -9
  43. package/ReactCommon/react/performance/cdpmetrics/CdpMetricsReporter.cpp +1 -24
  44. package/ReactCommon/react/performance/cdpmetrics/CdpMetricsReporter.h +0 -1
  45. package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +0 -10
  46. package/ReactCommon/react/performance/timeline/PerformanceEntryReporterListeners.h +0 -2
  47. package/jest/mockComponent.js +3 -2
  48. package/package.json +8 -8
  49. package/sdks/hermes-engine/hermes-engine.podspec +6 -1
  50. package/sdks/hermes-engine/version.properties +1 -0
  51. package/sdks/hermesc/osx-bin/hermes +0 -0
  52. package/sdks/hermesc/osx-bin/hermesc +0 -0
  53. package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
  54. package/src/private/featureflags/ReactNativeFeatureFlags.js +6 -1
  55. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +2 -1
  56. package/src/private/webapis/performance/Performance.js +7 -7
  57. package/src/private/webapis/performance/ReactNativeStartupTiming.js +3 -24
  58. package/ReactCommon/jsinspector-modern/PerfMonitorV2.cpp +0 -92
  59. package/ReactCommon/jsinspector-modern/PerfMonitorV2.h +0 -59
@@ -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-20250911-dab8a4562';
32
+ static prerelease: string | null = 'nightly-20250912-a7dc5051d';
33
33
 
34
34
  static getVersionString(): string {
35
35
  return `${this.major}.${this.minor}.${this.patch}${this.prerelease != null ? `-${this.prerelease}` : ''}`;
@@ -69,6 +69,7 @@ RCT_EXTERN_C_END
69
69
  * will be used as the JS module name. If omitted, the JS module name will
70
70
  * match the Objective-C class name.
71
71
  */
72
+ #ifndef RCT_FIT_RM_OLD_RUNTIME
72
73
  #define RCT_EXPORT_MODULE(js_name) \
73
74
  RCT_EXTERN void RCTRegisterModule(Class); \
74
75
  +(NSString *)moduleName \
@@ -80,6 +81,17 @@ RCT_EXTERN_C_END
80
81
  RCTRegisterModule(self); \
81
82
  }
82
83
 
84
+ #else
85
+
86
+ #define RCT_EXPORT_MODULE(js_name) \
87
+ RCT_EXTERN void RCTRegisterModule(Class); \
88
+ +(NSString *)moduleName \
89
+ { \
90
+ return @ #js_name; \
91
+ }
92
+
93
+ #endif // RCT_FIT_RM_OLD_RUNTIME
94
+
83
95
  /**
84
96
  * Same as RCT_EXPORT_MODULE, but uses __attribute__((constructor)) for module
85
97
  * registration. Useful for registering swift classes that forbids use of load
@@ -24,7 +24,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(83),
26
26
  RCTVersionPatch: @(0),
27
- RCTVersionPrerelease: @"nightly-20250911-dab8a4562",
27
+ RCTVersionPrerelease: @"nightly-20250912-a7dc5051d",
28
28
  };
29
29
  });
30
30
  return __rnVersion;
@@ -137,6 +137,11 @@ static jsi::Value __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableA
137
137
  rt
138
138
  );
139
139
  }
140
+ static jsi::Value __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableAndroidLinearText(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
141
+ return static_cast<NativeReactNativeFeatureFlagsCxxSpecJSI *>(&turboModule)->enableAndroidLinearText(
142
+ rt
143
+ );
144
+ }
140
145
  static jsi::Value __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableAndroidTextMeasurementOptimizations(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
141
146
  return static_cast<NativeReactNativeFeatureFlagsCxxSpecJSI *>(&turboModule)->enableAndroidTextMeasurementOptimizations(
142
147
  rt
@@ -456,6 +461,7 @@ NativeReactNativeFeatureFlagsCxxSpecJSI::NativeReactNativeFeatureFlagsCxxSpecJSI
456
461
  methodMap_["disableTextLayoutManagerCacheAndroid"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_disableTextLayoutManagerCacheAndroid};
457
462
  methodMap_["enableAccessibilityOrder"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableAccessibilityOrder};
458
463
  methodMap_["enableAccumulatedUpdatesInRawPropsAndroid"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableAccumulatedUpdatesInRawPropsAndroid};
464
+ methodMap_["enableAndroidLinearText"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableAndroidLinearText};
459
465
  methodMap_["enableAndroidTextMeasurementOptimizations"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableAndroidTextMeasurementOptimizations};
460
466
  methodMap_["enableBridgelessArchitecture"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableBridgelessArchitecture};
461
467
  methodMap_["enableCppPropsIteratorSetter"] = MethodMetadata {0, __hostFunction_NativeReactNativeFeatureFlagsCxxSpecJSI_enableCppPropsIteratorSetter};
@@ -337,6 +337,7 @@ public:
337
337
  virtual bool disableTextLayoutManagerCacheAndroid(jsi::Runtime &rt) = 0;
338
338
  virtual bool enableAccessibilityOrder(jsi::Runtime &rt) = 0;
339
339
  virtual bool enableAccumulatedUpdatesInRawPropsAndroid(jsi::Runtime &rt) = 0;
340
+ virtual bool enableAndroidLinearText(jsi::Runtime &rt) = 0;
340
341
  virtual bool enableAndroidTextMeasurementOptimizations(jsi::Runtime &rt) = 0;
341
342
  virtual bool enableBridgelessArchitecture(jsi::Runtime &rt) = 0;
342
343
  virtual bool enableCppPropsIteratorSetter(jsi::Runtime &rt) = 0;
@@ -516,6 +517,14 @@ private:
516
517
  return bridging::callFromJs<bool>(
517
518
  rt, &T::enableAccumulatedUpdatesInRawPropsAndroid, jsInvoker_, instance_);
518
519
  }
520
+ bool enableAndroidLinearText(jsi::Runtime &rt) override {
521
+ static_assert(
522
+ bridging::getParameterCount(&T::enableAndroidLinearText) == 1,
523
+ "Expected enableAndroidLinearText(...) to have 1 parameters");
524
+
525
+ return bridging::callFromJs<bool>(
526
+ rt, &T::enableAndroidLinearText, jsInvoker_, instance_);
527
+ }
519
528
  bool enableAndroidTextMeasurementOptimizations(jsi::Runtime &rt) override {
520
529
  static_assert(
521
530
  bridging::getParameterCount(&T::enableAndroidTextMeasurementOptimizations) == 1,
@@ -1,5 +1,4 @@
1
- VERSION_NAME=0.83.0-nightly-20250911-dab8a4562
2
- HERMES_VERSION_NAME=1000.0.0
1
+ VERSION_NAME=0.83.0-nightly-20250912-a7dc5051d
3
2
  react.internal.publishingGroup=com.facebook.react
4
3
  react.internal.hermesPublishingGroup=com.facebook.hermes
5
4
 
@@ -229,7 +229,6 @@ public abstract class DevSupportManagerBase(
229
229
  }
230
230
  context
231
231
  },
232
- { openDebugger(DebuggerFrontendPanelName.PERFORMANCE.toString()) },
233
232
  )
234
233
  }
235
234
  }
@@ -15,12 +15,10 @@ import javax.inject.Provider
15
15
  internal class PerfMonitorOverlayManager(
16
16
  private val devHelper: PerfMonitorDevHelper,
17
17
  private val contextProvider: Provider<Context?>,
18
- private val onRequestOpenDevTools: () -> Unit,
19
18
  ) : PerfMonitorUpdateListener {
20
19
  private var enabled: Boolean = false
21
20
  private var initialized: Boolean = false
22
21
  private var view: PerfMonitorOverlayView? = null
23
- private var tracingState: TracingState = TracingState.ENABLEDINCDPMODE
24
22
 
25
23
  private fun init() {
26
24
  if (initialized || !enabled) {
@@ -29,7 +27,7 @@ internal class PerfMonitorOverlayManager(
29
27
 
30
28
  UiThreadUtil.runOnUiThread {
31
29
  val context = contextProvider.get() ?: return@runOnUiThread
32
- view = PerfMonitorOverlayView(context, ::handleRecordingButtonPress)
30
+ view = PerfMonitorOverlayView(context)
33
31
 
34
32
  // Start background tracing
35
33
  devHelper.inspectorTarget?.resumeBackgroundTrace()
@@ -43,44 +41,24 @@ internal class PerfMonitorOverlayManager(
43
41
  fun enable() {
44
42
  enabled = true
45
43
  init()
46
- UiThreadUtil.runOnUiThread { view?.show() }
47
44
  }
48
45
 
49
46
  /** Disable the Perf Monitor overlay. Will remain hidden when updates are received. */
50
47
  fun disable() {
51
48
  UiThreadUtil.runOnUiThread { view?.hide() }
49
+ view = null
52
50
  enabled = false
53
51
  }
54
52
 
55
53
  /** Reset the Perf Monitor overlay, e.g. after a reload. */
56
54
  fun reset() {
57
- UiThreadUtil.runOnUiThread { view?.resetState() }
58
-
59
55
  // Update with current recording state
60
56
  onRecordingStateChanged(
61
57
  devHelper.inspectorTarget?.getTracingState() ?: TracingState.ENABLEDINCDPMODE
62
58
  )
63
59
  }
64
60
 
65
- override fun onNewFocusedEvent(data: PerfMonitorUpdateListener.LongTaskEventData) {
66
- view?.updateFocusedEvent(data)
67
- }
68
-
69
61
  override fun onRecordingStateChanged(state: TracingState) {
70
- tracingState = state
71
62
  view?.updateRecordingState(state)
72
63
  }
73
-
74
- private fun handleRecordingButtonPress() {
75
- when (tracingState) {
76
- TracingState.ENABLEDINBACKGROUNDMODE -> {
77
- devHelper.inspectorTarget?.pauseAndAnalyzeBackgroundTrace()
78
- onRequestOpenDevTools()
79
- }
80
- TracingState.DISABLED -> {
81
- devHelper.inspectorTarget?.resumeBackgroundTrace()
82
- }
83
- TracingState.ENABLEDINCDPMODE -> Unit
84
- }
85
- }
86
64
  }
@@ -13,8 +13,6 @@ import android.graphics.Color
13
13
  import android.graphics.Typeface
14
14
  import android.graphics.drawable.ColorDrawable
15
15
  import android.graphics.drawable.GradientDrawable
16
- import android.os.Handler
17
- import android.os.Looper
18
16
  import android.view.Gravity
19
17
  import android.view.Window
20
18
  import android.view.WindowManager
@@ -26,186 +24,88 @@ import com.facebook.react.R
26
24
  import com.facebook.react.devsupport.interfaces.TracingState
27
25
  import com.facebook.react.uimanager.DisplayMetricsHolder
28
26
  import com.facebook.react.uimanager.PixelUtil
29
- import java.util.Locale
30
27
 
31
28
  internal class PerfMonitorOverlayView(
32
29
  private val context: Context,
33
- private val onButtonPress: () -> Unit,
34
30
  ) {
35
- private var hidden: Boolean = true
36
- private var hasEventData: Boolean = false
37
- private val metricsDialog: Dialog
38
- private val toolbarDialog: Dialog
39
- private val tooltipDialog: Dialog
40
- private lateinit var buttonLabel: TextView
41
- private lateinit var recordingStateLabel: TextView
42
- private lateinit var durationLabel: TextView
31
+ private val dialog: Dialog
32
+ private lateinit var statusLabel: TextView
43
33
  private lateinit var tooltipLabel: TextView
44
- private var ttl: Int = 0
45
- private var hideAfterTimeoutHandler: Handler? = null
34
+ private lateinit var statusIndicator: TextView
46
35
 
47
36
  init {
48
37
  DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(context)
49
- tooltipDialog = createTooltipDialog()
50
- metricsDialog = createMetricsDialog()
51
- toolbarDialog = createToolbarDialog()
38
+ dialog = createToolbarDialog()
52
39
  }
53
40
 
54
41
  fun show() {
55
- toolbarDialog.show()
56
- tooltipDialog.show()
57
- if (hasEventData) {
58
- toolbarDialog.window?.decorView?.post { updateMetricsDialogPosition() }
59
- metricsDialog.show()
60
- }
61
- hidden = false
42
+ dialog.show()
62
43
  }
63
44
 
64
45
  fun hide() {
65
- metricsDialog.hide()
66
- toolbarDialog.hide()
67
- tooltipDialog.hide()
68
- hidden = true
69
- }
70
-
71
- fun resetState() {
72
- hasEventData = false
73
- metricsDialog.hide()
74
- }
75
-
76
- fun updateFocusedEvent(data: PerfMonitorUpdateListener.LongTaskEventData) {
77
- durationLabel.text = String.format(Locale.US, "%d ms", data.durationMs)
78
- durationLabel.setTextColor(getDurationHighlightColor(data.responsivenessScore))
79
- hasEventData = true
80
- ttl = data.ttl
81
-
82
- hideAfterTimeoutHandler?.removeCallbacksAndMessages(null)
83
-
84
- if (!hidden) {
85
- metricsDialog.show()
86
-
87
- // Schedule hiding metrics overlay after ttl milliseconds
88
- if (ttl > 0) {
89
- if (hideAfterTimeoutHandler == null) {
90
- hideAfterTimeoutHandler = Handler(Looper.getMainLooper())
91
- }
92
- hideAfterTimeoutHandler?.postDelayed({ metricsDialog.hide() }, ttl.toLong())
93
- }
94
- }
46
+ dialog.hide()
95
47
  }
96
48
 
97
49
  fun updateRecordingState(state: TracingState) {
98
- recordingStateLabel.text =
99
- when (state) {
100
- TracingState.ENABLEDINBACKGROUNDMODE -> "Profiling: ON"
101
- TracingState.DISABLED -> "Profiling: OFF"
102
- TracingState.ENABLEDINCDPMODE -> "Profiling: DISABLED"
103
- }
104
- buttonLabel.text =
105
- when (state) {
106
- TracingState.ENABLEDINBACKGROUNDMODE -> "Open ↗️"
107
- TracingState.DISABLED -> "Start"
108
- TracingState.ENABLEDINCDPMODE -> ""
109
- }
110
- tooltipLabel.text =
111
- when (state) {
112
- TracingState.ENABLEDINBACKGROUNDMODE -> "Dev Menu > Finish performance trace"
113
- TracingState.DISABLED -> "Dev Menu > Start performance trace"
114
- TracingState.ENABLEDINCDPMODE -> ""
115
- }
116
50
  if (state == TracingState.ENABLEDINCDPMODE) {
117
- tooltipDialog.hide()
118
- } else {
119
- tooltipDialog.show()
51
+ dialog.hide()
52
+ return
120
53
  }
121
54
 
122
- toolbarDialog.window?.decorView?.post { updateMetricsDialogPosition() }
55
+ if (state == TracingState.ENABLEDINBACKGROUNDMODE) {
56
+ (statusIndicator.background as GradientDrawable).setColor(Color.RED)
57
+ statusLabel.text = "Background Profiling Active"
58
+ tooltipLabel.text = "Press ☰ to open"
59
+ } else {
60
+ (statusIndicator.background as GradientDrawable).setColor(Color.GRAY)
61
+ statusLabel.text = "Background Profiling Stopped"
62
+ tooltipLabel.text = "Press ☰ to restart"
63
+ }
64
+ dialog.show()
123
65
  }
124
66
 
125
- private fun createMetricsDialog(): Dialog {
126
- val containerLayout = createInnerLayout()
127
- val longTaskLabel =
128
- TextView(context).apply {
129
- textSize = TEXT_SIZE_PRIMARY
130
- text = "Long Task"
131
- setTextColor(Color.WHITE)
132
- typeface = TYPEFACE_BOLD
133
- }
134
- durationLabel =
67
+ private fun createToolbarDialog(): Dialog {
68
+ statusIndicator =
135
69
  TextView(context).apply {
136
- textSize = TEXT_SIZE_PRIMARY
137
- setTextColor(COLOR_TEXT_GREEN)
138
- typeface = TYPEFACE_BOLD
70
+ width = dpToPx(12f).toInt()
71
+ height = dpToPx(12f).toInt()
72
+ background =
73
+ GradientDrawable().apply {
74
+ shape = GradientDrawable.OVAL
75
+ setColor(Color.RED)
76
+ }
139
77
  }
140
- containerLayout.addView(longTaskLabel)
141
- containerLayout.addView(durationLabel)
142
78
 
143
- val dialog =
144
- createAnchoredDialog(getMetricsDialogOffsetX(), dpToPx(16f)).apply {
145
- setContentView(containerLayout)
79
+ val textContainer =
80
+ LinearLayout(context).apply {
81
+ orientation = LinearLayout.VERTICAL
82
+ layoutParams =
83
+ LinearLayout.LayoutParams(
84
+ LinearLayout.LayoutParams.WRAP_CONTENT,
85
+ LinearLayout.LayoutParams.WRAP_CONTENT,
86
+ )
146
87
  }
147
- dialog.window?.apply {
148
- attributes =
149
- attributes?.apply {
150
- flags =
151
- flags or
152
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
153
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
154
- }
155
- }
156
-
157
- return dialog
158
- }
159
-
160
- private fun createToolbarDialog(): Dialog {
161
- val buttonInner = createInnerLayout()
162
- recordingStateLabel =
88
+ statusLabel =
163
89
  TextView(context).apply {
164
90
  textSize = TEXT_SIZE_PRIMARY
165
91
  setTextColor(Color.WHITE)
166
92
  typeface = TYPEFACE_BOLD
167
93
  }
168
- buttonInner.addView(recordingStateLabel)
169
- buttonLabel =
170
- TextView(context).apply {
171
- textSize = TEXT_SIZE_PRIMARY
172
- setTextColor(COLOR_TEXT_BLUE)
173
- typeface = TYPEFACE_BOLD
174
- }
175
- buttonInner.addView(buttonLabel)
176
- val buttonView =
177
- LinearLayout(context).apply {
178
- orientation = LinearLayout.VERTICAL
179
- setPadding(
180
- dpToPx(8f).toInt(),
181
- dpToPx(16f).toInt(),
182
- dpToPx(16f).toInt(),
183
- dpToPx(8f).toInt(),
184
- )
185
- addView(buttonInner)
186
- setOnClickListener { onButtonPress() }
187
- }
188
-
189
- val dialog = createAnchoredDialog(dpToPx(0f), dpToPx(0f)).apply { setContentView(buttonView) }
190
- dialog.window?.apply {
191
- attributes =
192
- attributes?.apply { flags = flags or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE }
193
- }
194
-
195
- return dialog
196
- }
197
-
198
- private fun createTooltipDialog(): Dialog {
199
- val containerLayout = createInnerLayout()
200
94
  tooltipLabel =
201
95
  TextView(context).apply {
202
96
  textSize = TEXT_SIZE_ACCESSORY
203
97
  setTextColor(Color.WHITE)
98
+ typeface = TYPEFACE_BOLD
204
99
  }
205
- containerLayout.addView(tooltipLabel)
100
+ textContainer.addView(statusLabel)
101
+ textContainer.addView(tooltipLabel)
102
+
103
+ val containerLayout = createInnerLayout()
104
+ containerLayout.addView(statusIndicator)
105
+ containerLayout.addView(textContainer)
206
106
 
207
107
  val dialog =
208
- createAnchoredDialog(dpToPx(16f), dpToPx(52f)).apply { setContentView(containerLayout) }
108
+ createAnchoredDialog(dpToPx(12f), dpToPx(12f)).apply { setContentView(containerLayout) }
209
109
  dialog.window?.apply {
210
110
  attributes =
211
111
  attributes?.apply {
@@ -278,35 +178,12 @@ internal class PerfMonitorOverlayView(
278
178
  }
279
179
  }
280
180
 
281
- private fun getMetricsDialogOffsetX(): Float {
282
- val toolbarWidth = toolbarDialog?.window?.decorView?.width ?: 0
283
- return toolbarWidth.toFloat()
284
- }
285
-
286
- private fun updateMetricsDialogPosition() {
287
- metricsDialog?.window?.apply {
288
- attributes = attributes?.apply { x = getMetricsDialogOffsetX().toInt() }
289
- }
290
- }
291
-
292
- private fun getDurationHighlightColor(responsivenessScore: Int): Int {
293
- return when (responsivenessScore) {
294
- 2 -> COLOR_TEXT_RED
295
- 1 -> COLOR_TEXT_YELLOW
296
- else -> COLOR_TEXT_GREEN
297
- }
298
- }
299
-
300
181
  private fun dpToPx(dp: Float): Float = PixelUtil.toPixelFromDIP(dp)
301
182
 
302
183
  companion object {
303
- private val COLOR_TEXT_GREEN = Color.parseColor("#4AEB2F")
304
- private val COLOR_TEXT_YELLOW = Color.parseColor("#FFAA00")
305
- private val COLOR_TEXT_RED = Color.parseColor("#FF0000")
306
- private val COLOR_TEXT_BLUE = Color.parseColor("#00B0FF")
307
184
  private val COLOR_OVERLAY_BORDER = Color.parseColor("#6C6C6C")
308
- private val TEXT_SIZE_PRIMARY = 13f
309
- private val TEXT_SIZE_ACCESSORY = 9f
185
+ private val TEXT_SIZE_PRIMARY = 12f
186
+ private val TEXT_SIZE_ACCESSORY = 10f
310
187
  private val TYPEFACE_BOLD = Typeface.create("sans-serif", Typeface.BOLD)
311
188
  }
312
189
  }
@@ -10,15 +10,6 @@ import com.facebook.react.devsupport.interfaces.TracingState
10
10
 
11
11
  /** [Experimental] An interface for subscribing to updates for the V2 Perf Monitor. */
12
12
  internal interface PerfMonitorUpdateListener {
13
- data class LongTaskEventData(
14
- val durationMs: Int,
15
- val responsivenessScore: Int,
16
- val ttl: Int,
17
- )
18
-
19
- /** Called when a new active performance event should be displayed. */
20
- fun onNewFocusedEvent(data: LongTaskEventData)
21
-
22
13
  /** Called when the recording state of the background performance trace has changed. */
23
14
  fun onRecordingStateChanged(state: TracingState)
24
15
  }
@@ -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<<8300eb10fb4906468cd5f04afd8e16cd>>
7
+ * @generated SignedSource<<af10f4eea240ae4a228de9bbc4b78b7e>>
8
8
  */
9
9
 
10
10
  /**
@@ -90,6 +90,12 @@ public object ReactNativeFeatureFlags {
90
90
  @JvmStatic
91
91
  public fun enableAccumulatedUpdatesInRawPropsAndroid(): Boolean = accessor.enableAccumulatedUpdatesInRawPropsAndroid()
92
92
 
93
+ /**
94
+ * Enables linear text rendering on Android wherever subpixel text rendering is enabled
95
+ */
96
+ @JvmStatic
97
+ public fun enableAndroidLinearText(): Boolean = accessor.enableAndroidLinearText()
98
+
93
99
  /**
94
100
  * Enables various optimizations throughout the path of measuring text on Android.
95
101
  */
@@ -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<<ea5133af611c4d1e7e70155a3a74492d>>
7
+ * @generated SignedSource<<0b5ee4e7d8800ea89c97b2501d121b6e>>
8
8
  */
9
9
 
10
10
  /**
@@ -30,6 +30,7 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
30
30
  private var disableTextLayoutManagerCacheAndroidCache: Boolean? = null
31
31
  private var enableAccessibilityOrderCache: Boolean? = null
32
32
  private var enableAccumulatedUpdatesInRawPropsAndroidCache: Boolean? = null
33
+ private var enableAndroidLinearTextCache: Boolean? = null
33
34
  private var enableAndroidTextMeasurementOptimizationsCache: Boolean? = null
34
35
  private var enableBridgelessArchitectureCache: Boolean? = null
35
36
  private var enableCppPropsIteratorSetterCache: Boolean? = null
@@ -182,6 +183,15 @@ internal class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAcces
182
183
  return cached
183
184
  }
184
185
 
186
+ override fun enableAndroidLinearText(): Boolean {
187
+ var cached = enableAndroidLinearTextCache
188
+ if (cached == null) {
189
+ cached = ReactNativeFeatureFlagsCxxInterop.enableAndroidLinearText()
190
+ enableAndroidLinearTextCache = cached
191
+ }
192
+ return cached
193
+ }
194
+
185
195
  override fun enableAndroidTextMeasurementOptimizations(): Boolean {
186
196
  var cached = enableAndroidTextMeasurementOptimizationsCache
187
197
  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<<cf5b9f099846d4f954304905f77ebe17>>
7
+ * @generated SignedSource<<5fbbabfffca4f13066ad1ab7f9462c13>>
8
8
  */
9
9
 
10
10
  /**
@@ -48,6 +48,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
48
48
 
49
49
  @DoNotStrip @JvmStatic public external fun enableAccumulatedUpdatesInRawPropsAndroid(): Boolean
50
50
 
51
+ @DoNotStrip @JvmStatic public external fun enableAndroidLinearText(): Boolean
52
+
51
53
  @DoNotStrip @JvmStatic public external fun enableAndroidTextMeasurementOptimizations(): Boolean
52
54
 
53
55
  @DoNotStrip @JvmStatic public external fun enableBridgelessArchitecture(): 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<<305496047314dc97352a6e0dad0bba54>>
7
+ * @generated SignedSource<<bcad5baef5d072b71afba69bffabdb41>>
8
8
  */
9
9
 
10
10
  /**
@@ -43,6 +43,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
43
43
 
44
44
  override fun enableAccumulatedUpdatesInRawPropsAndroid(): Boolean = false
45
45
 
46
+ override fun enableAndroidLinearText(): Boolean = false
47
+
46
48
  override fun enableAndroidTextMeasurementOptimizations(): Boolean = false
47
49
 
48
50
  override fun enableBridgelessArchitecture(): 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<<f3798eada96337cf98715fa580823b30>>
7
+ * @generated SignedSource<<0733f7a2ea498a0230bcfaa5b15a0b89>>
8
8
  */
9
9
 
10
10
  /**
@@ -34,6 +34,7 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
34
34
  private var disableTextLayoutManagerCacheAndroidCache: Boolean? = null
35
35
  private var enableAccessibilityOrderCache: Boolean? = null
36
36
  private var enableAccumulatedUpdatesInRawPropsAndroidCache: Boolean? = null
37
+ private var enableAndroidLinearTextCache: Boolean? = null
37
38
  private var enableAndroidTextMeasurementOptimizationsCache: Boolean? = null
38
39
  private var enableBridgelessArchitectureCache: Boolean? = null
39
40
  private var enableCppPropsIteratorSetterCache: Boolean? = null
@@ -196,6 +197,16 @@ internal class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcc
196
197
  return cached
197
198
  }
198
199
 
200
+ override fun enableAndroidLinearText(): Boolean {
201
+ var cached = enableAndroidLinearTextCache
202
+ if (cached == null) {
203
+ cached = currentProvider.enableAndroidLinearText()
204
+ accessedFeatureFlags.add("enableAndroidLinearText")
205
+ enableAndroidLinearTextCache = cached
206
+ }
207
+ return cached
208
+ }
209
+
199
210
  override fun enableAndroidTextMeasurementOptimizations(): Boolean {
200
211
  var cached = enableAndroidTextMeasurementOptimizationsCache
201
212
  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<<f82b5905d822f8009c054a9443f86e39>>
7
+ * @generated SignedSource<<4464982256b8ce543d9235fccbf67054>>
8
8
  */
9
9
 
10
10
  /**
@@ -27,6 +27,8 @@ public open class ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android : ReactN
27
27
 
28
28
  override fun enableFabricRenderer(): Boolean = true
29
29
 
30
+ override fun enableWebPerformanceAPIsByDefault(): Boolean = true
31
+
30
32
  override fun useNativeViewConfigsInBridgelessMode(): Boolean = true
31
33
 
32
34
  override fun useTurboModuleInterop(): Boolean = true
@@ -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<<c36e7ac588eb68660f000e7792ec2384>>
7
+ * @generated SignedSource<<a51d970a5ea4e74b7871cc9521f9edce>>
8
8
  */
9
9
 
10
10
  /**
@@ -43,6 +43,8 @@ public interface ReactNativeFeatureFlagsProvider {
43
43
 
44
44
  @DoNotStrip public fun enableAccumulatedUpdatesInRawPropsAndroid(): Boolean
45
45
 
46
+ @DoNotStrip public fun enableAndroidLinearText(): Boolean
47
+
46
48
  @DoNotStrip public fun enableAndroidTextMeasurementOptimizations(): Boolean
47
49
 
48
50
  @DoNotStrip public fun enableBridgelessArchitecture(): Boolean
@@ -15,6 +15,6 @@ public object ReactNativeVersion {
15
15
  "major" to 0,
16
16
  "minor" to 83,
17
17
  "patch" to 0,
18
- "prerelease" to "nightly-20250911-dab8a4562"
18
+ "prerelease" to "nightly-20250912-a7dc5051d"
19
19
  )
20
20
  }
@@ -65,18 +65,6 @@ internal class ReactHostInspectorTarget(reactHostImpl: ReactHostImpl) :
65
65
  }
66
66
  }
67
67
 
68
- fun handleNativePerfMonitorMetricUpdate(
69
- longTaskDurationMs: Int,
70
- responsivenessScore: Int,
71
- ttl: Int,
72
- ) {
73
- perfMonitorListeners.forEach { listener ->
74
- listener.onNewFocusedEvent(
75
- PerfMonitorUpdateListener.LongTaskEventData(longTaskDurationMs, responsivenessScore, ttl)
76
- )
77
- }
78
- }
79
-
80
68
  override fun close() {
81
69
  mHybridData.resetNative()
82
70
  }