From ec8a0da784a81a2d0c223c2652ae4340f0abe025 Mon Sep 17 00:00:00 2001 From: VaiTon Date: Sat, 7 Aug 2021 15:23:16 +0200 Subject: [PATCH] fix: NPE in WikidataAPIClient Closes OPENFOODFACTS-ANDROID-41S --- .../additives/AdditiveFragmentHelper.kt | 6 +- .../product/view/CategoryProductHelper.kt | 2 +- .../attribute/ProductAttributeFragment.kt | 223 ++++++++++-------- .../ingredients/IngredientsProductFragment.kt | 2 +- .../view/summary/SummaryProductFragment.kt | 2 +- .../openfood/network/WikiDataApiClient.kt | 9 +- .../openfood/network/services/WikidataAPI.kt | 4 +- .../openfood/utils/DeserializerHelper.kt | 16 +- .../fragment_product_attribute_details.xml | 187 ++++++++------- 9 files changed, 236 insertions(+), 215 deletions(-) diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/additives/AdditiveFragmentHelper.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/additives/AdditiveFragmentHelper.kt index 7938442206ba..528b42121317 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/additives/AdditiveFragmentHelper.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/additives/AdditiveFragmentHelper.kt @@ -58,12 +58,12 @@ object AdditiveFragmentHelper { * Returns additive tag from additive name using WikidataApiClient * * @param additive name of the additive - * @param apiClientForWikiData object of WikidataApiClient + * @param wikidataClient object of WikidataApiClient * @param fragment holds a reference to the calling fragment */ private fun getAdditiveTag( additive: AdditiveName, - apiClientForWikiData: WikiDataApiClient, + wikidataClient: WikiDataApiClient, fragment: BaseFragment, lifecycleOwner: LifecycleOwner ): CharSequence { @@ -72,7 +72,7 @@ object AdditiveFragmentHelper { override fun onClick(view: View) { if (additive.isWikiDataIdPresent) { lifecycleOwner.lifecycleScope.launch { - val result = apiClientForWikiData.doSomeThing(additive.wikiDataId) + val result = wikidataClient.getEntityData(additive.wikiDataId) getOnWikiResponse(activity, additive)(result) } } else { diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/CategoryProductHelper.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/CategoryProductHelper.kt index 07f3e691f9df..4cc2b1e55238 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/CategoryProductHelper.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/CategoryProductHelper.kt @@ -63,7 +63,7 @@ object CategoryProductHelper { override fun onClick(view: View) { if (category.isWikiDataIdPresent == true) { fragment.lifecycleScope.launch { - val result = category.wikiDataId?.let { apiClient.doSomeThing(it) } + val result = category.wikiDataId?.let { apiClient.getEntityData(it) } if (result != null) { val activity = fragment.activity if (activity != null && !activity.isFinishing) { diff --git a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/attribute/ProductAttributeFragment.kt b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/attribute/ProductAttributeFragment.kt index 6779c8e5967a..eb1eec451c45 100644 --- a/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/attribute/ProductAttributeFragment.kt +++ b/app/src/main/java/openfoodfacts/github/scrachx/openfood/features/product/view/attribute/ProductAttributeFragment.kt @@ -1,16 +1,14 @@ package openfoodfacts.github.scrachx.openfood.features.product.view.attribute -import android.net.Uri import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button import android.widget.TextView import android.widget.Toast import androidx.appcompat.widget.AppCompatImageView -import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.net.toUri import com.fasterxml.jackson.core.JsonProcessingException import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper @@ -20,7 +18,8 @@ import openfoodfacts.github.scrachx.openfood.R import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabActivityHelper import openfoodfacts.github.scrachx.openfood.customtabs.CustomTabsHelper import openfoodfacts.github.scrachx.openfood.customtabs.WebViewFallback -import openfoodfacts.github.scrachx.openfood.features.search.ProductSearchActivity.Companion.start +import openfoodfacts.github.scrachx.openfood.databinding.FragmentProductAttributeDetailsBinding +import openfoodfacts.github.scrachx.openfood.features.search.ProductSearchActivity import openfoodfacts.github.scrachx.openfood.models.DaoSession import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveName import openfoodfacts.github.scrachx.openfood.models.entities.additive.AdditiveNameDao @@ -30,20 +29,26 @@ import javax.inject.Inject @AndroidEntryPoint class ProductAttributeFragment : BottomSheetDialogFragment() { - private var bottomSheetTitleIcon: AppCompatImageView? = null - private var mpInfantsImage: AppCompatImageView? = null - private var mpToddlersImage: AppCompatImageView? = null - private var mpChildrenImage: AppCompatImageView? = null - private var mpAdolescentsImage: AppCompatImageView? = null - private var mpAdultsImage: AppCompatImageView? = null - private var mpElderlyImage: AppCompatImageView? = null - private var spInfantsImage: AppCompatImageView? = null - private var spToddlersImage: AppCompatImageView? = null - private var spChildrenImage: AppCompatImageView? = null - private var spAdolescentsImage: AppCompatImageView? = null - private var spAdultsImage: AppCompatImageView? = null - private var spElderlyImage: AppCompatImageView? = null - private var customTabsIntent: CustomTabsIntent? = null + private lateinit var mpInfantsImage: AppCompatImageView + private lateinit var mpToddlersImage: AppCompatImageView + private lateinit var mpChildrenImage: AppCompatImageView + private lateinit var mpAdolescentsImage: AppCompatImageView + private lateinit var mpAdultsImage: AppCompatImageView + private lateinit var mpElderlyImage: AppCompatImageView + private lateinit var spInfantsImage: AppCompatImageView + private lateinit var spToddlersImage: AppCompatImageView + private lateinit var spChildrenImage: AppCompatImageView + private lateinit var spAdolescentsImage: AppCompatImageView + private lateinit var spAdultsImage: AppCompatImageView + private lateinit var spElderlyImage: AppCompatImageView + private val customTabsIntent by lazy { + CustomTabsHelper.getCustomTabsIntent(requireContext(), CustomTabActivityHelper().session) + } + + private var _binding: FragmentProductAttributeDetailsBinding? = null + private val binding get() = _binding!! + + private val mapper by lazy { jacksonObjectMapper() } @Inject lateinit var daoSession: DaoSession @@ -52,55 +57,67 @@ class ProductAttributeFragment : BottomSheetDialogFragment() { lateinit var localeManager: LocaleManager override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View = inflater.inflate(R.layout.fragment_product_attribute_details, container, false) + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentProductAttributeDetailsBinding.inflate(inflater, container, false) + return binding.root + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - val customTabActivityHelper = CustomTabActivityHelper() - customTabsIntent = CustomTabsHelper.getCustomTabsIntent(requireContext(), customTabActivityHelper.session) - val bottomSheetDescription = view.findViewById(R.id.description) - val bottomSheetTitle = view.findViewById(R.id.titleBottomSheet) - bottomSheetTitleIcon = view.findViewById(R.id.titleBottomSheetIcon) - val buttonToBrowseProducts = view.findViewById