/******************************************************************************* * Copyright 2011 Alexandros Schillings * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package aws.apps.wifiKeyRecovery.adapters; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import android.content.Context; 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.TextView; import aws.apps.wifiKeyRecovery.R; import aws.apps.wifiKeyRecovery.containers.NetInfo; public class NetInfoAdapter extends BaseAdapter implements Filterable { // implements // SectionIndexer{ private final Map<String, Integer> mAlphaIndexer; private List<NetInfo> mAllItems; private List<NetInfo> mSubItems; private final Context mContext; private String[] mSections; private Filter mFilter; final String TAG = this.getClass().getName(); public NetInfoAdapter(Context context, List<NetInfo> appsList) { super(); mSubItems = appsList; mAllItems = this.mSubItems; mContext = context; mAlphaIndexer = new HashMap<String, Integer>(); prepareIndexer(); } private void prepareIndexer() { int size = mSubItems.size(); String title; String c; for (int i = size - 1; i >= 0; i--) { title = mSubItems.get(i).getQrSsid(); try { Integer.valueOf(title.substring(0, 1)); c = "#"; } catch (NumberFormatException e) { c = title.toUpperCase().substring(0, 1); } mAlphaIndexer.put(c, i); } final Set<String> keys = mAlphaIndexer.keySet(); final Iterator<String> it = keys.iterator(); final List<String> keyList = new ArrayList<String>(); while (it.hasNext()) { keyList.add(it.next()); } Collections.sort(keyList); mSections = new String[keyList.size()]; keyList.toArray(mSections); } public int getCount() { return mSubItems.size(); } public NetInfo getItem(int position) { return mSubItems.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { final NetInfo event = mSubItems.get(position); if (convertView == null) { final LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = vi.inflate(R.layout.list_item, null); } if (event != null) { final TextView text = (TextView) convertView.findViewById(R.id.text); if (position % 2 == 0) { convertView.setBackgroundResource(R.drawable.rowbg_alt); } else { convertView.setBackgroundResource(R.drawable.rowbg); } text.setText(event.toString()); convertView.setTag(event); } return convertView; } public int getPositionForSection(int section) { return mAlphaIndexer.get(mSections[section]); } public int getSectionForPosition(int position) { return 0; } public Object[] getSections() { return mSections; } public Filter getFilter() { if (mFilter == null) { mFilter = new ProoferFilter(); } return mFilter; } /** * Custom Filter implementation for the items adapter. * */ private class ProoferFilter extends Filter { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence prefix, FilterResults results) { // NOTE: this function is *always* called from the UI thread. mSubItems = (ArrayList<NetInfo>) results.values; notifyDataSetChanged(); } protected FilterResults performFiltering(CharSequence filterString) { // NOTE: this function is *always* called from a background thread, // and // not the UI thread. final FilterResults results = new FilterResults(); final List<NetInfo> i = new ArrayList<NetInfo>(); if (filterString != null && filterString.toString().length() > 0) { for (int index = 0; index < mAllItems.size(); index++) { final NetInfo item = mAllItems.get(index); if (item.getQrSsid().toLowerCase().contains(filterString.toString().toLowerCase())) { i.add(item); } } results.values = i; results.count = i.size(); } else { synchronized (mAllItems) { results.values = mAllItems; results.count = mAllItems.size(); } } return results; } } }