# HG changeset patch # User "Vincent Veronis" # Date 1304847351 -7200 # Node ID d9a0565ccaccbc373a86a57f6689c84c727001a4 # Parent 5d3163053c425bed132c216769c6e98830fd7f1a Improve Contact syncAdapter diff -r 5d3163053c42 -r d9a0565ccacc src/com/beem/project/beem/account/SyncAdapterService.java --- a/src/com/beem/project/beem/account/SyncAdapterService.java Sat May 07 12:26:45 2011 +0200 +++ b/src/com/beem/project/beem/account/SyncAdapterService.java Sun May 08 11:35:51 2011 +0200 @@ -48,10 +48,8 @@ import org.jivesoftware.smack.Roster; import org.jivesoftware.smack.RosterEntry; -import org.jivesoftware.smack.RosterGroup; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.packet.Presence; import android.accounts.Account; import android.accounts.OperationCanceledException; @@ -70,18 +68,10 @@ import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; -import android.provider.BaseColumns; import android.provider.ContactsContract; -import android.provider.ContactsContract.RawContacts; -import android.provider.ContactsContract.RawContacts.Entity; import android.util.Log; -import android.widget.ImageButton; -import android.widget.ImageView; import com.beem.project.beem.BeemConnection; -import com.beem.project.beem.R; -import com.beem.project.beem.providers.AvatarProvider; -import com.beem.project.beem.utils.Status; /** * Class to integrate beem in android's account @@ -168,9 +158,7 @@ ArrayList ops = new ArrayList(); for (RosterEntry entry : r.getEntries()) { if (entry != null) { - long rawContactID = manageEntry(ops, a, entry); - if (rawContactID != -1) - updateContactStatus(ops, entry, rawContactID, r.getPresence(entry.getUser())); + manageEntry(ops, a, entry); } if (ops.size() > 100) executeOperation(ops); @@ -186,10 +174,11 @@ executeOperation(ops); } - private static long manageEntry(ArrayList ops, Account account, RosterEntry entry) { + private static void manageEntry(ArrayList ops, Account account, RosterEntry entry) { long rawContactID = getRawContactID(account.name, entry.getUser()); + String displayName = entry.getName() != null ? entry.getName() : entry.getUser(); Log.i(TAG, "Sync Contact : " + entry.getUser() + " RawContactID : " + rawContactID); - if (rawContactID == -1) { // Not found in database, add new + if (rawContactID == -1) { // Not found in database, add new ContentValues values = new ContentValues(); values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type); values.put(ContactsContract.RawContacts.ACCOUNT_NAME, account.name); @@ -197,76 +186,40 @@ Uri rawContactUri = mContentResolver.insert(ContactsContract.RawContacts.CONTENT_URI, values); rawContactID = ContentUris.parseId(rawContactUri); values.clear(); - ContentProviderOperation.Builder builder = BuildProfile(entry, rawContactID); - ops.add(builder.build()); - builder = buildStructuredName(entry, rawContactID); + //Insert Name values + ContentProviderOperation.Builder builder = ContentProviderOperation + .newInsert(ContactsContract.Data.CONTENT_URI); + builder.withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactID); + builder.withValue(ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, rawContactID); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, displayName); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, displayName); + ops.add(builder.build()); + builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI); + builder.withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactID); + builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); + builder.withValue(ContactsContract.CommonDataKinds.Im.RAW_CONTACT_ID, rawContactID); + builder.withValue(ContactsContract.CommonDataKinds.Im.DATA1, displayName); + builder.withValue(ContactsContract.CommonDataKinds.Im.PROTOCOL, + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER); ops.add(builder.build()); } else { // Found, update - ContentProviderOperation.Builder builder = buildStructuredName(entry, rawContactID); + // Update Name values + ContentProviderOperation.Builder builder = ContentProviderOperation + .newUpdate(ContactsContract.Data.CONTENT_URI); + builder.withSelection( + ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID + " =? AND " + + ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE + + "'", new String[] { String.valueOf(rawContactID)}); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, displayName); + builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, displayName); ops.add(builder.build()); } - return rawContactID; } - - private static void manageGroup(ArrayList ops, Account account, RosterGroup group) { - Log.i(TAG, "Sync Group : " + group.getName()); - ContentProviderOperation.Builder builder = ContentProviderOperation - .newInsert(ContactsContract.Groups.CONTENT_URI); - builder.withValue(ContactsContract.Groups.TITLE, group.getName()); - builder.withValue(ContactsContract.Settings.UNGROUPED_VISIBLE, true); - } - - private static ContentProviderOperation.Builder buildStructuredName(RosterEntry entry, long rawContactID) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newInsert(ContactsContract.Data.CONTENT_URI); - String displayName = entry.getName() != null ? entry.getName() : entry.getUser(); - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.RAW_CONTACT_ID, rawContactID); - builder.withValue(ContactsContract.Data.MIMETYPE, - ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); - builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName); - return builder; - } - - private static ContentProviderOperation.Builder BuildProfile(RosterEntry entry, long rawContactID) { - ContentProviderOperation.Builder builder = ContentProviderOperation - .newInsert(ContactsContract.Data.CONTENT_URI); - String displayName = entry.getName() != null ? entry.getName() : entry.getUser(); - builder.withValue(ContactsContract.Data.RAW_CONTACT_ID, rawContactID); - builder.withValue(ContactsContract.Data.MIMETYPE, - "vnd.android.cursor.item/vnd.com.beem.project.beem.android.profile"); - builder.withValue(ContactsContract.Data.DATA2, displayName); - //builder.withValue(ContactsContract.Data.DATA2, R.string.chat_name); - return builder; - } - - private static void updateContactStatus(ArrayList operationList, RosterEntry entry, - long rawContactId, Presence p) { - Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId); - Uri entityUri = Uri.withAppendedPath(rawContactUri, Entity.CONTENT_DIRECTORY); - Cursor c = mContentResolver.query(entityUri, new String[] { Entity.DATA_ID }, Entity.MIMETYPE - + " = 'vnd.android.cursor.item/vnd.com.beem.project.beem.android.profile'", null, null); - try { - if (c.moveToNext()) { - if (!c.isNull(0)) { - Log.e(TAG + "UPDATECONTACTSTATUS", "Entity.DATA_ID : " + c.getLong(0)); - // Build raw Contact after click on it - ContentProviderOperation.Builder builder = ContentProviderOperation - .newInsert(ContactsContract.StatusUpdates.CONTENT_URI); - builder.withValue(ContactsContract.StatusUpdates.DATA_ID, c.getLong(0)); - //TODO: Get status message - builder.withValue(ContactsContract.StatusUpdates.STATUS, "BEEM STATUS"); - builder.withValue(ContactsContract.StatusUpdates.STATUS_RES_PACKAGE, "com.beem.project.beem"); - builder.withValue(ContactsContract.StatusUpdates.STATUS_LABEL, R.string.app_name); - //TODO: GET Status Logo - // Actually getting default logo in the xml -// builder.withValue(ContactsContract.StatusUpdates.STATUS_ICON, img); - operationList.add(builder.build()); - } - } - } finally { - c.close(); - } - } + private static long getRawContactID(String account, String jid) { long authorId = -1; diff -r 5d3163053c42 -r d9a0565ccacc src/com/beem/project/beem/ui/Chat.java --- a/src/com/beem/project/beem/ui/Chat.java Sat May 07 12:26:45 2011 +0200 +++ b/src/com/beem/project/beem/ui/Chat.java Sun May 08 11:35:51 2011 +0200 @@ -76,6 +76,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.preference.PreferenceManager; +import android.provider.Contacts; import android.provider.ContactsContract; import android.provider.ContactsContract.RawContacts.Entity; import android.text.util.Linkify; @@ -203,10 +204,16 @@ Uri tmpuri = getIntent().getData(); Log.e(TAG, "URI : " + tmpuri.getLastPathSegment()); Cursor c = getContentResolver().query(ContactsContract.Data.CONTENT_URI, - new String[] { ContactsContract.Data.DISPLAY_NAME }, - ContactsContract.Data._ID + " = " + tmpuri.getLastPathSegment(), null, null); + new String[] { ContactsContract.Data.CONTACT_ID }, + ContactsContract.Data.CONTACT_ID + " = " + tmpuri.getLastPathSegment(), null, null); if (c.getCount() > 0) { - Log.e(TAG, "JID : " + c.getString(0)); + Log.e(TAG, "ID : " + c.getInt(0)); + c = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, + new String[] { ContactsContract.RawContacts.SOURCE_ID }, + ContactsContract.RawContacts.CONTACT_ID + " = " + c.getInt(0), null, null); + if (c.getCount() > 0) { + Log.e(TAG, "JID : " + c.getString(0)); + } } //makeXmppUri //mContact = new Contact(getIntent().getData());