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