From f6f2cc89bee174af94f149a03333788a697a7c9e Mon Sep 17 00:00:00 2001 From: kitsunyan Date: Fri, 26 Jun 2020 02:04:36 +0300 Subject: [PATCH] Migrate from Coil to Picasso --- build.gradle | 2 +- .../kitsunyan/foxydroid/MainApplication.kt | 10 +++---- ...CoilDownloader.kt => PicassoDownloader.kt} | 2 +- .../foxydroid/screen/ProductAdapter.kt | 11 ++++---- .../foxydroid/screen/ProductsAdapter.kt | 6 ++--- .../foxydroid/screen/ScreenshotsFragment.kt | 27 +++++++++++++++---- .../foxydroid/utility/extension/Resources.kt | 12 +++++++++ 7 files changed, 48 insertions(+), 22 deletions(-) rename src/main/kotlin/nya/kitsunyan/foxydroid/network/{CoilDownloader.kt => PicassoDownloader.kt} (99%) diff --git a/build.gradle b/build.gradle index d1ba72a..cf2c92e 100644 --- a/build.gradle +++ b/build.gradle @@ -122,5 +122,5 @@ dependencies { implementation 'io.reactivex.rxjava3:rxjava:3.0.4' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' implementation 'com.fasterxml.jackson.core:jackson-core:2.11.0' - implementation 'io.coil-kt:coil:0.11.0' + implementation 'com.squareup.picasso:picasso:2.71828' } diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/MainApplication.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/MainApplication.kt index 0e4eedb..4a2de84 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/MainApplication.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/MainApplication.kt @@ -10,16 +10,16 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageInfo -import coil.Coil -import coil.ImageLoader +import com.squareup.picasso.OkHttp3Downloader +import com.squareup.picasso.Picasso import nya.kitsunyan.foxydroid.content.Cache import nya.kitsunyan.foxydroid.content.Preferences import nya.kitsunyan.foxydroid.content.ProductPreferences import nya.kitsunyan.foxydroid.database.Database import nya.kitsunyan.foxydroid.entity.InstalledItem import nya.kitsunyan.foxydroid.index.RepositoryUpdater -import nya.kitsunyan.foxydroid.network.CoilDownloader import nya.kitsunyan.foxydroid.network.Downloader +import nya.kitsunyan.foxydroid.network.PicassoDownloader import nya.kitsunyan.foxydroid.service.Connection import nya.kitsunyan.foxydroid.service.SyncService import nya.kitsunyan.foxydroid.utility.Utils @@ -48,8 +48,8 @@ class MainApplication: Application() { listenApplications() listenPreferences() - Coil.setImageLoader(ImageLoader.Builder(this) - .callFactory(CoilDownloader.Factory(Cache.getImagesDir(this))).build()) + Picasso.setSingletonInstance(Picasso.Builder(this) + .downloader(OkHttp3Downloader(PicassoDownloader.Factory(Cache.getImagesDir(this)))).build()) if (databaseUpdated) { forceSyncAll() diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/network/CoilDownloader.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/network/PicassoDownloader.kt similarity index 99% rename from src/main/kotlin/nya/kitsunyan/foxydroid/network/CoilDownloader.kt rename to src/main/kotlin/nya/kitsunyan/foxydroid/network/PicassoDownloader.kt index 5c1c85b..f993cba 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/network/CoilDownloader.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/network/PicassoDownloader.kt @@ -12,7 +12,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import java.io.File import kotlin.math.* -object CoilDownloader { +object PicassoDownloader { private const val HOST_ICON = "icon" private const val HOST_SCREENSHOT = "screenshot" private const val QUERY_ADDRESS = "address" diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductAdapter.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductAdapter.kt index 1a16f14..a60e79f 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductAdapter.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductAdapter.kt @@ -40,7 +40,6 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils import androidx.core.text.util.LinkifyCompat import androidx.recyclerview.widget.RecyclerView -import coil.api.* import nya.kitsunyan.foxydroid.R import nya.kitsunyan.foxydroid.content.Preferences import nya.kitsunyan.foxydroid.content.ProductPreferences @@ -50,7 +49,7 @@ import nya.kitsunyan.foxydroid.entity.ProductPreference import nya.kitsunyan.foxydroid.entity.Release import nya.kitsunyan.foxydroid.entity.Repository import nya.kitsunyan.foxydroid.graphics.PaddingDrawable -import nya.kitsunyan.foxydroid.network.CoilDownloader +import nya.kitsunyan.foxydroid.network.PicassoDownloader import nya.kitsunyan.foxydroid.utility.KParcelable import nya.kitsunyan.foxydroid.utility.PackageItemResolver import nya.kitsunyan.foxydroid.utility.Utils @@ -953,7 +952,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int) item as Item.HeaderItem val installedItem = installedItem if (item.product.icon.isNotEmpty()) { - holder.icon.load(CoilDownloader.createIconUri(holder.icon, item.product.icon, item.repository)) { + holder.icon.load(PicassoDownloader.createIconUri(holder.icon, item.product.icon, item.repository)) { placeholder(holder.progressIcon) error(holder.defaultIcon) } @@ -1122,12 +1121,12 @@ 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(CoilDownloader.createScreenshotUri(item.repository, item.packageName, item.screenshot)) { - size(cellSize) + holder.image.load(PicassoDownloader.createScreenshotUri(item.repository, item.packageName, item.screenshot)) { placeholder(holder.placeholder) error(holder.placeholder) + resize(cellSize, cellSize) + centerCrop() } - Unit } ViewType.RELEASE -> { holder as ReleaseViewHolder diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsAdapter.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsAdapter.kt index 6d9e1fb..6f580b7 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsAdapter.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ProductsAdapter.kt @@ -11,13 +11,11 @@ import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView import androidx.recyclerview.widget.RecyclerView -import coil.api.clear -import coil.api.load import nya.kitsunyan.foxydroid.R import nya.kitsunyan.foxydroid.database.Database import nya.kitsunyan.foxydroid.entity.ProductItem import nya.kitsunyan.foxydroid.entity.Repository -import nya.kitsunyan.foxydroid.network.CoilDownloader +import nya.kitsunyan.foxydroid.network.PicassoDownloader import nya.kitsunyan.foxydroid.utility.Utils import nya.kitsunyan.foxydroid.utility.extension.resources.* import nya.kitsunyan.foxydroid.utility.extension.text.* @@ -127,7 +125,7 @@ class ProductsAdapter(private val onClick: (ProductItem) -> Unit): holder.summary.visibility = if (holder.summary.text.isNotEmpty()) View.VISIBLE else View.GONE val repository: Repository? = repositories[productItem.repositoryId] if (productItem.icon.isNotEmpty() && repository != null) { - holder.icon.load(CoilDownloader.createIconUri(holder.icon, productItem.icon, repository)) { + holder.icon.load(PicassoDownloader.createIconUri(holder.icon, productItem.icon, repository)) { placeholder(holder.progressIcon) error(holder.defaultIcon) } diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenshotsFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenshotsFragment.kt index 6c457de..4978ff7 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenshotsFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenshotsFragment.kt @@ -15,7 +15,6 @@ import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.MarginPageTransformer import androidx.viewpager2.widget.ViewPager2 -import coil.api.* import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable @@ -25,7 +24,7 @@ import nya.kitsunyan.foxydroid.database.Database import nya.kitsunyan.foxydroid.entity.Product import nya.kitsunyan.foxydroid.entity.Repository import nya.kitsunyan.foxydroid.graphics.PaddingDrawable -import nya.kitsunyan.foxydroid.network.CoilDownloader +import nya.kitsunyan.foxydroid.network.PicassoDownloader import nya.kitsunyan.foxydroid.utility.RxUtils import nya.kitsunyan.foxydroid.utility.extension.resources.* import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter @@ -101,6 +100,9 @@ class ScreenshotsFragment(): DialogFragment() { val viewPager = ViewPager2(dialog.context) viewPager.adapter = Adapter(packageName) { decorView.performClick() } viewPager.setPageTransformer(MarginPageTransformer(resources.sizeScaled(16))) + viewPager.viewTreeObserver.addOnGlobalLayoutListener { + (viewPager.adapter as Adapter).size = Pair(viewPager.width, viewPager.height) + } dialog.addContentView(viewPager, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)) this.viewPager = viewPager @@ -181,6 +183,14 @@ class ScreenshotsFragment(): DialogFragment() { notifyDataSetChanged() } + var size = Pair(0, 0) + set(value) { + if (field != value) { + field = value + notifyDataSetChanged() + } + } + fun getCurrentIdentifier(viewPager: ViewPager2): String? { val position = viewPager.currentItem return screenshots.getOrNull(position)?.identifier @@ -202,9 +212,16 @@ class ScreenshotsFragment(): DialogFragment() { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { holder as ViewHolder val screenshot = screenshots[position] - holder.image.load(CoilDownloader.createScreenshotUri(repository!!, packageName, screenshot)) { - placeholder(holder.placeholder) - error(holder.placeholder) + val (width, height) = size + if (width > 0 && height > 0) { + holder.image.load(PicassoDownloader.createScreenshotUri(repository!!, packageName, screenshot)) { + placeholder(holder.placeholder) + error(holder.placeholder) + resize(width, height) + centerInside() + } + } else { + holder.image.clear() } } } diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/utility/extension/Resources.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/utility/extension/Resources.kt index e906458..ffd1b82 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/utility/extension/Resources.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/utility/extension/Resources.kt @@ -6,12 +6,16 @@ import android.content.res.ColorStateList import android.content.res.Resources import android.graphics.Typeface import android.graphics.drawable.Drawable +import android.net.Uri import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat +import com.squareup.picasso.Picasso +import com.squareup.picasso.RequestCreator import kotlin.math.* object TypefaceExtra { @@ -51,3 +55,11 @@ fun TextView.setTextSizeScaled(size: Int) { 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.clear() { + Picasso.get().cancelRequest(this) +}