package com.rendernode.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends ListActivity {
final static String TAG = "Main";
static Map<String, List<Map<String, Object>>> sTestActivitys = null;
final static String DEFAULT_PACKAGE = "com.rendernode.test.demos";
String mPackageName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "-----load data begin");
loadData();
Log.d(TAG, "-----load data end");
mPackageName = getIntent().getStringExtra("package");
if (TextUtils.isEmpty(mPackageName)) {
mPackageName = DEFAULT_PACKAGE;
}
setTitle(mPackageName);
if (sTestActivitys.get(mPackageName) != null) {
setListAdapter(new SimpleAdapter(this, sTestActivitys.get(mPackageName), android.R.layout.simple_list_item_1, new String[]{"title"}, new int[]{android.R.id.text1}));
} else {
new AlertDialog.Builder(this)
.setTitle("Warning!")
.setMessage("该目录下没有可调试的activity")
.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
}).show();
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
List<Map<String, Object>> list = sTestActivitys.get(mPackageName);
Map<String, Object> item = list.get(position);
Intent intent;
if (item.containsKey("package")) {
intent = new Intent(this, MainActivity.class);
intent.putExtra("package", mPackageName + "." + item.get("name"));
} else {
intent = new Intent();
intent.setClassName(this, mPackageName + "." + item.get("name"));
}
startActivity(intent);
}
void loadData() {
if (sTestActivitys != null) {
return;
}
sTestActivitys = new HashMap<String, List<Map<String,Object>>>();
List<String> tmp = new ArrayList<String>();
try {
for (ActivityInfo activityInfo : getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_ACTIVITIES).activities) {
String name = activityInfo.name;
Log.d(TAG, "-------------------------" + name);
try {
if (name.startsWith(DEFAULT_PACKAGE)) {
String packageName = name.substring(0, name.lastIndexOf("."));
List<Map<String, Object>> packageItems = sTestActivitys.get(packageName);
if (packageItems == null) {
packageItems = new ArrayList<Map<String,Object>>();
sTestActivitys.put(packageName, packageItems);
}
Map<String, Object> item = new HashMap<String, Object>();
item.put("name", name.substring(name.lastIndexOf(".") + 1));
item.put("title", activityInfo.loadLabel(getPackageManager()));
packageItems.add(item);
Collections.sort(packageItems, mComparator);
while (!packageName.equals(DEFAULT_PACKAGE)) {
boolean exists = tmp.contains(packageName);
if (!exists) {
tmp.add(packageName);
}
String packageN = packageName.substring(packageName.lastIndexOf(".") + 1);
packageName = packageName.substring(0, packageName.lastIndexOf("."));
packageItems = sTestActivitys.get(packageName);
if (packageItems == null) {
packageItems = new ArrayList<Map<String,Object>>();
sTestActivitys.put(packageName, packageItems);
}
if (!exists) {
item = new HashMap<String, Object>();
item.put("name", packageN);
item.put("title", packageN);
item.put("package", "true");
packageItems.add(item);
Collections.sort(packageItems, mComparator);
}
}
}
} catch (Exception e) {}
}
} catch (Exception e){}
}
Comparator<Map<String, Object>> mComparator = new Comparator<Map<String,Object>>() {
@Override
public int compare(Map<String, Object> lhs, Map<String, Object> rhs) {
if (lhs.containsKey("package")) {
return -1;
}
if (rhs.containsKey("package")) {
return 1;
}
String name1 = (String) lhs.get("name");
String name2 = (String) rhs.get("name");
if (name1 != null && name2 != null) {
return name1.compareTo(name2);
}
return 0;
}
};
}