Fix #6409: Add listener call in ImageAdapter to update UI and upload button on deselection

This commit is contained in:
jagadeesh-18-bot 2025-09-07 06:44:57 +05:30
parent 730f314200
commit ef0477d98c

View file

@ -10,6 +10,7 @@ import androidx.constraintlayout.widget.Group
import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.contributions.Contribution import fr.free.nrw.commons.contributions.Contribution
@ -165,13 +166,9 @@ 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 +201,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) {
@ -214,17 +209,16 @@ class ImageAdapter(
.with(holder.image) .with(holder.image)
.load(image.uri) .load(image.uri)
.thumbnail(0.3f) .thumbnail(0.3f)
.apply(RequestOptions().override(300, 300)) // Downscale to 300x300
.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)
.load(image.uri) .load(image.uri)
.thumbnail(0.3f) .thumbnail(0.3f)
.apply(RequestOptions().override(300, 300)) // Downscale to 300x300
.into(holder.image) .into(holder.image)
} }
} }
@ -276,13 +270,11 @@ class ImageAdapter(
.with(holder.image) .with(holder.image)
.load(allImages[next].uri) .load(allImages[next].uri)
.thumbnail(0.3f) .thumbnail(0.3f)
.apply(RequestOptions().override(300, 300)) // Downscale to 300x300
.into(holder.image) .into(holder.image)
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,39 +288,14 @@ 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)
// Getting clicked index from all images index when show_already_actioned_images // Single Selection mode
// 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()
@ -348,6 +315,7 @@ class ImageAdapter(
numberOfSelectedImagesMarkedAsNotForUpload-- numberOfSelectedImagesMarkedAsNotForUpload--
} }
notifyItemChanged(position, ImageUnselected()) notifyItemChanged(position, ImageUnselected())
imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) // Added this line to notify the activity
} else { } else {
val image = images[position] val image = images[position]
scope.launch(ioDispatcher) { scope.launch(ioDispatcher) {
@ -474,8 +442,6 @@ class ImageAdapter(
/** /**
* Returns the total number of items in the data set held by the adapter. * Returns the total number of items in the data set held by the adapter.
*
* @return The total number of items in this adapter.
*/ */
override fun getItemCount(): Int { override fun getItemCount(): Int {
val sharedPreferences: SharedPreferences = val sharedPreferences: SharedPreferences =
@ -483,17 +449,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
} }
@ -611,7 +570,6 @@ class ImageAdapter(
/** /**
* Called by the DiffUtil when it wants to check whether two items have the same data. * Called by the DiffUtil when it wants to check whether two items have the same data.
* DiffUtil uses this information to detect if the contents of an item has changed.
*/ */
override fun areContentsTheSame( override fun areContentsTheSame(
oldItemPosition: Int, oldItemPosition: Int,
@ -632,4 +590,4 @@ class ImageAdapter(
fun setSingleSelection(single: Boolean) { fun setSingleSelection(single: Boolean) {
singleSelection = single singleSelection = single
} }
} }