react-native 0.83.0-nightly-20250910-019a553ea → 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 (73) hide show
  1. package/Libraries/Core/ReactNativeVersion.js +1 -1
  2. package/Libraries/Network/React-RCTNetwork.podspec +1 -0
  3. package/React/Base/RCTBridgeModule.h +12 -0
  4. package/React/Base/RCTVersion.m +1 -1
  5. package/React/FBReactNativeSpec/FBReactNativeSpecJSI-generated.cpp +12 -0
  6. package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +18 -0
  7. package/ReactAndroid/gradle.properties +1 -2
  8. package/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +1 -1
  9. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +0 -1
  10. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +2 -24
  11. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +46 -169
  12. package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorUpdateListener.kt +0 -9
  13. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +7 -1
  14. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +11 -1
  15. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +3 -1
  16. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +3 -1
  17. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +12 -1
  18. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt +3 -1
  19. package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +3 -1
  20. package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
  21. package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +0 -12
  22. package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +18 -2
  23. package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/CustomStyleSpan.kt +4 -0
  24. package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +16 -7
  25. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +15 -1
  26. package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +4 -1
  27. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +0 -11
  28. package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +0 -2
  29. package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
  30. package/ReactCommon/jsinspector-modern/HostTarget.cpp +0 -14
  31. package/ReactCommon/jsinspector-modern/HostTarget.h +0 -16
  32. package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +0 -7
  33. package/ReactCommon/jsinspector-modern/InspectorFlags.h +0 -6
  34. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +5 -1
  35. package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +6 -1
  36. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +80 -62
  37. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +4 -2
  38. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +5 -1
  39. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +10 -1
  40. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h +5 -1
  41. package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +2 -1
  42. package/ReactCommon/react/nativemodule/defaults/React-defaultsnativemodule.podspec +2 -1
  43. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +6 -1
  44. package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +3 -1
  45. package/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp +9 -9
  46. package/ReactCommon/react/nativemodule/webperformance/NativePerformance.h +3 -0
  47. package/ReactCommon/react/nativemodule/webperformance/React-webperformancenativemodule.podspec +2 -0
  48. package/ReactCommon/react/performance/cdpmetrics/CdpMetricsReporter.cpp +1 -24
  49. package/ReactCommon/react/performance/cdpmetrics/CdpMetricsReporter.h +0 -1
  50. package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +0 -10
  51. package/ReactCommon/react/performance/timeline/PerformanceEntryReporterListeners.h +0 -2
  52. package/ReactCommon/react/renderer/core/DynamicEventPayload.cpp +3 -3
  53. package/ReactCommon/react/timing/primitives.h +12 -0
  54. package/flow/bom.js.flow +4 -4
  55. package/jest/mockComponent.js +3 -2
  56. package/package.json +8 -8
  57. package/scripts/codegen/generate-artifacts-executor/generatePackageSwift.js +44 -0
  58. package/scripts/codegen/generate-artifacts-executor/index.js +26 -12
  59. package/scripts/codegen/generate-artifacts-executor/utils.js +12 -0
  60. package/scripts/codegen/templates/Package.swift.template +59 -0
  61. package/scripts/react_native_pods.rb +3 -2
  62. package/sdks/hermes-engine/hermes-engine.podspec +6 -1
  63. package/sdks/hermes-engine/version.properties +1 -0
  64. package/sdks/hermesc/osx-bin/hermes +0 -0
  65. package/sdks/hermesc/osx-bin/hermesc +0 -0
  66. package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
  67. package/src/private/featureflags/ReactNativeFeatureFlags.js +6 -1
  68. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +2 -1
  69. package/src/private/webapis/performance/Performance.js +26 -7
  70. package/src/private/webapis/performance/ReactNativeStartupTiming.js +3 -24
  71. package/src/private/webapis/performance/specs/NativePerformance.js +2 -0
  72. package/ReactCommon/jsinspector-modern/PerfMonitorV2.cpp +0 -92
  73. 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-20250910-019a553ea';
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}` : ''}`;
@@ -50,6 +50,7 @@ Pod::Spec.new do |s|
50
50
  add_dependency(s, "React-jsinspectorcdp", :framework_name => 'jsinspector_moderncdp')
51
51
  add_dependency(s, "React-jsinspectornetwork", :framework_name => 'jsinspector_modernnetwork')
52
52
  add_dependency(s, "React-NativeModulesApple", :additional_framework_paths => ["build/generated/ios"])
