/** * @author AnderWeb <anderweb@gmail.com> * */ package cn.walcl.ulauncher; import java.util.Collections; import java.util.Comparator; import java.util.List; import android.app.ExpandableListActivity; import android.content.ComponentName; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.TextView; public class ActivityPickerActivity extends ExpandableListActivity { private PackageManager mPackageManager; private final class LoadingTask extends AsyncTask<Void, Void, Void> { List<PackageInfo> groups; @Override public void onPreExecute() { setProgressBarIndeterminateVisibility(true); } @Override public Void doInBackground(Void... params) { groups = mPackageManager.getInstalledPackages(0); Collections.sort(groups, new PackageInfoComparable()); return null; } @Override public void onPostExecute(Void result) { setProgressBarIndeterminateVisibility(false); setListAdapter(new MyExpandableListAdapter(groups)); } } @Override protected void onCreate(Bundle savedState) { super.onCreate(savedState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.activity_list); getExpandableListView().setTextFilterEnabled(true); mPackageManager = getPackageManager(); // Start async loading the data new LoadingTask().execute(); } @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { ActivityInfo info = (ActivityInfo) getExpandableListAdapter().getChild(groupPosition, childPosition); Intent intent = new Intent(); intent.setComponent(new ComponentName(info.applicationInfo.packageName, info.name)); Intent mReturnData = new Intent(); intent.setAction(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); mReturnData.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); // Set the name of the activity mReturnData.putExtra(Intent.EXTRA_SHORTCUT_NAME, info.loadLabel(mPackageManager)); ShortcutIconResource iconResource = new ShortcutIconResource(); iconResource.packageName = info.packageName; try { Resources resources = mPackageManager.getResourcesForApplication(iconResource.packageName); iconResource.resourceName = resources.getResourceName(info.getIconResource()); mReturnData.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource); } catch (NameNotFoundException e) { } catch (Resources.NotFoundException e) { } setResult(RESULT_OK,mReturnData); finish(); return true; } /** * ExpandableListAdapter to handle packages and activities * @author adw * */ public class MyExpandableListAdapter extends BaseExpandableListAdapter { private final List<PackageInfo> groups; private final AbsListView.LayoutParams lpGroup; private final AbsListView.LayoutParams lpChild; private final int leftPadding; public MyExpandableListAdapter(List<PackageInfo> g) { super(); groups=g; leftPadding=getResources().getDimensionPixelSize(android.R.dimen.app_icon_size); lpGroup = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); lpChild = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, leftPadding); } public ActivityInfo getChild(int groupPosition, int childPosition) { //return groups.get(groupPosition).activities[childPosition]; PackageInfo tmp; try { tmp = mPackageManager.getPackageInfo(groups.get(groupPosition).packageName, PackageManager.GET_ACTIVITIES); if(tmp.activities!=null) return tmp.activities[childPosition]; else return null; } catch (NameNotFoundException e) { return null; } } public long getChildId(int groupPosition, int childPosition) { return childPosition; } public int getChildrenCount(int groupPosition) { //return groups.get(groupPosition).activities.length; PackageInfo tmp; try { tmp = mPackageManager.getPackageInfo(groups.get(groupPosition).packageName, PackageManager.GET_ACTIVITIES); if(tmp.activities!=null) return tmp.activities.length; else return 0; } catch (NameNotFoundException e) { return 0; } } public TextView getGenericView() { TextView textView = new TextView(ActivityPickerActivity.this); textView.setLayoutParams(lpGroup); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(leftPadding, 0, 0, 0); return textView; } public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getGenericView(); ActivityInfo activity=getChild(groupPosition, childPosition); if(activity!=null){ String name=activity.name.replace(activity.packageName, ""); textView.setText(activity.loadLabel(mPackageManager)+"("+name+")"); textView.setLayoutParams(lpChild); } return textView; } public PackageInfo getGroup(int groupPosition) { return groups.get(groupPosition); } public int getGroupCount() { return groups.size(); } public long getGroupId(int groupPosition) { return groupPosition; } public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { TextView textView = getGenericView(); PackageInfo info=getGroup(groupPosition); textView.setText(info.applicationInfo.loadLabel(mPackageManager)); Bitmap icon = Utilities.createIconBitmap( info.applicationInfo.loadIcon(mPackageManager), ActivityPickerActivity.this); textView.setCompoundDrawablesWithIntrinsicBounds(new FastBitmapDrawable(icon), null, null, null); return textView; } public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public boolean hasStableIds() { return true; } } public class PackageInfoComparable implements Comparator<PackageInfo>{ @Override public int compare(PackageInfo o1, PackageInfo o2) { return o1.applicationInfo.loadLabel(mPackageManager).toString().compareToIgnoreCase(o2.applicationInfo.loadLabel(mPackageManager).toString()); } } }