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.
- package/Libraries/Core/ReactNativeVersion.js +1 -1
- package/React/Base/RCTBridgeModule.h +12 -0
- package/React/Base/RCTVersion.m +1 -1
- package/React/FBReactNativeSpec/FBReactNativeSpecJSI-generated.cpp +6 -0
- package/React/FBReactNativeSpec/FBReactNativeSpecJSI.h +9 -0
- package/ReactAndroid/gradle.properties +1 -2
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerBase.kt +0 -1
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayManager.kt +2 -24
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorOverlayView.kt +46 -169
- package/ReactAndroid/src/main/java/com/facebook/react/devsupport/perfmonitor/PerfMonitorUpdateListener.kt +0 -9
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +7 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +11 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +3 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +3 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +12 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsOverrides_RNOSS_Canary_Android.kt +3 -1
- package/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +3 -1
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.kt +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostInspectorTarget.kt +0 -12
- package/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewHelper.kt +18 -2
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/CustomStyleSpan.kt +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.kt +16 -7
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +15 -1
- package/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +4 -1
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +0 -11
- package/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +0 -2
- package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
- package/ReactCommon/jsinspector-modern/HostTarget.cpp +0 -14
- package/ReactCommon/jsinspector-modern/HostTarget.h +0 -16
- package/ReactCommon/jsinspector-modern/InspectorFlags.cpp +0 -7
- package/ReactCommon/jsinspector-modern/InspectorFlags.h +0 -6
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +5 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +6 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +80 -62
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +4 -2
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +5 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDynamicProvider.h +10 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsOverridesOSSCanary.h +5 -1
- package/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +2 -1
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +6 -1
- package/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +3 -1
- package/ReactCommon/react/nativemodule/webperformance/NativePerformance.cpp +0 -9
- package/ReactCommon/react/performance/cdpmetrics/CdpMetricsReporter.cpp +1 -24
- package/ReactCommon/react/performance/cdpmetrics/CdpMetricsReporter.h +0 -1
- package/ReactCommon/react/performance/timeline/PerformanceEntryReporter.cpp +0 -10
- package/ReactCommon/react/performance/timeline/PerformanceEntryReporterListeners.h +0 -2
- package/jest/mockComponent.js +3 -2
- package/package.json +8 -8
- package/sdks/hermes-engine/hermes-engine.podspec +6 -1
- package/sdks/hermes-engine/version.properties +1 -0
- package/sdks/hermesc/osx-bin/hermes +0 -0
- package/sdks/hermesc/osx-bin/hermesc +0 -0
- package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
- package/src/private/featureflags/ReactNativeFeatureFlags.js +6 -1
- package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +2 -1
- package/src/private/webapis/performance/Performance.js +7 -7
- package/src/private/webapis/performance/ReactNativeStartupTiming.js +3 -24
- package/ReactCommon/jsinspector-modern/PerfMonitorV2.cpp +0 -92
- 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-
|
|
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
|
package/React/Base/RCTVersion.m
CHANGED
|
@@ -24,7 +24,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
|
|
|
24
24
|
RCTVersionMajor: @(0),
|
|
25
25
|
RCTVersionMinor: @(83),
|
|
26
26
|
RCTVersionPatch: @(0),
|
|
27
|
-
RCTVersionPrerelease: @"nightly-
|
|
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,
|
|
@@ -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
|
|
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
|
|
36
|
-
private var
|
|
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
|
|
45
|
-
private var hideAfterTimeoutHandler: Handler? = null
|
|
34
|
+
private lateinit var statusIndicator: TextView
|
|
46
35
|
|
|
47
36
|
init {
|
|
48
37
|
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(context)
|
|
49
|
-
|
|
50
|
-
metricsDialog = createMetricsDialog()
|
|
51
|
-
toolbarDialog = createToolbarDialog()
|
|
38
|
+
dialog = createToolbarDialog()
|
|
52
39
|
}
|
|
53
40
|
|
|
54
41
|
fun show() {
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
tooltipDialog.show()
|
|
51
|
+
dialog.hide()
|
|
52
|
+
return
|
|
120
53
|
}
|
|
121
54
|
|
|
122
|
-
|
|
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
|
|
126
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
309
|
-
private val TEXT_SIZE_ACCESSORY =
|
|
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<<
|
|
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<<
|
|
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<<
|
|
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<<
|
|
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<<
|
|
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<<
|
|
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<<
|
|
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
|
|
@@ -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
|
}
|