Skip to content

Commit c39f9cd

Browse files
Pass surfaceId to imageRequest (#53572)
Summary: Pull Request resolved: #53572 Changelog: [Internal] Code refactoring to pass actual `surfaceid` to PrefetchResourcesMountItem Differential Revision: D81506929
1 parent 1086a77 commit c39f9cd

File tree

9 files changed

+55
-47
lines changed

9 files changed

+55
-47
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -985,13 +985,16 @@ public void runGuarded() {
985985
* by an ImageView.
986986
*/
987987
@UnstableReactNativeAPI
988-
public void experimental_prefetchResources(String componentName, ReadableMapBuffer params) {
988+
public void experimental_prefetchResources(
989+
int surfaceId, String componentName, ReadableMapBuffer params) {
989990
if (ReactNativeFeatureFlags.enableImagePrefetchingOnUiThreadAndroid()) {
990991
mMountItemDispatcher.addMountItem(
991-
new PrefetchResourcesMountItem(mReactApplicationContext, componentName, params));
992+
new PrefetchResourcesMountItem(surfaceId, componentName, params));
992993
} else {
993-
mMountingManager.experimental_prefetchResources(
994-
mReactApplicationContext, componentName, params);
994+
SurfaceMountingManager surfaceMountingManager = mMountingManager.getSurfaceManager(surfaceId);
995+
if (surfaceMountingManager != null) {
996+
surfaceMountingManager.experimental_prefetchResources(surfaceId, componentName, params);
997+
}
995998
}
996999
}
9971000

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

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import com.facebook.react.bridge.ReadableMap
1919
import com.facebook.react.bridge.RetryableMountingLayerException
2020
import com.facebook.react.bridge.UiThreadUtil.assertOnUiThread
2121
import com.facebook.react.bridge.WritableMap
22-
import com.facebook.react.common.annotations.UnstableReactNativeAPI
23-
import com.facebook.react.common.mapbuffer.MapBuffer
2422
import com.facebook.react.fabric.events.EventEmitterWrapper
2523
import com.facebook.react.fabric.mounting.mountitems.MountItem
2624
import com.facebook.react.touch.JSResponderHandler
@@ -325,27 +323,6 @@ internal class MountingManager(
325323
attachmentsPositions,
326324
)
327325

328-
/**
329-
* This prefetch method is experimental, do not use it for production code. it will most likely
330-
* change or be removed in the future.
331-
*
332-
* @param reactContext
333-
* @param componentName
334-
* @param params prefetch request params defined in C++
335-
*/
336-
@Suppress("FunctionName")
337-
@AnyThread
338-
@UnstableReactNativeAPI
339-
fun experimental_prefetchResources(
340-
reactContext: ReactContext?,
341-
componentName: String?,
342-
params: MapBuffer?,
343-
) {
344-
viewManagerRegistry
345-
.get(checkNotNull(componentName))
346-
.experimental_prefetchResources(reactContext, params)
347-
}
348-
349326
fun enqueuePendingEvent(
350327
surfaceId: Int,
351328
reactTag: Int,

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import static com.facebook.infer.annotation.ThreadConfined.ANY;
1111
import static com.facebook.infer.annotation.ThreadConfined.UI;
1212

13+
import android.annotation.SuppressLint;
1314
import android.view.View;
1415
import android.view.ViewGroup;
1516
import android.view.ViewParent;
@@ -30,7 +31,9 @@
3031
import com.facebook.react.bridge.SoftAssertions;
3132
import com.facebook.react.bridge.UiThreadUtil;
3233
import com.facebook.react.bridge.WritableMap;
34+
import com.facebook.react.common.annotations.UnstableReactNativeAPI;
3335
import com.facebook.react.common.build.ReactBuildConfig;
36+
import com.facebook.react.common.mapbuffer.MapBuffer;
3437
import com.facebook.react.fabric.events.EventEmitterWrapper;
3538
import com.facebook.react.fabric.mounting.MountingManager.MountItemExecutor;
3639
import com.facebook.react.fabric.mounting.mountitems.MountItem;
@@ -696,6 +699,25 @@ public void updateProps(int reactTag, ReadableMap props) {
696699
.updateProperties(view, viewState.mCurrentProps);
697700
}
698701

702+
/**
703+
* This prefetch method is experimental, do not use it for production code. it will most likely
704+
* change or be removed in the future.
705+
*
706+
* @param surfaceId surface ID
707+
* @param componentName
708+
* @param params prefetch request params defined in C++
709+
*/
710+
@SuppressLint("FunctionName")
711+
@AnyThread
712+
@UnstableReactNativeAPI
713+
public void experimental_prefetchResources(
714+
int surfaceId, String componentName, MapBuffer params) {
715+
mViewManagerRegistry
716+
.get(componentName)
717+
.experimental_prefetchResources(
718+
surfaceId, Assertions.assertNotNull(mThemedReactContext), params);
719+
}
720+
699721
@Deprecated
700722
public void receiveCommand(int reactTag, int commandId, ReadableArray commandArgs) {
701723
if (isStopped()) {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/PrefetchResourcesMountItem.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,28 +7,29 @@
77

88
package com.facebook.react.fabric.mounting.mountitems
99

10-
import com.facebook.react.bridge.ReactApplicationContext
1110
import com.facebook.react.common.annotations.FrameworkAPI
1211
import com.facebook.react.common.annotations.UnstableReactNativeAPI
1312
import com.facebook.react.common.mapbuffer.ReadableMapBuffer
1413
import com.facebook.react.fabric.mounting.MountingManager
1514

1615
internal class PrefetchResourcesMountItem(
17-
private val reactApplicationContext: ReactApplicationContext,
16+
private val surfaceId: Int,
1817
private val componentName: String,
1918
private val params: ReadableMapBuffer,
2019
) : MountItem {
2120

2221
@OptIn(UnstableReactNativeAPI::class, FrameworkAPI::class)
2322
override fun execute(mountingManager: MountingManager) {
24-
mountingManager.experimental_prefetchResources(
25-
reactApplicationContext,
26-
componentName,
27-
params,
28-
)
23+
mountingManager
24+
.getSurfaceManager(surfaceId)
25+
?.experimental_prefetchResources(
26+
surfaceId,
27+
componentName,
28+
params,
29+
)
2930
}
3031

31-
override fun getSurfaceId(): Int = -1 /* unused */
32+
override fun getSurfaceId(): Int = surfaceId
3233

3334
override fun toString(): String = "PrefetchResourcesMountItem"
3435
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,11 +487,13 @@ public void onSurfaceStopped(int surfaceId) {
487487
* <p>Subclasses can override this method to implement custom resource prefetching for the
488488
* ViewManager.
489489
*
490+
* @param surfaceId surface ID
490491
* @param reactContext {@link com.facebook.react.bridge.ReactContext} used for the view.
491492
* @param params {@link MapBuffer} prefetch request params defined in C++
492493
*/
493494
@UnstableReactNativeAPI
494-
public void experimental_prefetchResources(ReactContext reactContext, MapBuffer params) {
495+
public void experimental_prefetchResources(
496+
int surfaceId, ReactContext reactContext, MapBuffer params) {
495497
return;
496498
}
497499

packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,8 @@ ImageRequest ImageFetcher::requestImage(
4444
SurfaceId surfaceId,
4545
const ImageRequestParams& imageRequestParams,
4646
Tag tag) {
47-
items_.emplace_back(ImageRequestItem{
47+
items_[surfaceId].emplace_back(ImageRequestItem{
4848
.imageSource = imageSource,
49-
.surfaceId = surfaceId,
5049
.imageRequestParams = imageRequestParams,
5150
.tag = tag});
5251

@@ -68,13 +67,18 @@ RootShadowNode::Unshared ImageFetcher::shadowTreeWillCommit(
6867
contextContainer_->at<jni::global_ref<jobject>>("FabricUIManager");
6968
static auto prefetchResources =
7069
fabricUIManager_->getClass()
71-
->getMethod<void(std::string, JReadableMapBuffer::javaobject)>(
70+
->getMethod<void(
71+
SurfaceId, std::string, JReadableMapBuffer::javaobject)>(
7272
"experimental_prefetchResources");
7373

74-
auto readableMapBuffer =
75-
JReadableMapBuffer::createWithContents(serializeImageRequests(items_));
74+
for (auto& [surfaceId, surfaceImageRequests] : items_) {
75+
auto readableMapBuffer = JReadableMapBuffer::createWithContents(
76+
serializeImageRequests(surfaceImageRequests));
77+
prefetchResources(
78+
fabricUIManager_, surfaceId, "RCTImageView", readableMapBuffer.get());
79+
}
80+
7681
items_.clear();
77-
prefetchResources(fabricUIManager_, "RCTImageView", readableMapBuffer.get());
7882

7983
return newRootShadowNode;
8084
}

packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageFetcher.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include <react/renderer/mounting/ShadowTree.h>
1414
#include <react/renderer/uimanager/UIManagerCommitHook.h>
1515
#include <react/utils/ContextContainer.h>
16+
#include <unordered_map>
17+
#include <vector>
1618

1719
namespace facebook::react {
1820

@@ -43,7 +45,7 @@ class ImageFetcher : public UIManagerCommitHook {
4345
const ShadowTree::CommitOptions& commitOptions) noexcept override;
4446

4547
private:
46-
std::vector<ImageRequestItem> items_;
48+
std::unordered_map<SurfaceId, std::vector<ImageRequestItem>> items_;
4749
std::shared_ptr<const ContextContainer> contextContainer_;
4850
};
4951
} // namespace facebook::react

packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/ImageRequestParams.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ class ImageRequestParams {
9393

9494
struct ImageRequestItem {
9595
ImageSource imageSource;
96-
SurfaceId surfaceId{};
9796
ImageRequestParams imageRequestParams;
9897
Tag tag{};
9998
};

packages/react-native/ReactCommon/react/renderer/imagemanager/platform/android/react/renderer/imagemanager/conversions.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ constexpr MapBuffer::Key IS_KEY_FADE_DURATION = 11;
3434
constexpr MapBuffer::Key IS_KEY_PROGRESSIVE_RENDERING_ENABLED = 12;
3535
constexpr MapBuffer::Key IS_KEY_LOADING_INDICATOR_SRC = 13;
3636
constexpr MapBuffer::Key IS_KEY_ANALYTIC_TAG = 14;
37-
constexpr MapBuffer::Key IS_KEY_SURFACE_ID = 15;
38-
constexpr MapBuffer::Key IS_KEY_TAG = 16;
37+
constexpr MapBuffer::Key IS_KEY_TAG = 15;
3938

4039
inline void serializeImageSource(
4140
MapBufferBuilder& builder,
@@ -85,7 +84,6 @@ inline MapBuffer serializeImageRequest(const ImageRequestItem& item) {
8584
auto builder = MapBufferBuilder();
8685
serializeImageSource(builder, item.imageSource);
8786
serializeImageRequestParams(builder, item.imageRequestParams);
88-
builder.putInt(IS_KEY_SURFACE_ID, item.surfaceId);
8987
builder.putInt(IS_KEY_TAG, item.tag);
9088
return builder.build();
9189
}

0 commit comments

Comments
 (0)