diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt index be763fe8a..d146d1d18 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt +++ b/app/src/main/java/fr/free/nrw/commons/contributions/Contribution.kt @@ -134,4 +134,9 @@ data class Contribution constructor( fun unpause() { CommonsApplication.pauseUploads[pageId] = false } + + fun dateModifiedInMillis(): Long { + return dateModified!!.time + } + } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsFragment.kt index 6928435b9..e6732b086 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsFragment.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.paging.PagedList import androidx.recyclerview.widget.LinearLayoutManager -import fr.free.nrw.commons.R import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.contributions.Contribution import fr.free.nrw.commons.databinding.FragmentFailedUploadsBinding @@ -42,7 +41,7 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr lateinit var binding: FragmentFailedUploadsBinding - var l = ArrayList() + var contributionsList = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -81,21 +80,21 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr pendingUploadsPresenter!!.totalContributionList.observe( viewLifecycleOwner ) { list: PagedList -> - l = ArrayList() + contributionsList = ArrayList() list.forEach { if (it != null){ if (it.state == Contribution.STATE_FAILED) { - l.add(it) + contributionsList.add(it) } } } - if (l.size == 0) { + if (contributionsList.size == 0) { binding.nofailedTextView.visibility = View.VISIBLE binding.failedUplaodsLl.visibility = View.GONE } else { binding.nofailedTextView.visibility = View.GONE binding.failedUplaodsLl.visibility = View.VISIBLE - val adapter = FailedUploadsAdapter(l) + val adapter = FailedUploadsAdapter(contributionsList) binding.failedUploadsRecyclerView.setAdapter(adapter) } } @@ -132,4 +131,10 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr override fun showNoContributionsUI(shouldShow: Boolean) { //TODO("Not yet implemented") } + + fun restartUploads() { + if (contributionsList != null){ + pendingUploadsPresenter.restartUploads(contributionsList, 0 , this.requireContext().applicationContext) + } + } } \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt index 08cd20706..a87fb994a 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsAdapter.kt @@ -53,7 +53,7 @@ class PendingUploadsAdapter(items: List, callback: Callback) : holder.errorTextView.visibility = View.VISIBLE holder.itemProgress.visibility = View.GONE } else { - if (item.chunkInfo == null) { + if (item.transferred == 0L) { holder.errorTextView.setText("Queued") holder.errorTextView.visibility = View.VISIBLE holder.itemProgress.visibility = View.GONE diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt index d2f697136..5fa2ad811 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsFragment.kt @@ -1,6 +1,8 @@ package fr.free.nrw.commons.upload import android.content.Context +import android.os.Build.VERSION +import android.os.Build.VERSION_CODES import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -22,6 +24,7 @@ import timber.log.Timber import java.util.Locale import javax.inject.Inject + /** * A simple [Fragment] subclass. * Use the [PendingUploadsFragment.newInstance] factory method to @@ -53,7 +56,7 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon private lateinit var uploadProgressActivity: UploadProgressActivity private var contributionsSize = 0 - var l = ArrayList() + var contributionsList = ArrayList() private var totalUploads = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -107,39 +110,66 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon viewLifecycleOwner ) { list: PagedList -> contributionsSize = list.size - l = ArrayList() + contributionsList = ArrayList() var x = 0; + var y = 0; list.forEach { if (it != null){ if (it.state == Contribution.STATE_PAUSED || it.state == Contribution.STATE_QUEUED || it.state == Contribution.STATE_IN_PROGRESS ) { - l.add(it) + contributionsList.add(it) } if (it.state == Contribution.STATE_PAUSED || it.state == Contribution.STATE_QUEUED ) { x++ } + if (it.state == Contribution.STATE_FAILED){ + y++ + } } } - if (l.size == 0) { + if (y == 0){ + uploadProgressActivity.setErrorIconsVisibility(false) + }else{ + uploadProgressActivity.setErrorIconsVisibility(true) + } + if (contributionsList.size == 0) { binding.nopendingTextView.visibility = View.VISIBLE binding.pendingUplaodsLl.visibility = View.GONE uploadProgressActivity.hidePendingIcons() } else { if (totalUploads == 0){ - totalUploads = l.size + totalUploads = contributionsList.size binding.progressBarPending.max = totalUploads } binding.nopendingTextView.visibility = View.GONE binding.pendingUplaodsLl.visibility = View.VISIBLE - val adapter = PendingUploadsAdapter(l, this) + + val sortedContributionsList: List = if (VERSION.SDK_INT >= VERSION_CODES.N) { + contributionsList.sortedByDescending { it.dateModifiedInMillis() } + } else { + contributionsList.sortedBy { it.dateModifiedInMillis() }.reversed() + } + + val newContributionList: MutableList = sortedContributionsList.toMutableList() + val listOfRemoved: MutableList = mutableListOf() + val last = sortedContributionsList.last() + for (i in sortedContributionsList.indices) { + val current = sortedContributionsList[i] + if (current.transferred == 0L && (current.dateModifiedInMillis() / 100) > (last.dateModifiedInMillis() / 100)){ + listOfRemoved.add(current) + } + } + newContributionList.removeAll(listOfRemoved) + newContributionList.addAll(listOfRemoved) + val adapter = PendingUploadsAdapter(newContributionList, this) binding.pendingUploadsRecyclerView.setAdapter(adapter) - binding.progressTextView.setText((totalUploads-l.size).toString() + "/" + totalUploads + " uploaded") - binding.progressBarPending.progress = totalUploads-l.size - if (x == l.size) { + binding.progressTextView.setText((totalUploads-contributionsList.size).toString() + "/" + totalUploads + " uploaded") + binding.progressBarPending.progress = totalUploads-contributionsList.size + if (x == contributionsList.size) { uploadProgressActivity.setPausedIcon(true) }else{ uploadProgressActivity.setPausedIcon(false) @@ -203,14 +233,14 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon } fun restartUploads() { - if (l != null){ - pendingUploadsPresenter.restartUploads(l, 0 , this.requireContext().applicationContext) + if (contributionsList != null){ + pendingUploadsPresenter.restartUploads(contributionsList, 0 , this.requireContext().applicationContext) } } fun pauseUploads() { - if (l != null){ - pendingUploadsPresenter.pauseUploads(l, 0, this.requireContext().applicationContext) + if (contributionsList != null){ + pendingUploadsPresenter.pauseUploads(contributionsList, 0, this.requireContext().applicationContext) } } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt b/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt index 268eae53a..c3fb2250d 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/UploadProgressActivity.kt @@ -22,6 +22,7 @@ class UploadProgressActivity : BaseActivity() { val titleList: MutableList = ArrayList() var isPaused = true var isPendingIconsVisible = true + var isErrorIconsVisisble = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -117,18 +118,23 @@ class UploadProgressActivity : BaseActivity() { } } } else if (currentPosition == 1) { - if (menu!!.findItem(R.id.retry_icon) == null) { - menu!!.add(Menu.NONE, R.id.retry_icon, Menu.NONE, "Retry") - .setIcon(R.drawable.ic_refresh_white_24dp) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) - } - if (menu!!.findItem(R.id.cancel_icon) == null) { - menu!!.add(Menu.NONE, R.id.cancel_icon, Menu.NONE, "Cancel") - .setIcon(android.R.drawable.ic_menu_close_clear_cancel).setOnMenuItemClickListener { - hidePendingIcons() - true - } - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + if (isErrorIconsVisisble){ + if (menu!!.findItem(R.id.retry_icon) == null) { + menu!!.add(Menu.NONE, R.id.retry_icon, Menu.NONE, "Retry") + .setIcon(R.drawable.ic_refresh_white_24dp).setOnMenuItemClickListener { + failedUploadsFragment!!.restartUploads() + true + } + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + } + if (menu!!.findItem(R.id.cancel_icon) == null) { + menu!!.add(Menu.NONE, R.id.cancel_icon, Menu.NONE, "Cancel") + .setIcon(android.R.drawable.ic_menu_close_clear_cancel).setOnMenuItemClickListener { + hidePendingIcons() + true + } + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + } } } } @@ -143,4 +149,9 @@ class UploadProgressActivity : BaseActivity() { updateMenuItems(binding.uploadProgressViewPager.currentItem) } + fun setErrorIconsVisibility(visible : Boolean){ + isErrorIconsVisisble = visible + updateMenuItems(binding.uploadProgressViewPager.currentItem) + } + }