package com.novoda.priorityshare;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ShareTargetsAdapter extends BaseAdapter {
private final List<ResolveInfo> priorityAppInfos;
private final PackageManager packageManager;
private final LayoutInflater layoutInflater;
private final List<ResolveInfo> otherAppInfos;
private boolean showAllApps;
private int iconSizePx;
ShareTargetsAdapter(List<ResolveInfo> priorityAppInfos, List<ResolveInfo> otherAppInfos, PackageManager packageManager, LayoutInflater layoutInflater, int iconSizePx) {
this.priorityAppInfos = priorityAppInfos;
this.otherAppInfos = otherAppInfos;
this.packageManager = packageManager;
this.layoutInflater = layoutInflater;
this.iconSizePx = iconSizePx;
}
public static ShareTargetsAdapter newInstance(Context context, List<ResolveInfo> priorityAppInfos, List<ResolveInfo> otherAppInfos) {
PackageManager packageManager = context.getPackageManager();
LayoutInflater layoutInflater = LayoutInflater.from(context);
otherAppInfos = sortResolveInfoList(otherAppInfos, context.getPackageManager());
int iconSizePx = getIconSizePx(context.getResources());
return new ShareTargetsAdapter(priorityAppInfos, otherAppInfos, packageManager, layoutInflater, iconSizePx);
}
private static int getIconSizePx(Resources resources) {
return resources.getDimensionPixelSize(R.dimen.ps__grid_item_icon_size);
}
private static List<ResolveInfo> sortResolveInfoList(List<ResolveInfo> resolveInfoList, PackageManager packageManager) {
ArrayList<ResolveInfo> sortedList = new ArrayList<ResolveInfo>(resolveInfoList);
Collections.sort(sortedList, new ResolveInfo.DisplayNameComparator(packageManager));
return sortedList;
}
public void showAllApps() {
showAllApps = true;
notifyDataSetChanged();
}
@Override
public int getCount() {
int otherAppsCountMaybe = showAllApps ? otherAppInfos.size() : 0;
return priorityAppInfos.size() + otherAppsCountMaybe;
}
@Override
public ResolveInfo getItem(int position) {
int firstOtherAppsItemPosition = priorityAppInfos.size();
if (showAllApps && position >= firstOtherAppsItemPosition) {
int offsetPosition = position - firstOtherAppsItemPosition;
return otherAppInfos.get(offsetPosition);
}
return priorityAppInfos.get(position);
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getViewForTargetAppItem(position, convertView, parent);
}
private TextView initializeItemViewIfNecessary(View convertView, int layoutResId, ViewGroup parent) {
TextView textView;
if (convertView instanceof TextView) {
textView = (TextView) convertView;
} else {
textView = (TextView) layoutInflater.inflate(layoutResId, parent, false);
}
return textView;
}
private View getViewForTargetAppItem(int position, View convertView, ViewGroup parent) {
TextView textView = initializeItemViewIfNecessary(convertView, R.layout.ps__grid_item_share, parent);
ResolveInfo info = getItem(position);
updateItemForPriorityInfo(textView, info, iconSizePx);
return textView;
}
private void updateItemForPriorityInfo(TextView textView, ResolveInfo info, int iconSizePx) {
textView.setText(info.loadLabel(packageManager));
Drawable icon = info.loadIcon(packageManager);
icon = enforceIconSize(icon, iconSizePx);
textView.setCompoundDrawables(null, icon, null, null);
}
private Drawable enforceIconSize(Drawable icon, int iconSizePx) {
icon.mutate();
icon.setBounds(0, 0, iconSizePx, iconSizePx);
return icon;
}
}