/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package com.linkbubble.util; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.CheckedTextView; import android.widget.ImageView; import android.widget.ListView; import com.linkbubble.R; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Locale; public class AppPickerList { public static class AppInfo { String mActivityName; public String mPackageName; String mDisplayName; String mSortName; Intent mIntent; boolean mChecked; AppInfo(String activityName, String packageName, String displayName) { mActivityName = activityName; mPackageName = packageName; mDisplayName = displayName; mSortName = displayName.toLowerCase(Locale.getDefault()); mIntent = new Intent(Intent.ACTION_MAIN); mIntent.setPackage(mPackageName); mIntent.setComponent(new ComponentName(mPackageName, mActivityName)); } }; public static class AppInfoComparator implements Comparator<AppInfo> { @Override public int compare(AppInfo lhs, AppInfo rhs) { return lhs.mSortName.compareTo(rhs.mSortName); } } static class AppPickerListInfo { ArrayList<AppInfo> mAllApps; CheckedTextView mSingleCheckedTextView; } public enum SelectionType { SingleSelection, MultipleSelection, } public interface Initializer { boolean setChecked(String packageName, String activityName); boolean addToList(String packageName); } public static View createView(final Context context, final IconCache iconCache, final SelectionType selectionType, Initializer initializer) { PackageManager pm = context.getPackageManager(); //final IconCache iconCache = ((LauncherApplication)context.getApplicationContext()).getIconCache(); final int itemLayout = selectionType == SelectionType.SingleSelection ? R.layout.app_picker_list_item_single : R.layout.app_picker_list_item_multiple; ListView listView = (ListView) View.inflate(context, R.layout.app_picker_list, null); final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> allResolveInfo = pm.queryIntentActivities(mainIntent, 0); final AppPickerListInfo appPickerListInfo = new AppPickerListInfo(); appPickerListInfo.mAllApps = new ArrayList<AppInfo>(); for (ResolveInfo info : allResolveInfo) { if (info.activityInfo != null && info.activityInfo.packageName != null) { if (initializer.addToList(info.activityInfo.packageName)) { // This is the G+ "Photos" Activity. Ignore it. if (info.activityInfo.name.equals("com.google.android.apps.plus.phone.ConversationListActivity") == false) { appPickerListInfo.mAllApps.add(new AppInfo(info.activityInfo.name, info.activityInfo.packageName, info.loadLabel(pm).toString())); } } } } Collections.sort(appPickerListInfo.mAllApps, new AppInfoComparator()); ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(context, itemLayout) { @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView==null){ LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(itemLayout, parent, false); } AppInfo appInfo = appPickerListInfo.mAllApps.get(position); Bitmap icon = iconCache.getIcon(appInfo.mIntent); if (icon != null) { ((ImageView) convertView.findViewById(R.id.image_view)).setImageBitmap(icon); } CheckedTextView checkedTextView = ((CheckedTextView) convertView.findViewById(R.id.checked_text_view)); checkedTextView.setText(appInfo.mDisplayName); checkedTextView.setChecked(appInfo.mChecked); convertView.setTag(appInfo); return convertView; } }; for (AppInfo appInfo : appPickerListInfo.mAllApps) { listAdapter.add(appInfo.mDisplayName); } listView.setAdapter(listAdapter); if (initializer != null) { for (AppInfo app : appPickerListInfo.mAllApps) { if (initializer.setChecked(app.mPackageName, app.mActivityName)) { app.mChecked = true; } } } listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { AppInfo appInfo = (AppInfo) view.getTag(); appInfo.mChecked = !appInfo.mChecked; CheckedTextView checkedTextView = ((CheckedTextView) view.findViewById(R.id.checked_text_view)); if (selectionType == SelectionType.SingleSelection) { for (AppInfo app : appPickerListInfo.mAllApps) { if (app != appInfo && app.mChecked) { app.mChecked = false; } } if (appPickerListInfo.mSingleCheckedTextView != null) { appPickerListInfo.mSingleCheckedTextView.setChecked(false); } } appPickerListInfo.mSingleCheckedTextView = checkedTextView; appPickerListInfo.mSingleCheckedTextView.setChecked(appInfo.mChecked); } }); listView.setTag(appPickerListInfo); return listView; } public static ArrayList<AppInfo> getSelected(View view) { ArrayList<AppInfo> result = new ArrayList<AppInfo>(); AppPickerListInfo appPickerListInfo = (AppPickerListInfo) view.getTag(); for (AppInfo appInfo : appPickerListInfo.mAllApps) { if (appInfo.mChecked) { result.add(appInfo); } } appPickerListInfo.mSingleCheckedTextView = null; return result.size() > 0 ? result : null; } public static ArrayList<AppInfo> getUnselected(View view) { ArrayList<AppInfo> result = new ArrayList<AppInfo>(); AppPickerListInfo appPickerListInfo = (AppPickerListInfo) view.getTag(); for (AppInfo appInfo : appPickerListInfo.mAllApps) { if (appInfo.mChecked == false) { result.add(appInfo); } } appPickerListInfo.mSingleCheckedTextView = null; return result.size() > 0 ? result : null; } }