From 29e312d94fcfc28b534c3f462e876766b3010058 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Wed, 13 Oct 2021 08:40:27 +0530 Subject: [PATCH 1/3] Replace Picasso with Coil --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index da6487cd..00081f82 100644 --- a/build.gradle +++ b/build.gradle @@ -119,7 +119,7 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2' implementation 'io.reactivex.rxjava3:rxjava:3.1.1' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' - implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.fasterxml.jackson.core:jackson-core:2.13.0' + implementation 'io.coil-kt:coil:1.4.0' implementation 'com.github.topjohnwu.libsu:core:3.1.2' } From d66f8ebee4f0e6929c8f71a72fc96e5f388ef295 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Wed, 13 Oct 2021 09:15:13 +0530 Subject: [PATCH 2/3] Basic conversion from Picasso to Coil (Not working yet) --- .../com/looker/droidify/MainApplication.kt | 9 --------- .../looker/droidify/screen/ProductAdapter.kt | 19 +++---------------- .../droidify/screen/ScreenshotsFragment.kt | 12 ++---------- .../droidify/utility/extension/Resources.kt | 15 ++++++++++----- 4 files changed, 15 insertions(+), 40 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/MainApplication.kt b/src/main/kotlin/com/looker/droidify/MainApplication.kt index 7d75bc4a..0d327b01 100644 --- a/src/main/kotlin/com/looker/droidify/MainApplication.kt +++ b/src/main/kotlin/com/looker/droidify/MainApplication.kt @@ -11,13 +11,10 @@ import com.looker.droidify.content.ProductPreferences import com.looker.droidify.database.Database import com.looker.droidify.index.RepositoryUpdater import com.looker.droidify.network.Downloader -import com.looker.droidify.network.PicassoDownloader import com.looker.droidify.service.Connection import com.looker.droidify.service.SyncService import com.looker.droidify.utility.Utils.toInstalledItem import com.looker.droidify.utility.extension.android.Android -import com.squareup.picasso.OkHttp3Downloader -import com.squareup.picasso.Picasso import java.net.InetSocketAddress import java.net.Proxy @@ -34,12 +31,6 @@ class MainApplication : Application() { listenApplications() listenPreferences() - Picasso.setSingletonInstance( - Picasso.Builder(this) - .downloader(OkHttp3Downloader(PicassoDownloader.Factory(Cache.getImagesDir(this)))) - .build() - ) - if (databaseUpdated) { forceSyncAll() } diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt index 88faae7b..46e4bc31 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt @@ -32,7 +32,6 @@ import com.looker.droidify.content.Preferences import com.looker.droidify.content.ProductPreferences import com.looker.droidify.entity.* import com.looker.droidify.graphics.PaddingDrawable -import com.looker.droidify.network.PicassoDownloader import com.looker.droidify.utility.KParcelable import com.looker.droidify.utility.PackageItemResolver import com.looker.droidify.utility.Utils @@ -1118,12 +1117,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) val updateAll = !updateStatus if (updateAll) { if (item.product.icon.isNotEmpty() || item.product.metadataIcon.isNotEmpty()) { - holder.icon.load( - PicassoDownloader.createIconUri( - holder.icon, item.product.packageName, - item.product.icon, item.product.metadataIcon, item.repository - ) - ) { + holder.icon.load(item.product.icon) { placeholder(holder.progressIcon) error(holder.defaultIcon) } @@ -1321,17 +1315,10 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) val outer = context.resources.sizeScaled(GRID_SPACING_OUTER_DP) val inner = context.resources.sizeScaled(GRID_SPACING_INNER_DP) val cellSize = (screenWidth - 2 * outer - (columns - 1) * inner) / columns - holder.image.load( - PicassoDownloader.createScreenshotUri( - item.repository, - item.packageName, - item.screenshot - ) - ) { + holder.image.load(item.screenshot.path) { placeholder(holder.placeholder) error(holder.placeholder) - resize(cellSize, cellSize) - centerCrop() + size(cellSize) } } ViewType.RELEASE -> { diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt index f944f31a..54802734 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt @@ -22,7 +22,6 @@ import com.looker.droidify.database.Database import com.looker.droidify.entity.Product import com.looker.droidify.entity.Repository import com.looker.droidify.graphics.PaddingDrawable -import com.looker.droidify.network.PicassoDownloader import com.looker.droidify.utility.RxUtils import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.resources.* @@ -255,17 +254,10 @@ class ScreenshotsFragment() : DialogFragment() { val (width, height) = size if (width > 0 && height > 0) { repository?.let { - holder.image.load( - PicassoDownloader.createScreenshotUri( - it, - packageName, - screenshot - ) - ) { + holder.image.load(screenshot.path) { placeholder(holder.placeholder) error(holder.placeholder) - resize(width, height) - centerInside() + size(width, height) } } } else { diff --git a/src/main/kotlin/com/looker/droidify/utility/extension/Resources.kt b/src/main/kotlin/com/looker/droidify/utility/extension/Resources.kt index feaaa775..d71850ea 100644 --- a/src/main/kotlin/com/looker/droidify/utility/extension/Resources.kt +++ b/src/main/kotlin/com/looker/droidify/utility/extension/Resources.kt @@ -17,9 +17,10 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat +import coil.load +import coil.request.ImageRequest +import coil.util.CoilUtils import com.looker.droidify.utility.extension.android.Android -import com.squareup.picasso.Picasso -import com.squareup.picasso.RequestCreator import org.xmlpull.v1.XmlPullParser import kotlin.math.roundToInt @@ -91,10 +92,14 @@ fun ViewGroup.inflate(layoutResId: Int): View { return LayoutInflater.from(context).inflate(layoutResId, this, false) } -fun ImageView.load(uri: Uri, builder: RequestCreator.() -> Unit) { - Picasso.get().load(uri).noFade().apply(builder).into(this) +fun ImageView.load(uri: String, builder: ImageRequest.Builder.() -> Unit = {}) { + this.load(uri = uri, builder = builder) +} + +fun ImageView.load(uri: Uri, builder: ImageRequest.Builder.() -> Unit = {}) { + this.load(uri = uri, builder = builder) } fun ImageView.clear() { - Picasso.get().cancelRequest(this) + CoilUtils.clear(this) } From 34c67c66bb36ac99109bb849f7914fa8c81fcee8 Mon Sep 17 00:00:00 2001 From: LooKeR Date: Wed, 13 Oct 2021 09:33:46 +0530 Subject: [PATCH 3/3] Complete Migration to Coil --- .../com/looker/droidify/MainApplication.kt | 12 +++++++++++- .../{PicassoDownloader.kt => CoilDownloader.kt} | 2 +- .../com/looker/droidify/screen/ProductAdapter.kt | 16 ++++++++++++++-- .../looker/droidify/screen/ProductsAdapter.kt | 4 ++-- .../droidify/screen/ScreenshotsFragment.kt | 9 ++++++++- 5 files changed, 36 insertions(+), 7 deletions(-) rename src/main/kotlin/com/looker/droidify/network/{PicassoDownloader.kt => CoilDownloader.kt} (99%) diff --git a/src/main/kotlin/com/looker/droidify/MainApplication.kt b/src/main/kotlin/com/looker/droidify/MainApplication.kt index 0d327b01..9f882828 100644 --- a/src/main/kotlin/com/looker/droidify/MainApplication.kt +++ b/src/main/kotlin/com/looker/droidify/MainApplication.kt @@ -5,11 +5,14 @@ import android.app.Application import android.app.job.JobInfo import android.app.job.JobScheduler import android.content.* +import coil.ImageLoader +import coil.ImageLoaderFactory import com.looker.droidify.content.Cache import com.looker.droidify.content.Preferences import com.looker.droidify.content.ProductPreferences import com.looker.droidify.database.Database import com.looker.droidify.index.RepositoryUpdater +import com.looker.droidify.network.CoilDownloader import com.looker.droidify.network.Downloader import com.looker.droidify.service.Connection import com.looker.droidify.service.SyncService @@ -19,7 +22,7 @@ import java.net.InetSocketAddress import java.net.Proxy @Suppress("unused") -class MainApplication : Application() { +class MainApplication : Application(), ImageLoaderFactory { override fun onCreate() { super.onCreate() @@ -172,4 +175,11 @@ class MainApplication : Application() { @SuppressLint("UnsafeProtectedBroadcastReceiver") override fun onReceive(context: Context, intent: Intent) = Unit } + + override fun newImageLoader(): ImageLoader { + return ImageLoader.Builder(this) + .callFactory(CoilDownloader.Factory(Cache.getImagesDir(this))) + .crossfade(true) + .build() + } } diff --git a/src/main/kotlin/com/looker/droidify/network/PicassoDownloader.kt b/src/main/kotlin/com/looker/droidify/network/CoilDownloader.kt similarity index 99% rename from src/main/kotlin/com/looker/droidify/network/PicassoDownloader.kt rename to src/main/kotlin/com/looker/droidify/network/CoilDownloader.kt index d2c3ecc6..1b15de12 100644 --- a/src/main/kotlin/com/looker/droidify/network/PicassoDownloader.kt +++ b/src/main/kotlin/com/looker/droidify/network/CoilDownloader.kt @@ -13,7 +13,7 @@ import java.io.File import kotlin.math.min import kotlin.math.roundToInt -object PicassoDownloader { +object CoilDownloader { private const val HOST_ICON = "icon" private const val HOST_SCREENSHOT = "screenshot" private const val QUERY_ADDRESS = "address" diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt index 46e4bc31..72e32dc2 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt @@ -32,6 +32,7 @@ import com.looker.droidify.content.Preferences import com.looker.droidify.content.ProductPreferences import com.looker.droidify.entity.* import com.looker.droidify.graphics.PaddingDrawable +import com.looker.droidify.network.CoilDownloader import com.looker.droidify.utility.KParcelable import com.looker.droidify.utility.PackageItemResolver import com.looker.droidify.utility.Utils @@ -1117,7 +1118,12 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) val updateAll = !updateStatus if (updateAll) { if (item.product.icon.isNotEmpty() || item.product.metadataIcon.isNotEmpty()) { - holder.icon.load(item.product.icon) { + holder.icon.load( + CoilDownloader.createIconUri( + holder.icon, item.product.packageName, + item.product.icon, item.product.metadataIcon, item.repository + ) + ) { placeholder(holder.progressIcon) error(holder.defaultIcon) } @@ -1315,7 +1321,13 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) val outer = context.resources.sizeScaled(GRID_SPACING_OUTER_DP) val inner = context.resources.sizeScaled(GRID_SPACING_INNER_DP) val cellSize = (screenWidth - 2 * outer - (columns - 1) * inner) / columns - holder.image.load(item.screenshot.path) { + holder.image.load( + CoilDownloader.createScreenshotUri( + item.repository, + item.packageName, + item.screenshot + ) + ) { placeholder(holder.placeholder) error(holder.placeholder) size(cellSize) diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt b/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt index 63b67e53..44edbba7 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt @@ -15,7 +15,7 @@ import com.looker.droidify.R import com.looker.droidify.database.Database import com.looker.droidify.entity.ProductItem import com.looker.droidify.entity.Repository -import com.looker.droidify.network.PicassoDownloader +import com.looker.droidify.network.CoilDownloader import com.looker.droidify.utility.Utils import com.looker.droidify.utility.extension.resources.* import com.looker.droidify.utility.extension.text.nullIfEmpty @@ -138,7 +138,7 @@ class ProductsAdapter(private val onClick: (ProductItem) -> Unit) : val repository: Repository? = repositories[productItem.repositoryId] if ((productItem.icon.isNotEmpty() || productItem.metadataIcon.isNotEmpty()) && repository != null) { holder.icon.load( - PicassoDownloader.createIconUri( + CoilDownloader.createIconUri( holder.icon, productItem.packageName, productItem.icon, productItem.metadataIcon, repository ) diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt index 54802734..b50a4861 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt @@ -22,6 +22,7 @@ import com.looker.droidify.database.Database import com.looker.droidify.entity.Product import com.looker.droidify.entity.Repository import com.looker.droidify.graphics.PaddingDrawable +import com.looker.droidify.network.CoilDownloader import com.looker.droidify.utility.RxUtils import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.resources.* @@ -254,7 +255,13 @@ class ScreenshotsFragment() : DialogFragment() { val (width, height) = size if (width > 0 && height > 0) { repository?.let { - holder.image.load(screenshot.path) { + holder.image.load( + CoilDownloader.createScreenshotUri( + it, + packageName, + screenshot + ) + ) { placeholder(holder.placeholder) error(holder.placeholder) size(width, height)