1 /*
2  * Copyright (C) 2009 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.loaderapp.model;
18 
19 import com.android.loaderapp.R;
20 import com.google.android.collect.Lists;
21 
22 import android.content.ContentValues;
23 import android.content.Context;
24 import android.provider.ContactsContract.CommonDataKinds.Email;
25 import android.provider.ContactsContract.CommonDataKinds.Im;
26 import android.provider.ContactsContract.CommonDataKinds.Nickname;
27 import android.provider.ContactsContract.CommonDataKinds.Note;
28 import android.provider.ContactsContract.CommonDataKinds.Organization;
29 import android.provider.ContactsContract.CommonDataKinds.Phone;
30 import android.provider.ContactsContract.CommonDataKinds.Photo;
31 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
32 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
33 import android.provider.ContactsContract.CommonDataKinds.Website;
34 
35 import java.util.Locale;
36 
37 public class ExchangeSource extends FallbackSource {
38 
39     public static final String ACCOUNT_TYPE = "com.android.exchange";
40 
ExchangeSource(String resPackageName)41     public ExchangeSource(String resPackageName) {
42         this.accountType = ACCOUNT_TYPE;
43         this.resPackageName = null;
44         this.summaryResPackageName = resPackageName;
45     }
46 
47     @Override
inflate(Context context, int inflateLevel)48     protected void inflate(Context context, int inflateLevel) {
49 
50         inflateStructuredName(context, inflateLevel);
51         inflateNickname(context, inflateLevel);
52         inflatePhone(context, inflateLevel);
53         inflateEmail(context, inflateLevel);
54         inflateStructuredPostal(context, inflateLevel);
55         inflateIm(context, inflateLevel);
56         inflateOrganization(context, inflateLevel);
57         inflatePhoto(context, inflateLevel);
58         inflateNote(context, inflateLevel);
59         inflateWebsite(context, inflateLevel);
60 
61         setInflatedLevel(inflateLevel);
62     }
63 
64     @Override
inflateStructuredName(Context context, int inflateLevel)65     protected DataKind inflateStructuredName(Context context, int inflateLevel) {
66         final DataKind kind = super.inflateStructuredName(context, ContactsSource.LEVEL_MIMETYPES);
67 
68         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
69             final boolean useJapaneseOrder =
70                 Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
71             kind.typeOverallMax = 1;
72 
73             kind.fieldList = Lists.newArrayList();
74             kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
75                     FLAGS_PERSON_NAME).setOptional(true));
76             if (useJapaneseOrder) {
77                 kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
78                         R.string.name_family, FLAGS_PERSON_NAME));
79                 kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
80                         R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
81                 kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
82                         R.string.name_given, FLAGS_PERSON_NAME));
83                 kind.fieldList.add(new EditField(StructuredName.SUFFIX,
84                         R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
85                 kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
86                         R.string.name_phonetic_family, FLAGS_PHONETIC).setOptional(true));
87                 kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
88                         R.string.name_phonetic_given, FLAGS_PHONETIC).setOptional(true));
89             } else {
90                 kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
91                         R.string.name_given, FLAGS_PERSON_NAME));
92                 kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
93                         R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
94                 kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
95                         R.string.name_family, FLAGS_PERSON_NAME));
96                 kind.fieldList.add(new EditField(StructuredName.SUFFIX,
97                         R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
98                 kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
99                         R.string.name_phonetic_given, FLAGS_PHONETIC).setOptional(true));
100                 kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
101                         R.string.name_phonetic_family, FLAGS_PHONETIC).setOptional(true));
102             }
103         }
104 
105         return kind;
106     }
107 
108     @Override
inflateNickname(Context context, int inflateLevel)109     protected DataKind inflateNickname(Context context, int inflateLevel) {
110         final DataKind kind = super.inflateNickname(context, ContactsSource.LEVEL_MIMETYPES);
111 
112         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
113             kind.isList = false;
114 
115             kind.fieldList = Lists.newArrayList();
116             kind.fieldList.add(new EditField(Nickname.NAME, R.string.nicknameLabelsGroup,
117                     FLAGS_PERSON_NAME));
118         }
119 
120         return kind;
121     }
122 
123     @Override
inflatePhone(Context context, int inflateLevel)124     protected DataKind inflatePhone(Context context, int inflateLevel) {
125         final DataKind kind = super.inflatePhone(context, ContactsSource.LEVEL_MIMETYPES);
126 
127         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
128             kind.typeColumn = Phone.TYPE;
129             kind.typeList = Lists.newArrayList();
130             kind.typeList.add(buildPhoneType(Phone.TYPE_HOME).setSpecificMax(2));
131             kind.typeList.add(buildPhoneType(Phone.TYPE_MOBILE).setSpecificMax(1));
132             kind.typeList.add(buildPhoneType(Phone.TYPE_WORK).setSpecificMax(2));
133             kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_WORK).setSecondary(true)
134                     .setSpecificMax(1));
135             kind.typeList.add(buildPhoneType(Phone.TYPE_FAX_HOME).setSecondary(true)
136                     .setSpecificMax(1));
137             kind.typeList
138                     .add(buildPhoneType(Phone.TYPE_PAGER).setSecondary(true).setSpecificMax(1));
139             kind.typeList.add(buildPhoneType(Phone.TYPE_CAR).setSecondary(true).setSpecificMax(1));
140             kind.typeList.add(buildPhoneType(Phone.TYPE_COMPANY_MAIN).setSecondary(true)
141                     .setSpecificMax(1));
142             kind.typeList.add(buildPhoneType(Phone.TYPE_MMS).setSecondary(true).setSpecificMax(1));
143             kind.typeList
144                     .add(buildPhoneType(Phone.TYPE_RADIO).setSecondary(true).setSpecificMax(1));
145             kind.typeList.add(buildPhoneType(Phone.TYPE_ASSISTANT).setSecondary(true)
146                     .setSpecificMax(1).setCustomColumn(Phone.LABEL));
147 
148             kind.fieldList = Lists.newArrayList();
149             kind.fieldList.add(new EditField(Phone.NUMBER, R.string.phoneLabelsGroup, FLAGS_PHONE));
150         }
151 
152         return kind;
153     }
154 
155     @Override
inflateEmail(Context context, int inflateLevel)156     protected DataKind inflateEmail(Context context, int inflateLevel) {
157         final DataKind kind = super.inflateEmail(context, ContactsSource.LEVEL_MIMETYPES);
158 
159         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
160             kind.typeOverallMax = 3;
161 
162             kind.fieldList = Lists.newArrayList();
163             kind.fieldList.add(new EditField(Email.DATA, R.string.emailLabelsGroup, FLAGS_EMAIL));
164         }
165 
166         return kind;
167     }
168 
169     @Override
inflateStructuredPostal(Context context, int inflateLevel)170     protected DataKind inflateStructuredPostal(Context context, int inflateLevel) {
171         final DataKind kind = super.inflateStructuredPostal(context, ContactsSource.LEVEL_MIMETYPES);
172 
173         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
174             final boolean useJapaneseOrder =
175                 Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
176             kind.typeColumn = StructuredPostal.TYPE;
177             kind.typeList = Lists.newArrayList();
178             kind.typeList.add(buildPostalType(StructuredPostal.TYPE_WORK).setSpecificMax(1));
179             kind.typeList.add(buildPostalType(StructuredPostal.TYPE_HOME).setSpecificMax(1));
180             kind.typeList.add(buildPostalType(StructuredPostal.TYPE_OTHER).setSpecificMax(1));
181 
182             kind.fieldList = Lists.newArrayList();
183             if (useJapaneseOrder) {
184                 kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
185                         R.string.postal_country, FLAGS_POSTAL).setOptional(true));
186                 kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
187                         R.string.postal_postcode, FLAGS_POSTAL));
188                 kind.fieldList.add(new EditField(StructuredPostal.REGION,
189                         R.string.postal_region, FLAGS_POSTAL));
190                 kind.fieldList.add(new EditField(StructuredPostal.CITY,
191                         R.string.postal_city,FLAGS_POSTAL));
192                 kind.fieldList.add(new EditField(StructuredPostal.STREET,
193                         R.string.postal_street, FLAGS_POSTAL));
194             } else {
195                 kind.fieldList.add(new EditField(StructuredPostal.STREET,
196                         R.string.postal_street, FLAGS_POSTAL));
197                 kind.fieldList.add(new EditField(StructuredPostal.CITY,
198                         R.string.postal_city,FLAGS_POSTAL));
199                 kind.fieldList.add(new EditField(StructuredPostal.REGION,
200                         R.string.postal_region, FLAGS_POSTAL));
201                 kind.fieldList.add(new EditField(StructuredPostal.POSTCODE,
202                         R.string.postal_postcode, FLAGS_POSTAL));
203                 kind.fieldList.add(new EditField(StructuredPostal.COUNTRY,
204                         R.string.postal_country, FLAGS_POSTAL).setOptional(true));
205             }
206         }
207 
208         return kind;
209     }
210 
211     @Override
inflateIm(Context context, int inflateLevel)212     protected DataKind inflateIm(Context context, int inflateLevel) {
213         final DataKind kind = super.inflateIm(context, ContactsSource.LEVEL_MIMETYPES);
214 
215         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
216             kind.typeOverallMax = 3;
217 
218             // NOTE: even though a traditional "type" exists, for editing
219             // purposes we're using the protocol to pick labels
220 
221             kind.defaultValues = new ContentValues();
222             kind.defaultValues.put(Im.TYPE, Im.TYPE_OTHER);
223 
224             kind.typeColumn = Im.PROTOCOL;
225             kind.typeList = Lists.newArrayList();
226             kind.typeList.add(buildImType(Im.PROTOCOL_AIM));
227             kind.typeList.add(buildImType(Im.PROTOCOL_MSN));
228             kind.typeList.add(buildImType(Im.PROTOCOL_YAHOO));
229             kind.typeList.add(buildImType(Im.PROTOCOL_SKYPE));
230             kind.typeList.add(buildImType(Im.PROTOCOL_QQ));
231             kind.typeList.add(buildImType(Im.PROTOCOL_GOOGLE_TALK));
232             kind.typeList.add(buildImType(Im.PROTOCOL_ICQ));
233             kind.typeList.add(buildImType(Im.PROTOCOL_JABBER));
234             kind.typeList.add(buildImType(Im.PROTOCOL_CUSTOM).setSecondary(true).setCustomColumn(
235                     Im.CUSTOM_PROTOCOL));
236 
237             kind.fieldList = Lists.newArrayList();
238             kind.fieldList.add(new EditField(Im.DATA, R.string.imLabelsGroup, FLAGS_EMAIL));
239         }
240 
241         return kind;
242     }
243 
244     @Override
inflateOrganization(Context context, int inflateLevel)245     protected DataKind inflateOrganization(Context context, int inflateLevel) {
246         final DataKind kind = super.inflateOrganization(context, ContactsSource.LEVEL_MIMETYPES);
247 
248         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
249             kind.isList = false;
250             kind.typeColumn = Organization.TYPE;
251             kind.typeList = Lists.newArrayList();
252             kind.typeList.add(buildOrgType(Organization.TYPE_WORK).setSpecificMax(1));
253             kind.typeList.add(buildOrgType(Organization.TYPE_OTHER).setSpecificMax(1));
254             kind.typeList.add(buildOrgType(Organization.TYPE_CUSTOM).setSecondary(true)
255                     .setSpecificMax(1));
256 
257             kind.fieldList = Lists.newArrayList();
258             kind.fieldList.add(new EditField(Organization.COMPANY, R.string.ghostData_company,
259                     FLAGS_GENERIC_NAME));
260             kind.fieldList.add(new EditField(Organization.TITLE, R.string.ghostData_title,
261                     FLAGS_GENERIC_NAME));
262         }
263 
264         return kind;
265     }
266 
267     @Override
inflatePhoto(Context context, int inflateLevel)268     protected DataKind inflatePhoto(Context context, int inflateLevel) {
269         final DataKind kind = super.inflatePhoto(context, ContactsSource.LEVEL_MIMETYPES);
270 
271         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
272             kind.typeOverallMax = 1;
273 
274             kind.fieldList = Lists.newArrayList();
275             kind.fieldList.add(new EditField(Photo.PHOTO, -1, -1));
276         }
277 
278         return kind;
279     }
280 
281     @Override
inflateNote(Context context, int inflateLevel)282     protected DataKind inflateNote(Context context, int inflateLevel) {
283         final DataKind kind = super.inflateNote(context, ContactsSource.LEVEL_MIMETYPES);
284 
285         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
286             kind.fieldList = Lists.newArrayList();
287             kind.fieldList.add(new EditField(Note.NOTE, R.string.label_notes, FLAGS_NOTE));
288         }
289 
290         return kind;
291     }
292 
293     @Override
inflateWebsite(Context context, int inflateLevel)294     protected DataKind inflateWebsite(Context context, int inflateLevel) {
295         final DataKind kind = super.inflateWebsite(context, ContactsSource.LEVEL_MIMETYPES);
296 
297         if (inflateLevel >= ContactsSource.LEVEL_CONSTRAINTS) {
298             kind.isList = false;
299 
300             kind.fieldList = Lists.newArrayList();
301             kind.fieldList.add(new EditField(Website.URL, R.string.websiteLabelsGroup, FLAGS_WEBSITE));
302         }
303 
304         return kind;
305     }
306 
307     @Override
getHeaderColor(Context context)308     public int getHeaderColor(Context context) {
309         return 0xffd5ba96;
310     }
311 
312     @Override
getSideBarColor(Context context)313     public int getSideBarColor(Context context) {
314         return 0xffb58e59;
315     }
316 }
317