Fixed bugs

This commit is contained in:
Kanahia 2024-06-22 23:20:39 +05:30
parent 520baedace
commit 3b660da0e2
10 changed files with 96 additions and 67 deletions

View file

@ -267,19 +267,21 @@ public class ContributionsFragment
pendingUploadsCountTextView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_count_badge); pendingUploadsCountTextView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_count_badge);
uploadsErrorTextView = uploadMenuItemActionView.findViewById(R.id.uploads_error_count_badge); uploadsErrorTextView = uploadMenuItemActionView.findViewById(R.id.uploads_error_count_badge);
final ImageView pendingUploadsImageView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_image_view); final ImageView pendingUploadsImageView = uploadMenuItemActionView.findViewById(R.id.pending_uploads_image_view);
if (pendingUploadsImageView != null){
pendingUploadsImageView.setOnClickListener(view -> { pendingUploadsImageView.setOnClickListener(view -> {
startActivity(new Intent(getContext(), UploadProgressActivity.class)); startActivity(new Intent(getContext(), UploadProgressActivity.class));
}); });
}
pendingUploadsCountTextView.setOnClickListener(view -> { if (pendingUploadsCountTextView != null) {
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 (uploadsErrorTextView != null) {
}); uploadsErrorTextView.setOnClickListener(view -> {
startActivity(new Intent(getContext(), UploadProgressActivity.class));
});
}
notification.setOnClickListener(view -> { notification.setOnClickListener(view -> {
NotificationActivity.startYourself(getContext(), "unread"); NotificationActivity.startYourself(getContext(), "unread");
}); });

View file

@ -17,9 +17,10 @@ import timber.log.Timber
import java.io.File import java.io.File
class FailedUploadsAdapter(items: List<Contribution>) : class FailedUploadsAdapter(items: List<Contribution>, callback: Callback) :
RecyclerView.Adapter<FailedUploadsAdapter.ViewHolder>() { RecyclerView.Adapter<FailedUploadsAdapter.ViewHolder>() {
private val items: List<Contribution> = items private val items: List<Contribution> = items
private var callback: FailedUploadsAdapter.Callback = callback
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view: View = val view: View =
@ -51,6 +52,12 @@ class FailedUploadsAdapter(items: List<Contribution>) :
holder.errorTextView.visibility = View.VISIBLE holder.errorTextView.visibility = View.VISIBLE
holder.itemProgress.visibility = View.GONE holder.itemProgress.visibility = View.GONE
} }
holder.deleteButton.setOnClickListener {
callback.deleteUpload(item)
}
holder.retryButton.setOnClickListener {
callback.restartUpload(position)
}
holder.itemImage.setImageRequest(imageRequest) holder.itemImage.setImageRequest(imageRequest)
} }
@ -67,9 +74,11 @@ class FailedUploadsAdapter(items: List<Contribution>) :
var itemProgress: ProgressBar = itemView.findViewById<ProgressBar>(R.id.itemProgress) var itemProgress: ProgressBar = itemView.findViewById<ProgressBar>(R.id.itemProgress)
var errorTextView: TextView = itemView.findViewById<TextView>(R.id.errorTextView) var errorTextView: TextView = itemView.findViewById<TextView>(R.id.errorTextView)
var deleteButton: ImageView = itemView.findViewById(R.id.deleteButton) var deleteButton: ImageView = itemView.findViewById(R.id.deleteButton)
var retryButton: ImageView = itemView.findViewById(R.id.retryButton)
} }
interface Callback { interface Callback {
fun deleteUpload(contribution: Contribution?) fun deleteUpload(contribution: Contribution?)
fun restartUpload(index : Int)
} }
} }

View file

