Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MultiSourceHelper.java -> MultiSourceHelper.kt #43776

Closed
wants to merge 1 commit into from
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
15 changes: 8 additions & 7 deletions packages/react-native/ReactAndroid/api/ReactAndroid.api
Original file line number Diff line number Diff line change
Expand Up @@ -6199,15 +6199,16 @@ public class com/facebook/react/views/imagehelper/ImageSource {
public fun isResource ()Z
}

public class com/facebook/react/views/imagehelper/MultiSourceHelper {
public fun <init> ()V
public static fun getBestSourceForSize (IILjava/util/List;)Lcom/facebook/react/views/imagehelper/MultiSourceHelper$MultiSourceResult;
public static fun getBestSourceForSize (IILjava/util/List;D)Lcom/facebook/react/views/imagehelper/MultiSourceHelper$MultiSourceResult;
public final class com/facebook/react/views/imagehelper/MultiSourceHelper {
public static final field INSTANCE Lcom/facebook/react/views/imagehelper/MultiSourceHelper;
public static final fun getBestSourceForSize (IILjava/util/List;)Lcom/facebook/react/views/imagehelper/MultiSourceHelper$MultiSourceResult;
public static final fun getBestSourceForSize (IILjava/util/List;D)Lcom/facebook/react/views/imagehelper/MultiSourceHelper$MultiSourceResult;
}

public class com/facebook/react/views/imagehelper/MultiSourceHelper$MultiSourceResult {
public fun getBestResult ()Lcom/facebook/react/views/imagehelper/ImageSource;
public fun getBestResultInCache ()Lcom/facebook/react/views/imagehelper/ImageSource;
public final class com/facebook/react/views/imagehelper/MultiSourceHelper$MultiSourceResult {
public final field bestResult Lcom/facebook/react/views/imagehelper/ImageSource;
public final field bestResultInCache Lcom/facebook/react/views/imagehelper/ImageSource;
public fun <init> (Lcom/facebook/react/views/imagehelper/ImageSource;Lcom/facebook/react/views/imagehelper/ImageSource;)V
}

public final class com/facebook/react/views/imagehelper/ResourceDrawableIdHelper {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -578,8 +578,8 @@ private void setSourceImage() {
} else if (hasMultipleSources()) {
MultiSourceResult multiSource =
MultiSourceHelper.getBestSourceForSize(getWidth(), getHeight(), mSources);
mImageSource = multiSource.getBestResult();
mCachedImageSource = multiSource.getBestResultInCache();
mImageSource = multiSource.bestResult;
mCachedImageSource = multiSource.bestResultInCache;
return;
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.views.imagehelper

import com.facebook.imagepipeline.core.ImagePipelineFactory

/** Helper class for dealing with multisource images. */
public object MultiSourceHelper {
@JvmStatic
public fun getBestSourceForSize(
width: Int,
height: Int,
sources: List<ImageSource>
): MultiSourceResult = getBestSourceForSize(width, height, sources, 1.0)

/**
* Chooses the image source with the size closest to the target image size.
*
* @param width the width of the view that will be used to display this image
* @param height the height of the view that will be used to display this image
* @param sources the list of potential image sources to choose from
* @param multiplier the area of the view will be multiplied by this number before calculating the
* best source; this is useful if the image will be displayed bigger than the view (e.g. zoomed)
*/
@JvmStatic
public fun getBestSourceForSize(
width: Int,
height: Int,
sources: List<ImageSource>,
multiplier: Double
): MultiSourceResult {
// no sources
if (sources.isEmpty()) {
return MultiSourceResult(null, null)
}

// single source
if (sources.size == 1) {
return MultiSourceResult(sources[0], null)
}

// For multiple sources, we first need the view's size in order to determine the best source to
// load. If we haven't been measured yet, return null and wait for onSizeChanged.
if (width <= 0 || height <= 0) {
return MultiSourceResult(null, null)
}
val imagePipeline = ImagePipelineFactory.getInstance().imagePipeline
var best: ImageSource? = null
var bestCached: ImageSource? = null
val viewArea = width * height * multiplier
var bestPrecision = Double.MAX_VALUE
var bestCachePrecision = Double.MAX_VALUE
for (source in sources) {
val precision = Math.abs(1.0 - source.size / viewArea)
if (precision < bestPrecision) {
bestPrecision = precision
best = source
}
if (precision < bestCachePrecision &&
(imagePipeline.isInBitmapMemoryCache(source.uri) ||
imagePipeline.isInDiskCacheSync(source.uri))) {
bestCachePrecision = precision
bestCached = source
}
}
if (bestCached != null && best != null && bestCached.source == best.source) {
bestCached = null
}
return MultiSourceResult(best, bestCached)
}

public class MultiSourceResult(
/**
* Get the best result overall (closest in size to the view's size). Can be null if there were
* no sources to choose from, or if there were more than 1 sources but width/height were 0.
*/
@JvmField public val bestResult: ImageSource?,
/**
* Get the best result (closest in size to the view's size) that is also in cache. If this
* would be the same as the source from [.getBestResult], this will return `null` instead.
*/
@JvmField public val bestResultInCache: ImageSource?
)
}
Loading