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