aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java')
-rw-r--r--src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java58
1 files changed, 54 insertions, 4 deletions
diff --git a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java
index f7b3f4e2..017b88ea 100644
--- a/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java
+++ b/src/main/java/de/thedevstack/conversationsplus/services/filetransfer/FileTransferManager.java
@@ -9,13 +9,16 @@ import de.thedevstack.android.logcat.Logging;
import de.thedevstack.conversationsplus.Config;
import de.thedevstack.conversationsplus.entities.Message;
import de.thedevstack.conversationsplus.services.FileTransferService;
+import de.thedevstack.conversationsplus.services.filetransfer.httpupload.HttpFileTransferEntity;
+import de.thedevstack.conversationsplus.utils.MessageUtil;
/**
*
*/
-public class FileTransferManager implements FileTransferService {
+public class FileTransferManager implements FileTransferStatusListener {
private SortedSet<WeightedTransferService> transferServices;
private static final FileTransferManager INSTANCE = new FileTransferManager();
+ private final HashMap<String, WeightedTransferService> activeTransfers = new HashMap<>();
private FileTransferManager() {
this.transferServices = new TreeSet<>();
@@ -40,6 +43,7 @@ public class FileTransferManager implements FileTransferService {
}
public static void addFileTransferService(int weight, FileTransferService fts) {
+ fts.addFileTransferStatusListener(INSTANCE);
INSTANCE.transferServices.add(new WeightedTransferService(weight, fts));
}
@@ -68,14 +72,13 @@ public class FileTransferManager implements FileTransferService {
* @param delay whether the message is delayed or not
* @return <code>true</code> if the file transfer was successful, <code>false</code> otherwise
*/
- @Override
public boolean transferFile(Message message, boolean delay) {
Logging.d(Config.LOGTAG, "send file message");
boolean transferSuccessfullyStarted = false;
for (WeightedTransferService wts : this.transferServices) {
try {
if (wts.fileTransferService.accept(message)) {
- transferSuccessfullyStarted = wts.fileTransferService.transferFile(message, delay);
+ transferSuccessfullyStarted = this.startFileTransfer(message, delay, wts);
if (transferSuccessfullyStarted) {
break;
}
@@ -93,11 +96,58 @@ public class FileTransferManager implements FileTransferService {
* @param message the message to be checked
* @return <code>true</code> if the message can be processed, <code>false</code> otherwise
*/
- @Override
public boolean accept(Message message) {
return message.needsUploading();
}
+ @Override
+ public void onFailure(FileTransferEntity entity, FileTransferFailureReason failureReason) {
+ WeightedTransferService wts = this.activeTransfers.get(entity.getMessage().getUuid());
+ if (null == wts) {
+ return;
+ }
+ boolean delayed = (entity instanceof HttpFileTransferEntity) && ((HttpFileTransferEntity) entity).isDelayed();
+ if (failureReason.isRecoverable()) {
+ wts.fileTransferService.transferFile(entity.getMessage(), delayed);
+ } else {
+ boolean retransferStarted = false;
+ this.activeTransfers.remove(entity.getMessage().getUuid());
+ for (WeightedTransferService newWts : this.transferServices.tailSet(wts)) {
+ if (newWts == wts) { // Same Reference
+ continue;
+ }
+ if (newWts.fileTransferService.accept(entity.getMessage())) {
+ retransferStarted = startFileTransfer(entity.getMessage(), delayed, newWts);
+ if (retransferStarted) {
+ break;
+ }
+ }
+ }
+ if (!retransferStarted) {
+ MessageUtil.markMessage(entity.getMessage(), Message.STATUS_SEND_FAILED);
+ }
+ }
+ }
+
+ @Override
+ public void onCancel(FileTransferEntity entity) {
+ this.activeTransfers.remove(entity.getMessage().getUuid());
+ MessageUtil.markMessage(entity.getMessage(), Message.STATUS_SEND_FAILED); // TODO New Status CANCELED!
+ }
+
+ @Override
+ public void onSuccess(FileTransferEntity entity) {
+ this.activeTransfers.remove(entity.getMessage().getUuid());
+ }
+
+ private boolean startFileTransfer(Message message, boolean delayed, WeightedTransferService wts) {
+ boolean transferSuccessfullyStarted = wts.fileTransferService.transferFile(message, delayed);
+ if (transferSuccessfullyStarted) {
+ this.activeTransfers.put(message.getUuid(), wts);
+ }
+ return transferSuccessfullyStarted;
+ }
+
static class WeightedTransferService implements Comparable<WeightedTransferService> {
int weight;
FileTransferService fileTransferService;