Skip to content

Commit

Permalink
Merge pull request #2788 from nextcloud/backport-2781
Browse files Browse the repository at this point in the history
Backport of #2781: TimSort, first fix values, then sort
  • Loading branch information
AndyScherzinger authored Jul 4, 2018
2 parents 7bcc93d + 3e19241 commit 5a51327
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 28 deletions.
41 changes: 37 additions & 4 deletions src/main/java/com/owncloud/android/db/OCUpload.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
/**
/*
* ownCloud Android client application
*
* @author LukeOwncloud
* @author masensio
* @author David A. Velasco
* @author Tobias Kaminsky
* Copyright (C) 2016 ownCloud Inc.
* Copyright (C) 2018 Nextcloud GmbH.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2,
Expand Down Expand Up @@ -117,6 +119,14 @@ public class OCUpload implements Parcelable {
*/
private String mFolderUnlockToken;

/**
* temporary values, used for sorting
*/
private UploadStatus mFixedUploadStatus;
private boolean mFixedUploadingNow;
private long mFixedUploadEndTimeStamp;
private long mFixedId;

/**
* Main constructor.
*
Expand Down Expand Up @@ -170,6 +180,13 @@ private void resetData() {
mFolderUnlockToken = "";
}

public void setDataFixed(FileUploader.FileUploaderBinder binder) {
mFixedUploadStatus = mUploadStatus;
mFixedUploadingNow = binder != null && binder.isUploadingNow(this);
mFixedUploadEndTimeStamp = mUploadEndTimeStamp;
mFixedId = mId;
}

// Getters & Setters
public void setUploadId(long id) {
mId = id;
Expand Down Expand Up @@ -229,7 +246,7 @@ public String getRemotePath() {
}

/**
* @param remotePath
* @param remotePath the remotePath
*/
public void setRemotePath(String remotePath) {
mRemotePath = remotePath;
Expand Down Expand Up @@ -391,11 +408,11 @@ public String getFolderUnlockToken() {
*
* @param source The source parcel
*/
protected OCUpload(Parcel source) {
private OCUpload(Parcel source) {
readFromParcel(source);
}

public void readFromParcel(Parcel source) {
private void readFromParcel(Parcel source) {
mId = source.readLong();
mLocalPath = source.readString();
mRemotePath = source.readString();
Expand Down Expand Up @@ -443,5 +460,21 @@ public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mFolderUnlockToken);
}

public UploadStatus getFixedUploadStatus() {
return mFixedUploadStatus;
}

public boolean isFixedUploadingNow() {
return mFixedUploadingNow;
}

public long getFixedUploadEndTimestamp() {
return mFixedUploadEndTimeStamp;
}

public Long getFixedUploadId() {
return mFixedId;
}

enum CanUploadFileNowStatus {NOW, LATER, FILE_GONE, ERROR}
}
Original file line number Diff line number Diff line change
Expand Up @@ -877,11 +877,11 @@ public boolean isUploading(Account account, OCFile file) {

public boolean isUploadingNow(OCUpload upload) {
return (
upload != null &&
mCurrentAccount != null &&
mCurrentUpload != null &&
upload.getAccountName().equals(mCurrentAccount.name) &&
upload.getRemotePath().equals(mCurrentUpload.getRemotePath())
upload != null &&
mCurrentAccount != null &&
mCurrentUpload != null &&
upload.getAccountName().equals(mCurrentAccount.name) &&
upload.getRemotePath().equals(mCurrentUpload.getRemotePath())
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,24 +113,21 @@ public UploadListAdapter(FileActivity parentActivity) {
mUploadGroups[0] = new UploadGroup(mParentActivity.getString(R.string.uploads_view_group_current_uploads)) {
@Override
public void refresh() {
setItems(mUploadsStorageManager.getCurrentAndPendingUploadsForCurrentAccount());
Arrays.sort(getItems(), comparator);
fixAndSortItems(mUploadsStorageManager.getCurrentAndPendingUploadsForCurrentAccount());
}
};

mUploadGroups[1] = new UploadGroup(mParentActivity.getString(R.string.uploads_view_group_failed_uploads)) {
@Override
public void refresh() {
setItems(mUploadsStorageManager.getFailedButNotDelayedUploadsForCurrentAccount());
Arrays.sort(getItems(), comparator);
fixAndSortItems(mUploadsStorageManager.getFailedButNotDelayedUploadsForCurrentAccount());
}
};

mUploadGroups[2] = new UploadGroup(mParentActivity.getString(R.string.uploads_view_group_finished_uploads)) {
@Override
public void refresh() {
setItems(mUploadsStorageManager.getFinishedUploadsForCurrentAccount());
Arrays.sort(getItems(), comparator);
fixAndSortItems(mUploadsStorageManager.getFinishedUploadsForCurrentAccount());
}
};
loadUploadItemsFromDb();
Expand Down Expand Up @@ -624,6 +621,17 @@ public void setItems(OCUpload[] items) {
this.items = items;
}

void fixAndSortItems(OCUpload[] array) {
FileUploader.FileUploaderBinder binder = mParentActivity.getFileUploaderBinder();

for (OCUpload upload : array) {
upload.setDataFixed(binder);
}
Arrays.sort(array, comparator);

setItems(array);
}

private int getGroupItemCount() {
return items == null ? 0 : items.length;
}
Expand All @@ -640,23 +648,20 @@ public int compare(OCUpload upload1, OCUpload upload2) {
if (upload2 == null) {
return 1;
}
if (UploadStatus.UPLOAD_IN_PROGRESS.equals(upload1.getUploadStatus())) {
if (!UploadStatus.UPLOAD_IN_PROGRESS.equals(upload2.getUploadStatus())) {
if (UploadStatus.UPLOAD_IN_PROGRESS.equals(upload1.getFixedUploadStatus())) {
if (!UploadStatus.UPLOAD_IN_PROGRESS.equals(upload2.getFixedUploadStatus())) {
return -1;
}
// both are in progress
FileUploader.FileUploaderBinder binder = mParentActivity.getFileUploaderBinder();
if (binder != null) {
if (binder.isUploadingNow(upload1)) {
return -1;
} else if (binder.isUploadingNow(upload2)) {
return 1;
}
if (upload1.isFixedUploadingNow()) {
return -1;
} else if (upload2.isFixedUploadingNow()) {
return 1;
}
} else if (upload2.getUploadStatus().equals(UploadStatus.UPLOAD_IN_PROGRESS)) {
} else if (upload2.getFixedUploadStatus().equals(UploadStatus.UPLOAD_IN_PROGRESS)) {
return 1;
}
if (upload1.getUploadEndTimestamp() == 0 || upload2.getUploadEndTimestamp() == 0) {
if (upload1.getFixedUploadEndTimestamp() == 0 || upload2.getFixedUploadEndTimestamp() == 0) {
return compareUploadId(upload1, upload2);
} else {
return compareUpdateTime(upload1, upload2);
Expand All @@ -665,12 +670,12 @@ public int compare(OCUpload upload1, OCUpload upload2) {

@SuppressFBWarnings("Bx")
private int compareUploadId(OCUpload upload1, OCUpload upload2) {
return Long.valueOf(upload1.getUploadId()).compareTo(upload2.getUploadId());
return Long.valueOf(upload1.getFixedUploadId()).compareTo(upload2.getFixedUploadId());
}

@SuppressFBWarnings("Bx")
private int compareUpdateTime(OCUpload upload1, OCUpload upload2) {
return Long.valueOf(upload2.getUploadEndTimestamp()).compareTo(upload1.getUploadEndTimestamp());
return Long.valueOf(upload2.getFixedUploadEndTimestamp()).compareTo(upload1.getFixedUploadEndTimestamp());
}
};
}
Expand Down

0 comments on commit 5a51327

Please sign in to comment.