/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.viewmodel;
import im.actor.core.entity.FileReference;
import im.actor.core.modules.Modules;
import im.actor.runtime.files.FileSystemReference;
import im.actor.runtime.mvvm.AsyncVM;
/**
* Value Model handler for File.
* <p></p>
* Create by calling method in Messenger object and ALWAYS release by calling detach method.
*/
public class FileVM extends AsyncVM {
private Modules modules;
private FileReference location;
private FileCallback callback;
private FileVMCallback vmCallback;
/**
* <p>INTERNAL API</p>
* Create FileVM
*
* @param location file reference
* @param isAutostart is perform autostart
* @param modules im.actor.android.modules reference
* @param vmCallback View Model callback
*/
public FileVM(FileReference location, boolean isAutostart, Modules modules,
FileVMCallback vmCallback) {
this.modules = modules;
this.location = location;
this.vmCallback = vmCallback;
this.callback = new FileCallback() {
@Override
public void onNotDownloaded() {
post(new OnNotDownloaded());
}
@Override
public void onDownloading(float progress) {
post(new OnDownloading(progress));
}
@Override
public void onDownloaded(FileSystemReference reference) {
post(new OnDownloaded(reference));
}
};
modules.getFilesModule().bindFile(location, isAutostart, callback);
}
@Override
protected void onObjectReceived(Object obj) {
if (obj instanceof OnNotDownloaded) {
vmCallback.onNotDownloaded();
} else if (obj instanceof OnDownloading) {
vmCallback.onDownloading(((OnDownloading) obj).getProgress());
} else if (obj instanceof OnDownloaded) {
vmCallback.onDownloaded(((OnDownloaded) obj).getFileSystemReference());
}
}
/**
* Detach FileVM from Messenger.
* Don't use object after detaching.
*/
@Override
public void detach() {
super.detach();
modules.getFilesModule().unbindFile(location.getFileId(), callback, false);
}
private class OnNotDownloaded {
}
private class OnDownloading {
private float progress;
private OnDownloading(float progress) {
this.progress = progress;
}
public float getProgress() {
return progress;
}
}
private class OnDownloaded {
private FileSystemReference fileSystemReference;
private OnDownloaded(FileSystemReference fileSystemReference) {
this.fileSystemReference = fileSystemReference;
}
public FileSystemReference getFileSystemReference() {
return fileSystemReference;
}
}
}