All Versions
20
Latest Version
Avg Release Cycle
28 days
Latest Release
102 days ago

Changelog History
Page 1

  • v1.1.0

    November 24, 2020
    • Important: Change the CENTER and MATRIX ImageView scale types to resolve to OriginalSize. (#587)
      • This change only affects the implicit size resolution algorithm when the request's size isn't specified explicitly.
      • This change was made to ensure that the visual result of an image request is consistent with ImageView.setImageResource/ImageView.setImageURI. To revert to the old behaviour set a ViewSizeResolver when constructing your request.
    • Important: Return the display size from ViewSizeResolver if the view's layout param is WRAP_CONTENT. (#562)
      • Previously, we would only return the display size if the view has been fully laid out. This change makes the typical behaviour more consistent and intuitive.
    • โž• Add the ability to control alpha pre-multiplication. (#569)
    • ๐Ÿ‘Œ Support preferring exact intrinsic size in CrossfadeDrawable. (#585)
    • Check for the full GIF header including version. (#564)
    • โž• Add an empty bitmap pool implementation. (#561)
    • ๐Ÿ‘‰ Make EventListener.Factory a functional interface. (#575)
    • Stabilize EventListener. (#574)
    • โž• Add String overload for ImageRequest.Builder.placeholderMemoryCacheKey.
    • โž• Add @JvmOverloads to the ViewSizeResolver constructor.
    • ๐Ÿ›  Fix: Mutate start/end drawables in CrossfadeDrawable. (#572)
    • ๐Ÿ›  Fix: Fix GIF not playing on second load. (#577)
    • โšก๏ธ Update Kotlin (1.4.20) and migrate to the kotlin-parcelize plugin.
    • โšก๏ธ Update Coroutines (1.4.1).
  • v1.0.0

    October 22, 2020

    ๐Ÿ”„ Changes since 0.13.0:

    • โž• Add Context.imageLoader extension function. (#534)
    • โž• Add ImageLoader.executeBlocking extension function. (#537)
    • Don't shutdown previous singleton image loader if replaced. (#533)

    ๐Ÿ”„ Changes since 1.0.0-rc3:

    • ๐Ÿ›  Fix: Guard against missing/invalid ActivityManager. (#541)
    • ๐Ÿ›  Fix: Allow OkHttp to cache unsuccessful responses. (#551)
    • โšก๏ธ Update Kotlin to 1.4.10.
    • โšก๏ธ Update Okio to 2.9.0.
    • โšก๏ธ Update androidx.exifinterface:exifinterface to 1.3.1.
  • v1.0.0-rc3

    September 21, 2020
    • โช Revert using the -Xjvm-default=all compiler flag due to instability.
      • This is a source compatible, but binary incompatible change from previous release candidate versions.
    • โž• Add Context.imageLoader extension function. (#534)
    • โž• Add ImageLoader.executeBlocking extension function. (#537)
    • Don't shutdown previous singleton image loader if replaced. (#533)
    • โšก๏ธ Update AndroidX dependencies:
      • androidx.exifinterface:exifinterface -> 1.3.0
  • v1.0.0-rc2

    September 03, 2020
    • ๐Ÿš€ This release requires Kotlin 1.4.0 or above.
    • All the changes present in 0.13.0.
    • Depend on the base Kotlin stdlib instead of stdlib-jdk8.
  • v1.0.0-rc1

    August 18, 2020
    • ๐Ÿš€ This release requires Kotlin 1.4.0 or above.
    • โšก๏ธ Update Kotlin to 1.4.0 and enable -Xjvm-default=all.
      • See here for how to enable -Xjvm-default=all in your build file.
      • This generates Java 8 default methods for default Kotlin interface methods.
    • โœ‚ Remove all existing deprecated methods in 0.12.0.
    • โšก๏ธ Update Coroutines to 1.3.9.
  • v0.13.0

    September 03, 2020
    • Important: Launch the Interceptor chain on the main thread by default. (#513)
      • This largely restores the behaviour from 0.11.0 and below where the memory cache would be checked synchronously on the main thread.
      • To revert to using the same behaviour as 0.12.0 where the memory cache is checked on ImageRequest.dispatcher, set ImageLoader.Builder.launchInterceptorChainOnMainThread(false).
      • See launchInterceptorChainOnMainThread for more information.

    • ๐Ÿ›  Fix: Fix potential memory leak if request is started on a ViewTarget in a detached fragment. (#518)
    • ๐Ÿ›  Fix: Use ImageRequest.context to load resource URIs. (#517)
    • ๐Ÿ›  Fix: Fix race condition that could cause subsequent requests to not be saved to the disk cache. (#510)
    • ๐Ÿ›  Fix: Use blockCountLong and blockSizeLong on API 18.

    • ๐Ÿ‘‰ Make ImageLoaderFactory a fun interface.
    • โž• Add ImageLoader.Builder.addLastModifiedToFileCacheKey which allows you to enable/disable adding the last modified timestamp to the memory cache key for an image loaded from a File.

    • โšก๏ธ Update Kotlin to 1.4.0.
    • โšก๏ธ Update Coroutines to 1.3.9.
    • โšก๏ธ Update Okio to 2.8.0.
  • v0.12.0

    August 18, 2020
    • ๐Ÿ’ฅ Breaking: LoadRequest and GetRequest have been replaced with ImageRequest:
      • ImageLoader.execute(LoadRequest) -> ImageLoader.enqueue(ImageRequest)
      • ImageLoader.execute(GetRequest) -> ImageLoader.execute(ImageRequest)
      • ImageRequest implements equals/hashCode.
    • ๐Ÿ’ฅ Breaking: A number of classes were renamed and/or changed package:
      • coil.request.RequestResult -> coil.request.ImageResult
      • coil.request.RequestDisposable -> coil.request.Disposable
      • coil.bitmappool.BitmapPool -> coil.bitmap.BitmapPool
      • coil.DefaultRequestOptions -> coil.request.DefaultRequestOptions
    • ๐Ÿ’ฅ Breaking: SparseIntArraySet has been removed from the public API.
    • ๐Ÿ’ฅ Breaking: TransitionTarget no longer implements ViewTarget.
    • ๐Ÿ’ฅ Breaking: ImageRequest.Listener.onSuccess's signature has changed to return an ImageResult.Metadata instead of just a DataSource.
    • ๐Ÿ’ฅ Breaking: Remove support for LoadRequest.aliasKeys. This API is better handled with direct read/write access to the memory cache.

    • Important: Values in the memory cache are no longer resolved synchronously (if called from the main thread).
      • This change was also necessary to support executing Interceptors on a background dispatcher.
      • This change also moves more work off the main thread, improving performance.
    • Important: Mappers are now executed on a background dispatcher. As a side effect, automatic bitmap sampling is no longer automatically supported. To achieve the same effect, use the MemoryCache.Key of a previous request as the placeholderMemoryCacheKey of the subsequent request. See here for an example.
      • The placeholderMemoryCacheKey API offers more freedom as you can "link" two image requests with different data (e.g. different URLs for small/large images).
    • Important: Coil's ImageView extension functions have been moved from the coil.api package to the coil package.
      • Use find + replace to refactor import coil.api.load -> import coil.load. Unfortunately, it's not possible to use Kotlin's ReplaceWith functionality to replace imports.
    • Important: Use standard crossfade if drawables are not the same image.
    • Important: Prefer immutable bitmaps on API 24+.
    • Important: MeasuredMapper has been deprecated in favour of the new Interceptor interface. See here for an example of how to convert a MeasuredMapper into an Interceptor.
      • Interceptor is a much less restrictive API that allows for a wider range of custom logic.
    • Important: ImageRequest.data is now not null. If you create an ImageRequest without setting its data it will return NullRequestData as its data.

    • ๐Ÿ†• New: Add support for direct read/write access to an ImageLoader's MemoryCache. See the docs for more information.
    • ๐Ÿ†• New: Add support for Interceptors. See the docs for more information. Coil's Interceptor design is heavily inspired by OkHttp's!
    • ๐Ÿ†• New: Add the ability to enable/disable bitmap pooling using ImageLoader.Builder.bitmapPoolingEnabled.
      • Bitmap pooling is most effective on API 23 and below, but may still be benificial on API 24 and up (by eagerly calling Bitmap.recycle).
    • ๐Ÿ†• New: Support thread interruption while decoding.

    • ๐Ÿ›  Fix parsing multiple segments in content-type header.
    • Rework bitmap reference counting to be more robust.
    • ๐Ÿ›  Fix WebP decoding on API < 19 devices.
    • ๐Ÿ”ฆ Expose FetchResult and DecodeResult in the EventListener API.

    • Compile with SDK 30.
    • โšก๏ธ Update Coroutines to 1.3.8.
    • โšก๏ธ Update OkHttp to 3.12.12.
    • โšก๏ธ Update Okio to 2.7.0.
    • โšก๏ธ Update AndroidX dependencies:
      • androidx.appcompat:appcompat-resources -> 1.2.0
      • androidx.core:core-ktx -> 1.3.1
  • v0.11.0

    May 14, 2020
    • ๐Ÿ’ฅ Breaking: This version removes all existing deprecated functions.
      • This enables removing Coil's ContentProvider so it doesn't run any code at app startup.
    • ๐Ÿ’ฅ Breaking: Convert SparseIntArraySet.size to a val. (#380)
    • ๐Ÿ’ฅ Breaking: Move Parameters.count() to an extension function. (#403)
    • ๐Ÿ’ฅ Breaking: Make BitmapPool.maxSize an Int. (#404)

    • Important: Make ImageLoader.shutdown() optional (similar to OkHttpClient). (#385)

    • ๐Ÿ›  Fix: Fix AGP 4.1 compatibility. (#386)
    • ๐Ÿ›  Fix: Fix measuring GONE views. (#397)

    • โฌ‡๏ธ Reduce the default memory cache size to 20%. (#390)
      • To restore the existing behaviour set ImageLoaderBuilder.availableMemoryPercentage(0.25) when creating your ImageLoader.
    • โšก๏ธ Update Coroutines to 1.3.6.
    • โšก๏ธ Update OkHttp to 3.12.11.
  • v0.10.1

    April 26, 2020
    • ๐Ÿ›  Fix OOM when decoding large PNGs on API 23 and below. (#372).
      • This disables decoding EXIF orientation for PNG files. PNG EXIF orientation is very rarely used and reading PNG EXIF data (even if it's empty) requires buffering the entire file into memory, which is bad for performance.
    • ๐Ÿ“œ Minor Java compatibility improvements to SparseIntArraySet.

    • โšก๏ธ Update Okio to 2.6.0.
  • v0.10.0

    April 20, 2020

    Highlights

    • ๐Ÿ— This version deprecates most of the DSL API in favour of using the builders directly. Here's what the change looks like:

      // 0.9.5 (old)
      val imageLoader = ImageLoader(context) {
          bitmapPoolPercentage(0.5)
          crossfade(true)
      }
      
      val disposable = imageLoader.load(context, "https://www.example.com/image.jpg") {
          target(imageView)
      }
      
      val drawable = imageLoader.get("https://www.example.com/image.jpg") {
          size(512, 512)
      }
      
      // 0.10.0 (new)
      val imageLoader = ImageLoader.Builder(context)
          .bitmapPoolPercentage(0.5)
          .crossfade(true)
          .build()
      
      val request = LoadRequest.Builder(context)
          .data("https://www.example.com/image.jpg")
          .target(imageView)
          .build()
      val disposable = imageLoader.execute(request)
      
      val request = GetRequest.Builder(context)
          .data("https://www.example.com/image.jpg")
          .size(512, 512)
          .build()
      val drawable = imageLoader.execute(request).drawable
      
      • If you're using the io.coil-kt:coil artifact, you can call Coil.execute(request) to execute the request with the singleton ImageLoader.
    • ImageLoaders now have a weak reference memory cache that tracks weak references to images once they're evicted from the strong reference memory cache.

      • This means an image will always be returned from an ImageLoader's memory cache if there's still a strong reference to it.
      • Generally, this should make the memory cache much more predictable and increase its hit rate.
      • This behaviour can be enabled/disabled with ImageLoaderBuilder.trackWeakReferences.
    • Add a new artifact, io.coil-kt:coil-video, to decode specific frames from a video file. Read more here.

    • โž• Add a new EventListener API for tracking metrics.

    • โž• Add ImageLoaderFactory which can be implemented by your Application to simplify singleton initialization.


    ๐Ÿš€ Full Release Notes

    • Important: Deprecate DSL syntax in favour of builder syntax. (#267)
    • Important: Deprecate Coil and ImageLoader extension functions. (#322)
    • ๐Ÿ’ฅ Breaking: Return sealed RequestResult type from ImageLoader.execute(GetRequest). (#349)
    • ๐Ÿ’ฅ Breaking: Rename ExperimentalCoil to ExperimentalCoilApi. Migrate from @Experimental to @RequiresOptIn. (#306)
    • ๐Ÿ’ฅ Breaking: Replace CoilLogger with Logger interface. (#316)
    • ๐Ÿ’ฅ Breaking: Rename destWidth/destHeight to dstWidth/dstHeight. (#275)
    • ๐Ÿ’ฅ Breaking: Re-arrange MovieDrawable's constructor params. (#272)
    • ๐Ÿ’ฅ Breaking: Request.Listener's methods now receive the full Request object instead of just its data.
    • ๐Ÿ’ฅ Breaking: GetRequestBuilder now requires a Context in its constructor.
    • ๐Ÿ’ฅ Breaking: Several properties on Request are now nullable.
    • Behaviour change: Include parameter values in the cache key by default. (#319)
    • Behaviour change: Slightly adjust Request.Listener.onStart() timing to be called immediately after Target.onStart(). (#348)

    • ๐Ÿ†• New: Add WeakMemoryCache implementation. (#295)
    • ๐Ÿ†• New: Add coil-video to support decoding video frames. (#122)
    • ๐Ÿ†• New: Introduce EventListener. (#314)
    • ๐Ÿ†• New: Introduce ImageLoaderFactory. (#311)
    • ๐Ÿ†• New: Support animated HEIF image sequences on Android 11. (#297)
    • ๐Ÿ†• New: Improve Java compatibility. (#262)
    • ๐Ÿ†• New: Support setting a default CachePolicy. (#307)
    • ๐Ÿ†• New: Support setting a default Bitmap.Config. (#342)
    • ๐Ÿ†• New: Add ImageLoader.invalidate(key) to clear a single memory cache item (#55)
    • ๐Ÿ†• New: Add debug logs to explain why a cached image is not reused. (#346)
    • ๐Ÿ†• New: Support error and fallback drawables for get requests.

    • ๐Ÿ›  Fix: Fix memory cache miss when Transformation reduces input bitmap's size. (#357)
    • ๐Ÿ›  Fix: Ensure radius is below RenderScript max in BlurTransformation. (#291)
    • ๐Ÿ›  Fix: Fix decoding high colour depth images. (#358)
    • ๐Ÿ›  Fix: Disable ImageDecoderDecoder crash work-around on Android 11 and above. (#298)
    • ๐Ÿ›  Fix: Fix failing to read EXIF data on pre-API 23. (#331)
    • ๐Ÿ›  Fix: Fix incompatibility with Android R SDK. (#337)
    • ๐Ÿ›  Fix: Only enable inexact size if ImageView has a matching SizeResolver. (#344)
    • ๐Ÿ›  Fix: Allow cached images to be at most one pixel off requested size. (#360)
    • ๐Ÿ›  Fix: Skip crossfade transition if view is not visible. (#361)

    • ๐Ÿ—„ Deprecate CoilContentProvider. (#293)
    • Annotate several ImageLoader methods with @MainThread.
    • Avoid creating a LifecycleCoroutineDispatcher if the lifecycle is currently started. (#356)
    • ๐Ÿ“ฆ Use full package name for OriginalSize.toString().
    • Preallocate when decoding software bitmap. (#354)

    • โšก๏ธ Update Kotlin to 1.3.72.
    • โšก๏ธ Update Coroutines to 1.3.5.
    • โšก๏ธ Update OkHttp to 3.12.10.
    • โšก๏ธ Update Okio to 2.5.0.
    • โšก๏ธ Update AndroidX dependencies:
      • androidx.exifinterface:exifinterface -> 1.2.0