Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,9 @@ class FileUploadHelper {
val capability = fileStorageManager.getCapability(accountManager.user)

try {
getUploadsByStatus(null, UploadStatus.UPLOAD_FAILED, capability) {
if (it.isNotEmpty()) {
ioScope.launch {
val uploads = getUploadsByStatus(null, UploadStatus.UPLOAD_FAILED, capability)
if (uploads.isNotEmpty()) {
isUploadStarted = true
}

Expand All @@ -134,7 +135,7 @@ class FileUploadHelper {
connectivityService,
accountManager,
powerManagementService,
uploads = it
uploads
)
}
} finally {
Expand All @@ -144,26 +145,21 @@ class FileUploadHelper {
return isUploadStarted
}

fun retryCancelledUploads(
suspend fun retryCancelledUploads(
uploadsStorageManager: UploadsStorageManager,
connectivityService: ConnectivityService,
accountManager: UserAccountManager,
powerManagementService: PowerManagementService
): Boolean {
var result = false
val capability = fileStorageManager.getCapability(accountManager.user)

getUploadsByStatus(accountManager.user.accountName, UploadStatus.UPLOAD_CANCELLED, capability) {
result = retryUploads(
uploadsStorageManager,
connectivityService,
accountManager,
powerManagementService,
it
)
}

return result
val uploads = getUploadsByStatus(accountManager.user.accountName, UploadStatus.UPLOAD_CANCELLED, capability)
return retryUploads(
uploadsStorageManager,
connectivityService,
accountManager,
powerManagementService,
uploads
)
}

@Suppress("ComplexCondition")
Expand All @@ -172,7 +168,7 @@ class FileUploadHelper {
connectivityService: ConnectivityService,
accountManager: UserAccountManager,
powerManagementService: PowerManagementService,
uploads: Array<OCUpload>
uploads: List<OCUpload>
): Boolean {
var showNotExistMessage = false
var showSyncConflictNotification = false
Expand Down Expand Up @@ -343,31 +339,24 @@ class FileUploadHelper {
* belonging to that account are retrieved. If [accountName] is `null`, uploads with the
* given [status] from **all user accounts** are returned.
*
* Once the uploads are fetched, the [onCompleted] callback is invoked with the resulting array.
*
* @param accountName The name of the account to filter uploads by.
* If `null`, uploads matching the given [status] from all accounts are returned.
* @param status The [UploadStatus] to filter uploads by (e.g., `UPLOAD_FAILED`).
* @param nameCollisionPolicy The [NameCollisionPolicy] to filter uploads by (e.g., `SKIP`).
* @param onCompleted A callback invoked with the resulting array of [OCUpload] objects.
*/
fun getUploadsByStatus(
suspend fun getUploadsByStatus(
accountName: String?,
status: UploadStatus,
capability: OCCapability,
nameCollisionPolicy: NameCollisionPolicy? = null,
onCompleted: (Array<OCUpload>) -> Unit
) {
ioScope.launch {
val dao = uploadsStorageManager.uploadDao
val result = if (accountName != null) {
dao.getUploadsByAccountNameAndStatus(accountName, status.value, nameCollisionPolicy?.serialize())
} else {
dao.getUploadsByStatus(status.value, nameCollisionPolicy?.serialize())
}.mapNotNull {
it.toOCUpload(capability)
}.toTypedArray()
onCompleted(result)
nameCollisionPolicy: NameCollisionPolicy? = null
): List<OCUpload> {
val dao = uploadsStorageManager.uploadDao
return if (accountName != null) {
dao.getUploadsByAccountNameAndStatus(accountName, status.value, nameCollisionPolicy?.serialize())
} else {
dao.getUploadsByStatus(status.value, nameCollisionPolicy?.serialize())
}.mapNotNull {
it.toOCUpload(capability)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,61 @@

package com.nextcloud.utils.extensions

import android.content.Context
import com.nextcloud.client.preferences.AppPreferences
import com.owncloud.android.R
import com.owncloud.android.datamodel.UploadsStorageManager
import com.owncloud.android.db.OCUpload
import com.owncloud.android.db.UploadResult
import com.owncloud.android.files.services.NameCollisionPolicy

fun List<OCUpload>.getUploadIds(): LongArray = map { it.uploadId }.toLongArray()

fun Array<OCUpload>.getUploadIds(): LongArray = map { it.uploadId }.toLongArray()

fun List<OCUpload>.sortedByUploadOrder(): List<OCUpload> = sortedWith(
compareBy<OCUpload> { it.fixedUploadStatus }
.thenByDescending { it.isFixedUploadingNow }
.thenByDescending { it.fixedUploadEndTimeStamp }
.thenBy { it.fixedUploadId }
)

fun OCUpload.getStatusText(activity: Context, isGlobalUploadPaused: Boolean, isUploading: Boolean): String {
val status: String
val res = activity.resources
when (val uploadStatus = uploadStatus) {
UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS -> {
status = if (isGlobalUploadPaused) {
res.getString(R.string.upload_global_pause_title)
} else if (isUploading) {
res.getString(R.string.uploader_upload_in_progress_ticker)
} else {
res.getString(R.string.uploads_view_later_waiting_to_upload)
}
}

UploadsStorageManager.UploadStatus.UPLOAD_SUCCEEDED -> {
status = if (lastResult == UploadResult.SAME_FILE_CONFLICT) {
res.getString(R.string.uploads_view_upload_status_succeeded_same_file)
} else if (lastResult == UploadResult.FILE_NOT_FOUND) {
lastResult.getFailedStatusText(activity)
} else if (nameCollisionPolicy == NameCollisionPolicy.SKIP) {
res.getString(R.string.uploads_view_upload_status_skip_reason)
} else {
res.getString(R.string.uploads_view_upload_status_succeeded)
}
}

UploadsStorageManager.UploadStatus.UPLOAD_FAILED ->
status =
lastResult.getFailedStatusText(activity)

UploadsStorageManager.UploadStatus.UPLOAD_CANCELLED ->
status =
res.getString(R.string.upload_manually_cancelled)

else -> status = "Uncontrolled status: $uploadStatus"
}

return status
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

package com.nextcloud.utils.extensions

import android.content.Context
import com.owncloud.android.R
import com.owncloud.android.db.UploadResult

fun UploadResult.isNonRetryable(): Boolean = when (this) {
Expand All @@ -32,3 +34,72 @@ fun UploadResult.isNonRetryable(): Boolean = when (this) {
// everything else may succeed after retry
else -> false
}

fun UploadResult.getFailedStatusText(context: Context): String = when (this) {
UploadResult.CREDENTIAL_ERROR ->
context.getString(R.string.uploads_view_upload_status_failed_credentials_error)

UploadResult.FOLDER_ERROR ->
context.getString(R.string.uploads_view_upload_status_failed_folder_error)

UploadResult.FILE_NOT_FOUND ->
context.getString(R.string.uploads_view_upload_status_failed_localfile_error)

UploadResult.FILE_ERROR -> context.getString(R.string.uploads_view_upload_status_failed_file_error)

UploadResult.PRIVILEGES_ERROR -> context.getString(
R.string.uploads_view_upload_status_failed_permission_error
)

UploadResult.NETWORK_CONNECTION ->
context.getString(R.string.uploads_view_upload_status_failed_connection_error)

UploadResult.DELAYED_FOR_WIFI -> context.getString(
R.string.uploads_view_upload_status_waiting_for_wifi
)

UploadResult.DELAYED_FOR_CHARGING ->
context.getString(R.string.uploads_view_upload_status_waiting_for_charging)

UploadResult.CONFLICT_ERROR -> context.getString(R.string.uploads_view_upload_status_conflict)

UploadResult.SERVICE_INTERRUPTED -> context.getString(
R.string.uploads_view_upload_status_service_interrupted
)

UploadResult.CANCELLED -> // should not get here ; cancelled uploads should be wiped out
context.getString(R.string.uploads_view_upload_status_cancelled)

UploadResult.UPLOADED -> // should not get here ; status should be UPLOAD_SUCCESS
context.getString(R.string.uploads_view_upload_status_succeeded)

UploadResult.MAINTENANCE_MODE -> context.getString(R.string.maintenance_mode)

UploadResult.SSL_RECOVERABLE_PEER_UNVERIFIED -> context.getString(
R.string.uploads_view_upload_status_failed_ssl_certificate_not_trusted
)

UploadResult.UNKNOWN -> context.getString(R.string.uploads_view_upload_status_unknown_fail)

UploadResult.LOCK_FAILED -> context.getString(R.string.upload_lock_failed)

UploadResult.DELAYED_IN_POWER_SAVE_MODE -> context.getString(
R.string.uploads_view_upload_status_waiting_exit_power_save_mode
)

UploadResult.VIRUS_DETECTED -> context.getString(R.string.uploads_view_upload_status_virus_detected)

UploadResult.LOCAL_STORAGE_FULL -> context.getString(R.string.upload_local_storage_full)

UploadResult.OLD_ANDROID_API -> context.getString(R.string.upload_old_android)

UploadResult.SYNC_CONFLICT -> context.getString(R.string.upload_sync_conflict)

UploadResult.CANNOT_CREATE_FILE -> context.getString(R.string.upload_cannot_create_file)

UploadResult.LOCAL_STORAGE_NOT_COPIED -> context.getString(R.string.upload_local_storage_not_copied)

UploadResult.QUOTA_EXCEEDED -> context.getString(R.string.upload_quota_exceeded)

else -> context.getString(R.string.upload_unknown_error)
}
59 changes: 0 additions & 59 deletions app/src/main/java/com/owncloud/android/db/OCUploadComparator.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ public abstract class FileActivity extends DrawerActivity
protected boolean isFileDisplayActivityResumed = false;

@Inject
UserAccountManager accountManager;
public UserAccountManager accountManager;

@Inject public ConnectivityService connectivityService;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.operations.CheckCurrentCredentialsOperation;
import com.owncloud.android.ui.adapter.UploadListAdapter;
import com.owncloud.android.ui.adapter.uploadList.UploadListAdapter;
import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
import com.owncloud.android.utils.FilesSyncHelper;

Expand Down Expand Up @@ -317,7 +317,7 @@ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationRe
private class UploadFinishReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
throttler.run("update_upload_list", () -> uploadListAdapter.loadUploadItemsFromDb(() -> {}));
throttler.run("update_upload_list", () -> uploadListAdapter.loadUploadItemsFromDb());
}
}
}
Loading
Loading