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