/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.fragments;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.text.TextUtils;
import com.galaxy.meetup.client.android.EsCursorLoader;
import com.galaxy.meetup.client.android.EsMatrixCursor;
/**
*
* @author sihai
*
*/
public class AndroidContactSearchLoader extends EsCursorLoader {
private static final String EMAIL_PROJECTION[] = {
"lookup", "display_name", "data1"
};
private static final String PHONE_PROJECTION[] = {
"lookup", "display_name", "data1", "data2", "data3"
};
private boolean mIncludePhoneNumbers;
private final int mMinQueryLength = 2;
private final String mProjection[];
private final String mQuery;
public AndroidContactSearchLoader(Context context, String as[], String s, int i, boolean flag) {
super(context);
mProjection = as;
mQuery = s;
mIncludePhoneNumbers = flag;
}
private void addPhoneNumberRows(EsMatrixCursor esmatrixcursor, Map hashmap, String s) {
List arraylist = (List)hashmap.get(s);
if(null == arraylist) {
return;
}
int i = 0;
do
{
if(i >= arraylist.size())
break;
PhoneNumber phonenumber = (PhoneNumber)arraylist.get(i);
Object aobj[] = new Object[mProjection.length];
int j = 0;
while(j < mProjection.length)
{
String s1 = mProjection[j];
if("person_id".equals(s1))
aobj[j] = (new StringBuilder("p:")).append(phonenumber.phoneNumber).toString();
else
if("lookup_key".equals(s1))
aobj[j] = phonenumber.lookupKey;
else
if("name".equals(s1))
aobj[j] = phonenumber.name;
else
if("phone".equals(s1))
aobj[j] = phonenumber.phoneNumber;
else
if("phone_type".equals(s1))
aobj[j] = phonenumber.phoneType;
j++;
}
esmatrixcursor.addRow(aobj);
i++;
} while(true);
hashmap.remove(s);
}
private Object[] buildEmailRow(Cursor cursor)
{
String s = cursor.getString(2);
Object aobj[] = new Object[mProjection.length];
int i = 0;
while(i < mProjection.length)
{
String s1 = mProjection[i];
if("person_id".equals(s1))
aobj[i] = (new StringBuilder("e:")).append(s).toString();
else
if("lookup_key".equals(s1))
aobj[i] = cursor.getString(0);
else
if("name".equals(s1))
aobj[i] = cursor.getString(1);
else
if("email".equals(s1))
aobj[i] = s;
i++;
}
return aobj;
}
private Cursor findEmailAddresses() {
EsMatrixCursor esmatrixcursor;
Cursor cursor = null;
esmatrixcursor = new EsMatrixCursor(mProjection);
Uri uri = Uri.withAppendedPath(android.provider.ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(mQuery));
try {
cursor = getContext().getContentResolver().query(uri, EMAIL_PROJECTION, null, null, null);
do
{
if(!cursor.moveToNext())
break;
if(!TextUtils.isEmpty(cursor.getString(2)))
esmatrixcursor.addRow(buildEmailRow(cursor));
} while(true);
} finally {
if(null != cursor) {
cursor.close();
}
}
return esmatrixcursor;
}
private Cursor findEmailAddressesAndPhoneNumbers() {
EsMatrixCursor esmatrixcursor;
ContentResolver contentresolver;
android.content.res.Resources resources;
List arraylist;
Map hashmap;
Cursor cursor = null;
Cursor cursor1 = null;
esmatrixcursor = new EsMatrixCursor(mProjection);
contentresolver = getContext().getContentResolver();
resources = getContext().getResources();
arraylist = new ArrayList();
hashmap = new HashMap();
try {
cursor = contentresolver.query(Uri.withAppendedPath(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(mQuery)), PHONE_PROJECTION, null, null, null);
String s;
do
{
if(!cursor.moveToNext())
break;
String s2 = cursor.getString(2);
if(!TextUtils.isEmpty(s2))
{
String s3 = cursor.getString(0);
PhoneNumber phonenumber = new PhoneNumber();
phonenumber.lookupKey = s3;
phonenumber.name = cursor.getString(1);
phonenumber.phoneNumber = s2;
CharSequence charsequence = android.provider.ContactsContract.CommonDataKinds.Phone.getTypeLabel(resources, cursor.getInt(3), cursor.getString(4));
if(charsequence != null)
phonenumber.phoneType = charsequence.toString();
ArrayList arraylist1 = (ArrayList)hashmap.get(s3);
if(arraylist1 == null)
{
arraylist1 = new ArrayList();
hashmap.put(s3, arraylist1);
arraylist.add(s3);
}
arraylist1.add(phonenumber);
}
} while(true);
cursor.close();
cursor1 = contentresolver.query(Uri.withAppendedPath(android.provider.ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(mQuery)), EMAIL_PROJECTION, null, null, null);
s = null;
do
{
if(!cursor1.moveToNext())
break;
String s1 = cursor1.getString(0);
if(!s1.equals(s))
{
addPhoneNumberRows(esmatrixcursor, hashmap, s);
s = s1;
}
if(!TextUtils.isEmpty(cursor1.getString(2)))
esmatrixcursor.addRow(buildEmailRow(cursor1));
} while(true);
if(null != s) {
addPhoneNumberRows(esmatrixcursor, hashmap, s);
}
for(int i = 0; i < arraylist.size(); i++)
addPhoneNumberRows(esmatrixcursor, hashmap, (String)arraylist.get(i));
} finally {
if(null != cursor) {
cursor.close();
}
if(null != cursor1) {
cursor1.close();
}
}
return esmatrixcursor;
}
public final Cursor esLoadInBackground() {
Object obj;
if(TextUtils.isEmpty(mQuery) || mQuery.length() < mMinQueryLength)
obj = new EsMatrixCursor(mProjection);
else
if(mIncludePhoneNumbers)
obj = findEmailAddressesAndPhoneNumbers();
else
obj = findEmailAddresses();
return ((Cursor) (obj));
}
private static final class PhoneNumber {
String lookupKey;
String name;
String phoneNumber;
String phoneType;
PhoneNumber() {
}
}
}