12aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton/* 22aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Copyright (C) 2009 The Android Open Source Project 32aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 42aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Licensed under the Apache License, Version 2.0 (the "License"); 52aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * you may not use this file except in compliance with the License. 62aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * You may obtain a copy of the License at 72aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 82aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * http://www.apache.org/licenses/LICENSE-2.0 92aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * 102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Unless required by applicable law or agreed to in writing, software 112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * distributed under the License is distributed on an "AS IS" BASIS, 122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * See the License for the specific language governing permissions and 142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * limitations under the License. 152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonpackage com.android.loaderapp.model; 182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport com.google.android.collect.Lists; 202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport com.google.android.collect.Maps; 212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.accounts.Account; 232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.ContentValues; 242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.Context; 252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.content.pm.PackageManager; 262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.database.Cursor; 272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.graphics.drawable.Drawable; 282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.Contacts; 292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.Data; 302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.RawContacts; 312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.Phone; 322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.provider.ContactsContract.CommonDataKinds.StructuredPostal; 332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport android.widget.EditText; 342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.ArrayList; 362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.Collections; 372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.Comparator; 382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.HashMap; 392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonimport java.util.List; 402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton/** 422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Internal structure that represents constraints and styles for a specific data 432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * source, such as the various data types they support, including details on how 442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * those types should be rendered and edited. 452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * <p> 462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * In the future this may be inflated from XML defined by a data source. 472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamiltonpublic abstract class ContactsSource { 492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * The {@link RawContacts#ACCOUNT_TYPE} these constraints apply to. 512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String accountType = null; 532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Package that resources should be loaded from, either defined through an 562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link Account} or for matching against {@link Data#RES_PACKAGE}. 572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String resPackageName; 592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String summaryResPackageName; 602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int titleRes; 622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int iconRes; 632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean readOnly; 652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Set of {@link DataKind} supported by this source. 682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private ArrayList<DataKind> mKinds = Lists.newArrayList(); 702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Lookup map of {@link #mKinds} on {@link DataKind#mimeType}. 732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 742aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private HashMap<String, DataKind> mMimeKinds = Maps.newHashMap(); 752aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 762aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final int LEVEL_NONE = 0; 772aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final int LEVEL_SUMMARY = 1; 782aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final int LEVEL_MIMETYPES = 2; 792aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static final int LEVEL_CONSTRAINTS = 3; 802aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 812aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private int mInflatedLevel = LEVEL_NONE; 822aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 832aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public synchronized boolean isInflated(int inflateLevel) { 842aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return mInflatedLevel >= inflateLevel; 852aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 862aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 872aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** @hide exposed for unit tests */ 882aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public void setInflatedLevel(int inflateLevel) { 892aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton mInflatedLevel = inflateLevel; 902aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 912aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 922aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 932aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Ensure that this {@link ContactsSource} has been inflated to the 942aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * requested level. 952aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 962aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public synchronized void ensureInflated(Context context, int inflateLevel) { 972aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (!isInflated(inflateLevel)) { 982aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton inflate(context, inflateLevel); 992aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1002aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1012aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1022aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1032aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Perform the actual inflation to the requested level. Called by 1042aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link #ensureInflated(Context, int)} when inflation is needed. 1052aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1062aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton protected abstract void inflate(Context context, int inflateLevel); 1072aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1082aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1092aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Invalidate any cache for this {@link ContactsSource}, removing all 1102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * inflated data. Calling {@link #ensureInflated(Context, int)} will 1112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * populate again from scratch. 1122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public synchronized void invalidateCache() { 1142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.mKinds.clear(); 1152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.mMimeKinds.clear(); 1162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton setInflatedLevel(LEVEL_NONE); 1172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public CharSequence getDisplayLabel(Context context) { 1202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (this.titleRes != -1 && this.summaryResPackageName != null) { 1212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final PackageManager pm = context.getPackageManager(); 1222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return pm.getText(this.summaryResPackageName, this.titleRes, null); 1232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } else if (this.titleRes != -1) { 1242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return context.getText(this.titleRes); 1252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } else { 1262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return this.accountType; 1272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public Drawable getDisplayIcon(Context context) { 1312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (this.titleRes != -1 && this.summaryResPackageName != null) { 1322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final PackageManager pm = context.getPackageManager(); 1332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return pm.getDrawable(this.summaryResPackageName, this.iconRes, null); 1342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } else if (this.titleRes != -1) { 1352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return context.getResources().getDrawable(this.iconRes); 1362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } else { 1372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return null; 1382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton abstract public int getHeaderColor(Context context); 1422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton abstract public int getSideBarColor(Context context); 1442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link Comparator} to sort by {@link DataKind#weight}. 1472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton private static Comparator<DataKind> sWeightComparator = new Comparator<DataKind>() { 1492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int compare(DataKind object1, DataKind object2) { 1502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return object1.weight - object2.weight; 1512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton }; 1532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Return list of {@link DataKind} supported, sorted by 1562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link DataKind#weight}. 1572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public ArrayList<DataKind> getSortedDataKinds() { 1592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton // TODO: optimize by marking if already sorted 1602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton Collections.sort(mKinds, sWeightComparator); 1612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return mKinds; 1622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Find the {@link DataKind} for a specific MIME-type, if it's handled by 1662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * this data source. If you may need a fallback {@link DataKind}, use 1672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link Sources#getKindOrFallback(String, String, Context, int)}. 1682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public DataKind getKindForMimetype(String mimeType) { 1702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return this.mMimeKinds.get(mimeType); 1712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1742aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Add given {@link DataKind} to list of those provided by this source. 1752aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1762aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public DataKind addKind(DataKind kind) { 1772aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton kind.resPackageName = this.resPackageName; 1782aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.mKinds.add(kind); 1792aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.mMimeKinds.put(kind.mimeType, kind); 1802aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return kind; 1812aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 1822aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1832aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 1842aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Description of a specific data type, usually marked by a unique 1852aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link Data#MIMETYPE}. Includes details about how to view and edit 1862aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link Data} rows of this kind, including the possible {@link EditType} 1872aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * labels and editable {@link EditField}. 1882aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 1892aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static class DataKind { 1902aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String resPackageName; 1912aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String mimeType; 1922aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int titleRes; 1932aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int iconRes; 1942aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int iconAltRes; 1952aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int weight; 1962aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean secondary; 1972aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean editable; 1982aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 1992aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 2002aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * If this is true (default), the user can add and remove values. 2012aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * If false, the editor will always show a single field (which might be empty). 2022aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 2032aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean isList; 2042aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2052aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public StringInflater actionHeader; 2062aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public StringInflater actionAltHeader; 2072aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public StringInflater actionBody; 2082aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2092aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean actionBodySocial = false; 2102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String typeColumn; 2122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 2142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Maximum number of values allowed in the list. -1 represents infinity. 2152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * If {@link DataKind#isList} is false, this value is ignored. 2162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 2172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int typeOverallMax; 2182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public List<EditType> typeList; 2202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public List<EditField> fieldList; 2212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public ContentValues defaultValues; 2232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public DataKind() { 2252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public DataKind(String mimeType, int titleRes, int iconRes, int weight, boolean editable) { 2282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.mimeType = mimeType; 2292aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.titleRes = titleRes; 2302aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.iconRes = iconRes; 2312aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.weight = weight; 2322aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.editable = editable; 2332aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.isList = true; 2342aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.typeOverallMax = -1; 2352aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2362aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2372aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2382aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 2392aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Description of a specific "type" or "label" of a {@link DataKind} row, 2402aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * such as {@link Phone#TYPE_WORK}. Includes constraints on total number of 2412aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * rows a {@link Contacts} may have of this type, and details on how 2422aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * user-defined labels are stored. 2432aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 2442aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static class EditType { 2452aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int rawValue; 2462aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int labelRes; 2472aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton// public int actionRes; 2482aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton// public int actionAltRes; 2492aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean secondary; 2502aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int specificMax; 2512aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String customColumn; 2522aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2532aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditType(int rawValue, int labelRes) { 2542aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.rawValue = rawValue; 2552aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.labelRes = labelRes; 2562aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.specificMax = -1; 2572aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2582aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2592aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditType setSecondary(boolean secondary) { 2602aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.secondary = secondary; 2612aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return this; 2622aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2632aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2642aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditType setSpecificMax(int specificMax) { 2652aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.specificMax = specificMax; 2662aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return this; 2672aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2682aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2692aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditType setCustomColumn(String customColumn) { 2702aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.customColumn = customColumn; 2712aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return this; 2722aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2732aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2742aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 2752aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean equals(Object object) { 2762aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton if (object instanceof EditType) { 2772aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton final EditType other = (EditType)object; 2782aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return other.rawValue == rawValue; 2792aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2802aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return false; 2812aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2822aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2832aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton @Override 2842aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int hashCode() { 2852aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return rawValue; 2862aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2872aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 2882aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 2892aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 2902aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Description of a user-editable field on a {@link DataKind} row, such as 2912aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link Phone#NUMBER}. Includes flags to apply to an {@link EditText}, and 2922aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * the column where this field is stored. 2932aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 2942aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public static class EditField { 2952aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public String column; 2962aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int titleRes; 2972aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int inputType; 2982aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public int minLines; 2992aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public boolean optional; 3002aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 3012aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditField(String column, int titleRes) { 3022aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.column = column; 3032aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.titleRes = titleRes; 3042aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 3052aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 3062aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditField(String column, int titleRes, int inputType) { 3072aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this(column, titleRes); 3082aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.inputType = inputType; 3092aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 3102aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 3112aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public EditField setOptional(boolean optional) { 3122aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton this.optional = optional; 3132aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton return this; 3142aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 3152aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 3162aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 3172aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton /** 3182aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * Generic method of inflating a given {@link Cursor} into a user-readable 3192aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * {@link CharSequence}. For example, an inflater could combine the multiple 3202aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * columns of {@link StructuredPostal} together using a string resource 3212aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton * before presenting to the user. 3222aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton */ 3232aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public interface StringInflater { 3242aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public CharSequence inflateUsing(Context context, Cursor cursor); 3252aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton public CharSequence inflateUsing(Context context, ContentValues values); 3262aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton } 3272aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton 3282aee0983597c8b0e65766c4b278d4b1c7d13605fJeff Hamilton} 329