Fix NPE that broke uploads

This commit is contained in:
Paul Hawke 2025-01-10 22:26:40 -06:00
parent b9c2d79fe7
commit 561191cd29
7 changed files with 28 additions and 17 deletions

View file

@ -112,7 +112,7 @@ data class Contribution constructor(
*/
fun formatDescriptions(descriptions: List<UploadMediaDetail>) =
descriptions
.filter { it.descriptionText!!.isNotEmpty() }
.filter { !it.descriptionText.isNullOrEmpty() }
.joinToString(separator = "") { "{{${it.languageCode}|1=${it.descriptionText}}}" }
}

View file

@ -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
}

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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()

View file

@ -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<View?> {
fun setupBasicKvStoreFactory(factory: (String) -> BasicKvStore)
fun receiveImage(
uploadableFile: UploadableFile?,
place: Place?,

View file

@ -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)
}