53
+ add_dependency(s, "React-networking", :framework_name => 'React_networking')
53
54
 
54
55
  add_rn_third_party_dependencies(s)
55
56
  add_rncore_dependency(s)
@@ -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-20250910-019a553ea",
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};
@@ -3163,6 +3169,11 @@ static jsi::Value __hostFunction_NativePerformanceCxxSpecJSI_now(jsi::Runtime &r
3163
3169
  rt
3164
3170
  );
3165
3171
  }
3172
+ static jsi::Value __hostFunction_NativePerformanceCxxSpecJSI_timeOrigin(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
3173
+ return static_cast<NativePerformanceCxxSpecJSI *>(&turboModule)->timeOrigin(
3174
+ rt
3175
+ );
3176
+ }
3166
3177
  static jsi::Value __hostFunction_NativePerformanceCxxSpecJSI_reportMark(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
3167
3178
  static_cast<NativePerformanceCxxSpecJSI *>(&turboModule)->reportMark(
3168
3179
  rt,
@@ -3285,6 +3296,7 @@ static jsi::Value __hostFunction_NativePerformanceCxxSpecJSI_clearEventCountsFor
3285
3296
  NativePerformanceCxxSpecJSI::NativePerformanceCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
3286
3297
  : TurboModule("NativePerformanceCxx", jsInvoker) {
3287
3298
  methodMap_["now"] = MethodMetadata {0, __hostFunction_NativePerformanceCxxSpecJSI_now};
3299
+ methodMap_["timeOrigin"] = MethodMetadata {0, __hostFunction_NativePerformanceCxxSpecJSI_timeOrigin};
3288
3300
  methodMap_["reportMark"] = MethodMetadata {3, __hostFunction_NativePerformanceCxxSpecJSI_reportMark};
3289
3301
  methodMap_["reportMeasure"] = MethodMetadata {4, __hostFunction_NativePerformanceCxxSpecJSI_reportMeasure};
3290
3302
  methodMap_["getMarkTime"] = MethodMetadata {1, __hostFunction_NativePerformanceCxxSpecJSI_getMarkTime};
@@ -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,
@@ -8742,6 +8751,7 @@ protected:
8742
8751
 
8743
8752
  public:
8744
8753
  virtual double now(jsi::Runtime &rt) = 0;
8754
+ virtual double timeOrigin(jsi::Runtime &rt) = 0;
8745
8755
  virtual void reportMark(jsi::Runtime &rt, jsi::String name, double startTime, jsi::Value entry) = 0;
8746
8756
  virtual void reportMeasure(jsi::Runtime &rt, jsi::String name, double startTime, double duration, jsi::Value entry) = 0;
8747
8757
  virtual std::optional<double> getMarkTime(jsi::Runtime &rt, jsi::String name) = 0;
@@ -8798,6 +8808,14 @@ private:
8798
8808
  return bridging::callFromJs<double>(
8799
8809
  rt, &T::now, jsInvoker_, instance_);
8800
8810
  }
8811
+ double timeOrigin(jsi::Runtime &rt) override {
8812
+ static_assert(
8813
+ bridging::getParameterCount(&T::timeOrigin) == 1,
8814
+ "Expected timeOrigin(...) to have 1 parameters");
8815
+
8816
+ return bridging::callFromJs<double>(
8817
+ rt, &T::timeOrigin, jsInvoker_, instance_);
8818
+ }
8801
8819
  void reportMark(jsi::Runtime &rt, jsi::String name, double startTime, jsi::Value entry) override {
8802
8820
  static_assert(
8803
8821
  bridging::getParameterCount(&T::reportMark) == 4,
@@ -1,5 +1,4 @@
1
- VERSION_NAME=0.83.0-nightly-20250910-019a553ea
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
 
@@ -96,7 +96,7 @@ public class CatalystInstanceImpl implements CatalystInstance {
96
96
  private final TraceListener mTraceListener;
97
97
  private final JavaScriptModuleRegistry mJSModuleRegistry;
98
98
  private final JSBundleLoader mJSBundleLoader;
99
- private final ArrayList<PendingJSCall> mJSCallsPendingInit = new ArrayList<PendingJSCall>();
99
+ private final ArrayList<PendingJSCall> mJSCallsPendingInit = new ArrayList<>();
100
100
  private final Object mJSCallsPendingInitLock = new Object();
101
101
 
102
102
  private final NativeModuleRegistry mNativeModuleRegistry;
@@ -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) {