Skip to content
Merged
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
3 changes: 3 additions & 0 deletions buildSrc/src/main/kotlin/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ fun DependencyHandler.addAndroidTestDependencies(kotlinVersion: String, includeT
androidTestImplementation(Library.JUNIT)
androidTestImplementation(kotlin("test-junit", kotlinVersion))

androidTestImplementation(Library.ANDROIDX_APPCOMPAT)
androidTestImplementation(Library.MATERIAL)

androidTestImplementation(Library.ANDROIDX_TEST_CORE)
androidTestImplementation(Library.ANDROIDX_TEST_JUNIT)
androidTestImplementation(Library.ANDROIDX_TEST_RULES)
Expand Down
1 change: 1 addition & 0 deletions buildSrc/src/main/kotlin/Library.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ object Library {

private const val LIFECYCLE_VERSION = "2.2.0"
const val ANDROIDX_LIFECYCLE_COMMON = "androidx.lifecycle:lifecycle-common-java8:$LIFECYCLE_VERSION"
const val ANDROIDX_LIFECYCLE_RUNTIME = "androidx.lifecycle:lifecycle-runtime:$LIFECYCLE_VERSION"
const val ANDROIDX_LIFECYCLE_VIEW_MODEL = "androidx.lifecycle:lifecycle-viewmodel-ktx:$LIFECYCLE_VERSION"

const val MATERIAL = "com.google.android.material:material:1.2.0"
Expand Down
7 changes: 4 additions & 3 deletions coil-base/api/coil-base.api
Original file line number Diff line number Diff line change
Expand Up @@ -207,14 +207,15 @@ public final class coil/decode/InterruptibleSourceKt {
}

public final class coil/decode/Options {
public fun <init> (Landroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;Lcoil/size/Scale;ZZLokhttp3/Headers;Lcoil/request/Parameters;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;)V
public final fun copy (Landroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;Lcoil/size/Scale;ZZLokhttp3/Headers;Lcoil/request/Parameters;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;)Lcoil/decode/Options;
public static synthetic fun copy$default (Lcoil/decode/Options;Landroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;Lcoil/size/Scale;ZZLokhttp3/Headers;Lcoil/request/Parameters;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;ILjava/lang/Object;)Lcoil/decode/Options;
public fun <init> (Landroid/content/Context;Landroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;Lcoil/size/Scale;ZZLokhttp3/Headers;Lcoil/request/Parameters;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;)V
public final fun copy (Landroid/content/Context;Landroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;Lcoil/size/Scale;ZZLokhttp3/Headers;Lcoil/request/Parameters;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;)Lcoil/decode/Options;
public static synthetic fun copy$default (Lcoil/decode/Options;Landroid/content/Context;Landroid/graphics/Bitmap$Config;Landroid/graphics/ColorSpace;Lcoil/size/Scale;ZZLokhttp3/Headers;Lcoil/request/Parameters;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;ILjava/lang/Object;)Lcoil/decode/Options;
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically this is binary incompatible for anyone creating their own Options instances (unlikely).

public fun equals (Ljava/lang/Object;)Z
public final fun getAllowInexactSize ()Z
public final fun getAllowRgb565 ()Z
public final fun getColorSpace ()Landroid/graphics/ColorSpace;
public final fun getConfig ()Landroid/graphics/Bitmap$Config;
public final fun getContext ()Landroid/content/Context;
public final fun getDiskCachePolicy ()Lcoil/request/CachePolicy;
public final fun getHeaders ()Lokhttp3/Headers;
public final fun getMemoryCachePolicy ()Lcoil/request/CachePolicy;
Expand Down
1 change: 1 addition & 0 deletions coil-base/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ dependencies {
implementation(Library.ANDROIDX_EXIF_INTERFACE)

api(Library.ANDROIDX_LIFECYCLE_COMMON)
implementation(Library.ANDROIDX_LIFECYCLE_RUNTIME)

api(Library.OKHTTP)
api(Library.OKIO)
Expand Down
4 changes: 4 additions & 0 deletions coil-base/src/androidTest/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

<application android:usesCleartextTraffic="true">
<activity
android:name="coil.fetch.ResourceUriFetcherTest$TestActivity"
android:theme="@style/Theme.TestActivity"/>

<provider
android:name="coil.util.AssetContentProvider"
android:authorities="coil"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,11 @@ class BitmapFactoryDecoderTest {
val result = decodeBitmap(
assetName = "normal.jpg",
size = PixelSize(1500, 1500),
options = createOptions(scale = Scale.FIT, allowInexactSize = true)
options = createOptions(
context = context,
scale = Scale.FIT,
allowInexactSize = true
)
)
assertEquals(PixelSize(1080, 1350), result.size)
}
Expand All @@ -116,7 +120,11 @@ class BitmapFactoryDecoderTest {
val result = decodeBitmap(
assetName = "normal.jpg",
size = PixelSize(1500, 1500),
options = createOptions(scale = Scale.FIT, allowInexactSize = false)
options = createOptions(
context = context,
scale = Scale.FIT,
allowInexactSize = false
)
)
assertEquals(PixelSize(1200, 1500), result.size)
}
Expand All @@ -126,7 +134,10 @@ class BitmapFactoryDecoderTest {
val result = decodeBitmap(
assetName = "normal.jpg",
size = PixelSize(500, 500),
options = createOptions(allowRgb565 = true)
options = createOptions(
context = context,
allowRgb565 = true
)
)
assertEquals(PixelSize(500, 625), result.size)
assertEquals(Bitmap.Config.RGB_565, result.config)
Expand All @@ -137,7 +148,10 @@ class BitmapFactoryDecoderTest {
val result = decodeBitmap(
assetName = "normal.jpg",
size = PixelSize(500, 500),
options = createOptions(allowRgb565 = false)
options = createOptions(
context = context,
allowRgb565 = false
)
)
assertEquals(PixelSize(500, 625), result.size)
assertEquals(Bitmap.Config.ARGB_8888, result.config)
Expand All @@ -152,6 +166,7 @@ class BitmapFactoryDecoderTest {
assetName = "normal.jpg",
size = PixelSize(1080, 1350),
options = createOptions(
context = context,
config = Bitmap.Config.ARGB_8888,
scale = Scale.FIT,
allowInexactSize = false
Expand All @@ -178,6 +193,7 @@ class BitmapFactoryDecoderTest {
assetName = "normal.jpg",
size = PixelSize(500, 500),
options = createOptions(
context = context,
config = Bitmap.Config.ARGB_8888,
scale = Scale.FILL,
allowInexactSize = false
Expand Down Expand Up @@ -260,7 +276,7 @@ class BitmapFactoryDecoderTest {
private fun decode(
assetName: String,
size: Size,
options: Options = createOptions()
options: Options = createOptions(context)
): DecodeResult = runBlocking {
val source = context.assets.open(assetName).source().buffer()
val result = service.decode(
Expand All @@ -280,6 +296,6 @@ class BitmapFactoryDecoderTest {
private fun decodeBitmap(
assetName: String,
size: Size,
options: Options = createOptions()
options: Options = createOptions(context)
): Bitmap = (decode(assetName, size, options).drawable as BitmapDrawable).bitmap
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class AssetUriFetcherTest {

private fun assertUriFetchesCorrectly(uri: Uri) {
val result = runBlocking {
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions())
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions(context))
}

assertTrue(result is SourceResult)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class ContentUriFetcherTest {
assertTrue(fetcher.handles(uri))

val result = runBlocking {
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions())
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions(context))
}

assertTrue(result is SourceResult)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class FileFetcherTest {

val size = PixelSize(100, 100)
val result = runBlocking {
fetcher.fetch(pool, file, size, createOptions())
fetcher.fetch(pool, file, size, createOptions(context))
}

assertTrue(result is SourceResult)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,22 @@ import android.content.ContentResolver.SCHEME_ANDROID_RESOURCE
import android.content.Context
import android.graphics.drawable.BitmapDrawable
import android.os.Build.VERSION.SDK_INT
import androidx.appcompat.app.AppCompatActivity
import androidx.core.graphics.drawable.toBitmap
import androidx.core.net.toUri
import androidx.lifecycle.Lifecycle
import androidx.test.core.app.ApplicationProvider
import androidx.test.core.app.launchActivity
import coil.base.test.R
import coil.bitmap.BitmapPool
import coil.decode.DrawableDecoderService
import coil.map.ResourceIntMapper
import coil.map.ResourceUriMapper
import coil.size.OriginalSize
import coil.size.PixelSize
import coil.util.createOptions
import coil.util.getDrawableCompat
import coil.util.isSimilarTo
import kotlinx.coroutines.runBlocking
import org.junit.Assume.assumeTrue
import org.junit.Before
Expand Down Expand Up @@ -42,7 +50,7 @@ class ResourceUriFetcherTest {
assertTrue(fetcher.handles(uri))

val result = runBlocking {
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions())
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions(context))
}

assertTrue(result is SourceResult)
Expand All @@ -57,7 +65,7 @@ class ResourceUriFetcherTest {
assertTrue(fetcher.handles(uri))

val result = runBlocking {
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions())
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions(context))
}

assertTrue(result is DrawableResult)
Expand All @@ -75,7 +83,7 @@ class ResourceUriFetcherTest {
assertTrue(fetcher.handles(uri))

val result = runBlocking {
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions())
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions(context))
}

assertTrue(result is SourceResult)
Expand All @@ -95,11 +103,31 @@ class ResourceUriFetcherTest {
assertTrue(fetcher.handles(uri))

val result = runBlocking {
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions())
fetcher.fetch(pool, uri, PixelSize(100, 100), createOptions(context))
}

assertTrue(result is DrawableResult)
assertTrue(result.drawable is BitmapDrawable)
assertTrue(result.isSampled)
}

/** Regression test: https://github.com/coil-kt/coil/issues/469 */
@Test
fun colorAttributeIsApplied() {
val scenario = launchActivity<TestActivity>()
scenario.moveToState(Lifecycle.State.RESUMED)
scenario.onActivity { activity ->
runBlocking {
val result = runBlocking {
val uri = ResourceIntMapper(context).map(R.drawable.ic_tinted_vector)
fetcher.fetch(pool, uri, OriginalSize, createOptions(activity))
}
val expected = activity.getDrawableCompat(R.drawable.ic_tinted_vector).toBitmap()
val actual = (result as DrawableResult).drawable.toBitmap()
assertTrue(actual.isSimilarTo(expected))
}
}
}

class TestActivity : AppCompatActivity()
}
12 changes: 12 additions & 0 deletions coil-base/src/androidTest/res/drawable/ic_tinted_vector.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?colorPrimary"
android:tintMode="src_in">
<path
android:fillColor="#00FF00"
android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z"/>
</vector>
6 changes: 6 additions & 0 deletions coil-base/src/androidTest/res/values/styles.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.TestActivity" parent="@style/Theme.MaterialComponents.Light">
<item name="colorPrimary">#FF0000</item>
</style>
</resources>
4 changes: 2 additions & 2 deletions coil-base/src/main/java/coil/RealImageLoader.kt
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ internal class RealImageLoader(
.add(AssetUriFetcher(context))
.add(ContentUriFetcher(context))
.add(ResourceUriFetcher(context, drawableDecoder))
.add(DrawableFetcher(context, drawableDecoder))
.add(BitmapFetcher(context))
.add(DrawableFetcher(drawableDecoder))
.add(BitmapFetcher())
// Decoders
.add(BitmapFactoryDecoder(context))
.build()
Expand Down
19 changes: 13 additions & 6 deletions coil-base/src/main/java/coil/decode/Options.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package coil.decode

import android.content.Context
import android.graphics.Bitmap
import android.graphics.ColorSpace
import coil.fetch.Fetcher
Expand All @@ -13,6 +14,7 @@ import okhttp3.Headers
*
* [Fetcher]s and [Decoder]s should respect these options as best as possible.
*
* @param context The [Context] used to execute this request.
* @param config The requested config for any [Bitmap]s.
* @param colorSpace The preferred color space for any [Bitmap]s.
* If null, components should typically default to [ColorSpace.Rgb].
Expand All @@ -28,6 +30,7 @@ import okhttp3.Headers
* @param networkCachePolicy Determines if this request is allowed to read from the network.
*/
class Options(
val context: Context,
val config: Bitmap.Config,
val colorSpace: ColorSpace?,
val scale: Scale,
Expand All @@ -41,6 +44,7 @@ class Options(
) {

fun copy(
context: Context = this.context,
config: Bitmap.Config = this.config,
colorSpace: ColorSpace? = this.colorSpace,
scale: Scale = this.scale,
Expand All @@ -51,12 +55,13 @@ class Options(
memoryCachePolicy: CachePolicy = this.memoryCachePolicy,
diskCachePolicy: CachePolicy = this.diskCachePolicy,
networkCachePolicy: CachePolicy = this.networkCachePolicy
) = Options(config, colorSpace, scale, allowInexactSize, allowRgb565, headers, parameters, memoryCachePolicy,
diskCachePolicy, networkCachePolicy)
) = Options(context, config, colorSpace, scale, allowInexactSize, allowRgb565, headers, parameters,
memoryCachePolicy, diskCachePolicy, networkCachePolicy)

override fun equals(other: Any?): Boolean {
if (this === other) return true
return other is Options &&
context == other.context &&
config == other.config &&
colorSpace == other.colorSpace &&
scale == other.scale &&
Expand All @@ -70,7 +75,8 @@ class Options(
}

override fun hashCode(): Int {
var result = config.hashCode()
var result = context.hashCode()
result = 31 * result + config.hashCode()
result = 31 * result + (colorSpace?.hashCode() ?: 0)
result = 31 * result + scale.hashCode()
result = 31 * result + allowInexactSize.hashCode()
Expand All @@ -84,8 +90,9 @@ class Options(
}

override fun toString(): String {
return "Options(config=$config, colorSpace=$colorSpace, scale=$scale, allowInexactSize=$allowInexactSize, " +
"allowRgb565=$allowRgb565, headers=$headers, parameters=$parameters, memoryCachePolicy=$memoryCachePolicy, " +
"diskCachePolicy=$diskCachePolicy, networkCachePolicy=$networkCachePolicy)"
return "Options(context=$context, config=$config, colorSpace=$colorSpace, scale=$scale, " +
"allowInexactSize=$allowInexactSize, allowRgb565=$allowRgb565, headers=$headers, " +
"parameters=$parameters, memoryCachePolicy=$memoryCachePolicy, diskCachePolicy=$diskCachePolicy, " +
"networkCachePolicy=$networkCachePolicy)"
}
}
5 changes: 2 additions & 3 deletions coil-base/src/main/java/coil/fetch/BitmapFetcher.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package coil.fetch

import android.content.Context
import android.graphics.Bitmap
import coil.bitmap.BitmapPool
import coil.decode.DataSource
import coil.decode.Options
import coil.size.Size
import coil.util.toDrawable

internal class BitmapFetcher(private val context: Context) : Fetcher<Bitmap> {
internal class BitmapFetcher : Fetcher<Bitmap> {

override fun key(data: Bitmap): String? = null

Expand All @@ -19,7 +18,7 @@ internal class BitmapFetcher(private val context: Context) : Fetcher<Bitmap> {
options: Options
): FetchResult {
return DrawableResult(
drawable = data.toDrawable(context),
drawable = data.toDrawable(options.context),
isSampled = false,
dataSource = DataSource.MEMORY
)
Expand Down
Loading