1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2009 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License.
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.contacts.common.model.account;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.ContentValues;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Email;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Event;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Phone;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.provider.ContactsContract.CommonDataKinds.Relation;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.util.Log;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.R;
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.model.dataitem.DataKind;
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.android.contacts.common.util.CommonDateUtils;
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.ArrayList;
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.Collections;
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.List;
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class GoogleAccountType extends BaseAccountType {
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  /**
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * The package name that we should load contacts.xml from and rely on to handle G+ account
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * actions. Even though this points to gms, in some cases gms will still hand off responsibility
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   * to the G+ app.
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian   */
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static final String PLUS_EXTENSION_PACKAGE_NAME = "com.google.android.gms";
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public static final String ACCOUNT_TYPE = "com.google";
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final String TAG = "GoogleAccountType";
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private static final List<String> mExtensionPackages =
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      new ArrayList<>(Collections.singletonList(PLUS_EXTENSION_PACKAGE_NAME));
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public GoogleAccountType(Context context, String authenticatorPackageName) {
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.accountType = ACCOUNT_TYPE;
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.resourcePackageName = null;
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    this.syncAdapterPackageName = authenticatorPackageName;
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    try {
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindStructuredName(context);
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindDisplayName(context);
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindPhoneticName(context);
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindNickname(context);
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindPhone(context);
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindEmail(context);
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindStructuredPostal(context);
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindIm(context);
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindOrganization(context);
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindPhoto(context);
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindNote(context);
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindWebsite(context);
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindSipAddress(context);
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindGroupMembership(context);
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindRelation(context);
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      addDataKindEvent(context);
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      mIsInitialized = true;
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } catch (DefinitionException e) {
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Log.e(TAG, "Problem building account type", e);
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public List<String> getExtensionPackageNames() {
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return mExtensionPackages;
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected DataKind addDataKindPhone(Context context) throws DefinitionException {
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    final DataKind kind = super.addDataKindPhone(context);
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeColumn = Phone.TYPE;
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList = new ArrayList<>();
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE));
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_WORK));
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_HOME));
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN));
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true));
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true));
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true));
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER));
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Phone.LABEL));
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList = new ArrayList<>();
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return kind;
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected DataKind addDataKindEmail(Context context) throws DefinitionException {
106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    final DataKind kind = super.addDataKindEmail(context);
107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeColumn = Email.TYPE;
109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList = new ArrayList<>();
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildEmailType(Email.TYPE_HOME));
111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildEmailType(Email.TYPE_WORK));
112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildEmailType(Email.TYPE_OTHER));
113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(
114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Email.LABEL));
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList = new ArrayList<>();
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return kind;
120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private DataKind addDataKindRelation(Context context) throws DefinitionException {
123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    DataKind kind =
124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        addKind(
125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            new DataKind(
126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                Relation.CONTENT_ITEM_TYPE,
127ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                R.string.relationLabelsGroup,
128ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                Weight.RELATIONSHIP,
129ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                true));
130ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.actionHeader = new RelationActionInflater();
131ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.actionBody = new SimpleInflater(Relation.NAME);
132ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
133ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeColumn = Relation.TYPE;
134ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList = new ArrayList<>();
135ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_ASSISTANT));
136ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_BROTHER));
137ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_CHILD));
138ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_DOMESTIC_PARTNER));
139ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_FATHER));
140ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_FRIEND));
141ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_MANAGER));
142ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_MOTHER));
143ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_PARENT));
144ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_PARTNER));
145ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_REFERRED_BY));
146ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_RELATIVE));
147ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_SISTER));
148ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildRelationType(Relation.TYPE_SPOUSE));
149ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(
150ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        buildRelationType(Relation.TYPE_CUSTOM).setSecondary(true).setCustomColumn(Relation.LABEL));
151ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
152ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.defaultValues = new ContentValues();
153ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.defaultValues.put(Relation.TYPE, Relation.TYPE_SPOUSE);
154ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
155ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList = new ArrayList<>();
156ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList.add(new EditField(Relation.DATA, R.string.relationLabelsGroup, FLAGS_RELATION));
157ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
158ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return kind;
159ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
160ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
161ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private DataKind addDataKindEvent(Context context) throws DefinitionException {
162ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    DataKind kind =
163ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        addKind(
164ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian            new DataKind(Event.CONTENT_ITEM_TYPE, R.string.eventLabelsGroup, Weight.EVENT, true));
165ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.actionHeader = new EventActionInflater();
166ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.actionBody = new SimpleInflater(Event.START_DATE);
167ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
168ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeColumn = Event.TYPE;
169ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList = new ArrayList<>();
170ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.dateFormatWithoutYear = CommonDateUtils.NO_YEAR_DATE_FORMAT;
171ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.dateFormatWithYear = CommonDateUtils.FULL_DATE_FORMAT;
172ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, true).setSpecificMax(1));
173ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildEventType(Event.TYPE_ANNIVERSARY, false));
174ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(buildEventType(Event.TYPE_OTHER, false));
175ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.typeList.add(
176ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian        buildEventType(Event.TYPE_CUSTOM, false).setSecondary(true).setCustomColumn(Event.LABEL));
177ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
178ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.defaultValues = new ContentValues();
179ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.defaultValues.put(Event.TYPE, Event.TYPE_BIRTHDAY);
180ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
181ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList = new ArrayList<>();
182ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT));
183ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
184ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return kind;
185ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
186ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
187ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
188ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isGroupMembershipEditable() {
189ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return true;
190ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
191ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
192ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
193ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean areContactsWritable() {
194ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return true;
195ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
196ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
197ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
198ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String getViewContactNotifyServiceClassName() {
199ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return "com.google.android.syncadapters.contacts." + "SyncHighResPhotoIntentService";
200ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
201ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
202ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
203ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public String getViewContactNotifyServicePackageName() {
204ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return "com.google.android.syncadapters.contacts";
205ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
206ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
207