package se.krka.kahlua.android; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import se.krka.kahlua.converter.KahluaConverterManager; import se.krka.kahlua.integration.LuaCaller; import se.krka.kahlua.integration.LuaReturn; import se.krka.kahlua.integration.annotations.LuaMethod; import se.krka.kahlua.integration.expose.LuaJavaClassExposer; import se.krka.kahlua.j2se.J2SEPlatform; import se.krka.kahlua.luaj.compiler.LuaCompiler; import se.krka.kahlua.vm.KahluaTable; import se.krka.kahlua.vm.KahluaThread; import se.krka.kahlua.vm.KahluaUtil; import se.krka.kahlua.vm.LuaClosure; import se.krka.kahlua.vm.Platform; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; public class KahluaInterpreter extends Activity { private final Platform platform; private final KahluaTable env; private final KahluaConverterManager manager; private final LuaJavaClassExposer exposer; private final LuaCaller caller; private final KahluaThread thread; private EditText input; private TextView output; private Button execute; private final StringBuffer buffer = new StringBuffer(); public KahluaInterpreter() { platform = new J2SEPlatform(); env = platform.newEnvironment(); manager = new KahluaConverterManager(); KahluaTable java = platform.newTable(); env.rawset("Java", java); exposer = new LuaJavaClassExposer(manager, platform, env, java); exposer.exposeGlobalFunctions(this); caller = new LuaCaller(manager); thread = new KahluaThread(new PrintStream(new OutputStream() { @Override public void write(int i) throws IOException { buffer.append(Character.toString((char) i)); } }), platform, env); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); input = new EditText(this); output = new TextView(this); execute = new Button(this); execute.setText("Run"); execute.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { execute(); } }); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.addView(output); layout.addView(input); layout.addView(execute); ScrollView scrollView = new ScrollView(this); scrollView.addView(layout); setContentView(scrollView); } private void execute() { final String source = input.getText().toString(); output.append("> " + source + "\n"); AsyncTask<String, Void, Void> task = new AsyncTask<String, Void, Void>() { @Override protected void onPreExecute() { execute.setEnabled(false); execute.setText("Running..."); input.getText().clear(); flush(); } @Override protected Void doInBackground(String... strings) { flush(); String source = strings[0]; try { LuaClosure closure = LuaCompiler.loadstring(source, null, env); LuaReturn result = caller.protectedCall(thread, closure); if (result.isSuccess()) { for (Object o : result) { buffer.append(KahluaUtil.tostring(o, thread) + "\n"); } } else { buffer.append(result.getErrorString() + "\n"); buffer.append(result.getLuaStackTrace() + "\n"); } } catch (Exception e) { buffer.append(e.getMessage() + "\n"); } return null; } @Override protected void onPostExecute(Void result) { flush(); execute.setText("Run"); execute.setEnabled(true); } private void flush() { output.append(buffer.toString()); buffer.setLength(0); } }; task.execute(source); } @LuaMethod(global = true) public void sleep(double seconds) { try { Thread.sleep((long) (seconds * 1000)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }