react-native 0.72.0-rc.0 → 0.72.0-rc.1
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/Libraries/Core/ReactNativeVersionCheck.js +5 -1
- package/Libraries/ReactNative/UIManager.js +27 -1
- package/Libraries/Renderer/implementations/ReactFabric-dev.js +26 -3
- package/Libraries/Renderer/implementations/ReactFabric-prod.js +13 -1
- package/Libraries/Renderer/implementations/ReactFabric-profiling.js +13 -1
- package/React/Base/RCTVersion.m +1 -1
- package/React/Fabric/Mounting/ComponentViews/LegacyViewManagerInterop/RCTLegacyViewManagerInteropCoordinatorAdapter.mm +1 -1
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java +40 -1
- package/ReactAndroid/src/main/java/com/facebook/react/ReactFragment.java +22 -7
- package/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +3 -0
- package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactActivityDelegate.kt +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomLetterSpacingSpan.java +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomStyleSpan.java +4 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextUpdate.java +1 -5
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +190 -134
- package/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputManager.java +23 -10
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewBackgroundManager.java +5 -0
- package/ReactAndroid/src/main/jni/react/fabric/Binding.cpp +3 -0
- package/ReactCommon/React-rncore.podspec +12 -4
- package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
- package/ReactCommon/react/config/ReactNativeConfig.cpp +3 -0
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.h +4 -1
- package/ReactCommon/react/renderer/components/legacyviewmanagerinterop/RCTLegacyViewManagerInteropCoordinator.mm +49 -2
- package/ReactCommon/react/renderer/components/text/ParagraphLayoutManager.cpp +30 -5
- package/ReactCommon/react/renderer/components/text/ParagraphLayoutManager.h +12 -0
- package/ReactCommon/react/renderer/core/CoreFeatures.cpp +1 -0
- package/ReactCommon/react/renderer/core/CoreFeatures.h +5 -0
- package/ReactCommon/react/renderer/textlayoutmanager/platform/android/react/renderer/textlayoutmanager/TextLayoutManager.cpp +5 -1
- package/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +112 -83
- package/build.gradle.kts +17 -0
- package/gradle.properties +1 -0
- package/package.json +7 -7
- package/scripts/cocoapods/__tests__/codegen_utils-test.rb +9 -1
- package/scripts/cocoapods/codegen_utils.rb +1 -1
- package/sdks/hermesc/osx-bin/hermesc +0 -0
- package/sdks/hermesc/win64-bin/hermesc.exe +0 -0
- package/settings.gradle.kts +30 -0
- package/template/metro.config.js +7 -13
- package/template/package.json +4 -2
|
@@ -39,8 +39,12 @@ exports.checkVersions = function checkVersions(): void {
|
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
|
|
42
|
+
// Note: in OSS, the prerelease version is usually 0.Y.0-rc.W, so it is a string and not a number
|
|
43
|
+
// Then we need to keep supporting that object shape.
|
|
42
44
|
function _formatVersion(
|
|
43
|
-
version:
|
|
45
|
+
version:
|
|
46
|
+
| (typeof Platform)['constants']['reactNativeVersion']
|
|
47
|
+
| {major: number, minor: number, patch: number, prerelease: ?string},
|
|
44
48
|
): string {
|
|
45
49
|
return (
|
|
46
50
|
`${version.major}.${version.minor}.${version.patch}` +
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type {RootTag} from '../Types/RootTagTypes';
|
|
12
|
-
import type {Spec as FabricUIManagerSpec} from './FabricUIManager';
|
|
13
12
|
import type {Spec} from './NativeUIManager';
|
|
14
13
|
|
|
15
14
|
import {getFabricUIManager} from './FabricUIManager';
|
|
@@ -175,6 +174,33 @@ const UIManager = {
|
|
|
175
174
|
);
|
|
176
175
|
}
|
|
177
176
|
},
|
|
177
|
+
|
|
178
|
+
dispatchViewManagerCommand(
|
|
179
|
+
reactTag: number,
|
|
180
|
+
commandName: number | string,
|
|
181
|
+
commandArgs: any[],
|
|
182
|
+
) {
|
|
183
|
+
if (isFabricReactTag(reactTag)) {
|
|
184
|
+
const FabricUIManager = nullthrows(getFabricUIManager());
|
|
185
|
+
const shadowNode =
|
|
186
|
+
FabricUIManager.findShadowNodeByTag_DEPRECATED(reactTag);
|
|
187
|
+
if (shadowNode) {
|
|
188
|
+
// Transform the accidental CommandID into a CommandName which is the stringified number.
|
|
189
|
+
// The interop layer knows how to convert this number into the right method name.
|
|
190
|
+
// Stringify a string is a no-op, so it's safe.
|
|
191
|
+
commandName = `${commandName}`;
|
|
192
|
+
FabricUIManager.dispatchCommand(shadowNode, commandName, commandArgs);
|
|
193
|
+
}
|
|
194
|
+
} else {
|
|
195
|
+
UIManagerImpl.dispatchViewManagerCommand(
|
|
196
|
+
reactTag,
|
|
197
|
+
// We have some legacy components that are actually already using strings. ¯\_(ツ)_/¯
|
|
198
|
+
// $FlowFixMe[incompatible-call]
|
|
199
|
+
commandName,
|
|
200
|
+
commandArgs,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
},
|
|
178
204
|
};
|
|
179
205
|
|
|
180
206
|
module.exports = UIManager;
|
|
@@ -3419,6 +3419,23 @@ function mountSafeCallback_NOT_REALLY_SAFE(context, callback) {
|
|
|
3419
3419
|
return callback.apply(context, arguments);
|
|
3420
3420
|
};
|
|
3421
3421
|
}
|
|
3422
|
+
function warnForStyleProps(props, validAttributes) {
|
|
3423
|
+
{
|
|
3424
|
+
for (var key in validAttributes.style) {
|
|
3425
|
+
if (!(validAttributes[key] || props[key] === undefined)) {
|
|
3426
|
+
error(
|
|
3427
|
+
"You are setting the style `{ %s" +
|
|
3428
|
+
": ... }` as a prop. You " +
|
|
3429
|
+
"should nest it in a style object. " +
|
|
3430
|
+
"E.g. `{ style: { %s" +
|
|
3431
|
+
": ... } }`",
|
|
3432
|
+
key,
|
|
3433
|
+
key
|
|
3434
|
+
);
|
|
3435
|
+
}
|
|
3436
|
+
}
|
|
3437
|
+
}
|
|
3438
|
+
}
|
|
3422
3439
|
|
|
3423
3440
|
// Modules provided by RN:
|
|
3424
3441
|
var emptyObject = {};
|
|
@@ -5100,7 +5117,8 @@ var _nativeFabricUIManage = nativeFabricUIManager,
|
|
|
5100
5117
|
FabricDefaultPriority = _nativeFabricUIManage.unstable_DefaultEventPriority,
|
|
5101
5118
|
FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority,
|
|
5102
5119
|
fabricGetCurrentEventPriority =
|
|
5103
|
-
_nativeFabricUIManage.unstable_getCurrentEventPriority
|
|
5120
|
+
_nativeFabricUIManage.unstable_getCurrentEventPriority,
|
|
5121
|
+
_setNativeProps = _nativeFabricUIManage.setNativeProps;
|
|
5104
5122
|
var getViewConfigForType =
|
|
5105
5123
|
ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get; // Counter for uniquely identifying views.
|
|
5106
5124
|
// % 10 === 1 means it is a rootTag.
|
|
@@ -5199,10 +5217,15 @@ var ReactFabricHostComponent = /*#__PURE__*/ (function() {
|
|
|
5199
5217
|
|
|
5200
5218
|
_proto.setNativeProps = function setNativeProps(nativeProps) {
|
|
5201
5219
|
{
|
|
5202
|
-
|
|
5220
|
+
warnForStyleProps(nativeProps, this.viewConfig.validAttributes);
|
|
5203
5221
|
}
|
|
5204
5222
|
|
|
5205
|
-
|
|
5223
|
+
var updatePayload = create(nativeProps, this.viewConfig.validAttributes);
|
|
5224
|
+
var stateNode = this._internalInstanceHandle.stateNode;
|
|
5225
|
+
|
|
5226
|
+
if (stateNode != null && updatePayload != null) {
|
|
5227
|
+
_setNativeProps(stateNode.node, updatePayload);
|
|
5228
|
+
}
|
|
5206
5229
|
}; // This API (addEventListener, removeEventListener) attempts to adhere to the
|
|
5207
5230
|
// w3 Level2 Events spec as much as possible, treating HostComponent as a DOM node.
|
|
5208
5231
|
//
|
|
@@ -1922,6 +1922,7 @@ var _nativeFabricUIManage = nativeFabricUIManager,
|
|
|
1922
1922
|
FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority,
|
|
1923
1923
|
fabricGetCurrentEventPriority =
|
|
1924
1924
|
_nativeFabricUIManage.unstable_getCurrentEventPriority,
|
|
1925
|
+
_setNativeProps = _nativeFabricUIManage.setNativeProps,
|
|
1925
1926
|
getViewConfigForType =
|
|
1926
1927
|
ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get,
|
|
1927
1928
|
nextReactTag = 2;
|
|
@@ -1979,7 +1980,18 @@ var ReactFabricHostComponent = (function() {
|
|
|
1979
1980
|
);
|
|
1980
1981
|
}
|
|
1981
1982
|
};
|
|
1982
|
-
_proto.setNativeProps = function() {
|
|
1983
|
+
_proto.setNativeProps = function(nativeProps) {
|
|
1984
|
+
nativeProps = diffProperties(
|
|
1985
|
+
null,
|
|
1986
|
+
emptyObject,
|
|
1987
|
+
nativeProps,
|
|
1988
|
+
this.viewConfig.validAttributes
|
|
1989
|
+
);
|
|
1990
|
+
var stateNode = this._internalInstanceHandle.stateNode;
|
|
1991
|
+
null != stateNode &&
|
|
1992
|
+
null != nativeProps &&
|
|
1993
|
+
_setNativeProps(stateNode.node, nativeProps);
|
|
1994
|
+
};
|
|
1983
1995
|
_proto.addEventListener_unstable = function(eventType, listener, options) {
|
|
1984
1996
|
if ("string" !== typeof eventType)
|
|
1985
1997
|
throw Error("addEventListener_unstable eventType must be a string");
|
|
@@ -1981,6 +1981,7 @@ var _nativeFabricUIManage = nativeFabricUIManager,
|
|
|
1981
1981
|
FabricDiscretePriority = _nativeFabricUIManage.unstable_DiscreteEventPriority,
|
|
1982
1982
|
fabricGetCurrentEventPriority =
|
|
1983
1983
|
_nativeFabricUIManage.unstable_getCurrentEventPriority,
|
|
1984
|
+
_setNativeProps = _nativeFabricUIManage.setNativeProps,
|
|
1984
1985
|
getViewConfigForType =
|
|
1985
1986
|
ReactNativePrivateInterface.ReactNativeViewConfigRegistry.get,
|
|
1986
1987
|
nextReactTag = 2;
|
|
@@ -2038,7 +2039,18 @@ var ReactFabricHostComponent = (function() {
|
|
|
2038
2039
|
);
|
|
2039
2040
|
}
|
|
2040
2041
|
};
|
|
2041
|
-
_proto.setNativeProps = function() {
|
|
2042
|
+
_proto.setNativeProps = function(nativeProps) {
|
|
2043
|
+
nativeProps = diffProperties(
|
|
2044
|
+
null,
|
|
2045
|
+
emptyObject,
|
|
2046
|
+
nativeProps,
|
|
2047
|
+
this.viewConfig.validAttributes
|
|
2048
|
+
);
|
|
2049
|
+
var stateNode = this._internalInstanceHandle.stateNode;
|
|
2050
|
+
null != stateNode &&
|
|
2051
|
+
null != nativeProps &&
|
|
2052
|
+
_setNativeProps(stateNode.node, nativeProps);
|
|
2053
|
+
};
|
|
2042
2054
|
_proto.addEventListener_unstable = function(eventType, listener, options) {
|
|
2043
2055
|
if ("string" !== typeof eventType)
|
|
2044
2056
|
throw Error("addEventListener_unstable eventType must be a string");
|
package/React/Base/RCTVersion.m
CHANGED
|
@@ -11,6 +11,7 @@ import android.app.Activity;
|
|
|
11
11
|
import android.content.Intent;
|
|
12
12
|
import android.os.Bundle;
|
|
13
13
|
import android.view.KeyEvent;
|
|
14
|
+
import androidx.annotation.NonNull;
|
|
14
15
|
import androidx.annotation.Nullable;
|
|
15
16
|
import com.facebook.infer.annotation.Assertions;
|
|
16
17
|
import com.facebook.react.devsupport.DoubleTapReloadRecognizer;
|
|
@@ -33,6 +34,8 @@ public class ReactDelegate {
|
|
|
33
34
|
|
|
34
35
|
private ReactNativeHost mReactNativeHost;
|
|
35
36
|
|
|
37
|
+
private boolean mFabricEnabled = false;
|
|
38
|
+
|
|
36
39
|
public ReactDelegate(
|
|
37
40
|
Activity activity,
|
|
38
41
|
ReactNativeHost reactNativeHost,
|
|
@@ -45,6 +48,20 @@ public class ReactDelegate {
|
|
|
45
48
|
mReactNativeHost = reactNativeHost;
|
|
46
49
|
}
|
|
47
50
|
|
|
51
|
+
public ReactDelegate(
|
|
52
|
+
Activity activity,
|
|
53
|
+
ReactNativeHost reactNativeHost,
|
|
54
|
+
@Nullable String appKey,
|
|
55
|
+
@Nullable Bundle launchOptions,
|
|
56
|
+
boolean fabricEnabled) {
|
|
57
|
+
mActivity = activity;
|
|
58
|
+
mMainComponentName = appKey;
|
|
59
|
+
mLaunchOptions = composeLaunchOptions(launchOptions);
|
|
60
|
+
mDoubleTapReloadRecognizer = new DoubleTapReloadRecognizer();
|
|
61
|
+
mReactNativeHost = reactNativeHost;
|
|
62
|
+
mFabricEnabled = fabricEnabled;
|
|
63
|
+
}
|
|
64
|
+
|
|
48
65
|
public void onHostResume() {
|
|
49
66
|
if (getReactNativeHost().hasInstance()) {
|
|
50
67
|
if (mActivity instanceof DefaultHardwareBackBtnHandler) {
|
|
@@ -109,7 +126,9 @@ public class ReactDelegate {
|
|
|
109
126
|
}
|
|
110
127
|
|
|
111
128
|
protected ReactRootView createRootView() {
|
|
112
|
-
|
|
129
|
+
ReactRootView reactRootView = new ReactRootView(mActivity);
|
|
130
|
+
reactRootView.setIsFabric(isFabricEnabled());
|
|
131
|
+
return reactRootView;
|
|
113
132
|
}
|
|
114
133
|
|
|
115
134
|
/**
|
|
@@ -144,4 +163,24 @@ public class ReactDelegate {
|
|
|
144
163
|
public ReactInstanceManager getReactInstanceManager() {
|
|
145
164
|
return getReactNativeHost().getReactInstanceManager();
|
|
146
165
|
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Override this method if you wish to selectively toggle Fabric for a specific surface. This will
|
|
169
|
+
* also control if Concurrent Root (React 18) should be enabled or not.
|
|
170
|
+
*
|
|
171
|
+
* @return true if Fabric is enabled for this Activity, false otherwise.
|
|
172
|
+
*/
|
|
173
|
+
protected boolean isFabricEnabled() {
|
|
174
|
+
return mFabricEnabled;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private @NonNull Bundle composeLaunchOptions(Bundle composedLaunchOptions) {
|
|
178
|
+
if (isFabricEnabled()) {
|
|
179
|
+
if (composedLaunchOptions == null) {
|
|
180
|
+
composedLaunchOptions = new Bundle();
|
|
181
|
+
}
|
|
182
|
+
composedLaunchOptions.putBoolean("concurrentRoot", true);
|
|
183
|
+
}
|
|
184
|
+
return composedLaunchOptions;
|
|
185
|
+
}
|
|
147
186
|
}
|
|
@@ -16,6 +16,7 @@ import android.view.KeyEvent;
|
|
|
16
16
|
import android.view.LayoutInflater;
|
|
17
17
|
import android.view.View;
|
|
18
18
|
import android.view.ViewGroup;
|
|
19
|
+
import androidx.annotation.NonNull;
|
|
19
20
|
import androidx.annotation.Nullable;
|
|
20
21
|
import androidx.fragment.app.Fragment;
|
|
21
22
|
import com.facebook.react.modules.core.PermissionAwareActivity;
|
|
@@ -29,6 +30,7 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
29
30
|
|
|
30
31
|
protected static final String ARG_COMPONENT_NAME = "arg_component_name";
|
|
31
32
|
protected static final String ARG_LAUNCH_OPTIONS = "arg_launch_options";
|
|
33
|
+
protected static final String ARG_FABRIC_ENABLED = "arg_fabric_enabled";
|
|
32
34
|
|
|
33
35
|
private ReactDelegate mReactDelegate;
|
|
34
36
|
|
|
@@ -40,13 +42,16 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
40
42
|
|
|
41
43
|
/**
|
|
42
44
|
* @param componentName The name of the react native component
|
|
45
|
+
* @param fabricEnabled Flag to enable Fabric for ReactFragment
|
|
43
46
|
* @return A new instance of fragment ReactFragment.
|
|
44
47
|
*/
|
|
45
|
-
private static ReactFragment newInstance(
|
|
48
|
+
private static ReactFragment newInstance(
|
|
49
|
+
String componentName, Bundle launchOptions, Boolean fabricEnabled) {
|
|
46
50
|
ReactFragment fragment = new ReactFragment();
|
|
47
51
|
Bundle args = new Bundle();
|
|
48
52
|
args.putString(ARG_COMPONENT_NAME, componentName);
|
|
49
53
|
args.putBundle(ARG_LAUNCH_OPTIONS, launchOptions);
|
|
54
|
+
args.putBoolean(ARG_FABRIC_ENABLED, fabricEnabled);
|
|
50
55
|
fragment.setArguments(args);
|
|
51
56
|
return fragment;
|
|
52
57
|
}
|
|
@@ -57,15 +62,18 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
57
62
|
super.onCreate(savedInstanceState);
|
|
58
63
|
String mainComponentName = null;
|
|
59
64
|
Bundle launchOptions = null;
|
|
65
|
+
Boolean fabricEnabled = null;
|
|
60
66
|
if (getArguments() != null) {
|
|
61
67
|
mainComponentName = getArguments().getString(ARG_COMPONENT_NAME);
|
|
62
68
|
launchOptions = getArguments().getBundle(ARG_LAUNCH_OPTIONS);
|
|
69
|
+
fabricEnabled = getArguments().getBoolean(ARG_FABRIC_ENABLED);
|
|
63
70
|
}
|
|
64
71
|
if (mainComponentName == null) {
|
|
65
72
|
throw new IllegalStateException("Cannot loadApp if component name is null");
|
|
66
73
|
}
|
|
67
74
|
mReactDelegate =
|
|
68
|
-
new ReactDelegate(
|
|
75
|
+
new ReactDelegate(
|
|
76
|
+
getActivity(), getReactNativeHost(), mainComponentName, launchOptions, fabricEnabled);
|
|
69
77
|
}
|
|
70
78
|
|
|
71
79
|
/**
|
|
@@ -85,7 +93,7 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
85
93
|
|
|
86
94
|
@Override
|
|
87
95
|
public View onCreateView(
|
|
88
|
-
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
96
|
+
@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
|
89
97
|
mReactDelegate.loadApp();
|
|
90
98
|
return mReactDelegate.getReactRootView();
|
|
91
99
|
}
|
|
@@ -140,7 +148,7 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
140
148
|
|
|
141
149
|
@Override
|
|
142
150
|
public void onRequestPermissionsResult(
|
|
143
|
-
int requestCode, String[] permissions, int[] grantResults) {
|
|
151
|
+
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
144
152
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
|
145
153
|
if (mPermissionListener != null
|
|
146
154
|
&& mPermissionListener.onRequestPermissionsResult(requestCode, permissions, grantResults)) {
|
|
@@ -170,12 +178,14 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
170
178
|
/** Builder class to help instantiate a ReactFragment */
|
|
171
179
|
public static class Builder {
|
|
172
180
|
|
|
173
|
-
String mComponentName;
|
|
174
|
-
Bundle mLaunchOptions;
|
|
181
|
+
@Nullable String mComponentName;
|
|
182
|
+
@Nullable Bundle mLaunchOptions;
|
|
183
|
+
@Nullable Boolean mFabricEnabled;
|
|
175
184
|
|
|
176
185
|
public Builder() {
|
|
177
186
|
mComponentName = null;
|
|
178
187
|
mLaunchOptions = null;
|
|
188
|
+
mFabricEnabled = null;
|
|
179
189
|
}
|
|
180
190
|
|
|
181
191
|
/**
|
|
@@ -201,7 +211,12 @@ public class ReactFragment extends Fragment implements PermissionAwareActivity {
|
|
|
201
211
|
}
|
|
202
212
|
|
|
203
213
|
public ReactFragment build() {
|
|
204
|
-
return ReactFragment.newInstance(mComponentName, mLaunchOptions);
|
|
214
|
+
return ReactFragment.newInstance(mComponentName, mLaunchOptions, mFabricEnabled);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public Builder setFabricEnabled(boolean fabricEnabled) {
|
|
218
|
+
mFabricEnabled = fabricEnabled;
|
|
219
|
+
return this;
|
|
205
220
|
}
|
|
206
221
|
}
|
|
207
222
|
}
|
|
@@ -75,6 +75,9 @@ public class ReactFeatureFlags {
|
|
|
75
75
|
/** Feature Flag to enable the pending event queue in fabric before mounting views */
|
|
76
76
|
public static boolean enableFabricPendingEventQueue = false;
|
|
77
77
|
|
|
78
|
+
/** Feature Flag to enable caching mechanism of text measurement at shadow node level */
|
|
79
|
+
public static boolean enableTextMeasureCachePerShadowNode = false;
|
|
80
|
+
|
|
78
81
|
/**
|
|
79
82
|
* Feature flag that controls how turbo modules are exposed to JS
|
|
80
83
|
*
|
package/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultReactActivityDelegate.kt
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
package com.facebook.react.defaults
|
|
9
9
|
|
|
10
|
+
import android.os.Bundle
|
|
10
11
|
import com.facebook.react.ReactActivity
|
|
11
12
|
import com.facebook.react.ReactActivityDelegate
|
|
12
13
|
import com.facebook.react.ReactRootView
|
|
@@ -43,4 +44,7 @@ open class DefaultReactActivityDelegate(
|
|
|
43
44
|
|
|
44
45
|
override fun createRootView(): ReactRootView =
|
|
45
46
|
ReactRootView(context).apply { setIsFabric(fabricEnabled) }
|
|
47
|
+
|
|
48
|
+
override fun createRootView(bundle: Bundle?): ReactRootView =
|
|
49
|
+
ReactRootView(context).apply { setIsFabric(fabricEnabled) }
|
|
46
50
|
}
|
package/ReactAndroid/src/main/java/com/facebook/react/views/text/CustomLetterSpacingSpan.java
CHANGED
|
@@ -37,6 +37,10 @@ public class CustomLetterSpacingSpan extends MetricAffectingSpan implements Reac
|
|
|
37
37
|
apply(paint);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
public float getSpacing() {
|
|
41
|
+
return mLetterSpacing;
|
|
42
|
+
}
|
|
43
|
+
|
|
40
44
|
private void apply(TextPaint paint) {
|
|
41
45
|
if (!Float.isNaN(mLetterSpacing)) {
|
|
42
46
|
paint.setLetterSpacing(mLetterSpacing);
|
|
@@ -71,6 +71,10 @@ public class CustomStyleSpan extends MetricAffectingSpan implements ReactSpan {
|
|
|
71
71
|
return mFontFamily;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
public @Nullable String getFontFeatureSettings() {
|
|
75
|
+
return mFeatureSettings;
|
|
76
|
+
}
|
|
77
|
+
|
|
74
78
|
private static void apply(
|
|
75
79
|
Paint paint,
|
|
76
80
|
int style,
|
|
@@ -31,8 +31,6 @@ public class ReactTextUpdate {
|
|
|
31
31
|
private final int mSelectionEnd;
|
|
32
32
|
private final int mJustificationMode;
|
|
33
33
|
|
|
34
|
-
public boolean mContainsMultipleFragments;
|
|
35
|
-
|
|
36
34
|
/**
|
|
37
35
|
* @deprecated Use a non-deprecated constructor for ReactTextUpdate instead. This one remains
|
|
38
36
|
* because it's being used by a unit test that isn't currently open source.
|
|
@@ -142,13 +140,11 @@ public class ReactTextUpdate {
|
|
|
142
140
|
int jsEventCounter,
|
|
143
141
|
int textAlign,
|
|
144
142
|
int textBreakStrategy,
|
|
145
|
-
int justificationMode
|
|
146
|
-
boolean containsMultipleFragments) {
|
|
143
|
+
int justificationMode) {
|
|
147
144
|
|
|
148
145
|
ReactTextUpdate reactTextUpdate =
|
|
149
146
|
new ReactTextUpdate(
|
|
150
147
|
text, jsEventCounter, false, textAlign, textBreakStrategy, justificationMode);
|
|
151
|
-
reactTextUpdate.mContainsMultipleFragments = containsMultipleFragments;
|
|
152
148
|
return reactTextUpdate;
|
|
153
149
|
}
|
|
154
150
|
|