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.google.android.collect.Lists;
20863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport com.google.android.collect.Maps;
21863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
22863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.accounts.Account;
23863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.ContentValues;
24863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.Context;
25863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.content.pm.PackageManager;
26863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.database.Cursor;
27863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.graphics.drawable.Drawable;
28863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.Contacts;
29863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.Data;
30863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.RawContacts;
31863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Phone;
32863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
33863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport android.widget.EditText;
34863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
35863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.ArrayList;
36863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.Collections;
37863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.Comparator;
38863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.HashMap;
39863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonimport java.util.List;
40863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
41863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton/**
42863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * Internal structure that represents constraints and styles for a specific data
43863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * source, such as the various data types they support, including details on how
44863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * those types should be rendered and edited.
45863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * <p>
46863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton * In the future this may be inflated from XML defined by a data source.
47863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton */
48863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamiltonpublic abstract class ContactsSource {
49863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
50863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * The {@link RawContacts#ACCOUNT_TYPE} these constraints apply to.
51863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
52863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public String accountType = null;
53863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
54863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
55863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Package that resources should be loaded from, either defined through an
56863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Account} or for matching against {@link Data#RES_PACKAGE}.
57863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
58863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public String resPackageName;
59863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public String summaryResPackageName;
60863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
61863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public int titleRes;
62863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public int iconRes;
63863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
64863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public boolean readOnly;
65863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
66863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
67863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Set of {@link DataKind} supported by this source.
68863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
69863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    private ArrayList<DataKind> mKinds = Lists.newArrayList();
70863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
71863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
72863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Lookup map of {@link #mKinds} on {@link DataKind#mimeType}.
73863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
74863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    private HashMap<String, DataKind> mMimeKinds = Maps.newHashMap();
75863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
76863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final int LEVEL_NONE = 0;
77863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final int LEVEL_SUMMARY = 1;
78863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final int LEVEL_MIMETYPES = 2;
79863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static final int LEVEL_CONSTRAINTS = 3;
80863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
81863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    private int mInflatedLevel = LEVEL_NONE;
82863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
83863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public synchronized boolean isInflated(int inflateLevel) {
84863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return mInflatedLevel >= inflateLevel;
85863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
86863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
87863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /** @hide exposed for unit tests */
88863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public void setInflatedLevel(int inflateLevel) {
89863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        mInflatedLevel = inflateLevel;
90863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
91863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
92863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
93863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Ensure that this {@link ContactsSource} has been inflated to the
94863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * requested level.
95863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
96863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public synchronized void ensureInflated(Context context, int inflateLevel) {
97863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (!isInflated(inflateLevel)) {
98863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            inflate(context, inflateLevel);
99863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
100863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
101863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
102863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
103863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Perform the actual inflation to the requested level. Called by
104863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link #ensureInflated(Context, int)} when inflation is needed.
105863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
106863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    protected abstract void inflate(Context context, int inflateLevel);
107863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
108863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
109863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Invalidate any cache for this {@link ContactsSource}, removing all
110863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * inflated data. Calling {@link #ensureInflated(Context, int)} will
111863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * populate again from scratch.
112863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
113863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public synchronized void invalidateCache() {
114863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        this.mKinds.clear();
115863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        this.mMimeKinds.clear();
116863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        setInflatedLevel(LEVEL_NONE);
117863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
118863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
119863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public CharSequence getDisplayLabel(Context context) {
120863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (this.titleRes != -1 && this.summaryResPackageName != null) {
121863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            final PackageManager pm = context.getPackageManager();
122863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return pm.getText(this.summaryResPackageName, this.titleRes, null);
123863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (this.titleRes != -1) {
124863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return context.getText(this.titleRes);
125863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
126863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return this.accountType;
127863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
128863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
129863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
130863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public Drawable getDisplayIcon(Context context) {
131863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        if (this.titleRes != -1 && this.summaryResPackageName != null) {
132863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            final PackageManager pm = context.getPackageManager();
133863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return pm.getDrawable(this.summaryResPackageName, this.iconRes, null);
134863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else if (this.titleRes != -1) {
135863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return context.getResources().getDrawable(this.iconRes);
136863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        } else {
137863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return null;
138863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
139863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
140863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
141863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    abstract public int getHeaderColor(Context context);
142863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
143863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    abstract public int getSideBarColor(Context context);
144863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
145863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
146863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Comparator} to sort by {@link DataKind#weight}.
147863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
148863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    private static Comparator<DataKind> sWeightComparator = new Comparator<DataKind>() {
149863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int compare(DataKind object1, DataKind object2) {
150863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return object1.weight - object2.weight;
151863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
152863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    };
153863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
154863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
155863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Return list of {@link DataKind} supported, sorted by
156863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link DataKind#weight}.
157863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
158863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public ArrayList<DataKind> getSortedDataKinds() {
159863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        // TODO: optimize by marking if already sorted
160863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        Collections.sort(mKinds, sWeightComparator);
161863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return mKinds;
162863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
163863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
164863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
165863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Find the {@link DataKind} for a specific MIME-type, if it's handled by
166863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * this data source. If you may need a fallback {@link DataKind}, use
167863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Sources#getKindOrFallback(String, String, Context, int)}.
168863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
169863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public DataKind getKindForMimetype(String mimeType) {
170863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return this.mMimeKinds.get(mimeType);
171863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
172863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
173863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
174863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Add given {@link DataKind} to list of those provided by this source.
175863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
176863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public DataKind addKind(DataKind kind) {
177863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        kind.resPackageName = this.resPackageName;
178863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        this.mKinds.add(kind);
179863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        this.mMimeKinds.put(kind.mimeType, kind);
180863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        return kind;
181863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
182863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
183863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
184863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Description of a specific data type, usually marked by a unique
185863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Data#MIMETYPE}. Includes details about how to view and edit
186863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Data} rows of this kind, including the possible {@link EditType}
187863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * labels and editable {@link EditField}.
188863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
189863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static class DataKind {
190863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String resPackageName;
191863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String mimeType;
192863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int titleRes;
193863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int iconRes;
194863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int iconAltRes;
195863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int weight;
196863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean secondary;
197863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean editable;
198863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
199863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        /**
200863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         * If this is true (default), the user can add and remove values.
201863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         * If false, the editor will always show a single field (which might be empty).
202863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         */
203863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean isList;
204863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
205863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public StringInflater actionHeader;
206863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public StringInflater actionAltHeader;
207863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public StringInflater actionBody;
208863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
209863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean actionBodySocial = false;
210863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
211863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String typeColumn;
212863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
213863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        /**
214863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         * Maximum number of values allowed in the list. -1 represents infinity.
215863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         * If {@link DataKind#isList} is false, this value is ignored.
216863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton         */
217863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int typeOverallMax;
218863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
219863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public List<EditType> typeList;
220863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public List<EditField> fieldList;
221863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
222863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public ContentValues defaultValues;
223863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
224863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public DataKind() {
225863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
226863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
227863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public DataKind(String mimeType, int titleRes, int iconRes, int weight, boolean editable) {
228863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.mimeType = mimeType;
229863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.titleRes = titleRes;
230863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.iconRes = iconRes;
231863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.weight = weight;
232863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.editable = editable;
233863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.isList = true;
234863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.typeOverallMax = -1;
235863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
236863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
237863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
238863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
239863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Description of a specific "type" or "label" of a {@link DataKind} row,
240863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * such as {@link Phone#TYPE_WORK}. Includes constraints on total number of
241863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * rows a {@link Contacts} may have of this type, and details on how
242863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * user-defined labels are stored.
243863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
244863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static class EditType {
245863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int rawValue;
246863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int labelRes;
247863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton//        public int actionRes;
248863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton//        public int actionAltRes;
249863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean secondary;
250863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int specificMax;
251863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String customColumn;
252863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
253863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditType(int rawValue, int labelRes) {
254863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.rawValue = rawValue;
255863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.labelRes = labelRes;
256863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.specificMax = -1;
257863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
258863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
259863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditType setSecondary(boolean secondary) {
260863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.secondary = secondary;
261863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return this;
262863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
263863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
264863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditType setSpecificMax(int specificMax) {
265863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.specificMax = specificMax;
266863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return this;
267863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
268863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
269863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditType setCustomColumn(String customColumn) {
270863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.customColumn = customColumn;
271863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return this;
272863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
273863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
274863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        @Override
275863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean equals(Object object) {
276863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            if (object instanceof EditType) {
277863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                final EditType other = (EditType)object;
278863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton                return other.rawValue == rawValue;
279863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            }
280863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return false;
281863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
282863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
283863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        @Override
284863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int hashCode() {
285863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return rawValue;
286863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
287863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
288863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
289863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
290863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Description of a user-editable field on a {@link DataKind} row, such as
291863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link Phone#NUMBER}. Includes flags to apply to an {@link EditText}, and
292863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * the column where this field is stored.
293863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
294863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public static class EditField {
295863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public String column;
296863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int titleRes;
297863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int inputType;
298863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public int minLines;
299863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public boolean optional;
300863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
301863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditField(String column, int titleRes) {
302863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.column = column;
303863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.titleRes = titleRes;
304863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
305863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
306863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditField(String column, int titleRes, int inputType) {
307863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this(column, titleRes);
308863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.inputType = inputType;
309863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
310863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
311863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public EditField setOptional(boolean optional) {
312863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            this.optional = optional;
313863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton            return this;
314863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        }
315863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
316863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
317863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    /**
318863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * Generic method of inflating a given {@link Cursor} into a user-readable
319863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * {@link CharSequence}. For example, an inflater could combine the multiple
320863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * columns of {@link StructuredPostal} together using a string resource
321863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     * before presenting to the user.
322863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton     */
323863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    public interface StringInflater {
324863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public CharSequence inflateUsing(Context context, Cursor cursor);
325863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton        public CharSequence inflateUsing(Context context, ContentValues values);
326863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton    }
327863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton
328863e7a55dc45cd1210e4d07e5847f48dfe301876Jeff Hamilton}
329