Skip to content

Commit c5481c2

Browse files
dmytrorykunfacebook-github-bot
authored andcommitted
[skip ci] Introduce experimental image prefetching API (#47755)
Summary: TIA. Changelog: [Internal] Differential Revision: D65596686
1 parent 2781888 commit c5481c2

21 files changed

+197
-47
lines changed

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,28 @@ public long measureMapBuffer(
427427
attachmentsPositions);
428428
}
429429

430+
/**
431+
* THIS PREFETCH METHOD IS EXPERIMENTAL, DO NOT USE IT FOR PRODUCTION CODE, MOST LIKELY IT WILL
432+
* CHANGE OR BE REMOVED IN THE FUTURE.
433+
*
434+
* @param reactContext
435+
* @param componentName
436+
* @param surfaceId {@link int} surface ID
437+
* @param reactTag reactTag that should be set as ID of the view instance
438+
* @param params {@link MapBuffer} prefetch request params defined in C++
439+
*/
440+
@AnyThread
441+
public void experimental_prefetchResource(
442+
ReactContext reactContext,
443+
String componentName,
444+
int surfaceId,
445+
int reactTag,
446+
MapBuffer params) {
447+
mViewManagerRegistry
448+
.get(componentName)
449+
.experimental_prefetchResource(reactContext, surfaceId, reactTag, params);
450+
}
451+
430452
public void enqueuePendingEvent(
431453
int surfaceId,
432454
int reactTag,

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<b1ad8179cf22c2e97f623435bf152aab>>
7+
* @generated SignedSource<<6a797c8665bb8e216ac1a98da033d076>>
88
*/
99

1010
/**
@@ -130,6 +130,12 @@ public object ReactNativeFeatureFlags {
130130
@JvmStatic
131131
public fun enableIOSViewClipToPaddingBox(): Boolean = accessor.enableIOSViewClipToPaddingBox()
132132

133+
/**
134+
* When enabled, Andoid will build and initiate image prefetch request on ImageShadowNode::layout
135+
*/
136+
@JvmStatic
137+
public fun enableImagePrefetchingAndroid(): Boolean = accessor.enableImagePrefetchingAndroid()
138+
133139
/**
134140
* When enabled, LayoutAnimations API will animate state changes on Android.
135141
*/

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<7dd21b62dfe429aecdbd179cb482fb26>>
7+
* @generated SignedSource<<031fce8e8b4c20a3e3d6dbecf94d138a>>
88
*/
99

1010
/**
@@ -37,6 +37,7 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
3737
private var enableFixForViewCommandRaceCache: Boolean? = null
3838
private var enableGranularShadowTreeStateReconciliationCache: Boolean? = null
3939
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
40+
private var enableImagePrefetchingAndroidCache: Boolean? = null
4041
private var enableLayoutAnimationsOnAndroidCache: Boolean? = null
4142
private var enableLayoutAnimationsOnIOSCache: Boolean? = null
4243
private var enableLongTaskAPICache: Boolean? = null
@@ -219,6 +220,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso
219220
return cached
220221
}
221222

223+
override fun enableImagePrefetchingAndroid(): Boolean {
224+
var cached = enableImagePrefetchingAndroidCache
225+
if (cached == null) {
226+
cached = ReactNativeFeatureFlagsCxxInterop.enableImagePrefetchingAndroid()
227+
enableImagePrefetchingAndroidCache = cached
228+
}
229+
return cached
230+
}
231+
222232
override fun enableLayoutAnimationsOnAndroid(): Boolean {
223233
var cached = enableLayoutAnimationsOnAndroidCache
224234
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<fcfded14a5fe05501892993c1f58f3ed>>
7+
* @generated SignedSource<<35811667ac2543e1f64e27bbdb483ec1>>
88
*/
99

1010
/**
@@ -62,6 +62,8 @@ public object ReactNativeFeatureFlagsCxxInterop {
6262

6363
@DoNotStrip @JvmStatic public external fun enableIOSViewClipToPaddingBox(): Boolean
6464

65+
@DoNotStrip @JvmStatic public external fun enableImagePrefetchingAndroid(): Boolean
66+
6567
@DoNotStrip @JvmStatic public external fun enableLayoutAnimationsOnAndroid(): Boolean
6668

6769
@DoNotStrip @JvmStatic public external fun enableLayoutAnimationsOnIOS(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<86d8dd894e80a788af7f47172d30d33c>>
7+
* @generated SignedSource<<9d829c58e49164a0b2b6b66bc0ce088a>>
88
*/
99

1010
/**
@@ -57,6 +57,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi
5757

5858
override fun enableIOSViewClipToPaddingBox(): Boolean = false
5959

60+
override fun enableImagePrefetchingAndroid(): Boolean = false
61+
6062
override fun enableLayoutAnimationsOnAndroid(): Boolean = false
6163

6264
override fun enableLayoutAnimationsOnIOS(): Boolean = true

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<4bb5173b9ba1d3e620f3a7d613b27ac7>>
7+
* @generated SignedSource<<0121e113410a5b0e14eaf74a3076df2f>>
88
*/
99

1010
/**
@@ -41,6 +41,7 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
4141
private var enableFixForViewCommandRaceCache: Boolean? = null
4242
private var enableGranularShadowTreeStateReconciliationCache: Boolean? = null
4343
private var enableIOSViewClipToPaddingBoxCache: Boolean? = null
44+
private var enableImagePrefetchingAndroidCache: Boolean? = null
4445
private var enableLayoutAnimationsOnAndroidCache: Boolean? = null
4546
private var enableLayoutAnimationsOnIOSCache: Boolean? = null
4647
private var enableLongTaskAPICache: Boolean? = null
@@ -240,6 +241,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces
240241
return cached
241242
}
242243

244+
override fun enableImagePrefetchingAndroid(): Boolean {
245+
var cached = enableImagePrefetchingAndroidCache
246+
if (cached == null) {
247+
cached = currentProvider.enableImagePrefetchingAndroid()
248+
accessedFeatureFlags.add("enableImagePrefetchingAndroid")
249+
enableImagePrefetchingAndroidCache = cached
250+
}
251+
return cached
252+
}
253+
243254
override fun enableLayoutAnimationsOnAndroid(): Boolean {
244255
var cached = enableLayoutAnimationsOnAndroidCache
245256
if (cached == null) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<2217f2b9992c9424c3d1d221bdfa2236>>
7+
* @generated SignedSource<<2787d9027695dd14ec6b917a32a1a6de>>
88
*/
99

1010
/**
@@ -57,6 +57,8 @@ public interface ReactNativeFeatureFlagsProvider {
5757

5858
@DoNotStrip public fun enableIOSViewClipToPaddingBox(): Boolean
5959

60+
@DoNotStrip public fun enableImagePrefetchingAndroid(): Boolean
61+
6062
@DoNotStrip public fun enableLayoutAnimationsOnAndroid(): Boolean
6163

6264
@DoNotStrip public fun enableLayoutAnimationsOnIOS(): Boolean

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.facebook.common.logging.FLog;
1515
import com.facebook.react.bridge.BaseJavaModule;
1616
import com.facebook.react.bridge.ReactApplicationContext;
17+
import com.facebook.react.bridge.ReactContext;
1718
import com.facebook.react.bridge.ReadableArray;
1819
import com.facebook.react.bridge.ReadableMap;
1920
import com.facebook.react.common.mapbuffer.MapBuffer;
@@ -488,4 +489,25 @@ public void onSurfaceStopped(int surfaceId) {
488489
mRecyclableViews = new HashMap<>();
489490
}
490491
}
492+
493+
/**
494+
* THIS PREFETCH METHOD IS EXPERIMENTAL, DO NOT USE IT FOR PRODUCTION CODE, MOST LIKELY IT WILL
495+
* CHANGE OR BE REMOVED IN THE FUTURE.
496+
*
497+
* <p>Subclasses can override this method to implement custom resource prefetching for the
498+
* ViewManager.
499+
*
500+
* @param reactContext {@link com.facebook.react.bridge.ReactContext} used for the view.
501+
* @param surfaceId {@link int} surface ID
502+
* @param reactTag reactTag that should be set as ID of the view instance
503+
* @param params {@link MapBuffer} prefetch request params defined in C++
504+
*/
505+
public void experimental_prefetchResource(
506+
ReactContext reactContext, int surfaceId, int reactTag, MapBuffer params) {
507+
return;
508+
}
509+
510+
protected boolean experimental_isPrefetchingEnabled() {
511+
return ReactNativeFeatureFlags.enableImagePrefetchingAndroid();
512+
}
491513
}

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<d5ccaecdf8cc2cf6144409658d9076ae>>
7+
* @generated SignedSource<<902b269e45fcb4970c6f8a86818e1940>>
88
*/
99

