-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
ProductSearchAdapter.kt
137 lines (115 loc) 路 5.86 KB
/
ProductSearchAdapter.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package openfoodfacts.github.scrachx.openfood.features.adapters
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Callback
import com.squareup.picasso.Picasso
import openfoodfacts.github.scrachx.openfood.AppFlavor.Companion.isFlavors
import openfoodfacts.github.scrachx.openfood.AppFlavor.OFF
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.models.SearchProduct
import openfoodfacts.github.scrachx.openfood.models.getSmallFrontImageUrl
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository
import openfoodfacts.github.scrachx.openfood.utils.LocaleManager
import openfoodfacts.github.scrachx.openfood.utils.getEcoscoreResource
import openfoodfacts.github.scrachx.openfood.utils.getNovaGroupResource
import openfoodfacts.github.scrachx.openfood.utils.getNutriScoreResource
import openfoodfacts.github.scrachx.openfood.utils.getProductBrandsQuantityDetails
class ProductSearchAdapter(
val products: MutableList<SearchProduct?>,
private val isLowBatteryMode: Boolean,
private val context: Context,
private val picasso: Picasso,
private val productRepository: ProductRepository,
private val localeManager: LocaleManager,
) : RecyclerView.Adapter<ProductSearchAdapter.ProductsListViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductsListViewHolder {
val layoutResourceId =
if (viewType == VIEW_ITEM) R.layout.products_list_item else R.layout.progressbar_endless_list
val view = LayoutInflater.from(parent.context).inflate(layoutResourceId, parent, false)
return if (viewType == VIEW_ITEM) ProductsListViewHolder.ProductViewHolder(view) else ProductsListViewHolder.ProgressViewHolder(
view)
}
override fun getItemViewType(position: Int) = if (products[position] == null) VIEW_LOAD else VIEW_ITEM
override fun onBindViewHolder(holder: ProductsListViewHolder, position: Int) {
if (holder !is ProductsListViewHolder.ProductViewHolder) return
// - get element from your dataset at this position
// - replace the contents of the view with that element
val product = products[position]!!
holder.imageProgress.visibility = View.VISIBLE
val imageSmallUrl = product.getSmallFrontImageUrl(localeManager.getLanguage())
if (imageSmallUrl == null) {
holder.imageProgress.visibility = View.GONE
}
// Load Image if isLowBatteryMode is false
if (!isLowBatteryMode) {
picasso
.load(imageSmallUrl)
.placeholder(R.drawable.placeholder_thumb)
.error(R.drawable.error_image)
.fit()
.centerCrop()
.into(holder.productFrontImg, object : Callback {
override fun onSuccess() {
holder.imageProgress.visibility = View.GONE
}
override fun onError(ex: Exception) {
holder.imageProgress.visibility = View.GONE
}
})
} else {
picasso.load(R.drawable.placeholder_thumb).into(holder.productFrontImg)
holder.imageProgress.visibility = View.INVISIBLE
}
// Set product name
holder.productName.text = product.productName ?: context.getString(R.string.productNameNull)
val productNameInLocale = product.additionalProperties[productRepository.localeProductNameField] as String?
if (!productNameInLocale.isNullOrBlank()) {
holder.productName.text = productNameInLocale
}
// Set product description
holder.productDetails.text = product.getProductBrandsQuantityDetails()
if (isFlavors(OFF)) {
// Set nutriscore icon
val nutriRes = product.getNutriScoreResource()
holder.productNutriscore.setImageResource(nutriRes)
holder.productNutriscore.visibility = View.VISIBLE
// Set nova icon
val novaRes = product.getNovaGroupResource()
holder.productNova.setImageResource(novaRes)
holder.productNova.visibility = View.VISIBLE
// Set ecoscore icon
val ecoRes = product.getEcoscoreResource()
holder.productEcoscore.setImageResource(ecoRes)
holder.productEcoscore.visibility = View.VISIBLE
}
}
fun getProduct(position: Int) = products[position]
override fun getItemCount() = products.size
companion object {
private const val VIEW_ITEM = 1
private const val VIEW_LOAD = 0
}
sealed class ProductsListViewHolder(view: View) : RecyclerView.ViewHolder(view) {
internal class ProgressViewHolder(view: View) : ProductsListViewHolder(view)
/**
* Provide a reference to the views for each data item
* Complex data items may need more than one view per item, and
* you provide access to all the views for a data item in a view holder
*/
internal class ProductViewHolder(view: View) : ProductsListViewHolder(view) {
val productName: TextView = view.findViewById(R.id.nameProduct)
val productDetails: TextView = view.findViewById(R.id.productDetails)
val productNutriscore: ImageView = view.findViewById(R.id.imgNutriscore)
val productFrontImg: ImageView = view.findViewById(R.id.imgProduct)
val imageProgress: ProgressBar = view.findViewById(R.id.searchImgProgressbar)
val productEcoscore: ImageView = view.findViewById(R.id.imgEcoscore)
val productNova: ImageView = view.findViewById(R.id.imgNova)
}
}
}