package com.dianping.example.activityloader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import dalvik.system.DexClassLoader;
public class ActivityLoader extends ListActivity {
private List<Map<String, String>> data = new ArrayList<Map<String, String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addItem("[ Launch SampleActivity ]", null);
addItem("[ Default.apk ]", null);
try {
AssetManager asset = getAssets();
for (String s : asset.list("apks")) {
addItem(s, "apks/" + s);
}
} catch (Exception e) {
}
SimpleAdapter adapter = new SimpleAdapter(this, data,
android.R.layout.simple_list_item_1, new String[] { "title" },
new int[] { android.R.id.text1 });
setListAdapter(adapter);
}
private void addItem(String title, String path) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("title", title);
map.put("path", path);
data.add(map);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if (position == 0) {
Intent i = new Intent("com.dianping.intent.action.SAMPLE_ACTIVITY");
startActivity(i);
return;
}
if (position == 1) {
MyApplication.CUSTOM_LOADER = null;
return;
}
Map<String, String> item = data.get(position);
String title = item.get("title");
String path = item.get("path");
try {
File dex = getDir("dex", Context.MODE_PRIVATE);
dex.mkdir();
File f = new File(dex, title);
InputStream fis = getAssets().open(path);
FileOutputStream fos = new FileOutputStream(f);
byte[] buffer = new byte[0xFF];
int len;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
File fo = getDir("outdex", Context.MODE_PRIVATE);
fo.mkdir();
DexClassLoader dcl = new DexClassLoader(f.getAbsolutePath(),
fo.getAbsolutePath(), null,
MyApplication.ORIGINAL_LOADER.getParent());
MyApplication.CUSTOM_LOADER = dcl;
Toast.makeText(this, title + " loaded, try launch again",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(this, "Unable to load " + title, Toast.LENGTH_SHORT)
.show();
e.printStackTrace();
MyApplication.CUSTOM_LOADER = null;
}
}
}