Skip to content

Commit 78d29bc

Browse files
authored
FIX : Custom picker detect images that is already in commons (#6288)
* Fix: Exclude specific text from being posted in WikidataFeedback * Add detection logic for images already on Commons in custom picker
1 parent 1a13cb3 commit 78d29bc

File tree

3 files changed

+34
-39
lines changed

3 files changed

+34
-39
lines changed

app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt

+21-29
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import kotlinx.coroutines.MainScope
2626
import kotlinx.coroutines.cancel
2727
import kotlinx.coroutines.flow.MutableStateFlow
2828
import kotlinx.coroutines.launch
29+
import kotlinx.coroutines.withContext
2930
import java.util.TreeMap
3031
import kotlin.collections.ArrayList
3132

@@ -342,45 +343,36 @@ class ImageAdapter(
342343
numberOfSelectedImagesMarkedAsNotForUpload--
343344
}
344345
notifyItemChanged(position, ImageUnselected())
345-
346-
// Getting index from all images index when switch is on
347-
val indexes =
348-
if (showAlreadyActionedImages) {
349-
ImageHelper.getIndexList(selectedImages, images)
350-
351-
// Getting index from actionable images when switch is off
352-
} else {
353-
ImageHelper.getIndexList(selectedImages, ArrayList(actionableImagesMap.values))
354-
}
355-
for (index in indexes) {
356-
notifyItemChanged(index, ImageSelectedOrUpdated())
357-
}
358346
} else {
347+
val image = images[position]
348+
scope.launch(ioDispatcher) {
349+
val imageSHA1 = imageLoader.getSHA1(image, defaultDispatcher)
350+
withContext(Dispatchers.Main) {
359351
if (holder.isItemUploaded()) {
360352
Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show()
361-
} else {
362-
if (holder.isItemNotForUpload()) {
363-
numberOfSelectedImagesMarkedAsNotForUpload++
364-
}
353+
return@withContext
354+
}
365355

366-
// Getting index from all images index when switch is on
367-
val indexes: ArrayList<Int> =
368-
if (showAlreadyActionedImages) {
369-
selectedImages.add(images[position])
370-
ImageHelper.getIndexList(selectedImages, images)
356+
if (imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) {
357+
holder.itemUploaded()
358+
Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show()
359+
return@withContext
360+
}
371361

372-
// Getting index from actionable images when switch is off
373-
} else {
374-
selectedImages.add(ArrayList(actionableImagesMap.values)[position])
375-
ImageHelper.getIndexList(selectedImages, ArrayList(actionableImagesMap.values))
362+
if (!holder.isItemUploaded() && imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) {
363+
Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show()
376364
}
377365

378-
for (index in indexes) {
379-
notifyItemChanged(index, ImageSelectedOrUpdated())
366+
if (holder.isItemNotForUpload()) {
367+
numberOfSelectedImagesMarkedAsNotForUpload++
368+
}
369+
selectedImages.add(image)
370+
notifyItemChanged(position, ImageSelectedOrUpdated())
371+
372+
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
380373
}
381374
}
382375
}
383-
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
384376
}
385377

386378
/**

app/src/main/java/fr/free/nrw/commons/customselector/ui/selector/CustomSelectorActivity.kt

+12-9
Original file line numberDiff line numberDiff line change
@@ -638,17 +638,20 @@ class CustomSelectorActivity :
638638
finishPickImages(arrayListOf())
639639
return
640640
}
641-
var i = 0
642-
while (i < selectedImages.size) {
643-
val path = selectedImages[i].path
644-
val file = File(path)
645-
if (!file.exists()) {
646-
selectedImages.removeAt(i)
647-
i--
641+
scope.launch(ioDispatcher) {
642+
val uniqueImages = selectedImages.distinctBy { image ->
643+
CustomSelectorUtils.getImageSHA1(
644+
image.uri,
645+
ioDispatcher,
646+
fileUtilsWrapper,
647+
contentResolver
648+
)
649+
}
650+
651+
withContext(Dispatchers.Main) {
652+
finishPickImages(ArrayList(uniqueImages))
648653
}
649-
i++
650654
}
651-
finishPickImages(selectedImages)
652655
}
653656

654657
/**

app/src/main/java/fr/free/nrw/commons/nearby/WikidataFeedback.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,4 @@ class WikidataFeedback : BaseActivity() {
103103
onBackPressed()
104104
return true
105105
}
106-
}
106+
}

0 commit comments

Comments
 (0)