/*
*
* Nextcloud Android client application
*
* @author Tobias Kaminsky
* Copyright (C) 2022 Tobias Kaminsky
* Copyright (C) 2022 Nextcloud GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package com.owncloud.android.utils
import com.nextcloud.client.account.User
import com.nextcloud.client.jobs.BackgroundJobManager
import com.owncloud.android.MainApp
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.UploadsStorageManager
import com.owncloud.android.db.OCUpload
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder
import com.owncloud.android.files.services.NameCollisionPolicy
import com.owncloud.android.lib.common.network.OnDatatransferProgressListener
import com.owncloud.android.lib.common.utils.Log_OC
import javax.inject.Inject
class FilesUploadHelper {
@Inject
lateinit var backgroundJobManager: BackgroundJobManager
@Inject
lateinit var uploadsStorageManager: UploadsStorageManager
init {
MainApp.getAppComponent().inject(this)
}
@Suppress("LongParameterList")
fun uploadNewFiles(
user: User,
localPaths: Array,
remotePaths: Array,
createRemoteFolder: Boolean,
createdBy: Int,
requiresWifi: Boolean,
requiresCharging: Boolean,
nameCollisionPolicy: NameCollisionPolicy,
localBehavior: Int
) {
val uploads = localPaths.mapIndexed { index, localPath ->
OCUpload(localPath, remotePaths[index], user.accountName).apply {
this.nameCollisionPolicy = nameCollisionPolicy
isUseWifiOnly = requiresWifi
isWhileChargingOnly = requiresCharging
uploadStatus = UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS
this.createdBy = createdBy
isCreateRemoteFolder = createRemoteFolder
localAction = localBehavior
}
}
uploadsStorageManager.storeUploads(uploads)
backgroundJobManager.startFilesUploadJob(user)
}
fun cancelFileUpload(remotePath: String, user: User) {
// need to update now table in mUploadsStorageManager,
// since the operation will not get to be run by FileUploader#uploadFile
uploadsStorageManager.removeUpload(user.accountName, remotePath)
restartUploadJob(user)
}
fun restartUploadJob(user: User) {
backgroundJobManager.cancelFilesUploadJob(user)
backgroundJobManager.startFilesUploadJob(user)
}
fun uploadUpdatedFile(
user: User,
existingFiles: Array,
behaviour: Int,
nameCollisionPolicy: NameCollisionPolicy
) {
Log_OC.d(this, "upload updated file")
val uploads = existingFiles.map { file ->
OCUpload(file, user).apply {
fileSize = file.fileLength
this.nameCollisionPolicy = nameCollisionPolicy
isCreateRemoteFolder = true
this.localAction = behaviour
isUseWifiOnly = false
isWhileChargingOnly = false
uploadStatus = UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS
}
}
uploadsStorageManager.storeUploads(uploads)
backgroundJobManager.startFilesUploadJob(user)
}
fun retryUpload(upload: OCUpload, user: User) {
Log_OC.d(this, "retry upload")
upload.uploadStatus = UploadsStorageManager.UploadStatus.UPLOAD_IN_PROGRESS
uploadsStorageManager.updateUpload(upload)
backgroundJobManager.startFilesUploadJob(user)
}
fun addDatatransferProgressListener(
listener: OnDatatransferProgressListener,
targetKey: String
) {
mBoundListeners[targetKey] = listener
}
fun removeDatatransferProgressListener(
listener: OnDatatransferProgressListener,
targetKey: String
) {
if (mBoundListeners[targetKey] === listener) {
mBoundListeners.remove(targetKey)
}
}
companion object Progress {
val mBoundListeners = HashMap()
fun onTransferProgress(
accountName: String?,
remotePath: String?,
progressRate: Long,
totalTransferredSoFar: Long,
totalToTransfer: Long,
fileName: String?
) {
if (accountName == null || remotePath == null) return
val key: String =
FileUploaderBinder.buildRemoteName(accountName, remotePath)
val boundListener = mBoundListeners[key]
boundListener?.onTransferProgress(progressRate, totalTransferredSoFar, totalToTransfer, fileName)
Log_OC.d("TAG", "Hello")
}
}
}