package com.googlecode.gwtphonegap.client.camera; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.user.client.ui.FileUpload; import com.google.gwt.user.client.ui.RootPanel; import com.google.web.bindery.event.shared.HandlerRegistration; import com.googlecode.gwtphonegap.client.file.FileReader; import com.googlecode.gwtphonegap.client.file.ReaderCallback; import com.googlecode.gwtphonegap.client.file.js.FileObjectJsImpl; public class CameraBrowserFileInput implements Camera { private final FileUpload input; private final CameraPopoverHandle popoverHandle; public CameraBrowserFileInput(){ input = new FileUpload(); input.getElement().setAttribute("accept", "image/*"); input.getElement().setAttribute("capture", "camera"); input.setVisible(false); RootPanel.get().add(input); popoverHandle = new CameraPopoverHandle() { @Override public void setPosition(PopOverOptions popOverOptions) { // not supported } }; } @Override public CameraPopoverHandle getPicture(final PictureOptions options, final PictureCallback callback) { if(!input.isAttached()){ callback.onFailure("after #cleanUp(), this instance is no longer useful"); return popoverHandle; } @SuppressWarnings("unused") final ChangeHandler handler = new ChangeHandler() { private final HandlerRegistration reg = input.addChangeHandler(this); @Override public void onChange(ChangeEvent event) { reg.removeHandler(); if(options.getDestinationType() == PictureOptions.DESTINATION_TYPE_DATA_URL){ getBase64(new ReaderCallback<FileReader>(){ @Override public void onCallback(FileReader result) { callback.onSuccess(result.getResult()); } }); }else{ callback.onSuccess(getFileUri()); } } }; open(input.getElement()); return popoverHandle; } private void getBase64(ReaderCallback<FileReader> callback){ FileObjectJsImpl file = getFile(input.getElement()); FileReader reader = createReader(); reader.setOnLoadEndCallback(callback); reader.readAsDataUrl(file); } private String getFileUri(){ return getFileUri0(input.getElement()); } @Override public void cleanUp(CameraCallback callback) { input.removeFromParent(); callback.onSuccess(); } private native void open(Element element) /*-{ element.click(); }-*/; private native String getFileUri0(Element element)/*-{ var URL = $wnd.URL || $wnd.webkitURL return URL.createObjectURL(element.files[0]); }-*/; private native FileReader createReader()/*-{ return new $wnd.FileReader(); }-*/; private native FileObjectJsImpl getFile(Element element)/*-{ return element.files[0]; }-*/; }