src/com/beem/project/beem/BeemSync.java
changeset 928 008566b90ba8
parent 911 e5c194ea9307
child 931 067387e7ab43
--- a/src/com/beem/project/beem/BeemSync.java	Sun Jan 08 12:08:22 2012 +0100
+++ b/src/com/beem/project/beem/BeemSync.java	Mon Jan 09 17:52:52 2012 +0100
@@ -51,7 +51,6 @@
 import android.util.Log;
 
 import com.beem.project.beem.service.BeemAvatarCache;
-import com.beem.project.beem.ui.BeemNotification;
 import com.beem.project.beem.utils.Status;
 
 /**
@@ -98,19 +97,37 @@
 	    Log.w(TAG, "Roster is null cant sync informations");
 	    return;
 	}
+
+	Account account = null;
+	Account[] accounts = AccountManager.get(mContext).getAccounts();
+	for (Account a : accounts) {
+	    if (a.name.equals(accountName)) {
+		account = a;
+		break;
+	    }
+	}
+
+	if (account == null) {
+	    Log.w(TAG, "Account " + accountName + "not found, cant sync informations");
+	    return;
+	}
+
 	ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
+	addVirtualGroup(ops, account, "All Contact");
 	for (RosterGroup group : r.getGroups()) {
 	    if (group != null) {
-		manageGroup(ops, accountName, group);
+		manageGroup(ops, account, group);
 	    }
 	    if (ops.size() > NB_DB_OPERATION)
 		executeOperation(ops);
 	}
+	addVirtualGroup(ops, account, "No Group");
+	addVirtualGroup(ops, account, "Muc");
 	if (ops.size() > 0)
 	    executeOperation(ops);
 	for (RosterEntry entry : r.getEntries()) {
 	    if (entry != null) {
-		long rawContactID = manageEntry(ops, accountName, entry);
+		long rawContactID = manageEntry(ops, account, entry);
 		addUpdateStatus(ops, entry, r.getPresence(entry.getUser()), rawContactID);
 	    }
 	    if (ops.size() > NB_DB_OPERATION)
@@ -120,21 +137,14 @@
 	    executeOperation(ops);
     }
 
-    private void manageGroup(ArrayList<ContentProviderOperation> ops, String accountName, RosterGroup group) {
+    private void manageGroup(ArrayList<ContentProviderOperation> ops, Account account, RosterGroup group) {
 	Log.i(TAG, "Sync group : " + group.getName() + " " + group.getEntryCount());
-	long rawGroupID = getRawGroupID(accountName, group.getName());
+	long rawGroupID = getRawGroupID(account.name, group.getName());
 	if (rawGroupID == -1) {
-
 	    ContentProviderOperation.Builder builder = ContentProviderOperation
 		.newInsert(ContactsContract.Groups.CONTENT_URI);
-	    Account[] accounts = AccountManager.get(mContext).getAccounts();
-	    for (Account account : accounts) {
-		if (account.name.equals(accountName)) {
-		    builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name);
-		    builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type);
-		    break;
-		}
-	    }
+	    builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name);
+	    builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type);
 	    builder.withValue(ContactsContract.Groups.TITLE, group.getName());
 	    ops.add(builder.build());
 	}
@@ -147,19 +157,13 @@
      * @param entry The roster entry to sync
      * @return The raw contact ID
      */
-    private long manageEntry(ArrayList<ContentProviderOperation> ops, String accountName, RosterEntry entry) {
-	long rawContactID = getRawContactID(accountName, entry.getUser());
+    private long manageEntry(ArrayList<ContentProviderOperation> ops, Account account, RosterEntry entry) {
+	long rawContactID = getRawContactID(account.name, entry.getUser());
 	Log.i(TAG, "Sync Contact : " + entry.getUser() + " RawContactID : " + rawContactID);
 	if (rawContactID == -1) { // Not found in database, add new
 	    ContentValues values = new ContentValues();
-	    Account[] accounts = AccountManager.get(mContext).getAccounts();
-	    for (Account account : accounts) {
-		if (account.name.equals(accountName)) {
-		    values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type);
-		    values.put(ContactsContract.RawContacts.ACCOUNT_NAME, account.name);
-		    break;
-		}
-	    }
+	    values.put(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type);
+	    values.put(ContactsContract.RawContacts.ACCOUNT_NAME, account.name);
 	    values.put(ContactsContract.RawContacts.SOURCE_ID, entry.getUser());
 	    Uri rawContactUri = mContext.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
 	    rawContactID = ContentUris.parseId(rawContactUri);
@@ -167,10 +171,10 @@
 	    ContentProviderOperation.Builder builder = addUpdateStructuredName(entry, rawContactID, true);
 	    ops.add(builder.build());
 	    for (RosterGroup group : entry.getGroups()) {
-		builder = addUpdateGroup(entry, rawContactID, getRawGroupID(accountName, group.getName()), true);
+		builder = addUpdateGroup(entry, rawContactID, getRawGroupID(account.name, group.getName()), true);
 		ops.add(builder.build());
 	    }
-	    builder = createProfile(entry, rawContactID, accountName);
+	    builder = createProfile(entry, rawContactID, account.name);
 	    ops.add(builder.build());
 	} else { // Found, update
 	    ContentProviderOperation.Builder builder = addUpdateStructuredName(entry, rawContactID, false);
@@ -357,4 +361,21 @@
 	}
 	return authorId;
     }
+
+    /**
+     * Add in database virtual group to manage All Contact - No Contact.
+     * @param ops The content provider operation
+     * @param account The account related
+     * @param groupName The virtual group name
+     */
+    private void addVirtualGroup(ArrayList<ContentProviderOperation> ops, Account account, String groupName) {
+	ContentProviderOperation.Builder builder = ContentProviderOperation
+	    .newInsert(ContactsContract.Groups.CONTENT_URI);
+	builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, account.name);
+	builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, account.type);
+	builder.withValue(ContactsContract.Groups.TITLE, groupName);
+
+	ops.add(builder.build());
+    }
+
 }