package mobi.monaca.framework.plugin;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import mobi.monaca.framework.MonacaApplication;
import mobi.monaca.framework.MonacaPageActivity;
import mobi.monaca.framework.MonacaURI;
import mobi.monaca.framework.transition.TransitionParams;
import mobi.monaca.framework.util.MyLog;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.apache.cordova.PluginResult.Status;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
public class MonacaTransitPlugin extends Plugin {
public static final String TAG = MonacaTransitPlugin.class.getSimpleName();
protected Handler handler = new Handler();
protected MonacaPageActivity getMonacaPageActivity() {
return (MonacaPageActivity) cordova.getActivity();
}
@Override
public PluginResult execute(String action, final JSONArray args,
String callbackId) {
//MyLog.v(TAG, "action: " + action + ", args:" + args);
// push
// TODO this is unused. if want to use this code, need to fix iOS framework
if (action.equals("slide") || action.equals("slideLeft")) {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "slideLeft"));
return new PluginResult(PluginResult.Status.OK);
}
//TODO dirty fix for coexistance between animation:"slide" and animation:false or true
// true is not defined in document, so transit normally
if (action.equals("push")) {
JSONObject options = args.optJSONObject(1);
if (options.optString("animation", "").equals("slide")
|| options.optString("animation", "").equals("slideLeft")) {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "slideLeft"));
return new PluginResult(PluginResult.Status.OK);
} else if (options != null && options.has("animation")) {
boolean animation = options.optBoolean("animation");
if (animation == false) {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "none"));
return new PluginResult(PluginResult.Status.OK);
} else {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "slideLeft"));
return new PluginResult(PluginResult.Status.OK);
}
} else {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "slideLeft"));
return new PluginResult(PluginResult.Status.OK);
}
}
if (action.equals("slideRight")) {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "slideRight"));
return new PluginResult(PluginResult.Status.OK);
}
// animation:'lift' is converted to action modal in monaca.js
if (action.equals("modal")) {
getMonacaPageActivity().pushPageAsync(buildTransitUrl(args),
TransitionParams.from(args.optJSONObject(1), "modal"));
return new PluginResult(PluginResult.Status.OK);
}
// link
if (action.equals("link")) {
JSONObject obj = args.optJSONObject(1);
obj = obj != null ? obj : new JSONObject();
loadRelativePathAsync(buildTransitUrl(args));
return new PluginResult(PluginResult.Status.OK);
}
if (action.equals("pop")) {
getMonacaPageActivity().popPageAsync(
TransitionParams.from(new JSONObject(), "pop"));
return new PluginResult(PluginResult.Status.OK);
}
if (action.equals("dismiss")) {
getMonacaPageActivity().popPageAsync(
TransitionParams.from(new JSONObject(), "dismiss"));
return new PluginResult(PluginResult.Status.OK);
}
// execute browser
if (action.equals("browse")) {
handler.post(new Runnable() {
@Override
public void run() {
Uri uri = Uri.parse(args.optString(0));
Intent i = new Intent(Intent.ACTION_VIEW, uri);
cordova.getActivity().startActivity(i);
}
});
return new PluginResult(PluginResult.Status.OK);
}
// go to home
if (action.equals("home")) {
getMonacaPageActivity().goHomeAsync(args.optJSONObject(0));
return new PluginResult(PluginResult.Status.OK);
}
if (action.equals("clearPageStack")) {
boolean clearAll = args.optBoolean(0, false);
clearPageStack(clearAll);
return new PluginResult(PluginResult.Status.OK);
}
return new PluginResult(Status.INVALID_ACTION);
}
public void loadRelativePathAsync(String relativePath) {
// MyLog.v(TAG, "loadRelativePathAsync. relativePath:" + relativePath);
final String newUri = getMonacaPageActivity().getCurrentUriWithoutOptions() + "/../" + relativePath;
// MyLog.v(TAG, "uri unresolved=" + newUri);
getMonacaPageActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (newUri.startsWith("file://")) {
try {
getMonacaPageActivity().loadUri("file://" + new File(newUri.substring(7)).getCanonicalPath(), false);
// MyLog.v(TAG, "uri resolved=" + getMonacaPageActivity().getCurrentUriWithoutOptions());
} catch (Exception e) {
e.printStackTrace();
getMonacaPageActivity().loadUri(getMonacaPageActivity().getCurrentUriWithoutOptions(), false);
}
} else {
getMonacaPageActivity().loadUri(getMonacaPageActivity().getCurrentUriWithoutOptions(), false);
}
}
});
}
/** build url containing query **/
protected String buildTransitUrl(JSONArray args) {
String transitUrl = new String(args.optString(0));
// has query parameter
if (args.optString(2) != null) {
try {
Log.d(TAG, "optString(2) : " + args.optString(2));
JSONObject queryParamsJson = new JSONObject(args.optString(2));
transitUrl = MonacaURI.buildUrlWithQuery(transitUrl, queryParamsJson);
Log.d(TAG, "build new url :" + transitUrl);
} catch (JSONException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
return transitUrl;
}
protected void pushPage(String url, TransitionParams params) {
getMonacaPageActivity().pushPageAsync(url, params);
}
protected void clearPageStack(boolean clearAll) {
List<MonacaPageActivity> pages = new ArrayList<MonacaPageActivity>(MonacaApplication.getPages());
if (clearAll) {
pages = pages.subList(0, pages.size() - 1);
Collections.reverse(pages);
for (MonacaPageActivity page : pages) {
page.finish();
}
} else {
if (pages.size() > 1) {
MonacaPageActivity previousPage = pages.get(pages.size() - 2);
previousPage.finish();
}
}
}
}