12aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton/* 22aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Copyright (C) 2009 The Android Open Source Project 32aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 42aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 52aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * you may not use this file except in compliance with the License. 62aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * You may obtain a copy of the License at 72aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 82aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 92aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Unless required by applicable law or agreed to in writing, software 112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * See the License for the specific language governing permissions and 142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * limitations under the License. 152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonpackage com.android.loaderapp.model; 182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport com.android.loaderapp.R; 202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport com.android.loaderapp.model.EntityDelta.ValuesDelta; 212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport com.google.android.collect.Lists; 222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.accounts.Account; 242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.ContentProviderOperation; 252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.ContentProviderResult; 262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.ContentResolver; 272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.ContentUris; 282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.ContentValues; 292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.Context; 302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.OperationApplicationException; 312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.database.Cursor; 322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.os.RemoteException; 332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract; 342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.Groups; 352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.RawContacts; 362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Email; 372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Phone; 392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.Contacts.Data; 402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.ArrayList; 422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonpublic class GoogleSource extends FallbackSource { 442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final String ACCOUNT_TYPE = "com.google"; 452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public GoogleSource(String resPackageName) { 462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.accountType = ACCOUNT_TYPE; 472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.resPackageName = null; 482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.summaryResPackageName = resPackageName; 492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected void inflate(Context context, int inflateLevel) { 532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateStructuredName(context, inflateLevel); 552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateNickname(context, inflateLevel); 562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflatePhone(context, inflateLevel); 572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateEmail(context, inflateLevel); 582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateStructuredPostal(context, inflateLevel); 592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateIm(context, inflateLevel); 602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateOrganization(context, inflateLevel); 612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflatePhoto(context, inflateLevel); 622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateNote(context, inflateLevel); 632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateWebsite(context, inflateLevel); 642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflateEvent(context, inflateLevel); 652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // TODO: GOOGLE: GROUPMEMBERSHIP 672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton setInflatedLevel(inflateLevel); 692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateStructuredName(Context context, int inflateLevel) { 742aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateStructuredName(context, inflateLevel); 752aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 762aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 772aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 782aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateNickname(Context context, int inflateLevel) { 792aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateNickname(context, inflateLevel); 802aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 812aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 822aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 832aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflatePhone(Context context, int inflateLevel) { 842aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final DataKind kind = super.inflatePhone(context, ContactsSource.LEVEL_MIMETYPES); 852aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 862aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) { 872aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeColumn = Phone.TYPE; 882aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList = Lists.newArrayList(); 892aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); 902aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE)); 912aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_WORK)); 922aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)); 932aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)); 942aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true)); 952aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER)); 962aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true).setCustomColumn( 972aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton Phone.LABEL)); 982aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 992aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.fieldList = Lists.newArrayList(); 1002aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE)); 1012aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1022aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1032aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return kind; 1042aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1052aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1062aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1072aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateEmail(Context context, int inflateLevel) { 1082aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final DataKind kind = super.inflateEmail(context, ContactsSource.LEVEL_MIMETYPES); 1092aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) { 1112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeColumn = Email.TYPE; 1122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList = Lists.newArrayList(); 1132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_HOME)); 1142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_WORK)); 1152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_OTHER)); 1162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn( 1172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton Email.LABEL)); 1182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.fieldList = Lists.newArrayList(); 1202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL)); 1212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return kind; 1242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateStructuredPostal(Context context, int inflateLevel) { 1282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateStructuredPostal(context, inflateLevel); 1292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateIm(Context context, int inflateLevel) { 1332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateIm(context, inflateLevel); 1342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateOrganization(Context context, int inflateLevel) { 1382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateOrganization(context, inflateLevel); 1392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflatePhoto(Context context, int inflateLevel) { 1432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflatePhoto(context, inflateLevel); 1442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateNote(Context context, int inflateLevel) { 1482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateNote(context, inflateLevel); 1492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 1522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected DataKind inflateWebsite(Context context, int inflateLevel) { 1532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return super.inflateWebsite(context, inflateLevel); 1542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // TODO: this should come from resource in the future 1572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // Note that frameworks/base/core/java/android/pim/vcard/ContactStruct.java also wants 1582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // this String. 1592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private static final String GOOGLE_MY_CONTACTS_GROUP = "System Group: My Contacts"; 1602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final void attemptMyContactsMembership(EntityDelta state, Context context) { 1622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final ValuesDelta stateValues = state.getValues(); 1632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton stateValues.setFromTemplate(true); 1642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final String accountName = stateValues.getAsString(RawContacts.ACCOUNT_NAME); 1652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final String accountType = stateValues.getAsString(RawContacts.ACCOUNT_TYPE); 1662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton attemptMyContactsMembership(state, accountName, accountType, context, true); 1672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final void createMyContactsIfNotExist(Account account, Context context) { 1702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton attemptMyContactsMembership(null, account.name, account.type, context, true); 1712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1742aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 1752aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * @param allowRecur If the group is created between querying/about to create, we recur. But 1762aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * to prevent excess recursion, we provide a flag to make sure we only do the recursion loop 1772aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * once 1782aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1792aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private static final void attemptMyContactsMembership(EntityDelta state, 1802aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final String accountName, final String accountType, Context context, 1812aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton boolean allowRecur) { 1822aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final ContentResolver resolver = context.getContentResolver(); 1832aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1842aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton Cursor cursor = resolver.query(Groups.CONTENT_URI, 1852aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton new String[] {Groups.TITLE, Groups.SOURCE_ID, Groups.SHOULD_SYNC}, 1862aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton Groups.ACCOUNT_NAME + " =? AND " + Groups.ACCOUNT_TYPE + " =?", 1872aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton new String[] {accountName, accountType}, null); 1882aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1892aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton boolean myContactsExists = false; 1902aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton long assignToGroupSourceId = -1; 1912aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton while (cursor.moveToNext()) { 1922aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (GOOGLE_MY_CONTACTS_GROUP.equals(cursor.getString(0))) { 1932aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton myContactsExists = true; 1942aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1952aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (assignToGroupSourceId == -1 && cursor.getInt(2) != 0) { 1962aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton assignToGroupSourceId = cursor.getInt(1); 1972aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1982aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1992aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (myContactsExists && assignToGroupSourceId != -1) { 2002aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton break; 2012aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2022aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2032aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2042aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (myContactsExists && state == null) { 2052aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return; 2062aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2072aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2082aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton try { 2092aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final ContentValues values = new ContentValues(); 2102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 2112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (!myContactsExists) { 2132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // create the group if it doesn't exist 2142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final ContentValues newGroup = new ContentValues(); 2152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton newGroup.put(Groups.TITLE, GOOGLE_MY_CONTACTS_GROUP); 2162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton newGroup.put(Groups.ACCOUNT_NAME, accountName); 2182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton newGroup.put(Groups.ACCOUNT_TYPE, accountType); 2192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton newGroup.put(Groups.GROUP_VISIBLE, "1"); 2202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton ArrayList<ContentProviderOperation> operations = 2222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton new ArrayList<ContentProviderOperation>(); 2232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton operations.add(ContentProviderOperation 2252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton .newAssertQuery(Groups.CONTENT_URI) 2262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton .withSelection(Groups.TITLE + "=?", 2272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton new String[] { GOOGLE_MY_CONTACTS_GROUP }) 2282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton .withExpectedCount(0).build()); 2292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton operations.add(ContentProviderOperation 2302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton .newInsert(Groups.CONTENT_URI) 2322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton .withValues(newGroup) 2332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton .build()); 2342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton try { 2352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton ContentProviderResult[] results = resolver.applyBatch( 2362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton ContactsContract.AUTHORITY, operations); 2372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton values.put(GroupMembership.GROUP_ROW_ID, ContentUris.parseId(results[1].uri)); 2382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } catch (RemoteException e) { 2392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton throw new IllegalStateException("Problem querying for groups", e); 2402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } catch (OperationApplicationException e) { 2412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // the group was created after the query but before we tried to create it 2422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (allowRecur) { 2432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton attemptMyContactsMembership( 2442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton state, accountName, accountType, context, false); 2452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return; 2472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } else { 2492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (assignToGroupSourceId != -1) { 2502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton values.put(GroupMembership.GROUP_SOURCE_ID, assignToGroupSourceId); 2512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } else { 2522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // there are no Groups to add this contact to, so don't apply any membership 2532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // TODO: alert user that their contact will be dropped? 2542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (state != null) { 2572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton state.addEntry(ValuesDelta.fromAfter(values)); 2582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } finally { 2602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton cursor.close(); 2612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 2652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int getHeaderColor(Context context) { 2662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return 0xff89c2c2; 2672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 2702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int getSideBarColor(Context context) { 2712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return 0xff5bb4b4; 2722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton} 274