mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
Moved Auto Retry to MainActivity
This commit is contained in:
parent
9cbf9885a7
commit
5c71ca672e
5 changed files with 78 additions and 73 deletions
|
|
@ -114,7 +114,7 @@ public class ContributionsFragment
|
||||||
private static final String CONTRIBUTION_LIST_FRAGMENT_TAG = "ContributionListFragmentTag";
|
private static final String CONTRIBUTION_LIST_FRAGMENT_TAG = "ContributionListFragmentTag";
|
||||||
private MediaDetailPagerFragment mediaDetailPagerFragment;
|
private MediaDetailPagerFragment mediaDetailPagerFragment;
|
||||||
static final String MEDIA_DETAIL_PAGER_FRAGMENT_TAG = "MediaDetailFragmentTag";
|
static final String MEDIA_DETAIL_PAGER_FRAGMENT_TAG = "MediaDetailFragmentTag";
|
||||||
|
private static final int MAX_RETRIES = 10;
|
||||||
|
|
||||||
public FragmentContributionsBinding binding;
|
public FragmentContributionsBinding binding;
|
||||||
|
|
||||||
|
|
@ -791,6 +791,52 @@ public class ContributionsFragment
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restarts the upload process for a contribution
|
||||||
|
*
|
||||||
|
* @param contribution
|
||||||
|
*/
|
||||||
|
public void restartUpload(Contribution contribution) {
|
||||||
|
contribution.setState(Contribution.STATE_QUEUED);
|
||||||
|
contributionsPresenter.saveContribution(contribution);
|
||||||
|
Timber.d("Restarting for %s", contribution.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retry upload when it is failed
|
||||||
|
*
|
||||||
|
* @param contribution contribution to be retried
|
||||||
|
*/
|
||||||
|
public void retryUpload(Contribution contribution) {
|
||||||
|
if (NetworkUtils.isInternetConnectionEstablished(getContext())) {
|
||||||
|
if (contribution.getState() == STATE_PAUSED
|
||||||
|
|| contribution.getState() == Contribution.STATE_QUEUED_LIMITED_CONNECTION_MODE) {
|
||||||
|
restartUpload(contribution);
|
||||||
|
} else if (contribution.getState() == STATE_FAILED) {
|
||||||
|
int retries = contribution.getRetries();
|
||||||
|
// TODO: Improve UX. Additional details: https://github.com/commons-app/apps-android-commons/pull/5257#discussion_r1304662562
|
||||||
|
/* Limit the number of retries for a failed upload
|
||||||
|
to handle cases like invalid filename as such uploads
|
||||||
|
will never be successful */
|
||||||
|
if (retries < MAX_RETRIES) {
|
||||||
|
contribution.setRetries(retries + 1);
|
||||||
|
Timber.d("Retried uploading %s %d times", contribution.getMedia().getFilename(),
|
||||||
|
retries + 1);
|
||||||
|
restartUpload(contribution);
|
||||||
|
} else {
|
||||||
|
// TODO: Show the exact reason for failure
|
||||||
|
Toast.makeText(getContext(),
|
||||||
|
R.string.retry_limit_reached, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Timber.d("Skipping re-upload for non-failed %s", contribution.toString());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ViewUtil.showLongToast(getContext(), R.string.this_function_needs_network_connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reload media detail fragment once media is nominated
|
* Reload media detail fragment once media is nominated
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -47,4 +47,17 @@ public class ContributionsPresenter implements UserActionListener {
|
||||||
return repository.getContributionWithFileName(title);
|
return repository.getContributionWithFileName(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the contribution's state in the databse, upon completion, trigger the workmanager to
|
||||||
|
* process this contribution
|
||||||
|
*
|
||||||
|
* @param contribution
|
||||||
|
*/
|
||||||
|
public void saveContribution(Contribution contribution) {
|
||||||
|
compositeDisposable.add(repository
|
||||||
|
.save(contribution)
|
||||||
|
.subscribeOn(ioThreadScheduler)
|
||||||
|
.subscribe(() -> WorkRequestHelper.Companion.makeOneTimeWorkRequest(
|
||||||
|
view.getContext().getApplicationContext(), ExistingWorkPolicy.KEEP)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -384,6 +384,21 @@ public class MainActivity extends BaseActivity
|
||||||
//initBackButton();
|
//initBackButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retry all failed uploads as soon as the user returns to the app
|
||||||
|
*/
|
||||||
|
@SuppressLint("CheckResult")
|
||||||
|
private void retryAllFailedUploads() {
|
||||||
|
contributionDao.
|
||||||
|
getContribution(Collections.singletonList(Contribution.STATE_FAILED))
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.subscribe(failedUploads -> {
|
||||||
|
for (Contribution contribution: failedUploads) {
|
||||||
|
contributionsFragment.retryUpload(contribution);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
|
|
@ -425,6 +440,8 @@ public class MainActivity extends BaseActivity
|
||||||
defaultKvStore.putBoolean("inAppCameraFirstRun", true);
|
defaultKvStore.putBoolean("inAppCameraFirstRun", true);
|
||||||
WelcomeActivity.startYourself(this);
|
WelcomeActivity.startYourself(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retryAllFailedUploads();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,6 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon
|
||||||
private var param2: String? = null
|
private var param2: String? = null
|
||||||
private val ARG_PARAM1 = "param1"
|
private val ARG_PARAM1 = "param1"
|
||||||
private val ARG_PARAM2 = "param2"
|
private val ARG_PARAM2 = "param2"
|
||||||
private val MAX_RETRIES = 10
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
lateinit var pendingUploadsPresenter: PendingUploadsPresenter
|
lateinit var pendingUploadsPresenter: PendingUploadsPresenter
|
||||||
|
|
@ -154,7 +153,7 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon
|
||||||
val last = sortedContributionsList.last()
|
val last = sortedContributionsList.last()
|
||||||
for (i in sortedContributionsList.indices) {
|
for (i in sortedContributionsList.indices) {
|
||||||
val current = sortedContributionsList[i]
|
val current = sortedContributionsList[i]
|
||||||
if (current.transferred == 0L && current.state != Contribution.STATE_QUEUED && (current.dateModifiedInMillis() / 100) > (last.dateModifiedInMillis() / 100)){
|
if (current.transferred == 0L && (current.dateModifiedInMillis() / 100) > (last.dateModifiedInMillis() / 100)){
|
||||||
listOfRemoved.add(current)
|
listOfRemoved.add(current)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -242,54 +241,6 @@ class PendingUploadsFragment : CommonsDaggerSupportFragment(), PendingUploadsCon
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Restarts the upload process for a contribution
|
|
||||||
*
|
|
||||||
* @param contribution
|
|
||||||
*/
|
|
||||||
fun restartUpload(contribution: Contribution) {
|
|
||||||
contribution.state = Contribution.STATE_QUEUED
|
|
||||||
pendingUploadsPresenter.saveContribution(contribution, this.requireContext().applicationContext)
|
|
||||||
Timber.d("Restarting for %s", contribution.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retry upload when it is failed
|
|
||||||
*
|
|
||||||
* @param contribution contribution to be retried
|
|
||||||
*/
|
|
||||||
fun retryUpload(contribution: Contribution) {
|
|
||||||
if (NetworkUtils.isInternetConnectionEstablished(context)) {
|
|
||||||
if (contribution.state == Contribution.STATE_PAUSED) {
|
|
||||||
restartUpload(contribution)
|
|
||||||
} else if (contribution.state == Contribution.STATE_FAILED) {
|
|
||||||
val retries = contribution.retries
|
|
||||||
// TODO: Improve UX. Additional details: https://github.com/commons-app/apps-android-commons/pull/5257#discussion_r1304662562
|
|
||||||
/* Limit the number of retries for a failed upload
|
|
||||||
to handle cases like invalid filename as such uploads
|
|
||||||
will never be successful */
|
|
||||||
if (retries < MAX_RETRIES) {
|
|
||||||
contribution.retries = retries + 1
|
|
||||||
Timber.d(
|
|
||||||
"Retried uploading %s %d times", contribution.media.filename,
|
|
||||||
retries + 1
|
|
||||||
)
|
|
||||||
restartUpload(contribution)
|
|
||||||
} else {
|
|
||||||
// TODO: Show the exact reason for failure
|
|
||||||
Toast.makeText(
|
|
||||||
context,
|
|
||||||
R.string.retry_limit_reached, Toast.LENGTH_SHORT
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Timber.d("Skipping re-upload for non-failed %s", contribution.toString())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ViewUtil.showLongToast(context, R.string.this_function_needs_network_connection)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun resetProgressBar() {
|
fun resetProgressBar() {
|
||||||
totalUploads = 0
|
totalUploads = 0
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -169,26 +169,4 @@ class UploadProgressActivity : BaseActivity() {
|
||||||
pendingUploadsFragment!!.resetProgressBar()
|
pendingUploadsFragment!!.resetProgressBar()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
|
||||||
super.onResume()
|
|
||||||
retryAllFailedUploads()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retry all failed uploads as soon as the user returns to the app
|
|
||||||
*/
|
|
||||||
@SuppressLint("CheckResult")
|
|
||||||
private fun retryAllFailedUploads() {
|
|
||||||
pendingUploadsFragment!!.resetProgressBar()
|
|
||||||
contributionDao.getContribution(listOf(Contribution.STATE_FAILED))
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.subscribe { failedUploads: List<Contribution?> ->
|
|
||||||
for (contribution in failedUploads) {
|
|
||||||
if (contribution != null) {
|
|
||||||
pendingUploadsFragment!!.retryUpload(contribution)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue