package com.nitrogen.settings.fragments;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.settings.R;
public abstract class HAFRAppChooserAdapter extends BaseAdapter implements Filterable {
final Context mContext;
final Handler mHandler;
final PackageManager mPackageManager;
final LayoutInflater mLayoutInflater;
protected List<PackageInfo> mInstalledAppInfo;
protected List<AppItem> mInstalledApps = new LinkedList<AppItem>();
protected List<PackageInfo> mTemporarylist;
boolean isUpdating;
public HAFRAppChooserAdapter(Context context) {
mContext = context;
mHandler = new Handler();
mPackageManager = mContext.getPackageManager();
mLayoutInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mInstalledAppInfo = mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
mTemporarylist = mInstalledAppInfo;
}
public synchronized void update() {
onStartUpdate();
new Thread(new Runnable() {
@Override
public void run() {
isUpdating = true;
final List<AppItem> temp = new LinkedList<AppItem>();
for (PackageInfo info : mTemporarylist) {
final AppItem item = new AppItem();
item.title = info.applicationInfo.loadLabel(mPackageManager);
item.icon = info.applicationInfo.loadIcon(mPackageManager);
item.packageName = info.packageName;
final int index = Collections.binarySearch(temp, item);
if (index < 0) {
temp.add((-index - 1), item);
} else {
temp.add((index + 1), item);
}
}
mHandler.post(new Runnable() {
@Override
public void run() {
mInstalledApps = temp;
notifyDataSetChanged();
isUpdating = false;
onFinishUpdate();
}
});
}
}).start();
}
public abstract void onStartUpdate();
public abstract void onFinishUpdate();
@Override
public int getCount() {
return mInstalledApps.size();
}
@Override
public AppItem getItem(int position) {
if (position >= mInstalledApps.size()) {
return mInstalledApps.get(mInstalledApps.size());
} else if (position < 0) {
return mInstalledApps.get(0);
}
return mInstalledApps.get(position);
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mInstalledApps.size()) {
return -1;
}
return getItem(position).hashCode();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = mLayoutInflater.inflate(R.layout.view_app_list, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(android.R.id.title);
holder.icon = (ImageView) convertView.findViewById(android.R.id.icon);
holder.pkg = (TextView) convertView.findViewById(android.R.id.message);
convertView.setTag(holder);
}
AppItem appInfo = getItem(position);
holder.name.setText(appInfo.title);
holder.pkg.setText(appInfo.packageName);
holder.icon.setImageDrawable(appInfo.icon);
return convertView;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (TextUtils.isEmpty(constraint)) {
// No filter implemented we return all the list
mTemporarylist = mInstalledAppInfo;
return new FilterResults();
}
ArrayList<PackageInfo> FilteredList = new ArrayList<PackageInfo>();
for (PackageInfo data : mInstalledAppInfo) {
final String filterText = constraint.toString().toLowerCase(Locale.ENGLISH);
try {
if (data.applicationInfo.loadLabel(mPackageManager).toString()
.toLowerCase(Locale.ENGLISH).contains(filterText)) {
FilteredList.add(data);
} else if (data.packageName.contains(filterText)) {
FilteredList.add(data);
}
} catch (Exception e) {
}
}
mTemporarylist = FilteredList;
return new FilterResults();
}
};
}
public class AppItem implements Comparable<AppItem> {
public CharSequence title;
public String packageName;
public Drawable icon;
@Override
public int compareTo(AppItem another) {
return this.title.toString().compareTo(another.title.toString());
}
}
static class ViewHolder {
TextView name;
ImageView icon;
TextView pkg;
}
}