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' } diff --git a/src/main/kotlin/com/looker/droidify/MainApplication.kt b/src/main/kotlin/com/looker/droidify/MainApplication.kt index 7d75bc4a..9f882828 100644 --- a/src/main/kotlin/com/looker/droidify/MainApplication.kt +++ b/src/main/kotlin/com/looker/droidify/MainApplication.kt @@ -5,24 +5,24 @@ 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.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 @Suppress("unused") -class MainApplication : Application() { +class MainApplication : Application(), ImageLoaderFactory { override fun onCreate() { super.onCreate() @@ -34,12 +34,6 @@ class MainApplication : Application() { listenApplications() listenPreferences() - Picasso.setSingletonInstance( - Picasso.Builder(this) - .downloader(OkHttp3Downloader(PicassoDownloader.Factory(Cache.getImagesDir(this)))) - .build() - ) - if (databaseUpdated) { forceSyncAll() } @@ -181,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 88faae7b..72e32dc2 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductAdapter.kt @@ -32,7 +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.PicassoDownloader +import com.looker.droidify.network.CoilDownloader import com.looker.droidify.utility.KParcelable import com.looker.droidify.utility.PackageItemResolver import com.looker.droidify.utility.Utils @@ -1119,7 +1119,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) if (updateAll) { if (item.product.icon.isNotEmpty() || item.product.metadataIcon.isNotEmpty()) { holder.icon.load( - PicassoDownloader.createIconUri( + CoilDownloader.createIconUri( holder.icon, item.product.packageName, item.product.icon, item.product.metadataIcon, item.repository ) @@ -1322,7 +1322,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) val inner = context.resources.sizeScaled(GRID_SPACING_INNER_DP) val cellSize = (screenWidth - 2 * outer - (columns - 1) * inner) / columns holder.image.load( - PicassoDownloader.createScreenshotUri( + CoilDownloader.createScreenshotUri( item.repository, item.packageName, item.screenshot @@ -1330,8 +1330,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) ) { placeholder(holder.placeholder) error(holder.placeholder) - resize(cellSize, cellSize) - centerCrop() + size(cellSize) } } ViewType.RELEASE -> { 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 f944f31a..b50a4861 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt @@ -22,7 +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.PicassoDownloader +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.* @@ -256,7 +256,7 @@ class ScreenshotsFragment() : DialogFragment() { if (width > 0 && height > 0) { repository?.let { holder.image.load( - PicassoDownloader.createScreenshotUri( + CoilDownloader.createScreenshotUri( it, packageName, screenshot @@ -264,8 +264,7 @@ class ScreenshotsFragment() : DialogFragment() { ) { 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) }