Skip to content

Commit d905bc5

Browse files
committed
Replace picasso with coil
1 parent ee97191 commit d905bc5

File tree

7 files changed

+51
-37
lines changed

7 files changed

+51
-37
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ dependencies {
102102

103103
// UI
104104
implementation(libs.material)
105-
implementation(libs.picasso)
105+
implementation(libs.coil)
106+
implementation(libs.coil.network)
106107

107108
// Parsing
108109
implementation(libs.jsoup)

app/src/main/kotlin/di/Di.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ object Di {
6868
get(Db::class.java)
6969
)
7070
OpenGraphImagesRepo::class.java -> OpenGraphImagesRepo(
71+
context,
7172
get(ConfRepo::class.java),
7273
get(Db::class.java)
7374
)

app/src/main/kotlin/entries/EntriesAdapterViewHolder.kt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import androidx.core.view.isVisible
55
import androidx.recyclerview.widget.RecyclerView
66
import co.appreactor.news.R
77
import co.appreactor.news.databinding.ListItemEntryBinding
8-
import com.squareup.picasso.Callback
9-
import com.squareup.picasso.Picasso
8+
import coil3.load
109

1110
class EntriesAdapterViewHolder(
1211
private val binding: ListItemEntryBinding,
@@ -20,7 +19,7 @@ class EntriesAdapterViewHolder(
2019
val cardHeightMin = root.resources.getDimensionPixelSize(R.dimen.card_height_min)
2120
val cardHeightMax = root.resources.getDimensionPixelSize(R.dimen.card_height_max)
2221

23-
Picasso.get().load(null as String?).into(imageView)
22+
imageView.load(null)
2423
imageView.isVisible = false
2524
imageProgress.isVisible = false
2625

@@ -51,21 +50,18 @@ class EntriesAdapterViewHolder(
5150
}
5251
}
5352

54-
Picasso.get()
55-
.load(item.imageUrl)
56-
.resize(item.imageWidth, 0)
57-
.onlyScaleDown()
58-
.into(imageView, object : Callback {
59-
override fun onSuccess() {
53+
imageView.load(item.imageUrl) {
54+
size(item.imageWidth, 0)
55+
listener(
56+
onSuccess = { _, _ ->
6057
imageProgress.isVisible = false
61-
imageProgress.isVisible = false
62-
}
63-
64-
override fun onError(e: Exception) {
58+
},
59+
onError = { _, _ ->
6560
imageView.isVisible = false
6661
imageProgress.isVisible = false
6762
}
68-
})
63+
)
64+
}
6965
}
7066

7167
primaryText.text = Html.fromHtml(item.title, Html.FROM_HTML_MODE_COMPACT).toString()

app/src/main/kotlin/entry/TextViewImage.kt

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import android.os.Looper
1111
import android.text.SpannableStringBuilder
1212
import android.text.style.ImageSpan
1313
import android.widget.TextView
14-
import com.squareup.picasso.Picasso
15-
import com.squareup.picasso.Target
14+
import coil3.Image
15+
import coil3.target.Target
1616

1717
class TextViewImage(
1818
private val textView: TextView,
@@ -34,7 +34,16 @@ class TextViewImage(
3434
)
3535
override fun getOpacity() = PixelFormat.OPAQUE
3636

37-
override fun onBitmapLoaded(unprocessedBitmap: Bitmap, from: Picasso.LoadedFrom) {
37+
override fun onStart(result: Image?) {
38+
39+
}
40+
41+
override fun onError(result: Image?) {
42+
43+
}
44+
45+
override fun onSuccess(result: Image) {
46+
val unprocessedBitmap = (result as BitmapDrawable).bitmap
3847
val scaleToFullWidth = unprocessedBitmap.width >= textView.width / 5
3948

4049
val bitmap = if (scaleToFullWidth) {
@@ -92,12 +101,4 @@ class TextViewImage(
92101
textView.text = text
93102
}
94103
}
95-
96-
override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {
97-
98-
}
99-
100-
override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
101-
102-
}
103104
}

app/src/main/kotlin/entry/TextViewImageGetter.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import android.graphics.drawable.Drawable
44
import android.text.Html
55
import android.widget.TextView
66
import androidx.lifecycle.LifecycleCoroutineScope
7-
import com.squareup.picasso.Picasso
7+
import coil3.ImageLoader
8+
import coil3.request.ImageRequest
89
import kotlinx.coroutines.Dispatchers
910
import kotlinx.coroutines.withContext
1011
import okhttp3.HttpUrl
@@ -41,11 +42,12 @@ class TextViewImageGetter(
4142
scope.launchWhenResumed {
4243
runCatching {
4344
withContext(Dispatchers.Main) {
44-
Picasso.get()
45-
.load(url.toString())
46-
.resize(width, 0)
47-
.onlyScaleDown()
48-
.into(drawable)
45+
val request = ImageRequest.Builder(textView.context)
46+
.data(url.toString())
47+
.size(width, 0)
48+
.target(drawable)
49+
.build()
50+
ImageLoader(textView.context).enqueue(request)
4951
}
5052
}
5153
}

app/src/main/kotlin/opengraph/OpenGraphImagesRepo.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package opengraph
22

3+
import android.content.Context
34
import android.graphics.Bitmap
45
import android.graphics.Color
6+
import android.graphics.drawable.BitmapDrawable
57
import android.util.Log
8+
import coil3.ImageLoader
9+
import coil3.request.ImageRequest
610
import co.appreactor.feedk.AtomLinkRel
7-
import com.squareup.picasso.Picasso
811
import conf.ConfRepo
912
import db.Db
1013
import http.await
@@ -23,10 +26,13 @@ import java.util.concurrent.TimeUnit
2326
import kotlin.random.Random
2427

2528
class OpenGraphImagesRepo(
29+
private val context: Context,
2630
private val confRepo: ConfRepo,
2731
private val db: Db,
2832
) {
2933

34+
private val imageLoader = ImageLoader(context)
35+
3036
private val httpClient = OkHttpClient.Builder()
3137
.callTimeout(10, TimeUnit.SECONDS)
3238
.build()
@@ -97,7 +103,12 @@ class OpenGraphImagesRepo(
97103
}
98104

99105
val bitmap = runCatching {
100-
Picasso.get().load(imageUrl).resize(MAX_WIDTH_PX, 0).onlyScaleDown().get()
106+
val request = ImageRequest.Builder(context)
107+
.data(imageUrl)
108+
.size(MAX_WIDTH_PX, 0)
109+
.build()
110+
(imageLoader.execute(request).image as? BitmapDrawable)?.bitmap
111+
?: throw IllegalStateException("Failed to load bitmap")
101112
}.getOrElse {
102113
db.entryQueries.updateOgImageChecked(true, entry.id)
103114
return@withContext

gradle/libs.versions.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ retrofit = "3.0.0"
3636
# Networking
3737
# https://github.com/square/okhttp/blob/master/CHANGELOG.md
3838
okhttp = "5.3.2"
39-
40-
picasso = "2.8"
39+
# Image manipulation
40+
# https://github.com/coil-kt/coil/blob/main/CHANGELOG.md
41+
coil = "3.4.0"
4142

4243
# Parsing
4344
jsoup = "1.17.2"
@@ -85,7 +86,8 @@ okhttp-mockwebserver = { group = "com.squareup.okhttp3", name = "mockwebserver",
8586

8687
# UI
8788
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
88-
picasso = { group = "com.squareup.picasso", name = "picasso", version.ref = "picasso" }
89+
coil = { group = "io.coil-kt.coil3", name = "coil", version.ref = "coil" }
90+
coil-network = { group = "io.coil-kt.coil3", name = "coil-network-okhttp", version.ref = "coil" }
8991

9092
# Parsing
9193
jsoup = { group = "org.jsoup", name = "jsoup", version.ref = "jsoup" }

0 commit comments

Comments
 (0)