From 3e192412dd2248209d05a534bf5024e294249804 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 2 Jul 2018 14:30:37 +0200 Subject: [PATCH] TimSort, first fix values, then sort Signed-off-by: tobiasKaminsky --- .../com/owncloud/android/db/OCUpload.java | 41 ++++++++++++++++-- .../android/files/services/FileUploader.java | 10 ++--- .../android/ui/adapter/UploadListAdapter.java | 43 +++++++++++-------- 3 files changed, 66 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/owncloud/android/db/OCUpload.java b/src/main/java/com/owncloud/android/db/OCUpload.java index a0a5fbabd22d..3b6c629f6f78 100644 --- a/src/main/java/com/owncloud/android/db/OCUpload.java +++ b/src/main/java/com/owncloud/android/db/OCUpload.java @@ -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, @@ -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. * @@ -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; @@ -229,7 +246,7 @@ public String getRemotePath() { } /** - * @param remotePath + * @param remotePath the remotePath */ public void setRemotePath(String remotePath) { mRemotePath = remotePath; @@ -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(); @@ -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} } diff --git a/src/main/java/com/owncloud/android/files/services/FileUploader.java b/src/main/java/com/owncloud/android/files/services/FileUploader.java index fa51624eed4e..317e6ec1ecde 100644 --- a/src/main/java/com/owncloud/android/files/services/FileUploader.java +++ b/src/main/java/com/owncloud/android/files/services/FileUploader.java @@ -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()) ); } diff --git a/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java index 67993e0aeee0..7827d6758c5a 100755 --- a/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java @@ -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(); @@ -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; } @@ -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); @@ -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()); } }; }