package julianwi.javainstaller; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.lang.reflect.Method; import java.net.URL; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; public class InstallActivity extends Activity implements Runnable { private int pkgs; private Handler handler = new Handler(); //public static String[] tmp = new String[]{"terminal.apk", "busybox", "libc.tar.gz", "zlib.tar.gz", "libffi.tar.gz", "jamvm.tar.gz", "classpath.tar.gz", "freetype.tar.gz", "awt.tar.gz"}; private List<LinearLayout> lls; private List<Integer> ids; private List<Integer> ids2; private int term = 0; private InstallList il; private boolean uninstall = false; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Bundle b = getIntent().getExtras(); pkgs = b.getInt("packages"); lls = new ArrayList<LinearLayout>(); ids = new ArrayList<Integer>(); ids2 = new ArrayList<Integer>(); ListView lv = new ListView(this); il = new InstallList(lls); lv.setAdapter(il); setContentView(lv); init(); new Thread(this).start(); } public LinearLayout makell(int id){ LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); TextView tv = new TextView(this); tv.setText(((uninstall)?"uninstalling ":"installing ")+MainActivity.checks[id].text); ll.addView(tv); if(!uninstall){ ProgressBar pb = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); pb.setId(1); pb.setProgress(0); pb.setMax(100); ll.addView(pb); TextView tv1 = new TextView(this); tv1.setId(2); tv1.setText("0/0kb 0/100%"); ll.addView(tv1); } return ll; } @Override public void run() { try { if((3&pkgs)==2 || (!MainActivity.checks[0].installed && pkgs >> 2 != 0)){ new Download((ProgressBar)lls.get(0).findViewById(1), (TextView)lls.get(0).findViewById(2), new URL(MainActivity.checks[0].getSource()), handler, "/data/data/julianwi.javainstaller/"+Checkforfile.file[0], this).run(); chmod(new File("/data/data/julianwi.javainstaller/androidterm.apk"), 0644); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/data/data/julianwi.javainstaller/androidterm.apk")), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(intent); if(checkCallingOrSelfPermission("jackpal.androidterm.permission.RUN_SCRIPT")!=PackageManager.PERMISSION_GRANTED)return; } if(ids.size()!=0){ Writer writer; if(testrunactivity(1)){ writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/data/data/julianwi.javainstaller/install.sh"), "utf-8")); }else{ writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/data/data/julianwi.javainstaller/install2.sh"), "utf-8")); } writer.write("#!/system/bin/sh\nbbdir="+MainActivity.checks[1].getPath()+"/busybox\n"); int i = -1; for(int id : ids){ i++; CheckPoint mcheck = MainActivity.checks[id]; if(!uninstall){ new Download((ProgressBar)lls.get(term+i).findViewById(1), (TextView)lls.get(term+i).findViewById(2), new URL(MainActivity.checks[id].getSource()), handler, "/data/data/julianwi.javainstaller/"+Checkforfile.file[id], this).run(); } writesh(writer, mcheck); } writer.write("echo installation complete\n"); writer.write("exit"); writer.close(); runterm(testrunactivity(ids.get(0))); } if(ids2.size()!=0){ Writer writer; if(!testrunactivity(1)){ writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/data/data/julianwi.javainstaller/install.sh"), "utf-8")); }else{ writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/data/data/julianwi.javainstaller/install2.sh"), "utf-8")); } writer.write("#!/system/bin/sh\nbbdir="+MainActivity.checks[1].getPath()+"/busybox\n"); int i = -1; for(int id : ids2){ i++; CheckPoint mcheck = MainActivity.checks[id]; if(!uninstall){ new Download((ProgressBar)lls.get(term+ids.size()+i).findViewById(1), (TextView)lls.get(term+ids.size()+i).findViewById(2), new URL(MainActivity.checks[id].getSource()), handler, "/data/data/julianwi.javainstaller/"+Checkforfile.file[id], this).run(); } writesh(writer, mcheck); } writer.write((uninstall)?"echo uninstallation complete\n":"echo installation complete\n"); writer.write("exit"); writer.close(); runterm(testrunactivity(ids2.get(0))); } if((3&pkgs)==3){ Uri packageURI = Uri.parse("package:jackpal.androidterm"); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); this.startActivity(uninstallIntent); } writejava(); //URL url = new URL(MainActivity.checks[0].getSource()); //new Download((ProgressBar)lls.get(0).findViewById(1), (TextView)lls.get(0).findViewById(2), url, handler, "/data/data/julianwi.javainstaller/"+tmp[0]).run(); } catch (final Exception e) { handler.post(new Error(e, this)); e.printStackTrace(); } } public Boolean testrunactivity(int id){ String runmode = MainActivity.context.getSharedPreferences("julianwi.javainstaller_preferences", 1).getString("runmode", "auto"); return(runmode.equals("Run Activity") || (runmode.equals("auto")&&MainActivity.checks[id].getPath().startsWith("/data/data/julianwi.javainstaller"))); } public static int chmod(File path, int mode) throws Exception { Class fileUtils = Class.forName("android.os.FileUtils"); Method setPermissions = fileUtils.getMethod("setPermissions", String.class, int.class, int.class, int.class); return (Integer) setPermissions.invoke(null, path.getAbsolutePath(), mode, -1, -1); } public void writesh(Writer writer, CheckPoint mcheck) throws Exception{ if(uninstall){ for(String file : Checkforfile.files[mcheck.id]){ writer.write("rm "+mcheck.getPath()+"/"+file+"\n"); } if(mcheck.id == 8){ writer.write("am start --user 0 -a android.intent.action.DELETE -d package:julianwi.awtpeer\n"); } return; } if(mcheck.id == 1){ chmod(new File("/data/data/julianwi.javainstaller/busybox"), 0755); } else{ chmod(new File("/data/data/julianwi.javainstaller/"+Checkforfile.file[mcheck.id]), 0644); } writer.write("echo installing "+mcheck.text+"\n"); if(mcheck.id == 1){ writer.write("/data/data/julianwi.javainstaller/busybox mkdir -p "+mcheck.getPath()+"\n"); writer.write("/data/data/julianwi.javainstaller/busybox chmod 0755 "+mcheck.getPath()+"\n"); writer.write("/data/data/julianwi.javainstaller/busybox cp /data/data/julianwi.javainstaller/busybox "+mcheck.getPath()+"/busybox\n"); writer.write("/data/data/julianwi.javainstaller/busybox chmod 0755 "+mcheck.getPath()+"/busybox\n"); } else{ writer.write("$bbdir mkdir -p "+mcheck.getPath()+"\n$bbdir chmod 0755 "+mcheck.getPath()+"\ncd "+mcheck.getPath()+"\n"); writer.write("$bbdir tar -xvzpf /data/data/julianwi.javainstaller/"+Checkforfile.file[mcheck.id]+"\n"); writer.write("$bbdir chmod 0755 *\n"); } if(mcheck.id == 8){ writer.write("am start --user 0 -a android.intent.action.VIEW -d file://"+mcheck.getPath()+"/awtonandroid.apk -t application/vnd.android.package-archive\n"); } /*if(mcheck.id == 3 || mcheck.id == 4){ writer.write("echo \"#!/system/bin/sh\" > "+MainActivity.checks[3].getPath()+"/java\n" + "echo \"export LD_LIBRARY_PATH="+MainActivity.checks[3].getPath()+"/lib:"+MainActivity.checks[2].getPath()+"\" >> "+MainActivity.checks[3].getPath()+"/java\n"); if(MainActivity.checks[4].installed || mcheck.id == 4){ writer.write("echo \"exec "+MainActivity.checks[3].getPath()+"/jamvm -Xbootclasspath:"+MainActivity.checks[3].getPath()+"/lib/classes.zip:"+MainActivity.checks[3].getPath()+"/lib/glibj.zip:"+MainActivity.checks[3].getPath()+"/lib/awtpeer.zip -Dawt.toolkit=julianwi.awtpeer.AndroidToolkit \\$@\" >> "+MainActivity.checks[3].getPath()+"/java\n"); } else{ writer.write("echo \"exec "+MainActivity.checks[3].getPath()+"/jamvm -Xbootclasspath:"+MainActivity.checks[3].getPath()+"/lib/classes.zip:"+MainActivity.checks[3].getPath()+"/lib/glibj.zip \\$@\" >> "+MainActivity.checks[3].getPath()+"/java\n"); } writer.write("$bbdir chmod 0755 "+MainActivity.checks[3].getPath()+"/java\n"); writer.write("$bbdir chmod 0755 "+MainActivity.checks[3].getPath()+"/lib/*\n"); }*/ } public void runterm(Boolean runactivity) throws Exception { if(runactivity){ chmod(new File("/data/data/julianwi.javainstaller/install.sh"), 0755); Intent intent = new Intent(MainActivity.context, RunActivity.class); Bundle b = new Bundle(); b.putBoolean("install", true); intent.putExtras(b); this.startActivity(intent); } else{ chmod(new File("/data/data/julianwi.javainstaller/install2.sh"), 0755); Intent intent = new Intent("jackpal.androidterm.RUN_SCRIPT"); intent.addCategory(Intent.CATEGORY_DEFAULT); if(MainActivity.context.getSharedPreferences("julianwi.javainstaller_preferences", 1).getString("rootmode", "off").equals("on")){ intent.putExtra("jackpal.androidterm.iInitialCommand", "su\nsh /data/data/julianwi.javainstaller/install2.sh"); } else{ intent.putExtra("jackpal.androidterm.iInitialCommand", "sh /data/data/julianwi.javainstaller/install2.sh"); } this.startActivity(intent); } } public void writejava() throws Exception{ Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/data/data/julianwi.javainstaller/java"), "utf-8")); writer.write("#!/system/bin/sh\n"); writer.write("export LD_LIBRARY_PATH="+MainActivity.checks[2].getPath()); for (int id : new int[]{3,4,6,7,8}) { if(MainActivity.checks[id].installed && !MainActivity.checks[id].getPath().equals(MainActivity.checks[2].getPath())){ writer.write(":"+MainActivity.checks[id].getPath()); } } writer.write("\nexec "+MainActivity.checks[2].getPath()+"/ld-linux.so.* "+MainActivity.checks[5].getPath()+"/jamvm -Xbootclasspath:"+MainActivity.checks[5].getPath()+"/classes.zip:"+MainActivity.checks[6].getPath()+"/glibj.zip:"+MainActivity.checks[8].getPath()+"/awtpeer.zip -Dawt.toolkit=julianwi.awtpeer.AndroidToolkit $@\n"); writer.close(); chmod(new File("/data/data/julianwi.javainstaller/java"), 0755); } @Override public void onResume(){ super.onResume(); if(checkCallingOrSelfPermission("jackpal.androidterm.permission.RUN_SCRIPT")!=PackageManager.PERMISSION_GRANTED){ try { getPackageManager().getPackageInfo("jackpal.androidterm", PackageManager.GET_ACTIVITIES); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(getPackageCodePath())), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch (NameNotFoundException e) { } } } public void init(){ if((3&pkgs)==2 || (!MainActivity.checks[0].installed && pkgs >> 2 != 0)){ lls.add(makell(0)); term=1; } uninstall = (pkgs & 1)==1; if((4&pkgs)==4 || (!MainActivity.checks[1].installed && pkgs >> 3 != 0 && !uninstall)){ lls.add(makell(1)); ids.add(1); } for (int i = 2; i < MainActivity.checks.length; i++) { if(((2<<i)&pkgs)==(2<<i)&&testrunactivity(i)==testrunactivity(1)){ lls.add(makell(i)); ids.add(i); } } for (int i = 2; i < MainActivity.checks.length; i++) { if(((2<<i)&pkgs)==(2<<i)&&testrunactivity(i)!=testrunactivity(1)){ lls.add(makell(i)); ids2.add(i); } } if((3&pkgs)==3){ lls.add(makell(0)); } il.notifyDataSetChanged(); } }