From 3b660da0e2e60c9d90a34693024fe21b16e809b5 Mon Sep 17 00:00:00 2001 From: Kanahia Date: Sat, 22 Jun 2024 23:20:39 +0530 Subject: [PATCH] Fixed bugs --- .../contributions/ContributionsFragment.java | 28 ++++++------ .../commons/upload/FailedUploadsAdapter.kt | 11 ++++- .../commons/upload/FailedUploadsFragment.kt | 42 +++++++++++++++++- .../upload/PendingUploadsContract.java | 3 +- .../commons/upload/PendingUploadsFragment.kt | 5 +++ .../upload/PendingUploadsPresenter.java | 17 ++++++- .../commons/upload/UploadProgressActivity.kt | 5 +++ .../main/res/layout/pending_uploads_icon.xml | 6 +-- .../ContributionViewHolderUnitTests.kt | 44 ------------------- .../nrw/commons/upload/UploadClientTest.kt | 2 - 10 files changed, 96 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java index 733e9e287..76c9ed1ef 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java @@ -267,19 +267,21 @@ public class ContributionsFragment pendingUploadsCountTextView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_count_badge); uploadsErrorTextView = uploadMenuItemActionView.findViewById(R.id.uploads_error_count_badge); final ImageView pendingUploadsImageView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_image_view); - - pendingUploadsImageView.setOnClickListener(view -> { - startActivity(new Intent(getContext(), UploadProgressActivity.class)); - }); - - pendingUploadsCountTextView.setOnClickListener(view -> { - startActivity(new Intent(getContext(), UploadProgressActivity.class)); - }); - - uploadsErrorTextView.setOnClickListener(view -> { - startActivity(new Intent(getContext(), UploadProgressActivity.class)); - }); - + if (pendingUploadsImageView != null){ + pendingUploadsImageView.setOnClickListener(view -> { + startActivity(new Intent(getContext(), UploadProgressActivity.class)); + }); + } + if (pendingUploadsCountTextView != null) { + pendingUploadsCountTextView.setOnClickListener(view -> { + startActivity(new Intent(getContext(), UploadProgressActivity.class)); + }); + } + if (uploadsErrorTextView != null) { + uploadsErrorTextView.setOnClickListener(view -> { + startActivity(new Intent(getContext(), UploadProgressActivity.class)); + }); + } notification.setOnClickListener(view -> { NotificationActivity.startYourself(getContext(), "unread"); }); 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 59403c4ab..e70b8c57a 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 @@ -17,9 +17,10 @@ import timber.log.Timber import java.io.File -class FailedUploadsAdapter(items: List) : +class FailedUploadsAdapter(items: List, callback: Callback) : RecyclerView.Adapter() { private val items: List = items + private var callback: FailedUploadsAdapter.Callback = callback override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view: View = @@ -51,6 +52,12 @@ class FailedUploadsAdapter(items: List) : holder.errorTextView.visibility = View.VISIBLE holder.itemProgress.visibility = View.GONE } + holder.deleteButton.setOnClickListener { + callback.deleteUpload(item) + } + holder.retryButton.setOnClickListener { + callback.restartUpload(position) + } holder.itemImage.setImageRequest(imageRequest) } @@ -67,9 +74,11 @@ class FailedUploadsAdapter(items: List) : var itemProgress: ProgressBar = itemView.findViewById(R.id.itemProgress) var errorTextView: TextView = itemView.findViewById(R.id.errorTextView) var deleteButton: ImageView = itemView.findViewById(R.id.deleteButton) + var retryButton: ImageView = itemView.findViewById(R.id.retryButton) } interface Callback { fun deleteUpload(contribution: Contribution?) + 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 e64b1aa6b..94e16649d 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 @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.paging.PagedList import androidx.recyclerview.widget.LinearLayoutManager +import fr.free.nrw.commons.CommonsApplication import fr.free.nrw.commons.R import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.contributions.Contribution @@ -26,7 +27,7 @@ import javax.inject.Inject * Use the [FailedUploadsFragment.newInstance] factory method to * create an instance of this fragment. */ -class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContract.View { +class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContract.View, FailedUploadsAdapter.Callback { private var param1: String? = null private var param2: String? = null private val ARG_PARAM1 = "param1" @@ -107,7 +108,7 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr } else { binding.nofailedTextView.visibility = View.GONE binding.failedUplaodsLl.visibility = View.VISIBLE - val adapter = FailedUploadsAdapter(contributionsList) + val adapter = FailedUploadsAdapter(contributionsList, this) binding.failedUploadsRecyclerView.setAdapter(adapter) } } @@ -126,6 +127,7 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr fun restartUploads() { if (contributionsList != null) { + uploadProgressActivity.resetProgressBar() pendingUploadsPresenter.restartUploads( contributionsList, 0, @@ -134,6 +136,42 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr } } + override fun restartUpload(index : Int) { + if (contributionsList != null) { + uploadProgressActivity.resetProgressBar() + pendingUploadsPresenter.restartUpload( + contributionsList, + index, + this.requireContext().applicationContext + ) + } + } + + override fun deleteUpload(contribution: Contribution?) { + DialogUtil.showAlertDialog( + requireActivity(), + String.format( + Locale.getDefault(), + getString(R.string.cancelling_upload) + ), + String.format( + Locale.getDefault(), + getString(R.string.cancel_upload_dialog) + ), + String.format(Locale.getDefault(), getString(R.string.yes)), + String.format(Locale.getDefault(), getString(R.string.no)), + { + ViewUtil.showShortToast(context, R.string.cancelling_upload) + pendingUploadsPresenter.deleteUpload( + contribution, + this.requireContext().applicationContext + ) + CommonsApplication.cancelledUploads.add(contribution!!.pageId) + }, + {} + ) + } + fun deleteUploads() { if (contributionsList != null) { DialogUtil.showAlertDialog( diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsContract.java b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsContract.java index abf106a0b..6f4d20758 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsContract.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsContract.java @@ -3,6 +3,8 @@ package fr.free.nrw.commons.upload; import android.content.Context; import fr.free.nrw.commons.BasePresenter; import fr.free.nrw.commons.contributions.Contribution; +import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract; +import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract.View; public class PendingUploadsContract { @@ -10,7 +12,6 @@ public class PendingUploadsContract { public interface UserActionListener extends BasePresenter { - void deleteUpload(Contribution contribution, Context context); } } 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 e81156132..89e57ea2e 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 @@ -191,6 +191,7 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon ViewUtil.showShortToast(context, R.string.cancelling_upload) pendingUploadsPresenter.deleteUpload(contribution, this.requireContext().applicationContext) CommonsApplication.cancelledUploads.add(contribution!!.pageId) + resetProgressBar() }, {} ) @@ -242,4 +243,8 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon ) } } + + fun resetProgressBar() { + totalUploads = 0 + } } \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsPresenter.java b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsPresenter.java index fbdd4971e..3d0c7f953 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/PendingUploadsPresenter.java @@ -15,6 +15,7 @@ import fr.free.nrw.commons.contributions.ContributionBoundaryCallback; import fr.free.nrw.commons.contributions.ContributionsRemoteDataSource; import fr.free.nrw.commons.contributions.ContributionsRepository; import fr.free.nrw.commons.di.CommonsApplicationModule; +import fr.free.nrw.commons.nearby.contract.NearbyParentFragmentContract; import fr.free.nrw.commons.upload.PendingUploadsContract.UserActionListener; import fr.free.nrw.commons.upload.PendingUploadsContract.View; import fr.free.nrw.commons.upload.worker.WorkRequestHelper; @@ -96,7 +97,6 @@ public class PendingUploadsPresenter implements UserActionListener { } - @Override public void onDetachView() { compositeDisposable.clear(); @@ -178,4 +178,19 @@ public class PendingUploadsPresenter implements UserActionListener { )); } + public void restartUpload(List l, int index, Context context) { + if (index >= l.size()) { + return; + } + Contribution it = l.get(index); + it.setState(Contribution.STATE_QUEUED); + compositeDisposable.add(repository + .save(it) + .subscribeOn(ioThreadScheduler) + .subscribe(() -> + WorkRequestHelper.Companion.makeOneTimeWorkRequest( + context, ExistingWorkPolicy.KEEP) + )); + } + } 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 389926e9b..cc112c2f7 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 @@ -154,4 +154,9 @@ class UploadProgressActivity : BaseActivity() { updateMenuItems(binding.uploadProgressViewPager.currentItem) } + fun resetProgressBar(){ + pendingUploadsFragment!!.resetProgressBar() + } + + } diff --git a/app/src/main/res/layout/pending_uploads_icon.xml b/app/src/main/res/layout/pending_uploads_icon.xml index 682dac3c8..d5839a6af 100644 --- a/app/src/main/res/layout/pending_uploads_icon.xml +++ b/app/src/main/res/layout/pending_uploads_icon.xml @@ -27,9 +27,10 @@ android:layout_alignEnd="@id/pending_uploads_image_view" android:layout_alignRight="@id/pending_uploads_image_view" android:background="@drawable/notification_badge" + android:backgroundTint="@color/button_blue" android:gravity="center" android:padding="@dimen/miniscule_margin" - android:textColor="?attr/notification_icon_text_color" + android:textColor="@color/white" android:textSize="7sp" android:textStyle="bold" android:visibility="gone" @@ -47,10 +48,9 @@ android:layout_marginEnd="0dp" android:layout_marginRight="0dp" android:background="@drawable/notification_badge" - android:backgroundTint="@color/button_blue" android:gravity="center" android:padding="@dimen/miniscule_margin" - android:textColor="@color/white" + android:textColor="?attr/notification_icon_text_color" android:textSize="7sp" android:textStyle="bold" android:visibility="gone" diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt index 01dcb808d..2e9267077 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt @@ -92,50 +92,6 @@ class ContributionViewHolderUnitTests { Assert.assertNotNull(contributionViewHolder) } - @Test - @Throws(Exception::class) - fun testSetResume() { - Shadows.shadowOf(Looper.getMainLooper()).idle() - val method: Method = ContributionViewHolder::class.java.getDeclaredMethod( - "setResume" - ) - method.isAccessible = true - method.invoke(contributionViewHolder) - } - - @Test - @Throws(Exception::class) - fun testSetPaused() { - Shadows.shadowOf(Looper.getMainLooper()).idle() - val method: Method = ContributionViewHolder::class.java.getDeclaredMethod( - "setPaused" - ) - method.isAccessible = true - method.invoke(contributionViewHolder) - } - - @Test - @Throws(Exception::class) - fun testPause() { - Shadows.shadowOf(Looper.getMainLooper()).idle() - val method: Method = ContributionViewHolder::class.java.getDeclaredMethod( - "pause" - ) - method.isAccessible = true - method.invoke(contributionViewHolder) - } - - @Test - @Throws(Exception::class) - fun testResume() { - Shadows.shadowOf(Looper.getMainLooper()).idle() - val method: Method = ContributionViewHolder::class.java.getDeclaredMethod( - "resume" - ) - method.isAccessible = true - method.invoke(contributionViewHolder) - } - @Test @Throws(Exception::class) fun testWikipediaButtonClicked() { 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 aa2265a47..cb321d747 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 @@ -162,9 +162,7 @@ class UploadClientTest { whenever(contribution.fileKey).thenReturn(filekey) 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() verify(contribution, times(1)).unpause() }