From 9ae13b61f81f3f87507550ebeef85ec8887b8a88 Mon Sep 17 00:00:00 2001 From: Vladimir Tanakov Date: Sun, 19 Sep 2021 12:21:40 +0300 Subject: [PATCH] fix: editing in allergens alert screen (#4215) --- .../allergensalert/AllergensAdapter.kt | 18 ++++--- .../allergensalert/AllergensAlertFragment.kt | 48 +++++++++++-------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAdapter.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAdapter.kt index 990345750f48..b99bcac96316 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAdapter.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAdapter.kt @@ -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 @@ -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 = mutableListOf() + val onDeleteAction: (allergen: AllergenName) -> Unit, ) : RecyclerView.Adapter() { + private var allergens = listOf() + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AllergenViewHolder { val contactView = LayoutInflater.from(parent.context).inflate(R.layout.item_allergens, parent, false) return AllergenViewHolder(contactView) @@ -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) { + 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) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt index 1cac3a0d5ef2..1cb423e89422 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/allergensalert/AllergensAlertFragment.kt @@ -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 @@ -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 { @@ -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() @@ -167,8 +164,9 @@ class AllergensAlertFragment : NavigationBaseFragment() { } mSettings.edit { putBoolean("errorAllergens", false) } - adapter.allergens = enabledAllergens!! - adapter.notifyDataSetChanged() + enabledAllergens?.let { + adapter.updateItems(it) + } updateAllergens() @@ -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 */