Show progress dialog on mark/unmark photos not for upload (#5322)

This commit is contained in:
Aryan Arora 2023-10-03 19:47:29 +05:30 committed by GitHub
parent b314fe1896
commit 373c6201bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 83 additions and 26 deletions

View file

@ -95,6 +95,8 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
*/
var imageFragment: ImageFragment? = null
private var progressDialogText:String=""
/**
* onCreate Activity, sets theme, initialises the view model, setup view.
*/
@ -221,6 +223,10 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
*/
private fun insertIntoNotForUpload(images: ArrayList<Image>) {
scope.launch {
imageFragment!!.showMarkUnmarkProgressDialog(
text= progressDialogText
)
var allImagesAlreadyNotForUpload = true
images.forEach {
val imageSHA1 = CustomSelectorUtils.getImageSHA1(
@ -269,6 +275,8 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
}
imageFragment!!.refresh()
imageFragment!!.dismissMarkUnmarkProgressDialog()
val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout)
bottomLayout.visibility = View.GONE
}
@ -334,8 +342,14 @@ class CustomSelectorActivity : BaseActivity(), FolderClickListener, ImageSelectL
bottomSheetBinding.notForUpload.text =
when (selectedImages.size == selectedNotForUploadImages) {
true -> getString(R.string.unmark_as_not_for_upload)
else -> getString(R.string.mark_as_not_for_upload)
true -> {
progressDialogText=getString(R.string.unmarking_as_not_for_upload)
getString(R.string.unmark_as_not_for_upload)
}
else -> {
progressDialogText=getString(R.string.marking_as_not_for_upload)
getString(R.string.mark_as_not_for_upload)
}
}
val bottomLayout: ConstraintLayout = findViewById(R.id.bottom_layout)

View file

@ -9,6 +9,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ProgressBar
import android.widget.Switch
import androidx.appcompat.app.AlertDialog
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
@ -17,16 +18,17 @@ import androidx.recyclerview.widget.RecyclerView
import fr.free.nrw.commons.customselector.database.NotForUploadStatusDao
import fr.free.nrw.commons.customselector.database.UploadedStatusDao
import fr.free.nrw.commons.customselector.helper.ImageHelper
import fr.free.nrw.commons.customselector.listeners.PassDataListener
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.listeners.ImageSelectListener
import fr.free.nrw.commons.customselector.listeners.PassDataListener
import fr.free.nrw.commons.customselector.listeners.RefreshUIListener
import fr.free.nrw.commons.customselector.model.CallbackStatus
import fr.free.nrw.commons.customselector.model.Image
import fr.free.nrw.commons.customselector.model.Result
import fr.free.nrw.commons.customselector.ui.adapter.ImageAdapter
import fr.free.nrw.commons.databinding.FragmentCustomSelectorBinding
import fr.free.nrw.commons.databinding.ProgressDialogBinding
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment
import fr.free.nrw.commons.media.MediaClient
import fr.free.nrw.commons.theme.BaseActivity
@ -34,12 +36,11 @@ import fr.free.nrw.commons.upload.FileProcessor
import fr.free.nrw.commons.upload.FileUtilsWrapper
import java.util.*
import javax.inject.Inject
import kotlin.collections.ArrayList
/**
* Custom Selector Image Fragment.
*/
class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassDataListener {
class ImageFragment : CommonsDaggerSupportFragment(), RefreshUIListener, PassDataListener {
private var _binding: FragmentCustomSelectorBinding? = null
private val binding get() = _binding
@ -57,7 +58,7 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
/**
* View model for images.
*/
private var viewModel: CustomSelectorViewModel? = null
private var viewModel: CustomSelectorViewModel? = null
/**
* View Elements.
@ -99,6 +100,10 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
*/
private var progressLayout: ConstraintLayout? = null
private lateinit var progressDialog: AlertDialog
private lateinit var progressDialogLayout: ProgressDialogBinding
/**
* NotForUploadStatus Dao class for database operations
*/
@ -163,7 +168,9 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
super.onCreate(savedInstanceState)
bucketId = arguments?.getLong(BUCKET_ID)
lastItemId = arguments?.getLong(LAST_ITEM_ID, 0)
viewModel = ViewModelProvider(requireActivity(),customSelectorViewModelFactory).get(CustomSelectorViewModel::class.java)
viewModel = ViewModelProvider(requireActivity(), customSelectorViewModelFactory).get(
CustomSelectorViewModel::class.java
)
}
/**
@ -171,17 +178,22 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
* Init imageAdapter, gridLayoutManger.
* SetUp recycler view.
*/
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentCustomSelectorBinding.inflate(inflater, container, false)
imageAdapter = ImageAdapter(requireActivity(), activity as ImageSelectListener, imageLoader!!)
gridLayoutManager = GridLayoutManager(context,getSpanCount())
with(binding?.selectorRv){
imageAdapter =
ImageAdapter(requireActivity(), activity as ImageSelectListener, imageLoader!!)
gridLayoutManager = GridLayoutManager(context, getSpanCount())
with(binding?.selectorRv) {
this?.layoutManager = gridLayoutManager
this?.setHasFixedSize(true)
this?.adapter = imageAdapter
}
viewModel?.result?.observe(viewLifecycleOwner, Observer{
viewModel?.result?.observe(viewLifecycleOwner, Observer {
handleResult(it)
})
@ -194,9 +206,16 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
val sharedPreferences: SharedPreferences =
requireContext().getSharedPreferences(CUSTOM_SELECTOR_PREFERENCE_KEY, MODE_PRIVATE)
showAlreadyActionedImages = sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
showAlreadyActionedImages =
sharedPreferences.getBoolean(SHOW_ALREADY_ACTIONED_IMAGES_PREFERENCE_KEY, true)
switch?.isChecked = showAlreadyActionedImages
val builder = AlertDialog.Builder(requireActivity())
builder.setCancelable(false)
progressDialogLayout = ProgressDialogBinding.inflate(layoutInflater, container, false)
builder.setView(progressDialogLayout.root)
progressDialog = builder.create()
return binding?.root
}
@ -236,10 +255,10 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
/**
* Handle view model result.
*/
private fun handleResult(result:Result){
if(result.status is CallbackStatus.SUCCESS){
private fun handleResult(result: Result) {
if (result.status is CallbackStatus.SUCCESS) {
val images = result.images
if(images.isNotEmpty()) {
if (images.isNotEmpty()) {
filteredImages = ImageHelper.filterImages(images, bucketId)
allImages = ArrayList(filteredImages)
imageAdapter.init(filteredImages, allImages, TreeMap())
@ -250,18 +269,18 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
.scrollToPosition(ImageHelper.getIndexFromId(filteredImages, pos))
}
}
}
else{
} else {
binding?.emptyText?.let {
it.visibility = View.VISIBLE
}
selectorRV?.let{
selectorRV?.let {
it.visibility = View.GONE
}
}
}
loader?.let {
it.visibility = if (result.status is CallbackStatus.FETCHING) View.VISIBLE else View.GONE
it.visibility =
if (result.status is CallbackStatus.FETCHING) View.VISIBLE else View.GONE
}
}
@ -324,7 +343,7 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
* Passes selected images and other information from Activity to Fragment and connects it with
* the adapter
*/
override fun passSelectedImages(selectedImages: ArrayList<Image>, shouldRefresh: Boolean){
override fun passSelectedImages(selectedImages: ArrayList<Image>, shouldRefresh: Boolean) {
imageAdapter.setSelectedImages(selectedImages)
if (!showAlreadyActionedImages && shouldRefresh) {
@ -332,4 +351,24 @@ class ImageFragment: CommonsDaggerSupportFragment(), RefreshUIListener, PassData
imageAdapter.setSelectedImages(selectedImages)
}
}
/**
* Shows mark/unmark progress dialog
*/
fun showMarkUnmarkProgressDialog(text: String) {
if (!progressDialog.isShowing) {
progressDialogLayout.progressDialogText.text = text
progressDialog.show()
}
}
/**
* Dismisses mark/unmark progress dialog
*/
fun dismissMarkUnmarkProgressDialog() {
if (progressDialog.isShowing) {
progressDialog.dismiss()
}
}
}

View file

@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:id="@+id/progressDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="10dp"
android:paddingVertical="20dp"
android:layout_weight="2"
android:layout_height="wrap_content">
android:orientation="horizontal"
android:paddingVertical="20dp">
<ProgressBar
android:layout_width="0dp"
@ -13,11 +14,12 @@
android:layout_weight="0.6" />
<TextView
android:id="@+id/progressDialogText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/pausing_upload"
android:layout_weight="1.5"
android:layout_gravity="center"
android:layout_weight="1.5"
android:text="@string/pausing_upload"
android:textSize="14sp" />
</LinearLayout>

View file

@ -756,6 +756,8 @@ Upload your first media by tapping on the add button.</string>
<string name="your_feedback">Your feedback</string>
<string name="mark_as_not_for_upload">Mark as not for upload</string>
<string name="unmark_as_not_for_upload">Unmark as not for upload</string>
<string name="marking_as_not_for_upload">Marking as not for upload</string>
<string name="unmarking_as_not_for_upload">Unmarking as not for upload</string>
<string name="show_already_actioned_pictures">Show already actioned pictures</string>
<string name="hiding_already_actioned_pictures">Hiding already actioned pictures</string>
<string name="no_more_images_found">No more images found</string>