Improve: Let coil handle error

Update: Move List Adapter to seperate package
This commit is contained in:
LooKeR 2021-11-10 16:29:03 +05:30
parent 65541e7f4f
commit c338cb9bae
3 changed files with 22 additions and 31 deletions

View File

@ -1177,19 +1177,14 @@ class ProductAdapter(private val callbacks: Callbacks, private val columns: Int)
val updateStatus = Payload.STATUS in payloads val updateStatus = Payload.STATUS in payloads
val updateAll = !updateStatus val updateAll = !updateStatus
if (updateAll) { if (updateAll) {
if (item.product.icon.isNotEmpty() || item.product.metadataIcon.isNotEmpty()) { holder.icon.load(
holder.icon.load( CoilDownloader.createIconUri(
CoilDownloader.createIconUri( holder.icon, item.product.packageName,
holder.icon, item.product.packageName, item.product.icon, item.product.metadataIcon, item.repository
item.product.icon, item.product.metadataIcon, item.repository )
) ) {
) { placeholder(holder.progressIcon)
placeholder(holder.progressIcon) error(holder.defaultIcon)
error(holder.defaultIcon)
}
} else {
holder.icon.clear()
holder.icon.setImageDrawable(holder.defaultIcon)
} }
holder.name.text = item.product.name holder.name.text = item.product.name
holder.packageName.apply { holder.packageName.apply {

View File

@ -1,4 +1,4 @@
package com.looker.droidify.screen package com.looker.droidify.ui.appsList
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
@ -25,8 +25,8 @@ import com.looker.droidify.utility.extension.resources.*
import com.looker.droidify.utility.extension.text.nullIfEmpty import com.looker.droidify.utility.extension.text.nullIfEmpty
import com.looker.droidify.widget.CursorRecyclerAdapter import com.looker.droidify.widget.CursorRecyclerAdapter
class ProductsAdapter(private val onClick: (ProductItem) -> Unit) : class AppListAdapter(private val onClick: (ProductItem) -> Unit) :
CursorRecyclerAdapter<ProductsAdapter.ViewType, RecyclerView.ViewHolder>() { CursorRecyclerAdapter<AppListAdapter.ViewType, RecyclerView.ViewHolder>() {
private var lastPosition = 0 private var lastPosition = 0
enum class ViewType { PRODUCT, LOADING, EMPTY } enum class ViewType { PRODUCT, LOADING, EMPTY }
@ -147,20 +147,17 @@ class ProductsAdapter(private val onClick: (ProductItem) -> Unit) :
holder.summary.visibility = holder.summary.visibility =
if (holder.summary.text.isNotEmpty()) View.VISIBLE else View.GONE 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() || productItem.metadataIcon.isNotEmpty()) && repository != null) { holder.icon.load(
holder.icon.load( repository?.let {
CoilDownloader.createIconUri( CoilDownloader.createIconUri(
holder.icon, productItem.packageName, holder.icon, productItem.packageName,
productItem.icon, productItem.metadataIcon, repository productItem.icon, productItem.metadataIcon, it
) )
) {
transformations(RoundedCornersTransformation(4.toPx))
placeholder(holder.progressIcon)
error(holder.defaultIcon)
} }
} else { ) {
holder.icon.clear() transformations(RoundedCornersTransformation(4.toPx))
holder.icon.setImageDrawable(holder.defaultIcon) placeholder(holder.progressIcon)
error(holder.defaultIcon)
} }
holder.status.apply { holder.status.apply {
if (productItem.canUpdate) { if (productItem.canUpdate) {

View File

@ -14,7 +14,6 @@ import com.looker.droidify.database.CursorOwner
import com.looker.droidify.database.Database import com.looker.droidify.database.Database
import com.looker.droidify.entity.ProductItem import com.looker.droidify.entity.ProductItem
import com.looker.droidify.screen.BaseFragment import com.looker.droidify.screen.BaseFragment
import com.looker.droidify.screen.ProductsAdapter
import com.looker.droidify.utility.RxUtils import com.looker.droidify.utility.RxUtils
import com.looker.droidify.widget.RecyclerFastScroller import com.looker.droidify.widget.RecyclerFastScroller
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
@ -61,8 +60,8 @@ class AppListFragment() : BaseFragment(), CursorOwner.Callback {
isMotionEventSplittingEnabled = false isMotionEventSplittingEnabled = false
isVerticalScrollBarEnabled = false isVerticalScrollBarEnabled = false
setHasFixedSize(true) setHasFixedSize(true)
recycledViewPool.setMaxRecycledViews(ProductsAdapter.ViewType.PRODUCT.ordinal, 30) recycledViewPool.setMaxRecycledViews(AppListAdapter.ViewType.PRODUCT.ordinal, 30)
val adapter = ProductsAdapter { screenActivity.navigateProduct(it.packageName) } val adapter = AppListAdapter { screenActivity.navigateProduct(it.packageName) }
this.adapter = adapter this.adapter = adapter
RecyclerFastScroller(this) RecyclerFastScroller(this)
recyclerView = this recyclerView = this
@ -79,7 +78,7 @@ class AppListFragment() : BaseFragment(), CursorOwner.Callback {
.flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } } .flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } }
.map { list -> list.asSequence().map { Pair(it.id, it) }.toMap() } .map { list -> list.asSequence().map { Pair(it.id, it) }.toMap() }
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe { (recyclerView?.adapter as? ProductsAdapter)?.repositories = it } .subscribe { (recyclerView?.adapter as? AppListAdapter)?.repositories = it }
} }
override fun onDestroyView() { override fun onDestroyView() {
@ -93,7 +92,7 @@ class AppListFragment() : BaseFragment(), CursorOwner.Callback {
} }
override fun onCursorData(request: CursorOwner.Request, cursor: Cursor?) { override fun onCursorData(request: CursorOwner.Request, cursor: Cursor?) {
(recyclerView?.adapter as? ProductsAdapter)?.apply { (recyclerView?.adapter as? AppListAdapter)?.apply {
this.cursor = cursor this.cursor = cursor
viewLifecycleOwner.lifecycleScope.launchWhenCreated { viewLifecycleOwner.lifecycleScope.launchWhenCreated {
emptyText = when { emptyText = when {