package fr.lteconsulting.hexa.client.ui.uploadjs; import java.util.HashMap; import fr.lteconsulting.hexa.client.tools.Action; import fr.lteconsulting.hexa.client.ui.uploadjs.Tasker.AsynchroneTask; public class UploadManager { interface Cookie { File getFile(); String getDataUrl(); } public interface Callback { void onUploadInitialized( Cookie cookie ); void onImageParsingBegin( Cookie cookie ); void onImageParsingFinished( Cookie cookie, String data ); void onUploadBegin( Cookie cookie ); void onUploadProgress( Cookie cookie, int percentage, float speed ); void onUploadFinished( Cookie cookie, String responseText, boolean error ); } Callback eventsCallback; Tasker tasker = new Tasker(); FileUploader uploader = new FileUploader(); public UploadManager( Callback eventsCallback ) { this.eventsCallback = eventsCallback; } void sendFiles( FilesList files ) { int nb = files.getCount(); for( int i = 0; i < nb; i++ ) { FileUploadInfo info = new FileUploadInfo( files.getFile( i ) ); eventsCallback.onUploadInitialized( info ); // this task is the upload of a file tasker.enqueueTask( info ); } } class FileUploadInfo implements Cookie, Tasker.AsynchroneTask { File file; String dataUrl; Tasker tasker = new Tasker(); public FileUploadInfo( File file ) { this.file = file; } @Override public void execute( final Action taskFinishedCallback ) { tasker.enqueueTask( parseImage ); tasker.enqueueTask( uploadImage, taskFinishedCallback ); } AsynchroneTask parseImage = new AsynchroneTask() { @Override public void execute( final Action taskFinishedCallback ) { eventsCallback.onImageParsingBegin( FileUploadInfo.this ); file.getAsDataUrl( new File.Callback() { @Override public void onDataReady( String data ) { dataUrl = data; eventsCallback.onImageParsingFinished( FileUploadInfo.this, data ); taskFinishedCallback.exec(); } } ); } }; AsynchroneTask uploadImage = new AsynchroneTask() { @Override public void execute( final Action taskFinishedCallback ) { HashMap<String, String> prms = new HashMap<String, String>(); prms.put( "uploadData", "{ \"type\" : \"upload_picture\", \"user_id\" : " + 0 + " }" ); uploader.uploadFile( "upload", prms, "Filedata", file, new FileUploader.Callback() { @Override public void onStart() { eventsCallback.onUploadBegin( FileUploadInfo.this ); } @Override public void onProgress( int percentage, float speed, String responseText ) { if( percentage >= 0 ) eventsCallback.onUploadProgress( FileUploadInfo.this, percentage, speed ); if( percentage == 100 || percentage < 0 ) { eventsCallback.onUploadFinished( FileUploadInfo.this, responseText, percentage < 0 ); taskFinishedCallback.exec(); } } } ); } }; @Override public File getFile() { return file; } @Override public String getDataUrl() { return dataUrl; } } }