Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix editing in allergens alert screen (closes #4133) #4215

Merged
merged 1 commit into from Sep 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -15,6 +15,7 @@
*/
package openfoodfacts.github.scrachx.openfood.features.allergensalert

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
Expand All @@ -23,13 +24,13 @@ import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import openfoodfacts.github.scrachx.openfood.R
import openfoodfacts.github.scrachx.openfood.models.entities.allergen.AllergenName
import openfoodfacts.github.scrachx.openfood.repositories.ProductRepository

class AllergensAdapter(
private val repository: ProductRepository,
var allergens: MutableList<AllergenName> = mutableListOf()
val onDeleteAction: (allergen: AllergenName) -> Unit,
) : RecyclerView.Adapter<AllergensAdapter.AllergenViewHolder>() {

private var allergens = listOf<AllergenName>()

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AllergenViewHolder {
val contactView = LayoutInflater.from(parent.context).inflate(R.layout.item_allergens, parent, false)
return AllergenViewHolder(contactView)
Expand All @@ -39,15 +40,18 @@ class AllergensAdapter(
val allergen = allergens[position]
holder.nameTextView.text = allergen.name
holder.messageButton.setOnClickListener {
val pos = holder.bindingAdapterPosition
allergens.removeAt(pos)
notifyItemRemoved(pos)
repository.setAllergenEnabled(allergen.allergenTag, false)
onDeleteAction(allergens[holder.bindingAdapterPosition])
}
}

override fun getItemCount() = allergens.size

@SuppressLint("NotifyDataSetChanged")
fun updateItems(items: List<AllergenName>) {
allergens = items
notifyDataSetChanged()
}

class AllergenViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val messageButton: Button = itemView.findViewById(R.id.delete_button)
val nameTextView: TextView = itemView.findViewById(R.id.allergen_name)
Expand Down
Expand Up @@ -80,23 +80,19 @@ class AllergensAlertFragment : NavigationBaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

// OnClick
adapter = AllergensAdapter {
removeAllergen(it)
}
binding.allergensRecycle.adapter = adapter
binding.allergensRecycle.layoutManager = LinearLayoutManager(view.context)
binding.allergensRecycle.setHasFixedSize(true)
adapter.registerAdapterDataObserver(dataObserver)
dataObserver.onChanged()
binding.btnAdd.setOnClickListener { addAllergen() }

lifecycleScope.launch {
lifecycleScope.launchWhenStarted {
awaitAll(
async {
updateEnabledAllergens(appLang)

adapter = AllergensAdapter(productRepository, enabledAllergens!!)

binding.allergensRecycle.adapter = adapter
binding.allergensRecycle.layoutManager = LinearLayoutManager(view.context)
binding.allergensRecycle.setHasFixedSize(true)

adapter.registerAdapterDataObserver(dataObserver)
dataObserver.onChanged()
},
async { updateEnabledAllergens(appLang) },
async { updateAllergensFromDao(appLang) }
)
binding.btnAdd.isEnabled = true
Expand Down Expand Up @@ -129,7 +125,6 @@ class AllergensAlertFragment : NavigationBaseFragment() {
* Add an allergen to be checked for when browsing products.
*/
private fun addAllergen() {

if (enabledAllergens != null && !allergensFromDao.isNullOrEmpty()) {

lifecycleScope.launch {
Expand All @@ -143,8 +138,10 @@ class AllergensAlertFragment : NavigationBaseFragment() {
viewLifecycleOwner.lifecycleScope.launch {
productRepository.setAllergenEnabled(allergens[position].allergenTag, true).await()
}
enabledAllergens!!.add(allergens[position])
adapter.notifyItemInserted(enabledAllergens!!.size - 1)
enabledAllergens?.let {
it.add(allergens[position])
adapter.updateItems(it)
}
binding.allergensRecycle.scrollToPosition(adapter.itemCount - 1)
matomoAnalytics.trackEvent(AnalyticsEvent.AllergenAlertCreated(allergens[position].allergenTag))
}.show()
Expand All @@ -167,8 +164,9 @@ class AllergensAlertFragment : NavigationBaseFragment() {
}

mSettings.edit { putBoolean("errorAllergens", false) }
adapter.allergens = enabledAllergens!!
adapter.notifyDataSetChanged()
enabledAllergens?.let {
adapter.updateItems(it)
}

updateAllergens()

Expand All @@ -187,6 +185,18 @@ class AllergensAlertFragment : NavigationBaseFragment() {
}
}

private fun removeAllergen(allergen: AllergenName) {
lifecycleScope.launch {
enabledAllergens?.let {
it.remove(allergen)
adapter.updateItems(it)
}
withContext(Dispatchers.IO) {
productRepository.setAllergenEnabled(allergen.allergenTag, false).await()
}
}
}

/**
* Retrieve modified list of allergens from ProductRepository
*/
Expand Down