package edu.berkeley.cs.amplab.carat.android.lists; import java.util.Arrays; import android.content.Context; import android.content.pm.PackageInfo; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import edu.berkeley.cs.amplab.carat.android.CaratApplication; import edu.berkeley.cs.amplab.carat.android.Constants; import edu.berkeley.cs.amplab.carat.android.R; import edu.berkeley.cs.amplab.carat.android.sampling.SamplingLibrary; import edu.berkeley.cs.amplab.carat.android.storage.SimpleHogBug; public class HogsBugsAdapter extends BaseAdapter { private SimpleHogBug[] allBugsOrHogs = null; private LayoutInflater mInflater; private CaratApplication a = null; public HogsBugsAdapter(CaratApplication caratApplication, SimpleHogBug[] results) { this.a = caratApplication; Context appContext = caratApplication.getApplicationContext(); // Skip system apps int items = 0; if (results != null) for (SimpleHogBug app : results) { String appName = app.getAppName(); if (appName == null) appName = caratApplication.getString(R.string.unknown); // don't show special apps: Carat or system apps // (DISABLED FOR DEBUGGING. TODO: ENABLE IT AFTER DEBUGGING, and check whether this has any problem) // if (SpecialAppCases.isSpecialApp(appName)) if (appName.equals(Constants.CARAT_PACKAGE_NAME) || appName.equals(Constants.CARAT_OLD)) continue; // the "dialer" app still shows up. no idea why! if (!SamplingLibrary.isHidden(appContext, appName)) items++; } allBugsOrHogs = new SimpleHogBug[items]; int i = 0; if (results != null && results.length > 0 && allBugsOrHogs.length > 0 && i < allBugsOrHogs.length) for (SimpleHogBug b : results) { String appName = b.getAppName(); if (appName == null) appName = caratApplication.getString(R.string.unknown); if (appName.equals(Constants.CARAT_PACKAGE_NAME) || appName.equals(Constants.CARAT_OLD)) continue; // Apparently the number of items changes from "items" above? if (!SamplingLibrary.isHidden(appContext, appName) && i < allBugsOrHogs.length) { allBugsOrHogs[i] = b; i++; } } Arrays.sort(allBugsOrHogs); mInflater = LayoutInflater.from(appContext); } public int getCount() { return allBugsOrHogs.length; } public Object getItem(int position) { return allBugsOrHogs[position]; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.hog, null); holder = new ViewHolder(); holder.appIcon = (ImageView) convertView.findViewById(R.id.appIcon); holder.txtName = (TextView) convertView.findViewById(R.id.appName); holder.textBenefit = (TextView) convertView .findViewById(R.id.benefit); holder.moreInfo = (ImageView) convertView .findViewById(R.id.jscore_info); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (allBugsOrHogs == null || position < 0 || position >= allBugsOrHogs.length) return convertView; SimpleHogBug item = allBugsOrHogs[position]; if (item == null) return convertView; Drawable icon = CaratApplication.iconForApp(a.getApplicationContext(), item.getAppName()); String label = CaratApplication.labelForApp(a.getApplicationContext(), item.getAppName()); if (label == null) label = a.getString(R.string.unknown); PackageInfo pak = SamplingLibrary.getPackageInfo( a.getApplicationContext(), item.getAppName()); String ver = ""; if (pak != null){ ver = pak.versionName; if (ver == null) ver = pak.versionCode+""; } holder.txtName.setText(label + " " + ver); holder.appIcon.setImageDrawable(icon); holder.textBenefit.setText(item.getBenefitText()); // holder.moreInfo... return convertView; } static class ViewHolder { ImageView appIcon; TextView txtName; TextView textBenefit; ImageView moreInfo; } }