1010
/**
@@ -141,6 +141,12 @@ class ReactNativeFeatureFlagsProviderHolder
141141
return method(javaProvider_);
142142
}
143143

144+
bool enableImagePrefetchingAndroid() override {
145+
static const auto method =
146+
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableImagePrefetchingAndroid");
147+
return method(javaProvider_);
148+
}
149+
144150
bool enableLayoutAnimationsOnAndroid() override {
145151
static const auto method =
146152
getReactNativeFeatureFlagsProviderJavaClass()->getMethod<jboolean()>("enableLayoutAnimationsOnAndroid");
@@ -398,6 +404,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableIOSViewClipToPaddingBox(
398404
return ReactNativeFeatureFlags::enableIOSViewClipToPaddingBox();
399405
}
400406

407+
bool JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid(
408+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
409+
return ReactNativeFeatureFlags::enableImagePrefetchingAndroid();
410+
}
411+
401412
bool JReactNativeFeatureFlagsCxxInterop::enableLayoutAnimationsOnAndroid(
402413
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop> /*unused*/) {
403414
return ReactNativeFeatureFlags::enableLayoutAnimationsOnAndroid();
@@ -620,6 +631,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() {
620631
makeNativeMethod(
621632
"enableIOSViewClipToPaddingBox",
622633
JReactNativeFeatureFlagsCxxInterop::enableIOSViewClipToPaddingBox),
634+
makeNativeMethod(
635+
"enableImagePrefetchingAndroid",
636+
JReactNativeFeatureFlagsCxxInterop::enableImagePrefetchingAndroid),
623637
makeNativeMethod(
624638
"enableLayoutAnimationsOnAndroid",
625639
JReactNativeFeatureFlagsCxxInterop::enableLayoutAnimationsOnAndroid),

packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
66
*
7-
* @generated SignedSource<<0b07eaeba8112f65ecb18d53b7b893af>>
7+
* @generated SignedSource<<17da0d7937c5c0c533293b86c8cdc9be>>
88
*/
99

1010
/**
@@ -81,6 +81,9 @@ class JReactNativeFeatureFlagsCxxInterop
8181
static bool enableIOSViewClipToPaddingBox(
8282
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
8383

84+
static bool enableImagePrefetchingAndroid(
85+
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
86+
8487
static bool enableLayoutAnimationsOnAndroid(
8588
facebook::jni::alias_ref<JReactNativeFeatureFlagsCxxInterop>);
8689

0 commit comments

Comments
 (0)