From 561191cd2988e05b19ba7ec972b91d2d34bff825 Mon Sep 17 00:00:00 2001 From: Paul Hawke Date: Fri, 10 Jan 2025 22:26:40 -0600 Subject: [PATCH] Fix NPE that broke uploads --- .../nrw/commons/contributions/Contribution.kt | 2 +- .../free/nrw/commons/upload/UploadActivity.kt | 1 + .../free/nrw/commons/upload/UploadContract.kt | 3 +++ .../nrw/commons/upload/UploadPresenter.kt | 8 +++++++ .../mediaDetails/UploadMediaDetailFragment.kt | 5 ++--- .../UploadMediaDetailsContract.kt | 4 ++-- .../mediaDetails/UploadMediaPresenter.kt | 22 +++++++++---------- 7 files changed, 28 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt index a553d980e..92fab56af 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt @@ -112,7 +112,7 @@ data class Contribution constructor( */ fun formatDescriptions(descriptions: List) = descriptions - .filter { it.descriptionText!!.isNotEmpty() } + .filter { !it.descriptionText.isNullOrEmpty() } .joinToString(separator = "") { "{{${it.languageCode}|1=${it.descriptionText}}}" } } 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 5fdcc4301..1ae7150e6 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 @@ -836,6 +836,7 @@ 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/UploadContract.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadContract.kt index 04ab02b8e..43adc7f79 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadContract.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadContract.kt @@ -2,6 +2,7 @@ package fr.free.nrw.commons.upload import fr.free.nrw.commons.BasePresenter import fr.free.nrw.commons.filepicker.UploadableFile +import fr.free.nrw.commons.kvstore.BasicKvStore /** * The contract using which the UplaodActivity would communicate with its presenter @@ -73,5 +74,7 @@ interface UploadContract { * @param uploadItemIndex Index of next image, whose quality is to be checked */ fun checkImageQuality(uploadItemIndex: Int) + + fun setupBasicKvStoreFactory(factory: (String) -> BasicKvStore) } } 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 a2f10ddcd..9ee8fb483 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 @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import fr.free.nrw.commons.CommonsApplication.Companion.IS_LIMITED_CONNECTION_MODE_ENABLED import fr.free.nrw.commons.R import fr.free.nrw.commons.contributions.Contribution +import fr.free.nrw.commons.kvstore.BasicKvStore import fr.free.nrw.commons.kvstore.JsonKvStore import fr.free.nrw.commons.repository.UploadRepository import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailsContract @@ -33,6 +34,8 @@ class UploadPresenter @Inject internal constructor( private val compositeDisposable = CompositeDisposable() + lateinit var basicKvStoreFactory: (String) -> BasicKvStore + /** * Called by the submit button in [UploadActivity] */ @@ -125,6 +128,10 @@ class UploadPresenter @Inject internal constructor( } } + override fun setupBasicKvStoreFactory(factory: (String) -> BasicKvStore) { + basicKvStoreFactory = factory + } + /** * Calls checkImageQuality of UploadMediaPresenter to check image quality of next image * @@ -132,6 +139,7 @@ class UploadPresenter @Inject internal constructor( */ override fun checkImageQuality(uploadItemIndex: Int) { repository.getUploadItem(uploadItemIndex)?.let { + presenter.setupBasicKvStoreFactory(basicKvStoreFactory) presenter.checkImageQuality(it, uploadItemIndex) } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt index 173805f33..92a46b92a 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.kt @@ -197,6 +197,8 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra ) } presenter.onAttachView(this) + presenter.setupBasicKvStoreFactory { BasicKvStore(requireActivity(), it) } + presenter.receiveImage(uploadableFile, place, inAppPictureLocation) initRecyclerView() @@ -801,9 +803,6 @@ class UploadMediaDetailFragment : UploadBaseFragment(), UploadMediaDetailsContra ) } - override fun createBasicKvStore(storeName: String): BasicKvStore = - BasicKvStore(requireActivity(), storeName) - override fun showBadImagePopup(errorCode: Int, index: Int, uploadItem: UploadItem) { //If the error message is null, we will probably not show anything val activity = requireActivity() diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.kt index 33262d4f1..c368b96ac 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailsContract.kt @@ -51,12 +51,12 @@ interface UploadMediaDetailsContract { fun displayAddLocationDialog(runnable: Runnable) - fun createBasicKvStore(storeName: String): BasicKvStore - fun showBadImagePopup(errorCode: Int, index: Int, uploadItem: UploadItem) } interface UserActionListener : BasePresenter { + fun setupBasicKvStoreFactory(factory: (String) -> BasicKvStore) + fun receiveImage( uploadableFile: UploadableFile?, place: Place?, diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt index dd101e3cf..55cead370 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaPresenter.kt @@ -16,12 +16,10 @@ import fr.free.nrw.commons.upload.UploadActivity.Companion.setUploadIsOfAPlace import fr.free.nrw.commons.upload.UploadItem import fr.free.nrw.commons.upload.UploadMediaDetail import fr.free.nrw.commons.upload.mediaDetails.UploadMediaDetailFragment.UploadMediaDetailFragmentCallback -import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog import fr.free.nrw.commons.utils.ImageUtils.EMPTY_CAPTION import fr.free.nrw.commons.utils.ImageUtils.FILE_NAME_EXISTS import fr.free.nrw.commons.utils.ImageUtils.IMAGE_KEEP import fr.free.nrw.commons.utils.ImageUtils.IMAGE_OK -import fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult import io.github.coordinates2country.Coordinates2Country import io.reactivex.Maybe import io.reactivex.Scheduler @@ -53,6 +51,7 @@ class UploadMediaPresenter @Inject constructor( } } } + lateinit var basicKvStoreFactory: (String) -> BasicKvStore override fun onAttachView(view: UploadMediaDetailsContract.View) { this.view = view @@ -73,6 +72,10 @@ class UploadMediaPresenter @Inject constructor( repository.getUploads()[uploadItemIndex].uploadMediaDetails = uploadMediaDetails.toMutableList() } + override fun setupBasicKvStoreFactory(factory: (String) -> BasicKvStore) { + basicKvStoreFactory = factory + } + /** * Receives the corresponding uploadable file, processes it and return the view with and uplaod item */ @@ -336,10 +339,8 @@ class UploadMediaPresenter @Inject constructor( */ override fun checkImageQuality(uploadItem: UploadItem, index: Int) { if ((uploadItem.imageQuality != IMAGE_OK) && (uploadItem.imageQuality != IMAGE_KEEP)) { - val store = view.createBasicKvStore( - UploadActivity.storeNameForCurrentUploadImagesSize - ) - val value = store.getString(UPLOAD_QUALITIES_KEY, null) + val value = basicKvStoreFactory(UploadActivity.storeNameForCurrentUploadImagesSize) + .getString(UPLOAD_QUALITIES_KEY, null) try { val imageQuality = value.asJsonObject()["UploadItem$index"] as Int view.showProgress(false) @@ -362,10 +363,8 @@ class UploadMediaPresenter @Inject constructor( * @param index Index of the UploadItem which was deleted */ override fun updateImageQualitiesJSON(size: Int, index: Int) { - val store = view.createBasicKvStore( - UploadActivity.storeNameForCurrentUploadImagesSize - ) - val value = store.getString(UPLOAD_QUALITIES_KEY, null) + val value = basicKvStoreFactory(UploadActivity.storeNameForCurrentUploadImagesSize) + .getString(UPLOAD_QUALITIES_KEY, null) try { val jsonObject = value.asJsonObject().apply { for (i in index until (size - 1)) { @@ -373,7 +372,8 @@ class UploadMediaPresenter @Inject constructor( } remove("UploadItem" + (size - 1)) } - store.putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) + basicKvStoreFactory(UploadActivity.storeNameForCurrentUploadImagesSize) + .putString(UPLOAD_QUALITIES_KEY, jsonObject.toString()) } catch (e: Exception) { Timber.e(e) }