• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.contacts.common.model.account;
18 
19 import com.google.common.collect.Lists;
20 
21 import com.android.contacts.common.R;
22 import com.android.contacts.common.model.dataitem.DataKind;
23 import com.android.contacts.common.util.CommonDateUtils;
24 
25 import android.content.ContentValues;
26 import android.content.Context;
27 import android.provider.ContactsContract.CommonDataKinds.Email;
28 import android.provider.ContactsContract.CommonDataKinds.Event;
29 import android.provider.ContactsContract.CommonDataKinds.Phone;
30 import android.provider.ContactsContract.CommonDataKinds.Relation;
31 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
32 import android.util.Log;
33 
34 import java.util.Locale;
35 
36 /**
37  * A writable account type that can be used to support samsung contacts. This may not perfectly
38  * match Samsung's latest intended account schema.
39  *
40  * This is only used to partially support Samsung accounts. The DataKind labels & fields are
41  * setup to support the values used by Samsung. But, not everything in the Samsung account type is
42  * supported. The Samsung account type includes a "Message Type" mimetype that we have no intention
43  * of showing inside the Contact editor. Similarly, we don't handle the "Ringtone" mimetype here
44  * since managing ringtones is handled in a different flow.
45  */
46 public class SamsungAccountType extends BaseAccountType {
47     private static final String TAG = "KnownExternalAccountType";
48     private static final String ACCOUNT_TYPE_SAMSUNG = "com.osp.app.signin";
49 
SamsungAccountType(Context context, String authenticatorPackageName, String type)50     public SamsungAccountType(Context context, String authenticatorPackageName, String type) {
51         this.accountType = type;
52         this.resourcePackageName = null;
53         this.syncAdapterPackageName = authenticatorPackageName;
54 
55         try {
56             addDataKindStructuredName(context);
57             addDataKindDisplayName(context);
58             addDataKindPhoneticName(context);
59             addDataKindNickname(context);
60             addDataKindPhone(context);
61             addDataKindEmail(context);
62             addDataKindStructuredPostal(context);
63             addDataKindIm(context);
64             addDataKindOrganization(context);
65             addDataKindPhoto(context);
66             addDataKindNote(context);
67             addDataKindWebsite(context);
68             addDataKindGroupMembership(context);
69             addDataKindRelation(context);
70             addDataKindEvent(context);
71 
72             mIsInitialized = true;
73         } catch (DefinitionException e) {
74             Log.e(TAG, "Problem building account type", e);
75         }
76     }
77 
78     /**
79      * Returns {@code TRUE} if this is samsung's account type and Samsung hasn't bothered to
80      * define a contacts.xml to provide a more accurate definition than ours.
81      */
isSamsungAccountType(Context context, String type, String packageName)82     public static boolean isSamsungAccountType(Context context, String type,
83             String packageName) {
84         return ACCOUNT_TYPE_SAMSUNG.equals(type)
85                 && !ExternalAccountType.hasContactsXml(context, packageName);
86     }
87 
88     @Override
addDataKindStructuredPostal(Context context)89     protected DataKind addDataKindStructuredPostal(Context context) throws DefinitionException {
90         final DataKind kind = super.addDataKindStructuredPostal(context);
91 
92         final boolean useJapaneseOrder =
93                 Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
94         kind.typeColumn = StructuredPostal.TYPE;
95         kind.typeList = Lists.newArrayList();
96         kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK).setSpecificMax(1));
97         kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME).setSpecificMax(1));
98         kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER).setSpecificMax(1));
99 
100         kind.fieldList = Lists.newArrayList();
101         if (useJapaneseOrder) {
102             kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
103                     R.string.postal_country, FLAGS_POSTAL).setOptional(true));
104             kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
105                     R.string.postal_postcode, FLAGS_POSTAL));
106             kind.fieldList.add(new EditField(StructuredPostal.REGION,
107                     R.string.postal_region, FLAGS_POSTAL));
108             kind.fieldList.add(new EditField(StructuredPostal.CITY,
109                     R.string.postal_city,FLAGS_POSTAL));
110             kind.fieldList.add(new EditField(StructuredPostal.STREET,
111                     R.string.postal_street, FLAGS_POSTAL));
112         } else {
113             kind.fieldList.add(new EditField(StructuredPostal.STREET,
114                     R.string.postal_street, FLAGS_POSTAL));
115             kind.fieldList.add(new EditField(StructuredPostal.CITY,
116                     R.string.postal_city,FLAGS_POSTAL));
117             kind.fieldList.add(new EditField(StructuredPostal.REGION,
118                     R.string.postal_region, FLAGS_POSTAL));
119             kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
120                     R.string.postal_postcode, FLAGS_POSTAL));
121             kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
122                     R.string.postal_country, FLAGS_POSTAL).setOptional(true));
123         }
124 
125         return kind;
126     }
127 
128     @Override
addDataKindPhone(Context context)129     protected DataKind addDataKindPhone(Context context) throws DefinitionException {
130         final DataKind kind = super.addDataKindPhone(context);
131 
132         kind.typeColumn = Phone.TYPE;
133         kind.typeList = Lists.newArrayList();
134         kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE));
135         kind.typeList.add(buildPhoneType(Phone.TYPE_HOME));
136         kind.typeList.add(buildPhoneType(Phone.TYPE_WORK));
137         kind.typeList.add(buildPhoneType(Phone.TYPE_MAIN));
138         kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true));
139         kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true));
140         kind.typeList.add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true));
141         kind.typeList.add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true));
142         kind.typeList.add(buildPhoneType(Phone.TYPE_OTHER));
143         kind.typeList.add(buildPhoneType(Phone.TYPE_CUSTOM).setSecondary(true)
144                 .setCustomColumn(Phone.LABEL));
145 
146         kind.fieldList = Lists.newArrayList();
147         kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
148 
149         return kind;
150     }
151 
152     @Override
addDataKindEmail(Context context)153     protected DataKind addDataKindEmail(Context context) throws DefinitionException {
154         final DataKind kind = super.addDataKindEmail(context);
155 
156         kind.typeColumn = Email.TYPE;
157         kind.typeList = Lists.newArrayList();
158         kind.typeList.add(buildEmailType(Email.TYPE_HOME));
159         kind.typeList.add(buildEmailType(Email.TYPE_WORK));
160         kind.typeList.add(buildEmailType(Email.TYPE_OTHER));
161         kind.typeList.add(buildEmailType(Email.TYPE_CUSTOM).setSecondary(true).setCustomColumn(
162                 Email.LABEL));
163 
164         kind.fieldList = Lists.newArrayList();
165         kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
166 
167         return kind;
168     }
169 
addDataKindRelation(Context context)170     private DataKind addDataKindRelation(Context context) throws DefinitionException {
171         DataKind kind = addKind(new DataKind(Relation.CONTENT_ITEM_TYPE,
172                 R.string.relationLabelsGroup, 160, true));
173         kind.actionHeader = new RelationActionInflater();
174         kind.actionBody = new SimpleInflater(Relation.NAME);
175 
176         kind.typeColumn = Relation.TYPE;
177         kind.typeList = Lists.newArrayList();
178         kind.typeList.add(buildRelationType(Relation.TYPE_ASSISTANT));
179         kind.typeList.add(buildRelationType(Relation.TYPE_BROTHER));
180         kind.typeList.add(buildRelationType(Relation.TYPE_CHILD));
181         kind.typeList.add(buildRelationType(Relation.TYPE_DOMESTIC_PARTNER));
182         kind.typeList.add(buildRelationType(Relation.TYPE_FATHER));
183         kind.typeList.add(buildRelationType(Relation.TYPE_FRIEND));
184         kind.typeList.add(buildRelationType(Relation.TYPE_MANAGER));
185         kind.typeList.add(buildRelationType(Relation.TYPE_MOTHER));
186         kind.typeList.add(buildRelationType(Relation.TYPE_PARENT));
187         kind.typeList.add(buildRelationType(Relation.TYPE_PARTNER));
188         kind.typeList.add(buildRelationType(Relation.TYPE_REFERRED_BY));
189         kind.typeList.add(buildRelationType(Relation.TYPE_RELATIVE));
190         kind.typeList.add(buildRelationType(Relation.TYPE_SISTER));
191         kind.typeList.add(buildRelationType(Relation.TYPE_SPOUSE));
192         kind.typeList.add(buildRelationType(Relation.TYPE_CUSTOM).setSecondary(true)
193                 .setCustomColumn(Relation.LABEL));
194 
195         kind.defaultValues = new ContentValues();
196         kind.defaultValues.put(Relation.TYPE, Relation.TYPE_SPOUSE);
197 
198         kind.fieldList = Lists.newArrayList();
199         kind.fieldList.add(new EditField(Relation.DATA, R.string.relationLabelsGroup,
200                 FLAGS_RELATION));
201 
202         return kind;
203     }
204 
addDataKindEvent(Context context)205     private DataKind addDataKindEvent(Context context) throws DefinitionException {
206         DataKind kind = addKind(new DataKind(Event.CONTENT_ITEM_TYPE,
207                 R.string.eventLabelsGroup, 150, true));
208         kind.actionHeader = new EventActionInflater();
209         kind.actionBody = new SimpleInflater(Event.START_DATE);
210 
211         kind.typeColumn = Event.TYPE;
212         kind.typeList = Lists.newArrayList();
213         kind.dateFormatWithoutYear = CommonDateUtils.NO_YEAR_DATE_FORMAT;
214         kind.dateFormatWithYear = CommonDateUtils.FULL_DATE_FORMAT;
215         kind.typeList.add(buildEventType(Event.TYPE_BIRTHDAY, true).setSpecificMax(1));
216         kind.typeList.add(buildEventType(Event.TYPE_ANNIVERSARY, false));
217         kind.typeList.add(buildEventType(Event.TYPE_OTHER, false));
218         kind.typeList.add(buildEventType(Event.TYPE_CUSTOM, false).setSecondary(true)
219                 .setCustomColumn(Event.LABEL));
220 
221         kind.defaultValues = new ContentValues();
222         kind.defaultValues.put(Event.TYPE, Event.TYPE_BIRTHDAY);
223 
224         kind.fieldList = Lists.newArrayList();
225         kind.fieldList.add(new EditField(Event.DATA, R.string.eventLabelsGroup, FLAGS_EVENT));
226 
227         return kind;
228     }
229 
230     @Override
isGroupMembershipEditable()231     public boolean isGroupMembershipEditable() {
232         return true;
233     }
234 
235     @Override
areContactsWritable()236     public boolean areContactsWritable() {
237         return true;
238     }
239 }
240