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