Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -985,13 +985,16 @@ public void runGuarded() {
* by an ImageView.
*/
@UnstableReactNativeAPI
public void experimental_prefetchResources(String componentName, ReadableMapBuffer params) {
public void experimental_prefetchResources(
int surfaceId, String componentName, ReadableMapBuffer params) {
if (ReactNativeFeatureFlags.enableImagePrefetchingOnUiThreadAndroid()) {
mMountItemDispatcher.addMountItem(
new PrefetchResourcesMountItem(mReactApplicationContext, componentName, params));
new PrefetchResourcesMountItem(surfaceId, componentName, params));
} else {
mMountingManager.experimental_prefetchResources(
mReactApplicationContext, componentName, params);
SurfaceMountingManager surfaceMountingManager = mMountingManager.getSurfaceManager(surfaceId);
if (surfaceMountingManager != null) {
surfaceMountingManager.experimental_prefetchResources(surfaceId, componentName, params);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.RetryableMountingLayerException
import com.facebook.react.bridge.UiThreadUtil.assertOnUiThread
import com.facebook.react.bridge.WritableMap
import com.facebook.react.common.annotations.UnstableReactNativeAPI
import com.facebook.react.common.mapbuffer.MapBuffer
import com.facebook.react.fabric.events.EventEmitterWrapper
import com.facebook.react.fabric.mounting.mountitems.MountItem
import com.facebook.react.touch.JSResponderHandler
Expand Down Expand Up @@ -325,27 +323,6 @@ internal class MountingManager(
attachmentsPositions,
)

/**
* This prefetch method is experimental, do not use it for production code. it will most likely
* change or be removed in the future.
*
* @param reactContext
* @param componentName
* @param params prefetch request params defined in C++
*/
@Suppress("FunctionName")
@AnyThread
@UnstableReactNativeAPI
fun experimental_prefetchResources(
reactContext: ReactContext?,
componentName: String?,
params: MapBuffer?,
) {
viewManagerRegistry
.get(checkNotNull(componentName))
.experimental_prefetchResources(reactContext, params)
}

fun enqueuePendingEvent(
surfaceId: Int,
reactTag: Int,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import static com.facebook.infer.annotation.ThreadConfined.ANY;
import static com.facebook.infer.annotation.ThreadConfined.UI;

import android.annotation.SuppressLint;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
Expand All @@ -30,7 +31,9 @@
import com.facebook.react.bridge.SoftAssertions;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.common.annotations.UnstableReactNativeAPI;
import com.facebook.react.common.build.ReactBuildConfig;
import com.facebook.react.common.mapbuffer.MapBuffer;
import com.facebook.react.fabric.events.EventEmitterWrapper;
import com.facebook.react.fabric.mounting.MountingManager.MountItemExecutor;
import com.facebook.react.fabric.mounting.mountitems.MountItem;
Expand Down Expand Up @@ -696,6 +699,25 @@ public void updateProps(int reactTag, ReadableMap props) {
.updateProperties(view, viewState.mCurrentProps);
}

/**
* This prefetch method is experimental, do not use it for production code. it will most likely
* change or be removed in the future.
*
* @param surfaceId surface ID
* @param componentName
* @param params prefetch request params defined in C++
*/
@SuppressLint("FunctionName")
@AnyThread
@UnstableReactNativeAPI
public void experimental_prefetchResources(
int surfaceId, String componentName, MapBuffer params) {
mViewManagerRegistry
.get(componentName)
.experimental_prefetchResources(
surfaceId, Assertions.assertNotNull(mThemedReactContext), params);
}

@Deprecated
public void receiveCommand(int reactTag, int commandId, ReadableArray commandArgs) {
if (isStopped()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,29 @@

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

import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.common.annotations.FrameworkAPI
import com.facebook.react.common.annotations.UnstableReactNativeAPI
import com.facebook.react.common.mapbuffer.ReadableMapBuffer
import com.facebook.react.fabric.mounting.MountingManager

internal class PrefetchResourcesMountItem(
private val reactApplicationContext: ReactApplicationContext,
private val surfaceId: Int,
private val componentName: String,
private val params: ReadableMapBuffer,
) : MountItem {

@OptIn(UnstableReactNativeAPI::class, FrameworkAPI::class)
override fun execute(mountingManager: MountingManager) {
mountingManager.experimental_prefetchResources(
reactApplicationContext,
componentName,
params,
)
mountingManager
.getSurfaceManager(surfaceId)
?.experimental_prefetchResources(
surfaceId,
componentName,
params,
)
}

override fun getSurfaceId(): Int = -1 /* unused */
override fun getSurfaceId(): Int = surfaceId

override fun toString(): String = "PrefetchResourcesMountItem"
}
Original file line number Diff line number Diff line change
Expand Up @@ -487,11 +487,13 @@ public void onSurfaceStopped(int surfaceId) {
* <p>Subclasses can override this method to implement custom resource prefetching for the
* ViewManager.
*
* @param surfaceId surface ID
* @param reactContext {@link com.facebook.react.bridge.ReactContext} used for the view.
* @param params {@link MapBuffer} prefetch request params defined in C++
*/
@UnstableReactNativeAPI
public void experimental_prefetchResources(ReactContext reactContext, MapBuffer params) {
public void experimental_prefetchResources(
int surfaceId, ReactContext reactContext, MapBuffer params) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,8 @@ ImageRequest ImageFetcher::requestImage(
SurfaceId surfaceId,
const ImageRequestParams& imageRequestParams,
Tag tag) {
items_.emplace_back(ImageRequestItem{
items_[surfaceId].emplace_back(ImageRequestItem{
.imageSource = imageSource,
.surfaceId = surfaceId,
.imageRequestParams = imageRequestParams,
.tag = tag});

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

auto readableMapBuffer =
JReadableMapBuffer::createWithContents(serializeImageRequests(items_));
for (auto& [surfaceId, surfaceImageRequests] : items_) {
auto readableMapBuffer = JReadableMapBuffer::createWithContents(
serializeImageRequests(surfaceImageRequests));
prefetchResources(
fabricUIManager_, surfaceId, "RCTImageView", readableMapBuffer.get());
}

items_.clear();
prefetchResources(fabricUIManager_, "RCTImageView", readableMapBuffer.get());

return newRootShadowNode;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
#include <react/renderer/mounting/ShadowTree.h>
#include <react/renderer/uimanager/UIManagerCommitHook.h>
#include <react/utils/ContextContainer.h>
#include <unordered_map>
#include <vector>

namespace facebook::react {

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

private:
std::vector<ImageRequestItem> items_;
std::unordered_map<SurfaceId, std::vector<ImageRequestItem>> items_;
std::shared_ptr<const ContextContainer> contextContainer_;
};
} // namespace facebook::react
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,6 @@ class ImageRequestParams {

struct ImageRequestItem {
ImageSource imageSource;
SurfaceId surfaceId{};
ImageRequestParams imageRequestParams;
Tag tag{};
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ constexpr MapBuffer::Key IS_KEY_FADE_DURATION = 11;
constexpr MapBuffer::Key IS_KEY_PROGRESSIVE_RENDERING_ENABLED = 12;
constexpr MapBuffer::Key IS_KEY_LOADING_INDICATOR_SRC = 13;
constexpr MapBuffer::Key IS_KEY_ANALYTIC_TAG = 14;
constexpr MapBuffer::Key IS_KEY_SURFACE_ID = 15;
constexpr MapBuffer::Key IS_KEY_TAG = 16;
constexpr MapBuffer::Key IS_KEY_TAG = 15;

inline void serializeImageSource(
MapBufferBuilder& builder,
Expand Down Expand Up @@ -85,7 +84,6 @@ inline MapBuffer serializeImageRequest(const ImageRequestItem& item) {
auto builder = MapBufferBuilder();
serializeImageSource(builder, item.imageSource);
serializeImageRequestParams(builder, item.imageRequestParams);
builder.putInt(IS_KEY_SURFACE_ID, item.surfaceId);
builder.putInt(IS_KEY_TAG, item.tag);
return builder.build();
}
Expand Down
Loading