mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
ensure that cancelled uploads are really getting cancelled (#5367)
This commit is contained in:
parent
6166fde7cd
commit
39a2fbe3d5
3 changed files with 47 additions and 15 deletions
|
|
@ -141,6 +141,11 @@ public class CommonsApplication extends MultiDexApplication {
|
||||||
*/
|
*/
|
||||||
public static Map<String, Boolean> pauseUploads = new HashMap<>();
|
public static Map<String, Boolean> pauseUploads = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In-memory list of uploads that have been cancelled by the user
|
||||||
|
*/
|
||||||
|
public static HashSet<String> cancelledUploads = new HashSet<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to declare and initialize various components and dependencies
|
* Used to declare and initialize various components and dependencies
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import butterknife.OnClick;
|
import butterknife.OnClick;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
|
import fr.free.nrw.commons.CommonsApplication;
|
||||||
import fr.free.nrw.commons.Media;
|
import fr.free.nrw.commons.Media;
|
||||||
import fr.free.nrw.commons.R;
|
import fr.free.nrw.commons.R;
|
||||||
import fr.free.nrw.commons.Utils;
|
import fr.free.nrw.commons.Utils;
|
||||||
|
|
@ -429,6 +430,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
|
||||||
() -> {
|
() -> {
|
||||||
ViewUtil.showShortToast(getContext(), R.string.cancelling_upload);
|
ViewUtil.showShortToast(getContext(), R.string.cancelling_upload);
|
||||||
contributionsListPresenter.deleteUpload(contribution);
|
contributionsListPresenter.deleteUpload(contribution);
|
||||||
|
CommonsApplication.cancelledUploads.add(contribution.getPageId());
|
||||||
}, () -> {
|
}, () -> {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -172,6 +172,16 @@ class UploadWorker(var appContext: Context, workerParams: WorkerParameters) :
|
||||||
CommonsApplication.NOTIFICATION_CHANNEL_ID_ALL
|
CommonsApplication.NOTIFICATION_CHANNEL_ID_ALL
|
||||||
)!!
|
)!!
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
|
/*
|
||||||
|
queuedContributions receives the results from a one-shot query.
|
||||||
|
This means that once the list has been fetched from the database,
|
||||||
|
it does not get updated even if some changes (insertions, deletions, etc.)
|
||||||
|
are made to the contribution table afterwards.
|
||||||
|
|
||||||
|
Related issues (fixed):
|
||||||
|
https://github.com/commons-app/apps-android-commons/issues/5136
|
||||||
|
https://github.com/commons-app/apps-android-commons/issues/5346
|
||||||
|
*/
|
||||||
val queuedContributions = contributionDao.getContribution(statesToProcess)
|
val queuedContributions = contributionDao.getContribution(statesToProcess)
|
||||||
.blockingGet()
|
.blockingGet()
|
||||||
//Showing initial notification for the number of uploads being processed
|
//Showing initial notification for the number of uploads being processed
|
||||||
|
|
@ -202,24 +212,32 @@ class UploadWorker(var appContext: Context, workerParams: WorkerParameters) :
|
||||||
}
|
}
|
||||||
|
|
||||||
queuedContributions.asFlow().map { contribution ->
|
queuedContributions.asFlow().map { contribution ->
|
||||||
/**
|
// Upload the contribution if it has not been cancelled by the user
|
||||||
* If the limited connection mode is on, lets iterate through the queued
|
if (!CommonsApplication.cancelledUploads.contains(contribution.pageId)) {
|
||||||
* contributions
|
/**
|
||||||
* and set the state as STATE_QUEUED_LIMITED_CONNECTION_MODE ,
|
* If the limited connection mode is on, lets iterate through the queued
|
||||||
* otherwise proceed with the upload
|
* contributions
|
||||||
*/
|
* and set the state as STATE_QUEUED_LIMITED_CONNECTION_MODE ,
|
||||||
if (isLimitedConnectionModeEnabled()) {
|
* otherwise proceed with the upload
|
||||||
if (contribution.state == Contribution.STATE_QUEUED) {
|
*/
|
||||||
contribution.state = Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE
|
if (isLimitedConnectionModeEnabled()) {
|
||||||
|
if (contribution.state == Contribution.STATE_QUEUED) {
|
||||||
|
contribution.state = Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE
|
||||||
|
contributionDao.saveSynchronous(contribution)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
contribution.transferred = 0
|
||||||
|
contribution.state = Contribution.STATE_IN_PROGRESS
|
||||||
contributionDao.saveSynchronous(contribution)
|
contributionDao.saveSynchronous(contribution)
|
||||||
|
setProgressAsync(Data.Builder().putInt("progress", countUpload).build())
|
||||||
|
countUpload++
|
||||||
|
uploadContribution(contribution = contribution)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
contribution.transferred = 0
|
/* We can remove the cancelled upload from the hashset
|
||||||
contribution.state = Contribution.STATE_IN_PROGRESS
|
as this contribution will not be processed again
|
||||||
contributionDao.saveSynchronous(contribution)
|
*/
|
||||||
setProgressAsync(Data.Builder().putInt("progress", countUpload).build())
|
removeUploadFromInMemoryHashSet(contribution)
|
||||||
countUpload++
|
|
||||||
uploadContribution(contribution = contribution)
|
|
||||||
}
|
}
|
||||||
}.collect()
|
}.collect()
|
||||||
|
|
||||||
|
|
@ -240,6 +258,13 @@ class UploadWorker(var appContext: Context, workerParams: WorkerParameters) :
|
||||||
return Result.success()
|
return Result.success()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the processed contribution from the cancelledUploads in-memory hashset
|
||||||
|
*/
|
||||||
|
private fun removeUploadFromInMemoryHashSet(contribution: Contribution) {
|
||||||
|
CommonsApplication.cancelledUploads.remove(contribution.pageId)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create new notification for foreground service
|
* Create new notification for foreground service
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue