/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.impl.android;
//import android.app.Activity;
import android.content.*;
import android.database.Cursor;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.Contacts;
import android.provider.ContactsContract;
import com.codename1.contacts.Address;
import com.codename1.contacts.Contact;
import com.codename1.ui.Display;
import com.codename1.ui.Image;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Chen
*/
public class AndroidContactsManager {
private static AndroidContactsManager instance = new AndroidContactsManager();
private AndroidContactsManager() {
}
public static AndroidContactsManager getInstance() {
return instance;
}
public String[] getContacts(Context context, boolean withNumbers) {
Vector ids = new Vector();
String selection = null;
if (withNumbers) {
selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";
}
Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, selection, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
while (cursor.moveToNext()) {
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
ids.add(contactId);
}
cursor.close();
String[] contacts = new String[ids.size()];
for (int i = 0; i < ids.size(); i++) {
String id = (String) ids.elementAt(i);
contacts[i] = id;
}
return contacts;
}
public Contact getContact(Context activity, String id) {
return getContact(activity, id, true, true, true, true, true);
}
public static InputStream loadContactPhoto(ContentResolver cr, long id, long photo_id) {
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
if (input != null) {
return input;
}
byte[] photoBytes = null;
Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photo_id);
Cursor c = cr.query(photoUri, new String[]{ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null);
try {
if (c.moveToFirst()) {
photoBytes = c.getBlob(0);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
c.close();
}
if (photoBytes != null) {
return new ByteArrayInputStream(photoBytes);
}
return null;
}
public String createContact(final Context activity, String firstName, String familyName, String officePhone, String homePhone, String cellPhone, String email) {
String contactId = null;
String displayName = firstName + " " + familyName;
final ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI).withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());
//------------------------------------------------------ Names
if (firstName != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
firstName).build());
}
if (familyName != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
familyName).build());
}
if (displayName != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE).withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
displayName).build());
}
//------------------------------------------------------ Mobile Number
if (cellPhone != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, cellPhone).withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build());
}
//------------------------------------------------------ Home Numbers
if (homePhone != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, homePhone).withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_HOME).build());
}
//------------------------------------------------------ Work Numbers
if (officePhone != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, officePhone).withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_WORK).build());
}
//------------------------------------------------------ Email
if (email != null) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0).withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE).withValue(ContactsContract.CommonDataKinds.Email.DATA, email).withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK).build());
}
ContentProviderResult[] res;
try {
res = activity.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
if (res != null && res[0] != null) {
contactId = res[0].uri.getPath().substring(14);
}
} catch (Exception e) {
e.printStackTrace();
}
return contactId;
}
public boolean deleteContact(Context activity, String id) {
try {
final ArrayList ops = new ArrayList();
final ContentResolver cr = activity.getContentResolver();
ops.add(ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).withSelection(
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?",
new String[]{id}).build());
cr.applyBatch(ContactsContract.AUTHORITY, ops);
ops.clear();
} catch (Exception ex) {
return false;
}
return true;
}
public Contact getContact(Context activity, String id, boolean includesFullName,
boolean includesPicture, boolean includesNumbers, boolean includesEmail,
boolean includeAddress) {
Contact retVal = new Contact();
retVal.setId(id);
ContentResolver cr = activity.getContentResolver();
String[] projection = new String[] {ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID,
ContactsContract.Contacts.HAS_PHONE_NUMBER};
Cursor result = cr.query(ContactsContract.Contacts.CONTENT_URI, projection,
ContactsContract.Contacts._ID + " = ?",
new String[]{id}, null);
if (result.moveToFirst()) {
String name = result.getString(result.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
retVal.setDisplayName(name);
if(includesPicture){
String photoID = result.getString(result.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
if (photoID != null) {
InputStream input = loadContactPhoto(cr, Long.parseLong(id), Long.parseLong(photoID));
if (input != null) {
try {
retVal.setPhoto(Image.createImage(input));
} catch (IOException ex) {
Logger.getLogger(AndroidContactsManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}
if(includesNumbers){
Hashtable phones = new Hashtable();
if (Integer.parseInt(result.getString(
result.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
//String[] whereParameters = new String[]{id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
projection = new String[] {ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.IS_PRIMARY};
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
String type = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
boolean isPrimary = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.IS_PRIMARY)) != 0;
if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_HOME).equals(type)) {
type = "home";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).equals(type)) {
type = "mobile";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_WORK).equals(type)) {
type = "work";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME).equals(type)) {
type = "fax";
} else {
type = "other";
}
if (isPrimary) {
retVal.setPrimaryPhoneNumber(phone);
}
phones.put(type, phone);
}
retVal.setPhoneNumbers(phones);
pCur.close();
}
}
if(includesEmail){
Hashtable emails = new Hashtable();
projection = new String[] {ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Email.TYPE,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY};
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
projection,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id}, null);
while (emailCur.moveToNext()) {
// This would allow you get several email addresses
// if the email addresses were stored in an array
String email = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
String type = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
boolean isPrimary = emailCur.getInt(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.IS_PRIMARY)) != 0;
if (String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_HOME).equals(type)) {
type = "home";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_MOBILE).equals(type)) {
type = "mobile";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_WORK).equals(type)) {
type = "work";
} else {
type = "other";
}
if (isPrimary) {
retVal.setPrimaryEmail(email);
}
emails.put(type, email);
}
retVal.setEmails(emails);
emailCur.close();
}
if(includesFullName){
String birthWhere = ContactsContract.Data.CONTACT_ID + " = ? AND "
+ ContactsContract.Data.MIMETYPE + "= ? AND "
+ ContactsContract.CommonDataKinds.Event.TYPE + "="
+ ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] birthWhereParams = new String[]{id,
ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE
};
Cursor birthCur = cr.query(ContactsContract.Data.CONTENT_URI, null, birthWhere, birthWhereParams, null);
if (birthCur.moveToFirst()) {
String birth = birthCur.getString(birthCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));
Date bd = null;
try {
bd = new SimpleDateFormat("yyyy-MM-dd").parse(birth);
retVal.setBirthday(bd.getTime());
} catch (ParseException ex) {
}
}
birthCur.close();
String nameWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] nameWhereParams = new String[]{id,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME};
Cursor nameCursor = cr.query(ContactsContract.Data.CONTENT_URI, projection,
nameWhere,
nameWhereParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCursor.moveToNext()) {
String given = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
retVal.setFirstName(given);
retVal.setFamilyName(family);
retVal.setDisplayName(display);
}
nameCursor.close();
String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] noteWhereParams = new String[]{id,
ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
projection = new String[] {ContactsContract.CommonDataKinds.Note.NOTE};
Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, projection, noteWhere, noteWhereParams, null);
if (noteCur.moveToFirst()) {
String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
retVal.setNote(note);
}
noteCur.close();
}
if(includeAddress){
Hashtable addresses = new Hashtable();
String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] addrWhereParams = new String[]{id,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
projection = new String[] {ContactsContract.CommonDataKinds.StructuredPostal.POBOX,
ContactsContract.CommonDataKinds.StructuredPostal.STREET,
ContactsContract.CommonDataKinds.StructuredPostal.CITY,
ContactsContract.CommonDataKinds.StructuredPostal.REGION,
ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE,
ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY,
ContactsContract.CommonDataKinds.StructuredPostal.TYPE};
Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI,
projection, addrWhere, addrWhereParams, null);
while (addrCur.moveToNext()) {
Address address = new Address();
String poBox = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String street = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String city = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String state = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String postalCode = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String country = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String type = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
address.setCountry(country);
address.setLocality(city);
address.setPostalCode(postalCode);
address.setRegion(state);
address.setStreetAddress(street);
if (String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME).equals(type)) {
type = "home";
} else if (String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK).equals(type)) {
type = "work";
} else {
type = "other";
}
addresses.put(type, address);
}
retVal.setAddresses(addresses);
addrCur.close();
}
result.close();
return retVal;
}
public Contact[] getAllContacts(Context activity, boolean withNumbers, boolean includesFullName, boolean includesPicture, boolean includesNumbers, boolean includesEmail, boolean includeAddress) {
HashMap<String,Contact> contacts = new HashMap<String, Contact>();
ArrayList sortedContacts = new ArrayList();
String selection = null;
if (withNumbers) {
selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";
}
String[] projection = new String[] {ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID,
ContactsContract.Contacts.HAS_PHONE_NUMBER};
ContentResolver contentResolver = activity.getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, projection, selection, null, "upper(" + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + ") ASC");
while (cursor.moveToNext()) {
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Contact contact = new Contact();
contact.setId(contactId);
contact.setEmails(new Hashtable());
//the contacts hash is for faster lookups and the sortedContacts will keep the order sorted
Contact old = contacts.put(contactId, contact);
sortedContacts.add(contact);
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contact.setDisplayName(name);
if(includesPicture){
String photoID = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
if (photoID != null) {
InputStream input = loadContactPhoto(contentResolver, Long.parseLong(contactId), Long.parseLong(photoID));
if (input != null) {
try {
contact.setPhoto(Image.createImage(input));
} catch (IOException ex) {
Logger.getLogger(AndroidContactsManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
}
cursor.close();
if(includesNumbers){
projection = new String[] {
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.IS_PRIMARY};
Cursor pCur = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
projection, null, null, null);
while (pCur.moveToNext()) {
String id = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
Contact contact = contacts.get(id);
if (contact == null) {
continue;
}
Hashtable phones = contact.getPhoneNumbers();
if (phones == null) {
phones = new Hashtable();
contact.setPhoneNumbers(phones);
}
String type = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
boolean isPrimary = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.IS_PRIMARY)) != 0;
if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_HOME).equals(type)) {
type = "home";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).equals(type)) {
type = "mobile";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_WORK).equals(type)) {
type = "work";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME).equals(type)) {
type = "fax";
} else {
type = "other";
}
if (isPrimary) {
contact.setPrimaryPhoneNumber(phone);
}
phones.put(type, phone);
}
pCur.close();
}
if(includesEmail){
projection = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Email.TYPE,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY};
Cursor emailCur = contentResolver.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
projection,
null, null, null);
while (emailCur.moveToNext()) {
String id = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
Contact contact = contacts.get(id);
if (contact == null) {
continue;
}
Hashtable emails = contact.getEmails();
if (emails == null) {
emails = new Hashtable();
contact.setEmails(emails);
}
// This would allow you get several email addresses
// if the email addresses were stored in an array
String email = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
String type = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
boolean isPrimary = emailCur.getInt(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.IS_PRIMARY)) != 0;
if (String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_HOME).equals(type)) {
type = "home";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_MOBILE).equals(type)) {
type = "mobile";
} else if (String.valueOf(ContactsContract.CommonDataKinds.Email.TYPE_WORK).equals(type)) {
type = "work";
} else {
type = "other";
}
if (isPrimary) {
contact.setPrimaryEmail(email);
}
emails.put(type, email);
}
emailCur.close();
}
if(includesFullName){
String birthWhere = ContactsContract.Data.MIMETYPE + "= ? AND "
+ ContactsContract.CommonDataKinds.Event.TYPE + "="
+ ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] birthWhereParams = new String[]{ ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE };
Cursor birthCur = contentResolver.query(ContactsContract.Data.CONTENT_URI, null, birthWhere, birthWhereParams, null);
while (birthCur.moveToNext()) {
String id = birthCur.getString(birthCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.CONTACT_ID));
Contact contact = contacts.get(id);
if (contact == null) {
continue;
}
String birth = birthCur.getString(birthCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));
Date bd = null;
try {
bd = new SimpleDateFormat("yyyy-MM-dd").parse(birth);
contact.setBirthday(bd.getTime());
} catch (ParseException ex) {
}
}
birthCur.close();
String nameWhere = ContactsContract.Data.MIMETYPE + " = ?";
String[] nameWhereParams = new String[]{ ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};
projection = new String[] {
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID,
ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,
ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME,
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME};
Cursor nameCursor = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection,
nameWhere,
nameWhereParams, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
while (nameCursor.moveToNext()) {
String id = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID));
Contact contact = contacts.get(id);
if (contact == null) {
continue;
}
String given = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME));
String family = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME));
String display = nameCursor.getString(nameCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME));
if (given != null) contact.setFirstName(given);
if (family != null) contact.setFamilyName(family);
if (display != null) contact.setDisplayName(display);
}
nameCursor.close();
String noteWhere = ContactsContract.Data.MIMETYPE + " = ?";
String[] noteWhereParams = new String[]{ ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE };
projection = new String[] {ContactsContract.CommonDataKinds.Note.CONTACT_ID, ContactsContract.CommonDataKinds.Note.NOTE};
Cursor noteCur = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, noteWhere, noteWhereParams, null);
while (noteCur.moveToNext()) {
String id = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.CONTACT_ID));
Contact contact = contacts.get(id);
if (contact == null) {
continue;
}
String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
contact.setNote(note);
}
noteCur.close();
}
if(includeAddress){
String addrWhere = ContactsContract.Data.MIMETYPE + " = ?";
String[] addrWhereParams = new String[]{ ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE };
projection = new String[] {
ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID,
ContactsContract.CommonDataKinds.StructuredPostal.POBOX,
ContactsContract.CommonDataKinds.StructuredPostal.STREET,
ContactsContract.CommonDataKinds.StructuredPostal.CITY,
ContactsContract.CommonDataKinds.StructuredPostal.REGION,
ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE,
ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY,
ContactsContract.CommonDataKinds.StructuredPostal.TYPE};
Cursor addrCur = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, addrWhere, addrWhereParams, null);
while (addrCur.moveToNext()) {
String id = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID));
Contact contact = contacts.get(id);
if (contact == null) {
continue;
}
Hashtable addresses = contact.getAddresses();
if (addresses == null) {
addresses = new Hashtable();
contact.setAddresses(addresses);
}
Address address = new Address();
// String poBox = addrCur.getString(
// addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
String street = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
String city = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
String state = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
String postalCode = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
String country = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
String type = addrCur.getString(
addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
address.setCountry(country);
address.setLocality(city);
address.setPostalCode(postalCode);
address.setRegion(state);
address.setStreetAddress(street);
if (String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME).equals(type)) {
type = "home";
} else if (String.valueOf(ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK).equals(type)) {
type = "work";
} else {
type = "other";
}
addresses.put(type, address);
contact.setAddresses(addresses);
}
addrCur.close();
}
Contact[] contactsArray = new Contact[sortedContacts.size()];
sortedContacts.toArray(contactsArray);
return contactsArray;
}
}