package com.openfarmanager.android.adapters;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.openfarmanager.android.App;
import com.openfarmanager.android.R;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author Vlad Namashko
*/
public class ApplicationChooserAdapter extends BaseAdapter {
private List<ResolveInfo> mAvailableApplications;
private List<ResolveInfo> mAllApplications;
private PackageManager mPackageManager;
private boolean mShowAllApplications;
private int mAvailableApps;
public ApplicationChooserAdapter(List<ResolveInfo> apps, List<ResolveInfo> allApps) {
mAvailableApplications = apps;
mAllApplications = allApps;
mPackageManager = App.sInstance.getPackageManager();
mAvailableApps = mAvailableApplications.size();
Comparator<ResolveInfo> comparator = new Comparator<ResolveInfo>() {
@Override
public int compare(ResolveInfo resolveInfo, ResolveInfo resolveInfo2) {
return String.valueOf(resolveInfo.loadLabel(mPackageManager)).compareTo(String.valueOf(resolveInfo2.loadLabel(mPackageManager)));
}
};
Collections.sort(mAvailableApplications, comparator);
Collections.sort(mAllApplications, comparator);
}
@Override
public int getCount() {
int count = 1; // 'show/hide all' item
count += mAvailableApps == 0 ? 1 : mAvailableApps; // if no available apps for this intent found - one line for error message
if (mShowAllApplications) {
count += mAllApplications.size();
}
return count;
}
@Override
public ResolveInfo getItem(int position) {
if (position < mAvailableApplications.size()) {
return mAvailableApplications.get(position);
} else {
int topItems = mShowAllApplications && mAvailableApplications.size() == 0 ? 2 : 1;
return mAllApplications.get(position - mAvailableApplications.size() - topItems);
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(App.sInstance.getApplicationContext(), R.layout.application_chooser_item, null);
}
TextView title = (TextView) convertView.findViewById(R.id.app_title);
ImageView image = (ImageView) convertView.findViewById(R.id.app_image);
if (position == 0 && mAvailableApps == 0) {
// no available apps for this intent and currently we are rendering first item - show error
title.setText(R.string.error_no_app_to_open_file);
image.setVisibility(View.GONE);
convertView.setOnClickListener(null);
return convertView;
}
boolean showDelimiter = (mAvailableApps == 0 && position == 1) ||
(mAvailableApps > 0 && position == mAvailableApps);
if (showDelimiter) { // 'show all' item
title.setText(mShowAllApplications ? R.string.hide_all : R.string.show_all);
image.setVisibility(View.GONE);
convertView.setTag(R.string.is_delimiter, true);
return convertView;
}
ResolveInfo info = getItem(position);
image.setImageDrawable(info.activityInfo.loadIcon(mPackageManager));
image.setVisibility(View.VISIBLE);
title.setText(info.activityInfo.loadLabel(mPackageManager));
convertView.setTag(R.string.is_delimiter, false);
return convertView;
}
public void delimiterClicked() {
mShowAllApplications = !mShowAllApplications;
notifyDataSetChanged();
}
}