diff options
Diffstat (limited to 'core/java/android/provider/ContactsContract.java')
-rw-r--r-- | core/java/android/provider/ContactsContract.java | 2722 |
1 files changed, 2722 insertions, 0 deletions
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java new file mode 100644 index 0000000..7904401 --- /dev/null +++ b/core/java/android/provider/ContactsContract.java @@ -0,0 +1,2722 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.provider; + +import android.accounts.Account; +import android.content.ContentProviderClient; +import android.content.ContentProviderOperation; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.Rect; +import android.net.Uri; +import android.os.RemoteException; +import android.text.TextUtils; +import android.util.Pair; +import android.view.View; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * The contract between the contacts provider and applications. Contains definitions + * for the supported URIs and columns. These APIs supersede {@link Contacts}. + */ +@SuppressWarnings("unused") +public final class ContactsContract { + /** The authority for the contacts provider */ + public static final String AUTHORITY = "com.android.contacts"; + /** A content:// style uri to the authority for the contacts provider */ + public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY); + + /** + * An optional insert, update or delete URI parameter that allows the caller + * to specify that it is a sync adapter. The default value is false. If true + * the dirty flag is not automatically set and the "syncToNetwork" parameter + * is set to false when calling + * {@link ContentResolver#notifyChange(android.net.Uri, android.database.ContentObserver, boolean)}. + */ + public static final String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter"; + + /** + * A query parameter key used to specify the package that is requesting a query. + * This is used for restricting data based on package name. + * + * @hide + */ + public static final String REQUESTING_PACKAGE_PARAM_KEY = "requesting_package"; + + /** + * @hide should be removed when users are updated to refer to SyncState + * @deprecated use SyncState instead + */ + @Deprecated + public interface SyncStateColumns extends SyncStateContract.Columns { + } + + /** + * A table provided for sync adapters to use for storing private sync state data. + * + * @see SyncStateContract + */ + public static final class SyncState implements SyncStateContract.Columns { + /** + * This utility class cannot be instantiated + */ + private SyncState() {} + + public static final String CONTENT_DIRECTORY = + SyncStateContract.Constants.CONTENT_DIRECTORY; + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = + Uri.withAppendedPath(AUTHORITY_URI, CONTENT_DIRECTORY); + + /** + * @see android.provider.SyncStateContract.Helpers#get + */ + public static byte[] get(ContentProviderClient provider, Account account) + throws RemoteException { + return SyncStateContract.Helpers.get(provider, CONTENT_URI, account); + } + + /** + * @see android.provider.SyncStateContract.Helpers#get + */ + public static Pair<Uri, byte[]> getWithUri(ContentProviderClient provider, Account account) + throws RemoteException { + return SyncStateContract.Helpers.getWithUri(provider, CONTENT_URI, account); + } + + /** + * @see android.provider.SyncStateContract.Helpers#set + */ + public static void set(ContentProviderClient provider, Account account, byte[] data) + throws RemoteException { + SyncStateContract.Helpers.set(provider, CONTENT_URI, account, data); + } + + /** + * @see android.provider.SyncStateContract.Helpers#newSetOperation + */ + public static ContentProviderOperation newSetOperation(Account account, byte[] data) { + return SyncStateContract.Helpers.newSetOperation(CONTENT_URI, account, data); + } + } + + /** + * Generic columns for use by sync adapters. The specific functions of + * these columns are private to the sync adapter. Other clients of the API + * should not attempt to either read or write this column. + */ + protected interface BaseSyncColumns { + + /** Generic column for use by sync adapters. */ + public static final String SYNC1 = "sync1"; + /** Generic column for use by sync adapters. */ + public static final String SYNC2 = "sync2"; + /** Generic column for use by sync adapters. */ + public static final String SYNC3 = "sync3"; + /** Generic column for use by sync adapters. */ + public static final String SYNC4 = "sync4"; + } + + /** + * Columns that appear when each row of a table belongs to a specific + * account, including sync information that an account may need. + */ + protected interface SyncColumns extends BaseSyncColumns { + /** + * The name of the account instance to which this row belongs, which when paired with + * {@link #ACCOUNT_TYPE} identifies a specific account. + * <P>Type: TEXT</P> + */ + public static final String ACCOUNT_NAME = "account_name"; + + /** + * The type of account to which this row belongs, which when paired with + * {@link #ACCOUNT_NAME} identifies a specific account. + * <P>Type: TEXT</P> + */ + public static final String ACCOUNT_TYPE = "account_type"; + + /** + * String that uniquely identifies this row to its source account. + * <P>Type: TEXT</P> + */ + public static final String SOURCE_ID = "sourceid"; + + /** + * Version number that is updated whenever this row or its related data + * changes. + * <P>Type: INTEGER</P> + */ + public static final String VERSION = "version"; + + /** + * Flag indicating that {@link #VERSION} has changed, and this row needs + * to be synchronized by its owning account. + * <P>Type: INTEGER (boolean)</P> + */ + public static final String DIRTY = "dirty"; + } + + protected interface ContactOptionsColumns { + /** + * The number of times a contact has been contacted + * <P>Type: INTEGER</P> + */ + public static final String TIMES_CONTACTED = "times_contacted"; + + /** + * The last time a contact was contacted. + * <P>Type: INTEGER</P> + */ + public static final String LAST_TIME_CONTACTED = "last_time_contacted"; + + /** + * Is the contact starred? + * <P>Type: INTEGER (boolean)</P> + */ + public static final String STARRED = "starred"; + + /** + * A custom ringtone associated with a contact. Not always present. + * <P>Type: TEXT (URI to the ringtone)</P> + */ + public static final String CUSTOM_RINGTONE = "custom_ringtone"; + + /** + * Whether the contact should always be sent to voicemail. Not always + * present. + * <P>Type: INTEGER (0 for false, 1 for true)</P> + */ + public static final String SEND_TO_VOICEMAIL = "send_to_voicemail"; + } + + protected interface ContactsColumns { + /** + * The display name for the contact. + * <P>Type: TEXT</P> + */ + public static final String DISPLAY_NAME = "display_name"; + + /** + * Reference to the row in the data table holding the photo. + * <P>Type: INTEGER REFERENCES data(_id)</P> + */ + public static final String PHOTO_ID = "photo_id"; + + /** + * Lookup value that reflects the {@link Groups#GROUP_VISIBLE} state of + * any {@link CommonDataKinds.GroupMembership} for this contact. + */ + public static final String IN_VISIBLE_GROUP = "in_visible_group"; + + /** + * An indicator of whether this contact has at least one phone number. "1" if there is + * at least one phone number, "0" otherwise. + * <P>Type: INTEGER</P> + */ + public static final String HAS_PHONE_NUMBER = "has_phone_number"; + + /** + * An opaque value that contains hints on how to find the contact if + * its row id changed as a result of a sync or aggregation. + */ + public static final String LOOKUP_KEY = "lookup"; + } + + protected interface ContactStatusColumns { + /** + * Contact presence status. See {@link StatusUpdates} for individual status + * definitions. + * <p>Type: NUMBER</p> + */ + public static final String CONTACT_PRESENCE = "contact_presence"; + + /** + * Contact's latest status update. + * <p>Type: TEXT</p> + */ + public static final String CONTACT_STATUS = "contact_status"; + + /** + * The absolute time in milliseconds when the latest status was + * inserted/updated. + * <p>Type: NUMBER</p> + */ + public static final String CONTACT_STATUS_TIMESTAMP = "contact_status_ts"; + + /** + * The package containing resources for this status: label and icon. + * <p>Type: NUMBER</p> + */ + public static final String CONTACT_STATUS_RES_PACKAGE = "contact_status_res_package"; + + /** + * The resource ID of the label describing the source of contact + * status, e.g. "Google Talk". This resource is scoped by the + * {@link #CONTACT_STATUS_RES_PACKAGE}. + * <p>Type: NUMBER</p> + */ + public static final String CONTACT_STATUS_LABEL = "contact_status_label"; + + /** + * The resource ID of the icon for the source of contact status. This + * resource is scoped by the {@link #CONTACT_STATUS_RES_PACKAGE}. + * <p>Type: NUMBER</p> + */ + public static final String CONTACT_STATUS_ICON = "contact_status_icon"; + } + + /** + * Constants for the contacts table, which contains a record per group + * of raw contacts representing the same person. + */ + public static class Contacts implements BaseColumns, ContactsColumns, + ContactOptionsColumns, ContactStatusColumns { + /** + * This utility class cannot be instantiated + */ + private Contacts() {} + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "contacts"); + + /** + * A content:// style URI for this table that should be used to create + * shortcuts or otherwise create long-term links to contacts. This URI + * should always be followed by a "/" and the contact's {@link #LOOKUP_KEY}. + * It can optionally also have a "/" and last known contact ID appended after + * that. This "complete" format is an important optimization and is highly recommended. + * <p> + * As long as the contact's row ID remains the same, this URI is + * equivalent to {@link #CONTENT_URI}. If the contact's row ID changes + * as a result of a sync or aggregation, this URI will look up the + * contact using indirect information (sync IDs or constituent raw + * contacts). + * <p> + * Lookup key should be appended unencoded - it is stored in the encoded + * form, ready for use in a URI. + */ + public static final Uri CONTENT_LOOKUP_URI = Uri.withAppendedPath(CONTENT_URI, + "lookup"); + + /** + * Base {@link Uri} for referencing a single {@link Contacts} entry, + * created by appending {@link #LOOKUP_KEY} using + * {@link Uri#withAppendedPath(Uri, String)}. Provides + * {@link OpenableColumns} columns when queried, or returns the + * referenced contact formatted as a vCard when opened through + * {@link ContentResolver#openAssetFileDescriptor(Uri, String)}. + */ + public static final Uri CONTENT_VCARD_URI = Uri.withAppendedPath(CONTENT_URI, + "as_vcard"); + + /** + * Builds a {@link #CONTENT_LOOKUP_URI} style {@link Uri} describing the + * requested {@link Contacts} entry. + * + * @param contactUri A {@link #CONTENT_URI} row, or an existing + * {@link #CONTENT_LOOKUP_URI} to attempt refreshing. + */ + public static Uri getLookupUri(ContentResolver resolver, Uri contactUri) { + final Cursor c = resolver.query(contactUri, new String[] { + Contacts.LOOKUP_KEY, Contacts._ID + }, null, null, null); + if (c == null) { + return null; + } + + try { + if (c.moveToFirst()) { + final String lookupKey = c.getString(0); + final long contactId = c.getLong(1); + return getLookupUri(contactId, lookupKey); + } + } finally { + c.close(); + } + return null; + } + + /** + * Build a {@link #CONTENT_LOOKUP_URI} lookup {@link Uri} using the + * given {@link android.provider.ContactsContract.Contacts#_ID} and {@link #LOOKUP_KEY}. + */ + public static Uri getLookupUri(long contactId, String lookupKey) { + return ContentUris.withAppendedId(Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, + lookupKey), contactId); + } + + /** + * Computes a content URI (see {@link #CONTENT_URI}) given a lookup URI. + * <p> + * Returns null if the contact cannot be found. + */ + public static Uri lookupContact(ContentResolver resolver, Uri lookupUri) { + if (lookupUri == null) { + return null; + } + + Cursor c = resolver.query(lookupUri, new String[]{Contacts._ID}, null, null, null); + if (c == null) { + return null; + } + + try { + if (c.moveToFirst()) { + long contactId = c.getLong(0); + return ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); + } + } finally { + c.close(); + } + return null; + } + + /** + * Mark a contact as having been contacted. + * + * @param resolver the ContentResolver to use + * @param contactId the person who was contacted + */ + public static void markAsContacted(ContentResolver resolver, long contactId) { + Uri uri = ContentUris.withAppendedId(CONTENT_URI, contactId); + ContentValues values = new ContentValues(); + // TIMES_CONTACTED will be incremented when LAST_TIME_CONTACTED is modified. + values.put(LAST_TIME_CONTACTED, System.currentTimeMillis()); + resolver.update(uri, values, null, null); + } + + /** + * The content:// style URI used for "type-to-filter" functionality on the + * {@link #CONTENT_URI} URI. The filter string will be used to match + * various parts of the contact name. The filter argument should be passed + * as an additional path segment after this URI. + */ + public static final Uri CONTENT_FILTER_URI = Uri.withAppendedPath( + CONTENT_URI, "filter"); + + /** + * The content:// style URI for this table joined with useful data from + * {@link Data}, filtered to include only starred contacts + * and the most frequently contacted contacts. + */ + public static final Uri CONTENT_STREQUENT_URI = Uri.withAppendedPath( + CONTENT_URI, "strequent"); + + /** + * The content:// style URI used for "type-to-filter" functionality on the + * {@link #CONTENT_STREQUENT_URI} URI. The filter string will be used to match + * various parts of the contact name. The filter argument should be passed + * as an additional path segment after this URI. + */ + public static final Uri CONTENT_STREQUENT_FILTER_URI = Uri.withAppendedPath( + CONTENT_STREQUENT_URI, "filter"); + + public static final Uri CONTENT_GROUP_URI = Uri.withAppendedPath( + CONTENT_URI, "group"); + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of + * people. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/contact"; + + /** + * The MIME type of a {@link #CONTENT_URI} subdirectory of a single + * person. + */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact"; + + /** + * The MIME type of a {@link #CONTENT_URI} subdirectory of a single + * person. + */ + public static final String CONTENT_VCARD_TYPE = "text/x-vcard"; + + /** + * A sub-directory of a single contact that contains all of the constituent raw contact + * {@link Data} rows. + */ + public static final class Data implements BaseColumns, DataColumns { + /** + * no public constructor since this is a utility class + */ + private Data() {} + + /** + * The directory twig for this sub-table + */ + public static final String CONTENT_DIRECTORY = "data"; + } + + /** + * A sub-directory of a single contact aggregate that contains all aggregation suggestions + * (other contacts). The aggregation suggestions are computed based on approximate + * data matches with this contact. + */ + public static final class AggregationSuggestions implements BaseColumns, ContactsColumns { + /** + * No public constructor since this is a utility class + */ + private AggregationSuggestions() {} + + /** + * The directory twig for this sub-table. The URI can be followed by an optional + * type-to-filter, similar to + * {@link android.provider.ContactsContract.Contacts#CONTENT_FILTER_URI}. + */ + public static final String CONTENT_DIRECTORY = "suggestions"; + } + + /** + * A sub-directory of a single contact that contains the contact's primary photo. + */ + public static final class Photo implements BaseColumns, DataColumns { + /** + * no public constructor since this is a utility class + */ + private Photo() {} + + /** + * The directory twig for this sub-table + */ + public static final String CONTENT_DIRECTORY = "photo"; + } + + /** + * Opens an InputStream for the contacts's default photo and returns the + * photo as a byte stream. If there is not photo null will be returned. + * + * @param contactUri the contact whose photo should be used + * @return an InputStream of the photo, or null if no photo is present + */ + public static InputStream openContactPhotoInputStream(ContentResolver cr, Uri contactUri) { + Uri photoUri = Uri.withAppendedPath(contactUri, Photo.CONTENT_DIRECTORY); + if (photoUri == null) { + return null; + } + Cursor cursor = cr.query(photoUri, + new String[]{ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null); + try { + if (cursor == null || !cursor.moveToNext()) { + return null; + } + byte[] data = cursor.getBlob(0); + if (data == null) { + return null; + } + return new ByteArrayInputStream(data); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } + } + + protected interface RawContactsColumns { + /** + * A reference to the {@link android.provider.ContactsContract.Contacts#_ID} that this + * data belongs to. + * <P>Type: INTEGER</P> + */ + public static final String CONTACT_ID = "contact_id"; + + /** + * Flag indicating that this {@link RawContacts} entry and its children have + * been restricted to specific platform apps. + * <P>Type: INTEGER (boolean)</P> + * + * @hide until finalized in future platform release + */ + public static final String IS_RESTRICTED = "is_restricted"; + + /** + * The aggregation mode for this contact. + * <P>Type: INTEGER</P> + */ + public static final String AGGREGATION_MODE = "aggregation_mode"; + + /** + * The "deleted" flag: "0" by default, "1" if the row has been marked + * for deletion. When {@link android.content.ContentResolver#delete} is + * called on a raw contact, it is marked for deletion and removed from its + * aggregate contact. The sync adaptor deletes the raw contact on the server and + * then calls ContactResolver.delete once more, this time passing the + * {@link ContactsContract#CALLER_IS_SYNCADAPTER} query parameter to finalize + * the data removal. + * <P>Type: INTEGER</P> + */ + public static final String DELETED = "deleted"; + } + + /** + * Constants for the raw contacts table, which contains the base contact + * information per sync source. Sync adapters and contact management apps + * are the primary consumers of this API. + */ + public static final class RawContacts implements BaseColumns, RawContactsColumns, + ContactOptionsColumns, SyncColumns { + /** + * This utility class cannot be instantiated + */ + private RawContacts() { + } + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "raw_contacts"); + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of + * people. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact"; + + /** + * The MIME type of a {@link #CONTENT_URI} subdirectory of a single + * person. + */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/raw_contact"; + + /** + * Aggregation mode: aggregate asynchronously. + */ + public static final int AGGREGATION_MODE_DEFAULT = 0; + + /** + * Aggregation mode: aggregate at the time the raw contact is inserted/updated. + */ + public static final int AGGREGATION_MODE_IMMEDIATE = 1; + + /** + * If {@link #AGGREGATION_MODE} is {@link #AGGREGATION_MODE_SUSPENDED}, changes + * to the raw contact do not cause its aggregation to be revisited. Note that changing + * {@link #AGGREGATION_MODE} from {@link #AGGREGATION_MODE_SUSPENDED} to + * {@link #AGGREGATION_MODE_DEFAULT} does not trigger an aggregation pass. Any subsequent + * change to the raw contact's data will. + */ + public static final int AGGREGATION_MODE_SUSPENDED = 2; + + /** + * Aggregation mode: never aggregate this raw contact (note that the raw contact will not + * have a corresponding Aggregate and therefore will not be included in Aggregates + * query results.) + */ + public static final int AGGREGATION_MODE_DISABLED = 3; + + /** + * Build a {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} + * style {@link Uri} for the parent {@link android.provider.ContactsContract.Contacts} + * entry of the given {@link RawContacts} entry. + */ + public static Uri getContactLookupUri(ContentResolver resolver, Uri rawContactUri) { + // TODO: use a lighter query by joining rawcontacts with contacts in provider + final Uri dataUri = Uri.withAppendedPath(rawContactUri, Data.CONTENT_DIRECTORY); + final Cursor cursor = resolver.query(dataUri, new String[] { + RawContacts.CONTACT_ID, Contacts.LOOKUP_KEY + }, null, null, null); + + Uri lookupUri = null; + try { + if (cursor != null && cursor.moveToFirst()) { + final long contactId = cursor.getLong(0); + final String lookupKey = cursor.getString(1); + return Contacts.getLookupUri(contactId, lookupKey); + } + } finally { + if (cursor != null) cursor.close(); + } + return lookupUri; + } + + /** + * A sub-directory of a single raw contact that contains all of their {@link Data} rows. + * To access this directory append {@link Data#CONTENT_DIRECTORY} to the contact URI. + */ + public static final class Data implements BaseColumns, DataColumns { + /** + * no public constructor since this is a utility class + */ + private Data() { + } + + /** + * The directory twig for this sub-table + */ + public static final String CONTENT_DIRECTORY = "data"; + } + + /** + * A sub-directory of a single raw contact that contains all of their {@link Data} rows. + * To access this directory append {@link Entity#CONTENT_DIRECTORY} to the contact URI. + */ + public static final class Entity implements BaseColumns, DataColumns { + /** + * no public constructor since this is a utility class + */ + private Entity() { + } + + /** + * The directory twig for this sub-table + */ + public static final String CONTENT_DIRECTORY = "entity"; + + /** + * The ID of the data column. The value will be null if this raw contact has no + * data rows. + * <P>Type: INTEGER</P> + */ + public static final String DATA_ID = "data_id"; + } + } + + protected interface StatusColumns extends Im.CommonPresenceColumns { + /** + * Contact's latest presence level. + * <P>Type: INTEGER (one of the values below)</P> + */ + public static final String PRESENCE = PRESENCE_STATUS; + + /** + * Contact latest status update. + * <p>Type: TEXT</p> + */ + public static final String STATUS = PRESENCE_CUSTOM_STATUS; + + /** + * The absolute time in milliseconds when the latest status was inserted/updated. + * <p>Type: NUMBER</p> + */ + public static final String STATUS_TIMESTAMP = "status_ts"; + + /** + * The package containing resources for this status: label and icon. + * <p>Type: NUMBER</p> + */ + public static final String STATUS_RES_PACKAGE = "status_res_package"; + + /** + * The resource ID of the label describing the source of the status update, e.g. "Google + * Talk". This resource should be scoped by the {@link #STATUS_RES_PACKAGE}. + * <p>Type: NUMBER</p> + */ + public static final String STATUS_LABEL = "status_label"; + + /** + * The resource ID of the icon for the source of the status update. + * This resource should be scoped by the {@link #STATUS_RES_PACKAGE}. + * <p>Type: NUMBER</p> + */ + public static final String STATUS_ICON = "status_icon"; + } + + protected interface DataColumns { + /** + * The package name to use when creating {@link Resources} objects for + * this data row. This value is only designed for use when building user + * interfaces, and should not be used to infer the owner. + * + * @hide + */ + public static final String RES_PACKAGE = "res_package"; + + /** + * The MIME type of the item represented by this row. + */ + public static final String MIMETYPE = "mimetype"; + + /** + * A reference to the {@link RawContacts#_ID} + * that this data belongs to. + */ + public static final String RAW_CONTACT_ID = "raw_contact_id"; + + /** + * Whether this is the primary entry of its kind for the raw contact it belongs to + * <P>Type: INTEGER (if set, non-0 means true)</P> + */ + public static final String IS_PRIMARY = "is_primary"; + + /** + * Whether this is the primary entry of its kind for the aggregate + * contact it belongs to. Any data record that is "super primary" must + * also be "primary". + * <P>Type: INTEGER (if set, non-0 means true)</P> + */ + public static final String IS_SUPER_PRIMARY = "is_super_primary"; + + /** + * The version of this data record. This is a read-only value. The data column is + * guaranteed to not change without the version going up. This value is monotonically + * increasing. + * <P>Type: INTEGER</P> + */ + public static final String DATA_VERSION = "data_version"; + + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA1 = "data1"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA2 = "data2"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA3 = "data3"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA4 = "data4"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA5 = "data5"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA6 = "data6"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA7 = "data7"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA8 = "data8"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA9 = "data9"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA10 = "data10"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA11 = "data11"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA12 = "data12"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA13 = "data13"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA14 = "data14"; + /** Generic data column, the meaning is {@link #MIMETYPE} specific */ + public static final String DATA15 = "data15"; + + /** Generic column for use by sync adapters. */ + public static final String SYNC1 = "data_sync1"; + /** Generic column for use by sync adapters. */ + public static final String SYNC2 = "data_sync2"; + /** Generic column for use by sync adapters. */ + public static final String SYNC3 = "data_sync3"; + /** Generic column for use by sync adapters. */ + public static final String SYNC4 = "data_sync4"; + } + + /** + * Combines all columns returned by {@link Data} table queries. + */ + protected interface DataColumnsWithJoins extends BaseColumns, DataColumns, StatusColumns, + RawContactsColumns, ContactsColumns, ContactOptionsColumns, ContactStatusColumns { + + } + + /** + * Constants for the data table, which contains data points tied to a raw contact. + * For example, a phone number or email address. Each row in this table contains a type + * definition and some generic columns. Each data type can define the meaning for each of + * the generic columns. + */ + public final static class Data implements DataColumnsWithJoins { + /** + * This utility class cannot be instantiated + */ + private Data() {} + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "data"); + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of data. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/data"; + + /** + * If {@link #FOR_EXPORT_ONLY} is explicitly set to "1", returned Cursor toward + * Data.CONTENT_URI contains only exportable data. + * + * This flag is useful (currently) only for vCard exporter in Contacts app, which + * needs to exclude "un-exportable" data from available data to export, while + * Contacts app itself has priviledge to access all data including "un-expotable" + * ones and providers return all of them regardless of the callers' intention. + * <P>Type: INTEGER</p> + * + * @hide Maybe available only in Eclair and not really ready for public use. + * TODO: remove, or implement this feature completely. As of now (Eclair), + * we only use this flag in queryEntities(), not query(). + */ + public static final String FOR_EXPORT_ONLY = "for_export_only"; + + /** + * Build a {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} + * style {@link Uri} for the parent {@link android.provider.ContactsContract.Contacts} + * entry of the given {@link Data} entry. + */ + public static Uri getContactLookupUri(ContentResolver resolver, Uri dataUri) { + final Cursor cursor = resolver.query(dataUri, new String[] { + RawContacts.CONTACT_ID, Contacts.LOOKUP_KEY + }, null, null, null); + + Uri lookupUri = null; + try { + if (cursor != null && cursor.moveToFirst()) { + final long contactId = cursor.getLong(0); + final String lookupKey = cursor.getString(1); + return Contacts.getLookupUri(contactId, lookupKey); + } + } finally { + if (cursor != null) cursor.close(); + } + return lookupUri; + } + } + + /** + * Constants for the raw contacts entities table, which can be though of as an outer join + * of the raw_contacts table with the data table. + */ + public final static class RawContactsEntity + implements BaseColumns, DataColumns, RawContactsColumns { + /** + * This utility class cannot be instantiated + */ + private RawContactsEntity() {} + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = + Uri.withAppendedPath(AUTHORITY_URI, "raw_contact_entities"); + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of raw contact entities. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact_entity"; + + /** + * If {@link #FOR_EXPORT_ONLY} is explicitly set to "1", returned Cursor toward + * Data.CONTENT_URI contains only exportable data. + * + * This flag is useful (currently) only for vCard exporter in Contacts app, which + * needs to exclude "un-exportable" data from available data to export, while + * Contacts app itself has priviledge to access all data including "un-expotable" + * ones and providers return all of them regardless of the callers' intention. + * <P>Type: INTEGER</p> + * + * @hide Maybe available only in Eclair and not really ready for public use. + * TODO: remove, or implement this feature completely. As of now (Eclair), + * we only use this flag in queryEntities(), not query(). + */ + public static final String FOR_EXPORT_ONLY = "for_export_only"; + + /** + * The ID of the data column. The value will be null if this raw contact has no data rows. + * <P>Type: INTEGER</P> + */ + public static final String DATA_ID = "data_id"; + } + + protected interface PhoneLookupColumns { + /** + * The phone number as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String NUMBER = "number"; + + /** + * The type of phone number, for example Home or Work. + * <P>Type: INTEGER</P> + */ + public static final String TYPE = "type"; + + /** + * The user defined label for the phone number. + * <P>Type: TEXT</P> + */ + public static final String LABEL = "label"; + } + + /** + * A table that represents the result of looking up a phone number, for + * example for caller ID. To perform a lookup you must append the number you + * want to find to {@link #CONTENT_FILTER_URI}. + */ + public static final class PhoneLookup implements BaseColumns, PhoneLookupColumns, + ContactsColumns, ContactOptionsColumns { + /** + * This utility class cannot be instantiated + */ + private PhoneLookup() {} + + /** + * The content:// style URI for this table. Append the phone number you want to lookup + * to this URI and query it to perform a lookup. For example: + * + * {@code + * Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_URI, phoneNumber); + * } + */ + public static final Uri CONTENT_FILTER_URI = Uri.withAppendedPath(AUTHORITY_URI, + "phone_lookup"); + } + + /** + * Additional data mixed in with {@link StatusColumns} to link + * back to specific {@link ContactsContract.Data#_ID} entries. + */ + protected interface PresenceColumns { + + /** + * Reference to the {@link Data#_ID} entry that owns this presence. + * <P>Type: INTEGER</P> + */ + public static final String DATA_ID = "presence_data_id"; + + /** + * <p>Type: NUMBER</p> + */ + public static final String PROTOCOL = "protocol"; + + /** + * Name of the custom protocol. Should be supplied along with the {@link #PROTOCOL} value + * {@link ContactsContract.CommonDataKinds.Im#PROTOCOL_CUSTOM}. Should be null or + * omitted if {@link #PROTOCOL} value is not + * {@link ContactsContract.CommonDataKinds.Im#PROTOCOL_CUSTOM}. + * + * <p>Type: NUMBER</p> + */ + public static final String CUSTOM_PROTOCOL = "custom_protocol"; + + /** + * The IM handle the presence item is for. The handle is scoped to + * {@link #PROTOCOL}. + * <P>Type: TEXT</P> + */ + public static final String IM_HANDLE = "im_handle"; + + /** + * The IM account for the local user that the presence data came from. + * <P>Type: TEXT</P> + */ + public static final String IM_ACCOUNT = "im_account"; + } + + /** + * A status update is linked to a {@link Data} row and captures the user's latest status + * update via the corresponding source, e.g. "Having lunch" via "Google Talk". + */ + // TODO make final as soon as Presence is removed + public static /*final*/ class StatusUpdates implements StatusColumns, PresenceColumns { + + /** + * This utility class cannot be instantiated + */ + private StatusUpdates() {} + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "status_updates"); + + /** + * Gets the resource ID for the proper presence icon. + * + * @param status the status to get the icon for + * @return the resource ID for the proper presence icon + */ + public static final int getPresenceIconResourceId(int status) { + switch (status) { + case AVAILABLE: + return android.R.drawable.presence_online; + case IDLE: + case AWAY: + return android.R.drawable.presence_away; + case DO_NOT_DISTURB: + return android.R.drawable.presence_busy; + case INVISIBLE: + return android.R.drawable.presence_invisible; + case OFFLINE: + default: + return android.R.drawable.presence_offline; + } + } + + /** + * Returns the precedence of the status code the higher number being the higher precedence. + * + * @param status The status code. + * @return An integer representing the precedence, 0 being the lowest. + */ + public static final int getPresencePrecedence(int status) { + // Keep this function here incase we want to enforce a different precedence than the + // natural order of the status constants. + return status; + } + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of + * status update details. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/status-update"; + + /** + * The MIME type of a {@link #CONTENT_URI} subdirectory of a single + * status update detail. + */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/status-update"; + } + + @Deprecated + public static final class Presence extends StatusUpdates { + + } + + /** + * Container for definitions of common data types stored in the {@link Data} table. + */ + public static final class CommonDataKinds { + /** + * This utility class cannot be instantiated + */ + private CommonDataKinds() {} + + /** + * The {@link Data#RES_PACKAGE} value for common data that should be + * shown using a default style. + * + * @hide RES_PACKAGE is hidden + */ + public static final String PACKAGE_COMMON = "common"; + + /** + * The base types that all "Typed" data kinds support. + */ + public interface BaseTypes { + /** + * A custom type. The custom label should be supplied by user. + */ + public static int TYPE_CUSTOM = 0; + } + + /** + * Columns common across the specific types. + */ + protected interface CommonColumns extends BaseTypes { + /** + * The data for the contact method. + * <P>Type: TEXT</P> + */ + public static final String DATA = DataColumns.DATA1; + + /** + * The type of data, for example Home or Work. + * <P>Type: INTEGER</P> + */ + public static final String TYPE = DataColumns.DATA2; + + /** + * The user defined label for the the contact method. + * <P>Type: TEXT</P> + */ + public static final String LABEL = DataColumns.DATA3; + } + + /** + * Parts of the name. + */ + public static final class StructuredName implements DataColumnsWithJoins { + /** + * This utility class cannot be instantiated + */ + private StructuredName() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/name"; + + /** + * The name that should be used to display the contact. + * <i>Unstructured component of the name should be consistent with + * its structured representation.</i> + * <p> + * Type: TEXT + */ + public static final String DISPLAY_NAME = DATA1; + + /** + * The given name for the contact. + * <P>Type: TEXT</P> + */ + public static final String GIVEN_NAME = DATA2; + + /** + * The family name for the contact. + * <P>Type: TEXT</P> + */ + public static final String FAMILY_NAME = DATA3; + + /** + * The contact's honorific prefix, e.g. "Sir" + * <P>Type: TEXT</P> + */ + public static final String PREFIX = DATA4; + + /** + * The contact's middle name + * <P>Type: TEXT</P> + */ + public static final String MIDDLE_NAME = DATA5; + + /** + * The contact's honorific suffix, e.g. "Jr" + */ + public static final String SUFFIX = DATA6; + + /** + * The phonetic version of the given name for the contact. + * <P>Type: TEXT</P> + */ + public static final String PHONETIC_GIVEN_NAME = DATA7; + + /** + * The phonetic version of the additional name for the contact. + * <P>Type: TEXT</P> + */ + public static final String PHONETIC_MIDDLE_NAME = DATA8; + + /** + * The phonetic version of the family name for the contact. + * <P>Type: TEXT</P> + */ + public static final String PHONETIC_FAMILY_NAME = DATA9; + } + + /** + * A nickname. + */ + public static final class Nickname implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Nickname() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/nickname"; + + public static final int TYPE_DEFAULT = 1; + public static final int TYPE_OTHER_NAME = 2; + public static final int TYPE_MAINDEN_NAME = 3; + public static final int TYPE_SHORT_NAME = 4; + public static final int TYPE_INITIALS = 5; + + /** + * The name itself + */ + public static final String NAME = DATA; + } + + /** + * Common data definition for telephone numbers. + */ + public static final class Phone implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Phone() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone_v2"; + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of + * phones. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/phone_v2"; + + /** + * The content:// style URI for all data records of the + * {@link #CONTENT_ITEM_TYPE} MIME type, combined with the + * associated raw contact and aggregate contact data. + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(Data.CONTENT_URI, + "phones"); + + /** + * The content:// style URL for phone lookup using a filter. The filter returns + * records of MIME type {@link #CONTENT_ITEM_TYPE}. The filter is applied + * to display names as well as phone numbers. The filter argument should be passed + * as an additional path segment after this URI. + */ + public static final Uri CONTENT_FILTER_URI = Uri.withAppendedPath(CONTENT_URI, + "filter"); + + public static final int TYPE_HOME = 1; + public static final int TYPE_MOBILE = 2; + public static final int TYPE_WORK = 3; + public static final int TYPE_FAX_WORK = 4; + public static final int TYPE_FAX_HOME = 5; + public static final int TYPE_PAGER = 6; + public static final int TYPE_OTHER = 7; + public static final int TYPE_CALLBACK = 8; + public static final int TYPE_CAR = 9; + public static final int TYPE_COMPANY_MAIN = 10; + public static final int TYPE_ISDN = 11; + public static final int TYPE_MAIN = 12; + public static final int TYPE_OTHER_FAX = 13; + public static final int TYPE_RADIO = 14; + public static final int TYPE_TELEX = 15; + public static final int TYPE_TTY_TDD = 16; + public static final int TYPE_WORK_MOBILE = 17; + public static final int TYPE_WORK_PAGER = 18; + public static final int TYPE_ASSISTANT = 19; + public static final int TYPE_MMS = 20; + + /** + * The phone number as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String NUMBER = DATA; + + /** + * @deprecated use {@link #getTypeLabel(Resources, int, CharSequence)} instead. + * @hide + */ + @Deprecated + public static final CharSequence getDisplayLabel(Context context, int type, + CharSequence label, CharSequence[] labelArray) { + return getTypeLabel(context.getResources(), type, label); + } + + /** + * @deprecated use {@link #getTypeLabel(Resources, int, CharSequence)} instead. + * @hide + */ + @Deprecated + public static final CharSequence getDisplayLabel(Context context, int type, + CharSequence label) { + return getTypeLabel(context.getResources(), type, label); + } + + /** + * Return the string resource that best describes the given + * {@link #TYPE}. Will always return a valid resource. + */ + public static final int getTypeLabelResource(int type) { + switch (type) { + case TYPE_HOME: return com.android.internal.R.string.phoneTypeHome; + case TYPE_MOBILE: return com.android.internal.R.string.phoneTypeMobile; + case TYPE_WORK: return com.android.internal.R.string.phoneTypeWork; + case TYPE_FAX_WORK: return com.android.internal.R.string.phoneTypeFaxWork; + case TYPE_FAX_HOME: return com.android.internal.R.string.phoneTypeFaxHome; + case TYPE_PAGER: return com.android.internal.R.string.phoneTypePager; + case TYPE_OTHER: return com.android.internal.R.string.phoneTypeOther; + case TYPE_CALLBACK: return com.android.internal.R.string.phoneTypeCallback; + case TYPE_CAR: return com.android.internal.R.string.phoneTypeCar; + case TYPE_COMPANY_MAIN: return com.android.internal.R.string.phoneTypeCompanyMain; + case TYPE_ISDN: return com.android.internal.R.string.phoneTypeIsdn; + case TYPE_MAIN: return com.android.internal.R.string.phoneTypeMain; + case TYPE_OTHER_FAX: return com.android.internal.R.string.phoneTypeOtherFax; + case TYPE_RADIO: return com.android.internal.R.string.phoneTypeRadio; + case TYPE_TELEX: return com.android.internal.R.string.phoneTypeTelex; + case TYPE_TTY_TDD: return com.android.internal.R.string.phoneTypeTtyTdd; + case TYPE_WORK_MOBILE: return com.android.internal.R.string.phoneTypeWorkMobile; + case TYPE_WORK_PAGER: return com.android.internal.R.string.phoneTypeWorkPager; + case TYPE_ASSISTANT: return com.android.internal.R.string.phoneTypeAssistant; + case TYPE_MMS: return com.android.internal.R.string.phoneTypeMms; + default: return com.android.internal.R.string.phoneTypeCustom; + } + } + + /** + * Return a {@link CharSequence} that best describes the given type, + * possibly substituting the given {@link #LABEL} value + * for {@link #TYPE_CUSTOM}. + */ + public static final CharSequence getTypeLabel(Resources res, int type, + CharSequence label) { + if ((type == TYPE_CUSTOM || type == TYPE_ASSISTANT) && !TextUtils.isEmpty(label)) { + return label; + } else { + final int labelRes = getTypeLabelResource(type); + return res.getText(labelRes); + } + } + } + + /** + * Common data definition for email addresses. + */ + public static final class Email implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Email() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/email_v2"; + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of email addresses. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/email_v2"; + + /** + * The content:// style URI for all data records of the + * {@link #CONTENT_ITEM_TYPE} MIME type, combined with the + * associated raw contact and aggregate contact data. + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(Data.CONTENT_URI, + "emails"); + + /** + * The content:// style URL for looking up data rows by email address. The + * lookup argument, an email address, should be passed as an additional path segment + * after this URI. + */ + public static final Uri CONTENT_LOOKUP_URI = Uri.withAppendedPath(CONTENT_URI, + "lookup"); + + /** + * The content:// style URL for email lookup using a filter. The filter returns + * records of MIME type {@link #CONTENT_ITEM_TYPE}. The filter is applied + * to display names as well as email addresses. The filter argument should be passed + * as an additional path segment after this URI. + */ + public static final Uri CONTENT_FILTER_URI = Uri.withAppendedPath(CONTENT_URI, + "filter"); + + public static final int TYPE_HOME = 1; + public static final int TYPE_WORK = 2; + public static final int TYPE_OTHER = 3; + public static final int TYPE_MOBILE = 4; + + /** + * The display name for the email address + * <P>Type: TEXT</P> + */ + public static final String DISPLAY_NAME = DATA4; + + /** + * Return the string resource that best describes the given + * {@link #TYPE}. Will always return a valid resource. + */ + public static final int getTypeLabelResource(int type) { + switch (type) { + case TYPE_HOME: return com.android.internal.R.string.emailTypeHome; + case TYPE_WORK: return com.android.internal.R.string.emailTypeWork; + case TYPE_OTHER: return com.android.internal.R.string.emailTypeOther; + case TYPE_MOBILE: return com.android.internal.R.string.emailTypeMobile; + default: return com.android.internal.R.string.emailTypeCustom; + } + } + + /** + * Return a {@link CharSequence} that best describes the given type, + * possibly substituting the given {@link #LABEL} value + * for {@link #TYPE_CUSTOM}. + */ + public static final CharSequence getTypeLabel(Resources res, int type, + CharSequence label) { + if (type == TYPE_CUSTOM && !TextUtils.isEmpty(label)) { + return label; + } else { + final int labelRes = getTypeLabelResource(type); + return res.getText(labelRes); + } + } + } + + /** + * Common data definition for postal addresses. + */ + public static final class StructuredPostal implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private StructuredPostal() { + } + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = + "vnd.android.cursor.item/postal-address_v2"; + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of + * postal addresses. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/postal-address_v2"; + + /** + * The content:// style URI for all data records of the + * {@link StructuredPostal#CONTENT_ITEM_TYPE} MIME type. + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(Data.CONTENT_URI, + "postals"); + + public static final int TYPE_HOME = 1; + public static final int TYPE_WORK = 2; + public static final int TYPE_OTHER = 3; + + /** + * The full, unstructured postal address. <i>This field must be + * consistent with any structured data.</i> + * <p> + * Type: TEXT + */ + public static final String FORMATTED_ADDRESS = DATA; + + /** + * Can be street, avenue, road, etc. This element also includes the + * house number and room/apartment/flat/floor number. + * <p> + * Type: TEXT + */ + public static final String STREET = DATA4; + + /** + * Covers actual P.O. boxes, drawers, locked bags, etc. This is + * usually but not always mutually exclusive with street. + * <p> + * Type: TEXT + */ + public static final String POBOX = DATA5; + + /** + * This is used to disambiguate a street address when a city + * contains more than one street with the same name, or to specify a + * small place whose mail is routed through a larger postal town. In + * China it could be a county or a minor city. + * <p> + * Type: TEXT + */ + public static final String NEIGHBORHOOD = DATA6; + + /** + * Can be city, village, town, borough, etc. This is the postal town + * and not necessarily the place of residence or place of business. + * <p> + * Type: TEXT + */ + public static final String CITY = DATA7; + + /** + * A state, province, county (in Ireland), Land (in Germany), + * departement (in France), etc. + * <p> + * Type: TEXT + */ + public static final String REGION = DATA8; + + /** + * Postal code. Usually country-wide, but sometimes specific to the + * city (e.g. "2" in "Dublin 2, Ireland" addresses). + * <p> + * Type: TEXT + */ + public static final String POSTCODE = DATA9; + + /** + * The name or code of the country. + * <p> + * Type: TEXT + */ + public static final String COUNTRY = DATA10; + + /** + * Return the string resource that best describes the given + * {@link #TYPE}. Will always return a valid resource. + */ + public static final int getTypeLabelResource(int type) { + switch (type) { + case TYPE_HOME: return com.android.internal.R.string.postalTypeHome; + case TYPE_WORK: return com.android.internal.R.string.postalTypeWork; + case TYPE_OTHER: return com.android.internal.R.string.postalTypeOther; + default: return com.android.internal.R.string.postalTypeCustom; + } + } + + /** + * Return a {@link CharSequence} that best describes the given type, + * possibly substituting the given {@link #LABEL} value + * for {@link #TYPE_CUSTOM}. + */ + public static final CharSequence getTypeLabel(Resources res, int type, + CharSequence label) { + if (type == TYPE_CUSTOM && !TextUtils.isEmpty(label)) { + return label; + } else { + final int labelRes = getTypeLabelResource(type); + return res.getText(labelRes); + } + } + } + + /** + * Common data definition for IM addresses. + */ + public static final class Im implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Im() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/im"; + + public static final int TYPE_HOME = 1; + public static final int TYPE_WORK = 2; + public static final int TYPE_OTHER = 3; + + /** + * This column should be populated with one of the defined + * constants, e.g. {@link #PROTOCOL_YAHOO}. If the value of this + * column is {@link #PROTOCOL_CUSTOM}, the {@link #CUSTOM_PROTOCOL} + * should contain the name of the custom protocol. + */ + public static final String PROTOCOL = DATA5; + + public static final String CUSTOM_PROTOCOL = DATA6; + + /* + * The predefined IM protocol types. + */ + public static final int PROTOCOL_CUSTOM = -1; + public static final int PROTOCOL_AIM = 0; + public static final int PROTOCOL_MSN = 1; + public static final int PROTOCOL_YAHOO = 2; + public static final int PROTOCOL_SKYPE = 3; + public static final int PROTOCOL_QQ = 4; + public static final int PROTOCOL_GOOGLE_TALK = 5; + public static final int PROTOCOL_ICQ = 6; + public static final int PROTOCOL_JABBER = 7; + public static final int PROTOCOL_NETMEETING = 8; + + /** + * Return the string resource that best describes the given + * {@link #TYPE}. Will always return a valid resource. + */ + public static final int getTypeLabelResource(int type) { + switch (type) { + case TYPE_HOME: return com.android.internal.R.string.imTypeHome; + case TYPE_WORK: return com.android.internal.R.string.imTypeWork; + case TYPE_OTHER: return com.android.internal.R.string.imTypeOther; + default: return com.android.internal.R.string.imTypeCustom; + } + } + + /** + * Return a {@link CharSequence} that best describes the given type, + * possibly substituting the given {@link #LABEL} value + * for {@link #TYPE_CUSTOM}. + */ + public static final CharSequence getTypeLabel(Resources res, int type, + CharSequence label) { + if (type == TYPE_CUSTOM && !TextUtils.isEmpty(label)) { + return label; + } else { + final int labelRes = getTypeLabelResource(type); + return res.getText(labelRes); + } + } + + /** + * Return the string resource that best describes the given + * {@link #PROTOCOL}. Will always return a valid resource. + */ + public static final int getProtocolLabelResource(int type) { + switch (type) { + case PROTOCOL_AIM: return com.android.internal.R.string.imProtocolAim; + case PROTOCOL_MSN: return com.android.internal.R.string.imProtocolMsn; + case PROTOCOL_YAHOO: return com.android.internal.R.string.imProtocolYahoo; + case PROTOCOL_SKYPE: return com.android.internal.R.string.imProtocolSkype; + case PROTOCOL_QQ: return com.android.internal.R.string.imProtocolQq; + case PROTOCOL_GOOGLE_TALK: return com.android.internal.R.string.imProtocolGoogleTalk; + case PROTOCOL_ICQ: return com.android.internal.R.string.imProtocolIcq; + case PROTOCOL_JABBER: return com.android.internal.R.string.imProtocolJabber; + case PROTOCOL_NETMEETING: return com.android.internal.R.string.imProtocolNetMeeting; + default: return com.android.internal.R.string.imProtocolCustom; + } + } + + /** + * Return a {@link CharSequence} that best describes the given + * protocol, possibly substituting the given + * {@link #CUSTOM_PROTOCOL} value for {@link #PROTOCOL_CUSTOM}. + */ + public static final CharSequence getProtocolLabel(Resources res, int type, + CharSequence label) { + if (type == PROTOCOL_CUSTOM && !TextUtils.isEmpty(label)) { + return label; + } else { + final int labelRes = getProtocolLabelResource(type); + return res.getText(labelRes); + } + } + } + + /** + * Common data definition for organizations. + */ + public static final class Organization implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Organization() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/organization"; + + public static final int TYPE_WORK = 1; + public static final int TYPE_OTHER = 2; + + /** + * The company as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String COMPANY = DATA; + + /** + * The position title at this company as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String TITLE = DATA4; + + /** + * The department at this company as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String DEPARTMENT = DATA5; + + /** + * The job description at this company as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String JOB_DESCRIPTION = DATA6; + + /** + * The symbol of this company as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String SYMBOL = DATA7; + + /** + * The phonetic name of this company as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String PHONETIC_NAME = DATA8; + + /** + * The office location of this organization. + * <P>Type: TEXT</P> + */ + public static final String OFFICE_LOCATION = DATA9; + + /** + * Return the string resource that best describes the given + * {@link #TYPE}. Will always return a valid resource. + */ + public static final int getTypeLabelResource(int type) { + switch (type) { + case TYPE_WORK: return com.android.internal.R.string.orgTypeWork; + case TYPE_OTHER: return com.android.internal.R.string.orgTypeOther; + default: return com.android.internal.R.string.orgTypeCustom; + } + } + + /** + * Return a {@link CharSequence} that best describes the given type, + * possibly substituting the given {@link #LABEL} value + * for {@link #TYPE_CUSTOM}. + */ + public static final CharSequence getTypeLabel(Resources res, int type, + CharSequence label) { + if (type == TYPE_CUSTOM && !TextUtils.isEmpty(label)) { + return label; + } else { + final int labelRes = getTypeLabelResource(type); + return res.getText(labelRes); + } + } + } + + /** + * Common data definition for relations. + */ + public static final class Relation implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Relation() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/relation"; + + public static final int TYPE_ASSISTANT = 1; + public static final int TYPE_BROTHER = 2; + public static final int TYPE_CHILD = 3; + public static final int TYPE_DOMESTIC_PARTNER = 4; + public static final int TYPE_FATHER = 5; + public static final int TYPE_FRIEND = 6; + public static final int TYPE_MANAGER = 7; + public static final int TYPE_MOTHER = 8; + public static final int TYPE_PARENT = 9; + public static final int TYPE_PARTNER = 10; + public static final int TYPE_REFERRED_BY = 11; + public static final int TYPE_RELATIVE = 12; + public static final int TYPE_SISTER = 13; + public static final int TYPE_SPOUSE = 14; + + /** + * The name of the relative as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String NAME = DATA; + } + + /** + * Common data definition for events. + */ + public static final class Event implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Event() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/contact_event"; + + public static final int TYPE_ANNIVERSARY = 1; + public static final int TYPE_OTHER = 2; + public static final int TYPE_BIRTHDAY = 3; + + /** + * The event start date as the user entered it. + * <P>Type: TEXT</P> + */ + public static final String START_DATE = DATA; + + /** + * Return the string resource that best describes the given + * {@link #TYPE}. Will always return a valid resource. + */ + public static int getTypeResource(Integer type) { + if (type == null) { + return com.android.internal.R.string.eventTypeOther; + } + switch (type) { + case TYPE_ANNIVERSARY: + return com.android.internal.R.string.eventTypeAnniversary; + case TYPE_BIRTHDAY: return com.android.internal.R.string.eventTypeBirthday; + case TYPE_OTHER: return com.android.internal.R.string.eventTypeOther; + default: return com.android.internal.R.string.eventTypeOther; + } + } + } + + /** + * Photo of the contact. + */ + public static final class Photo implements DataColumnsWithJoins { + /** + * This utility class cannot be instantiated + */ + private Photo() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/photo"; + + /** + * Thumbnail photo of the raw contact. This is the raw bytes of an image + * that could be inflated using {@link android.graphics.BitmapFactory}. + * <p> + * Type: BLOB + */ + public static final String PHOTO = DATA15; + } + + /** + * Notes about the contact. + */ + public static final class Note implements DataColumnsWithJoins { + /** + * This utility class cannot be instantiated + */ + private Note() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/note"; + + /** + * The note text. + * <P>Type: TEXT</P> + */ + public static final String NOTE = DATA1; + } + + /** + * Group Membership. + */ + public static final class GroupMembership implements DataColumnsWithJoins { + /** + * This utility class cannot be instantiated + */ + private GroupMembership() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = + "vnd.android.cursor.item/group_membership"; + + /** + * The row id of the group that this group membership refers to. Exactly one of + * this or {@link #GROUP_SOURCE_ID} must be set when inserting a row. + * <P>Type: INTEGER</P> + */ + public static final String GROUP_ROW_ID = DATA1; + + /** + * The sourceid of the group that this group membership refers to. Exactly one of + * this or {@link #GROUP_ROW_ID} must be set when inserting a row. + * <P>Type: TEXT</P> + */ + public static final String GROUP_SOURCE_ID = "group_sourceid"; + } + + /** + * Website related to the contact. + */ + public static final class Website implements DataColumnsWithJoins, CommonColumns { + /** + * This utility class cannot be instantiated + */ + private Website() {} + + /** MIME type used when storing this in data table. */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/website"; + + public static final int TYPE_HOMEPAGE = 1; + public static final int TYPE_BLOG = 2; + public static final int TYPE_PROFILE = 3; + public static final int TYPE_HOME = 4; + public static final int TYPE_WORK = 5; + public static final int TYPE_FTP = 6; + public static final int TYPE_OTHER = 7; + + /** + * The website URL string. + * <P>Type: TEXT</P> + */ + public static final String URL = DATA; + } + } + + protected interface GroupsColumns { + /** + * The display title of this group. + * <p> + * Type: TEXT + */ + public static final String TITLE = "title"; + + /** + * The package name to use when creating {@link Resources} objects for + * this group. This value is only designed for use when building user + * interfaces, and should not be used to infer the owner. + * + * @hide + */ + public static final String RES_PACKAGE = "res_package"; + + /** + * The display title of this group to load as a resource from + * {@link #RES_PACKAGE}, which may be localized. + * <P>Type: TEXT</P> + * + * @hide + */ + public static final String TITLE_RES = "title_res"; + + /** + * Notes about the group. + * <p> + * Type: TEXT + */ + public static final String NOTES = "notes"; + + /** + * The ID of this group if it is a System Group, i.e. a group that has a special meaning + * to the sync adapter, null otherwise. + * <P>Type: TEXT</P> + */ + public static final String SYSTEM_ID = "system_id"; + + /** + * The total number of {@link Contacts} that have + * {@link CommonDataKinds.GroupMembership} in this group. Read-only value that is only + * present when querying {@link Groups#CONTENT_SUMMARY_URI}. + * <p> + * Type: INTEGER + */ + public static final String SUMMARY_COUNT = "summ_count"; + + /** + * The total number of {@link Contacts} that have both + * {@link CommonDataKinds.GroupMembership} in this group, and also have phone numbers. + * Read-only value that is only present when querying + * {@link Groups#CONTENT_SUMMARY_URI}. + * <p> + * Type: INTEGER + */ + public static final String SUMMARY_WITH_PHONES = "summ_phones"; + + /** + * Flag indicating if the contacts belonging to this group should be + * visible in any user interface. + * <p> + * Type: INTEGER (boolean) + */ + public static final String GROUP_VISIBLE = "group_visible"; + + /** + * The "deleted" flag: "0" by default, "1" if the row has been marked + * for deletion. When {@link android.content.ContentResolver#delete} is + * called on a raw contact, it is marked for deletion and removed from its + * aggregate contact. The sync adaptor deletes the raw contact on the server and + * then calls ContactResolver.delete once more, this time setting the the + * {@link ContactsContract#CALLER_IS_SYNCADAPTER} query parameter to finalize + * the data removal. + * <P>Type: INTEGER</P> + */ + public static final String DELETED = "deleted"; + + /** + * Whether this group should be synced if the SYNC_EVERYTHING settings + * is false for this group's account. + * <p> + * Type: INTEGER (boolean) + */ + public static final String SHOULD_SYNC = "should_sync"; + } + + /** + * Constants for the groups table. + */ + public static final class Groups implements BaseColumns, GroupsColumns, SyncColumns { + /** + * This utility class cannot be instantiated + */ + private Groups() { + } + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = Uri.withAppendedPath(AUTHORITY_URI, "groups"); + + /** + * The content:// style URI for this table joined with details data from + * {@link Data}. + */ + public static final Uri CONTENT_SUMMARY_URI = Uri.withAppendedPath(AUTHORITY_URI, + "groups_summary"); + + /** + * The MIME type of a directory of groups. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/group"; + + /** + * The MIME type of a single group. + */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/group"; + } + + /** + * Constants for the contact aggregation exceptions table, which contains + * aggregation rules overriding those used by automatic aggregation. This type only + * supports query and update. Neither insert nor delete are supported. + */ + public static final class AggregationExceptions implements BaseColumns { + /** + * This utility class cannot be instantiated + */ + private AggregationExceptions() {} + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = + Uri.withAppendedPath(AUTHORITY_URI, "aggregation_exceptions"); + + /** + * The MIME type of {@link #CONTENT_URI} providing a directory of data. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/aggregation_exception"; + + /** + * The MIME type of a {@link #CONTENT_URI} subdirectory of an aggregation exception + */ + public static final String CONTENT_ITEM_TYPE = + "vnd.android.cursor.item/aggregation_exception"; + + /** + * The type of exception: {@link #TYPE_KEEP_TOGETHER}, {@link #TYPE_KEEP_SEPARATE} or + * {@link #TYPE_AUTOMATIC}. + * + * <P>Type: INTEGER</P> + */ + public static final String TYPE = "type"; + + /** + * Allows the provider to automatically decide whether the specified raw contacts should + * be included in the same aggregate contact or not. + */ + public static final int TYPE_AUTOMATIC = 0; + + /** + * Makes sure that the specified raw contacts are included in the same + * aggregate contact. + */ + public static final int TYPE_KEEP_TOGETHER = 1; + + /** + * Makes sure that the specified raw contacts are NOT included in the same + * aggregate contact. + */ + public static final int TYPE_KEEP_SEPARATE = 2; + + /** + * A reference to the {@link RawContacts#_ID} of the raw contact that the rule applies to. + */ + public static final String RAW_CONTACT_ID1 = "raw_contact_id1"; + + /** + * A reference to the other {@link RawContacts#_ID} of the raw contact that the rule + * applies to. + */ + public static final String RAW_CONTACT_ID2 = "raw_contact_id2"; + } + + protected interface SettingsColumns { + /** + * The name of the account instance to which this row belongs. + * <P>Type: TEXT</P> + */ + public static final String ACCOUNT_NAME = "account_name"; + + /** + * The type of account to which this row belongs, which when paired with + * {@link #ACCOUNT_NAME} identifies a specific account. + * <P>Type: TEXT</P> + */ + public static final String ACCOUNT_TYPE = "account_type"; + + /** + * Depending on the mode defined by the sync-adapter, this flag controls + * the top-level sync behavior for this data source. + * <p> + * Type: INTEGER (boolean) + */ + public static final String SHOULD_SYNC = "should_sync"; + + /** + * Flag indicating if contacts without any {@link CommonDataKinds.GroupMembership} + * entries should be visible in any user interface. + * <p> + * Type: INTEGER (boolean) + */ + public static final String UNGROUPED_VISIBLE = "ungrouped_visible"; + + /** + * Read-only flag indicating if this {@link #SHOULD_SYNC} or any + * {@link Groups#SHOULD_SYNC} under this account have been marked as + * unsynced. + */ + public static final String ANY_UNSYNCED = "any_unsynced"; + + /** + * Read-only count of {@link Contacts} from a specific source that have + * no {@link CommonDataKinds.GroupMembership} entries. + * <p> + * Type: INTEGER + */ + public static final String UNGROUPED_COUNT = "summ_count"; + + /** + * Read-only count of {@link Contacts} from a specific source that have + * no {@link CommonDataKinds.GroupMembership} entries, and also have phone numbers. + * <p> + * Type: INTEGER + */ + public static final String UNGROUPED_WITH_PHONES = "summ_phones"; + } + + /** + * Contacts-specific settings for various {@link Account}. + */ + public static final class Settings implements SettingsColumns { + /** + * This utility class cannot be instantiated + */ + private Settings() { + } + + /** + * The content:// style URI for this table + */ + public static final Uri CONTENT_URI = + Uri.withAppendedPath(AUTHORITY_URI, "settings"); + + /** + * The MIME-type of {@link #CONTENT_URI} providing a directory of + * settings. + */ + public static final String CONTENT_TYPE = "vnd.android.cursor.dir/setting"; + + /** + * The MIME-type of {@link #CONTENT_URI} providing a single setting. + */ + public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/setting"; + } + + /** + * Helper methods to display QuickContact dialogs that allow users to pivot on + * a specific {@link Contacts} entry. + */ + public static final class QuickContact { + /** + * Action used to trigger person pivot dialog. + * @hide + */ + public static final String ACTION_QUICK_CONTACT = + "com.android.contacts.action.QUICK_CONTACT"; + + /** + * Extra used to specify pivot dialog location in screen coordinates. + * @hide + */ + public static final String EXTRA_TARGET_RECT = "target_rect"; + + /** + * Extra used to specify size of pivot dialog. + * @hide + */ + public static final String EXTRA_MODE = "mode"; + + /** + * Extra used to indicate a list of specific MIME-types to exclude and + * not display. Stored as a {@link String} array. + * @hide + */ + public static final String EXTRA_EXCLUDE_MIMES = "exclude_mimes"; + + /** + * Small QuickContact mode, usually presented with minimal actions. + */ + public static final int MODE_SMALL = 1; + + /** + * Medium QuickContact mode, includes actions and light summary describing + * the {@link Contacts} entry being shown. This may include social + * status and presence details. + */ + public static final int MODE_MEDIUM = 2; + + /** + * Large QuickContact mode, includes actions and larger, card-like summary + * of the {@link Contacts} entry being shown. This may include detailed + * information, such as a photo. + */ + public static final int MODE_LARGE = 3; + + /** + * Trigger a dialog that lists the various methods of interacting with + * the requested {@link Contacts} entry. This may be based on available + * {@link Data} rows under that contact, and may also include social + * status and presence details. + * + * @param context The parent {@link Context} that may be used as the + * parent for this dialog. + * @param target Specific {@link View} from your layout that this dialog + * should be centered around. In particular, if the dialog + * has a "callout" arrow, it will be pointed and centered + * around this {@link View}. + * @param lookupUri A {@link ContactsContract.Contacts#CONTENT_LOOKUP_URI} style + * {@link Uri} that describes a specific contact to feature + * in this dialog. + * @param mode Any of {@link #MODE_SMALL}, {@link #MODE_MEDIUM}, or + * {@link #MODE_LARGE}, indicating the desired dialog size, + * when supported. + * @param excludeMimes Optional list of {@link Data#MIMETYPE} MIME-types + * to exclude when showing this dialog. For example, when + * already viewing the contact details card, this can be used + * to omit the details entry from the dialog. + */ + public static void showQuickContact(Context context, View target, Uri lookupUri, int mode, + String[] excludeMimes) { + // Find location and bounds of target view + final int[] location = new int[2]; + target.getLocationOnScreen(location); + + final Rect rect = new Rect(); + rect.left = location[0]; + rect.top = location[1]; + rect.right = rect.left + target.getWidth(); + rect.bottom = rect.top + target.getHeight(); + + // Trigger with obtained rectangle + showQuickContact(context, rect, lookupUri, mode, excludeMimes); + } + + /** + * Trigger a dialog that lists the various methods of interacting with + * the requested {@link Contacts} entry. This may be based on available + * {@link Data} rows under that contact, and may also include social + * status and presence details. + * + * @param context The parent {@link Context} that may be used as the + * parent for this dialog. + * @param target Specific {@link Rect} that this dialog should be + * centered around, in screen coordinates. In particular, if + * the dialog has a "callout" arrow, it will be pointed and + * centered around this {@link Rect}. + * @param lookupUri A {@link ContactsContract.Contacts#CONTENT_LOOKUP_URI} style + * {@link Uri} that describes a specific contact to feature + * in this dialog. + * @param mode Any of {@link #MODE_SMALL}, {@link #MODE_MEDIUM}, or + * {@link #MODE_LARGE}, indicating the desired dialog size, + * when supported. + * @param excludeMimes Optional list of {@link Data#MIMETYPE} MIME-types + * to exclude when showing this dialog. For example, when + * already viewing the contact details card, this can be used + * to omit the details entry from the dialog. + */ + public static void showQuickContact(Context context, Rect target, Uri lookupUri, int mode, + String[] excludeMimes) { + // Launch pivot dialog through intent for now + final Intent intent = new Intent(ACTION_QUICK_CONTACT); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + + intent.setData(lookupUri); + intent.putExtra(EXTRA_TARGET_RECT, target); + intent.putExtra(EXTRA_MODE, mode); + intent.putExtra(EXTRA_EXCLUDE_MIMES, excludeMimes); + context.startActivity(intent); + } + } + + /** + * Contains helper classes used to create or manage {@link android.content.Intent Intents} + * that involve contacts. + */ + public static final class Intents { + /** + * This is the intent that is fired when a search suggestion is clicked on. + */ + public static final String SEARCH_SUGGESTION_CLICKED = + "android.provider.Contacts.SEARCH_SUGGESTION_CLICKED"; + + /** + * This is the intent that is fired when a search suggestion for dialing a number + * is clicked on. + */ + public static final String SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED = + "android.provider.Contacts.SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED"; + + /** + * This is the intent that is fired when a search suggestion for creating a contact + * is clicked on. + */ + public static final String SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED = + "android.provider.Contacts.SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED"; + + /** + * Starts an Activity that lets the user pick a contact to attach an image to. + * After picking the contact it launches the image cropper in face detection mode. + */ + public static final String ATTACH_IMAGE = + "com.android.contacts.action.ATTACH_IMAGE"; + + /** + * Takes as input a data URI with a mailto: or tel: scheme. If a single + * contact exists with the given data it will be shown. If no contact + * exists, a dialog will ask the user if they want to create a new + * contact with the provided details filled in. If multiple contacts + * share the data the user will be prompted to pick which contact they + * want to view. + * <p> + * For <code>mailto:</code> URIs, the scheme specific portion must be a + * raw email address, such as one built using + * {@link Uri#fromParts(String, String, String)}. + * <p> + * For <code>tel:</code> URIs, the scheme specific portion is compared + * to existing numbers using the standard caller ID lookup algorithm. + * The number must be properly encoded, for example using + * {@link Uri#fromParts(String, String, String)}. + * <p> + * Any extras from the {@link Insert} class will be passed along to the + * create activity if there are no contacts to show. + * <p> + * Passing true for the {@link #EXTRA_FORCE_CREATE} extra will skip + * prompting the user when the contact doesn't exist. + */ + public static final String SHOW_OR_CREATE_CONTACT = + "com.android.contacts.action.SHOW_OR_CREATE_CONTACT"; + + /** + * Used with {@link #SHOW_OR_CREATE_CONTACT} to force creating a new + * contact if no matching contact found. Otherwise, default behavior is + * to prompt user with dialog before creating. + * <p> + * Type: BOOLEAN + */ + public static final String EXTRA_FORCE_CREATE = + "com.android.contacts.action.FORCE_CREATE"; + + /** + * Used with {@link #SHOW_OR_CREATE_CONTACT} to specify an exact + * description to be shown when prompting user about creating a new + * contact. + * <p> + * Type: STRING + */ + public static final String EXTRA_CREATE_DESCRIPTION = + "com.android.contacts.action.CREATE_DESCRIPTION"; + + /** + * Optional extra used with {@link #SHOW_OR_CREATE_CONTACT} to specify a + * dialog location using screen coordinates. When not specified, the + * dialog will be centered. + * + * @hide + */ + @Deprecated + public static final String EXTRA_TARGET_RECT = "target_rect"; + + /** + * Optional extra used with {@link #SHOW_OR_CREATE_CONTACT} to specify a + * desired dialog style, usually a variation on size. One of + * {@link #MODE_SMALL}, {@link #MODE_MEDIUM}, or {@link #MODE_LARGE}. + * + * @hide + */ + @Deprecated + public static final String EXTRA_MODE = "mode"; + + /** + * Value for {@link #EXTRA_MODE} to show a small-sized dialog. + * + * @hide + */ + @Deprecated + public static final int MODE_SMALL = 1; + + /** + * Value for {@link #EXTRA_MODE} to show a medium-sized dialog. + * + * @hide + */ + @Deprecated + public static final int MODE_MEDIUM = 2; + + /** + * Value for {@link #EXTRA_MODE} to show a large-sized dialog. + * + * @hide + */ + @Deprecated + public static final int MODE_LARGE = 3; + + /** + * Optional extra used with {@link #SHOW_OR_CREATE_CONTACT} to indicate + * a list of specific MIME-types to exclude and not display. Stored as a + * {@link String} array. + * + * @hide + */ + @Deprecated + public static final String EXTRA_EXCLUDE_MIMES = "exclude_mimes"; + + /** + * Intents related to the Contacts app UI. + * + * @hide + */ + public static final class UI { + /** + * The action for the default contacts list tab. + */ + public static final String LIST_DEFAULT = + "com.android.contacts.action.LIST_DEFAULT"; + + /** + * The action for the contacts list tab. + */ + public static final String LIST_GROUP_ACTION = + "com.android.contacts.action.LIST_GROUP"; + + /** + * When in LIST_GROUP_ACTION mode, this is the group to display. + */ + public static final String GROUP_NAME_EXTRA_KEY = "com.android.contacts.extra.GROUP"; + + /** + * The action for the all contacts list tab. + */ + public static final String LIST_ALL_CONTACTS_ACTION = + "com.android.contacts.action.LIST_ALL_CONTACTS"; + + /** + * The action for the contacts with phone numbers list tab. + */ + public static final String LIST_CONTACTS_WITH_PHONES_ACTION = + "com.android.contacts.action.LIST_CONTACTS_WITH_PHONES"; + + /** + * The action for the starred contacts list tab. + */ + public static final String LIST_STARRED_ACTION = + "com.android.contacts.action.LIST_STARRED"; + + /** + * The action for the frequent contacts list tab. + */ + public static final String LIST_FREQUENT_ACTION = + "com.android.contacts.action.LIST_FREQUENT"; + + /** + * The action for the "strequent" contacts list tab. It first lists the starred + * contacts in alphabetical order and then the frequent contacts in descending + * order of the number of times they have been contacted. + */ + public static final String LIST_STREQUENT_ACTION = + "com.android.contacts.action.LIST_STREQUENT"; + + /** + * A key for to be used as an intent extra to set the activity + * title to a custom String value. + */ + public static final String TITLE_EXTRA_KEY = + "com.android.contacts.extra.TITLE_EXTRA"; + + /** + * Activity Action: Display a filtered list of contacts + * <p> + * Input: Extra field {@link #FILTER_TEXT_EXTRA_KEY} is the text to use for + * filtering + * <p> + * Output: Nothing. + */ + public static final String FILTER_CONTACTS_ACTION = + "com.android.contacts.action.FILTER_CONTACTS"; + + /** + * Used as an int extra field in {@link #FILTER_CONTACTS_ACTION} + * intents to supply the text on which to filter. + */ + public static final String FILTER_TEXT_EXTRA_KEY = + "com.android.contacts.extra.FILTER_TEXT"; + } + + /** + * Convenience class that contains string constants used + * to create contact {@link android.content.Intent Intents}. + */ + public static final class Insert { + /** The action code to use when adding a contact */ + public static final String ACTION = Intent.ACTION_INSERT; + + /** + * If present, forces a bypass of quick insert mode. + */ + public static final String FULL_MODE = "full_mode"; + + /** + * The extra field for the contact name. + * <P>Type: String</P> + */ + public static final String NAME = "name"; + + // TODO add structured name values here. + + /** + * The extra field for the contact phonetic name. + * <P>Type: String</P> + */ + public static final String PHONETIC_NAME = "phonetic_name"; + + /** + * The extra field for the contact company. + * <P>Type: String</P> + */ + public static final String COMPANY = "company"; + + /** + * The extra field for the contact job title. + * <P>Type: String</P> + */ + public static final String JOB_TITLE = "job_title"; + + /** + * The extra field for the contact notes. + * <P>Type: String</P> + */ + public static final String NOTES = "notes"; + + /** + * The extra field for the contact phone number. + * <P>Type: String</P> + */ + public static final String PHONE = "phone"; + + /** + * The extra field for the contact phone number type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.PhonesColumns PhonesColumns}, + * or a string specifying a custom label.</P> + */ + public static final String PHONE_TYPE = "phone_type"; + + /** + * The extra field for the phone isprimary flag. + * <P>Type: boolean</P> + */ + public static final String PHONE_ISPRIMARY = "phone_isprimary"; + + /** + * The extra field for an optional second contact phone number. + * <P>Type: String</P> + */ + public static final String SECONDARY_PHONE = "secondary_phone"; + + /** + * The extra field for an optional second contact phone number type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.PhonesColumns PhonesColumns}, + * or a string specifying a custom label.</P> + */ + public static final String SECONDARY_PHONE_TYPE = "secondary_phone_type"; + + /** + * The extra field for an optional third contact phone number. + * <P>Type: String</P> + */ + public static final String TERTIARY_PHONE = "tertiary_phone"; + + /** + * The extra field for an optional third contact phone number type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.PhonesColumns PhonesColumns}, + * or a string specifying a custom label.</P> + */ + public static final String TERTIARY_PHONE_TYPE = "tertiary_phone_type"; + + /** + * The extra field for the contact email address. + * <P>Type: String</P> + */ + public static final String EMAIL = "email"; + + /** + * The extra field for the contact email type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.ContactMethodsColumns ContactMethodsColumns} + * or a string specifying a custom label.</P> + */ + public static final String EMAIL_TYPE = "email_type"; + + /** + * The extra field for the email isprimary flag. + * <P>Type: boolean</P> + */ + public static final String EMAIL_ISPRIMARY = "email_isprimary"; + + /** + * The extra field for an optional second contact email address. + * <P>Type: String</P> + */ + public static final String SECONDARY_EMAIL = "secondary_email"; + + /** + * The extra field for an optional second contact email type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.ContactMethodsColumns ContactMethodsColumns} + * or a string specifying a custom label.</P> + */ + public static final String SECONDARY_EMAIL_TYPE = "secondary_email_type"; + + /** + * The extra field for an optional third contact email address. + * <P>Type: String</P> + */ + public static final String TERTIARY_EMAIL = "tertiary_email"; + + /** + * The extra field for an optional third contact email type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.ContactMethodsColumns ContactMethodsColumns} + * or a string specifying a custom label.</P> + */ + public static final String TERTIARY_EMAIL_TYPE = "tertiary_email_type"; + + /** + * The extra field for the contact postal address. + * <P>Type: String</P> + */ + public static final String POSTAL = "postal"; + + /** + * The extra field for the contact postal address type. + * <P>Type: Either an integer value from + * {@link android.provider.Contacts.ContactMethodsColumns ContactMethodsColumns} + * or a string specifying a custom label.</P> + */ + public static final String POSTAL_TYPE = "postal_type"; + + /** + * The extra field for the postal isprimary flag. + * <P>Type: boolean</P> + */ + public static final String POSTAL_ISPRIMARY = "postal_isprimary"; + + /** + * The extra field for an IM handle. + * <P>Type: String</P> + */ + public static final String IM_HANDLE = "im_handle"; + + /** + * The extra field for the IM protocol + */ + public static final String IM_PROTOCOL = "im_protocol"; + + /** + * The extra field for the IM isprimary flag. + * <P>Type: boolean</P> + */ + public static final String IM_ISPRIMARY = "im_isprimary"; + } + } + +} |