From 7c575678214837f8f91266a28c933c30a55fc043 Mon Sep 17 00:00:00 2001 From: Ryan Harter Date: Thu, 15 Aug 2019 10:42:15 -0500 Subject: [PATCH] Adds support for file path strings using `file://` and `/` based paths. --- .../java/coil/RealImageLoaderIntegrationTest.kt | 14 ++++++++++++++ coil-base/src/main/java/coil/RealImageLoader.kt | 6 ++++-- .../src/main/java/coil/map/HttpStringMapper.kt | 10 ++++++++++ coil-base/src/main/java/coil/map/StringMapper.kt | 8 -------- .../src/main/java/coil/map/UriStringMapper.kt | 15 +++++++++++++++ 5 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 coil-base/src/main/java/coil/map/HttpStringMapper.kt delete mode 100644 coil-base/src/main/java/coil/map/StringMapper.kt create mode 100644 coil-base/src/main/java/coil/map/UriStringMapper.kt diff --git a/coil-base/src/androidTest/java/coil/RealImageLoaderIntegrationTest.kt b/coil-base/src/androidTest/java/coil/RealImageLoaderIntegrationTest.kt index 9c2006ff15..b4ab329684 100644 --- a/coil-base/src/androidTest/java/coil/RealImageLoaderIntegrationTest.kt +++ b/coil-base/src/androidTest/java/coil/RealImageLoaderIntegrationTest.kt @@ -119,6 +119,20 @@ class RealImageLoaderIntegrationTest { testGet(data) } + @Test + fun fileUrl() { + val data = "file://${copyNormalImageAssetToCacheDir().absolutePath}" + testLoad(data) + testGet(data) + } + + @Test + fun filePath() { + val data = copyNormalImageAssetToCacheDir().absolutePath + testLoad(data) + testGet(data) + } + @Test fun drawable() { val data = context.getDrawableCompat(R.drawable.normal) diff --git a/coil-base/src/main/java/coil/RealImageLoader.kt b/coil-base/src/main/java/coil/RealImageLoader.kt index a0cc7e0d67..6362b4ff2d 100644 --- a/coil-base/src/main/java/coil/RealImageLoader.kt +++ b/coil-base/src/main/java/coil/RealImageLoader.kt @@ -26,8 +26,9 @@ import coil.fetch.ResourceFetcher import coil.fetch.SourceResult import coil.fetch.UriFetcher import coil.map.FileMapper +import coil.map.UriStringMapper import coil.map.HttpUriMapper -import coil.map.StringMapper +import coil.map.HttpStringMapper import coil.memory.BitmapReferenceCounter import coil.memory.DelegateService import coil.memory.MemoryCache @@ -94,9 +95,10 @@ internal class RealImageLoader( private val networkObserver = NetworkObserver(context) private val registry = ComponentRegistry(registry) { - add(StringMapper()) + add(HttpStringMapper()) add(HttpUriMapper()) add(FileMapper()) + add(UriStringMapper()) add(HttpUrlFetcher(okHttpClient)) add(UriFetcher(context)) diff --git a/coil-base/src/main/java/coil/map/HttpStringMapper.kt b/coil-base/src/main/java/coil/map/HttpStringMapper.kt new file mode 100644 index 0000000000..97cb0979e5 --- /dev/null +++ b/coil-base/src/main/java/coil/map/HttpStringMapper.kt @@ -0,0 +1,10 @@ +package coil.map + +import okhttp3.HttpUrl + +internal class HttpStringMapper : Mapper { + + override fun handles(data: String): Boolean = HttpUrl.parse(data) != null + + override fun map(data: String): HttpUrl = HttpUrl.get(data) +} diff --git a/coil-base/src/main/java/coil/map/StringMapper.kt b/coil-base/src/main/java/coil/map/StringMapper.kt deleted file mode 100644 index 831e46f26f..0000000000 --- a/coil-base/src/main/java/coil/map/StringMapper.kt +++ /dev/null @@ -1,8 +0,0 @@ -package coil.map - -import okhttp3.HttpUrl - -internal class StringMapper : Mapper { - - override fun map(data: String): HttpUrl = HttpUrl.get(data) -} diff --git a/coil-base/src/main/java/coil/map/UriStringMapper.kt b/coil-base/src/main/java/coil/map/UriStringMapper.kt new file mode 100644 index 0000000000..5bfd643cc3 --- /dev/null +++ b/coil-base/src/main/java/coil/map/UriStringMapper.kt @@ -0,0 +1,15 @@ +package coil.map + +import android.content.ContentResolver +import android.net.Uri + +internal class UriStringMapper : Mapper { + + override fun map(data: String): Uri = Uri.parse(data).let { + return if (it.scheme != null) { + it + } else { + it.buildUpon().scheme(ContentResolver.SCHEME_FILE).build() + } + } +}