package julianwi.javainstaller; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import android.os.Bundle; import android.os.Handler; import android.os.ParcelFileDescriptor; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.util.DisplayMetrics; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class RunActivity extends Activity implements Runnable { private View emulatorview; public static Object session, exec; private static ParcelFileDescriptor pseudoterm; public ClassLoader classloader; private Handler handler; private static Class<?> termexec; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try{ System.getProperties().setProperty("java.library.path", System.getProperty("java.library.path")+":/data/data/jackpal.androidterm/lib"); String apkfile = getPackageManager().getApplicationInfo("jackpal.androidterm", 0).sourceDir; classloader = new dalvik.system.PathClassLoader(apkfile, ClassLoader.getSystemClassLoader()); Bundle b = getIntent().getExtras(); //create a new terminal session session = Class.forName("jackpal.androidterm.emulatorview.TermSession", true, classloader).getConstructor().newInstance(new Object[]{}); SharedPreferences settings = getSharedPreferences("julianwi.javainstaller_preferences", 1); String[] arguments; //android terminal emulator version 1.0.66 and later wants the first argument twice if(b != null && (Boolean)b.get("install")==true){ if(settings.getString("rootmode", "off").equals("on")){ arguments = new String[]{"/system/bin/su", "/system/bin/su", "-c", "sh /data/data/julianwi.javainstaller/install.sh"}; } else{ arguments = new String[]{"/system/bin/sh", "/system/bin/sh", "/data/data/julianwi.javainstaller/install.sh"}; } } else{ String javapath = getSharedPreferences("settings", 1).getString("path3", ""); if(settings.getString("rootmode2", "off").equals("on")){ arguments = new String[]{"/system/bin/su", "/system/bin/su", "-c", "/data/data/julianwi.javainstaller/java -jar "+getIntent().getDataString()}; } else{ arguments = new String[]{"/data/data/julianwi.javainstaller/java", "/data/data/julianwi.javainstaller/java", "-jar", getIntent().getDataString()}; } } //create a pty if(termexec == null){ termexec = Class.forName("jackpal.androidterm.TermExec", true, classloader); } pseudoterm = ParcelFileDescriptor.open(new File("/dev/ptmx"), ParcelFileDescriptor.MODE_READ_WRITE); exec = termexec.getConstructor(new Class[]{String[].class}).newInstance(new Object[]{arguments}); handler = new Handler(); new Thread(this).start(); //connect the pty's I/O streams to the TermSession. session.getClass().getMethod("setTermOut", OutputStream.class).invoke(session, new Object[]{new ParcelFileDescriptor.AutoCloseOutputStream(pseudoterm)}); session.getClass().getMethod("setTermIn", InputStream.class).invoke(session, new Object[]{new ParcelFileDescriptor.AutoCloseInputStream(pseudoterm)}); //create the EmulatorView DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); emulatorview = (View) Class.forName("jackpal.androidterm.emulatorview.EmulatorView", true, classloader).getConstructor(Context.class, session.getClass(), DisplayMetrics.class).newInstance(new Object[]{this, session, metrics}); setContentView(emulatorview); }catch(Exception e){ e.printStackTrace(); new Error("error", e.toString(), this); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. menu.add(0,0,0,"settings"); menu.add(0,1,0,"show softkeyboard"); return true; } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); try { DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); emulatorview = (View) Class.forName("jackpal.androidterm.emulatorview.EmulatorView", true, classloader).getConstructor(Context.class, session.getClass(), DisplayMetrics.class).newInstance(new Object[]{this, session, metrics}); setContentView(emulatorview); } catch (Exception e) { e.printStackTrace(); new Error("error", e.toString(), this); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0: Intent intent = new Intent(MainActivity.context, SettingsActivity.class); MainActivity.context.startActivity(intent); return true; case 1: Object keyboard = getSystemService(Context.INPUT_METHOD_SERVICE); try { Method showSoftInput = Thread.currentThread().getContextClassLoader().loadClass("android.view.inputmethod.InputMethodManager").getMethod("showSoftInput", new Class[]{View.class, int.class}); showSoftInput.invoke(keyboard, new Object[]{emulatorview, 0}); } catch (Exception e) { e.printStackTrace(); new Error("error", e.toString(), this); } } return false; } @Override public void run() { int pid; try { pid = (Integer) termexec.getMethod("start", new Class[]{ParcelFileDescriptor.class}).invoke(exec, new Object[]{pseudoterm}); System.out.println("process id is "+pid); } catch (Exception e) { e.printStackTrace(); handler.post(new Error(e, this)); } } }