From c3bb460ae9ef4655ae8022587a7dbad68fbbca51 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Tue, 14 Oct 2025 00:05:44 +0530 Subject: [PATCH 01/15] Enforce 5-image selection limit with warning dialog on click --- .../customselector/ui/adapter/ImageAdapter.kt | 74 ++++++++----------- 1 file changed, 30 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index c3ef4a7848..8de605766d 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -188,55 +188,38 @@ class ImageAdapter( defaultDispatcher, uploadingContributionList, ) - scope.launch { - val sharedPreferences: SharedPreferences = - context.getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, 0) - val showAlreadyActionedImages = - sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) - if (!showAlreadyActionedImages) { - // If the position is not already visited, that means the position is new then - // finds the next actionable image position from all images - if (!alreadyAddedPositions.contains(position)) { - processThumbnailForActionedImage( - holder, - position, - uploadingContributionList - ) - _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 + holder.itemView.setOnClickListener { + if (!holder.isItemUploaded() && !holder.isItemNotForUpload()) { + if (selectedImages.size >= 5 && !isSelected) { //enforce the 5-image limit + Toast.makeText(context, "Cannot select more than 5 images", Toast.LENGTH_SHORT).show() + return@setOnClickListener + } + if (isSelected) { + selectedImages.removeAt(selectedIndex) + holder.itemUnselected() + notifyItemChanged(position, ImageUnselected()) + imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size) } else { - val actionableImages: List = ArrayList(actionableImagesMap.values) - if (actionableImages.size > position) { - image = actionableImages[position] - Glide - .with(holder.image) - .load(image.uri) - .thumbnail(0.3f) - .into(holder.image) - } + selectedImages.add(image) + holder.itemSelected() + notifyItemChanged(position, ImageSelectedOrUpdated()) + imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size) } - - // 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 { - imageSelectListener.onLongPress(images.indexOf(image), images, selectedImages) + imageSelectListener.onLongPress(position, images, ArrayList(selectedImages)) 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 */ fun setSelectedImages(newSelectedImages: ArrayList) { - selectedImages = ArrayList(newSelectedImages) + selectedImages = ArrayList(newSelectedImages.take(5)) // enforce 5-image limit imageSelectListener.onSelectedImagesChanged(selectedImages, 0) } @@ -431,7 +414,7 @@ class ImageAdapter( ) { numberOfSelectedImagesMarkedAsNotForUpload = 0 images.clear() - selectedImages = arrayListOf() + selectedImages = ArrayList(selectedImages.take(5)) // enforce the 5-image limit init(newImages, fixedImages, TreeMap(), uploadingImages) notifyDataSetChanged() } @@ -523,12 +506,14 @@ class ImageAdapter( private val uploadingGroup: Group = itemView.findViewById(R.id.uploading_group) private val notForUploadGroup: Group = itemView.findViewById(R.id.not_for_upload_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. */ fun itemSelected() { selectedGroup.visibility = View.VISIBLE + closeButton.visibility = View.VISIBLE // Show close button when selected } /** @@ -536,6 +521,7 @@ class ImageAdapter( */ fun itemUnselected() { selectedGroup.visibility = View.GONE + closeButton.visibility = View.GONE // Hide close button when unselected } /** From 6edcab654ae2ca603f2177dc61a04c14ec126845 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Tue, 14 Oct 2025 00:06:13 +0530 Subject: [PATCH 02/15] Set selection limit to 5 images and add warning for exceeding limit --- .../customselector/ui/selector/CustomSelectorActivity.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 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 2534b4aeb4..9fbba896d9 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 @@ -107,7 +107,7 @@ class CustomSelectorActivity : /** * Maximum number of images that can be selected. */ - private var uploadLimit: Int = 20 + private var uploadLimit: Int = 5 // Changed to 5 asper the issue #3101 /** * Flag that is marked true when the amount @@ -650,8 +650,12 @@ class CustomSelectorActivity : finishPickImages(arrayListOf()) return } + if (selectedImages.size > uploadLimit) { + displayUploadLimitWarning() // shows the warning dialog if >5 images + return + } scope.launch(ioDispatcher) { - val uniqueImages = selectedImages.distinctBy { image -> + val uniqueImages = selectedImages.take(uploadLimit).distinctBy { image -> //enforce limit CustomSelectorUtils.getImageSHA1( image.uri, ioDispatcher, From d918b848e8ddf46d8e0b9e7ac1f6b7ef2376ae0b Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Tue, 14 Oct 2025 00:18:56 +0530 Subject: [PATCH 03/15] Enforced 5-image limit for selection and upload, added close button, updated warning dialog strings, and ensured thumbnail bar consistency --- .../free/nrw/commons/upload/ThumbnailsAdapter.kt | 2 +- .../fr/free/nrw/commons/upload/UploadActivity.kt | 7 +++++-- .../res/layout/item_custom_selector_image.xml | 15 ++++++++++++--- app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt index d467f9bf63..2cc8603be0 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt @@ -23,7 +23,7 @@ internal class ThumbnailsAdapter(private val callback: Callback) : var onThumbnailDeletedListener: OnThumbnailDeletedListener? = null var uploadableFiles: List = emptyList() set(value) { - field = value + field = value.take(5) //enforce 5-image limit notifyDataSetChanged() } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index c2bed5fff9..4b2c720576 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -735,8 +735,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C intent.getParcelableArrayListExtra(EXTRA_FILES) } - // Convert to mutable list or return empty list if null - files?.toMutableList() ?: run { + // Convert to mutable list,takes up to 5 files, or return empty list if null + files?.toMutableList()?.take(5)?.toMutableList() ?: run { //enforce 5-image limit Timber.w("Files array was null") mutableListOf() } @@ -753,6 +753,9 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C Timber.d("File $index path: ${file.getFilePath()}") } + //update thumbnails adapter with limited files + thumbnailsAdapter?.uploadableFiles = uploadableFiles + // Handle other extras with null safety place = try { if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) { diff --git a/app/src/main/res/layout/item_custom_selector_image.xml b/app/src/main/res/layout/item_custom_selector_image.xml index d7b8611d75..8b37389f77 100644 --- a/app/src/main/res/layout/item_custom_selector_image.xml +++ b/app/src/main/res/layout/item_custom_selector_image.xml @@ -1,4 +1,3 @@ - + - + app:constraint_referenced_ids="selected_overlay,selected_image,close_button"/> Created and uploaded by: %1$s Created by %1$s and uploaded by %2$s Nominated for Deletion + + You can only select up to 5 images. From 82cb5db14483808c9fe9cb4a2882d826b39357a6 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Tue, 14 Oct 2025 18:05:03 +0530 Subject: [PATCH 04/15] Added 20-img limit --- .../nrw/commons/customselector/ui/adapter/ImageAdapter.kt | 6 +++--- .../customselector/ui/selector/CustomSelectorActivity.kt | 4 ++-- .../java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt | 2 +- .../main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 4 ++-- app/src/main/res/values/strings.xml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index 8de605766d..f96bcde104 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -190,8 +190,8 @@ class ImageAdapter( ) holder.itemView.setOnClickListener { if (!holder.isItemUploaded() && !holder.isItemNotForUpload()) { - if (selectedImages.size >= 5 && !isSelected) { //enforce the 5-image limit - Toast.makeText(context, "Cannot select more than 5 images", Toast.LENGTH_SHORT).show() + if (selectedImages.size >= 20 && !isSelected) { //enforce the 20-image limit + Toast.makeText(context, "Cannot select more than 20 images", Toast.LENGTH_SHORT).show() return@setOnClickListener } if (isSelected) { @@ -400,7 +400,7 @@ class ImageAdapter( * Set new selected images */ fun setSelectedImages(newSelectedImages: ArrayList) { - selectedImages = ArrayList(newSelectedImages.take(5)) // enforce 5-image limit + selectedImages = ArrayList(newSelectedImages.take(20)) // enforce 20-image limit imageSelectListener.onSelectedImagesChanged(selectedImages, 0) } 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 9fbba896d9..cc737063c6 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 @@ -107,7 +107,7 @@ class CustomSelectorActivity : /** * Maximum number of images that can be selected. */ - private var uploadLimit: Int = 5 // Changed to 5 asper the issue #3101 + private var uploadLimit: Int = 20 // changed to 20 asper the issue #3101 /** * Flag that is marked true when the amount @@ -651,7 +651,7 @@ class CustomSelectorActivity : return } if (selectedImages.size > uploadLimit) { - displayUploadLimitWarning() // shows the warning dialog if >5 images + displayUploadLimitWarning() // shows the warning dialog if >20 images return } scope.launch(ioDispatcher) { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt index 2cc8603be0..b5156b7229 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt @@ -23,7 +23,7 @@ internal class ThumbnailsAdapter(private val callback: Callback) : var onThumbnailDeletedListener: OnThumbnailDeletedListener? = null var uploadableFiles: List = emptyList() set(value) { - field = value.take(5) //enforce 5-image limit + field = value.take(20) //enforce 20-image limit notifyDataSetChanged() } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 4b2c720576..0984d646eb 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -735,8 +735,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C intent.getParcelableArrayListExtra(EXTRA_FILES) } - // Convert to mutable list,takes up to 5 files, or return empty list if null - files?.toMutableList()?.take(5)?.toMutableList() ?: run { //enforce 5-image limit + // Convert to mutable list,takes up to 20 files, or return empty list if null + files?.toMutableList()?.take(20)?.toMutableList() ?: run { //enforce 20-image limit Timber.w("Files array was null") mutableListOf() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 629b0dd79b..c47e74a5ac 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -888,5 +888,5 @@ Upload your first media by tapping on the add button. Created by %1$s and uploaded by %2$s Nominated for Deletion - You can only select up to 5 images. + You can only select up to 20 images. From 38b10106f83459ee8adc3de62da4940644bd5d5e Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 20 Oct 2025 14:57:13 +0530 Subject: [PATCH 05/15] Fix:define the maximum number of images allowed for selection --- .../nrw/commons/customselector/helper/CustomSelectorConstants.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/helper/CustomSelectorConstants.kt b/app/src/main/java/fr/free/nrw/commons/customselector/helper/CustomSelectorConstants.kt index e03b4da3c9..3df1e22657 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/helper/CustomSelectorConstants.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/helper/CustomSelectorConstants.kt @@ -10,4 +10,5 @@ object CustomSelectorConstants { const val NEW_SELECTED_IMAGES = "new_selected_images" const val SHOULD_REFRESH = "should_refresh" const val FULL_SCREEN_MODE_FIRST_LUNCH = "full_screen_mode_first_launch" + const val MAX_IMAGE_COUNT = 20 } From 24e6ac73187ff3ba37cde8ace5b4d7934465b987 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 20 Oct 2025 14:59:12 +0530 Subject: [PATCH 06/15] Fix:initialize the adapter's limit from the constant --- .../nrw/commons/customselector/ui/adapter/ImageAdapter.kt | 5 +++-- .../customselector/ui/selector/CustomSelectorActivity.kt | 5 +++-- .../java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt | 3 ++- .../main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index f96bcde104..3834b8016e 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -16,6 +16,7 @@ import fr.free.nrw.commons.contributions.Contribution import fr.free.nrw.commons.customselector.helper.ImageHelper import fr.free.nrw.commons.customselector.helper.ImageHelper.CUSTOM_SELECTOR_PREFERENCE_KEY import fr.free.nrw.commons.customselector.helper.ImageHelper.SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY +import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.customselector.listeners.ImageSelectListener import fr.free.nrw.commons.customselector.model.Image import fr.free.nrw.commons.customselector.ui.selector.ImageLoader @@ -190,7 +191,7 @@ class ImageAdapter( ) holder.itemView.setOnClickListener { if (!holder.isItemUploaded() && !holder.isItemNotForUpload()) { - if (selectedImages.size >= 20 && !isSelected) { //enforce the 20-image limit + if (selectedImages.size >= MAX_IMAGE_COUNT && !isSelected) { //enforce the 20-image limit Toast.makeText(context, "Cannot select more than 20 images", Toast.LENGTH_SHORT).show() return@setOnClickListener } @@ -400,7 +401,7 @@ class ImageAdapter( * Set new selected images */ fun setSelectedImages(newSelectedImages: ArrayList) { - selectedImages = ArrayList(newSelectedImages.take(20)) // enforce 20-image limit + selectedImages = ArrayList(newSelectedImages.take(MAX_IMAGE_COUNT)) // enforce 20-image limit imageSelectListener.onSelectedImagesChanged(selectedImages, 0) } 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 cc737063c6..576604d5dd 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 @@ -47,6 +47,7 @@ import fr.free.nrw.commons.customselector.database.NotForUploadStatus import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants import fr.free.nrw.commons.customselector.helper.FolderDeletionHelper +import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.customselector.listeners.FolderClickListener import fr.free.nrw.commons.customselector.listeners.ImageSelectListener import fr.free.nrw.commons.customselector.model.Image @@ -107,7 +108,7 @@ class CustomSelectorActivity : /** * Maximum number of images that can be selected. */ - private var uploadLimit: Int = 20 // changed to 20 asper the issue #3101 + private var uploadLimit: Int = MAX_IMAGE_COUNT // changed to 20 asper the issue #3101 /** * Flag that is marked true when the amount @@ -214,7 +215,7 @@ class CustomSelectorActivity : ) // Check for single selection extra - uploadLimit = if (intent.getBooleanExtra(EXTRA_SINGLE_SELECTION, false)) 1 else 20 + uploadLimit = if (intent.getBooleanExtra(EXTRA_SINGLE_SELECTION, false)) 1 else MAX_IMAGE_COUNT setupViews() diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt index b5156b7229..eda653afc0 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt @@ -10,6 +10,7 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.facebook.drawee.view.SimpleDraweeView import fr.free.nrw.commons.R +import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.databinding.ItemUploadThumbnailBinding import fr.free.nrw.commons.filepicker.UploadableFile import java.io.File @@ -23,7 +24,7 @@ internal class ThumbnailsAdapter(private val callback: Callback) : var onThumbnailDeletedListener: OnThumbnailDeletedListener? = null var uploadableFiles: List = emptyList() set(value) { - field = value.take(20) //enforce 20-image limit + field = value.take(MAX_IMAGE_COUNT) //enforce 20-image limit notifyDataSetChanged() } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 8c55ed5564..1f18372320 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -27,6 +27,7 @@ import fr.free.nrw.commons.R import fr.free.nrw.commons.auth.LoginActivity import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.contributions.ContributionController +import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.databinding.ActivityUploadBinding import fr.free.nrw.commons.filepicker.Constants.RequestCodes import fr.free.nrw.commons.filepicker.UploadableFile @@ -735,7 +736,7 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C } // Convert to mutable list,takes up to 20 files, or return empty list if null - files?.toMutableList()?.take(20)?.toMutableList() ?: run { //enforce 20-image limit + files?.toMutableList()?.take(MAX_IMAGE_COUNT)?.toMutableList() ?: run { //enforce 20-image limit Timber.w("Files array was null") mutableListOf() } From f5fa479783fc7260aceb128450645d260397a7cf Mon Sep 17 00:00:00 2001 From: Nicolas Raoul Date: Sat, 15 Nov 2025 22:03:13 +0900 Subject: [PATCH 07/15] Remove duplicate import statement for MAX_IMAGE_COUNT Removed duplicate import of MAX_IMAGE_COUNT. --- .../free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index 34445a1b1d..d363f2be88 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -18,7 +18,6 @@ import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMA import fr.free.nrw.commons.customselector.helper.ImageHelper import fr.free.nrw.commons.customselector.helper.ImageHelper.CUSTOM_SELECTOR_PREFERENCE_KEY import fr.free.nrw.commons.customselector.helper.ImageHelper.SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY -import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.customselector.listeners.ImageSelectListener import fr.free.nrw.commons.customselector.model.Image import fr.free.nrw.commons.customselector.ui.selector.ImageLoader @@ -651,4 +650,4 @@ class ImageAdapter( fun setSingleSelection(single: Boolean) { singleSelection = single } -} \ No newline at end of file +} From efabeb9190bb082e668560dd5ac8bdc2d5663b16 Mon Sep 17 00:00:00 2001 From: Nicolas Raoul Date: Sat, 15 Nov 2025 22:04:10 +0900 Subject: [PATCH 08/15] Remove duplicate import of MAX_IMAGE_COUNT Removed duplicate import of MAX_IMAGE_COUNT. --- .../commons/customselector/ui/selector/CustomSelectorActivity.kt | 1 - 1 file changed, 1 deletion(-) 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 9ddb1de9ef..e3ad918f5a 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 @@ -48,7 +48,6 @@ import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.customselector.helper.FolderDeletionHelper -import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.customselector.listeners.FolderClickListener import fr.free.nrw.commons.customselector.listeners.ImageSelectListener import fr.free.nrw.commons.customselector.model.Image From 6421d9486c607b2b187c8c8b439bed433c38bea7 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 17 Nov 2025 23:45:54 +0530 Subject: [PATCH 09/15] Set max upload limit to 20 on adapter initialization and improve selected images handling --- .../ui/selector/CustomSelectorActivity.kt | 12 ++++-------- 1 file changed, 4 insertions(+), 8 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 e3ad918f5a..6d65d82d9e 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 @@ -108,7 +108,7 @@ class CustomSelectorActivity : /** * Maximum number of images that can be selected. */ - private var uploadLimit: Int = MAX_IMAGE_COUNT // changed to 20 asper the issue #3101 + private var uploadLimit: Int = MAX_IMAGE_COUNT /** * Flag that is marked true when the amount @@ -522,7 +522,7 @@ class CustomSelectorActivity : val folder = File(folderPath) supportFragmentManager.popBackStack(null, - androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE) + androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE) //refresh MediaStore for the deleted folder path to ensure metadata updates FolderDeletionHelper.refreshMediaStore(this, folder) @@ -595,7 +595,7 @@ class CustomSelectorActivity : bottomSheetBinding.upload.text = resources.getString(R.string.upload) } - if (uploadLimitExceeded || selectedNotForUploadImages > 0) { + if (selectedNotForUploadImages > 0) { bottomSheetBinding.upload.isEnabled = false bottomSheetBinding.upload.alpha = 0.5f } else { @@ -651,12 +651,8 @@ class CustomSelectorActivity : finishPickImages(arrayListOf()) return } - if (selectedImages.size > uploadLimit) { - displayUploadLimitWarning() // shows the warning dialog if >20 images - return - } scope.launch(ioDispatcher) { - val uniqueImages = selectedImages.take(uploadLimit).distinctBy { image -> //enforce limit + val uniqueImages = selectedImages.take(uploadLimit).distinctBy { image -> CustomSelectorUtils.getImageSHA1( image.uri, ioDispatcher, From 9df1f38b51c4493db64ef02cef8da41757ae0809 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 17 Nov 2025 23:46:26 +0530 Subject: [PATCH 10/15] Improve thumbnail selection visual feedback and make cross button behavior consistent --- .../main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt index eda653afc0..d467f9bf63 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/ThumbnailsAdapter.kt @@ -10,7 +10,6 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.facebook.drawee.view.SimpleDraweeView import fr.free.nrw.commons.R -import fr.free.nrw.commons.customselector.helper.CustomSelectorConstants.MAX_IMAGE_COUNT import fr.free.nrw.commons.databinding.ItemUploadThumbnailBinding import fr.free.nrw.commons.filepicker.UploadableFile import java.io.File @@ -24,7 +23,7 @@ internal class ThumbnailsAdapter(private val callback: Callback) : var onThumbnailDeletedListener: OnThumbnailDeletedListener? = null var uploadableFiles: List = emptyList() set(value) { - field = value.take(MAX_IMAGE_COUNT) //enforce 20-image limit + field = value notifyDataSetChanged() } From 03dac945e87c7fcded38ecba0c73ae4b6bb6fcaa Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 17 Nov 2025 23:50:24 +0530 Subject: [PATCH 11/15] Fix:Ensure reliable 20-image limit toast in Custom Selector --- .../customselector/ui/adapter/ImageAdapter.kt | 250 +++++++++--------- 1 file changed, 118 insertions(+), 132 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt index d363f2be88..9913baccd2 100644 --- a/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/customselector/ui/adapter/ImageAdapter.kt @@ -11,6 +11,7 @@ import androidx.constraintlayout.widget.Group import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import fr.free.nrw.commons.R import fr.free.nrw.commons.contributions.Contribution @@ -203,22 +204,9 @@ class ImageAdapter( uploadingContributionList, ) holder.itemView.setOnClickListener { - if (!holder.isItemUploaded() && !holder.isItemNotForUpload()) { - if (selectedImages.size >= MAX_IMAGE_COUNT && !isSelected) { //enforce the 20-image limit - Toast.makeText(context, "Cannot select more than 20 images", Toast.LENGTH_SHORT).show() - return@setOnClickListener - } - if (isSelected) { - selectedImages.removeAt(selectedIndex) - holder.itemUnselected() - notifyItemChanged(position, ImageUnselected()) - imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size) - } else { - selectedImages.add(image) - holder.itemSelected() - notifyItemChanged(position, ImageSelectedOrUpdated()) - imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size) - } + //we just prevent auto-selection, but the user can still tap to select/unmark + if (!holder.isItemUploaded()) { + onThumbnailClicked(position, holder) } } holder.itemView.setOnLongClickListener { @@ -234,56 +222,25 @@ class ImageAdapter( imageSelectListener.onSelectedImagesChanged(selectedImages, selectedImages.size) } } - } - } - /** - * Process thumbnail for actioned image - */ - suspend fun processThumbnailForActionedImage( - holder: ImageViewHolder, - position: Int, - uploadingContributionList: List, - ) { - _isLoadingImages.value = true - val next = - imageLoader.nextActionableImage( - allImages, - ioDispatcher, - defaultDispatcher, - nextImagePosition, - uploadingContributionList, - ) - - // If next actionable image is found, saves it, as the the search for - // finding next actionable image will start from this position - if (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)) { - actionableImagesMap[next] = allImages[next] - alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder) - imagePositionAsPerIncreasingOrder++ - _currentImagesCount.value = imagePositionAsPerIncreasingOrder - Glide - .with(holder.image) - .load(allImages[next].uri) - .thumbnail(0.3f) - .into(holder.image) - notifyItemInserted(position) - notifyItemRangeChanged(position, itemCount + 1) + //lazy loading for the actionable images + if (!showAlreadyActionedImages && position == actionableImagesMap.size && !reachedEndOfFolder) { + scope.launch { + processThumbnailForActionedImage( + holder, + position, + uploadingContributionList + ) + } } - // If next actionable image is not found, that means searching is - // complete till end, and it will stop searching. - } else { - reachedEndOfFolder = true - notifyItemRemoved(position) + //fallback glide load if query fails + Glide.with(context) + .load(image.uri) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .thumbnail(0.3f) + .into(holder.image) } - _isLoadingImages.value = false } /** @@ -321,80 +278,109 @@ class ImageAdapter( val showAlreadyActionedImages = sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true) - // Getting clicked index from all images index when show_already_actioned_images - // switch is on - if (singleSelection) { - // If single selection mode, clear previous selection and select only the new one - if (selectedImages.isNotEmpty() && (selectedImages[0] != images[position])) { - val prevIndex = images.indexOf(selectedImages[0]) - selectedImages.clear() - notifyItemChanged(prevIndex, ImageUnselected()) - } + //determines which image was clicked + val clickedImage = if (showAlreadyActionedImages) { + images[position] + } else if (actionableImagesMap.size > position) { + ArrayList(actionableImagesMap.values)[position] + } else { + return //saftey } - val clickedIndex: Int = - if (showAlreadyActionedImages) { - ImageHelper.getIndex(selectedImages, images[position]) - } else { - ImageHelper.getIndex(selectedImages, ArrayList(actionableImagesMap.values)[position]) - } - if (clickedIndex != -1) { - selectedImages.removeAt(clickedIndex) - if (holder.isItemNotForUpload()) { - numberOfSelectedImagesMarkedAsNotForUpload-- - } + if (singleSelection && selectedImages.isNotEmpty() && selectedImages[0] != clickedImage) { + val prevIndex = images.indexOf(selectedImages[0]) + selectedImages.clear() + numberOfSelectedImagesMarkedAsNotForUpload = 0 + if (prevIndex != -1) notifyItemChanged(prevIndex, ImageUnselected()) + } + + //checks if already selected -> deselect + val alreadySelectedIndex = selectedImages.indexOf(clickedImage) + if (alreadySelectedIndex != -1) { + selectedImages.removeAt(alreadySelectedIndex) + if (holder.isItemNotForUpload()) numberOfSelectedImagesMarkedAsNotForUpload-- + holder.itemUnselected() notifyItemChanged(position, ImageUnselected()) - // Notify listener of deselection to update UI imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) - } else { - //check the maximum limit before allowing the selection - if (!singleSelection && selectedImages.size >= maxUploadLimit) { - // limit reached, show a toast and prevent selection - Toast.makeText( - context, - context.getString( - R.string.custom_selector_max_image_limit_reached, - maxUploadLimit - ), - Toast.LENGTH_SHORT - ).show() - return //exit the function, preventing selection - } + return + } - // Prevent adding the same image multiple times - val image = if (showAlreadyActionedImages) images[position] else ArrayList(actionableImagesMap.values)[position] - if (selectedImages.contains(image)) { - return // Image already selected, ignore additional clicks - } - scope.launch(ioDispatcher) { - val imageSHA1 = imageLoader.getSHA1(image, defaultDispatcher) - withContext(Dispatchers.Main) { - if (holder.isItemUploaded()) { - Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show() - return@withContext - } - - if (imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) { - holder.itemUploaded() - Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show() - return@withContext - } - - if (!holder.isItemUploaded() && imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) { - Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_SHORT).show() - } - - if (holder.isItemNotForUpload()) { - numberOfSelectedImagesMarkedAsNotForUpload++ - } - selectedImages.add(image) - notifyItemChanged(position, ImageSelectedOrUpdated()) - imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) + //block selection if limit reached (and shows the toast) + if (!singleSelection && selectedImages.size >= maxUploadLimit) { + Toast.makeText( + context, + context.getString(R.string.custom_selector_max_image_limit_reached, maxUploadLimit), + Toast.LENGTH_LONG + ).show() + return + } + + //proceeds with the selection + scope.launch(ioDispatcher) { + val imageSHA1 = imageLoader.getSHA1(clickedImage, defaultDispatcher) + + withContext(Dispatchers.Main) { + //checks if already uploaded + if (imageSHA1.isNotEmpty() && imageLoader.getFromUploaded(imageSHA1) != null) { + holder.itemUploaded() + Toast.makeText(context, R.string.custom_selector_already_uploaded_image_text, Toast.LENGTH_LONG).show() + return@withContext } + + //finalises the selection + if (holder.isItemNotForUpload()) { + numberOfSelectedImagesMarkedAsNotForUpload++ + } + selectedImages.add(clickedImage) + holder.itemSelected() + notifyItemChanged(position, ImageSelectedOrUpdated()) + imageSelectListener.onSelectedImagesChanged(selectedImages, numberOfSelectedImagesMarkedAsNotForUpload) } } } + /** + * Process thumbnail for actioned image + */ + suspend fun processThumbnailForActionedImage( + holder: ImageViewHolder, + position: Int, + uploadingContributionList: List, + ) { + _isLoadingImages.value = true + val next = + imageLoader.nextActionableImage( + allImages, + ioDispatcher, + defaultDispatcher, + nextImagePosition, + uploadingContributionList, + ) + + //if next actionable image is found, saves it, as the the search for + //finding next actionable image will start from this position + if (next > -1) { + nextImagePosition = next + 1 + if (!actionableImagesMap.containsKey(next)) { + actionableImagesMap[next] = allImages[next] + alreadyAddedPositions.add(imagePositionAsPerIncreasingOrder) + imagePositionAsPerIncreasingOrder++ + _currentImagesCount.value = imagePositionAsPerIncreasingOrder + Glide + .with(holder.image) + .load(allImages[next].uri) + .thumbnail(0.3f) + .into(holder.image) + notifyItemInserted(position) + notifyItemRangeChanged(position, itemCount + 1) + } + } else { + reachedEndOfFolder = true + notifyItemRemoved(position) + } + _isLoadingImages.value = false + } + /** * Initialize the data set. */ @@ -428,7 +414,7 @@ class ImageAdapter( * Set new selected images */ fun setSelectedImages(newSelectedImages: ArrayList) { - selectedImages = ArrayList(newSelectedImages.take(MAX_IMAGE_COUNT)) // enforce 20-image limit + selectedImages = ArrayList(newSelectedImages) imageSelectListener.onSelectedImagesChanged(selectedImages, 0) } @@ -442,7 +428,7 @@ class ImageAdapter( ) { numberOfSelectedImagesMarkedAsNotForUpload = 0 images.clear() - selectedImages = ArrayList(selectedImages.take(5)) // enforce the 5-image limit + selectedImages = ArrayList(selectedImages) init(newImages, fixedImages, TreeMap(), uploadingImages) notifyDataSetChanged() } @@ -534,14 +520,14 @@ class ImageAdapter( private val uploadingGroup: Group = itemView.findViewById(R.id.uploading_group) private val notForUploadGroup: Group = itemView.findViewById(R.id.not_for_upload_group) private val selectedGroup: Group = itemView.findViewById(R.id.selected_group) - val closeButton: ImageView = itemView.findViewById(R.id.close_button) // Added for close button + val closeButton: ImageView = itemView.findViewById(R.id.close_button) //added for close button /** * Item selected view. */ fun itemSelected() { selectedGroup.visibility = View.VISIBLE - closeButton.visibility = View.VISIBLE // Show close button when selected + closeButton.visibility = View.GONE } /** @@ -549,7 +535,7 @@ class ImageAdapter( */ fun itemUnselected() { selectedGroup.visibility = View.GONE - closeButton.visibility = View.GONE // Hide close button when unselected + closeButton.visibility = View.GONE } /** @@ -650,4 +636,4 @@ class ImageAdapter( fun setSingleSelection(single: Boolean) { singleSelection = single } -} +} \ No newline at end of file From bb1a89ec3a25455d4a682ea559bb252c614d327e Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 17 Nov 2025 23:53:07 +0530 Subject: [PATCH 12/15] Added string for toast in classic multi-upload --- app/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 950ffd0754..d395d74525 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -889,4 +889,6 @@ Upload your first media by tapping on the add button. Nominated for Deletion You can only select a maximum of %d images. + You\'ve selected more than %1$d images. Only the first %2$d will be uploaded. + From fa982d69812e894114ad718b7094646872ac9fc3 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Mon, 17 Nov 2025 23:57:33 +0530 Subject: [PATCH 13/15] Added selected more than 20 images toast and limit uploads to first 20 in classic multi-upload flow --- .../free/nrw/commons/upload/UploadActivity.kt | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 1e17d08242..4ce7809d1c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -744,11 +744,23 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C intent.getParcelableArrayListExtra(EXTRA_FILES) } - // Convert to mutable list,takes up to 20 files, or return empty list if null - files?.toMutableList()?.take(MAX_IMAGE_COUNT)?.toMutableList() ?: run { //enforce 20-image limit - Timber.w("Files array was null") - mutableListOf() + val originalCount = files?.size ?: 0 + val limitedFiles = files?.toMutableList()?.take(MAX_IMAGE_COUNT) ?: mutableListOf() + + // shows toast if user selected more than 20 + if (originalCount > MAX_IMAGE_COUNT) { + runOnUiThread { + showLongToast( + this, + getString( + R.string.you_selected_more_than_n_only_first_n_will_upload, + originalCount, + MAX_IMAGE_COUNT + ) + ) + } } + limitedFiles.toMutableList() } } catch (e: Exception) { Timber.e(e, "Error reading files from intent") @@ -758,13 +770,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C // Log the result for debugging isMultipleFilesSelected = uploadableFiles.size > 1 Timber.i("Received files count: ${uploadableFiles.size}") - uploadableFiles.forEachIndexed { index, file -> - Timber.d("File $index path: ${file.getFilePath()}") - } - //update thumbnails adapter with limited files thumbnailsAdapter?.uploadableFiles = uploadableFiles - // Handle other extras with null safety place = try { if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) { @@ -997,6 +1004,8 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C ) if (locationPermissionsHelper.isLocationAccessToAppsTurnedOn()) { currLocation = locationManager!!.getLastLocation() +// currLocation = locationManager!!.getLastLocation() +// currentSelectionPosition = !!.getLastLocaation() } if (currLocation != null) { From 897221d3b9f4e01938ade19ff43394ff4c8f0676 Mon Sep 17 00:00:00 2001 From: Kota-Jagadeesh Date: Tue, 18 Nov 2025 18:58:36 +0530 Subject: [PATCH 14/15] Added back the xml declaration --- app/src/main/res/layout/item_custom_selector_image.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/item_custom_selector_image.xml b/app/src/main/res/layout/item_custom_selector_image.xml index 8b37389f77..a1c5df177d 100644 --- a/app/src/main/res/layout/item_custom_selector_image.xml +++ b/app/src/main/res/layout/item_custom_selector_image.xml @@ -1,3 +1,4 @@ + Date: Tue, 18 Nov 2025 19:47:18 +0530 Subject: [PATCH 15/15] Removed unused code --- app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt index 4ce7809d1c..1331401930 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadActivity.kt @@ -1004,8 +1004,6 @@ class UploadActivity : BaseActivity(), UploadContract.View, UploadBaseFragment.C ) if (locationPermissionsHelper.isLocationAccessToAppsTurnedOn()) { currLocation = locationManager!!.getLastLocation() -// currLocation = locationManager!!.getLastLocation() -// currentSelectionPosition = !!.getLastLocaation() } if (currLocation != null) {