From 33897bbdc0172e412b1bea8b4d8c3e28b3248845 Mon Sep 17 00:00:00 2001 From: Kanahia Date: Tue, 16 Jul 2024 11:21:52 +0530 Subject: [PATCH] Improved recycler view --- .../commons/upload/FailedUploadsAdapter.kt | 56 +++--- .../commons/upload/FailedUploadsFragment.kt | 21 ++- .../commons/upload/PendingUploadsAdapter.kt | 167 ++++++++++++------ .../commons/upload/PendingUploadsFragment.kt | 107 +++++++---- .../main/res/layout/item_pending_upload.xml | 32 ++-- .../nrw/commons/upload/UploadClientTest.kt | 11 ++ 6 files changed, 271 insertions(+), 123 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt b/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt index 0e7bb0807..931ed9ce5 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/FailedUploadsAdapter.kt @@ -9,18 +9,18 @@ import android.webkit.URLUtil import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView +import androidx.paging.PagedListAdapter +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.facebook.imagepipeline.request.ImageRequest import fr.free.nrw.commons.R import fr.free.nrw.commons.contributions.Contribution -import timber.log.Timber import java.io.File -class FailedUploadsAdapter(items: List, callback: Callback) : - RecyclerView.Adapter() { - private val items: List = items - private var callback: FailedUploadsAdapter.Callback = callback +class FailedUploadsAdapter(callback: Callback) : + PagedListAdapter(ContributionDiffCallback()) { + private var callback: Callback = callback override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view: View = @@ -29,10 +29,12 @@ class FailedUploadsAdapter(items: List, callback: Callback) : } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val item: Contribution = items[position] - holder.titleTextView.setText(item.media.displayTitle) + val item: Contribution? = getItem(position) + if (item != null) { + holder.titleTextView.setText(item.media.displayTitle) + } var imageRequest: ImageRequest? = null - val imageSource: String = item.localUri.toString() + val imageSource: String = item?.localUri.toString() if (!TextUtils.isEmpty(imageSource)) { if (URLUtil.isFileUrl(imageSource)) { @@ -47,14 +49,16 @@ class FailedUploadsAdapter(items: List, callback: Callback) : } } - if (item.state == Contribution.STATE_FAILED) { - if (item.errorInfo != null){ - holder.errorTextView.setText(item.errorInfo) - }else{ - holder.errorTextView.setText("Failed") + if (item != null) { + if (item.state == Contribution.STATE_FAILED) { + if (item.errorInfo != null) { + holder.errorTextView.setText(item.errorInfo) + } else { + holder.errorTextView.setText("Failed") + } + holder.errorTextView.visibility = View.VISIBLE + holder.itemProgress.visibility = View.GONE } - holder.errorTextView.visibility = View.VISIBLE - holder.itemProgress.visibility = View.GONE } holder.deleteButton.setOnClickListener { callback.deleteUpload(item) @@ -65,12 +69,6 @@ class FailedUploadsAdapter(items: List, callback: Callback) : holder.itemImage.setImageRequest(imageRequest) } - - override fun getItemCount(): Int { - return items.size - } - - class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var itemImage: com.facebook.drawee.view.SimpleDraweeView = itemView.findViewById(R.id.itemImage) @@ -81,8 +79,22 @@ class FailedUploadsAdapter(items: List, callback: Callback) : var retryButton: ImageView = itemView.findViewById(R.id.retryButton) } + override fun getItemId(position: Int): Long { + return getItem(position)?.pageId?.hashCode()?.toLong() ?: position.toLong() + } + + class ContributionDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Contribution, newItem: Contribution): Boolean { + return oldItem.pageId.hashCode() == newItem.pageId.hashCode() + } + + override fun areContentsTheSame(oldItem: Contribution, newItem: Contribution): Boolean { + return oldItem.transferred == newItem.transferred + } + } + interface Callback { fun deleteUpload(contribution: Contribution?) - fun restartUpload(index : Int) + fun restartUpload(index: Int) } } 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 d564d9a34..d7225a4a3 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 @@ -27,7 +27,8 @@ import javax.inject.Inject * Use the [FailedUploadsFragment.newInstance] factory method to * create an instance of this fragment. */ -class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContract.View, FailedUploadsAdapter.Callback { +class FailedUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsContract.View, + FailedUploadsAdapter.Callback { private var param1: String? = null private var param2: String? = null private val ARG_PARAM1 = "param1" @@ -46,6 +47,8 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr lateinit var binding: FragmentFailedUploadsBinding + private lateinit var adapter: FailedUploadsAdapter + var contributionsList = ArrayList() private lateinit var uploadProgressActivity: UploadProgressActivity @@ -81,16 +84,27 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr ): View? { binding = FragmentFailedUploadsBinding.inflate(layoutInflater) pendingUploadsPresenter.onAttachView(this) - initRecyclerView() + initAdapter() return binding.root } + fun initAdapter() { + adapter = FailedUploadsAdapter(this) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initRecyclerView() + } + fun initRecyclerView() { binding.failedUploadsRecyclerView.setLayoutManager(LinearLayoutManager(this.context)) + binding.failedUploadsRecyclerView.adapter = adapter pendingUploadsPresenter!!.getFailedContributions(userName) pendingUploadsPresenter!!.failedContributionList.observe( viewLifecycleOwner ) { list: PagedList -> + adapter.submitList(list) contributionsList = ArrayList() list.forEach { if (it != null) { @@ -105,7 +119,6 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr uploadProgressActivity.setErrorIconsVisibility(true) binding.nofailedTextView.visibility = View.GONE binding.failedUplaodsLl.visibility = View.VISIBLE - val adapter = FailedUploadsAdapter(contributionsList, this) binding.failedUploadsRecyclerView.setAdapter(adapter) } } @@ -133,7 +146,7 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr } } - override fun restartUpload(index : Int) { + override fun restartUpload(index: Int) { if (contributionsList != null) { uploadProgressActivity.resetProgressBar() pendingUploadsPresenter.restartUpload( 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 9bead254f..ebc79881c 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 @@ -9,88 +9,145 @@ import android.webkit.URLUtil import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView +import androidx.paging.PagedListAdapter +import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.facebook.imagepipeline.request.ImageRequest import fr.free.nrw.commons.R import fr.free.nrw.commons.contributions.Contribution -import timber.log.Timber import java.io.File -class PendingUploadsAdapter(items: List, callback: Callback) : - RecyclerView.Adapter() { - private val items: List = items - private var callback: Callback = callback +class PendingUploadsAdapter(private val callback: Callback) : + PagedListAdapter(ContributionDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view: View = - LayoutInflater.from(parent.context).inflate(R.layout.item_pending_upload, parent, false) + val view: View = LayoutInflater.from(parent.context) + .inflate(R.layout.item_pending_upload, parent, false) return ViewHolder(view) } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val item: Contribution = items[position] - holder.titleTextView.setText(item.media.displayTitle) - var imageRequest: ImageRequest? = null + override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList) { + if (payloads.isNotEmpty()) { + when (val latestPayload = payloads.lastOrNull()) { + is ContributionChangePayload.Progress -> holder.bindProgress( + latestPayload.transferred, + latestPayload.total + ) - val imageSource: String = item.localUri.toString() - - if (!TextUtils.isEmpty(imageSource)) { - if (URLUtil.isFileUrl(imageSource)) { - imageRequest = ImageRequest.fromUri(Uri.parse(imageSource))!! - } else if (imageSource != null) { - val file = File(imageSource) - imageRequest = ImageRequest.fromFile(file)!! + is ContributionChangePayload.State -> holder.bindState(latestPayload.state) + else -> onBindViewHolder(holder, position) } - - if (imageRequest != null) { - holder.itemImage.setImageRequest(imageRequest) - } - } - if (item.state == Contribution.STATE_QUEUED || item.state == Contribution.STATE_PAUSED) { - holder.errorTextView.setText("Queued") - holder.errorTextView.visibility = View.VISIBLE - holder.itemProgress.visibility = View.GONE } else { - if (item.transferred == 0L) { - holder.errorTextView.setText("Queued") - holder.errorTextView.visibility = View.VISIBLE - holder.itemProgress.visibility = View.GONE - } else { - holder.errorTextView.visibility = View.GONE - holder.itemProgress.visibility = View.VISIBLE - val total: Long = item.dataLength - val transferred: Long = item.transferred - if (transferred == 0L || transferred >= total) { - holder.itemProgress.setIndeterminate(true) - } else { - holder.itemProgress.setIndeterminate(false) - holder.itemProgress.setProgress(((transferred.toDouble() / total.toDouble()) * 100).toInt()) - } - } - } - - holder.itemImage.setImageRequest(imageRequest) - - holder.deleteButton.setOnClickListener { - callback!!.deleteUpload(item) + onBindViewHolder(holder, position) } } - override fun getItemCount(): Int { - return items.size + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val contribution = getItem(position) + contribution?.let { + holder.bind(it) + holder.deleteButton.setOnClickListener { + callback.deleteUpload(contribution) + } + } } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var itemImage: com.facebook.drawee.view.SimpleDraweeView = itemView.findViewById(R.id.itemImage) - var titleTextView: TextView = itemView.findViewById(R.id.titleTextView) - var itemProgress: ProgressBar = itemView.findViewById(R.id.itemProgress) - var errorTextView: TextView = itemView.findViewById(R.id.errorTextView) + var titleTextView: TextView = itemView.findViewById(R.id.titleTextView) + var itemProgress: ProgressBar = itemView.findViewById(R.id.itemProgress) + var errorTextView: TextView = itemView.findViewById(R.id.errorTextView) var deleteButton: ImageView = itemView.findViewById(R.id.deleteButton) + + fun bind(contribution: Contribution) { + titleTextView.text = contribution.media.displayTitle + + val imageSource: String = contribution.localUri.toString() + var imageRequest: ImageRequest? = null + + if (!TextUtils.isEmpty(imageSource)) { + if (URLUtil.isFileUrl(imageSource)) { + imageRequest = ImageRequest.fromUri(Uri.parse(imageSource)) + } else { + val file = File(imageSource) + imageRequest = ImageRequest.fromFile(file) + } + } + + if (imageRequest != null) { + itemImage.setImageRequest(imageRequest) + } + + bindState(contribution.state) + bindProgress(contribution.transferred, contribution.dataLength) + } + + fun bindState(state: Int) { + if (state == Contribution.STATE_QUEUED || state == Contribution.STATE_PAUSED) { + errorTextView.text = "Queued" + errorTextView.visibility = View.VISIBLE + itemProgress.visibility = View.GONE + } else { + errorTextView.visibility = View.GONE + itemProgress.visibility = View.VISIBLE + } + } + + fun bindProgress(transferred: Long, total: Long) { + if (transferred == 0L) { + errorTextView.text = "Queued" + errorTextView.visibility = View.VISIBLE + itemProgress.visibility = View.GONE + } else { + errorTextView.visibility = View.GONE + itemProgress.visibility = View.VISIBLE + if (transferred >= total) { + itemProgress.isIndeterminate = true + } else { + itemProgress.isIndeterminate = false + itemProgress.progress = + ((transferred.toDouble() / total.toDouble()) * 100).toInt() + } + } + } } interface Callback { fun deleteUpload(contribution: Contribution?) } + + class ContributionDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Contribution, newItem: Contribution): Boolean { + return oldItem.pageId.hashCode() == newItem.pageId.hashCode() + } + + override fun areContentsTheSame(oldItem: Contribution, newItem: Contribution): Boolean { + return oldItem.transferred == newItem.transferred + } + + override fun getChangePayload(oldItem: Contribution, newItem: Contribution): Any? { + return when { + oldItem.transferred != newItem.transferred -> { + ContributionChangePayload.Progress(newItem.transferred, newItem.dataLength) + } + + oldItem.state != newItem.state -> { + ContributionChangePayload.State(newItem.state) + } + + else -> super.getChangePayload(oldItem, newItem) + } + } + } + + override fun getItemId(position: Int): Long { + return getItem(position)?.pageId?.hashCode()?.toLong() ?: position.toLong() + } + + private sealed interface ContributionChangePayload { + data class Progress(val transferred: Long, val total: Long) : ContributionChangePayload + data class State(val state: Int) : ContributionChangePayload + } } 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 4d8674bd7..ca25d3a57 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,16 +1,17 @@ package fr.free.nrw.commons.upload import android.content.Context +import android.os.AsyncTask import android.os.Build.VERSION import android.os.Build.VERSION_CODES import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast import androidx.paging.PagedList +import androidx.paging.PositionalDataSource import androidx.recyclerview.widget.LinearLayoutManager -import fr.free.nrw.commons.CommonsApplication +import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver import fr.free.nrw.commons.R import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.contributions.Contribution @@ -19,7 +20,6 @@ import fr.free.nrw.commons.di.CommonsDaggerSupportFragment import fr.free.nrw.commons.media.MediaClient import fr.free.nrw.commons.profile.ProfileActivity import fr.free.nrw.commons.utils.DialogUtil.showAlertDialog -import fr.free.nrw.commons.utils.NetworkUtils import fr.free.nrw.commons.utils.ViewUtil import org.apache.commons.lang3.StringUtils import timber.log.Timber @@ -33,7 +33,7 @@ import javax.inject.Inject * create an instance of this fragment. */ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsContract.View, - PendingUploadsAdapter.Callback{ + PendingUploadsAdapter.Callback { private var param1: String? = null private var param2: String? = null private val ARG_PARAM1 = "param1" @@ -54,6 +54,8 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon private lateinit var uploadProgressActivity: UploadProgressActivity + private lateinit var adapter: PendingUploadsAdapter + private var contributionsSize = 0 var contributionsList = ArrayList() private var totalUploads = 0 @@ -90,17 +92,22 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon super.onCreate(savedInstanceState) binding = FragmentPendingUploadsBinding.inflate(inflater, container, false) pendingUploadsPresenter.onAttachView(this) - initRecyclerView() + initAdapter() return binding.root } + fun initAdapter() { + adapter = PendingUploadsAdapter(this) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + initRecyclerView() } fun initRecyclerView() { binding.pendingUploadsRecyclerView.setLayoutManager(LinearLayoutManager(this.context)) + binding.pendingUploadsRecyclerView.adapter = adapter pendingUploadsPresenter!!.setup( userName, sessionManager!!.userName == userName @@ -111,9 +118,8 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon contributionsSize = list.size contributionsList = ArrayList() var pausedOrQueuedUploads = 0 - var failedUploads = 0 list.forEach { - if (it != null){ + if (it != null) { if (it.state == Contribution.STATE_PAUSED || it.state == Contribution.STATE_QUEUED || it.state == Contribution.STATE_IN_PROGRESS @@ -125,9 +131,6 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon ) { pausedOrQueuedUploads++ } - if (it.state == Contribution.STATE_FAILED){ - failedUploads++ - } } } if (contributionsSize == 0) { @@ -135,37 +138,64 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon binding.pendingUplaodsLl.visibility = View.GONE uploadProgressActivity.hidePendingIcons() } else { - if (totalUploads == 0){ + if (totalUploads == 0) { totalUploads = contributionsSize binding.progressBarPending.max = totalUploads } binding.nopendingTextView.visibility = View.GONE binding.pendingUplaodsLl.visibility = View.VISIBLE - val sortedContributionsList: List = if (VERSION.SDK_INT >= VERSION_CODES.N) { - contributionsList.sortedByDescending { it.dateModifiedInMillis() } - } else { - contributionsList.sortedBy { it.dateModifiedInMillis() }.reversed() - } + 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 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)){ + 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-contributionsSize).toString() + "/" + totalUploads + " uploaded") - binding.progressBarPending.progress = totalUploads-contributionsSize + + // TODO: WORK ON THE SORTING ISSUE + val dataSource = object : PositionalDataSource() { + override fun loadInitial( + params: LoadInitialParams, + callback: LoadInitialCallback + ) { + callback.onResult(newContributionList, 0, newContributionList.size) + } + + override fun loadRange( + params: LoadRangeParams, + callback: LoadRangeCallback + ) { + val start = params.startPosition + val end = Math.min(start + params.loadSize, newContributionList.size) + callback.onResult(newContributionList.subList(start, end)) + } + } + + val pagedList = PagedList.Builder(dataSource, 10) + .setFetchExecutor(AsyncTask.THREAD_POOL_EXECUTOR) + .setNotifyExecutor(AsyncTask.THREAD_POOL_EXECUTOR) + .build() + + adapter.submitList(pagedList) + + binding.progressTextView.setText((totalUploads - contributionsSize).toString() + "/" + totalUploads + " uploaded") + binding.progressBarPending.progress = totalUploads - contributionsSize if (pausedOrQueuedUploads == contributionsSize) { uploadProgressActivity.setPausedIcon(true) - }else{ + } else { uploadProgressActivity.setPausedIcon(false) } } @@ -187,7 +217,10 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon String.format(Locale.getDefault(), getString(R.string.no)), { ViewUtil.showShortToast(context, R.string.cancelling_upload) - pendingUploadsPresenter.deleteUpload(contribution, this.requireContext().applicationContext) + pendingUploadsPresenter.deleteUpload( + contribution, + this.requireContext().applicationContext + ) resetProgressBar() }, {} @@ -206,19 +239,27 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon } fun restartUploads() { - if (contributionsList != null){ - pendingUploadsPresenter.restartUploads(contributionsList, 0 , this.requireContext().applicationContext) + if (contributionsList != null) { + pendingUploadsPresenter.restartUploads( + contributionsList, + 0, + this.requireContext().applicationContext + ) } } fun pauseUploads() { - if (contributionsList != null){ - pendingUploadsPresenter.pauseUploads(contributionsList, 0, this.requireContext().applicationContext) + if (contributionsList != null) { + pendingUploadsPresenter.pauseUploads( + contributionsList, + 0, + this.requireContext().applicationContext + ) } } - fun deleteUploads(){ - if (contributionsList != null){ + fun deleteUploads() { + if (contributionsList != null) { showAlertDialog( requireActivity(), String.format( @@ -234,7 +275,11 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon { ViewUtil.showShortToast(context, R.string.cancelling_upload) uploadProgressActivity.hidePendingIcons() - pendingUploadsPresenter.deleteUploads(contributionsList, 0, this.requireContext().applicationContext) + pendingUploadsPresenter.deleteUploads( + contributionsList, + 0, + this.requireContext().applicationContext + ) }, {} ) diff --git a/app/src/main/res/layout/item_pending_upload.xml b/app/src/main/res/layout/item_pending_upload.xml index a6f9c5c14..e9cbc8e06 100644 --- a/app/src/main/res/layout/item_pending_upload.xml +++ b/app/src/main/res/layout/item_pending_upload.xml @@ -1,28 +1,34 @@ - + android:orientation="horizontal" + android:paddingBottom="8dp"> + android:orientation="vertical" + android:paddingHorizontal="6dp" + app:layout_constraintEnd_toStartOf="@+id/deleteButton" + app:layout_constraintStart_toEndOf="@+id/itemImage"> + android:layout_height="wrap_content" + android:visibility="visible" /> + android:src="@android:drawable/ic_menu_close_clear_cancel" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadClientTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadClientTest.kt index 780c87574..2292bc15d 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadClientTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/upload/UploadClientTest.kt @@ -18,6 +18,7 @@ import fr.free.nrw.commons.auth.csrf.CsrfTokenClient import fr.free.nrw.commons.contributions.ChunkInfo import fr.free.nrw.commons.contributions.Contribution import fr.free.nrw.commons.upload.UploadClient.TimeProvider +import fr.free.nrw.commons.upload.worker.UploadWorker import fr.free.nrw.commons.wikidata.mwapi.MwException import fr.free.nrw.commons.wikidata.mwapi.MwServiceError import io.reactivex.Observable @@ -171,6 +172,16 @@ class UploadClientTest { @Test fun uploadFileToStash_returnsFailureIfNothingToUpload() { +// val tempFile = File.createTempFile("tempFile", ".tmp") +// tempFile.deleteOnExit() +// whenever(contribution.isCompleted()).thenReturn(false) +// whenever(contribution.fileKey).thenReturn(filekey) +// whenever(contribution.localUriPath).thenReturn(tempFile) +// whenever(fileUtilsWrapper.getMimeType(anyOrNull())).thenReturn("image/png") +// whenever(fileUtilsWrapper.getFileChunks(anyOrNull(), eq(expectedChunkSize))).thenReturn(emptyList()) +// val result = uploadClient.uploadFileToStash(filename, contribution, mock() ).test() +// result.assertNoErrors() +// assertEquals(StashUploadState.FAILED, result.values()[0].state) whenever(contribution.isCompleted()).thenReturn(false) whenever(contribution.fileKey).thenReturn(filekey) whenever(fileUtilsWrapper.getMimeType(anyOrNull())).thenReturn("image/png")