Migrate from Coil to Picasso

This commit is contained in:
kitsunyan
2020-06-26 02:04:36 +03:00
parent b646259f5d
commit f6f2cc89be
7 changed files with 48 additions and 22 deletions
+1 -1
View File
@@ -122,5 +122,5 @@ dependencies {
implementation 'io.reactivex.rxjava3:rxjava:3.0.4' implementation 'io.reactivex.rxjava3:rxjava:3.0.4'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'com.fasterxml.jackson.core:jackson-core:2.11.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'
} }
@@ -10,16 +10,16 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import coil.Coil import com.squareup.picasso.OkHttp3Downloader
import coil.ImageLoader import com.squareup.picasso.Picasso
import nya.kitsunyan.foxydroid.content.Cache import nya.kitsunyan.foxydroid.content.Cache
import nya.kitsunyan.foxydroid.content.Preferences import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.content.ProductPreferences import nya.kitsunyan.foxydroid.content.ProductPreferences
import nya.kitsunyan.foxydroid.database.Database import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.InstalledItem import nya.kitsunyan.foxydroid.entity.InstalledItem
import nya.kitsunyan.foxydroid.index.RepositoryUpdater import nya.kitsunyan.foxydroid.index.RepositoryUpdater
import nya.kitsunyan.foxydroid.network.CoilDownloader
import nya.kitsunyan.foxydroid.network.Downloader import nya.kitsunyan.foxydroid.network.Downloader
import nya.kitsunyan.foxydroid.network.PicassoDownloader
import nya.kitsunyan.foxydroid.service.Connection import nya.kitsunyan.foxydroid.service.Connection
import nya.kitsunyan.foxydroid.service.SyncService import nya.kitsunyan.foxydroid.service.SyncService
import nya.kitsunyan.foxydroid.utility.Utils import nya.kitsunyan.foxydroid.utility.Utils
@@ -48,8 +48,8 @@ class MainApplication: Application() {
listenApplications() listenApplications()
listenPreferences() listenPreferences()
Coil.setImageLoader(ImageLoader.Builder(this) Picasso.setSingletonInstance(Picasso.Builder(this)
.callFactory(CoilDownloader.Factory(Cache.getImagesDir(this))).build()) .downloader(OkHttp3Downloader(PicassoDownloader.Factory(Cache.getImagesDir(this)))).build())
if (databaseUpdated) { if (databaseUpdated) {
forceSyncAll() forceSyncAll()
@@ -12,7 +12,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
import java.io.File import java.io.File
import kotlin.math.* import kotlin.math.*
object CoilDownloader { object PicassoDownloader {
private const val HOST_ICON = "icon" private const val HOST_ICON = "icon"
private const val HOST_SCREENSHOT = "screenshot" private const val HOST_SCREENSHOT = "screenshot"
private const val QUERY_ADDRESS = "address" private const val QUERY_ADDRESS = "address"
@@ -40,7 +40,6 @@ import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import androidx.core.text.util.LinkifyCompat import androidx.core.text.util.LinkifyCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.api.*
import nya.kitsunyan.foxydroid.R import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.content.Preferences import nya.kitsunyan.foxydroid.content.Preferences
import nya.kitsunyan.foxydroid.content.ProductPreferences 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.Release
import nya.kitsunyan.foxydroid.entity.Repository import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.graphics.PaddingDrawable 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.KParcelable
import nya.kitsunyan.foxydroid.utility.PackageItemResolver import nya.kitsunyan.foxydroid.utility.PackageItemResolver
import nya.kitsunyan.foxydroid.utility.Utils import nya.kitsunyan.foxydroid.utility.Utils
@@ -953,7 +952,7 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
item as Item.HeaderItem item as Item.HeaderItem
val installedItem = installedItem val installedItem = installedItem
if (item.product.icon.isNotEmpty()) { 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) placeholder(holder.progressIcon)
error(holder.defaultIcon) 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 outer = context.resources.sizeScaled(GRID_SPACING_OUTER_DP)
val inner = context.resources.sizeScaled(GRID_SPACING_INNER_DP) val inner = context.resources.sizeScaled(GRID_SPACING_INNER_DP)
val cellSize = (screenWidth - 2 * outer - (columns - 1) * inner) / columns val cellSize = (screenWidth - 2 * outer - (columns - 1) * inner) / columns
holder.image.load(CoilDownloader.createScreenshotUri(item.repository, item.packageName, item.screenshot)) { holder.image.load(PicassoDownloader.createScreenshotUri(item.repository, item.packageName, item.screenshot)) {
size(cellSize)
placeholder(holder.placeholder) placeholder(holder.placeholder)
error(holder.placeholder) error(holder.placeholder)
resize(cellSize, cellSize)
centerCrop()
} }
Unit
} }
ViewType.RELEASE -> { ViewType.RELEASE -> {
holder as ReleaseViewHolder holder as ReleaseViewHolder
@@ -11,13 +11,11 @@ import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.api.clear
import coil.api.load
import nya.kitsunyan.foxydroid.R import nya.kitsunyan.foxydroid.R
import nya.kitsunyan.foxydroid.database.Database import nya.kitsunyan.foxydroid.database.Database
import nya.kitsunyan.foxydroid.entity.ProductItem import nya.kitsunyan.foxydroid.entity.ProductItem
import nya.kitsunyan.foxydroid.entity.Repository 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.Utils
import nya.kitsunyan.foxydroid.utility.extension.resources.* import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.utility.extension.text.* 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 holder.summary.visibility = if (holder.summary.text.isNotEmpty()) View.VISIBLE else View.GONE
val repository: Repository? = repositories[productItem.repositoryId] val repository: Repository? = repositories[productItem.repositoryId]
if (productItem.icon.isNotEmpty() && repository != null) { 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) placeholder(holder.progressIcon)
error(holder.defaultIcon) error(holder.defaultIcon)
} }
@@ -15,7 +15,6 @@ import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.MarginPageTransformer import androidx.viewpager2.widget.MarginPageTransformer
import androidx.viewpager2.widget.ViewPager2 import androidx.viewpager2.widget.ViewPager2
import coil.api.*
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable 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.Product
import nya.kitsunyan.foxydroid.entity.Repository import nya.kitsunyan.foxydroid.entity.Repository
import nya.kitsunyan.foxydroid.graphics.PaddingDrawable 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.RxUtils
import nya.kitsunyan.foxydroid.utility.extension.resources.* import nya.kitsunyan.foxydroid.utility.extension.resources.*
import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter import nya.kitsunyan.foxydroid.widget.StableRecyclerAdapter
@@ -101,6 +100,9 @@ class ScreenshotsFragment(): DialogFragment() {
val viewPager = ViewPager2(dialog.context) val viewPager = ViewPager2(dialog.context)
viewPager.adapter = Adapter(packageName) { decorView.performClick() } viewPager.adapter = Adapter(packageName) { decorView.performClick() }
viewPager.setPageTransformer(MarginPageTransformer(resources.sizeScaled(16))) 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, dialog.addContentView(viewPager, ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT)) ViewGroup.LayoutParams.MATCH_PARENT))
this.viewPager = viewPager this.viewPager = viewPager
@@ -181,6 +183,14 @@ class ScreenshotsFragment(): DialogFragment() {
notifyDataSetChanged() notifyDataSetChanged()
} }
var size = Pair(0, 0)
set(value) {
if (field != value) {
field = value
notifyDataSetChanged()
}
}
fun getCurrentIdentifier(viewPager: ViewPager2): String? { fun getCurrentIdentifier(viewPager: ViewPager2): String? {
val position = viewPager.currentItem val position = viewPager.currentItem
return screenshots.getOrNull(position)?.identifier return screenshots.getOrNull(position)?.identifier
@@ -202,9 +212,16 @@ class ScreenshotsFragment(): DialogFragment() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder holder as ViewHolder
val screenshot = screenshots[position] val screenshot = screenshots[position]
holder.image.load(CoilDownloader.createScreenshotUri(repository!!, packageName, screenshot)) { val (width, height) = size
placeholder(holder.placeholder) if (width > 0 && height > 0) {
error(holder.placeholder) holder.image.load(PicassoDownloader.createScreenshotUri(repository!!, packageName, screenshot)) {
placeholder(holder.placeholder)
error(holder.placeholder)
resize(width, height)
centerInside()
}
} else {
holder.image.clear()
} }
} }
} }
@@ -6,12 +6,16 @@ import android.content.res.ColorStateList
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Typeface import android.graphics.Typeface
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.squareup.picasso.Picasso
import com.squareup.picasso.RequestCreator
import kotlin.math.* import kotlin.math.*
object TypefaceExtra { object TypefaceExtra {
@@ -51,3 +55,11 @@ fun TextView.setTextSizeScaled(size: Int) {
fun ViewGroup.inflate(layoutResId: Int): View { fun ViewGroup.inflate(layoutResId: Int): View {
return LayoutInflater.from(context).inflate(layoutResId, this, false) 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)
}