1863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton/* 2863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Copyright (C) 2009 The Android Open Source Project 3863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * 4863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 5863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * you may not use this file except in compliance with the License. 6863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * You may obtain a copy of the License at 7863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * 8863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 9863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * 10863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Unless required by applicable law or agreed to in writing, software 11863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 12863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * See the License for the specific language governing permissions and 14863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * limitations under the License. 15863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton */ 16863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 17863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonpackage com.android.loaderapp.model; 18863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 19863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport com.android.loaderapp.R; 20863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport com.android.loaderapp.model.EntityDelta.ValuesDelta; 21863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport com.google.android.collect.Lists; 22863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 23863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.accounts.Account; 24863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentProviderOperation; 25863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentProviderResult; 26863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentResolver; 27863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentUris; 28863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentValues; 29863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.Context; 30863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.OperationApplicationException; 31863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.database.Cursor; 32863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.os.RemoteException; 33863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract; 34863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.Groups; 35863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.RawContacts; 36863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Email; 37863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.GroupMembership; 38863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Phone; 39863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.Contacts.Data; 40863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 41863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.ArrayList; 42863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 43863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonpublic class GoogleSource extends FallbackSource { 44863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton public static final String ACCOUNT_TYPE = "com.google"; 45863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton public GoogleSource(String resPackageName) { 46863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton this.accountType = ACCOUNT_TYPE; 47863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton this.resPackageName = null; 48863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton this.summaryResPackageName = resPackageName; 49863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 50863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 51863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 52863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected void inflate(Context context, int inflateLevel) { 53863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 54863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateStructuredName(context, inflateLevel); 55863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateNickname(context, inflateLevel); 56863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflatePhone(context, inflateLevel); 57863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateEmail(context, inflateLevel); 58863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateStructuredPostal(context, inflateLevel); 59863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateIm(context, inflateLevel); 60863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateOrganization(context, inflateLevel); 61863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflatePhoto(context, inflateLevel); 62863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateNote(context, inflateLevel); 63863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateWebsite(context, inflateLevel); 64863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton inflateEvent(context, inflateLevel); 65863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 66863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // TODO: GOOGLE: GROUPMEMBERSHIP 67863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 68863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton setInflatedLevel(inflateLevel); 69863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 70863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 71863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 72863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 73863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateStructuredName(Context context, int inflateLevel) { 74863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateStructuredName(context, inflateLevel); 75863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 76863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 77863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 78863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateNickname(Context context, int inflateLevel) { 79863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateNickname(context, inflateLevel); 80863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 81863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 82863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 83863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflatePhone(Context context, int inflateLevel) { 84863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final DataKind kind = super.inflatePhone(context, ContactsSource.LEVEL_MIMETYPES); 85863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 86863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) { 87863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeColumn = Phone.TYPE; 88863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList = Lists.newArrayList(); 89863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_HOME)); 90863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE)); 91863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_WORK)); 92863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)); 93863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)); 94863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true)); 95863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER)); 96863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true).setCustomColumn( 97863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton Phone.LABEL)); 98863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 99863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.fieldList = Lists.newArrayList(); 100863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE)); 101863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 102863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 103863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return kind; 104863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 105863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 106863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 107863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateEmail(Context context, int inflateLevel) { 108863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final DataKind kind = super.inflateEmail(context, ContactsSource.LEVEL_MIMETYPES); 109863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 110863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) { 111863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeColumn = Email.TYPE; 112863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList = Lists.newArrayList(); 113863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_HOME)); 114863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_WORK)); 115863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_OTHER)); 116863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.typeList.add(buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn( 117863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton Email.LABEL)); 118863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 119863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.fieldList = Lists.newArrayList(); 120863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL)); 121863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 122863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 123863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return kind; 124863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 125863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 126863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 127863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateStructuredPostal(Context context, int inflateLevel) { 128863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateStructuredPostal(context, inflateLevel); 129863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 130863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 131863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 132863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateIm(Context context, int inflateLevel) { 133863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateIm(context, inflateLevel); 134863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 135863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 136863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 137863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateOrganization(Context context, int inflateLevel) { 138863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateOrganization(context, inflateLevel); 139863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 140863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 141863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 142863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflatePhoto(Context context, int inflateLevel) { 143863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflatePhoto(context, inflateLevel); 144863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 145863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 146863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 147863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateNote(Context context, int inflateLevel) { 148863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateNote(context, inflateLevel); 149863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 150863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 151863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 152863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton protected DataKind inflateWebsite(Context context, int inflateLevel) { 153863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return super.inflateWebsite(context, inflateLevel); 154863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 155863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 156863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // TODO: this should come from resource in the future 157863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // Note that frameworks/base/core/java/android/pim/vcard/ContactStruct.java also wants 158863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // this String. 159863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton private static final String GOOGLE_MY_CONTACTS_GROUP = "System Group: My Contacts"; 160863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 161863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton public static final void attemptMyContactsMembership(EntityDelta state, Context context) { 162863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final ValuesDelta stateValues = state.getValues(); 163863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton stateValues.setFromTemplate(true); 164863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final String accountName = stateValues.getAsString(RawContacts.ACCOUNT_NAME); 165863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final String accountType = stateValues.getAsString(RawContacts.ACCOUNT_TYPE); 166863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton attemptMyContactsMembership(state, accountName, accountType, context, true); 167863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 168863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 169863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton public static final void createMyContactsIfNotExist(Account account, Context context) { 170863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton attemptMyContactsMembership(null, account.name, account.type, context, true); 171863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 172863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 173863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton /** 174863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * 175863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * @param allowRecur If the group is created between querying/about to create, we recur. But 176863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * to prevent excess recursion, we provide a flag to make sure we only do the recursion loop 177863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * once 178863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton */ 179863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton private static final void attemptMyContactsMembership(EntityDelta state, 180863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final String accountName, final String accountType, Context context, 181863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton boolean allowRecur) { 182863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final ContentResolver resolver = context.getContentResolver(); 183863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 184863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton Cursor cursor = resolver.query(Groups.CONTENT_URI, 185863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton new String[] {Groups.TITLE, Groups.SOURCE_ID, Groups.SHOULD_SYNC}, 186863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton Groups.ACCOUNT_NAME + " =? AND " + Groups.ACCOUNT_TYPE + " =?", 187863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton new String[] {accountName, accountType}, null); 188863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 189863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton boolean myContactsExists = false; 190863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton long assignToGroupSourceId = -1; 191863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton while (cursor.moveToNext()) { 192863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (GOOGLE_MY_CONTACTS_GROUP.equals(cursor.getString(0))) { 193863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton myContactsExists = true; 194863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 195863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (assignToGroupSourceId == -1 && cursor.getInt(2) != 0) { 196863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton assignToGroupSourceId = cursor.getInt(1); 197863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 198863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 199863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (myContactsExists && assignToGroupSourceId != -1) { 200863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton break; 201863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 202863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 203863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 204863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (myContactsExists && state == null) { 205863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return; 206863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 207863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 208863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton try { 209863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final ContentValues values = new ContentValues(); 210863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton values.put(Data.MIMETYPE, GroupMembership.CONTENT_ITEM_TYPE); 211863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 212863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (!myContactsExists) { 213863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // create the group if it doesn't exist 214863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton final ContentValues newGroup = new ContentValues(); 215863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton newGroup.put(Groups.TITLE, GOOGLE_MY_CONTACTS_GROUP); 216863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 217863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton newGroup.put(Groups.ACCOUNT_NAME, accountName); 218863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton newGroup.put(Groups.ACCOUNT_TYPE, accountType); 219863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton newGroup.put(Groups.GROUP_VISIBLE, "1"); 220863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 221863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton ArrayList<ContentProviderOperation> operations = 222863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton new ArrayList<ContentProviderOperation>(); 223863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 224863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton operations.add(ContentProviderOperation 225863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton .newAssertQuery(Groups.CONTENT_URI) 226863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton .withSelection(Groups.TITLE + "=?", 227863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton new String[] { GOOGLE_MY_CONTACTS_GROUP }) 228863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton .withExpectedCount(0).build()); 229863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton operations.add(ContentProviderOperation 230863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 231863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton .newInsert(Groups.CONTENT_URI) 232863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton .withValues(newGroup) 233863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton .build()); 234863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton try { 235863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton ContentProviderResult[] results = resolver.applyBatch( 236863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton ContactsContract.AUTHORITY, operations); 237863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton values.put(GroupMembership.GROUP_ROW_ID, ContentUris.parseId(results[1].uri)); 238863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } catch (RemoteException e) { 239863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton throw new IllegalStateException("Problem querying for groups", e); 240863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } catch (OperationApplicationException e) { 241863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // the group was created after the query but before we tried to create it 242863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (allowRecur) { 243863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton attemptMyContactsMembership( 244863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton state, accountName, accountType, context, false); 245863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 246863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return; 247863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 248863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } else { 249863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (assignToGroupSourceId != -1) { 250863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton values.put(GroupMembership.GROUP_SOURCE_ID, assignToGroupSourceId); 251863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } else { 252863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // there are no Groups to add this contact to, so don't apply any membership 253863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton // TODO: alert user that their contact will be dropped? 254863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 255863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 256863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton if (state != null) { 257863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton state.addEntry(ValuesDelta.fromAfter(values)); 258863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 259863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } finally { 260863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton cursor.close(); 261863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 262863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 263863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 264863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 265863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton public int getHeaderColor(Context context) { 266863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return 0xff89c2c2; 267863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 268863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton 269863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton @Override 270863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton public int getSideBarColor(Context context) { 271863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton return 0xff5bb4b4; 272863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton } 273863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton} 274