From 966a082147f6e980692423cebff918dd9daaf07d Mon Sep 17 00:00:00 2001 From: aminecmi Date: Thu, 29 Dec 2022 20:35:03 +0100 Subject: [PATCH] fix: NPE may be caused by the binding or the title that was null. --- .../android/fragments/ArticleFragment.kt | 84 +++++++++---------- .../readerforselfossv2/model/MercuryModel.kt | 2 +- 2 files changed, 40 insertions(+), 46 deletions(-) diff --git a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt index 1dbb9a6..ef07d50 100644 --- a/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt +++ b/androidApp/src/main/java/bou/amine/apps/readerforselfossv2/android/fragments/ArticleFragment.kt @@ -66,8 +66,7 @@ class ArticleFragment : Fragment(), DIAware { private lateinit var allImages : ArrayList private lateinit var fab: FloatingActionButton private lateinit var textAlignment: String - private var _binding: FragmentArticleBinding? = null - private val binding get() = _binding + private lateinit var binding: FragmentArticleBinding override val di : DI by closestDI() private val repository: Repository by instance() @@ -95,7 +94,7 @@ class ArticleFragment : Fragment(), DIAware { savedInstanceState: Bundle? ): View { try { - _binding = FragmentArticleBinding.inflate(inflater, container, false) + binding = FragmentArticleBinding.inflate(inflater, container, false) url = item.getLinkDecoded() contentText = item.content @@ -110,13 +109,13 @@ class ArticleFragment : Fragment(), DIAware { refreshAlignment() - fab = binding!!.fab + fab = binding.fab fab.backgroundTintList = ColorStateList.valueOf(resources.getColor(R.color.colorAccent)) fab.rippleColor = resources.getColor(R.color.colorAccentDark) - val floatingToolbar: FloatingToolbar = binding!!.floatingToolbar + val floatingToolbar: FloatingToolbar = binding.floatingToolbar floatingToolbar.attachFab(fab) floatingToolbar.background = ColorDrawable(resources.getColor(R.color.colorAccent)) @@ -164,35 +163,35 @@ class ArticleFragment : Fragment(), DIAware { floatingToolbar.show() } - binding!!.source.text = contentSource + binding.source.text = contentSource if (typeface != null) { - binding!!.source.typeface = typeface + binding.source.typeface = typeface } if (contentText.isEmptyOrNullOrNullString()) { getContentFromMercury() } else { - binding!!.titleView.text = contentTitle + binding.titleView.text = contentTitle if (typeface != null) { - binding!!.titleView.typeface = typeface + binding.titleView.typeface = typeface } htmlToWebview() if (!contentImage.isEmptyOrNullOrNullString() && context != null) { - binding!!.imageView.visibility = View.VISIBLE + binding.imageView.visibility = View.VISIBLE Glide .with(requireContext()) .asBitmap() .load(contentImage) .apply(RequestOptions.fitCenterTransform()) - .into(binding!!.imageView) + .into(binding.imageView) } else { - binding!!.imageView.visibility = View.GONE + binding.imageView.visibility = View.GONE } } - binding!!.nestedScrollView.setOnScrollChangeListener( + binding.nestedScrollView.setOnScrollChangeListener( NestedScrollView.OnScrollChangeListener { _, _, scrollY, _, oldScrollY -> if (scrollY > oldScrollY) { floatingToolbar.hide() @@ -221,12 +220,7 @@ class ArticleFragment : Fragment(), DIAware { .show() } - return binding!!.root - } - - override fun onDestroyView() { - super.onDestroyView() - _binding = null + return binding.root } private fun refreshAlignment() { @@ -239,16 +233,16 @@ class ArticleFragment : Fragment(), DIAware { private fun getContentFromMercury() { if (repository.isNetworkAvailable()) { - binding!!.progressBar.visibility = View.VISIBLE + binding.progressBar.visibility = View.VISIBLE CoroutineScope(Dispatchers.Main).launch { try { val response = mercuryApi.query(url) if (response.success && response.data != null && !response.data?.content.isNullOrEmpty()) { - binding!!.titleView.text = response.data!!.title.orEmpty() + binding.titleView.text = response.data!!.title.orEmpty() try { if (typeface != null) { - binding!!.titleView.typeface = typeface + binding.titleView.typeface = typeface } } catch (e: Exception) { e.sendSilentlyWithAcraWithName("getContentFromMercury > typeface") @@ -272,7 +266,7 @@ class ArticleFragment : Fragment(), DIAware { if (!response.data?.lead_image_url.isNullOrEmpty() && context != null) { try { - binding!!.imageView.visibility = View.VISIBLE + binding.imageView.visibility = View.VISIBLE try { Glide .with(requireContext()) @@ -281,7 +275,7 @@ class ArticleFragment : Fragment(), DIAware { response.data!!.lead_image_url.orEmpty() ) .apply(RequestOptions.fitCenterTransform()) - .into(binding!!.imageView) + .into(binding.imageView) } catch (e: Exception) { e.sendSilentlyWithAcraWithName("getContentFromMercury > glide lead image") } @@ -289,12 +283,12 @@ class ArticleFragment : Fragment(), DIAware { e.sendSilentlyWithAcraWithName("getContentFromMercury > outside glide lead image") } } else { - binding!!.imageView.visibility = View.GONE + binding.imageView.visibility = View.GONE } try { - binding!!.nestedScrollView.scrollTo(0, 0) - binding!!.progressBar.visibility = View.GONE + binding.nestedScrollView.scrollTo(0, 0) + binding.progressBar.visibility = View.GONE } catch (e: Exception) { e.sendSilentlyWithAcraWithName("getContentFromMercury > scrollview") } @@ -317,8 +311,8 @@ class ArticleFragment : Fragment(), DIAware { val a: TypedArray = requireContext().obtainStyledAttributes(resId, attrs) - binding!!.webcontent.settings.standardFontFamily = a.getString(0) - binding!!.webcontent.visibility = View.VISIBLE + binding.webcontent.settings.standardFontFamily = a.getString(0) + binding.webcontent.visibility = View.VISIBLE val colorOnSurface = TypedValue() requireContext().theme.resolveAttribute(R.attr.colorOnSurface, colorOnSurface, true) @@ -326,14 +320,14 @@ class ArticleFragment : Fragment(), DIAware { val colorSurface = TypedValue() requireContext().theme.resolveAttribute(R.attr.colorSurface, colorSurface, true) - binding!!.webcontent.settings.useWideViewPort = true - binding!!.webcontent.settings.loadWithOverviewMode = true - binding!!.webcontent.settings.javaScriptEnabled = false + binding.webcontent.settings.useWideViewPort = true + binding.webcontent.settings.loadWithOverviewMode = true + binding.webcontent.settings.javaScriptEnabled = false - binding!!.webcontent.webViewClient = object : WebViewClient() { + binding.webcontent.webViewClient = object : WebViewClient() { @Deprecated("Deprecated in Java") override fun shouldOverrideUrlLoading(view: WebView?, url : String): Boolean { - if (binding!!.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { + if (binding.webcontent.hitTestResult.type != WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { requireContext().startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) } return true @@ -377,9 +371,9 @@ class ArticleFragment : Fragment(), DIAware { } }) - binding!!.webcontent.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event)} + binding.webcontent.setOnTouchListener { _, event -> gestureDetector.onTouchEvent(event)} - binding!!.webcontent.settings.layoutAlgorithm = + binding.webcontent.settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING var baseUrl: String? = null @@ -410,7 +404,7 @@ class ArticleFragment : Fragment(), DIAware { "" } - binding!!.webcontent.loadDataWithBaseURL( + binding.webcontent.loadDataWithBaseURL( baseUrl, """ | @@ -463,17 +457,17 @@ class ArticleFragment : Fragment(), DIAware { } fun scrollDown() { - val height = binding!!.nestedScrollView.measuredHeight - binding!!.nestedScrollView.smoothScrollBy(0, height/2) + val height = binding.nestedScrollView.measuredHeight + binding.nestedScrollView.smoothScrollBy(0, height/2) } fun scrollUp() { - val height = binding!!.nestedScrollView.measuredHeight - binding!!.nestedScrollView.smoothScrollBy(0, -height/2) + val height = binding.nestedScrollView.measuredHeight + binding.nestedScrollView.smoothScrollBy(0, -height/2) } private fun openInBrowserAfterFailing() { - binding!!.progressBar.visibility = View.GONE + binding.progressBar.visibility = View.GONE requireActivity().openInBrowserAsNewTask(this@ArticleFragment.item) } @@ -492,10 +486,10 @@ class ArticleFragment : Fragment(), DIAware { } fun performClick(): Boolean { - if (binding!!.webcontent.hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE || - binding!!.webcontent.hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { + if (binding.webcontent.hitTestResult.type == WebView.HitTestResult.IMAGE_TYPE || + binding.webcontent.hitTestResult.type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { - val position : Int = allImages.indexOf(binding!!.webcontent.hitTestResult.extra) + val position : Int = allImages.indexOf(binding.webcontent.hitTestResult.extra) val intent = Intent(activity, ImageActivity::class.java) intent.putExtra("allImages", allImages) diff --git a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/MercuryModel.kt b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/MercuryModel.kt index 8662dfa..a55e5df 100644 --- a/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/MercuryModel.kt +++ b/shared/src/commonMain/kotlin/bou/amine/apps/readerforselfossv2/model/MercuryModel.kt @@ -6,7 +6,7 @@ class MercuryModel { @Serializable class ParsedContent( - val title: String, + val title: String?, val content: String?, val lead_image_url: String?, val url: String