Filter contacts by group
authorVincent V. <marseille@beem-project.com>
Thu, 26 Jan 2012 16:43:44 +0100
changeset 929 4d171bf7378a
parent 928 008566b90ba8
child 930 ea7b1aeb5980
Filter contacts by group
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<Long> mArrayContactID2Show = new ArrayList<Long>();
+    
     /**
      * 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<Contact> result = mListContact;
-		//		if (constraint.length() > 0) {
-		//		    result = new LinkedList<Contact>();
-		//		    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<Contact> contacts = (List<Contact>) 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<Long> arrayValues = new ArrayList<Long>();
 		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<Long>) results.values);
+		//mArrayContactID2Show = (List<Integer>) 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();
+		}
+	    }
 	}
     }