# HG changeset patch # User Vincent V. # Date 1327592624 -3600 # Node ID 4d171bf7378a2eafac7cf607f5b99618f2741997 # Parent 008566b90ba8a09868ccb00bab2f9c580d749a3a Filter contacts by group diff -r 008566b90ba8 -r 4d171bf7378a src/com/beem/project/beem/ui/ContactList.java --- a/src/com/beem/project/beem/ui/ContactList.java Mon Jan 09 17:52:52 2012 +0100 +++ b/src/com/beem/project/beem/ui/ContactList.java Thu Jan 26 16:43:44 2012 +0100 @@ -29,6 +29,8 @@ package com.beem.project.beem.ui; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import android.app.Activity; import android.content.ContentUris; @@ -58,6 +60,8 @@ import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.Filter; +import android.widget.FilterQueryProvider; +import android.widget.Filterable; import android.widget.Gallery; import android.widget.ImageView; import android.widget.ListView; @@ -91,6 +95,8 @@ private String mAccountName; + private static List mArrayContactID2Show = new ArrayList(); + /** * Constructor. */ @@ -102,6 +108,7 @@ super.onCreate(saveBundle); setContentView(R.layout.contactlist); + Bundle b = getIntent().getExtras(); if (b == null) { //TODO: Add toast to advice need to configure at least 1 beem account (Should not happend) @@ -130,6 +137,7 @@ final Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon() .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountName) .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, BeemApplication.BEEM_PACKAGE).build(); + //TODO: change null value for the projection (not efficient) Cursor cursorRawContact = getContentResolver().query(rawContactUri, null, ContactsContract.RawContacts.DELETED + "= 0", null, null); @@ -143,19 +151,19 @@ registerForContextMenu(listView); listView.setAdapter(mAdapterContactList); - // mAdapterContactList.setFilterQueryProvider(new FilterQueryProvider() { - // public Cursor runQuery(CharSequence constraint) { - // String s = '%' + constraint.toString() + '%'; - // return getContentResolver().query(rawContactUri, null, - // ContactsContract.RawContacts.SOURCE_ID+ " LIKE ? ", new String[] { s }, null); - // } - // }); + mAdapterContactList.setFilterQueryProvider(new FilterQueryProvider() { + @Override + public Cursor runQuery(CharSequence constraint) { + String s = '%' + constraint.toString() + '%'; + return getContentResolver().query(rawContactUri, null, + ContactsContract.RawContacts.SOURCE_ID + " LIKE ? ", new String[] { s }, null); + } + }); } @Override protected void onResume() { super.onResume(); - Log.e(TAG, "onResume : " + mSettings.getBoolean("settings_key_hide_groups", false)); if (!mSettings.getBoolean("settings_key_hide_groups", false)) showGroups(); else @@ -317,22 +325,29 @@ /** * Adapter contact list. */ - private static class BeemContactList extends SimpleCursorAdapter { //implements Filterable { + private static class BeemContactList extends SimpleCursorAdapter implements Filterable { private Context mContext; private int mLayout; private BeemAvatarCache mBeemAvatarCache; - - //private final ContactFilter mContactFilter = new ContactFilter(); - //private final GroupFilter mGroupFilter = new GroupFilter(); + private final GroupFilter mGroupFilter = new GroupFilter(); + private Cursor mCursor; public BeemContactList(Context context, int layout, Cursor c, String[] from, int[] to) { super(context, layout, c, from, to); mContext = context; mLayout = layout; mBeemAvatarCache = new BeemAvatarCache(context); + mCursor = c; } + @Override + public int getCount() { + if (mArrayContactID2Show.size() > 0) + return mArrayContactID2Show.size(); + return mCursor.getCount(); + } + @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { final LayoutInflater inflater = LayoutInflater.from(mContext); @@ -341,8 +356,14 @@ @Override public void bindView(View view, Context context, Cursor cursor) { + long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.RawContacts.CONTACT_ID)); + if (mArrayContactID2Show.size() > 0 && !mArrayContactID2Show.contains(id)) + return; + + Log.e("BINDVIEWWW", "OOOOOO" + id); + Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, id); Uri entityUri = Uri.withAppendedPath(rawContactUri, ContactsContract.RawContacts.Entity.CONTENT_DIRECTORY); Cursor cursorContact = mContext.getContentResolver().query( @@ -350,6 +371,7 @@ new String[] { ContactsContract.RawContacts.SOURCE_ID, ContactsContract.RawContacts.Entity.DATA_ID, ContactsContract.RawContacts.Entity.MIMETYPE, ContactsContract.RawContacts.Entity.DATA1 }, null, null, null); + try { while (cursorContact.moveToNext()) { if (!cursorContact.isNull(1)) { @@ -364,27 +386,24 @@ } } + + String jid = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.SOURCE_ID)); + view.setTag(jid); + + ImageView img = (ImageView) view.findViewById(R.id.avatar); + int contactStatus = 1; + //TODO: set the jid instead of null then debug + Drawable avatar = getAvatarStatusDrawable(null); + img.setImageDrawable(avatar); + img.setImageLevel(contactStatus); } finally { cursorContact.close(); } - - String jid = cursor.getString(cursor.getColumnIndex(ContactsContract.RawContacts.SOURCE_ID)); - view.setTag(jid); - - ImageView img = (ImageView) view.findViewById(R.id.avatar); - int contactStatus = 1; - Drawable avatar = getAvatarStatusDrawable(jid); - img.setImageDrawable(avatar); - img.setImageLevel(contactStatus); } - // public Filter getContactFilter() { - // return mContactFilter; - // } - - // public Filter getGroupFilter() { - // return mGroupFilter; - // } + public Filter getGroupFilter() { + return mGroupFilter; + } /** * Get a LayerDrawable containing the avatar and the status icon. The status icon will change with the level of @@ -413,47 +432,6 @@ /** * A Filter which select Contact to display by searching in ther Jid. */ - private class ContactFilter extends Filter { - - /** - * Create a ContactFilter. - */ - public ContactFilter() { - } - - @Override - protected Filter.FilterResults performFiltering(CharSequence constraint) { - Log.d(TAG, "performFiltering"); - // while (mCursor.moveToNext()) { - // - // } - // List result = mListContact; - // if (constraint.length() > 0) { - // result = new LinkedList(); - // for (Contact c : mContactOnGroup.get(mSelectedGroup)) { - // if (c.getJID().contains(constraint)) - // result.add(c); - // } - // } - // Filter.FilterResults fr = new Filter.FilterResults(); - // fr.values = result; - // fr.count = result.size(); - // return fr; - return null; - } - - @Override - protected void publishResults(CharSequence constraint, Filter.FilterResults results) { - Log.d(TAG, "publishResults"); - // List contacts = (List) results.values; - // mListContact = contacts; - // notifyDataSetChanged(); - } - } - - /** - * A Filter which select Contact to display by searching in ther Jid. - */ private class GroupFilter extends Filter { /** @@ -469,27 +447,32 @@ Cursor cursorContact = mContext.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.RAW_CONTACT_ID }, ContactsContract.Data.MIMETYPE + " =? ", new String[] { ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE }, null); + + List arrayValues = new ArrayList(); try { while (cursorContact.moveToNext()) { - Log.e( - TAG, - "HOW MUCH " - + cursorContact.getString(cursorContact - .getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID))); + arrayValues.add(cursorContact.getLong(cursorContact + .getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID))); } + } finally { cursorContact.close(); } Filter.FilterResults fr = new Filter.FilterResults(); - fr.values = cursorContact; - fr.count = cursorContact.getCount(); + fr.values = arrayValues; + fr.count = arrayValues.size(); return fr; } @Override protected void publishResults(CharSequence constraint, Filter.FilterResults results) { Log.d(TAG, "publishResults " + results.count); + //Use in the bindview to show only filtered ID + mArrayContactID2Show.clear(); + mArrayContactID2Show.addAll((ArrayList) results.values); + //mArrayContactID2Show = (List) results.values; + notifyDataSetChanged(); } } } @@ -560,27 +543,38 @@ @Override public void onItemClick(AdapterView arg0, View v, int i, long l) { - if (i == BANNER_POS_ALL_CONTACT) - Log.e("CONTACTLIST TODO", "ALL_CONTACT"); - else if (i == BANNER_POS_NO_GROUP) - Log.e("CONTACTLIST TODO", "NO GROUP"); - else if (i == BANNER_POS_MUC) + if (i == BANNER_POS_ALL_CONTACT) { + mArrayContactID2Show.clear(); + mAdapterContactList.notifyDataSetChanged(); + } else if (i == BANNER_POS_NO_GROUP) { + + } else if (i == BANNER_POS_MUC) Log.e("CONTACTLIST TODO", "MUC"); - else - Log.e("CONTACTLIST TODO", "FILTER CONTACT BY GROUP"); + else { + TextView nameGroup = (TextView) v.findViewById(R.id.contactlist_group); + Uri groupUri = ContactsContract.Groups.CONTENT_URI.buildUpon() + .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, mAccountName) + .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, BeemApplication.BEEM_PACKAGE) + .appendQueryParameter(ContactsContract.Groups.TITLE, nameGroup.toString()).build(); + Cursor cursorGroup = getContentResolver().query(groupUri, null, + ContactsContract.Groups.DELETED + "= 0", null, null); + if (cursorGroup.moveToFirst()) { + String _id = cursorGroup.getString(cursorGroup.getColumnIndex(ContactsContract.Groups._ID)); + mAdapterContactList.getGroupFilter().filter(_id); - TextView nameGroup = (TextView) v.findViewById(R.id.contactlist_group); - // Uri groupUri = ContactsContract.Groups.CONTENT_URI.buildUpon() - // .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME, mAccountName) - // .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE, BeemApplication.BEEM_PACKAGE) - // .appendQueryParameter(ContactsContract.Groups.TITLE, nameGroup.toString()).build(); - // nameGroup.setTextColor(R.color.vert_manu); - // Cursor cursorGroup = getContentResolver().query(groupUri, null, ContactsContract.Groups.DELETED + "= 0", - // null, null); - // if (cursorGroup.moveToFirst()) { - // String _id = cursorGroup.getString(cursorGroup.getColumnIndex(ContactsContract.Groups._ID)); - // mAdapterContactList.getGroupFilter().filter(_id); - // } +// // Get Contacts list +// final Uri rawContactUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon() +// .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_NAME, mAccountName) +// .appendQueryParameter(ContactsContract.RawContacts.ACCOUNT_TYPE, BeemApplication.BEEM_PACKAGE) +// .build(); +// //TODO: change null value for the projection (not efficient) +// Cursor cursorRawContact = getContentResolver().query(rawContactUri, null, +// ContactsContract.RawContacts.DELETED + "= 0", null, null); +// mAdapterContactList.changeCursor(cursorRawContact); +// cursorRawContact.requery(); +// mAdapterContactList.notifyDataSetChanged(); + } + } } }