From c49c85e68bed7c73efde41728bf6c39cac9be558 Mon Sep 17 00:00:00 2001 From: Sonal Yadav Date: Wed, 28 May 2025 14:23:28 +0530 Subject: [PATCH] Fix : UninitializedPropertyAccessException (#6248) * Fix crash when uploading a duplicate file * Fix: app crash * added Kdoc * remove line b/w kdoc and function --------- Co-authored-by: Nicolas Raoul --- .../free/nrw/commons/upload/UploadActivity.kt | 4 ++- .../nrw/commons/upload/UploadPresenter.kt | 29 +++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index ee0b21210..38e7dace8 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -173,6 +173,9 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // Ensure basicKvStoreFactory is always initialized before use + presenter?.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) } + _binding = ActivityUploadBinding.inflate(layoutInflater) setContentView(binding.root) @@ -903,7 +906,6 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C // Save the user's choice to not show the dialog again defaultKvStore.putBoolean("hasAlreadyLaunchedCategoriesDialog", true) } - presenter!!.setupBasicKvStoreFactory { BasicKvStore(this@UploadActivity, it) } presenter!!.checkImageQuality(0) UploadMediaPresenter.isCategoriesDialogShowing = false } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt index 5d721f408..251f868ad 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadPresenter.kt @@ -34,8 +34,7 @@ class UploadPresenter @Inject internal constructor( private val compositeDisposable = CompositeDisposable() - lateinit var basicKvStoreFactory: (String) -> BasicKvStore - + private var basicKvStoreFactory: ((String) -> BasicKvStore)? = null /** * Called by the submit button in [UploadActivity] */ @@ -132,14 +131,38 @@ class UploadPresenter @Inject internal constructor( basicKvStoreFactory = factory } + /** + * Returns the current BasicKvStore factory or throws if not initialized. + * + * @throws IllegalStateException if basicKvStoreFactory has not been initialized. + */ + private fun getBasicKvStoreFactory(): (String) -> BasicKvStore { + return basicKvStoreFactory ?: throw IllegalStateException("basicKvStoreFactory has not been initialized") + } + + /** + * Ensures that the BasicKvStore factory has been initialized before use. + * + * @throws IllegalStateException if the factory is null. + */ + private fun requireFactoryInitialized() { + val field = this::class.java.getDeclaredField("basicKvStoreFactory") + field.isAccessible = true + val value = field.get(this) + if (value == null) { + throw IllegalStateException("basicKvStoreFactory must be initialized before use. Please call setupBasicKvStoreFactory() before using presenter methods that require it.") + } + } + /** * Calls checkImageQuality of UploadMediaPresenter to check image quality of next image * * @param uploadItemIndex Index of next image, whose quality is to be checked */ override fun checkImageQuality(uploadItemIndex: Int) { + requireFactoryInitialized() repository.getUploadItem(uploadItemIndex)?.let { - presenter.setupBasicKvStoreFactory(basicKvStoreFactory) + presenter.setupBasicKvStoreFactory(getBasicKvStoreFactory()) presenter.checkImageQuality(it, uploadItemIndex) } }