With pause and resume for uploads (#3858)

* With pause and resume for uploads

* Dispose current upload

* Make pause and resume work

* Check stash validity

* With java docs

* minor
This commit is contained in:
Vivek Maskara 2020-07-07 07:32:41 -07:00 committed by GitHub
parent e40e9690dd
commit 6f4c60b5ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
27 changed files with 483 additions and 155 deletions

View file

@ -0,0 +1,36 @@
package fr.free.nrw.commons.contributions
import android.os.Parcel
import android.os.Parcelable
import fr.free.nrw.commons.upload.UploadResult
import kotlinx.android.parcel.Parcelize
data class ChunkInfo(
val uploadResult: UploadResult,
val lastChunkIndex: Int
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readParcelable(UploadResult::class.java.classLoader),
parcel.readInt()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeParcelable(uploadResult, flags)
parcel.writeInt(lastChunkIndex)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<ChunkInfo> {
override fun createFromParcel(parcel: Parcel): ChunkInfo {
return ChunkInfo(parcel)
}
override fun newArray(size: Int): Array<ChunkInfo?> {
return arrayOfNulls(size)
}
}
}

View file

@ -25,6 +25,7 @@ data class Contribution constructor(
val decimalCoords: String? = null,
var dateCreatedSource: String? = null,
var wikidataPlace: WikidataPlace? = null,
var chunkInfo: ChunkInfo? = null,
/**
* @return array list of entityids for the depictions
*/
@ -36,7 +37,8 @@ data class Contribution constructor(
var mimeType: String? = null,
val localUri: Uri? = null,
var dataLength: Long = 0,
var dateCreated: Date? = null
var dateCreated: Date? = null,
var dateModified: Date? = null
) : Parcelable {
fun completeWith(media: Media): Contribution {
@ -68,6 +70,7 @@ data class Contribution constructor(
const val STATE_FAILED = 1
const val STATE_QUEUED = 2
const val STATE_IN_PROGRESS = 3
const val STATE_PAUSED = 4
/**
* Formatting captions to the Wikibase format for sending labels

View file

@ -10,6 +10,8 @@ import androidx.room.Transaction;
import androidx.room.Update;
import io.reactivex.Completable;
import io.reactivex.Single;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@Dao
@ -23,7 +25,10 @@ public abstract class ContributionDao {
public Completable save(final Contribution contribution) {
return Completable
.fromAction(() -> saveSynchronous(contribution));
.fromAction(() -> {
contribution.setDateModified(Calendar.getInstance().getTime());
saveSynchronous(contribution);
});
}
@Transaction
@ -67,6 +72,9 @@ public abstract class ContributionDao {
public Completable update(final Contribution contribution) {
return Completable
.fromAction(() -> updateSynchronous(contribution));
.fromAction(() -> {
contribution.setDateModified(Calendar.getInstance().getTime());
updateSynchronous(contribution);
});
}
}

View file

@ -43,6 +43,8 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
ImageButton retryButton;
@BindView(R.id.cancelButton)
ImageButton cancelButton;
@BindView(R.id.pauseResumeButton)
ImageButton pauseResumeButton;
private int position;
@ -93,7 +95,11 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
case Contribution.STATE_IN_PROGRESS:
stateView.setVisibility(View.GONE);
progressView.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.GONE);
addToWikipediaButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE);
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
final long total = contribution.getDataLength();
final long transferred = contribution.getTransferred();
if (transferred == 0 || transferred >= total) {
@ -102,10 +108,23 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
progressView.setProgress((int) (((double) transferred / (double) total) * 100));
}
break;
case Contribution.STATE_PAUSED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.paused);
setResume();
progressView.setVisibility(View.GONE);
cancelButton.setVisibility(View.GONE);
retryButton.setVisibility(View.GONE);
pauseResumeButton.setVisibility(View.VISIBLE);
imageOptions.setVisibility(View.VISIBLE);
break;
case Contribution.STATE_FAILED:
stateView.setVisibility(View.VISIBLE);
stateView.setText(R.string.contribution_state_failed);
progressView.setVisibility(View.GONE);
cancelButton.setVisibility(View.VISIBLE);
retryButton.setVisibility(View.VISIBLE);
pauseResumeButton.setVisibility(View.GONE);
imageOptions.setVisibility(View.VISIBLE);
break;
}
@ -187,4 +206,34 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder {
public void wikipediaButtonClicked() {
callback.addImageToWikipedia(contribution);
}
/**
* Triggers a callback for pause/resume
*/
@OnClick(R.id.pauseResumeButton)
public void onPauseResumeButtonClicked() {
if (pauseResumeButton.getTag().toString().equals("pause")) {
callback.pauseUpload(contribution);
setResume();
} else {
callback.resumeUpload(contribution);
setPaused();
}
}
/**
* Update pause/resume button to show pause state
*/
private void setPaused() {
pauseResumeButton.setImageResource(R.drawable.pause_icon);
pauseResumeButton.setTag(R.string.pause);
}
/**
* Update pause/resume button to show resume state
*/
private void setResume() {
pauseResumeButton.setImageResource(R.drawable.play_icon);
pauseResumeButton.setTag(R.string.resume);
}
}

View file

@ -1,6 +1,7 @@
package fr.free.nrw.commons.contributions;
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
import static fr.free.nrw.commons.contributions.Contribution.STATE_PAUSED;
import static fr.free.nrw.commons.contributions.MainActivity.CONTRIBUTIONS_TAB_POSITION;
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
@ -454,7 +455,7 @@ public class ContributionsFragment
@Override
public void retryUpload(Contribution contribution) {
if (NetworkUtils.isInternetConnectionEstablished(getContext())) {
if (contribution.getState() == STATE_FAILED && null != uploadService) {
if (contribution.getState() == STATE_FAILED || contribution.getState() == STATE_PAUSED && null != uploadService) {
uploadService.queue(contribution);
Timber.d("Restarting for %s", contribution.toString());
} else {
@ -466,6 +467,15 @@ public class ContributionsFragment
}
/**
* Pauses the upload
* @param contribution
*/
@Override
public void pauseUpload(Contribution contribution) {
uploadService.pauseUpload(contribution);
}
/**
* Replace whatever is in the current contributionsFragmentContainer view with
* mediaDetailPagerFragment, and preserve previous state in back stack. Called when user selects a

View file

@ -78,5 +78,9 @@ public class ContributionsListAdapter extends
void openMediaDetail(int contribution);
void addImageToWikipedia(Contribution contribution);
void pauseUpload(Contribution contribution);
void resumeUpload(Contribution contribution);
}
}

View file

@ -36,6 +36,7 @@ import java.util.Locale;
import javax.inject.Inject;
import javax.inject.Named;
import org.wikipedia.dataclient.WikiSite;
import timber.log.Timber;
/**
* Created by root on 01.06.2018.
@ -90,6 +91,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
private final int SPAN_COUNT_PORTRAIT = 1;
@Override
public View onCreateView(
final LayoutInflater inflater, @Nullable final ViewGroup container,
@Nullable final Bundle savedInstanceState) {
@ -192,6 +194,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
/**
* Shows welcome message if user has no contributions yet i.e. new user.
*/
@Override
public void showWelcomeTip(final boolean shouldShow) {
noContributionsYet.setVisibility(shouldShow ? VISIBLE : GONE);
}
@ -201,10 +204,12 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
*
* @param shouldShow True when contributions list should be hidden.
*/
@Override
public void showProgress(final boolean shouldShow) {
progressBar.setVisibility(shouldShow ? VISIBLE : GONE);
}
@Override
public void showNoContributionsUI(final boolean shouldShow) {
noContributionsYet.setVisibility(shouldShow ? VISIBLE : GONE);
}
@ -263,6 +268,24 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
});
}
/**
* Pauses the current upload
* @param contribution
*/
@Override
public void pauseUpload(Contribution contribution) {
callback.pauseUpload(contribution);
}
/**
* Resumes the current upload
* @param contribution
*/
@Override
public void resumeUpload(Contribution contribution) {
callback.retryUpload(contribution);
}
/**
* Display confirmation dialog with instructions when the user tries to add image to wikipedia
*
@ -311,6 +334,8 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
void retryUpload(Contribution contribution);
void pauseUpload(Contribution contribution);
void showDetail(int position);
}
}

View file

@ -3,6 +3,7 @@ package fr.free.nrw.commons.contributions;
import androidx.paging.DataSource.Factory;
import io.reactivex.Completable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.inject.Inject;