Enforce 5-image selection limit with warning dialog on click

This commit is contained in:
Kota-Jagadeesh 2025-10-14 00:05:44 +05:30
parent b8d340fbe8
commit c3bb460ae9

View file

@ -188,55 +188,38 @@ class ImageAdapter(
defaultDispatcher, defaultDispatcher,
uploadingContributionList, uploadingContributionList,
) )
scope.launch { holder.itemView.setOnClickListener {
val sharedPreferences: SharedPreferences = if (!holder.isItemUploaded() && !holder.isItemNotForUpload()) {
context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0) if (selectedImages.size >= 5 && !isSelected) { //enforce the 5-image limit
val showAlreadyActionedImages = Toast.makeText(context, "Cannot select more than 5 images", Toast.LENGTH_SHORT).show()
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) return@setOnClickListener
if (!showAlreadyActionedImages) { }
// If the position is not already visited, that means the position is new then if (isSelected) {
// finds the next actionable image position from all images selectedImages.removeAt(selectedIndex)
if (!alreadyAddedPositions.contains(position)) { holder.itemUnselected()
processThumbnailForActionedImage( notifyItemChanged(position, ImageUnselected())
holder, imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size)
position, } else {
uploadingContributionList selectedImages.add(image)
) holder.itemSelected()
_isLoadingImages.value = false notifyItemChanged(position, ImageSelectedOrUpdated())
// If the position is already visited, that means the image is already present imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size)
// inside map, so it will fetch the image from the map and load in the holder
} else {
val actionableImages: List<Image> = ArrayList(actionableImagesMap.values)
if (actionableImages.size > position) {
image = actionableImages[position]
Glide
.with(holder.image)
.load(image.uri)
.thumbnail(0.3f)
.into(holder.image)
}
} }
// If switch is turned off, it just fetches the image from all images without any
// further operations
} else {
Glide
.with(holder.image)
.load(image.uri)
.thumbnail(0.3f)
.into(holder.image)
} }
} }
holder.itemView.setOnClickListener {
onThumbnailClicked(position, holder)
}
// launch media preview on long click.
holder.itemView.setOnLongClickListener { holder.itemView.setOnLongClickListener {
imageSelectListener.onLongPress(images.indexOf(image), images, selectedImages) imageSelectListener.onLongPress(position, images, ArrayList(selectedImages))
true true
} }
//handle close button click for deselection
holder.closeButton.setOnClickListener {
if (isSelected) {
selectedImages.removeAt(selectedIndex)
holder.itemUnselected()
notifyItemChanged(position, ImageUnselected())
imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size)
}
}
} }
} }
@ -417,7 +400,7 @@ class ImageAdapter(
* Set new selected images * Set new selected images
*/ */
fun setSelectedImages(newSelectedImages: ArrayList<Image>) { fun setSelectedImages(newSelectedImages: ArrayList<Image>) {
selectedImages = ArrayList(newSelectedImages) selectedImages = ArrayList(newSelectedImages.take(5)) // enforce 5-image limit
imageSelectListener.onSelectedImagesChanged(selectedImages, 0) imageSelectListener.onSelectedImagesChanged(selectedImages, 0)
} }
@ -431,7 +414,7 @@ class ImageAdapter(
) { ) {
numberOfSelectedImagesMarkedAsNotForUpload = 0 numberOfSelectedImagesMarkedAsNotForUpload = 0
images.clear() images.clear()
selectedImages = arrayListOf() selectedImages = ArrayList(selectedImages.take(5)) // enforce the 5-image limit
init(newImages, fixedImages, TreeMap(), uploadingImages) init(newImages, fixedImages, TreeMap(), uploadingImages)
notifyDataSetChanged() notifyDataSetChanged()
} }
@ -523,12 +506,14 @@ class ImageAdapter(
private val uploadingGroup: Group = itemView.findViewById(R.id.uploading_group) private val uploadingGroup: Group = itemView.findViewById(R.id.uploading_group)
private val notForUploadGroup: Group = itemView.findViewById(R.id.not_for_upload_group) private val notForUploadGroup: Group = itemView.findViewById(R.id.not_for_upload_group)
private val selectedGroup: Group = itemView.findViewById(R.id.selected_group) private val selectedGroup: Group = itemView.findViewById(R.id.selected_group)
val closeButton: ImageView = itemView.findViewById(R.id.close_button) // Added for close button
/** /**
* Item selected view. * Item selected view.
*/ */
fun itemSelected() { fun itemSelected() {
selectedGroup.visibility = View.VISIBLE selectedGroup.visibility = View.VISIBLE
closeButton.visibility = View.VISIBLE // Show close button when selected
} }
/** /**
@ -536,6 +521,7 @@ class ImageAdapter(
*/ */
fun itemUnselected() { fun itemUnselected() {
selectedGroup.visibility = View.GONE selectedGroup.visibility = View.GONE
closeButton.visibility = View.GONE // Hide close button when unselected
} }
/** /**