From efacc22c101cf403f6d2c08c731820f4427cfb18 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 8 May 2014 00:56:09 -0400 Subject: [PATCH] include app icons in the SelectLocalApps view Since we have the packageName, we can just fetch the Drawables directly. This uses some shortcuts to try to make things run faster. For example, the ImageView does not have an ID, instead it is references by the index number within the LinearLayout. --- res/layout/select_local_apps_list_item.xml | 56 +++++++++++++++++++ .../fragments/SelectLocalAppsFragment.java | 43 ++++++++++++-- 2 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 res/layout/select_local_apps_list_item.xml diff --git a/res/layout/select_local_apps_list_item.xml b/res/layout/select_local_apps_list_item.xml new file mode 100644 index 000000000..c29cd761b --- /dev/null +++ b/res/layout/select_local_apps_list_item.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java index 182d95dcb..87d692f9d 100644 --- a/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java +++ b/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java @@ -19,15 +19,19 @@ import android.app.ListFragment; import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; import android.content.Loader; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.database.Cursor; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; +import android.util.Log; import android.view.ActionMode; import android.view.View; -import android.widget.ListView; +import android.widget.*; import android.widget.SearchView.OnQueryTextListener; -import android.widget.SimpleCursorAdapter; +import android.widget.SimpleCursorAdapter.ViewBinder; import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.R; @@ -42,6 +46,8 @@ import java.util.HashSet; public class SelectLocalAppsFragment extends ListFragment implements LoaderCallbacks, OnQueryTextListener { + private PackageManager packageManager; + private Drawable defaultAppIcon; private SelectLocalAppsActivity selectLocalAppsActivity; private ActionMode mActionMode = null; private String mCurrentFilterString; @@ -57,21 +63,48 @@ public class SelectLocalAppsFragment extends ListFragment setEmptyText(getString(R.string.no_applications_found)); + packageManager = getActivity().getPackageManager(); + defaultAppIcon = getActivity().getResources() + .getDrawable(android.R.drawable.sym_def_app_icon); + selectLocalAppsActivity = (SelectLocalAppsActivity) getActivity(); ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); SimpleCursorAdapter adapter = new SimpleCursorAdapter(getActivity(), - android.R.layout.simple_list_item_activated_2, + R.layout.select_local_apps_list_item, null, new String[] { InstalledAppProvider.DataColumns.APPLICATION_LABEL, InstalledAppProvider.DataColumns.APP_ID, }, new int[] { - android.R.id.text1, - android.R.id.text2, + R.id.application_label, + R.id.package_name, }, 0); + adapter.setViewBinder(new ViewBinder() { + + @Override + public boolean setViewValue(View view, Cursor cursor, int columnIndex) { + Log.i("SelectLocalAppsFragment", "ViewBinder " + columnIndex); + if (columnIndex == cursor.getColumnIndex(InstalledAppProvider.DataColumns.APP_ID)) { + String packageName = cursor.getString(columnIndex); + TextView textView = (TextView) view.findViewById(R.id.package_name); + textView.setText(packageName); + LinearLayout ll = (LinearLayout) view.getParent().getParent(); + ImageView iconView = (ImageView) ll.getChildAt(0); + Drawable icon; + try { + icon = packageManager.getApplicationIcon(packageName); + } catch (NameNotFoundException e) { + icon = defaultAppIcon; + } + iconView.setImageDrawable(icon); + return true; + } + return false; + } + }); setListAdapter(adapter); setListShown(false); // start out with a progress indicator