Skip to content

Commit

Permalink
Fix passing global ImageLoader extras to Options. (#2223)
Browse files Browse the repository at this point in the history
* Add regression test for RequestService setting bitmap config.

* Update test.

* Fix bug.
  • Loading branch information
colinrtwhite committed May 9, 2024
1 parent fb469cb commit 5db3838
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 4 deletions.
2 changes: 2 additions & 0 deletions coil-core/api/android/coil-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ public final class coil3/Extras {
public final class coil3/Extras$Builder {
public fun <init> ()V
public fun <init> (Lcoil3/Extras;)V
public fun <init> (Ljava/util/Map;)V
public final fun build ()Lcoil3/Extras;
public final fun set (Lcoil3/Extras$Key;Ljava/lang/Object;)Lcoil3/Extras$Builder;
public final fun setAll (Lcoil3/Extras;)Lcoil3/Extras$Builder;
Expand All @@ -131,6 +132,7 @@ public final class coil3/ExtrasKt {
public static final fun getExtra (Lcoil3/request/Options;Lcoil3/Extras$Key;)Ljava/lang/Object;
public static final fun getOrDefault (Lcoil3/Extras;Lcoil3/Extras$Key;)Ljava/lang/Object;
public static final fun orEmpty (Lcoil3/Extras;)Lcoil3/Extras;
public static final fun plus (Lcoil3/Extras;Lcoil3/Extras;)Lcoil3/Extras;
}

public abstract interface class coil3/Image {
Expand Down
2 changes: 2 additions & 0 deletions coil-core/api/jvm/coil-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ public final class coil3/Extras {
public final class coil3/Extras$Builder {
public fun <init> ()V
public fun <init> (Lcoil3/Extras;)V
public fun <init> (Ljava/util/Map;)V
public final fun build ()Lcoil3/Extras;
public final fun set (Lcoil3/Extras$Key;Ljava/lang/Object;)Lcoil3/Extras$Builder;
public final fun setAll (Lcoil3/Extras;)Lcoil3/Extras$Builder;
Expand All @@ -117,6 +118,7 @@ public final class coil3/ExtrasKt {
public static final fun getExtra (Lcoil3/request/Options;Lcoil3/Extras$Key;)Ljava/lang/Object;
public static final fun getOrDefault (Lcoil3/Extras;Lcoil3/Extras$Key;)Ljava/lang/Object;
public static final fun orEmpty (Lcoil3/Extras;)Lcoil3/Extras;
public static final fun plus (Lcoil3/Extras;Lcoil3/Extras;)Lcoil3/Extras;
}

public abstract interface class coil3/Image {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,14 +99,14 @@ internal class AndroidRequestService(
transformations.isEmpty() &&
bitmapConfig != Bitmap.Config.ALPHA_8

var builder: Extras.Builder? = null
var builder = Extras.Builder(defaults.extras.asMap() + extras.asMap())
if (bitmapConfig != this.bitmapConfig) {
builder = extras.newBuilder().set(Extras.Key.bitmapConfig, bitmapConfig)
builder = builder.set(Extras.Key.bitmapConfig, bitmapConfig)
}
if (allowRgb565 != this.allowRgb565) {
builder = (builder ?: extras.newBuilder()).set(Extras.Key.allowRgb565, allowRgb565)
builder = builder.set(Extras.Key.allowRgb565, allowRgb565)
}
return builder?.build() ?: extras
return builder.build()
}

override fun updateOptionsOnWorkerThread(options: Options): Options {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,18 @@ class RequestServiceTest : RobolectricTest() {
val options = service.options(request, Size(100, 100))
assertEquals(Bitmap.Config.RGB_565, options.bitmapConfig)
}

/** Regression test: https://github.com/coil-kt/coil/issues/2221 */
@Test
fun `ImageLoader bitmapConfig is preserved`() {
val imageLoader = ImageLoader.Builder(context)
.bitmapConfig(Bitmap.Config.RGB_565)
.build()
val request = ImageRequest.Builder(context)
.data(Unit)
.defaults(imageLoader.defaults)
.build()
val options = service.options(request, Size(100, 100))
assertEquals(Bitmap.Config.RGB_565, options.bitmapConfig)
}
}
8 changes: 8 additions & 0 deletions coil-core/src/commonMain/kotlin/coil3/Extras.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ class Extras private constructor(
data = mutableMapOf()
}

constructor(map: Map<Key<*>, Any>) {
data = map.toMutableMap()
}

constructor(extras: Extras) {
data = extras.data.toMutableMap()
}
Expand Down Expand Up @@ -70,6 +74,10 @@ class Extras private constructor(
}
}

operator fun Extras.plus(other: Extras): Extras {
return Extras.Builder(asMap() + other.asMap()).build()
}

fun <T> Extras.getOrDefault(key: Extras.Key<T>): T {
return this[key] ?: key.default
}
Expand Down

0 comments on commit 5db3838

Please sign in to comment.