Fix image deselection issue in ImageAdapter to update UI correctly (#6409)

This commit is contained in:
jagadeesh-18-bot 2025-09-13 17:01:23 +05:30
parent b2341c8d9e
commit 633210dbab

View file

@ -165,13 +165,8 @@ class ImageAdapter(
val selectedIndex: Int = val selectedIndex: Int =
if (showAlreadyActionedImages) { if (showAlreadyActionedImages) {
ImageHelper.getIndex(selectedImages, image) ImageHelper.getIndex(selectedImages, image)
// Getting selected index when switch is off
} else if (actionableImagesMap.size > position) { } else if (actionableImagesMap.size > position) {
ImageHelper ImageHelper.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position])
.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position])
// For any other case return -1
} else { } else {
-1 -1
} }
@ -204,8 +199,6 @@ class ImageAdapter(
uploadingContributionList uploadingContributionList
) )
_isLoadingImages.value = false _isLoadingImages.value = false
// If the position is already visited, that means the image is already present
// inside map, so it will fetch the image from the map and load in the holder
} else { } else {
val actionableImages: List<Image> = ArrayList(actionableImagesMap.values) val actionableImages: List<Image> = ArrayList(actionableImagesMap.values)
if (actionableImages.size > position) { if (actionableImages.size > position) {
@ -217,9 +210,6 @@ class ImageAdapter(
.into(holder.image) .into(holder.image)
} }
} }
// If switch is turned off, it just fetches the image from all images without any
// further operations
} else { } else {
Glide Glide
.with(holder.image) .with(holder.image)
@ -263,10 +253,6 @@ class ImageAdapter(
// finding next actionable image will start from this position // finding next actionable image will start from this position
if (next > -1) { if (next > -1) {
nextImagePosition = next + 1 nextImagePosition = next + 1
// If map doesn't contains the next actionable image, that means it's a
// new actionable image, it will put it to the map as actionable images
// and it will load the new image in the view holder
if (!actionableImagesMap.containsKey(next)) { if (!actionableImagesMap.containsKey(next)) {
actionableImagesMap[next] = allImages[next] actionableImagesMap[next] = allImages[next]
alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder) alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder)
@ -280,9 +266,6 @@ class ImageAdapter(
notifyItemInserted(position) notifyItemInserted(position)
notifyItemRangeChanged(position, itemCount + 1) notifyItemRangeChanged(position, itemCount + 1)
} }
// If next actionable image is not found, that means searching is
// complete till end, and it will stop searching.
} else { } else {
reachedEndOfFolder = true reachedEndOfFolder = true
notifyItemRemoved(position) notifyItemRemoved(position)
@ -296,14 +279,39 @@ class ImageAdapter(
private fun onThumbnailClicked( private fun onThumbnailClicked(
position: Int, position: Int,
holder: ImageViewHolder, holder: ImageViewHolder,
) {
val sharedPreferences: SharedPreferences =
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
val switchState =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
// While switch is turned off, lets user click on image only if the position is
// added inside map
if (!switchState) {
if (actionableImagesMap.size > position) {
selectOrRemoveImage(holder, position)
}
} else {
selectOrRemoveImage(holder, position)
}
}
/**
* Handle click event on an image, update counter on images.
*/
private fun selectOrRemoveImage(
holder: ImageViewHolder,
position: Int,
) { ) {
val sharedPreferences: SharedPreferences = val sharedPreferences: SharedPreferences =
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0) context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0)
val showAlreadyActionedImages = val showAlreadyActionedImages =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
// Single Selection mode // Getting clicked index from all images index when show_already_actioned_images
// switch is on
if (singleSelection) { if (singleSelection) {
// If single selection mode, clear previous selection and select only the new one
if (selectedImages.isNotEmpty() && (selectedImages[0] != images[position])) { if (selectedImages.isNotEmpty() && (selectedImages[0] != images[position])) {
val prevIndex = images.indexOf(selectedImages[0]) val prevIndex = images.indexOf(selectedImages[0])
selectedImages.clear() selectedImages.clear()
@ -323,7 +331,8 @@ class ImageAdapter(
numberOfSelectedImagesMarkedAsNotForUpload-- numberOfSelectedImagesMarkedAsNotForUpload--
} }
notifyItemChanged(position, ImageUnselected()) notifyItemChanged(position, ImageUnselected())
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) // Added this line to notify the activity // Notify listener of deselection to update UI
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
} else { } else {
val image = images[position] val image = images[position]
scope.launch(ioDispatcher) { scope.launch(ioDispatcher) {
@ -349,7 +358,6 @@ class ImageAdapter(
} }
selectedImages.add(image) selectedImages.add(image)
notifyItemChanged(position, ImageSelectedOrUpdated()) notifyItemChanged(position, ImageSelectedOrUpdated())
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload)
} }
} }
@ -431,7 +439,6 @@ class ImageAdapter(
} else { } else {
val iterator = actionableImagesMap.entries.iterator() val iterator = actionableImagesMap.entries.iterator()
var index = 0 var index = 0
while (iterator.hasNext()) { while (iterator.hasNext()) {
val entry = iterator.next() val entry = iterator.next()
if (entry.value == image) { if (entry.value == image) {
@ -459,17 +466,10 @@ class ImageAdapter(
val showAlreadyActionedImages = val showAlreadyActionedImages =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
// While switch is on initializes the holder with all images size
return if (showAlreadyActionedImages) { return if (showAlreadyActionedImages) {
allImages.size allImages.size
// While switch is off and searching for next actionable has ended, initializes the holder
// with size of all actionable images
} else if (actionableImagesMap.size == allImages.size || reachedEndOfFolder) { } else if (actionableImagesMap.size == allImages.size || reachedEndOfFolder) {
actionableImagesMap.size actionableImagesMap.size
// While switch is off, initializes the holder with and extra view holder so that finding
// and addition of the next actionable image in the adapter can be continued
} else { } else {
actionableImagesMap.size + 1 actionableImagesMap.size + 1
} }