package com.seafile.seadroid2.transfer;
import android.util.Log;
import com.seafile.seadroid2.SeafException;
import com.seafile.seadroid2.account.Account;
import com.seafile.seadroid2.data.DataManager;
import com.seafile.seadroid2.data.ProgressMonitor;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
/**
* Upload task
*
*/
public class UploadTask extends TransferTask {
public static final String DEBUG_TAG = "UploadTask";
private String dir; // parent dir
private boolean isUpdate; // true if update an existing file
private boolean isCopyToLocal; // false to turn off copy operation
private boolean byBlock;
private int version;
private UploadStateListener uploadStateListener;
private DataManager dataManager;
public UploadTask(int taskID, Account account, String repoID, String repoName,
String dir, String filePath, boolean isUpdate, boolean isCopyToLocal, boolean byBlock, int version,
UploadStateListener uploadStateListener) {
super(taskID, account, repoName, repoID, filePath);
this.dir = dir;
this.isUpdate = isUpdate;
this.isCopyToLocal = isCopyToLocal;
this.byBlock = byBlock;
this.version = version;
this.uploadStateListener = uploadStateListener;
this.totalSize = new File(filePath).length();
this.finished = 0;
this.dataManager = new DataManager(account);
}
public UploadTaskInfo getTaskInfo() {
UploadTaskInfo info = new UploadTaskInfo(account, taskID, state, repoID,
repoName, dir, path, isUpdate, isCopyToLocal,
finished, totalSize, err, version);
return info;
}
public void cancelUpload() {
if (state != TaskState.INIT && state != TaskState.TRANSFERRING) {
return;
}
state = TaskState.CANCELLED;
super.cancel(true);
}
@Override
protected void onPreExecute() {
state = TaskState.TRANSFERRING;
}
@Override
protected void onProgressUpdate(Long... values) {
long uploaded = values[0];
// Log.d(DEBUG_TAG, "Uploaded " + uploaded);
this.finished = uploaded;
uploadStateListener.onFileUploadProgress(taskID);
}
@Override
protected File doInBackground(Void... params) {
try {
ProgressMonitor monitor = new ProgressMonitor() {
@Override
public void onProgressNotify(long uploaded, boolean updateTotal) {
publishProgress(uploaded);
}
@Override
public boolean isCancelled() {
return UploadTask.this.isCancelled();
}
};
if (byBlock) {
dataManager.uploadByBlocks(repoName, repoID, dir, path, monitor, isUpdate, isCopyToLocal, version);
} else {
dataManager.uploadFile(repoName, repoID, dir, path, monitor, isUpdate, isCopyToLocal);
}
} catch (SeafException e) {
Log.e(DEBUG_TAG, "Upload exception " + e.getCode() + " " + e.getMessage());
e.printStackTrace();
err = e;
} catch (NoSuchAlgorithmException | IOException e) {
Log.e(DEBUG_TAG, "Upload exception " + e.getMessage());
err = SeafException.unknownException;
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(File file) {
state = err == null ? TaskState.FINISHED : TaskState.FAILED;
if (uploadStateListener != null) {
if (err == null) {
uploadStateListener.onFileUploaded(taskID);
}
else {
uploadStateListener.onFileUploadFailed(taskID);
}
}
}
@Override
protected void onCancelled() {
if (uploadStateListener != null) {
uploadStateListener.onFileUploadCancelled(taskID);
}
uploadStateListener.onFileUploadCancelled(taskID);
}
public String getDir() {
return dir;
}
public boolean isCopyToLocal() {
return isCopyToLocal;
}
public boolean isUpdate() {
return isUpdate;
}
}