package org.geogebra.web.touch;
import java.util.ArrayList;
import org.geogebra.common.main.App;
import org.geogebra.common.main.MaterialsManager;
import org.geogebra.common.move.ggtapi.models.JSONParserGGT;
import org.geogebra.common.move.ggtapi.models.Material;
import org.geogebra.common.move.ggtapi.models.MaterialFilter;
import org.geogebra.common.move.ggtapi.models.SyncEvent;
import org.geogebra.common.move.ggtapi.models.json.JSONObject;
import org.geogebra.common.move.ggtapi.models.json.JSONTokener;
import org.geogebra.common.plugin.Event;
import org.geogebra.common.plugin.EventType;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.html5.main.StringHandler;
import org.geogebra.web.web.gui.browser.BrowseGUI;
import org.geogebra.web.web.gui.dialog.DialogManagerW;
import org.geogebra.web.web.main.FileManager;
import org.geogebra.web.web.util.SaveCallback;
public class WinFileManager extends FileManager {
public WinFileManager(final AppW app) {
super(app);
}
@Override
public void autoSave(int counter) {
// not in touch either
}
@Override
public String getAutosaveJSON() {
return null;
}
@Override
public void restoreAutoSavedFile(String json) {
// not in touch either
}
@Override
public void deleteAutoSavedFile() {
// not in touch either
}
@Override
public void saveLoggedOut(App app) {
((DialogManagerW) app.getDialogManager()).showSaveDialog();
}
@Override
public void rename(String newTitle, Material mat) {
rename(newTitle, mat, null);
}
@Override
public void rename(String newTitle, Material mat, Runnable callback) {
renameNative(MaterialsManager.getFileKey(mat), newTitle,
mat.getModified()
+ "", callback);
}
private native void renameNative(String oldTitle, String newTitle,
String timestamp, Runnable callback) /*-{
if ($wnd.android && $wnd.android.renameFile) {
$wnd.android.renameFile(oldTitle, newTitle, timestamp, function() {
callback.@java.lang.Runnable::run()();
});
}
}-*/;
@Override
public void openMaterial(final Material mat) {
getBase64(getFileKey(mat), new NativeSaveCallback() {
@Override
public void onSuccess(String fileID) {
mat.setBase64(fileID);
doOpen(mat);
}
@Override
public void onFailure() {
// TODO Auto-generated method stub
}
});
}
@Override
public void delete(Material mat, boolean permanent, Runnable onSuccess) {
deleteNative(getFileKey(mat));
removeFile(mat);
((BrowseGUI) getApp().getGuiManager().getBrowseView())
.setMaterialsDefaultStyle();
}
private native void deleteNative(String title) /*-{
if ($wnd.android && $wnd.android.deleteFile) {
$wnd.android.deleteFile(title);
}
}-*/;
@Override
public void upload(final Material mat) {
getBase64(getFileKey(mat), new NativeSaveCallback() {
@Override
public void onSuccess(String base64) {
mat.setBase64(base64);
doUpload(mat);
}
@Override
public void onFailure() {
// TODO Auto-generated method stub
}
});
}
void doOpen(Material mat) {
super.openMaterial(mat);
}
void doUpload(Material mat) {
super.upload(mat);
}
private native void getBase64(String fileKey, NativeSaveCallback nsc)/*-{
if ($wnd.android && $wnd.android.getBase64) {
$wnd.android
.getBase64(
fileKey,
function(jsString) {
nsc.@org.geogebra.web.touch.NativeSaveCallback::onSuccess(Ljava/lang/String;)(jsString);
});
}
}-*/;
@Override
public void saveFile(String base64, long modified, final SaveCallback cb) {
final Material mat = WinFileManager.this.createMaterial("", modified);
String meta = mat.toJson().toString();
WinFileManager.this.doSave(base64, getApp().getLocalID(), getApp()
.getKernel().getConstruction().getTitle(), meta,
new NativeSaveCallback() {
@Override
public void onSuccess(String fileID) {
getApp().setLocalID(Integer.parseInt(fileID));
cb.onSaved(mat, true);
}
@Override
public void onFailure() {
cb.onError();
}
});
}
protected native void doSave(String base64, int id, String title,
String meta, NativeSaveCallback nsc) /*-{
var that = this;
if ($wnd.android && $wnd.android.saveFile) {
$wnd.android
.saveFile(
base64,
id,
title,
meta,
function(jsString) {
nsc.@org.geogebra.web.touch.NativeSaveCallback::onSuccess(Ljava/lang/String;)(jsString);
},
function(jsString) {
nsc.@org.geogebra.web.touch.NativeSaveCallback::onFailure()();
});
}
}-*/;
@Override
public void uploadUsersMaterials(final ArrayList<SyncEvent> events) {
nativeUploadUsersMaterials(new StringHandler() {
@Override
public void handle(String jsString) {
JSONTokener tok = new JSONTokener(jsString);
try {
JSONObject jv = new JSONObject(tok);
for (String key : jv.keySet()) {
Material mat = JSONParserGGT.prototype.toMaterial(
(JSONObject) jv.get(key));
mat.setLocalID(MaterialsManager.getIDFromKey(key));
if (getApp().getLoginOperation().owns(mat)) {
sync(mat, events);
}
}
} catch (Exception e) {
}
}
});
}
/**
* @param sh
*/
public native void nativeUploadUsersMaterials(StringHandler sh) /*-{
var that = this;
if ($wnd.android && $wnd.android.getFiles) {
$wnd.android
.getFiles(function(jsString) {
sh.@org.geogebra.web.html5.main.StringHandler::handle(Ljava/lang/String;)(jsString);
});
}
}-*/;
private void addMaterials(String jsString) {
JSONTokener tok = new JSONTokener(jsString);
try {
JSONObject jv = new JSONObject(tok);
for (String key : jv.keySet()) {
Material mat = JSONParserGGT.prototype
.toMaterial((JSONObject) jv.get(key));
mat.setLocalID(MaterialsManager.getIDFromKey(key));
this.addMaterial(mat);
}
} catch (Exception e) {
}
}
@Override
protected native void getFiles(MaterialFilter materialFilter) /*-{
var that = this;
if ($wnd.android && $wnd.android.getFiles) {
$wnd.android
.getFiles(function(jsString) {
that.@org.geogebra.web.touch.WinFileManager::addMaterials(Ljava/lang/String;)(jsString);
});
}
}-*/;
@Override
public void setTubeID(String localID, Material mat) {
nativeUpdateMeta(localID, mat.toJson().toString());
}
private native void nativeUpdateMeta(String localID, String string) /*-{
if ($wnd.android && $wnd.android.updateMeta) {
$wnd.android.updateMeta(key, json);
}
}-*/;
@Override
protected void updateFile(String key, long modified, Material material) {
material.setModified(modified);
material.setSyncStamp(modified);
String base64 = material.getBase64();
material.setBase64("");
nativeUpdateFile(material.getLocalID(), material.getTitle(), base64,
material.toJson().toString());
}
private native void nativeUpdateFile(int id, String title, String json,
String base64) /*-{
if ($wnd.android && $wnd.android.updateFile) {
$wnd.android.updateFile(id, title, json, base64);
}
}-*/;
@Override
public void export(final App app) {
final String title1 = app.getExportTitle();
app.getGgbApi().showTooltip(app.getLocalization().getMenu("Saving"));
final StringHandler onFileDialogCancel = new StringHandler() {
@Override
public void handle(final String path) {
app.getGgbApi().showTooltip("");
((DialogManagerW) app.getDialogManager()).getSaveDialog()
.hide();
getApp().dispatchEvent(
new Event(EventType.EXPORT, null, "[\"ggb\"]"));
}
};
final StringHandler onFileDialogClosed = new StringHandler() {
@Override
public void handle(final String path) {
onFileDialogCancel.handle(path);
}
};
((AppW) app).getGgbApi().getBase64(true, new StringHandler() {
@Override
public void handle(final String data) {
saveDialog(data, title1, onFileDialogClosed,
onFileDialogCancel);
}
});
}
/**
* @param data
* base64
* @param title
* title
* @param onSuccess
* success handler
* @param onFailure
* failure handler
*/
native void saveDialog(String data, String title,
StringHandler onSuccess,
StringHandler onFailure)/*-{
var that = this;
if ($wnd.android && $wnd.android.callPlugin) {
$wnd.android
.callPlugin(
'SaveDialog',
[ data, title, 'ggb' ],
function(path) {
onSuccess.@org.geogebra.web.html5.main.StringHandler::handle(Ljava/lang/String;)(path);
},
function(path) {
onFailure.@org.geogebra.web.html5.main.StringHandler::handle(Ljava/lang/String;)(path);
});
}
}-*/;
@Override
public native void exportImage(String url, String title, String ext)/*-{
if ($wnd.android && $wnd.android.callPlugin) {
$wnd.android.callPlugin('SaveDialog', [
url.substring(url.indexOf(',') + 1), title, ext ]);
}
}-*/;
@Override
public boolean hasBase64(Material material) {
return true;
}
@Override
public void showExportAsPictureDialog(String url, String filename,
App app1) {
String extension = "png";
if (url.startsWith("data:text/")) {
// eg Tizk export
extension = "txt";
// could use:
// TitleExportPstricks
// TitleExportPgf
}
exportImage(url, filename, extension);
// TODO check if it really happened
app.dispatchEvent(
new Event(EventType.EXPORT, null, "[\"" + extension + "\"]"));
}
@Override
public void refreshAutosaveTimestamp() {
// TODO Auto-generated method stub
}
}