From e5c4230f970569a367cd67a50dc09bd0b032bb26 Mon Sep 17 00:00:00 2001 From: Shashank Kumar <126143257+shashankiitbhu@users.noreply.github.com> Date: Sun, 24 Mar 2024 05:09:39 +0530 Subject: [PATCH] Fix - Custom picker sometimes crashing when marking many pictures as "not for upload" towards the bottom (#5639) * fix crash * fix crash --- .../ui/selector/CustomSelectorActivity.kt | 68 +++++++++---------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt index 019dd60ee..7cf0229cb 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt @@ -206,15 +206,15 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL markAsNotForUpload(arrayListOf()) return } - var i = 0 - while (i < selectedImages.size) { - val path = selectedImages[i].path + + val iterator = selectedImages.iterator() + while (iterator.hasNext()) { + val image = iterator.next() + val path = image.path val file = File(path) if (!file.exists()) { - selectedImages.removeAt(i) - i-- + iterator.remove() } - i++ } markAsNotForUpload(selectedImages) toolbarBinding.imageLimitError.visibility = View.INVISIBLE @@ -241,66 +241,64 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL */ private fun insertIntoNotForUpload(images: ArrayList) { scope.launch { - imageFragment!!.showMarkUnmarkProgressDialog( - text= progressDialogText - ) + withContext(Dispatchers.Main) { + imageFragment?.showMarkUnmarkProgressDialog(text = progressDialogText) + } var allImagesAlreadyNotForUpload = true - images.forEach { + images.forEach { image -> val imageSHA1 = CustomSelectorUtils.getImageSHA1( - it.uri, + image.uri, ioDispatcher, fileUtilsWrapper, contentResolver ) val exists = notForUploadStatusDao.find(imageSHA1) - - // If image exists in not for upload table make allImagesAlreadyNotForUpload false if (exists < 1) { allImagesAlreadyNotForUpload = false } } - // if all images is not already marked as not for upload, insert all images in - // not for upload table if (!allImagesAlreadyNotForUpload) { - images.forEach { + // Insert or delete images as necessary, but the UI updates should be posted back to the main thread + images.forEach { image -> val imageSHA1 = CustomSelectorUtils.getImageSHA1( - it.uri, + image.uri, ioDispatcher, fileUtilsWrapper, contentResolver ) - notForUploadStatusDao.insert( - NotForUploadStatus( - imageSHA1 - ) - ) - imageFragment!!.removeImage(it) - + notForUploadStatusDao.insert(NotForUploadStatus(imageSHA1)) + } + withContext(Dispatchers.Main) { + images.forEach { image -> + imageFragment?.removeImage(image) + } + imageFragment?.clearSelectedImages() } - imageFragment!!.clearSelectedImages() - // if all images is already marked as not for upload, delete all images from - // not for upload table } else { - images.forEach { + images.forEach { image -> val imageSHA1 = CustomSelectorUtils.getImageSHA1( - it.uri, + image.uri, ioDispatcher, fileUtilsWrapper, contentResolver ) notForUploadStatusDao.deleteNotForUploadWithImageSHA1(imageSHA1) } - imageFragment!!.refresh() + + withContext(Dispatchers.Main) { + imageFragment?.refresh() + } } - imageFragment!!.dismissMarkUnmarkProgressDialog() - - val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout) - bottomLayout.visibility = View.GONE + withContext(Dispatchers.Main) { + imageFragment?.dismissMarkUnmarkProgressDialog() + val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout) + bottomLayout.visibility = View.GONE + changeTitle(bucketName, 0) + } } - changeTitle(bucketName, 0) } /**