@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.paging.PagedList import androidx.paging.PagedList
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import fr.free.nrw.commons.CommonsApplication
import fr.free.nrw.commons.R import fr.free.nrw.commons.R
import fr.free.nrw.commons.auth.SessionManager import fr.free.nrw.commons.auth.SessionManager
import fr.free.nrw.commons.contributions.Contribution import fr.free.nrw.commons.contributions.Contribution
@ -26,7 +27,7 @@ import javax.inject.Inject
* Use the [FailedUploadsFragment.newInstance] factory method to * Use the [FailedUploadsFragment.newInstance] factory method to
* create an instance of this fragment. * 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 param1: String? = null
private var param2: String? = null private var param2: String? = null
private val ARG_PARAM1 = "param1" private val ARG_PARAM1 = "param1"
@ -107,7 +108,7 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr
} else { } else {
binding.nofailedTextView.visibility = View.GONE binding.nofailedTextView.visibility = View.GONE
binding.failedUplaodsLl.visibility = View.VISIBLE binding.failedUplaodsLl.visibility = View.VISIBLE
val adapter = FailedUploadsAdapter(contributionsList) val adapter = FailedUploadsAdapter(contributionsList, this)
binding.failedUploadsRecyclerView.setAdapter(adapter) binding.failedUploadsRecyclerView.setAdapter(adapter)
} }
} }
@ -126,6 +127,7 @@ class FailedUploadsFragment : CommonsDaggerSupportFragment(),PendingUploadsContr
fun restartUploads() { fun restartUploads() {
if (contributionsList != null) { if (contributionsList != null) {
uploadProgressActivity.resetProgressBar()
pendingUploadsPresenter.restartUploads( pendingUploadsPresenter.restartUploads(
contributionsList, contributionsList,
0, 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() { fun deleteUploads() {
if (contributionsList != null) { if (contributionsList != null) {
DialogUtil.showAlertDialog( DialogUtil.showAlertDialog(

View file

@ -3,6 +3,8 @@ package fr.free.nrw.commons.upload;
import android.content.Context; import android.content.Context;
import fr.free.nrw.commons.BasePresenter; import fr.free.nrw.commons.BasePresenter;
import fr.free.nrw.commons.contributions.Contribution; 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 { public class PendingUploadsContract {
@ -10,7 +12,6 @@ public class PendingUploadsContract {
public interface UserActionListener extends public interface UserActionListener extends
BasePresenter<fr.free.nrw.commons.upload.PendingUploadsContract.View> { BasePresenter<fr.free.nrw.commons.upload.PendingUploadsContract.View> {
void deleteUpload(Contribution contribution, Context context); void deleteUpload(Contribution contribution, Context context);
} }
} }

View file

@ -191,6 +191,7 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon
ViewUtil.showShortToast(context, R.string.cancelling_upload) ViewUtil.showShortToast(context, R.string.cancelling_upload)
pendingUploadsPresenter.deleteUpload(contribution, this.requireContext().applicationContext) pendingUploadsPresenter.deleteUpload(contribution, this.requireContext().applicationContext)
CommonsApplication.cancelledUploads.add(contribution!!.pageId) CommonsApplication.cancelledUploads.add(contribution!!.pageId)
resetProgressBar()
}, },
{} {}
) )
@ -242,4 +243,8 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon
) )
} }
} }
fun resetProgressBar() {
totalUploads = 0
}
} }

View file

@ -15,6 +15,7 @@ import fr.free.nrw.commons.contributions.ContributionBoundaryCallback;
import fr.free.nrw.commons.contributions.ContributionsRemoteDataSource; import fr.free.nrw.commons.contributions.ContributionsRemoteDataSource;
import fr.free.nrw.commons.contributions.ContributionsRepository; import fr.free.nrw.commons.contributions.ContributionsRepository;
import fr.free.nrw.commons.di.CommonsApplicationModule; 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.UserActionListener;
import fr.free.nrw.commons.upload.PendingUploadsContract.View; import fr.free.nrw.commons.upload.PendingUploadsContract.View;
import fr.free.nrw.commons.upload.worker.WorkRequestHelper; import fr.free.nrw.commons.upload.worker.WorkRequestHelper;
@ -96,7 +97,6 @@ public class PendingUploadsPresenter implements UserActionListener {
} }
@Override @Override
public void onDetachView() { public void onDetachView() {
compositeDisposable.clear(); compositeDisposable.clear();
@ -178,4 +178,19 @@ public class PendingUploadsPresenter implements UserActionListener {
)); ));
} }
public void restartUpload(List<Contribution> 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)
));
}
} }

View file

@ -154,4 +154,9 @@ class UploadProgressActivity : BaseActivity() {
updateMenuItems(binding.uploadProgressViewPager.currentItem) updateMenuItems(binding.uploadProgressViewPager.currentItem)
} }
fun resetProgressBar(){
pendingUploadsFragment!!.resetProgressBar()
}
} }

View file

@ -27,9 +27,10 @@
android:layout_alignEnd="@id/pending_uploads_image_view" android:layout_alignEnd="@id/pending_uploads_image_view"
android:layout_alignRight="@id/pending_uploads_image_view" android:layout_alignRight="@id/pending_uploads_image_view"
android:background="@drawable/notification_badge" android:background="@drawable/notification_badge"
android:backgroundTint="@color/button_blue"
android:gravity="center" android:gravity="center"
android:padding="@dimen/miniscule_margin" android:padding="@dimen/miniscule_margin"
android:textColor="?attr/notification_icon_text_color" android:textColor="@color/white"
android:textSize="7sp" android:textSize="7sp"
android:textStyle="bold" android:textStyle="bold"
android:visibility="gone" android:visibility="gone"
@ -47,10 +48,9 @@
android:layout_marginEnd="0dp" android:layout_marginEnd="0dp"
android:layout_marginRight="0dp" android:layout_marginRight="0dp"
android:background="@drawable/notification_badge" android:background="@drawable/notification_badge"
android:backgroundTint="@color/button_blue"
android:gravity="center" android:gravity="center"
android:padding="@dimen/miniscule_margin" android:padding="@dimen/miniscule_margin"
android:textColor="@color/white" android:textColor="?attr/notification_icon_text_color"
android:textSize="7sp" android:textSize="7sp"
android:textStyle="bold" android:textStyle="bold"
android:visibility="gone" android:visibility="gone"

View file

@ -92,50 +92,6 @@ class ContributionViewHolderUnitTests {
Assert.assertNotNull(contributionViewHolder) 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 @Test
@Throws(Exception::class) @Throws(Exception::class)
fun testWikipediaButtonClicked() { fun testWikipediaButtonClicked() {

View file

@ -162,9 +162,7 @@ class UploadClientTest {
whenever(contribution.fileKey).thenReturn(filekey) whenever(contribution.fileKey).thenReturn(filekey)
whenever(fileUtilsWrapper.getMimeType(anyOrNull<File>())).thenReturn("image/png") whenever(fileUtilsWrapper.getMimeType(anyOrNull<File>())).thenReturn("image/png")
whenever(fileUtilsWrapper.getFileChunks(anyOrNull<File>(), eq(expectedChunkSize))).thenReturn(emptyList()) whenever(fileUtilsWrapper.getFileChunks(anyOrNull<File>(), eq(expectedChunkSize))).thenReturn(emptyList())
val result = uploadClient.uploadFileToStash(filename, contribution, mock()).test() val result = uploadClient.uploadFileToStash(filename, contribution, mock()).test()
result.assertNoErrors() result.assertNoErrors()
verify(contribution, times(1)).unpause() verify(contribution, times(1)).unpause()
} }